功能指令5.1功能指令通则5.2程序流控制(FNC00~FNC09)5.3传送与比较(FNC10~FNC19)5.4四则与逻辑运算(FNC20~FNC29)5.5循环移位与移位(FNC30~FNC39)5.6数据处理(FNC40~FNC49)5.7高速处理(FNC50~FNC59)5.8方便指令(FNC60~FNC69)5.13实时时钟处理(FNC160~FNC169)5.15触点式比较指令(FNC220~FNC249)功能指令的表现形式数据长度及指令的执行方式图处理16位的数据和32位的数据示例元件形式位元件字元件位元件组合整数与实数变址寄存器程序流控制(FNC00~FNC09)5.2.1条件跳转5.2.2子程序5.2.3中断5.2.4主程序结束5.2.5警戒时钟5.2.6循环(FOR、NEXT)5.2.1条件跳转(CJ)1.条件跳转CJ指令的助记符及功能如表所示:2.格式,如下图所示。3.(1)如图所示,当X0接通,程序跳转到P0所指的程序行执行。当X0(2)可允许多个CJ指令使用相同的指针,如下图所示。当X0或X2接通,均可跳到P0所指的程序行。5.2.2调用子程序和子程序返回(CALL,SRET,FEND)1.调用子程序指令的助记符及功能如表所示:2.使用格式如图所示。3.(1)当X1接通,CALL指令被驱动,程序转移到指针P1所指的程序行执行,一直到子程序返回指令SRET,然后立即返回到调用子程序CALL指令的下一指令,再继续执行主程序。(2)CALL指令的P指针以及子程序必须放在主程序结束指令FEND(3)可以多次调用子程序,子程序可嵌套,嵌套层数不能大于5层,每个子程序都必须以SRET结束。主程序结束中断指令中断指令①1个中断指针(I***)占一步,可设置中断点的数参见下述内容。②指令EI和DI之间的程序段为允许中断区间,如果中断信号产生于禁止中断区间(DI到EI范围),则中断信号被存储,并在EI指令之后被执行,除非相应的M805△为ON。③在一个中断程序执行中,其他中断被禁止。但是,在中断程序中编入EI和DI指令可以实现2级中断嵌套。④在子程序和中断程序中定时器要用T192~T199和T246~T249P13B.中断用指针P13C中断例0输出立即刷新程序输入立即刷新程序记录X2ON次数的程序通过输入中断把窄脉冲保持定时中断程序监视定时器(WDT)2.图WDT指令用法3.(1)WDT指令是在控制程序中刷新警戒定时器的指令。如果执行程序的扫描周期时间(从0步到END或FEND指令之间)达200ms,则PLC将停止运行。这时应将WDT指令插到合适的程序步中刷新警戒时钟,以便程序得以继续运行直到END。例如将一个扫描周期为240ms的程序分为2个120ms程序。如图所示,在这两个程序之间插入WDT(2)如果希望每次扫描周期时间超过200ms,则可用移动指令MOV把限制值写入特殊数据寄存器D8000中。循环(FOR,NEXT)2.FOR-NEXT的格式,如下图所示。图循环指令3.(1)进入循环指令FORn,n取值范围为1~32767。循环结束命令NEXT,无操作数。命令FOR-NEXT必须成对使用,缺一不可。(2)上图为单循环,执行完程序1,进入循环语句,对程序2执行循环10次后,执行程序3结束。FOR-NEXT指令可以嵌套,它主要用于某些操作需反复进行的场合。FOR-NEXT指令最多只能嵌套5层。如因循环次数过多,程序运行时间大于200ms,请注意使用WDT命令。(3)下图为双重循环的例子。接通PLC电源,当X0闭合,程序转到P1执行。当X0断开,接通PLC电源,程序执行双重循环,执行结果为Z=50,D0=49。之后,执行定时器指令。当T0的当前值等于设定值D0,T0触点接通,Y0得电。图双重循环传送与比较(FNC10~FNC19)5.3.1比较5.3.2区间比较5.3.3传送5.3.4取反传送5.3.5移位传送5.3.6块传送5.3.7多点传送5.3.8交换5.3.9BCD变换5.3.10BIN变换比较图CMP指令应用例例下图为指令CMP的应用例子。按X0及X2,问当按X1为8次,10次,16次,灯Y0、Y1、Y2哪个亮?比较指令CMP工作时,其控制触点必须一直闭合。因此设置X2,用M0自锁实现。当X1闭合8次,K10>C0当前值,Y0得电;当X1闭合10次,K10=C0当前值,Y1得电;当X1闭合16次,K10<C0当前值,Y2得电。区间比较图ZCP指令应用例传送例试读下图梯形图,当按X0,则Y0、Y1、Y2、Y3,哪个有输出?取反传送图CML指令应用例移位传送图移位传送移位传送图移位传送示例11块传送多点传送交换BCD变换和BIN变换四则与逻辑运算(FNC20~FNC29)5.4.1BIN加法5.4.2BIN减法5.4.3BIN乘法5.4.4BIN除法5.4.5加1和减15.4.6与、或和异或5.4.7求补二进制的加、减、乘、除运算(ADD,SUB,MUL,DIV)二进制的加、减、乘、除运算的助记符和功能如下表所示:图ADD、SUB、MUL、DIV指令格式3.(1)ADD指令的意义是:源(S1.)+源(S2.)→目标(D.),是代数相加,且必须为同一元件。图5-36中,执行ADD指令,D1+D3→D10。若计算结果为0,M8020置ON;若计算结果超过32767(16位)或2147483687(32位),进位标志M8022置ON;若结果小于-32767(16位)或-2147483687(32位),借位标志M8021置ON(2)SUB指令的意义是D1—D3→D11,是代数运算。其运算结果的借位情况与(1)相同。(3)MUL指令的意义是D1×D3→D12,为代数运算。若D1、D3为16位,其运算结果为32位,目标元件D12表示低16位地址,D13放高16位地址。若D1、D3为32位,则目标D12为低16位地址,此时(D2,D1)×(D4,D3)→(D15,D14,D13,D12)。(4)DIV指令的意义是:D1/D3→D16,为代数运算。若D1、D3为16位,则商放D16,余数放D17。若D1、D3为32位,则商和余数均为32位,目标元件D16为存放商的首址,即D17、D16存放商,而比目标元件高3位的元件存放余数,即D19、D18(5)执行图5-36运算结果得:D10=60;D11=20;D12=800;D16=2。二进制数加1和减1运算(INC,DEC)3(1)INC指令的意义为目标(D.)当前值D1+1→D1。在16位运算中,+32767加1则成-32768;在32位运算中,+2147483647加1则成-2147483648。(2)DEC指令的意义为目标元件(D.)当前值D10-1→D10。在16位运算中,-32768减1则成+32767;在32位运算中,-2147483648减1+2147483647。(3)若用连续指令时,INC和DEC指令都是在各扫描周期都做加1运算和减1运算。因此,在上图中,X1和X2都使用上升沿检测指令。每次X1闭合,D1当前值加1;每次X2闭合,D2当前值减1例运行图程序,讨论Y0~Y3得电情况。按X0第1次闭合,Y0得电;第2次,Y1得电;第3次,Y1、Y0得电;第4次,Y2得电;第5次,Y2、Y0得电;第6次,Y2、Y1得电;第7次,Y2、Y1、Y0得电;第8次,Y3得电。如此下去,一直到第15次,Y3、Y2、Y1、Y0得电,第16次,Y3、Y2、Y1、Y0全失电。运行中间若按X1,则Y0~Y4逻辑字与、或、异或运算(WADD,WOR,WXOR)WAND3(1)WAND指令的意义是将两源(S1.)、(S2.)相与,送目标(D.)。“与”的逻辑式为:Y=A·B,其运算逻辑为:1AND1=1;0AND1=01AND0=0;0AND0=0。(2)WOR指令的意义是将两源(S1.)、(S2.)相或,送目标(D.)。“或”的逻辑式为:Y=A+B,其运算逻辑为:1OR1=1;0OR1=11OR0=1;0OR0=0(3)WXOR指令的意义是将两源(S1.)、(S2.)相异或,送目标(D.)。“异或”的逻辑式为:Y=AB+AB1XOR1=0;0XOR1=11XOR0=1;0XOR0=0(4)上图运算的结果为:接通X1,D1、D2“与”运算,D10的结果为20。接通X2,D1、D2“或”运算,D11的结果为30;接通X3,D1、D2“异或”运算,D12的结果为10。(5)逻辑“与”指令WAND还常用于屏蔽某元件数值的高位或低位。上图中接通X0,将十六进制数H1268送D0,接通X1,将H00FF和D0进行“与”运算,运算结果送D10,D10为H0068,屏蔽了高位。求补码(NEG)3(1)NEG指令的意义是将目标(D.)位的数取反,即“1”→“0”,“0”→“1”,然后将取反后的结果加1再送目标(D.)。此时,目标(D.)的数的符号改变,但数值不变。如图5-43所示,接通X0,D0的数值为1000,其二进制数为“0000001111101000”,各位取反加1后得“1111110000011000”,即为(-1000)。若目标(D.)为负数,使用NEG指令,即是求得其绝对值。(2)若使用连续执行型指令,则每扫描周期都会执行NEG指令一次。循环移位与移位(FNC30~FNC39)5.5.1循环移位(左/右)5.5.2带进位的循环5.5.3移位(左/右)5.5.4字右移/字左移5.5.5先入先出(FIFO)写入5.5.6先入先出(FIFO)读出循环移位(左/右)3(1)ROR指令的意义为:每执行一次X10,目标元件(D.)中的位循环右移n位,最终从低位被移出的位同时存入到进位标志M8022中。(2)ROL指令的意义为:每执行一次X20,目标元件(D.)中的位循环左移n位,最终从高位被移出的位同时存入到进位标志M8022中。带进位循环右移和循环左移(RCR,RCL)3.说明(1)每次执行RCR指令,目标元件(D)中的位带进位循环右移n位,最后被移出的位放入到进位标志M8022中。在运行下一次RCR指令时,M8022中的位首先进入目标元件中。(2)每执行一次RCL指令,目标元件(D)中的位带进位循环左移n位,最后被移出的位放入进位标志M8022中。在运行下一次RCR指令时,M8022中的位首先进入目标元件中。(3)图执行情况如图所示。图(a)为带进位循环右移4位,执行情况如下:X0接通,D1=0000000011111111=255,M8022=0X1接通第1次,D1=1110000000001111=-8177,M8022=1X1接通第2次,D1=1111111000000000=-512,M8022=1X1接通第3次,D1=0001111111100000=8160,M8022=0图(b)为带进位循环左移4位,执行情况如小:X0接通,D1=0000000011111111=255,M8022=0X2接通第1次,D1=0000111111110000=4080,M8022=0X2接通第2次,D1=1111111100000000=-256,M8022=0X2接通第3次,D1=1111000000000111=-4089,M8022=1位右移和位左移(SFTR,SFTL)3.(1)SFTR命令有4个操作数,如图所示。当X10接通,以源(S.)X0开始的n2(K2)位,向右移入以目标(D.)M0开始的n1(K8)位元件中去。每当X10从OFF→ON,移位一次。(2)SFTL命令也有4个操作数,其动作原理与(1)字右移/字左移先入先出(FIFO)写入先入先出(FIFO)写入先入先出(FIFO)读出D1先入先出写入/读出例子数据处理(FNC40~FNC49)5.6.1区间复位5.6.2解码5.6.3编码5.6.4ON总数5.6.5ON位判别5.6.6平均值5.6.7报警器置位5.6.8报警器复位5.6.9开二次方5.6.10整数—实数变换区间复位解码/