对如何学习PLC及PLC的编程构思、技巧和心得谈谈自己的体会
  • 对如何学习PLC及PLC的编程构思、技巧和心得谈谈自己的体会
电话/微信号:13308461099,13807313137
对如何学习PLC及PLC的编程构思、技巧和心得谈谈自己的体会

       有一网友给我发个邮件,他说:“…… 我的问题是:我学了plc很多的指令,指令也稍好理解。但我们不懂得plc编程语法,不懂如何把指令组合起来用到实际中去。写一句话必须要懂语法,但我现在不懂得plc编程语法,不会把指令用到实际当中去,您说我如何解决这个问题?”
      像这位网友给我发邮件的还有几位,都是刚刚毕业参加工作不久的的初学者,都提出类似的问题:问我怎样才能学好编好plc程序?
      plc编程如同人写文章一样,同样的文字不同的组合,写出的效果不一样,有的语言精练,条理清晰,几句话说明问题,有的却相反,啰里啰唆,越讲越让人糊涂。如何才能写出好文章呢?只有深入学习,提高文学素质,多写多练,不断积累,不断总结经验,肯定会成功的。对plc编程也是一样,也要深入学习,提高编程素质,也要多编多练,不断积累,不断总结经验。提高编程素质,不仅仅要深入理解每条指令内涵及用法,还要扩大知识面,使你扩大视野,增强思维和分析问题的能力。
      现举一例:从网上看到一网友求助:其内容为: 有个pt100的温度传感器 通过500欧姆的电阻将4~20ma的电流转换成2-10的电压信号送到plc模拟量端! h对应的温度范围是0~100度!转换公式为 :

        我给他的回帖是: 4-20ma电流通过500欧姆电阻将产生2-10v 电压,送入plc的模块,从转换公式可知:式中的6400这个数是由2v转换来的数字量(因为输入2v 时 要使t=0,必需公式的分子项的转换值aiwo-6400=0才行),从中又可知:1v对应的数字量=3200,式中的“aiwo-6400”值即为2-10v输入时模拟块转换的数字量减去2v对应的数字量的值,当输入=10v时,其值=3200*8=25600,要使此时温度显示值为100,就得将此值除以256,但式中后面又乘100,故公式的分母项上 为25600,即=32000-6400。
       可见:这个问题就不是简单用指令编程的问题,它涉及到电学及数学知识,如果没有这方面知识,该公式是很难理解的。
       再举一例:有一在线探伤生产线,在辊道上安放一光电开关,当钢管通过它时,其触点闭合,开始探伤与测长,钢管离开光电开关后,立即将测长值和探伤数据上传给计算机进行处理。由于钢管是旋转前进,如钢管不直,会摆动前进,往往会使光电开关瞬间闪动,使至plc误判:以为探伤结束给上位机上传错误数据,怎样解决这个问题 ?如你有深厚的电路基础知识,就会想到可以用通电延时与断电延时两个定时器来解决:将二个定时器的时间设定为大于光电开关瞬间闪动的时间,利用断电延时定时器在断电后需延时一段时间方可断电的特性,就可解决光电开关瞬间闪动的问题,但由于它延长一段时间才断开,使对钢管的测长不准,为此,又增加通电延时定时器,用通电延时定时器开关动作的前沿,触发一内部的位开关(比如:m1.0)使其置“1”,用断电延时定时器的开关后沿触发m1.0使其置“0”,这样,用m1.0 做测长计数控制门,就可解决测长不准的问题。
       再如:探伤完了的钢管走出探伤区后,需对它进行分选,将不合格的拨到废品筐。如探伤完后,立即分选,这样情况编程好实现,但现场废品筐的位置离很远的地方,当钢管走到废品筐时,探伤机已探完3或4根钢管,即辊道上已存在3-4根已探完伤的钢管在运行,如何准确无误的将不合格的钢管拨到废品筐里,这对编程也是件辣手的问题。如果你有电子线路设计基础,就会想到,用移位存储器来实现对多根钢管的质量状态进行实时跟踪,你可以这样编程:用一个字节存储器,如:mb100,用它做移位存储器(他可记忆八根钢管质量状态),启动时,先将它清零,探伤时,如发现有伤,立刻将mb100 的最低位置“1”(即:使m100.0=1),当钢管探伤完毕走出探伤区时,用左移指令使mb100左移一位。如果现场是探伤后的第四根到废品筐位进行分选,编程时应将m100.3与废品筐到位的分选开关的常开触点串联,再去驱动拨料装置。这样,当钢管走到废品筐使其到位的控制开关吸合,这时,如果m100.3=1,将驱动拨料装置动作,将钢管拨入废品筐,如果m100.3=0,说明此钢管是合格品,驱动拨料装置不动作,钢管继续在辊道上运行。
      通过上面几个举例,可以看出,扩大知识面,会使你的思路变宽,使你能合理巧妙的使用指令编程,不仅使语句精炼短小,而且控制动作合理可靠。要达到这样编程水平,就得多编多练,不断的总结经验,不断的积累,积累不仅仅是自己的经验,也要虚心向有经验的同行学习,多看看别人的程序,吸收好的编程方法和思路,来不断地提高自己的编程水平。
      下面举一个编程实例,讲讲对一个具体项目如何进行编程:
      这是网上擂台的题目:一台电动机要求在按下起动按钮后,电动机运行10秒,停5秒,重复3次后, 电动机自动停止。同时设置有手动停机按钮和过载保护。编写梯形图控制程序。plc可以随便选用,要有相关说明。 注意:要有plc控制电路和i/o分配表。
      1、硬件选择:一台plc(s7-200)、一个交流接触器z0(控制电机运行)、2个按钮开关(sb1、sb2)及1个过流继电器(fr),电路图如下:(不包括粉色虚线框部分)
 


      2、 编程:用不同思路,可编出几种不同的控制方案,都可实现该项目要求。 
      (1)、最简单的编程方案,就是选用5个通电延时定时器:其3个定时10秒,用于电机启动运行,另2个定时5秒,使电机停。具体编   程也有二种方式,见下图:
 


           上图中的方案一与方案二,同用5个定时器,完成同样的功能。
       方案一是这样编程:按下启动按钮(i0.0),使 断开。在此过程中,m0.0、mo.2、m0.4都是10秒的导通时间,用它们去控制q0.7,其彼此间隔时间为5秒(即m0.1、m0.3的通导时间)。延时m0.0=1,t101得电开始延时,延时10秒,t101吸合使m0.1=1、m0.0=0,使t101断电,而t102得电开始延时,5秒后t102得电吸合,使m0.2=1,m0.1=0。。。直到t105得电
       方案二是这样编程:按下启动按钮(i0.0),使 m0.0=1,t101得电开始延时,延时10秒,t101吸合,使t102得电开始延时,延时5秒,t102吸合,使t103得电开始延时。。。直至t105得电延时,延时10秒后动作,使m0.0=0,m0.0=0使t101—t105皆断开,程序结束。用m0.0的常开触点与t101的常闭触点串联,用t102的常开触点与t103的常闭触点串联,用t104的常开触点与t105的常闭触点串联,三者再并联后去驱动q0.7,可达到同样的控制作用,
        由上图可见,由于编程方法不同,其方案二用的指令比方案一少,显然:方案二优于方案一。
      (2)、用二个定时器(t101、t102)和一个字节存储器(mb1)编程也可实现同样功能:
       按下启动按钮,使mb1=0、m0.0=1,m0.0=1使t101得电开始延时,10秒t101吸合使t102得电吸和,延时5秒,t102吸合,其常闭点断开,使t101、t102失电断开,t101又得电延时。。。形成振荡器,t102每吸合一次,使mb1加1,吸合3次,mb3=3,比较器输出1使m0.0=0,程序结束。用m0.0的常开点与t101与t102的常闭点串连,去驱动电机输出口q0.7,可实现电机转10秒停5秒,循环3次控制结束。
        该方案所用指令比方案二还少(见上图方案三),可见扩大思路与视野,可编辑出多种不同的可执行方案,从中选出最佳方案,会使你编出的程序,短小精悍。
       此外还有二种编程方案,也可实现这同一课题的控制要求:即是用plc的秒脉冲(sm0.5)触发存储器使之进行移位或加计数的控制方式实现的控制方案:

       上图的方案四:是选用二个字节存储器(mb2、mb3),按下按钮,其抬起的后沿,使mb2=0、mb3=3,且使m0.1=1。m0.1=1使plc的秒脉冲sm0.5触发有效:sm0.5的前沿,对mb2进行加1运算,当mb2值<10时,使输出q0.7始终=1(即电机运转),mb2>=10时,使q0.7=0(电机停),mb2=15时,使mb2=0,同时mb3减1,再判断mb3=0?,如不=0,由于mb2=0,且<10,使q0.7=1(电机又转)。。。当mb3=0时(即循环3次),使m0.1=0,程序结束。此程序所用指令少,也是最佳方案。
      上图的方案五:它是采用秒脉冲sm0.5的前沿触发字存储器mw4,使其以次右移一位的方式,对电机进行实时控制:按下启动开关(i0.0),其抬起时,将mw4=16#3f(即mb5的8位皆=1,mb4的低二位值也=1,共10位值都=1),再将mb6=0、mb7=3,同时使m0.2=1。m0.2=1 使sm0.5的前沿触发有效,每触发一次,mw4右移一位,mb6加1,当计满15次时,使mb6=0,且mb7减1,再判断mb7=0?,循环计数3次,其mb7=0,比较器输出信号使m0.2=0,程序结束。每次计数为15,前10个计数,m5.0输出都=1,故输出口q0.7皆=1,电机运行,后5个计数,其m5.0输出皆 =0,故电机停转。
        这5种编程方案,出于5种不同的构思,望初学者能仔细分析各个程序,如能很好的理解,对你今后的编程是会大有帮助的。
      再介绍几个编程的小实例,都是在网上回答网友求助编写的,程序很短,针对性强,对初学者学习plc编程会有帮助的:
      一、网友求助:“电机启动后5秒内无反馈则停止电机的程序怎么写哦,请大侠指教 ”
