pymodbus读取温度传感器无法解析从站响应,返回值转换问题咨询
问题解答
你拿到的寄存器原始返回值确实需要按照传感器的通信协议规则做转换,pymodbus默认只会返回寄存器的原始整数值,ModScan里显示的27℃是工具已经按照配置的转换规则计算后的结果,两者的差异属于正常情况。
常见原因和排查步骤
- 先核对寄存器地址偏移问题:大部分Modbus调试工具(包括ModScan)默认使用1起始的寄存器显示地址,而pymodbus使用的是Modbus协议原生的0起始地址。如果你的ModScan中读取的是显示地址为1的寄存器,对应pymodbus中
address参数填0是正确的,否则需要调整地址参数对齐两边的配置。 - 核对寄存器类型:你当前代码用的是
read_input_registers读取输入寄存器,部分温度传感器会把温度值存在保持寄存器中,需要改用read_holding_registers方法读取,和ModScan中选择的寄存器类型保持一致。 - 核对原始值是否一致:先在ModScan中查看你读取的地址范围内的寄存器原始整数值,如果和你代码返回的
[1, 4, 1]不一致,说明你代码中的串口参数、从站地址(unit参数)配置存在错误,需要先对齐配置。
转换方法
确认原始值一致后,按照传感器官方提供的Modbus通信手册的规则转换即可,常见的转换场景有以下几种:
- 单寄存器16位整数+缩放系数:如果温度值存在单个寄存器,缩放系数为0.1,那么转换逻辑为:
actual_temp = res.registers[0] * 0.1 - 双寄存器拼接32位值:如果温度是32位整数/浮点数,需要拼接两个相邻寄存器:
# 32位无符号整数示例 raw_val = (res.registers[0] << 16) | res.registers[1] actual_temp = raw_val * 0.01 - 多寄存器拆分不同字段:你返回的3个寄存器可能分别对应温度整数部分、小数部分、设备状态位,按照手册定义拆分计算即可。
调整后代码示例
from pymodbus.client.sync import ModbusSerialClient client = ModbusSerialClient( method='rtu', port='com3', baudrate=9600, timeout=3, parity='N', stopbits=1, bytesize=8 ) if client.connect(): # 可根据实际情况修改为read_holding_registers、调整address参数 res = client.read_input_registers(address=0, count=3, unit=1) if not res.isError(): print(f"原始寄存器值:{res.registers}") # 以下转换逻辑请根据传感器手册修改 # 示例:温度存在第一个寄存器,缩放系数0.1 actual_temp = res.registers[0] * 0.1 print(f"转换后温度:{actual_temp}℃") else: print(f"读取错误:{res}") client.close() else: print('无法连接到Modbus从站设备')
内容的提问来源于stack exchange,提问作者Fabio Martins
相关产品推荐
相关产品推荐

