Table of Contents
Steuern einer Verkehrsampel mit xml-scripting
Aufgabenstellung
Mit diesem Script kann eine Verkehrsampel simuliert werden.
Die Ausgänge für die Ampeln werden von dem Script zeitgesteuert geschaltet.
Scripte
Es sind zwei Scripte notwendig. Beim Start von Rocrail (Systemaktion "init") wird das Ampelscript gestartet:
<xmlscript> <!-- Steuerung einer Verkehrsampel mit einer state-machine --> <!-- Ausgang A1_1_r = Ampel 1 ROT (Verkehr) --> <!-- Ausgang A1_1_y = Ampel 1 GELB --> <!-- Ausgang A1_1_g = Ampel 1 GRÜN --> <!-- Ausgang A1_2_r = Ampel 2 ROT (Fussgänger) --> <!-- Ausgang A1_2_g = Ampel 2 GRÜN --> <!-- Ausgang A1_3_r = Ampel 3 ROT (Verkehr) --> <!-- Ausgang A1_3_y = Ampel 3 GELB --> <!-- Ausgang A1_3_g = Ampel 3 GRÜN --> <!-- Ausgang A1_4_r = Ampel 4 ROT (Fussgänger) --> <!-- Ausgang A1_4_g = Ampel 4 GRÜN --> <!-- state-machine --> <switch var="#A1_state"> <!-- state 0 = INIT --> <case val="0"> <co id="A1_1_r" cmd="on"/> <co id="A1_1_y" cmd="off"/> <co id="A1_1_g" cmd="off"/> <co id="A1_2_r" cmd="on"/> <co id="A1_2_g" cmd="off"/> <co id="A1_3_r" cmd="on"/> <co id="A1_3_y" cmd="off"/> <co id="A1_3_g" cmd="off"/> <co id="A1_4_r" cmd="on"/> <co id="A1_4_g" cmd="off"/> <vr id="A1_state" value="1"/> </case> <!-- state 1 --> <case val="1"> <co id="A1_1_y" cmd="on"/> <vr id="A1_state" value="2"/> </case> <!-- state 2 --> <case val="2"> <co id="A1_1_r" cmd="off"/> <co id="A1_1_y" cmd="off"/> <co id="A1_1_g" cmd="on"/> <co id="A1_2_r" cmd="off"/> <co id="A1_2_g" cmd="on"/> <vr id="A1_timer" value="0"/> <vr id="A1_state" value="3"/> </case> <!-- state 3 --> <case val="3"> <if condition="#A1_timer < 5"> <then> <vr id="A1_timer" value="#A1_timer + 1"/> </then> <else> <vr id="A1_state" value="4"/> </else> </if> </case> <!-- state 4 --> <case val="4"> <co id="A1_1_y" cmd="on"/> <co id="A1_1_g" cmd="off"/> <co id="A1_2_r" cmd="on"/> <co id="A1_2_g" cmd="off"/> <vr id="A1_state" value="5"/> </case> <!-- state 5 --> <case val="5"> <co id="A1_1_r" cmd="on"/> <co id="A1_1_y" cmd="off"/> <vr id="A1_state" value="6"/> </case> <!-- state 6 --> <case val="6"> <co id="A1_3_y" cmd="on"/> <vr id="A1_state" value="7"/> </case> <!-- state 7 --> <case val="7"> <co id="A1_3_r" cmd="off"/> <co id="A1_3_y" cmd="off"/> <co id="A1_3_g" cmd="on"/> <co id="A1_4_r" cmd="off"/> <co id="A1_4_g" cmd="on"/> <vr id="A1_timer" value="0"/> <vr id="A1_state" value="8"/> </case> <!-- state 8 --> <case val="8"> <if condition="#A1_timer < 5"> <then> <vr id="A1_timer" value="#A1_timer + 1"/> </then> <else> <vr id="A1_state" value="9"/> </else> </if> </case> <!-- state 9 --> <case val="9"> <co id="A1_3_y" cmd="on"/> <co id="A1_3_g" cmd="off"/> <co id="A1_4_r" cmd="on"/> <co id="A1_4_g" cmd="off"/> <vr id="A1_state" value="10"/> </case> <!-- state 10 --> <case val="10"> <co id="A1_3_r" cmd="on"/> <co id="A1_3_y" cmd="off"/> <vr id="A1_state" value="1"/> </case> </switch> </xmlscript>
In state 3 und state 8 wird die Grünphase auf jeweils 5 Sekunden festgelegt.
Alle anderen Phasen sind 1 Sekunde lang (Intervall der Aktion).
Als Ergänzung lässt sich in den Rotphasen zB noch ein Stopmagnet eines Car-Systems ansteuern.
Beim Beenden von Rocrail (Systemaktion "shutdown") setzt das folgend Script die State-machine zurück:
<xmlscript> <vr id="A1_state" value="0"/> </xmlscript>
Das Script beim Beenden ist nötig, damit Rocrail definiert von Anfang an das Ampelscript ausführt.
Sonst kann es passieren, dass der erste Umlauf ungültige Lichtzeichen anzeigt.
Das Script setzt die Variable A1_state auf 0.
Konfiguration
Es werden zwei Aktionen zum Starten der Scripte konfiguriert:
Diese beiden Aktionen werden auf die Systemaktionen "init" und "shutdown" gelegt:
Damit Rocrail Sekundengenaue Aktionen ausführen kann, muss in den Rocrail-Eigenschaften folgendes Häkchen entfernt werden:
Sollen mehrere Ampeln simuliert werden, kann man das Script kopieren und den Prefix "A1" umbenennen.
Downloads
Plan und Scripte:
ampelscript.zip