Hallo Forum,
das ideale Skript, ist eines, das nicht läuft. Es benötigt keine CPU-Zeit, keinen Speicher und weder IP-Symcon noch das Betriebssystem (Windows) müssen sich um dessen Verwaltung kümmern.
Daher ist es immer sinnvoll längere Sleep(…) Befehle zu vermeiden, denn wenn ein Skript nichts tut, ist es auch nicht nötig es weiterlaufen zu lassen. Ein schlafendes Skript benötigt zwar kaum CPU-Zeit, aber trotzdem Speicher und Verwaltungsaufwand.
Ich habe hier ein Skript angefügt, mit dem beliebige Sequenzen von Skripten zeitgesteuert abgearbeitet werden können.
Man zerlegt dazu zweckmäßigerweise sein Projekt in mehrere Phasen und bringt diese in eigenen Skripten unter.
Das Sequencer-Skript ist dazu gedacht die Phasen-Skripte nach einer bestimmten Verzögerung zu starten. Jede Phase hat ihr eigenes Skript („Phase_x.ips.php“) und ihr eigenes Verzögerungsintervall. Die Kommentare im Skript geben hierüber näher Auskunft.
Es ist sogar möglich Endlosschleifen zu programmieren, ohne einen Timeout befürchten zu müssen. Auch sind beliebig lange Sequenzen möglich.
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Sequencer.ips.php
Trigger : ScriptTimer
Interval : (verschiedene)
Author : HJH
Date : 30.10.07
*/
$phaseVar = "PhaseCounter"; // Name der Variablen für den Phasenzähler
// In diesem Beispiel werden 5 Phasen abgearbeitet (0...4).
// Die Anzahl lässt sich beliebig erhöhen.
// Die Abarbeitungsreihenfolge kann beliebig festgelegt werden.
// Phasen können auch mehrfach aufgerufen werden.
// Es lassen sich auch Schleifen erzeugen.
$sequencer = array(0 => array(10, 1), // auf Phase 0 folgt nach 10s Phase 1, auszuführendes Skript: "Phase_1.ips.php"
1 => array(3, 4), // auf Phase 1 folgt nach 3s Phase 4, auszuführendes Skript: "Phase_4.ips.php"
2 => array(30, 3), // auf Phase 2 folgt nach 30s Phase 3, auszuführendes Skript: "Phase_3.ips.php"
3 => array(5, 2), // auf Phase 3 folgt nach 5s Phase 2, auszuführendes Skript: "Phase_2.ips.php"
4 => array(7, 5), // auf Phase 4 folgt nach 7s Phase 5, auszuführendes Skript: "Phase_5.ips.php"
5 => array(0, 0)); // auf Phase 5 folgt nach 0s Phase 0, 0s bedeutet: die Sequenz ist beendet
switch ($IPS_SENDER)
{
case "Execute": // Skript wurde von Hand gestartet: Grundzustand herstellen
SetValueInteger($phaseVar, 0); // Phasenzähler rücksetzen
IPS_SetScriptTimer($IPS_SELF, 1); // ScriptTimer starten
break;
case "Variable": // Skript wurde durch eine Trigger-Variable gestartet
break;
case "TimerEvent": // Skript wurde vom ScriptTimer gestartet: Phasenwechsel steht an
$phase = GetValueInteger($phaseVar);
IPS_RunScript("Phase_". $phase); // Skript für aktive Phase abarbeiten
SetValueInteger($phaseVar, $sequencer[$phase[1]]); // nächste Phase festlegen
IPS_SetScriptTimer($IPS_SELF, $sequencer[$phase[0]]); // Zeit festlegen, wann die nächste Phase beginnen soll
break;
}
?>
Das Skript ist noch nicht getestet. Ich denke aber, dass der Zweck klar zu erkennen ist. Vielleicht kann man es später unter die nützlichen Skripte einreihen.
Gruß
HJH