Mitsubishi 三菱FXPLC学习之移位指令

发布时间 2023-08-04 16:22:54作者: 一杯清酒邀明月

  谈及移位指令,我第一个想到的,是信号灯的轮流点亮,还有红绿灯的控制,即使我在此之前并没有学过移位指令。

  在三菱FX PLC 2N中,移位指令有ROR、ROL、RCR、RCL、SFTR、SFTL、WSFR、WSFL等,看看这些指令,大家可以发现,它们都是成对的!天呐,单身狗是没有人权了吗?连学个指令都是满满的狗粮扑面而来。

  那么,我们开始今天的学习分享吧!

  首先,是第一对夫妇,啊呸,笔误,第一对指令ROR、ROL。

一、循环移位指令ROR、ROL

  ROR指令和ROL指令中的R、L分别表示右移和左移,R、L的含义类似我们的耳机,戴左耳的标有字母L,戴右耳的标有字母R。

  ROR指令和ROL指令都是对字元件中的二进制位进行移位。从上图的编程手册截图可以看到,它们有连续执行型和脉冲执行型,可以用于16位,也可用于32位。把一个字元件看成有16个位置,ROR指令和ROL指令可以对这16个位置进行调整。那它又是怎么调整的呢?

  我们以ROR右移指令为例,如上图所示,当驱动条件X0接通后,执行指令ROR D0 K4,把D0的16个二进制数依次向右移动4位,右边为低位,也就是说,移出了低4位。 移出的低4位二进制数循环进入到D0的高位(左边),最后移出的1位二进制数同时被传送到进位标志位M8022,如上图“0001”中的“0”。

  每执行1次ROR D0 K4指令D0的数据就右移4位,这是一个循环的过程。显然,执行4次该指令后,D0的数据又变得和原来一样。所以,在用到移位指令时,最好用脉冲执行型RORP、ROLP。

  左移指令ROL和右移指令ROR大同小异,如下图所示,执行指令ROL D0 K4,把D0的数据一次向左移4位,左边为高位,也就是说,移出了高4位。

  移出的高4位二进制数循环进入到D0的低位(右边),最后移出的1位二进制数同时被传送到进位标志位M8022,如上图“0110”中的“0”。

  另外要注意的一点是,在ROR指令和ROL指令中,当终址D是16位的组合位元件时,n=K4;当终址D是32位的组合位元件时,n=K8,否则指令不执行。

   知道了ROR指令、ROL指令后,我脑海里立即浮现几种不同的控制信号灯轮流点亮的梯形图,具体怎么实现,我就不在此班门弄斧了,自己私底下悄咪咪地尝试,错了也不至于被耻笑。

ROR指令、ROL指令理解起来相对简单,接下来的这对指令就没这么简单了。

二、带进位循环移位指令RCR、RCL

  同样的,RCR指令和RCL指令都是对字元件中的二进制位进行移位。从上图的编程手册截图可以看到,它们有连续执行型和脉冲执行型,可以用于16位,也可用于32位。其中RCR指令和RCL指令中的R、L和上文的含义一样,一个表示右移,一个表示左移。

  所谓“带进位”,是指在移位的同时,捎带上进位标志位M8022。那又是在怎样捎带的呢?我们以RCR右移指令为例。

  当驱动条件X0接通,执行指令RCR D0 K4,类似于ROR指令,但不一样的是,用胶水把进位标志位M8022和D0粘起来,此时最右边的4位,显然不仅仅是属于D0,还有1位是属于M8022。

  执行指令RCR D0 K4,进位标志位M8022的数首先被右移,再轮到把D0的16个二进制数依次向右移动。移出的4位二进制数(包括最先被右移的进位)循环进入到D0的高位(左边)。显然,移动4位后,M8022的值恰好为D0中b3的值。

  同理,带进位左移指令RCL的执行我们直接以下图展示。执行指令RCL D0 K4,同样把进位标志位和D0粘连起来,此时M8022的值依然是首先被移动的那位,它也太可怜了吧。另外,执行完指令后,此时M8022的值为D0中b12的值。

  和ROR指令和ROL指令一样,在RCR指令、RCL指令中,当终址D是16位的组合位元件时,n=K4;当终址D是32位的组合位元件时,n=K8,否则指令不执行,且在用到移位指令时,最好用脉冲执行型RCRP、RCLP。

  以上两种指令,都是基于字元件的二进制位移动,接下来我们继续看位元件组合的位移动。

