循环运行

有5指示灯,任意选取只数,选取完后任意循环运行。还得开几秒停几秒后再运行。
模式一
选取1、2、4,号指示灯,一只循环, 开两秒停三秒,
1 开两秒停三秒   / 2 开两秒停三秒 /4开两秒停三秒 /1 开两秒停三秒   / 2 开两秒停三秒...........
模式二
选取1、2、4、5,三只循环,开两秒停三秒
1、2、4开两秒停三秒,2、4、5开两秒停三秒,4、5、1开两秒停三秒,5、1、2开两秒停三秒。。。。。
用s7200写,怎么写呢?谢谢。求大神。

最佳答案

提供一个思路
 1先判断第一个灯是否选择,是3,否判断下一个灯是否选择,反复执行判断,直到有灯被选择
 

3开灯,延时开灯时间,4
4关灯,延时关灯时间  1


TYPE "light"
VERSION : 0.1
   STRUCT
      select : Bool;
      out : Bool;
      open : Time := T#2s;
      close : Time := T#3s;
   END_STRUCT;

END_TYPE

FUNCTION_BLOCK "块_2"
{ S7_Optimized_Access := ''''TRUE'''' }
VERSION : 0.1
   VAR 
      step : Int;
      no : Int;
      i : Int;
      count : Int;
      open : Int;
      close : Int;
      start : Bool;
      stop : Bool;
      light : Array[0..10] of "light";
      OpenTime {InstructionName := ''''TON_TIME''''; LibVersion := ''''1.0''''} : TON_TIME;
      closeTime {InstructionName := ''''TON_TIME''''; LibVersion := ''''1.0''''} : TON_TIME;
   END_VAR


BEGIN
 
 #OpenTime(IN:=#step=3,
           PT:=#light[#no].open);
 
 #closeTime(IN := #step = 4,
            PT := #light[#no].close);
 
 
 
 IF #start THEN  //启动循环
     #start := FALSE;
     #step := 1;
     #no := 1;
 END_IF;
 IF #stop THEN // 停止循环
     #stop := FALSE;
     #step := 0;
     #no := 1;
     FOR #i := 0 TO 10 DO
         #light[#i].out := FALSE;
     END_FOR;
     
 END_IF;
 
 CASE #step OF
     1://判断本次要开的灯
         #i := #no;
         IF #light[#i].select THEN //直接找到本次要开的灯
             #step := 2;//进入开灯流程
         ELSE
             WHILE NOT #light[#i].select DO //找下一个被选择的灯
                 #i := #i + 1;
                 IF #i > 5 THEN
                     EXIT;
                 END_IF;
             END_WHILE;
         END_IF;
         #no := #i;
         IF #no > 5 THEN
             #no := 1;
             #count := #count + 1;
         END_IF;
         IF #count > 1 THEN
             #step := 0;
             #no := 1;
             #count := 0;
         END_IF;
         
     2:
         #count := 0;
         #light[#no].out := true; //开本次灯
         #step := 3;
     3://开启时间判断
         IF #OpenTime.Q THEN
             #light[#no].out := FALSE; //关本次灯
             #step := 4;
         END_IF;
     4:// 关闭时间
         IF #closeTime.Q THEN
             #step := 1;
             #no := #no + 1; //指向下一个灯
         END_IF;
 END_CASE;
 
END_FUNCTION_BLOCK

提问者对于答案的评价:
不是我想要的,还是受教

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc361695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月5日 下午12:00
下一篇 2021年7月5日

相关推荐

发表回复

登录后才能评论