跳到主要内容

三菱 MC 协议通讯

Darra PLC 通过 MCProtocolAdapter 支持三菱 MC (MELSEC Communication) 协议, 可与三菱 FX/Q/iQ-R 系列 PLC 进行数据交互。

支持系列

系列型号通讯模式说明
FX3U/FX3GFX3U-ENETBinary/ASCII需以太网模块
FX5U内置以太网Binary/ASCII直连
Q 系列QJ71E71Binary/ASCII以太网模块
iQ-R 系列RJ71EN71Binary/ASCII内置/模块
L 系列LJ71E71Binary/ASCII以太网模块

通讯模式

模式帧格式特点
Binary (二进制)3E/4E 帧数据紧凑, 效率高, 推荐
ASCII3E/4E 帧可读性好, 便于调试
推荐配置

生产环境建议使用 Binary 模式 + 4E 帧, 效率最高且支持多连接。

软元件访问

软元件标识地址范围数据类型
D 数据寄存器DD0 ~ D65535WORD
M 内部继电器MM0 ~ M65535BIT
X 输入XX0 ~ X1FFFBIT (八进制)
Y 输出YY0 ~ Y1FFFBIT (八进制)
R 文件寄存器RR0 ~ R65535WORD
W 链接寄存器WW0 ~ WFFFFWORD (十六进制)
B 链接继电器BB0 ~ BFFFFBIT (十六进制)
ZR 文件寄存器ZRZR0 ~ ZR65535WORD
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 命令码

命令子命令说明
0x04010x0001按字读取软元件
0x04010x0003按位读取软元件
0x14010x0001按字写入软元件
0x14010x0003按位写入软元件
0x04030x0000读多块软元件
0x14030x0000写多块软元件
0x06190x0000读 CPU 型号
0x10020x0000远程 RUN
0x10030x0000远程 STOP
0x06250x0000读扩展 CPU 名

软元件编码

软元件在 MC 帧里用 3 字节代码 (Q/iQ-R) 或 1 字节代码 (FX/iQ-F):

软元件Q/iQ-R 代码FX 代码
D0xA80x20
M0x900x00
X0x9C0x01 (位)
Y0x9D0x02 (位)
R0xAF-
W0xB4-
L0x92-
B0xA0-
SB0xA1-
ZR0xB0-
T (PV)0xC20x46
C (PV)0xC50x47

适配器自动根据 PlcType 选择编码, 使用者直接用文本地址 (D100, M0) 即可。

PLC 型号选择

配置 plcType 参数让适配器按对应协议版本打包:

plcType对应
FX3FX3U, FX3G
FX5FX5U, FX5UC
QQ 系列
LL 系列
iQRiQ-R 系列
iQLiQ-L 系列

不同系列命令参数略有差异 (如 iQ-R 软元件支持 4 字节地址, 其他是 3 字节)。

PLC 端设置

目标 PLC 上需要配置:

  1. 通讯模块启用 MC 协议: 在 GX Works3/2 里添加 "内置以太网" 或 "以太网模块" 配置项, 打开 MC 协议
  2. 开放端口: 默认 5000, TCP 或 UDP 任选其一
  3. 二进制通讯: 在"通讯数据代码"里选 Binary (速度快, 容易调试用 ASCII)
  4. 允许连接数: 默认 1, 多客户端场景需要改成 N (最多 16)
  5. 下载到 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

大数据传输

单次请求数据量上限:

请求上限 (字)上限 (位)
字读取9607680
字写入9607680
多块读取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正常
0x0055CPU 处于锁止状态 (远程停止但不允许远程启动)
0x4021软元件名不支持
0x4031软元件号超范围
0x4050请求数据量超上限
0x4056数据值非法
0xC050通讯数据代码不匹配
0xC057请求包长度异常

排错

症状处理
连接被拒绝检查 GX Works 里 MC 协议是否开
返回 0x4021软元件名错或 PLC 型号选错
间歇性丢包TCP 模式 + 开启 Nagle 关闭
位写不生效该软元件不允许外部写入, 检查 PLC 程序
多客户端冲突允许连接数加大; 使用 4E 帧
ASCII / Binary 选错字符全为十六进制可见 = PLC 发 ASCII