CC-Link IE Field Basic 通讯
概述
CC-Link IE Field Basic 是三菱电机主导的工业以太网协议, 基于标准以太网 (IEEE 802.3), 在 TCP/UDP 上实现循环通讯和瞬时报文。Darra PLC 通过 CclinkIeFieldBasicAdapter 支持 Manager 角色, 可接入 CC-Link IE Field Basic 兼容设备。
协议特性
| 特性 | 说明 |
|---|---|
| 标准 | CC-Link IE Field Basic (CLPA) |
| 物理层 | 100BASE-TX / 1000BASE-T |
| 传输层 | TCP + UDP |
| 端口 | 61450~61469 (Manager 用) |
| 周期 | 1~50 ms (循环通讯) |
| 最大节点数 | 64 (Manager 1 + Device 63) |
| 最大站间距离 | 100 m (星型) |
| 拓扑 | 星型 (标准以太网交换机) |
与 CC-Link IE Field (完整版) 的区别
| 特性 | IE Field Basic | IE Field (完整版) |
|---|---|---|
| 物理层 | 标准以太网 | 标准以太网 |
| 循环通讯 | 软件 UDP | 硬件 (ASIC) |
| 实时性 | 软实时 (1~50 ms) | 硬实时 (< 1 ms) |
| 拓扑 | 星型 | 环型 / 星型 |
| 主站硬件 | 标准网卡 | 专用 CC-Link 主站卡 |
| 适用场景 | 小规模、混合协议 | 大规模、高实时 |
| 成本 | 低 (无需专用硬件) | 高 (需专用接口卡) |
Manager 与 Device 角色
Manager (主站)
Darra PLC 作为 Manager, 负责:
- 管理循环通讯周期
- 维护设备状态表
- 发送轮询报文
- 处理瞬时报文
var manager = new CclinkIeFieldBasicManager();
manager.Configure(new CclinkManagerConfig {
LocalStation = 1, // Manager 站号 (通常 1)
CycleTimeMs = 10, // 循环周期 10 ms
Port = 61450, // Manager 监听端口
TimeoutMs = 5000, // 设备超时检测
MaxRetries = 3 // 通讯重试次数
});
Device (从站)
Device 是 CC-Link IE Field Basic 的从站设备:
- 响应 Manager 的轮询请求
- 提供循环数据 (RX/RY/RWr/RWw)
- 支持瞬时报文 (按需通讯)
// 添加 Device 到 Manager 设备表
manager.AddDevice(new CclinkDeviceConfig {
Station = 2, // 设备站号 (2~64)
RemoteIp = "192.168.1.101", // 设备 IP 地址
Port = 61451, // 设备端口 (base + 站号)
RxCount = 32, // 远程输入 (RX) 点数, bit
RyCount = 32, // 远程输出 (RY) 点数, bit
RWrCount = 8, // 远程寄存器输入 (RWr), word
RWwCount = 8 // 远程寄存器输出 (RWw), word
});
循环通讯
通讯机制
CC-Link IE Field Basic 的循环通讯基于轮询模式:
Manager Device 1 Device 2
│ │ │
│ 1. 轮询 Device 1 │ │
│ ── 轮询请求 (RY + RWw) ──────────► │ │
│ ◄── 轮询响应 (RX + RWr) ────────── │ │
│ │ │
│ 2. 轮询 Device 2 │ │
│ ── 轮询请求 (RY + RWw) ───────────────────────────────────────────────► │
│ ◄── 轮询响应 (RX + RWr) ─────────────────────────────────────────────── │
│ │ │
3. 循环周期完成, 更新 PLC 变量
4. 等待下一个周期开始
循环数据格式
每个 Device 在循环通讯中交换四种数据:
| 类型 | 名称 | 单位 | 方向 | 说明 |
|---|---|---|---|---|
| RX | Remote Input | bit | Device → Manager | 设备状态、DI 信号 |
| RY | Remote Output | bit | Manager → Device | 设备控制、DO 指令 |
| RWr | Remote Register Input | word (16-bit) | Device → Manager | 模拟量输入、数值反馈 |
| RWw | Remote Register Output | word (16-bit) | Manager → Device | 模拟量输出、数值设定 |
数据映射到 PLC 地址
// 在 IDE 中配置映射
manager.AddMapping(new CclinkMapping {
DeviceStation = 2,
PlcMapping = new List<CclinkMapEntry> {
// RX 映射到 PLC 输入位
new CclinkMapEntry { CclinkType = "RX", Start = 0, PlcStart = "%IX100", Count = 32 },
// RY 映射到 PLC 输出位
new CclinkMapEntry { CclinkType = "RY", Start = 0, PlcStart = "%QX100", Count = 32 },
// RWr 映射到 PLC 输入字
new CclinkMapEntry { CclinkType = "RWr", Start = 0, PlcStart = "%IW200", Count = 8 },
// RWw 映射到 PLC 输出字
new CclinkMapEntry { CclinkType = "RWw", Start = 0, PlcStart = "%QW200", Count = 8 },
}
});
在 SCL 程序中使用:
(* 读取 Device 2 的 RX0 状态 — 设备就绪 *)
IF %IX100.0 THEN
Device2_Ready := TRUE;
END_IF;
(* 控制 Device 2 的 RY0 — 启动 *)
%QX100.0 := Start_Button;
(* 读取 Device 2 的 RWr0 — 温度值 *)
Temperature := %IW200; (* 原始值, 需工程量转换 *)
(* 设定 Device 2 的 RWw0 — 目标温度 *)
%QW200 := TargetTemp;
瞬时报文
瞬时报文用于非周期的按需数据交换, 类似 Modbus 的读写请求:
| 特性 | 说明 |
|---|---|
| 传输 | TCP (可靠) |
| 触发 | 按需, 由用户程序或 API 调用 |
| 数据 | 任意长度 (≤ 2048 字节) |
| 用途 | 参数读写、诊断、配置 |
| 优先级 | 低于循环通讯 |
// 发送瞬时报文, 读取 Device 2 的参数
var response = await manager.SendTransientAsync(
station: 2,
service: TransientService.ReadParameter,
data: new byte[] { 0x00, 0x01 } // 参数号
);
Console.WriteLine($"参数值: {BitConverter.ToUInt16(response.Data, 0)}");
// 写入参数
await manager.SendTransientAsync(
station: 2,
service: TransientService.WriteParameter,
data: new byte[] { 0x00, 0x01, 0x00, 0x64 } // 参数 1 = 100
);
配置步骤
1. 网络规划
| 参数 | 值 | 说明 |
|---|---|---|
| Manager 站号 | 1 | 固定, 唯一 Manager |
| Device 站号 | 2~64 | 每个设备唯一 |
| 每个设备的 RX/RY | 32~256 bit | 按需分配 |
| 每个设备的 RWr/RWw | 4~32 word | 按需分配 |
| 循环周期 | 1~50 ms | 所有设备轮询完的总时间 |
2. 在 IDE 中配置
项目树 → 通讯 → CC-Link IE Field Basic → 添加设备:
1. 选择 Manager 角色, 设置站号
2. 添加 Device, 输入 IP 地址和站号
3. 配置 RX/RY/RWr/RWw 点数
4. 映射到 PLC 地址空间
5. 编译下载到 Service
3. 配置参数总览
{
"cclinkConfig": {
"manager": {
"station": 1,
"cycleTimeMs": 10,
"port": 61450,
"timeoutMs": 5000
},
"devices": [
{
"station": 2,
"remoteIp": "192.168.1.101",
"port": 61451,
"rxCount": 32,
"ryCount": 32,
"rwRCount": 8,
"rwWCount": 8,
"plcMapping": {
"rxStart": 100,
"ryStart": 100,
"rwRStart": 200,
"rwWStart": 200
}
},
{
"station": 3,
"remoteIp": "192.168.1.102",
"port": 61452,
"rxCount": 16,
"ryCount": 16,
"rwRCount": 4,
"rwWCount": 4,
"plcMapping": {
"rxStart": 120,
"ryStart": 120,
"rwRStart": 210,
"rwWStart": 210
}
}
]
}
}
4. 循环周期估算
周期 = Σ(每个 Device 的轮询时间)
单 Device 轮询时间 ≈ 基础延迟 + 数据量 × 传输时间
基础延迟: 约 0.5 ms (UDP 往返)
传输时间: 每 100 字节约 0.01 ms (100 Mbps)
例: 10 个 Device, 每个 32 字节数据
单设备轮询 ≈ 0.5 + 0.003 ≈ 0.5 ms
总周期 ≈ 10 × 0.5 = 5 ms → 配置 10 ms 留余量
数据映射
完整映射示例
Device 2 (站号 2, 32 RX + 32 RY + 8 RWr + 8 RWw):
RX (Device → Manager):
RX0~RX31 → %IX100.0~%IX103.7
RX0 = 设备就绪
RX1 = 运行中
RX2 = 故障
RX3~RX31 = 用户自定义
RY (Manager → Device):
RY0~RY31 → %QX100.0~%QX103.7
RY0 = 启动
RY1 = 停止
RY2 = 复位
RY3~RY31 = 用户自定义
RWr (Device → Manager, 16-bit):
RWr0~RWr7 → %IW200~%IW207
RWr0 = 温度 PV
RWr1 = 压力 PV
RWr2 = 速度
RWr3~RWr7 = 保留
RWw (Manager → Device, 16-bit):
RWw0~RWw7 → %QW200~%QW207
RWw0 = 温度 SP
RWw1 = 压力 SP
RWw2~RWw7 = 保留
字节序
CC-Link IE Field Basic 使用 小端序 (Little-Endian):
- 16 位数据: 低字节在前 (与 Modbus 大端不同)
- 32 位数据: 低字在前
// 从 RWr 读取 16 位无符号整数 (小端)
ushort temp = (ushort)(%IW200); // 直接使用, 无需转换
// 从 RWr 读取 32 位浮点数 (小端)
uint raw = (uint)(%ID200); // 两个连续字合成 DWORD
float value = BitConverter.ToSingle(BitConverter.GetBytes(raw), 0);
诊断
设备状态
var status = manager.GetDeviceStatus(2);
Console.WriteLine($"运行状态: {status.RunState}"); // Running / Stopped / Error
Console.WriteLine($"循环通讯: {status.CycleState}"); // Normal / Abnormal
Console.WriteLine($"间隔: {status.LastCycleTimeMs} ms");
Console.WriteLine($"误码率: {status.ErrorRate:F4}"); // 通讯错误比例
Console.WriteLine($"最近错误: {status.LastError}"); // 时间戳 + 错误码
诊断指标
| 指标 | 说明 | 正常范围 |
|---|---|---|
| 循环周期 | 实际周期与设定周期的偏差 | ±20% |
| 设备响应超时 | 设备未响应次数 | 0 |
| 通讯错误率 | 错误帧占总帧的比例 | < 0.1% |
| 重试次数 | 因超时自动重试的次数 | 0 |
| 最近错误码 | 最后一次通讯错误的原因 | 0 (无错误) |
诊断面板
IDE 的 CC-Link 诊断面板显示:
- 网络拓扑: 所有设备在线状态, 用颜色标记 (绿/黄/红)
- 循环数据: 实时显示每个设备的 RX/RY/RWr/RWw 值
- 通讯统计: 周期计数、错误计数、重试统计
- 事件日志: 设备上线/离线/错误事件的时间线
排错指南
| 症状 | 原因 | 处理 |
|---|---|---|
| 设备不在线 | 站号冲突或 IP 不可达 | 检查 IP 和站号配置, ping 确认 |
| 循环通讯中断 | 设备超时 | 检查网络连接, 确认设备运行 |
| RX/RY 数据不更新 | 设备不在 Run 状态 | 发送瞬时报文启动设备 |
| 循环周期 > 设定值 | 设备过多或网络延迟大 | 减少设备数或增大周期 |
| 通讯错误率上升 | 网络干扰或交换机问题 | 检查交换机端口统计, 更换网线 |
| 瞬时报文超时 | 设备忙 (正在处理循环数据) | 增大超时时间, 避免高峰期发送 |
| 数据映射错位 | RX/RY/RWr/RWw 计数值配置不对 | 核对设备规格书, 确认点数 |
| 字节序错误 | 大端/小端混淆 | CC-Link 为小端, 检查数据转换 |
限制
- CC-Link IE Field Basic 为软实时协议, 不适合要求 < 1 ms 硬实时响应的运动控制
- Manager 最多管理 63 个 Device, 实际受网络带宽和周期时间限制
- 瞬时报文会抢占循环通讯带宽, 高频瞬时报文会导致循环周期抖动
- 不支持环型拓扑 (冗余), 仅星型拓扑
- 不支持 CC-Link IE Field (完整版) 的 SLMP (Seamless Message Protocol) 扩展功能