☰
PLC顺序功能图SFC从入门到实战:结构、绘图规则与调试避坑指南
2026/10/3 11:40:48 网站建设 项目流程

做PLC项目的朋友,第一次接触顺序功能图(SFC)时,很多人都会觉得它长得像流程图,但又比流程图严谨得多。顺序功能图的价值,是把一个复杂的顺序控制过程,拆成一个个“步”和“转换条件”,让PLC像走马灯一样,一步一个脚印地往下执行。我早年做一个多工位装配设备,流程逻辑越改越乱,梯形图叠了几百行,现场动不动就卡住,后来痛下决心把所有流程改成SFC重新梳理,才真正体会到这种语言的威力。这篇内容适合所有想入门SFC、或者已经在用但总被各种分支结构绕晕的同行,我把基本结构、绘图规则、实操案例和踩过的坑一次性讲清楚。

1. 顺序功能图到底解决什么问题

1.1 什么是顺序功能图(SFC)

顺序功能图,英文全称Sequential Function Chart,缩写SFC,是IEC 61131-3标准规定的PLC编程语言之一,和梯形图、结构化文本、功能块图、指令表并列。它最核心的思想,就是“状态驱动”。一个设备的整个运行过程,可以看成若干个稳定状态,比如“待机”“夹紧”“进给”“退回”“完成”;设备从一个状态切换到下一个状态,靠的是明确的转换条件,比如“夹紧到位”“延时5秒”“按下启动”。

这和梯形图最大的区别在于:梯形图是“扫描所有条件、同时执行所有输出”的思路,而SFC是“当前只有一个或几个状态处于激活状态,只有激活状态里的动作才执行”。这样说可能有点抽象,你可以把它想象成地铁线路图:列车当前停在哪一站是确定的,你关心的只是这一站和下一站,而不是整条线路上所有站点的状态。SFC就是让PLC以同样的方式去“走流程”。

从工程经验来看,当控制流程超过20步,或者流程存在多个分支、需要频繁改动时,梯形图的可维护性会急剧下降。我见过有人用梯形图写一条产线流程,程序中到处都是M继电器互锁,改一个动作要牵连十几个触点,审图时候脑袋都大。而SFC把流程画出来之后,步与步之间的先后关系一目了然,改动一个分支就像改流程图一样直观,这也是我为什么强烈推荐做顺序控制优先考虑SFC。

1.2 为什么需要SFC:和梯形图的区别

很多工程师习惯用梯形图,是因为它贴近继电器控制回路,简单可靠。但梯形图本质上是“并行扫描”的模型,它每个扫描周期都会从左母线到右母线把所有网络扫一遍,所有满足条件的线圈都会被同时刷新。这在逻辑上其实等于“所有状态同时存在”,流程控制全靠工程师自己用线圈和触点搭出先后关系,复杂了以后非常容易互相干扰。

SFC则完全不同。它天然是“串行激活”的模型,某一时刻只有少数几个步处于活动状态,只有活动步对应的动作才会被执行。这种模型天然适合描述顺序控制,也天然避免了梯形图里那种“输出互相打架”的隐患。我用一个例子说明:一个气缸进给动作,梯形图里你需要在初始位置传感器为ON且按下启动时输出进给阀,还要在到位传感器为ON时停止进给;如果中间穿插了手动、自动、复位等模式,梯形图就要把所有模式的条件全部叠加起来,很容易漏条件。换成SFC,每个模式可以单独做一个分支,甚至单独做一个SFC程序,问题一下子就清晰了。

当然,SFC并不是万能的,它不是用来替代所有梯形图逻辑的。比如一些纯组合逻辑的互锁、急停、报警处理,梯形图或者功能块图反而更合适。更合理的做法是:设备的安全链、手自动切换、报警汇总用梯形图,而核心的工艺顺序用SFC。这种“外圈梯形图 + 内圈SFC”的组合,是我在实际项目中最常用的架构。

