Bandpassfilter programmieren

Jo-Janzen

Level-1
Beiträge
43
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Ich bin auf der Suche nach einer Lösung für einen Bandpassfilter.
Ich habe ein verrauschtes Signal und habe zunächst versucht einen PT1 Filter anzuwenden, mit folgendem Algorithmus in SCL :

Ausgang_Neu = Ausgang_Alt*exp(2*PI*fg*T) + Eingang*( 1 - exp(2*PI*fg*T) )

Das Ergebnis ist aber nicht zufriedenstellend. Nach einer FFT-Analyse konnte ich festellen, dass ein Bandpassfilter optimal wäre.
Nur leider finde ich nirgendwo eine einfache Formel/ Code für einen Bandpassfilter.
Die meisten Formeln die ich gefunden habe, arbeiten in z-Bereichen und so weiter. Aber da kenn ich mich nicht so aus und es wäre zu Zeitaufwändig
mich einzuarbeiten.
Hat da einer vielleicht einen Hinweis? Gibt es nicht schon fertige Funktionsbausteine in S7?

Gruß
Johann
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also ich habe einen Weggeber.(MTS-Stab) mit 1um Auflösung. Es werden Geschwindigkeiten von 0.05- 0.3 mm/sek gefahren.
Der Weggeber erfährt mechanische Vibrationen der Anlage, die nicht verhindert werden können. Und bei solch langsamen Geschwindigkeiten sind die Vibrationen deutlich im Positionssignal zu sehen.
Das Geschwindigkeitssignal schwankt dabei (stochastisch) um +- 5%. Das meine ich dabei mit "Rauschen". Ich benötige aber ein
sauberes Signal.Dafür habe ich eine FFT in excel durchgeführt. Der zeigt mir an, dass ich im Prinzip alle Frequnez drin habe.


FFT.jpg


Mit einem PT1 filter und Grenzfrequenz von 0.8Hz habe ich das Signal schon gut säubern können, aber wenn man sich die FFT anschaut, dann sind ja noch sehr viele Frequnzen unterhalb den 0.8Hz drin.
nun dachte ich einen Bandpassfilter einzupflegen mit den Grenzfrequenzen in denen die FFT-Beträge sehr klein sind.
hier z.b. um 0.9375 Hz herum. Das ist mein Gedanke gewesen, bin mir aber auch nicht sicher ob das so funktioniert.
(Bin Neuling auf dem Gebiet der Signalverarbeitung).
Die PT1 Formel ist ja recht einfach und es muss doch auch eine einfache Formel für einen Bandpass geben.
 
Hallo Johann,

einfache Lösungen sind immer die besten. ;)

Meine Ansatz wäre auch ein Tiefpassfilter. Bei einem Bandpass würdest du doch im Stillstand keine Werte mehr bekommen!?

Allerdings würde ich alle Messwerte per Zeiger in einen umlaufenden Puffer schreiben. Das bedeutet, ein neuer Wert überschreibt immer den ältesten. Vom Puffer wird die Summe gebildet, geteilt durch die Anzahl der Pufferplätze.

Wenn das Signal nicht „ruhig“ wird, kann man die Anzahl weiter erhöhen, bis die Aktualisierung zu träge wird.

Um welchen Prozess handelt es sich denn?
Wenn der tatsächliche Geber mit allem darum schwingt, ist das dann kein Problem?

Gruß
Chräshe
 
Hallo Chräshe!

Warum bekommt man denn keine Werte mehr bei Stillstand?

Eine Mittelwertbildung, so wie du das vorschlägst ist mir zu träge. Ich möchte ein sauberes Signal mit relativ wenig Verzögerungen.

