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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Gleitende Mittelwertbildung

  1. #1
    Registriert seit
    02.03.2009
    Beiträge
    301
    Danke
    3
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich lese mit der SPS Senorwerte ein. Diese möchte ichg gern glätten. Gibt es da eine Möglichkeit. Evtl. gleitende Mittelwertbildung?
    Zitieren Zitieren Gleitende Mittelwertbildung  

  2. #2
    Registriert seit
    07.01.2009
    Ort
    Kreis Günzburg
    Beiträge
    472
    Danke
    129
    Erhielt 26 Danke für 25 Beiträge

    Standard

    ja ließt du 1 oder 0 ?? oder was anderes
    Das Leben ist ne Steuerung und du bist der Programmierer, du entscheidest was abläuft

  3. #3
    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

    analoge Stromwerte 4..20mA in REAL

  4. #4
    Registriert seit
    29.07.2008
    Ort
    Stuttgart
    Beiträge
    232
    Danke
    64
    Erhielt 25 Danke für 25 Beiträge

    Standard

    ja das geht. warum auch nicht...

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

    Standard

    Beispiel FB:
    Code:
    AUF DB_Nummer    // IN DB: DB Adresse, wo die Messungen gespeichert
    L Byte_ANF_ADDR // IN INT: Anfangsaddresse der Messungen
    SLW 3
    L DW#16#84000000
    UD
    LAR1
    LAR2
    L Messwert // IN INT Dein Messwert
    T W[AR1,P#0.0]
    L AnzahlMessungen // IN DINT: Anzahl der Messungen, die du machen willst
    Mess: T Temp_Anzahl // Temp DINT
    TAR1
    L P#2.0
    +D
    LAR1
    L Messwert
    T W[AR1,P#0.0]
    L Temp_Anzahl
    LOOP Mess
    
    L W[AR2,P#0.0]
    T Zwischenergebnis // TEMP DINT
    L AnzahlMessungen
    Me01: T Temp_Anzahl
    TAR2
    L P#2.0
    +D
    LAR2
    L Zwischenergebnis
    L W[AR2,P#0.0]
    +D
    T Zwischenergebnis
    L Temp_Anzahl
    LOOP Me01
    
    L Zwischenergebnis
    L AnzahlMessungen
    /D
    T Mittelwert // OUT DINT: Ausgang Mittelwert deiner Messungen
    Achte darauf, dass du den DB zuerst anlegen musst, und ihm pro Messwert genug Platz reservierst. (1 Messwert = WORD)
    Den Realwert wandelst du mit FC105 in INT um.
    Müsste so funktionieren, hab es allerdings nicht getestet. Sag bitte bescheid, obs überhaupt funktioniert.

    Gruß!
    Geändert von Andreas- (17.09.2009 um 13:15 Uhr)
    "Ich bin eine Mischung aus jung und erfahren, das findet man sonst nur auf dem Straßenstrich."

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

    Standard

    Sorry, mir ist aufgefallen, dass das so nicht funktioniert

    Ich up gleich die Korrektur ^^
    "Ich bin eine Mischung aus jung und erfahren, das findet man sonst nur auf dem Straßenstrich."

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

    Standard

    Meine Korrektur:

    Beispiel FB:
    Code:
    AUF DB_Nummer    // IN DB: DB Adresse, wo die Messungen gespeichert
    U Messunglaeuft // Statisch BOOL
    SPB m003
    SET
    = Messunglaeuft
    L Byte_ANF_ADDR // IN INT: Anfangsaddresse der Messungen
    SLW 3
    L DW#16#84000000
    UD
    LAR1
    LAR2
    T Anfang // Statisch DWORD
    T Adresse // Statisch DWORD
    L Messwert // IN INT Dein Messwert
    T W[AR1,P#0.0]
    L AnzahlMessungen // IN DINT: Anzahl der Messungen, die du machen willst
    T Anzahl // Statisch DINT
    BEA
    
    m003: NOP 0
    L Adresse
    LAR1
    
    Mess: NOP 0
    U Gespeichert
    SPBN m001
    T Anzahl
    CLR
    = Gespeichert
    BEA
    m001: NOP 0
    TAR1
    L P#2.0
    +D
    LAR1
    T Adresse
    L Messwert
    T W[AR1,P#0.0]
    S Gespeichert // Statisch BOOL
    L Temp_Anzahl
    LOOP Mess
    
    CLR 
    = Gespeichert
    
    L Anfang
    LAR2
    L W[AR2,P#0.0]
    T Zwischenergebnis // TEMP DINT
    L AnzahlMessungen
    Me01: T Temp_Anzahl
    TAR2
    L P#2.0
    +D
    LAR2
    L Zwischenergebnis
    L W[AR2,P#0.0]
    +D
    T Zwischenergebnis
    L Temp_Anzahl
    LOOP Me01
    
    L Zwischenergebnis
    L AnzahlMessungen
    /D
    T Mittelwert // OUT DINT: Ausgang Mittelwert deiner Messungen
    
    CLR
    = Messunglaeuft
    Hab leider grad keine Zeit das zu testen. Ich machs etwas später daheim. Falls du es aber schon vormit testet, so gib mir bitte Auskunft darüber.

    Bis dann
    Geändert von Andreas- (17.09.2009 um 14:07 Uhr)
    "Ich bin eine Mischung aus jung und erfahren, das findet man sonst nur auf dem Straßenstrich."

  8. #8
    Registriert seit
    04.01.2007
    Ort
    Euskirchen
    Beiträge
    136
    Danke
    23
    Erhielt 37 Danke für 31 Beiträge

    Standard

    Zitat Zitat von SPS_NEU Beitrag anzeigen
    analoge Stromwerte 4..20mA in REAL
    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
    Wenn man diese Berechnung z.B. in OB35 ausführt (also mit konstanten Abtastzeiten) dann kann man die Glättung (also T1) sogar berechnen falls nötig.

    Gruß Michael aka Dumbledore

  9. #9
    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

    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?

    @-Andreas: Leider komme ich mit deinem Programm nicht ganz mit. Ich möchte den Mittelwert aus ca. 10 Messungen gleitend bilden. Kann man das so vereinfachen, dass ein REAL Wert gegeben wird und und zweiter gemittelter als REAL rauskommt?
    Geändert von SPS_NEU (17.09.2009 um 17:53 Uhr)

  10. #10
    Registriert seit
    21.01.2008
    Beiträge
    70
    Danke
    0
    Erhielt 15 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
    FUNCTION_BLOCK FB 1874
    TITLE =
    //1.4.2009 aw: Einfacher MTA Filter
    VERSION : 0.1
    
    
    VAR_INPUT
      IN : REAL ;    
      CNT : INT ;    
    END_VAR
    VAR_OUTPUT
      OUT : REAL ;    
    END_VAR
    VAR
      buffer : ARRAY  [0 .. 99 ] OF REAL ;    
      pos : INT ;    
      sum : REAL ;    
    END_VAR
    VAR_TEMP
      i : INT ;    
      tmp : REAL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    //IF CNT>100 THEN CNT:=100; END_IF;//Index auf maximale Bufferlänge begrenzen
    //             
    //out:=out-buffer[pos]+IN/CNT;
    //buffer[pos]:=IN/CNT;
    //pos:=pos+1;
    //IF pos=CNT THEN pos:=0; END_IF;
          L     #CNT; //Anzahl der Werte für den Mittelwert lesen
          L     100; //ggf. auf Länge von buffer (0..99)=100 begrenzen
          >I    ; 
          SPBN  ngr; 
          T     #CNT; 
    ngr:  L     #IN; //Eingang durch Anzahl Werte dividieren
          L     #CNT; 
          ITD   ; 
          DTR   ; 
          /R    ; 
          T     #tmp; //tmp=IN/CNT
    
          L     #pos; 
          SLD   5; 
          LAR1  ; 
          L     DID [AR1,P#10.0]; 
          L     #OUT; 
          TAK   ; 
          -R    ; 
          L     #tmp; 
          T     DID [AR1,P#10.0]; 
          +R    ; 
          T     #OUT; 
    
          L     #pos; //pos um 1 erhöhen
          INC   1; 
          T     #pos; 
          L     #CNT; //Wenn pos=cnt dann pos=0
          ==I   ; 
          SPBN  ng; 
          L     0; 
          T     #pos; 
    ng:   NOP   0; //Bausteinende
    
    END_FUNCTION_BLOCK

Ä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
  •