3. TwinCAT实时内核与Windows共存机制

TwinCAT 3 在 Windows 上运行时,并不是把 Windows 改造成实时系统,而是在同一台 PC 上构建两个并行的执行域:Windows 域负责 HMI、文件、网络、开发环境等非实时任务;TwinCAT 实时域(Real-Time Domain)负责 PLC、运动控制、EtherCAT 主站等对周期抖动敏感的任务。理解两者如何共存,是后续所有调优工作的基础。

实时内核的工作原理

TwinCAT 实时内核以驱动形式加载到 Windows 内核中,并接管一部分 CPU 时间。它依赖三个关键机制:

  • 高精度定时器:使用 CPU 的 TSC(时间戳计数器)或 HPET 作为时间基准,而不是 Windows 的 15.6 ms 系统节拍,因此能产生微秒级周期。
  • 中断与调度优先级:实时任务运行在比 Windows 线程更高的优先级上,Windows 的普通线程无法抢占实时任务。
  • 隔离执行:实时任务在独立的核心上运行,避免与 Windows 线程争抢同一核心的执行时间。

实时周期由 Base Time 决定,常见取值为 1 ms、500 µs、250 µs 甚至 50 µs。每个周期内,实时内核按固定顺序执行:读取输入 → 执行 PLC/NC 任务 → 写输出 → 等待下一个周期。若某周期内任务未完成,就会产生 Exceed(超时),表现为周期抖动增大甚至丢帧。

Windows 与实时域的隔离

隔离的核心思想是“物理分离”:让 Windows 和 TwinCAT 实时任务运行在不同的 CPU 核心上。若两者共享同一核心,Windows 的线程调度、中断处理、驱动活动都会侵入实时周期,导致抖动。隔离方式主要有两种:

  • CPU 亲和性(Affinity):通过 TwinCAT 系统设置,把实时任务绑定到指定核心,Windows 则使用其余核心。
  • 隔离核心(Isolated Core):在 BIOS 和 Windows 层面把某些核心从 Windows 调度器中移除,只留给 TwinCAT 使用。

下图展示了典型的双域共存结构:Windows 域运行在 Core 0/1,TwinCAT 实时域独占 Core 2/3,两者通过共享内存和 TwinCAT 驱动通信。

TwinCAT 实时域与 Windows 域共存结构 Windows 域(非实时) HMI / 可视化 文件 / 网络服务 TwinCAT XAE 开发 Windows 驱动 / 中断 调度器:Windows 线程调度(15.6 ms 节拍) TwinCAT 实时域(实时) PLC 任务 NC / 运动控制 EtherCAT 主站 I/O 周期任务 调度器:TwinCAT 实时内核(µs 级周期) TwinCAT 驱动 / 共享内存 ADS 通信 · 数据交换 CPU 核心分配 Core 0 Windows 系统 Core 1 Windows 应用 Core 2 TwinCAT 实时(隔离) Core 3 TwinCAT 实时(隔离) 隔离核心不参与 Windows 调度,仅由 TwinCAT 实时内核使用

CPU 亲和性设置

在 TwinCAT 3 中,CPU 亲和性通过 System → Real-Time → Settings 配置。每个实时任务(如 PLC 任务、NC 任务、EtherCAT 任务)都可以指定运行在哪个核心上。典型做法是:

  • 把 Windows 限制在 Core 0 和 Core 1;
  • 把 TwinCAT 实时任务绑定到 Core 2 和 Core 3;
  • 若只有一个实时任务,可只使用 Core 2,Core 3 留作扩展或冗余。

配置时需要注意:TwinCAT 的 Set on CPU 选项会直接写入亲和性掩码。例如,掩码 0x04 表示仅使用 Core 2(二进制 0100),0x0C 表示使用 Core 2 和 Core 3(二进制 1100)。在 Real-Time Settings 中还可以设置 CPU Limit,限制实时任务占用的 CPU 百分比,防止单个核心被完全占满。

隔离核心配置

仅设置亲和性还不够,因为 Windows 仍可能把中断、DPC 或系统线程调度到实时核心上。真正的隔离需要在两个层面操作:

  1. BIOS 层面:关闭实时核心的 C-State、SpeedStep、超线程(Hyper-Threading),并启用 Isolated Core 或 Core Isolation 选项(不同主板名称不同)。
  2. Windows 层面:使用 bcdedit /set useplatformclock true 强制使用 HPET,或通过 bcdedit /set disabledynamictick yes 关闭动态节拍;同时用 bcdedit /set numproc 2 限制 Windows 可见的核心数。

一个常见的配置示例:4 核 CPU,Windows 使用 Core 0/1,TwinCAT 使用 Core 2/3。BIOS 中关闭 Core 2/3 的 C-State,Windows 中设置 numproc=2,TwinCAT 中把 PLC 任务绑定到 Core 2,EtherCAT 任务绑定到 Core 3。这样 Windows 完全看不到 Core 2/3,实时任务获得干净的执行环境。

提示:隔离核心后,Windows 任务管理器可能只显示 2 个核心,这是正常现象。TwinCAT 仍能访问被隔离的核心,因为实时内核运行在 Windows 内核之下,不受 numproc 限制。

BIOS 与操作系统级优化要点

除了核心隔离,以下设置对实时性能影响显著:

层面 设置项 推荐值 原因
BIOS C-State / SpeedStep Disabled 避免频率切换引入延迟抖动
BIOS Hyper-Threading Disabled 逻辑核共享物理资源,增加不确定性
BIOS VT-x / VT-d Enabled 部分 TwinCAT 功能依赖虚拟化扩展
Windows 电源计划 高性能 / 卓越性能 防止 CPU 降频
Windows 动态节拍 disabledynamictick=yes 固定系统节拍,减少调度抖动
Windows USB 选择性暂停 Disabled 避免 USB 中断干扰实时任务
Windows 网卡中断亲和性 绑定到 Windows 核心 防止网卡中断占用实时核心

完成上述配置后,可以通过 TwinCAT 的 Real-Time → Additional Tasks → CPU Usage 查看实时核心的负载,并用 Scope 或 Task Monitor 观察周期抖动。若抖动仍偏大,应检查是否有驱动或服务在实时核心上产生中断,必要时用 msinfo32 或 LatencyMon 定位高 DPC 延迟的驱动。

注意:隔离核心和关闭超线程会减少 Windows 可用核心数,可能影响 HMI 响应速度。建议在调试阶段先保留全部核心,确认实时性能后再逐步隔离,避免一次性改动过大导致难以定位问题。

总结来说,TwinCAT 实时内核与 Windows 的共存依赖“时间隔离 + 空间隔离”:时间上由高精度定时器和优先级调度保证周期稳定,空间上由 CPU 亲和性和隔离核心保证执行环境干净。BIOS 和操作系统层面的优化则是消除底层不确定性的必要手段。三者配合,才能让 PC 控制达到接近专用控制器的实时性能。