4. 控制软件分层架构设计

复杂设备控制软件的失控,往往不是从代码错误开始的,而是从“职责放错层”开始的。一个气缸的互锁逻辑被写进了产线调度程序,一个整线节拍参数被硬编码在某个设备功能块里,结果是:改一个动作要重新验证整线,换一台设备要复制粘贴三遍。分层架构要解决的,就是让每一类变化只影响它应该在的那一层。

四层划分的核心判据:变化频率与作用范围

设备层、单元层、产线层、管理层并不是按“代码行数”或“物理距离”划分的,而是按两个维度:变化频率和作用范围。设备层对应单台设备或单个工位的动作与状态,变化最频繁(工艺微调、传感器更换、节拍优化),作用范围最小;单元层对应由若干设备组成的工艺单元(如一个装配单元、一个检测单元),变化频率中等,作用范围覆盖单元内协调;产线层对应整线的物料流、节拍平衡、生产模式切换,变化频率低,作用范围覆盖全线;管理层对应MES/ERP接口、订单、追溯、报表,变化频率最低,但作用范围最广。

一个实用的判断口诀是:“谁的变化,谁承担”。如果某个逻辑的修改只需要重新验证一台设备,它就应该在设备层;如果需要重新验证整个单元,它就应该在单元层;如果需要重新验证整线节拍,它就应该在产线层。把高频变化关在低层,是分层架构最大的工程价值。

管理层 MES/ERP接口 · 订单管理 · 追溯数据 · 报表 · OEE统计 变化频率:极低 | 作用范围:全厂 | TwinCAT映射:TF6420 / OPC UA Server / ADS跨系统通信 产线层 物料流调度 · 节拍平衡 · 生产模式切换 · 整线互锁 · 报警汇总 变化频率:低 | 作用范围:整线 | TwinCAT映射:主PLC任务(10ms) / 全局变量 / 产线状态机 单元层 工艺单元协调 · 设备间握手 · 单元级安全 · 工位节拍 · 质量判定 变化频率:中 | 作用范围:单元内 | TwinCAT映射:单元FB / 独立任务(5ms) / 单元HMI 设备层 单机动作 · 气缸/伺服/传感器控制 · 设备状态机 · 故障诊断 · 手动模式 变化频率:高 | 作用范围:单台设备 | TwinCAT映射:设备FB / 快速任务(1ms) / 本地IO 变化频率递增 → 作用范围递增 → ▲ 订单/配方下发 · 状态上报 ▼ ▲ 生产指令/模式切换 · 单元状态汇总 ▼ ▲ 单元协调指令 · 设备状态/诊断 ▼

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下发的订单和配方通过缓冲区传递,由产线层在安全时机读取,管理层不直接写设备命令。
实用检查方法:在TwinCAT中打开“Cross Reference”视图,检查设备层FB是否引用了单元层或产线层变量。如果有,说明边界被打破,需要把该变量改为接口参数或移到设备层内部。

一个具体示例:装配单元的层间接口

假设一条装配线包含上料单元、压装单元和下料单元。设备层有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实例 设备层/单元层
变化影响范围 单台设备 单元内 整线 全厂

把这张表贴在工程评审的检查清单里,每次新增功能块或修改接口时对照一遍,分层架构就不会在项目压力下悄悄瓦解。