Codesys Neigungssensor Dämpfen

Manuel1995

Level-1
Beiträge
32
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
ich habe folgendes Problem. Ich habe einen Neigungssensor verbaut, welcher zwischen mehreren Werten springt.
Um die Messung genauer zu machen wollte ich eine Dämpfung programmieren und bin dabei auf den Baustein FILTER_MAV_W in der Oscat lib gestoßen.
Beschreibung im Anhang. Ich habe diesen dann benutzt, oder wollte es jetzt springen die Werte noch mehr als zuvor.
Kann mir jemand sagen was ich falsch gemacht habe? Dazu der weitere Anhang ein auszug des Codes.
Vielen Dank schonmal :)
PS: bin auch gern offen für einen anderen Lösungsansatz
 

Anhänge

  • Beschreibung.PNG
    Beschreibung.PNG
    96,1 KB · Aufrufe: 26
  • Frage_Filter.PNG
    Frage_Filter.PNG
    22,3 KB · Aufrufe: 30
Ich kenne mich mit der Materie leider nicht aus, aber mir sind ein paar Dinge aufgefallen. Du nutzt lediglich 5 Messwerte für die Berechnung, wie verhält sich der Filter denn bei mehr Werten?
Schwankt der Wert denn wirklich jeden Zyklus? Falls nicht wird der Filter mit 5 Werten auch nicht wirklich etwas bringen.
Dann sind Deine Ausgangsbegrenzungen eventuell vertauscht Min ist 15 und Max -15, allerdings hat das nichts mit dem Filter zu tun.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Machche Hardware, wie zum Beispiel die Beckhoff-Klemmen, habe solche Filter bereits Onboard und der muss nur über eine CoE-Parameter aktiviert werden.

ODER

2. Mache Dir einen Ringpuffer als Array of [IO-DatenTyp] und schreibe die Werte je Zyklus in den Puffer, wobei du immer je Zyklus den Index um 1 erhöhst Am EOA (End of Array) setzt du den Index wieder auf den Startwert. Dann addierst Du immer das gesamt Array zusammen und teilst die Summe durch die Anzahl der Array-Elemente. Das Ergebnis ist der Durchschnittswert und der ist um so beruhigter und träger, je mehr Array-Element Du hast. Eine Bibliothek braucht man für so etwas nicht.
 
Zuletzt bearbeitet:
die Werte passen so :) das mit den 5 habe ich auch schon bedacht mit größerem Wert steigt allerdings das Ergebnis immer weiter..
 
Ich tue mich immer schwer mit solchen Bausteinen, deren "Innenleben" ich nicht kenne ...
Was ich hier schon komisch finde ist, das der IN-Parameter vom Typ WORD ist - was ist denn, wenn dein Neigungswert um Null herum schwankt. Hier würde dein WORD dann problematisch werden. Des weiteren befürchte ich, dass beim Innenleben des Bausteins auch schnell ein Überlauf entstehen kann ...

Ganz generell funktioniert eine Glättung eigentlich so :
Code:
geglätteter_Wert := ((Glättung * letzter_Wert) + aktueller_Wert) / (Glättung +1) ;
letzter_Wert := geglätteter_Wert ;

// Glättung ist hier dein Faktor
// letzter_Wert ist der Wert der letzten Berechnung und sollte eine statische Variable sein
// geglätteter_Wert ist dein Ausgangswert
// sinnvoll ist es hier bei der Berechnung mit DINT oder REAL zu arbeiten - also entsprechende Konvertierungen durchzuführen ...

Gruß
Larry
 
Entsprechend deines Code-Schnipsels würde ich das aber anders interpretieren ...
Danach entspräche 500 dann dem Wert von 15° und 9500 dem Wert von -15°.
Ganz generell würde ich hier den Eingangswert erstmal umrechnen - in dem Fall zu einem REAL und diese dann anschließend glätten (ggf. mit der Formel von mir) ...

Aber es ist ja dein Spiel 8)

Gruß
Larry
 
