Tagessicherung
This commit is contained in:
168
src/FSI Funktionen/Timer, Zeitmessung/SkLfztUebw.Main.scl
Normal file
168
src/FSI Funktionen/Timer, Zeitmessung/SkLfztUebw.Main.scl
Normal file
@@ -0,0 +1,168 @@
|
||||
FUNCTION_BLOCK "SkLfztUebw.Main"
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
I_StepNr : Int; // aktuelle Schrittnummer
|
||||
"I_STIME.tx" : DWord; // Zeit
|
||||
I_LfztUebw : Any; // Register Schrittzeiten
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
zylZt : Time; // zuletzt gemessene Zykluszeit
|
||||
tx : Time; // aktuelle Systemzeit
|
||||
anyFlt : Word; // Fehler beim Bestimmen der Länge
|
||||
stepNrs : DInt; // Anzahl der Schritte
|
||||
zylZtSum : DInt; // Summe der Zykluszeiten
|
||||
tempStepZt : "SkLfztUebw.T_Lfzt"; // Temp Variable zur Bestimmung der Anzahl Schritte
|
||||
tempGesStepZt : "SkLfztUebw.T_Lfzt";
|
||||
flkStep : "Flnk.NrVal"; // Flankenauswertung bei Schritt-Nr. Änderung
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
TOP_SI : Struct
|
||||
EV_CLASS : Byte;
|
||||
EV_NUM : Byte;
|
||||
PRIORITY : Byte;
|
||||
NUM : Byte;
|
||||
TYP2_3 : Byte;
|
||||
TYP1 : Byte;
|
||||
ZI1 : Word;
|
||||
ZI2_3 : DWord;
|
||||
END_STRUCT;
|
||||
START_UP_SI : Struct
|
||||
EV_CLASS : Byte;
|
||||
EV_NUM : Byte;
|
||||
PRIORITY : Byte;
|
||||
NUM : Byte;
|
||||
TYP2_3 : Byte;
|
||||
TYP1 : Byte;
|
||||
ZI1 : Word;
|
||||
ZI2_3 : DWord;
|
||||
END_STRUCT;
|
||||
err : Int;
|
||||
END_VAR
|
||||
|
||||
VAR CONSTANT
|
||||
GES_ZT : Int := 0;
|
||||
STEP01 : Int := 1;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
(*#################################################################################################
|
||||
|
||||
Copyright (c) Fondium Singen GmbH
|
||||
|
||||
### Änderungshistorie ###
|
||||
|
||||
Datum: Version: Bearbeiter: Beschreibung:
|
||||
23.09.2019 0.0 St. Maier Neuerstellung
|
||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
||||
|
||||
#################################################################################################*)
|
||||
|
||||
(*################################### Baustein Beschreibung #######################################
|
||||
|
||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
||||
- RD_SINFO
|
||||
- CpuZeit
|
||||
|
||||
Inputs:
|
||||
-
|
||||
|
||||
Outputs:
|
||||
-
|
||||
|
||||
In-\Outputs:
|
||||
- IO_ZylZtShiftReg: Schieberegister für Zykluszeiten
|
||||
|
||||
Return-Value:
|
||||
-
|
||||
|
||||
Funktionsbeschreibung:
|
||||
|
||||
|
||||
#################################################################################################*)
|
||||
|
||||
(* aktuelle Startinformationen auslesen *)
|
||||
(* OB1_SCAN_1 BYTE - B#16#01: Abschluss des Neustarts (Warmstarts)
|
||||
- B#16#02: Abschluss des Wiederanlaufs
|
||||
- B#16#03: Abschluss des freien Zyklus
|
||||
- B#16#04: Abschluss des Kaltstarts
|
||||
- B#16#05: Erster OB 1-Zyklus der neuen Master-CPU nach
|
||||
Master-Reserve-Umschaltung und STOP des
|
||||
bisherigen Masters *)
|
||||
#err := RD_SINFO(TOP_SI => #TOP_SI
|
||||
, START_UP_SI => #START_UP_SI
|
||||
);
|
||||
|
||||
// Zurücksetzen der letzten Zykluszeit bei System start
|
||||
IF #TOP_SI.EV_NUM <> 3 THEN
|
||||
#zylZt := t#0ms;
|
||||
END_IF;
|
||||
|
||||
// Infos wie Array-Länge von Schieberegister bestimmen
|
||||
#anyFlt := "Any.Struct"(I_UDT := #tempStepZt
|
||||
, I_StartBitAndRange := #I_LfztUebw
|
||||
, O_DataCount => #stepNrs
|
||||
);
|
||||
|
||||
// Funktion beenden, wenn Schritt 0 oder Schritt-Nr. größer als max. Schrittanzahl am Eingang ansteht
|
||||
IF #I_StepNr = #GES_ZT OR #I_StepNr >= (#stepNrs) THEN
|
||||
|
||||
#zylZt := t#0ms;
|
||||
RETURN;
|
||||
|
||||
END_IF;
|
||||
|
||||
// Flankenauswertung bei Schritt-Nr. Änderungen
|
||||
#flkStep(I_Val := #I_StepNr// IN: DINT
|
||||
);
|
||||
|
||||
// Flanke bei Schrittwechsel
|
||||
IF #flkStep.O_Flnk THEN
|
||||
|
||||
// Schrittzeit zurücksetzen
|
||||
//IO_LfztUebw.Data[#I_StepNr].lfztAkt := t#0ms;
|
||||
#tempStepZt.lfztAkt := t#0ms;
|
||||
|
||||
// Gesamt-Zeit der Schrittkette bei Schritt 1 zurücksetzen
|
||||
IF #I_StepNr = #STEP01 THEN
|
||||
|
||||
//IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt := t#0ms;
|
||||
#tempGesStepZt.lfztAkt := t#0ms;
|
||||
END_IF;
|
||||
|
||||
END_IF;
|
||||
|
||||
#tx := DINT_TO_TIME(DWORD_TO_DINT(#"I_STIME.tx")) - #zylZt;
|
||||
|
||||
// Gesamt- und Schrittzeitbestimmung
|
||||
IF #zylZt > t#0ms THEN
|
||||
|
||||
// Gesamt-Zeit Bestimmung
|
||||
//IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt := IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt + #tx;
|
||||
#tempGesStepZt.lfztAkt := #tempGesStepZt.lfztAkt + #tx;
|
||||
|
||||
"UdtInAnyKop"(I_SrcUdtAry:= #tempGesStepZt,
|
||||
I_DestUdtAry:=#I_LfztUebw ,
|
||||
I_DestIndex:=0,
|
||||
O_Ret=> #err);
|
||||
|
||||
|
||||
// Schrittzeit Bestimmung
|
||||
//IO_LfztUebw.Data[#I_StepNr].lfztAkt := IO_LfztUebw.Data[#I_StepNr].lfztAkt + #tx;
|
||||
#tempStepZt.lfztAkt := #tempStepZt.lfztAkt + #tx;
|
||||
|
||||
"UdtInAnyKop"(I_SrcUdtAry:= #tempStepZt,
|
||||
I_DestUdtAry:=#I_LfztUebw ,
|
||||
I_DestIndex:=#I_StepNr,
|
||||
O_Ret=> #err);
|
||||
|
||||
|
||||
END_IF;
|
||||
|
||||
#zylZt := #zylZt + #tx;
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
Reference in New Issue
Block a user