程序控制类指令使程序结构灵活,合理使用该指令可以优化程序结构,增强程序功能。这类指令主要包括:结束、停止、看门狗、跳转、子程序、循环和顺序控制等指令。
1、结束指令end
结束指令分为有条件结束指令(end)和无条件结束指令(mend)。两条指令在梯形图中以线圈形式编程。指令不含操作数。执行结束指令后,系统终止当前扫描周期,返回主程序起点。使用说明:
(1)结束指令只能用在主程序中,不能在子程序和中断程序中使用。而有条件结束指令可用在无条件结束指令前结束主程序。
(2)在调试程序时,在程序的适当位置置入无条件结束指令可实现程序的分段调试。
(3)可以利用程序执行的结果状态、系统状态或外部设置切换条件来调用有条件结束指令,使程序结束。
(4)使用micro/win32编程时,编程人员不需手工输入无条件结束指令,该软件会自动在内部加上一条无条件结束指令到主程序的结尾。
2、停止指令stop
stop指令有效时,可以使主机cpu的工作方式由run切换到stop,从而立即中止用户程序的执行。stop指令在梯形图中以线圈形式编程。指令不含操作数。
stop指令可以用在主程序、子程序和中断程序中。如果在中断程序中执行stop指令,则中断处理立即中止,并忽略所有挂起的中断。继续扫描程序的剩余部分,在本次扫描周期结束后,完成将主机从run到stop的切换。
stop和end指令通常在程序中用来对突发紧急事件进行处理,以避免实际生产中的意外损失。
3、看门狗复位指令wdr(watchdog reset)
wdr称为看门狗复位指令,也称为警戒时钟刷新指令。它可以把警戒时钟刷新,即延长扫描周期,从而有效地避免看门狗超时错误。wdr指令在梯形图中以线圈形式编程,无操作数。
使用wdr指令时要特别小心,如果因为使用wrd指令而使扫描时间拖得过长(如在循 环结构中使用wdr),那么在中止本次扫描前,下列操作过程将被禁止:
(1)通讯(自由口除外);
(2)i/o刷新(直接i/o除外);
(3)强制刷新;
(4)sm位刷新(sm0、sm5一sm29的位不能被刷新);
(5)运行时间诊断;
(6)扫描时间超过25 s时,使10 ms和100 ms定时器不能正确计时;
(7)中断程序中的stop指令。
注意:如果希望扫描周期超过300ms,或者希望中断时间超过300ms,则最好用wdr指令来重新触发看门狗定时器。结束指令、停止指令和wdr指令的用法如图1所示。
图1 结束、停止及看门狗指令
4、跳转及标号指令
跳转指令可以使plc编程的灵活性大大提高,可根据对不同条件的判断,选择不同的程序段执行程序。
跳转指令jmp(jump to label):当输入端有效时,使程序跳转到标号处执行。
标号指令lbl(label):指令跳转的目标标号。操作数n为0—255。
使用说明:
(1)跳转指令和标号指令必须配合使用,而且只能使用在同一程序段中,如主程序、同一个子程序或同一个中断程序。不能在不同的程序段中互相跳转。
(2)执行跳转后,被跳过程序段中的各元器件的状态:
①q、m、s、c等元器件的位保持跳转前的状态;
②计数器c停止计数,当前值存储器保持跳转前的计数值;
③对定时器来说,因刷新方式不同而工作状态不同。在跳转期间,分辩率为1 ms和10 ms的定时器会一直保持跳转前的工作状态,原来工作的继续工作,到设定值后其位的状态也会改变,输出触点动作,其当前值存储器一直累计到最大值32 767才停止。对分辨率为100 ms的定时器来说,跳转期间停止工作,但不会复位,存储器里的值为跳转时的值,跳转结束后,若输入条件允许,可继续计时,但已失去了准确计时的意义。所以在跳转段里的定时器要慎用。跳转指令的使用方法如图2所示。
图2 跳转指令
5、循环指令(for和next)
循环指令的引入为解决重复执行相同功能的程序段提供了极大方便,并且优化了程序结构。循环指令有两条:循环开始指令for,用来标记循环体的开始,用指令盒表示。循环结束指令next,用来标记循环体的结束。无操作数。
for和next之间的程序段称为循环体,每执行一次循环体,当前计数值增1,并且将其结果同终值作比较,如果大于终值,则终止循环。
循环开始指令盒中有三个数据输入端:当前循环计数indx(index value or current loop count)、循环初值init(starting value)和循环终值final(ending value)。在使用时必须给for指令指定当前循环计数(indx)、初值(init)和终值(final)。
indx操作数:vw、iw、qw、mw、sw、smw、lw、t、c、ac、*vd、*ac和*cd;属int型。
init和finai。操作数:vw、iw、qw、mw、sw、smw、lw、t、c、ac、常数、*vd、* ac和*cd;属int型。
循环指令使用如图3所示。当i1.0接通时,表示为a的外层循环执行100次。当i1.1接通时,表示为b的内层循环执行2次。使用说明:
(1)for、next指令必须成对使用。
(2)for和next可以循环嵌套,嵌套最多为8层,但各个嵌套之间不可有交叉现象。
(3)每次使能输入(en)重新有效时,指令将自动复位各参数。
(4)初值大于终值时,循环体不被执行。
图4 循环指令
子程序
子程序在结构化程序设计中是一种方便有效的工具。s7—200 plc的指令系统具有简单、方便、灵活的子程序调用功能。与子程序有关的操作有:建立子程序、子程序的调用和返回。
(1)建立子程序
建立子程序是通过编程软件来完成的。可用编程软件“编辑”菜单中的“插入”选项,选择“子程序”,以建立或插入一个新的子程序,同时,在指令树窗口可以看到新建的子程序图标,默认的程序名是sbr_n,编号n从0开始按递增顺序生成,也可以在图标上直接更改子程序的程序名,把它变为更能描述该子程序功能的名字。在指令树窗口双击子程序的图标就可进入子程序,并对它进行编辑。
(2)子程序调用指令call和子程序条件返回指令cret
在子程序调用指令call使能输入有效时,主程序把程序控制权交给子程序。子程序的调用可以带参数,可以不带参数。它在梯形图中以指令盒的形式编程。
在子程序条件返回指令cret使能输入有效时,结束子程序的执行,返回主程序中(此子程序调用的下一条指令)。梯形图中以线圈的形式编程,指令不带参数。
(3)应用举例
图7.37所示的程序实现用外部控制条件分别调用两个子程序。使用说明:
①cret多用于子程序的内部,由判断条件决定是否结束子程序调用,ret用于子程序的结束。用micro/win32编程时,编程人员不需要手工输入ret指令,而是由软件自动加在每个子程序结尾。
②子程序嵌套 如果在子程序的内部又对另一子程序执行调用指令,则这种调用称为子程序的嵌套。子程序的嵌套深度最多为8级。
③当一个子程序被调用时,系统自动保存当前的堆栈数据,并把栈顶置1,堆栈中的其他值为o,子程序占有控制权。子程序执行结束,通过返回指令自动恢复原来的逻辑堆栈值,调用程序又重新取得控制权。
④累加器可在调用程序和被调用子程序之间自由传递,所以累加器的值在子程序调用时既不保存也不恢复。
图7.38 子程序调用指令