Modbus 浮点数 / IEEE 754 转换器
把读到的两个寄存器贴进来,四种字节序一次全解;或者输入一个数,看它在每种字节序下该怎么写进寄存器。读数对不上时,先来这里排除字节序。
| 按这种字节序解读 | float32 | uint32 | int32 |
|---|---|---|---|
| 大端 ABCD | -1.883367e+25 | 3917038326 | -377928970 |
| 字交换 CDAB | 123.456001 | 1123477881 | 1123477881 |
| 字节交换 BADC | 1.518500e+35 | 2045376066 | 2045376066 |
| 小端 DCBA | -9.861115e+32 | 4131551721 | -163415575 |
高亮的是数量级像正常工程量的解读。多行都高亮时,拿一个已知值(比如当前室温、设定值)对照设备面板确认一次,之后这台设备就固定用那一种。
全部计算在你浏览器本地完成,不上传任何数据。字节序以设备手册为准;手册没写时,用「寄存器 → 浮点数」把四种都解一遍对照。
怎么用
读设备时:用功能码 03 / 04 读出浮点量对应的两个寄存器,把这 4 个字节按读出的顺序原样贴进「寄存器 → 浮点数」。
空格、逗号、0x 前缀都能识别,写成 E979 42F6 或 E9 79 42 F6 都行。
表格里会列出四种字节序下的解读,数量级像正常工程量的那一行会高亮。
写设备时:切到「浮点数 → 寄存器」,输入要写的值,按设备手册要求的字节序取对应那一行的两个寄存器值,用功能码 16(0x10)写入。
为什么 Modbus 浮点数这么容易读错
Modbus 协议的数据单位是 16 位寄存器,协议只规定了一件事:寄存器内部高字节在前。 而温度、压力、流量这类带小数的量,设备通常按 IEEE 754 单精度存成 32 位,得拆成两个寄存器。 两个寄存器谁在前,协议没有规定,于是有的设备高字在前(ABCD),有的低字在前(CDAB), 还有少数在寄存器内部再对调一次字节(BADC、DCBA)。
拿 123.456 举例,它的 IEEE 754 大端字节是 42 F6 E9 79。
如果设备用的是 CDAB,你读到的是 E9 79 42 F6;
上位机要是按 ABCD 去拼,得到的是一个约 -1.9E+25 的数,看起来像设备坏了,其实只是顺序反了。
所以遇到读数离谱,第一件事是换字节序,而不是查接线或换设备。
IEEE 754 单精度的 32 位是怎么排的
- 1 位符号:0 为正、1 为负,所以最高字节 ≥ 0x80 的都是负数。
- 8 位指数:偏移 127 存储。1.0 的指数字段是 127,因此 1.0 =
3F80 0000。 - 23 位尾数:约 7 位十进制有效数字,这就是写 123.456 读回 123.45600128 的原因。
记住两个锚点就能手动排查:3F80 0000 是 1.0,0000 0000 是 0。设备处于空载、读数应接近 0 或 1 的时候,拿它们对一下字节序最快。
常见问题
- 读出来的浮点数是 1.4E-41、-2.3E+38 这种离谱值,是设备坏了吗?
- 十有八九是字节序选错了,不是设备问题。一个 32 位浮点数要拆成两个 16 位寄存器传输,而 Modbus 协议只规定了单个寄存器内部高字节在前,没规定两个寄存器谁在前,各厂家做法不一样。同一串字节按错的顺序去拼,得到的就是这种量级离谱的数。把读到的 4 个字节贴进上面「寄存器 → 浮点数」,四种顺序一次全解出来,挑那个数量级正常的。
- 四种字节序 ABCD / CDAB / BADC / DCBA 分别是什么意思?
- 以 IEEE 754 标准的大端字节 A B C D(A 是含符号位和指数高位的那个字节)为基准:ABCD 是大端,两个寄存器高字在前;CDAB 是字交换,低字寄存器在前、寄存器内部仍是高字节在前,在 PLC 和仪表里很常见;BADC 是每个寄存器内部高低字节对调;DCBA 是完全小端。不同上位机软件对它们的叫法不统一(有的叫 Float Inverse、有的叫 Little-endian byte swap),以字母顺序为准最不容易混。
- 为什么我写入 123.456,读回来变成 123.45600128?
- 这是单精度浮点数本身的精度限制:IEEE 754 单精度只有 23 位尾数,折合约 7 位十进制有效数字,很多十进制小数没法被精确表示,只能存一个最接近的值。设备没有出错,只是显示时位数给多了。需要更高精度的设备一般会用两个寄存器之外的 64 位双精度(占 4 个寄存器),或者直接用放大倍数的整数(比如温度乘 10 存成 int16)。
延伸阅读
组读寄存器的请求帧、核对校验,用 CRC/Modbus 校验计算器; 想直接在浏览器里连设备发请求、看回包,用 串口调试助手网页版。 私有协议用的是累加和或异或校验的话,见 校验和计算器。 多机总线的接线和方向控制,接着读 RS-485 差分总线。