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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Durchschnitt einer Variable berechnen

  1. #1
    Registriert seit
    30.09.2010
    Beiträge
    26
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen.

    Mal eine kurze Frage:
    Wie würdet ihr den Durchschnitt einer Variable über eine fortlaufende Zeit berechnen.
    Min/Max ist ja kein Problem, aber für den Durchschnitt habe ich keine "Speicherschonende" Lösung parat.

    Mein erster Ansatz war folgender:
    Code:
    L     "DB_TIC2406_01".TempIst
    L     "DB_TIC2406_01".ZwischenWert
    +D
    T     "DB_TIC2406_01".ZwischenWert
    
    L     "DB_TIC2406_01".Counter
    L     1
    +D
    T     "DB_TIC2406_01".Counter
    
    L     "DB_TIC2406_01".ZwischenWert
    L     "DB_TIC2406_01".Counter
    /D
    T     "DB_TIC2406_01".TempDS
    Aber mit dieser Variante würde ich sehr schnell in den Overflow der Variablen kommen.
    Hat irgend jemand einen besseren Vorschlag?

    Danke schon mal im Voraus
    lg, Michael
    Zitieren Zitieren Durchschnitt einer Variable berechnen  

  2. #2
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.138
    Danke
    225
    Erhielt 127 Danke für 85 Beiträge

    Standard

    Ich mach das immer so:
    40% vom alten Wert + 60% vom neuen Wert:

    Code:
    L "DB_TIC2406_01".LetzterWert
    DTR
    L 4.000000e-001
    *R
    T #Zwischenwert_R1
    
    L "DB_TIC2406_01.TempIst
    DTR
    L 6.000000e-001
    *R
    T #Zwischenwert_R2
    
    L #Zwischenwert_R1
    L #Zwischenwert_R2
    +R
    
    TRUNC
    T "DB_TIC2406_01".LetzterWert
    Falls du die Daten in deinem DB in Real abspeicherst, braucht du die DTR und TRUNC-Funktionen nicht zu nutzen.
    So mache ich das immer und das klappt ganz gut
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN

  3. #3
    mpe86at ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.09.2010
    Beiträge
    26
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke für die Antwort.

    Aber ich denke nicht, dass das für mich nutzbar ist. Denn ich brauche den genauen Durchschnitt der Temperatur über einen variablen Zeitraum. Einmal sind das 100s und ein anderes mal eine Stunde.

    Dein Beispiel ist aber eher eine Glättung der Variable und nicht der Durchschnitt. Oder?

    lg, Michael

  4. #4
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.138
    Danke
    225
    Erhielt 127 Danke für 85 Beiträge

    Standard

    Jain. Es berechnet auch schon den Durchschnitt. Aber halt immer. Über bestimmte Zeiträume geht das natürlich nicht (stand im übrigen in deinem 1. Post nicht drin).
    Wenn du das aber mal in einer Excel-Tabelle nachstellst, wirst du sehen, das zum Durchschnitt Abweichungen erst ab der 2. Kommastelle auftreten.
    Mit dem Verschieben der Prozente (50/50 oder 30/70) kann man das "Verhalten" auch bissel anpassen. Aber einer bestimmten Prozent-Zahl wird es dann kein
    Durchschnitt mehr sondern geht dann wirklich in Richtung Glättung.
    Wenn man es genauer braucht, dann wird es wohl Speicherhungrig nur gehen.
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN

  5. #5
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Wie schnell ändert sich denn deine Temperatur?

    Ich kann mir nicht vorstellen dass du nach einem Zyklus schon wieder einen neuen Wert aufnehmen musst weil du eine signifikante Änderung hast.
    Wenn du nur alle 10s einen Wert brauchst kannst du dir ein FIFO über 360 Werte aufbauen...
    mfG Aventinus

  6. #6
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.138
    Danke
    225
    Erhielt 127 Danke für 85 Beiträge

    Standard

    Zitat Zitat von Aventinus Beitrag anzeigen
    Wie schnell ändert sich denn deine Temperatur?

    Ich kann mir nicht vorstellen dass du nach einem Zyklus schon wieder einen neuen Wert aufnehmen musst weil du eine signifikante Änderung hast.
    Wenn du nur alle 10s einen Wert brauchst kannst du dir ein FIFO über 360 Werte aufbauen...
    Zitat Zitat von mpe86at Beitrag anzeigen
    Hallo zusammen.

    Min/Max ist ja kein Problem, aber für den Durchschnitt habe ich keine "Speicherschonende" Lösung parat.
    Das wäre auch mein Vorschlag, aber nicht sein Ziel
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN

  7. #7
    Registriert seit
    12.04.2005
    Ort
    Black Forest
    Beiträge
    1.344
    Danke
    28
    Erhielt 131 Danke für 118 Beiträge

    Standard

    Zitat Zitat von mpe86at Beitrag anzeigen
    Hallo zusammen.

    Mal eine kurze Frage:
    Wie würdet ihr den Durchschnitt einer Variable über eine fortlaufende Zeit berechnen.
    Min/Max ist ja kein Problem, aber für den Durchschnitt habe ich keine "Speicherschonende" Lösung parat.

    Mein erster Ansatz war folgender:
    Code:
    L     "DB_TIC2406_01".TempIst
    L     "DB_TIC2406_01".ZwischenWert
    +D
    T     "DB_TIC2406_01".ZwischenWert
    
    L     "DB_TIC2406_01".Counter
    L     1
    +D
    T     "DB_TIC2406_01".Counter
    
    L     "DB_TIC2406_01".ZwischenWert
    L     "DB_TIC2406_01".Counter
    /D
    T     "DB_TIC2406_01".TempDS
    Aber mit dieser Variante würde ich sehr schnell in den Overflow der Variablen kommen.
    Hat irgend jemand einen besseren Vorschlag?

    Danke schon mal im Voraus
    lg, Michael
    Du könntest auch den Gleitender Mittelwert berechnen, somit musst nicht durch den Divisor die Aanzhal der Stützpunkte begrenzen.

    Also


    Neuer_Mittelwert = ( ( n - 1 ) * alter_Mittelwert + Messwert ) / n


    10 12 14 12 15 12 13 ...

    Wenn ich jeweils 3 Messwerte zusammenfasse, um die Mittelwerte zu berechnen, dann hab ich
    ( 10 + 12 + 14 ) / 3 = 36 / 3 = 12
    ( 12 + 14 + 12 ) / 3 = 38 / 3 = 12.666
    ( 14 + 12 + 15 ) / 3 = 41 / 3 = 13.666
    ( 12 + 15 + 12 ) / 3 = 39 / 3 = 13
    ( 15 + 12 + 13 ) / 3 = 40 / 3 = 13.333

    und damit man das so rechnen kann, muss man immer die letzten 2 Messungen vorrätig halten. Bei 3 Werten geht das, bei 2000 Werten mag das ein Problem sein.
    Man kanns aber auch anders machen. Da 12 der Mittelwert war, der bei der ersten Messung rausgekommen ist, kann ich den nächsten Mittelwert berechnen,
    indem ich anstelle ( 12 + 14 + 12 ) / 3 einfach den zuletzt bekannten Mittelwert anstelle der ersten beiden (gemerkten) Messwerte einsetze
    ( 12 + 12 + 12 ) / 3 = 36 / 3 = 12 und analog das ganze mit den anderen jeweils neue dazugekommenen Messwerten

    10 12 14 12 15 12 13

    4. Messung: ( 12 + 12 + 12 ) / 3 = 36 / 3 = 12
    5. Messung: ( 12 + 12 + 15 ) / 3 = 39 / 3 = 13
    6. Messung: ( 13 + 13 + 12 ) / 3 = 38 / 3 = 12.666
    7. Messung: ( 12.666 + 12.666 + 13 ) / 3 = 38.332 / 3 = 12.777
    8. Messung: ( 12.777 + 12.777 + 10 ) / 3 = 35.554 / 3 = 11.851

    Was fällt auf? Zunächst mal hinkt der Mittelwert etwas hinterher. Er reagiert nicht mehr so schnell auf die Änderung des Messwertes, wie das Original.
    Daher auch 'gleitend' - weil er dem tatsächlichen Zahlenwert hinterhergleitet.
    Wenn der Messwert sich auf einen Zahlenwert stabilisert, 'gleitet' der Mittelwert an diesen Wert heran.

  8. #8
    mpe86at ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.09.2010
    Beiträge
    26
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo zusammen.

    Danke für die verschiedenen Lösungsansätze.

    Ich denke, dass ich alle 10s einen Wert aufnehme und einen FIFO mache und über diesen werde ich dann den Mittelwert rechnen.

    Danke für die Hilfe.

    lg, Michael

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    @TE:
    dein eigener Ansatz ist natürlich am Präzisesten - gleichzeitig aber auch der Ansatz, der nicht besonders Resourcen- und CPU-Leistung-schonend ist.
    Ich persönlich halte es bei so etwas mit dem von Krumnix genannten Weg - nur mit einer anderen Wichtung - bei mir "neuer Mittelwert := (10 * letzter Mittelwert + neuer Messwert) / 11". Man kann das aber beliebig variieren - denk mal drüber nach ...

    Gruß
    Larry

  10. #10
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    @TE:
    dein eigener Ansatz ist natürlich am Präzisesten - gleichzeitig aber auch der Ansatz, der nicht besonders Resourcen- und CPU-Leistung-schonend ist.
    Ich persönlich halte es bei so etwas mit dem von Krumnix genannten Weg - nur mit einer anderen Wichtung - bei mir "neuer Mittelwert := (10 * letzter Mittelwert + neuer Messwert) / 11". Man kann das aber beliebig variieren - denk mal drüber nach ...

    Gruß
    Larry
    ja ja, die Wichtung....

    der Vorteil dieses Ansatzes ist es ja auch, dass relativ schnell und rescourenschonend die Glättung verändert werden kann. Wenn du mal schnell auf "neuer Mittelwert := (100000 * letzter Mittelwert + neuer Messwert) / 100001" umstellen willst ist das auch kein Problem. Bei der FIFO-Variante macht das dann schon richtig Spaß.
    mfG Aventinus

Ähnliche Themen

  1. Globale Variable in einer Aktion?
    Von Phase8421 im Forum HMI
    Antworten: 3
    Letzter Beitrag: 17.06.2008, 15:00
  2. Antworten: 10
    Letzter Beitrag: 18.11.2007, 21:07
  3. Durchschnitt von 10 Takten
    Von dimo_77 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 17.07.2007, 14:08
  4. Durchfluss einer Rohrleitung berechnen
    Von hubert im Forum Stammtisch
    Antworten: 6
    Letzter Beitrag: 06.12.2005, 12:25
  5. ANFÄNGER mit einer C++ Action das gestrige Datum berechnen
    Von dellamorte-dellamore im Forum Hochsprachen - OPC
    Antworten: 4
    Letzter Beitrag: 15.11.2005, 17:38

Lesezeichen

Berechtigungen

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