Speicherbedarf Dashboard

Hallo,

ich habe mir zum Experimentieren ein WIZNET WIZ220IO Board zugelegt. Es ist ähnlich dem AVR Net-IO mit je 2 12bit ADC Ein- und Ausgängen, je 8 digitalen Ein- und Ausgängen und einem Webserver - aber nur ein Drittel so groß.
Die Einbindung in IPS über ClientSocket, Registervariable und einem Skript, welches einen 45Byte langen String in die entsprechenden Variablen aufteilt, funktionierte auf Anhieb.

Allerdings begannen jetzt meine Probleme:

  1. Das IO Board sendet die Daten im Sekundentakt und die Prozessorlast auf meinem IPS Rechner (1,3Ghz Pentium3mobile, 512mb Ram) stieg um satte 20%.
  2. Ich hatte innerhalb einer Woche 3 mal einen IPS Komplettausstieg. Dienst beendet, keinen Eintrag im Logfile - einfach Ende.
  3. Der Speicherbedarf meines Remote-Dashboards stieg konstant an - ca. 1Mb pro 5 Minuten - zweimal in Verbindung mit einer Zeitverzögerung, d.h. die visualisierte IPS Rechnerzeit ging auf dem Remotedashboard alle 5 Minuten 1 Minute nach.

Ich habe daraufhin alles wieder deaktiviert, Remote-Dashboard neu gestartet und siehe da, der Speicherbedarf blieb konstant.

  • ClientSocket Verbindung geöffnet (ohne Registervariable) - Speicherbedarf blieb konstant, Prozessorlast IPS Rechner ohne Änderung.
  • Registervariable aktiviert (ohne Skript) - Speicherbedarf blieb konstant, Prozessorlast IPS Rechner ohne Änderung.
  • Skript aktiviert - Speicherbedarf steigt mit 1Mb pro 5 Minuten, Prozessorlast +20%.
  • Script wieder deaktiviert - Speicherbedarf bleibt konstant, aber der Mehrbedarf wird nicht mehr freigegeben, Prozessorlast normal.
  • Script aktiviert - Spiel beginnt von vorne.

Den Zeitverzug konnte ich leider nicht mehr reproduzieren.

Was ist an diesem Skript so ungewöhnlich, dass es die Speicherverwaltung der Remote-Konsole völlig durcheinander bringt???

$Puffer = GetValueFloat(50783 /*[Test\WIZNET220IO\Temperaturpuffer]*/);
$Zaehler = GetValueInteger(53327 /*[Test\WIZNET220IO\Temperaturzähler]*/);

$buffer = $IPS_VALUE;
$MAC = bin2hex($buffer[10])." ".bin2hex($buffer[11])." ".bin2hex($buffer[12])." ".bin2hex($buffer[13])." ".bin2hex($buffer[14])." ".bin2hex($buffer[15]);
SetValueString(53313 /*[Test\WIZNET220IO\MAC-Adresse]*/,$MAC);
$IP = hexdec(bin2hex($buffer[16])).".".hexdec(bin2hex($buffer[17])).".".hexdec(bin2hex($buffer[18])).".".hexdec(bin2hex($buffer[19]));
SetValueString(22597 /*[Test\WIZNET220IO\IP-Adresse]*/,$IP);
$AnaIn_1 = round(hexdec(bin2hex($buffer[36].$buffer[37])) * 5000/4095);
SetValueInteger(59587 /*[Test\WIZNET220IO\Analog In 1]*/,$AnaIn_1);
$AnaIn_2 = round(hexdec(bin2hex($buffer[38].$buffer[39])) * 5000/4095);
SetValueInteger(48987 /*[Test\WIZNET220IO\Analog In 2]*/,$AnaIn_2);
$AnaOut_1 = round(hexdec(bin2hex($buffer[40].$buffer[41])) * 4000/4095);
SetValueInteger(54975 /*[Test\WIZNET220IO\Analog Out 1]*/,$AnaOut_1);
$AnaOut_2 = round(hexdec(bin2hex($buffer[42].$buffer[43])) * 4000/4095);
SetValueInteger(24718 /*[Test\WIZNET220IO\Analog Out 2]*/,$AnaOut_2);
$DigiIn_1 = $buffer[20];
SetValueString(47015 /*[Test\WIZNET220IO\Digital In 1]*/,$DigiIn_1);
$DigiIn_2 = $buffer[21];
SetValueString(37878 /*[Test\WIZNET220IO\Digital In 2]*/,$DigiIn_2);
$DigiIn_3 = $buffer[22];
SetValueString(57654 /*[Test\WIZNET220IO\Digital In 3]*/,$DigiIn_3);
$DigiIn_4 = $buffer[23];
SetValueString(57566 /*[Test\WIZNET220IO\Digital In 4]*/,$DigiIn_4);
$DigiIn_5 = $buffer[24];
SetValueString(27575 /*[Test\WIZNET220IO\Digital In 5]*/,$DigiIn_5);
$DigiIn_6 = $buffer[25];
SetValueString(57080 /*[Test\WIZNET220IO\Digital In 6]*/,$DigiIn_6);
$DigiIn_7 = $buffer[26];
SetValueString(29133 /*[Test\WIZNET220IO\Digital In 7]*/,$DigiIn_7);
$DigiIn_8 = $buffer[27];
SetValueString(22002 /*[Test\WIZNET220IO\Digital In 8]*/,$DigiIn_8);
$DigiOut_1 = $buffer[28];
SetValueString(56339 /*[Test\WIZNET220IO\Digital Out 1]*/,$DigiOut_1);
$DigiOut_2 = $buffer[29];
SetValueString(24953 /*[Test\WIZNET220IO\Digital Out 2]*/,$DigiOut_2);
$DigiOut_3 = $buffer[30];
SetValueString(33353 /*[Test\WIZNET220IO\Digital Out 3]*/,$DigiOut_3);
$DigiOut_4 = $buffer[31];
SetValueString(42608 /*[Test\WIZNET220IO\Digital Out 4]*/,$DigiOut_4);
$DigiOut_5 = $buffer[32];
SetValueString(25670 /*[Test\WIZNET220IO\Digital Out 5]*/,$DigiOut_5);
$DigiOut_6 = $buffer[33];
SetValueString(39454 /*[Test\WIZNET220IO\Digital Out 6]*/,$DigiOut_6);
$DigiOut_7 = $buffer[34];
SetValueString(49193 /*[Test\WIZNET220IO\Digital Out 7]*/,$DigiOut_7);
$DigiOut_8 = $buffer[35];
SetValueString(41908 /*[Test\WIZNET220IO\Digital Out 8]*/,$DigiOut_8);

