Files
FSI.Tia.V13.Prj/src/FSI Funktionen/Timer, Zeitmessung/SkLfztUebw.Main.scl
2021-03-29 10:23:01 +02:00

169 lines
5.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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