如何使用 pymodbus TCP 库获取浮点值?

Posted

技术标签:

【中文标题】如何使用 pymodbus TCP 库获取浮点值?【英文标题】:How to take float value with pymodbus TCP library? 【发布时间】:2019-09-12 21:57:47 【问题描述】:

我正在从带有 pymodbusTCP 库的机器中读取一些值,但是当我读取浮点数时我的值有误。 获取值的函数是:

def ler_dado(endereco,tipo):
    if tipo == "float":
        valor = modbus.read_holding_registers(endereco,1*2)
        return [utils.decode_ieee(f) for f in utils.word_list_to_long(valor)][0]
    if tipo == "int":
        return modbus.read_holding_registers(endereco,1)[0]

例如,真实值为 367,但读取为 366。 有什么问题?

【问题讨论】:

我从您的问题中删除了 pymodbus 库标签,因为我意识到您的意思是 pyModbusTCP-Library 【参考方案1】:

听起来您的系统的 Endian 转换错误。如果您使用 pymodbus.payload 转换器,您可以更改字节序转换以获得正确的数据。

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

UNIT = 0x01
client = ModbusTcpClient(config_modbus['ip'],config_modbus['port'])
client.connect()
result = client.read_holding_registers(entry['address'],entry['count'],unit=UNIT)
decoder = BinaryPayloadDecoder.fromRegisters(result.registers, Endian.Big, wordorder=Endian.Big)
value = decoder.decode_32bit_float()

【讨论】:

库为:pypi.org/project/pyModbusTCP,与pymodbus库不同。 好吧,我没有意识到,因为你用空格写了 pymodbus,pymodbus 库是一个 modbus over tcp 库,我的例子显示了。也许无论如何您都可以将它用于您的解决方案,我已经使用了很多并且效果很好。无论哪种方式,问题仍然可能是您的浮点数的 Endian 转换,因此如果您不想使用我展示的 binarypayloaddecoder,则必须找到一种对其进行解码的方法。

以上是关于如何使用 pymodbus TCP 库获取浮点值?的主要内容,如果未能解决你的问题,请参考以下文章

Pymodbus TCP `read_holding_registers` 返回陈旧/旧数据

如何在 PYMODBUS(Modicon?)中塑造一个 CALL

Pymodbus 读取和解码寄存器值

如何停止pymodbus异步ModbusTcpServer?

如何让 pymodbus 与 PLC 正确通信?

Pymodbus:如何读取该输入寄存器的各个位?