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 Task | 1 ms | 2 | 伺服插补、凸轮同步 |
| Fast PLC Task | 2 ms | 5 | 高速计数、快速联锁 |
| Main PLC Task | 10 ms | 12 | 常规逻辑控制、PID |
| Slow Task | 50 ms | 20 | HMI 数据刷新、统计 |
周期设置后,TwinCAT 会为每个任务分配执行时间预算。如果任务实际执行时间接近或超过周期,系统会出现“任务溢出”,表现为周期抖动、看门狗报警甚至 PLC 停止。因此,周期选择必须留有余量,通常建议任务负载不超过周期的 50%~70%。
看门狗:任务超时的最后防线
看门狗(Watchdog)用于监控任务是否在允许时间内完成。每个任务可以设置看门狗时间,通常为周期的若干倍。如果任务执行时间超过看门狗阈值,TwinCAT 会触发看门狗错误,根据配置可能只记录日志、停止该任务或停止整个 PLC 运行时。
看门狗不是用来“容忍慢任务”的,而是用来暴露问题。常见触发原因包括:死循环、大量字符串处理、阻塞式通信调用、内存分配抖动或优先级反转。调试时应先查看 TwinCAT 的 Real-Time CPU Usage 和 Task Execution Time 图表,定位是哪个任务超时,再优化代码或调整周期。
实时性能优化:从配置到代码
优化实时性能需要从系统层、任务层和代码层三个方向同时入手。
系统层:在 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 才能稳定地提供确定性控制。