2. TwinCAT系统架构与运行模式
理解 TwinCAT 的运动控制,关键不是记住“PLC 控制 NC”这句话,而是看清四个运行实体各自负责什么、数据以什么形式在它们之间流动、以及一次运动指令从用户程序到电机轴端究竟经过了哪些环节。TwinCAT 把实时控制拆成若干独立但共享同一实时内核的运行时(Runtime),它们通过内部的过程映像和 ADS 通知机制交换数据,而不是靠用户手写通信代码。
四个运行实体与它们的职责边界
在典型的 TwinCAT 3 工程中,与运动控制直接相关的运行实体有四个:
- PLC 运行时(PLC Runtime):执行 IEC 61131-3 程序,负责工艺逻辑、状态机、配方、报警、HMI 交互。它通过 Tc2_MC2 / Tc3_MC2 库中的功能块(如 MC_Power、MC_MoveAbsolute、MC_MoveVelocity)向 NC 发出运动命令,并读取轴状态。
- NC 运行时(NC Runtime):即运动控制内核,负责轨迹规划、插补、加减速、位置环前馈、轴耦合(电子齿轮、凸轮)。它把 PLC 给出的“目标位置/速度”转化为每个 NC 周期(默认 1 ms)的位置设定值。
- I/O 运行时(I/O Runtime):管理现场总线设备与过程映像,把 EtherCAT 从站的过程数据映射到 PLC 和 NC 可访问的变量地址。
- EtherCAT 主站:作为 I/O 运行时下的一个实时任务,按分布式时钟(DC)周期性地收发报文,把 NC 计算出的设定值下发到伺服驱动器,并把编码器实际位置、状态字、诊断信息回传。
四者的关系不是简单的串联,而是“PLC 决策、NC 规划、I/O 搬运、EtherCAT 执行”的分工。PLC 不直接产生每个周期的位置值,NC 也不直接操作硬件寄存器,这种分层是 TwinCAT 能同时保证逻辑灵活性和运动实时性的基础。
数据流:从功能块调用到电机轴端
以一次绝对定位为例,数据流可以拆成五段:
- PLC 侧命令生成:用户程序调用
MC_MoveAbsolute,给定Position、Velocity、Acceleration、Deceleration、Jerk等参数,并把Execute置 TRUE。功能块内部通过 ADS 把命令写入 NC 轴接口。 - NC 侧轨迹规划:NC 运行时接收命令后,按设定的插补周期生成位置设定值序列。若轴配置了前馈和速度前馈,NC 还会输出速度、加速度前馈量,用于提高跟随精度。
- 过程映像交换:NC 的设定值写入 I/O 过程映像的输出区,EtherCAT 从站的编码器值写入输入区。这个过程映像在 PLC 与 NC 之间是共享的,因此 PLC 可以直接读取轴的实际位置、状态字和错误码。
- EtherCAT 周期通信:主站按 DC 周期发送过程数据报文,伺服驱动器在收到设定值后执行位置环/速度环/电流环,并把实际位置、实际速度、状态字、扭矩反馈回主站。
- 状态回读与闭环判断:PLC 通过
MC_MoveAbsolute的Done、Busy、Active、Error输出,以及Axis结构体中的NcToPlc状态,判断运动是否完成、是否到位、是否出现跟随误差超限。
下面这张图把上述四个运行实体、数据流向和关键接口放在同一张关系图中,便于对照理解。
运行模式与实时性约束
TwinCAT 的实时性来自“优先级 + 周期”的配置。PLC 任务通常配置为 1 ms 或 2 ms 周期,NC 的插补周期默认 1 ms,EtherCAT 主站周期与 NC 周期对齐。三者必须在同一个实时核上按优先级调度:EtherCAT 主站优先级最高,NC 次之,PLC 最低。如果 PLC 任务周期过长或优先级设置不当,会出现“NC 已规划、EtherCAT 未及时下发”的抖动,表现为轴跟随误差增大或 MC_MoveAbsolute 的 Done 延迟。
另一个容易忽略的点是 NC 与 PLC 的“数据一致性”。PLC 读取 Axis.NcToPlc.ActPos 时,读到的是最近一次过程映像刷新的值,而不是“当前瞬间”的值。因此在高动态场合,PLC 侧的位置判断应留出合理的到位窗口(如 ±0.05 mm),而不是用严格等于目标位置作为完成条件。
协同中的典型参数与观察点
下面这张表给出了一次绝对定位中,四个运行实体各自需要关注的关键参数和观察点,可作为调试时的检查清单。
| 运行实体 | 关键参数 / 接口 | 观察点 | 异常表现 |
|---|---|---|---|
| PLC 运行时 | Position、Velocity、Acceleration、Jerk、Execute | Done / Busy / Active / Error / ErrorID | ErrorID 非零,如 0x4260 表示跟随误差超限 |
| NC 运行时 | 插补周期、前馈系数、最大速度、最大加速度 | Axis.NcToPlc.ActPos、ActVelo、FollowingError | FollowingError 持续增大,说明增益或前馈不匹配 |
| I/O 运行时 | 过程映像地址、变量映射、DC 模式 | 输入区编码器值、输出区控制字 | 映射地址错位,导致轴不动或飞车 |
| EtherCAT 主站 | 周期时间、DC 偏移、从站状态 | WorkingCounter、从站 OP 状态、丢包计数 | WorkingCounter 不递增,从站无法进入 OP |
一个可复现的配置示例
假设使用一台支持 EtherCAT 的伺服驱动器,目标是在 PLC 中完成一次从 0 到 100 mm 的绝对定位。可按以下顺序建立协同关系:
1. 在 I/O 配置中扫描 EtherCAT 从站,确认从站进入 OP 状态。
2. 在 NC 中新建一个轴(Axis 1),关联到该从站的驱动器和编码器过程数据。
3. 在 PLC 中引用轴变量,例如:
Axis1 : AXIS_REF;
Power1 : MC_Power;
Move1 : MC_MoveAbsolute;
4. 周期调用:
Power1(Axis := Axis1, Enable := TRUE, Enable_Positive := TRUE, Enable_Negative := TRUE);
Move1(Axis := Axis1, Execute := bStart, Position := 100.0,
Velocity := 50.0, Acceleration := 500.0, Deceleration := 500.0, Jerk := 5000.0);
5. 观察 Move1.Done 变为 TRUE,同时 Axis1.NcToPlc.ActPos 接近 100.0。
这里的 100.0 单位取决于 NC 轴配置中设定的单位(通常为 mm 或度),速度 50.0 表示 50 mm/s,加速度 500.0 表示 500 mm/s²。这些数值属于教学示例,实际项目中应根据机械负载、电机额定参数和工艺节拍重新整定。
FollowingError 报警,优先检查 NC 轴的前馈系数和伺服驱动器的位置环增益是否匹配,而不是直接修改 PLC 程序。
小结:协同的本质是“分层 + 共享过程映像”
PLC 运行时负责“决定做什么”,NC 运行时负责“算出每个周期怎么走”,I/O 运行时负责“把数据搬到正确的位置”,EtherCAT 负责“按时把数据送到驱动器”。四者通过共享过程映像和 ADS 通知协同,而不是通过用户自定义通信。理解这条数据链,就能在出现轴不动、到位延迟、跟随误差超限等问题时,快速定位是命令层、规划层、映射层还是通信层的问题。