Как мне изменить вывод регистров с помощью pymodbus?

Я использую pymodbus для получения значений нескольких регистров через Modbus. У меня есть связь и результаты, но я не понимаю, как интерпретировать результаты. Мой код:

from pymodbus.client.sync import ModbusTCPClient

client = ModbusTcpClient(host ="192.168.0.42", port= 502)
client.conect()
rr = client.read_input_registers(0,2, unit=42)
print(rr.registers)

В результате я получаю [37139,16190]. В документации к прибору, с которым я работаю, говорится: «Эти регистры по 16 бит каждый ... Все значения представлены в 32-битном формате с плавающей запятой стандарта IEEE 754. В нем используются 2 последовательных регистра, сначала младшие 16 бит. " Означает ли это, что результирующее число с плавающей запятой будет 1619037139? Результат должен быть в пределах 0,2-0,4 (округлено). Я ценю любую помощь!


person peter_wx    schedule 24.03.2020    source источник


Ответы (1)


IEEE 754 - это средство кодирования чисел с плавающей запятой, и "сначала младшие 16 битов" мало что значит байтовое кодирование; pymodbus может помочь вам декодировать этот формат:

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder

registers = [37139,16190]
decoder = BinaryPayloadDecoder.fromRegisters(registers, wordorder=Endian.Little)
print ("Result: " + str(decoder.decode_32bit_float()))

(попробуйте - результат 0,18659807741641998, что соответствует вашим ожиданиям).

Обратите внимание, что это полезный инструмент для получения необработанных данных (шестнадцатеричный) является результатом запроса Modbus и его декодирования несколькими способами.

person Brits    schedule 24.03.2020
comment
Идеально! Это было так полезно! Спасибо и за ссылки !! - person peter_wx; 25.03.2020