PLC编程实用指南(第3版)
上QQ阅读APP看书,第一时间看更新

2.6 高级指令编程

以上讨论的逻辑问题都是以位为单位。控制一个输出,就有一组逻辑关系。其实,有时虽有很多输出,但其逻辑关系是相同的。这时,就可用字逻辑处理指令,替代位逻辑处理指令,或用子程序、宏去处理,而不必对每一个位都做雷同的编程。

2.6.1 用字逻辑指令处理

多位逻辑设计也可说成集成化逻辑设计。往往用很少的字节或字或双字处理指令,取得用很多位处理指令的所具有的功能,可大大提高程序的效率。这也是程序设计应追求的目标之一。只是在做这么处理前,I/O地址要做恰当地分配。

1.双按钮多位起、保、停逻辑

起、保、停逻辑即起动、保持及停车电路,是最常用的继电电路,也是PLC程序中最常见的一个组成部分。传统的起、保、停逻辑都是针对一个位进行操作。如果要对多个位操作,完全可以使用字操作指令,实现多位操作,使程序得以简化。

两个按钮操作的起、保、停逻辑的电路是起动按钮与输出触点并联,然后再与停车按钮取反后串联,以此作为输出线圈的输入条件。当用字操作时,也是按此思路处理,可以实现1个字(16位)的起、保、停逻辑。

图2-30所示为用字操作的起、保、停逻辑。图中p_On(及SM0.0、M8000)为常ON触点,保证这几条指令始终执行。QQ通道(或字,三菱无通道概念,为输出位,但前缀为K4,即指从YY0开始16个位,八进制编号,其它如TT0、MM0及YY0同此)的各个位与各个起动按钮相接,TT通道、字的各个位与各个停车按钮相接,YY通道、字的各个位与各个输出线圈相接。MM为中间继电器通道,以用作过渡。

978-7-111-56641-0-Chapter03-74.jpg

图2-30 字起、保、停逻辑

从图2-30知,QQ通道、字任一位ON,必可使YY通道、字的相应位ON,并将予以保持。而TT通道、字的任一位ON,则必使YY通道、字的相应位OFF。而且,这里也是停止优先。即起、停按钮同时按时,为停止。

图2-30用了4条指令,即可使16路实现起、保、停控制。而用基本逻辑指令,每条起、保、停就需4条指令,16路起、保、停则需16×4=64条。4条代替常规的64条,程序的效率当然高多了。笔者在北京某厂消防灌控制程序时就用了类似设计。

2.非标准I/O分配处理

以上介绍的字逻辑操作都是针对16路的起、保、停逻辑,即标准I/O分配。但实际上可能不那么正好。如果少于16路怎么办?图2-31所示就是一种解决办法。

978-7-111-56641-0-Chapter03-75.jpg

图2-31 非标准I/O分配字起、保、停逻辑处理程序

这里引入YYX及ZCN通道、字作过渡。整个操作先对YYX进行。图中①是MOV指令,为对YYX进行逻辑处理准备。⑤是对YY(输出通道、字)的内容作屏蔽,保留不参与起、保、停逻辑操作位的状态,并存入ZCN通道、字中,以便于在起、保、停逻辑操作后,恢复这些位的状态。⑦为对YYX的内容作屏蔽。由于MMX的内容为ZCN的反,故它保留下来的为要参与起、保、停逻辑处理位的状态。⑧为或指令,正好把参与起、保、停逻辑的位与不参与的位,合成后赋予YY通道、字。这样,既可保证参与位,具有起、保、停功能,而不参与的又不受其干扰。

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-32所示就是这个逻辑。这里AA通道(或字,三菱无通道概念,为输出位,但前缀为K4,即指从YY开始16个位,八进制编号,YY同此)各个位与各个“起停”按钮相接,YY通道的各个位与各个输出线圈相接。

978-7-111-56641-0-Chapter03-76.jpg

图2-32 单按钮字起、保、停逻辑

图中p_On(及M8000、SM0.0)为常ON触点,使统计在通道中置ON的位数BCNT(或SUM功能同BCNT)及比较CMP指令(对西门子PLC做AA不等0比较),在每一扫描周期都得以执行。BCNT指令有3个操作数,对本例,第1个操作数,#1,为要统计的通道个数为1,第2个操作数为AA,要统计的开始通道为AA通道,第3个操作数为MM,统计的结果存于MM通道。对SUM仅2操作数,要对多少位做统计,由这里K后的指定数确定,K1为4位、2为8位,余类推。统计结果存于MM字存储器(即D存储器)中。

这时,若有一个按钮按下,统计结果的MM通道内容变为1,经比较(执行CMP指令),使相等标志P_EQON,进而使AA的内容与YY的内容进行异或逻辑操作,结果存于YY中。

