FB höchster Wert der vergangenen X Minuten

Begonnen von Richardt, 05. September 2011, 19:15:33

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Richardt

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