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任务周期,否则会读到重复值或丢失中间状态。
三、变量访问路径的三种方式
在TwinCAT中访问一个变量,实际存在三条路径,采集方案应根据场景选择:
- 符号名访问:通过
GVL_Production.iGoodCount这样的符号路径访问。优点是直观、可读、与程序结构一致;缺点是依赖PLC程序下载后的符号表,程序修改后符号可能失效。适合MES采集这类需要业务语义的场景。 - 地址访问:通过IndexGroup/IndexOffset直接读写内存地址,如
0x4020偏移。优点是速度快、不依赖符号;缺点是程序重新编译后地址可能变化,维护困难。适合对性能要求极高的高频采集。 - 过程映像访问:直接读取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接口开发和数据校验的基础。
上图把四类数据源、ADS路由器端口映射以及三种变量访问方式放在同一视图中。可以看到,I/O、PLC、NC、HMI并不是并列的采集对象,而是通过ADS路由器汇聚到统一的访问入口。采集程序只需要面对ADS接口,但必须清楚每个变量属于哪个Port,否则会出现“变量名正确却读不到值”的情况。
最后需要强调一个常见误区:很多工程师把HMI画面上的显示值当作采集源,认为“HMI显示什么就采集什么”。实际上HMI值本身也是通过ADS从PLC读取的,中间多了一层刷新和格式化,既增加延迟又可能丢失中间状态。正确的做法是直接采集PLC中的原始变量,HMI只作为人机交互界面,不参与数据采集链路。