User Tools

Site Tools


userpages:hermannk:loco_starts_loco-de

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". \\356

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.

userpages/hermannk/loco_starts_loco-de.txt · Last modified: 2024/05/03 19:17 by hermannk