@hf_spsler
ich hab filtere die aussreißer in der s7 raus mit diesem baustein.
FUNCTION_BLOCK "Mittelwert_Real_gleite4"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
//Der Baustein berechnet über 4 Messwerte hinweg einen gleitenden Mittelwert.
//Die Bildung des Mittelwertes basiert auf folgender Gleichung:
//Yi=(X1+X2+X3+...+X4)/4. Einen Schritt später werden die Messwerte wie folgt
//durchgeschoben.
//Yi+1=(X2+X3+...+X4)/4.
//Wird der Baustein z.B. nur alle 100ms einmal durchlaufen, so mittelt er über
//1,0 Sek. hinweg die Messwerte.
VAR_INPUT
Eingangswert : Real;
Max_Positiv : Real := 32000.0;
Max_Negativ : Real := 0.0;
END_VAR
VAR_OUTPUT
Mittelwert_Ausgang : Real;
Zahlenbereich_Fehler : Bool;
END_VAR
VAR_IN_OUT
Start_oder_Reset : Bool;
END_VAR
VAR
Messwert_Schiebereg : Real;
Messwert_Schiebereg1 : Real;
Messwert_Schiebereg2 : Real;
Messwert_Schiebereg3 : Real;
Messwert_Schiebereg4 : Real;
Summe_der_Messwerte : Real;
FP_Takt : Bool;
END_VAR
VAR_TEMP
Zu_klein : Bool;
zu_Positiv : Bool;
zu_Negativ : Bool;
END_VAR
BEGIN
NETWORK
TITLE = Arbeitstakt aufbereitung
A "SysDat_DB100".BlinkTakt_500msek_AnwPgm;
FP #FP_Takt;
JCN druu;
NETWORK
TITLE = Prüfung des Zahlenbereiches
L #Eingangswert;
A OV;
= #Zahlenbereich_Fehler;
JC druu;
L #Max_Positiv ;// grösste pos. Zahl stutzen
L #Eingangswert;
<R;
= #zu_Positiv;
A #zu_Positiv;
JCN zpos;
L #Mittelwert_Ausgang;
T #Eingangswert;
SET;
= #Zahlenbereich_Fehler;
zpos: L #Max_Negativ ;// grösste neg. Zahl stutzen
L #Eingangswert;
>R;
= #zu_Negativ;
A #zu_Negativ;
JCN zneg;
L #Mittelwert_Ausgang;
T #Eingangswert;
SET;
= #Zahlenbereich_Fehler;
NETWORK
TITLE = Alles löschen
zneg: A #Start_oder_Reset;
JCN ruek;
L 0.0;
T #Mittelwert_Ausgang;
T #Messwert_Schiebereg1;
T #Messwert_Schiebereg2;
T #Messwert_Schiebereg3;
T #Messwert_Schiebereg4;
T #Summe_der_Messwerte;
SET;
R #Start_oder_Reset;
ruek: NOP 0;
NETWORK
TITLE = Mittelwertberechnung Teil 1
L #Eingangswert ;// Neun Wert hinzufügen
L #Summe_der_Messwerte;
+R;
T #Summe_der_Messwerte;
NETWORK
TITLE = Eins weiter Schieben
L #Messwert_Schiebereg3;
T #Messwert_Schiebereg4;
L #Messwert_Schiebereg2;
T #Messwert_Schiebereg3;
L #Messwert_Schiebereg1;
T #Messwert_Schiebereg2;
L #Eingangswert;
T #Messwert_Schiebereg1;
NETWORK
TITLE = Mittelwertberechnung Teil 2
L #Summe_der_Messwerte ;// Ältesten Wert abziehen
L #Messwert_Schiebereg4;
-R;
T #Summe_der_Messwerte;
L 3.0;
/R;
T #Mittelwert_Ausgang;
druu: NOP 0;
END_FUNCTION_BLOCK