1

我使用 pymodbus 读取和解码 float_32 值。

之前,我用下面的代码简单地解码它:

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 版本以了解必须使用哪个版本的解码。

4

1 回答 1

2

我发现了一个技巧来绕过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>

于 2018-06-25T05:07:56.697 回答