# messfehler aus messreihe filtern



## Senator42 (14 Juli 2012)

Ahoi edle Mathematiker !
mir fehlt eine zündende idee:

Das Problem:
Eine Welle wird von 0 auf 359 Grad gedreht. Ein Lasersensor misst dabei den Absand vom Sensor zur Welle. 
Ich muss herausfinden wie Unrund (Schlag) das ganze ist.
Ich speichere also den kleinsten und größten Wert, dazu den betreffenden Winkel.

Es würde funktonieren wenn nicht gelegentlich ein Partikel auf der Welle so arg spiegelt dass der Messwert nicht nutzbar ist.

Reale Werte:
0, 15, 30, 45 .. Grad:
Messwert dazu 
10, 12, 14, 32, 18, 20, 22, 5, 20, 18, 16, 14, 12, 10

Wie kann ich die "unrichten" 32 und 5 herausfiltern.

In einer anderen Welle sind die Werte:
4, 8, 12, 16, 20, 3, 28, 32 36, 32, 28, 44, 20, 16, 12, 8, 4
Die "unrichten" sind hier: 3 und 44

Die Welle dreht kontinuierlich, die Werte werden dabei zyklich gelesen.

Einen Filter der von den letzten 3 Werte nur den Schnitt der 2 nähersten niimmt, habe ich bereits drin.
Nutzt aber nur wenig. Ich könnte 2 oder 3 mal hintereinander auf so ein Partikel treffen.

Von den Wellen kann der Schlag von 0,001 mm bis 0,250 mm sein.
Die Dicke der Welle ist 4 mm. Soll aber auch mit 6 mm funktonieren.

Die Welle gilt als gerade wenn der Schlag unter 0,020 mm ist.

Der Sensor ist auf 0..4 mm Parametriert und liefert 4..20mA in eine S7 Analog-Baugruppe mit 13 Bit alle 2ms.

Die Messung läuft im OB 35 alle 10 ms.

Any Hints?


----------



## Verpolt (14 Juli 2012)

Hallo,



> Es würde funktonieren wenn nicht gelegentlich ein Partikel auf der Welle so arg spiegelt dass der Messwert nicht nutzbar ist.



Ich würde dort ansetzen. Kannst du mit der Beleuchtung etwas ausrichten? Oder vllt. einen 2. Sensor?


----------



## Thomas_v2.1 (14 Juli 2012)

Was du da schon programmiert hast dürfte einem Medianfilter entsprechen, eigentlich ist das für Ausreißer ganz gut geeignet. 

Für die Messwertreihe:
10, 12, 14, 32, 18, 20, 22, 5, 20, 18, 16, 14, 12, 10

gäbe das bei einem Median über 3 Werte:
1: ??, 10, 12 -> 10
2: 10, 12, 14 -> 12
3: 12, 14, 32 -> 14
4: 14, 18, 32 -> 18
5: 18, 20, 32 -> 20
6: 18, 20, 22 -> 20
7: 5, 20, 22 -> 20
8: 5, 20, 22 -> 20
9: 5, 18, 20 -> 18
usw.

Wenn zwei Ausreißer hintereinander kommen ist der Median über 3 Werte zu wenig und muss erweitert werden.

Ob das für deinen Anwendungsfall das richtige ist? Denn die Ausreißer sind doch eigentlich ungültige Messungen.
Ist die Frage wie du mit deinen Augen in den Werten die bestimmte Werte als Ausreißer feststellst? Wahrscheinlich ist es doch so, dass es bei einer Welle nicht möglich ist dass der Schlag einen bestimmten Wert zum vorigen Wert überschreitet. Ich würde die Werte dann einfach als ungültig annehmen. Wenn du viele ungültige Messwerte hintereinander reinkommen, ist keine vernünftige Messung mehr möglich.


----------



## Larry Laffer (14 Juli 2012)

Eine andere Möglichkeit wäre, die Messreihe zu glätten. Hierbei könnte man z.B. zu jedem Wert den (die) Vorgänger und den (die) Nachfolger addieren, durch die Anzahl der jeweiligen Werte dividieren und an der Index-Position wieder speichern.

Dann ergäbe das für die Beispielwerte :
10, 12, 14, 32, 18, 20, 22, 5, 20, 18, 16, 14, 12, 10
in der Wandlung :
10 , 12 -> 11 (1.Wert)
11 , 12 , 14 -> 12 (2.Wert)
12 , 14 , 32 -> 19 (3.Wert)
19 , 32 , 18 -> 23 (4.Wert)
usw.

