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 表示软元件地址超出范围。

3E帧请求/响应结构与二进制·ASCII编码对照 请求帧(上位机 → PLC) 子头 50 00 / 5000 访问路径 网络·PLC·I/O·站号 数据长度 2字节 监视定时器 2字节 指令+子指令 各2字节 数据区 软元件地址·点数·写入值 响应帧(PLC → 上位机) 子头 D0 00 / D000 访问路径 原样返回 数据长度 2字节 结束代码 0000=正常 响应数据区 读取值 / 写入确认 二进制模式 vs ASCII模式(以读取D100开始的2点为例) 二进制模式 子头 50 00 · 路径 00 FF 03FF 00 长度 0C 00 · 定时 10 00 指令 01 04 · 子指令 00 00 地址 64 00 00 00 · 点数 02 00 ASCII模式 子头 5000 · 路径 00FF03FF00 长度 0018 · 定时 0010 指令 0401 · 子指令 0000 地址 000064 · 点数 0002

二、二进制模式与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 040401从指定软元件连续读取N点
批量写01 141401向指定软元件连续写入N点
随机读03 040403按不连续地址读取多点

以“读取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字符。

调试建议:先用ASCII模式配合网络调试助手手工发一条批量读报文,确认子头、路径、长度、指令、地址、点数都正确、结束代码为0000后,再切换到二进制模式用程序组包。这样能把“协议理解错误”和“程序实现错误”分开定位。
常见错误:① 数据长度字段算错,导致PLC按错误长度截断报文;② 监视定时器设为0000,PLC立即超时;③ TCP连接数超限,新连接被拒绝;④ 软元件地址超出iQ-F实际范围(如D寄存器超出可用点数),返回C051。排查时优先看结束代码,再核对长度和地址。