2. TwinCAT实时内核与任务调度机制
TwinCAT 的实时性能并不是由某一个参数单独决定的,而是由实时内核、任务模型、优先级抢占规则、周期与抖动、以及 CPU 亲和性共同作用的结果。理解这套机制,是后续做优化和排障的基础。本节从内核组成讲起,逐步落到任务配置与亲和性设置的实际操作。
实时内核的组成
TwinCAT 在 Windows 之上运行一个实时内核(Real-Time Kernel),它把 CPU 的一部分时间从 Windows 手中"接管"过来,用于执行确定性的实时任务。其关键组成包括:
- 实时内核(RT Kernel):负责实时任务的调度、时间基准维护和中断处理,运行在比 Windows 更高的特权层级。
- 实时任务(Real-Time Task):实际承载 PLC、NC、I/O 等逻辑的执行单元,按配置的周期被触发。
- 实时网卡驱动(RT-Ethernet):EtherCAT 等现场总线由实时驱动直接处理,绕过 Windows 协议栈,减少不确定延迟。
- 共享内存与 ADS:实时侧与非实时侧(Windows 应用、HMI、工程环境)通过 ADS 和共享内存交换数据,避免实时任务被非实时操作阻塞。
需要强调:实时内核的确定性来自"时间隔离",而非"速度更快"。即使 CPU 主频不高,只要实时任务能按时被调度且不被非实时负载干扰,系统依然可以是确定性的。
任务类型与优先级
TwinCAT 中常见的实时任务类型包括:
| 任务类型 | 典型用途 | 常见周期 |
|---|---|---|
| PlcTask | PLC 逻辑运算 | 1 ms ~ 10 ms |
| NC Task(NCTOPLC / 插补) | 运动控制插补 | 0.5 ms ~ 2 ms |
| I/O Task | 过程映像刷新、EtherCAT 过程数据 | 与总线周期一致 |
| Additional Task | 自定义周期任务 | 按需配置 |
每个任务都有优先级(Priority)和周期(Cycle Time)。优先级数值越小,优先级越高。当高优先级任务到达时,会抢占正在运行的低优先级任务,这就是抢占式调度。抢占保证了高优先级任务的响应时间,但也意味着低优先级任务的实际执行时间会被切碎。
循环周期与抖动
任务的循环周期(Cycle Time)是两次触发之间的时间间隔。理想情况下,任务每次都在同一时刻启动,但实际中启动时刻会有微小偏差,这个偏差就是抖动(Jitter)。抖动是衡量实时性能的核心指标之一。
抖动的主要来源:
- Windows 侧的非实时中断和驱动占用 CPU;
- 实时任务本身执行时间过长,超过周期;
- 多个实时任务在同一 CPU 上竞争;
- 内存访问、缓存未命中等硬件因素。
判断任务是否"跑得动"的基本条件是:任务执行时间 + 抖动余量 < 周期。如果执行时间接近或超过周期,就会出现任务超时(Overrun),表现为周期被拉长、控制品质下降甚至报错。
CPU 亲和性设置
CPU 亲和性(CPU Affinity)决定实时任务可以运行在哪些 CPU 核心上。合理设置亲和性,可以把实时任务与非实时负载(Windows、HMI、杀毒软件等)隔离到不同核心,显著降低抖动。
典型做法:
- 在 BIOS 中关闭节能选项(C-State、SpeedStep),避免频率波动影响实时性。
- 在 TwinCAT 系统配置中,将实时任务绑定到专用核心(如 CPU 2、3),把 Windows 限制在其余核心。
- 对多核系统,可让不同实时任务分布在不同核心,减少相互抢占。
- 通过 TwinCAT 的实时监控查看各核心的负载和抖动,验证隔离效果。
下面这张图展示了 TwinCAT 实时内核中任务、优先级、周期与 CPU 亲和性之间的整体关系,可作为配置时的参考模型。
配置示例与观察
在 TwinCAT 中配置任务与亲和性,通常经过以下路径:在 System 下展开 Real-Time,进入 Settings 设置实时核心;在 Tasks 下为每个任务设置 Cycle Time 和 Priority;在任务属性中指定 Affinity(可用的 CPU 核心)。
示例(教学假设参数,非实测):
NC Task : Cycle = 1 ms, Priority = 1, Affinity = CPU 1
PlcTask : Cycle = 2 ms, Priority = 5, Affinity = CPU 2
I/O Task : Cycle = 1 ms, Priority = 3, Affinity = CPU 3
Windows : 限制在 CPU 0
配置完成后,通过 TwinCAT 的实时监控(Real-Time Monitor)观察各任务的执行时间、抖动和 CPU 负载。判断标准:任务执行时间应明显小于周期(一般建议不超过周期的 50%~70%),抖动应稳定在较小范围。若发现某任务抖动偏大,优先检查其所在核心是否被其他负载干扰,再考虑调整亲和性或降低任务执行时间。
总结来看,TwinCAT 实时性能的优化路径是:先明确任务类型与优先级,再合理设置周期,最后通过 CPU 亲和性把实时域与非实时域隔离。三者配合,才能获得稳定、可预测的实时行为。