2. TwinCAT系统架构与数据源梳理

在TwinCAT生产数据采集项目中,第一步不是写采集程序,而是把“数据从哪里来、经过什么通道、以什么名字被访问”这三件事彻底梳理清楚。TwinCAT把一台工业PC同时变成PLC控制器、运动控制器、I/O主站和HMI运行平台,多个运行时(Runtime)并行存在,各自维护独立的变量空间。如果数据源识别不清,后续采集会出现变量找不到、数值对不上、采样周期与任务周期不匹配等典型问题。

一、TwinCAT系统架构中的四类数据源

从数据采集视角看,TwinCAT系统可以划分为四个层次的数据源,它们通过不同的内部通道互联:

  • I/O层(现场层):EtherCAT、PROFINET、CANopen等总线上的耦合器、端子模块、伺服驱动器。数据以过程映像(Process Image)形式映射到内存,典型对象是输入字节、输出字节、状态字、位置反馈值。例如EL1008的输入位、EL5101编码器端子的位置值。
  • PLC层(逻辑层):TwinCAT PLC运行时中的程序变量,包括全局变量(GVL)、功能块实例、结构体、数组。这是MES采集最常用的数据源,变量名如 GVL_Production.iGoodCount。
  • NC层(运动层):TwinCAT NC PTP或NC I插补运行时中的轴对象,包含轴状态、实际位置、速度、力矩、跟随误差等。轴参数通过AXIS_REF或NC轴接口访问,例如 Axis1.NcToPlc.ActPos。
  • HMI层(人机层):TwinCAT HMI(TF2000)或外部SCADA,其数据通常不直接作为采集源,而是通过ADS读写PLC/NC变量。HMI自身的画面变量、报警记录可作为辅助数据源,但需注意其刷新周期通常为100~500ms,不适合高频采集。

这四类数据源并非孤立:I/O数据被PLC程序读取后参与逻辑运算,NC轴由PLC通过运动功能块控制,HMI则通过ADS访问PLC和NC。采集系统应优先选择“已经过PLC处理、具有明确业务含义”的变量,而不是直接抓取原始I/O位,否则会把抖动、滤波、单位换算等工作全部推给上位机。

二、ADS通信原理

ADS(Automation Device Specification)是Beckhoff定义的跨进程、跨设备通信协议,也是TwinCAT数据采集的核心通道。它基于TCP/IP(端口48898)或本地消息机制,采用“请求—响应”模型。一次ADS读写由三部分组成:

  • AMS NetId:标识目标设备,格式如 192.168.1.10.1.1,其中前四段是IP,第五段是设备端口号。本机通常为 127.0.0.1.1.1或localhost。
  • ADS Port:标识目标运行时。PLC运行时通常为851,NC轴为500,I/O为300,系统服务为10000。端口号决定了你访问的是哪个Runtime的变量空间。
  • IndexGroup / IndexOffset:在运行时内部定位变量的地址。对于符号变量,ADS支持按名称访问,由TwinCAT ADS路由器自动解析为IndexGroup/Offset。

ADS通信的关键参数是采样周期与通知(Notification)机制。轮询读取(Read)适合低频、少量变量;对于高频采集,应使用ADS Notification,由PLC侧在变量变化时主动推送,周期可设为1ms~100ms。需要注意:Notification的周期不能小于PLC任务周期,否则会读到重复值或丢失中间状态。

ADS端口号是区分数据源的关键:851访问PLC变量,500访问NC轴,300访问I/O过程映像。同一个变量名在不同端口中含义完全不同,配置采集时必须同时指定NetId和Port。

三、变量访问路径的三种方式

在TwinCAT中访问一个变量,实际存在三条路径,采集方案应根据场景选择:

  1. 符号名访问:通过 GVL_Production.iGoodCount 这样的符号路径访问。优点是直观、可读、与程序结构一致;缺点是依赖PLC程序下载后的符号表,程序修改后符号可能失效。适合MES采集这类需要业务语义的场景。
  2. 地址访问:通过IndexGroup/IndexOffset直接读写内存地址,如 0x4020偏移。优点是速度快、不依赖符号;缺点是程序重新编译后地址可能变化,维护困难。适合对性能要求极高的高频采集。
  3. 过程映像访问:直接读取I/O过程映像区,如输入映像 %I*。优点是延迟最低;缺点是数据未经PLC逻辑处理,可能包含抖动和原始值。适合需要监控原始信号的诊断场景。

