首页 > 解决方案 > 以太网/IP 设备:能够使用 CPPO 读取属性,但不能写入

问题描述

我正在构建一个 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 信息。我也尝试过使用-vvvCPPO 命令行工具:

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,但控制器不更新任何参数。

我不确定接下来要尝试什么...

标签: pythonprotocolsethernetindustrial

解决方案


推荐阅读