(已结贴)工控PLC擂台第79期-一道有关PLC实现的征集题 点击:829 | 回复:7



玻璃的心

    
  • 精华:30帖
  • 求助:2帖
  • 帖子:962帖 | 5801回
  • 年度积分:0
  • 历史总积分:61250
  • 注册:2010年6月11日
发表于:2012-04-15 23:22:05
楼主
      推荐一个网友的求助帖,:“我想做一个小程序,每半个小时循环一次,每次循环内部又要执行20次几乎相同的操作(第一个90秒之内Q0.0 输出5秒,Q0.0输出延时2秒Q0.1 输出0.5秒。第二个90秒,输出点变为Q0.2和Q0.3,以此类推)。我想用一个子程序,不想书写20次子程序调用,只书写一次子程序调用,利用循环可以实现不,任何实现?请高手给我指点指点。期待您的指点。”此贴编程有一定难度,可以锻炼编程者的思维、技巧和能力。
 
 
工控PLC擂台每周一期,本期待78期结束一周后结贴。奖项设置:一等奖1名:20~50MP,二等奖5名:10MP,三等奖10名:100积分。

MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。

MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。


楼主最近还看过



矩形科技

  • 精华:1帖
  • 求助:0帖
  • 帖子:26帖 | 276回
  • 年度积分:0
  • 历史总积分:1221
  • 注册:2008年1月18日
发表于:2012-04-18 15:02:24
1楼

用我们矩形科技的PLC,刚好有这样一条指令,可以简单实现。

CAM指令,变量处于某个区间时,对应的位输出。我们只需要设计这个20个区间即可,因为区间有规律,通过FOR循环指令赋值搞定!

Q0.0 0~5S输出              Q0.1   7~7.5S输出

Q0.2  90~95S输出          Q0.3   97~97.5S输出

Q0.4  180~185S输出      Q0.5    187~187.5S数

详细程序如下:

状态页监控的数据,当40200定时器时间为4540/10=454S时,011输出。

戴国政

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 14回
  • 年度积分:0
  • 历史总积分:98
  • 注册:2010年4月29日
发表于:2012-04-18 17:53:32
2楼

·西门子300PLC313cpu+324DI

·程序块0B1:主循环,以OB1循环扫描时间累加作为180090s定时器;

        OB100:数据上电初始化;

        FC1:循环体,以寄存器指针方式访问DI

0B100-------------------------------------------------

      AN    "M_1800s"
      S     "M_1800s"

      AN    "M_90s"
      S     "M_90s"

      L     0.000000e+000
      T     "M_Timer1800s"
      T     "M_Timer90s"

0B1--------------------------------------

      L     LD     6
      ITD  
      DTR  
      L     1.000000e+003
      /R   
      T     "M_CycleTimeOB1"            //OB1循环时间转换

      L     "M_Timer1800s"
      L     "M_CycleTimeOB1"
      +R   
      T     "M_Timer1800s"
      L     1.800000e+003
      >R   
      JCN   _001

      L     0.000000e+000               //1800s计时累加
      T     "M_Timer1800s"
      S     "M_1800s"

_001: L     "M_Timer90s"                // 90s计时累加
      L     "M_CycleTimeOB1"
      +R   
      T     "M_Timer90s"

      L     "M_Timer90s"
      L     9.000000e+001
      >R   
      JCN   _002
      S     "M_90s"

      L     0.000000e+000
      T     "M_Timer90s"

_002: CALL  "LoopCtrl"

 

FC1-------------------------------------

nw1--------------

      AN    "M_1800s"
      SAVE 
      BEC  

nw2------------------------------------
      A     "M_1800s"
      A(   
      L     #LoopCounter
      L     20                    //20次循环结束,复位1800s标志位,等待下一次触发;
      ==I  
      )    
      JCN   run

      L     0
      T     #LoopCounter

      R     "M_1800s"

run:  A     "M_1800s"                   //循环开始,初始化指针;
      FP    M     11.0
      =     M     12.0
      JCN   loop

      L     0
      T     #LoopCounter

      L     P#0.0
      T     #FirstPointer

NW3------------

loop: A     "M_90s"
      L     S5T#5S
      SE    T     30
      A     T     30
      =     "M_FirBit"

nw4-----------------------

      A     "M_90s"
      AN    T     30
      L     S5T#2S
      SE    T     31
       A     T     31
      =     "M_SecBit"

nw5--------------------------

      A     "M_90s"
      AN    T     30
      AN    T     31
      L     S5T#500MS
      SE    T     32


      A     T     32
      =     "M_ThirdBit"

nw6----------------------------

     L     #FirstPointer
      LAR1 

      A     "M_FirBit"
      =     Q 【AR1,P#0.0】

      A     "M_SecBit"
      =     Q 【AR1,P#0.1】

      A     "M_ThirdBit"
      =     Q 【AR1,P#0.2】

