Modbus 是一种请求/响应式的主从协议,通信过程由主站(客户端)发起,从站(服务器)响应。无论串行链路(RTU/ASCII)还是以太网(Modbus TCP),核心操作步骤基本一致,可按以下流程理解:
1. 主站构建请求帧

l 确定目标从站地址(TCP 中对应单元标识符,RTU 中为 1 字节地址)。
l 选择功能码(如 03 读保持寄存器、06 写单个寄存器等)。
l 填入数据区(寄存器起始地址、数量、写入值等)。
l 计算差错校验(RTU 用 CRC-16,ASCII 用 LRC,TCP 由底层 TCP 负责)。
示例请求帧(RTU 模式,读保持寄存器):
[从站地址 1B][功能码 03][起始地址 2B][寄存器数量 2B][CRC 2B]
2. 主站发送请求

l 在串行线路上,主站将帧以二进制发出(RTU)或以 ASCII 字符发出(ASCII)。
l 在 TCP 网络中,主站先建立 TCP 连接(端口 502),再发送包含 MBAP 报文头 + 请求帧的数据包。
3. 从站接收并校验

l 从站持续监听,当收到完整帧后:
a. 地址检查:只有地址匹配(或广播地址 0)的从站才处理。
b. 完整性检查:通过 CRC/LRC 或 TCP 校验判断帧是否损坏。若错误,丢弃并等待主站超时重发。
l(广播请求:功能码如写操作可广播,此时从站不回复。)
4. 从站执行操作

l 解析功能码与数据区,执行相应动作:
a. 读取线圈、离散量、保持寄存器、输入寄存器。
b. 写单个/多个寄存器或线圈。
c. 读取设备识别信息等。
l 在执行过程中,若出现非法功能码、地址越界、设备故障等,则转入异常处理。
5. 从站构建响应帧
l 正常响应:将功能码原样返回(写操作)或附上数据(读操作)。
a. 如读寄存器响应:[从站地址][功能码][数据字节数][寄存器数据…][CRC]
l 异常响应:功能码 最高位置 1(即功能码 + 0x80),后跟异常码(如 02 非法地址、03 非法数据等)。
a. 例:[从站地址][0x83][异常码 02][CRC] 代表读保持寄存器时地址非法。
6. 从站发送响应

l 将响应帧发回主站(RTU/ASCII 需在帧间保持静默间隔 ≥ 3.5 字符时间)。
l 对于 Modbus TCP,数据包通过已建立的 TCP 连接返回。
7. 主站接收与处理

l 主站等待响应(一般设置超时时间,如 1 秒)。
l 若收到有效响应:
a. 校验地址、功能码,并根据正常或异常做业务处理。
l 若超时或校验错误:
a. 主站可根据策略重试(通常 2~3 次),仍失败则报通信故障。
典型时序简图(主站视角)
重要补充
l 半双工/全双工:串行 Modbus 多为半双工(RS-485),主站发完请求后必须立即转为接收状态;TCP 全双工,可在同一连接上连续发送多个请求,用 MBAP 头中的事务标识符匹配响应。
l 广播:主站发往地址 0,所有从站执行动作但不回送响应。
l 功能码示例:01 读线圈、02 读离散输入、03 读保持寄存器、04 读输入寄存器、05 写单线圈、06 写单寄存器、15/16 写多线圈/多寄存器。
以上即是 Modbus 协议一次完整交互的基本步骤。理解了这个请求-应答模式,就抓住了 Modbus 的核心运作方式。