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

如何通过pymodbus读取设备的32位寄存器值

pymodbus读取设备32位寄存器数值实现方法

Modbus协议单个标准寄存器位宽为16位,32位类型的数值(含32位整数、32位浮点数)会占用2个连续的寄存器地址,读取核心是要匹配设备的寄存器类型、地址规则和存储端序,具体实现如下:

前置确认项

读取前先从设备手册确认3个信息,避免读错或读不到值:

  • 寄存器类型:属于保持寄存器(对应功能码03)还是输入寄存器(对应功能码04)
  • 地址规则:设备寄存器地址是0起始还是1起始,pymodbus默认使用0起始地址,1起始的设备需要把手册标注的地址减1后传入接口
  • 存储端序:32位值拆分两个16位寄存器时的高低字、高低字节排列规则,不同厂商设备规则不统一,端序错误会读出完全不符合预期的异常值

实现代码(适配pymodbus 3.x主流版本)

from pymodbus.client import ModbusTcpClient
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian

# 初始化客户端,RTU串口设备替换为ModbusSerialClient即可
client = ModbusTcpClient(host="你的设备IP", port=502)
conn_status = client.connect()
if not conn_status:
    raise RuntimeError("设备连接失败")

# 读取参数配置
SLAVE_ADDR = 1  # 设备从站ID
TARGET_REG_START = 0x0002  # 32位值的起始寄存器地址
# 读保持寄存器调用read_holding_registers,读输入寄存器替换为read_input_registers
resp = client.read_holding_registers(
    address=TARGET_REG_START,
    count=2,  # 32位固定占2个16位寄存器,count固定传2
    slave=SLAVE_ADDR
)

if resp.isError():
    print(f"寄存器读取错误:{resp}")
else:
    # 按设备端序初始化解码器,两个参数分别为字节序、字序
    # 常见组合:大端无交换(Endian.BIG, Endian.BIG)、大端字交换(Endian.BIG, Endian.LITTLE),读值异常时切换组合测试即可
    decoder = BinaryPayloadDecoder.fromRegisters(
        resp.registers,
        byteorder=Endian.BIG,
        wordorder=Endian.BIG
    )
    # 根据实际存储类型调用对应解码方法
    # 32位有符号整数
    value = decoder.decode_32bit_int()
    # 32位无符号整数:value = decoder.decode_32bit_uint()
    # 32位浮点数:value = decoder.decode_32bit_float()
    print(f"目标寄存器32位值:{value}")

client.close()

常见问题排查

  • 报非法地址错误:优先检查地址偏移是否正确、功能码是否和寄存器类型匹配
  • 读值和实际值偏差极大:优先切换端序组合测试,不需要调整读取逻辑
  • 连接正常但读值全0:确认设备是否处于运行状态、目标地址是否确实存储了有效32位数据

内容的提问来源于stack exchange,提问作者Justin Xuereb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:39:19