You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:16:22