2. 顺序功能图的核心组成元素与绘图规则

2.1 三个核心元素:步、转换、有向连线

SFC的基本元素只有三个,看起来都很简单,但规则很严谨。

第一个是“步”,画成一个矩形框。步表示系统的一个稳定状态,程序运行时,某个步要么是“活动步”,要么是“非活动步”。活动步对应的动作才会执行。特殊的步叫“初始步”,用双线矩形表示,它代表系统上电或程序开始运行时所处的状态。一个SFC必须至少有一个初始步,而且通常只能有一个。初始步的作用非常重要,它决定了系统冷启动时先停在什么位置,如果初始步没有设计好,整套流程可能上电就乱跳。

第二个是“转换”,画成步与步之间的一条短横线,旁边标注转换条件。转换的前后都有步,它表示“当前面的步处于活动状态,并且转换条件为真时,这一步结束,下一步开始”。转换条件本质上就是一个布尔表达式,比如I0.1、M100、T0的常开触点。转换的先后顺序就是流程的推进顺序,所以条件设计一定要覆盖所有可能情况,避免流程卡住或者跳跃。

第三个是“有向连线”,也就是把步和转换串起来的那条带方向线段。在SFC中,连接方向默认是从上到下,所以从上往下的线可以省略箭头;但如果画循环回路或者从下往上跳转,必须明确加箭头表示方向,否则读图的人很容易误解流程走向。

2.2 动作的两种表示方式

步本身只是状态,真正要干活的是“动作”。动作一般画在步的右边,用一个矩形框和步连接,里面写动作名称或者功能块调用。动作有两种常见的表示方式:集中表示和分散表示。集中表示是把这一步要执行的所有动作都画在同一个大框里;分散表示则是把每个动作单独画一个小框。实际工程中我更常用分散表示,因为每个动作可以单独加执行条件和限定符,调试时也更容易盯着看。

动作限定符是IEC 61131-3里的一个重要概念,常见的有N(非存储,步活动期间一直执行)、S(置位,步激活后一直保持,直到用R复位)、R(复位标志位)、P(脉冲,只执行一个扫描周期)、L(限时,步活动后仅执行一段时间)、D(延迟,步活动后延时再执行)。我用得最多的是N、S、R三种。

比如控制一个夹紧气缸,如果要求“夹紧”动作在步活动期间一直通电保持,我会用N动作;如果要求“得到某个标志”并让它在后续几个步骤里都保持,那就用S动作,等流程结束时再用R动作复位。对初学者来说,先掌握N、S、R就够了,其他限定符遇到具体场合再翻手册。

2.3 基本绘图规则:哪些雷不能踩

SFC的绘图规则其实比大家想象得严格,编译不报错不代表逻辑正确,但编译报错基本都逃不出这几条:

步和步之间不能直接相连,中间必须要有转换。如果两个步直接连在一起,流程就没有任何判断条件,系统会瞬间跳过去,这显然不合理。同理,转换和转换之间也不能直接相连,中间必须要有步,否则两个转换条件同时满足时,系统不知道该停在哪个状态。

有向连线必须正确方向。系统默认从上往下执行,所有向下方向的连线都可以不画箭头,但任何从下往上的跳转、回路、合并,都要用箭头明确标出方向。我在检查别人的SFC程序时,第一件事就是找箭头,箭头画错或者漏画的地方,往往就是逻辑卡死的地方。

初始步必须存在且唯一。这是SFC编译器的硬性要求。有些平台的SFC支持多初始状态,但工程上我强烈建议坚持“单一初始步”,因为多个初始步意味着系统有多个入口状态,状态容易混乱,调试和排查都会麻烦很多。

每个转换条件必须明确求值。说白了,转换条件不能模棱两可。比如你写一个“X0”作为条件,意味着X0为ON时转换成立;如果你写“1=1”表示无条件转换,那就代表前一步激活的瞬间就会跳到下一步。无条件转换不是不能用,但一定要确认自己知道它意味着什么,否则很容易出现“步像流星一样一闪而过”的现象。

