Table of Contents
Rangieren mit Frachtscheinen
Einfaches Rangierbeispiel → Positionsbestimmung → Erweitertes Rangierbeispiel → Rangieren mit Frachtscheinen → IoT Fahrplananzeiger
Frachtscheine im Script
Mit Hilfe von Frachtscheinen kann das Script gesteuerte Rangieren noch erweitert werden. Wie unter "Erweitertes Rangierbeispiel" beschrieben, werden die Wagons anhand ihres Ladezustands bewegt. Bei der Verwendung von Frachtscheinen ergeben sich eine Vielzahl von weiteren Möglichkeiten, die hier nicht alle beschrieben werden können, z.B.
- Beladene Wagons nach ihrem Ziel zusammenstellen
- Leere Wagons aus einem Abstellgleis am Standort (Herkunft) der Frachtscheine bereitstellen
- Den zusammengestellten Güterzug nacheinander die Ziele Anfahren lassen
u.v.m.
Das Wichtigste dabei ist sicherlich, im Vorfeld eine Vorstellung vom Betriebskonzept seines Rangierbahnhofs zu haben und die weitere Behandlung von zusammengestellten Güterzügen.
Frachtscheine zuordnen
Der komplexeste Bereich im Script ist die Zuordnung von "nicht zugewiesenen" Frachtscheinen zu einem passenden Wagon. Hier muß parallel auf einen Frachtschein und einen passenden Wagon geprüft werden. Das funktioniert nur mit einer "verschachtelten" Schleife. Die folgenden Script-Teile basieren auf dem Demo-Plan und sind eine Ergänzung. Die dargestellte Funktion Frachtschein
ist in der doit.xml
zu finden.
<!-- zur Berechnung bentigte Variablen auf NULL setzen --> <vr id="var1" value="0"/> <vr id="var2" value="0"/> <vr id="var3" value="0"/>
Zuerst werden die benötigten Variablen zur Berechnung auf Null gesetzt.
<!-- Anzahl Frachtscheine mit Status "nicht zugeordnet" ermitteln --> <foreach table="waybilllist" state="waybill %oid% = unassigned"> <vr id="var1" value="#var1 + 1"/> </foreach> <!-- Anzahl Wagons mit Status "leer" ermitteln --> <foreach table="carlist" state="car %oid% = empty"> <!-- Wagons die den Status "warten" oder "zugestellt" haben, ausschlieen --> <if state="car %oid% ! waiting|car %oid% ! delivered" alltrue="false"> <then> <vr id="var2" value="#var2 + 1"/> </then> </if> </foreach> <trace text="#var1 Frachtscheine ohne Zuordnung und #var2 Wagons leer und ohne Frachtschein"/>
Dieser Teil dient nur der Anzeige im Trace, daß etwas im Script passiert und ist nicht zwingend notwendig.
<!-- leeren Wagon suchen --> <foreach table="carlist" state="car %oid% = empty"> <!-- Wagons die den Status "warten" oder "zugestellt" haben, ausschlieen --> <if state="car %oid% ! waiting|car %oid% ! delivered" alltrue="false"> <then> <!-- Nur Wagons nehmen, die bereits die richtige Position haben --> <if state="car %oid% = BK2|car %oid% = BK3|car %oid% = BK4" alltrue="false"> <then> <vr id="var1" text="%oid%"/> <vr id="var2" text="%carsubtype%"/> <vr id="var3" text="%carlocation%"/> <!-- passenden Frachtschein zum leeren Wagon suchen --> <foreach table="waybilllist" state="waybill %oid% = @var2|waybill %oid% = @var3|waybill %oid% = unassigned"> <!-- Frachtschein zuordnen --> <car id="@var1" cmd="assignwaybill" waybill="%oid%"/> <!--Frachtschein auf "warten" setzen --> <waybill id="%oid%" cmd="waiting"/> <!-- Wagon auf "beladen" setzen --> <car id="@var1" cmd="loaded"/> <trace text="@var1 hat Frachtschein %oid%"/> <vr id="var1" value="#var1 - 1"/> <vr id="var1" text=""/> <break/> </foreach> </then> </if> </then> </if> </foreach> <vr id="var1" text=" "/> <tx id="Doit" format="Frachtscheine zugewiesen"/>
In diesem Teil wird ein Frachtschein zum passenden Wagon zugeordnet. Die Suche beginnt dabei mit der Wagonliste und sucht einen ersten leeren Wagon. Ist dieser gefunden, werden die Parameter Wagon-Kennung in die Variable var1
, die Untergruppe des Wagons in var2
und der Standort des Wagons in var3
geschrieben. Diese Parameter werden für die zweite Suche (nach einem passenden Frachtschein) benötigt.
Die zweite <foreach>
-Schleife ist jetzt in die erste <foreach>
-Schleife verschachtelt. Das hat den Effekt, daß nach der Suche nach einem passenden Frachtschein, weiter in der Wagon-Liste gesucht wird - und das so lange, bis alle Wagons durchgesucht wurden. Dabei fließen die Bedingungen aus den Variablen in die Suche bei den Frachtscheinen ein (Standort und Untergruppe):
<foreach table="waybilllist" state="waybill %oid% = @var2|waybill %oid% = @var3|waybill %oid% = unassigned">
Dabei werden nur Wagons und Frachtscheine miteinander verbunden, die den gleichen Standort / Herkunft haben und die Wagon-Untergruppe zur benötigten Untergruppe im Frachtschein passt.
Mit den nachfolgenden Befehlen zum Setzen der Stati beim Frachtschein und den Ladezustand des Wagons, kann man individuelle Rangier-Szenarien vorbereiten. Die hier Aufgeführten sind auf das Demo-Beispiel angepasst.
Das Rangieren anpassen
Wenn man Frachtscheine verwendet, muß man natürlich sein Rangier-Script darauf anpassen. Im Demo-Beispiel wurde das Script rangieren.xml
kopiert als rangieren2.xml
und modifiziert. Über die eingestellte Klasse R1 oder R2 im Zug "RA_01" wird das jeweilige Script verwendet. Damit sind im Demo-Beispiel weiter beide Varianten zum Rangieren verfügbar.
Das Script muß im Prinzip in zwei Abschnitten modifiziert werden:
In den Blöcken (BK2,BK3 und BK4) die als Abstellgleis dienen, darf jetzt nicht nur mehr auf den Ladezustand der Wagons geprüft werden, sondern es muß auch das Ziel des zugewiesenen Frachtscheines berücksichtigt werden:
<foreach table="carlist" condition="#%oid% = #Pos_%callerid%" state="car %oid% = %callerid%"> <!-- Wagen zum Rangierzug hinzufuegen --> <operator id="@%callerid%" cmd="addcar" carids="%oid%"/> <if state="car %oid% = loaded"> <then> <!-- Variable fuer Ziel setzen --> <vr id="var1" text="%waybilldest%"/> <vr id="var2" text="@var1"/> </then> <else> <vr id="var1" text="empty"/> <vr id="var2" text="@var1"/> </else> </if> <!-- %lcid% als Zaehler setzen --> <vr id="%lcid%" value="#%lcid% + 1"/> <!-- Variable Pos_Block reduzieren --> <vr id="Pos_%callerid%" value="#Pos_%callerid% - 1"/> <!-- Nur einen Wagen nehmen --> <trace text="Wagen %oid% gefunden - suche weiter"/> <break/> </foreach>
Bei der Suche nach weiteren Wagons in diesem Blöcke, muß das ebenfalls mit einfliessen, wodurch die Schleife etwas umfangreicher wird:
<foreach table="carlist" condition="#%oid% = #Pos_%callerid%" state="car %oid% = %callerid%"> <!-- Prfen, ob beladen oder entladen --> <if condition="@var1 = empty"> <then> <if state="car %oid% = @var1"> <then> <!-- Wagen zum Rangierzug hinzufgen --> <operator id="@%callerid%" cmd="addcar" carids="%oid%"/> <!-- Zaehler fuer Rangierfunktionen setzen --> <vr id="%lcid%" value="#%lcid% + 1"/> <!-- Variable Pos_Block reduzieren --> <vr id="Pos_%callerid%" value="#Pos_%callerid% - 1"/> <trace text="gleich"/> </then> <else> <!-- var2 auf ungleich setzen, damit Schleife beendet wird --> <vr id="var2" text="ungleich"/> <trace text="ungleich"/> </else> </if> </then> <else> <if state="waybill %waybill% = @var1"> <then> <!-- Wagen zum Rangierzug hinzufgen --> <operator id="@%callerid%" cmd="addcar" carids="%oid%"/> <!-- Zaehler fuer Rangierfunktionen setzen --> <vr id="%lcid%" value="#%lcid% + 1"/> <!-- Variable Pos_Block reduzieren --> <vr id="Pos_%callerid%" value="#Pos_%callerid% - 1"/> <trace text="gleich"/> </then> <else> <!-- var2 auf ungleich setzen, damit Schleife beendet wird --> <vr id="var2" text="ungleich"/> <trace text="ungleich"/> </else> </if> </else> </if> </foreach>
Der zweite Abschnitt ist der Bereich, wo der Rangierzug im Ausziehgleis (BK5) steht. Auch hier reicht jetzt nicht mehr nur die Prüfung auf leere oder beladene Wagons. Auch hier muß zusätzlich das Ziel von zugewiesenen Frachtscheinen berücksichtigt werden.
<!-- Pruefen, ob sich Wagons im Zuge befinden die beladen sind und passendes Ziel haben --> <foreach table="carlist" condition="@%callerid% = %operatorid%" state="car %oid% = loaded|waybill %waybill% = $dest"> <!-- Fahrbefehl Richtung BK1 --> <sleep time="3000"/> <trace text="%oid%"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="BK1"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </foreach> <!-- Pruefen ob noch weitere beladene Wagons zusammengestellt werden müssen --> <foreach table="carlist" state="car %oid% = BK2|car %oid% = BK3|car %oid% = BK4" alltrue="false"> <if state="car %oid% = loaded|waybill %waybill% = $dest"> <then> <vr id="var1" value="1"/> <break/> </then> </if> </foreach> <if condition="#var1 = 1"> <then> <vr id="var1" value="0"/> <!-- Pruefen ob sich im Zug Wagons befinden, die noch leer sind oder anderes Ziel haben und ein Zug zusammengestellt werden soll --> <!-- Diese werden dann in BK8 zwischengeparkt --> <foreach table="carlist" condition="@%callerid% = %operatorid%|$Doit # Zusammenstellen"> <if state="car %oid% ! loaded|waybill %waybill% ! $dest" alltrue="false"> <then> <!-- Fahrbefehl mit Zielblock --> <sleep time="3000"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="BK8"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </then> </if> </foreach> </then> </if> <!-- Pruefen ob sich im Zug Wagons befinden, die entladen sind abweichen --> <foreach table="carlist" condition="@%callerid% = %operatorid%"> <if state="car %oid% ! loaded|car %oid% ! $dest" alltrue="false"> <then> <!-- Hier passende Untergruppe ermitteln --> <switch var="%carsubtype%"> <!-- Untergruppe definieren --> <case val="tankcar"> <!-- Fahrbefehl mit Zielblock --> <sleep time="3000"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="BK4"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </case> <case val="gondola"> <!-- Fahrbefehl mit Zielblock --> <sleep time="3000"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="BK2"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </case> <case val="wellcar"> <!-- Fahrbefehl mit Zielblock --> <sleep time="3000"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="BK3"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </case> <!-- Hier evtl. weitere Untergruppen definieren --> </switch> </then> </if> </foreach> <!-- Pruefen, wo sich noch Wagons befinden, die beladen und das passende Ziel haben --> <foreach table="carlist" state="car %oid% = BK2|car %oid% = BK3|car %oid% = BK4" alltrue="false"> <!-- Hier pruefen, auf beladen und Zielblock --> <if state="car %oid% = loaded|waybill %waybill% = $dest"> <then> <!-- Hier Fahrbefehl Zielblock einsetzen--> <!-- Fahrbefehl Richtung Block --> <sleep time="3000"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="%carlocation%"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </then> </if> </foreach> <foreach table="carlist" state="car %oid% = BK8"> <!-- Hier pruefen, ob es sich um leere oder beladene Wagons handeln soll (loaded oder empty anpassen) --> <if state="car %oid% ! loaded|car %oid% ! $dest" alltrue="false"> <then> <!-- Fahrbefehl Richtung Block --> <sleep time="3000"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="%carlocation%"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </then> </if> </foreach> <foreach table="carlist" state="car %oid% = BK1"> <!-- Hier pruefen, ob es sich um leere oder beladene Wagons handeln soll (loaded oder empty anpassen) --> <if state="car %oid% ! loaded"> <then> <!-- Fahrbefehl Richtung Block --> <sleep time="3000"/> <lc bkid="%callerid%" cmd="gotoblock" blockid="%carlocation%"/> <lc bkid="%callerid%" cmd="go"/> <!-- script verlassen --> <exit/> </then> </if> </foreach>