![](/img/trans.png)
[英]Write a specific bit in a 16bits register with modbus in python
[英]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.