-> Hier kostenlos registrieren
Hallo,
für eine Messwertaufbereitung benötige ich einen Median-Filter, damit Ausreißer nicht so ins Gewicht gehen.
Die Messwerte werden über eine For-Schleife eingelesen und dass Array dann sortiert. Bei den Messwerten handelt es sich um Real-Werte (wären vielleicht skalierte INt-Werte besser --> weniger Speicher?). Der Median wird dann an den Ausgang übergeben.
Es scheint mit 21 Werten ganz gut zu funktionieren, aber das Fenster müsste vergrößert werden. Wenn z.B. mit 201 Werten gearbeitet werden soll, macht die WAGO 750-872 PLC nichts mehr. Gibt es vielleicht irgendwo einen Median-Filter in einer freiverfügbaren Bibliothek, der getestet wurde?
Hier mal der Code:
PROGRAM Filter
VAR
MessSignal:REAL; (*Eingang*)
Count: INT;
ValueArray: ARRAY [0..20] OF REAL;
myCount: INT;
k: INT;
l: INT;
Value: REAL;
FilterSignal:REAL; (*Ausgang*)
END_VAR
IF Count>20 THEN Count:=1; END_IF
FOR Count:=1 TO 21 DO
ValueArray[Count-1]:=MessSignal;
myCount:=myCount+1;
END_FOR;
FOR k:=1 TO 20 DO
FOR l:=1 TO 21 DO
IF ValueArray[k-1]>ValueArray[l-1]
THEN
Value:=ValueArray[k-1];
ValueArray[k-1]:=ValueArray[l-1];
ValueArray[l-1]:=Value;
END_IF
END_FOR
END_FOR
IF k>20 THEN
(*YValue:=;*)
FilterSignal:=ValueArray[10];
k:=1;
l:=1;
END_IF
Vielleicht hat jemand ja schon mal so einen Filter benutzt und kann mir helfen? Vielen Dank,
Ossi
für eine Messwertaufbereitung benötige ich einen Median-Filter, damit Ausreißer nicht so ins Gewicht gehen.
Die Messwerte werden über eine For-Schleife eingelesen und dass Array dann sortiert. Bei den Messwerten handelt es sich um Real-Werte (wären vielleicht skalierte INt-Werte besser --> weniger Speicher?). Der Median wird dann an den Ausgang übergeben.
Es scheint mit 21 Werten ganz gut zu funktionieren, aber das Fenster müsste vergrößert werden. Wenn z.B. mit 201 Werten gearbeitet werden soll, macht die WAGO 750-872 PLC nichts mehr. Gibt es vielleicht irgendwo einen Median-Filter in einer freiverfügbaren Bibliothek, der getestet wurde?
Hier mal der Code:
PROGRAM Filter
VAR
MessSignal:REAL; (*Eingang*)
Count: INT;
ValueArray: ARRAY [0..20] OF REAL;
myCount: INT;
k: INT;
l: INT;
Value: REAL;
FilterSignal:REAL; (*Ausgang*)
END_VAR
IF Count>20 THEN Count:=1; END_IF
FOR Count:=1 TO 21 DO
ValueArray[Count-1]:=MessSignal;
myCount:=myCount+1;
END_FOR;
FOR k:=1 TO 20 DO
FOR l:=1 TO 21 DO
IF ValueArray[k-1]>ValueArray[l-1]
THEN
Value:=ValueArray[k-1];
ValueArray[k-1]:=ValueArray[l-1];
ValueArray[l-1]:=Value;
END_IF
END_FOR
END_FOR
IF k>20 THEN
(*YValue:=;*)
FilterSignal:=ValueArray[10];
k:=1;
l:=1;
END_IF
Vielleicht hat jemand ja schon mal so einen Filter benutzt und kann mir helfen? Vielen Dank,
Ossi