在 Beckhoff 的 TwinCAT 系统中,Task(任务) 是用于调度和执行 PLC 代码的核心调度单元,相当于一个周期性运行的线程。每个 Task 运行时会循环执行已关联的 PLC 程序,并由 TwinCAT 的实时操作系统进行管理和调度。
Task 的作用
-
控制 PLC 程序的执行周期:Task 定义了 PLC 代码的执行频率(周期时间,如 1ms、10ms)。
-
管理 CPU 资源:TwinCAT 允许创建多个 Task,并为每个 Task 分配不同的优先级,以确保关键任务能够得到及时执行。
-
实现多任务并行控制:可以创建多个 Task 运行不同的 PLC 代码,实现控制逻辑的分层或并行执行。
Task 的关键参数
在 TwinCAT XAE(工程环境)中,Task 的核心参数包括:
-
周期时间(Cycle Time):
-
任务的执行间隔,通常在 100µs~100ms 之间。
-
例如,周期为 1ms 的 Task,每隔 1ms 调用一次 PLC 代码。
-
-
优先级(Priority):
-
任务的调度优先级,数值越小,优先级越高(0 为最高)。
-
高优先级任务会抢占低优先级任务的 CPU 资源。
-
-
Watchdog 监控:
-
任务执行时间如果超过设定的最大时间,会触发 Watchdog 报警,防止死循环等问题。
-
Task 调度机制
TwinCAT 采用 实时操作系统(RTOS),通过 Task 进行 PLC 代码调度:
-
定时触发(基于周期时间):
-
每个 Task 由 TwinCAT 的 实时内核(RT Kernel) 触发,按设定周期调用 PLC 代码。
-
抢占式调度(基于优先级):
-
TwinCAT 采用 优先级抢占 机制,高优先级任务可以打断低优先级任务。
同步与异步任务:
- 任务通常是 同步执行 的(一个周期内必须执行完)。
- 也可以创建 异步任务 处理非实时逻辑,比如数据存储、通讯等。
任务分配方式
TwinCAT 允许不同的 PLC 程序 绑定到不同的 Task,通常有几种典型分配方式:
- 单 Task 运行所有 PLC 代码(简单系统)
- 多个 Task 运行不同模块(常见于复杂项目):
- 高优先级任务:实时控制(如电机控制、位置控制)
- 低优先级任务:通讯、日志存储、HMI 交互等
下面新建项目,将两个程序块进行自累加,并且将他们配置到2个Task中,随后观察现象。
注意:程序以很快的Task循环周期进行运行,将会提高CPU占用率。如果最小的Task周期大于100ms,则EtherCAT看门狗会报错。
首先新建一个PLC项目,可以看到系统自动为我们新建了一个PlcTask的任务,在这个Task里执行的是MAIN程序块。随后我们手动添加一个程序块,命名为“MAIN2”在添加一个名为“PlcTask2”的任务,然后降MAIN2拖拽至PlcTask2中,这样就将两套程序块配置到不同的Task之中了。接下来编写两个自累加程序,分别放在MAIN和MAIN2中。
随后点击左侧树形结构中的Tasks,可以看到PlcTask和PlcTask2中的Cycle ticks均为10ms循环周期进行运行的。
实验1:10ms VS 10ms
接下来下载程序运行程序,点击停止可以看到程序是以相同的循环速度进行运行的,两个程序的值是一样的。并且CPU占用率接近为0%(程序较小)。
实验2:1ms VS 10ms
现在将PlcTask加快速度,将Cycle ticks修改为1ms的循环周期。
随后下载程序运行程序,点击停止,可以看到MAIN的程序明显比MAIN程序跑的要快,并且MAIN程序的值是MAIN2程序值得10倍,这样也正对应我们设置循环时间。并且CPU占用率接近为0%(程序较小)
实验3:0.1ms VS 10ms
找到Real Time,在Settings选项栏中找到“Base Time”,将基础时间片由1毫秒修改为50微秒。随后在PlcTask中的Cycle ticks中设置2个时间片,即0.1ms。
随后下载程序运行程序,点击停止,可以看到MAIN程序的值是MAIN2程序值得100倍,这样也正对应我们设置循环时间。并且CPU占用率接近为7%(程序较小)
可以看到0.1ms的循环周期大大提高了CPU的占用率,所以合理分配Task有效利用CPU的资源是很重要的。在TwinCAT中,可以将不同的Task分配到不同的核之中。
在RealTime中点击Read from target,非单核控制器可以读出实际的核数量,将PlcTask分配到CPU0,将PlcTask2分配到CPU1中。可以看到PlcTask运行在CPU0中,PlcTask2运行在CPU1中,这样就充分利用了控制器的性能。