9.12 SIMATIC 移位和循环指令
字节右移位和左移位
字节左移位指令 (SLB) 或右移位指令 (SRB) 把输入字节 (IN) 左
移或右移N位后 再把结果输出到 OUT 字节
移位指令对移出位自动补零 如果所需移位次数N大于或等于
8 那么实际最大可移位数为 8
如果所需移位次数大于零 那么溢出位 (SM1.1) 上就是最近移出
的位值 如果移位操作的结果是 0 零存储器位 (SM1.0) 就置
位
字节左移位或右移位操作是无符号的
使 ENO = 0 的错误条件是 SM4.3 (运行时间) 0006 (间接寻址)
这些指令影响下面的特殊存储器位 SM1.0 (零) SM1.1 (溢出)
输入/输出 操 作 数 数据类型
IN VB, IB, QB, MB, SB, SMB, LB, AC, *VD, *AC, *LD 常数 BYTE
OUT VB, IB, QB, MB, SB, SMB, LB, AC, *VD, *AC, *LD BYTE
N VB, IB, QB, MB, SB, SMB, LB, AC, 常数, *VD, *AC, *LD BYTE
字左移位或右移位
字左移位指令 (SLW) 或右移位指令 (SRW) 把输入字 (IN) 左移或
右移 N 位后 再把结果输出到字 OUT
移位指令会对移出位自动补零 如果所需移位次数 N大于或等
于 16 那么实际最大可移位数为 16 如果所需移位数大于零
那么溢出位 (SM1.1) 上就是最近一次移出的位值 如果移位操作
的结果是0 零存储器位 (SM1.0) 就置位
字左移位或右移位操作是无符号的
使 ENO = 0 的错误条件是 SM4.3 (运行时间) 0006 (间接寻址)
这些指令影响下面的特殊存储器位 SM1.0 (零) SM1.1 (溢出)
输入/输出 操 作 数 数据类型
IN VW, IW, QW, MW, SW, SMW, LW, T, C, AIW, AC, 常数, *VD, *AC, *LD WORD
N VB, IB, QB, MB, SB, SMB, LB, AC, 常数, *VD, *AC, *LD BYTE
OUT VW, IW, QW, MW, SW, SMW, LW, T, C, AC, *VD, *AC, *LD WORD
双字左移位或右移位
双字左移位指令 (SLDW) 或右移位指令 (SRDW) 把输入双字
(IN) 左移或右移 N位后 再把结果输出到双字 (OUT)
移位指令会对移出位自动补零 如果所需移位次数N大于或等
于 32 那么实际最大可移位数为 32 如果所需移位次数大于
零 那么溢出位 (SM1.1) 上就是最近一次移出的位值 如果移
位操作的结果是 0 零存储器位 (SM1.0) 就置位
字左移位或右移位操作是无符号的
使 ENO = 0 的错误条件是 SM4.3 (运行时间) 0006 (间接寻址)
这些指令影响下面的特殊存储器位 SM1.0 (零) SM1.1 (溢出)
输入/输出 操 作 数 数据类型
IN VD, ID, QD, MD, SD, SMD, LD, AC, HC, 常数, *VD, *AC, *LD DWORD
N VB, IB, QB, MB, SB, SMB, LB, AC, 常数, *VD, *AC, *LD BYTE
OUT VD, ID, QD, MD, SD, SMD, LD, AC, *VD, *AC, *LD DWORD
字节循环左移或循环右移
字节循环左移指令 (RLB) 或循环右移指令 (RRB) 把输入字节
(IN) 循环左移或循环右移N位后 再把结果输出到字节
(OUT)
如果所需移位次数大于或等于 8 那么在执行循环移位前 先
对 取以 8 为底的模 其结果 0 7 为实际移动位数 如果所需
移位数为零 那就不执行循环移位 如果执行循环移位的话
那么溢出位 (SM1.1) 值就是最近一次循环移动位的值
如果移位次数不是 8 的整数倍 最后被移出的位就存放到溢出
存储器位 (SM1.1) 如果移位操作的结果是 0 零存储器位
(SM1.0) 就置位
字节循环移位操作是无符号的
使 ENO = 0 的错误条件是 SM4.3 (运行时间) 0006 (间接寻址)
这些指令影响下面的特殊存储器位 SM1.0 (零) SM1.1 (溢出)
输入/输出 操 作 数 数据类型
IN VB, IB, QB, MB, SMB, SB, LB, AC, *VD, *AC, *LD BYTE
N VB, IB, QB, MB, SMB, SB, LB, AC, 常数, *VD, *AC, *LD BYTE
OUT VB, IB, QB, MB, SMB, SB, LB, AC, *VD, *AC, *LD BYTE
字循环左移或循环右移
字循环左移指令 (RLW) 或右移指令 (RRW) 把输入字 (IN) 循环
左移或循环右移 N 位后 再把结果输出到字 (OUT)
如果所需移位次数大于或等于 16 那么在执行循环移位前 先
对 N取以 16 为底的模 其结果 0 15 为实际所移位数 如果
所需移位数为零 那就不执行循环移位 如果执行循环移位的
话 那么溢出位 (SM1.1) 上的值就是最近一次循环移动位的
值
如果移位次数不是 16 的整数倍 最后被移出的位就存放到溢出
存储器位 (SM1.1) 如果移位操作的结果是 0 零存储器位
(SM1.0) 就置位
字循环移位操作是无符号的
使 ENO = 0 的错误条件是 SM4.3 (运行时间) 0006 (间接寻址)
这些指令影响下面的特殊存储器位 SM1.0 (零) SM1.1 (溢出)
输入/输出 操 作 数 数据类型
IN VW, T, C, IW, MW, SMW, AC, QW, LW, AIW, 常数, *VD, *AC, SW,
*LD
WORD
N VB, IB, QB, MB, SMB, LB, AC, 常数, *VD, *AC, SB, *LD BYTE
OUT VW, T, C, IW, QW, MW, SMW, LW, AC, *VD, *AC, SW, *LD WORD
双字循环左移或循环右移
双字循环左移指令 (RLD) 或循环右移指令 (RRD) 把输入双字
(IN) 循环左移或循环右移 N 位 再把结果输出到双字 (OUT)
如果所需移位次数 N 大于或等于 32 那么在执行循环移位
前 先对 N 取以 32 为底的模 其结果 0 31 为实际所移位
数 如果所需移位数为零 那就不执行循环移位 如果执行循
环移位的话 那么溢出位 (SM1.1) 上的值就是最近一次循环移
动的值
如果移位次数不是 32 的整数倍 最后被移出的位就存放到溢
出存储器位 (SM1.1) 如果移位操作的结果是 0 零存储器位
(SM1.0) 就置位
字循环移位操作是无符号的
使 ENO = 0的错误条件是 SM4.3 (运行时间) 0006 (间接寻址)
这些指令影响下面的特殊存储器位 SM1.0 (零) SM1.1 (溢出)
输入/输出 操 作 数 数据类型
IN VD, ID, QD, MD, SMD, LD, AC, HC, 常数, *VD, *AC, SD, *LD DWORD
N VB, IB, QB, MB, SMB, LB, AC, 常数, *VD, *AC, SB, *LD BYTE
OUT VD, ID, QD, MD, SMD, LD, AC, *VD, *AC, SD, *LD DWORD
移位和循环举例
LAD STL
LD I4.0
RRW AC0, 2
SLW VW200, 3
I4.0 ROR_W
EN
IN
N
AC0
2 OUT AC0
SHL_W
EN
IN
N
VW200
3
OUT VW200
应 用
循环前
AC0
零存储器位(SM1.0) = 0
溢出存储器位(SM1.1) = 0
x
溢出
1010 0000 0000 0000
第 1次循环后
AC0 1
溢出
0101 0000 0000 0000
第 2次循环后
AC0 0
溢出
0100 0000 0000 0001
移位前
VW200
零存储器位(SM1.0) = 0
0溢出存储器位(SM1.1) = 1
x
溢出
1100 0101 0101 1010
第 1 次移位后
VW200 1
溢出
1000 1010 1011 0100
第 2次移位后
VW200 1
溢出
1110 0010 1010 1101
0001 0101 0110 1000
第 3次移位后
shiftVW200 1
溢出
循环 移位
FBD
ROR_W
EN
IN
N
AC0
2
OUT AC0
SHL_W
EN
IN
N
VW200
3
OUT VW200ENO
ENO
ENO ENOI4.0
图 9-39 移位和循环指令的 LAD STL 和 FBD 举例
位移位寄存器指令
位移位寄存器指令 (SHRB) 把输入的 DATA 数值移入移位寄存
器 而该移位寄存器是由 S-BIT 和 N 决定的 其中 S-BIT 指
定移位寄存器的最低位 N指定移位寄存器的长度 (正向移位
= N 反向移位= -N)
SHRB 指令的位被放再溢出位 (SM1.1)
使 ENO = 0 的错误条件是 SM4.3 (运行时间) 0006 (间接寻
址) 0091 (操作数超界) 0092 (计数区错误)
这些指令影响下面的特殊存储器位 SM1.1 (溢出)
输入/输出 操 作 数 数据类型
DATA, S_BIT I, Q, M, SM, T, C, V, S, L BOOL
N VB, IB, QB, MB, SMB, LB, AC, 常数, *VD, *AC, SB, *LD BYTE
0001 0101 0110 1000
零存储器位 SM1.0 =0
溢出存储器位 SM1.1 =1
对位移位寄存器指令的理解
位移位寄存器指令提供了一种排列和控制产品流或数据流的简单方法 在每个扫描周期 整个移位
寄存器移动一位 此移位寄存器由 S-BIT 和 N 决定 图 9-41 为位移位寄存器应用举例
位移位寄存器的最高位 (MSB.b) 可通过下面公式计算求得
MSB.b = [ (S-IT 的字节号) + ([N - 1] + (S-BIT 的位号)) / 8 的商] . [除 8 的余数]
因为 S-BIT 也是移位寄存器中的一位 故必须减 1
例如 如果 S-BIT 是 V33.4 N 是 14 那么 MSB.b 是 V35.1 或
MSB.b = V33 + ([14] - 1 +4) /8
= V33 + 17/8
= V33 + 2 (余数为 1)
= V35.1
位移位寄存器移位方向由 N 的正负决定 反移时 N 为负 输入数据从最高位移入 最低位 (S-
BIT) 移出 正移时 N 为正 输入数据从最低位 (S-BIT) 移入 最高位移出
移出的数据放在溢出存储器位 (SM1.1) 移位寄存器的最大长度是 64 位 可正可负 图 9–40 为两
种不同方向的移位
7 4 0V33
MSB LSB
正向移位 长度 N= 14
S_BIT
7 0V34
7 0V35 1
位移位寄存器的最高位
7 4 0V33
MSB LSB
反向移位 长度N= -14
S_BIT
7 0V34
7 0V35 1
位移位寄存器的最高位
图 9-40 正移 反移时位移位寄存器的入口与出口
位移位寄存器指令举例
LAD STL
LD I0.2
EU
SHRB I0.3, V100.0, 4
I0.2 SHRB
DATAI0.3
P
S_BITV100.0
N4
I0.2
时 序 图
I0.3
7
1V100
MSB LSB
S_BIT
I0.3010
0
溢出位 (SM1.1) x
1V100
S_BIT
I0.3101
溢出位 (SM1.1) 0
0V100
S_BIT
I0.3110
溢出位 (SM1.1) 1
第 1次移位 第 2次移位
第 1次移位前
第 1次移位后
第 2次移位后
正跳变
FBD
SHRB
EN
DATAI0.3
S_BITV100.0
N4
ENO
ENOEN
OUTINI0.2
P
图 9-
41 位移位寄存器的 LAD STL 和 FBD 应用举例