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 用功能码区分操作类型,并用“线圈、离散输入、输入寄存器、保持寄存器”四类数据区组织数据。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 RTU | RS485 两线制,半双工 |
| 波特率 / 格式 | 19200, 8E1 | 需与从站完全一致 |
| 从站地址范围 | 1~8 | 逐个轮询 |
| 功能码 | 03 / 16 | 读保持寄存器、写多个寄存器 |
| 单次读取数量 | 10 个寄存器 | 避免单帧过长 |
| 响应超时 | 500 ms | 从请求发出到收到首字节 |
| 重试次数 | 2 次 | 连续失败则标记离线 |
理解这三种传输方式的帧结构、功能码语义和异常响应机制,是后续在 Modicon PLC 上编写通信程序、排查现场故障以及与上位机对接的基础。实际工程中,建议把“帧结构—功能码—异常码—主从行为”作为一条完整的判断链来使用:先确认物理层和参数,再确认帧格式,最后根据功能码和异常码定位问题所在。