FP1高级指令系统中包含了位、字以及字段的左/右移位指令,共有16位数据的左/右移位、4位BCD码的左/右移位,字数据的左/右移位、16位数据的左/右循环移位等12条指令,见表7-46。其中位移位指令有进位标志位参与运算,并分为非循环移位指令(普通移位)和循环移位指令两种。这些移位指令比前文介绍过的SR指令的功能要强大得多,且不像SR那样每次只能移动1位,而是可以根据需要,在指令中设置一次移动若干位。此外,各种通用寄存器都可以参与多种移位操作,其操作结果影响内部特殊继电器R9009(进位标志)或特殊数据寄存器DT9014。
表7-46 数据移位指令及操作数
1.16位数据的左/右移位指令
该类移位指令只是针对16位二进制数据,根据循环情况的不同又可分为普通(非循环)移位指令、循环移位指令和包含进位标志的循环移位指令三种情况。其区别主要在于移入位的数据处理上,简单地说,普通(非循环)移位指令不循环,移入位直接依次补0;循环移位指令移入位则由移出位补入;包含进位标志的循环移位指令移入位由进位标志依次补入。
这里要注意的是,为了便于理解,也可将一次移动n位的过程理解成移动n次,每次移动1位,实际上指令是一次完成移位的。
(1)普通(非循环)移位指令:F100(SHR)、F101(SHL)
F100(SHR):将寄存器D中的16位数据右移n位,高位侧移入数据均为0,低位侧向右移出n位,且第n位移入进位标志位CY(R9009)中。
F101(SHL):将寄存器D中的16位数据左移n位,高位侧向左移出n位,且第n位移入进位标志位CY(R9009)中,低位侧移入数据均为0。
其中,n用于设定移位的位数,为常数或16位寄存器,取值范围为K0~K255或H0~HFF。
例7-32 F101(SHL)数据左移指令示例,如图7-47所示
例题说明:当触发信号X0接通时,数据寄存器DT0中的数据被左移4位。数据左移后,最后一位移出的数据(位地址为12)传送到特殊内部继电器R9009(进位标志)中,DT0的低4位为0,如图7-48所示。
图7-47 数据左移指令示例
图7-48 n=K4时左移指令的执行结果
(2)循环移位指令:F120(ROR)、F121(ROL)
F120(ROR):寄存器D中的16位数据右移n位,低位侧移出的n位依次移入高位侧,同时移出的第n位复制到进位标志位CY(R9009)中。
F121(ROL):寄存器D中的16位数据左移n位,高位侧移出的n位依次移入低位侧,同时移出的第n位复制到进位标志位CY(R9009)中。
注意事项:
1)这两条指令与F100和F101的区别在于:这里是循环移位,而不是补0。
2)当n≥16时,其结果与减去16的倍数后相同。例如,n=K17时与n=K1的结果相同,n=K52时与n=K4的结果相同。
例7-33 F120(ROR)数据循环右移指令示例,如图7-49所示。
例题说明:当触发信号X0接通时,数据寄存器DT0中的数据被循环右移5位。右移后,最后一位移出的数(位地址为4)传送到R9009中,DT0中的低5位(0~4位)右移到高5位(11~15位)中,如图7-50所示。
图7-49 数据循环右移指令示例
图7-50 n=K5时循环右移指令的执行结果
(3)包含进位标志的循环移位指令:F122(RCR)、F123(RCL):
F122(RCR):寄存器D中的16位数据和进位标志位数据一起循环右移n位。
F123(RCL):寄存器D中的16位数据和进位标志位数据一起循环左移n位
注意当n≥16时,其结果与减去16的倍数后相同。例如,n=K25时与n=K9的结果相同,n=K68时与n=K4的结果相同。
2. 十六进制数的左/右移位指令:F105(BSR)、F106(BSL)
F105(BSR):寄存器D中的4位十六进制数右移1位,相当于右移二进制的4bits,移出的低4bits数据送到特殊数据寄存器DT9014的低4bits,同时D的高4bits变为0。
F106(BSL):寄存器D中的4位十六进制数左移1位,相当于左移二进制的4bits,移出的高4bits数据送到特殊数据寄存器DT9014的低4bits,同时D的低4bits变为0。
指令运行情况如图7-51。(www.xing528.com)
图7-51 十六进制数的左/右移位指令移位示意图
3.数据区按字左/右移位指令:F110(WSHR)、F111(WSHL)
F110(WSHR):由D1为首地址,D2为末地址定义的16位寄存器数据区,整体右移一个字,相当于二进制的16-bit。执行后,首地址寄存器的原数据丢失,末地址寄存器为0。
F111(WSHL):由D1为首地址,D2为末地址定义的16位寄存器数据区,整体左移一个字,相当于二进制的16-bit。执行后,首地址寄存器为0,末地址寄存器的原数据丢失。
注意:D1和D2应是同一类型的寄存器,且末地址寄存器号应大于或等于首地址寄存器号,即D2≥D1。指令运行情况如图7-52所示。此外,还要注意的是首尾地址的编排顺序是左边为末地址、右边为首地址。
图7-52 数据区按字左/右移位指令移位示意图
4.十六进制数据区的左/右移位指令:F112(WBSR)、F113(WBSL)
F112(WBSR):由D1为首地址,D2为末地址定义的16位寄存器数据区,整体右移一个十六进制位(相当于二进制的4位),执行后,首地址寄存器D1的低4位丢失,末地址寄存器D2的高4位全补0。
F113(WBSL):由D1为首地址,D2为末地址定义的16位寄存器数据区,整体左移一个十六进制(相当于二进制的4位),执行后,首地址寄存器D1的低4位全补0,末地址寄存器D2的高4位全丢失。
5.可逆计数与左/右移位指令:F118(UDC)、F119(LRSR)
在FP1系列PLC中,可逆计数和左/右移位指令各1条,是对普通计数器CT和移位寄存器SR指令功能的补充和加强。
(1)F118(UDC)
F118(UDC)是可逆计数器指令,也称为加/减计数器。与普通计数器不同,可逆计数器有3个输入信号,分别是加/减触发信号(加/减计数控制信号)、计数触发信号(加/减脉冲信号)和复位触发信号,3个输入信号是互相独立的,不是或(并联)的关系。
当加/减计数控制信号接通(ON)时,在每一个计数触发信号的上升沿进行加1计数,断开(OFF)则进行减1计数。当复位触发信号接通(ON)时,计数器被复位,计数器的当前值存储单元D变为0。计数器的复位触发信号断开(OFF)时,设定值存储单元S中的数据传送给当前值存储单元D,设定值的范围是-32768~32767。一般将比较指令或数据比较指令F60(CMP)与可逆计数器结合起来使用,以完成相应的控制功能。
例7-34 F118(UDC)是可逆计数器指令示例,如图7-53所示
例题说明:当检测到复位触发信号X2的下降沿时,DT10中的数据被传送到DT0中,计数器开始工作;当检测到X2的上升沿时,即复位信号有效,DT0被清0,计数器停止工作。
X0为加/减控制信号,当其为ON时,进行加计数,为OFF时,进行减计数。
X1为计数输入信号,检测到其上升沿时,根据X0的状态,执行加1或减1计数。
图7-53 F118(UDC)是可逆计数器指令示例
这里,DT10相当于CT指令中的预置值寄存器SV,DT0相当于经过值寄存器EV。当DT0中的结果为0时,特殊内部寄存器R900B接通,内部寄存器R50有输出。
例7-35 可逆计数器指令应用,如图7-54所示。
例题说明:若X0闭合,则对输入触发脉冲X1进行加计数,反之就进行减计数。3个触发信号同时有效时,复位信号优先。当WR0=K20时,R900B得电(ON),Y0随之得电输出。在计数过程中,若当前值单元中的数据超过一个字的符号数范围(-32768~32767),进位标志R9009得电(ON)。当前值计到0时,则R900B得电(ON)。
图7-54 可逆计数器指令应用
(2)F119(LRSR)
F119(LRSR)是左/右移位寄存器指令,将一个存储单元或数据块中的二进制数进行左/右移动1-bit。与移位寄存器指令SR不同,F119(LRSR)有4个输入信号,分别是左/右移位触发信号(左/右移位控制信号)、数据输入信号、移位触发信号(移位脉冲信号)和复位触发信号,4个输入信号是互相独立的,不是或(并联)的关系,要求D1、D2为同类型的存储单元,且D1≤D2。
例7-36 左/右移位指令举例,如图7-55所示。
例题说明:当X3为ON时,复位信号有效,DT0和DT9均被清0,移位寄存器停止工作。当X3为OFF时,移位寄存器正常工作。这时,由移位触发信号X2的上升沿触发移位操作,移动的方向由X0决定,若X0为ON,表示进行数据左移,为OFF,表示进行数据右移。至于移入的数据为1还是为0,则取决于X1的状态,若X1接通,移入数据为1,否则,移入数据为0。
图7-55 左/右移位指令举例
这里,DT0指定移位区首地址,DT9指定末地址,DT0~DT9构成了连续的16位寄存器区,移位操作使所有位同时进行,整个区域按照高位在左侧、低位在右侧的顺序排列。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。