如何通过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
相关产品推荐
相关产品推荐

