4. TwinCAT实时任务与调度

TwinCAT 的实时性并不是“CPU 快就自然实时”,而是由任务模型、优先级调度、周期分配、看门狗监控以及系统级优化共同决定。理解这些机制,才能让 PLC 程序在确定的时间窗口内稳定执行,而不是偶发抖动或超时。

任务类型:PLC 任务与附加实时任务

在 TwinCAT 中,最常见的实时执行单元是 PLC 任务,它由 PLC 项目中的 Task 定义,绑定到某个 CPU 核心,并按照设定周期循环调用程序。除此之外,系统还支持 附加任务(Additional Task),例如用于运动控制、I/O 同步、C++ 模块或自定义实时逻辑。每个任务都有独立的周期、优先级和看门狗设置。

任务类型决定了它如何被调度:PLC 任务通常按固定周期触发,属于时间驱动;而某些事件驱动任务(如外部中断触发)则按信号到达执行。实际工程中,绝大多数控制逻辑使用周期任务,只有对响应时间要求极短或需要硬件同步的场景才使用中断任务。

优先级:谁先执行,谁可以打断谁

TwinCAT 实时内核采用抢占式优先级调度。每个任务被赋予一个优先级数值,数值越小优先级越高(例如 Priority 0 最高,Priority 30 最低)。当高优先级任务就绪时,它可以立即打断低优先级任务,保证关键控制回路不被普通逻辑阻塞。

优先级分配的核心原则是:周期越短、实时性要求越高的任务,优先级越高。例如一个 1 ms 的运动控制任务应设为 Priority 1~5,而 10 ms 的普通 PLC 逻辑可设为 Priority 10~20。如果多个任务优先级相同,它们按时间片轮转或按触发顺序执行,但确定性会下降,因此关键任务应避免与其它任务共享优先级。

优先级不是越高越好。把所有任务都设为最高优先级会导致低优先级任务长期得不到执行,反而破坏系统整体稳定性。应按“周期越短优先级越高”的原则分层设置。

周期设置:从 1 ms 到 100 ms 的分配逻辑

任务周期(Cycle Time)决定了程序被调用的时间间隔。TwinCAT 支持从 50 µs 到数秒的周期范围,但实际可用周期受 CPU 性能、任务负载和操作系统抖动限制。周期设置需要与 I/O 刷新周期、运动控制插补周期以及通信周期协调。

一个典型的分配示例如下:

任务周期优先级典型用途
Motion Task1 ms2伺服插补、凸轮同步
Fast PLC Task2 ms5高速计数、快速联锁
Main PLC Task10 ms12常规逻辑控制、PID
Slow Task50 ms20HMI 数据刷新、统计

周期设置后,TwinCAT 会为每个任务分配执行时间预算。如果任务实际执行时间接近或超过周期,系统会出现“任务溢出”,表现为周期抖动、看门狗报警甚至 PLC 停止。因此,周期选择必须留有余量,通常建议任务负载不超过周期的 50%~70%。

看门狗:任务超时的最后防线

看门狗(Watchdog)用于监控任务是否在允许时间内完成。每个任务可以设置看门狗时间,通常为周期的若干倍。如果任务执行时间超过看门狗阈值,TwinCAT 会触发看门狗错误,根据配置可能只记录日志、停止该任务或停止整个 PLC 运行时。

看门狗不是用来“容忍慢任务”的,而是用来暴露问题。常见触发原因包括:死循环、大量字符串处理、阻塞式通信调用、内存分配抖动或优先级反转。调试时应先查看 TwinCAT 的 Real-Time CPU Usage 和 Task Execution Time 图表,定位是哪个任务超时,再优化代码或调整周期。

TwinCAT 实时任务调度与看门狗监控示意 CPU Core 0 实时内核调度器 优先级队列 高优先级抢占低优先级 任务列表 Motion Task | 1 ms | Prio 2 Main PLC Task | 10 ms | Prio 12 时间轴(一个 10 ms 调度窗口) 0 ms 2.5 ms 5 ms 7.5 ms 10 ms 1ms 1ms 1ms 1ms 10ms 任务执行 10ms 任务执行 10ms 任务执行 10ms 任务执行 看门狗阈值(示例:任务周期 × 3) 看门狗触发 任务超时 → 报警/停止 实时性能优化要点 • 任务负载 ≤ 周期 50%~70% • 短周期任务分配高优先级 • 避免阻塞调用与动态内存分配 • 隔离实时核心,关闭节能与超线程 CPU 实时负载 60% 建议 < 70% 留有余量防抖动

实时性能优化:从配置到代码

优化实时性能需要从系统层、任务层和代码层三个方向同时入手。

系统层:在 BIOS 中关闭 CPU 节能功能(C-State、EIST),关闭超线程,将实时核心与 Windows 系统核心隔离。TwinCAT 支持通过 Set CPU Affinity 将实时任务绑定到独立核心,避免与 Windows 线程争抢。同时应关闭不必要的后台服务、杀毒软件实时扫描和网络轮询。

任务层:合理分配周期与优先级,避免多个任务在同一核心上过载。使用 TwinCAT 的 Real-Time Monitor 观察每个任务的执行时间、抖动和 CPU 占用。如果某个任务执行时间波动大,应检查是否有外部通信、文件操作或非确定性调用。

代码层:PLC 代码应避免在实时任务中执行字符串拼接、动态数组扩容、文件读写和阻塞式 Socket 调用。这些操作应移到低优先级任务或非实时线程。对于必须执行的复杂计算,可以拆分为多个周期分步完成,而不是在一个周期内全部算完。

看门狗报警后不要简单增大看门狗时间或降低周期要求,这只会掩盖问题。应先定位超时任务,分析其执行时间分布,再决定是优化代码、调整周期还是拆分任务。

一个可参考的配置检查清单

  • 确认每个任务的周期与优先级是否匹配:短周期 → 高优先级。
  • 检查任务负载:单任务执行时间不超过周期的 50%~70%。
  • 看门狗时间设置为周期的 2~5 倍,并确保报警后行为符合安全要求。
  • 实时核心已隔离,BIOS 节能与超线程已关闭。
  • 实时任务中无阻塞调用、无动态内存分配、无文件 I/O。
  • 使用 Real-Time Monitor 持续观察抖动与 CPU 占用,保留余量。

实时性能优化不是一次性的配置动作,而是随着程序增长、I/O 增加和通信负载变化持续调整的过程。只有把任务模型、优先级、周期、看门狗和系统环境作为一个整体来设计,TwinCAT 才能稳定地提供确定性控制。