3. 顺序功能图的5种基本结构图解

3.1 单序列:一根筋走到底

单序列是最简单的SFC结构,整个流程从初始步开始,一个转换接一个步,按顺序执行到底,没有分叉,没有跳转,最后再回到初始步。这种结构适合那些工艺路线完全固定的设备,比如最简单的传输带启动、加工、停止。

单序列虽然简单,但工程上也要注意几个细节。首先是初始步的定义,初始步是整个序列的“起点”,也是流程结束后的“归宿”,它的动作要负责把系统恢复到安全状态。其次是每一步的转换条件,必须保证它们依次能够满足,否则流程会停在某个中间步骤上,现场工人只能手动切换模式去恢复。

我见过一个翻车案例:有台设备在自动运行过程中突然断电,恢复供电后SFC回到了初始步,但初始步里没有做输出复位和位置判断,结果设备带着旧的执行状态重新启动,气缸直接撞到机械限位。从那以后我的初始步里永远会做两件事:复位所有S置位的动作和标志,然后等待“系统准备好”的条件,确认无危险后再进入下一步。

3.2 选择分支与合并:同一时刻只能走一条路

选择分支,也叫选择性分支,解决的是“条件分叉”问题:当某一步完成之后,根据不同的条件,流程会进入不同的分支,但这些分支是互斥的,同一时刻只能选一条执行。画法上,选择分支的起点是一条单横线,从上方步引出后分成多个分支,每个分支有一个独立的转换条件;合并的地方也是一条单横线,几个分支汇合后再进入公共的下一步。

这里最需要注意的是“互斥”二字。工程师经常犯的错,是多个分支转换条件写得有重叠,比如分支A的条件是“X0为ON”,分支B的条件是“X0为ON且M10为ON”,当X0和M10都为ON时,理论上A和B两个条件都成立,系统到底进哪个分支就说不清了。不同平台的处理方式不同,有些按分支顺序优先,有些直接报错或行为不可预测。

我的习惯是给每个分支的转换条件补全互斥项,明确写成“X0为ON且M10为OFF”和“X0为ON且M10为ON”,保证任意时刻最多只有一个分支条件能够成立。实际设备里常见的选择分支,比如“手动/自动切换”“有工件/无工件分别处理”“正常流程/故障处理”,都可以用这种结构来表达。合并的时候也要注意:只要某一条分支跑完了,并且分支末端的转换条件满足,流程就可以合并到公共步,不需要等其他分支,因为其他分支本来就没有激活。

3.3 并行分支与合并:几个分支同时开工

并行分支,也叫并发序列,解决的是“同一时间需要同时做几件事”的问题。比如一个设备要求“进给机构前进的同时,夹紧机构夹紧”,这两个动作互不依赖,可以并行执行。画法上,并行分支的起点是一条双横线,上方通常有一个公共转换条件;条件满足后,双横线下方同时激活多个分支,这些分支是“同时被激活”的,各走各的进度。合并的地方也是一条双横线,规则和选择分支正好相反——必须等所有分支的最后一个步都执行完,并且每个分支末端的转换条件都满足,流程才能汇合到公共下一步。

并行分支最容易出问题的点就在合并处,也就是“等待同步”这一步。比如三个分支,其中两个很快就跑完了,第三个分支因为某个传感器没到位一直卡着,那整个流程就会一直停在双横线上面,看起来就像“程序死机了”。其实不是死机,是并行合并的同步等待机制在起作用。

