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 中常见的实时任务类型包括:

任务类型典型用途常见周期
PlcTaskPLC 逻辑运算1 ms ~ 10 ms
NC Task(NCTOPLC / 插补)运动控制插补0.5 ms ~ 2 ms
I/O Task过程映像刷新、EtherCAT 过程数据与总线周期一致
Additional Task自定义周期任务按需配置

每个任务都有优先级(Priority)和周期(Cycle Time)。优先级数值越小,优先级越高。当高优先级任务到达时,会抢占正在运行的低优先级任务,这就是抢占式调度。抢占保证了高优先级任务的响应时间,但也意味着低优先级任务的实际执行时间会被切碎。

优先级分配的基本原则:周期越短、实时性要求越高的任务,优先级越高。例如 NC 插补任务通常高于 PlcTask,I/O 任务与总线周期对齐。

循环周期与抖动

任务的循环周期(Cycle Time)是两次触发之间的时间间隔。理想情况下,任务每次都在同一时刻启动,但实际中启动时刻会有微小偏差,这个偏差就是抖动(Jitter)。抖动是衡量实时性能的核心指标之一。

抖动的主要来源:

  • Windows 侧的非实时中断和驱动占用 CPU;
  • 实时任务本身执行时间过长,超过周期;
  • 多个实时任务在同一 CPU 上竞争;
  • 内存访问、缓存未命中等硬件因素。

判断任务是否"跑得动"的基本条件是:任务执行时间 + 抖动余量 < 周期。如果执行时间接近或超过周期,就会出现任务超时(Overrun),表现为周期被拉长、控制品质下降甚至报错。

CPU 亲和性设置

CPU 亲和性(CPU Affinity)决定实时任务可以运行在哪些 CPU 核心上。合理设置亲和性,可以把实时任务与非实时负载(Windows、HMI、杀毒软件等)隔离到不同核心,显著降低抖动。

典型做法:

  1. 在 BIOS 中关闭节能选项(C-State、SpeedStep),避免频率波动影响实时性。
  2. 在 TwinCAT 系统配置中,将实时任务绑定到专用核心(如 CPU 2、3),把 Windows 限制在其余核心。
  3. 对多核系统,可让不同实时任务分布在不同核心,减少相互抢占。
  4. 通过 TwinCAT 的实时监控查看各核心的负载和抖动,验证隔离效果。

下面这张图展示了 TwinCAT 实时内核中任务、优先级、周期与 CPU 亲和性之间的整体关系,可作为配置时的参考模型。

TwinCAT 实时内核 · 任务调度与 CPU 亲和性关系 Windows 非实时域 HMI / 工程环境 / 杀毒 / 后台服务 —— 与实时任务隔离,避免抢占实时 CPU TwinCAT 实时内核(RT Kernel) NC Task(插补) 优先级:高(数值小) 周期:0.5 ~ 2 ms PlcTask 优先级:中 周期:1 ~ 10 ms I/O Task 优先级:与总线对齐 周期:EtherCAT 周期 抢占式调度器(Preemptive Scheduler) 高优先级任务到达 → 立即抢占低优先级任务;周期越短优先级越高 CPU 0 Windows 专用 CPU 1 NC Task 专用 CPU 2 PlcTask 专用 CPU 3 I/O Task 专用 CPU 亲和性:将实时任务绑定到独立核心,Windows 限制在其余核心,降低抖动

配置示例与观察

在 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%),抖动应稳定在较小范围。若发现某任务抖动偏大,优先检查其所在核心是否被其他负载干扰,再考虑调整亲和性或降低任务执行时间。

常见误区:把所有实时任务都放在同一个核心上,或让 Windows 与实时任务共享核心。这会显著增大抖动,即使任务本身逻辑很简单,也可能出现周期超时。

总结来看,TwinCAT 实时性能的优化路径是:先明确任务类型与优先级,再合理设置周期,最后通过 CPU 亲和性把实时域与非实时域隔离。三者配合,才能获得稳定、可预测的实时行为。