User
FUNCTION "FC_On_Delay" : Void { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT input : Bool; current_time : Time; interval : Time; END_VAR VAR_IN_OUT prev_input : Bool; output : Bool; start_time : Time; END_VAR BEGIN IF #output <> #input THEN IF #input THEN IF #prev_input THEN IF (#current_time - #start_time) > #interval THEN #output := true; END_IF; ELSE #start_time := #current_time; END_IF; ELSE #output := false; END_IF; END_IF; #prev_input := #input; END_FUNCTION
TYPE "test_timer_t" VERSION : 0.1 STRUCT "timer" {InstructionName := 'IEC_TIMER'; LibVersion := '1.0'} : IEC_TIMER; in : Bool; pt : Time := T#10S; q : Bool; et : Time; END_STRUCT; END_TYPE TYPE "test_ton_timer_t" VERSION : 0.1 STRUCT "timer" {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; in : Bool; pt : Time := T#10S; q : Bool; et : Time; END_STRUCT; END_TYPE TYPE "test_tof_timer_t" VERSION : 0.1 STRUCT "timer" {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME; in : Bool := true; pt : Time := T#10S; q : Bool; et : Time; END_STRUCT; END_TYPE DATA_BLOCK "DB_timers" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 NON_RETAIN VAR timers : Array[1..100] of "test_timer_t"; ton_timers : Array[1..100] of "test_ton_timer_t"; tof_timers : Array[1..100] of "test_tof_timer_t"; END_VAR BEGIN END_DATA_BLOCK FUNCTION "FC_test_timers" : Void { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_TEMP i : Int; END_VAR BEGIN FOR #i := 1 TO 100 DO "DB_timers".timers[#i].timer.TON(IN := "DB_timers".timers[#i].in, PT := "DB_timers".timers[#i].pt, Q => "DB_timers".timers[#i].q, ET => "DB_timers".timers[#i].et); "DB_timers".ton_timers[#i].timer(IN := "DB_timers".ton_timers[#i].in, PT := "DB_timers".ton_timers[#i].pt, Q => "DB_timers".ton_timers[#i].q, ET => "DB_timers".ton_timers[#i].et); "DB_timers".tof_timers[#i].timer(IN := "DB_timers".tof_timers[#i].in, PT := "DB_timers".tof_timers[#i].pt, Q => "DB_timers".tof_timers[#i].q, ET => "DB_timers".tof_timers[#i].et); END_FOR; END_FUNCTION
Теперь использую стандартные таймеры.