169 lines
5.0 KiB
Plaintext
169 lines
5.0 KiB
Plaintext
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
|
||
|