nw7-----------------------------

      A     "M_90s"
      AN    T     30
      AN    T     31
      AN    T     32
      FP    M     11.2
      =     L      6.0
      A     L      6.0
      BLD   102
      R     "M_90s"
      A     L      6.0
      JNB   _001
      L     #LoopCounter
      L     1
      +I   
      T     #LoopCounter
_001: NOP   0

 

nw8---------------------------

      A     "M_90s"
      FN    M     11.3
      =     M     12.3
      JCN   _005

      L     #FirstPointer               

      L     P#0.3
      +D   
      T     #FirstPointer

_005: NOP   0



其中loop循环体用SE计时器完成,本用梯形图很明了,苦于无法上传图片,转为stl编写,不明了了。


wyb2866255---王者之师

  • 精华:73帖
  • 求助:0帖
  • 帖子:218帖 | 2872回
  • 年度积分:0
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2012-04-20 08:08:46
3楼

我的思路:按着雷主要求用S7-200编写了一个子程序(SBR_1),该子程序运行时间为半小时,在此时间内重复执行20次类似的控制动作,不同点就是输出口依次下移:第一次输出口为Q0.0Q0.1,第二次输出为Q0.2Q0.3,第三次输出为Q0.4Q0.5……。在主程序中,设定I0.1为启动命令按钮,设I0.2为停止运行按钮。只要按一下I0.1启动,程序将自动执行每半小时调一次SBR_1子程序,重复调用,直到按下I0.2停止按钮,程序才终止运行。

该子程序共占据输出口40个,整整是5个输出通道(  QB0QB1、…QB5)如按正常编程,这20个类似动作由于输出口不同,需一一调用,这样编出的程序太长。经过反复思考,我是这样编程的:

1、               我利用指针指令,首址指向QB0,每执行完一个通道动作后,令指针地址加1,这样循环5次,其输出即可由QB0依次移到QB5

2、               对一个输出通道内的传送地址,是采用“与”、“或”指令进行的,比如第一次输出,先将QB00,将MB2=1MB3=2。当运行80秒时将QB0MB2相或运算,其结果:Q0.0=1,延时82秒将QB0MB3相或运算,其结果:Q0.0=1Q0.1=1。当运行85秒时将MB2求反送入MB4,此时MB4=16#FE,再用QB0MB4相与运算,其结果:Q0.0=0Q0.1=1,当运行87秒时将MB3求反送入MB5,此时MB5=16#FB,再用QB0MB5相与运算,其结果:Q0.0=0Q0.1=0,从而达到在第一个90秒内使Q0.0输出为1且保持5秒后复位,使Q0.1滞后Q0.1两秒输出为1且保持5秒复位的控制要求。第二次动作时,先将MW2左移2位,即使MB2=04MB3=8再重复上述动作,其结果:Q0.2=1,延时5秒复位,Q0.3滞后二秒输出为1,保持5秒复位,从而达到第二次动作时其输出下移到Q0.2Q0.3。具体动作控制,请见下面梯形图:

   主程序:

子程序:SBR_1

    该程序经上机运行(为缩短运行时间按图中注解的试验时改动数据运行),动作正确,符合命题要求。

lydxliusun

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 20回
  • 年度积分:0
  • 历史总积分:439
  • 注册:2012年2月08日
发表于:2012-08-04 11:10:18
4楼
非常给力的PLC视频教程,学习了 

welfare87

  • 精华:1帖
  • 求助:4帖
  • 帖子:53帖 | 2827回
  • 年度积分:0
  • 历史总积分:25853
  • 注册:2009年2月20日
发表于:2012-08-05 00:47:35
5楼

本来使用S7-200的PLC来实现

      每半个小时循环一次,即90s*20,共20*2=40个输出点,其规律为依次接通的顺序为Q0.0、Q0.1...Q4.7(只是间隔时间不同),在本例中使用移位寄存器来实现,主要控制好移位的时间就很简单了,同时引用V寄存器过度,来保存中间无输出时状态

玻璃的心

  • 精华:47帖
  • 求助:2帖
  • 帖子:1303帖 | 5801回
  • 年度积分:0
  • 历史总积分:61251
  • 注册:2010年6月11日
发表于:2012-08-15 21:38:39
6楼

一等奖2名,30MP获得者:

wyb2866255---王者之师        wyb2866255

戴国政                                    戴国政


二等奖2名,10MP获得者:

矩形科技                                 矩形科技

welfare87                               welfare87


三等奖0名,100积分获得者:

 

gwer789

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 362回
  • 年度积分:599
  • 历史总积分:768
  • 注册:2011年6月22日
发表于:2015-06-23 19:55:25
7楼

谢谢楼主们,下来学习了


热门招聘
相关主题

官方公众号

智造工程师