Es handelt sich um ein Geschwindigkeitsregelkreis einer Strangpresse.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In welcher Rate kannst du deine Messwerte denn überhaupt aktualisieren? Mal angenommen du liest deine Messwerte im 100ms Zyklus ein, bringt dir ein Filter 1. Ordnung mit Grenzfrequenz bei 0,8 Hz nicht sonderlich viel.
Ein einfacher Ansatz für einen Bandpass ist zwei Tiefpassfilter zu nehmen und die Ausgangsgrößen voneinander abzuziehen. Oder eben einen Hoch- und Tiefpassfilter zu verwenden.
Wenn es vernünftig werden soll, würde ich aber einen FIR-Filter nehmen und mir die Koeffizienten mit einem entsprechenden Tool berechnen lassen.
 
ja 100 ms Zyklus lese ich ein. aber warum habe ich trotzdem gute Ergebnisse wenn ich den PT1 filter nutze?
Was haben die FIR-Koeffezienten für eine Bedeutung? Das ist doch nur ein Faktor für die Gewichtung des jeweiligen Samplewertes, oder nicht?
Muss man die nicht selber bestimmen?
Das mit den 2 Tiefpassfiltern ist eine gute Idee. Aber wie du schon sagst, will ich das schon vernünftig machen. Was hälst du von IIR?
 
Wie Thomas das bereits schon sagte, wichtig ist die Aktualisierungszeit! Was hast Du für einen SPS-Zyklus, bzw. falls Du mit nem OB35 arbeiten willst, wie schnell bekommst Du Deine Position? Ich glaube nicht das Du es schaffen wirst in einem Zyklus gut von schlecht zu trennen, dazu sind mehrere IST-Werte nötig. Eine Mittelwertberechnung wird es schon werden müssen. Wie wär es mit einer statistischen Mittelwertsberechnung? Man nehme eine Hand voll Messwerte, sortiere die der Größe nach und in der Mitte des Haufens liegt dann der Durchschnittswert!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich arbeite mit dem OB 35.
Wenn ich 5 Messwerte a 100ms für die Mittelwertbildung nehme , dann habe ich doch schon 0,5 sekunden Verzögerung. bei meiner jetzigen Anwendung wäre das noch ausreichend. Aber ich möchte auch eine Lösung für schnellere Geschwindigkeiten parat haben, um schnell auf Änderungen
reagieren zu können.
 
Was hast Du eigentlich für einen Antrieb bzw. Mechanik dahinter? Bei einem Servo könntest Du versuchen die Steifigkeit zu erhöhen um von vorn herein einen stabileren Positionswert zu erhalten!
 
Bei einem FIR-Filter steckt die Charakteristik in den Filterkoeffizienten. Darum gibt es dazu Programme die diese Werte berechnen, oder Tabellen (z.B. aus dem Tietze-Schenk) in denen diese Werte für verschiedene Typen aufgelistet sind. Mit den mathematischen Kenntnissen kann man das auch zu Fuß berechnen. Ich kann es leider nicht, meine Filterkenntnisse kommen eher aus dem analogen Bereich.
Das was viele als gleitenden Mittelwert z.B. über 5 Werte programmieren, ist quasi ein FIR-Filter bei dem alle Werte gleich gewichtet werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
es ist eine Hydraulische Axialkolbenpumpe--> Hydraulikantrieb.
Also kein Servomotor. nur über DASM aus den 80er Jahre.
Also ich beschäftige mich gerade intensiv mit FIR und IIR.
Aber ich verstehe nicht wie oder wo Grenzfrequnzen angegeben werden. Man gewichtet irgendwie nur die Eingangssignale auf den alten Ausgangsignal über die Koeffizienten.
Aber dadurch werden meinem Verständnis nach , doch noch keine Frequenzen gefiltert?
 
Die PT1-Formel ,die ich am Anfang erwähnte, die ich angwendet habe: Das müsste dann doch ein IIR-Filter sein?
Und die Koeffizienten sind exp(2*PI*fg*T) oder nicht?
 
Warum bekommt man denn keine Werte mehr bei Stillstand?
Hallo Johann,

