我正在构建一个 Python 脚本来与 EtherNet/IP 设备(Graco PD2K 喷涂系统)进行通信。供应商提供的唯一文档是如何将 Allen Bradley PLC 配置为客户端以与设备通信。
使用以下代码,我可以读取 Assembly Instance 100 处的属性数组:
from cpppo.server.enip.get_attribute import proxy_simple
via = proxy_simple('192.168.10.5')
with via:
data, = via.read( [('@4/100/3','DINT')] )
...这导致接收回预期的数组:
[0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(39 x 32 位整数)
尝试写入程序集实例 150 的属性时,我True
从控制器收到回信,但控制器没有更新参数。它需要 25 x 32 位整数数组:
with via:
result, = via.read([('@4/150/3=(DINT)4, 1, 0, 0, 1, 0, 0, 0, 1, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0','@4/150/3')],1)
上面的输出是:
@4/150/3=(DINT)4, 1, 0, 0, 1, 0, 0, 0, 1, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 == True
如果我向数组中添加一个整数(或减去,或尝试设置 @4/150/3 以外的值,我会返回None
,所以很明显我已经接近格式并且命令正在通过。
我已经多次联系供应商,他们坚持认为这是 Python 的问题(或者,更具体地说,他们不支持 Python 并建议与 PLC 集成)。
我想知道程序集实例 1 的“配置”参数是否是问题(见上图)。我尝试了以下代码的多个版本来尝试编写该参数。由于不完全了解 EtherNet/IP 协议,我什至不确定该特定实例的作用——但是,它是 Allen-Bradley 配置中的一个参数表明它在这种情况下很重要。
代码尝试:
result, = via.read([('@4/1/3=(USINT)0','@4/1/3')],1)
我曾尝试使用 Molex EnIP 实用程序以及 SourceForge 上的类似工具将 Python 排除在外,但结果相似。我也尝试过 PyComm3 模块,但我什至无法让它返回 Id 信息。我也尝试过使用-vvv
CPPO 命令行工具:
python -m cpppo.server.enip.get_attribute -a 192.168.10.5 '@4/150/3=(DINT)4, 1, 0, 0, 1, 0, 0, 0, 1, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0' -vv -S
结果(以及我认为不相关的更多输出):
11-09 12:11:18.119 MainThread enip.cli DETAIL issue Sending 1 (Context b'0')
11-09 12:11:18.120 MainThread enip.cli DETAIL pipeline Issuing 0/ 1; curr: 0 - last: -1 == 1 depth vs. max 0
11-09 12:11:18.124 MainThread enip.cli DETAIL __next__ Client CIP Rcvd: {
"send_data.interface": 0,
"send_data.timeout": 8,
"send_data.CPF.count": 2,
"send_data.CPF.item[0].type_id": 0,
"send_data.CPF.item[0].length": 0,
"send_data.CPF.item[1].type_id": 178,
"send_data.CPF.item[1].length": 4,
"send_data.CPF.item[1].unconnected_send.request.input": "array('B', [144, 0, 0, 0])",
"send_data.CPF.item[1].unconnected_send.request.service": 144,
"send_data.CPF.item[1].unconnected_send.request.status": 0,
"send_data.CPF.item[1].unconnected_send.request.status_ext.size": 0,
"send_data.CPF.item[1].unconnected_send.request.set_attribute_single": true
}
11-09 12:11:18.124 MainThread enip.cli DETAIL collect Receive 1 (Context b'0')
11-09 12:11:18.124 MainThread enip.cli DETAIL pipeline Completed 1/ 1; curr: 0 - last: 0 == 0 depth vs. max 0
Mon Nov 9 12:11:18 2020: 0: Single S_A_S @0x0004/150/3 == True
11-09 12:11:18.124 MainThread enip.cli DETAIL pipeline Pipelined 1/ 1; curr: 0 - last: 0 == 0 depth vs. max 0
11-09 12:11:18.125 MainThread enip.get NORMAL main 1 requests in 0.006s at pipeline depth 0; 153.919 TPS
同样,请求的结果是True
,但控制器不更新任何参数。
我不确定接下来要尝试什么...