1.用于循环的指令
循环范围开始指令FOR(FNC 08)用来表示循环区的起点,它的源操作数循环次数N(N= 1~32767)可以是任意的字软元件。如果N为负数,则当作N=1处理,循环最多可以嵌套5层。
循环范围结束指令NEXT(FNC 09)用于表示循环区的终点,无操作数。
FOR与NEXT之间的程序被反复执行,执行次数由FOR指令的源操作数设定。执行完后,执行NEXT后面的指令。
如果FOR与NEXT指令没有成对使用,或NEXT指令放在FEND和END指令的后面,则都会出错。
循环程序是在一个扫描周期中完成的。如果执行FOR-NEXT循环程序的时间太长,扫描周期超过监控定时器的设定时间,则将会出错。
2.双重循环程序
在图4-77中,外层循环程序A嵌套了内层循环程序B。每执行一次外层循环A,就要执行4次内层循环B。循环A执行5次,因此循环B一共要执行20次。可以用循环中的CJ指令跳出FOR-NEXT之间的循环区。
图4-77 双重循环程序
打开随书光盘中的例程“双重循环”后,打开GX Simulator,启动软元件监视视图,生成X窗口。双击X窗口中的X1,将它置为ON。在X1的上升沿调用指针P1开始的子程序,执行子程序中的双重循环。每次内层循环将D0加1,因为内层循环B一共执行了20次,所以循环结束后D0的值为20。(www.xing528.com)
3.用循环程序求累加和
在X1的上升沿调用子程序(见图4-78),用子程序求D10开始的5个字的累加和。
在子程序中,首先用复位指令RST和区间复位指令ZRST,将变址寄存器Z0、保存累加和的32位整数(D0,D1)和暂存数据的32位整数(D2,D3)清零。因为要累加5个字,FOR指令中的K5表示循环5次,每次循环累加1个数。
求累加和的关键是在循环过程中修改被累加的操作数的软元件号,这是用变址寄存器Z0的变址寻址功能来实现的。第一次循环时,Z0的值为初始值0,MOV指令中的D10Z0对应的软元件为D10,被累加的是D10的值。累加结束后,INC指令将Z0的值加1。第二次循环时,D10Z0对应的软元件为D11,被累加的是D11的值……累加5个数后,结束循环,执行NEXT指令之后的SRET指令。从当前值监视行可以看出,32位整数(D0,D1)中的累加和为56000。
一个字能表示的最大整数为32767,如果采用16位的加法指令,累加和超过32767时,则进位标志M8022为ON,不能得到正确的运算结果。为了解决这个问题,采用32位的加法指令DADD。执行加法指令之前,首先将16位的被累加的数传送到D2,因为开机时D3被清零,32位整数(D2,D3)的值与被累加的数相同。
图4-78 累加数据的循环程序与软元件监视视图
打开随书光盘中的例程“循环程序”后,打开GX Simulator,启动软元件监视视图,生成X窗口和D窗口。选中D窗口,设置数据格式为16位整数后,设置D10~D14的值(见图4-78的右图),最好使它们之和大于32767。双击X窗口中的X1,在X1的上升沿执行循环程序。
因为32位整数D0中的累加和超过一个字能表示的最大正数32767,D窗口中D0的16 位监视值不能正确地显示32位整数中的值。将数据格式设置为32位整数,才能看到(D0,D1)中的32位整数的累加和。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。