2. SFC(顺序功能图)核心概念:步(Step)、转换(Transition)、动作(Action)的深度解析

好,咱们今天来啃SFC最核心的三个概念。步、转换、动作。

这三个东西,说白了就是SFC的“骨架”、“神经”和“肌肉”。你把这仨搞明白了,SFC就算入门了。我在现场调试的时候,见过太多人把梯形图玩得飞起,一换SFC就懵。为什么?因为思维没转过来。

2.1 步(Step)—— 系统的“静止快照”

什么是步?

步,代表系统的一个稳定状态。在这个状态下,系统要么在干某件事,要么在等某个条件。它不处理逻辑跳转,只负责“待着”或者“干活”。

步的两个核心特征:

  • 活性(Active): 步被激活时,它关联的动作才会执行。步不激活,动作就是死的。
  • 互斥性: 正常情况下,同一时刻只有一个步是激活的(除了初始步和并行分支)。

重要: 步的编号必须是唯一的。我见过有人图省事,把步编号写成1、2、3、1、2、3……结果程序跑飞了,查了三天。血的教训。

咱们用个简单的例子。一个气缸的伸出和缩回,可以拆成两个步:

  • 步1:气缸伸出到位
  • 步2:气缸缩回到位

你看,每个步都代表一个“静止”的状态。系统不会在步里“跳来跳去”,它只会在步里等待转换条件。

2.2 转换(Transition)—— 系统的“神经触发”

转换,就是连接步与步之间的那条线。它决定了系统什么时候从一个步跳到下一个步。

转换的三大要素:

  • 条件表达式: 一个布尔逻辑,真则跳转,假则等待。
  • 方向性: 转换是有方向的,从上一个步指向下一个步。
  • 瞬时性: 转换本身不消耗时间。条件满足的瞬间,系统就切换了。

我的习惯: 转换条件尽量写得“干净”。比如用“传感器信号 AND 延时完成”,别把一堆乱七八糟的逻辑塞进去。否则后期维护,你自己都看不懂。

为什么会这样?因为转换条件一旦复杂,调试的时候你根本不知道是哪个子条件没满足。我曾经在一个项目里,把“气缸伸出到位 AND 夹爪夹紧 AND 安全门关闭”写在一个转换里。结果设备不动了,我排查了整整一个下午,最后发现是安全门的一个微动开关接触不良。从那以后,我坚持把复杂条件拆成多个中间变量。

2.3 动作(Action)—— 系统的“执行肌肉”

动作,就是步被激活时,系统要干的具体事情。比如:置位一个输出、调用一个函数、启动一个定时器。

动作的四种常见类型:

类型 说明 示例
N(非存储型) 步激活时执行,步离开时复位 点亮指示灯
S(存储型) 步激活时置位,需要手动复位 启动电机
D(延时型) 步激活后延时执行 延时3秒后打开阀门
L(限时型) 步激活后执行指定时长 蜂鸣器响2秒

注意: 存储型动作(S)一定要有对应的复位逻辑。否则步离开了,动作还在执行,设备可能出大问题。我见过一个案例,操作员按了急停,但因为某个S动作没复位,电机还在转……嗯,后果你们懂的。

2.4 三者的关系——一张图说清楚

下面这张图,是我用SVG画的,把步、转换、动作的关系展示得明明白白。

步1 气缸伸出 动作:N型 置位Y0 转换条件 X0 = ON 步2 气缸缩回 动作:N型 复位Y0 步(Step) 转换(Transition) 动作(Action)

你看,步1激活时,执行动作“置位Y0”。当转换条件“X0 = ON”满足,系统瞬间切换到步2,步1失活,动作复位,步2激活并执行“复位Y0”。

这就是SFC最基础的“步-转换-动作”模型。你想想看,是不是比梯形图直观多了?

2.5 实战中的避坑指南

我曾经踩过的坑:

  • 转换条件闪烁: 传感器抖动导致转换条件在1秒内反复满足和消失,系统在步之间来回跳。解决方案:加一个20ms的延时滤波。
  • 动作未复位: 用了S型动作,但忘记在后续步里写复位逻辑。结果设备停不下来。解决方案:每个S动作配一个对应的R(复位)动作。
  • 步编号冲突: 复制粘贴代码时忘了改步号,导致两个步共用一个编号。程序直接报错。解决方案:养成习惯,每新建一个步就立刻改编号。

我的建议: 刚开始学SFC,别急着写复杂逻辑。先画一个“步-转换-动作”的草图,哪怕只有三步。跑通了,再慢慢加。我当年就是靠这个笨办法,一步步从梯形图思维转到SFC思维的。

好了,步、转换、动作这三个核心概念,咱们就聊到这儿。记住:步是状态,转换是条件,动作是执行。三者缺一不可,顺序不能乱。你把这个模型刻在脑子里,后面学并行分支、选择分支、跳转这些高级功能,就会轻松很多。


专注资料整理