首页 理论教育 PAC编程基础教程:位左移指令BSL和位右移指令BSR编程

PAC编程基础教程:位左移指令BSL和位右移指令BSR编程

时间:2023-10-26 理论教育 版权反馈
【摘要】:位左移指令和位右移指令只能对数组的字进行移动,最后的输出需要送往输出模块,只能转换一下。

PAC编程基础教程:位左移指令BSL和位右移指令BSR编程

位左移指令BSL和位右移指令BSR正是硬件执行特征最明显的寄存器操作指令,我们来看位移指令参数输入的一些规定:

●移动的操作对象必须是双整数组而不是BOOL数组或其他数组;

●参加移动位范围的第一个位必须是双整字元素的第0位;

●参加移动位范围的最后一位所在的双整字元素的剩余的高位均为无效地址,不能在其他地方引用这些位地址。

这些规定或限制,仅仅是因为位左移指令或位右移指令的寄存器操作都是针对一个寄存器单元来操作的,Logix控制器的CPU是32位,它所处理的基本数据单元也就是32位,即32个寄存器构成的数据单元,对于寄存器移位操作而言,是整个基本数据单元同时移动的,即每当移动指令被触发,寄存器数据单元所有的位将全体移动。

此外,指令参数的控制结构数据的长度用来指定数组中参加移动位的个数,而不是数组的元素个数,参加移动的位数即使不是32位的整倍数,也将耗用整倍数的内存字节,当然剩余位都是无效并不可引用的,因为这些剩余位仍然参加了本寄存器单元的移动,保留着移入的残留状态,显然,这些位状态是无意义的。

位左移指令编写梯级逻辑如图10-1所示,每当梯级条件ShiftL_Pluse跳变时,触发BSL指令执行,移动数组Array_Bit参加移动的位向左移动1位。位左移指令BSL执行移动示意图如图10-2所示,移动数组最高位Array_Bit[1].25卸载到Control_BSL.UL,同时源位标签Input_L的状态值补充装载到移动数组的起始位Array_Bit[0].0。当移动范围超过一个双整字,前一个双整字的高位会移动到下一个双整字的低位。

这里所提到的寄存器向左移动指的是双整字的低位向高位移动。此处有58个位参加移动,不足两个寄存器数据单元,但占用了两个寄存器数据单元,数组中剩余的Array_Bit[1]的26~31位废除,不能用于别的用途。

978-7-111-36030-8-Chapter10-1.jpg

图10-1 位左移指令梯级逻辑

978-7-111-36030-8-Chapter10-2.jpg

图10-2 位左移指令BSL执行移动示意图

位右移指令编写梯级逻辑如图10-3所示,每当梯级条件ShiftR_Pluse跳变时,触发BSR指令执行,移动数组Array_Bit参加移动的位向右移动1位。位右移指令BSR执行移动示意图如图10-4所示,移动数组最低位Array_Bit[2].0卸载到Control_BSR.UL,同时源位标签Input_R的状态值补充装载到移动数组的最高位Array_Bit[3].25。当移动范围超过一个双整字,后一个双整字的低位会移动到前一个双整字的高位。

这里所提到的寄存器向右移动指的是双整字的高位向低位移动。此处有58个位参加移动,不足两个寄存器单元,但占用了两个寄存器单元,数组中剩余的Array_Bit[3]的26~31位废除,不能用于别的用途。

下面使用BSL指令和BSR指令共同来完成这样一个需求:令编程实验设备面板上的DO/0灯最初点亮,然后在输出的4个灯中,左移10次和右移10次交替反复执行,移动速度为每秒移动一次,梯级逻辑编写如图10-5所示。

978-7-111-36030-8-Chapter10-3.jpg

图10-3 位右移指令梯级逻辑

978-7-111-36030-8-Chapter10-4.jpg

图10-4 位右移指令BSR执行移动示意图

978-7-111-36030-8-Chapter10-5.jpg

图10-5 位左移和位右移交替进行的梯级逻辑

正如我们常做的那样,用一个自复位的计时器来产生定时动作,按照要求,每秒要产生一个动作脉冲,计时器预置值设为1000,每隔1s计时器DN位置位,保持一个扫描周期。计时器的DN位定时脉冲为位左移指令或位右移指令提供了所需的梯级条件触发脉冲,保证了移动对象每秒移动一次。(www.xing528.com)

同时,计时器定时产生的脉冲也为计数器提供了计数脉冲,计数器将作为左移和右移次数的记录。左移和右移各10次,可以采用计数器完成位的两种状态来互锁,即计数器DN位置位或复位,当计数器计数从1~10完成位DN呈复位状态,计数从11~20完成位DN呈置位状态。

