Windows11下pyads连接CX9020报错:RuntimeError(无法打开AMS路由器端口)
尝试使用pyads连接CX9020控制器时,始终报错RuntimeError: Failed to open port on AMS router,报错堆栈如下:
Traceback (most recent call last): File "E:\3. Projekty\Slawek PyADS\PyAds.py", line 12, in <module> plc.open() File "C:\Users\User\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\pyads\connection.py", line 195, in open self._port = adsPortOpenEx() ^^^^^^^^^^^^^^^ File "C:\Users\User\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\pyads\pyads_ex.py", line 434, in adsPortOpenEx raise RuntimeError("Failed to open port on AMS router.") RuntimeError: Failed to open port on AMS router.
已确认TwinCAT能正常连接该控制器,路由配置无误,但Python端无法连接。使用的代码如下:
import sys import pyads PLC_AMS_ID= '5.55.250.81.1.1' SENDER_AMS = '192.168.0.5.1.1' PLC_IP = '192.168.0.8' HOST_IP = '192.168.0.5' # or IP PLC_USERNAME = 'Administrator' PLC_PASSWORD = '1' ROUTE_NAME = 'CX-37FA51' plc = pyads.Connection(PLC_AMS_ID, 801,HOST_IP) with plc: print(f"Connected?: {plc.is_open}") #debugging statement, optional print(f"Local Address? : {plc.get_local_address()}") #debugging statement, optional
执行命令:python PyAds.py
以下是针对该报错的常见排查和解决步骤:
检查本地ADS Runtime服务状态:pyads依赖TwinCAT ADS Runtime提供的AMS路由功能,确保
TwinCAT ADS Router服务正在运行(可通过系统服务管理器查看)。如果未安装ADS Runtime,需先安装对应版本的TwinCAT组件。以管理员权限运行脚本:ADS端口的操作需要管理员权限,右键命令提示符/PowerShell选择“以管理员身份运行”,再执行
python PyAds.py。验证本地AMS NetID正确性:代码中指定的
HOST_IP对应的AMS NetID可能与本地实际NetID不符。打开TwinCAT路由管理器,查看本地设备的NetID,确保代码中传入Connection的第三个参数(local_ams_net_id)是正确的本地NetID(格式如192.168.0.5.1.1)。如果不确定,可省略该参数,让pyads自动获取本地NetID:plc = pyads.Connection(PLC_AMS_ID, 801)手动添加AMS路由:即使TwinCAT已配置路由,pyads可能无法识别,可通过命令行手动添加路由:
adsroute add -n 5.55.250.81.1.1 -h 192.168.0.8添加完成后,可通过
adsroute list确认路由已存在。检查端口占用:确保本地ADS端口(默认3580)未被其他程序占用。可通过
netstat -ano | findstr :3580查看端口占用情况,如有冲突,关闭占用程序或修改ADS端口配置。尝试IP直接连接的简化方式:pyads支持直接通过IP地址创建连接(无需手动指定AMS ID),替换原连接代码:
plc = pyads.Connection(PLC_IP, 801)
内容的提问来源于stack exchange,提问作者Dawid Firlej

