PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ELVIS Berechnung gleitender Mittelwert



samosir
17.03.07, 15:42
Hallo,

in einer ELVIS Visualisierung möchte ich von einem Messwert der kurzzeitig starke Schwankungen hat gerne den gleitenden Mittelwert der letzten 10-20 Messwerte berechnen und dann Visualisieren.

VB ist leider nicht meine große Stärke, eventuell hat das aber schon mal jemand von euch gemacht und könnte mir auf die Sprünge helfen.

Mir fallen dazu so Sachen wie Ringspeicher usw. ein, aber mir fehlt der Zeiger in die mögliche Richtung.

Grüße
Alexander

Klaus Gütter
17.03.07, 18:40
Hallo,

Am einfachsten geht das mit einem "exponentiellen" Mittelwert. Die Idee ist, in regelmäßigen Abständen (Timer) einen geglätteten Wert aus dem Aktualwert zu berechnen mit einer Formel:

M(T) = (1-a) * M(T-1) + a * V(T)

dabei ist:
M(T) der geglätte Mittelwert zur Zeit T
V der Rohwert zur Zeit T
a ein Faktor zwischen 0 und 1. Je kleiner a ist, umso länger wird gemittelt.

Diese Formel hat den Vorteil, dass man sich nicht mehrere Werte merken muss. a und die Zykluszeit muss man halt je nach Quelle der Daten so anpassen, dass eine vernünftige Mittelung herauskommt.

Zur Realisierung in Elvis:

Rohwert = Aktualwert des Datenpunkts "Roh"
Mittelwert = Aktualwert des Datenpunkts "Mittel"
Timer-Datenpunkt = "Timer"

Dann als Formel für Mittelwert.ActualValue (nur mal beispielhaft für a = 0.3 und eine Zykluszeit von 10 Sekunden):



If @(Timer).ActualValue = 0 Then
' Timer ist abgelaufen
Result = 0.7 * IfNull(Database.Datapoint("Mittel")), "ActualValue", 0) + 0.3 * Database.Datapoint("Roh").ActualValue
' Timer wieder starten
Database.Datapoint("Timer").NominalValue = 10
End If


(Das IfNull fängt den Fall ab, dass Mittel noch keinen Wert hat, gibt es erst seit Elvis 2.5).

Jetzt muss man nur noch einmalig den Timer starten, z.B. im globalen Skript:



Sub OnInit()
Database.Datapoint("Timer").NominalValue = 10
End Sub


Gruß, Klaus Gütter

samosir
17.03.07, 20:13
Hallo,


Hallo,

Am einfachsten geht das mit einem "exponentiellen" Mittelwert. Die Idee ist, in regelmäßigen Abständen (Timer) einen geglätteten Wert aus dem Aktualwert zu berechnen mit einer Formel:

Gruß, Klaus Gütter


na, das nenne ich eine schnelle qualifizierte Antwort. Vielen Dank!

Habe das jetzt im Test und kann im Debugger sehen, wie sich der Mittelwert so langsam dem erwarteten Wert annähert.

Den zu mittelden Wert erhalte ich zyklisch alle 120 sec. Wäre es da nicht auch eine Möglichkeit, die Berechnung immer dann zu starten, wenn ich einen neuen Aktualwert erhalte, anstatt über einen Timer? Oder wird das dann ungenauer?

Grüße
Alexander

Klaus Gütter
18.03.07, 06:50
Den zu mittelden Wert erhalte ich zyklisch alle 120 sec. Wäre es da nicht auch eine Möglichkeit, die Berechnung immer dann zu starten, wenn ich einen neuen Aktualwert erhalte, anstatt über einen Timer? Oder wird das dann ungenauer?

Hallo Alexander,

ja klar. Dann kanst du dir den Timer sparen. Du solltest für den reinkommenden Wert dann aber einen Datenpunkttyp nehmen, bei dem "Befehl" angehakt ist. Ansonsten würde die Berechnung nicht ausgeführt, wenn den neue Wert gleich dem alten ist.

Gruß, Klaus

samosir
18.03.07, 13:15
Hallo Klaus,


Hallo Alexander,

ja klar. Dann kanst du dir den Timer sparen. Du solltest für den reinkommenden Wert dann aber einen Datenpunkttyp nehmen, bei dem "Befehl" angehakt ist. Ansonsten würde die Berechnung nicht ausgeführt, wenn den neue Wert gleich dem alten ist.

Gruß, Klaus


Genau das hatte ich erst falsch gemacht und es kommen ab und an gleiche Werte, die das Ergebnis verfälscht hatten.

Wären die statistischen Methoden nicht mal ein Ansatz für ein neues Makro in ELVIS?
Gerade bei der Aufzeichnung und Auswertung von Messreihen z.B. bei der Heizungs- und Wetterdaten ist das sehr hilfreich.
Ich setze bei mir u.a. einen Warmemengenzähler von RTS-Automation ein und dabei geht es mir vor allem um die Auswertung etwas längerer (z.B 1 Stunde) Trends.
Habe mit auch schon mal überlegt, eventuell RRD-Tool ( http://oss.oetiker.ch/rrdtool/ ) einzubinden. Das wird vor allem bei der Netzwerküberwachung zur Erfassung von Zeitreihen verwendet.

Grüße
Alexander