Как проверить версию pymodbus для декодирования значения float_32? - PullRequest
0 голосов
/ 25 июня 2018

Я читаю и декодирую значение float_32, используя pymodbus.

Раньше я декодировал это следующим кодом:

from pymodbus.client.sync import ModbusTcpClient
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder

cli = ModbusTcpClient('an-IP')
cli.connect()
req = cli.read_holding_registers(<hex-address>, count=4)
dec = BinaryPayloadDecoder.fromRegisters(req.registers, endian=Endian.Little)
print(dec.decode_32bit_float())

Но недавно я столкнулся с этой ошибкой:

TypeError: fromRegisters() got an unexpected keyword argument 'endian'

[ ОБНОВЛЕНИЕ ]

Я думаю, что более новая версия pymodbus была изменена (аргумент endian устарел):

Ссылка : похоже, измененные аргументы, но не документация

Затем я изменил эту строку следующим образом:

dec = BinaryPayloadDecoder.fromRegisters(
    req.registers,
    byteorder=Endian.Big,
    wordorder=Endian.Little)

Проблема:

Теперь я хочу проверить версию pymodbus, чтобы узнать, какая версия декодирования должна использоваться.

1 Ответ

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

Я нашел способ обойти pymodbus версию для декодирования значений float_32 для обработки разностной версии функции декодирования:

try:
    '''For pymodbus 1.3.2 and older version.''' 
    dec = BinaryPayloadDecoder.fromRegisters(req.registers,
                                             endian=Endian.Little)
except:
    '''For pymodbus 1.4.0 and newer version.''' 
    dec = BinaryPayloadDecoder.fromRegisters(req.registers,
                                             byteorder=Endian.Big,
                                             wordorder=Endian.Little)

Или:

import inspect


if 'endian' in inspect.getargspec(BinaryPayloadDecoder.fromRegisters)[0]:
    '''For pymodbus 1.3.2 and older version.''' 
    dec = BinaryPayloadDecoder.fromRegisters(
        req.registers,
        endian=Endian.Little)
else:
    '''For pymodbus 1.4.0 and newer version.''' 
    dec = BinaryPayloadDecoder.fromRegisters(
        req.registers,
        byteorder=Endian.Big,
        wordorder=Endian.Little)

[ ПРИМЕЧАНИЕ ]:

Также вы можете проверить версию пакетов PyPi с помощью: pip show <pkg-name>

...