可使用移位指令逐位左移或右移累加器1中低字的内容或整个累加器的内容(参见CPU寄存器)。左移n位相当于将累加器的内容乘以“2n”;右移n位相当于将累加器的内容除以“2n”。例如,将以二进制格式表示的十进制数3左移3位时,在累加器中出现相当于十进制数24的二进制编码。将以二进制格式表示的十进制数16右移2位时,在累加器中出现相当于十进制数4的二进制编码。
移位指令后的数字或在累加器2的低字节中,低字节中的数值表示要移位的数目。由0或符号位的信号状态(0代表正数、1代表负数)填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。复位状态字的CC 0和OV位为0。可使用跳转指令来判断CC 1位。移位运算是无条件的,即它们的执行不需要任何特殊的条件,且不影响逻辑运算的结果。
可使用循环移位指令逐位左移或右移累加器1的整个内容(参见CPU寄存器)。循环移位指令触发与移位指令相似的功能。然而,它使用累加器中移出的位的信号状态填充空出的位。
循环移位指令后的数字或在累加器2的低字节中,低节中的数值表示要循环移位的数目。取决于指令的具体情况,循环移位也可以通过状态字的CC 1位进行。复位状态字的CC 0位为0。
1.语句表(STL)的移位和循环移位指令
(1)SSI 带符号整型移位(16位)
指令格式为:SSI〈数目
SSI
〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~15。
SSI〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~15。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。
SSI:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于16时,始终产生相同的结果(ACCU 1=16#0000、CC 1=0或ACCU 1=16#FFFF、CC 1=1)。当移位数目大于0时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。
(2)SSD 带符号长整型移位(32位)
指令格式为:SSD
SSD〈数目〉
〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~32。
SSD(右移带符号的长整型)逐位向右移动ACCU 1的整个内容。由符号位的信号状态填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。
SSD〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将移位指令视为NOP操作。
SSD:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于32时,始终产生相同的结果(ACCU 1=32#00000000、CC 1=0或ACCU 1=32#FFFFFFFF、CC 1=1)。当移位数目大于0时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。
例:
SLW(左移字)逐位向左移动ACCU 1-L的内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。
SLW〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~15。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。
SLW:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于16时,始终产生相同的结果:ACCU 1-L=0、CC 1=0、CC 0=0和OV=0。当0〈移位数目≤16时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。
例:
(4)SRW 右移字(16位)
指令格式为:SRW
SRW〈数目〉
〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~15。
SRW(右移字)逐位向右移动ACCU 1-L的内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。
SRW〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~15。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。
SRW:移位数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。移位数目大于16时,始终产生相同的结果:ACCU 1-L=0、CC 1=0、CC 0=0和OV=0。当0〈移位数目≤16时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。
例:
(5)SLD 左移双字(32位)
指令格式为:SLD
SLD〈数目〉
〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~32。
SLD(左移双字)逐位向左移动ACCU 1的整个内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。
SLD〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。
SLD:移位数目由ACCU 2-L-L中的数值指定。允许的数值范围为0~255。移位数目大于32时,始终产生相同的结果:ACCU 1=0、CC 1=0、CC 0=0和OV=0。当0<移位数目≤32时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。
例:
(6)SRD 右移双字(32位)
指令格式为:SRD
SRD〈数目〉
〈数目〉的数据类型为整型、无符号。要移位的位数目,范围为0~32。
SRD(右移双字)逐位向右移动ACCU 1的整个内容。由零填充移位指令空出的位。将最后一个移出的位装载到状态字的CC 1位中。地址〈数目〉或ACCU 2-L-L中的数值指定要移位的位数目。
SRD〈数目〉:地址〈数目〉指定移位数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此移位指令视为NOP操作。
SRD:移位数目由ACCU 2-L-L中的数值指定。允许的数值范围为0~255。移位数目大于32时,始终产生相同的结果:ACCU 1=0、CC 1=0、CC 0=0和OV=0。当0〈移位数目≤32时,复位状态字的位CC 0和OV为0。当移位数目为0时,则将移位指令视为NOP操作。
例:
例1:
(7)RLD 循环左移双字(32位)
指令格式为:RLD
RLD〈数目〉
〈数目〉的数据类型为整型、无符号。要循环移位的位数目,范围为0~32。
RLD(循环左移双字)逐位向左循环移动ACCU 1的整个内容。循环移位指令空出的位由ACCU 1中移出位的信号状态填充。最后移出的位被装载到状态位CC 1中。而地址〈数目〉或ACCU 2-L-L中的数值则指定要循环移位的位数目。
RLD〈数目〉:地址〈数目〉指定循环移位的数目。允许的数值范围为0~32。当〈数目〉大于0时,将状态字的位CC 0和OV复位为0。当〈数目〉等于0时,则将此循环移位指令视为NOP操作。
RLD:循环移位的数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。当ACCU2-L-L内的数值大于0时,将状态字的位CC 0和OV复位为0。如果循环移位的数目为零,则将此循环移位指令视为NOP操作。
例:
RRD(循环右移双字)逐位向右循环移动ACCU 1的整个内容。循环移位指令空出的位由ACCU 1中移出位的信号状态填充。最后移出的位被装载到状态位CC 1中。而地址〈数目〉或ACCU 2-L-L中的数值则指定要循环移位的位数目。
RRD〈数目〉:地址〈数目〉指定循环移位的数目。允许的数值范围为0~32。当〈数目〉大于0时,复位状态字的位CC 0和OV为0。当〈数目〉等于0时,则将此循环移位指令视为NOP操作。
RRD:循环移位的数目由ACCU 2-L-L中的数值指定。可能的数值范围为0~255。当ACCU2-L-L的数值大于0时,复位状态字的位为0。
例:
(9)RLDA 通过CC 1循环左移ACCU 1(32位)
指令格式为:RLDA
RLDA(通过CC 1循环左移双字)通过CC 1将ACCU 1的整个内容循环左移1位。复位状态字CC 0和OV为0。
(10)RRDA 通过CC 1循环右移ACCU 1(32位)
指令格式为:RRDA
RRDA(通过CC 1循环右移双字)将ACCU 1的整个内容循环向右移动1位。复位状态字的位CC 0和OV为0。
(www.xing528.com)
2.梯形图(LAD)的移位和循环移位指令
(1)SHR_I 整数右移
指令符号为:
EN(使能输入)和ENO(起用输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为INT,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(移位指令的结果)的数据类型为INT型,存储区为I、Q、M、L、D。
SHR_I(整数右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_I指令用于将输入IN的0~15位逐位向右移动。16~31位不受影响。输入N用于指定移位的位数。如果N大于16,命令将按照N等于16的情况执行。自左移入的、用于填补空出位的位置将被赋予位15的逻辑状态(整数的符号位),如图4-10所示。这意味着,当该整数为正时,这些位将被赋值“0”,而当该整数为负时,则被赋值为“1”。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHR_I会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。
图4-10 整数右移
例:
SHR_I框由I0.0位置上的逻辑“1”激活。装载MW0并将其右移由MW2指定的位数。结果将被写入MW4。置位Q4.0。
(2)SHR_DI 右移长整数
指令符号为:
EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为DINT,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(移位指令的结果)的数据类型为DINT型,存储区为I、Q、M、L、D。
SHR_DI(右移长整数)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_DI指令用于将输入IN的0~31位逐位向右移动。输入N用于指定移位的位数。如果N大于32,命令将按照N等于32的情况执行。自左移入的、用于填补空出位的位置将被赋予位31的逻辑状态(整数的符号位)。这意味着,当该整数为正时,这些位将被赋值“0”,而当该整数为负时,则被赋值为“1”。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHR_DI会将CC0位和OV位设为“0”。ENO与EN具有相同的信号状态。
例
SHR_DI框由I0.0位置上的逻辑“1”激活。装载MD0并将其右移由MW4指定的位数。结果将被写入MD10。置位Q4.0。
(3)SHL_W 字左移
指令符号为:
EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为WORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(字移位指令的结果)的数据类型为WORD,存储区为I、Q、M、L、D。
SHL_W(字左移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHL_W指令用于将输入IN的0~15位逐位向左移动。16~31位不受影响。输入N用于指定移位的位数。若N大于16,此命令会在输出OUT位置上写入“0”,并将状态字中的CC 0和OV位设置为“0”。将自右移入N个零,用以补上空出的位置,如图4-11所示。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHL_W会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。
图4-11 整数左移
例:
SHL_W框由I0.0位置上的逻辑“1”激活。装载MW0并将其左移由MW2指定的位数。结果将被写入MW4。置位Q4.0。
(4)SHR_W 字右移
指令符号为:
EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为WORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(字移位指令的结果)的数据类型为WORD,存储区为I、Q、M、L、D。
SHR_W(字右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_W指令用于将输入IN的0~15位逐位向右移动。16~31位不受影响。输入N用于指定移位的位数。若N大于16,此命令会在输出OUT位置上写入“0”,并将状态字中的CC 0位和OV位设置为“0”。将自左移入N个零,用以补上空出的位置。可在输出OUT位置扫描移位指令的结果。如果N不等于0,则SHR_W会将CC 0位和OV位设为“0”。ENO与EN有相同的信号状态。
例:
SHR_W框由I0.0位置上的逻辑“1”激活。装载MW0并将其右移由MW2指定的位数。结果将被写入MW4。置位Q4.0。
(5)SHL_DW 双字左移
指令符号为:
EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字移位指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。
SHL_DW(双字左移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHL_DW指令用于将输入IN的0~31位逐位向左移动。输入N用于指定移位的位数。若N大于32,此命令会在输出OUT位置上写入“0”并将状态字中的CC 0和OV位设置为“0”。将自右移入N个零,用以补上空出的位置。可在输出OUT位置扫描双字移位指令的结果。如果N不等于0,则SHL_DW会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。
例:
SHL_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其左移由MW4指定的位数。结果将被写入MD10。置位Q4.0。
(6)SHR_DW 双字右移
指令符号为:
EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字移位指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。
SHR_DW(双字右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。SHR_DW指令用于将输入IN的0~31位逐位向右移动。输入N用于指定移位的位数。若N大于32,此命令会在输出OUT位置上写入“0”并将状态字中的CC 0位和OV位设置为“0”。将自左移入N个零,用以补上空出的位置,如图4-12所示。可在输出OUT位置扫描双字移位指令的结果。如果N不等于0,则SHR_DW会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。
图4-12 双字右移
例:
SHR_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其右移由MW4指定的位数。结果将被写入MD10。置位Q4.0。
(7)ROL_DW 双字循环左移
指令符号为:
EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要循环移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要循环移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字循环指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。
ROL_DW(双字循环左移)指令通过使能(EN)输入位置上的逻辑“1”来激活。ROL_DW指令用于将输入IN的全部内容逐位向左循环移位。输入N用于指定循环移位的位数。如果N大于32,则双字IN将被循环移位((N-1)对32求模,所得的余数)+1位。自右移入的位置将被赋予向左循环移出的各个位的逻辑状态,如图4-13所示。可在输出OUT位置扫描双字循环指令的结果。如果N不等于0,则ROL_DW会将CC 0位和OV位设为“0”。ENO与EN具有相同的信号状态。
图4-13 双字循环左移
例:
ROL_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其向左循环移位由MW4指定的位数。结果将被写入MD10。置位Q4.0。
(8)ROR_DW 双字循环右移
指令符号为:
EN(使能输入)和ENO(使能输出)的数据类型为BOOL型,存储区为I、Q、M、L、D。IN(要循环移位的值)的数据类型为DWORD,存储区为I、Q、M、L、D。N(要循环移动的位数)的数据类型为WORD,存储区为I、Q、M、L、D。OUT(双字循环指令的结果)的数据类型为DWORD,存储区为I、Q、M、L、D。
ROR_DW(双字循环右移)指令通过使能(EN)输入位置上的逻辑“1”来激活。ROR_DW指令用于将输入IN的全部内容逐位向右循环移位。输入N用于指定循环移位的位数。如果N大于32,则双字IN将被循环移位((N-1)对32求模,所得的余数)+1位。自左移入的位置将被赋予向右循环移出的各个位的逻辑状态,如图4-14所示。可在输出OUT位置扫描双字循环指令的结果。如果N不等于0,则ROR_DW会将CC 0位和OV位置为“0”。ENO与EN具有相同的信号状态。
图4-14 双字循环右移
例:
ROR_DW框由I0.0位置上的逻辑“1”激活。装载MD0并将其向左循环移位由MW4指定的位数。结果将被写入MD10。置位Q4.0。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。