这个异或操作,将使YY中,与按下按钮对应的位,改变状态,原为OFF的,将转为ON,原为ON的,将转为OFF,实现了单按钮起停。而其它位不变,因为0通道其它位为0,0与1或0异或,其结果不变。

提示:这里XORW(或WXOR)指令是微分执行是必要的。即指在按钮按下时,执行一次。不然,所控制的输出将出现交替变化。无法实现预定的要求。

4.多个开关控制一个输出电路

前已讨论3个开关控制1个灯的电路,但要有多个开关,如10个、20个怎么办?这里逻辑相当复杂,所用的触点数很多。以至于出现“组合爆炸”,而无法实现。但,如用字或多字逻辑处理,就好办了。图2-33即为16个开关控制一个灯的逻辑。从图2-33知,它用AA通道、字(对三菱,如AA0为X000,则K4AA0指X000~X007及X010~X017)作16个开关的输入点,程序运行时,不断比较AA通道、字与AAB的内容。如两者不等,则把AA的内容传给AAB。同时,YY0改变状态。如两者相等,则YY0状态不变。显然,这个逻辑,任何一个输入点状态变化,都会引起YY0状态改变,可起到了所要求的用16个开关控制一个灯作用。

978-7-111-56641-0-Chapter03-77.jpg

图2-33 多个钮子开关控制1个灯电路

按此原理,如果为32个开关,再多作一次比较就是了。用多少开关都不受限制。

提示:这里用微分信号NEQP作控制,其原理与以前讨论的单按钮起、停的机理是相同的。再,从图,还再次看出,多家PLC的比较指令比较结果标志是不同的。对欧姆龙,这里增加变量NEQ是绝对必要的。因它的PLC执行MOV指令,也将影响P-EQ标志的状态。

5.表决电路

前已讨论3个开关表决逻辑,如表决的参加者较多,电路也较复杂。但用图2-34的逻辑,就比较简单。

978-7-111-56641-0-Chapter03-78.jpg

图2-34 表决程序

图2-34a用了BCNT(对图2-34b用SUM、图2-34c用ON_NUM)指令,它检测从AA通道开始,共1(这里第一操作数为常数1)个通道中,ON的位个数(对图2-34b,因这里K后的常数为4,如AA0为X000,则从X000~X007及从X010~X017)。结果存于AAJ中。然后把AAJ的内容与常数8比较,若有大于8,则产生输出,YY0ON(对图2-34b为Y000),表示表决已超过半数,通过。

如果参加表决的位数比16多,那BCNT指令的第1个操作数可设得比1大。如设为#2,则为32个位,#3为48个位等(对图2-34b即K后的数改为8、12等)。这时,作比较的第2个操作数不应是8,也要作相应调整。

如果参加表决的位数比16少。可先对1作逻辑与运算,屏蔽掉不参与的位。比较指令中的常数不用8,再改为相应的数也就可以了。

显然,图2-34所示表决逻辑比起用基本逻辑指令去编程,效率也是高得多的。

2.6.2 用子程序处理

逻辑关系是相同的,还可用子程序处理,而不必对每一个位都做雷同的编程。有两种子程序:可带参数与无法带参数。

1.带参数调用的子程序

就是子程序有形式参数,调用时对参数要先赋值。

(1)西门子S7-200带参数子程序

如类似上述BCNT指令,西门子S7-200没有,但可自编子程序。实现上述BCNT指令类似功能。图2-35即为西门子PLC对应的表决程序。

978-7-111-56641-0-Chapter03-79.jpg

图2-35 西门子PLC表决程序

图2-35b为所用形式参数,也即局部变量表。其中LAA(LW0)、NUM(LW2)作输入(IN)变量,BCNT(LW2)作为输出变量,TMP(LW4)、IND(LW6)作为临时(TEMP)变量。

图2-35a为在指定字中,统计ON个数的子程序(SBR-1,在图中未标注)。子程序开始,先初始化,把要统计ON位,所在字的地址传给临时工作字#TMP(子程序局部变量,见图2-35b,下同),并把存储统计结果字#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-35c为主程序,它用常ON特殊继电器SM0.0调。调时变量AA、16分别输入给局部变量#LAA、#NUM,调后局部变量#BCNT得到的值,输出传给AAJ。进而判断AAJ是否大或等于9?是,则过半数,表决成功;不足的是,本程序只能处理1个字。

(2)三菱Q系列等中、大型机的带参数子程序

但它的形式参数数量有限制。因为它的形式参数必须用专用的内部器件,即功能软元件FX(位输入)、FY(位输出)、FD(4字寄存器)等,而这些器件数量不多。图2-36所示为Q型机子程序及带参数调用。图中SM400是Q型机的常ON特殊继电器。

978-7-111-56641-0-Chapter03-80.jpg

图2-36 Q型机子程序及带参数调用

