Log-Datei auswerten für FDTI Device Reset

Hallo,

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 :slight_smile:



// 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 :

  1. LogFehler vom Typ Boolean - zeigt an ob in der aktuellen Log-Datei ein Fehler angezeigt wird
  2. Letzte_Fehlermeldung vom Typ String - speichert Datum und Uhrzeit des Fehlers die in der Log-Datei angegeben werden
  3. 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 .

Gruß -uli

Gib einfach unter Kern Instanzen -> Event Handler den Skript zum Resetten an. Dann sparst du das Auswerten des Logs.

Findest du auch im Thema „Läuft die Schnittstelle…“

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.

Gruß -uli

Geb mal ein sleep(10); als erstes in Deinem Script an und versuche es bitte nochmal.

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.

Und mit einem manuellen Start des Reset Scripts schon? Zeig mal bitte das Script.



sleep (10);

$FehlerStatus=GetValueBoolean (50111 /*[Wartung\Variablen\FTDI LogFehler]*/);
$LastReset=GetValueString (33213 /*[Wartung\Variablen\Letzter FTDI Reset]*/);
$LastError=GetValueString (48842 /*[Wartung\Variablen\Letzte Fehlermeldung]*/);

//If ($FehlerStatus and $LastError>$LastReset)
//	  {

IPS_ExecuteEx('C:	ools\devcon.exe', 'disable usb\vid_0403*',false,false,1);
sleep (5);
IPS_ExecuteEx('C:	ools\devcon.exe', 'enable usb\vid_0403*',false,false,1);



$datum = date("d.m.Y");
$uhrzeit = date("H:i:s");
echo $datum," ",$uhrzeit;
SetValueString(33213 /*[Wartung\Variablen\Letzter FTDI Reset]*/, $datum." ".$uhrzeit);
//          }

ich hab ein paar Sachen rauskommentiert damit es ohne Bedingung laeuft

Und geht dieses Script wenn Du es per Hand aufrufst?

P.S. In Pfadangaben keine einfachen Backslashs verwenden, sondern \ oder besser nur Slashs /.

Schon mal von hier den neusten Treiber für deine Win-Version probiert.

Virtual COM Port Drivers

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.

Das mit den Pfadangaben passt schon. Sie sitzen ja in ’ ’ und nicht in " ". Dort muss man escapen.

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.

Gibt es in Deinem Log diesen Eintrag ?


23.01.2011 05:24:39.232 | 12345 | MESSAGE | Event Control        | Start-Skript ausgeführt

nein - aber habe auch kein Start-Script im Event-Handler eingetragen.

Jetzt verstehe ich nur noch Bahnhof.:frowning:
Wie soll dann das Script beim Start von IPS funktionieren?

Wieso soll es denn jetzt in den Start Skript?

Das muss unter Status Events.

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.

richtig so - vertrauen ist gut - kontrollscripte sind besser :slight_smile: