编程技巧展示之四:为网友求助帖用S7-200编写三段程序及解析
本文介绍的三段程序是用S7-200编写的,其命题都是由网上看到的求助帖而编写的,其编程要求有一定难度,可以通过对程序的解析,来理解与充实编程思路与技巧。
一、求助帖:顺序随机控制,有兴趣来看看
目的:用PLC和触摸屏(威纶通)控制8个指示灯。
要求:8个指示灯无序动作,也可以是4个指示灯无序动作,动作的顺序可以在触摸屏上设置,动作的时间间隔也可以设置。
示例:如果是8个灯动作,比如最常见的是1-2-3-4-5-6-7-8-1.这种是简单明显的,但是可以通过PLC和触摸屏我可以把顺序控制成1-3-4-2-5-6-7-8,也可以5-6-7-1-2-3-4-8.。。。。。。。依次规律进行。如果是4个灯动作,顺序也是可以设置,动作如上规律。
回复:编程思路是这样:
在触摸屏内设置8个字节存储器:VB100~VB107和1个字存储器CW20,且与PLC通讯。
1、其VB100~VB107这8个字节存储器分别作为8个灯泡的选中标志区:VB100为第1灯泡的选中标志区,VB101为第2个点亮灯泡的选中标志区,……VB107为第8个点亮灯泡的选中标志区。这8个灯的标志存储器的置数内容分别置数为0~7这8个数字(互不重复):旗置数=0的存储器对应的灯为第1个点亮,置数=1的存储器对应的灯为第2个点亮 ……置数=7的存储器对应的灯为第8个点亮。触摸屏可对VB100~VB107随意设定0~7这8个数,就可实现对这8个灯动作顺序的随意改变。
2、用定时器T101作自振荡器,其定时时间不设为具体数值,而用VW20代替,其VW20可由触摸屏设定,这样就可实现动作的时间间隔也可以随时设置的作用。
3、顺序随意控制的构思:为实现8个灯能按各自标示区(即VB100~VB107)置数的大小依次点亮,实现的办法是采用一个计数器(MB10),计数器由0开始,按给定的间隔进行加1计数,加到数=8立即请0,重新由0作加1计数。这样:MB10的值将在0~7这8个数字变化,在计数过程中,又时时用计数器的计数值(MB10)与VB100~VB107的值进行比较,与MB10值相等的标示区对应的灯亮,如:当MB10=0时,如VB103=0,则使VB103对应灯(Q0.3)为第一个点亮,接着MB10=1,如 VB00=1,则使VB100对应灯(Q0.0)为第二个点亮……从而实现按8个标示区的数由0、1、2…7,依次点亮。按上述2、3二点思路进行编程就是本程序的编程技巧之处。下面用S7-200编程如下,供你参考:
二、求助一帖:西门子PLC比较大小VD100,VD104,VD108,VD112,VD116就大概五个的样子,不过以后还可能增加一点
比较后对应大小顺序放到VB00 ,VB01,VB02,VB03,VB04里面,例如VD104最大就在VB01里面放1,VD108最小就在里面放5,怎么才能实现啊?请教各位了
回复:编程思路:编写一个某一双字存储器与其他4个双字存储器的值的大小进行比较判断的功能模块(子程序),且把判断结果送入对应的标志区,如用VD100与VD104、VD108、VD112、VD116的值进行比较判断,先将其标志区VB00=1(即数值最大),在进行比较:用VD100与VD104比较,如VD100<VD104, 则使VB100加1(VB100=2),否则VB100保持不变,再用VD100与VD108比较,如VD100<VD108, 则使VB100加1,否则VB100保持不变……,VD100分别与VD104 、VD108、VD112、VD116进行比较判断完后,如VB100=3,则VB100进行2次加一计数,即说明VD100与其它4个存储器比较,其值小于2个存储器的值,位于第三,如VB100=5,则VB100进行4次加一计数,即说明VD100与其它4个存储器比较,其值最小,位于第五。
程序处理:在主程序里,每按一次启动按钮将进行5个双字存储器与其它4个存储器进行比较(即调用5次功能模块),其比较结果分别放入对应存储区即可实现。详见下面程序:
一、主程序:
二、子程序:
三、求助帖:开机顺序的取样
有5台电机,随机开机/停止,要知道同时工作的2~5台电机中哪台电机先开启的,要怎么做?最好是梯形图的,本人语言上承认有障碍,简单的还可以难的看不明白。
回复:编个程序供参考:
程序说明:编程思路
1、VB0~VB4分别为第1~第5台电机启动的顺序号存储器,其存储器内容=0,表示对应电机为停车,存储器内容=1 表示是第1个启动,=2表示是第2个启动。。。这5个字节存储器可在上位机或触摸屏内设置且时时显示其内容:如:VB0=0、VB1=3、VB2=0、VB3=1、VB4=2,则可以判断此时是第2、第4、第5 三台电机运行,其第4台(VB3)最先启动,第5台(VB4)为第2启动,第2台(VB1)为第3启动.
2、VB0~VB4的启动序号是这样进行的,网络11是当5台电机皆停车时,将计数器MB0=0。如此时第1个启动电机3,(见网络5)I0.2=1的前沿使Q0.2=1(即第3台电机启动),同时使MB0计数器加1(使MB0=1),再将MB0送入VB2,使VB2=1.再按I0.0(见网络1),其I0.0=1的前沿使Q0.0=1(第1台启动),同时使MB0计数器加1(使MB0=2),再将MB0送入VB0,使VB0=2。。。
回楼主:我的思路是这样:当一台电机停车时,将它启动时的顺序号清除,表示停车,再启动它或其它电机时,计数器照样加1计数,不用计数器减1,相反简单的进行MB0减1,会出现重号的,如:VB0=1、VB2=3、VB3=2,此时计数器MB0=3, 如将电机1停车,即使VB0=0,再将MB0减1,其MB0=2, 如此时按第5台电机,使Q0.4=1,MB0加1,其MB0=2+1=3,即MB0将3送入VB4,使VB4=3,你看:VB2=3与VB4=3就重复了。如不进行MB0减1运算,其VB4=4,这样运行的3台电机的顺序号为:VB2=3、VB3=2、VB4=4,显然这3台电机最先启动的是VB2,即序号最小的为最先启动的电机。
计数器的计数值可以大于5,各电机的的启动顺序号按数值大小比较,数值最小的为最先启动电机,数值最大的为最后启动电机。下举一例:
电机启动顺序为,2号启-4号启-1号启-2号停-3号启-2号启。其各电机启动顺序为:
VB0=3、VB1=5、VB2=4、VB3=2 此时最小数=2,即4号(VB3=2)电机最先启动,1号(VB0=3)电机为第2启动,3号(VB2=4)电机为第3启动,而2号(VB1=5)电机为第4启动。
有人问:这里吧,有个问题,就是取最大值看哪个是最后一个启动的没问题,但是取最小值的时候,是取的没启动的泵的0
再回复:顺序号存储器(VB0~VB4)=0表示对应电机为停车没运行,故比较时,应去掉=0的存储器,选≠0存储器值最小者为最先启动电机。