Tagessicherung

This commit is contained in:
maier_s
2021-03-29 10:23:01 +02:00
parent 5fe9b1ff76
commit 9b9c5cf7a7
172 changed files with 31945 additions and 0 deletions

View 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