You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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通信冲突,需按以下步骤关闭:

  1. 在Windows电脑上安装TwinCAT3并连接到目标PLC(需在同一网络)。
  2. 打开System Manager,找到Scope Server组件,右键选择Deactivate,然后将配置下载到PLC。
  3. 重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:58:17