实际项目中,推荐以符号名访问为主,对高频关键变量辅以Notification机制。下面给出一个典型的ADS采集配置示例,用于读取PLC中的产量计数和NC轴位置:

// TwinCAT ADS 采集配置示例(伪代码,参数为示例值)
NetId      := '192.168.1.10.1.1';
Port_PLC   := 851;
Port_NC    := 500;

// 符号变量路径
Var_GoodCount := 'GVL_Production.iGoodCount';   // INT, 单位:件
Var_AxisPos   := 'Axis1.NcToPlc.ActPos';        // LREAL, 单位:mm

// 采集周期
Cycle_PLC  := T#100MS;   // 产量计数,100ms足够
Cycle_NC   := T#10MS;    // 轴位置,10ms用于轨迹监控

// 使用ADS Notification,由PLC主动推送变化值
// 注意:Cycle_NC 不得小于NC任务周期(示例中NC任务周期为2ms)

配置完成后,判断采集是否正常的依据有三条:一是ADS连接状态返回 ADSERR_NOERR;二是读取到的变量值在合理范围内(如产量计数单调递增、轴位置在行程范围内);三是Notification回调频率与设定周期一致,若明显偏低,说明PLC任务负载过高或网络延迟过大。

四、数据源梳理的实操方法

面对一个已有TwinCAT项目,建议按以下顺序梳理数据源,而不是直接打开变量表逐个翻找:

  • 先看PLC任务结构:在TwinCAT XAE中查看PLC项目的任务配置,确认主任务周期(如10ms)和优先级。采集周期应与之匹配或为其整数倍。
  • 再看GVL和结构体:全局变量列表(GVL)通常是MES采集的入口,结构体如 ST_ProductionData 往往已经按业务分组,直接采集整个结构体比逐个变量更高效。
  • 确认NC轴映射:在NC配置中查看轴与PLC变量的映射关系,确认 Axis1.NcToPlc 中的ActPos、ActVelo、Status等字段是否已使能。
  • 核对I/O过程映像:在I/O配置中查看EtherCAT从站的过程映像大小和偏移,确认输入/输出字节数,避免采集时越界。
  • 记录HMI刷新周期:如果HMI变量需要参与采集,记录其刷新周期,避免与PLC采集周期冲突导致数据重复或跳变。

梳理完成后,应形成一份数据源清单,至少包含:变量名、数据类型、单位、所属Runtime(Port)、采集周期、业务含义、异常判断阈值。这份清单是后续MES接口开发和数据校验的基础。

TwinCAT 数据源与 ADS 访问路径 I/O 层 EtherCAT / 端子 / 过程映像 PLC 层 GVL / 结构体 / 功能块 NC 层 轴对象 / ActPos / Status HMI 层 画面变量 / 报警记录 ADS 路由器 AMS NetId + Port Port 851 → PLC Port 500 → NC Port 300 → I/O Notification 推送 符号名访问 GVL_Production.iGoodCount 直观、依赖符号表 地址访问 IndexGroup / IndexOffset 快速、地址易变 过程映像访问 %I* / %Q* 原始字节 低延迟、未处理 采集周期匹配原则: PLC 任务周期 10ms → 采集周期 ≥ 10ms;NC 任务周期 2ms → 轴位置采集周期 ≥ 2ms;HMI 刷新 100~500ms → 不用于高频采集。 优先使用 ADS Notification 推送,避免轮询造成网络与 CPU 负载。

上图把四类数据源、ADS路由器端口映射以及三种变量访问方式放在同一视图中。可以看到,I/O、PLC、NC、HMI并不是并列的采集对象,而是通过ADS路由器汇聚到统一的访问入口。采集程序只需要面对ADS接口,但必须清楚每个变量属于哪个Port,否则会出现“变量名正确却读不到值”的情况。

最后需要强调一个常见误区:很多工程师把HMI画面上的显示值当作采集源,认为“HMI显示什么就采集什么”。实际上HMI值本身也是通过ADS从PLC读取的,中间多了一层刷新和格式化,既增加延迟又可能丢失中间状态。正确的做法是直接采集PLC中的原始变量,HMI只作为人机交互界面,不参与数据采集链路。