Eine höhere als die von mir im Beispiel verwendete Glättung würde den Peak noch stärker "rausbügeln" ohne dabei aber zu starken Einfluß auf den Verlauf der Kurve zu haben ...

Gruß
Larry


----------



## ebt'ler (14 Juli 2012)

Hi,

wenn ich die genau Anforderungen an die Prüfung (Schlag bei >0,020mm) anschaue halte ich es für "kritisch" die Werte zu glätten. Dadurch werden die Messwerte unnötig verfälscht (je mehr Ausreißer auftreten, desto kritischer wirkt sich das aus). Was zu einer Fehleinschätzung führen könnte. 

*Spontan* würde ich wie folgt vorgehen:

-> den Schlag der Welle eine gewisse Symmetrie unterstellen (ist in den Vorliegenden Messdaten erkennbar) und darauf hin die Messreihe nach n/2 aufteilen (sie beginnt ja meist bei den kleinsten wert. wenn nicht demnach ausrichten)

10, 12, 14, 32, 18, 20, 22 
5, 20, 18, 16, 14, 12, 10  

-> unterste Messreihen spiegeln:

10, 12, 14, 32, 18, 20, 22 
10, 12, 14, 16, 18, 20, 5

-> Messreihen zusammenfassen: 

10, 10, 12, 12, 14, 14, 32, 16, 18, 18, 20, 20, 22, 5

-> daraus mittels linearer Regression eine Näherungsgrade berechnen und jeweils die Abweichung der einzelnen Messpunkte feststellen. Die Differenz aus dem Mittelwert der Abweichung und der Abweichung eines einzelnen Messpunktes sollte gut auskunft über einen Ausreißer geben.

Hier zwei rustikale Näherungsgraden für die Messreihen (wenn man die Berechnung selbst programmiert kann man dies noch verfeinern und die jeweils zusammengehörigen Messwerte z.b. 10 und 10, 12 und 12 usw. auf ein gemeinsames Argument legen):




-> die so gefundenen Ausreiser kann man dann aussortieren und hat die (wahrscheinlich) unverfälschten Messwerte übrig


PS: gibt natürlich noch Aufwändigere Verfahren. Aber ich denke das wäre ein guter Mittelwert. Ich würde es auf alle Fälle mal probieren.


----------



## Senator42 (14 Juli 2012)

*Grafik*

Das sind schon ein paar gute Ansaätze.

Ergänzung:

Das Material kommt aus dem Härteofen, fällt ich einen "Eimer", vor dort wird es in meine "Richtmaschine" gekippt, erst danach geht es zum Schleifen und Polieren.

Die Messreiche beginnt nicht beim kleisten oder größten Wert.




Die Zacken sollen einfach aus der Krone raus. Der Zacken kann auch die nächsteb 2,3,4 Werte in reihe kommen.
Der Mensch kann das sehr einfach erkennen. Mein Proggi nicht.


----------



## hardwarekiller (14 Juli 2012)

Hallo zusammen,
was haltet ihr von dem Gedankenspiel, den jeweilig neuen Messwert mit dem vorhergehenden zu vergleichen. Überschreitet der neue Wert eine gewisse Abweichung zu seinem Vorgänger, ist er ungueltig und wird nicht in die Messreihe aufgenommen.

Ich könnt mir vorstellen  dass dieser Ansatz nicht so schlecht funktionieren wird, weil es sich ja um eine drehende Welle handelt, bei welcher wie weiter oben zu sehen ein Sinus resultiert....

Ist nur ein Gedankenspiel....


Ich könnte mir auch vorstellen den ungueltigen Messwert aus mehreren seiner Vorgänger zu interpolieren über eine Geradenfunktion....


----------



## Thomas_v2.1 (14 Juli 2012)

Es gibt noch ein anderes Verfahren welches eigentlich aus der Auswuchttechnik kommt. Evtl. könnte das bei dir auch funktionieren, denn die Grundschwingung dürfte bekannt sein. Wenn ich das richtig sehe braucht deine Richtmaschine die Amplitude (wie stark ist die Welle verbogen) und den Phasenwinkel (wo).
Bei Auswuchtmaschinen gibt es dazu das sog. Wattmeterverfahren. Dabei wird das Messsignal mit einem Referenzsignal multipliziert, Mittelwerte gebildet usw.
Ich habe hier ein Buch zur Auswuchttechnik in dem das erläutert ist - allerdings nur mathematisch (sicher was für pat ;-) ). Bei Interesse kann ich die 2 Seiten mal einscannen/abfotografieren.


