Linux环境pyads连接Beckhoff CX9020 PLC路由参数配置问题
单Windows或Linux系统均可完成全部参数查询与路由配置,无需双系统。
参数一致性规则
你当前代码存在多组参数重复定义、取值冲突的问题,以下参数必须保持取值统一:
- 上位机(运行pyads的Linux主机)标识组:
pyads.set_local_address()入参、SENDER_AMS、CLIENT_NETID三者完全一致,为上位机自身的AMS NetID - 上位机IP参数:
CLIENT_IP必须为Linux主机连接PLC所用物理网卡的实际IP,不得使用占位符 - PLC标识组:
pyads.add_route()第一个入参、PLC_AMS_ID二者完全一致,为CX9020的AMS NetID - PLC IP参数:
pyads.add_route()第二个入参、PLC_IP、HOSTNAME、TARGET_IP四者完全一致,为CX9020的实际IP - PLC登录凭据组:
PLC_USERNAME/PLC_PASSWORD、TARGET_USERNAME/TARGET_PASSWORD取值完全一致,为CX9020的系统登录账号密码 - 网络连通性要求:
CLIENT_IP与PLC IP必须处于同一二层网段,无VLAN、防火墙拦截,你当前代码中192.168.0.x与192.168.1.x跨网段的配置会直接导致通信失败。
参数获取方法
PLC侧参数获取(单Linux/单Windows均可操作)
Linux环境操作步骤
- 查找PLC IP
安装nmap后执行端口扫描,Beckhoff PLC默认开放48898端口用于ADS通信:
扫描结果中开放48898端口的设备IP即为PLC IP。sudo apt install nmap # 将192.168.0.0/24替换为你Linux网卡所在网段 sudo nmap -p 48898 --open 192.168.0.0/24 - 查询PLC AMS NetID
拿到PLC IP后,直接调用pyads自带工具查询,无需登录PLC系统:python -m pyads.get_ams_net_id <替换为上一步拿到的PLC IP> - 登录凭据
CX9020出厂默认账号为Administrator,默认密码为1,未手动修改过密码直接使用该组凭据即可,你代码中填写的x为错误值。
Windows环境操作步骤
无需安装完整TwinCAT环境,可通过端口扫描工具扫描48898端口找到PLC IP,安装Beckhoff ADS Router Console后可自动扫描同网段ADS设备,直接显示设备IP与AMS NetID;若已安装TwinCAT,可直接通过设备扫描功能获取所有参数。
上位机(Linux)侧参数获取
- 本地IP(
CLIENT_IP)
终端执行ip a命令,找到连接PLC的物理网卡对应的inet字段地址即可,例如网卡eth0的inet为192.168.0.10,该值即为CLIENT_IP。 - 本地AMS NetID(
SENDER_AMS/CLIENT_NETID/set_local_address入参)
AMS NetID为ADS协议内的设备标识符,无需提前向设备注册,按通用规则取本地IP.1.1即可,例如本地IP为192.168.0.10时,本地NetID为192.168.0.10.1.1,只要不与同网段其他ADS设备NetID冲突即可正常使用,无需额外查询。
修正后的最小可运行代码示例
import pyads # 上位机本地配置 CLIENT_IP = "192.168.0.10" # 替换为你Linux主机的实际网卡IP CLIENT_NETID = f"{CLIENT_IP}.1.1" pyads.set_local_address(CLIENT_NETID) SENDER_AMS = CLIENT_NETID ROUTE_NAME = "RouteToMyPC" # PLC侧配置 PLC_IP = "192.168.0.8" # 替换为扫描得到的PLC实际IP PLC_AMS_ID = "5.41.49.218.1.1" # 替换为查询得到的PLC实际NetID PLC_USERNAME = "Administrator" PLC_PASSWORD = "1" HOSTNAME = PLC_IP TARGET_IP = PLC_IP TARGET_USERNAME = PLC_USERNAME TARGET_PASSWORD = PLC_PASSWORD # 添加路由 pyads.add_route( ams_net_id=PLC_AMS_ID, ip_address=PLC_IP, username=PLC_USERNAME, password=PLC_PASSWORD, route_name=ROUTE_NAME ) # 连接测试 with pyads.Connection(PLC_AMS_ID, pyads.PORT_SPS1, PLC_IP) as plc: ads_state, device_state = plc.read_state() print(f"连接成功,ADS状态:{ads_state}, 设备状态:{device_state}")
注意事项
- 通信前关闭Linux防火墙,或放开UDP/TCP 48898、851端口的出入站规则,避免ADS广播包被拦截
- 部分低固件版本的CX9020添加路由后需要重启设备才能生效
- 禁止使用
1.2.3.4.1.1这类无意义占位符作为AMS NetID,不符合规范的NetID会被PLC直接拒绝路由
内容的提问来源于stack exchange,提问作者asd asd
相关产品推荐
相关产品推荐

