ModbusTcpClient:如何从 python 中的输入寄存器读取长整数值

问题描述 投票:0回答:2

我正在尝试使用 ModbusTcpClient 从传感器获取数据,如下所示

client = ModbusTcpClient('xx.xx.xx.xx', port=502)
connection = client.connect()
request = client.read_input_registers(220,2, unit=51, debug=False)
result = request.registers
print(result)

有了这个结果,我得到了一个unsigned decimal的列表。我如何将其转换为long intswapped long

我从上面的代码中得到的结果

2023-04-24 12:18:59,856 MainThread      DEBUG    transaction    :297      RECV: 0x0 0x2 0x0 0x0 0x0 0x7 0x33 0x4 0x4 0x0 0x28 0x8a 0x23
2023-04-24 12:18:59,857 MainThread      DEBUG    socket_framer  :147      Processing: 0x0 0x2 0x0 0x0 0x0 0x7 0x33 0x4 0x4 0x0 0x28 0x8a 0x23
2023-04-24 12:18:59,857 MainThread      DEBUG    factory        :266      Factory Response[ReadInputRegistersResponse: 4]
2023-04-24 12:18:59,858 MainThread      DEBUG    transaction    :454      Adding transaction 2
2023-04-24 12:18:59,859 MainThread      DEBUG    transaction    :465      Getting transaction 2
2023-04-24 12:18:59,859 MainThread      DEBUG    transaction    :224      Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
[40, 35363]

但我需要 [40, 35363] 显示为 swapped long 2656849

谢谢,

编辑:

我已经用下面的代码回答了

python python-3.x modbus modbus-tcp
2个回答
1
投票

如评论中所述,我希望结果为

2656803
这个计算器对于检查可能的编码很有用)。

有几个选项; unpack 经常使用:

import struct
print(struct.unpack('>i', bytes.fromhex("00288a23")))

或者 pymodbustcp 提供了一些可以提供帮助的实用程序(参见这个例子)。这使您可以执行以下操作:

reg = client.read_input_registers(220,2, unit=51, debug=False)
print(word_list_to_long(reg)[0])

请注意我没有测试上面的代码.


0
投票

所以我通过以下代码实现了这一点,

client = ModbusTcpClient('xx.xx.xx.xx', port=502)
connection = client.connect()
request = client.read_input_registers(220,2, unit=51, debug=False)
result = request.registers

decoder = BinaryPayloadDecoder.fromRegisters(request.registers, byteorder=Endian.Big, wordorder=Endian.Big)
active_power_w = decoder.decode_32bit_int()
print(active_power_w)

希望这有帮助...!

© www.soinside.com 2019 - 2024. All rights reserved.