----------



## ebt'ler (15 Juli 2012)

Also durch das Bild stellt sich die Aufgabenstellung für mich etwas anders dar. 
Vielleicht fehlen auch noch ein paar weitere Informationen.

Mit fällt dazu als Denkanstoß ein:

-> der Vergleich oder das Zusammenrechnen (Mittelwert) benachbarter Messerwerte ist besonders bei aufeinanderfolgenden Fehlwerten kritisch
-> wenn man stückweise Interpolieren möchte sollte eine Abbruchbedingung existieren die bereits eine gewisse Anzahl aufeinanderfolgender Fehlwerte toleriert bzw. erkennt.
-> Man könnte die Periode zweiteilen und durch lineare oder besser quadratische Regression eine gemittelte Funktion bilden und damit die Ausreißer finden (bei linearer Regression werden kleine Ausreißer in den Scheiteln sicherlich nicht genügend erkannt, bei quadratischer könnten eventuell sehr kleine Ausreißer in den "Nulldruchgängen" des Sinus nicht erkannt werden)
-> es ist auch eine Sinus Regression denkbar, wobei man immer betrachten sollte das die Messwerte keinen idealen Sinus (Kreis) bilden, sondern um den gesuchten Schlag abweichen
-> wenn man die Kennwerte der Sinnusschwingung vertrauenswürdig ermitteln kann könnte man entweder die Korrelation zum idealen Verlauf oder alternativ die jeweilige maximale Änderung zwischen zwei Messungen errechnen
-> weiter sind auch digitale Filter denkbar (die nicht zu stark auf eine Mittelwertbildung aufbauen sollten)
-> die Verfahren aus der Auswuchttechnik sind sicher auch äußerst interessant
-> wichtig ist sicher erstmal ein Toleranzband und eine maximale Anzahl an Ausreißer festzulegen umd einzuschätzen ob die Messung dann überhaupt verwertbar ist


Eine Ferndiagnose ist aus meiner Sicht nicht ganz so einfach möglich.

EDIT: Es ist doch zu erkennen, dass in der folgenden Periode die Ausreißer an einer anderen Stelle sitzen, wie wäre es einfach zwei Perioden miteinander zu vergleichen? (mal als Anfang)


----------



## Larry Laffer (15 Juli 2012)

Hallo,
es gäbe dann auch noch die Möglichkeit, die von mir vorgeschlagene Glättung von den original aufgezeichneten Werten zu subtrahieren. Als Ergebnis erhältst du dann die Peaks in (mehr oder weniger) Reinform - wenn du davon dann ggf. noch die Absolutwerte nimmst hast du deine Ausreisser dann sogar als positven Wert.. Für eine andere Messaufgabe habe ich so etwas schon mit gutem Erfolg gemacht.

Gruß
Larry


----------



## van (15 Juli 2012)

Senator42 schrieb:


> Eine Welle wird von 0 auf 359 Grad gedreht. Ein Lasersensor misst dabei den Absand vom Sensor zur Welle.


Mich würde da einmal dein Messaufbau interessieren, da ich evt. demnächst eine "Ähnliche" Aufgabe lösen muss.
Und habe mir dafür ein Laser Lichtband von micro-epsilon ausgesucht.



Senator42 schrieb:


> Es würde funktonieren wenn nicht gelegentlich ein Partikel auf der Welle so arg spiegelt dass der Messwert nicht nutzbar ist.


Wie sieht den dieser Partikel aus?
Könnte man den vor der Messung entfernen, reinigen?


----------



## Senator42 (15 Juli 2012)

> Wie sieht den dieser Partikel aus?
> Könnte man den vor der Messung entfernen, reinigen? 				

stell dir eine stahlplatte vor. geh mit dem sandtrahler drüber.
es sind wohl eher keine partikel, sondern reflexionen die den laser-entfernungs-messer "verwirren".
ein partikel würden den selben messfehler generieren.

ach, die maschine soll die wellen geraderichten indem abh. vom schlag mit einem stempel drauf gedrückt wird. wie schnell, lange und wieviel (weg/kraft) ist aber ne andere geschichte.

