编程技巧展示:为一求助帖用S7-200编写一段程序及程序解析
求助帖:四个阀门的开关由四个接近开关信号控制,要求是1、同一时刻只能一个阀门开;2、当有两个以上到位信号出现时按优先顺序打开阀门;3、每个阀门只要开通就有一定的工作时间,时间未到不开通其他阀门;4、当有两个以上到位信号在等待上一阀门工作完毕的情况下要求按“先到先开”原则对阀门排序工作。采用的是西门子的S7-200的PLC进行控制。胶状物体通过管路输送,末端分别由四个气动阀控制胶体进入四台双缸装药机,当其中一个缸正对阀门出口时,触发近位开关表示到位
这一求助帖有一定难度,为此花费一定时间,编出如下程序,供大家分析。除此法编程外,还可用填表与FIFO指令,按此编程思路编程,有兴趣的网友可以试试。
一、梯形图:
注:(本程序经上机运行,动作正确,网络17为实验程序而编写的程序,其4个定时器的延时时间皆设定=2秒)
二、程序解析:
1、4个电磁阀对应PLC的输出口为Q0.0、Q0.1、Q0.2、Q0.3,工作时间分别由定时器T101~T104控制,这4个定时器的定时时间可由触摸屏或上位机设置改变。 其4个定时器的时间设置区为:VW10、VW12、VW14、VW16。控制电磁阀打开的到位接近开关的输入地址为I0.0、I0,1、I0.2、I0.3。
2、按题意要求 规定 :
(1)、如同时有2个以上接近开关同时到位闭合时,只容许一个电磁阀打开,对应定时器延时时间到,该阀门关闭,而另一阀门打开……阀门打开的先后次序是Q0.0优先,Q0.1次之,Q0.2再次之,Q0.3为最后。
(2、)当有两个以上接近开关先后到位时,其IB0变化的输入状态按先后次序依次存入MB13、MB12、MB11、MB10里。动作执行是先从第一次到位的接近开关的(MB13)开始判断,使其对应阀门打开,在阀门打开且尚未结束时,其他到位的阀门则等待。当工作的阀门工作完毕后,等待的阀门应按“先到先开”的次序进行工作(即先为MB12,再为MB11,最后为MB10)。
根据上述二点要求,在程序上进行如下处理:
1、网络2~网络5为4个接近开关到位时令MB0的对应位置1,这里采用置位指令的作用是防止各接近开关动作时产生抖动而引起采集输入状态(MB0、MB3等)的错误。
2、 网络6的解析:MB0时时随IB0变化,MB1为MB0为发生变化前的状态值,当IB0
无输入变化时,其MB0=MB1,网络6不执行其动作。只有当有一个或几个接近开关到位时,其对应输入点=1,都会使MB0>MB1,则网络6立即执行:将MB0与MB1进行异或运算,其运算结果送入对应存储区:如MB3=0(即第一次动作,或前次动作的阀门工作已全部结束),异或结果送入MB13。如MB3=1,即前一次动作阀门尚未结束,将异或结果送入MB12。如MB3=2,即前二次动作阀门尚未结束,将异或结果送入MB11……
异或结果送完后,将MB0->MB1,且进行MB3加1运算,又使M0.7=1。当下一个扫描周期到来时,MB0=MB1,不执行网络6,故使M0.7=0,即M0.7输出为单扫描周期脉冲。
如前次动作阀门尚未结束又有接近开关到位,使MB0>MB1,立即又执行MB0与MB1的异或运算,此时MB3=1,故异或结果->MB12……
MB0与MB1的异或运算是本程序的技巧编程之一:它能将IB0的最新到位的接近开关状态剪接出来,如变化前 IB0=0000_0010,MB0=MB1=0000_0010,如此时第一与第三接近开关同时到位(即I0.0与I0.2皆=1,其IB0=0000_0111),则使MB0立刻=0000_0111,而MB1仍=0000_0010,MB0与MB1的异或运算的结果=0000_0101,此值恰是最新到位的2个接近开关=1 的状态值,将这运算的结果送入MB12,以备当前一次动作阀门工作结束后,再按本次(MB12)输入状态进行正确操作。
3、 网络7的解析: 定时器T101~T104的延时时间为4个阀门 的工作时间,在每个阀
门打开的同时,其对应的定时器得电开始延时,当延时时间到,对应定时器输出由0↑1,其前沿使该阀门关闭(即QB0=0)。再判断及操作:
(1)、如此时MB13=0,说明前一次动作的一个或几个阀门已全部工作结束,将MD10右移8位(即将MB12->MB13,MB11->MB12, MB10->MB11,0->MB10),且使MB3减1,M2.0=0,接着再判断移位后的MB13,如MB13≠0,说明仍有等待阀门需要打开,故发出触发脉冲M2.6=1的单周期脉冲,去触发等待的阀门开门。
(2)、如此时MB13≠0,说明本次动作的几个阀门没有全部工作结束,发出触发脉冲M2.1=1的单周期脉冲,去触发等待的阀门开门。
4、 网络8~网络11的解析:为触发Q0.0~Q0.3四个阀门开门的程序。使阀门打开有3
种触发脉冲:(1)M2.0=1的前沿。即:在有接近开关到位使IB0状态发生变化时,产生M2.7=1的单脉冲,如此时刻M2.0=0,则使M2.0由0↑1,产生前沿脉冲。(2)、M2.1=1单脉冲。即:在由2个以上接近开关同时到位,当工作阀门关闭时还有等待阀门没有打开时,产生的单周期触发脉冲。(3)、M2.6=1单脉冲。即:当本次的所有工作阀门动作已结束,但还有尚未执行的等待阀门(即MD10移位前,其MB12≠0)时产生的单周期触发脉冲。
这3个脉冲出现,都会使对应阀门打开:此时的QB0=0,程序是从先判断M13.0开始的,如M13.0=1,使Q0.0=1、使标记M13.0=0,同时使T101得电开始延时。由于Q0.0=1使QB0≠0,故不会使后面的Q0.1~Q0.3同时刻再置1,只有T101延时时间到,使Q0.0由1↓0,后,当再次产生触发脉冲时,判断还是先从M13.0开始,由于此时QB0=0、而MB13=0,不会再次使Q0.0置1,接着判断M13.1、M13.2、M13.3各位,那位=1就将QB0的对应输出置1……
此段程序也体现出技巧编程:这样处理既解决了同时间开关到位闭合时,阀门打开是按优先循序依次工作,又解决了两个以上接近开关先后到位,其等待的阀门按“先到先开”的次序进行工作的控制作用。
本程序解析到此结束,如有不妥之处,请给予指正,谢谢!
40楼 我来回答你的提问:VW132为表的实际存入数据的个数区,VW132<>0,表示表里仍存有数据。
程序是这样运行的:当计数器C17的计数值=12时(即工作时间到),使C17=1,而C17=1使VW126=0(见网络2),而VW126=0(即VB127=0),使工作阀门关闭(即QB0=0,见网络2),同时又判断VW132等不等于0,如VW132<>0(即判断出表里仍存有数据,说明还有等待阀门未工作),故通过FIFO指令,将表的最前数据 -->VW126。再将VB127-->QB0,使最先等待的阀门打开(即网络2的VB127-->QB0)。如判断VW132=0,说明表里已无存数,说明本次操作结束,不必再执行FIFO指令。
从中可以看出:网络4中的第二个“VW132不等于0“,不是多余的,它起判断程序是否结束和是否执行执行FIFO指令的。