三、位元件的位移指令SFTR、SFTL

  根据编程手册的截图,SFTR指令、SFTL指令的操作数有4个,其中源址S指所移动的位元件组合的首址,终址D指被移入数值的位元件组合的首址,S、D的适用软元件为位元件。n1指终址D的长度(位数),n2指S的位数,且n2<n1<1024。

  SFTR指令、SFTL指令操作数不少,看得人头皮发麻,那它们的具体执行到底是怎样的呢?我们以SFTR指令为例。

  当驱动条件X10接通,执行指令SFTR X0 M0 K12 K4。根据定义,X的位元件组合X3~X0为源操作数,共4位,目的操作数为M的位元件组合M11~M0,共12位。

  指令执行后,X3~X0的0110分别向M11~M0右移,顺便把M3~M0原来的值1001给挤掉。显然,在指令执行完毕后,X3~X0的值保持不变,而M11~M0中的M11~M8的值被X3~X0的0110覆盖,且M3~M0原来的值1001被舍去,变为0110。

  知道了右移是怎么一回事,对左移的理解想必也是不在话下。我们直接用一张图概括。

  当驱动条件X10接通,执行指令SFTL X0 M0 K12 K4。指令执行后,X3~X0的0110分别向M3~M0左移,顺便把M11~M9原来的值0101向左给挤掉。显然,在指令执行完毕后,X3~X0的值保持不变,M3~M0的值被X3~X0的0110覆盖,且M11~M9原来的值0101被舍去,变为0110。

  在应用SFTR指令、SFTL指令时,最好使用脉冲执行型SFTRP、SFTLP。另外,源址S、终址D可以用同种位元件,此时应注意它们的编号不能重叠,否则会发生运算错误。

  知道了位元件的位移指令是怎么回事之后,还有两个指令正在嗷嗷待哺,等着我们去学习呢!事不宜迟,我们继续往下看。

四、字元件移动指令WSFR、WSFL

  跟据编程手册的截图,WSFR指令、WSFL指令的操作数也有4个,其中源址S指所移动的字元件组合的首址,终址D指被移入数值的字元件组合的首址,S、D的适用软元件为字元件。n1指终址D的长度(元件个数),n2指S的元件个数,且n2<n1<512。

  类似于SFTR指令和SFTL指令,WSFR指令、WSFL指令的差别在于其操作软元件为字元件,而SFTR指令和SFTL指令操作软元件是位元件。

  WSFR指令、WSFL指令的执行和位元件的位移指令非常相似,我们以SFTR指令为例。

  当驱动条件X10接通,执行指令WSFR D20 D0 K12 K4。根据定义,D的字元件组合D23~D20为源操作数,共4个,目的操作数为D的位元件组合D11~D0,共12个。

  指令执行后,D23~D20的数据分别向D11~D0右移,顺便把D3~D0原来的数据给挤掉。显然,在指令执行完毕后,D23~D20的值保持不变,而D11~D0中的D11~D8的值被D23~20的数据覆盖,且D3~D0原来的数据被舍去。显然和SFTR指令的执行大同小异。看到这里,关于WSFL指令的执行,我想不用我说,大家也已经知道了。为了成双成对,我在这里也给出WSFL指令的执行图示如下。

  还是同样的道理,在应用WSFR指令、WSFL指令时,最好使用脉冲执行型WSFRP、WSFLP。另外,源址S、终址D可以用同种字元件,此时应注意它们的编号不能重叠,否则会发生运算错误。

  除了以上我所提及的移动指令,还有移位读写指令SFWR、SFRD,在这里我就不再展开阐述,因为它们在实际的梯形图中应用非常少,大家想知道的,可以去看相应的课程。

  那么,这次的学习分享就到这里吧!