PLC顺序控制利器:SFC编程从入门到实战
1. 从梯形图到SFC为什么我们需要另一种编程语言如果你接触过PLC编程尤其是西门子、三菱这些主流品牌那你对梯形图LAD一定不陌生。它直观、形象用继电器触点、线圈的逻辑关系来构建程序对于电工出身的工程师来说上手门槛极低。我刚开始做项目时也觉得梯形图就是一切直到我遇到了一个中等复杂度的灌装生产线项目。那条线有十几个工位包含上料、清洗、灌装、封盖、贴标、检测、分流等多个工序工序之间有严格的顺序和条件互锁。用梯形图硬撸我画了上百个网络段各种中间继电器M点用了好几百个程序结构像一团乱麻。调试时某个工位的一个传感器故障导致整条线停机我要花半个多小时在成百上千条逻辑里“顺藤摸瓜”找问题。更头疼的是客户要求增加一个抽检和返工回路我几乎要推倒重来一半的逻辑。那时我才深刻体会到梯形图在处理复杂的顺序控制流程时就像用螺丝刀去拧一颗需要扳手的大螺母——不是不能用是效率太低且容易出错。这时SFCSequential Function Chart顺序功能图就登场了。它不是来取代梯形图或语句表STL的而是来补足它们的短板。你可以把SFC理解为给PLC程序画“流程图”或“工艺路线图”。它用“步”Step和“转移”Transition这两个核心元素清晰地描绘出设备或工艺从一个状态切换到另一个状态的完整过程。每一步代表一个稳定的工艺状态比如“夹紧气缸伸出”、“主轴旋转”转移条件则是触发状态切换的开关比如“气缸伸出到位信号”、“启动按钮按下”。对于前面提到的灌装线用SFC来编程整个流程就一目了然一个初始步然后按顺序是“上料步”、“清洗步”、“灌装步”……每一步下面挂载具体的动作输出用梯形图或功能块实现步与步之间用转移条件连接比如“物料到位传感器1”。程序执行时就像一个指针严格按照这张图一步一步往下走。哪个工位出了问题直接看程序指针停在哪一步问题瞬间定位。要增加返工流程只需要在SFC图中插入一个选择分支指向返工步序列即可原有主流程几乎不用动。所以SFC编程的核心价值在于它将控制逻辑做什么按什么顺序做与控制动作具体怎么做进行了清晰分离。逻辑部分由直观的图表负责动作部分则由你熟悉的梯形图、功能块等负责。这种结构特别适合具有明显顺序、并行、选择分支的工业过程控制比如装配线、包装机械、物料输送系统等。它让程序的可读性、可维护性和可扩展性得到了质的提升。2. SFC的核心三要素步、转移与有向连线要玩转SFC必须吃透它的三个基本构件步Step、转移Transition和有向连线Directed Link。这就像学英语要先掌握字母一样。2.1 步Step工艺的稳定状态步在SFC图中通常用一个方框表示里面标上步的名称或编号比如S0 S10。它代表控制系统中的一个稳定工作阶段或状态。在这个阶段内系统执行一系列连续的动作并且输出状态保持相对不变。步分为两种活动步Active Step当前正在执行的步。一个SFC程序在任意时刻至少有一个活动步初始步。活动步意味着它所关联的动作或命令正在被执行。非活动步Inactive Step当前未执行的步。它关联的动作不被执行。这里有一个关键概念步本身不执行具体操作。它只是一个“状态标签”。具体的操作比如“启动电机M1”、“打开阀门YV1”是通过与步关联的“动作”Action来完成的。在西门子S7-1200/1500的SCL或S7-300/400的GRAPH中你可以在步的属性里添加动作并指定动作类型比如“N”非存储型“S”置位型等。一个实用的经验给步命名时尽量使用描述其工艺状态的名称如“Wait_For_Part”等待工件、“Clamping”夹紧、“Drilling”钻孔而不是简单的S1 S2。这在调试和后期维护时能让你和你的同事一眼看懂程序在干什么。2.2 转移Transition状态切换的闸门转移是连接两个步的短横线通常上面或旁边会标注转移条件。它代表了从一个步切换到下一个步必须满足的条件。只有当转移条件为“真”TRUE时系统才会离开当前的活动步进入后续步。转移条件可以是简单的布尔逻辑如“I0.0 AND I0.1”也可以是复杂的表达式或函数调用结果。它就像是流程前进的“通行证”。一个极易踩坑的点转移条件的“瞬态”特性。在PLC的扫描周期中转移条件通常只在被扫描到的那一瞬间被评估。如果条件是一个短暂的脉冲信号比如一个按钮的上升沿你必须确保这个脉冲能够被SFC程序捕捉到。一种常见的做法是在梯形图里用这个脉冲信号置位一个中间标志位M点然后用这个标志位作为SFC的转移条件并在转移完成后在SFC内或梯形图里复位该标志位。否则你可能遇到流程“卡住”不走或者莫名其妙跳步的情况。2.3 有向连线Directed Link流程的方向有向连线就是带箭头的线它指明了流程的方向即从上一个步经过转移指向下一个步。它定义了控制的顺序。这三者结合起来就构成了SFC最基本的单元步 → 转移 → 步。程序从初始步开始沿着有向连线根据转移条件的满足情况一步一步地推进。3. SFC的三种基本结构单序列、选择分支与并行分支掌握了基本元素我们来看它们如何组合成控制逻辑的骨架。SFC主要有三种基本结构几乎可以描述所有顺序控制过程。3.1 单序列Single Sequence这是最简单、最常用的结构就是一系列步和转移按顺序串行连接。流程严格地一步接一步执行只有前一步完成且转移条件满足才能进入下一步。就像流水线上的一个工位干完活工件才能流到下一个工位。[初始步 S0] --(启动按钮按下)-- [步 S1: 传送带前进] --(到达位置A)-- [步 S2: 气缸下降] --(下降到位)-- [步 S3: ...]适用场景简单的顺序过程如单机设备的基本动作流程。3.2 选择分支Selection Branch选择分支表示流程在此处可能出现多个可能的后续路径但每次只选择其中一条路径执行。分支的入口和出口都有一个转移。入口转移称为“选择开始”出口转移称为“选择结束”或“合并”。[步 S10: 检测工件] | |--(工件合格)-- [步 S11: 送入合格品线] | |--(工件不合格)-- [步 S12: 送入返修线] | |--(无工件)-- [步 S13: 报警等待] | (选择合并)-- [步 S20: 流程继续...]关键点分支的优先级。在大多数PLC的SFC实现中如西门子GRAPH当多个分支的转移条件同时为真时会按照分支绘制的先后顺序通常是从左到右或从上到下选择第一个条件为真的分支执行。这在编程时必须考虑清楚避免逻辑歧义。例如上面例子中“无工件”和“工件不合格”如果同时满足理论上不合理但可能因传感器故障导致就需要根据优先级决定先处理哪个报警。3.3 并行分支Parallel Branch并行分支表示流程在此处分裂成多个同时执行的路径这些路径是并发进行的。所有并行分支都执行完毕后流程才会同步合并继续向下执行。入口处是一个双横线表示分支开始出口处也是一个双横线表示同步合并。[步 S30: 准备装配] || ||------------------ [步 S31: 安装零件A] --(完成)-- | || | (同步合并) ||------------------ [步 S32: 安装零件B] --(完成)-- | || [步 S40: 总装检验]核心规则所有并行分支必须全部执行到各自的最后一步并且所有分支最后的转移条件都满足后同步合并处的转移才被视为满足流程才能汇合继续。这是实现多工位同步协调的关键机制。一个重要的实践经验在并行分支中尽量避免某个分支的流程步数远多于其他分支。如果无法避免可以在步数少的分支最后增加“等待步”直到所有分支都准备好再同步。否则步数少的分支会早早执行完并在合并点等待如果等待时间过长可能会因看门狗或意外情况导致问题。4. 在西门子TIA Portal中实现一个SFC案例物料分拣装置光说不练假把式我们用一个经典的PLC实训项目——物料分拣装置——来实战SFC编程。假设装置流程如下启动后传送带运行检测到物料后根据颜色传感器信号假设I0.0为黑色I0.1为白色将黑色物料推入A槽白色物料推入B槽然后循环。我们使用西门子S7-1200 PLC和TIA Portal V17环境。注意S7-1200/1500中SFC功能主要通过“GRAPH”或“SCL”语言实现这里我们用更直观的GRAPH属于FBD/LAD/STL之外的另一种编程语言专用于顺序控制。4.1 项目创建与硬件组态打开TIA Portal新建项目添加一台S7-1200 CPU如1214C。在设备视图中根据实际需求添加数字量输入/输出模块。假设I0.0 黑色物料检测I0.1 白色物料检测I0.2 物料到达推杆位置检测I0.3 启动按钮常开I0.4 停止按钮常闭Q0.0 传送带电机Q0.1 推杆A电磁阀Q0.2 推杆B电磁阀在“程序块”中添加一个新的块。类型选择“函数块(FB)”语言选择“GRAPH”。命名为“FB_Material_Sort”。这将是我们SFC程序的主体。4.2 设计SFC程序结构打开GRAPH编辑器我们会看到初始界面。GRAPH的编辑区就是用来画SFC图的。初始步S1 系统上电后的等待状态。通常命名为“Initial”或“Wait_Start”。在这个步里我们不执行任何动作或者只执行一些初始化操作如复位所有输出。转移条件为“启动按钮按下”I0.3。运行步S2 进入运行状态。动作激活传送带Q0.0 1。转移条件物料到达推杆位置I0.2。选择分支开始 在S2之后我们建立一个选择分支根据物料颜色决定流向。分支1黑色 转移条件I0.2 AND I0.0物料到位且是黑色。步S3动作推杆A推出Q0.1 1并启动一个定时器T1用于推杆保持。转移条件定时器T1到时。分支2白色 转移条件I0.2 AND I0.1物料到位且是白色。步S4动作推杆B推出Q0.2 1启动定时器T2。转移条件定时器T2到时。选择分支合并 S3和S4之后合并到同一个步S5。复位步S5 动作复位推杆A和BQ0.10 Q0.20同时复位用于分支判断的中间标志位如果有的话。转移条件推杆复位到位可以加传感器或用一个短延时T3。满足后转移回步S2传送带运行形成循环。4.3 GRAPH中的关键设置与编程技巧在GRAPH中编辑时有几个细节需要特别注意互锁Interlock 可以在步的属性中设置“互锁”条件。当互锁条件为假时即使该步是活动步其关联的动作也不会执行。这常用于急停、安全门等安全功能。例如在S2传送带运行的互锁条件中加上“停止按钮(I0.4)”这样按下停止传送带立即停。监控Supervision 也叫监督条件。如果监控条件为真会触发一个监控事件可以强制跳到指定的步通常是错误处理步。这用于处理超时、卡料等故障。例如在S2可以加一个监控定时器如果物料在设定时间内未到达位置I0.2未触发则跳转到报警步。动作的限定符 GRAPH中动作前面可以加限定符如N(Non-stored) 非存储型。步活动时动作执行步不活动时动作停止。最常用。S(Set) 置位型。步活动时置位一个位该位会保持直到被其他地方复位。R(Reset) 复位型。步活动时复位一个位。L(Time Limited) 时间限制型。动作只执行一段设定的时间。D(Time Delayed) 时间延迟型。步活动后延迟一段时间再执行动作。 合理使用限定符可以简化程序。比如推杆动作用“N”型步激活就推出步关闭就缩回。但如果推杆需要保持到下一个周期则可能需要用“S”型并在后续步中用“R”型复位。使用“接口”变量 在FB的“接口”区定义好Input、Output、InOut、Static、Temp变量。将传感器信号I点连接到Input执行器Q点连接到Output。在GRAPH内部使用这些接口变量而不是直接使用绝对地址如I0.0。这提高了块的可重用性和可读性。4.4 在OB1中调用与调试在组织块OB1主循环中拖入我们创建好的FB“FB_Material_Sort”。需要为其指定一个背景数据块Instance DB比如“DB_Material_Sort”。将实际的PLC输入输出地址连接到FB的输入输出管脚。下载程序到PLC。在线监控GRAPH程序。这是最爽的时刻你可以清晰地看到一个活动步指针在SFC图上移动直观地展示程序执行到了哪一步。哪个转移条件不满足也会高亮显示。调试效率比在梯形图里大海捞针高得多。5. SFC编程的进阶技巧与常见避坑指南掌握了基础我们聊聊那些手册上不常写但实践中血泪换来的经验。5.1 步与动作的分离设计哲学这是用好SFC的精髓。步只做状态管理和流程控制具体的、复杂的逻辑和运算交给专用的功能块FC/FB去完成。例如在一个“温度控制步”中不要试图在步的动作里写一整套PID算法。你应该在步的动作里调用一个已经编写好的“PID_Control”功能块并传递设定值和过程值参数。SFC步只负责在需要时启动这个PID控制并在转移到下一步时停止它。这样SFC图保持清晰功能块可以独立测试和复用。5.2 并行分支的同步与异步问题处理并行分支的同步合并要求所有分支都完成这在某些场景下可能过于严格。例如一个装配工位有两条并行送料线但允许其中一条线暂时缺料另一条线先完成装配的半成品可以暂存等待。这时严格的同步合并就不合适了。解决方案可以使用“先完成等待”机制。即在每个并行分支的最后一步不直接指向同步合并点而是指向一个“等待同步”步。在这个等待步里程序检查其他分支的状态。我们可以定义一个共享的“同步请求”标志数组。当某个分支完成时将其对应的标志位置位。在等待步里检查是否所有需要的标志位都被置位或者根据更灵活的逻辑判断。满足条件后再转移到真正的合并后步骤。这样你就实现了可配置的、灵活的同步逻辑。5.3 跳出循环如何优雅地处理急停、复位与模式切换这是SFC设计中的难点。设备不可能永远自动循环需要有手动模式、急停、复位等功能。粗暴地在任何地方切断SFC流程会导致状态混乱。推荐模式模式信号全局化 定义一个全局变量如“Mode_Manual”在手动模式下为True。在SFC每一个步的互锁Interlock条件中都加入“NOT Mode_Manual”。这样一旦切换到手动模式所有步的动作输出立即失效但步的状态可能还保留你可以通过手动按钮控制设备。急停处理 急停信号同样作为全局互锁条件加入到每一步。同时急停发生时通常需要跳转到一个特定的“急停处理步”。这个步负责安全地停止所有运动部件并复位一些关键状态。可以在GRAPH的“Supervision”中将急停信号作为监控条件直接跳转到“急停步”。复位与初始化 设计一个独立的“初始化”SFC序列或者一个专用的“复位”功能。当收到复位命令时不是简单地让SFC从头开始可能导致中间步动作紊乱而是先执行一个“安全停止序列”将所有输出置于安全状态然后使用GRAPH提供的“禁用顺控器”或“直接跳转到初始步”指令将主SFC流程重置。西门子GRAPH中有“SFC控制”指令如SFC_START,SFC_STOP等可以用来在外部控制SFC的启停和重置。5.4 调试与诊断利用活动步信息快速定位故障SFC最大的调试优势就是可视化。在线时活动步高亮显示。当设备停机时第一件事就是看SFC图停在哪一步。卡在某个步不动 检查该步到下一步的转移条件是否满足。在线监控转移条件的布尔逻辑看哪个信号没到位。流程乱跳 检查是否有多个转移条件意外同时为真尤其是在选择分支中。检查传感器信号是否抖动导致条件瞬间满足。可以考虑在转移条件中加入上升沿判断或短延时滤波。动作输出异常 步是活动的但输出没动作。检查该步的动作是否被正确编程动作的限定符是否合适以及互锁条件是否阻止了动作输出。使用GRAPH的“序列器”视图 TIA Portal的GRAPH在线视图除了图形化显示还有一个“序列器”列表视图它以表格形式列出所有步的状态、活动时间、转移条件值等信息更集中便于分析。6. SFC与其他PLC编程语言的协同与比较SFC不是孤岛它需要与其他IEC 61131-3标准语言如LAD FBD STL SCL协同工作才能发挥最大威力。6.1 与梯形图LAD/功能块图FBD的配合这是最常见的组合。SFC负责高层级的流程调度而每一步里具体的、底层的逻辑则用LAD或FBD来实现。例如电机启停控制 在SFC的“启动电机”步中调用一个用LAD编写的“电机控制”功能块该功能块集成了启动、停止、互锁、过载保护等逻辑。模拟量处理 在SFC的“数据采集”步中调用FBD编写的模拟量输入缩放和滤波功能块。这种分工明确SFC程序简洁底层逻辑模块化易于复用和测试。6.2 与结构化文本STL/SCL的配合对于涉及复杂计算、数据处理、字符串操作或数组遍历的任务SCL西门子或ST其他品牌比图形化语言更高效。SFC可以与它们无缝配合配方管理 在SFC的“加载配方”步中调用一个SCL函数该函数从DB块或HMI读取一组参数并赋值给相应的工艺变量。数据记录 在“生产完成”步中调用SCL函数将生产数据时间、数量、质量参数写入数据库或SD卡。SCL的强大运算能力弥补了SFC在复杂数据处理方面的不足。6.3 不同品牌PLC的SFC实现差异虽然IEC 61131-3标准定义了SFC但各厂商的实现细节有差异这是跨平台移植时的主要障碍。西门子S7-300/400 S7-1200/1500 早期S7-300/400使用“GRAPH 7”语言集成在Step 7中。S7-1200/1500在TIA Portal中使用“GRAPH”功能更现代。特点是功能强大互锁、监控、动作限定符齐全在线调试直观。但语法和结构与标准SFC略有不同。三菱MELSEC系列 使用“SFC顺序功能图”编程语言其理念更贴近标准。它用“状态继电器S”来表示步用“SET”和“STL”指令来激活步和驱动步内逻辑。编程思维是“步进梯形图”对于熟悉三菱梯形图的工程师来说过渡平滑。罗克韦尔AB 在RSLogix 5000/Studio 5000中通过“顺序功能图SFC”例程来实现。它也是一个独立的编程语言环境概念与标准一致。汇川、信捷等国产PLC 大多也支持SFC编程通常借鉴了三菱或西门子的模式。需要查阅具体型号的手册。移植经验 从一个平台迁移SFC程序到另一个平台几乎不可能直接转换。最好的方法是重新设计。基于原有的工艺流程图和控制逻辑在新平台上用其SFC工具重新实现。核心的步、转移、分支结构可以保留但具体的动作编程、变量定义、特殊功能如跳转、复位都需要按照新平台的规则重写。7. 从实训到实战复杂项目中的SFC架构设计当面对一个拥有多个子系统、多种工作模式自动、手动、维修、配方的大型项目时单个SFC程序会变得异常庞大和难以管理。这时就需要考虑SFC的架构设计。7.1 分层式SFC设计这是最有效的架构之一。将整个控制系统划分为多个层次主控层Master SFC 这是一个顶层的SFC负责整个系统的工作模式切换自动、手动、停机等和主要生产阶段的调度如“上料”、“加工”、“装配”、“下料”。它的每一步可能对应一个子系统的启动。子系统层Sub-system SFC 每个主要的设备单元或功能模块如机器人单元、传送带系统、加热炉都有自己的SFC程序。这些子SFC作为功能块FB被主控SFC调用。当主控SFC进入“加工”步时它调用“加工单元_SFC”FB并启动该子流程。设备层Device Level Logic 在子SFC的每一步中具体的动作由底层的梯形图、功能块图或SCL程序实现。这种分层结构清晰职责分明。调试时可以单独测试和模拟每个子SFC。修改某个子系统时不会影响到主流程和其他子系统。7.2 状态机与SFC的结合对于非纯顺序而是有多个状态来回切换的复杂设备如一台有“待机”、“准备”、“运行”、“暂停”、“故障”等多种状态的机床可以结合状态机思想。我们可以设计一个核心的“设备状态机”用枚举变量如Device_State: (IDLE PREPARE RUN PAUSE FAULT)来表示。这个状态机的迁移由各种事件按钮、传感器信号、SFC完成信号触发。然后SFC程序可以基于这个“设备状态”来运行。例如只有当Device_State RUN时主生产SFC才被激活执行。当发生故障时Device_State跳转到FAULT这会触发SFC中的监控条件使其跳转到故障处理步同时所有步的互锁条件因Device_State ! RUN而失效确保安全。7.3 配方与参数管理在需要生产不同产品配方的场景下SFC的流程可能大同小异但参数如温度、时间、速度不同。好的设计是将SFC流程模板化参数变量化。在SFC中所有与配方相关的设定值如定时器时间、模拟量输出值都使用变量如Set_TemperatureHeat_Time而不是直接写常数。创建一个配方数据块DB里面为每个配方定义一组参数结构。在HMI或上位机选择配方后将对应配方的参数结构体数据整体复制到SFC程序使用的当前配方变量区。SFC程序运行时使用的就是当前配方载入的参数。这样增加一个新配方只需要在配方DB里新增一组数据无需修改SFC程序逻辑极大地提高了灵活性。从我第一次被梯形图的“面条式”代码折磨到后来在多个大型产线项目中运用分层SFC架构游刃有余这个过程让我深刻认识到选择合适的编程范式对于工程效率和系统可靠性的重要性。SFC不仅仅是一种语言更是一种结构化、可视化的设计思想。它强迫你在动手写代码之前先想清楚设备的整个工作流程和状态变迁而这正是做出稳定、易维护的PLC程序的关键。刚开始画SFC图可能会觉得有点麻烦不如直接写梯形图来得“快”但当你面对调试、修改和交接文档时前期的这点投入会带来成倍的回报。下次当你面对一个复杂的顺序控制任务时不妨先拿起笔画一画它的SFC图你会发现问题变得清晰多了。