工控网首页
>

应用设计

>

解析用S7-200编写的几个程序的构思与技巧

解析用S7-200编写的几个程序的构思与技巧

2012/7/24 17:49:39

           解析用S7-200编写的几个程序的构思与技巧  

    本文展示的几个编程实例,都是从网上看到的求助帖,按其命题要求编程都有一定难度和可探讨性。实为是提高我们编程构思与锻炼编程能力的好命题。本人对此作了编程,经上机运行,程序运行正确符合命题要求。本文对编写的程序作以解析,将其编程构思与技巧作以介绍,现展示给大家,起个抛砖引玉的作用。清大家进一步深入探讨,广开思路,巧妙的使用编程指令,编出更加精炼短小的程序,共同锻炼与提高我们的编程水平和能力。

一、          请教:“PLC输入点任意一点变化均触发一次,用什么指令比较精简  

当输入点 有信号输入时,是否能做到依次输出且依次关闭已动作了输出点。如:I0.001,其输出状态为输出Q0.0=1。接着使I1.201,其输出状态为输出Q1.2=1Q0.0=0,再使I0.401,其输出状态为Q0.4=1Q1.2=0 ……

       编程构思:对此命题要求有二种编程方案:

1)、如果PLC16个输入点的输入信号皆为单脉冲,或外接不自锁式的点动按钮时,在未有输入信号或未按按钮时,PLC16个输入点皆=0。在这种条件下,最精简的编程为:用比较与传递指令就可完成。见下梯形图:

    

编程说明:以PLC16输入点皆外接不自锁式的点动按钮为例:当为未按钮时,PLC16个输入点皆=0,即:IW0=0,故网络1不执行MOV_W指令动作。当PLC输入点有任意一点按下按钮,都会使IW0<>0,使网络1执行MOV_W指令动作:将IW0的状态传送给QW0

     如:按下I0.0的按钮,使I0.00变为1,即 IW00,使MOV_W指令使能,将IW0传送给QW0,使对应输出Q0.0=1I0.0复位(即I0.0=0)由于IW0=0,不满足IW0<>0比较条件,MOV_W不使能,故输出仍保持Q0.0=1的输出状态。如按下I0.7的按钮,使I0.7=1,执行MOV_W传送,使对应输出Q0.7=1Q0.0=0I0.7复位(I0.7=0)仍保持Q0.7=1不变。再输入I1.1=1,对应Q1.1=1,而Q0.7=0。。。。

2)、如果PLC16输入点的输入信号为既有单脉冲又有电平信号,或外接按钮为自锁式或不自锁式按钮都可用时的编程:

 编程思考:这种要求编程显然比(1)要难的多,我们可以这样处理,以按钮输入为例:将未按按钮前的PLC的输出状态先存入一字存储器MW10里,但某一按钮按下,其输入点由01时,立刻用此时的输入端的各点状态与存储器MW10对应的各点进行比较判断:如果二者的状态相同(或皆为0或皆为1),说明此点不是本次的信号输入点,可令其对应输出=0。只有二者不同(输入=1,而输出=0)时才是本次的信号输入点,令其输出=1。按这种思路编程,即可实现本命题的控制要求。请见梯形图:

       图一、用求反、与、或指令编写的梯形图

 

编程说明:图一中的MW2IW0的反码,MW4MW10的反码,当IW0<> MW10时,说明此时输入端按钮有变化:如果IW0<MW10,说明输入按钮有由按下变抬起的,故不执行“与”“或”等运算,即输出状态保持不变,仅将IW0传送给MW10。如果IW0> MW10,说明此时输入侧有信号输入(既有按钮按下),此时的IW0各位的值应≥MW10对应的各位的值,即:如IW0某一位的值=0时,MW10对应的位的值一定=0 而不可能=1,如IW0某一位的值=1时,MW10对应的位的值可能=0也可能=1

MW2MW10进行“与”运算,“与”的结果送入MW6。二者状态不等其“与”的结果=0,二者相等则“与”的结果=1。由于MW2IW0的反码,故MW2的某位=1时(即未按钮的输入点),其MW10对应位的值一定=0,这样“与“的结果,使MW6对应位的值=0,而MW2的某位=0时,其“与“的结果使MW6对应位的值=0.

MW4IW0进行“与”运算,“与”的结果送入MW8。如输入=0,“与”的结果=0。如输入=1时,其对应的输出=1(即MW4对应点=0)与的结果=0,如其对应的输出=0(即MW4对应点=1)与的结果=1

