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