处理这种问题,除了确保每个分支的转换条件都能可靠满足之外,还要在设计阶段考虑“某个分支如果一直不满足怎么办”。常见的做法是:给并行分支里的每个末端转换条件加超时监控,一旦超时触发报警,操作员能看到是哪个分支卡住了;或者在某些场合有意设计成“短延迟后强制合并”,但这需要工艺上允许,不能乱用。选择分支的合并用单横线、并行分支的合并用双横线,这个一定不能搞混,画错之后编译可能通过,但调试时行为会非常诡异。

3.4 跳转与循环:不走寻常路

跳转和循环,本质上是单序列的变体,但可以大幅简化流程结构。

跳转,是指从当前步/转换,直接连接到后面某个非相邻的步,跳过中间一些步骤。典型场景是“故障处理”或“快速启动”,比如流程正常走第10步时按下急停,系统跳转到第20步做复位,就不需要把中间所有步骤都画出来。跳转的箭头一定要标清楚,因为它是从下方连到上方的反向路径,或者跨越多个步骤的长距离路径,不标箭头的话读图完全没法看。

循环,是指流程结束后回到前面的某个步,重新执行一段逻辑,通常用于“周期运行”的设备。最常见的是回到初始步,表示一个完整周期结束;也有的会回到中间某个步,比如“重复三次灌装”的逻辑,每灌完一次跳回灌装开始步,用一个计数器做循环退出条件。我在实际项目中,会把循环回跳和计数器配合使用,计数器放在转换条件里,例如“计数小于3时跳回准备步,计数等于3时往下走”。

跳转和循环虽然在SFC标准里不算独立结构,但熟练掌握它们,能让图纸上的流程大大简化。唯一的提醒是:跳转太多会导致SFC图形像“蜘蛛网”,可读性下降。如果一张SFC图里跳转箭头超过三五个,我会考虑是不是流程划分粗了,应该把逻辑拆成多个SFC或者使用更合理的复用结构。

3.5 复杂结构怎么组合

实际设备很少只用一种基本结构,更多时候是把单序列、选择分支、并行分支、跳转和循环组合在一起。组合的关键是先搭骨架、再填细节。我的习惯是:

先用自然语言把工艺流程写成一段话,找出里面的顺序段、条件分支和并行段;然后把并行结构框架搭出来,用双横线确定并行区域;接着在并行区域内部,把每个分支用单序列细化;最后把一些特殊情况,比如故障、急停、重试,用跳转或循环补上。

这里有一个工程上很实用的建议:并行结构和选择结构尽量不要交叉嵌套得太深,能分层的就分层。比如并行分支内部某条分支再套选择分支,是可接受的;但如果在选择分支里又套并行分支,并行分支里又套选择分支,图形就会变得非常难读,而且编译器或者解释器在扫描到这种深层嵌套时,行为也不容易把握。我一般会把“嵌套超过三层”的结构拆成多个SFC程序,或者用“宏步”封装成子模块,保证主图永远清晰。IEC标准里虽然没有强制要求,但维护性角度上,越简单越好。

4. 实操案例:三台电机顺序启动停止控制

4.1 控制要求与I/O分配

空讲理论没意思,下面用三台电机顺序启动、逆序停止的案例,完整走一遍SFC的设计流程。这个案例虽小,但把单序列、定时器、循环回跳这些关键点全带出来了,适合作为练手项目。

控制要求是这样的:按下启动按钮后,电机M1启动;5秒后M2自动启动;再过5秒后M3自动启动;三台电机全部启动后,按下停止按钮,M3先停止;5秒后M2停止;再过5秒后M1停止;全部停止后自动回到初始状态,等待下一次启动。

I/O分配很简单,输入两个按钮,输出三个接触器输出点:

符号名地址示意类型说明
StartX0或I0.0输入启动按钮,常开触点
StopX1或I0.1输入停止按钮,常开触点
M1Y0或Q0.0输出电机1接触器
M2Y1或Q0.1输出电机2接触器
M3Y2或Q0.2输出电机3接触器