ich dachte, es geht dir um die Position. Wenn du nur ein gewisses Frequenz-Band passieren lässt, kommt im Stillstand nichts mehr an. Wenn deine Berechnungen und Filter auf die Geschwindigkeit aufsetzen, wäre das ja OK.

Wieso beschränkst du die Anzahl der Messungen mit dem OB35?

Ich wäre mal von einem „Weißen Rauschen“ ausgegangen und dann spielen kleine Schwankungen der Programm-Laufzeit keine große Rolle. Angenommen die Zykluszeit liegt irgendwo bei 5ms, dann kannst du wenn 0,5s nicht zu träge ist den „Gleiteden Mittelwert“ über 100 Messungen bilden. Das sollte das Signal deutlich glätten!

Alternativ könntest du den Gleiteden Mittelwert nur über 15 Messungen bilden und in die eine Fahrtrichtung nur die Spitzenwerte, in der Gegenrichtung nur Minimalwerte verwenden...

Gruß
Chräshe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einen IIR oder FIR Filter in S7 zu programmieren ist vom Grundsatz her kein Thema.
Habe dies vor einiger Zeit schon mal gemacht.
Um dies aber mit einem vernünftigen Aufwand hinzubekommen, muss dies unbedingt in SCL umgesetzt werden. Die Filterkoeffizienten müssen extern berechnet werden.
Ich mache dies mit MathCAD oder MatLab.

Die Frage ist, ob dies bei der hiesigen Problemstellung überhaupt dienlich ist.
Ein Mittelwertbildung führt grundsätzlich zu Abweichungen und wäre mir zu ungenau. Als grobe Anfangslösung OK, aber sonst zu ungenau.
Ein Bandpass macht nur bei der Geschwindigkeitsermittlung Sinn, da die absolute Position bei Anlagenstillstand herausgefiltert wird (v=dx/dt).
Ein zusätzlicher Schingungssensor, der die Schwinungen der Anlage aufnimmt, die auf den Positionssensor einwirken wäre evtl. eine Lösung.
Anhand der ermittelten Schwinungen könnte man mit einem adaptiven Filter die Störungen aus dem Positionssignal filtern.
Dies wird z.B. auch bei Kopfhörern und Mikros für Piloten so gemacht. Der Umgebungslärm des Flugzeugs wird aufgenommen und vom Stimmsignal des Piloten gewissermaßen "subtrahiert" (active noise cancelling). Nur auf diese Weise wird die Stimme des Piloten verständlich. Ein anderes Beispiel sind aktive Noise Cancelling Kofphörer. Dies in S7 umzusetzten wird aber schon aufwändig.

Gibt es keine Möglichkeit des Positionssensor von der Anlage schwingungstechnsich zu entkoppeln? Wäre denkbar unaufwändiger.
 
Hallo Johann,

Wieso beschränkst du die Anzahl der Messungen mit dem OB35?
Weil, bei 10 ms Zyklus da haben die Vibrationen noch stärkeren Einfluss auf das Positions-Geschwindigkeitssignal.



Ich wäre mal von einem „Weißen Rauschen“ ausgegangen und dann spielen kleine Schwankungen der Programm-Laufzeit keine große Rolle. Angenommen die Zykluszeit liegt irgendwo bei 5ms, dann kannst du wenn 0,5s nicht zu träge ist den „Gleiteden Mittelwert“ über 100 Messungen bilden. Das sollte das Signal deutlich glätten!
Da hast du recht, aber ich würde schon gerne die 0,5 sekunden reduzieren.

Alternativ könntest du den Gleiteden Mittelwert nur über 15 Messungen bilden und in die eine Fahrtrichtung nur die Spitzenwerte, in der Gegenrichtung nur Minimalwerte verwenden...
Könntest du mir das genauer erklären?
 
