使用python pyads模块在PLCbeckhoff CX9020中读写变量

问题描述

我想使用python pyads模块实现一个通信网关,在lunix(Debian9)下的虚拟机(VM)和PLC(Beckhoff CX9020)之间使用ADS协议。 我按照下面的链接创建了路线 https://pyads.readthedocs.io/en/latest/quickstart.html 这是我的代码

import pyads

print ("=== set_local_address");
pyads.open_port ()
pyads.set_local_address ('1.2.3.4.1.1')
print (pyads.get_local_address ())
pyads.close_port ()

print ("=== add route");
pyads.open_port ()
pyads.add_route ('5.82.237.216.1.1','192.168.0.20')
pyads.close_port ()

print ("=== add route to plc");
SENDER_AMS = '1.2.3.4.1.1'
PLC_IP = '192.168.0.20'
PLC_USERNAME = 'Administrator'
PLC_PASSWORD = 'x'
ROUTE_NAME = 'RoutetoMyPC'
HOSTNAME = '192.168.0.15' # or IP
PLC_AMS_ID = '5.82.237.216.1.1'
pyads.add_route_to_plc (SENDER_AMS,HOSTNAME,PLC_IP,PLC_USERNAME,PLC_PASSWORD,route_name = ROUTE_NAME)

print ("=== init connection to plc");
plc = pyads.Connection (PLC_AMS_ID,851,PLC_IP)

print ("=== open connection")
plc.open ()
print ('Connected')
v1 = plc.read_by_name ("MAIN.v1",pyads.PLCTYPE_INT)
print (v1)

我可以访问PLC,但无法读写,仍然出现错误信息


Connecting... 
2021-01-21117:17:59+0100 Info: Connected to 192.168.0.20 
Connected 
Traceback (most recent call last): 
   File "rw_pyads.py",tine 34,in <module> 
      value = plc.read by_name('MAIN.vr,pyads.PLCTYPE INT) 
   File "/usr/local/lib/python3.8/site-packages/pyads/ads.py",line 761,in read_by_name 
      return adsSyncReadByNameEx( 
   File "/usr/local/lib/python3.8/site-packages/pyads/pyads_ex.py",line 977,in adsSyncReadByNameEx
      handle = adsGetHandle(port,address,data name) 
   File "/usr/local/lib/python3.8/site-packages/pyads/pyads_ex.py",line 770,in adsGetHandle
      handle = adsSyncReadWriteReqEx2(
   File "/usr/local/lib/python3.8/site-packages/pyads/pyads_ex.py",line 638,in adsSyncReadWriteReqEx2
      raise ADSError(err code)
pyads.pyads ex.ADSError: ADSError: timeout elapsed (1861). 
2021-01-21117:18:04+0100 Info: connection closed by remote 

有人遇到过这个问题吗? 有人可以解释一下确切的问题是什么吗? 我花了几天,但未能解决问题 谢谢!

解决方法

我遇到了同样的问题,有一个与 Twincat3 共享变量的 python 脚本,但是在 20 分钟后连接断开以关闭连接。

在错误发生后,通过重新启动批处理文件的连接来“解决”。所以现在每次出现错误时都会恢复连接。

祝你好运! 贡萨洛