64-битное смещение регистра Modbus в Python - PullRequest
0 голосов
/ 13 июня 2018

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

Заранее благодарим за помощь.

1 Ответ

0 голосов
/ 14 июня 2018

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

...