3. Modbus 协议在 Modicon 中的实现

Modicon 是 Modbus 协议的诞生平台,因此理解 Modicon PLC 的通信行为,本质上就是理解 Modbus 协议在三种传输方式下的具体落地。Modbus 本身是一个“请求—响应”式的主从协议:同一时刻总线上只能有一个主站发起请求,从站被动应答;从站之间不直接通信。协议数据单元(PDU)由功能码和数据域组成,而不同传输方式只是在 PDU 外面加上不同的“封装”,形成应用数据单元(ADU)。这一层封装差异,直接决定了帧结构、校验方式、寻址方式和调试手段的不同。

三种传输方式的帧结构差异

Modbus RTU 使用二进制编码,帧与帧之间依靠至少 3.5 个字符时间的静默间隔来界定边界。其 ADU 结构为:从站地址(1 字节)+ 功能码(1 字节)+ 数据(N 字节)+ CRC 校验(2 字节,低字节在前)。RTU 效率最高,是 Modicon PLC 串口通信的默认选择。Modbus ASCII 则把每个字节拆成两个 ASCII 字符传输,帧以冒号“:”开始、以回车换行结束,校验采用 LRC(纵向冗余校验)。它的可读性好,适合人工调试,但传输效率约为 RTU 的一半。Modbus TCP 则把 PDU 前面加上 7 字节的 MBAP 报文头:事务标识符(2 字节)、协议标识符(2 字节,固定为 0)、长度(2 字节)、单元标识符(1 字节),并且不再使用 CRC,因为 TCP/IP 栈本身已提供校验与重传。MBAP 中的单元标识符在直连 PLC 时通常填 0xFF 或 1,在通过网关访问串口从站时才用于区分后端设备。

Modbus 三种传输方式的 ADU 帧结构对比 Modbus RTU 从站地址 功能码 数据域 N 字节 CRC 低+高 二进制编码 · 3.5T 静默分帧 Modbus ASCII 起始 : 地址(2字符) 功能码(2字符) 数据(2字符/字节) LRC CR LF 可读性好 · 效率约 RTU 一半 Modbus TCP 事务标识 2B 协议标识 2B=0 长度 2B 单元标识 1B 功能码 数据域 N 字节 MBAP 头 7B · 无 CRC 共同点:PDU = 功能码 + 数据域,三种方式承载同一套功能码语义 差异点:寻址方式、校验机制(CRC / LRC / TCP 校验)、分帧方式、传输效率

功能码与数据模型

Modbus 用功能码区分操作类型,并用“线圈、离散输入、输入寄存器、保持寄存器”四类数据区组织数据。Modicon PLC 中,这些区域通常映射到 %M、%I、%IW、%MW 等内部地址。常用功能码包括:01 读线圈、02 读离散输入、03 读保持寄存器、04 读输入寄存器、05 写单个线圈、06 写单个寄存器、15 写多个线圈、16 写多个寄存器。以 03 功能码为例,请求 PDU 为“03 + 起始地址(2B) + 寄存器数量(2B)”,正常响应为“03 + 字节数(1B) + 寄存器数据(N×2B)”。例如读取保持寄存器起始地址 0x0000、数量 0x0002,若两个寄存器值分别为 0x0064 和 0x00C8,则响应数据域为 04 00 64 00 C8。地址编号时要注意:协议报文中的地址从 0 开始,而工程习惯常写作 40001 这类 1 基地址,二者相差 1,配置时务必确认工具采用的是哪一种。

异常响应与判断依据

当从站无法正常完成请求时,会返回异常响应:功能码最高位置 1(即原功能码 + 0x80),后跟 1 字节异常码。常见异常码有:01 非法功能、02 非法数据地址、03 非法数据值、04 从站设备故障、05 确认(从站已接收,需较长时间处理)、06 从站忙。例如主站请求 03 功能码读取一个不存在的寄存器地址,从站可能返回 83 02,表示“读保持寄存器”请求遇到非法数据地址。调试时看到功能码大于 0x80,就应立即意识到这是异常响应,而不是正常数据。此外,CRC 错误、LRC 错误、帧间隔不符、TCP 连接被拒绝等属于通信层错误,不会以异常码形式返回,需要从物理层、参数配置和网络层分别排查。

Modicon PLC 作为从站与主站的行为

当 Modicon PLC 作为从站时,它监听请求、校验地址与功能码、访问对应数据区并组织响应。此时需要配置从站地址、串口参数(波特率、数据位、校验、停止位)或 TCP 端口(默认 502),并确保请求访问的地址在 PLC 数据区范围内。若地址越界,返回异常码 02;若功能码不支持,返回异常码 01。作为主站时,PLC 主动发起请求并等待响应,需要处理超时、重试和轮询顺序。典型做法是:为每个从站设置独立的超时时间(如 300~1000 ms)和重试次数(如 2~3 次),按从站编号顺序轮询,避免同一时刻发出多个请求。若某从站连续超时,应将其标记为离线并跳过,防止拖慢整个轮询周期。

调试建议:先用 Modbus Poll、QModMaster 等工具模拟主站或从站,确认帧结构和功能码正确后,再接入 PLC 程序。串口调试时优先使用 RTU;若现场干扰较大,可降低波特率或改用带屏蔽的双绞线。TCP 调试时可用 Wireshark 过滤 tcp.port==502 观察 MBAP 头和 PDU 内容。

一个可复用的轮询参数示例

参数示例值说明
传输方式Modbus RTURS485 两线制,半双工
波特率 / 格式19200, 8E1需与从站完全一致
从站地址范围1~8逐个轮询
功能码03 / 16读保持寄存器、写多个寄存器
单次读取数量10 个寄存器避免单帧过长
响应超时500 ms从请求发出到收到首字节
重试次数2 次连续失败则标记离线

理解这三种传输方式的帧结构、功能码语义和异常响应机制,是后续在 Modicon PLC 上编写通信程序、排查现场故障以及与上位机对接的基础。实际工程中,建议把“帧结构—功能码—异常码—主从行为”作为一条完整的判断链来使用:先确认物理层和参数,再确认帧格式,最后根据功能码和异常码定位问题所在。