Median S7-1200

Michael J.

Level-1
Beiträge
60
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin auf der Suche nach einem Median Baustein.

Ich benötige diesen für eine Temperaturauswertung und einer für die Auswertung eines Lasersignales das Schwankungen hat. Die Mittelwertauswertung sehe ich nicht als geeignet an.

Ich habe bereits eine Median Baustein aus der Oscat Bibliothek. Habe auch eine Version die Funktioniert aber leider nur für die 300er. Sobald ich diesen in 1200er Schiebe bekommen ich mehrer Fehlermeldungen. Ich habe mich schon ein wenig in SCL eingearbeitet um die Grundbegriffe zu verstehen. Leider komm ich hiermit aber nicht weiter.

Kann mir jemand dabei weiterhelfen bzw hat schon jemand einen fertigen Baustein?

Mit freundlichen Grüßen
 

Anhänge

  • Screenshot_1.jpg
    Screenshot_1.jpg
    48,2 KB · Aufrufe: 79
Hi, dein Codeschnippsel ist ja nicht so dolle kommentiert oder gibts da eine extra Doku dazu?

Kerngedanke ist ja die Glättung(Anpassung) von Einzelwerten in einer Reihe, hauptsächlich um Ausreißer (Störungen) zu eliminieren.

In deinem Code wird nun erstmal geprüft ob genug Werte vorhanden sind.
In wikipedia findest du schnell die Funktionsweise:

Code:
To demonstrate, using a window size of three with one entry  immediately preceding and following each entry, a median filter will be  applied to the following simple 1D signal:

 x = [2 80 6 3]
 So, the median filtered output signal y will be:
y[1] = Median[2 2 80] = 2
y[2] = Median[2 80 6] = Median[2 6 80] = 6
y[3] = Median[80 6 3] = Median[3 6 80] = 6
y[4] = Median[6 3 3] = Median[3 3 6] = 3
 i.e. y = [2 6 6 3].

Sollte nicht schwer sein dies für die 1200er umzusetzen.
MfG MK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kann ich das den umsetzen? Wie sage ich ihm den das er das sortieren soll? Bin da gerade noch ein wenig auf dem Holzweg. Wäre schön wenn du mir da ein paar Ansätze geben könntest.

Gruß Michael
 
Wie kann ich das den umsetzen? Wie sage ich ihm den das er das sortieren soll? Bin da gerade noch ein wenig auf dem Holzweg. Wäre schön wenn du mir da ein paar Ansätze geben könntest.

Gruß Michael

Ansatzmöglichkeiten:
A) Wert direkt filtern
B) Werte filtern wenn Messreihe voll

Generell
1)Index (Pointer) um eins erhöhen
2) Median mit Werten bilden (immer ungerade Anzahl im array)
3) Werte in Median-Breite ordnen
Bei einem 3er Median sehr einfach mit IF Else
Bei höheren Median sortieren (hier Stichwort: Bubble Sort)
Ist ein Wert größer als der nächste, dann tausche die Werte, bis alle Werte aufsteigend richtig)

Bedeutet zwei inneinander verschachtelte Schleifen.
Beispiel Hochsprache
Code:
        for (n=A.size; n>1; n=n-1)
           for (i=0; i<n-1; i=i+1)
             if (A[i] > A[i+1])
                 A.swap(i, i+1)  
            // ende if 
          // ende innere for-Schleife 
        // ende äußere for-Schleife
gibts sicher auch in der Oscat als fertigen Baustein.

4) Wert = mittlerer Wert im geordneten Median

MfG MK
 
Ich habe es hinbekommen. Funktioniert besser wie ich mir das jemals erträumt hätte.

Ein Problem habe ich aber noch.

Ich kann wie ich es jetzt gebaut habe kein 27 Arrays vorgeben weil dann die SPS in Zyklus Fehler geht. Liegt das noch an der verwendeten 2.2 anstatt einer 3.0? Oder einer einer eine Idee wie man das Optimieren kann.

Wahrscheinlich liegt das an meiner Programmierung....

Ich Prinzip ist der Median für die vorgesehenen Anwendungen ausreichend genug aber ich will den Baustein gerne ein wenig perfektionieren.

Vielleicht hat ja noch einer eine Idee.

Ein Dankeschön für die denjenigen die diesen Baustein verwenden möchten wäre seht nett. Der Baustein kann aufgrund seiner Progammierart auch für eine 300/400 verwendet werden.

Gruß Michael
 

Anhänge

  • Median.rar
    1,2 MB · Aufrufe: 33
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Michael,

dann erhöht die Sortierung deine Zykluszeit zu viel.
Abhilfe: den Wert immer direkt nach dem einlesen schon filtern (Vorraussetzung du hast mindestens 3 Werte).

Zu deinem Programm:
Du hast eine Variable "swap" deklariert. "Swap" ist aber schon eine Anweisung (findest du in der Bibliothek unter "Verschieben")
Genau mit dieser Anweisung kannst du dir wiederum den Umweg über die Hilfsvariable "aux" sparen.

Für den ersten und letzten Wert evtl. eine Sonderbehandlung überlegen, siehe Beitrag #2

MfG MK
 
So jetzt habe ich korrigiert. Jetzt läufst eindeutig schneller. Danke für deine Tipps.

Die Swap Funktion macht nicht das was mein tauschen macht. Die dreht ja nur die Daten und tauscht diese nicht.

Gruß Michael
 

Anhänge

  • Median.rar
    1,7 MB · Aufrufe: 75
Zurück
Oben