关于用以或指令的编程 点击:882 | 回复:9



wyb2866255---王者之师

    
发表于:2012-03-17 13:52:18
楼主

     

               关于用以或指令的编程

   PLC的编程指令中有异或这条指令,一般很少使用它,曾有人向我提出能否用异或指令编几个程序。为此我编写了以下几段程序,供大家参考。

一、   PLC作楼房的电气设备管理,其中有这样的控制要求,有8间房屋的灯,要求

双开关控制:即:每个屋里设有一控制开关,可自由的控制灯亮或灯灭,楼下收发室设有8个开关,也可分别控制这8间屋内灯的亮灭。应如何编程?控制方案是:用PLC的一个输入通道(如IB0)分别接8个开关,以输入口的序号放在1~8好房间,再用8个开关方在收发室里,将其分别接在PLC的第二输入通道IB1的各个输入端,PLC的一个输出通道(QB0)的输出点按序号接18号房间的灯泡。要求IB0IB1的同序号输入点控制QB0的同序号输出点的灯泡。即:I0.0I1.0可分别控制输出点位Q0.0(即1号房间灯泡),I0.1I1.1可分别控制输出点位Q0.1(即2号房间灯泡)……

     按正常编程应是这样,见下图:

     该程序共8条,每一条表示一个房间灯泡的控制程序,如第1条(网络1 为房间一的控制程序,该房间灯泡(Q0.0)的亮灭同时受2个开关控制,一个为室内开关I0.0控制,另一个为收发室内的开关I1.0控制,从图中可知,当I0.0=0I1.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不动作),Y4Y0Y13均不动作)。哪位大侠有精简的指令写法,请说说,谢谢~

    回复:我用S7-200编写二段程序供参考:

   1、不保持输入信号状态(即输入为不自锁的按钮,按下后就抬起)的编程:

     编程说明:1、用传递指令MOVW将输入点I0.0~I1.7传送给输出口Q0.0~Q1.7,这样输入的每一个点对应输出口的一个点。

 2、用比较指令(IW0<>0)的前沿执行将IW0传递给QW0的目的,是确保无输入时输出状态不变,只有输入转态变化瞬间,其前沿输入状态传送给输出口,以确保此时的该输入点复位时仍能保持原输出状态不变(即按钮抬起的后沿不起传递作用)。 

     如:I0.0=1,对应输出Q0.0=1I0.0复位(I0.0=0)仍保持Q0.0=1。如I0.7=1,对应输出Q0.7=1Q0.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 W0MW10进行异或运算,运算结果送入QW0(此时QW0的输出只有刚刚按下的位信号=1,其它位都等于0)。随后再将IW0送入MW10,以保存IW0的现有状态,以备下次按键与IW0比较。例如:

IW0状态=0000_0000_0110_0011,现按下一按钮,使I0.3=1,此时IW0=0000_0000_0110_1011MW10=0000_0000_0110_0011,由于IW0MW10IW0>MW10,故IW0MW10进行异或运算,由于此时IW0MW10只有第3位的内容不等(I0.3=0M10.3=1),其他各个对应位相同,故异或的结果使QW0=8,即 Q0.3=1。随后将现在的IW0=0000_0000_0110_1011的值 送入给MW10

如该按钮又抬起,使IW0=0000_0000_0110_0011,此时IW0MW10的值又不相等(I0.3=0MW10.3=1),但IW0<MW10,故Q0.3=1QW0输出不变。但IW0值送入MW10(0000_0000_0110_0011)

如此时将I0.0的按钮抬起(I0.0=0),IW0=0000_0000_0110_0010,此时IW0MW10,且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)的编程由于巧妙地运用异或指令和比较指令,不仅简化编程,而且对输入口状态无条件限制,使之可适用与各类按钮。

 



楼主最近还看过



大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-17 15:25:13
1楼
我来给大侠顶一下,谢谢提供好的程序供我们学习!

大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-17 15:27:48
2楼

请你提供一下把DB1的内容复制到DB2中去的s7-300的程序,不用系统功能,谢谢!

大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-17 15:31:41
3楼

我看了一个程序,但仿真时SF出错,不知为什么?

大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-17 15:37:31
4楼

这个就是所说的DB1的内容复制到DB2的程序

大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-17 15:54:59
5楼

这是出错的说明图片,请指出问题,谢谢!

 

 

大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-17 15:58:45
6楼

DB1和DB2的设置如下,不知对与否?

wyb2866255---王者之师

  • 精华:73帖
  • 求助:0帖
  • 帖子:218帖 | 2872回
  • 年度积分:0
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2012-03-19 23:42:16
7楼

     大器晚成:你提出的“请你提供一下把DB1的内容复制到DB2中去的s7-300的程序,不用系统功能”的要求,我编了一段程序供你参考:是将DB1块的DB1.DBB100为首址连续50个字节数据,传送到DB2块里以DB2.DBB200为首址的连续50个字节中。见以下程序:

    DB1数据块为人为设置数据,从DB1.DBB100开始填写数据,见下表:

      在程序处于运行时监视DB2数据块,在未按启动开关(I124.0)前,DB2.DBB200为首址的连续50个字节内容皆为0,按下开关后,其DB2块的数据变为(见下表):

     

大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-20 09:01:23
8楼

非常感谢王者之师的无私精神,多谢!我来学习学习,不懂的再请教你。

大器晚成

  • 精华:0帖
  • 求助:5帖
  • 帖子:90帖 | 435回
  • 年度积分:0
  • 历史总积分:1636
  • 注册:2002年9月19日
发表于:2012-03-20 14:11:21
9楼

试了一下你的程序是正确的,谢谢!

SSI ļʱ