
4.6 移位和循环移位类指令
4.6.1 移位指令
(1)移位指令格式和功能
移位指令格式和功能如表4-28所示。
表4-28 移位指令的指令格式和功能

(2)例说移位指令

梯形图如图4-45(a)所示。

图4-45 左移指令
① PLC从STOP到RUN时,SM0.1接通一个扫描周期,使QB0中的数据为2#01000101(16#45)。
② 当I0.0闭合,将IN所指定的存储单元QB0中的数据向左移动1位,右端补0,并将移位后的结果输出到OUT所指定的存储单元QB0中。
③ 如果移位位数大于0,最后一次移出位保存在“溢出”存储器位SM1.1。如果移位操作使结果变为零,零标志位SM1.0置1。图4-45(b)是左移一位的示意图。
④右移指令操作类似,在此不再赘述。

移位指令,只要使能端EN为1,则每一个扫描周期,都会执行一次移位指令。如果希望I0.0每接通一次,仅执行一次移位指令,需要在I0.0后面串接上升沿脉冲指令。
4.6.2 循环移位指令
(1)循环指令格式和功能
循环移位指令格式和功能如表4-29所示。
表4-29 循环移位指令格式和功能


取模操作对于字节、字和双字的操作分别为:
① 对于字节移位,将N除以8以后取余数,取模的结果对于字节操作是0~7;
② 对于字移位,将N除以16以后取余数,取模的结果对于字操作是0~15;
③ 对于双字移位,将N除以32以后取余数,取模的结果对于双字操作是0~31。
(2)例说循环移位指令

梯形图如图4-46(a)所示。

图4-46 循环左移指令
① PLC从STOP到RUN时,SM0.1接通一个扫描周期,使QB0中的数据为2#01000101(16#45)。
② 当I0.0闭合,将IN所指定的存储单元QB0中的数据向左移动1位;移出的数据0填充到右侧空出的单元,同时,也将这个移出的数据0存入SM1.1,并将移位后的结果输出到OUT所指定的存储单元QB0中。
③ 如果循环移位操作使结果变为零,零标志位SM1.0置1。
④ 图4-46(b)是循环左移一位的示意图。从图中可以看出,循环移位是环形移位,左侧单元移出的数据补充到右侧空出的单元。同理,对于循环右移指令,右侧单元移出的数据补充到左侧空出的单元。操作方式类似,在此不再赘述。

循环移位指令,只要使能端EN为1,则每一个扫描周期,都会执行一次循环移位指令。如果希望I0.0每接通一次,仅执行一次循环移位指令,需要在I0.0后面串接上升沿脉冲指令。
4.6.3 移位寄存器指令
(1)移位寄存器指令格式和功能
移位寄存器指令格式和功能如表4-30所示。
表4-30 移位寄存器指令格式和功能

(2)例说移位寄存器指令

梯形图4-47(a)中,移位寄存器指令的参数包含以下重要含义。

图4-47 移位寄存器指令
① N指定移位寄存器的长度和移位方向,“4”为移位的长度,“+”号表示左移。
② S_BIT指定移位寄存器最低有效位的位置,即移位的范围最低位从M0.0开始。结合移位长度为4,所以接下来将在M0.0~M0.3这四位的范围内移位。M0.4~M0.7这四位的数值不受影响。
③ 左移移出的数据存入SM1.1,右侧空出的单元将填入DATA接收的数值位。
时序图如图4-47(b)所示。PLC从STOP到RUN时,SM0.1接通一个扫描周期,使MB0中的数据为2#00000101,I1.0共有两个上升沿,所以移位两次。
① 第一次 I1.0来第一个上升沿时,I1.1=1,M0.0~M0.3这四位数“0101”左移一位,左移移出的数“0”存入SM1.1,右侧空出的单元填入“1”,注意,“1”是I1.1的数值。
② 第二次 1.0来第二个上升沿时,I1.1=0,M0.0~M0.3这四位数“1011”左移一位,左移移出的数“1”存入SM1.1,右侧空出的单元填入“0”,注意,“0”是I1.1的数值。
4.6.4 综合实例
综合实例1——条码图显示控制
范例示意如图4-48所示。

图4-48 范例示意

图中有16个LED,初始时右边的8个LED亮,按动减按钮,减少条码图的发光长度,按动加按钮,增加条码图的发光长度。

元件说明见表4-31。
表4-31 元件说明


控制程序如图4-49所示。

图4-49 控制程序

① 初始化脉冲SM0.1产生一个脉冲,将Q1.0~Q1.7全部置1,QW0中的数据结果为2#0000000011111111,Q1.0~Q1.7得电,发光二极管1~8得电发光。
② 按下加按钮I0.0,执行左移指令SHL,移位后QW0中的数据结果为2#0000000111111110,同时Q1.0置1,最终结果为2#0000000111111111,增加一个灯亮。每按一次按钮I0.0,多增加一个灯亮。
③ 如果按下减按钮I0.1,执行右移指令SHR,最左边的灯将会熄灭。每按一次减按钮I0.1,熄灭一个灯。
综合实例2——用循环移位指令实现多灯控制
范例示意如图4-50所示。

图4-50 范例示意

通过采用循环移位指令对多个灯控制,达到PIZZA循环点亮的演示效果。

元件说明见表4-32。
表4-32 元件说明


