RTU 帧的组成
Modbus RTU 是串行链路上最常用的帧格式,帧由从站地址、功能码、数据与 CRC 校验组成,没有起始与结束字符,靠帧间静默间隔区分边界。这带来两个特点:一是对时序敏感,字符间隔超限会被当作帧结束;二是链路不宜混杂其他协议流量,否则会出现帧粘连与校验错误。
字段与约定
| 从站地址 | 1 字节,0 为广播,串行链路上的有效从站地址通常为 1 至 247,以规范为准 |
|---|---|
| 功能码 | 1 字节,最高位为 1 表示异常响应 |
| 数据字段 | 长度随功能码变化,包含地址、数量与内容 |
| CRC 校验 | 2 字节,低字节在前,覆盖地址至数据字段 |
| 帧边界 | 以帧间静默间隔判定,常见约定为 3.5 个字符时间,字符间隔超过 1.5 个字符时间视为帧错误 |
| 长度上限 | ADU 上限 256 字节,PDU 上限 253 字节,具体以规范为准 |
请求与响应示例
请求与响应示例
01 03 00 00 00 02 <CRC 低> <CRC 高> # 请求:从站 01,功能码 03,起始地址 0,数量 2
01 03 04 00 0A 00 14 <CRC 低> <CRC 高> # 响应:字节数 04,两个寄存器值 000A 与 0014
# CRC 由发送方计算并附在帧尾,低字节在前,具体算法以规范为准
# 帧与帧之间需保持静默间隔,接收方据此判定一帧结束字段逐段读法
| 字段 | 长度 | 含义 | 判读要点 |
|---|---|---|---|
| 从站地址 | 1 字节 | 目标设备地址 | 与设备配置不符时通常无响应 |
| 功能码 | 1 字节 | 请求的操作类型 | 最高位为 1 表示异常响应 |
| 数据 | 不定长 | 地址、数量与内容 | 数量超限会返回异常码 |
| CRC | 2 字节 | 校验值,低字节在前 | 校验失败通常静默丢弃 |
| 静默间隔 | 时间 | 帧边界标志 | 间隔不足会造成帧粘连 |
排错时的观察点
- 完全无响应:先查从站地址、串口参数与接线,而不是怀疑数据内容
- 校验错误率高:确认串口参数与链路干扰,长距离链路检查终端电阻与屏蔽接地
- 收到异常响应:解析功能码最高位与异常码取值,定位是地址问题还是数据问题
- 偶发错误:观察是否与某台设备通信或电气动作时间相关
- 帧粘连:检查主站调度间隔是否过短,以及链路是否混入了非 Modbus 流量
RTU 没有帧起始与结束字符,静默间隔属于协议的一部分。在高波特率下,许多实现改用固定超时替代按字符时间计算,不同厂商实现存在差异,跨厂商互操作时需特别注意,具体以规范和设备手册为准。
在混有其他协议流量或存在广播风暴的链路上运行 RTU,会造成帧粘连与 CRC 错误率上升。串行链路应保持协议单一,避免把非 Modbus 数据混入同一链路。