Einen IIR oder FIR Filter in S7 zu programmieren ist vom Grundsatz her kein Thema.
Die Frage ist, ob dies bei der hiesigen Problemstellung überhaupt dienlich ist.
Ein Mittelwertbildung führt grundsätzlich zu Abweichungen und wäre mir zu ungenau. Als grobe Anfangslösung OK, aber sonst zu ungenau.
Ein Bandpass macht nur bei der Geschwindigkeitsermittlung Sinn, da die absolute Position bei Anlagenstillstand herausgefiltert wird (v=dx/dt).
Ein zusätzlicher Schingungssensor, der die Schwinungen der Anlage aufnimmt, die auf den Positionssensor einwirken wäre evtl. eine Lösung.
Anhand der ermittelten Schwinungen könnte man mit einem adaptiven Filter die Störungen aus dem Positionssignal filtern.
Dies wird z.B. auch bei Kopfhörern und Mikros für Piloten so gemacht. Der Umgebungslärm des Flugzeugs wird aufgenommen und vom Stimmsignal des Piloten gewissermaßen "subtrahiert" (active noise cancelling). Nur auf diese Weise wird die Stimme des Piloten verständlich. Ein anderes Beispiel sind aktive Noise Cancelling Kofphörer. Dies in S7 umzusetzten wird aber schon aufwändig.

Gibt es keine Möglichkeit des Positionssensor von der Anlage schwingungstechnsich zu entkoppeln? Wäre denkbar unaufwändiger.

Ok. Es geht mit dem Bandpassfilter gar nicht. Danke, dann kann ich mir das ersparen.
Das mit dem adaptiven Filter habe ich schon probiert.
Ich habe einen 2. Positionsmagneten (Geber) auf dem MTS-Stab angebracht. Beide Magneten sollten dabei die selben Vibrationen erfahren .
Damit wollte ich die Vibrationen vom losen Magneten von dem fahrendem Magneten subtrahieren um ein Vibrationsfreies Signal zu erhalten.
Das Ergebniss war, dass in der Praxis die beiden Magneten unterschieldich auf die Vibrationen reagieren. Die Amplitudenhöhe-und dauer waren meist unterschiedlich. Von der Tendenz passte es schon, aber im feinem hat man doch die Unterschiede gesehen.

Mechanisch kann man den Sensor nicht ohne Weiteres Vibrationsfrei anbringen, weil alles im Umfeld der Anlage vibriert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe mir den Thread und auch deine FFT mal angesehen ...
Dazu habe ich noch ein paar Fragen :
1.) Wie kommt den der Messwert deines Wegaufnehmers in deine Steuerung ? Analog oder als (wie hoch auflösender ?) Digitalwert ?
2.) Bist du dir hinsichtlich der Abtastfrequenz deiner Steuerung sicher, dass du die Messwerte wirklich in der Frequenz erhälst und einliest ? Was ist deine Hardware ?
3.) Bist du dir hinsichtlich der ermittelten FFT sicher, dass du in dem kleinen Frequenzband und mit der daraus abgeleiteten Aussage überhaupt einen sinnvollen Rückschluß von Sinn- und Störsignalen treffen kannst ?

Aus dem Bauch heraus würde ich mich hier auch für eine gleitenden Mittelwertbildung entscheiden - es würden mich aber dennoch die Antworten auf die Fragen interessieren ...

Gruß
Larry
 
Hallo,
ich habe mir den Thread und auch deine FFT mal angesehen ...
Dazu habe ich noch ein paar Fragen :
1.) Wie kommt den der Messwert deines Wegaufnehmers in deine Steuerung ? Analog oder als (wie hoch auflösender ?) Digitalwert ?

Es kommt in digitaler Form mit einer Auflösung von 1 um