图2-36a调子程序P0,有3个参数。都是位(开关量)。这里,X0(位置排列在参数的首位)对应FX0(编号0),Y2(位置排列在参数的第2位)对应FX1(编号1)先作为输入参数;Y2(位置排列在参数的第3位)对应FY2(编号3)后作为输出参数。由于没有既用作输入,又用作输出的参数,所以,只好这么做。只有这样,才能实现用X0单按钮起、停Y2作用。

图2-36b调子程序P1,有5个参数。4个字,1个位。当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机的子程序无法带参数调用。但可作适当处理,达到带参数调用的目的。实际上也只有带参数调用子程序,才能在逻辑关系相同问题的处理时,简化编程。所以,这样的处理是常要用到的。

图2-37所示为子程序体,其使用的地址有AA、YY、BB三个。AA为输入信号,在程序中不产生输出。YY与YY产生输出,而且,其触点还作为输入的一部分,起到反馈作用。

该子程序的功能是,AAON、OFF一次,YYON,再ON、OFF一次,YYOFF。当然,这只是一个例子。其实,子程序的内容不同,可实现的功能也将不同。

显然,如不是带参数调用子程序,那只是对YY的处理,对别的地址就不起作用。如要想对雷同的逻辑都用它处理,就要带参数调用它。

这里用的参数就是AA、YY、BB。AA为输入参数,YY、BB既有输入,又有输出,为输入、输出参数。因为AA、YY、BB地址只是在子程序中引用,不是实际要处理的地址,故又称之为形式参数(地址)。

978-7-111-56641-0-Chapter03-81.jpg

图2-37 带参数调用子程序

要带参数调用,就要在调用子程序前,先对形式参数赋值,把要处理的地址,即实际参数值赋给形式参数。在调子程序之后,则要做相反的赋值,把形式参数赋给实际参数。那样,即可用一个子程序,处理多个逻辑关系雷同,但地址不同问题。

图2-37所示主程序就是一个带参数调用例子。

图2-37a中,p_On及图2-37b中M8000为常为ON的触点,说明在它之后的所有指令,在每扫描周期都将执行。在这些指令中,先是3组简单的赋值逻辑,图2-37a把0.00、“工作”、201.00的值(图2-37b把X000、“工作”、M0)分别赋值给AA、YY、BB;图2-37b把X000、“工作”、M201的值分别赋值给AA、YY、BB。其目的是把实际参数赋值给形式参数,使调子程序时,将按实际值处理。

接着为调子程序。子程序执行之后,又有两组简单的赋值逻辑,图2-37a把YY赋值给“工作”、BB赋值给201.00;图2-37b把YY赋值给“工作”、BB赋值给M201)。其目的是把形式参数赋值给实际参数,完成调子程序,完成用0.00或X000控制“工作”的目的。

为了简化调用时赋值的处理,也可用字传送指令,在实际参数与形式参数之间进行成批的数据交换。而在子程序中,当然要做数据转换的处理。

这样,如图2-38所示主程序,它调两次子程序,第1次调前,先把实际参数1赋值给形式参数,调子程序后再把形式参数赋值给实际参数1。第2次调制前,先把实际参数2赋值给形式参数,调子程序后再把形式参数赋值给实际参数2。由于在这两次调之前,对实际参数不同,其结果也将是不同的。在子程序中,怎样增加数据传送处理,在此略。

2.6.3 用宏处理

逻辑关系是相同的,除了用子程序,还可用宏处理。

1.欧姆龙PLC宏

欧姆龙PLC有宏指令MCRO(99)。也是用以实现带参数的子程序调用。宏指令MCRO梯形图符号,如图2-39所示。

978-7-111-56641-0-Chapter03-82.jpg

图2-38 不同参数调子程序

978-7-111-56641-0-Chapter03-83.jpg

图2-39 欧姆龙宏指令梯形图符号

指令块中:99为本指令的功能码;N为将调用的子程序号;I1为输入首地址;O1输出首地址。这里的I1、O1即为形式参数。

I1为输入,从通道I1开始有4个通道,I1、I1+1、I1+2、I1+3,可做输入实际参数,从O1为输出,从通道O1开始也有4个通道,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~14的内容传送给子程序的形式参数,如为CPM机,232~235。然后执行子程序N。

执行完子程序后,再把235~239的内容传送给O1~O3。

图2-40a示出宏的调用简图。当然,子程序中形式参数地址没有使用时,相应的实参内容也不会改变。

图2-40b、c为运用宏指令的实例。图2-40c为子程序。它的输入只用一个位,232.00。输出用了两个位,236.00、236.08。图2-40b为主程序,这里做了两次调用。

第1次调用时,实际参数为0通道及10通道,0.00对应于232.00,10.00对应于236.00,10.08对应于236.08。这可实现用0.00对10.00起停控制。

