2. 顺控与联锁的标准化建模
在 Omron Sysmac 平台上做复杂顺控,真正的难点往往不在指令本身,而在于“用哪种模型把工艺描述翻译成可编程逻辑”。同一段设备动作,用状态机写出来清晰可维护,用流程图写出来直观但容易膨胀,用 SFC 写出来结构工整却对并行分支要求高。选错模型,后期改一个条件就要动十几处。因此本节先解决一个前置问题:面对一段工艺描述,应该选哪种建模语言,以及如何把它落到 Sysmac 的编程对象上。
五种模型的定位与适用边界
可以把这五种模型按“关注点”分成三组。第一组关注状态与迁移:状态机和 SFC。状态机(State Machine)以“当前处于哪个状态、什么条件触发迁移”为核心,适合状态数量有限、迁移关系明确、需要严格互斥的场合,例如一台设备的自动/手动/回零/报警复位。SFC(顺序功能图)本质是状态机的图形化工程表达,增加了步(Step)、转移(Transition)、选择分支和并行分支的规范语义,适合多工位、多子流程并行推进的产线级顺控。
第二组关注动作顺序与判断路径:流程图。流程图不强调状态驻留,而强调“先做什么、判断后走哪条路”,适合描述初始化流程、故障排查路径、参数标定步骤这类一次性或弱状态的过程。第三组关注时间与因果:时序图和因果矩阵。时序图刻画多个信号在时间轴上的先后与重叠关系,适合气缸伸出与夹紧、伺服使能与抱闸释放这类有明确时序配合的动作;因果矩阵(Cause & Effect Matrix)则把“原因事件”与“结果动作”做成二维表,适合安全联锁、急停、多条件组合触发等场景,它的优势是穷举组合、便于评审,而不是描述顺序。
从工艺描述到可编程逻辑的转化方法
拿到一段工艺描述,不要急着打开编辑器。建议按“切分—归类—映射—验证”四步走。
第一步,切分动作单元。把描述拆成“谁在什么条件下做什么、做完后进入什么状态”。例如“上料气缸伸出到位后,夹爪闭合,延时 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 把它翻译成允许位。
Y0 := (step = CYL_OUT) AND NOT X10。这样每增加一个联锁条件就要改所有输出行,容易漏改。正确做法是把联锁收敛成统一的 permit 位,动作输出只引用 permit,新增条件只改一处。