控制程序如图4-51所示。

图4-51 控制程序

① 当按下启动按钮I0.0时,I0.0=ON,复位Q0.0~Q0.4,置位Q0.5、M1.1。
② M1.1=ON,启动T37定时器,使T37每隔200ms接通一个扫描周期。
③ T37每接通一次,QB0循环左移一次。
④ 按下停止按钮I0.1时,I0.1=ON,复位Q0.0~Q0.5,复位M1.1,停止灯的循环点亮。
综合实例3——物流检测控制
范例示意如图4-52所示。

图4-52 范例示意

产品被传送至传送带上做检测,当光电开关检测到有不良品时(高度偏高),在第4个定点将不良品通过电磁阀推出,推出到回收箱后电磁阀自动复位。当在传送带上的不良品记忆错乱时,可按下复位按钮将记忆数据清零,系统重新开始该检测。

元件说明见表4-33。
表4-33 元件说明


控制程序如图4-53所示。

图4-53 控制程序

① 每当凸轮转一圈,产品从一个定点移到另外一个定点,I0.1的状态由OFF变化为ON一次,同时移位指令执行一次,M0.0~M0.3的内容往左移一位,I0.0的状态被传到M0.0。
② 当有不良品产生时(产品高度偏高),I0.0=ON,“1”的数据进入M0.0,移位3次后到达第4个定点,使得M0.3=ON,Q0.0被置位,Q0.0=ON,使得电磁阀动作,将不良品推到回收箱。
③ 当不良品确认已经被推出后,I0.2由OFF变化为ON一次,产生一个上升沿,使得M0.3和Q0.0被复位,电磁阀被复位,直到下一次有不良品产生时才有动作。
④ 当按下复位按钮I0.3时,I0.3由OFF变化为ON一次,产生一个上升沿使得M0.0~M0.3被全部复位为“0”,保证传送带上产品发生不良品记忆错乱时,重新开始检测。
综合实例4——住房防盗系统控制
范例示意如图4-54所示。

图4-54 范例示意

本案例介绍的居室安全系统是在户主长时间不在家时,通过控制灯光和窗帘等设施来营造家中有人的假象来骗过盗窃分子的一种自动安全系统。本案例中,当户主不在家时,两个居室的窗帘在白天打开,在晚上关闭;两个居室的照明灯白天关闭,晚上18点至20点第一居室的照明灯持续点亮,第二居室的照明灯间隔1小时点亮。控制系统须由户主在早上7点启动。

元件说明见表4-34。
表4-34 元件说明


控制程序如图4-55所示。

图4-55


图4-55 控制程序

① 启动时,按下启动按钮I0.1,I0.1得电,常开触点闭合,M1.2得电并自锁,居室安全系统启动。此时,在有光的情况下,光电开关I0.0=ON,Q0.0、Q0.2得电,两个居室的窗帘上升。碰到上限位开关后,I0.3、I0.5得电,常闭触点断开,两居室窗帘停止上升。若在无光情况下,光电开关I0.0=OFF,常闭触点闭合,Q0.1、Q0.3得电,两居室的窗帘下降,碰到下限位开关后,I0.4、I0.6得电,常闭触点断开,两居室窗帘停止下降。
② 按下启动按钮后,M0.0得电自锁,C0复位并开始计数。当计数到900时,C0=ON,使C1计数一次,C0清零后继续计数,当C1计数到44时,此时已过去11个小时为晚上18点,C1得电常开触点闭合,M0.1得电并自锁,M0.1使M0.0、C1复位,M0.1常开触点闭合Q0.4得电,第一居室照明灯打开。同时,定时器T37开始计时。
③ 半小时后,T37=ON,定时器T38开始计时,半小时后(19点),T38=ON,SHRB指令执行,将M0.5中的值移动到M0.6中,起初,M0.5始终得电,故其值为1,移动后,M0.6=ON,M0.5失电,Q0.5=ON,第二居室的照明灯点亮。同时,在T38=ON时,T37、T38被清零,重新计时。1小时后(20点),SHRB指令再次执行,M0.5的值为0,M0.6的值为0,M0.7的值为1,Q0.5失电,第二居室的照明灯关闭。随后,定时器再次重新计时,一小时后(21点),SHRB指令执行,M0.5中的值为0,M0.6中的值为0,M0.7中的值为0,M1.0中的值为1,Q0.5=ON,第二居室的照明灯再次点亮。然后,定时器第三次重新计时,到22点SHRB指令执行后,M0.5、M0.6、M0.7、M1.0中的值都为0,Q0.5失电。M1.1中的值为1,M1.1常闭触点断开,M0.1失电,M0.1、M0.7常开触点都断开,Q0.4失电,照明灯全部关闭。同时,因M1.1=ON,M0.2得电自锁,计数器C2开始计数,计数到360后,C2=ON,使自身复位清零,并使C3计数一次。当C3计数到90时,C3=ON,使得C3、M0.2、M1.1复位,同时使M0.0得电自锁,这时,计数器C0再次计数,新的循环开始。此时,时间进入到系统第二天开启的7点。
④ 关闭系统时,按下停止按钮I0.2,I0.2=ON,M1.2失电,系统关闭。同时,复位指令执行,使计数器C0~C3和辅助继电器M0.1~M1.1复位。