2.6 高级指令编程
关键词:字逻辑、屏蔽、形式参数、实际参数、宏
以上讨论的逻辑问题都是以位为单位。控制一个输出,就有一组逻辑关系。其实,有时虽有很多输出,但其逻辑关系是相同的。这时,就可用字逻辑处理指令,替代位逻辑处理指令,或用子程序、宏去处理,而不必对每一个位都做雷同的编程。
2.6.1 用字逻辑指令处理
多位逻辑设计也可说成集成化逻辑设计。往往用很少的字节、字或双字处理指令,取得用很多位处理指令的所具有的功能,可大大提高程序的效率。这也是程序设计应追求的目标之一。只是在做这么处理前,I/O地址要做恰当地分配。
1.双按钮多位起、保、停逻辑
起、保、停逻辑即起动、保持及停车电路,是最常用的继电电路;也是PLC程序中最常见的一个组成部分。传统的起、保、停逻辑都是针对一个位进行操作。如果要对多个位操作,完全可以使用字操作指令,实现多位操作,使程序得以简化。
两个按钮操作的起、保、停逻辑的电路是,起动按钮与输出触点并联,然后再与停车按钮取反后,串联,以此作为输出线圈的输入条件。当用字操作时,也是按此思路处理,可以实现一个字(16位)的起、保、停逻辑。
图2-59所示为用字操作的起、保、停逻辑。图中p_On(及SM0.0、M8000)为常ON触点,保证这几条指令始终执行。QQ通道(或字,三菱无通道概念,为输出位,但前缀为K4,即指从YY0开始16个位,八进制编号,其他如TT0、MM0及YY0同此)的各个位与各个起动按钮相接,TT通道、字的各个位与各个停车按钮相接,YY通道、字的各个位与各个输出线圈相接。MM为中间继电器通道,以用作过渡。
图2-59 字起、保、停逻辑
从图2-59可知,QQ通道、字任一位ON,必可使YY通道、字的相应位ON,并将予以保持。而TT通道、字的任一位ON,则必使YY通道、字的相应位OFF。而且这里也是停止优先。即起、停按钮同时按时,为停止。
图2-59用了4条指令,即可使16路实现起、保、停控制。而用基本逻辑指令,每条起、保、停就需4条指令,16路起、保、停则需16×4=64条。4条代替常规的64条,程序的效率当然高多了。
2.非标准I/O分配处理
以上介绍的字逻辑操作都是针对16路的起、保、停逻辑,即标准I/O分配。但实际上可能不那么正好。如果少于16路怎么办?图2-60所示就是一种解决办法。
图2-60中引入YYX及ZCN通道、字作过渡。整个操作先对YYX进行。图中①是MOV指令,为对YYX进行逻辑处理准备。⑤是对YY(输出通道、字)的内容作屏蔽,保留不参与起、保、停逻辑操作位的状态,并存入ZCN通道、字中,以便于在起、保、停逻辑操作后,恢复这些位的状态。⑦为对YYX的内容作屏蔽。由于MMX的内容为ZCN的反,故它保留下来的为要参与起、保、停逻辑处理位的状态。⑧为或指令,正好把参与起、保、停逻辑的位与不参与的位,合成后赋予YY通道、字。这样,既可保证参与位,具有起、保、停功能。而不参与的又不受其干扰。
图2-60 非标准I/O分配字起、保、停逻辑处理程序
LJD为逻辑条件,可按实际不参与起、保、停位的状况设定。如本例LJD的值设为F,则QQ、TT通道、字的相应位仅能对YY通道的04~15位(西门子如QQ为QW0,则Q0.0~Q0.7及Q1.4~Q1.7;而三菱如QQ0为Y000,则Y004~Y007及Y010~Y017)做起、保、停控制。YY通道的00~03位(与以上假设相应,西门子为Q1.0~Q1.3;而三菱为Y000~Y003)可接受其他控制,不受此程序影响。
如果仅是个别位另有所用,也可先作字处理,而在此前后,对个别位作些处理。这时,尽管存在多输出,但仍可达到目的。因为PLC指令是一条条执行的,后执行的指令,可改变先执行指令的执行的结果,并以后执行的结果为准。
3.单按钮多位起、保、停逻辑
一个按钮实现起、保、停逻辑也可用字操作。图2-61所示的就是这个逻辑。这里AA通道(或字,三菱无通道概念,为输出位,但前缀为K4,即指从YY开始16个位,八进制编号,YY同此)各个位与各个“起停”按钮相接,YY通道的各个位与各个输出线圈相接。
图2-61 单按钮字起、保、停逻辑
图2-61中,p_On(及M8000、SM0.0)为常ON触点,使统计在通道中置ON的位数BCNT(或SUM功能同BCNT)及比较CMP指令(对西门子PLC做AA不等0比较),在每一扫描周期都得以执行。BCNT指令有三个操作数,对本例,第一个操作数,#1,为要统计的通道个数为1,第二个操作数为AA,要统计的开始通道为AA通道,第三个操作数为MM,统计的结果存于MM通道。对SUM仅2操作数,要对多少位做统计,由这里K后的指定数确定,K1为4位、2为8位,余类推。统计结果存于MM字存储器(即D存储器)中。
这时,若有一个按钮按下,统计结果的MM通道内容变为1,经比较(执行CMP指令),使相等标志P_EQ ON,进而使AA的内容与YY的内容进行异或逻辑操作,结果存于YY中。
这个异或操作,将使YY中,与按下按钮对应的位,改变状态,原为OFF的,将转为ON,原为ON的,将转为OFF,实现了单按钮起停。而其他位不变,因为0通道其他位为0,0与1或0异或,其结果不变。
提示:这里XORW(或WXOR)指令是微分执行是必要的。即指在按钮按下时,执行一次。不然,所控制的输出将出现交替变化。无法实现预定的要求。
4.多个开关控制一个输出电路
前已讨论3个开关控制一个灯的电路,但要有多个开关,如10个、20个怎么办?这里逻辑相当复杂,所用的触点数很多。以至于出现“组合爆炸”,而无法实现。但如用字或多字逻辑处理,就好办了。图2-62即为16个开关控制一个灯的逻辑。
从图2-62可知,它用AA通道、字(对三菱,如AA0为X000,则K4AA0指X000~X007及X010~X017)作16个开关的输入点,程序运行时,不断比较AA通道、字与AAB的内容。如两者不等,则把AA的内容传给AAB。同时,YY0改变状态。如两者相等,则YY0状态不变。显然,这个逻辑,任何一个输入点状态变化,都会引起YY0状态改变,可起到了所要求的用16个开关控制一个灯作用。
按此原理,如果为32个开关,再多作一次比较就是了。用多少开关都不受限制。
提示:这里用微分信号NEQP作控制,其原理与以前讨论的单按钮起、停的机理是相同的。再,从图2-62还可再次看出,多家PLC的比较指令比较结果标志是不同的。对欧姆龙,这里增加变量NEQ是绝对必要的。因它的PLC执行MOV指令,也将影响P-EQ标志的状态。
图2-62 多个开关控制一个灯电路
5.表决电路
前已讨论3个开关表决逻辑,如表决的参加者较多,电路也较复杂。但用图2-63的逻辑就比较简单。
图2-63 表决程序
图2-63a用了BCNT(对图2-63b用SUM、图2-63c用on_num)指令,它检测从AA通道开始,共1(这里第一操作数为常数1)个通道中,ON的位个数(对图2-63b,因这里K后的常数为4,如AA0为X000,则从X000~X007及从X010~X017)。结果存于AAJ中。然后把AAJ的内容与常数8比较,若有大于8,则产生输出,YY0 ON(对图2-63b为Y000),表示表决已超过半数,通过。
如果参加表决的位数比16多,那BCNT指令的第一个操作数可设得比1大。如设为#2,则为32个位,#3为48个位,等等(对图2-63b即K后的数改为8、12等)。这时,作比较的第二个操作数不应是8,也要作相应调整。
如果参加表决的位数比16少。可先对1作逻辑与运算,屏蔽掉不参与的位。比较指令中的常数不用8,再改为相应的数也就可以了。
显然,图2-63所示的表决逻辑比起用基本逻辑指令去编程,效率也是高得多的。
2.6.2 用子程序处理
逻辑关系是相同的,还可用子程序处理,而不必对每一个位都做雷同的编程。有两种子程序:带参数与不带参数。
1.带参数调用子程序
就是子程序有形式参数,调用时对参数要先赋值。
(1)西门子S7-200带参数子程序。如类似上述BCNT指令,西门子S7-200没有,但可自编子程序。实现上述BCNT指令类似功能。图2-64即为西门子PLC对应的表决程序。
图2-64 西门子PLC表决程序
图2-64b为所用形式参数,也即局部变量表。其中LAA(LW0)、NUM(LW2)作输入(IN)变量,BCUT(LW2)作为输出变量,TMP(LW4)、IND(LW6)作为临时(TEMP)变量。
图2-64a为在指定字中,统计ON个数的子程序(SBR-1,在图中未标注)。子程序开始,先初始化,把要统计ON位,所在字的地址传给临时工作字#TMP(子程序局部变量,见图2-64b,下同),并把存储统计结果字#BCNT清零。然后进入FOX-NEXT循环执行,而循环次数由#NUM决定。在循环中,先看L6.7(局部变量LW的最左位)ON否?ON,则#BCNT加1,否则不加。然后,把LW6左移位(即局部变量#TMP),原L6.6的状态移给L6.7,L6.5的状态移给L6.6,L7.7的状态移给L6.0,L7.6的状态移给L7.7,等等。显然,这里如执行16次,则LW6的值即为在#TM中ON的所统计的,ON的位数。
图2-64c为主程序,它用常ON特殊继电器SM0.0调。调时变量AA、16分别输入给局部变量#LAA、#NUM,调后局部变量#BCNT得到的值,输出传给AAJ。进而判断AAJ是否大或等于9?是,则过半数,表决成功。不足的是,本程序只能处理一个字。
(2)三菱Q系列等中、大型机的带参数子程序。但它的形式参数数量有限制。因为它的形式参数必须用专用的内部器件,即功能软元件FX(位输入)、FY(位输出)、FD(4字寄存器)等,而这些器件数量不多。图2-65所示为Q型机子程序及带参数调用。图中SM400是Q型机的常ON特殊继电器。
图2-65 Q型机子程序及带参数调用
图2-65a调子程序P0,有3个参数。都是位(开关量)。这里,X0(位置排列在参数的首位)对应FX0(编号0),Y2(位置排列在参数的第2位)对应FX1(编号1)先作为输入参数;Y2(位置排列在参数的第3位)对应FY2(编号3)后作为输出参数。由于没有既用作输入又用作输出的参数,所以,只好这么做。只有这样,才能实现用X0单按钮起、停Y 2作用。
图2-65b调子程序P1,有5个参数。4个字,一个位。当X0(位置排列在参数的第5位,对应FX4,编号4)ON时,可实现D0(位置排列在参数的第1位,对应FD0,编号0)与D1(位置排列在参数的第2位,对应FD1,编号1)相加,并把结果存于D1中。同时,D3(位置排列在参数的第2位,对应FD3,编号3)被D2(位置排列在参数的第3位,对应FD2,编号2)减,结果存于D3中。
2.不带参数调用子程序处理
欧姆龙PLC及三菱的FX系列PLC的子程序无法带参数调用。但可作适当处理,达到带参数调用的目的。实际上也只有带参数调用子程序,才能在逻辑关系相同问题的处理时,简化编程。所以,这样的处理是常要用到的。
图2-66所示为子程序体。其使用的地址有AA、YY、BB三个。AA为输入信号,在程序中不产生输出。YY与YY产生输出,而且其触点还作为输入的一部分,起到反馈作用。
该子程序的功能是,AA ON、OFF一次,YY ON,再ON、OFF一次,YY OFF。当然,这只是一个例子。其实,子程序的内容不同,可实现的功能也将不同。
显然,如不是带参数调用子程序,那只是对YY的处理,对别的地址就不起作用。如要想对雷同的逻辑都用它处理,就要带参数调用它。
这里用的参数就是AA、YY、BB。AA为输入参数,YY、BB既有输入,又有输出,为输入、输出参数。因为AA、YY、BB地址只是在子程序中引用,不是实际要处理的地址,故又称之为形式参数(地址)。
要带参数调用,就要在调用子程序前,先对形式参数赋值,把要处理的地址,即实际参数值赋给形式参数。在调子程序之后,则要做相反的赋值,把形式参数赋给实际参数。那样,即可用一个子程序,处理多个逻辑关系雷同,但地址不同问题。
图2-67所示主程序就是一个带参数调用例子。
图2-66 带参数调用子程序体
图2-67 带参数调子程序
图2-67a中p_On及图2-67b中M8000为常为ON的触点,说明在它之后的所有指令,在每扫描周期都将执行。在这些指令中,先是三组简单的赋值逻辑,图2-67a把0.00、“工作”、201.00的值(图2-67b把X000、“工作”、M0)分别赋值给AA、YY、BB;图2-67b把X000、“工作”、M201的值分别赋值给AA、YY、BB。其目的是把实际参数赋值给形式参数,使调子程序时,将按实际值处理。
接着为调子程序。子程序执行之后,又有两组简单的赋值逻辑,图2-67a把YY赋值给“工作”、BB赋值给201.00;图2-67b把YY赋值给“工作”、BB赋值给M201)。其目的是把形式参数赋值给实际参数,完成调子程序,完成用0.00或X000控制“工作”的目的。
为了简化调用时赋值的处理,也可用字传送指令,在实际参数与形式参数之间进行成批的数据交换。而在子程序中,当然要做数据转换的处理。
这样,如图2-67所示的主程序,它调两次子程序,第一次调前,先把实际参数1赋值给形式参数,调子程序后再把形式参数赋值给实际参数1。第二次调制前,先把实际参数2赋值给形式参数,调子程序后再把形式参数赋值给实际参数2。由于在这两次调之前,对实际参数不同,其结果也将是不同的。在子程序中,怎样增加数据传送处理,在此略。
2.6.3 用宏处理
逻辑关系是相同的,除了用子程序,还可用宏处理。
1.欧姆龙PLC宏
OMRON PLC有宏指令MCRO(99)。也是用以实现带参数的子程序调用。图2-68所示即为这宏指令MCRO梯形图符号。
图2-68 欧姆龙宏指令梯形图符号
指令块中99,为本指令的功能码。N为将调用的子程序号。I1为输入首地址,O1输出首地址。这里的I1、O1即为形式参数。
I1为输入,从通道I1开始有四个通道,I1、I1+1、I1+2、I1+3,可做输入实际参数,从O1为输出,从通道O1开始也有四个通道,O1、O1+1、O1+2、O1+3,可做输出实际参数。子程序中的对应地址为形式参数。只是不同机型,形式参数地址也不同。如CPM机与I对应的地址为232~235,与O对应的为236~239。CQM1与I对应的地址为96~99,与O对应的为196~199。C200HS、E、G、X机的I和O分别为290~293及294~297……
至于可使用的子程序号,不同的机型也不同。对CPM1为0~49,对C200HS为0~99,对CQM1、C200HX等为0~255。
当逻辑条件满足,执行本指令;否则不执行。本指令可正常执行;也可微分执行,即只在逻辑条件满足的第一周期执行。
本指令执行前,先把I1~I4的内容传送给子程序的形式参数,如为CPM机,232~235。然后执行子程序N。
执行完子程序后,再把235~239的内容传送给O1~O3。
图2-69a示出宏的调用简图。当然,子程序中形式参数地址没有使用时,相应的实参内容也不会改变。
图2-69 欧姆龙PLC宏及其调用
图2-69b、c为运用宏指令的实例。图2-68c为子程序。它的输入只用一个位,232.00。输出用了两个位,236.00、236.08。图2-68b为主程序,这里作了两次调用。
第一次调用时,实际参数为0通道及10通道,0.00对应于232.00,10.00对应于236.00,10.08对应于236.08。这可实现用0.00对10.00起停控制。
第二次调用时,实际参数为1通道及11通道,1.00对应于232.00,11.00对应于236.00,11.08对应于236.08。这可实现用1.00对11.00起停控制。
用宏虽可较方便地实现带参数调用,但其结构是触点的串、并,而且其地址也要严格对应。否则不能用,或在用时要作适当处理。
2.三菱Q系列PLC宏
与OMRON的宏不完全相同。它的宏的功能可任意确定,其具体程序也可用任意指令编写。指令的操作数先用任意内存变量,而在进行宏的登记时,再改用宏指令变量软元件(VX0、VY0、VD0等)。所登记的宏,可在任何程序中多次使用。但在使用时,要先指定宏存储的路径。而且路经可以有多个。
图2-70a所示为宏程序体。其功能是D0与D1比较,大者存于D2,小者存于D3(也可为其他功能)。编写实现此功能的程序后,用鼠标拖放选定(选定部分呈蓝色)。然后,再用鼠标点击“工程”→“宏”→“宏登记”菜单项。点击后将弹出图2-70b所示对话框。在其上选D0为VD0、D1为VD1、D2为VD2、D3为VD3。“宏驱动器/路径名”为C:\MELSEC\GPPW(也可为其他合法的驱动器/路径名)。“宏名”为hhh1(也可为其他)。最后用鼠标点击“执行”键,则完成了登记。登记后,此宏(文件)将登记在C:\MELSEC\GPPW目录下的“MAC”文件夹中,文件(宏)名为hhh1.gpq。
图2-70c为宏调用。从图可知,它用的宏指令是M.HHH,操作数为D10、D11、D20、D21。图2-70d为宏替换(展开)后的实际程序。其功能是D10与D11比较,然后大者存于D20,小者存于D21。可见,它的功能与图2-70a相同,只是操作数做了替换,与图2-70a不同。
图2-70 三菱PLC宏登记及其调用
图2-70c用宏编写程序,经变换,将自动替换为图2-70d展开的形式。但在“读出模式”下,可选通过“显示”→“宏命令形式显示”菜单项,选定为用或不用宏命令显示。
图2-70e是选定为用宏命令显示,并用于进行在线监视。这里5次调用宏HHH1,目的是对D10、D11、D12及D13进行排序,其结果存于D0(最大)~D3(最小)中。
可见,把经常使用的程序登记为宏,再使用宏编程,可大大减少编程的工作量。而且进行程序在线监视也比较简明、方便。
2.6.4 用功能块处理
逻辑关系是相同的,除了用子程序、宏,还可用函数或功能块处理。
1.用函数、功能块(FB)处理
西门子公司的PLC S7-300、400系列PLC无子程序,但可自编功能块(FC)或函数块(FB)。这些块可设形式参数,调前、调后都可要赋值。用其实现对多位逻辑的处理,与上述调子程序的方法一样方便。
三菱Q系列PLC等高档机也可用(功能块)FB处理。图2-71所示为Q系列PLC FB程序及带其调用。
图2-71a为FB1的梯形图程序。要在FB中编写。写后命名为“单钮起停”(FB1)。该程序用的是局部符号地址。此地址的设定如图2-71b。从图可知,xx为输入(位)变量,而yy、mm为既输入又输出变量。图2-71c为在主程序中调用FB1。
这类程序已做过多次讨论,其功能就是,当X0 ON-OFF一次,则使Y0 ON;而再ON-OFF一次,则Y0 OFF。如果更改调用时的地址用X1、Y1、M1,则可实现X1对Y1的控制。
2.欧姆龙PLC功能块
欧姆龙新型机也有类似的功能块编辑及调用功能。图2-72所示为FB程序及其调用。此程序也是用于单按钮起、停控制。
图2-71 Q型机FB及其调用
图2-72 欧姆龙新型机FB程序及其调用
图2-72b为FB程序。其所用的变量在图2-72a中定义。由于它只能定义输入、输出、外部及内部4种类型。不能定义既输入,又输出类型,故在FB程序中,增加内部变量mm。在FB程序中,bb赋值给mm。在调用时,而bb是由10.02赋值的。而10.02则是上一次调用FB的YY2输出。有此关系,其功能就是,当0.00 ON-OFF一次,则使10.01 ON;而再ON-OFF一次,则10.01 OFF。如果更改调用时的地址用0.01、11.1、11.2,则可实现01.1对11.1的控制。
提示:图2-72程序,在调用FB块时,要为其指定一个合法的变量名(本例用S),同时,在键入输入、输入参数时,须用“新功能块参数(New Function Parameter)”图标指定输入、输出的位置。