例说S7-300PLC中LOOP循环指令的使用
说明:
本篇文章是我获得头条图文原创申请资格后发表的第一篇文章,其实获得这个资格后心中还是有点忐忑的,因为我是头条新手,担心触犯到规则而失去资格,得而复失是谁都不想承受的。基于此,后续文章我可能会尽量省去对软件帮助文件中指令解释的切图,还望大家多多包涵!
引言:
我之前的文章讲了S7-200PLC中for循环的用法,也举例说明了循环指令配合指针可以进行数据的集中快速处理,想必大家对循环指令已经有了一个大致的概念。今天想给小伙伴们分享一下S7-300PLC中LOOP循环指令的用法,它的作用和200PLC中的for循环指令一样,因为在300梯形图的指令表下没有for指令(在SCL编程中是有for指令的),所以LOOP循环指令只能在STL编程语言下应用。
梯形图(LAD)语言编程是PLC中应用最广泛的编程方法,而语句表(STL)语言编程则是仅此于LAD的一种方法,至少我个人是这么认为的,所以今天就借LOOP指令的讲解了解一点吧。
文章的题目就是例说,所以直接上例子吧,为了方便大家对比200和300中的异同点,我做了一个和前一篇文章相似的程序:
OB1中的程序
这个图片就是我写在OB1中的两行程序,因为全部使用的M区的变量,所以整个项目就只有OB1这一个程序块。
图中程序段的第二行,我用红框标示出来的①和②,就是LOOP指令的使用方法。大家可以看到我对程序的备注,①处我备注的是循环指令的头,②处我备注的是循环指令的尾,其实在STEP7的帮助文件中没有对这个头尾进行太多的解释,但是我个人看过的所有LOOP循环程序中都是这样使用的,因此这个用法是一种规定规则性用法,大家需要遵照!
为了更详细的说明LOOP指令使用时应该遵守的规则,我对网络2进行了单独的切图:
程序段2的切图
图中建议直接套用的部分,大家直接套用就是,我目前还没有见过不是这么写的。
蓝色圈③处L 2就是把2装入ACCU1中,也就是装入32位累加器1中,其实帮助文件的解释是累加器1的低16位中的值不等于0的时候就会执行循环,也就一个字的表示范围(-32768~+32767),但是这里最好是输入0-65365之间的无符号数,免得自己混乱,而且从实际应用中来说循环几百次就差不多了!(我今天输入-2,程序也执行了循环,有兴趣的朋友可以自己深入测试!)
MW2可以自己随便制定,比如DB1.DBW50也是可以的,只需要这里是一个16位的变量即可。
再来说一下LOOP NEXT,这个NEXT其实是一个标签名字,这个是可以随便取的,如果SSS或者什么,但是要前后对应,而且必须在所处的块内是唯一的名字。因为这个LOOP循环指令其实是扫描到这里就跳转到前边的标签处,执行下一次循环程序,所以是要求这个LOOP指令和标签是处于一个块中的,而且必须是在同一个块中,帮助文件中也是这么描述的。
上边讲了硬性的规则,下边就来看一下程序运行的情况:
程序运行监控图--集合图
该图片是PLCSIM里边的监控,这次我没有用变量表来监控,就是为了方便把程序的执行过程展示给大家,图片中是A,B,C分别代表程序执行的3个阶段。
图片A阶段是CPU刚刚从STOP到RUN的监控图,可以看到所有的值都为0。
图片B阶段是我点击了M0.0让其为1,而后被自复位了,因为程序中网络段1就是M0.0接通就自复位,同时将字符串“YOUAREYANGMAN”中的字符装入MD8-MD20中。(一个字符需要占用1个字节,并且西门子300PLC中没有像200中那样的字符串复制梯形图指令,因此只有分段传送了,当然如果不用MOVE指令还是有别的办法的。)--同时可以看到MD32-MD44中的值全部都是0,是因为LOOP循环指令没有被执行。
图片C阶段是我点击了M0.2让其为1,网络2中的程序检测到M0.2的结果为1,执行JC就跳转到了love标签处,这个标签是跳转指令的标签不是LOOP指令的标签。当M0.2的结果为0的时候是执行JCN指令,跳转到了标签end处,end处是空指令,什么都不执行。程序执行到love标签处,先给MD100和MD200赋予一个初始值,然后进入循环指令,需要循环的次数是2次。
重点来说一下循环中的这段程序:
L MD[MD100],T MD[MD200]这里的[MD100],[MD200]其实都是32位变量的间接寻址,大家可以理解为是指针。在循环指令第一次执行的时候这里其实是L MD8,T MD32,也就是说吧MD8中的内容装到MD32中。(本文的主旨是讲循环指令,所以MD[MD100]=MD8的原因这里就不解释了,后续有时间会发文章出来)
MD8的值传送到MD32中,就可以看到MD32中的值从0变成了‘YOUA’,然后再执行MD100和MD200的自加32,实现地址的变更。当自加32完成后,MD[MD100]=MD12了,MD[MD200]=MD36了。--因为循环中的程序是先传送数据,而后变更地址,所以最新的地址要第二次循环的时候才被写入。
程序继续向下执行,在断点调试测试的时候可以看到,程序执行完L MW2这一句的时候,ACCU1的值还是2,当执行完LOOP NEXT的时候,ACCU1的值就变成了1,当第二次执行到LOOP NEXT指令的时候ACCU1的值就变为了0,所以程序不再继续循环了。--我说段话还有一个用意是解释为何监控图上最终MW2的值是1,为何不是0?
MW2最终为1是正确的,原因是第一次LOOP执行完,跳转到NEXT:T MW2,就是因为这句话造成了MW2为1的,因为T指令就是把ACCU1中的内如复制给后边的变量中,此时ACCU1是1,因此MW2位1。第二次循环指令执行到最后LOOP NEXT处后ACCU1的值为0了,就不跳转回去了,MW2没法再次被写了,所以说MW2=1是正确的最后结果。
当第二次执行循环程序时,是把MD12的值传送到MD36中,因此可以看到MD36的值从0变为了‘REYA’,后边的自加再次实现地址变更,地址变为MD16和MD40,可是程序循环2次结束了。(循环执行2次3次4次,我都实验了的,可以保证我说的是正确的,朋友们可以自行测试!)
LOOP NEXT在第二次执行完之后,程序就继续向下执行NOP 0处,至此所有的程序就执行完了!
指令和程序就分析完了,LOOP循环指令的一些硬性规则,以及程序执行的过程,特别是循环次数到达后MW2的值为1而不为0原因,希望通过我的这篇文章,能够让大家对这些有了更深入的认识。顺便说了一些STL编程中的相关指令,以及西门子300中间接寻址的方式,这些本文讲的比较浅,因为主旨是讲循环指令,望大家理解!
力求文章解释的清除明白还能有点深度是我的追求,如果觉得本文对您有帮助请关注,如有问题关注并留言,我会及时回复,谢谢!
例说300PLC中STL编程实现程序循环
说明:
本篇文章是我获得头条图文原创申请资格后发表的第一篇文章,其实获得这个资格后心中还是有点忐忑的,因为我是头条新手,担心触犯到规则而失去资格,得而复失是谁都不想承受的。基于此,后续文章我可能会尽量省去对软件帮助文件中指令解释的切图,还望大家多多包涵!
引言:
我之前的文章讲了S7-200PLC中for循环的用法,也举例说明了循环指令配合指针可以进行数据的集中快速处理,想必大家对循环指令已经有了一个大致的概念。今天想给小伙伴们分享一下S7-300PLC中LOOP循环指令的用法,它的作用和200PLC中的for循环指令一样,因为在300梯形图的指令表下没有for指令(在SCL编程中是有for指令的),所以LOOP循环指令只能在STL编程语言下应用。
梯形图(LAD)语言编程是PLC中应用最广泛的编程方法,而语句表(STL)语言编程则是仅此于LAD的一种方法,至少我个人是这么认为的,所以今天就借LOOP指令的讲解了解一点吧。
文章的题目就是例说,所以直接上例子吧,为了方便大家对比200和300中的异同点,我做了一个和前一篇文章相似的程序:
OB1中的程序
这个图片就是我写在OB1中的两行程序,因为全部使用的M区的变量,所以整个项目就只有OB1这一个程序块。
图中程序段的第二行,我用红框标示出来的①和②,就是LOOP指令的使用方法。大家可以看到我对程序的备注,①处我备注的是循环指令的头,②处我备注的是循环指令的尾,其实在STEP7的帮助文件中没有对这个头尾进行太多的解释,但是我个人看过的所有LOOP循环程序中都是这样使用的,因此这个用法是一种规定规则性用法,大家需要遵照!
为了更详细的说明LOOP指令使用时应该遵守的规则,我对网络2进行了单独的切图:
程序段2的切图
图中建议直接套用的部分,大家直接套用就是,我目前还没有见过不是这么写的。
蓝色圈③处L 2就是把2装入ACCU1中,也就是装入32位累加器1中,其实帮助文件的解释是累加器1的低16位中的值不等于0的时候就会执行循环,也就一个字的表示范围(-32768~+32767),但是这里最好是输入0-65365之间的无符号数,免得自己混乱,而且从实际应用中来说循环几百次就差不多了!(我今天输入-2,程序也执行了循环,有兴趣的朋友可以自己深入测试!)
MW2可以自己随便制定,比如DB1.DBW50也是可以的,只需要这里是一个16位的变量即可。
再来说一下LOOP NEXT,这个NEXT其实是一个标签名字,这个是可以随便取的,如果SSS或者什么,但是要前后对应,而且必须在所处的块内是唯一的名字。因为这个LOOP循环指令其实是扫描到这里就跳转到前边的标签处,执行下一次循环程序,所以是要求这个LOOP指令和标签是处于一个块中的,而且必须是在同一个块中,帮助文件中也是这么描述的。
上边讲了硬性的规则,下边就来看一下程序运行的情况:
程序运行监控图--集合图
该图片是PLCSIM里边的监控,这次我没有用变量表来监控,就是为了方便把程序的执行过程展示给大家,图片中是A,B,C分别代表程序执行的3个阶段。
图片A阶段是CPU刚刚从STOP到RUN的监控图,可以看到所有的值都为0。
图片B阶段是我点击了M0.0让其为1,而后被自复位了,因为程序中网络段1就是M0.0接通就自复位,同时将字符串“YOUAREYANGMAN”中的字符装入MD8-MD20中。(一个字符需要占用1个字节,并且西门子300PLC中没有像200中那样的字符串复制梯形图指令,因此只有分段传送了,当然如果不用MOVE指令还是有别的办法的。)--同时可以看到MD32-MD44中的值全部都是0,是因为LOOP循环指令没有被执行。
图片C阶段是我点击了M0.2让其为1,网络2中的程序检测到M0.2的结果为1,执行JC就跳转到了love标签处,这个标签是跳转指令的标签不是LOOP指令的标签。当M0.2的结果为0的时候是执行JCN指令,跳转到了标签end处,end处是空指令,什么都不执行。程序执行到love标签处,先给MD100和MD200赋予一个初始值,然后进入循环指令,需要循环的次数是2次。
重点来说一下循环中的这段程序:
L MD[MD100],T MD[MD200]这里的[MD100],[MD200]其实都是32位变量的间接寻址,大家可以理解为是指针。在循环指令第一次执行的时候这里其实是L MD8,T MD32,也就是说吧MD8中的内容装到MD32中。(本文的主旨是讲循环指令,所以MD[MD100]=MD8的原因这里就不解释了,后续有时间会发文章出来)
MD8的值传送到MD32中,就可以看到MD32中的值从0变成了‘YOUA’,然后再执行MD100和MD200的自加32,实现地址的变更。当自加32完成后,MD[MD100]=MD12了,MD[MD200]=MD36了。--因为循环中的程序是先传送数据,而后变更地址,所以最新的地址要第二次循环的时候才被写入。
程序继续向下执行,在断点调试测试的时候可以看到,程序执行完L MW2这一句的时候,ACCU1的值还是2,当执行完LOOP NEXT的时候,ACCU1的值就变成了1,当第二次执行到LOOP NEXT指令的时候ACCU1的值就变为了0,所以程序不再继续循环了。--我说段话还有一个用意是解释为何监控图上最终MW2的值是1,为何不是0?
MW2最终为1是正确的,原因是第一次LOOP执行完,跳转到NEXT:T MW2,就是因为这句话造成了MW2为1的,因为T指令就是把ACCU1中的内如复制给后边的变量中,此时ACCU1是1,因此MW2位1。第二次循环指令执行到最后LOOP NEXT处后ACCU1的值为0了,就不跳转回去了,MW2没法再次被写了,所以说MW2=1是正确的最后结果。
当第二次执行循环程序时,是把MD12的值传送到MD36中,因此可以看到MD36的值从0变为了‘REYA’,后边的自加再次实现地址变更,地址变为MD16和MD40,可是程序循环2次结束了。(循环执行2次3次4次,我都实验了的,可以保证我说的是正确的,朋友们可以自行测试!)
LOOP NEXT在第二次执行完之后,程序就继续向下执行NOP 0处,至此所有的程序就执行完了!
指令和程序就分析完了,LOOP循环指令的一些硬性规则,以及程序执行的过程,特别是循环次数到达后MW2的值为1而不为0原因,希望通过我的这篇文章,能够让大家对这些有了更深入的认识。顺便说了一些STL编程中的相关指令,以及西门子300中间接寻址的方式,这些本文讲的比较浅,因为主旨是讲循环指令,望大家理解!
力求文章解释的清除明白还能有点深度是我的追求,如果觉得本文对您有帮助请关注,如有问题关注并留言,我会及时回复,谢谢!
相关问答
plc往复循环程序怎么写?
PLC往复循环程序的编写方法如下:PLC往复循环程序可以通过使用计数器和跳转指令来实现。往复循环程序的目的是使PLC在一定条件下反复执行一段程序。为了实现这...
plc编程最后循环到第一步怎么编?
plc编程实现循环有多种方法,可以用到跳转指令,蛮方便的,也可以用调用指令,看个人习惯,跳转和调用指令都可用来做手动自动的转换,不过用它们的话,手动和自动的...
西门子PLC怎么完成循环啊S7-200我是用定时器来完成程序的,我TOF以后程序就完成了,怎么回到开头啊?
循环控制吗,那不是很简单,一般都是顺序控制,只要你在最后步执行完了跳转到需要循环开始点就可以了。如果需要多个这样的循环,另外编程,可以调用子程序方式实...
西门子系统循环编程怎么编?
西门子系统的循环编程可以使用西门子的编程软件STEP7或TIAPortal来实现。以下是一般的步骤:1.打开STEP7或TIAPortal软件,并创建一个新的项目或打开一个...
拉料器循环编程实例?
一、首先将拉料器安装到本机上,同时使用控制信号线将拉料器与PLC信号接口连接起来;二、用PLC编程软件定义拉料器运动的方向和速度,定义起动信号与停止信号;...
西门子plcfor…to循环的用法?
您好,西门子PLC的循环用法可以通过使用循环指令来实现。循环指令可以在程序中重复执行一段代码,直到满足某个条件为止。常见的循环指令有以下几种:1.FOR循...
三菱plc步进指令是一直循环的,我如何控制它要循环几次?
1、打开三菱plc的相关窗口,直接在梯形图输入的基础上确定LDX0。2、下一步需要通过梯形图输入,来继续确定FMOVK6D0K3。3、等转换编译结果以后,就确定模拟...
简述PLC循环扫描的工作过程及特点?
PLC的工作方式采用不断循环的顺序扫描工作方式。每一次扫描所用的时间称为扫描周期或工作周期。CPU从第一条指令执行开始,按顺序逐条地执行用户程序直到用户...
plc中单周期和单步是什么意思?
1、在PLC(可编程逻辑控制器)中,单周期是指PLC在一个循环中所需要的时间,即完成一次扫描所有输入和输出的时间。2、单步是指PLC的执行过程被分解成多个步骤...
西门子1500PLC转到在线时循环周期过大怎么回事,怎么解决?
有可能是程序过大,造成扫描周期过长,也有可能程序编写有问题造成死循环,另外就是硬件问题。有可能是程序过大,造成扫描周期过长,也有可能程序编写有问题造成...