再将MW6MW8相“或”运算,其结果送入QW0,即为最后输出状态。

对上面的运算处理仔细分析整理,就会发现实际上是执行这样的运算:

           

     显然这是异或的运算形式,而S7-200有现成的异或指令,故上面的程序可以用异或指令来完成,从而可大大的精简程序。见下梯形图:

   

     图二、用异或指令编写的梯形图   

 

举例说明:

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

可见,图二的编程由于巧妙地运用异或指令和比较指令,不仅简化编程(见图一),而且对输入口状态无条件限制,使之可适用与各类按钮。从中可以看出,对同一命题,只要开阔思路,深入分析探讨,就会灵活巧妙的使用编程指令,使编程更加精炼短小。

     二、编程要求:5个按钮和5个信号灯,编号1#5#,每次只按下一个按钮,按的次序是随意的且没有时间限制,每按下一个按钮输出就亮一个对应的信号灯,持续10秒后自动熄灭,但是同一时刻只允许亮一个灯,即前灯不灭后灯不亮,并且亮灯的次序严格按照按钮按下的次序,例如按钮是2#——1#——5#——3#——4#,则亮灯也按照2#——1#——5#——3#——4#,不能乱。
      
 编程构思:这个编程命题还是颇有难度的,我共编写了2个程序,第一个程序为完成此功能编写了二个功能块子程序,调用二个指针指令,且多次调用子程序,多次 选用各种比较指令。虽然上机运行好使,但程序编的很长,不易被人看懂。第二个程序,由于选用填表指令与先入先出指令及比较指令进行巧妙地配合,使编写的程序长度大为缩短,经上机运行,效果很好,现展示出来与大家共享:

三、求助帖原文:有一自动老化线,线长三百米,线速18/,线进口有一个产品进入老化线检测开关,出口有一个阻挡器和一个产品出检测开关.老化线体上可容纳920台产品,产品在进入老化线上的时间间隔不等,当产品老化时间等于四小时就可出产品,产品是一边进一边出,流水作业.但要求每一台产品在老化线上老化的时间都必须是四个小时或大于四小时.望高手们给指点一下怎么编这个程序?

我的编程思维与编程方案:

1、对题目的分析:老化线的线长三百米,线速18/=0.3/秒,产品从进口到出口运行时间=300÷0.3=1000=16.7<<4小时,故需在出口处安放一阻挡器。老化线体上可容纳920台产品,则知产品宽度为300÷920=0.326。如产品彼此以X秒的间隔进入老化线,进入920个产品的时间=4小时,则X=4×3600÷920=15.56秒。显然如果产品传送时彼此相互间隔时间<15秒,产品进入老化线运行中的个数=920个时所用时间<4小时,为保证老化时间,显然需要停车等待。

2、编程的设计构思:

如果以第一个产品进入老化线的时刻起使一计时器从0开始计时,第二个产品进入老化线立即读取计时器的计时值且存入数据区的首址,第三个产品进入老化线立即读取计时器的计时值且存入数据区的首址下面的第二个地址……,以此规律不断的将进入老化线产品的时间存入数据区。

当老化时间≥4小时时阻挡器移开,第一个产品走出老化线,同时将数据区首址数据取出,再用计时器的计时值减去这取出的数据,其差值即为第二个产品的老花时间,将其送回计时器,继续计时,第一产品走出老化线阻挡器回原位。当计时器的计时值又等于4小时时,再移开阻挡器,使第二个产品走出老化线,同时将数据区第二个数据取出,再用计时器的计时值减去这取出的数据,其差值即为第三个产品的老花时间,将其送回计时器,继续计时……,不断的重复取出的数据,再用计时器的计时值减去此取出值,将其送回计时器,继续计时,就可实现本求助帖的控制要求。

3、编程的设计方案解析:本文对此题目做了二种设计方案。

第一种方案:是按上面所述的编程设计构思,用二组指针指令分别对产品进入老化线的时间存入数据区,对产品走出老化线时,从数据区中取出对应数据进行减法运算。这种方案要占据大量的数据区:老化线能容纳920个产品,即要占据920个字存储器,而且产品是不断的进入老化线,使存储数据不断的增加。而PLC的数据块的容量是有限度的,这样就会出现数据块计满的情况:使后续的提取计时器的时间值无法再存入数据区而丢失,使这种判断控制失败。如何解决这个问题呢?本设计是这样解决的:设数据区为内含1000个字,运行时存储的数据从首址依次存入数据区,每存入一组数据,存数指针地址加2。读取数据时也是从数据首址开始,每读取一次数据,读取指针地址加2。运行中程序时时判断指针地址是否已到第1000个数据的地址,如已到,再存数或读数地址又回到数据区的首地址,这样可重复使用这1000个字存储器,即可巧妙地解决数据区计满的难题。请见第一方案梯形图:

