4. MC协议与iQ-F数据访问
MC协议(MELSEC Communication Protocol)是三菱电机为其可编程控制器提供的开放通信协议,iQ-F系列(FX5U/FX5UC等)内置以太网口原生支持该协议。掌握MC协议的意义在于:它让上位机、触摸屏、SCADA、机器人控制器甚至第三方软件,都能在不依赖GX Works3的情况下,通过标准以太网报文直接读写iQ-F内部的软元件数据。本节围绕3E帧与4E帧的报文结构、软元件读写命令的构造方法,以及用GX Works3和第三方工具实际访问iQ-F数据的完整过程展开。
一、3E帧与4E帧的报文结构差异
MC协议在以太网上主要有两种帧格式:3E帧和4E帧。两者都建立在TCP或UDP之上,区别在于是否携带"串行号"字段以及请求数据的长度表达方式。
3E帧结构为:副头部(2字节,固定为50 00)+ 网络编号(1字节)+ PLC编号(1字节)+ 请求目标模块I/O编号(2字节)+ 请求目标模块站号(1字节)+ 请求数据长度(2字节)+ 监视定时器(2字节)+ 命令(2字节)+ 子命令(2字节)+ 数据区。其中副头部50 00表示以二进制码通信,若用ASCII码则为"5000"四个字符。
4E帧在副头部之后增加了2字节的串行号(序列号),用于在同一连接上区分多个并发请求的响应归属。其结构为:副头部(2字节,54 00)+ 串行号(2字节)+ 网络编号(1字节)+ PLC编号(1字节)+ 请求目标模块I/O编号(2字节)+ 请求目标模块站号(1字节)+ 请求数据长度(2字节)+ 监视定时器(2字节)+ 命令(2字节)+ 子命令(2字节)+ 数据区。
简单判断:单连接、单请求顺序通信时3E帧足够;需要并发请求或需要严格匹配请求与响应时,应使用4E帧。iQ-F的以太网内置端口同时支持两种帧,具体由GX Works3中的"对象设备连接配置"或通信协议支持功能设定。
二、软元件读写命令的构造
以最常用的"批量读字软元件"为例,命令为01 04,数据区需要给出起始软元件地址(4字节)和读取点数(2字节)。软元件地址的编码规则是:低3字节为软元件编号,高1字节为软元件类型代码。例如D100的地址编码为:类型代码A8(D寄存器)+ 编号100(0x000064),组合为A8 00 00 64。若读取D100开始的5个字,数据区为A8 00 00 64 05 00。
批量写命令01 14的数据区格式为:起始地址(4字节)+ 点数(2字节)+ 写入数据(每字2字节)。例如向D100写入3个字,值为100、200、300,则数据区为A8 00 00 64 03 00 64 00 C8 00 2C 01。
位软元件的读写使用01 01和01 02命令,数据以位为单位打包。例如读取M0开始的16位,数据区为90 00 00 00 10 00(M的类型代码为90),返回2字节数据,每bit对应一个M位。
三、用GX Works3配置并测试MC协议通信
在GX Works3中,首先通过"参数 → FX5UCPU → 模块参数 → 以太网端口"设置IP地址、子网掩码。然后在"对象设备连接配置"中添加"SLMP设备",设定对方IP和端口(MC协议默认TCP端口为5000,UDP为5001)。若使用"通信协议支持功能",可在"通信协议支持功能"中登记MC协议命令,由PLC主动发送或响应。
配置完成后,可用GX Works3的"在线 → 监视 → 软元件批量监视"验证数据。更直接的测试方式是使用调试工具发送原始报文。以下是一个读取D100~D104的3E帧请求示例(十六进制):
50 00 00 FF FF 03 00 0C 00 10 00 01 04 00 00 A8 00 00 64 05 00
各字段含义:50 00副头部,00网络编号,FF PLC编号,FF 03模块I/O,00站号,0C 00请求长度(12字节),10 00监视定时器,01 04命令,00 00子命令,A8 00 00 64起始地址D100,05 00读取5点。正常响应会在数据区返回10字节(5个字)的数据。
四、第三方工具访问iQ-F数据
常见的第三方访问方式包括:Python的pymcprotocol库、C#的MC协议封装库、以及支持Modbus TCP网关转换的方案。以Python为例,使用pymcprotocol连接iQ-F并读取D100~D104的代码如下:
import pymcprotocol
plc = pymcprotocol.Type3E()
plc.connect("192.168.1.10", 5000)
words = plc.batchread_wordunits(headdevice="D100", readsize=5)
print(words) # 例如 [1234, 5678, 0, 0, 0]
plc.close()
若使用4E帧,只需将Type3E改为Type4E,库会自动加入串行号字段。写入时调用batchwrite_wordunits,传入起始地址和值列表即可。
五、结果判读与常见异常
正常响应报文的副头部与请求一致,数据区返回请求的数据。若响应中出现错误代码,常见的有:C059(命令不支持)、C05B(软元件类型错误)、C061(数据长度不匹配)。例如请求长度字段与实际数据区字节数不一致时,PLC会返回C061。排查时应逐字段核对报文长度,特别注意请求长度字段是从监视定时器开始计算的字节数,不含副头部到站号的部分。
实际工程中建议先用GX Works3的通信测试功能确认链路,再用第三方工具发送最小报文(如读取1个D寄存器),确认无误后再扩展到批量读写。这样可以把问题定位在协议层还是应用层,避免一次性调试复杂报文时难以判断故障点。