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

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,导致路由无法正确映射。

分步解决步骤

  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)
  2. 检查TwinCAT运行状态

    • 确保PLC上的TwinCAT处于RUN模式,而非配置模式(Config Mode),否则ADS请求会被拒绝
  3. 防火墙配置

    • Win10系统:允许ADS端口(默认30000)的入站/出站连接,或临时关闭防火墙测试
    • Linux端:执行sudo ufw allow 30000/tcp开放端口,或关闭防火墙测试
  4. 修正路由创建与连接代码
    使用统一的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()
  1. 验证路由配置
    在PLC的TwinCAT路由管理器中,确认路由的Net ID与Linux PC的IP对应正确,且权限设置为允许ADS通信

内容的提问来源于stack exchange,提问作者AndyEverything

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:37:33