Problem Script PI Regler

Hallo ich habe ein Problem mit folgendem Script.

Wenn ich es zyklich alle 5min ausführe hängt sich nach einer ungleichen Zeit zwischen 30 min und 5 h iergendwas im IPS auf so das sich andere Scripte nicht mehr ausführen lassen.

Vielleicht ist da ja ein fehler drinn könnt ihr mal drüber schauen und eventuelle Verbesserungen vorschlagen?

Danke und frohe Weihnachten.

Markus

$Kp=5; //Kp = Verstärkungsfaktor Proportionalregler
$Ki=2.5; //Ki = Verstärkungsfaktor Integralregler
$Kd=0; //Kd = Verstärkungsfaktor Differenzialregler
$Script = IPS_GetScript($IPS_SELF);
$Ta=Round((time() - $Script['LastExecute'])/60,0); //Ta = Rechenschrittweite (Abtastzeit)

// Objekt-ID der genutzten Variablen, Sensoren und Aktoren
$SollTemperatur = 16949 /*[Module\Thermostat_Funkmodule\Temperaturregelungen Modul_1\Badezimmer\Solltemperatur]*/;
$IstTemperatur = 23038 /*[Module\DS1820\Bad - OG\Temperatur]*/;
$HeizungsStellelement = 10756 /*[Module\Thermostat_Funkmodule\Temperaturregelungen Modul_1\Badezimmer\Heizungsstellelement]*/;
$SummeRegelabweichungen = 39168 /*[Module\Thermostat_Funkmodule\Temperaturregelungen Modul_1\Badezimmer\SummeRegelabweichung]*/;
$VorherigeRegelabweichung = 45251 /*[Module\Thermostat_Funkmodule\Temperaturregelungen Modul_1\Badezimmer\VorherigeRegelabweichung]*/;
$Stellmotorsender = 37283 /*[HID_1]*/;

//aktuelle Regelabweichung bestimmen
$e = GetValueFloat($SollTemperatur)- GetValueFloat($IstTemperatur);

// Die Summe aller vorherigen Regelabweichungen bestimmen
If ((GetValueInteger($HeizungsStellelement) == 0) and ($e < 0))
    // Die Negativ-Werte sollen nicht weiter aufsummiert werden, wenn der Stellmotor schon auf 0 ist
    {
   $esum = (GetValueFloat($SummeRegelabweichungen));
   }
elseif ((GetValueInteger($HeizungsStellelement) == 100) and ($e > 0))
    // Die Positiv-Werte sollen nicht weiter aufsummiert werden, wenn der Stellmotor schon auf 100 ist
    {
   $esum = (GetValueFloat($SummeRegelabweichungen));
   }
else
    {
    $esum = (GetValueFloat($SummeRegelabweichungen)) + $e;
    }

SetValueFloat($SummeRegelabweichungen, $esum);

// Die vorherige Regelabweichung ermitteln
$ealt = GetValueFloat($VorherigeRegelabweichung);

//Schutzmechanismus falls Skript innerhalb einer Minute zweimal ausgeführt wird
If ($Ta < 1)
{
$Ta = 1;
}

// Die Berechnung des neuen Regelwertes
$y = ($Kp * $e + $Ki * $Ta * $esum + $Kd * ($e - $ealt) / $Ta);

// Vorherige Regelabweichung durch jetzige ersetzen
SetValueFloat($VorherigeRegelabweichung, $e);

$NeuerWert = $y;

If ($NeuerWert < 0)
    {
    $NeuerWert = 0;
    }
elseif ($NeuerWert > 100)
    {
    $NeuerWert = 100;
    }

SetValueInteger($HeizungsStellelement, $NeuerWert);

//Umskalierung auf 0-255 und Errechnung des HEXwertes
$Hexwert = dechex(Round(($NeuerWert * 2.55)));

$Sendewert = "0x$Hexwert";

//Stellwert ändern
HID_SendEvent($Stellmotorsender, 0, chr(0x04).chr($Sendewert).chr(0x02));

