我正在尝试使用Raspberry Pi 3 Model B来读取Allen Bradly PLC的值。我正在使用Pymodbus Modbus TCP协议在它们之间进行通信。
当我运行测试客户端时,我收到以下错误:
pi@raspberrypi:/var $ python test1.py
Got here 1
Traceback (most recent call last):
File "test1.py", line 12, in <module>
request = client.read_holding_registers(0,1)
File "build/bdist.linux-armv7l/egg/pymodbus/client/common.py", line 109, in read_holding_registers
File "build/bdist.linux-armv7l/egg/pymodbus/client/sync.py", line 82, in execute
pymodbus.exceptions.ConnectionException: Modbus Error: [Connection] Failed to connect[10.0.0.237:502]
以下是测试客户端的代码:
from pymodbus.client.sync import ModbusTcpClient
#modbus connection
client = ModbusTcpClient(host='10.0.0.237')
connection = client.connect()
#test print
print "Got here 1"
#read register
request = client.read_holding_registers(0,1)
print request
client.close()
我可以ping通PLC的以太网卡(10.0.0.237)的IP地址。 (PLC打开并显示在RSLinx和RSLogix5000中。)但是当我尝试使用以下命令检查端口502(Modbus使用)时:
telnet 10.0.0.237 502
我收到错误:
Trying 10.0.0.237...
telnet: Unable to connect to remote host: Connection refused
我所做的研究告诉我要查看该端口是否已打开,但是对于PC,我不知道如何检查/配置PLC上的端口。
此外,我想知道问题是我是否正在尝试使用Modbus在Raspbery Pi和PLC之间进行操作。我找到了实现接口的prosoft网关。但我找不到任何关于这些是否只是另一种选择的信息,或者是否需要它们。
我是PLC和网络的新手,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
我自己没有使用艾伦布拉德利,但我确实使用了大量其他PLC,但它们的工作方式大致相同。
您不像在路由器中那样打开端口,而是激活PLC中的modbus连接。通常情况下,如果Allen Bradley使用他们自己的专有总线系统(例如Saia S-Bus),你有时需要一个特定的功能块来启用modbus。
例如,快速谷歌搜索显示,在micrologix 1400中有一个复选框,可以在某些频道设置下启用modbus tcp。
检查PLC是否有设置启用modbus主站/客户端(主站=串行或RTU,客户端= TCP但有时制造商不区分它们)。
要测试Raspberry Pi,您可以下载一个modbus服务器模拟器并进行轮询。
要使用Pi以外的其他方式测试PLC,您可以下载modbus客户端/主站。我个人使用免费的QmodMaster,可以很好地用于测试目的(搜索谷歌)。
此外,请确保使用正确的功能代码进行轮询。这可能会令人困惑,因为保持寄存器(寻址4xxxx)使用功能代码03.输入寄存器(寻址3xxxx)使用功能代码04。
modbus网关用于启用串行modbus(RTU或ASCII)通过TCP进行通信。
如果两个设备都有modbus tcp,则不需要网关。例如,如果您的设备只有有线modbus(RS232 / 485/422),则可以将其连接到网关,将网关连接到TCP。