3. Beckhoff TwinCAT体系

TwinCAT 是 Beckhoff 基于 PC 控制技术的核心软件平台,它把一台普通工业 PC 或嵌入式控制器变成实时 PLC、运动控制器和 NC 轴控系统。理解 TwinCAT 2 与 TwinCAT 3 的架构差异,以及 ADS 在其中的位置,是后续进行 ADS 通信与数据采集的前提。因为 ADS 并不是一个外挂协议,而是 TwinCAT 运行时内部各模块之间、以及外部程序与 TwinCAT 之间通信的“神经系统”。

一、TwinCAT 2 与 TwinCAT 3 的架构差异

TwinCAT 2 采用“一个工程对应一个运行时”的经典模型。PLC 程序、NC 配置、I/O 映射都放在同一个 System Manager 工程中,运行时以单实例方式运行在目标 PC 上。它的优点是结构直观、调试简单;缺点是多个项目、多个 PLC 任务之间耦合较紧,版本升级和模块复用不够灵活。

TwinCAT 3 则引入了“工程与运行时分离”的思想。它基于 Visual Studio 集成开发环境,把 PLC、C++、MATLAB/Simulink、NC、I/O 等拆分为独立模块,通过 TwinCAT Project 组织,并支持多运行时实例(Runtime Instance)。每个实例可以独立启动、停止和配置,模块之间通过 ADS 路由和 ADS 端口进行通信。这种架构让 TwinCAT 3 更适合复杂产线、多轴同步和边缘计算场景。

核心区别:TwinCAT 2 是“单工程单运行时”的紧耦合架构;TwinCAT 3 是“多模块多运行时”的松耦合架构。ADS 在 TwinCAT 3 中从“内部通信机制”升级为“跨模块、跨进程、跨网络的统一通信总线”。

二、ADS 在 TwinCAT 体系中的角色

ADS(Automation Device Specification)是 Beckhoff 定义的自动化设备规范。它位于 TCP/IP 或本地消息机制之上,为 TwinCAT 内部模块和外部客户端提供统一的读写、调用和通知接口。在 TwinCAT 2 中,ADS 主要用于 PLC 与 System Manager、HMI 之间的数据交换;在 TwinCAT 3 中,ADS 成为所有模块互联的公共通道。

从角色上看,ADS 承担三件事:第一,寻址——通过 AMS Net ID、端口号和索引组/索引偏移定位到具体设备、任务和变量;第二,传输——支持同步读写、异步读写和通知订阅;第三,路由——允许跨网段、跨设备访问远程 TwinCAT 运行时。因此,做数据采集时,我们实际上是在通过 ADS 访问 TwinCAT 运行时中的符号和过程映像。

三、ADS 运行机制与数据流

ADS 通信的基本单位是 AMS 报文。客户端发起请求时,需要指定目标 AMS Net ID、目标端口、源 AMS Net ID 和源端口。TwinCAT 运行时中的 ADS 路由器负责把报文分发到对应端口,例如 PLC 运行时通常使用 851 端口,NC 使用 500 端口,I/O 使用 300 端口。端口背后是具体的服务模块,它们再访问符号表、过程映像或硬件抽象层。

对于变量读写,ADS 提供按地址访问和按符号访问两种方式。按地址访问需要知道索引组、索引偏移和数据类型;按符号访问则通过 ADS 符号信息接口,先获取变量句柄,再基于句柄读写。后者更适合工程化数据采集,因为变量名变更时只需重新获取句柄,不必硬编码地址。

TwinCAT 2 / TwinCAT 3 架构与 ADS 运行机制 TwinCAT 2:单工程单运行时 System Manager 工程 / 配置 / I/O 映射 TwinCAT 2 Runtime PLC / NC / I/O 单实例 ADS 内部通信:PLC ↔ HMI ↔ System Manager 端口固定、实例唯一、跨工程复用困难 TwinCAT 3:多模块多运行时 PLC 模块 Port 851 NC / 运动 Port 500 I/O 模块 Port 300 ADS 路由器:跨模块 / 跨进程 / 跨网络统一寻址 AMS Net ID + 端口号 + 索引组/偏移 ADS 客户端 / 数据采集程序 按地址读写:IndexGroup + IndexOffset + Length 按符号读写:GetHandle → Read/Write → ReleaseHandle 运行机制要点: 1. AMS 报文经 TCP/IP 或本地消息传输,由 ADS 路由器分发到目标端口。 2. 端口对应服务模块,服务模块访问符号表、过程映像或硬件抽象层。 3. 通知订阅(Notification)由服务端周期推送,适合高频数据采集与变化上报。