我的回复:可以这样编程:

         程序解析:按下启动按钮(i0.0),其前沿使q0.0置1(q0.0=1)电机启动运行,在没有反馈信号时m0.0=0,故定时器t101得电且开始延时,如延时5秒始终没出现反馈信号,t101吸合,使q0.0=0,电机停转。如延时5秒内出现反馈信号(i0.1=1),使m0.0=1,m0.0的常闭点断开,使t101断电,定时器停止工作,电机保持长时间运行。按定制按钮(i0.1),使q0.0=0、m0.0=1,电机停,程序结束。
        二、网友求助:“s7-300里的定时器t1,怎么循环启动? 现在是,使用完一次,t1就停止了!而我想用t1实现每隔2秒重复一个动作!请大家帮忙,谢谢!” 又提出:“其实,我就是想用定时器来实现每隔3秒,qb0循环右移一位。 我现在比较菜鸟哈,希望高手们能指点详细点,最好能有梯形图! 嘿嘿,感谢!!”
       回复:“ 楼主:根据你的要求“其实,我就是想用定时器来实现每隔3秒,qb0循环右移一位。”我给你编出用s7-200和用s7-300编出的功能一样的梯形图。从图中可以看出,s7-200由于采用字节循环右移指令,所以编出程序简短易懂。s7-300由于没有字节循环右移指令,就得通过编程来达到同样的功能作用,编出的程序相对长了一些,看懂梯形图也相对难了一点。”