定时器方面,需要4个,分别用于M1启动到M2启动的5秒延时、M2启动到M3启动的5秒延时、M3停止到M2停止的5秒延时、M2停止到M1停止的5秒延时。不同平台定时器编号写法不同,后续步骤中用“T0”“T1”“T2”“T3”代称。

4.2 画SFC图:一步步来

我把这个流程拆成7个步,从S0到S6:

S0是初始步,双线矩形,系统上电后停在这里,等待启动。S0的活动步动作是:M1、M2、M3全部为OFF,定时器全部复位。转换条件:Start为ON。

S1是“启动M1”步,动作是M1输出为ON,同时启动定时器T0,计时5秒。转换条件:T0定时时间到。

S2是“启动M2”步,动作是M2输出为ON,同时启动定时器T1,计时5秒。转换条件:T1定时时间到。

S3是“启动M3”步,动作是M3输出为ON。转换条件:Stop信号为ON。也就是说,三台电机全部启动之后,系统停在S3,等待操作员按下停止按钮,这时候流程才往下走。

S4是“停止M3”步,动作是M3输出为OFF,同时启动定时器T2,计时5秒。转换条件:T2定时时间到。

S5是“停止M2”步,动作是M2输出为OFF,同时启动定时器T3,计时5秒。转换条件:T3定时时间到。

S6是“停止M1”步,动作是M1输出为OFF。转换条件:这里用一个“无条件转换”,或者加一个极短的定时器T4延时,确保M1的切断输出至少维持一个完整扫描周期,然后回到S0初始步。从S6转换到S0的连线属于从下往上的回路,必须画箭头,符号上是个循环跳转。

整个流程结构上就是一个单序列加一个循环回跳,没有用选择分支和并行分支,但麻雀虽小五脏俱全。画图的时候要注意:S0和其他步之间必然要经过转换,比如S0下面放一个转换条件“Start”,然后才是S1;S1下面放“T0”,然后才是S2。步和步之间绝对不能直接相连。

4.3 SFC转换成梯形图的思路

很多人学SFC时最大的困惑是:“画完SFC,PLC怎么跑起来?”答案取决于你用的平台。三菱的GX Works/GX Works3里可以直接用SFC编程语言,Codesys和博途里的S7-GRAPH也能直接建立SFC类型的程序组织单元,这种情况下你只要把步和转换条件填进去,编译器会自动生成运行逻辑。但有些平台或者老设备不支持SFC,你需要手动把它转换成等价的梯形图,理解这个转换思路非常重要。

转换的核心思想是“用辅助继电器代表步”。我通常为每个步分配一个位元件,比如M0对应S0,M1对应S1,以此类推。然后每个步的“激活条件”是:前一步为ON,并且前一步和本步之间的转换条件成立;同时还要加上“自保持”,确保本步一旦激活,只要不被下一步置位复位就不会消失。进入下一步后,本步要被复位。

以S1为例,它的激活条件可以写成:M0为ON且Start为ON顺序是“M0由S1置OFF之后再断开”,然后自保持,输出M1为ON。S0的复位条件就是S1激活。这个动作串最后用M1的常开触点去驱动Y0,并启动T0。S2同理,激活条件是“M1为ON且T0时间到”,自保持,复位M1,用M2的常开触点驱动Y1和T1。以此类推。

手动转换的梯形图会很长,但规律性很强,本质上就是一段“移位寄存器”式的逻辑,用步标志位的置位复位去传递活动状态。我自己在做老旧项目改造时经常这么干,因为客户不愿意换PLC,我只能把SFC逻辑转成梯形图写进去,而且用纸笔先画好步位表再写程序,基本不会乱。

4.4 程序调试要点

调试SFC程序,第一步不是按启动按钮,而是先在强制状态或者手动模式下检查每一个步的活动情况。不同平台都有SFC监控界面,调试时能看到当前哪些步是高亮的。我要确认的第一件事是:上电后只有初始步S0是高亮的,其他步全部熄灭。如果发现多个步同时点亮,说明初始步处理和步复位逻辑有遗漏,必须先解决。

