【SCL】移位和循环指令的应用(音乐喷泉改进) | 您所在的位置:网站首页 › scr和shr › 【SCL】移位和循环指令的应用(音乐喷泉改进) |
移位指令:右移(SHR)左移(SHL)和循环左移/右移(ROR/ROL)指令的应用 文章目录目录 一、移位和循环移位指令 1.左移右移 2.使用左移和脉冲实现音乐喷泉 3.循环移位指令 二、优化的其它方法 1.使用脉冲和数组 2.随机移位 总结 前言这一章我们对音乐喷泉试验进行优化和改进,并一起来学习我们移位指令在这里的应用。 一、移位和循环移位指令 1.左移右移在我们前面实现音乐喷泉控制时,是使用的case of 语句来完成的,那么有没有其它的更加简便的方法方式呢!有的,移位指令就是!我们再来看一下控制要求: L1到L8这8个灯以0.5s的间隔依次来闪亮,时间间隔相同,一共要用8个Q点; 左移(SHL): 这一个是信息系统中的释义: 这一个是scl中的左移指令,其中IN是要移位的一个值,上面音乐喷泉的8个灯是一个字节byte,8个位,这里IN我们填上QB0就可以了(Q0.0---Q0.7) ,N是对IN每次移位的位数(例:1,就是对QB0一次移动1位) 左移就是从左边Q0.0开始,进行移位; 右移(SHR): 和左移相反,从右边Q0.7开始进行移位; 2.使用左移和脉冲实现音乐喷泉这里启动按钮按下后,用中继接通定时器来产生脉冲,并给qb赋值一个1(相当于初始值),用脉冲来触发左移指令,当最后一位也移完之后,qb就=0,这是再给它一个1,就可以循环往复一直运行,按下停止后,将标志1和qb清零就可以啦! 较与case of 语句,这个会更加简便一些。 IF #OFF THEN #标志1 := 0; #qb := 0; END_IF; IF #ON THEN #标志1 := 1; #qb := 1; END_IF; #T(IN := #标志1 & NOT #输出, PT := T#500ms, Q => #输出); #P(CLK := #输出); IF #标志1 & #P.Q THEN #qb := SHL(IN := #qb, N := 1); IF #qb = 0 THEN #qb := 1; END_IF; END_IF; 3.循环移位指令循环左移指令会在移位完之后,再次循环移位,在上中会比左移更加方便一些! 这一个实现的原理就是给数组赋值2进制的数值,然后再将数组依次赋值给qb,来实现效果! IF #OFF THEN #qb := 0; #ZJ1 := 0; "数据块_1".变量 := 0; END_IF; IF #ON THEN #ZJ1 := 1; END_IF; #T[0](IN := #ZJ1 & NOT #输出1, PT := T#500ms, Q => #输出1); #P[0](CLK := #输出1); IF #P[0].Q THEN "数据块_1".变量 :="数据块_1".变量+1; IF "数据块_1".变量 = 8 THEN "数据块_1".变量 := 0; END_IF; END_IF; IF #ZJ1 THEN #qb := "数据块_1".数组["数据块_1".变量]; END_IF; 2.随机移位这里是用一个脉冲对变量w进行加加,另一个脉冲来抓取,然后来确定移动的位数。 //停止 IF #OFF THEN #中继1 := 0; #W := 0; #qb := 0; END_IF; //启动 IF #ON THEN #中继1 := 1; //#中继2 := 1; #qb := 1; END_IF; //获取脉冲上升沿 IF #中继1 THEN #P(CLK := "Clock_2.5Hz"); END_IF; //对变量w一直进行加1 IF #P.Q THEN #W := #W + 1; IF #W = 8 THEN #W := 1; END_IF; END_IF; //在0.5s内抓取变量w的数值,然后进行移位操作,实现每次移动的数不同。 #T(IN := #中继1 & NOT #时间到, PT := T#0.5s, Q => #时间到); #P1(CLK := #时间到); IF #P1.Q & #中继1 THEN //#中继1 := 0; #qb := SHL(IN := #qb, N := #W); END_IF; IF #qb = 0 & #中继1 THEN #qb := 1; END_IF; 总结以上就是对音乐喷泉这个案例的几个优化。 |
CopyRight 2018-2019 实验室设备网 版权所有 |