顺序功能图(SFC)

关于顺序功能图

顺序功能图(SFC)是循环扫描 PLC 程序的状态机视图——展示当前正在执行什么,以及什么触发下一个阶段。它是 IEC 61131-3:2013 §6.5 定义的第五种编程语言,也是 IEC 60848 GRAFCET 的工程子集。**梯形图(ladder)功能块图(fbd)**描述每次扫描的组合逻辑,而 SFC 描述跨扫描的时序:哪个步骤处于激活状态、何时切换、哪些步骤并行执行。

在实际生产代码中,约 10% 的网络用 SFC 编写,但几乎所有复杂顺序机器都至少有一张 SFC 图——批次反应器、机器人单元、包装线、装配工位。此前没有优质的开源 SFC DSL:供应商 IDE(Studio 5000、TIA Portal、CODESYS)是唯一选择。Schematex 提供一个专为 AI 生成设计的 IEC 61131-3 SFC 子集。

与**状态图(state)**(用于响应式 UI 和生命周期 FSM 的 UML 状态图)的区别:SFC 具有循环扫描语义、双边框初始步、动作块限定符(N/S/R/L/D/P)以及基于线条的分支(单线 = OR,双线 = AND)。

sfc·§
↘ preview
100%
SFC: Bottle Filling SFC with 3 step(s), 2 transition(s). Bottle Filling T0 StartBtn T1 TankLevel >= 80.0 S0 Filling Done N FillValve_Closed N FillValve_Open N Confirm_Done DoneBtn → S0
UTF-8 · LF · 19 lines · 328 chars✓ parsed·3.5 ms·5.0 KB SVG

1. 第一张图

两个步骤、一个转换、一个初始标记:

sfc
step S0 [initial]
step S1
transition from: S0 to: S1: Trigger

S0 渲染为双边框矩形(IEC 初始步惯例);S1 为单边框矩形。两者之间是一条水平转换线,条件文字 Trigger 位于其右侧。

若忘记写 [initial],第一个声明的步骤会自动提升为初始步。


2. 步骤

step S_Filling [label: "Filling tank"]
  N FillValve_Open
  D Mixer_Run T#30s
  P StartChime

步骤包含:

  • ID(在图表中唯一)——用于转换和跳转。
  • 可选的 [label: "..."],用于显示名称。
  • 可选的 [initial](只允许一个)或 [final](供应商停止步,三重边框)。
  • 零个或多个动作块,向右缩进一层,每个带一个限定符字母。

3. 转换

转换声明两个步骤之间的有向链接,并附带布尔条件:

transition from: S0 to: S1: StartBtn
transition from: S1 to: S2: TankLevel >= 80.0 AND NOT EmergencyStop
transition T_Reset from: S5 to: S0: ResetBtn

条件文字为不透明字符串——Schematex 原样存储并渲染在线旁。每个转换必须有非空条件;无条件链接使用 TRUE

fromto 在文档中线性相邻的转换,渲染为步骤之间的内联线条。from/to 线性相邻的转换(例如跳回更早的步骤)渲染为图表左侧或右侧的边距箭头


4. 动作限定符

动作附加在步骤右侧,按限定符字母的规则执行:

限定符行为
N步骤激活期间保持激活(最常用)
S存储型——进入时置真,保持直到匹配的 R
R复位型——清除先前存储的动作
L时间限制型——在步骤进入后持续激活最多 T 时间
D时间延迟型——在进入后延迟 T 时间激活
P脉冲型——仅在一次 PLC 扫描中为真
P0去激活时脉冲(西门子)
P1P 的同义词(西门子)
SD存储且延迟型
DS延迟且存储型
SL存储且时间限制型

带时间参数的限定符(L、D、SD、DS、SL)需接时长字面量:

step S1
  L LimitedRun T#5s
  D DelayedRun T#2s

5. 选择分支(单线——OR)

每次扫描只有一个分支触发,由转换条件决定:

step S0 [initial]
step S_Pick

alt from: S_Pick:
  branch [priority: 1]:
    transition: IsExpressShipping
    step S_Express
      N PrepExpressBox
    transition: TRUE
  branch [priority: 2]:
    transition: IsStandardShipping
    step S_Standard
      N PrepStandardBox
    transition: TRUE
merge_to: S_Ship

step S_Ship

transition from: S0 to: S_Pick: ProductOrdered
transition from: S_Ship to: S0: Shipped