第二步是单步测试。把启动条件强制为ON一次,看S1是否点亮,M1是否输出,然后不要继续往下走,先检查状态。这一步能发现很多问题,比如定时器T0是否开始计时,输出点是否真的动作,接触器是否吸合。一个步一个步往前推,比一次性自动跑到底要稳妥得多。

第三步才是整周期自动运行。重点观察每个分支点是否按预期跳转,尤其是并行的同步等待处和循环回跳处,用在线监控观察步的高亮切换是否和时序图一致。我还习惯在SFC里临时加一个“调试计数器”,统计循环次数,确认回跳逻辑没有异常。

5. 常见问题与排查技巧实录

5.1 常见错误速查表

以下这些问题,是我在项目现场和帮朋友看程序时遇到最多的,整理成一个速查表:

问题现象可能原因处理办法
编译报错“步不能直接连接”步和步之间漏掉了转换在中间补上转换条件
上电后没有步处于活动状态缺少初始步,或初始步被跳过了检查是否定义了唯一的双线矩形初始步
上电后多个步同时活动步复位逻辑遗漏或初始步重复检查各步激活时是否复位前一步
流程卡在某一步不动该步的转换条件一直不满足用监控看转换条件的实际值,查传感器和定时器
选择分支时两个分支同时进入分支转换条件重叠,没有互斥给条件补全互斥项
并行分支合并后流程卡死某条分支的末端转换条件未满足逐个分支检查末端步和转换条件
输出一闪而过,执行机构不动作动作用N且步活动时间太短;脉冲动作时间不足改用S动作,或加延时转换条件
从S6跳回S0后流程不循环循环回路缺少箭头或有向连线方向不对检查回跳连线上是否有方向箭头
手动模式正常自动模式乱跳手自动切换条件没有加入转换条件在SFC公共条件中添加自动允许信号

5.2 调试心得与避坑建议

调试SFC程序,最大的陷阱不是结构画错,而是“状态感觉对了,现场却出问题”。我踩过最典型的一次坑是:用一个N动作去控制一个气缸,气缸动作需要在步活动期间持续输出,但那个步的转换条件也是非常迅速就满足的,结果整个步只激活了几个毫秒就跳走了,气缸才刚动一下就停了。后来我把这类动作全部改成S置位,流程结束时统一用R复位,问题立刻消失。所以动作限定符的选择,真的是SFC现场调试的关键点,千万别图省事。

再说一个调试心得:SFC里加“超时报警”比梯形图里加要容易得多,也更重要。我一般会在每个可能长期等待的转换条件旁边加一个定时器,比如“等待传感器到位超过10秒未到位则报警”,报警时SFC可以停在当前步等人工处理,也可以跳到专门的复位分支。有过一次教训之后,我现在凡是有长时间等待的步骤,都会顺手加一个超时监视,成本很低,但能救命。

最后,关于工具选型。如果你用的是Codesys、博途S7-GRAPH、三菱GX Works3这些平台,SFC是原生支持的,直接建SFC类型的POU就行。如果是老平台,就要用辅助继电器手动搭步位逻辑,我建议把步位表先写在纸上,标好每步对应的位元件、动作、转换条件,然后再转梯形图,否则很容易漏步或者错位。顺便说一句,SFC并不局限于PLC,很多运动控制器和上位机软件也支持类似的状态机建模,学会了这套思维,对你之后写状态机系统也很有帮助。

我做项目这些年,最大的体会是:SFC不是一门“新语言”,而是一种“流程思维”。它的基本结构学起来并不难,真正难的是如何在设备千变万化的现场条件下,把流程拆得足够清晰、足够安全。花一点时间把单序列、选择分支、并行分支、跳转和循环这几板斧练熟,后面遇到再复杂的设备,你也能一上来就画出让人看得懂、改得动的流程图。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询