2. 顺控与联锁的标准化建模

在 Omron Sysmac 平台上做复杂顺控,真正的难点往往不在指令本身,而在于“用哪种模型把工艺描述翻译成可编程逻辑”。同一段设备动作,用状态机写出来清晰可维护,用流程图写出来直观但容易膨胀,用 SFC 写出来结构工整却对并行分支要求高。选错模型,后期改一个条件就要动十几处。因此本节先解决一个前置问题:面对一段工艺描述,应该选哪种建模语言,以及如何把它落到 Sysmac 的编程对象上。

五种模型的定位与适用边界

可以把这五种模型按“关注点”分成三组。第一组关注状态与迁移:状态机和 SFC。状态机(State Machine)以“当前处于哪个状态、什么条件触发迁移”为核心,适合状态数量有限、迁移关系明确、需要严格互斥的场合,例如一台设备的自动/手动/回零/报警复位。SFC(顺序功能图)本质是状态机的图形化工程表达,增加了步(Step)、转移(Transition)、选择分支和并行分支的规范语义,适合多工位、多子流程并行推进的产线级顺控。

第二组关注动作顺序与判断路径:流程图。流程图不强调状态驻留,而强调“先做什么、判断后走哪条路”,适合描述初始化流程、故障排查路径、参数标定步骤这类一次性或弱状态的过程。第三组关注时间与因果:时序图和因果矩阵。时序图刻画多个信号在时间轴上的先后与重叠关系,适合气缸伸出与夹紧、伺服使能与抱闸释放这类有明确时序配合的动作;因果矩阵(Cause & Effect Matrix)则把“原因事件”与“结果动作”做成二维表,适合安全联锁、急停、多条件组合触发等场景,它的优势是穷举组合、便于评审,而不是描述顺序。

工艺描述 → 建模语言 → Sysmac 编程对象 映射 工艺描述特征 状态有限、互斥 迁移条件明确 多工位并行推进 步序规范 一次性流程 判断分支为主 多信号时间配合 先后/重叠关系 多原因组合触发 安全联锁穷举 参数标定/排障 路径选择 建模语言 状态机 SFC 顺序功能图 流程图 时序图 因果矩阵 (流程图/状态机复用) Sysmac 编程对象 CASE 语句 + 枚举状态变量 状态变量、迁移条件、动作输出 SFC 程序(步/转移/并行分支) 步标志位、转移条件、动作块 梯形图 / ST 顺序段 IF/ELSIF 分支、步骤标志 定时器 TON/TOF + 互锁触点 延时、脉冲、握手信号 联锁逻辑(AND/OR/NOT 组合) 安全条件、允许位、禁止位 调试变量表 / 强制表 / 监视 在线观察状态与迁移

从工艺描述到可编程逻辑的转化方法

拿到一段工艺描述,不要急着打开编辑器。建议按“切分—归类—映射—验证”四步走。

第一步,切分动作单元。把描述拆成“谁在什么条件下做什么、做完后进入什么状态”。例如“上料气缸伸出到位后,夹爪闭合,延时 0.3 s 确认夹紧,然后机械手上升”。这里包含三个动作单元和两个确认条件。

第二步,归类到模型。动作单元之间存在严格先后且需要驻留等待的,归入状态机或 SFC;只是判断分支的,归入流程图;多个信号需要时间配合的,单独抽出来画时序图;涉及安全或禁止条件的,抽出来填因果矩阵。一个真实项目通常是混合使用,而不是只用一种。

第三步,映射到 Sysmac 对象。状态机用 CASE 语句配合枚举状态变量实现;SFC 直接用 Sysmac 的 SFC 程序,每个步对应一个步标志位,转移条件写成布尔表达式;时序配合用 TON/TOF 定时器和握手位实现;联锁条件写成独立的允许位(Permit)和禁止位(Inhibit),在动作输出前串联判断。

第四步,验证。用调试变量表在线观察状态变量和步标志位,确认迁移路径与预期一致;对联锁条件逐条强制触发,确认输出被正确禁止。

教学示例:上料工位顺控建模

