Table of Contents
Rangieren mit Güterwagen
Userpages - Hermann (hermannk)
hier geht es direkt zum Rocrail-Arbeitsbereich-Download |
Vorwort 1:
Damit wurde diese Dokumentation erstellt: Stand 03.03.2022
Bereich | Details | Bemerkung |
---|---|---|
Steuerung | Rocrail | Version 2.1.2245+ (macOS "Catalina" on Intel CPU) |
Computer | MacBook Pro (Intel) | macOS 12.2.1 (Monterey) |
Vorwort 2:
- die Nutzung dieser Lösung erfolgt auf eigenes Risiko;
- regelmäßige Datensicherungen des Rocrail-Arbeitsbereichs werden empfohlen;
Aufgabenstellung
Lösung-Details
Eine Strecken-Lok "lcr02" kommt mit einem Rocrail-Zug "opr_strecke" in den Rangier-Bereich "bkr11" gefahren und koppelt den Rocrail-Zug ab. Dabei werden die Wagons von dem Strecken-Zug "opr_strecke" an den Rangier-Zug "opr_rangieren" übergeben. Die Strecken-Lok entfernt sich. Die Rangier-Lok "lcr01" übernimmt den Rocrail-Zug "opr_rangieren" und kann nun die Wagons auf die Abstellgleise verteilen.
Übersicht
a) In diesem Beispiel besteht der Rocrail-Zug aus vier Wagons und es sind vier Abstellgleise zum Rangieren vorhanden. Diese Beispiel kann auf neun Abstellgleise erweitert werden. Mehr geht (normal) nicht.
b) In dieser ersten Version der Lösung ist keine Modellbahn-Hardware vorhanden; alles wird simuliert.
c) der Ablauf:
c0) Ein Rocrail-Zug mit vier Wagons wurde bereits von der Strecke in dem Rangier-Bereich bereitgestellt.
c1) Die Rangier-Lok schiebt den Rocrail-Zug in ein Abstellgleis, das Entkupplungs-Gleis wird manuell ausgelöst, der letzte Wagon kuppelt ab und die Rangier-Lok zieht den restlichen Rocrail-Zug wieder aus dem Abstellgleis heraus.
- das wiederholt sich, bis alle Wagons auf die Abstellgleise verteilt sind;
c2) dann sammelt die Rangier-Lok die Wagons in der neuen gewünschten Reihenfolge wieder ein; die Wagons werden durch die je Abstellgleis vorhandenen Ausgänge manuell an die Rangier-Lok mit dem immer länger werden Rocrail-Zug angekoppelt.
c3) die Rangier-Lok lässt die Wagons stehen und zieht sich auf ihr Park-Gleis zurück; der Rocrail-Zug kann nun abgeholt werden.
c4) Eine Strecken-Lok holt den Rocrail-Zug ab und fährt auf die Strecke.
die Objekte
a) die Lokomotive (Objekt "lc")
Die Lok hat die Kennung "lcr01"; sie sollte mit einer fernsteuerbaren Kupplung ausgestattet sein, um sich letztlich wieder von dem Rocrail-Zug lösen zu können.
b) die Wagons (Objekt "car")
Die Wagons haben die Kennungen "carr01", "carr02", "carr03" und "carr04"; sie sind in genau dieser Reihenfolge im Rocrail-Zug aufgereiht.
c) der Rocrail-Zug (Objekt "operator")
Der zu zerlegende Rocrail-Zug hat die Kennung "opr_rangieren".
Die Liste der dazu gehörenden Wagons findet man unter dem Attribut "carids", einer Komma-separierten Liste von Wagon-Kennungen; hier: "carr01,carr02,carr03,carr04"
Die Liste ist zu lesen von links nach rechts; das erste Element ist hinter der Lok angeordnet und das letzte Element stellt den letzten Wagon im Rocrail-Zug dar.
In dem Rocrail-Plan ist der erste Wagon rechts im Rocrail-Zug und der Letzte Wagon links im Rocrail-Zug.
Jedem Abstellgleis ist je ein Rocrail-Zug zugeordnet: “opr_bkr01”, “opr_bkr02”, “opr_bkr03” und “opr_bkr41”.
die Operationen
Diese Beschreibung setzt voraus, dass der Rocrail-Zug in dem Block "bkr11" bereitgestellt wurde und die Strecken-Lock von diesem Zug abgekoppelt wurde und eine Park-Position eingenommen hat.
a) einen Rocrail-Zug an die Rangier-Lok kuppeln
"assigntrain" - das wird in diesem Beispiel nicht beschrieben.
- siehe dazu "Loks und Züge koppeln" unter https://wiki.rocrail.net/doku.php?id=llat:link-locomotives-and-trains-de
b) einen Wagon vom Rocrail-Zug abkuppeln
Der Befehl "removecar" entfernt einen Wagon aus dem Rocrail-Zug; die zu entfernenden Wagons werden im Parameter "carids" festgelegt.
Wir benötigen hier den Fall, dass jedes Mal genau der eine letzte Wagon entfernt werden soll.
<operator id="opr_rangieren" cmd="removecar" carids="carr04"/>
c) einen Wagon an den Rocrail-Zug ankuppeln
Der Befehl “addcar” fügt Wagons an den Rocrail-Zug hinzu; die anzufügenden Wagons werden im Parameter “carids” festgelegt.
<operator id="opr_bkr03" cmd="addcar" carids="carr04"/>
d) einen Rocrail-Zug von der Rangier-Lok abkuppeln
"releasetrain" - das wird in diesem Beispiel nicht beschrieben.
- siehe dazu "Loks und Züge koppeln" unter https://wiki.rocrail.net/doku.php?id=llat:link-locomotives-and-trains-de
einen Wagon abstellen
"cor_abkuppeln_X" "012345678901234"
Die Gleisnummer "X" steht an der 14-ten Stelle in der Kennung und ist ein Zeichen lang; dieser Wert wird in der Variablen "vr_RANGIEREN_idx" gespeichert:
<!-- %callerid% = cor_abkuppeln_X --> <vr id="vr_RANGIEREN_idx" text="%callerid%" start="14" length="1" value="0" generated="true"/>
Der Rocrail-Zug für ein Abstellgleis hat die Kennung "opr_bkr0X", wobei "X" eine Gleisnummer von 1 bis 9 sein kann. In der Variablen "vr_RANGIEREN_opid" wird die ermittelte Rocrail-Zug-Kennung gespeichert.
<vr id="vr_RANGIEREN_opid" text="opr_bkr0" value="0" generated="true"/> <vr id="vr_RANGIEREN_opid" format="%s%s" text="@vr_RANGIEREN_opid @vr_RANGIEREN_idx" value="0"/>
den letzten Wagon ermitteln
Um den letzten (hier den vierten) Wagon in dem Rocrail-Zug zu ermitteln, kann die "@@X"-Adressierung angewendet werden; der Index "X" beginnt bei 0 (Null) für das erste Element in der Komma-separierten Liste und ist ein-stellig (also es sind nur Werte von 0 bis 9 erlaubt).
<query vr="vr_RANGIEREN_carids" table="operatorlist" id="opr_rangieren" get="carids"/> ... <vr id="vr_RANGIEREN_lastcarid" text="@@3vr_RANGIEREN_carids"/>
Die Suche nach dem letzten Wagon beginnt mit dem höchsten Index und endet, sobald ein Wagon gefunden wurde:
<vr id="vr_RANGIEREN_idx" text="" value="4" generated="true"/> <vr id="vr_RANGIEREN_lastcarid" text="" value="0" generated="true"/> <while condition="@vr_RANGIEREN_lastcarid # (null)|#vr_RANGIEREN_idx > 0" alltrue="true"> <switch var="#vr_RANGIEREN_idx"> <case val="1"> <vr id="vr_RANGIEREN_lastcarid" text="@@0vr_RANGIEREN_carids"/> </case> ... <case val="4"> <vr id="vr_RANGIEREN_lastcarid" text="@@3vr_RANGIEREN_carids"/> </case> <default> </default> </switch> <vr id="vr_RANGIEREN_idx" value="#vr_RANGIEREN_idx - 1"/> </while>
den letzten Wagon abkuppel
Falls ein Wagon gefunden wurde, wird er vom zu zerlegenden Rocrail-Zug abgekoppelt und an den Rocrail-Zug im Abstellgleis angekoppelt:
<if condition="@vr_RANGIEREN_lastcarid ! (null)"> <then> <!-- es gibt einen Wagon; dann von "bkr11" abkoppeln --> <operator id="opr_rangieren" cmd="removecar" carids="@vr_RANGIEREN_lastcarid"/> <!-- an "rangierblock" ankoppeln --> <operator id="@vr_RANGIEREN_opid" cmd="addcar" carids="@vr_RANGIEREN_lastcarid"/> </then> </if>
Achtung: damit stimmt die eigentliche Reihenfolge der realen Wagons im Abstellgleis nicht mit der Komma-separierten Liste der Wagons im Rocrail-Zug überein! Wenn die Wagons später abgeholt werden, wird das kompensiert.
die abgestellten Wagons einsammeln
<while condition="#vr_RANGIEREN_idx > 0"> <switch var="#vr_RANGIEREN_idx"> ... </switch> <if condition="@vr_RANGIEREN_lastcarid ! (null)"> <then> <!-- es gibt einen Wagon; dann vom "rangierblock" abkoppeln --> <operator id="@vr_RANGIEREN_opid" cmd="removecar" carids="@vr_RANGIEREN_lastcarid"/> <!-- an "bkr11" ankoppeln --> <operator id="opr_rangieren" cmd="addcar" carids="@vr_RANGIEREN_lastcarid"/> </then> </if> <vr id="vr_RANGIEREN_idx" value="#vr_RANGIEREN_idx - 1"/> </while>
fertig
Der neu zusammengestellte Rocrail-Zug "opr_rangieren" steht im Block "bkr11".
Die Rangierlok kann abkuppeln und der Rocrail-Zug kann abgeholt werden. Beides bleibt in diesem Beispiel offen.
Wagons anzeigen
Für die Anzeige der Wagons werden je Block vier Wagons berücksichtigt.
Das XML-Script zum Anzeigen der Wagons ist als Unterprogramm ("function") in einer separaten Datei untergebracht; beim Aufruf ("sub") müssen der Name der Datei ("acr_zuganzeigen.xml") und die Kennung der Funktion ("acr_fza") angegeben werden.
<vr id="vr_RANGIEREN_txbasis" text="txr_bkr01_"/> <vr id="vr_RANGIEREN_opid" text="opr_bkr01"/> <sub file="acr_zuganzeigen.xml" id="acr_fza"/>
Das Unterprogramm "acr_fza" erwartet zwei vorbesetzte Start-Variablen:
- "vr_RANGIEREN_txbasis" für die erste anzuwendende Textfeld-Kennung;
- "vr_RANGIEREN_opid" für die anzuwendende Rocrail-Zug-Kennung.
<function id="acr_fza" trace="false"> <!-- parameter: vr_RANGIEREN_txbasis, vr_RANGIEREN_opid --> ... </function>
In einer Programm-Schleife ("while") werden vier Wagons ermittelt und deren Foto-Dateiname in ein Textfeld geschrieben. Nicht vorhandene Wagon-Fotos werden durch einen Strich ersetzt.
<vr id="vr_RANGIEREN_idx" text="" value="4" generated="true"/> <vr id="vr_RANGIEREN_lastcarid" text="" value="0" generated="true"/> <vr id="vr_RANGIEREN_txid" format="%s%d" text="@vr_RANGIEREN_txbasis #vr_RANGIEREN_idx" value="0" generated="true"/> <while condition="#vr_RANGIEREN_idx > 0"> <switch var="#vr_RANGIEREN_idx"> <case val="1"> <vr id="vr_RANGIEREN_lastcarid" text="@@0vr_RANGIEREN_carids"/> </case> ... <case val="4"> <vr id="vr_RANGIEREN_lastcarid" text="@@3vr_RANGIEREN_carids"/> </case> <default> </default> </switch> <vr id="vr_RANGIEREN_txid" format="%s%d" text="@vr_RANGIEREN_txbasis #vr_RANGIEREN_idx"/> <if condition="@vr_RANGIEREN_lastcarid ! (null)"> <then> <!-- es gibt einen Wagon; dann anzeigen --> <query vr="vr_RANGIEREN_image" table="carlist" id="@vr_RANGIEREN_lastcarid" get="image"/> <tx id="@vr_RANGIEREN_txid" format="@vr_RANGIEREN_image"/> </then> <else> <tx id="@vr_RANGIEREN_txid" format="-"/> </else> </if> <vr id="vr_RANGIEREN_idx" value="#vr_RANGIEREN_idx - 1"/> </while>
Dieses Unterprogramm wird nach jedem Abkuppeln und nach jedem Ankuppeln für jeden Rangier-Block aufgerufen:
<vr id="vr_RANGIEREN_txbasis" text="txr_bkr01_"/> <vr id="vr_RANGIEREN_opid" text="opr_bkr01"/> <sub file="acr_zuganzeigen.xml" id="acr_fza"/> <vr id="vr_RANGIEREN_txbasis" text="txr_bkr02_"/> <vr id="vr_RANGIEREN_opid" text="opr_bkr02"/> <sub file="acr_zuganzeigen.xml" id="acr_fza"/> <vr id="vr_RANGIEREN_txbasis" text="txr_bkr03_"/> <vr id="vr_RANGIEREN_opid" text="opr_bkr03"/> <sub file="acr_zuganzeigen.xml" id="acr_fza"/> <vr id="vr_RANGIEREN_txbasis" text="txr_bkr04_"/> <vr id="vr_RANGIEREN_opid" text="opr_bkr04"/> <sub file="acr_zuganzeigen.xml" id="acr_fza"/> <vr id="vr_RANGIEREN_txbasis" text="txr_bkr11_"/> <vr id="vr_RANGIEREN_opid" text="opr_rangieren"/> <sub file="acr_zuganzeigen.xml" id="acr_fza"/>
Rocrail-Arbeitsbereich
Alle Kennungen wurden so gewählt, dass sie entweder keine Kollision mit Kennungen im eigenen Plan verursachen oder so umbenannt werden können, dass sie anschließend keine Kollision mit Kennungen im eigenen Plan verursachen.
Im Präfix der Kennungen ist ein zusätzliches "r" für "Rangieren" eingebaut. Im Detail:
Präfix | Beispiel | für |
---|---|---|
acr_ | acr_wagonabkuppeln | Aktions-Definitionen |
acr_ | acr_wagonabkuppeln.xml | XML-Scripte |
bkr | bkr01 | Blöcke |
fbr | fbr01+ | Rückmelder passend zur Blocknummer und +/- als Block-Seite |
swr | swr01 | Weichen |
cor_ | cor_abkuppeln_1 | Ausgänge |
txr_ | txr_bkr11_1 | Textfelder |
tkr | tkr01 | Gleise |
lcr | lcr01 | Lokomotiven |
carr | carr01 | Wagons |
opr_ | opr_bkr01 | Rocrail-Züge |
vr_RANGIEREN_ | vr_RANGIEREN_idx | Variablen |
In dem Download-Arbeitsbereich "Rangieren_Güterwagen.zip" sind folgende Dateien enthalten:
Datei | Bedeutung |
---|---|
plan.xml | die Rocrail-Plan-Datei |
acr_wagonabkuppeln.xml | XML-Script zum Abkuppeln von einzelnen Wagons von einem Rocrail-Zug |
acr_wagonsankuppeln.xml | XML-Script zum Ankuppeln von allen Wagons aus einem Block an einen Rocrail-Zug |
acr_zuganzeigen.xml | XML-Script zum Anzeigen der Wagon-Bilder von einem Rocrail-Zug |
acr_zuganzeigelöschen.xml | XML-Script zum Löschen der Wagon-Bilder von einem Rocrail-Zug |
acr_bkr11.xml | XML-Script zur Handhabung von einem Rocrail-Zug und einer Lok in dem Block "bkr11" |
acr_init.xml | XML-Script zur Initialisierung |
für_images | ein Ordner mit Wagon-Bildern für dieses Beispiel |
Das ist jetzt die Version vom 10.03.2022, in der bei fast allen XML-Scripts die Schreibweise von "genarated" korrigiert wurde zur Schreibweise "generated" (Danke an Holger (holgerw)).
… und auf dieser Seite habe ich es jetzt auch korrigiert (Danke an Stephan (stefo)).
zurück zu den Lösung-Details.
Links zum Thema Rangieren
Im Rocrail-Wiki und im Rocrail-Forum gibt es bereits viele Beispiele für die Realisierung von Rangier-Aufgaben mit Rocrail; hier ist eine kleine Auswahl:
- XmlScript Rangierbeispiel
– https://wiki.rocrail.net/doku.php?id=users:nice2have:shuntingexample-de
- Erweitertes Rangierbeispiel
– https://wiki.rocrail.net/doku.php?id=users:nice2have:shuntingexample2-de
- Manuell Rangieren im Automatik-Betrieb
– https://wiki.rocrail.net/doku.php?id=example:shunting-manual-de
- Loks und Züge koppeln
– https://wiki.rocrail.net/doku.php?id=llat:link-locomotives-and-trains-de
- Frachtschein: Allgemein
– https://wiki.rocrail.net/doku.php?id=waybill-gen-de
zurück zu den Lösung-Details.