Ubuntu环境下pyads连接PLC报错Port 0x353超出范围求助
在Ubuntu 20.04 LTS服务器上使用pyads连接PLC时遇到端口范围警告及ADS超时错误(1861)
问题详情
在Ubuntu 20.04 LTS服务器上通过pyads连接PLC读取变量时,先出现Port 0x353 is out of range警告,最终触发ADS超时错误(错误码1861)。
相关代码
import pyads CLIENT_NETID = <net_id> CLIENT_IP = <client_ip> TARGET_IP = <target_ip> TARGET_USERNAME = <username> TARGET_PASSWORD = <password> ROUTE_NAME = "route-to-my-plc" pyads.add_route_to_plc( CLIENT_NETID, CLIENT_IP, TARGET_IP, TARGET_USERNAME, TARGET_PASSWORD, route_name=ROUTE_NAME ) plc = pyads.Connection(<net_id>, 851, <target_ip>) plc.open() i = plc.read_by_name("TransportOp_GVL.liftCurrentFloor")
错误输出
>>> i = plc.read_by_name("TransportOp_GVL.liftCurrentFloor") 2024-03-15T04:07:27+0000 Warning: Port 0x353 is out of range 2024-03-15T04:07:27+0000 Warning: No response pending Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/ubuntu/.local/lib/python3.8/site-packages/pyads/connection.py", line 537, in read_by_name plc_datatype = self._query_plc_datatype_from_name(data_name, File "/home/ubuntu/.local/lib/python3.8/site-packages/pyads/connection.py", line 181, in _query_plc_datatype_from_name info = adsGetSymbolInfo(self._port, self._adr, data_name) File "/home/ubuntu/.local/lib/python3.8/site-packages/pyads/pyads_ex.py", line 912, in adsGetSymbolInfo symbol_info = adsSyncReadWriteReqEx2( File "/home/ubuntu/.local/lib/python3.8/site-packages/pyads/pyads_ex.py", line 774, in adsSyncReadWriteReqEx2 raise ADSError(err_code) pyads.pyads_ex.ADSError: ADSError: timeout elapsed (1861).
已尝试的排查步骤
找到过相关议题提到TwinCAT3 Scope通过TCP发送数据包,但不清楚具体排查方法,也不确定是否需要连接PLC并关闭Scope服务器,本人是PLC编程新手,对此不太了解。
解决方案
1. 确认ADS端口与路由配置
0x353是十进制的851,属于TwinCAT3 PLC的默认ADS端口,警告并非端口本身无效,而是路由或权限问题导致识别异常:
- 检查
CLIENT_NETID格式是否为x.x.x.x.x.x(例如192.168.1.100.1.1),可在Ubuntu服务器上运行adsGetLocalAddress获取本地NetID。 - 登录PLC的Web管理界面(通常为
http://<TARGET_IP>),进入ADS路由设置,确认你添加的route-to-my-plc路由已激活。
2. 关闭TwinCAT3 Scope服务器(若启用)
TwinCAT3 Scope会占用TCP端口导致ADS通信冲突,需按以下步骤关闭:
- 在Windows电脑上安装TwinCAT3并连接到目标PLC(需在同一网络)。
- 打开System Manager,找到
Scope Server组件,右键选择Deactivate,然后将配置下载到PLC。 - 重启PLC的ADS服务或直接重启PLC。
3. 直接指定变量数据类型,跳过自动查询
超时错误核心原因是read_by_name默认会查询变量数据类型,该过程依赖ADS符号服务,若服务未开启或权限不足则会超时。可直接指定类型绕过查询:
# 根据变量实际类型调整,比如pyads.PLCTYPE_INT、pyads.PLCTYPE_UINT、pyads.PLCTYPE_REAL等 i = plc.read_by_name("TransportOp_GVL.liftCurrentFloor", pyads.PLCTYPE_INT)
4. 检查网络与防火墙
- 在Ubuntu服务器执行
ping <TARGET_IP>确认网络连通。 - 用
telnet <TARGET_IP> 851或nc -zv <TARGET_IP> 851测试ADS端口是否可访问。 - 检查PLC侧防火墙是否允许来自Ubuntu服务器IP的ADS流量(跨网段需手动添加规则)。
5. 验证路由添加状态
在Ubuntu服务器运行pyads.list_routes(),确认添加的路由条目参数(NetID、IP)正确。若路由未成功添加,可手动在PLC的Web界面添加路由,替代pyads代码添加方式。
内容的提问来源于stack exchange,提问作者Selva Vignesh
相关产品推荐
相关产品推荐

