三菱 MC 协议通讯
Darra PLC 通过 MCProtocolAdapter 支持三菱 MC (MELSEC Communication) 协议, 可与三菱 FX/Q/iQ-R 系列 PLC 进行数据交互。
支持系列
| 系列 | 型号 | 通讯模式 | 说明 |
|---|---|---|---|
| FX3U/FX3G | FX3U-ENET | Binary/ASCII | 需以太网模块 |
| FX5U | 内置以太网 | Binary/ASCII | 直连 |
| Q 系列 | QJ71E71 | Binary/ASCII | 以太网模块 |
| iQ-R 系列 | RJ71EN71 | Binary/ASCII | 内置/模块 |
| L 系列 | LJ71E71 | Binary/ASCII | 以太网模块 |
通讯模式
| 模式 | 帧格式 | 特点 |
|---|---|---|
| Binary (二进制) | 3E/4E 帧 | 数据紧凑, 效率高, 推荐 |
| ASCII | 3E/4E 帧 | 可读性好, 便于调试 |
推荐配置
生产环境建议使用 Binary 模式 + 4E 帧, 效率最高且支持多连接。
软元件访问
| 软元件 | 标识 | 地址范围 | 数据类型 |
|---|---|---|---|
| D 数据寄存器 | D | D0 ~ D65535 | WORD |
| M 内部继电器 | M | M0 ~ M65535 | BIT |
| X 输入 | X | X0 ~ X1FFF | BIT (八进制) |
| Y 输出 | Y | Y0 ~ Y1FFF | BIT (八进制) |
| R 文件寄存器 | R | R0 ~ R65535 | WORD |
| W 链接寄存器 | W | W0 ~ WFFFF | WORD (十六进制) |
| B 链接继电器 | B | B0 ~ BFFFF | BIT (十六进制) |
| ZR 文件寄存器 | ZR | ZR0 ~ ZR65535 | WORD |
X/Y 地址为八进制
三菱 X/Y 软元件使用八进制编址。例如 X10 实际是第 8 个输入 (八进制 10 = 十进制 8)。
连接配置
{
"protocol": "MitsubishiMC",
"host": "192.168.1.20",
"port": 5000,
"frameType": "4E",
"dataFormat": "Binary",
"networkNumber": 0,
"stationNumber": 0,
"timeout": 3000
}
PLC 变量映射
三菱 MC 地址 Darra PLC 变量
D0 ←→ MW2000 (INT)
D100 ←→ MD2200 (DINT, 两个 D 寄存器)
M0 ←→ MX2000.0 (BOOL)
X0 ←→ IX10.0 (BOOL, 只读)
Y0 ←→ QX10.0 (BOOL)
代码示例
// 创建 MC 协议连接
var adapter = PLCDriverFactory.Create(ProtocolId.MitsubishiMC);
await adapter.ConnectAsync(new ConnectionConfig
{
Host = "192.168.1.20",
Port = 5000,
FrameType = MCFrameType.Frame4E,
DataFormat = MCDataFormat.Binary
});
// 读取 D0~D9 (10 个 WORD)
var data = await adapter.ReadAsync("D0", 10);
// 写入 M100 (置位)
await adapter.WriteAsync("M100", new byte[] { 0x01 });
// 批量写入 D100~D104
short[] values = { 100, 200, 300, 400, 500 };
await adapter.WriteAsync("D100", values.SelectMany(BitConverter.GetBytes).ToArray());
3E / 4E 帧格式
3E 帧 (单次请求)
| 子头部 5000 | 网络号 | PLC号 | 模块号 | 请求数据长 | CPU监视定时器 | 命令数据 |
- 子头部: 固定 0x5000 (请求) / 0xD000 (响应)
- 网络号: 多层网络路由, 通常 0
- PLC 号: 接收方 PLC 编号, 通常 0xFF
- 模块号: 模块 I/O 号, 通常 0x3FF (本站 CPU)
- 请求数据长: 后续字段字节数
- 监视定时器: 0.25s 单位, 0x0010 = 4s
- 命令数据: 实际操作码 + 软元件 + 数据
4E 帧 (带序列号, 支持多连接)
| 子头部 5400 | 序列号 (2B) | ... (同 3E) |
多了 2 字节序列号, 用于多客户端或同一客户端多请求并发时匹配响应。推荐用 4E。
MC 命令码
| 命令 | 子命令 | 说明 |
|---|---|---|
| 0x0401 | 0x0001 | 按字读取软元件 |
| 0x0401 | 0x0003 | 按位读取软元件 |
| 0x1401 | 0x0001 | 按字写入软元件 |
| 0x1401 | 0x0003 | 按位写入软元件 |
| 0x0403 | 0x0000 | 读多块软元件 |
| 0x1403 | 0x0000 | 写多块软元件 |
| 0x0619 | 0x0000 | 读 CPU 型号 |
| 0x1002 | 0x0000 | 远程 RUN |
| 0x1003 | 0x0000 | 远程 STOP |
| 0x0625 | 0x0000 | 读扩展 CPU 名 |
软元件编码
软元件在 MC 帧里用 3 字节代码 (Q/iQ-R) 或 1 字节代码 (FX/iQ-F):
| 软元件 | Q/iQ-R 代码 | FX 代码 |
|---|---|---|
| D | 0xA8 | 0x20 |
| M | 0x90 | 0x00 |
| X | 0x9C | 0x01 (位) |
| Y | 0x9D | 0x02 (位) |
| R | 0xAF | - |
| W | 0xB4 | - |
| L | 0x92 | - |
| B | 0xA0 | - |
| SB | 0xA1 | - |
| ZR | 0xB0 | - |
| T (PV) | 0xC2 | 0x46 |
| C (PV) | 0xC5 | 0x47 |
适配器自动根据 PlcType 选择编码, 使用者直接用文本地址 (D100, M0) 即可。
PLC 型号选择
配置 plcType 参数让适配器按对应协议版本打包:
| plcType | 对应 |
|---|---|
FX3 | FX3U, FX3G |
FX5 | FX5U, FX5UC |
Q | Q 系列 |
L | L 系列 |
iQR | iQ-R 系列 |
iQL | iQ-L 系列 |
不同系列命令参数略有差异 (如 iQ-R 软元件支持 4 字节地址, 其他是 3 字节)。
PLC 端设置
目标 PLC 上需要配置:
- 通讯模块启用 MC 协议: 在 GX Works3/2 里添加 "内置以太网" 或 "以太网模块" 配置项, 打开 MC 协议
- 开放端口: 默认 5000, TCP 或 UDP 任选其一
- 二进制通讯: 在"通讯数据代码"里选 Binary (速度快, 容易调试用 ASCII)
- 允许连接数: 默认 1, 多客户端场景需要改成 N (最多 16)
- 下载到 CPU: 改完要下载才生效
连接握手
TCP 模式下, MC 没有握手协议, 连接建立后直接开始命令。UDP 模式下无连接概念, 每个请求独立。
保活
PLC 侧可以设置 "空闲超时", 超时后主动断连。长时间无请求时建议每 30s 发一次 0x0619 读 CPU 型号作为心跳。
位 / 字地址区分
MC 协议对位和字的操作码不同, 适配器会自动识别:
M100(只有软元件名 + 偏移): 按位D100(WORD 软元件): 按字M100.7(带位号): 在 Darra PLC 侧是不合法的 (MC 不支持 M 软元件的字内位偏移)
要按位访问 D100.3, 改成读 D100 (16 位) 再用 PLC 代码里的位掩码 (MW2000 AND 16#0008) <> 0。
大数据传输
单次请求数据量上限:
| 请求 | 上限 (字) | 上限 (位) |
|---|---|---|
| 字读取 | 960 | 7680 |
| 字写入 | 960 | 7680 |
| 多块读取 | 64 块 | - |
| 多块写入 | 64 块 | - |
超过上限需要分多次请求。适配器会自动拆分。
多块读写
一次请求可读/写多个不连续软元件块:
var blocks = new[] {
new McBlock { Device = "D", Start = 0, Count = 10 },
new McBlock { Device = "D", Start = 100, Count = 5 },
new McBlock { Device = "M", Start = 0, Count = 16, IsBit = true }
};
var results = await adapter.ReadMultipleBlocksAsync(blocks);
比三次单独请求省约 50~70% 延迟。
CPU 控制
MC 协议支持远程启停 CPU:
await adapter.RemoteRunAsync(); // 远程 RUN
await adapter.RemoteStopAsync(); // 远程 STOP
await adapter.RemotePauseAsync(); // 暂停 (仅 Q/iQ-R)
await adapter.RemoteResetAsync(); // 复位
需要 PLC 侧的开关设为 "RUN/STOP 都允许远程"。
错误码
| 错误码 | 含义 |
|---|---|
| 0x0000 | 正常 |
| 0x0055 | CPU 处于锁止状态 (远程停止但不允许远程启动) |
| 0x4021 | 软元件名不支持 |
| 0x4031 | 软元件号超范围 |
| 0x4050 | 请求数据量超上限 |
| 0x4056 | 数据值非法 |
| 0xC050 | 通讯数据代码不匹配 |
| 0xC057 | 请求包长度异常 |
排错
| 症状 | 处理 |
|---|---|
| 连接被拒绝 | 检查 GX Works 里 MC 协议是否开 |
| 返回 0x4021 | 软元件名错或 PLC 型号选错 |
| 间歇性丢包 | TCP 模式 + 开启 Nagle 关闭 |
| 位写不生效 | 该软元件不允许外部写入, 检查 PLC 程序 |
| 多客户端冲突 | 允许连接数加大; 使用 4E 帧 |
| ASCII / Binary 选错 | 字符全为十六进制可见 = PLC 发 ASCII |