ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PLC顺序功能图SFC从入门到实战:结构、绘图规则与调试避坑指南

PLC顺序功能图SFC从入门到实战:结构、绘图规则与调试避坑指南 做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时转换成立如果你写“11”表示无条件转换那就代表前一步激活的瞬间就会跳到下一步。无条件转换不是不能用但一定要确认自己知道它意味着什么否则很容易出现“步像流星一样一闪而过”的现象。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到S6S0是初始步双线矩形系统上电后停在这里等待启动。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”然后才是S1S1下面放“T0”然后才是S2。步和步之间绝对不能直接相连。4.3 SFC转换成梯形图的思路很多人学SFC时最大的困惑是“画完SFCPLC怎么跑起来”答案取决于你用的平台。三菱的GX Works/GX Works3里可以直接用SFC编程语言Codesys和博途里的S7-GRAPH也能直接建立SFC类型的程序组织单元这种情况下你只要把步和转换条件填进去编译器会自动生成运行逻辑。但有些平台或者老设备不支持SFC你需要手动把它转换成等价的梯形图理解这个转换思路非常重要。转换的核心思想是“用辅助继电器代表步”。我通常为每个步分配一个位元件比如M0对应S0M1对应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不是一门“新语言”而是一种“流程思维”。它的基本结构学起来并不难真正难的是如何在设备千变万化的现场条件下把流程拆得足够清晰、足够安全。花一点时间把单序列、选择分支、并行分支、跳转和循环这几板斧练熟后面遇到再复杂的设备你也能一上来就画出让人看得懂、改得动的流程图。
返回列表