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

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环境操作步骤

  1. 查找PLC IP
    安装nmap后执行端口扫描,Beckhoff PLC默认开放48898端口用于ADS通信:
    sudo apt install nmap
    # 将192.168.0.0/24替换为你Linux网卡所在网段
    sudo nmap -p 48898 --open 192.168.0.0/24
    
    扫描结果中开放48898端口的设备IP即为PLC IP。
  2. 查询PLC AMS NetID
    拿到PLC IP后,直接调用pyads自带工具查询,无需登录PLC系统:
    python -m pyads.get_ams_net_id <替换为上一步拿到的PLC IP>
    
  3. 登录凭据
    CX9020出厂默认账号为Administrator,默认密码为1,未手动修改过密码直接使用该组凭据即可,你代码中填写的x为错误值。

Windows环境操作步骤

无需安装完整TwinCAT环境,可通过端口扫描工具扫描48898端口找到PLC IP,安装Beckhoff ADS Router Console后可自动扫描同网段ADS设备,直接显示设备IP与AMS NetID;若已安装TwinCAT,可直接通过设备扫描功能获取所有参数。

上位机(Linux)侧参数获取

  1. 本地IP(CLIENT_IP)
    终端执行ip a命令,找到连接PLC的物理网卡对应的inet字段地址即可,例如网卡eth0的inet为192.168.0.10,该值即为CLIENT_IP。
  2. 本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:00:54