1. 课程导入

在工业自动化系统中,控制器与上位机、MES、数据库、边缘计算节点之间的数据交互,是设备互联与智能制造的基础能力。Beckhoff TwinCAT 体系中的 ADS(Automation Device Specification) 正是承担这一职责的核心通信协议。它并不是一个简单的“读写变量”接口,而是一套覆盖设备寻址、符号访问、通知订阅、跨平台调用与诊断追踪的完整通信规范。本课程将围绕 ADS 的协议原理、TwinCAT 路由机制、变量读写、批量采集、事件通知、跨语言开发与故障排查展开,帮助学习者建立从“能连上”到“采得稳、读得准、查得快”的完整能力。

一、学习目标:从通信建立到数据采集闭环

本课程的学习目标可以归纳为四个层次。第一层是理解 ADS 的通信模型:明确 ADS Device、ADS Port、AMS NetId、AMS Router 之间的关系,知道一次读写请求如何从客户端到达 TwinCAT 运行时。第二层是掌握变量访问方法:能够通过变量名、句柄、索引组/偏移量等方式读取 PLC 变量,并理解符号信息与运行时映射的差异。第三层是构建数据采集链路:能够使用通知、轮询、批量读写等方式采集实时数据,并处理时间戳、周期、缓存与断线重连。第四层是具备排障与优化能力:能够根据错误码、路由状态、端口占用、防火墙与权限配置定位问题。

核心能力闭环:设备发现 → 路由建立 → 符号解析 → 数据读写 → 周期采集 → 异常恢复 → 性能优化。

二、核心概念:ADS、AMS、TwinCAT 与数据采集的关系

ADS 通信中常见的几个概念容易混淆,需要先建立清晰边界。ADS 是应用层协议,定义客户端如何请求服务端读写变量、订阅通知、调用方法。AMS(Automation Message Specification) 是更底层的消息规范,负责寻址、路由和传输,ADS 消息通常封装在 AMS 报文中。AMS NetId 是设备在网络中的逻辑地址,通常由 IP 与端口段组成;ADS Port 则用于区分同一设备上的不同服务,例如 PLC 运行时、NC、IO 等。TwinCAT 是 Beckhoff 的自动化软件平台,ADS 服务由 TwinCAT 运行时提供,因此上位机必须通过 AMS Router 才能访问目标控制器。

数据采集场景中,还需要区分轮询读取与通知订阅。轮询实现简单,但周期固定、网络负载可预测;通知由服务端在变量变化时主动推送,适合事件驱动与高频变化量,但需要处理订阅句柄、回调线程与丢包恢复。理解这些差异,是后续选择采集策略的基础。

Beckhoff ADS 通信与数据采集整体框架 上位机 / 客户端 C# / C++ / Python TwinCAT.Ads 库 ADS Client 接口 读写 / 通知 / 方法调用 AMS Router AMS NetId 寻址 路由表 / 端口映射 TCP 48898 / UDP 跨网段与防火墙穿越 TwinCAT 运行时 PLC Port 851 NC / IO / 自定义服务 符号表与变量句柄 实时任务与过程映像 ADS 请求 AMS 报文 响应 / 通知 数据回调 数据采集链路与关键参数 符号解析 变量名 → 句柄 索引组 / 偏移量 数据类型校验 读取策略 轮询周期 批量读写 通知订阅 数据处理 时间戳对齐 缓存与队列 入库 / 上云 异常恢复 断线重连 错误码诊断 日志与追踪

三、整体框架:从客户端到运行时的四层结构

结合上图,ADS 数据采集可以拆成四层。客户端层负责发起请求,常见实现包括 TwinCAT.Ads API、ADS DLL、Python pyads、C++ TcAdsDll 等。路由层由 AMS Router 承担,负责把 AMS NetId 解析为实际网络地址,并维护路由表与端口映射。服务层位于 TwinCAT 运行时,PLC 默认使用 851 端口,NC、IO 等使用其他端口。数据层则包括符号表、变量句柄、过程映像与实时任务,最终决定变量能否被稳定读取。

学习路径建议按“先通后优”的顺序推进:先完成单变量读写,再扩展到结构体与数组;先使用轮询,再引入通知;先在本机回环测试,再跨网段部署;最后再处理性能、并发与异常恢复。这样能避免一开始就陷入路由、防火墙和符号映射的复杂问题。

四、典型场景与最小示例

一个典型场景是:上位机通过 ADS 读取 TwinCAT PLC 中的温度、压力与设备状态,并写入配方参数。下面是一个 Python 使用 pyads 的最小示例,用于建立连接并读取变量:

import pyads

# 建立 ADS 连接:目标 AMS NetId、目标端口、本机 AMS NetId
plc = pyads.Connection('192.168.1.10.1.1', 851, '192.168.1.100.1.1')
plc.open()

# 按变量名读取 PLC 变量
temperature = plc.read_by_name('MAIN.fTemperature', pyads.PLCTYPE_REAL)
pressure = plc.read_by_name('MAIN.fPressure', pyads.PLCTYPE_REAL)

print('温度:', temperature, '压力:', pressure)

# 写入配方参数
plc.write_by_name('MAIN.fSetPoint', 75.5, pyads.PLCTYPE_REAL)

plc.close()

如果使用 C#,则通常通过 TwinCAT.Ads 命名空间中的 AdsClient 完成连接、读取与通知订阅。无论语言如何变化,核心步骤都一致:配置 AMS NetId、打开端口、解析符号、读写数据、处理异常。

五、常见误区与复盘要点

误区一:把 ADS 当成普通 TCP 协议,只配置 IP 和端口。实际上 ADS 依赖 AMS NetId 与路由表,跨网段时必须正确配置路由。

误区二:忽略符号映射。变量名读取依赖 PLC 中的符号信息,若未激活符号下载或变量被优化,可能无法按名称访问。

误区三:高频轮询代替通知。高频轮询会加重 PLC 与网络负担,应根据变化频率选择通知或批量读取。

误区四:不做断线重连。工业现场网络抖动常见,采集程序必须具备重连、重订阅与错误码记录能力。

学习阶段 关键任务 核心对象 验收标准
通信建立 配置 AMS NetId、路由与端口 AMS Router、851 端口 能成功打开连接并读取一个变量
符号访问 按变量名、句柄、偏移量读写 符号表、变量句柄 能读取结构体与数组中的字段
周期采集 轮询、批量读写、通知订阅 通知句柄、回调线程 采集周期稳定,数据无明显丢失
异常与优化 断线重连、错误码、性能调优 ADS 错误码、日志 能定位常见连接与读写失败原因