【问题标题】:Converting Modbus response using pymodbus使用 pymodbus 转换 Modbus 响应
【发布时间】:2019-10-27 14:46:00
【问题描述】:

我想用smart meter 与允许 Modbus TCP 通信的 PC 通信,PC 将成为主机,我只需要读取保持寄存器并以浮点格式显示它们。我正在使用 python 和 pymodbus 2.2.0 我的代码是:

from pymodbus.client.sync import ModbusTcpClient

client = ModbusTcpClient('169.254.00.10')

result = client.read_holding_registers(1845,1,unit=0x01)
print('**************************************************************')
print(result)
client.close()

我得到的是:

DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x0 0x1 0x0 0x0 0x0 0x6 0x1 0x3 0x7 0x35 0x0 0x1
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x0 0x1 0x0 0x0 0x0 0x5 0x1 0x3 0x2 0x6 0xc
DEBUG:pymodbus.framer.socket_framer:Processing: 0x0 0x1 0x0 0x0 0x0 0x5 0x1 0x3 0x2 0x6 0xc
DEBUG:pymodbus.factory:Factory Response[ReadHoldingRegistersResponse: 3]
DEBUG:pymodbus.transaction:Adding transaction 1
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
**************************************************************
ReadRegisterResponse (1)

你知道如何使用 pymodbus 2.2.0 解决它吗?

【问题讨论】:

    标签: python cpu-registers modbus pymodbus pymodbustcp


    【解决方案1】:

    你必须从你的回复中提取寄存器,试试这个:

    print(result.registers)
    

    或者,如果你想要它们一个一个:

    for reg in result:
        print(reg)
    

    如果您不确定您的服务器是否正在运行、它的 IP 或端口,最好使用独立工具进行测试,如果您在 Windows 上,则可以使用QModMaster 来确保您的设置和映射。

    请注意,仅使用一个 Modbus 寄存器无法获得浮点数,因为 Modbus 寄存器是 16 位整数。如果你想得到一个浮点数,你需要读取两个寄存器。

    另一方面,如果您只想验证您的客户端代码,您可以在您的计算机上同时运行this example 和您的客户端代码。当然,您必须将脚本上的 IP 地址更改为localhost,将端口更改为5020,并将您正在读取的寄存器号更改为较小的数字(或增加服务器数据存储的大小)。如果您使用的是 Windows,则可能需要在防火墙上禁用或创建规则。

    【讨论】:

    • 我尝试了 print(result.registers) 但我收到此错误:AttributeError: 'ExceptionResponse' object has no attribute 'registers'。只有我需要转换结果,只有一个寄存器可以浮动并显示它。
    • 您确定您的服务器已启动并正在运行吗?你得到的错误意味着你没有得到任何数据。你的服务器到底是什么?您的实例没有说明端口号,它是否在端口 502 上运行?
    • 我刚刚注意到您在问题上发布的日志显示您实际上正在获取寄存器,因此print(result.registers) 应该可以工作。您是否收到与错误相同的日志?根据手册上的链接端口应该是默认的 502,所以你应该没问题...
    • 感谢您的帮助,这只是注册号错误,print(result.registers) 可以使用我的代码。
    • 太好了,享受与您的设备互动的乐趣,您可以在其中玩很多寄存器
    猜你喜欢
    • 2015-03-08
    • 2021-02-16
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2013-09-18
    • 2022-11-25
    相关资源
    最近更新 更多