4. iQ-F与上位机MC协议通信
在三菱iQ-F系列PLC(如FX5U、FX5UC)与上位机(PC、HMI、SCADA、MES客户端)之间做数据交互时,MC协议(MELSEC Communication Protocol)是最常用的一种应用层协议。它运行在以太网之上,由上位机主动发起请求,PLC作为服务端响应,属于典型的“请求—应答”式通信。理解MC协议的关键,不在于记住每一个字节,而在于分清三件事:帧格式怎么组织、二进制与ASCII两种编码如何选择、TCP与UDP两种连接方式在什么场景下使用。
一、MC协议帧的整体结构
一条MC协议报文可以拆成四个部分:帧头(子头)、访问路径、请求/响应数据区、结束符。以最常用的3E帧(Qna兼容3E帧)为例,其请求帧结构如下:
- 子头:二进制模式为
50 00,ASCII模式为5000(4个ASCII字符)。 - 访问路径:网络号(1字节)、PLC号(1字节)、请求目标模块I/O号(2字节)、请求目标模块站号(1字节),共5字节。对于iQ-F内置以太网口,通常网络号=00、PLC号=FF、模块I/O=03FF、站号=00。
- 请求数据长度:2字节,表示后续“监视定时器+指令+子指令+数据”的字节数。
- 监视定时器:2字节,单位250ms,表示PLC等待上位机后续报文的最长时间,超时则返回错误。
- 指令+子指令:各2字节,决定本次操作类型,如批量读、批量写、随机读等。
- 数据区:软元件地址、点数、写入值等,长度随指令变化。
响应帧结构与请求帧类似,只是把“指令”位置换成“结束代码”,数据区变为读取结果或写入确认。结束代码为 0000 表示正常,非零则代表具体错误,例如 C059 表示指令不支持,C051 表示软元件地址超出范围。
二、二进制模式与ASCII模式的选择
两种模式承载的信息完全相同,区别只在“字节如何表示”。二进制模式直接发送原始字节,报文紧凑、解析快,适合上位机用C#、C++、Python等语言自行组包;ASCII模式把每个字节拆成两个十六进制字符,报文长度约翻倍,但可读性强,便于用串口调试助手、Telnet或抓包工具直接观察,适合调试和教学。
需要注意两个容易踩坑的差异:其一,指令字节顺序相反。二进制模式下批量读指令写作 01 04(低字节在前),ASCII模式下写作 0401(高字节在前),这是三菱协议的历史约定,写错会直接返回 C059。其二,软元件地址表示不同。二进制模式用3字节或4字节的原始地址值,ASCII模式用6位十六进制字符。以D100为例,二进制为 64 00 00 00,ASCII为 000064。若使用软元件代码方式(如 D*、M*),则地址字段还要带上软元件标识,具体以所用帧类型的手册为准。
三、TCP与UDP连接的建立
iQ-F内置以太网口支持MC协议的TCP和UDP两种承载方式,端口号通常为 5000(也可在GX Works3的“以太网端口设置—对象设备连接配置”中修改)。
- TCP连接:上位机作为客户端,向PLC的IP和端口发起三次握手,连接建立后保持长连接,每次请求—应答在同一连接上完成。优点是可靠、有序、有重传,适合SCADA、MES等需要持续稳定读写的场景。缺点是PLC对同时打开的TCP连接数有限制(FX5U通常为8个左右),连接异常断开后需要重新建立。
- UDP连接:无连接,上位机直接向PLC端口发送报文,PLC按来源地址回送响应。优点是开销小、无需维护连接状态,适合高频短报文或广播式采集;缺点是丢包不重传,需要上位机自己做超时和重试。
无论TCP还是UDP,PLC侧都需要在GX Works3中配置“对象设备连接配置”,把上位机作为“SLMP/MC协议”对象登记,并指定协议类型(TCP/UDP)、端口号和通信对象IP。若未登记,PLC会拒绝或丢弃报文。
四、常用数据读写指令
MC协议中与数据读写最相关的指令主要有三条:
| 指令 | 二进制 | ASCII | 用途 |
|---|---|---|---|
| 批量读 | 01 04 | 0401 | 从指定软元件连续读取N点 |
| 批量写 | 01 14 | 1401 | 向指定软元件连续写入N点 |
| 随机读 | 03 04 | 0403 | 按不连续地址读取多点 |
以“读取D100开始的2点”为例,二进制请求数据区为:地址 64 00 00 00、点数 02 00;PLC响应数据区返回4字节,前2字节为D100的值,后2字节为D101的值,均为小端序。若D100=1234(0x04D2)、D101=5678(0x162E),则响应数据为 D2 04 2E 16。ASCII模式下则返回 D2042E16,每点4个ASCII字符。