如何让 pymodbus 与 PLC 正确通信?

Posted

技术标签:

【中文标题】如何让 pymodbus 与 PLC 正确通信?【英文标题】:How to get pymodbus to correctly communicate with PLC? 【发布时间】:2021-03-06 09:27:58 【问题描述】:

在我问之前,我只想提一下,我已经花了几天时间研究这个问题,似乎无法找到解决这个基本问题的方法。我已经阅读了文档并花时间在这里。否则我不会问。

我继承了一个庞大的单体 python 程序,它成功地使用 pymodbus + read_holding_registers 读取保持寄存器。我以前花时间编辑 python,但从未真正学会它。为了尝试在 python 方面理解这一点,我尝试从头开始编写自己的基本程序。我从大处着手,最终将代码分解为尽可能简单。

from pymodbus.client.sync import ModbusTcpClient as ModbusClient

client = ModbusClient('192.168.1.98', port=502)
client.connect()

rr = client.read_holding_registers(10904, 2)

print rr

client.close()

我知道这是我想要的寄存器。它是霍纳 PLC 上的一个保持寄存器。它在 python 程序和 Horner CSCAPE 中都有详细记录。但是每当我运行程序时,它只会打印我在元组的第二项中输入的任何值。所以在这里,它只会打印2。如果我提供(10905, 1) 的元组,它只会打印1。寄存器位的真实值应该是0

我会发布大型程序,但不幸的是它是私人的。这是python2.7。我知道这很糟糕,但我只是想在担心将其移植到 3.9 之前了解该程序。

【问题讨论】:

你试过rr = client.read_holding_registers(10904, 2).registers 吗? 成功了!太感谢了!我发誓我无法从我能在任何地方找到的文档中拼凑出这个!我该如何感谢你的天赋? 不客气!然后,为了完整起见,我会将评论转为答案 【参考方案1】:

你必须像这样用.registers 调用它

rr = client.read_holding_registers(10904, 2).registers

另外,如果您检查the documentation,作者声称该代码与 Python 2.7 和 Python 3.x 兼容,因此您可以对其进行移植。

【讨论】:

以上是关于如何让 pymodbus 与 PLC 正确通信?的主要内容,如果未能解决你的问题,请参考以下文章

三菱plc智能模块上载不了

欧姆龙plc如何查看有没有写通讯程序

兴达易控MPI转光纤模块应用-300PLC与远端3公里外地上位机MPI通信

三菱FX系列PLC与上位机易控INSPEC软件ModbusTCP 通信

虚拟机之间互联通信

PLC通信网络