plc的移位指令C语⾔实现,PLC中使⽤移位指令是如何实现移位
动作的
plc移位指令怎么么⽤
楼主的意思⼤约是⽤X2来检测有没有罐⼦,X1⽤来定位灌装位置,现在需要把检测罐⼦的X2位置,移动到灌装位置的前⾯,应该是提供图⽚的下⾯的那种应⽤吧,
这种应⽤的思路其实主要是要记录下到灌装⼯位时是否有罐⼦,
程序在图⽚⾥⾯,
假设开机前X1和X2之间没有罐⼦
开机后传送带运转
当X1检测到应该有罐⼦的⼯位来到罐装⼯位时,⾸先将检测罐⼦有⽆的X2的状态放⼊M3中,有罐⼦M3为1,没罐⼦M3为0,假设此次
X2为1,那么执⾏完SFTR后,M3=1,M2=0,M1=0,M0=0
由于M0=0所以不需要灌装
那么随着传送带传动,下⼀个罐⼦的⼯位移动到灌装⼯位,X2检测当前罐⼦⼯位是否有罐⼦,并将结果放⼊M3中,假设此次没有罐⼦,则X2=0,M3=0,之前M3的数据此次放⼊M2中,,以次类推,执⾏SFTR结果为,M3=等于当前X2的状态=0,M2=1,M1=0,M0=0不需要灌装
传送带再次移动,再⼀次罐⼦的⼯位来到灌装⼯位,X1再次动作,把X2检测罐⼦有⽆得数据放⼊M3中,之前M3的数据放⼊M2中,M2的数据放⼊M1中,此次X2=1则M3=1,M2=0,M1=1,M0=0
传送带再次传动,⼜⼀个罐⼦⼯位来到了灌装⼯位,X1再次动作,此次X2=0,则执⾏完SFTR后,M3=0,M2=1,M1=0,M0=1,由于M0=1,X1=1所以此次需要打开电磁阀,灌装
传送带再次传动,⼜⼀个罐⼦⼯位来到了灌装⼯位,X1再次动作,此次X2=1,则执⾏完SFTR后,M3=1,M2=0,M1=1,M0=0,由于M0=0,X1=1所以此次不需要灌装
传送带再次传动,⼜⼀个罐⼦⼯位来到了灌装⼯位,X1再次动作,此次X2=1,则执⾏完SFTR后,M3=1,M2=1,M1=0,M0=1,由于M0=1,X1=1所以此次需要打开电磁阀,灌装
移位指令的详述
⼀般格式 移位操作符(如SHR) OPR,CNT.
其中OPR⽤除⽴即数外的任何寻址⽅式。移位次数由CNT决定,在8086中可以是1或CL,CNT为1时只移⼀位;如果需要移位的次数⼤于1时,需要先将移位次数存⼊CL寄存器中,⽽移位指令中的CNT写为CL即可。在其他机型中可使⽤CL和CNT,且CNT的值除可⽤1外,还可以⽤8位⽴即数指定范围从1到31的移位次数。有关OPR和CNT的规定适⽤于以下所有指令操作。具体格式如下所述。以逻辑右移为例。
如:MOV AX,62H
SHR AX,1
当移位数⼤于1时,需要先将移位数放进CL中然后再进⾏移位操作。
如:MOV AL,62H
MOV CL,4
SHR AL,CL
条件标志位
CF(进位标志) = 移⼊的数值
1 CNT=1时,最⾼有效位的值发⽣变化
0 CNT=1时,最⾼有效位的值不变
移位指令:
SF(符号标志)、ZF(零标志)、PF (奇偶标志)根据移位结果设置,AF(辅助进位标志)⽆定义
循环移位指令:
不影响 SF、ZF、PF、AF
条件标志位应⽤于具体的操作数中使⽤,以下叙述中未详细写明,初学者可不予理会。 SAL(shift arithmetic left) 算术左移
格式:SAL OPR,CNT
含义: 算术左移SAL把⽬的操作数的低位向⾼位移,空出的低位补0.
(指将要移位的操作数换成⼆进制表⽰⽅法,如62H为01100010B.移位时只是寻常理解中的将这些⼆进制位逐个向左或向右移,移⾛的数根据操作符决定舍弃或者放⼊空出的位置,空出的位置根据操作符决
定补0或者放⼊移⾛的数)。
SAR(shift arithmetic right) 算术右移
格式:SAR OPR,CNT
算术右移SAR把⽬的操作数的⾼位向低位移,空出的⾼位⽤最⾼位(符号位)填补。
cf怎么进不去如62H⼆进制表⽰法为01100010B,最⾼位为0,⽆论右移多少位左边都⽤0补上。如果最⾼位是1,则都⽤1补上。
注:算术移位指令常⽤于带符号数*2或/2,受影响的标志位:CF、OF、PF、SF和ZF(AF⽆定义)。 逻辑左移SHL(Shift Logical Left)和逻辑右移SHR(Shift Logical Right)
格式:SHL(或SHR) OPR,CNT
逻辑左移/右移指令只有它们的移位⽅向不同,移位后空出的位都补0。
注:逻辑移位指令常⽤于⽆符号数*2或/2,受影响的标志位:CF、OF、PF、SF和ZF(AF⽆定义)。 循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。
格式:ROL(或ROR) OPR,CNT
循环左移/右移指令只是移位⽅向不同,它们移出的位不仅要进⼊CF,⽽且还要填补空出的位。可以理解为蛇咬尾巴型循环。
带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。
格式:RCL(或RCR)OPR, CNT
带进位的循环左移/右移指令只有移位的⽅向不同,它们都⽤原CF的值填补空出的位,移出的位再进⼊CF。
注:受影响的标志位:CF和OF。
以上算术,循环和逻辑移位指令均可以作字或字节的操作,386及其后继机型还可作双字操作。 386及其后继机型可使⽤本组指令
SHLD(shift left double) 双精度左移和SHRD(shift right double) 双精度右移
格式:SHLD(或SHRD)DST,REG,CNT
这组指令可以取两个字作移位操作⽽得到⼀个字的结果,也可以取两个双字作移位操作⽽得到⼀个双字的结果。在移位中,作为源操作数的寄存器提供移位值,以补⽬的操作数因移位引起的空缺,⽽指令执⾏完成后,只取⽬的操作数作为移位的结果,源操作数寄存器则保持指令执⾏前的值不变。
这是⼀组三操作数指令,其中DST可以⽤除⽴即数以外的任⼀种寻址⽅式指定字或双字操作数。源操作数则只能使⽤寄存器⽅式指定与⽬的操作数想同长度的字或双字。第三个操作数CNT⽤来指定移位次数,它可以是⼀个8位的⽴即数,也可以是CL,⽤其内容存放移位计数值。移位计数值的范围为1到31,对于⼤于31的数,机器则⾃动取模32的值来取代。
如:SHLD EBX,ECX,16
指令执⾏前:(EBX)=12345678H, (ECX)=13572468H,