GetObject("BidCos-RF.MEQ1600666:1.TEMPERATURE").DPByHssDP("TEMPERATURE")
Da ich auch gerade eine solche Aufgabe habe und mir das etwas zu durcheinandern war, habe ich das Skript einmal etwas aufgehübscht. In den Kommentaren ist eigentlich alles erklärt. Wichtig: in der ursprünglichen Version wurde der Sensorname genutzt und der auch noch mit Suffix erweitert. Habe ich alles rausgeworfen. Jetzt wird nur noch ein ordentlicher Gerätename mit allem drum und dran benötigt.
Oder hier: Link mein komplett selbst-konfigurierendes Skript
Die Variable für die Messwertliste muss auch nicht mehr vorher befüllt werden (angelegt aber schon), das wird dann beim ersten Durchlauf automatisch erledigt.
Code: Alles auswählen
! gleitender Mittelwert über n Werte
! Programm muß zyklisch per Zeitmodul oder bei Aktualisierung des Gerätes ausgelöst werden
! Die benötigten Systemvariablen müssen vorher angelegt werden
! Name der Systemvariable, Datentyp Zahl, fuer den gleitenden Mittelwert
string VarName = "Temp_Licht_Mittelwert";
! Gerät angeben von dem der Messwert kommen soll inkl. kompletter Schnittstelle, Kanal, DP z.B. "BidCos-RF.ABC1234567:1.TEMPERATURE" ODER Systemvariable die gemittelt werden soll "SV_Test"
string Geraet = "BidCos-RF.ABC1234567:1.TEMPERATURE";
! Name der Systemvariablen als Werteliste, die als Speicher fuer die interne Berechnung dient
string Liste = "Mittelwertbildung";
! Konstante: Anzahl Werte in der Liste
integer n = 5;
! Lokale Variablen
string list; ! Meßwertliste
integer len; ! Element-Länge
real s = 0.0; ! Summe
! Werte einlesen und verschieben
list = dom.GetObject(Liste).Value();
! prüfen ob die Variable schon korrekt befüllt wurde
if (list.Find(",") == -1)
{
! NEIN, Liste befüllen
string x = dom.GetObject(Geraet).Value().ToString(1);
string list = x;
integer i = 1;
while(i < n)
{list = list#","#x;
i = i + 1;
}
}
! aeltesten Wert rauswerfen
len = list.StrValueByIndex(",",0).Length() + 1;
list = list.Substr(len, list.Length() - len);
! Will man statt einem Gerät eine Variable auswerten, dann: dom.GetObject(Geraet).State() hier einsetzen
list = list#","#dom.GetObject(Geraet).Value().ToString(1);
dom.GetObject(Liste).State(list);
string summand;
foreach(summand, list.Split(","))
{s = s + summand.ToFloat();
}
! Mittelwert in Systemvariable schreiben
dom.GetObject(VarName).State(s / n);