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 驱动通信。
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 或系统线程调度到实时核心上。真正的隔离需要在两个层面操作:
- BIOS 层面:关闭实时核心的 C-State、SpeedStep、超线程(Hyper-Threading),并启用 Isolated Core 或 Core Isolation 选项(不同主板名称不同)。
- 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,实时任务获得干净的执行环境。
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 延迟的驱动。
总结来说,TwinCAT 实时内核与 Windows 的共存依赖“时间隔离 + 空间隔离”:时间上由高精度定时器和优先级调度保证周期稳定,空间上由 CPU 亲和性和隔离核心保证执行环境干净。BIOS 和操作系统层面的优化则是消除底层不确定性的必要手段。三者配合,才能让 PC 控制达到接近专用控制器的实时性能。