假设某上料工位工艺描述为:按下启动后,气缸伸出;伸出到位传感器 X0 为 ON 后,夹爪闭合;夹紧确认 X1 为 ON 后延时 0.3 s;延时结束后机械手上升,上升到位 X2 为 ON 则本循环结束。任何时刻按下急停 X10,气缸和夹爪立即失电。

这段描述里,气缸伸出、夹爪闭合、延时、上升是四个有驻留和先后关系的状态,适合用状态机或 SFC;急停是典型的多对一联锁,适合用因果矩阵表达。下面给出状态机的核心实现片段(ST 语言,示例参数为合理假设):

TYPE eStep :
(
  IDLE      := 0,
  CYL_OUT   := 1,
  CLAMP     := 2,
  DELAY     := 3,
  LIFT_UP   := 4,
  DONE      := 5,
  ESTOP     := 99
);
END_TYPE

VAR
  step      : eStep := IDLE;
  tClamp    : TON;
  permit    : BOOL;   // 联锁允许位
END_VAR

// 联锁:急停未按下且气压正常才允许动作
permit := NOT X10 AND X11;

CASE step OF
  IDLE:
    IF Start AND permit THEN
      step := CYL_OUT;
    END_IF;

  CYL_OUT:
    Y0 := TRUE;                 // 气缸伸出
    IF NOT permit THEN step := ESTOP;
    ELSIF X0 THEN step := CLAMP;
    END_IF;

  CLAMP:
    Y1 := TRUE;                 // 夹爪闭合
    IF NOT permit THEN step := ESTOP;
    ELSIF X1 THEN
      tClamp(IN := TRUE, PT := T#300ms);
      step := DELAY;
    END_IF;

  DELAY:
    IF tClamp.Q THEN step := LIFT_UP; END_IF;

  LIFT_UP:
    Y2 := TRUE;                 // 机械手上升
    IF X2 THEN step := DONE; END_IF;

  DONE:
    Y0 := FALSE; Y1 := FALSE; Y2 := FALSE;
    step := IDLE;

  ESTOP:
    Y0 := FALSE; Y1 := FALSE; Y2 := FALSE;
    IF permit AND Reset THEN step := IDLE; END_IF;
END_CASE;

这段代码体现了状态机的三个关键点:状态互斥(同一时刻只有一个 step 值)、迁移条件显式(每个 IF 就是一条转移)、联锁独立(permit 不混在动作逻辑里,而是作为统一门控)。急停触发时,无论当前处于哪个状态,都跳到 ESTOP 并切断所有输出,这正是因果矩阵“一行原因对应多列结果”的编程体现。

因果矩阵的填写与联锁落地

因果矩阵用行表示原因事件,列表示结果动作,交叉格填“触发/禁止/延时”。以上料工位为例,可整理为下表(示例):

原因 \ 结果 气缸伸出 Y0 夹爪闭合 Y1 机械手上升 Y2 状态迁移
急停 X10 = ON 禁止 禁止 禁止 → ESTOP
气压低 X11 = OFF 禁止 禁止 禁止 → ESTOP
伸出到位 X0 = ON 保持 触发 — CYL_OUT → CLAMP
夹紧确认 X1 = ON 保持 保持 延时 0.3 s 后触发 CLAMP → DELAY → LIFT_UP
上升到位 X2 = ON 复位 复位 复位 LIFT_UP → DONE → IDLE

填表时要注意两点:一是“原因”要覆盖正常触发和异常禁止两类,不能只写正常流程;二是“结果”要写到具体输出点或状态迁移,而不是笼统写“停止”。这张表填完,联锁逻辑基本就确定了,剩下的只是用 AND/OR/NOT 把它翻译成允许位。

选型速记:有状态驻留和互斥 → 状态机/SFC;只有判断分支 → 流程图;多信号时间配合 → 时序图;多原因组合触发安全动作 → 因果矩阵。实际项目往往是“SFC 搭骨架 + 状态机写子步 + 因果矩阵管联锁 + 时序图校配合”。
常见误区:把联锁条件直接写进动作输出行,例如 Y0 := (step = CYL_OUT) AND NOT X10。这样每增加一个联锁条件就要改所有输出行,容易漏改。正确做法是把联锁收敛成统一的 permit 位,动作输出只引用 permit,新增条件只改一处。