User Tools

Site Tools


userpages:hermannk:shunting_freight-de

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

Ein Rocrail-Zug soll neu zusammenstellt werden.

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

In diesem Beispiel gibt es für jedes Abstellgleis einen Ausgang mit der Kennung "cor_abkuppeln_X", wobei "X" eine Gleisnummer von 1 bis 9 sein kann.
Jeder Ausgang ruft die Aktion "acr_wagonabkuppeln" auf, die das XML-Script "acr_wagonabkuppeln.xml" ausführt; im XML-Script wird aus der Gleisnummer die Block-Kennung und die Rocrail-Zug-Kennung berechnet.
"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

Es werden immer alle Wagons aus einem Abstellgleis abgeholt.
Jeder Ausgang ruft die Aktion "acr_wagonsankuppeln" auf, die das XML-Script "acr_wagonsankuppeln.xml" ausführt; im XML-Script wird aus der Gleisnummer die Block-Kennung und die Rocrail-Zug-Kennung berechnet.
Um den Fehler in der Komma-separierten Liste zu kompensieren, wird die Liste von hinten nach vorne für alle Wagons in der Liste abgearbeitet (die while-Schleife bricht nicht nach dem ersten Treffer ab!).
  <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.

Im Block "bkr11" werden die Wagons von rechts nach links angezeigt.
Die Textfelder haben die Kennung "txr_bkr11_X", mit "X" gleich eins bis vier.
Der Rocrail-Zug in diesem Block hat die Kennung "opr_rangieren".
In den Abstellblöcken "bkr0Y" werden die Wagons von links nach rechts angezeigt.
Die Textfelder haben die Kennung "txr_bkr0Y_X", mit "X" gleich eins bis vier.
Der Rocrail-Zug in diesen Blöcken hat die Kennung "opr_bkr0Y".

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.

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.

userpages/hermannk/shunting_freight-de.txt · Last modified: 2022/05/08 16:55 by hermannk