64-битный сдвиг регистра Modbus в Python

Я пытаюсь получить данные от контроллера кластера SMA через протокол Modbus. Спецификация 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 в блоке данных является начальным адресом блока данных.

Заранее спасибо за помощь..


person Hsn    schedule 13.06.2018    source источник


Ответы (1)


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 для конструктора полезной нагрузки и использование декодера.

person Sanju    schedule 14.06.2018