Hallo,
2.) Bist du dir hinsichtlich der Abtastfrequenz deiner Steuerung sicher, dass du die Messwerte wirklich in der Frequenz erhälst und einliest ? Was ist deine Hardware ?
3.) Bist du dir hinsichtlich der ermittelten FFT sicher, dass du in dem kleinen Frequenzband und mit der daraus abgeleiteten Aussage überhaupt einen sinnvollen Rückschluß von Sinn- und Störsignalen treffen kannst ?
Nein bin mir nicht sicher. Also ich lese bisher mit der CPU 313C alle 100 ms ein. Mit einem SPS-Analyzer zeichne ich auf. Die Werte aus dem
Analyzer exportiere ich mit Intervall von 100 ms in eine Exceltabelle. Mit der Excel mache ich die FFT. Und das FFT-Bild bis 10 Hz kam dabei heraus.
Wenn ich das ganze mit 10 ms mache, dann wird eine FFT bis 100Hz dargestellt. Die Werte (0-10Hz) aus beiden FFT passen weitgehend überein.
Deshalb denke ich schon, dass die FFT richtig ist. Ich deute die FFT so, dass die Frequenzen mit niedriger Amplitude eher die nur Nutzsignale darstellen und Frequenzen mit hoher Apmlitude stellen die Nutzsignale mit Störsignale dar. Ist doch so richtig oder?

Als ich mit dem PT1-filter experimentierte habe ich bei einer Grenzfrequenz von fg= 0,8 ein relatives gutes Ergebniss erhalten.
Daraus habe ich Rückschlüsse gezogen, dass man mit geeigneten Grenzfrequnzen die Störsignale elemenieren kann.
Aber beide deiner Fragen muss ich mit Nein beantworten.
 
Also ich denke ich werde den PT1 FIlter mit einer Mittelwertbildung kombinieren. Um so die Verzugszeit klein zu halten.
Nur leider verstehe ich nicht was hinter dem Algorithmus steckt: hier mal der ganze SCL-Code

PT1-Tiefpass-Filter
Grenzfrequenz fg in Hz
Abtastzeit T in sec.
Ausgang = Ausgang(n-1)*exp(-wT)-Eingang(n-1)*(exp(-wT)-1)

mit w = 2*pi*fg
Ausgang(n-1) = Berechneter Wert vor einem Zyklus
Eingang(n-1) = Messwert vor einem Zyklus
****************************************************************************************)
FUNCTION_Block FB13

VAR
Grenzfrequenz :REAL;
END_VAR

VAR_INPUT
Eingang:REAL; //Messwert roh
Abtastzeit:REAL; //Zeit zwischen zwei Aufrufen in Sekunden (In Sekunden)
Delta_T:REAL; //In welchem Zeitraum soll die Gewichtung der Messwerte erfolgen? (In Sekunden)
END_VAR

VAR_IN_OUT
Eingang_Alt:REAL; //Zwischenspeicher
Ausgang_Alt:REAL; //Zwischenspeicher
END_VAR

VAR_OUTPUT
Ausgang:REAL; //Gefilteter Messwert
END_VAR

BEGIN
Grenzfrequenz:=1/Delta_T; //Umrechnung in Hertz (Hz= 1/T)

Ausgang := Ausgang_Alt * EXP (-1.0 * (2.0 * 3.14159 * Grenzfrequenz * Abtastzeit)) -
Eingang_Alt * ( EXP (-1.0 * (2.0 * 3.14159 * Grenzfrequenz * Abtastzeit))-1.0);

Ausgang_Alt := Ausgang; // Altwert für nächsten Zyklus speichern
Eingang_Alt := Eingang; // Altwert für nächsten Zyklus speichern


END_FUNCTION_block


Das man hier auch mit der Gewichtung arbeitet ist klar. aber ist das exp(2*PI*fg*T) auch der Filterkoeffizient. Wenn ja, dann hätten wir doch
immer gleichwertige Koeffizienten und somit ein gleitende Mittelwertbildung?
Ist das überhaupt ein PT1-Filter?
Ich habe den Code so we er ist erhalten zur Anwendung. Nur keiner konnte mir das erklären.
 
Zurück
Oben