【问题标题】:How do I interpert the output of registers using pymodbus?如何使用 pymodbus 干扰寄存器的输出?
【发布时间】:2020-03-24 19:27:57
【问题描述】:

我正在使用 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 范围内(四舍五入)。感谢您的帮助!

【问题讨论】:

    标签: python endianness modbus pymodbus


    【解决方案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()))
    

    try it - 结果为 0.18659807741641998,这似乎符合您的预期)。

    请注意,this 是一个有用的工具,可用于从 modbus 查询中获取原始(十六进制)结果并以多种方式对其进行解码。

    【讨论】:

    • 完美!这太有帮助了!也谢谢你的链接!!
    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2019-07-30
    • 2021-12-21
    • 2021-06-22
    • 2022-07-18
    相关资源
    最近更新 更多