解析梯形图:
    1、图一是用s7200编写的图形图,其编程技巧有二:
   (1)用通电延时定时器t101的常闭点连接t101的线圈构成振荡器,其脉冲的低电平为3秒宽度,高电平为连续二个扫描周期的间隔时间,即只出现一次,故可直接用t101的常开触点去触发qb0的循环右移,而不需选用其前沿触发,就可确保qb0只右移一次。
  (2)、选用字节循环右移指令,在t101=1的这一扫描周期里将此时刻的qb0内容右移一位,同时又自动的将移出的qb0的最高位(q0.7)送回qb0的最低位(q0.0)(如不需循环右移,可改用字节右移一位的指令),使编程简短易懂。
    2、图二是用s7300编写的图形图,其编程技巧也是使用t101构成的振荡器,利用该振荡脉冲的正方波在程序扫描中只出现一次的特点,完成将qb0右移一位。由于s7-300没有字节移位指令,编程是这样处理:将qbo送入mw7的低字节mb8中,右移一位mw7,mb8也随之右移一位, m8.0”这条语句去掉就可以了。mb8的最高位移到mb7的最低位(即m8.0),再把m8.0送入m7.0中,再把mb8送回qb0,从而实现了将qb0内容的循环右移一位的功能,如程序不需要循环右移,可将“m7.0
       三、网友求助:“如何把一个字节的全部位,高位低位反向重排。
                                        01234567
                                       76543210 ”
      回复:现用s7-200编出一个字节内容反排列的程序梯形图,供你参考
        程序解析:该程序编程的技巧就是巧妙地运用字节的循环左移与字节右移:mb10为原数据,mb12为转换后的反排列数据,启动此程序,先将mb0=7,再使m1.0、m1.1置1。m1.0=1,先将m10,7-->m12.7,再将mb10循环左移一次,这样原mb10的内容左移一位,原m10.6-->m10.7,而mb12右移一位,将m12.7-->m12.6, 而0-->m12.7’,接着mb0减1,再判断mb0等不等0,不等0,下一周期再进行上述移位运算及判断,当mb0=0时,mb10循环左移7次,同时使m1.0=0,停止此段程序再运行,m1.0=0、m1.1=1,使mb10又右移一位,使mb10正好恢复原数值,而mb12的内容变为mb10的内容的反排列数值。
        由于plc指令没有位信号交换指令,对于字或双字的内容反排列用此思路编程最好,对单字节也可这样编程:将m10.7-->m12.0 m10.6-->m12.1 m10.5>m12.2 m10.4-->m12.3 .....m10.0-->m12.7即可。再将mb12-->mb10,就可实现将一个字节的内容反排列仍放在原字节中。 

       四、 用s7-200编程,实现用一个按钮可控制电机的正传、反转、停车的梯形图
        该梯形图编程技巧是:用按钮的输入点(i1.0)连接断电延时定时器(t101),及通电延时定时器(t102),t101延时为0.2 s,t102延时为1 s,t101作用是防按钮颤动而形成连发现象,确保按一下按钮只产生一个脉冲(即t101)从而确保对mb5加1运算的正确性,二次连续按钮的时间间隔控制在0.5s以下,t102 延时为 1s,故在连续按钮时,由于间隔时间小于1s,它不断的被切断。只有按下按钮不抬起(保持i1.0=1),当延时大于1s时,t102动作,其前沿将mb5的内容传入mb6,再将mb5清0。
         工作原理及操作说明:
   1) 开机sm0.1将mb5=1、mb6清0,由于m6.0、m6.1皆为0,使q0.0与q0.1都=0,故电机停止不动。
   2)电机正传运行:点击一下按钮(i1.0),产生一个(t101=1)的正脉冲,其后沿触发mb5计数器,使其+1,再按下按钮不抬起,此时mb5=0000_0010。经1秒延时,t102闭合,其前沿将mb5的内容送入mb6,随之将mb5清0。此时m6.0=0、m6.1=1,故使q0.0=1,电机正传运行。随后将按钮抬起,t101的后沿使mb5+1,此时mb5=0000_0001。
   3) 电机停转:按下按钮不抬起,此时mb5=0000_0001。延时1秒后t102动作,t102=1的前沿,将mb5送入mb6,之后mb5清0,此时m6.0=1、m6.1=0,故q0.0、q0,1皆为0,电机停止转动。当按钮抬起时,t101的后沿触发mb0,使mb5=1。
   4) 电机反转运行:点击二下按钮(i1.0),产生二个(t101=1)的正脉冲,其后沿触发mb5计数器,使其+2,再按下按钮不抬起,此时mb5=0000_0011。经1秒延时,t102闭合,其前沿将mb5的内容送入mb6,随之将mb5清0。此时m6.0=1、m6.1=1,故使q0.1=1,电机反传运行。随后将按钮抬起,t101的后沿使mb5+1,此时mb5=0000_0001。
