簡體   English   中英

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或反之亦然的位移順序嗎?

這是手冊中有關寄存器的說明。 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM