如何让 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 正确通信?的主要内容,如果未能解决你的问题,请参考以下文章
兴达易控MPI转光纤模块应用-300PLC与远端3公里外地上位机MPI通信