第二种编程方案:是巧妙地使用填表指令(ATT)与先入先出指令(FIFO)来实现的。如产品之间以1分以内的间隔进入老化线,则进入10个产品所需时间≤10分钟,以第一次进入的第10个产品进入的时间为计时起点,用填表指令将每进入10个产品的最后时间存入表内,则进入920个产品,共存入表里的数据92个,如果进入920 个产品的时间<4小时,则老化线停车。用计时器的值与4小时时时比较,如相等,说明老化线的头10个产品老化时间≥4小时(即4~4小时另10 分钟),打开阻挡器,且启动老化线运行。出口处的检测开关,测出10个产品,令阻挡器关门,同时用先入先出指令(FIFO)将表内的第一组数据送给MW6,再用计时器值VW10减去MW6,其差即为下一组产品的老化时间值。再将差值送回计时器VW10。当入口处的检测开关,测出10个产品,老化线内产品数又=920,如此时的计时时间<4小时,令老化线停车。计时器的计时值时时与4小时比较,如等于,说明第二组的10个产品老化时间≥4小时,打开阻挡器,且启动老化线运行……反复重复上述动作。当老化工作结束时,最后一组产品的个数有可能<10,如用上述操作,由于MB810,故最后一次的计时时间不能存入表中,就会使最后一组产品留在老化线内而无法传出。为此增加判断产品间隔时间计时器MB11,如MB11>4分,则视为工作结束(既无后续产品到来),把此时计时时间存入表内,当MB10=1时老化线内只有最后一组产品,由于其产品数<10且具体数未知,但考虑出口处的产品间距很小,彼此间隔时间<1秒,故用I0.2驱动断电延时定时器(TOF),定时为5秒,从第一个产品出口使I0.2=1,同时使T101=1起,连续出N个产品,由于NI0.2=1脉冲彼此间隔<5秒,故使T101始终保持=1,第N个脉冲结束后因再无脉冲到来,延时5秒后T101=0T1011变为0的后沿使Q0.1=0,即阻挡器关。请见第二种方案的梯形图:

    

4、方案比较:

第一种编程方案优点为:对产品之间间隔时间无限制,由于是一个一个的对产品老化时间进行判断。故可确保每个产品的老化时间值皆= 4小时,即老花时间精确。它的编程的技巧为用二个指针指令。一个为将每个产品进入老化线的时间依次存入数据区,另一个为在产品走出老化线,再从数据区将其对应的下一个产品的入线时间提出来,用计时器值减去该提出值,其差即为下一产品的老花时间。指针指令所用数据区可存储数据1000个(>920),当所存数据=1000个时,指针又从新指向数据区的首址,其目的可长时间循环使用,不会造成因数据区满而不能存入数据。该方案的缺点为:如果产品彼此间间隔时间短时,老化线停车频繁,几乎每出一个产品就要停车一次,这频繁启动对电机是不利的。

第二种编程方案优点为:由于采用10个产品为一组,从而减少老化线的停车次数。由于10个产品为一组,使对920个产品的提取的数据由920个变为92个数据存入数据区,PLC的填表指令最多填写数据为100,故使利用填表指令(ATT)和先入先出指令(FIFO)来编程变为可能。该方案的编程技巧就是巧妙地利用填表指令(ATT)和先入先出指令(FIFO)的功能特点代替第一方案的用2个指针指令去完成存入数据与提取数据。该方案缺点:对产品彼此间间隔时间有限制,即它只实用于间隔时间小于1分钟的条件下使用。

    本文到此结束,如有不妥之处请给于指正。谢谢!

投诉建议

提交

查看更多评论
其他资讯

查看更多

对多输出点PLC设计与编程的实例展示与解析

简短精炼的3例编程展示及编程思路与技巧解析

如何实现用PLC采集高于其高速计数器最高计数频率的脉冲数据的探讨

超声波时差法测量流量的公式推导及检测方法的探讨

PLC增扩输出口的硬件电路图及与之配合使用的PLC梯形图的构思与解析