我正试图通过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寄存器的地址是数据块的起始地址。
提前谢谢你的帮助。
发布于 2018-06-14 01:35:05
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()关于有效负载生成器和解码器使用情况,请参阅示例payload.py。
https://stackoverflow.com/questions/50833237
复制相似问题