python 中 modbus 寄存器的 64 位移位

64 bit shifting of a modbus register in python

我正在尝试通过 modbus 协议从 SMA 集群控制器获取数据。 modbus 规范类似于..

Addres:30517
Desc: Energy fed on all conductors.. ,
CNT(Word): 4(Number of assigned Modbus registers.) ,
Type: U64(i need to bit shift from 3 to 0?) ,
Format: FIX0( no decimal ) ,
Access: RO (Read only) ,

现在,当我在 4 个不同的 16 位寄存器中得到响应时,我不确定我是否正确地进行了位移。. 我正在做类似....

request = client.read_holding_registers(30513,4,unit=2)
result = request.registers
currentActivePowerH=(result[3]<<16) | result[2]
currentActivePowerL=(result[1]<<16) | result[0]
currentActivePower=(currentActivePowerH<<32) | currentActivePowerL

我也不确定我必须从 3 开始到 0 或从 0 开始的位移顺序?

这里是手册中关于寄存器的描述。 Modbus 寄存器为 16 位宽。对于更广泛的数据项,使用连接的 Modbus 寄存器并将其视为数据块。连接的 Modbus 寄存器的数量在分配表中指示。一个数据块中第一个Modbus寄存器的地址就是该数据块的起始地址。

在此先感谢您的帮助..

pymodbus 提供了一组丰富的实用程序来处理接收到的数据,在您的情况下您可以这样做

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
 # client intialization
response = client.read_holding_registers(30513,4,unit=2)
# Use the correct word and byte orders , below is for example purpose only
decoder = BinaryPayloadDecoder.fromRegisters(response.registers, wordorder=Endian.Big, byteorder=Endain.Big)
value = decoder.decode_64bit_uint()
# or decoder.decode_64bit_int()
# or decoder.decode_64bit_float()

请参阅示例 modbus_payload.py 以了解有效负载构建器和解码器的用法。