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

iqih9akk  于 2023-05-02  发布在  Python
关注(0)|答案(2)|浏览(149)

我尝试使用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)

有了这个结果,我得到了一个无符号十进制的列表。我怎么把这个转换成long int或者swapped 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 long2656849**
谢啦

编辑:

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

8ehkhllq

8ehkhllq1#

正如注解中所指出的,我希望结果是2656803this calculator对于检查可能的编码很有用)。
有几个选择;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])
  • 请注意,我没有测试上述代码 *。
nzk0hqpo

nzk0hqpo2#

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

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)

希望这能帮上忙。...

相关问题