Ubuntu服务器用pyads连接TwinCAT 3 Beckhoff PLC被拒绝求助
针对你遇到的Windows能正常连接、Ubuntu服务器连接失败,且添加路由被拒、报错connection closed by remote的问题,给你几个针对性的排查和解决方向:
检查AMS NetID的有效性
Linux下pyads的本地AMS NetID需要和系统网卡绑定正确。你代码里的SENDER_AMS = '192.168.1.180.1.1',最后两段的设备编号(.1.1)可能和Ubuntu系统实际的ADS设备编号不匹配。先执行pyads.get_local_address()获取系统当前有效的AMS NetID,用这个值替换SENDER_AMS再试。另外,执行pyads.open_port()时可以指定自定义端口,比如pyads.open_port(48899),避免端口被占用。确认PLC路由的权限与配置
手动在PLC路由管理器添加路由时,右键选"Routes"->"Properties",检查是否允许远程添加路由,以及你的Administrator账号是否有路由配置权限。添加时要填对:远程AMS NetID(Ubuntu的)、远程IP、PLC自身的AMS NetID,还要勾选"Enable route"。如果PLC已经存在对应路由,重复添加会被拒绝,这时候直接跳过添加步骤,用已有路由连接即可。修正pyads添加路由的参数
代码里的HOSTNAME用的是Ubuntu主机名Grid-stabilizer,换成Ubuntu的静态IP192.168.1.180试试,避免主机名解析失败。另外,pyads.add_route_to_plc的第二个参数是远程主机名/IP,直接填IP更可靠。安装底层依赖并检查系统配置
确保Ubuntu装了pyads的底层依赖:sudo apt install libads-dev。同时检查/etc/hosts文件,添加PLC的IP和主机名映射(比如192.168.1.100 plc-tc3),避免解析问题。优化连接代码逻辑
先尝试用已有的路由直接连接,失败再尝试添加路由,同时加异常捕获定位问题:import pyads SENDER_AMS = '192.168.1.180.1.1' PLC_AMS = '192.168.1.100.1.1' PLC_IP = '192.168.1.100' PLC_USERNAME = 'Administrator' PLC_PASSWORD = '1' ROUTE_NAME = 'GID_TEST_ROUTE' try: pyads.open_port() pyads.set_local_address(SENDER_AMS) # 先尝试直接用已有路由连接 plc = pyads.Connection(PLC_AMS, pyads.PORT_TC3PLC1) plc.open() state = plc.read_state() print(f"PLC连接成功,状态: {state}") plc.close() except Exception as e: print(f"直接连接失败,尝试添加路由: {str(e)}") try: # 替换HOSTNAME为IP,避免解析问题 pyads.add_route_to_plc(SENDER_AMS, PLC_IP, PLC_IP, PLC_USERNAME, PLC_PASSWORD, route_name=ROUTE_NAME) plc = pyads.Connection(PLC_AMS, pyads.PORT_TC3PLC1) plc.open() state = plc.read_state() print(f"添加路由后连接成功,状态: {state}") plc.close() except Exception as add_err: print(f"添加路由并连接失败: {str(add_err)}") finally: pyads.close_port()检查PLC的ADS端口与远程权限
进入TwinCAT工程的"PLC Settings"->"ADS",确认"Allow remote clients"已勾选,默认ADS端口48898是否正常开启。同时确保PLC和Ubuntu在同一子网,没有VLAN或其他网络隔离限制。
内容的提问来源于stack exchange,提问作者R Coppens