该程序经上机运行,程序正确,动作可靠。
       五、这是擂台项目:有5个执行动作其动作顺序可以任意改变,如何编程来实现这5个执行动作能准确无误的执行新的设定顺序?
这是一网友求助帖提出的,原文是:“ 有5个执行动作我转换为操作数,姑且定为d10、d20、d30、d40、d50,它们每一个都可能写入从0 到5的数值。最后执行是从1到5 依次执行输出,是0的不执行跳过,不知如何编,请高手指点,谢谢了!”又“……如这一次是按1/2/3/4/5依次动作,下一次也许设置为按5/3/2/动作,再下一次就1/5/2/3/。。。。。”“两次执行的间隔时间可设定,暂定3秒看设备运转情况而定”
回复:
                    一、 plc的硬件设置及有关事项说明:选用s7-200plc编程。
1、其输入口:
     i1.0 为启动按钮,
     i1.1 为停止动作按钮。
    *** 以下的i0.0 ~ i0.5 六个输入点是为手动设置参数的按钮地址。是为在没有上位机或触摸屏与plc通讯的条件下,可用这6个按钮,对5路执行机构的动作顺序号及动作间隔时间进行手动设置。其各输入点定义如下:
    i0.0 为设置第1路执行机构执行动作的顺序号按钮
    i0.1 为设置第2 ~ 5路执行机构执行动作的顺序号按钮,设置值:0~5
    i0.2 为设置第2 ~ 5路执行机构执行动作的顺序号左移8位按钮
    i0.3 为复位按钮,即将第1~ 第5 路机构的顺序号清0,起作用是为更改5个机构动作的顺序号值做清0准备。
    i0.4 为相邻二个机构动作时间间隔值的个位数设置按钮,设置值:0~f(16进制数)
   i0.5 将时间设定值左移4位按钮

