4. 控制软件分层架构设计
复杂设备控制软件的失控,往往不是从代码错误开始的,而是从“职责放错层”开始的。一个气缸的互锁逻辑被写进了产线调度程序,一个整线节拍参数被硬编码在某个设备功能块里,结果是:改一个动作要重新验证整线,换一台设备要复制粘贴三遍。分层架构要解决的,就是让每一类变化只影响它应该在的那一层。
四层划分的核心判据:变化频率与作用范围
设备层、单元层、产线层、管理层并不是按“代码行数”或“物理距离”划分的,而是按两个维度:变化频率和作用范围。设备层对应单台设备或单个工位的动作与状态,变化最频繁(工艺微调、传感器更换、节拍优化),作用范围最小;单元层对应由若干设备组成的工艺单元(如一个装配单元、一个检测单元),变化频率中等,作用范围覆盖单元内协调;产线层对应整线的物料流、节拍平衡、生产模式切换,变化频率低,作用范围覆盖全线;管理层对应MES/ERP接口、订单、追溯、报表,变化频率最低,但作用范围最广。
一个实用的判断口诀是:“谁的变化,谁承担”。如果某个逻辑的修改只需要重新验证一台设备,它就应该在设备层;如果需要重新验证整个单元,它就应该在单元层;如果需要重新验证整线节拍,它就应该在产线层。把高频变化关在低层,是分层架构最大的工程价值。
TwinCAT工程映射:从架构到实际工程结构
分层架构不能停留在图纸上,必须落到TwinCAT工程的具体组织方式中。在TwinCAT 3中,推荐用PLC项目 + 库 + 任务三层映射来对应架构四层。
设备层映射:每类设备封装为一个功能块(FB),例如FB_Cylinder、FB_ServoAxis、FB_VacuumGripper。这些FB放在独立库Tc3_DeviceLib中,内部包含状态机、互锁、超时诊断和手动/自动切换。设备层FB只暴露Enable、Command、Status、Error等标准接口,不直接引用单元层变量。设备层通常分配1ms快速任务,保证动作响应。
单元层映射:每个工艺单元一个PRG_Unit_xxx程序,内部实例化多个设备FB,负责设备间握手、顺序协调和单元级安全。例如装配单元PRG_Unit_Assembly中,fbPick与fbPlace的握手逻辑、fbPress的力位移监控都在这一层。单元层分配5ms任务,通过MAIN调用各单元程序。
产线层映射:一个PRG_Line程序,负责物料流调度、节拍平衡、生产模式切换和整线互锁。它不直接操作设备FB,而是调用单元层暴露的Start、Stop、Reset、Status接口。产线层分配10ms任务,通过全局变量GVL_Line与各单元交换数据。
管理层映射:通过TF6420或OPC UA Server与MES通信,数据以结构体形式在GVL_MES中定义。管理层不参与实时控制,只做订单下发、状态上报和追溯数据写入。
划分原则:三条硬边界
在实际工程中,以下三条边界必须守住,否则分层会退化为“名义分层”。
- 设备层不引用单元层变量。设备FB的输入输出只使用自身接口和标准类型,不出现
GVL_Unit或GVL_Line的变量。这样设备FB才能被不同单元复用。 - 产线层不直接操作设备FB。产线层只调用单元层接口,不实例化设备FB。否则产线程序会变成“超级程序”,任何设备改动都要动产线层。
- 管理层不参与实时控制。MES下发的订单和配方通过缓冲区传递,由产线层在安全时机读取,管理层不直接写设备命令。
一个具体示例:装配单元的层间接口
假设一条装配线包含上料单元、压装单元和下料单元。设备层有FB_Cylinder(气缸)、FB_ServoAxis(伺服轴)、FB_Vacuum(真空吸盘)。单元层PRG_Unit_Press实例化fbPressCyl和fbServoZ,实现“伺服下压到位置→气缸侧推→真空吸持→伺服抬起”的顺序,并监控压装力。产线层PRG_Line调用PRG_Unit_Feed、PRG_Unit_Press、PRG_Unit_Unload的Start和Done信号,实现节拍串联。管理层通过OPC UA读取GVL_Line.LineStatus和GVL_Line.CycleCount,写入MES。
当压装工艺需要调整(例如压力阈值从2.5kN改为3.0kN),只需修改PRG_Unit_Press中的参数,重新验证压装单元即可,不影响上料和下料单元,也不影响产线层调度逻辑。这就是分层架构带来的实际收益。
常见误区与修正
误区一:按物理位置分层。把同一电柜内的设备都放在一层,忽略了逻辑职责。修正:按变化频率和作用范围分层,物理位置只影响IO映射,不影响架构分层。
误区二:管理层直接写PLC输出。MES下发“启动设备3”直接置位fbDevice3.Enable。修正:MES只下发订单和模式,由产线层判断当前状态是否允许启动,再调用单元层接口。
误区三:设备层FB包含整线节拍逻辑。例如在FB_Cylinder中写“等待上游信号”。修正:设备FB只负责自身动作和状态,握手逻辑放在单元层。
最后给出一个可执行的映射检查表,用于在TwinCAT工程中快速核对分层是否落地:
| 检查项 | 设备层 | 单元层 | 产线层 | 管理层 |
|---|---|---|---|---|
| 任务周期 | 1ms | 5ms | 10ms | 非实时/事件 |
| 主要POU | FB_Device* | PRG_Unit_* | PRG_Line | GVL_MES / TF6420 |
| 允许引用 | 自身接口 | 设备层FB | 单元层接口 | 产线层全局变量 |
| 禁止引用 | 单元/产线变量 | 产线层内部变量 | 设备层FB实例 | 设备层/单元层 |
| 变化影响范围 | 单台设备 | 单元内 | 整线 | 全厂 |
把这张表贴在工程评审的检查清单里,每次新增功能块或修改接口时对照一遍,分层架构就不会在项目压力下悄悄瓦解。