Seite 3 von 10

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 08:25
von hanan
Hallo paul53
Hmmmm... zu früh gefreut.

Es wird ein Wert berechnet und in die Variable geschrieben, also der Script funzt.

Nur muss etwas mit der Berechnung nicht stimmen, da die Werte gegenüber dem Sensorwert sehr tief sind.
Eigentlich müsste der Wert aus der Variablen geholt werden, mal (n-1) durch n gerechnet werden plus (aktueller Wert durch n) und zurück in die Variable.

Irgendwo fehlt da noch eine Klammer oder so...

Code: Alles auswählen

m = (m*(n-1)/n) +  dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value() /n;

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 12:19
von paul53
Die Formel stammt nicht von mir. Mein Ansatz zur Mittelwertbildung war ein anderer.

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 13:28
von paul53
Hier ein anderes Skript für eine gleitende Mittelwertbildung, das eine Hilfs-SV "AussenTListe" vom Typ "Zeichenkette" verwendet:

Code: Alles auswählen

! gleitender Mittelwert über n Werte
! Programm muß zyklisch per Zeitmodul ausgelöst werden

! Raumname ist Bestandteil des Kanalnamens (Raum.Sensor)
! und des Namens der Systemvariablen (RaumTListe)
string raum = "Aussen";

! Konstante: Anzahl Werte in der Liste
integer n = 24;

! Lokale Variablen
string  list;    ! Meßwertliste
integer len;     ! Element-Länge
real    s = 0.0; ! Summe

! Werte einlesen und verschieben
list = dom.GetObject(raum#"TListe").Value();
len = list.StrValueByIndex(",",0).Length() + 1;
list = list.Substr(len, list.Length() - len);

list = list#","#dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value().ToString(1);
dom.GetObject(raum#"TListe").State(list);

string summand;
foreach(summand, list.Split(","))
{s = s + summand.ToFloat();
}

! Mittelwert in Systemvariable schreiben
dom.GetObject(raum#"TMittel").State(s / n);
Bevor das obige Script verwendet werden kann muss die Zeichenketten-SV "AussenTListe" erst gefüllt (initialisiert) werden, was nur einmal ausgeführt werden muss / darf:

Code: Alles auswählen

! Liste initialisieren
string raum = "Aussen";
integer n = 24;
string x = dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value().ToString(1); 
string list = x;
integer i = 1;
while(i < n)
{list = list#","#x;
 i = i + 1;
}
dom.GetObject(raum#"TListe").State(list);

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 13:39
von BadenPower
hanan hat geschrieben:Irgendwo fehlt da noch eine Klammer oder so...

Code: Alles auswählen

m = (m*(n-1)/n) +  dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value() /n;
HM-Skript kennt keine Punkt-vor-Strich-Regel.

Daher musst Du die Division des aktuellen Wert durch n auch noch in Klammern setzen.

Code: Alles auswählen

m = (m*(n-1)/n) +  (dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value() /n);

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 14:52
von paul53
BadenPower hat geschrieben:HM-Skript kennt keine Punkt-vor-Strich-Regel.
Dafür eine Rechts-vor-Links-Regel. Diese Klammer sollte keinen Unterschied machen :?:

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 15:10
von BadenPower
EDIT hier stand Blodsinn.

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 15:26
von paul53
Du musst einen andern HM Script Interpreter haben:
Rechts_vor_Links.JPG
EDIT: Badenpower hat offenbar selbst bemerkt, dass es die Rechts-vor-Links-Regel gibt.

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 15:43
von BadenPower
paul53 hat geschrieben:EDIT: Badenpower hat offenbar selbst bemerkt, dass es die Rechts-vor-Links-Regel gibt.
Ja und daher habe ich mir das Skript nochmals angeschaut und wieder den schlichtweg unverzeihlichen Anfängenfehler bemerkt.
Und der wäre:

Eine Variable als einen bestimmten Typ deklarieren und einen anderen Typ zuweisen.
Hier ein real deklariert und ein Integer zugewiesen.

Code: Alles auswählen

real    n = 6; ! Anzahl der Mittelwerte
Das n ist hier kein Real mehr, sondern schon ein Integer.

Durch die rechts-vor-links-Regel wird mitten in der Berechnung mit einem Integer gerechnet statt mit einem real, was "(n -1) / n" natürlich immer zu 0 werden läßt.
Dies entsteht durch die Regel: Nimm immer den Typ an, welcher links steht.

Code: Alles auswählen

real n = 10;
real ausgabe = 3.0 * (n-1) / n;
WriteLine(ausgabe);

real n = 10.0;
real ausgabe = 3.0 * (n-1) / n;
WriteLine(ausgabe);

Re: Script für gleitenden Mittelwert

Verfasst: 11.06.2016, 16:13
von paul53
BadenPower hat geschrieben:Durch die rechts-vor-links-Regel wird mitten in der Berechnung mit einem Integer gerechnet statt mit einem real, was "(n -1) / n" natürlich immer zu 0 werden läßt.
Stimmt, das hätte mir auch auffallen können; aber wie schon erwähnt, stammt diese Lösung nicht von mir. n hätte richtig deklariert werden müssen:

Code: Alles auswählen

real    n = 6.0; ! Anzahl der Mittelwerte

Re: Script für gleitenden Mittelwert

Verfasst: 12.06.2016, 06:45
von hanan
Hallo paul53, hallo BadenPower
Besten Dank, Ihr habt mir sehr weitergeholfen.

Es funzt jetzt...

Grüsse aus der Schweiz