第2次调用时,实际参数为1通道及11通道,1.00对应于232.00,11.00对应于236.00,11.08对应于236.08。这可实现用1.00对11.00起停控制。

用宏虽可较方便地实现带参数调用,但其结构是触点的串、并,而且,其地址也要严格对应。否则不能用,或在用时要作适当处理。

978-7-111-56641-0-Chapter03-84.jpg

图2-40 欧姆龙PLC宏及其调用

2.三菱Q系列PLC宏

与欧姆龙的宏不完全相同。它的宏的功能可任意确定,其具体程序也可用任意指令编写。指令的操作数先用任意内存变量,而在进行宏的登记时,再改用宏指令变量软元件(VX0、VY0、VD0等)。所登记的宏,可在任何程序中多次使用。但在使用时,要先指定宏存储的路径。而且,路径可以有多个。

图2-41a所示为宏程序体。其功能是,D0与D1比较,大者存于D2,小者存于D3(也可为其它功能)。编写实现此功能的程序后,用鼠标拖放选定(选定部分呈蓝色)。然后,再用鼠标左键点击“工程”→“宏”→“宏登记”菜单项。点击后将弹出图2-41b所示对话框。在其上选D0为VD0、D1为VD1、D2为VD2、D3为VD3。“宏驱动器/路径名”为C:\MELSEC\GPPW(也可为其它合法的驱动器/路径名)。“宏名”为hhh1(也可为其它)。最后用鼠标左键点击“执行”键,则完成了登记。登记后,此宏(文件)将登记在C:\MELSEC\GPPW目录下的“MAC”文件夹中,文件(宏)名为hhh1.gpq。

图2-41c为宏调用。从图知,它用的宏指令是M.HHH,操作数为D10、D11、D20、D21。图2-41d为宏替换(展开)后的实际程序。其功能是D10与D11比较,然后大者存于D20,小者存于D21。可见,它的功能与图2-41a相同,只是操作数做了替换,与图2-41a不同。

978-7-111-56641-0-Chapter03-85.jpg

图2-41 三菱PLC宏登记及其调用

用图2-41c用宏编写程序,经变换,将自动替换为图2-41d展开的形式。但在“读出模式”下,可选通过“显示”→“宏命令形式显示”菜单项,选定为用或不用宏命令显示。

图2-41e为选定为用宏命令显示,并用于进行在线监视。这里5次调用宏HHH1,目的是对D10、D11、D12及D13进行排序,其结果存于D0(最大)到D3(最小)中。

可见,把经常使用的程序登记为宏,再使用宏编程,可大大减少编程的工作量。而且,进行程序在线监视也比较简明、方便。

2.6.4 用功能块处理

逻辑关系是相同的,除了用子程序、宏,还可用函数或功能块处理。

1.用函数、功能块(FB)处理

西门子公司的PLCS7-300、400机无子程序,但可自编功能块(FC)或函数块(FB)。这些块可设形式参数,调前、调后都可要赋值。用其实现对多位逻辑的处理,与上述调子程序的方法一样方便。

三菱Q等高档机也可用(功能块)FB处理。图2-42所示为Q型机FB程序及带其调用。

978-7-111-56641-0-Chapter03-86.jpg

图2-42 Q型机FB及其调用

图2-42a为FB1的梯形图程序,要在FB中编写,写后命名为“单钮起停”(FB1)。该程序用的是局部符号地址。此地址的设定见图2-42b。从图2-42知,xx为输入(位)变量,而yy、mm为既输入又输出变量。图2-42c为在主程序中调用FB1。

这类程序已做过多次讨论,其功能就是,当X0ON-OFF一次,则使Y0ON;而再ON-OFF一次,则Y0OFF。如果更改调用时的地址用X1、Y1、M1,则可实现X1对Y1的控制。

978-7-111-56641-0-Chapter03-87.jpg

图2-43 欧姆龙新型机FB程序及其调用

2.欧姆龙PLC功能块

欧姆龙新型机也有类似的功能块编辑及调用功能。图2-43所示为FB程序及其调用。此程序也是用于单按钮起、停控制。

图2-43b为FB程序。其所用的变量在图2-43a中定义。由于它只能定义输入、输出、外部及内部4种类型。不能定义既输入,又输出类型,故在FB程序中,增加内部变量mm。在FB程序中,bb赋值给mm。在调用时,而bb是由10.02赋值的。而10.02则是上一次调用FB的YY2输出。有此关系,其功能就是,当0.00ON-OFF一次,则使10.01ON;而再ON-OFF一次,则10.01OFF。如果更改调用时的地址用0.01、11.1、11.2,则可实现01.1对11.1的控制。

提示:图2-43程序,在调用FB块时,要为其指定一个合法的变量名(本例用S),同时,在键入输入、输入参数时,需用“新功能块参数(New Function Parameter)”图标指定输入、输出的位置。