2、其输出口:
   q0.0 为第1路执行机构输出
   q0.1 为第2路执行机构输出
   q0.2 为第3路执行机构输出
   q0.3 为第4路执行机构输出
   q0.4 为第5路执行机构输出
3、vb10、vb11、vb12、vb13、vb14分别为第1~第5执行机构动作顺序号设置区
      为节省设置按钮,将vb11、vb12、vb13、vb14合并为一个双字存储器vd11。
4、vw30 为相邻二个机构动作时间间隔设置区。
             二、s7-200编程的梯形图:
     注: 网络1~网络5为主程序,即实现楼主要求的梯形图,以下为用plc自身设置参数的程序,如能用触摸屏等设置参数,可不用。
下面仍介绍一下“用plc自身设置参数的程序”,目的是帮助初学者在没有上位机或触摸屏的条件下,如何实现用plc的输入点对其内部参数(如定时器时间设定等)进行设置。     从图中可以看到: 按钮i0.0~i0.5都加一个断电延时定时器,目的是防止按按钮时因颤抖引起打连发现象,确保置数准确。
     为了帮助大家学会使用按钮设置参数(特别对vd11的设置)现举二例:
第一例:
      一、要求:
1、5个执行机构在启动后的动作顺序为:
机构3动 -> 机构1动-> 机构4动-> 机构5动-> 机构2动。相邻二个机构动作的间隔时间为:20秒。
即:设置动作顺序号应为 vb12=1、vb10=2、vb13=3、vb14=4、vb11=5
整理:vb10=2 vd11=05010304

2、相邻机构动作间隔时间为:20(秒) 即: vw30 = 20 = $ 14 (16进制数)
     二、设置5个执行机构动作顺序号数:
(1)、设置vb10: 用手连按二下 i0.0 ,监视vb10,其vb10=2,即vb10顺序号=2。
(2) 设置vd11: 先按i0.1五下,此时vd11=5,再按一下i0.2,使vd11左移8位,此时vd11=1280 (即16进制数:$ 500).再按i0.1一下,vd11=1281(即16进制数:$ 501),再按i0.2一下,此时vd11左移8位 ,vd11=327936(即16进制数$ 50100).再连按i0.1三下,vd11=327939(16进制数:$ 50103),按一下i0.2,vd11=83952384(即16进制数:$5010300),最后再连按i0.1四下,其vd11=83952388(即16进制数:5010304),到此vd11设置完毕。
(3)、设置vw30:vw30的设置数应为16进制数,故20秒应转换为16进制数($14),设置:先按i0.4一下,即:vw30=1,再按i0.5 一下,vw30左移4位,此时vw30=16,再连按i0.4四下,此时 vw=20(即16进制数:$ 14)。vw30设置完毕。
       第二例:
设置要求:5个执行机构的动作顺序号为:vb10=3、vb11=2、vb12=0、vb13=3、vb14=5
整理得:vb10=3、vd11=02000305
对vd11参数的设置过程应为:
按i0.1二下 ―> 按i0.2二下 ―> 按i0.1三下 ―> 按i0.2一下 ->按i0.1五下,设置完毕。
其动作顺序是:启动后,5个机构皆不动作,延时vw30设定时间,vb11动作,再延时vw30设定时间,vb10与vb13同时动作,再延时vw30设定时间,无机构动作,再延时vw30设定时间,vb14动作.到此整个动作结束。