Table of Contents
Lok startet Lok
Userpages - Hermann (hermannk) → Lok startet Lok
Hier geht es direkt zum Rocrail-Arbeitsbereich-Download |
Vorwort 1:
Damit wurde diese Dokumentation erstellt: Stand 03.05.2024
Area | Details | Remarks |
---|---|---|
Steuerung | Rocrail | Version 2.1.4545+ (macOS "Sonoma" on Apple M2 CPU) |
Computer | MacBook Pro (M2) | macOS 14.2.1 (Sonoma) |
Vorwort 2:
- die Nutzung dieser Lösung erfolgt auf eigenes Risiko;
- regelmäßige Datensicherungen des Rocrail-Arbeitsbereichs werden empfohlen.
A) Aufgabenstellung
Sobald eine Lok an einem Bahnhof ankommt, soll die nächste Lok losfahren.
Der Bahnhof besteht aus den Blöcken bk01, bk11, bk21 und bk31.
Die Bahnhofsblöcke werden so konfiguriert: Blockeigenschaften / Details / Warten / Typ = Stopp
B) Lösung-Details
Sobald eine Lokomotive in einem Block angekommen ist, müssen zwei Dinge erledigt werden:
- a) wenn ein gespeicherter Befehl vorhanden ist, sollte der Befehl ausgeführt werden.
- b) die Lokomotive des nächsten Blocks soll starten;
- b1) wenn der nächste Block leer ist, muss der Fahrbefehl für diesen Block gespeichert werden;
- b2) wenn die Lokomotive bereits im nächsten Block vorhanden ist, kann die Lokomotive sofort losfahren.
Jeder Block des Bahnhofes enthält eine Aktion "ac_Loco_Starts_Loco", die beim IN-Ereignis ausgelöst wird.
Die Aktion "ac_Loco_Starts_Loco" startet das XMLScript "ac_Loco_Starts_Loco.xml".
Der Start der Aktion erfolgt über den Parameter "Block-Kennung des nächsten Blocks". \\
Das XMLScript
Das Skript beginnt mit der Ausgabe der Aufrufparameter:
<trace text="ac_Loco_Starts_Loco: begin %callerid% %state% for %param1%"/>
Parameter | Erklärung | Beispiel-Wert |
---|---|---|
%callerid% | die Block-Kennung des aufrufenden Blocks | bk01 |
%state% | der Ereignis-Status des aufrufenden Blocks | in |
%param1% | der erste Parameter des Aufrufs | bk11 |
Mit anderen Worten: wenn eine Lok im Block "bk01" ankommt, sollte die Lok im Block "bk11" starten.
a) Gespeicherten Befehl ausführen
Wenn ein gespeicherter Befehl vorhanden ist, sollte der Befehl ausgeführt werden.
Der Befehl wird in der Variablen "vr_LSL_%callerid%_todo" gespeichert.
Für den aufrufenden Block "bk01" hat diese Variable die Kennung "vr_LSL_bk01_todo".
Der Befehl wird als Wert "1" gespeichert; andernfalls ist der Wert "0".
<if condition="#vr_LSL_%callerid%_todo > 0" > <then> <trace text="- LSL: prepare late start loco in %callerid% "/> <sleep time="2000"/> <trace text="- LSL: late start loco in %callerid% "/> <lc bkid="%callerid%" cmd="govirtual"/> <vr id="vr_LSL_%callerid%_todo" value="0"/> </then> <else> <!-- do nothing here --> </else> </if>
Es gibt einen gespeicherten Befehl:
XMLScript | Erklärung |
---|---|
<sleep time="2000"/> | kurz warten - hier 2 Sekunden. |
<lc bkid="%callerid%" … /> | die Lokomotive im Block %callerid% - hier "bk01" |
<lc … cmd="govirtual"/> | starte die Lokomotive im virtuellen Modus |
<lc … cmd="go"/> | starte die Lokomotive im normalen Modus |
<vr id="vr_LSL_%callerid%_todo" value="0"/> | die Variable zurücksetzen |
b) Starte die nächste Lokomotive
Wenn der nächste Block belegt ist:
- starte sofort die Lokomotive des nächsten Blocks;
ansonsten:
- speichere den Befehl für den nächsten Block.
<if state="bk %param1% = occupied" > <then> <!-- start next loco immediately --> <trace text="-LSL: start next loco in %param1% "/> <vr id="vr_LSL_%callerid%_todo" value="0"/> <vr id="vr_LSL_%param1%_todo" value="0"/> <lc bkid="%param1%" cmd="govirtual"/> </then> <else> <!-- prepare next start --> <trace text="@vr_LSL_%param1%_todo will soon start in %param1% "/> <vr id="vr_LSL_%param1%_todo" value="1"/> </else> </if>
b1) Der nächste Block ist besetzt
XMLScript | Erklärung |
---|---|
<if state="bk %param1% = occupied" > | wenn der nächste Block belegt ist – hier ist %param1% gleich "bk11" |
<vr id="vr_LSL_%callerid%_todo" value="0"/> | unseren gespeicherten Befehl zurücksetzen |
<vr id="vr_LSL_%param1%_todo" value="0"/> | den gespeicherten Befehl für den nächsten Block zurücksetzen |
<lc bkid="%param1%" … /> | starte die Lokomotive des nächsten Blocks %param1% - hier "bk11" |
<lc … cmd="govirtual"/> | starte die Lokomotive im virtuellen Modus |
<lc … cmd="go"/> | starte die Lokomotive im normalen Modus |
b2) Der nächste Block ist nicht besetzt
XMLScript | Erklärung |
---|---|
<vr id="vr_LSL_%param1%_todo" value="1"/> | speichere den Befehl für den nächsten Block %param1% - hier "bk11" |
C) Rocrail-Arbeitsbereich
In dem Download-Arbeitsbereich "loco_starts_loco.zip" sind folgende Dateien enthalten:
Datei | Bedeutung |
---|---|
plan.xml | die Rocrail-Plan-Datei |
ac_Loco_Starts_Loco.xml | das XML-Script |
zurück zu den Lösung-Details.
D) Ausblick
Auf der Basis dieser Lösung dürfen gerne eigene Ideen umgesetzt werden.
Zum Beispiel könnte mit einem zweiten Parameter eine Fahrplan-Kennung mitgegeben werden, mit dem die Lokomotive im nächsten Block gestartet werden soll.
Parameter | bk11,bk11_runaround | nächster Block "bk11", Fahrplan-Kennung "bk11_runaround" |
XMLScript | <vr id="vr_LSLs_%param1%_todo" value="1" text="%param2%"/> | Fahrplan-Kennung speichern |
XMLScript | <lc bkid="%param1%" cmd="useschedule" scheduleid="%param2%"/> | Fahrplan-Kennung anwenden |
Workspace | loco_starts_loco_schedule.zip |
Viel Spass und gutes Gelingen.