9
在PLC的应用中经常用到移位指令,在STEP 7中的移位指令,包括有符号整数和长整数的右移指令、无符号字型数据的左移和右移指令、无符号双字型数据的左移和右移指令、双字的循环左移和循环右移指令。
移位指令是将累加器1中的数据或者累加器1低字中的数据逐位左移或逐位右移。左移相当于累加器的内容乘以2“,右移相当于累加器的内容除以2n(n为*的移动位数或移位次数)。
累加器1中移位后空出的位填0或符号位。被移动的最后1位保存在状态字的CC1中,可使用条件跳转指令对CC1进行判断,CCO和OV被复位到0。
循环移位指令的特点是移出的空位填以从累加器中移出的位。移位和循环移位指令的操作数及功能说明如表3-35所示。
2.堆栈指令
S7-300的CPU有两个累加器,S7-400的CPU有4个累加器。CPU中的累加器组成了一个堆栈,堆栈用来存放需要快速存取的数据,堆栈中的数据按“**后出”的原则存取。堆栈指令是否执行与状态字无关,也不会影响状态字。
对于只有两个累加器的CPU来说,PUSH(入栈)指令将累加器1的内容复制到累加器2,累加器l的内容不变。POP(出栈)指令将累加器2的内容复制到累加器1,累加器2的内容不变。
对于有4个累加器的CPU来说,PUSH(入栈)指令使堆栈中各层原有的数据依次向下移动一层,栈底(累加器4)的值被推出丢失,如图3-52所示。栈**(累加器1)的值保持不变。即累加器3的内容复制到累加器4,累加器2的内容复制到累加器3,累加器1的内容复制到累加器2,累加器1的内容不变。
POP(出栈)指令使堆栈中各层原有的数据向上移动一层(如图3-53所示),原来*2层(累加器2)中的数据成为堆栈新的栈**值,原来栈**(累加器1)中的数据从栈内消失。即累加器2的内容复制到累加器1,累加器3的内容复制到累加器2,累加器4的内容复制到累加器3,累加器4的内容不变。
“进入累加器堆栈”指令ENT(Enter Accmulator Stack)将累加器3的内容复制到累加器4,累加器2的内容复制到累加器3。使用ENT指令可以在累加器3中保存中间结果。
“离开累加器堆栈”指令LEAVE (Leave Accumulator Stack)将累加器3的内容复制到累加器2,累加器4的内容复制到累加器3,累加器1、4保持不变。
例用下述程序实现浮点数运算(DBDO+DBD4)/(DBD8-DBD12
3.加、减8位整数指令
字节加指令LNC(Increment ACCUl - LL)和字节减指令DEC(Decrement ACCUl - LL)将累加器1的较低字节(ACCUl - LL)的内容加上或减去指令中的8位常数(0~255),运算结果仍在累加器的较低字节中。累加器1的其他3个字节不变。
这些指令并不适合于16位或32位算术运算,因为累加器1的较低字节和它的相邻字节之间没有进位产生,16位或32位加法运算可以分别使用INC和DEC指令。
4.地址寄存器指令
+ARl (Add to ARl)指令将地址寄存器AR1的内容加上作为地址偏移量的累加器1的低字的内容,或加上指令中的16位常数(-32768~+32767),结果存在AR1中。
+AR2 (Add to AR2)指令将地址寄存器AR2的内容加匕作为地址偏移量的累加器1的低字的内容,或加上指令中的16位常数,结果存在AR2中。
16位有符号整数首先被扩充为24位,其符号位不变,然后与AR1中的低24位有效数字相加。地址寄存器中的存储区域标识符(*24~26位)保持不变。
5.空操作指令
BLD<number>(程序显示指令,空指令)并不执行什么功能,也不会影响状态位。该指令只是用于编程设备的图形显示,在STEP 7中将梯形图或功能块图转换为语句表时,将会自动生成BLD指令。指令中的<number>是编程设备自动生成的。
NOP 0和NOP 1指令并不执行什么功能,也不会影响状态位,它们的指令代码中分别由16个0或16个1组成,其作用与BLD指令类似。