Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 34 von 34

Thema: Werte glätten

  1. #31
    Registriert seit
    09.08.2004
    Ort
    Münsterland
    Beiträge
    232
    Danke
    21
    Erhielt 13 Danke für 10 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    anbei ein bißchen code ...

    ist damals aus der "not" enstanden, da ich auch immer ausreißer ( manchmal mehr als 50% vom letzten Wert ) hatte ...

    Code:
    FUNCTION_block Median
    
    VAR_INPUT
     PV: Real; // Prozessvariable
     Start: bool; // Start Mittelwert
     Reset: bool; // Reset Mittelwert
     Puls:BOOL; // Impuls Meßwert aufnehmen
     Check:REAL; // Abweichung in Prozent +/-   
    END_VAR
    
    VAR_OUTPUT
     Out: Real; // Medianwert
     Stabil:BOOL; // PV = Mittelwert ( im Bereich )
    END_VAR
    
    VAR
      Werte: ARRAY[1..10] OF REAL;
      Median:ARRAY[1..10] OF REAL;
    END_VAR
    
    VAR_TEMP
        i:INT;
        j:INT;
        Help:REAL;
    END_VAR
    
    LABEL
       Saved;
    END_LABEL
    
    BEGIN
      
    Stabil:=False;  
      
    IF reset THEN
       Out:=0.0;
    ELSIF start AND Out = 0.0 THEN
        FOR i:=1 TO 10 DO
            Werte[i]:=PV;
        END_FOR;
        Out:=PV;
    ELSIF Puls AND start THEN
        
      FOR i:=10 TO 2 BY -1 DO
         Werte[i]:=Werte[i-1];
      END_FOR; 
      
      IF start then 
        Werte[1]:=PV;
      ELSE
        Werte[1]:=0.0;
      END_IF;
      
      Median:=werte;
      
      FOR i:=1 TO 9 DO
        FOR j:=i+1 TO 10 DO
          IF median[i] > median[j] THEN
            Help:=median[i];
            median[i]:=median[j];
            median[j]:=help;
          END_IF;
        END_FOR;
      END_FOR;
    
      FOR i:= 4 TO 7 DO
        Out:= Out + median[i];
      END_FOR;
      
        OUT := out / 5.0;  
        
    END_IF;
    
        Stabil:= ABS(PV-Out) * 100.0 / ABS(PV) < Check; 
        
    END_FUNCTION_BLOCK
    es werden einfach 10 Werte aufgenommen, mit jedem Puls ein neuer - läuft bei mir meistens mit 100ms Takt - hat sich bewährt.

    Dann werden die Werte sotiert und dann nur die "inneren" 4 Werte verwendet. Die anderen verworfen.

    Die anderen addiert + dem letzten und durch 5 geteilt.

    Das mit dem Ausgang stabil ist nur Spielerei. Wenn der Istwert innerhalb eines Fenster ( Angabe in % ) vom gemittelten Wert liegt ist der da.

    Kannst damit schnell auf ausreißer reagieren - falls gewünscht.

    Nutze den mittlerweile fast bei jedem Analogwert.

    1. funktioniert gut
    2. der braucht kaum zykluszeit
    3. du hast keine ausreißer mehr

    gruß
    christian

  2. #32
    McNugget ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.09.2008
    Beiträge
    201
    Danke
    21
    Erhielt 11 Danke für 10 Beiträge

    Daumen hoch

    Wow.. Das ist mal nett.. Sehr nett....
    Das ist ja fast noch netter, als die Dämpfung, die ich aktuell verwende.
    (natürlich ist es das...)

    Cool.

    Vielen Dank!

  3. #33
    Registriert seit
    09.08.2004
    Ort
    Münsterland
    Beiträge
    232
    Danke
    21
    Erhielt 13 Danke für 10 Beiträge

    Standard

    ich nochmal,

    wieso sehe ich hier einen andren ( weniger ) text als in der email aus dem forum ...

    (natürlich ist es das...)

    Als Einziges fehlt noch, dass zu Beginn der Ausgangswert mit dem Eingangswert initialisiert wird, um nicht erst nach 10 * 100ms einen Wert zu erhalten.

    Aber das ist ja schnell gebastelt.

    Cool.

    Vielen Dank!
    ***************
    naja , egeal ... die Initialisierung ist doch drin,
    Code:
    IF reset THEN
       Out:=0.0;
    ELSIF start AND Out = 0.0 THEN
        FOR i:=1 TO 10 DO
            Werte[i]:=PV;
        END_FOR;
        Out:=PV;
    ELSIF Puls AND start THEN
        
      FOR i:=10 TO 2 BY -1 DO
         Werte[i]:=Werte[i-1];
      END_FOR;
    gruß

  4. #34
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von repök Beitrag anzeigen
    Also ich würde das so machen:

    Code:
    durchschnitt:=(durchschnitt*10+messwert)/11;
    ist etwas übersichtlicher und schneller.
    Das ist nicht nur übersichtlicher, das liefert auch bessere Ergebnisse. Dieser Filtertyp wird als inifinite Memory Typ klassifiziert. Es vergisst sozusagen nie einen Wert der Vergangenheit, solange die Auflösung des Datentyps ausreichend ist.

    Ein Array mit einer festen Anzahl von Elementen, kann hingegen nur diese Anzahl von Werten der Vergangenheit ausmitteln.

    Die infinite Memory Filter können noch wesentlich effektiver von den Algorithmen gestaltet werden aber das muss man dann in Büchern über Mathematik nachlesen.

    Ein anderer Weg ist der mit dem "Sliding Window", wie von Stricky angedeutet, dieses Verfahren hat insbesondere Vorteile im Postprozessing von Messreihen, da es im Prinzip nicht den Ärgermacht, dass Verzögerungen bei Sprüngen sich wie bei Tiefpassfiltern einstellen.
    Geändert von RobiHerb (10.11.2008 um 17:58 Uhr)
    Zitieren Zitieren Infinite Memory  

Ähnliche Themen

  1. analoge Messwerte glätten
    Von xinix im Forum CODESYS und IEC61131
    Antworten: 14
    Letzter Beitrag: 15.03.2011, 11:09
  2. Antworten: 5
    Letzter Beitrag: 14.09.2010, 17:56
  3. Werte in DB schreiben
    Von SolSna im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 23.01.2008, 13:54
  4. CP 340 / 2 Werte vom PC in ein DB der SPS
    Von maxi im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 16.08.2006, 12:18
  5. Anlogwert glätten
    Von fbeine im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 31.03.2006, 12:00

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •