ModbusRTU与大端小端协议一致性的陷阱
Modbus RTU 的问题经常不在功能码,而在串口参数、帧边界和数值排列。它们都不会让通信“彻底不通”,却会让数据间歇错误或看起来毫无规律。
物理层先确认 A/B 极性、共地、终端与偏置是否符合总线设计。串口参数要逐项对齐:端口、波特率、数据位、校验位、停止位和模式。主从双方参数只差一项,可能出现短帧偶尔成功、长帧一直超时。CRC 错误、超时、帧间隔不足和从站地址错误看起来都像“没有数据”,但抓包和计数器会把它们区分开。
Modbus 的基本数据单位是 16 位寄存器。一个 32 位整数或浮点数通常占两个连续寄存器,至少涉及两个独立问题:寄存器先后顺序,也就是 word order;以及每个寄存器内部高低字节是否交换,也就是 byte order。以数值 0x12345678 为例,常见的四种排列分别可能是 12 34 56 78、34 12 78 56、56 78 12 34、78 56 34 12。只看一个“差不多”的十进制结果,很难判断用了哪一种。
测试时使用可辨识的位模式,而不是温度、电压这类有物理含义却接近正常范围的随机值。分别发送正数、负数、小端、大端、跨寄存器借位值,再在接收端读取原始寄存器。确认 0x0102、0x01020304 这类模式如何排列,就能快速锁定格式。再把格式写回接口表,避免每个信号各自猜测。
大端和小端可能同时存在于链路的不同段。一个网关接收 RTU,再通过 TCP 转发给上层系统时,两段都可能做一次字节或字交换。正确做法是把每一段的输入格式、内部格式和输出格式画出来,用报文逐段核对,而不是只在最终界面上乘系数补偿。
RTU 还存在事件与轮询优先级、从站响应间隔和终端状态等时间问题。一个端口能读到值,不代表多个节点都能稳定响应。逐站、逐功能码、逐数据块测试,最后再做完整轮询压力测试。协议一致性首先是一份精确的编码约定,其次才是接线与收发。
在站点中打开 →