2.1.3 子程序
1.子程序及其调用
什么是子程序?子程序是相对于主程序而言的独立的程序段,子程序完成的是各自独立的程序功能。它和中断服务程序一样,存放在副程序区。因此,PLC扫描时,执行子程序是有条件地的。仅当条件成立时,PLC才由主程序区转移到副程序区去执行相应的子程序段,这个过程一般称为子程序调用或呼叫子程序。
那么在什么情况下会用到子程序呢?有两种情况使编写子程序成为必要。一是在一些用户程序中,有一些程序功能会在程序中反复执行,如某些标定变换程序、报警程序、通信程序中的校验码程序等。这时,可将这些程序段编写成子程序,在需要时对其进行调用,避免了在主程序中反复重写这些程序段。这样可使主程序简单清晰,程序容量减少,扫描时间也相应缩短。另一种情况是当系统规模很大且控制要求复杂时,如果将全部控制任务放在主程序中,主程序将会非常复杂,既难以调试,也难以阅读。这时,使用子程序可以将程序分成容易管理的小块,使程序结构简单,易于阅读、调试、查错和维护。三菱FX系列PLC的功能指令实际上就是一个个子程序,在梯形图中应用功能指令时,实质上就是调用相应的子程序完成功能指令的操作功能。
在上文讲解程序流程时,曾经讲到当程序执行由主程序转移到子程序时,会在主程序区保存断点,断点保存是由PLC自动完成的。子程序调用指令必须指出程序转移地址,且当PLC执行相应的子程序段后还必须返回到主程序区,因此,子程序里必须要有返回指令。所以,子程序的结构应如图2-5所示。子程序入口标志因PLC不同而不同,但子程序调用指令和子程序返回指令在子程序调用时应成对出现,所有品牌的PLC都必须遵循这一原则。
图2-5 子程序的结构
一般来说,子程序调用都是有驱动条件的,仅当驱动条件成立时才调用子程序。如果想无条件调用子程序,可以使用特殊继电器来驱动子程序调用指令,例如,用三菱FX的M8000的常开触点作为驱动条件。
子程序可以在主程序中调用,也可以在中断服务程序中调用,还可以在其他子程序中调用,其调用执行过程都是相同的。
2.子程序嵌套
子程序嵌套是指在子程序中应用子程序调用指令去调用其他子程序。这时,其调用过程和主程序调用子程序一样。图2-6所示为三次调用子程序的程序扫描执行过程。
图2-6 三次调用子程序的程序扫描执行过程
PLC对子程序嵌套应用的层次是有限制的,也就是在子程序内对子程调用指令的使用次数是有限制的。三菱FX系列PLC最多只能使用4次子程序调用指令,其主程序最多有5层嵌套,西门子S-200 PLC最多为8层嵌套。
3.子程序编写
子程序是按照所完成的独立功能来编写的,但它完成后必须把相关控制数据通过软元件传送给主程序,而子程序本身也在使用软元件。由于三菱FX系列PLC的软元件是所有程序共享的,所以这就存在着一个软元件冲突问题(主要体现在数据寄存器D的地址冲突),当主程序和子程序都使用某一地址的D寄存器时,如果它的含义在主程序和子程序中不同,就会出现混乱。因此,当程序复杂,子程序较多时,必须对所用软元件进行统一分配,以避免发生混乱。同时,相同功能的子程序在不同控制系统中移植时,必须要检查子程序与新的主程序软元件有无地址冲突,如果有,则必须对子程序软元件进行修改或对主程序软元件进行修改。
子程序在调用时,其中各软元件的状态受程序执行的控制,但当调用结束时,其软元件则保持最后一次调用时的状态不变。如果这些软元件状态没有受到其他程序的控制,就会长期保持不变,哪怕是驱动条件发生了改变,软元件的状态也不会改变。
关于子程序编写的进一步说明将在子程序调用指令中讲解。