首页/网络/工控与物联网速查/Modbus字节序与字序处理陷阱
工业协议80 条

Modbus字节序与字序处理陷阱

Modbus 只定义 16 位寄存器、传输高字节在前;32 位数据要占两个寄存器,而这两个寄存器的先后顺序由厂商自定,读错顺序会让数值完全错误。

工控与物联网速查网络更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​​‌​​‌‌‌​‌​‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌‌‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

问题从哪来

Modbus 规范把数据单元固定为 16 位寄存器,发送时高字节在前,这一点没有歧义。但现场物理量常常是 32 位:单精度浮点、累计流量、电能、双字计数器都要占两个连续寄存器,而规范并未规定这两个寄存器谁先出现。厂商各写各的,于是同一台设备在 A 软件里显示 25.5,在 B 软件里显示天文数字,这是工业现场最常见的低级错误之一。

基本信息

适用协议Modbus RTU / ASCII / TCP 规则相同
寄存器宽度16 位,规范固定
字节序大端,高字节先发,规范固定
字序厂商自定,常见 ABCD / CDAB / BADC / DCBA
易出问题时32 位整数、单精度浮点、64 位量(占 4 个寄存器)

典型使用场景

  • 对接电表、流量计、称重仪表:这类设备大量用两个寄存器表达浮点值
  • 自研脚本或组态软件读 PLC 的 REAL,需要确认两侧的字序约定
  • 旧采集程序迁移后数值全错:老代码里隐含了字序假设,换库就暴露
  • 排查读数异常:应先怀疑字序,再怀疑量纲换算和标定系数
  • 编写通用驱动时把字序做成配置项,避免每接一台新设备改一次代码

四种常见排列

排列含义常见于
ABCD高字在前,字内大端多数 PLC 与西门子风格设备
CDAB低字在前,字内大端部分电表、流量计
BADC高字在前,字内小端少量仪表
DCBA字节完全颠倒个别变频器与老仪表

按字序解码

按字序解码
# 读到两个寄存器 A、B(各 16 位),字序决定拼接方式
raw_abcd = struct.pack('>HH', A, B)      # ABCD:高字在前,再按大端解
value = struct.unpack('>f', raw_abcd)[0]
value_cdab = struct.unpack('>f', struct.pack('>HH', B, A))[0]  # 先换字序
print(hex(A), hex(B), value)  # 记录原始寄存器值,便于与设备面板比对
判定字序最可靠的办法是实测:写入一个已知值(例如 100.0),把两个原始寄存器值抄下来逐字节比对;靠配置文件注释或旧文档猜,往往要浪费半天。
把两个 16 位寄存器拼成 32 位整数再套浮点解释,是常见的错误写法:整数拼接正确不代表浮点解释正确,两者必须分别验证。

易错点

  • 字序错的数值常常仍落在合理量程内,容易被当成真实波动,排查时先用已知值做标定
  • 同一台设备的不同数据点可能使用不同字序,不要用一个结论套整张表
  • Modbus 标准不支持浮点,浮点映射属于厂商实现,换型号或升级固件后要重新确认
  • 用拼接整数直接解释浮点会得到看似正常的整数,误差会在后续换算中被放大

数据来源与参考

  • Modbus Application Protocol Specification V1.1b3(Modbus Organization)
  • Modbus over Serial Line Specification V1.02
  • 设备厂商通信手册中关于浮点寄存器排列的章节

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/ics/modbus-byte-word-order.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​​‌​​‌‌‌​‌​‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌‌‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​