有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