AC500(Automation Builder,CODESYS 内核)一共有 4 种任务:自由运行 Freewheeling、周期 Cyclic、事件 Event、状态 StatusABB。周期任务 Cyclic:按设定固定时间间隔触发执行,带优先级,支持被更高优先级任务抢占,是运动控制、PID、高速逻辑的核心任务,区别于自由运行任务。
一、周期任务关键配置参数
Interval(周期时间):设定理论触发间隔,例如
t#10ms;AC500‑V3 最小可达 1ms,部分运动场景支持 500μsABB。Priority 优先级:0~31,数字越小优先级越高;高优先级任务可以打断低优先级周期任务、自由运行任务。
Watchdog 看门狗:任务允许最大执行时间;任务实际运行时间超过看门狗时间 → CPU 报任务溢出故障,应用停止ABB。
Missed cycle behavior
Next(默认):错过本周期,放弃本次,等待下一个定时点;会丢扫描。ASAP:CPU 空闲立刻补跑错过的任务,容易任务堆积抖动变大ABB。调用列表:任务下按顺序调用 1 个或多个 Program(POU);POU 内部可用 JSR 调用子例程。
可以同时创建多个不同周期、不同优先级的周期任务,例如:1ms 运动任务、10ms 逻辑任务、100ms 人机交互任务。
二、一次周期任务完整执行时序流程
系统定时器按照
Interval计时,到达时间点产生任务调度请求。
定时时间到达,产生任务调度请求
如果此刻 CPU 正在执行更高优先级任务:本周期任务进入任务队列排队等待。
如果当前 CPU 运行更低优先级任务(自由运行 / 低优先级周期任务):操作系统执行完当前正在执行的单条指令,保存现场(寄存器、堆栈、程序断点),抢占打断低优先级任务。
任务开始:读取输入缓冲区周期任务任务开始瞬间,统一拷贝 I/O 输入缓冲区数据到任务内部;本任务整个执行过程中,输入变量不再跟随硬件实时刷新,模拟传统 PLC “输入采样” 行为ABB。
注意:这是本任务内部的副本;其他任务读写同一个 IO 标签,仍然可以读到最新硬件值,任务之间 IO 副本互相独立。
执行本任务下所有 POU 程序
按照任务配置里 POU 调用顺序依次执行;
POU 内部梯形图从上向下、SCL 从上到下执行;JSR 跳转子例程,执行完毕返回断点;
运行过程中,更高优先级任务(事件任务、更高优先级周期任务)还可以再次抢占本周期任务,保存现场,执行高优先级任务,结束后回到断点继续执行,不是从头重新跑本周期任务。
任务执行结束:输出数据写入输出缓冲区用户逻辑运算完成,任务结束时刻,把任务内部输出变量,批量写入 IO 输出缓冲区;真正硬件总线发送,由总线周期任务(Bus‑Cycle Task)完成,不一定立刻输出到端子ABB。
任务退出,释放 CPU 时间片CPU 回到被打断的低优先级任务断点继续运行;周期任务进入休眠,等待下一次定时时间到来。
重点:周期任务的 Interval 是两次触发请求的时间间隔,不是 “任务执行完之后再等待 Interval”。 例:设定 10ms 周期;任务实际运行 3ms;不是 “跑完等 7ms”,而是系统每 10ms 就发起一次任务调度请求。
三、IO 刷新机制
AC500 有一个独立概念:总线周期任务 Bus‑Cycle Task,负责真实和硬件 / 总线交换 IO 数据(本地模块、EtherCAT、PROFINET)ABB。
普通周期任务:任务开头复制总线任务已经更新好的输入缓冲区;任务结束把输出写到输出缓冲区。
真正物理 IO 读写发生在总线周期任务,不在你的应用周期任务内部。
如果你的逻辑周期任务和总线周期时间不一致:会存在 IO 数据延迟。
EtherCAT 运动控制强烈建议:运动逻辑 POU 直接放在 EtherCAT 总线周期任务中,保证逻辑和总线同步,消除抖动eero。
通俗理解: 应用周期任务拿的是 “总线任务已经采集好的快照”;应用算出输出交给缓冲区,由总线任务去发给硬件。
四、三个重要现象:抖动、周期溢出、任务抢占
1、周期抖动 Jitter
理论 10ms 周期,实际每次触发间隔会有微小偏差(例如 9.7~10.4ms),叫抖动。 产生原因:中断抢占、通讯负载、其他任务占用 CPU。运动控制场景抖动必须尽量小,要把运动任务设置最高优先级,任务内部不要放通讯、MSG、大运算。
抖动数值可以在任务看门狗监控页面在线查看ABB。
2、周期溢出
任务实际执行时间>设定 Interval 周期时间例如周期 10ms,任务每次要跑 13ms。
模式 Next:丢掉本次扫描,等待下一个 10ms 时间点执行,任务不会停机,但逻辑会丢周期。
模式 ASAP:CPU 一有空就立刻跑,任务不断堆积,抖动恶化。
只有当执行时间超过看门狗时间,PLC 才会故障停机。
工程准则:周期任务最坏执行时间 ≤ 周期时间的 50%,留出余量给中断、通讯。
3、多周期任务抢占示例
TaskA:周期 10ms,优先级 2(高)
TaskB:周期 50ms,优先级 10(低)
TaskB 正在运行;10ms 定时到,TaskA 触发;
系统打断 TaskB,保存断点;完整执行 TaskA;
TaskA 结束;回到 TaskB 被打断的位置继续执行,TaskB 不会从头重新扫描。
五、周期任务 vs 自由运行任务 vs 事件任务对比
表格
| 项目 | 周期任务 Cyclic | 自由运行 Freewheeling | 事件任务 Event(硬件中断) |
|---|---|---|---|
| 触发条件 | 固定时间间隔 Interval | 上一轮执行完毕立刻再次执行 | 硬件边沿 / BOOL 上升沿触发 |
| 周期确定性 | 高,受抢占抖动影响 | 完全不确定,随程序负载变化 | 异步,事件到来即触发 |
| 优先级 | 0‑31,可抢占 | 默认最低优先级 | 高优先级,可抢占周期任务 |
| IO 行为 | 任务起止做 IO 快照拷贝 | 任务起止 IO 快照拷贝 | 任务起止 IO 快照拷贝 |
| 典型用途 | PID 调节、运动控制、定时逻辑 | 主工艺逻辑,大流程处理 | 高速硬件中断、事件响应 |
六、实操编程要点
周期任务内部尽量简短,禁止放大的 Modbus/TCP 通讯、文件读写,这类逻辑放到低优先级自由运行任务。
多任务共享全局变量:周期任务被打断时,高优先级任务修改全局变量会造成数据撕裂;解决:任务开头拷贝副本,逻辑全部使用副本。
EtherCAT 运动:运动轴的工艺 POU,放在 EtherCAT 总线周期任务,不要放在普通自定义周期任务,保证总线同步。
看门狗设置:看门狗时间建议设置为周期时间的 3‑5 倍,防止偶然抖动直接停机。
不要把周期任务 Interval 设置小于硬件总线周期,否则 IO 数据还没更新,读到旧数据。
若需要传统 PLC“输入采样‑程序‑输出刷新” 确定行为:就全部逻辑放在同一个周期任务,不要跨任务读写 IO。
七、和西门子 S7‑1200 循环、三菱 FX5U 扫描对比
S7‑1200:OB1 固定循环扫描;硬件中断 OB 打断 OB1;整个 CPU 只有一套全局 IO 映像区,所有 OB 共用。
FX5U:单循环扫描;中断 I 指针在 END 之后执行;全局统一 IO 映像。
ABB AC500:每个任务在自己任务起止做 IO 快照;不同任务的 IO 快照副本相互独立,这是最容易踩坑的区别。





