在python中64位移位modbus寄存器

时间:2018-06-13 09:04:49

标签: python 64-bit bit-shift modbus modbus-tcp

我试图通过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,反之亦然?

以下是手册中有关注册的说明。 Modbus寄存器为16位宽。对于更宽的数据项,使用连接的Modbus寄存器并将其视为数据块。分配表中显示了已连接的Modbus寄存器的数量。数据块中第一个Modbus寄存器的地址是数据块的起始地址。

先谢谢你的帮助..

1 个答案:

答案 0 :(得分:3)

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