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:
- Das IO Board sendet die Daten im Sekundentakt und die Prozessorlast auf meinem IPS Rechner (1,3Ghz Pentium3mobile, 512mb Ram) stieg um satte 20%.
- Ich hatte innerhalb einer Woche 3 mal einen IPS Komplettausstieg. Dienst beendet, keinen Eintrag im Logfile - einfach Ende.
- 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