da ich in letzter Zeit wieder mal Probleme mit meiner FHZ 1300 hatte, habe ich mich mal an die Lösung des Problems gewagt.
Der Grund ist, das sich meine FHZ 1300 in unregelmaessigen Zeitabständen
aufhaengt. Der Fehler im Log lautet „Could not open Device“ und wurde auch schon hier im Forum besprochen. Bei mir hilft dann nur ein deaktivieren im Geraetemanager von Windows 7 mit anschliessendem Aktivieren.
USB-Port und Kabel tauschen half nicht und so habe ich mich entschlossen die Log-Datei im regelmaessigen Intervall auszuwerten und mein FTDI-Device mittels Devcon -Tool per Script zu resetten. Das Devcon-Tool kann anhand der
Vendor ID (VID) gezielt die FHZ identifizieren und resetten (disable/enable).
Eine genaue Beschreibung findet man im Internet.
Ich poste hier mal mein Script um die Log-Datei auszuwerten :
ich entschuldige mich schonmal fuer meinen Programmstil aber ich bin kein
und werde wohl niemals ein Programmierer
// zunaechst die neuste Log - Datei im Log Verzeichniss finden weil taeglich eine neue Log-Datei erzeugt wird
$n_datei = "";
$n_dat = 0;
$dir = "C:\\IP-Symcon\\logs"; // Das IP-Symcon Log Verzeichnis nach Bedarf setzen
$dir_h = opendir($dir);
while($file = readdir($dir_h))
{
$datum = filemtime($dir . "/" . $file);
if ($datum > $n_dat)
{
$n_dat = $datum;
$n_datei = $file;
}
}
closedir($dir_h);
//ab hier wird die gefundene neueste Log Datei durchsucht
$fname = "C:\\IP-Symcon\\logs\\".$n_datei;
// Logdatei nach Fehlertext durchsuchen
$muster = "Could not open Device"; // hier kann man ein eigenes Fehlermuster angeben - danach wir in der Log-Datei gesucht
// falls Log-Datei sauber ist wird ein globaler Schalter gesetzt hier erstmal der Anfangswert auf false
SetValueBoolean (50111 /*[Wartung\Variablen\FTDI LogFehler]*/,false);
//Abfangen von Datei Lesefehlern
$errorMessage = "Fehler beim Zugriff auf die Datei $fname";
if (is_readable($fname))
{
$fp = fopen($fname, 'r');
if(!$fp)
{echo $errorMessage;
exit;
}
while (!feof($fp)) // Lesen bis ans Ende der Log Datei
{
$fline=fgets($fp); // zeilenweise Log Datei lesen
$treffer = substr_count ( $fline, $muster ); // Variable setzen falls ein Fehler gefunden wird
if ($treffer>0)
{
// globalen Fehlerstatus erzeugen und nach eigenen Wuenschen anpassen
SetValueBoolean (50111 /*[Wartung\Variablen\FTDI LogFehler]*/,true);
// Datum und Uhrzeit des Letzten Treffers aus der Zeile in der Log Datei extrahieren und global speichern
// es darf nur die Uhrzeit und nicht der komplette String global gespeichert werden da sonst der Fehler wieder im Log auftaucht
SetValueString (48842 /*[Wartung\Variablen\Letzte Fehlermeldung]*/,substr($fline, 0, 19));
}
}
fclose($fp);
}
else
{
echo $errorMessage;
exit;
}
Ich habe mir noch 3 Variablen dazu angelegt :
LogFehler vom Typ Boolean - zeigt an ob in der aktuellen Log-Datei ein Fehler angezeigt wird
Letzte_Fehlermeldung vom Typ String - speichert Datum und Uhrzeit des Fehlers die in der Log-Datei angegeben werden
Letzter_Reset vom Typ String - speichert Datum und Uhrzeit des letzten FTDI-Resets mittels Devcon-Script
So kann ich sicherstellen das der FTDI-Reset nur durchgeführt wird wenn Datum und Uhrzeit des letzten Resets weiter in der Vergangenheit liegen als der aktuell angezeigte Fehler aus der Log-Datei.
Getriggert habe ich das Script alle 10 min. Die Laufzeit bleibt auch bei gut gefuellter Log-Datei bei etwa 2 Sekunden. Beim Testen habe ich meine FHZ im Gerätemanager deaktiviert und den Rechner neu gebootet. Nach 10 min war war das FTDI-Device wieder eingehaengt .
Danke für den Tip - habs gleich nochmal getestet mit dem Event-Handler.
Also unter Status Events auf hinzufügen und dann einmal mit FTDI und einmal mit FHZ… Instanz. Habe jeweils mein getestetes Reset-Script angegeben was dann ausgeführt werden soll. Dann wieder im Geraetemanager die FHZ deaktiviert
und Server neu gebootet so dass dass FTDI Device in IP-Symcon als fehlerhaft und geschlossen gemeldet wird. Das Script wurde aber nicht ausgeführt.
Habe das Script nochmal gecheckt (2 Bedingungen entfernt) und ein sleep (10) am Anfang eingefügt. Das Device wird aber nicht resetet. Habe ca 15 min gewartet.
Das Script startet zur Zeit automatisch wenn sich eine Fehlervariable aendert und wurde von mir mehrfach getestet.
Es wird im Script nur ueber eine Bedingung ueberprueft ob schon ein Reset durchgefuehrt wurde. Die Bedingung hab ich zum Testen mit dem Event-Handler einfach auskommentiert. Aber die Devcon-Befehle hab ich nicht angeruehrt und die funktionieren nachweislich mit diesen Pfadangaben.
Ich verstehe nicht warum das Script nicht mit dem EventHandler fkt. wenn es per Hand geht…
Wird denn die Variable 33213 geschrieben wenn IPS startet?
Im übrigen glaube ich, wie auch RWN erkannt hat, das es besser währe die Ursache für das Problem zu finden. Treiber, Kabellänge, Firmware, Port, Bios Update etc. sind die üblichen Verdächtigen.
die Variable 33213 wird nicht geschrieben.
Die Ursache für das Problem zu finden, bin ich natürlich schon angegangen.
Da ich nach jeder einzelnen Aenderung an meiner Konfiguration auch schon mal mehrere Wochen warten muesste bis der Fehler auftritt kann sich das ueber Monate hinziehen.
Die Hardware :
Notebook Dell Inspiron Dual Core (alle Bios Updates die verfuegbar waren)
FHZ 1300 mit FTDI 2.04.16 von der IP-Symcon Homepage
Windows 7 Ultimate permanently updated
USB Ports wurden alle getestet und Kabel wurden getauscht.
Hatte auch schon Ausfaelle der FHZ an meinem Vorgaenger-PC auf dem WHS lief.
Ich werde nochmal ein paar Tests machen (z.B.virtueller Com-Treiber).
Etwaige Ausfaelle kann ich mir ja jetzt mit meinem Script protollieren lassen.
Na das FTDI-Device soll doch nicht beim Start resetet werden sondern wenn es nicht mehr funktioniert. Deswegen hab ich es im Event-Handler nicht unter Start-Script eingetragen sondern unter Event Status . Da kommt dann auch eine Abfrage „“ please select Instance to be monitored" .
Schön, da stand ich dann mal doch gewaltig die ganze Zeit auf dem Schlauch.
Diese Fkt. des Events habe ich ja noch nie benutzt. Asche auf mein Haupt. Ich habe mir ein Script geschrieben welche alle evtl. Ausfälle Minütlich per Timer prüft und evtl. Gegenmaßnahmen einleitet.