FB höchster Wert der vergangenen X Minuten

Habe einen Funktionsbaustein den ich häufig verwende, aber noch nicht in OSCAT enthalten ist:

FUNCTION_BLOCK MAX_LAST_TIME
VAR_INPUT
	X : REAL := 0.0;				(* Der übergebene Momentanwert *)
	DURATION : TIME := T#1m;		(* Der Zeitabschnitt *)
END_VAR
VAR_OUTPUT
	X_MAX : REAL := 0.0;			(* Der größte Wert des letzten Zeitabschnittes *)
END_VAR
VAR
	X_MAX2 : REAL := 0.0;	 		(* Der zweithöchste Wert *)
	tx, T1, T2 : TIME;
END_VAR


(* #######################################################################################################

Funktionsbaustein MAX_LAST_TIME

gibt den größten X-Wert des letzten Zeitabschnittes DURATION über X_MAX  aus.

Angelehnt an den OSCAT Funktionsbaustein SCHEDULER Version 1.1

####################################################################################################### *)

(* ------------------------- aktuelle Zeit bestimmen ------------------------- *)
tx := DWORD_TO_TIME(T_PLC_MS());

(* ------------------------- höhere Werte erkennen ------------------------- *)
IF X >= X_MAX THEN		(* neuer höchster Wert? *)
	X_MAX := X;
	X_MAX2: 0.0;			(* neue Suche nach zweithöchstem Wert *)
	T1 := tx;
	T2 := tx;
ELSIF X >= X_MAX2 THEN	(* neuer zweithöchster Wert? *)
	X_MAX2 := X;
	T2 := tx;
END_IF

(* ------------------------- alte Werte vergessen ------------------------- *)
IF tx - T1 >= DURATION THEN
	X_MAX := XMAX2;		(* umschalten auf zweithöchsten Wert *)
	T1 := T2;
	X_MAX2 := 0.0;		(* neue Suche nach zweithöchstem Wert *)
	T2 := tx;
END_IF