使用Python读取Modbus保持寄存器浮点值异常,求问题排查
问题描述
我尝试从保持寄存器中读取存储的浮点值,该值占用41000和41001两个寄存器地址。我使用的RTU设备负责采集多个传感器的数据,通过Modscan32查询寄存器时,选择整数类型可得到对应数值,但选择浮点类型能正确显示30.6250。
读取寄存器的代码:
read_reg = self.client.read_holding_registers(1000, 2) print(read_reg)
尝试解析浮点值但得到错误结果的代码:
read_reg = self.client.read_holding_registers(1000, 2) decoder = BinaryPayloadDecoder.fromRegisters(read_reg.registers, byteorder=Endian.BIG, wordorder=Endian.LITTLE) value = decoder.decode_32bit_float() print(str(value))
请问我哪里操作出错了?
问题分析与解决
核心问题出在寄存器地址偏移错误和字节序/字序设置不匹配设备存储规则,以下是具体修正步骤:
1. 修正寄存器地址偏移
Modbus保持寄存器的绝对地址以4开头(如41000),而多数Modbus库要求使用偏移地址(绝对地址减去40001)。你要读取的41000的偏移地址应为:41000 - 40001 = 999
所以读取代码要改成:
read_reg = self.client.read_holding_registers(999, 2)
先确认read_reg.registers输出的整数值和Modscan32读到的41000、41001数值一致,确保地址正确。
2. 调整字节序与字序匹配设备规则
Modscan32能正确解析,说明它的字节序/字序和设备存储规则一致,你当前的设置byteorder=Endian.BIG, wordorder=Endian.LITTLE不匹配,尝试以下几种组合:
组合1:大端字节序 + 大端字序(最常见的Modbus浮点存储规则)
decoder = BinaryPayloadDecoder.fromRegisters(read_reg.registers, byteorder=Endian.BIG, wordorder=Endian.BIG)
组合2:小端字节序 + 小端字序
decoder = BinaryPayloadDecoder.fromRegisters(read_reg.registers, byteorder=Endian.LITTLE, wordorder=Endian.LITTLE)
组合3:小端字节序 + 大端字序
decoder = BinaryPayloadDecoder.fromRegisters(read_reg.registers, byteorder=Endian.LITTLE, wordorder=Endian.BIG)
逐个测试,直到解析出正确的30.6250。
内容的提问来源于stack exchange,提问作者Prashant soni
相关产品推荐
相关产品推荐

