Codesys软PLC的任务优先级设置
在Codesys软PLC控制系统中,合理配置任务优先级是保证程序实时性和稳定性的核心步骤。如果优先级设置错误,可能会导致关键动作响应延迟或系统通讯卡顿。本指南将直接展示如何在Codesys中创建任务、分配优先级,并解释抢占机制。
一、 理解任务优先级的基本逻辑
Codesys遵循“数值越大,优先级越高”的原则。当高优先级任务的条件满足时,CPU会立即中断当前正在执行的低优先级任务,转而去处理高优先级任务,处理完后再返回中断处继续执行。
核心公式如下,表示在单核CPU下,所有任务的单次最大执行时间总和必须小于最低优先级任务的周期,否则会导致系统过载:
$$ T_{Cycle\_Min} \ge \sum_{i=1}^{n} (T_{Exec\_Max\_i} + T_{Overhead\_i}) $$
其中 $T_{Exec\_Max}$ 为程序最大执行时间,$T_{Overhead}$ 为系统调度开销时间。
二、 配置任务优先级的实操步骤
- 打开 Codesys项目树。
- 双击
Application下的任务配置(Task Configuration)选项,打开任务设置窗口。 - 右键点击左侧的任务列表区域,选择
添加对象->任务。 - 输入新任务的名称,例如
FastTask,按下回车键确认。 - 选中新创建的
FastTask,在右侧属性窗口中找到优先级(Priority)一栏。 - 输入优先级数值。例如,输入
20(通常基准任务优先级设为10左右,数值越高越优先)。 - 设置任务类型。在
类型下拉菜单中选择循环(Cyclic)或自由运行(Freewheeling)。 - 配置循环时间。点击
间隔字段,输入时间值(如1ms),确保时间单位选择为ms。 - 关联程序组织单元(POU)。双击
任务配置界面下方的调用配置(Call Configuration)表格区域。 - 点击表格中的
<添加调用>按钮。 - 选择需要在该任务下运行的程序(例如
PLC_PRG或Motion_Control)。 - 保存项目并下载到PLC进行测试。
三、 任务抢占机制演示
为了更直观地理解高优先级任务如何“插队”,下方流程图展示了一个典型的抢占场景。假设低优先级任务正在运行,此时高优先级任务被触发。
sequenceDiagram
autonumber
participant CPU as "PLC CPU"
participant Low as "低优先级任务\n(优先级: 5)"
participant High as "高优先级任务\n(优先级: 15)"
Low->>CPU: 开始执行周期
Note over Low: 正在运行常规逻辑
High->>CPU: 触发信号到达 (例如: 定时器到时)
CPU-->>Low: 暂停当前执行 (保存现场)
CPU-->>High: 抢占 CPU 资源
High->>CPU: 执行关键逻辑 (耗时: 0.5ms)
High-->>CPU: 执行完毕
CPU-->>Low: 恢复现场 (返回断点)
Low->>CPU: 继续执行剩余逻辑
Low->>CPU: 周期结束
四、 推荐的优先级与周期配置
根据不同的工业控制需求,建议按照下表分配任务优先级。请勿盲目将所有任务优先级都设置为最高,这会导致低优先级的通讯或人机界面卡死。
| 任务类型 | 推荐优先级 | 典型周期 | 适用场景 |
|---|---|---|---|
| 紧急IO处理 | 20 - 31 | 0.1 ms - 1 ms | 高速计数器、急停逻辑、精密运动控制 |
| 标准控制逻辑 | 10 - 15 | 1 ms - 10 ms | 主工艺流程、PID调节、基础逻辑 |
| 通讯与后台 | 1 - 8 | 10 ms - 100 ms | Modbus/TCP通讯、数据记录、HMI刷新 |
五、 看门狗设置与系统保护
设置了高优先级任务后,必须防止因程序死循环或执行时间过长导致系统“假死”。看门狗用于监控任务的实际运行时间是否超时。
- 打开
任务配置界面。 - 选中需要监控的任务(如
FastTask)。 - 勾选
看门狗(Watchdog)复选框。 - 设置
看门狗时间。- 一般建议设置为任务周期的 $2$ 到 $5$ 倍。
- 计算公式参考:$T_{Watchdog} = T_{Interval} \times SafetyFactor$。
- 例如,周期为 $1$ ms,安全系数为 $4$,则输入
4ms。
- 启用
看门狗动作,选择停机(Stop)或跳过周期(Skip Cycle)。对于关键安全任务,建议选择停机以强制设备进入安全状态。
六、 常见问题排查
如果发现PLC运行不正常,请按以下顺序排查:
- 检查
资源选项卡下的PLC浏览器。 - 查看
任务运行时间(Task Runtime)统计。 - 对比
最大运行时间(Max Runtime)是否接近或超过任务周期。 - 确认 低优先级任务的
最大运行时间是否被高优先级任务频繁打断导致溢出。
如果高优先级任务计算量过大,它会长期独占CPU,造成低优先级任务“饿死”。解决方法是降低高优先级任务的计算复杂度,或减小高优先级任务的调用频率。

暂无评论,快来抢沙发吧!