Abend Markus!

Hast du mal das „Meldungen“-Fenster in der IPS Console beobachtet, ob da was zu sehen ist? Evtl. läuft das Skript manchmal auf Fehler und die Task Queue läuft voll? Was sagt der Task Manager im Windows dann? Arbeitsspeicher vollkommen belegt durch IPS?

Hatte das mal bei meinem Terrarium-Sternenhimmel-funkeln-Skript…war ein nicht direkt sichtbarer Fehler drin und das hat über Stunden dann langsam meinen IPS Server ausgebremst bis zum Stillstand.
> Bei mir war es die Stelle, wo die Befehle an den RGBW868 gesendet wurden…bei dir vlt. das HID_SendEvent?!

Grüße,
Chris

Hallo Chris,

Fehler habe ich im Meldungsfenster nicht festgestellt.

Wie konntest du denn den Fehler bei deinem Sternenhimmel beheben?

Markus

Ich hab den Fehler aus meinem Skript beseitigt und zur Sicherheit Frage ich noch die Task Queue ab und wenn diese voll läuft, dann stoppe ich zur Sicherheit das Skript, damit der IPS-Server nicht abschmiert, sich wieder beruhigen kann und dann starte ich das Skript wieder. Ist aber nur ein „Notfall-Stop“ und nicht direkt die Lösung deines Problems.

…man muss erst mal deinem Problem auf die Schliche kommen :confused:

Was sagt denn dein Windows Task-Manager, wenn alles hängt? Arbeitsspeicher durch IPS Console ausgelastet?

Wie sieht die Task Queue aus? In der IPS-Console auf „Ansicht hinzufügen“ und dann auf „PHP Informationen“… Sind da dann Skripts die hängen?

Grüße,
Chris

Also, wa sich bis jetzt rausgefunden habe ist das wenn ich:

HID_SendEvent($Stellmotorsender, 0, chr(0x04).chr($Sendewert).chr(0x02));  

mit // raus Kommentiere dann läuft das Script und die Berechnung ohne Probleme.

Markus

Hatte ich befürchtet, ist dann wie bei meinem Sternenhimmel…da kann er irgendwann nicht mehr die Befehle absetzen (warum auch immer) und dann schaukelt sich alles hoch und IPS ist dicht und nichts geht mehr :confused:

Also musst du einen „stabileren“ Weg finden oder einen „Notfall-Stop“ einbauen, wo sich alles „zurücksetzt“ und neu und frisch beginnt…aber da kann man dir über die Ferne schlecht helfen…

Grüße,
Chris

Wie sieht denn so ein „Notfall-Stop“ aus?

Markus

Wie gesagt, ich überwache die PHP Task Queue. Wenn diese über 60 ist, dann stoppe ich das Funkeln vom Sternenhimmel im Terrarium…

Aber das ist nicht das, was dein Hauptaugenmerk sein sollte! Du solltest dich lieber um die Lösung des eigentlichen Problems bemühen! Denn bei meinem Sternenhimmel ist es nicht schlimm, wenn der mal kurz nicht funkelt, aber wenn andere Steuerungen nur kurz laufen und dann wieder nicht mehr und dann wieder usw, dann ist das nicht gerade gut und wohl auf Dauer nicht akzeptabel :wink:

Ich würde dir gern helfen, aber keine Ahnung… Kannst du den Problem-Teil „HID_SendEvent($Stellmotorsender, 0, chr(0x04).chr($Sendewert).chr(0x02));“ irgendwie anders umsetzen? Über HTTP Aufrufe oder irgendwie anders das ganze steuern/schalten/regeln?

Grüße,
Chris

Ist aber nicht zufällig die Linux/Mac Testversion, oder ?
Die hat noch Probleme mit dem HID-Modul.
Michael

Ne wüsste nicht wie ich spreche halt damit das HID Modul von Helmut an.

Markus

Ne läuft auf nem Windows Server 2008 R2

Markus