Beispiel: EXEC-Script als Dämon
Dieses Beispiel demonstriert eine "saubere" Implementierung eines EXEC-Scripts, dass beim EDOMI-Start einmalig und automatisch gestartet wird, dann endlos durchläuft und beim Beenden/Neustart von EDOMI ordnungsgemäß beendet wird.
Der LBS wird durch den Initalwert an E1 beim EDOMI-Start automatisch gestartet. Das Verbindungen von E1 mit einem KO oder einem anderen LBS ist nicht erforderlich.
Jetzt wird eine Hilfsvariable (V1) auf 1 gesetzt, um ein mehrfaches Starten des EXEC-Scripts zu verhinden. Dies ist nicht unbedingt notwendig, da der Initialwert an E1 den LBS ohnehin nur einmalig beim EDOMI-Start triggern wird. Jedoch ist dieses Vorgehen zur Sicherheit zu empfehlen, falls an E1 zusätzlich ein KO oder ein anderer LBS angelegt werden sollte.
Das EXEC-Script läuft nun in einer Schleife solange, bis EDOMI beendet oder neugestartet wird:
Das Beenden/Neustarten von EDOMI wird mittels der Funktion getSysInfo(1) überwacht. Diese Funktion liefert einen Wert >=1 zurück, solange EDOMI normal läuft. Sobald EDOMI beendet oder neugestartet wird, liefert diese Funktion einen Wert <1 zurück. Jetzt bleiben dem Script ca. 3 Sekunden Zeit, um sich selbst ordnungsgemäß zu beenden (z.B. Sockets zu schließen, etc.). Aber Achtung: In diesem Moment stehen keine Logikfunktionen (Eingangswerte, etc.) mehr zu Verfügung!
Code:
[FONT=Osaka][SIZE=8px]###[DEF]###[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px][name = Dämon-Test ][/SIZE][/FONT]
[FONT=Osaka][SIZE=8px][e#1 = Autostart #init=1] [/SIZE][/FONT]
[FONT=Osaka][SIZE=8px][v#1 = 0][/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]###[/DEF]###[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]###[HELP]###[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]###[/HELP]###[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]###[LBS]###[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]<?[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]function LB_LBSID($id) {[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] if ($E=getLogicEingangDataAll($id)) {[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] if (getLogicElementVar($id,1)!=1) {[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] setLogicElementVar($id,1,1); //setzt V1=1, um einen mehrfachen Start des EXEC-Scripts zu verhindern[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] callLogicFunctionExec(LBSID,$id); //EXEC-Script starten (garantiert nur einmalig)[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] }[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] }[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]}[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]?>[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]###[/LBS]###[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]###[EXEC]###[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]<?[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]set_time_limit(0); //Wichtig! Script soll endlos laufen[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]sql_connect();[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]writeToTraceLog(0,true,'EXEC-Script gestartet'); //Demonstration: TraceLog zum Debuggen nutzen[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]while (getSysInfo(1)>=1) {[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] //eigener Programm-Code...[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px] usleep(1000*10); //z.B. 10ms warten - wichtig, um die CPU-Last zu begrenzen![/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]}[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]writeToTraceLog(0,true,'EXEC-Script korrekt beendet.'); //Demonstration: TraceLog zum Debuggen nutzen[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]sql_disconnect();[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]?>[/SIZE][/FONT]
[FONT=Osaka][SIZE=8px]###[/EXEC]###[/SIZE][/FONT]


Ich habe das Problem gefunden und gelöst (s.o.).
Bevor ich jetzt der Sache auf den Grund gehe: Wie hast Du das denn getestet? Ich meine: Siehe oben! In dem Bereich zw. 06:00 und 22:00 passiert garantiert GARNICHTS...
Einen Kommentar schreiben: