FUNCTION_BLOCK "ew_Totzeit"
VAR_INPUT//Eingänge
einwort:WORD;//Totzeit Eingangswort
ein_Bit AT einwort:ARRAY[1..16] OF BOOL;
Zeitfeld_Ton:ARRAY[1..16] OF TIME;//Zeitfeld für Eingangsverzögerung
Zeitfeld_Impuls:ARRAY[1..16] OF TIME; //Zeitfeld für Impulsverlängrung
END_VAR
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VAR_IN_OUT
//Durchgänge
END_VAR
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VAR_OUTPUT//Ausgänge
Auswort:WORD;//Totzeitverzögertes Ausgangswort
Feld_Rest_time_Ton:ARRAY[1..16] OF TIME;//Restzeiten aller Einschaltverzögerungen
Feld_Rest_time_impuls:ARRAY[1..16] OF TIME;//Restzeit aller Impulsverlängerungnen
END_VAR
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VAR// statische Variablen
speicher_timer_ton:ARRAY[1..16] OF DINT;
speicher_timer_puls:ARRAY[1..16] OF DINT;
Taktzeit:"Zyklus_TIme";//Erzeugt Zykluszeit
Speicher_impuls:ARRAY[1..16] OF STRUCT
Flag:bool;
FLME_1:BOOL;
FLME_2:BOOL;
END_STRUCT;
Flanken_Speicher:ARRAY[1..16] OF STRUCT
FLME:BOOL;
Impuls:BOOL;
END_STRUCT;
Index:INT;
END_VAR
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VAR_TEMP// LokaleVariablen
Auswort_intern_ton:WORD;
Auswort_intern_impuls:WORD;
ausgang_Bit_Ton AT Auswort_intern_ton:ARRAY[1..16] OF BOOL;
ausgang_Bit_impuls AT Auswort_intern_impuls:ARRAY[1..16] OF BOOL;
Zykluszeit_intern:INT;
END_VAR
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BEGIN
//Vorbelegung index
index:=1;
//Zykluszeit Messung
Taktzeit();
Zykluszeit_intern:=Taktzeit.Zykluszeit;
FOR index:=1 TO 16 BY 1 DO
//Einschaltverzögerung
Time_TON(Timer_start :=ein_Bit[index] // IN: BOOL
,Timer_reset :=false // IN: BOOL
,OB1_PREV_CYCLE :=Zykluszeit_intern // IN: INT
,TON_Time_Vorgabe :=Zeitfeld_Ton[index] // IN: TIME
,Timer_Q :=ausgang_Bit_Ton[index] // OUT: BOOL
,Timer_Rest_time :=Feld_Rest_time_Ton[index] // OUT: TIME
,Timer_Speicher :=speicher_timer_ton[index] // INOUT: DINT
); // VOID
//Impulerzeugung Einschaltverzögerung zu Ende
P_Flanke_in_SCL(p_Signal :=NOT ausgang_Bit_Ton[index] // IN: BOOL
,Impuls := Flanken_Speicher[index].Impuls // OUT: BOOL
,flme :=Flanken_Speicher[index].FLME // INOUT: BOOL
); // VOID
//Nachlauf Eingang ist false
Time_Impuls(Timer_start := Flanken_Speicher[index].Impuls // IN: BOOL
,Timer_reset :=false // IN: BOOL
,OB1_PREV_CYCLE :=Zykluszeit_intern // IN: INT
,Impuls_Time_Vorgabe :=Zeitfeld_Impuls[index] // IN: TIME
,Timer_Q :=ausgang_Bit_impuls[index] // OUT: BOOL
,Timer_Rest_time :=Feld_Rest_time_impuls[index] // OUT: TIME
,Timer_Speicher :=speicher_timer_puls[index] // INOUT: DINT
,Speicher_bool_Zustand := Speicher_impuls[index].Flag // INOUT: BOOL
,Flme_1 := Speicher_impuls[index].FLME_1// INOUT: BOOL
,Flme_2 := Speicher_impuls[index].FLME_2 // INOUT: BOOL
); // VOID
END_FOR;
//Befehlsausgabe
Auswort:=Auswort_intern_impuls OR Auswort_intern_ton;
OK:=true;
END_FUNCTION_BLOCK