分支上下方的单水平线分别是分叉线和汇合线。每个分支以入口转换(分叉线到第一个步骤之间)开始,以出口转换(最后一个步骤到汇合线之间)结束。


6. 同步分支(双线——AND)

所有分支并发执行;图表在汇合处等待,直到每个分支完成:

sim from: S_Heat: TRUE
  branch:
    step S_Bake
      D Oven_Run T#15m
  branch:
    step S_Cool
      L Cooler_On T#5m
merge_to: S_Done: Bake_Done AND Cool_Done

分支上下方的两条平行水平线(间距 4px)是同步线。上方的共享转换(此处为 TRUE)触发分叉;下方的共享转换Bake_Done AND Cool_Done)在汇合触发前检验。


7. 跳转(循环)

目标为更早步骤的转换渲染为边距箭头:

step S0 [initial]
step S1
step S2
transition from: S0 to: S1: A
transition from: S1 to: S2: B
transition T_Reset from: S2 to: S0: ResetBtn
transition from: S2 to: S1: NOT ResetBtn

正向 S2 → S1(回边)的边距箭头在右侧;T_Reset 跳回 S0 的箭头在左侧。每个边距箭头显示目标 ID 和条件。


8. 变量

ladderfbd 共用:

var StartBtn: bool
var TankLevel: real
var BakeReady: bool
var Counter: counter
var T1: timer

在条件和动作中声明的变量不做校验——Schematex 将条件/动作正文视为不透明字符串,与 state 处理守卫和动作的方式一致。


9. v0.1 已知限制

  • 嵌套分支(alt 中嵌套 sim,sim 中嵌套 alt)可以解析,但布局折叠启发式算法较基础;深层嵌套可能出现重叠。
  • S/R 动作对虚线连接(视觉上将 S 动作与其他位置的匹配 R 相连)暂缓实现。
  • 激活步运行时指示器(当前激活步的黄色填充)暂缓实现——对浮现 PLC 运行时状态的调试集成有用。
  • GRAFCET 强制命令(仅 IEC 60848 特有功能,超出范围)。
  • 最终步使用 [final] 解析,但渲染时与初始步使用相同的双边框;IEC 三重边框惯例暂缓实现。

相关示例

来自示例库的即用场景:

sfc·§ IEC 61131-3:2013 §6.5
SFC: Bottle Filling SFC with 3 step(s), 2 transition(s). Bottle Filling T0 StartBtn T1 TankLevel >= 80.0 S0 Filling Done N FillValve_Closed N FillValve_Open N Confirm_Done DoneBtn → S0
Bottle filling sequence (SFC)
Three-step sequential function chart for a bottle-filling station — idle with valve closed, fill while tank level rises, signal done. Exercises the IEC 61131-3 §6.5 initial-step double border, N-qualified actions, and condition expressions on transitions.
manufacturing
sfc·§ IEC 61131-3:2013 §6.5
SFC: Bake and cool concurrently SFC with 5 step(s), 3 transition(s). Bake and cool concurrently TRUE Bake_Done AND Cool_Done T0 BakeReady S0 S_Heat S_Bake S_Cool S_Done N Heater_On D Oven_Run T#15m L Cooler_On T#5m N AnnounceDone NOT BakeReady → S0
Bake & cool concurrent batch (SFC)
Simultaneous-branch SFC of a batch oven that bakes (15-minute D-qualified action) and cools the chamber jacket (5-minute L-qualified action) concurrently after a heat-up phase. Both branches must complete before the converge bar fires. Exercises the IEC 61131-3 §6.5.4 double-bar simultaneous divergence and time-parameterized action qualifiers.
chemical-processing
sfc·§ IEC 61131-3:2013 §6.5
SFC: Order routing SFC with 5 step(s), 5 transition(s). Order routing IsExpressShipping TRUE IsStandardShipping TRUE T0 ProductOrdered S0 S_Pick S_Express S_Standard S_Ship N PickFromBin N PrepExpressBox N PrepStandardBox N CarrierPickup Shipped → S0
Order routing — express vs standard shipping (SFC)
Alternative-branch SFC of an order-fulfillment routing decision. After picking the product, exactly one branch fires per scan based on the leftmost-true entry transition (priority 1 = express shipping first). Both branches converge to a common shipping step. Exercises the IEC 61131-3 §6.5.4 single-bar OR semantics, branch priority annotations, and per-branch entry/exit transitions.
logistics

Found this useful?

Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.