关于用以或指令的编程
在PLC的编程指令中有异或这条指令,一般很少使用它,曾有人向我提出能否用异或指令编几个程序。为此我编写了以下几段程序,供大家参考。
一、 用PLC作楼房的电气设备管理,其中有这样的控制要求,有8间房屋的灯,要求
双开关控制:即:每个屋里设有一控制开关,可自由的控制灯亮或灯灭,楼下收发室设有8个开关,也可分别控制这8间屋内灯的亮灭。应如何编程?控制方案是:用PLC的一个输入通道(如IB0)分别接8个开关,以输入口的序号放在1~8好房间,再用8个开关方在收发室里,将其分别接在PLC的第二输入通道IB1的各个输入端,PLC的一个输出通道(QB0)的输出点按序号接1~8号房间的灯泡。要求IB0与IB1的同序号输入点控制QB0的同序号输出点的灯泡。即:I0.0与I1.0可分别控制输出点位Q0.0(即1号房间灯泡),I0.1与I1.1可分别控制输出点位Q0.1(即2号房间灯泡)……
按正常编程应是这样,见下图:
该程序共8条,每一条表示一个房间灯泡的控制程序,如第1条(网络1) 为房间一的控制程序,该房间灯泡(Q0.0)的亮灭同时受2个开关控制,一个为室内开关I0.0控制,另一个为收发室内的开关I1.0控制,从图中可知,当I0.0=0、I1.0=0时,Q0.0=0即灯泡不亮。如将I0.0=1,使上一支路通导,则Q0.0=1,即灯亮,如再使I1.0=1,使二支路皆断,则Q0.0=0即灯灭,达到控制要求。其它7条与第一条编程类似,
二、对一个网友的求助帖的编程:求助帖的内容为“请教:PLC输入点任意一点变化均触发一次,用什么指令比较精简 如:当输入点部分有信号时,是否能做到依次输出且依次关闭已动作了的。假设X0~X17任意一点先变化,则先变化的对应输出点Y0~Y17动作。如:X0—>ON接着X13->ON,再接着X4->ON......依次输出Y0,Y13(Y0不动作),Y4(Y0,Y13均不动作)。哪位大侠有精简的指令写法,请说说,谢谢~!”
回复:我用S7-200编写二段程序供参考:
1、不保持输入信号状态(即输入为不自锁的按钮,按下后就抬起)的编程:
编程说明:1、用传递指令MOVW将输入点I0.0~I1.7传送给输出口Q0.0~Q1.7,这样输入的每一个点对应输出口的一个点。
2、用比较指令(IW0<>0)的前沿执行将IW0传递给QW0的目的,是确保无输入时输出状态不变,只有输入转态变化瞬间,其前沿输入状态传送给输出口,以确保此时的该输入点复位时仍能保持原输出状态不变(即按钮抬起的后沿不起传递作用)。
如:I0.0=1,对应输出Q0.0=1,I0.0复位(I0.0=0)仍保持Q0.0=1。如I0.7=1,对应输出Q0.7=1、Q0.0=0.,I0.7复位(I0.7=0)仍保持Q0.7=1,再输入I1.1=1,对应Q1.1=1,而Q0.7=0。。。。
但这种编程,对输入口的输入状态有要求:按钮前IW0=0,故只适应不自锁按钮(按完后触点断开)。
2、自锁与不自锁的按钮都可用的编程:
(1)、不用异或指令的编程:
(2)、选用异或指令编程:
编程说明:
1、(1)与(2)二种编程的思路是一样的,(1)没有用异或指令,而是用“与”和“或”指令编程实现异或指令的功能,(2)直接使用异或指令,简化了程序。
2、动作原理:当按下某一按钮,其IW0将不等于MW10且大于MW10时,I W0与MW10进行异或运算,运算结果送入QW0(此时QW0的输出只有刚刚按下的位信号=1,其它位都等于0)。随后再将IW0送入MW10,以保存IW0的现有状态,以备下次按键与IW0比较。例如:
原IW0状态=0000_0000_0110_0011,现按下一按钮,使I0.3=1,此时IW0=0000_0000_0110_1011,MW10仍=0000_0000_0110_0011,由于IW0≠MW10且IW0>MW10,故IW0与MW10进行异或运算,由于此时IW0与MW10只有第3位的内容不等(I0.3=0,M10.3=1),其他各个对应位相同,故异或的结果使QW0=8,即 Q0.3=1。随后将现在的IW0=0000_0000_0110_1011的值 送入给MW10。
如该按钮又抬起,使IW0=0000_0000_0110_0011,此时IW0与MW10的值又不相等(I0.3=0、MW10.3=1),但IW0<MW10,故Q0.3仍=1,QW0输出不变。但IW0值送入MW10(0000_0000_0110_0011)。
如此时将I0.0的按钮抬起(I0.0=0),IW0=0000_0000_0110_0010,此时IW0≠MW10,且IW0<MW10,故QW0输出不变。但IW0值送入MW10(0000_0000_0110_0010)。
当输入按钮有几个以处于按下(即接通状态),时,如要抬起任一按下的按钮,其输出都不会发生变化,如现输入状态为:IW0=0000_0000_0110_1011, MW10= 0000_0000_0110_1011。如抬起I1.5,使IW0=0000_0000_010 0_1011,此时IW0 < MW10,故不会进行异或运算,即输出保持不变,只是IW0 送入 MW10,使MW10=0000_0000_010 0_1011。
可见,(2)的编程由于巧妙地运用异或指令和比较指令,不仅简化编程,而且对输入口状态无条件限制,使之可适用与各类按钮。
楼主最近还看过