移位和循环移位
位操作
优化您的寄存器处理。从超快速数学计算到复杂的通信协议管理,掌握位运动。
为什么要对位进行移位或循环移位?
移位 (Shift) 和循环移位 (Rotate) 操作允许将字的位向左或向右移动。在工业中,它们用于从通信报文中提取精确信息、创建用于跟踪输送线上零件的移位寄存器,或以极高的性能执行 2 的幂次乘法/除法。
主要区别在于对“移出”位的处理:移位 (Shift) 会丢弃它们并用零替换,而循环移位 (Rotate) 会将它们从字的另一侧重新馈入,从而创建一个连续的循环回路。
移位 (Shift)
带位丢失的线性运动
SHL / SHR — 左移/右移
SHL功能
将位向左 (SHL) 或向右 (SHR) 移动由输入 N 定义的位数。移出寄存器的位将丢失,新移入的位设为 0。
适用场景
快速乘以 2 (SHL)、除以 2 (SHR),或在 32 位字中隔离特定字节。
专家提示
将整数向左移 1 位相当于在不使用数学计算单元的情况下将其乘以 2。
对于有符号类型 (Int, DInt),SHR 通常保留符号位(算术移位)。
如果 N 大于字大小(例如,WORD 的 N=20),结果将为 0。
循环移位 (Rotate)
无丢失的循环运动
ROL / ROR — 左循环移位/右循环移位
ROL功能
以循环方式旋转位。从一侧移出的位(例如 ROL 的左侧)立即从另一侧(右侧)进入。不会丢失任何数据。
适用场景
创建旋转灯光图案、简单的加密数据或管理循环缓冲区 (FIFO)。
专家提示
非常适合在一组泵或电机中轮换优先级。
与移位不同,完整的循环移位(例如 WORD 的 16 位)会返回初始值。
在数据交换中使用 ROL/ROR 重新排列字节顺序(字节序)。
移位 vs 循环移位:对比
了解对数据的影响
| 属性 | 移位 (SHL/SHR) | 循环移位 (ROL/ROR) |
|---|---|---|
| 结构 | 线性 | 循环 |
| 移出位 | 丢弃 (丢失) | 在另一侧重新馈入 |
| 移入位 | 始终为 0 | 回收的移出位 |
| 数学用途 | 乘法 / 除法 | 位排列 |
| 实际示例 | 零件跟踪 (输送线) | 跑马灯 / 序控器 |
| 风险 | 寄存器清空 | 无 (数据保留) |
常见问题
为什么要使用 SHL 而不是乘以 2?
SHL 指令由 PLC 处理器执行的速度比 MUL 操作快得多,因为它直接在寄存器上操作,而不经过复杂的算术逻辑单元 (ALU)。
如何为输送线创建移位寄存器?
在每个编码器脉冲处使用 SHR。如果在入口检测到零件,将位 0 强制为 1。通过对字进行移位,您可以逐位跟踪零件的位置。
数据类型 (Byte, Word, DWord) 有什么影响?
指令会根据大小进行调整。对 Byte 进行 ROR 移位 1 位后,位 7 将重新出现在位置 0。对于 Word,则是位 15 回到 0。
可以在 SCL 中对变量进行移位吗?
可以,通过 SHL(IN:=var, N:=n) 函数,或者如果您的 TIA Portal 版本允许,使用标准的位运算符。