ein mensch braucht mit einer handhebelvorrichtung etwa 15 .. 30s, die maschine solls in 4 schaffen.


----------



## van (15 Juli 2012)

Senator42 schrieb:


> > Wie sieht den dieser Partikel aus?
> > Könnte man den vor der Messung entfernen, reinigen?
> 
> stell dir eine stahlplatte vor. geh mit dem sandtrahler drüber.
> ...


ok, eine unebene Bauteiloberfläche kann man nicht einfach wegreinigen.

Aber vielleicht ist dann auch die kleine punktuelle messen auf der raunen Oberfläche nicht die ideale Lösung. 

Bevor man aufwendig die Messwerte schön rechnet vielleicht das Problem eine Stufe früher angehen.

Bei einem Laser-Lichtband würde man den Schattenwurf der Welle  auswerten. Eventuell gibt es auch induktive Abstandssensoren die genau  genug sind für deine Messung.


----------



## Thomas_v2.1 (15 Juli 2012)

Ich hänge mal die Beschreibung des Messverfahrens bei Auswuchtmaschinen an.
Außerdem habe ich die Formeln zusammen mit einer Testsignalreihe in eine Exceltabelle gepackt. Die Ergebnisse der Analyse befinden sich in Zellen Q9 für die Amplitude und in Q14 für die Phasenlage.
Sehr gut funktioniert das Verfahren bei überlagerten periodischen Schwingungen. Bei einzelnen Peaks ist das Ergebnis zwar nicht mehr ganz so gut, aber im Beispiel habe ich mal eine dicke Störung auf den obersten Punkt der Schwingung des Messsignals gelegt, und trotzdem ist die Erkennung der Amplitude noch einigermaßen brauchbar.
Ein Vorteil an dem Verfahren ist der Wegfall von händisch einzustellenden Parametern zur Messwertglättung o.Ä.


----------



## J Schohaus (16 Juli 2012)

Hallo 

Ich würde versuchen den Sprung mit deinem Programm auszuwerten.
Also als erstes die Differenz zum Vorherigen Wert ermitteln.
Ist diese Differenz Größer als erwartete ist der neue Wert Falsch und muss ignoriert werden.

Dein Beispiel:
10, 12, 14, 32, 18, 20, 22, 5, 20, 18, 16, 14, 12, 10

Differenz zum vorherigen Wert .
??, 2, 2, 18, -14, 2 ,2 ,-17 ,15 , -2 ,-2 ,-2 ,-2 ,-2

Dieses ist jetzt auch vom Programm einfach zu erkennen das der Wert 18 und -17 Fehlerhaft ist.

Wenn diese Werte ignoriert werden würde danach das Ergebnis so aussehen.
??, 2, 2,! , 4, 2 ,2 ,! ,-2 , -2 ,-2 ,-2 ,-2 ,-2

mfG Jochen


----------



## Thomas_v2.1 (18 Juli 2012)

Und, gibts was von der Inbetriebnahmefront zu berichten welche Lösung funktioniert?

Wenn man in dem konkreten Anwendungsfall die Messwerte mit einem Tiefpass/Mittelwert glätten will, ist hier zu beachten dass man dadurch eine Phasenverschiebung generiert. Da die Grundfrequenz des Messsignals aber immer gleich sein sollte, könnte man diese Verschiebung bei bekannten Filterparametern später wieder herausrechnen.


----------



## Senator42 (19 Juli 2012)

ich mach es jetzt so:
1. datenreihe mit den messwerten
2. datenreihe mit filterwerten:

filterwert[0]  =  ( messwert[0] + messwert[1] )  /  2
danach bis zum ende:  Loop  i=1 to cnt-1
wenn ABS(messwert_  - messwert[i-1]) < grenzwert dann  filterwert = messwert
sonst   filterwert = filterwert[i-1]

also ich nehm den vorigen filterwert wenn ein hüpfer drin ist.

mag sein dass ich gleich am anfang etwas daneben liege, habe momentan aber noch andere probleme._


----------



## Senator42 (21 Juli 2012)

