PyADS连接Beckhoff CX5230与Linux PC故障排查求助
问题:Linux PC通过PyADS连接Beckhoff CX5230(Win10)失败
尝试通过PyADS将Beckhoff CX5230(Win10系统)与Linux PC建立连接,现有公开方案均未解决问题,以下是已执行操作与错误信息:
1. 成功创建PLC路由
执行以下代码在PLC上创建路由,操作成功,连接显示器确认路由已生成,PLC与PC可互相ping通:
import pyads SENDER_AMS = '5.97.120.143.1.1' PLC_IP = '192.168.0.1' PLC_USERNAME = 'Administrator' PLC_PASSWORD = '1' ROUTE_NAME = 'RouteToPC' HOSTNAME = '192.168.0.1' pyads.open_port() pyads.set_local_address(SENDER_AMS) pyads.add_route_to_plc(SENDER_AMS, HOSTNAME, PLC_IP, PLC_USERNAME, PLC_PASSWORD, route_name=ROUTE_NAME) pyads.close_port()
2. 连接PLC时出现超时错误
执行连接代码后出现超时:
import pyads TARGET_AMS_ID = '5.97.120.143.1.1' PLC_IP = '192.168.0.1' plc = pyads.Connection(TARGET_AMS_ID, pyads.PORT_TC3PLC1, PLC_IP) plc.open() print(f"Connected?: {plc.is_open}") print(f"Local Address? : {plc.get_local_address()}") print(plc.read_state())
错误输出:
2024-06-12T17:28:09+0000 Info: Connected to 192.168.0.1 Connected?: True Local Address? : <AmsAddress 192.168.0.253.1.1:30000> Traceback (most recent call last): File "pyads_test.py", line 24, in <module> print(plc.read_state()) File "/home/builder/.local/lib/python3.7/site-packages/pyads/connection.py", line 237, in read_state return adsSyncReadStateReqEx(self._port, self._adr) File "/home/builder/.local/lib/python3.7/site-packages/pyads/pyads_ex.py", line 510, in adsSyncReadStateReqEx raise ADSError(error_code) pyads.pyads_ex.ADSError: ADSError: timeout elapsed (1861). 2024-06-12T17:28:14+0000 Info: connection closed by remote
3. 手动创建路由后仍报错
参考手动创建路由的方法,执行后仍提示"connection closed by remote":
pyads.open_port() CLIENT_AMS_NET_ID = "192.168.0.253.1.1" pyads.set_local_address(CLIENT_AMS_NET_ID) pyads.close_port() TARGET_AMS_ID = "5.97.120.143.1.1" TARGET_PC_ID = "192.168.0.1" plc = pyads.Connection(TARGET_AMS_ID, pyads.PORT_TC3PLC1, TARGET_PC_ID) plc.open() plc.write_by_name("GVL.P1", True) exit()
运行结果:
builder@user:~$ python3 pyads_test.py 2024-06-18T08:49:10+0000 Info: Connected to 192.168.0.1 2024-06-18T08:49:10+0000 Info: connection closed by remote
可行解决方案
核心问题定位
从错误信息看,本地AMS ID不匹配是关键:创建路由时设置的SENDER_AMS = '5.97.120.143.1.1',但实际连接时本地地址显示为192.168.0.253.1.1,导致路由无法正确映射。
分步解决步骤
确认并统一AMS Net ID
- 在Linux PC上执行
hostname -I获取实际IP,设置对应的AMS ID格式为[IP].1.1(比如你的实际IP是192.168.0.253,则AMS ID为192.168.0.253.1.1) - 在Beckhoff PLC的TwinCAT中查看PLC的AMS Net ID(通常为
[PLC_IP].1.1,比如192.168.0.1.1.1)
- 在Linux PC上执行
检查TwinCAT运行状态
- 确保PLC上的TwinCAT处于RUN模式,而非配置模式(Config Mode),否则ADS请求会被拒绝
防火墙配置
- Win10系统:允许ADS端口(默认30000)的入站/出站连接,或临时关闭防火墙测试
- Linux端:执行
sudo ufw allow 30000/tcp开放端口,或关闭防火墙测试
修正路由创建与连接代码
使用统一的AMS ID重新创建路由并连接:
修正后的路由创建代码
import pyads # Linux PC的实际AMS Net ID LOCAL_AMS = '192.168.0.253.1.1' PLC_IP = '192.168.0.1' PLC_USERNAME = 'Administrator' PLC_PASSWORD = '1' ROUTE_NAME = 'RouteToLinuxPC' pyads.open_port() pyads.set_local_address(LOCAL_AMS) # 添加路由:参数依次为本地AMS、PLC的IP/主机名、PLC的IP、用户名、密码 pyads.add_route_to_plc(LOCAL_AMS, PLC_IP, PLC_IP, PLC_USERNAME, PLC_PASSWORD, route_name=ROUTE_NAME) pyads.close_port()
修正后的连接测试代码
import pyads # PLC的实际AMS Net ID PLC_AMS_ID = '192.168.0.1.1.1' PLC_IP = '192.168.0.1' # Linux本地AMS ID,与路由创建时一致 LOCAL_AMS = '192.168.0.253.1.1' pyads.open_port() pyads.set_local_address(LOCAL_AMS) plc = pyads.Connection(PLC_AMS_ID, pyads.PORT_TC3PLC1, PLC_IP) plc.open() try: print(f"连接状态: {plc.is_open}") print(f"本地地址: {plc.get_local_address()}") # 读取PLC状态 state = plc.read_state() print(f"PLC运行状态: {state}") # 读写变量测试 plc.write_by_name("GVL.P1", True) value = plc.read_by_name("GVL.P1") print(f"变量GVL.P1的值: {value}") finally: plc.close() pyads.close_port()
- 验证路由配置
在PLC的TwinCAT路由管理器中,确认路由的Net ID与Linux PC的IP对应正确,且权限设置为允许ADS通信
内容的提问来源于stack exchange,提问作者AndyEverything
相关产品推荐
相关产品推荐

