如何解决以太网/ IP设备:能够使用CPPPO读取属性,但不能写入
我正在构建一个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,-1,10,0]
(39 x 32位整数)
当尝试在Assembly实例150上写入属性时,我从控制器收到了True
的回复,但是控制器没有更新参数。期望使用25 x 32位整数数组:
with via:
result,= via.read([('@4/150/3=(DINT)4,1,0','@4/150/3')],1)
上面的输出是:
@4/150/3=(DINT)4,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
与CPPPO命令行实用程序一起使用:
python -m cpppo.server.enip.get_attribute -a 192.168.10.5 '@4/150/3=(DINT)4,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])","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
,但是控制器不会更新任何参数。
我不确定下一步该怎么做...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。