Die Grafik zeigt jetzt Orginalwerte (libnodave + VB +  .csv) nach einer Drehung um 360 Grad.
Abtastung (Laser-Distanz-Sensor) etwa alle 8,5 Grad.
Danach 2 mm waagerecht eine neue Position angefahren und nochmal 360 Grad gemessen.
Die beiden grossen Zacken kommen von einem Mikrokratzer der schräg läuft.
Die kleineren Zacken kommen von der Welle die, naja, etwas rauh ist.
Mit einem mechanischen Abtaster kommt ein Schlag von 35 µm heraus.
Der Laser sagt -10 .. 45 µm. Wegen den Helligkeitsunterschieden (rauhe 'Fläche') kann es der
Laser (Triangulationsverfahren) nicht besser.




Ich muss also jetzt die größten Zacken ignorieren, und das min/max mit 0.x multiplizieren um auf meinen Schlag zu kommen. 
Dass dabei der Messwert bei grösseren Schlägen nicht stimmt ist egal, weil:
Wenn ich weiss wo der 'Berg 'ist, wird dort mit einem Drücker draufgedrückt um die Welle geradezurichten. Gerade ist wenn der Schlag unter 30µm ist.

Irgenwelche pragmatische Tipps?


----------



## Thomas_v2.1 (21 Juli 2012)

Kannst du die CSV-Datei mit den Messwerten mal anhängen? Dann kann man mit den Werten mal etwas experimentieren., auch wenn 42 Werte pro Umdrehung etwas grob ist.


----------



## Senator42 (21 Juli 2012)

anhang als zip


----------



## Larry Laffer (23 Juli 2012)

Anhang anzeigen 17929

Ich habe das Ganze mal mit dem von mir beschriebenen Verfahren, allerdings mit einer weit höheren Glättung (4 Werte vorher,4 Werte nachher) bearbeitet.
Die erste Wertespalte sind die Originalwerte, die 2.Spalte die Glättung und die 3.Spalte die Absolut-Differenz.
Kannst du damit etwas anfangen ?

Auf jeden Fall wäre es aber schon gut, ein paar mehr Werte für den Vollkreis zu haben ...

Gruß
Larry


----------



## Senator42 (23 Juli 2012)

hi,
kannste das exl mal anhängen?


----------



## knarf (24 Juli 2012)

Hallo Senator,
suche einmal unter Ausreißertest. Mit diesem statistischen Verfahren kannst Du aus einer Messreihe Ausreißer mit einer statistischen Sicherheit herausfiltern. Ich habe dies schon einmal in einer Allen-Bradley SPS realisiert und die Ergebnisse waren nicht so schlecht.

Gruß Frank


----------



## Larry Laffer (24 Juli 2012)

Hallo,
da das nur testweise war ist der Code natürlich ein bißchen "quick-and-dirty" - ich denke dennoch, dass du etwas daraus ersehen kannst und ihn wahrscheinlich auch verstehst ...

```
Sub Mittelwert_1()
a = 2
e = 43
gl = 4
For i = a To e
   wert = 0: anz = 0
   For j = (i - gl) To (i + gl)
      If (j >= a) And (j <= e) Then
        wert = wert + Cells(j, 1)
        anz = anz + 1
      End If
   Next
   Cells(i, 2) = wert / anz
Next

'Differenz-Kurve bilden
For i = a To e
   Cells(i, 3) = Abs(Cells(i, 1) - Cells(i, 2))
Next
End Sub
```
Gruß
Larry


----------



## Senator42 (25 Juli 2012)

ist ja lustig, genau so eine funktion hab ich seit vorgestern schon drin.
mit 2 davor + danach; statt 4

und am ende statt
  Cells(i, 3) = Abs(Cells(i, 1) - Cells(i, 2))
habe ich
  Cells(i, 3) = Cells(i, 1) wenn der abstand passt; sonst Cells(i, 2)

mals sehn wass besser funktioniert.

ich berichte vom ergebnis.
habe jetzt auch wieder mehr werte in der tabelle, ca. 80.


----------



## Senator42 (10 August 2012)

Ich habe nun die folgende Lösung implementiert und das hat den besten Erfolg.
Mit Ausgabe der Werte in einem VB-Programm stellte sich heraus, 
daß der Lasersensor den größten "Fehler" hatte.
Jetzt ist ein anderer Sensor eingebaut.

danke für die Unterstützung.



Larry Laffer schrieb:


> Hallo,
> da das nur testweise war ist der Code natürlich ein bißchen "quick-and-dirty" - ich denke dennoch, dass du etwas daraus ersehen kannst und ihn wahrscheinlich auch verstehst ...
> 
> ```
> ...


----------

