1FUNCTION_BLOCK"FB_Rol_Demo"2{ S7_Optimized_Access :='TRUE' }3VERSION:0.14VAR_INPUT5 Value :Word:=16#8001;// 位串6 N :UInt:=1;// 循环左移位数7END_VAR89VAR_OUTPUT10 Result :Word;// 循环左移结果11END_VAR1213BEGIN14REGION 循环左移15#Result:= ROL(IN :=#Value, N :=#N);16END_REGION17END_FUNCTION_BLOCK18
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1#Result:= ROL(IN :=#Value, N :=#Count);
ROL 是函数调用,结果直接赋给位串变量;它不修改输入。IN 的类型决定位宽,N 是循环移位数。
怎么工作
IN(Word)
N
结果
16#8001
1
16#0003
16#8001
16
16#8001
16#8001
17
16#0003
16#0001
0
16#0001
循环左移:最高位移出后补到最低位。
N 按位宽取模;Word 的 N=17 等价 N=1。
支持 BYTE/WORD/DWORD/LWORD。
和 SHL 不同:SHL 补 0,ROL 不丢位。
常用场景
1. 位轮询/扫描
循环左移一位热码,实现 8/16/32 路输出轮询。
2. 数据加密/校验
简单的位旋转混淆;不是安全加密,只适合校验/测试。
3. 循环缓冲区索引
位串旋转匹配环形移位寄存器;注意方向。
常见坑
把 ROL 当 SHL:ROL 会把移出的高位补回低位,SHL 补 0。
N 超过位宽:按位宽取模,不是全 0;全 0 用 SHL。
用 Int/Real:只接受位串;先转 WORD/DWORD。
N 为负:非法;先检查。
方向反了:ROL 向左,ROR 向右;画图确认。
位宽选错:Word 和 DWord 的旋转结果不同。
和 LAD 的区别
LAD 的 ROL 是带 IN/N 的盒;SCL 里直接写函数调用,可以嵌在表达式里。语义一样,SCL 更容易把旋转和状态逻辑连写。梯形图版本见 Learn-LAD 的 Rol 页。