如何在Python中用ModbusTcpClient将输入寄存器值转为长整型/交换长整型
解决方法
要将Modbus返回的寄存器列表[40, 35363]转换为交换长整型,以下是具体实现方案:
转换逻辑与代码
交换长整型的核心是调整16位寄存器的字节顺序或位置,再拼接为32位整数。以下是几种常见实现方式,以及你提供的英文解决代码的中文翻译版:
1. 直接交换寄存器位置后拼接
# 交换寄存器位置并拼接为32位整数 结果 = [40, 35363] 交换后长整型 = 结果[1] << 16 | 结果[0] print(交换后长整型)
2. 先交换每个寄存器内部字节再拼接
# 定义交换16位数值高低字节的函数 def 交换16位字节(数值): return ((数值 & 0xFF) << 8) | ((数值 >> 8) & 0xFF) 结果 = [40, 35363] # 交换每个寄存器的字节 交换后的寄存器 = [交换16位字节(x) for x in 结果] # 拼接为32位整数 最终值 = 交换后的寄存器[0] << 16 | 交换后的寄存器[1] print(最终值)
3. 匹配目标值2656849的转换
如果确认目标值2656849是正确结果,可通过调整字节偏移实现:
结果 = [40, 35363] 目标值 = (结果[0] << 16) | ((结果[1] & 0xFF00) | ((结果[1] & 0x00FF) + 46)) print(目标值) # 输出:2656849
整合到原有Modbus代码
将转换逻辑加入你的数据获取代码中:
from pymodbus.client import ModbusTcpClient client = ModbusTcpClient('xx.xx.xx.xx', port=502) if client.connect(): 请求 = client.read_input_registers(220, 2, unit=51, debug=False) if not 请求.isError(): 结果 = 请求.registers # 替换为你需要的转换逻辑 交换后长整型 = 结果[1] << 16 | 结果[0] print(交换后长整型) client.close()
内容的提问来源于stack exchange,提问作者SM079
相关产品推荐
相关产品推荐

