基于Modbus协议的SCADA系统中,Float32、Float32LE与Float32MLE的区别是什么?
这三种类型本质都是基于IEEE 754单精度浮点数(占4字节,对应2个Modbus寄存器),核心差异在于字节/寄存器的排列顺序(端序),适配不同设备的通信约定:
Float32(默认大端序)
完全遵循Modbus协议默认的大端(Big-Endian)规则:把浮点数的4个字节按“高位到低位”的顺序,依次存入两个Modbus寄存器。比如某浮点数的字节序列为[B0, B1, B2, B3](B0是最高位字节),那么第一个寄存器存B0B1,第二个寄存器存B2B3。Float32LE(小端字节序)
LE是Little-Endian的缩写,采用纯小端序排列整个浮点数的4个字节:把原本大端序的字节序列完全反转,再存入寄存器。还是用[B0, B1, B2, B3]的例子,小端序下字节顺序变为[B3, B2, B1, B0],对应第一个寄存器存B3B2,第二个存B1B0。这种常见于使用小端系统的设备(如多数x86架构的工控机)。Float32MLE(混合端序)
MLE是Mixed-Endian的缩写,属于“字内小端、字间大端”的混合模式:每个Modbus寄存器内部的两个字节按小端交换,但寄存器之间保持大端的顺序。比如原大端字节序列[B0, B1, B2, B3],第一个寄存器会存B1B0(交换原第一个字的字节),第二个寄存器存B3B2(交换原第二个字的字节)。这种是部分老旧工控设备常用的约定。
简单总结:选哪种类型,完全取决于你的现场设备是按哪种字节顺序把浮点数映射到Modbus寄存器的,匹配错了会读出完全错误的数值。
内容的提问来源于stack exchange,提问作者Ionut

