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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Gleitende Mittelwertbildung

  1. #11
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von SPS_NEU Beitrag anzeigen
    Ich lese mit der SPS Sensorwerte ein. Diese möchte ich gern glätten. Gibt es da eine Möglichkeit. Evtl. gleitende Mittelwertbildung?
    In dem folgenden Programmbeispiel werden die letzten 10 Messwerte in einem FIFO-Speicher gespeichert:

    Code:
    FUNCTION FC 100 : VOID
    TITLE =FIFO
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : FIFO
    VERSION : 1.0
     
    VAR_INPUT
      DB_Werte : BLOCK_DB ; 
      Anzahl_Werte : INT ; 
      Wert : REAL ; 
    END_VAR
    VAR_TEMP
      DB_Register : WORD ; 
      AR1_Register : DWORD ; 
      Zwischenwert : REAL ; 
      Schleife : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Register sichern
     
          L     DBNO; // DB-Register
          T     #DB_Register; 
     
          TAR1  ; // AR1-Register
          T     #AR1_Register; 
     
    NETWORK
    TITLE =FIFO
     
          AUF   #DB_Werte; // DB-Werte
     
          L     #Wert; // Wert
          T     #Zwischenwert; // Zwischenwert
     
          L     P#0.0; 
          LAR1  ; 
     
          L     #Anzahl_Werte; // Anzahl Werte
    M01:  T     #Schleife; 
     
          L     DBD [AR1,P#0.0]; // Wert
          L     #Zwischenwert; // Zwischenwert
          T     DBD [AR1,P#0.0]; // Zwischenwert -> Wert   
          TAK   ; 
          T     #Zwischenwert; // Wert -> Zwischenwert
     
          L     P#4.0; 
          +AR1  ; 
     
          L     #Schleife; 
          LOOP  M01; 
     
    NETWORK
    TITLE =Register wiederherstellen
     
          AUF   DB [#DB_Register]; // DB-Register
     
          L     #AR1_Register; // AR1-Register
          LAR1  ; 
     
    END_FUNCTION
    Aus den gespeicherten Messwerten wird dann ein Mittelwert gebildet:

    Code:
    FUNCTION FC 110 : VOID
    TITLE =Mittelwert
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : FIFO
    VERSION : 1.0
     
    VAR_INPUT
      DB_Werte : BLOCK_DB ; 
      Anzahl_Werte : INT ; 
    END_VAR
    VAR_OUTPUT
      Mittelwert : REAL ; 
    END_VAR
    VAR_TEMP
      DB_Register : WORD ; 
      AR1_Register : DWORD ; 
      Zwischenwert : REAL ; 
      Zaehler : REAL ; 
      Schleife : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Register sichern
     
          L     DBNO; // DB-Register
          T     #DB_Register; 
     
          TAR1  ; // AR1-Register
          T     #AR1_Register; 
     
    NETWORK
    TITLE =Mittelwert
    //Mittelwert
    //
    //M = LM + ((Z - LM) / N) = LM + Z / N - LM / N
    //
    //M  = Mittelwert
    //LM = Letzter Mittelwert
    //Z  = Wert
    //N  = Anzahl Werte
    //   
     
          AUF   #DB_Werte; // DB-Werte
     
          L     0.000000e+000; 
          T     #Zwischenwert; // M Mittelwert
     
          L     1.000000e+000; 
          T     #Zaehler; // N Anzahl Werte
     
          L     P#0.0; 
          LAR1  ; 
     
          L     #Anzahl_Werte; // Anzahl Werte
    M01:  T     #Schleife; 
     
          L     DBD [AR1,P#0.0]; // Z Wert
          L     #Zwischenwert; // LM Letzter Mittelwert
          -R    ; 
          L     #Zaehler; // N Anzahl Werte
          /R    ; 
          L     #Zwischenwert; // LM Letzter Mittelwert
          +R    ; 
          T     #Zwischenwert; // M Mittelwert
     
          L     #Zaehler; // N Anzahl Werte
          L     1.000000e+000; 
          +R    ; 
          T     #Zaehler; // N Anzahl Werte
     
          L     P#4.0; 
          +AR1  ; 
     
          L     #Schleife; 
          LOOP  M01; 
     
          L     #Zwischenwert; // M Mittelwert
          T     #Mittelwert; // Mittelwert
     
    NETWORK
    TITLE =Register wiederherstellen
     
          AUF   DB [#DB_Register]; // DB-Register
     
          L     #AR1_Register; // AR1-Register
          LAR1  ; 
     
    END_FUNCTION
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  2. Folgende 3 Benutzer sagen Danke zu Kai für den nützlichen Beitrag:

    AirKlaus (22.01.2013),Bitschrauber (27.01.2016),epy (26.10.2009)

  3. #12
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Und noch zwei Bilder aus der Simulation mit PLCSIM.

    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken

  4. #13
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.264
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Zitat Zitat von SPS_NEU Beitrag anzeigen
    Also ich habe jetzt mal deine Variante Dumbledore getestet. Das Signal verändert sich zwar, aber wird nicht richtig geglättet. Ich arbeitet mit werten um 30 (REAL). Wie ist es dabei güntig den Faktor anzupassen?
    Für die einfache Glättung eines Signals ist Dumledores Weg sicher die einfachste, schnellste und immer noch hinreichend genau. Beim Faktor 0,9 gehen neue Werte zu 1/10-tel in den alten Wert ein. Wenn du es noch "glatter willst" mußt du den Faktor mehr an die 1 annähern, aber denke daran, damit werden Wertänderungen auch immer langsamer in den Gesamtwert eingehen!
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #14
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von Dumbledore Beitrag anzeigen
    wenn es sich um eine reine Glättung (ohne genaue mathematische Vorgaben dazu) handeln soll dann kann man sehr einfach ein PT1-Glied programmieren. Ich benutze dazu gerne die Formel NEUWERT = FAKTOR * ALTWERT + (1-FAKTOR) * ISTWERT. Der FAKTOR ist z.B. 0,9 (nach Bedarf anpassen). Berechnung unbedingt in REAL ausführen und auf gültige Ziffern achten, falls FAKTOR sehr nahe an 1 oder 0 liegen sollte.

    Code:
    (alle Variablen als REAL angenommen)
    L 1.0
    L FAKTOR
    -R
    L ISTWERT
    *R
    L FAKTOR
    L GLATTWERT // ALTWERT
    *R
    +R
    T GLATTWERT // NEUWERT
    Der Programmcode von Dumbledore ist nicht ganz richtig, nachfolgend der korrigierte Programmcode:

    Code:
    (alle Variablen als REAL angenommen)
    L 1.0
    L FAKTOR
    -R
    L ISTWERT
    *R
    T ZWISCHENWERT_1
     
    L FAKTOR
    L GLATTWERT // ALTWERT
    *R
    T ZWISCHENWERT_2
     
    L ZWISCHENWERT_1
    L ZWISCHENWERT_2
    +R
    T GLATTWERT // NEUWERT
    Gruß Kai

  6. #15
    Registriert seit
    28.07.2009
    Ort
    St. Augustin
    Beiträge
    76
    Danke
    18
    Erhielt 9 Danke für 5 Beiträge

    Standard

    Hey ,

    also ich habe meinen Baustein noch mal überarbeitet und getestet. Er funktioniert prima. Der Messwert wird als Real eingelesen. Ändert sich der Messwert, so wird ein Messzyklus gespeichert. Die Anzahl der Messzyklen wird als INT von 1 - 99 vorgegeben. Nach den Messzyklen wird aus den Messwerten der Mittelwert errechnet und als Real wieder ausgegeben.

    Anbei die AWL-Quelle.

    Grüße ^^

    Code:
    FUNCTION_BLOCK FB 37
    TITLE =Mittelwertbildung nach vorgebaren Messzyklen 
    //Messwert in REAL
    //Mit jeder Änderung des Messwertes wird dieser gespeichert und nach der 
    //vorgegebenen Anzahl der Mittelwert errechnet und ausgegeben.
    VERSION : 0.1
    
    
    VAR_INPUT
      Messwert : REAL ;    
      Messcyc_Anz : INT ;    
    END_VAR
    VAR_OUTPUT
      Mittelwert : REAL ;    
    END_VAR
    VAR
      Messwert_ALT : REAL ;    
      Messunglaeuft : BOOL ;    
      Gespeichert : BOOL ;    
      T_Anzahl : INT ;    
      Speicheraddresse : DWORD ;    
      Anfangsaddresse : DWORD ;    
      Zwischenergebnis : ARRAY  [1 .. 99 ] OF REAL ;    
      T_Mittelwert : REAL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          L     #Messwert; 
          L     #Messwert_ALT; 
          ==R   ; 
          SPB   ENDE; 
    
          U     #Messunglaeuft; 
          SPB   strt; 
          SET   ; 
          =     #Messunglaeuft; 
          L     L#26; 
          SLD   3; 
          T     #Speicheraddresse; 
          T     #Anfangsaddresse; 
          L     #Messcyc_Anz; 
          L     1; 
          -I    ; 
          L     99; 
          >I    ; 
          SPBN  anza; 
          T     #T_Anzahl; 
          SPA   ENDE; 
    anza: TAK   ; 
          T     #T_Anzahl; 
          SPA   ENDE; 
    
    strt: L     #Speicheraddresse; 
          LAR1  ; 
    Mess: NOP   0; 
    
          U     #Gespeichert; 
          SPBN  wetr; 
          CLR   ; 
          =     #Gespeichert; 
          SPA   ENDE; 
    
    wetr: NOP   0; 
          L     #Messwert; 
          L     #Messwert_ALT; 
          +R    ; 
          L     2.000000e+000; 
          /R    ; 
          T     DID [AR1,P#0.0]; 
          SET   ; 
          =     #Gespeichert; 
          L     #Speicheraddresse; 
          L     P#4.0; 
          +D    ; 
          T     #Speicheraddresse; 
          L     #T_Anzahl; 
          DEC   1; 
          T     #T_Anzahl; 
          L     0; 
          ==I   ; 
          SPBN  Mess; 
    
          L     #Anfangsaddresse; 
          LAR1  ; 
          L     DID [AR1,P#0.0]; 
          L     DID [AR1,P#4.0]; 
          +R    ; 
          L     2.000000e+000; 
          /R    ; 
          T     #T_Mittelwert; 
          L     0.000000e+000; 
          T     DID [AR1,P#0.0]; 
          T     DID [AR1,P#4.0]; 
          TAR1  ; 
          L     P#8.0; 
          +D    ; 
          LAR1  ; 
          L     #T_Anzahl; 
          L     2; 
          -I    ; 
    Mitt: T     #T_Anzahl; 
          L     #T_Mittelwert; 
          L     DID [AR1,P#0.0]; 
          +R    ; 
          L     2.000000e+000; 
          /R    ; 
          T     #T_Mittelwert; 
          L     0.000000e+000; 
          T     DID [AR1,P#0.0]; 
          TAR1  ; 
          L     P#4.0; 
          +D    ; 
          LAR1  ; 
          L     #T_Anzahl; 
          LOOP  Mitt; 
    
          CLR   ; 
          =     #Messunglaeuft; 
    
          L     #T_Mittelwert; 
          T     #Mittelwert; 
    
          L     0.000000e+000; 
          T     #T_Mittelwert; 
    
    ENDE: NOP   0; 
          L     #Messwert; 
          T     #Messwert_ALT; 
    
    END_FUNCTION_BLOCK
    Angehängte Dateien Angehängte Dateien
    "Ich bin eine Mischung aus jung und erfahren, das findet man sonst nur auf dem Straßenstrich."
    Zitieren Zitieren FB überarbeitet  

  7. #16
    Registriert seit
    17.09.2009
    Beiträge
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    von Siemens gibts dafür bereits einen "fertigen" Fb, sehr einfach/effektiv.
    (in der Bibliothek von Modular PID enthalten...FB9...LAG1ST: first-order lag element (Verzögerungsglied 1. Ordnung)
    Bausteinbeschreibung :
    Der Baustein glättet die Eingangsgröße nach der Verzögerung 1. Ordnung. Die Verzögerungszeit ist parametrierbar.
    MFG

  8. #17
    Registriert seit
    28.07.2009
    Ort
    St. Augustin
    Beiträge
    76
    Danke
    18
    Erhielt 9 Danke für 5 Beiträge

    Standard

    Naja, dann wars für mich halt ne effektive Übung ^_^!

    BB
    "Ich bin eine Mischung aus jung und erfahren, das findet man sonst nur auf dem Straßenstrich."

  9. #18
    SPS_NEU ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.03.2009
    Beiträge
    301
    Danke
    3
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Vielen Dank euch allen. Ich werde mal die Varianten durch probieren. Ist dieser FB9 standartmäßig vorhanden?

  10. #19
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Zitat Zitat von Andreas- Beitrag anzeigen
    Hey ,

    also ich habe meinen Baustein noch mal überarbeitet und getestet. Er funktioniert prima. Der Messwert wird als Real eingelesen. Ändert sich der Messwert, so wird ein Messzyklus gespeichert. Die Anzahl der Messzyklen wird als INT von 1 - 99 vorgegeben. Nach den Messzyklen wird aus den Messwerten der Mittelwert errechnet und als Real wieder ausgegeben.
    Dein Programm hat mit den Thema "gleitender Mittelwert" nur nichts zu tun.
    Das Programm erzeugt einen Mittelwert aus einer unbestimmten Anzahl von Werten. Unbestimmt darum, weil das Programm wenn sich der Messwert nicht ändert, den Wert einfach nicht für die Berechung heranzieht.

    Zur Glättung eines Messwertes taugen diese Array-Lösungen, bei denen nach einer bestimmten Anzahl von Werten aus diesen ein Mittelwert berechnet wird, auch nicht.

    Wenn z.B. pro Sekunde 100 Messwerte ins Array geschrieben werden und der daraus berechnete Mittelwert ausgegeben wird, würde sich eine Störfrequenz (z.B. Rechtecksignal) von 0,5 Hz voll auf den Ausgang durchschlagen, wenn das Sampling-Fenster genau auf eine Periode fällt.

    Beispiel:
    Code:
    Signal:
    100|      |------|      |------|
       |      |      |      |      |
     0 |------|      |------|      |
    
    Sampling:
    Zyklus       1       2
              A      E
                     A      E
    Wenn man bei A beginnt in den Array zu schreiben und bei E aufhört, kommt im Messzyklus 1 als Mittelwert 100 heraus. Im nächsten Mess-Zyklus 2 dann 0 usw.
    Eine Filtercharakteristik mit Grenzfrequenzen kann man für soetwas zumindest nicht bestimmen.

  11. #20
    Registriert seit
    28.07.2009
    Ort
    St. Augustin
    Beiträge
    76
    Danke
    18
    Erhielt 9 Danke für 5 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Dein Programm hat mit den Thema "gleitender Mittelwert" nur nichts zu tun.
    Das Programm erzeugt einen Mittelwert aus einer unbestimmten Anzahl von Werten. Unbestimmt darum, weil das Programm wenn sich der Messwert nicht ändert, den Wert einfach nicht für die Berechung heranzieht.
    Danke, das du mich aufgeklärt hast. Ich hab das ganze ein Wenig missverstanden.
    "Ich bin eine Mischung aus jung und erfahren, das findet man sonst nur auf dem Straßenstrich."

Ähnliche Themen

  1. Mittelwertbildung
    Von pinolino im Forum Simatic
    Antworten: 45
    Letzter Beitrag: 26.01.2010, 20:06
  2. Variable Mittelwertbildung
    Von Farinin im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 03.04.2009, 06:05
  3. Mittelwertbildung S5-95U
    Von demo im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 28.08.2007, 21:10
  4. Mittelwertbildung
    Von Servomaster im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 18.10.2005, 06:42
  5. WinCC 6.0 Mittelwertbildung
    Von HarbichC im Forum HMI
    Antworten: 10
    Letzter Beitrag: 12.08.2005, 07:02

Lesezeichen

Berechtigungen

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