时间:2025-03-12
【注:以下内容是以基于 汇川PLC(easy52x) 使用AutoShop编程模拟仿真来写的,其他品牌PLC可能会略有差异,本文章旨在快速上手STL和SFC编程】
推荐学习顺序
梯形图 --> STL步进梯形图 --> SFC顺序功能图
STL步进梯形图
STL步进梯形图 不同于 普通梯形图,它可以把一个完整的运行过程分成若干步来完成,每一步就是一种状态,当满足某种条件时,就可以从当前状态切换到下一个状态;这种控制方式,只有当前状态下的指令会执行,其他状态下的指令不会执行;
STL步进梯形图指令
STL步进梯形图指令只有STL和RET两个指令,普通梯形图中的指令也可以使用;
STL 指令
功能:表示进入某一状态S;程序跳至副母线,即程序只会执行当前状态S处的指令,其他状态处的指令不会执行;
格式:STL Sn
Sn表示状态,如S0,S1....等;
举例:STL S0 //进入状态0;
左边最粗的竖线就是主母线,相当于主程序,右边细一点的竖线就是副母线,相当于状态S0下的执行过程;
RET 指令
功能:表示结束步进梯形图程序;程序跳至主母线,继续执行主母线后面的非步进指令或步进指令(如果有的话);
格式:RET
(注意:AutoShop软件中RET必须直连在STL指令后面,如下a图所示,b图和c图都会报错!)
STL步进梯形图编程
状态编号
为了能把STL步进梯形图顺利转成SFC顺序功能图,推荐使用SFC的状态号规则:S0~S9为初始状态软元件,S10~S19可以用于特殊目的,其他普通状态可以使用S20~S889等;
STL步进图中对状态号没有严格限制,初始状态号设置成S0~S9之外的也能用;但是SFC顺序功能图中却有严格的要求,初始状态号只能是S0~S9,其他普通步进状态号只能是S10~S889等;
进入初始状态
由于步进状态S一般使用常开触点,因此,启动PLC后并不会直接进入初始状态,所以,需要我们提前设置好,让它进入初始状态,其中,最简单的办法就是使用SET指令直接设置为初始状态;
例如:
M8002软元件是程序运行的第1个扫描周期标志,程序运行第1个扫描周期为ON,后面一直为OFF,也就是说程序运行第一个扫描周期时M8002导通,S0置1,后面的初始状态S0常闭触点也就导通,即进入初始状态S0;
步进程序的组成
一个完整的 STL步进梯形图 由STL指令进入,到RET指令结束;中间的程序只会在状态间切换,从当前状态切换到下一状态需要满足跳转条件;
一个完整的 步进程序 一般由 普通梯形图 + STL步进梯形图 组成;一个典型的例子就像这样:普通梯形图用于控制进入步进初始状态,STL步进梯形图用于实现不同状态的功能;
即:普通梯形图 ==> [STL--步进--RET]
也就是说,STL步进梯形图中也可以穿插普通梯形图,但是需要遵循规则:普通梯形图必须插在一个STL步进梯形图的结尾,不能插在中间;
即:普通梯形图 ==> [STL--步进--RET] ==> 普通梯形图 ==> [STL--步进--RET];
关于STL步进梯形图编程的一些规则(自己去验证)
1)不同状态S下,可以使用同一个输出而不出现双线圈输出;
2)在一个扫描周期内,从当前状态切换到下一状态时,会出现两个状态同时接通的瞬间;应对办法,设置互锁;
3)相邻状态不能使用同一定时器;
4)状态转移除了用SET指令也可以用OUT指令,但SFC中OUT指令用于向分离的状态转移;
5)中断和子程序中不能使用STL指令
6)STL步进程序中最好不要用跳转指令,不是因为禁止使用,而是因为逻辑会变得太复杂;
流水灯实例
举个简单的例子,现有A、B、C三盏灯,运行要求:启动按钮按下,ABC依次亮3秒,然后重复,停止按钮按下系统停止运行!
以下就是完整的步进程序,只是为了实现仿真功能,不作优化和其他考虑;
网络1:开机后,按下“启动按钮”X0的时候,S0置位(进入初始状态),M0置位(由于是SET指令,所以会保持),“运行指示”灯Y6亮;运行时,按下“停止按钮”,M0复位,“运行指示”灯Y6灭;
网络2:是初始状态S0;
“启动按钮”按下时就会进入初始状态,初始状态下用于复位状态S24,并进入下一个状态S21;复位S24是因为运行过程中,当按下“停止按钮”时,会进入停止状态S24,S24被置位,因此,当再次按下“启动按钮”运行系统时,需要复位S24;
网络3:是状态S21;
运行时,进入状态S21后,S21常开触点和M1常开触点都置位导通,灯A亮,灯A亮导致计时器开始计时,3秒后,计时器输出端口Q置位,即M1置位,M1常开触点闭合,进入状态S22,S21常开触点断开,S21状态的功能失效(灯A灭,计时器复位);
当按下“停止按钮”时,M0常开触点断开,灯A灭,计时器复位并进入状态S24(停止状态);
网络4:是状态S22,过程和状态S21一样分析;
网络5:是状态S23,过程和状态S21一样分析;
网络6: 是状态S24(停止状态);该状态下“停止指示”灯亮,然后退出步进,回到主程序继续执行;
流水灯实例仿真结果
启动按钮(X0)按下(左图)弹起(右图)后的效果:运行指示灯(Y6)亮,灯A(Y0)亮
流水灯仿真效果:灯A(Y0)、灯B(Y1),灯C(Y2)3秒轮流亮
状态S21(左图),灯A(Y0)亮,运行指示灯(Y6)亮,此时按下“停止按钮”X1的演示效果(右图):运行指示灯(Y6)和 灯A(Y0)灭,停止指示灯(Y7)亮;
SFC顺序功能图
SFC顺序功能图比STL步进图还要直观,它是用图形符号来展示整个流程的;可以这么说,会写STL步进图,基本上就会写SFC顺序功能图了;SFC只是把某个状态下要执行的指令全部放在了一个“步进符”中,而转移条件放在了“状态转移条件图”中;
下面展示一下SFC顺序功能图的样式:
符号定义
至于大家叫它们符号还是叫它们图块,怎么顺口怎么来吧!
![]() | 梯形块图,里面是普通的梯形图; |
![]() | 起始步进符(图),就是初始状态,一个程序只能有一个起始符; |
![]() | 普通步进符(图),S10~S889; |
![]() | 状态转移条件图,就是从一个状态转至另一个状态的条件 |
![]() | 向上状态转移图,用于状态转移至上面的某个状态S; SFC编程从上到下,状态号不能重复使用,当需要从底部返回上面的状态时,就用这个; |
![]() | 状态复位图,用于复位某个状态S;其他状态改变; |
![]() | 选择分支图,用于从同一个步进点按不同条件转至多个步进点; |
![]() | 分支汇合图,用于多个步进点按不同条件转至同一个步进点; |
![]() | 并行分支图,用于由同一个步进点按同一个条件转至多个步进点; |
![]() | 并行分支汇合图,用于多个步进点按同一个条件合并至同一个步进点; |
SFC编程的特点
1)和STL步进梯形图一样,SFC顺序功能图也需要设置好状态才能进入初始状态;这些用于触发进入初始状态的梯形图都可以放在中来完成;最简单的办法就是通过M8002来驱动指令SET S0进入初始状态;
2)初始状态号只能是S0~S9,其他普通步进状态号只能是S10~S889等;
3)SFC中状态号不能重复使用;
4)SFC可以实现复杂的分支流程,如下图所示:
SFC实例
为了方便对比STL步进图,就拿前面 STL步进梯形图 的 流水灯实例 来转换成SFC顺序功能图,它们整体对应关系如下图所示:
流水灯实例 网络1 的转换
流水灯实例 的STL步进图 网络1替换前:
替换后:
流水灯实例 的网络1等效于SFC顺序图中的
,其中
的内置梯形图如下图所示,与流水灯实例 的网络1内容完全一样;
流水灯实例 网络2(初始状态S0) 的转换
流水灯实例 的STL步进图网络2(初始状态S0)替换前:
替换后:
和STL步进图不一样的地方在于没有了STL指令 ,初始步进符
和普通步进符
就相当于STL指令
;转移状态的指令变成了
,转移条件如下所示:
流水灯实例 的网络3(状态S21)的转换
流水灯实例 的网络3(状态S21)、网络4(状态S22)、网络5(状态S23),把它们转换成SFC顺序图步骤一样,下面以网络3(状态S21)的转换为例;
流水灯实例 的STL步进图网络3 转换前:
转换后:
从上图中可以看出,除了状态转移的指令被移除外,其他的都保留在状态S21内置梯形图中;
第一条状态转移SET S22指令的条件(M0和M1常开触点)被替换成了左边的“‘状态转移符’”;
第二条状态转移SET S24指令的条件(M0常开触点和取反指令)被替换成了右边的“状态转移符”;
流水灯实例 的网络6(状态S24)的转换
流水灯实例 的STL步进图网络6 替换前:
替换后:
总结:普通输出指令作为该状态下的执行过程被留在步进符内,而要转移状态的SET输出指令变成“状态转移符”,转移条件就是SET指令的执行条件, 除了STL指令外;
SFC实例仿真结果
SFC顺序功能图的仿真结果和STL步进梯形图的仿真效果一样;
“启动按钮”(X0)按下弹起的演示效果:运行指示灯(Y6)亮,开始流水灯;
流水演示:灯A(Y0)、灯B(Y1)、灯C(Y2)、轮流亮3秒;运行指示灯(Y6)亮;
停止按钮(X1)被按下:运行指示灯(Y6)灭,停止指示灯(Y7)亮;