Advertisement
当前位置:
(已结贴)工控PLC擂台第79期-一道有关PLC实现的征集题
回复 | 人气 | 打印
玻璃的心 个人主页 给TA发消息 加TA为好友 发表于: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后、用户可通过用户管理后台申请兑换)。
分享到: 收藏 回复 举报
矩形科技 个人主页 给TA发消息 加TA为好友 发表于: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输出。

  回复引用举报
戴国政 个人主页 给TA发消息 加TA为好友 发表于: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---王者之师 个人主页 给TA发消息 加TA为好友 发表于: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 个人主页 给TA发消息 加TA为好友 发表于:2012-08-04 11:10:18 4楼
  非常给力的PLC视频教程,学习了 
  回复引用举报
welfare87 个人主页 给TA发消息 加TA为好友 发表于:2012-08-05 00:47:35 5楼
 

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

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

  回复引用举报
玻璃的心 个人主页 给TA发消息 加TA为好友 发表于:2012-08-15 21:38:39 6楼
 

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

wyb2866255---王者之师        wyb2866255

戴国政                                    戴国政


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

矩形科技                                 矩形科技

welfare87                               welfare87


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

 

  回复引用举报
gwer789 个人主页 给TA发消息 加TA为好友 发表于:2015-06-23 19:55:25 7楼
 

谢谢楼主们,下来学习了

  回复引用举报

相关主题
周点击排行
周回复排行
    最新求助
      Advertisement Advertisement