Hey deine Antworten sind echt gut :) kurz bevor ich sie gelesen habe ist mir aber ein ganz simpler lösungsansatz eingefallen der funktioniert glücklicherweise :) .
Ich habe den Eingangswert beobachtet dieser springt maximal um 15 also habe ich einfach folgende Abfrage eingebaut.

IF (Eingang1.VALUE > SensorLInput + 20) OR (Eingang1.VALUE < SensorLInput - 20) THEN
SensorLInput := Eingang1.VALUE;
END_IF

das funktioniert super :)
 
Das hätte3 ich jetzt so nicht gemacht ...
Das dein Eingangswert um +/- 15 schwankt halte ich für gar nicht dramatisch. Das liegt sehr wahrscheinlich an der recht niedrigen Auflösung des Sensors oder der Analogkarte.
Ich würde dieses "Ausblenden" nicht machen - teste doch mal meinen Ansatz im Beitrag #7 - also erst Wandeln und dann Glätten ... und am Ende vielleicht mal mit der Glättung "spielen". Da wirst du sehr wahrscheinlich auf viel plausiblere Werte kommen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
rGlaettung : REAL := 0.5;
rLetzterWert : REAL;
rGeglaetteterWert : REAL;

rGeglaetteterWert := ((rGlaettung * rLetzterWert) + WORD_TO_REAL(Eingang1.VALUE) / (rGlaettung + 1);
rLetzterWert := rGeglaetteterWert;

sorry will echt nicht nerven aber mach das ganze noch nicht lange und habe nicht studiert oder so..
meinst du so?
 
Moin Manuel1995,

rGlaettung : REAL := 0.5;
rLetzterWert : REAL;
rGeglaetteterWert : REAL;

rGeglaetteterWert := ((rGlaettung * rLetzterWert) + WORD_TO_REAL(Eingang1.VALUE) / (1.0 - rGlaettung);
rLetzterWert := rGeglaetteterWert;

sorry will echt nicht nerven aber mach das ganze noch nicht lange und habe nicht studiert oder so..
meinst du so?

es handelt sich um einen Tiefpassfilter.

Der Faktor rGlaettung ist ein Wert zwischen 0.0 und 1.0. Also xter Teil des Wertes.

rLetzterWert + WORD_TO_REAL(Eingang1.VALUE) muss 100% des Wertes ergeben.

z.B. 90%*rLetzterWert + 10%*WORD_TO_REAL(Eingang1.VALUE) => 100%*rGeglaetteterWert

Deswegen muss die Berechnung auch 1.0 - rGlaettung heißen.

VG

MFreiberger
 
rGlaettung : REAL := 0.5;
rLetzterWert : REAL;
rGeglaetteterWert : REAL;

rGeglaetteterWert := ((rGlaettung * rLetzterWert) + WORD_TO_REAL(Eingang1.VALUE) / (rGlaettung + 1);
rLetzterWert := rGeglaetteterWert;

sorry will echt nicht nerven aber mach das ganze noch nicht lange und habe nicht studiert oder so..
meinst du so?

Die Formel ist so OK ... und der Wert der Glättung sollte kein Dezimalbruch sein sondern eine Zahl zwischen 5 und 100 (so über den Daumen). Das heißt dann das der vorherige Wert mit dem Faktor "Glättung" in die Bewertung eingeht - also z.B.
(10 * letzter_Wert + neuer_Wert) / 11 // 11 deswegen, weil dies die Anzahl der Werte in deiner Bewertung ist ...

Gruß
Larry
 
hab das jetzt genau so eingegeben mit 1.0- glättung da kam aber dann ein winkel von 6 heraus da war das vorher deutlich besser.
Der Sensor schwankt immer so um 0,3 +- rum.
 
Ach ja ... und ich würde Eingang1.Value erst einmal in deinen Wunschbereich konvertieren und nicht einfach zu einem REAL machen. Das macht das Beobachten dann auch VIEL einfacher ...

Gruß
Larry
 
Zurück
Oben