这时我们就不用计数器自身的完成位来复位计数器了,而是采用比较指令来复位计数器。注意,这里最好采用大于等于比较条件,不要仅仅用等于比较条件,否则一旦错过,就再也没有复位计数器的机会了。当然还有一种做法是将计数器的预置值设为20,用DN位来复位计数器,这样位左移指令BSL和位右移指令BSR的前面则要用比较指令来判断梯级条件。如果是多段判断,用计数器作为总循环周期,每个段用比较指令来判断自然是不错的,如果正好只有两段判断,采用计数器的DN位就更为简洁了。

978-7-111-36030-8-Chapter10-6.jpg

图10-5 位左移和位右移交替进行的梯级逻辑(续)

注意到,执行位左移指令和位右移指令的梯级条件是选择了计数器的DN位在前面,计时器的DN位在后面,将位变化频度较高的放在后面,位变化频度较低的放在前面,这是程序扫描优化所要考虑的,虽然我们在位指令编程的章节已经讨论过,但请留心这些细节。

位移动指令要求参加移动的数据对象必须是双整字数组,鉴于此例,我们选了一个长度为1的双整字数组,尽管我们需要用的不足一个双整字,只有4个位参加移动,并且只能是从0位开始的这个双整字的低4位移动。

位左移指令和位右移指令只能对数组的字进行移动,最后的输出需要送往输出模块,只能转换一下。简单的用MOV指令是有风险的,除非操作对象正好是整个模块的输出点,因为只涉及输出的4个点。采用位传送的BTD指令指定传送部分和传送位置,也可以采用屏蔽传送指令MVM选择部分位传送,如图10-6所示。

978-7-111-36030-8-Chapter10-7.jpg

图10-6 采用屏蔽传送指令MVM选择部分位传送

程序运行之初,需要预先设定最低位为1,可使得DO/0的灯点亮。想要在移动数组的最低位设置为1,可不可以用如图10-7所示的位操作的梯级来实现呢?

978-7-111-36030-8-Chapter10-8.jpg

图10-7 锁定最低位

在线反复进行几次调试就能看出问题,仅仅对Buffer_Shift[0]双整字的最低位置1,的确能提供一个初始的灯亮状态,但却不能清除上次移动的残留状态,我们不能确定前次正好停留在哪个位。MOV指令或MVM指令可以解决这个问题,对一个字传送一个1意味着除了最低位置为1,其余位统统清除为零。当然,目前我们的这个操作只有一个字,如果是数组,要求的初始值不是最低位为1,那就要另谋出路了,初始化的操作将复杂一些。

此外,移位指令中所分配的控制结构数据的指针项没有意义,甚至在指令参数中都不予体现,这是惟一一个数组操作控制结构无须指针的特例,如果有兴趣,在数据库的标签中可以观察到,当移位指令使能时指针等于长度,移位指令未使能时指针等于0。指针的状态一般来说没有实用价值。

位移指令常常被用作记住流水线操作对象的存在标志,当一个流水线上的操作对象到达感应位置时,感应开关接通,该位置1,表示操作对象的存在,操作对象流动至操作区域则做相应操作;当没有操作对象到达,感应开关在置0状态,表示操作对象不存在,无操作对象的操作区域不做任何动作。

如图10-8所示编写的梯级逻辑就是一个这样的实例,步进脉冲定时探测是否有瓶子经过,当有瓶子经过时,传感器接通,装载位置1,随着BSL指令的不断执行,该瓶子携带的标志位移动,移动到5的位置,进入装填例程执行;移动到11的位置,进入封装例程执行;移动到27的位置,进入下线例程执行。当探测到没有瓶子经过,装载位为0,瓶子的标志位0移动,所有的位置均无操作,没有满足梯级条件的例程调用。

978-7-111-36030-8-Chapter10-9.jpg

图10-8 移位操作实例

这里5的位置、11的位置和27的位置是由瓶子移动的距离决定的,瓶子移动的速度恒定,乘以探测时间间隔便得到了距离,这些数据可以通过现场调试而获得。

移位指令的编程大多出现在早期的程序,深受单板机编程思想的影响,目的在于节省内存和加快速度,并减轻CPU的负担。在现今内存充裕和CPU运行速度快的控制器系统中,无须过于考虑节省,而是更兼顾对于控制过程表达的准确和直接,以及程序的严谨,采用移位指令解决问题越来越少了,日益丰富的指令系统提供了更方便的处理方式。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