四、典型数据采集场景与配置示例

假设我们要从一台运行 TwinCAT 3 的控制器中采集 PLC 变量 MAIN.nSpeed 和 MAIN.bEnable。首先需要在 TwinCAT 3 工程中启用 ADS 符号信息,并确认目标 AMS Net ID。然后在采集端使用 ADS 客户端库,先获取符号句柄,再周期读取。下面是一个典型的 C++ 伪代码片段:

// 1. 建立 ADS 连接
AmsAddr addr;
addr.netId = {192,168,1,10,1,1};
addr.port  = 851;

// 2. 获取符号句柄
Handle hSpeed, hEnable;
AdsSyncReadWriteReq(addr, ADSIGRP_SYM_HNDBYNAME, 0,
                    sizeof(hSpeed), &hSpeed,
                    strlen("MAIN.nSpeed"), "MAIN.nSpeed");
AdsSyncReadWriteReq(addr, ADSIGRP_SYM_HNDBYNAME, 0,
                    sizeof(hEnable), &hEnable,
                    strlen("MAIN.bEnable"), "MAIN.bEnable");

// 3. 周期读取
while (running) {
    AdsSyncReadReq(addr, ADSIGRP_SYM_VALBYHND, hSpeed,
                   sizeof(speed), &speed);
    AdsSyncReadReq(addr, ADSIGRP_SYM_VALBYHND, hEnable,
                   sizeof(enable), &enable);
    Sleep(10);
}

// 4. 释放句柄
AdsSyncWriteReq(addr, ADSIGRP_SYM_RELEASEHND, 0,
                sizeof(hSpeed), &hSpeed);

如果采集频率要求较高,或者变量变化不频繁但需要及时上报,应优先使用 ADS 通知(Notification)。通知由 TwinCAT 服务端在变量变化或周期到达时主动推送,客户端只需注册回调,能显著降低轮询带来的网络和 CPU 开销。

五、常见误区与复盘

  • 误区一:把 ADS 当成普通 TCP 协议。ADS 虽然可以跑在 TCP/IP 上,但它有 AMS Net ID、端口、索引组/偏移等寻址层,直接裸写 TCP 报文无法完成变量访问。
  • 误区二:TwinCAT 2 和 TwinCAT 3 的端口号混用。PLC 运行时端口在两者中通常都是 851,但 TwinCAT 3 支持多实例,不同实例的端口可能不同,必须按实际配置确认。
  • 误区三:忽略符号句柄释放。长期采集程序中,句柄未释放会导致运行时资源泄漏,最终影响 PLC 任务周期。
  • 误区四:用轮询采集高频变量。高频轮询会占用 ADS 路由和 PLC 任务时间,建议改用通知或批量读取。

实践建议:在 TwinCAT 3 中做数据采集时,先通过 AdsGetSymbolInfo 或 TwinCAT 工程中的符号信息确认变量名和数据类型,再决定使用按地址还是按符号访问。对于跨网段场景,提前在目标控制器上配置 ADS 路由,并确认 AMS Net ID 与 IP 的对应关系。

六、TwinCAT 2 与 TwinCAT 3 关键对比清单

对比项 TwinCAT 2 TwinCAT 3
开发环境 独立 System Manager Visual Studio 集成
运行时模型 单实例、单工程 多实例、多模块
模块复用 较弱,工程间耦合高 强,支持库和模块化
ADS 角色 内部通信为主 统一通信总线,跨模块/跨网络
典型端口 PLC 851、NC 500、I/O 300 PLC 851(可多实例)、NC 500、I/O 300
适用场景 中小型单机设备 复杂产线、多轴同步、边缘计算

理解 TwinCAT 2 与 TwinCAT 3 的架构差异,以及 ADS 在其中的寻址、传输和路由机制,是后续编写 ADS 客户端、配置路由和设计数据采集方案的基础。只有把运行时、端口、符号和通知机制对应清楚,才能在实际项目中稳定、高效地获取 TwinCAT 数据。