1. 项目概述从“梯形图思维”到“流程图思维”的跃迁如果你接触过PLC编程大概率是从梯形图开始的。那种用常开、常闭触点、线圈和功能块“画”出来的逻辑直观得像电气原理图上手确实快。但当你面对一个稍微复杂点的流程比如一条有多个工位、需要按严格顺序和条件切换的自动化生产线或者一台有多个工作模式手动、自动、单步、回原点的设备时用梯形图硬堆程序很快就会变得臃肿不堪。触点互锁绕来绕去状态标志位满天飞自己过两周再看都可能理不清头绪更别说让同事维护了。这正是很多初学者从“会写”到“写好”的瓶颈期。“PLC实训 — SFC编程”这个项目核心目标就是带你突破这个瓶颈。SFC全称Sequential Function Chart中文常叫顺序功能图或步进顺控图。它不是什么高深的新语言而是一种组织程序结构的图形化方法是IEC 61131-3标准中定义的PLC五大编程语言之一。你可以把它理解成给PLC编程引入了“流程图思维”。我们不再纠结于每个扫描周期里每个位、每个线圈的具体状态变化而是把整个控制过程分解成一个个清晰的“步”Step以及连接这些步的“转移条件”Transition。程序执行时就像玩一个闯关游戏只有满足了当前关卡步的所有动作并且触发了通关条件转移条件才会进入下一关。这次实训就是要让你亲手把一个用传统梯形图写得又臭又长的控制逻辑用SFC重新梳理、实现一遍。你会直观地感受到对于顺序流程控制SFC在程序结构清晰度、可读性、可维护性上带来的碾压性优势。无论你是用西门子的GRAPH、三菱的GX Works2中的SFC语言、还是欧姆龙的CX-Programmer里的SFC功能块其核心思想都是相通的。掌握了这种思维你写出的PLC程序将不再是“一坨逻辑”而是一张有章可循的“工艺地图”。2. SFC核心概念与编程思维解析在动手写代码之前我们必须把SFC里几个最核心的“零件”和它们之间的“游戏规则”彻底吃透。这比直接学软件操作更重要因为思维转换才是关键。2.1 三大核心元素步、转移、动作步Step代表流程中的一个稳定状态。在这个状态下设备执行某些连续的动作比如气缸伸出、电机以某个速度旋转、定时器计时等。步用矩形框表示通常有一个编号如S0、S10和一个简短的名称如“初始步”、“夹紧工件”。步分为初始步和活动步。初始步是系统启动后的入口一个SFC程序有且只有一个初始步通常用双线矩形框表示。活动步是指当前正在执行的步一个时刻可以有多个活动步在并行分支中PLC会持续执行活动步所关联的动作直到转移条件满足。转移Transition代表从一个步切换到下一个步的条件。它用一条短横线表示旁边会标注条件。这个条件通常是一个简单的逻辑表达式比如“启动按钮按下且气缸到位”I0.0 I0.1或者“定时器时间到”T37。转移是瞬间完成的一旦条件为真前驱步立刻变为不活动后继步立刻变为活动。这里有个非常重要的规则转移条件必须足够“干净”理想情况下应该只由外部输入信号或前一步动作产生的稳定信号构成避免使用复杂的中间运算结果否则可能导致流程乱跳。动作Action关联在步上的具体操作。一个步可以关联零个、一个或多个动作。动作用矩形框连在步的右侧里面写明要做什么比如“置位Q0.0启动电机”、“复位M10.0清除报警”、“启动定时器T101延时5秒”。在高级的SFC编辑器中还可以为动作定义不同的类型比如非存储型N步活动时动作执行步不活动时动作停止。最常用。存储型S步活动时动作置位即使步不活动了动作也保持直到被其他地方复位。时间限定型L动作只在步活动的特定时间段内执行。脉冲型P只在步由不活动变为活动的瞬间执行一个扫描周期。理解这三者的关系就抓住了SFC的骨架流程由“步”组成步之间通过“转移”连接而“步”承载了具体的“动作”。2.2 程序执行机理与扫描周期这是从梯形图思维转换到SFC思维最难也最重要的一环。在梯形图里你脑子里想的是“每个扫描周期PLC从左到右、从上到下执行这些触点和线圈的逻辑”。但在SFC里你需要换一种视角。PLC对SFC程序的扫描同样在每个周期进行但其核心是管理“活动步”的集合。每个扫描周期PLC会做以下几件事检查转移条件针对所有当前活动步的后继转移条件进行求值。执行转移如果某个转移条件为真上升沿有效是常见做法防止持续导通导致多次转移则PLC会同时执行使该转移的所有前驱步变为不活动使所有后继步变为活动。这是一个“原子操作”在逻辑上是瞬间完成的。执行动作根据新的活动步集合执行或停止相应的动作。对于非存储型动作步不活动了对应的输出就会停止。扫描用户编写的其他逻辑SFC通常作为一个程序块如FB、FC存在一个工程里可能还有其他的梯形图、ST语言写的程序块。PLC会按既定顺序扫描它们。关键理解不要认为SFC是“一步一步慢悠悠”执行的。PLC的扫描周期是毫秒级的只要转移条件满足流程会立刻推进。感觉上的“步进”是因为我们在转移条件里设置了需要时间完成的动作比如“等待3秒”这3秒内程序其实一直停留在当前步每个周期都在检查定时器是否到位。2.3 单序列、选择分支与并行分支掌握了基本元素就可以用它们搭建复杂的流程结构了。主要有三种单序列最简单一步接一步像一条直线。适用于简单的顺序过程。选择分支Alternative Branch一个步之后有多个不同的后续路径分支但每次只允许选择其中一条路径执行。分支的起点和终点分别用单横线表示。关键点在于各分支的转移条件必须互斥即同一时刻最多只有一个条件为真。如果多个条件同时为真不同PLC的处理方式可能不同有的按编写顺序选择第一个这会导致不确定性是编程大忌。所以设计时要确保条件逻辑上互斥比如用“模式选择开关”的不同档位来触发不同分支。并行分支Simultaneous Branch一个步之后需要同时启动多个独立的子流程。分支起点用双横线表示。当进入并行分支时所有分支的第一步会同时被激活。各个分支独立运行直到所有分支都执行到各自的结束步才会同步合并继续执行后续的步。合并点同样用双横线表示。并行分支非常适合处理那些需要同时进行、但耗时可能不同的任务比如“夹紧工件”、“启动主轴旋转”、“冷却液开启”这三个动作可以同时开始。实操心得很多初学者在并行分支合并时出错问题常出在“同步”上。合并的转移条件必须是所有分支的最后一个步都是活动步。通常我们会在这个转移条件上做一个所有分支末步的“与”逻辑。例如Branch1_Step10 和 Branch2_Step20 都活动时条件才满足流程才能合并继续。3. 实训项目双缸顺序动作控制系统的SFC实现光说不练假把式。我们以一个经典的“双缸顺序动作”控制任务作为实训项目把上面的理论落地。这个任务用梯形图做互锁已经有点啰嗦用SFC来实现则能完美展现其优势。3.1 控制要求与IO分配假设我们有两个气缸A缸和B缸每个气缸有一个伸出传感器和一个缩回传感器。控制要求如下按下启动按钮系统开始运行。A缸先伸出直到A伸出传感器到位。A缸到位后B缸伸出直到B伸出传感器到位。B缸到位后两个气缸同时缩回A缸和B缸同时开始缩回动作。当A缸和B缸都缩回到位各自的缩回传感器触发后暂停3秒钟。3秒时间到自动重复步骤2-5形成循环。任何时候按下停止按钮系统完成当前循环后回到初始状态两缸缩回等待。根据要求我们分配PLC的IO点以通用地址示例输入I0.0启动按钮常开I0.1停止按钮常闭I1.0A缸伸出到位I1.1A缸缩回到位I1.2B缸伸出到位I1.3B缸缩回到位输出Q0.0控制A缸伸出电磁阀Q0.1控制A缸缩回电磁阀假设单电控弹簧复位气缸则只控制伸出缩回靠弹簧Q0.1可不接。为演示我们假设是双电控气缸Q0.1控制缩回Q0.2控制B缸伸出电磁阀Q0.3控制B缸缩回电磁阀3.2 使用西门子S7-1200/1500的GRAPH进行编程我们选择在博途TIA Portal软件中使用GRAPH语言西门子对SFC的实现来完成。GRAPH提供了非常直观的图形化编辑界面。第一步创建GRAPH FB块在项目树中添加新块选择“函数块(FB)”设置名称如FB1“DoubleCylinderCtrl”语言选择“GRAPH”。创建后会自动打开GRAPH编辑器。第二步构建SFC网络GRAPH的界面通常分为三列左侧是步和转移的编号与名称中间是SFC网络图右侧是步的动作和转移的条件编辑区。初始步S1系统上电后的状态。在动作中我们确保两缸缩回复位Q0.0和Q0.2置位Q0.1和Q0.3不对于双电控气缸我们通常用“置位”和“复位”来控制。更安全的做法是在初始步我们不直接驱动输出而是在一个全局的“安全输出”程序段里根据步的状态来综合决定输出。但为了简化教学我们可以在初始步的动作里写N Q0.1 : 1; N Q0.3 : 1;非存储型动作激活时输出1来让气缸缩回。同时转移条件设为“启动按钮按下 I0.0”。步S2A缸伸出转移条件满足后进入S2。在S2的动作中我们置位A缸伸出S Q0.0并复位A缸缩回R Q0.1。转移条件设为“A缸伸出到位 I1.0”。步S3B缸伸出进入S3。动作S Q0.2B缸伸出R Q0.3B缸缩回。转移条件“B缸伸出到位 I1.2”。步S4双缸同时缩回并行分支开始这是一个步但我们要启动两个并行的缩回过程。在S4的动作里我们可以同时置位Q0.1和Q0.3不更规范的做法是利用S4激活两个并行的分支。在GRAPH中在S4后添加一个并行分支结构。分支1步S5A缸缩回等待转移条件T1A缩回到位I1.1。分支2步S6B缸缩回等待转移条件T2B缩回到位I1.3。在步S5和S6的动作中分别执行A缸缩回S Q0.1, R Q0.0和B缸缩回S Q0.3, R Q0.2。注意此时S4这个步本身可能没有驱动动作它的作用就是激活并行分支。并行分支合并当T1和T2都满足即I1.1和I1.3都接通并行分支合并进入下一步S7。步S7延时等待在S7的动作中启动一个定时器比如N T1 : SST#3S并N T1.START转移条件设为“T1.Q”定时器时间到。步S8循环或停止判断从S7出来后我们需要判断是循环还是停止。这里用一个选择分支。分支1循环转移条件为“停止按钮未按下 自动循环标志”。这个条件满足时跳转回步S2。这里“自动循环标志”可以是一个内部位M在启动时置位在停止流程中复位。分支2停止转移条件为“停止按钮按下 I0.1”。这个条件满足时跳转回初始步S1。在跳转前可能需要一个额外的步来确保所有动作停止。第三步设置GRAPH块参数与调试在FB的接口区定义输入、输出、静态变量等。将控制按钮和传感器地址映射到输入电磁阀地址映射到输出。在OB1中调用这个FB块并赋予背景数据块。 调试时利用博途强大的仿真功能PLCSim可以单步执行SFC观察每一步的激活情况以及输出变化非常直观。注意事项GRAPH中步的动作有“执行一次”N和“保持”S等区别。对于气缸控制通常使用“置位”S和“复位”R指令来确保输出状态的稳定而不是用“N”直接赋值。因为“N”动作在步失效时会撤销输出可能导致气缸在流程中意外缩回。3.3 使用三菱GX Works2的SFC语言编程三菱的SFC编程理念与西门子类似但操作界面和术语略有不同。第一步创建SFC程序新建工程选择对应的PLC型号如FX系列。在程序列表中可以创建“SFC”程序。三菱的SFC程序由“块”组成每个块是一个独立的SFC流程。第二步绘制SFC图初始状态通常用“S0”表示初始步。在S0的右边可以写入驱动输出如SET Y001和SET Y003让气缸缩回前提是输出点对应正确。转移条件写在连接线上方如M8002初始脉冲或X000启动按钮。步进状态用“S20”、“S21”等状态继电器表示步FX系列通常从S20开始用于用户步。从S0转移到S20的条件是启动按钮X000。动作输出在步的右侧用“OUT”、“SET”等指令编写动作。例如在S20步动作是SET Y000A缸伸出转移条件是X001A伸出到位。选择性分支与并行分支三菱SFC图中选择分支用单横线引出多条线并行分支用双横线引出。绘制“双缸同时缩回”的并行分支时从S22B伸出到位后引出双横线分别到S23和S24。在S23中动作SET Y001A缩回转移条件X002A缩回到位在S24中动作SET Y003B缩回转移条件X004B缩回到位。合并时在S23和S24之后用双横线合并转移条件为[S23 S24]即两个步都活动实际上这个条件在S23和S24的转移条件都满足后自然成立合并后的转移条件可以写为1常通或一个短延时以确保稳定。跳转与循环使用“JUMP”指令可以实现跳转。例如在延时步之后根据条件跳转回S20循环或跳转回S0停止。第三步程序转换与写入三菱的SFC图绘制完成后必须进行“转换”按F4键将SFC图形转换为PLC可执行的指令表或梯形图。转换成功后才能写入PLC进行调试。实操心得三菱SFC编程中要特别注意“状态继电器”的编号范围和使用规则。不同系列的PLC如FX1N, FX3U, Q系列可用的状态继电器数量和范围不同。并行分支合并时确保所有分支的最后一个步都处于活动状态是合并转移的前提编程时要检查逻辑避免出现“僵尸步”永远无法激活的步。4. SFC编程的进阶技巧与避坑指南掌握了基本流程编写后下面这些从实际项目中总结的经验和技巧能让你少走很多弯路。4.1 如何设计健壮的转移条件转移条件是SFC流程的“开关”设计不好流程就会乱跑或卡死。使用上升沿触发这是最重要的原则之一。对于按钮、传感器信号这类可能持续为“1”的信号一定要用上升沿P_TRIG作为转移条件。例如转移条件应该是“启动按钮按下上升沿”而不是“启动按钮1”。否则只要按钮按着不放流程会每个扫描周期都试图转移一次导致不可预料的后果。条件要“原子化”尽量让转移条件简单明了最好就是一个信号或一个信号的“与”逻辑。避免将复杂的计算、比较结果直接作为转移条件。复杂的逻辑判断应该放在步的动作里去置位/复位一个简单的中间标志位如M0.0然后用这个标志位作为转移条件。超时保护对于等待传感器信号的步务必增加超时保护。例如“等待气缸伸出到位”这个步除了传感器信号I1.0作为转移条件还应该在步的动作里启动一个定时器比如5秒。然后转移条件设计为I1.0 OR T1.Q。正常情况传感器触发流程继续如果气缸卡死5秒后超时定时器触发流程可以跳转到报警步或安全步。这是工业现场必备的安全逻辑。互锁与安全条件重要的转移条件中可以加入全局安全信号。例如任何从“运行”步向“下一步”转移的条件里都可以“与”上一个“无急停报警”的信号。这样一旦拍下急停所有流程会卡在当前步而不会错误地继续执行。4.2 处理故障与异常流程一个完整的SFC程序不能只有“阳光大道”还必须规划好“应急车道”。紧急停止处理急停按钮按下时不应简单地让所有步失效这可能导致输出全部断开设备失电引发二次危险。正确的做法是急停触发后立刻激活一个独立的“急停处理步”。在这个步里执行安全的停车序列如停止所有主轴电机、关闭气源阀、使能抱闸等并将所有运行步强制复位。待急停复位后再通过一个明确的“复位确认”操作使流程返回初始步。报警分支与复归在可能发生故障的步如等待传感器、执行机构动作设置报警监控。一旦超时或检测到异常立即通过转移条件跳转到一个“报警步”。报警步中停止相关动作点亮报警灯记录故障代码。处理完故障后操作人员需要执行“故障复位”操作流程才能从报警步跳转回指定的恢复步可能是故障发生的前一步也可能是初始步。这需要精心设计跳转逻辑。单步/单周期/连续模式这是设备常见的三种操作模式。用SFC实现非常优雅。单步每次满足转移条件后并不自动进入下一步而是等待一个“步进”按钮。这可以通过在每一个转移条件上“与”一个“步进允许”标志来实现该标志由步进按钮的上升沿触发一个扫描周期。单周期就是我们的示例执行完一个完整流程后停在最后一步等待再次启动。连续在流程末尾转移条件直接跳回第一步或第一个循环步。实现时需要在跳转条件里区分模式选择开关的状态。4.3 SFC与梯形图/ST语言的混合编程SFC并非要完全取代梯形图LD或结构化文本ST。一个优秀的PLC程序往往是多种语言的混合体。SFC负责主流程将设备的主要顺序控制、模式切换用SFC清晰地描述出来。这是程序的“骨架”和“大脑”。梯形图处理底层逻辑将气缸的互锁伸出和缩回电磁阀不能同时得电、电机的启停星三角、报警信号的汇总与滤波、输入输出点的映射等放在梯形图程序块中。这些是程序的“神经反射”和“安全肌肉”。ST语言处理复杂计算对于需要复杂数学运算、数组处理、字符串操作或PID调节器等高级功能使用ST语言编写函数或功能块。然后在SFC的步动作中或梯形图中调用这些块。这是程序的“专业工具包”。例如在我们的双缸控制项目中可以在SFC的步动作里发出“启动A缸伸出”的命令置位一个标志位M_A_Extend_Cmd而在一个独立的梯形图网络里根据这个命令结合气缸两端的传感器信号进行互锁最终驱动实际的输出点Q0.0。这样SFC流程只关心命令和状态不直接处理有安全隐患的驱动逻辑层次更加清晰安全性也更高。5. 常见问题排查与调试技巧实录即使理论再熟第一次上手调试SFC程序也难免遇到问题。下面是我在实训和项目中常遇到的坑及其解决办法。5.1 流程不启动或卡在初始步现象PLC运行但SFC流程始终停在初始步按启动按钮没反应。排查思路检查初始步的激活条件在西门子GRAPH中初始步需要被“激活”。通常是在调用FB的背景数据块中或在一个上电初始化组织块OB100中将INIT_SQ启动请求置位一次。在三菱SFC中检查是否有M8002初始化脉冲或其它条件激活S0。检查转移条件逻辑监控转移条件中涉及的变量状态。确认启动按钮I0.0的物理接线和PLC输入映像区状态是否一致。注意按钮是常开还是常闭接入程序里是否做了取反处理。检查SFC程序块是否被调用确保编写SFC的程序块如FB、SFC块在OB1中被正确调用。对于西门子GRAPH FB还需要确保其背景数据块已分配并启用。检查“激活/禁用”控制GRAPH FB有ACTIVATE输入管脚如果为False整个顺控器会被禁用。确认其是否为True。5.2 流程乱跳或跳过某些步现象流程执行速度飞快某些步一闪而过或者不按顺序执行。排查思路首要怀疑转移条件未使用上升沿这是最最常见的原因如果转移条件是I0.01启动按钮而按钮按下后一直保持那么PLC会在每个扫描周期都判断该条件为真导致流程持续转移看起来就像“飞”了一样。务必改为“I0.0的上升沿”。转移条件过于宽松或存在“毛刺”条件可能意外满足。例如等待传感器I1.0但传感器信号不稳定有抖动。可以在步动作中启动一个短延时如50ms的定时器用定时器输出来“滤波”然后用滤波后的信号作为转移条件。并行分支合并条件设计错误并行分支合并时要求所有分支的末步都活动。如果某个分支因为条件不满足而根本没有执行或者提前跳出了合并条件永远无法满足流程就会卡住。需要仔细检查每个分支的路径是否都能走到合并点。5.3 输出动作异常或不执行现象步显示已经激活但对应的输出点没有动作或者动作不符合预期。排查思路区分“命令”与“输出”如前所述最佳实践是SFC步只产生“命令”置位内部标志位M而由专门的梯形图程序根据命令和互锁逻辑来驱动最终输出Q。检查这个中间环节SFC步里的命令标志位是否置位了驱动输出的梯形图网络条件是否满足检查动作类型在GRAPH中确认步的动作是“非存储型N”还是“置位S”。如果你用“N”来驱动一个气缸伸出那么当步失效时这个输出就会断开气缸可能在中途缩回。对于需要保持的输出应使用“S”指令并在需要停止的步使用“R”指令。双线圈问题SFC的多个步或者SFC与梯形图之间对同一个输出点进行了重复赋值。PLC以最后一个扫描到的结果为准。使用交叉引用功能查找该输出点在哪里被使用了确保同一时刻只有一个地方在有效驱动它。物理输出点或负载故障程序逻辑一切正常但输出点LED不亮或负载不动作。检查输出模块是否供电正常、保险丝是否熔断、接线是否牢固、负载如继电器、电磁阀线圈是否损坏。5.4 仿真与在线调试技巧强制与修改值在软件监控状态下可以强制修改输入点的值如将I0.0强制为1来模拟按钮按下。也可以直接修改转移条件中涉及的变量值来测试流程跳转。注意在线修改程序或强制值后有时需要将PLC从RUN切换到STOP再切回RUN才能使新的SFC状态完全生效。单步执行西门子GRAPH和三菱GX Works2的SFC调试都支持单步执行。这是一个无比强大的功能。你可以让流程暂停在任意步然后手动触发转移条件观察流程如何一步一步推进非常利于理解程序逻辑和排查复杂分支问题。活动步监控在监控界面当前活动的步会高亮显示如变成蓝色或绿色。时刻关注活动步的变化是否与你的预期一致是调试的基本功。使用Trace功能高端PLC如S7-1500和软件支持Trace轨迹记录功能可以连续记录关键变量的变化。当出现随机性故障时通过回放Trace记录可以像看录像一样分析故障发生瞬间所有相关信号的状态对排查疑难杂症有奇效。从梯形图的“线式思维”切换到SFC的“面式思维”一开始可能会有点不习惯总觉得不如直接写逻辑来得“痛快”。但当你用SFC成功架构起一个包含手动、自动、报警、多种产品配方的大型设备程序后回头再看你会庆幸自己掌握了这项技能。它带来的最大好处不是写代码快了而是程序变得像工艺文档一样清晰可读。三个月后当设备需要改造或者新人需要接手维护时他们能顺着SFC图很快理解设备的运作脉络而不是面对数千行梯形图一头雾水。这种可维护性的提升对于工业软件的长期价值而言是至关重要的。我个人在项目中的习惯是但凡涉及明确的顺序、流程、模式切换首选SFC来搭建框架把流程控制与底层驱动、安全逻辑分离这让我的程序结构始终保持在一种可控的、优雅的状态。