4. 连续任务配置与优化
在 Studio 5000 Logix Designer 中,任务(Task)是控制器执行程序的基本调度单位。前面我们已经了解了周期任务和事件任务,本节聚焦第三种任务类型——连续任务(Continuous Task)。它是控制器中唯一一个“永不结束”的任务:只要控制器处于 RUN 模式,连续任务就会在周期任务和事件任务的间隙中持续运行,直到被更高优先级任务抢占。理解它的执行特性,是判断控制器扫描周期是否合理的关键。
连续任务的本质:填充空闲时间的“背景任务”
Logix 控制器采用优先级抢占式调度。每个任务都有一个优先级(1~15,数值越小优先级越高),周期任务和事件任务在触发时按优先级抢占 CPU。而连续任务没有固定周期,它始终处于“可运行”状态,只在没有更高优先级任务需要执行时才占用 CPU。换句话说,连续任务执行的是控制器扫描周期中“剩余的时间”。
这带来两个重要特性:第一,连续任务的扫描时间不固定,取决于周期任务和事件任务占用了多少时间;第二,连续任务本身不会造成控制器过载,因为它总是让位于更高优先级任务。但反过来,如果周期任务配置过多、执行时间过长,连续任务就会被严重挤压,导致其内部程序响应变慢。
创建连续任务与属性设置
在控制器组织树中右键点击“Tasks”文件夹,选择“New Task”,弹出任务属性对话框。关键设置如下:
- Name(名称):建议使用有意义的命名,如
Continuous_Main,避免使用默认的Task1。 - Type(类型):选择
Continuous。注意,一个控制器中只能有一个连续任务,如果已经存在,新建时该选项会变灰。 - Priority(优先级):连续任务的优先级通常设置为最低(数值最大,如 15),确保它不会抢占周期任务和事件任务。虽然理论上可以设高,但那样会破坏调度逻辑,不推荐。
- Watchdog(看门狗):连续任务同样有看门狗时间,默认 500ms。如果连续任务执行时间超过该值,控制器会报故障。对于连续任务,看门狗通常用于检测程序死循环或严重阻塞。
- Disable/Inhibit:可以暂时禁用任务,便于调试。
创建完成后,在连续任务下可以添加程序(Program),每个程序下再添加例程(Routine)。连续任务支持多个程序,程序之间按顺序执行。需要注意的是,连续任务内的程序没有周期任务那样的固定时间片,它们会一直执行直到被更高优先级任务打断,然后从断点继续。
连续任务对扫描周期的影响分析
控制器的扫描周期(Scan Time)是指控制器完成一轮所有任务调度所需的时间。对于包含连续任务的系统,扫描周期可以近似表示为:
扫描周期 ≈ 周期任务执行时间 + 事件任务执行时间 + 连续任务执行时间 + 系统开销
其中,周期任务和事件任务的时间是相对固定的(由配置决定),而连续任务的时间是“剩余时间”。因此,连续任务实际上不会增加扫描周期的上限,但它会占用所有未被高优先级任务使用的 CPU 时间。如果周期任务配置过多,连续任务被压缩,其内部程序的响应就会变慢。
举个例子:假设控制器扫描周期为 20ms,其中周期任务占用 8ms,事件任务占用 2ms,系统开销 1ms,那么连续任务可用时间为 9ms。如果连续任务内的程序需要 15ms 才能执行完一轮,那么它需要跨越多个扫描周期才能完成,导致逻辑响应延迟。此时应优化连续任务内的程序,或调整周期任务配置。
连续任务配置实战
下面以一个典型的包装线控制为例,完成连续任务的配置与验证。假设控制器为 1756-L83E,已有周期任务 Fast_Logic(周期 10ms,优先级 10)和事件任务 Fault_Handler(优先级 5)。现在需要添加连续任务用于处理非实时性逻辑,如状态显示、数据记录和 HMI 通信。
操作步骤:
- 在 Controller Organizer 中右键点击“Tasks”,选择“New Task”。
- 名称输入
Continuous_Process,类型选择Continuous,优先级设为 15,看门狗保持 500ms。 - 点击“OK”后,在
Continuous_Process下新建程序Prog_Display,语言选择 Ladder Diagram。 - 在
Prog_Display中创建例程MainRoutine,编写状态显示和数据记录逻辑。 - 下载程序到控制器,切换到 RUN 模式。
- 打开 Controller Properties → Task 选项卡,观察各任务的执行时间。
验证与判断:在 Task 选项卡中,可以看到 Continuous_Process 的 Actual Scan Time 大约在 3~6ms 之间波动,而 Fast_Logic 稳定在 8ms 左右。如果连续任务的执行时间接近看门狗设定值,或者周期任务的 Max Scan Time 超过周期设定值,说明控制器负载过高,需要优化程序或调整任务配置。