1.什么时候需要使用子程序
当系统规模较大、控制要求复杂时,如果将全部控制任务放在主程序内,则主程序将会非常复杂,既难以调试,也难以阅读。使用子程序可以将程序分成容易管理的小块,使程序结构简单清晰,易于查错和维护。
子程序也用于需要多次反复执行相同任务的地方,只需要编写一次子程序,别的程序在需要的时候调用它,而无需重写该程序。
每个扫描周期都要执行一次主程序。子程序的调用可以是有条件的,子程序没有被调用时,不会执行其中的指令。
2.与子程序有关的指令
FX1S的子程序调用指令CALL(FNC 01)的操作数为P0~P62,其他系列的指针点数见表1-1(不包括P63),子程序返回指令SRET(FNC 02)无操作数。
主程序结束指令FEND(FNC 06)无操作数,表示主程序结束。执行到FEND指令时PLC进行输入/输出处理、监控定时器刷新,完成后返回第0步。主程序是从第0步开始到FEND指令的程序,子程序是从CALL指令指定的指针Pn到SRET指令的程序。
子程序(包括中断子程序)应放在FEND指令之后。如果有多条FEND指令,则子程序和中断程序应放在最后的FEND指令和END指令之间。CALL指令调用的子程序必须用子程序返回指令SRET结束。
FEND指令如果出现在FOR-NEXT循环中,则程序出错。
图4-68中的程序见随书光盘中的例程“子程序调用”。X0为ON时,“CALL P1”指令使程序跳到指针P1所在的第13步,P1开始的子程序被执行,执行完第46步的SRET指令后返回到“CALL P1”指令下面第8步的指令。子程序放在FEND(主程序结束)指令之后。
图4-68 子程序调用例程
同一个指针只能出现一次,同一个指针开始的子程序可以被不同的CALL指令多次调用。CJ指令用过的指针不能再用于CALL指令。
3.子程序调用对位软元件的影响
停止调用子程序后,不再执行子程序中的指令,子程序中线圈对应的软元件保持子程序被执行的最后一个扫描周期结束时的状态不变。
打开随书光盘中的例程“子程序调用”后,打开GX Simulator,启动软元件监视视图,生成X窗口、Y窗口和M窗口。
令X0为ON,调用P1开始的子程序,可以用X1~X3分别控制Y0、M0和S0。
令X0为OFF,停止调用P1开始的子程序。Y0、M0和S0保持X0的下降沿前一扫描周期的状态不变,不能用X1~X3分别控制Y0、M0和S0,因为这时根本就没有执行该子程序中的指令。
4.子程序与定时器和计数器
仿真时令X0为OFF,未调用P1开始的子程序,不能用X4启动T0的定时。令X0为ON,调用P1开始的子程序。令X4为ON,T0开始定时。在定时过程中令X0为OFF,停止调用P1开始的子程序,T0的当前值保持不变。重新调用该子程序,T0在保持的当前值的基础上继续定时。
在子程序中应使用子程序和中断子程序专用的100ms累计型定时器T192~T199。(www.xing528.com)
子程序中的T192正在定时的时候停止调用子程序,T192仍继续定时,定时时间到时,T192的触点也会接通。在调用子程序时令T192的线圈断电,它被复位,当前值变为0。
在子程序和中断子程序中,如果使用了1ms累计型定时器,则当它达到设定值之后,在最初执行的线圈指令处输出触点会动作。
在子程序中对累计型定时器或计数器执行RST指令后,它的复位状态也被保持。以图4-68中的C0为例,它的线圈指令在子程序之外,复位指令在子程序内。令X0为ON,调用指针P1开始的子程序。令X6为ON,C0被RST指令复位。如果没有第二条“RST C0”指令,则在X6为ON时(C0被复位)令X0为OFF,停止调用子程序。此时C0仍然保持复位状态,用X5发出计数脉冲,C0不能计数。
增加了用一直为OFF的M8001的常开触点控制复位C0的指令后,第一条“RST C0”指令将C0复位,第二条“RST C0”指令的执行条件不满足,取消了对RST的复位操作,解除了对C0复位的保持状态,停止调用子程序后不会影响对C0的计数操作。在仿真时可以验证有、无第2条“RST C0”指令对C0计数的影响。
5.子程序中的应用指令
令X0为ON,调用P1开始的子程序。周期为1s的时钟脉冲M8013通过INCP指令使D0每秒加1。令X0为OFF,因为未调用该子程序,没有执行INCP指令,D0的值保持不变。
6.子程序中的双线圈
同一个位软元件的线圈可以在调用条件相反的两个子程序中分别出现一次。图4-68中的程序分别用X0的常开触点和常闭触点调用指针P1和P2开始的子程序,两个子程序中都有Y0的线圈。X0为ON时,调用P1开始的子程序,可以用X1控制Y0;X0为OFF时,调用P2开始的子程序,可以用X11控制Y0。
7.子程序的嵌套调用
子程序可以多级嵌套调用,即子程序可以调用别的子程序。嵌套调用的层数是有限制的,最多嵌套5层。
仿真时令X0为ON,调用图4-68中P1开始的子程序。同时令X12为ON,执行指令“CALL P3”,嵌套调用P3开始的子程序。此时才能用X13来控制Y2。执行完P3开始的子程序后,从第54步返回“CALL P3”下面第46步的指令。执行完P1开始的子程序后,从第46步返回主程序中指令“CALL P1”下面第8步的指令。
X0或X12为OFF时,不能调用P3开始的子程序。
8.多条FEND指令的使用
如果主程序中有因为跳转产生的分支,则每条分支结束时都需要用一条FEND指令来结束该分支程序。图4-69给出了一个使用多条FEND指令的例子(见随书光盘中的例程“多条FEND”)。X0为ON时跳转条件满足,跳转到指针P0对应的第11步。执行第20步的FEND指令时,跳转到END指令处,结束本次扫描周期的程序执行。X0为OFF时,跳转条件不满足,从第8步开始顺序执行指令。执行到第10步的FEND指令时,跳转到END指令处。
仿真的步骤如下:
1)令X0分别为ON和OFF,观察是否能用X2控制Y0,用X4控制Y1。
2)令X1分别为ON和OFF,观察在X5的上升沿(从OFF变为ON)时,D4的值是否能加1。
图4-69 多条FEND指令应用例程
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。