PLC教程理论篇之流程控制指令与模块化程序组织一一、程序流程控制指令PLC执行指令,一般是从零地址开始,依次执行,直到最后。但也可用程序流程控制指令予以改变。此类指令除了步进指令外,还有:跳转、循环、调用子程序及中断等1.跳转指令OMRON机用的为JMP及JME。这两条配对使用。JMP指令执行前,要建立逻辑条件。JME不要条件,只是表示跳转结束。要跳转的程序列于这两个指令之间。当执行JMP时,若其逻辑条件为ON,则不跳转(注意:它与计算机汇编语言跳转含义相反),照样执行JMP与JME间的指令,如同JMP、JME不存在一样;若为OFF,则JMP与JME间的程序不执行,有关输出保持不变。JMP、JME可嵌套使用,但有时其层次要受限制的。JMP、JME编号使用时,配对的两个,编号要一致。三菱与西门子PLC的跳转类似计算机汇编语言的跳转,若其逻辑条件为ON,则跳转到指定的标号的语句去执行。这种跳转情况稍复杂一些,使用时要小心。弄不好,易出现程序死循环。那是绝对不允许的。图10-1示的为跳转指令使用示意。a)OMRONPLCb)西门子PLCc)三菱PLC图10-1PLC的跳转指令使用示意图a)为OMRON的跳转,0.00OFF时,JMP到JME之间的指令跳过,不执行。反之,执行。图b)为西门子的跳转,V500.1ON时,跳转到LBL2处,被跳过的指令不执行。反之不跳,JMP后的指令依次执行。图c)为三菱的跳转,X000ON时,跳转到标号P1处,被跳过的指令不执行。反之不跳,CJP后的指令依次执行。不同厂家PLC跳转指令的差别,正如其它指令的差别一样,都只是大同小异。目的都是跳转,只是表达的方法,各有其不同而已。当程序需要分支执行时,使用到跳转,不仅可实现程序设计要求,而且还可减少程序扫描时间,提高程序的运行效率。与跳转类似的还有互锁、主控指令。OMRON称互锁IL、互锁清除ILC指令。这两个指令在形式上,与跳转指令类似,也是要配对使用。但功能不同,它不改变程序流程,只是像电路的“总开关”一样,影响IL与ILC间的程序执行,见图10-2。图10-1PLC的跳转指令使用示意图a)为OMRON的跳转,0.00OFF时,JMP到JME之间的指令跳过,不执行。反之,执行。图b)为西门子的跳转,V500.1ON时,跳转到LBL2处,被跳过的指令不执行。反之不跳,JMP后的指令依次执行。图c)为三菱的跳转,X000ON时,跳转到标号P1处,被跳过的指令不执行。反之不跳,CJP后的指令依次执行。不同厂家PLC跳转指令的差别,正如其它指令的差别一样,都只是大同小异。目的都是跳转,只是表达的方法,各有其不同而已。当程序需要分支执行时,使用到跳转,不仅可实现程序设计要求,而且还可减少程序扫描时间,提高程序的运行效率。与跳转类似的还有互锁、主控指令。OMRON称互锁IL、互锁清除ILC指令。这两个指令在形式上,与跳转指令类似,也是要配对使用。但功能不同,它不改变程序流程,只是像电路的“总开关”一样,影响IL与ILC间的程序执行,见图10-2。该图a、b示的为三菱PLC的主控指令及其使用。图a为处于写状态时的梯形图。其中MC及MCR之间的指令执行,受执行条件X000(可以是别的)控制。X000ON,则M0ON,之间的指令正常执行。否则,输出互锁。图b示的为处于读状态时的梯形图。这里“总开关”的作用显示得很形象。指令中的N0为配对主控指令使用的编号。当然,MC与MCR的编号要一致。MC与MCR也可嵌套使用。该图c示的为西门子S7300、400的主控指令。MCRA(主控指令激活)及MCRD(主控指令激活停止)是配对的,只有在主控指令激活区中主控指令才有效。MCR(主控继电器ON)及MCR(主控继电器OFF)也是配对使用,而且也可嵌套。图c是的为2层。这里的几个主控指令的作用如本例是:当I0.0及I0.1ON,则Q4.0及Q4.1的状态分别取决于I0.3、I0.4,如同这里不存在这几个主控指令一样;当I0.0ON及I0.1OFF,则Q4.1的状态取决于I0.4,如同这里不存在这第1层的MCR、MCR一样,而Q4.0则必OFF,不管I0.3的状态如何;当I0.0OFF,则Q4.0、Q4.1的均OFF,不管I0.3、I0.4以至于I0.1的状态如何。要说这里的特别之处是在MCR之前,须先执行MCRA,而在MCR之后,要执行MCRD。2.循环指令它由FOR和NEXT两条指令组成,配对使用。FOX为循环开始,而NEXT为循环结束。其功能是,使这两条指令间的指令,按指定的次数,重复执行。重复多少次,则在FOR指令中指明。FOR-NEXT循环可嵌套,但层数是有限制的。其限制的约定,随PLC型别而定。图10-4示的为三家PLC用于两层嵌套的使用例子。从图知,这里外层都是重复执行3次,而内层2,则执行2次。程序段A,B和C都是如下执行:A→B→B→B→C,A→B→B→B→C。执行循环程序时,如需要临时退出,对OMRONPLC可在需退出处,用BREAK指令。若要从嵌套循环中退出,则需要多个(嵌套层数)BREAK指令。而西门子、三菱PLC则可用跳转指令,指定跳到循环外的某标号处。西门子还可用INDX值处理。每当执行一次循环,INDX值将加1。当它大于、等于FINAL值时,也可退出循环。此外,它的FOR指令还要求先设置逻辑条件,如图,I2.0ON(对1)及I2.1ON(对2)即为它们的逻辑条件。3.子程序在程序中,常有一些要重复使用的一组组指令,用以实现某些特定的功能。若把一组组指令编成子程序,则可大大简化程序设计。使用子程序还便于程序的阅读及修改。子程序指令总是含子程序入口、子程序结束标志及子程序调用等指令。表10-1示的为三家PLC用的子程序指令。表中N为子程序标号。表10-1PLC子程序指令子程序指令的要点是:1.子程序入口到子程序结束指令间的程序为子程序;2.在一个程序中,可以有多个子程序,用标号N相区别;3.不是子程序的其它程序为主程序;4.西门子PLC的子程序安排在不同标号的单独程序模块中,因此,它无入口指令,也无需结束指令;5.OMON、三菱PLC子程序安排在主程序之后END指令之前,但三菱PLC的主程序之后,要加主程序结束指令(FEND),子程序则放在FEND指令之后。6.在主程序中,可用相应指令调用子程序,被调用一次,则被扫描、被执行一次,可多次使用;7.在子程序中,也可用相应指令调用其它子程序,但不能调自身,即可嵌套,但不能递归。调的层数也是受限制的,其限制的约定,随PLC型别而定;8.子程序一旦调用,总是从入口直到结束。但西门子可用RET指令,于中途退出,而其它两家PLC则可用跳转指令中途退出。图10-5示的为三家PLC子程序指令及其使用。图知,当调用子程序逻辑条件成立(如图0.00、I0.0、X000ON),则都将转去执行子程序,执行后,再接着执行主程序的后续部分。如图中0.02OFF及I0.2、X002ON,则在子程序中,执行A部分程序后,中途退出;否则,执行A、B两部分程序都执行完,才退出。提示:所有的子程序都要安排在主程序的后面,在END指令之前。不然,子程序后的主程序指令将不被执行。对一些多任务编程的PLC,其子程序还有全局与局部之分。局部子程序只能用于本任务。要想所有任务都能调用,要用全局子程序。如OMRONCJ系列机,全局子程序指GSBN(751)和GRET(752)之间的程序段。调用指定编号的全局子程序,要用全局子程序调用指令GSBS(750)。三菱Q系列等中、大型机除了用CALL正常调用子程序。还有FCALL(输出OFF调用)、ECALL(程序文件之间子程序调用)、XCALL等指令。提示:西门子S7-200机的子程序可带参数。参数用子程序的局部变量自行定义。参数有子程序输入(IN)、输出(OUT)及输入、输出(IN-OUT)兼而有之,三种。在调子程序时,输入参数要写在输入端;输出参数要写在输出端;输入、输出参数既要写在输入端,又要写在输出端。当然,如不定义局部变量,将不带参数。具体运用实例见后。提示:OMRON、三菱小型机的子程序不带参数。但在调用前可作预处理,调后再作后处理,也可起到带参数的作用。OMRONPLC还有宏调用,类似于带参数子程序。只是,它的参数使用限制较多。提示:三菱Q系列等中、大型机的子程序也可带参数。但位参数只有输入、输出。并要用专用内部器件,即功能软元件FX(入)、FY(出)、FD(寄存器)作形式参数。同时也有宏。宏的形式参数也要用专用内部器件(VX、VY、VD)。4.中断中断也是调子程序,但它不是靠指令调,而是靠中断事件调。且调的子程序编号与所发生的事情对应。这些子程序有时还称为中断服务程序。PLC中断事件可以来自外部,也可来自内部。前者称外中断,后者称内中断。外部中断用输入点。当可中断工作(取决于机型及设定)的输入点状态发生变化,如从OFF到ON,则发生与其对应的中断事件,并调用相应的中断服务程序。每发生一次中断事件,则调一次中断服务程序。有了这样中断,可缩短PLC对输入信号的响应时间。此外,高速计数信号输入,也会产生多种中断。如计数中断,可输入高速脉冲的输入点(取决于机型及设定)输入高速脉冲会自动中断计数;再如比较中断,中断计数后,会自动进行中断比较;最后,还可根据中断比较结果,调用相应的中断子程序。再,有的PLC,如S7-200机,还有通讯中断。收到字符,或发送字符及出错等,都会引起相应的中断。内部中断的事件来自PLC内部。典型的内部中断为定时中断,经设定可准确定时运行相应的中断程序。为了处理好中断,提高程序的控制可靠性与效率,PLC提供了有关的中断处理指令。表10-2是的为三家PLC的一些有关的中断指令。表10-2PLC的一些有关的中断指令中断允许、禁止指令用于确定,在运行程序时,是否允许中断。当程序的某一部分不允许中断时,可用中断禁止指令;某一部分允许中断时,可用中断允许指令。提示:OMRONPLC默认为中断允许。而三菱、西门子PLC则默认中断不允许。为此,后者,要使用中断,需先允许中断,而前者,做好有关设定就可以了。设定中断屏蔽是为了确定是否允许某个内、外中断事件产生。如可外中断的输入点,可设定其为从OFF到ON产生中断,也可相反,也可不让其产生中断。提示:中断允许与中断屏蔽是两个概念,前者是指,所运行的程序是否允许接受中断,后者是指,是否允许中断事件出现后产生中断。前者可用指令处理,而后者多为通过相关设定处理。PLC处理中断事件是有个过程的。当发生中断事件时,PLC总是先记录发生的事件,并按优先级对其排队。优先级高的先执行,它执行完了,再执行优先级低的。所有中断任务处理完了,再转回执行正常的循环程序。一般讲,优先级与中断的任务号是对应的。中断编号越小,优先级越高。要注意的是,已记录但未执行的中断,其后又发生相同的事件,PLC对此将不理睬。所以,不是发生的所有中断事件都会处理的。另外,对已作记录,但未执行的外中断中断任务,可用CLI指令取消。提示:三菱中断子程序入口编号开始字符为I(不同的事件,有不同的编号),而不是P;子程序结束指令为IRET,而不是SRET。提示:对多任务编程或模块化组织的PLC,如CJ、CS机,S-300、400机,它不调子程序,而是调中断任务(程序)。如果在一个I/O中断任务正在执行时,接收到一个不同的中断输入,输入的中断号在内部被记录,直至当前任务和其它较高优先级别的任务执行完毕。附带补充说明的是,在本教程第7讲图7-21b的程序中,已使用了中断事件与中断程序关联的指令(ATCH)。其目的是做到,当把高速计数器值与被比较数相等时,系统能自动调中断子程序COUNT-EQ,以进行相应处理。而图7-21a的CTBL指令,则用DM区的设定实现这个关联,不必另用关联指令。