本节摘要:IEC 61131-3的软件模型把控制系统分成配置、资源、任务、程序四层,程序由程序、功能块、函数三类组织单元构成,任务绑定决定每块代码的执行节奏。本节给出青线的多任务框架与代码组织纪律,回答"这段逻辑该放在哪、由谁多久调用一次"。
现场老工程师问新人有一句口头禅:"这段逻辑在哪个OB里?"——翻译成标准语言就是:这段代码绑在哪个任务上、多久执行一次。这句话背后就是本节要讲的软件模型。前两节解决了用什么笔写,这一节解决写在哪个抽屉、抽屉多久被拉开一次。理解它,前一章的扫描周期就从一个概念变成了可以动手分配的资源。
标准的软件模型自上而下四层。配置对应一台具体控制系统,是工程的最大边界;资源对应一个CPU及其运算能力,一台控制器可以理解为一个资源;任务定义一段程序以什么节奏与优先级执行——循环执行、按设定周期执行、还是事件触发执行;程序挂在任务下,由三类代码容器组成。
三类容器值得单独说清。函数是没有记忆的计算单元:喂进参数、吐出结果、不留现场,算一个标定换算用它。功能块是带记忆的容器:每次调用有自己的实例数据,定时器就是典型——同样的接通延时逻辑,三台电机就要三个定时器实例,各自记各自的当前值。程序是最大的容器,等价于入口,把各功能块组织起来。这个"无记忆与有记忆"的分野,是第3章数据设计、第4章设备抽象的直接基础,请务必在这节吃透。
任务表是全项目的时间宪法,第1章讲的扫描周期预算在这里落成条款。青线最终定为三层:主循环任务十毫秒,承担全部设备级逻辑——启停、互锁、报警、模式切换;五毫秒循环中断任务承担储液罐液位与膜包炉温的PID运算,保证控制周期不受主循环负载波动影响;硬件中断任务响应送瓶链高速计数的每一步事件,做瓶体追踪。三层各管一段,互不抢时。
| 任务 | 周期与触发 | 承担内容 | 预算纪律 |
|---|---|---|---|
| 主循环 | 固定10毫秒 | 设备逻辑、互锁、模式、报警 | 最长不超过7毫秒 |
| 循环中断 | 固定5毫秒 | 两路PID与模拟量标定 | 单次不超过1.5毫秒 |
| 硬件中断 | 事件触发 | 高速计数与瓶体追踪 | 单次不超过0.3毫秒 |
预算纪律比任务划分更容易被忽视。中断任务优先级高,它超时挤占主循环,主循环就抖;主循环里塞进重活,中断照样准时进来,但主循环被拖过看门狗就全线停摆——第6章那次著名的事故正是主循环被拖爆。三条纪律写进编码规范:中断里不许等待、不许做大循环、不许调用非确定时间的库函数。
容器与任务定了,还差一层"怎么摆"。青线的调用树有一条硬规矩:程序层只做编排,具体设备动作全部下沉到功能块,功能块之间不允许互相调用超过一层。这么定的理由在变更时才显现:联锁规则变了,改对应功能块一处;若逻辑散落在程序层各处,变更就变成全文件排查。第4章的模块化重构会用一次真实返工来展示不守这条纪律的代价。
变量作用域同理收紧。全局变量只留给真正全局的事——模式字、联锁总况、时钟;设备内部状态一律做功能块的实例局部量。看一段青线电机功能块的调用片段感受这个层次:
// 程序层 PLC_Main(主循环任务里被调用) Motor_FB1(Start := PB_Start, // 启动按钮 Stop := PB_Stop, // 停止按钮 Protect := Therm_OK, // 热保护健康 FB_Ctrl := Conv1_Ctrl, // 来自联锁层的指令 FB_Stat := Conv1_Stat); // 状态回传联锁层 // 启保停细节藏在 Motor_FB1 内部,主程序只见接口不见实现
主程序读起来像一张设备清单,每台电机一行调用;真正的启保停逻辑在功能块里只写一次,全线几十台电机共用。这行调用还示范了接口命名习惯:入参在左、反馈在右,评审时视线扫一行就知道一台电机的全部交割。
任务表之外还有一个不上台面的关键角色:启动任务。CPU从停机转运行、或断电恢复上电时,先执行一次启动逻辑再进入循环——保持性变量带着断电前的值回来,非保持变量清零,流程从哪个步恢复、联锁先自检还是先放行,全在启动任务里定调。启动任务的执行时长同样计入上电到就绪的时间预算,写得臃肿的启动逻辑会让每次送电都像一次完整的系统重装——青线把启动任务控制在两个扫描周期内完成,复杂的状态核对分摊到前几个主循环里做。
青线的启动纪律有两条。其一,全线设备默认静止:启动任务把所有输出清零、所有流程步复位到待机,恢复生产必须由操作员手动确认——自动"接着上次的进度跑"在产线上是大忌,谁知道停机那刻瓶子停在哪。其二,保持性变量白名单制:只有配方号、累计产量、班次统计这类"断电也不能丢"的量进保持区,白名单外一律不保持。曾经见过图省事把中间状态全设保持的项目,每次停机重启都从诡异的位置恢复,排查到怀疑人生。
启动任务平时一年跑不了几次,写坏它却每次都咬人——把它当作第五个任务认真编写与测试,是工程组织里性价比最高的保险之一。
问:任务优先级是不是越高越好? 不是,优先级是插阈权,不是荣誉。中断任务优先级高意味着随时打断主循环,滥用高优先级会让主循环周期抖动、进而让所有联锁的响应时间变得不可预测。原则是:把最小的事放进最高优先级。青线硬件中断单次预算零点三毫秒,就是防止它喧宾夺主。
问:功能块嵌套功能块,该控到几层? 青线上限两层:设备功能块可以内嵌标准指令与小函数,但设备功能块之间不嵌套,编排在程序层完成。嵌套过深的问题是排查时要在多层实例间跳转,诊断缓冲给的定位也变绕。深度换复用是设计诱惑,产线程序要的是一眼看到底的平铺清晰。
至此表达与组织都有了章法。下一章打开功能块的内部:数据类型与变量体系,墨水的分子结构。