Modbus 现场调试速查:字节序、有符号数与 CRC
现场排查 Modbus 遥测数据不对时,八成出在字节序和数据类型上。这篇速查把最常见的组合列出来,配合 Hub 工具箱 可以在一分钟内定位问题。
四种字节序到底差在哪
以 32 位寄存器值 0x41CC0000(float 25.5)为例,两个寄存器四个字节的排列:
| 名称 | 排列 | 常见叫法 |
|---|---|---|
| ABCD | 41 CC 00 00 |
大端 / Big-Endian |
| DCBA | 00 00 CC 41 |
小端 / Little-Endian |
| BADC | CC 41 00 00 |
大端字节交换 |
| CDAB | 00 00 41 CC |
小端字交换(国产 PCS 最常见) |
读出来的浮点数大得离谱(如
2.8e-41)基本就是字节序错了;读出来是 0 但设备明明有值,先怀疑寄存器地址偏移(40001 与 offset 0 的差异)。
快速定位三步法
- 用调试工具直接读原始帧,记下 4 个字节的原始十六进制
- 在 数值与字节工具 里把 4 字节按 ABCD/CDAB/BADC/DCBA 各转一遍 float32
- 哪个结果落在物理量的合理区间(功率几十 kW、电压几百 V、SOC 0-100),就是哪种字节序
有符号数的坑
S16 读到 0xFFF6 是 -10,不是 65526。功率、温度这类可能为负的量用 U16 解析,负值时会突变成 6 万多——历史曲线上突然出现的"尖刺"多半是这个原因。
CRC 校验失败怎么查
- RTU 帧 CRC16(Modbus 多项式 0xA001)低字节在前:帧尾
C5 CD表示 CRC 值 0xCDC5 - 用 Modbus 工具 粘贴整帧自动校验,不必手算
- 串口上偶发 CRC 错优先查波特率漂移和终端电阻,不是软件问题
有补充或纠错,欢迎联系 frank@eco-watt.com。
CodeWatt