[西门子] 西门子博图移位和循环指令

[复制链接]
查看26674 | 回复0 | 2024-5-23 17:45:17 | 显示全部楼层 |阅读模式
1、SHR:右移

可以使用“右移”指令将输入 IN 中操作数的内容按位向右移位,并在输出 OUT 中查询结果。参数 N 用于指定移位的位数。

如果参数 N 的值为“0”,则将输入 IN 的值复制到输出 OUT 的操作数中。

如果参数 N 的值大于位数,则输入 IN 的操作数值将向右移动该位数个位置。

无符号值移位时,用零填充操作数左侧区域中空出的位。如果指定值有符号,则用符号位的信号状态填充空出的位。



图中1位置:要进行右移操作的数;

图中2位置:要进行移位的位数;

图中3位置:右移执行后结果存储地址;

图中4位置:可执行的数据类型;



下图展示数据进行右移位的原理:



以下面实例检验运行结果:



有实例运行:输入为字节型数据”DB_1”.B_1=16#80转换为二进制:1000_0000移位数2结果为”DB_1”.B_2=16#20转换为二进制:0010_0000

PS:右移位指令条件成立M_1为ON执行一次,条件再次成立结果保持不变。

2、SHL:左移

使用“左移”指令将输入 IN 中操作数的内容按位向左移位,并在输出 OUT 中查询结果。参数 N 用于指定将指定值移位的位数。

如果参数 N 的值为“0”,则将输入 IN 的值复制到输出 OUT 的操作数中。

如果参数 N 的值大于位数,则输入 IN 的操作数值将向右移动该位数个位置。

用零填充操作数右侧部分因移位空出的位。注意与右移指令的区别。



左移指令与右移指令原理基本一致,区别在于符号位,左移为有低位向高位移动,低位自动补0,而右移指令是有高位向低位移动,固存在符号位问题。



原理展示:



下面看一下实例运行结果:



“DB_1”.B_1=16#01转换二进制为0000_0001执行指令移位数2结果存储在”DB_1”.B_2=16#04转换为二进制为0000_0100

3、ROR:循环右移

使用“循环右移”指令将输入 IN 中操作数的内容按位向右循环移位,并在输出 OUT 中查询结果。参数 N 用于指定循环移位中待移动的位数。用移出的位填充因循环移位而空出的位。

如果参数 N 的值为“0”,则将输入 IN 的值复制到输出 OUT 的操作数中。

如果参数 N 的值大于可用位数,则输入 IN 中的操作数值仍会循环移动指定位数。注意与右移指令区别。

下面来看一下移位原理图展示:



有图中可以看出循环右移与右移的差异,循环移位指令也常被用于经典的跑马灯程序。设定好移位指令执行的间隔时间就可以达到跑马灯的效果。

下面是参数表:



结合实例展示如下:如果将IN改为MB100执行此指令M100.7-M100.0按顺序依次为ON,如果换为输出点,就可以驱动外部指示灯。



4、ROL:循环左移

使用“循环左移”指令将输入 IN 中操作数的内容按位向左循环移位,并在输出 OUT 中查询结果。参数 N 用于指定循环移位中待移动的位数。用移出的位填充因循环移位而空出的位。

如果参数 N 的值为“0”,则将输入 IN 的值复制到输出OUT 的操作数中。

如果参数 N 的值大于可用位数,则输入 IN 中的操作数值仍会循环移动指定位数。



指令执行与循环右移原理一样,只是移动方向变为向左,不在赘述。

移位与循环移位在PLC编程中有着非常广泛及巧妙的用法,理解后可结合实际案例灵活运用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则