If ( $Zaehler == 60) {
     $AnaIn_1glatt = $Puffer / $Zaehler;
     $R_Temperatur = (5000 - $AnaIn_1glatt)/$AnaIn_1glatt * 40000;
     $Temp = round(1 / (0.0011377737 + 0.00022973755 * log($R_Temperatur) + 0.00000012834967 * pow(log($R_Temperatur),3)) - 273.15,1);
	  SetValueFloat(49959 /*[Test\WIZNET220IO\Temperatur]*/, $Temp);
	  SetValueFloat(50783 /*[Test\WIZNET220IO\Temperaturpuffer]*/, 0);
	  SetValueInteger(53327 /*[Test\WIZNET220IO\Temperaturzähler]*/, 0);
	  } else {
	  $Puffer = $Puffer + $AnaIn_1;
	  $Zaehler = $Zaehler + 1;
     SetValueFloat(50783 /*[Test\WIZNET220IO\Temperaturpuffer]*/, $Puffer);
     SetValueInteger(53327 /*[Test\WIZNET220IO\Temperaturzähler]*/, $Zaehler);
	  };

Wenn ich ein leeres Script mit der Registervariable verknüpfe ist alles gut.
Kopiere ich zeilenweise das o.a. Script in das Leerskript, bewegt sich bis zum Schreiben der Variable $AnaIn_2 der Speicherzuwachs des Dashboards noch in homöopatischen Dosen, ab dem Schreiben der Variable $AnaOut_2 kann man im Taskmanager aber zusehen, wie der Speicherbedarf steigt.

Ich bin im Augenblick ein wenig ratlos. Hat vielleicht irgendjemand eine Idee oder sogar die Lösung??

Grüße
Stephan

Edit:
Zeitverzug lässt sich zwar nicht direkt reproduzieren, aber er taucht auf. 19min innerhalb der letzten 2,5 Stunden

Weitere Maßnahmen der Fehlersuche:

  • Aktivierung des Backups meiner 2.1 Erstinstallation. Der Fehler bleibt.
  • Deaktivierung der Tommi Module für den ELV WDE1. Der Fehler bleibt.
  • Deaktivierung des Datenbank Loggings. Der Fehler bleibt.

Hat wirklich keiner eine Idee, was da schief laufen könnte??

Grüße Stephan

Hallo Stephan,

wenn ich mich nicht verlesen habe, willst Du doch Hex und Decimalwerte haben?
Warum nimmst Du dann nicht bindec anstatt 2 mal zuwandeln.

Hallo Rainer,

das habe ich auch zuerst versucht.

bindec($buffer[16]) als erster Teil der IP Adresse ergibt aber 0, wohingegen
hexdec(bin2hex($buffer[16])) den richtigen Wert 192 ergibt.

Im PHP manual steht bei bindec auch nur was von binary number.
Ich habe den String mal als Anhang mit beigelegt.

Grüße
Stephan

dump.txt (1.76 KB)

dumpHEX.txt (5.78 KB)

Versteh ich jetzt nicht deine Wandlungen. Im Dump ist doch alles hex. Da reicht doch ein hexdec aus oder steh ich komplett auf dem Schlauch.

$s = hexdec($buffer[17]).".".hexdec($buffer[18]).".".hexdec($buffer[19]);

Ich habe die Senderate des IO-Modules mal runtergesetzt und festgestellt, dass jedes empfangene Datenpaket vom Modul den Speicherbedarf des Remotedashboards um 8KByte erhöht.

Grüße Stephan

Hallo Rainer,

gemäß dem Manual vom Modul hatte ich auch verstanden, dass ein HEX String gesendet wird, aber dein Code Schnipsel ergibt definitiv 0.0.0.0.

Grüße
Stephan