(Stand: 09.11.2022)
→ Userpages - Wolfgang (WolfgangK)
In einem Bahnhof sollen auf einem Gleis lange und kurze Züge hintereinander halten können. Dies soll aus beiden Richtungen möglich sein. Auch ohne Zielwahl (im sogenannten Aquariumbetrieb) sollte Rocrail automatisch dafür sorgen, dass nur die passenden Züge in dieses Gleis einfahren dürfen.
Zur Erledigung dieser Aufgabe wird zunächst eine erste Lösung ausführlich erklärt. Die zentrale Idee ist, separate Fahrstraßen für beide Teilstücke des Bahnhofgleises und für alle Zuglängen händisch einzurichten und in den Teilblöcken diesen Fahrstraßen die passenden Rückmelder zuzuordnen. Da hierfür die Option »Ereignisse ignorieren, wenn nicht reserviert« aktiviert werden muss, vermindert dies etwas die Betriebssicherheit. Rocrail kann dann keinen Geisterzug (Ghost train) mehr melden, wenn ein Zug unerwartet in dieses Bahnhofsgleis einfährt. Ein weiterer Abschnitt weiter unten enthält einen Vorschlag für das »Wiederherstellen der Betriebssicherheit in bk1A und bk1B«.
Im Abschnitt »Besseres Abbremsen der Züge in bk1A und bk1B« werden zwei weitere Rückmelder eingeführt, die zusammen mit BBT oder einem PRE2IN-Melder ein besseres Abbremsverhalten ermöglichen.
Im Abschnitt »Zulassen von Pendelzügen« wird die erste Lösung so erweitert, dass auch Pendelzüge in die beide Teilstücke des Bahnhofgleises einfahren können.
Alle obigen Lösungen kommen ohne Skripte aus. Nur im letzen Abschnitt »Initialisierung und virtuelle Automatik« werden Skripte verwendet. In »Initialisierung« wird ein Initialisierung-Skript vorgestellt, das alle Ausgänge richtig schaltet, wenn der Automatikbetrieb gestartet wird. Und in »Virtuelle Automatik« werden Skripte verwendet, um den »Betriebsmodus« zwischen virtuell automatisch und virtuell händisch umschalten und die Zugbewegungen bei virtuell automatischem Betrieb übersichtlich im Trace darstellen und dadurch leichter nachverfolgen zu können.
bk1A und bk1B sind das geteilte Bahnhofsgleis. In den Textfelder über diesen Blöcken sind die realen Abstände zwischen den Rückmeldern eingetragen. Der Textblock »Anzeige der Fahrstraßen nach bk1A und bk1B« wird weiter unten erläutert.
Um den Erläuterungen im Folgenden besser zu verstehen, empfiehlt es sich den obigen Plan in einem separaten (Browser-)Fenster anzeigen zu lassen, damit er immer zusammen mit dem Text angesehen werden kann.
Bei dieser Lösung wird davon ausgegangen, dass auf dem geteilten Bahnhofsgleis mit den Blöcken »bk1A« und »bk1B« ein kurzer Zug von höchstens 30 cm und ein langer Zug von höchstens 60 cm einfahren darf. Dieses Bahnhofsgleis kann auch »ungeteilt« durch einen ganz langen Zug von höchstens 100 cm belegt werden.
Außerdem soll folgende Regel gelten: Wenn der ganze Bahnsteig frei ist, fährt der Zug immer bis zum Ende eines Bahnsteigs, d. h. bis zum letzten Block von seiner Fahrtrichtung aus gesehen. Wenn ein erster Zug eingefahren ist, kann also kein Zug aus der Gegenrichtung einfahren.
Die Züge in diesem Beispiel haben deshalb die folgenden Längen, wobei der Einfachheit halber hier nur den Loks eine Länge zugeordnet wird:
Lok-Kennung | Länge |
---|---|
Lok_1K | 300 mm |
Lok_2L | 600 mm |
Lok_3XL | 1000 mm |
Lok_4K | 300 mm |
Bei den Ein- und Ausfahrblöcken »bk3« bis »bk6« ist »Warten« ausgeschaltet. Bei allen anderen Blöcken ist »Warten« auf »Stopp« gesetzt.
Nach den obigen Regeln könnte ein Ablauf also wie folgt aussehen:
Ausgangssituation
Ablauf
Rocrail bietet ein weites Spektrum an Möglichkeiten, diese Steuerung einzurichten.
(siehe hierzu auch die Diskussion beim Spätschoppen via Jitsi 24.08.22)
In diesem Beispiel werden die folgenden Rocrail-Steuerungselemente verwendet:
Hinweis: Mit der Option »Ereignisse ignorieren, wenn nicht reserviert« wird die Betriebssicherheit von Rocrail ausgehebelt.
Wenn ein Zug – z. B. durch eine defekte Weiche – fälschlicher Weise in »bk1A« oder »bk1B« einfährt, wird kein Geisterzug gemeldet!
Um den Zugbetrieb wie gewünscht zu regeln, wurden für die Fahrt von »bk3« nach »bk1A« und nach »bk1B« die folgenden 5 FS eingerichtet:
Fahrstraße | Zuglänge | Kreuzende Blöcke | Passende Loks |
|
---|---|---|---|---|
minimal | maximal | |||
Von bk3 nach bk1A | ||||
[bk3+]-[bk1A-]_kurz | 1 | 300 | bk1B | Lok_1K, Lok_4K |
[bk3+]-[bk1A-]_lang | 301 | 600 | bk1B | Lok_2L |
[bk3+]-[bk1A-]_sehr_lang | 601 | 1000 | bk1B | Lok_3XL |
Von bk3 nach bk1B | ||||
[bk3+]-[bk1B-]_kurz | 1 | 300 | Lok_1K, Lok_4K | |
[bk3+]-[bk1B-]_lang | 301 | 600 | Lok_2L |
Damit nur Züge mit der gewünschten Länge diese FS benutzen können, sind in jeder dieser FS die minimalen und maximalen Zuglängen als Bedingung eingetragen. Da ein Zug, der von »bk3« nach »bk1A« unterwegs ist, auch über den Block »bk1B« fahren muss, ist in diesen FS der Block »bk1B« als kreuzender Block eingetragen. Damit wird auch verhindert, dass ein Zug von »bk3« nach »bk1A« fährt, wenn in »bk1B« noch ein anderer Zug steht, »bk1A« aber schon frei ist, weil der vordere Zug ausgefahren ist. Für sehr lange Züge gibt es keine FS von »bk3« nach »bk1B«, da sie für »bk3« immer zu lang sind, auch wenn in »bk1A« ein kurzer Zug hält.
Im Folgenden werden nur die FS aus Richtung »bk3« erläutert. Die FS aus Richtung »bk6« sind analog eingerichtet.
Zuordnung der Rückmelder im Block bk1A | ||
---|---|---|
Fahrstraße | ENTER-Melder | IN-Melder |
Von bk3 nach bk1A | ||
[bk3+]-[bk1A-]_kurz | fb_bk1_4 | fb_bk1_1 |
[bk3+]-[bk1A-]_lang | fb_bk1_4 | fb_bk1_1 |
[bk3+]-[bk1A-]_sehr_lang | fb_bk1_4 | fb_bk1_1 |
Von bk3 nach bk1B | ||
[bk3+]-[bk1B-]_kurz | fb_bk1_4 | fb_bk1_3 |
[bk3+]-[bk1B-]_lang | fb_bk1_4 | fb_bk1_2 |
Die hier vorgestellte Steuerung kann mit 4 realen Rückmelder realisiert werden. Um die im Folgenden beschriebenen Abstände zwischen den Rückmeldern einhalten zu können, müssen alle Rückmelder als Punktmelder eingerichtet sein. Die realen Abstände zwischen den Rückmeldern sind auch im obigen Rocrail-Plan dokumentiert.
Wie im Rocrail-Plan angedeutet, sind zwei Rückmelder (RM) an den Bahnsteigenden positioniert.
RM »fb_bk1_1« auf der Plus-Seite von »bk1A« und RM »fb_bk1_4« auf der Minus-Seite von »bk1B«. Sie haben einen Abstand von ca. 110 cm, damit ein ganz langer Zug von maximal 100 cm (z. B. »Lok_3XL«) zwischen ihnen Platz hat.
RM »fb_bk1_4« ist im Block »bk1A« für alle 3 FS von »bk3« nach »bk1A« als ENTER-Melder und RM »fb_bk1_1« als IN-Melder eingetragen. RM »fb_bk1_4« ist auch im Block »bk1B« für die beiden FS von »bk3« nach »bk1B« als ENTER-Melder eingetragen.
Die beiden »inneren« RM »fb_bk1_2« und »fb_bk1_3« werden als IN-Melder für »bk1B« benötigt.
RM »fb_bk1_2« ist 40 cm von RM »fb_bk1_1« entfernt. Damit ist sicher gestellt, dass ein zweiter langer Zug von maximal 60 cm in »bk1B« mit etwas Abstand hinter einem kurzen Zug von maximal 30 cm halten kann. RM »fb_bk1_2« ist also in »bk1B« für die FS »[bk3+]-[bk1B-]_lang« als IN-Melder eingetragen.
RM »fb_bk1_3« ist 70 cm von RM »fb_bk1_1« entfernt, um sicher zu stellen, dass ein zweiter kurzer Zug von maximal 30 cm in »bk1B« mit etwas Abstand hinter einem langen Zug von maximal 60 cm halten kann. Bei der FS »[bk3+]-[bk1B-]_kurz« muss also der RM »fb_bk1_3« als IN-Melder eingetragen werden.
Da alle Rückmelder in mehr als einem Block verwendet werden, muss bei den FS-Einstellungen in den Blöcken »bk1A« und »bk1B« die Checkbox »Ereignisse ignorieren, wenn nicht reserviert« aktiviert werden.
Auch hier sind nur die Ausgänge erläutert, die für FS aus Richtung »bk3« benötigt werden. Die Ausgänge für FS aus Richtung »bk6« sind analog eingerichtet.
Die Namen der Ausgänge wurden so gewählt, dass aus ihnen abgleitet werden kann, welche FS sie steuern und durch welche Blockbelegung sie ein- und ausgeschaltet werden. So steht z. B. »co_fs_3-1Bkurz_1A« für:
Ausgang (co) in der Fahrstraße (_fs) »[bk3+]-[bk1B-]_kurz« (_3-1Bkurz)
gesteuert von den Fahrstraßen nach und von »bk1A« (_1A).
Und »co_fs_3-1Blang_1A« für:
Ausgang in der Fahrstraße »[bk3+]-[bk1B-]_lang«
gesteuert von den Fahrstraßen nach und von »bk1A«.
Fahrstraße | Zuglänge | Kreuzende Blöcke | Rückmelder (Ausgänge) | Befehle | |
---|---|---|---|---|---|
minimal | maximal | ||||
Von bk3 nach bk1A | |||||
[bk3+]-[bk1A-]_kurz | 1 | 300 | bk1B | – | co_fs_3-1Blang_1A = off co_fs_3-1Bkurz_1A = off |
[bk3+]-[bk1A-]_lang | 301 | 600 | bk1B | – | co_fs_3-1Bkurz_1A = off |
[bk3+]-[bk1A-]_sehr_lang | 601 | 1000 | bk1B | – | – |
Von bk3 nach bk1B | |||||
[bk3+]-[bk1B-]_kurz | 1 | 300 | – | co_fs_3-1Bkurz_1A | – |
[bk3+]-[bk1B-]_lang | 301 | 600 | – | co_fs_3-1Blang_1A | – |
Von bk1A nach bk5 | |||||
[bk1A+]-[bk5-] | – | – | – | – | co_fs_3-1Blang_1A = on co_fs_3-1Bkurz_1A = on |
Von bk1B nach bk5 | |||||
[bk1B+]-[bk5-] | – | – | – | – | – |
Wenn »bk1A« und »bk1B« frei sind und ein kurzer Zug aus Richtung »bk3« kommt, könnte Rocrail für ihn die FS »[bk3+]-[bk1A-]_kurz« nach »bk1A« oder die FS »[bk3+]-[bk1B-]_kurz« nach »bk1B« sperren. Da der erste Zug aus dieser Richtung aber immer bis »bk1A« durchfahren soll, muss die Auswahl für Rocrail auf die FS »[bk3+]-[bk1A-]_kurz« beschränkt werden. Deshalb wird in die FS »[bk3+]-[bk1B-]_kurz« unter »Rückmelder« der Ausgang »co_fs_3-1Bkurz_1A« eingetragen. Wenn dieser eingeschaltet ist, steht die FS »[bk3+]-[bk1B-]_kurz« nach »bk1B« keinem Zug mehr zur Verfügung.
Da auch langen Zügen aus Richtung »bk3« zwei FS zur Verfügung stehen, muss auch in die FS »[bk3+]-[bk1B-]_lang« ein Ausgang (hier »co_fs_3-1Blang_1A«) eingetragen werden. Für ganz lange Züge wird ein solcher Ausgang nicht benötigt, da es nur die eine FS »[bk3+]-[bk1A-]_sehr_lang« gibt.
Nach dem Start von Rocrail sollten sicherheitshalber alle Ausgänge eingeschaltet sein. Dadurch wird gewährleistet, dass auch zu Beginn der erste einfahrende Zug immer bis zum Ende des Bahnsteigs durch fährt. Im weiteren Verlauf sorgen Befehle in bestimmten FS für das passende Ein- und Ausschalten dieser Ausgänge.
Wenn ein langer Zug von »bk3« nach »bk1A« fährt, sorgt die FS »[bk3+]-[bk1A-]_lang« dafür, dass der Ausgang »co_fs_3-1Bkurz_1A« ausgeschaltet wird. Damit wird die FS »[bk3+]-[bk1B-]_kurz« freigegeben, so dass jetzt noch ein kurzer Zug in »bk1B« einfahren könnte. Die FS »[bk3+]-[bk1B-]_lang« darf nicht freigegeben werden, weil ein langer Zug nicht mehr in »bk1B« hineinpasst.
Wenn als erster ein kurzer Zug von »bk3« nach »bk1A« fährt, schaltet entsprechend die FS »[bk3+]-[bk1A-]_kurz« den Ausgang »co_fs_3-1Blang_1A« aus; denn dann darf über die FS »[bk3+]-[bk1B-]_lang« auch ein langer Zug von »bk3« aus in »bk1B« einfahren. Zusätzlich ist es in diesem Fall aber auch zulässig, an Stelle eines langen Zugs einen weiteren kurzen Zug von »bk3« nach »bk1B« fahren zu lassen. Deshalb schaltet die FS »[bk3+]-[bk1A-]_kurz« auch den Ausgang »co_fs_3-1Bkurz_1A« aus.
Wenn ein Zug den Block »bk1A« in Richtung »bk5« verlässt und dabei die FS »[bk1A+]-[bk5-]« sperrt, werden durch diese FS die Ausgänge »co_fs_3-1Bkurz_1A« und »co_fs_3-1Blang_1A« wieder eingeschaltet. Ist dann irgendwann auch der Zug in »bk1B« nach »bk5« ausgefahren, sind die Ausgänge so geschaltet, dass der nächste Zug wieder bis zum Ende des Bahnsteigs durch fährt.
Für die FS »[bk1B+]-[bk5-]« ist bezüglich der Ausgänge nichts zu tun.
Im Folgenden werden an Hand des obigen Ablaufbeispiels die einzelnen Schritte der Steuerung näher erläutert.
Wenn dieses Beispiel mit Rocrail nachgestellt wird, kann in den Textfeldern der »Anzeige der Fahrstraßen nach bk1A und bk1B« im obigen Plan die von Rocrail getroffene Auswahl der FS und der Status der Ausgänge (rot = on; weiß = off) beobachtet werden. Diese Textfelder sind dabei wie folgt zu »lesen«:
Ausgangssituation
Ablauf
Der recht kurze Abstand zwischen ENTER- und IN-Melder im oben vorgestellten Plan kann zur Folge habe, dass Züge abrupt anhalten müssen, um punktgenau am IN-Melder zum Stehen zu kommen. Schlimmstenfalls ist ein rechtzeitiges Bremsen gar nicht möglich und der Zug überfährt den IN-Melder um ein großes Stück.
Um dies zu verhindern, werden in den obigen Plan zwei weitere Rückmelder (RM) verbaut, die dann an Stelle der bisherigen ENTER-Melder in den Blöcken »bk1A« und »bk1B« eingesetzt werden: RM »fb_bk1_plus« links von Block »bk1A« noch vor RM »fb_bk1_1« und RM »fb_bk1_minus« rechts von Block »bk1B« noch nach RM »fb_bk1_4«. Je weiter die beiden neuen RM im realen Gleis von RM »fb_bk1_1« und RM »fb_bk1_4« entfernt sind, desto mehr Spielraum bleibt z. B. für ein sanftes Abbremsen der Züge mit BBT.
Der Block »bk1_ghost« wird weiter unten im Abschnitt »Wiederherstellen der Betriebssicherheit in bk1A und bk1B« erläutert.
Die RM sind in den Blöcken dann wie folgt eingetragen:
Fahrstraße | ENTER-Melder | IN-Melder |
---|---|---|
Von bk3 nach bk1A | ||
[bk3+]-[bk1A-]_kurz | fb_bk1_minus | fb_bk1_1 |
[bk3+]-[bk1A-]_lang | fb_bk1_minus | fb_bk1_1 |
[bk3+]-[bk1A-]_sehr_lang | fb_bk1_minus | fb_bk1_1 |
Von bk3 nach bk1B | ||
[bk3+]-[bk1B-]_kurz | fb_bk1_minus | fb_bk1_3 |
[bk3+]-[bk1B-]_lang | fb_bk1_minus | fb_bk1_2 |
Von bk6 nach bk1A | ||
[bk6-]-[bk1A+]_kurz | fb_bk1_plus | fb_bk1_2 |
[bk6-]-[bk1A+]_lang | fb_bk1_plus | fb_bk1_3 |
Von bk6 nach bk1B | ||
[bk6-]-[bk1B+]_kurz | fb_bk1_plus | fb_bk1_4 |
[bk6-]-[bk1B+]_lang | fb_bk1_plus | fb_bk1_4 |
[bk6-]-[bk1B+]_sehr_lang | fb_bk1_plus | fb_bk1_4 |
Aber auch ohne BBT kann ein gutes Abbremsverhalten erreicht werden, indem die passenden RM »fb_bk1_1« bis »fb_bk1_4« als »pre2in«-Melder eingesetzt werden.
Fahrstraße | ENTER-Melder | IN-Melder | PRE2IN-Melder |
---|---|---|---|
Von bk3 nach bk1A | |||
[bk3+]-[bk1A-]_kurz | fb_bk1_minus | fb_bk1_1 | fb_bk1_2 |
[bk3+]-[bk1A-]_lang | fb_bk1_minus | fb_bk1_1 | fb_bk1_2 |
[bk3+]-[bk1A-]_sehr_lang | fb_bk1_minus | fb_bk1_1 | fb_bk1_2 |
Von bk3 nach bk1B | |||
[bk3+]-[bk1B-]_kurz | fb_bk1_minus | fb_bk1_3 | fb_bk1_4 |
[bk3+]-[bk1B-]_lang | fb_bk1_minus | fb_bk1_2 | fb_bk1_3 |
Von bk6 nach bk1A | |||
[bk6-]-[bk1A+]_kurz | fb_bk1_plus | fb_bk1_2 | fb_bk1_1 |
[bk6-]-[bk1A+]_lang | fb_bk1_plus | fb_bk1_3 | fb_bk1_2 |
Von bk6 nach bk1B | |||
[bk6-]-[bk1B+]_kurz | fb_bk1_plus | fb_bk1_4 | fb_bk1_3 |
[bk6-]-[bk1B+]_lang | fb_bk1_plus | fb_bk1_4 | fb_bk1_3 |
[bk6-]-[bk1B+]_sehr_lang | fb_bk1_plus | fb_bk1_4 | fb_bk1_3 |
Die hier beschriebene Lösung ist schon im Plan unter »Besseres Abbremsen der Züge in bk1A und bk1B« enthalten.
Wie schon oben erwähnt, wird mit der Option »Ereignisse ignorieren, wenn nicht reserviert« ein zentraler Sicherungsmechanismus von Rocrail ausgehebelt. Wenn ein Zug – z. B. durch eine defekte Weiche – fälschlicher Weise in »bk1A« einfährt und dabei den RM »fb_bk1_plus« auslöst, wird Rocrail durch diese Option angewiesen, dieses Ereignis zu ignorieren; denn es ist ja keiner der Blöcke, in denen dieser RM eingetragen ist, reserviert. Es wird also kein Geisterzug gemeldet und der Zug wird nicht gestoppt.
Hier wird zunächst nur ein Geisterzug aus Richtung »bk6« betrachtet.
Aus einem etwas anderem Blickwinkel kann obige Fehlersituation auch wie folgt beschrieben werden: Ein Zug löst RM »fb_bk1_plus« aus, obwohl keine FS von »bk6« nach »bk1A« oder »bk1B« gesperrt ist.
Um diesen Zug zu stoppen, könnte beim Auslösen von RM »fb_bk1_plus« also zunächst überprüft werden, ob eine FS zu den Blöcken »bk1A« oder »bk1B« gesperrt ist. Wenn keine dieser FS gesperrt ist, muss ein fehlgeleiteter Zug den RM »fb_bk1_plus« ausgelöst haben. Wenn es dann gelänge, einen Geisterzug auszulösen, würde dieser Zug gestoppt.
Mit folgender Konstruktion wird hier dieses Vorgehen in Rocrail nachgebaut:
Zum Auslösen eines Geisterzugs wird der »Hilfsblock« »bk1_ghost« und die Aktion »bk1_ghost-plus_ausloesen« eingerichtet. Das »plus« im Namen der Aktion deutet an, dass diese Aktion nur für Geisterzüge gedacht ist, die den RM »fb_bk1_plus« auf der Plus-Seite der bk1-Blöcke auslösen. Diese Aktion macht nichts weiter als den RM »bk1_ghost+« des Hilfsblocks »bk1_ghost« auszulösen.
Wenn also die Rocrail-Automatik eingeschaltet ist und diese Aktion ausgeführt wird, meldet Rocrail einen Geisterzug im Block »bk1_ghost«.
Diese Aktion wird jetzt in der Aktionssteuerung des RM »fb_bk1_plus« eingetragen und beim Status »on« aufgerufen – aber nur dann, wenn keine der FS gesperrt ist, die über den RM »fb_bk1_plus« führen.
In den Bedingungen der Aktionssteuerung sind also alle FS eingetragen, die über den RM »fb_bk1_plus« führen. Alle diese FS müssen »ungesperrt« (»unlocked«) sein, damit die Aktion »bk1_ghost-plus_ausloesen« beim Auslösen von RM »fb_bk1_plus« aufgerufen werden darf. Deshalb muss in Übersicht der Aktionssteuerung die Option »Alle Bedingungen müssen WAHR sein« aktiviert sein (dies ist normalerweise voreingestellt). Anders herum gesagt: Wenn nur eine dieser FS gesperrt ist, wird diese Aktion nicht ausgeführt.
Für Geisterzüge, die über den RM »fb_bk1_minus« fahren, gibt es die Aktion »bk1_ghost-minus_ausloesen«. Diese ist in der Aktionssteuerung des RM »fb_bk1_minus« eingetragen und hat in den Bedingungen die FS eingetragen, die über den RM »fb_bk1_minus« führen.
Durch diese Maßnahme lösen also folgende Zugbewegungen einen Geisterzug aus:
Um fehlerhafte Geisterzug-Meldungen zu vermeiden, sollten auch die beiden RM »fb_bk1_plus« und »fb_bk1_minus« als Punktmelder eingerichtet sein.
In diesem Abschnitt wird beschrieben, wie die bisherige Steuerung so erweitert werden kann, dass auch Pendelzüge in das geteilte Bahnhofsgleis einfahren und in Gegenrichtung wieder ausfahren können. Grundlage dieser Erweiterung ist der Plan, der im vorherigen Abschnitt um zwei Rückmelder erweitert wurde.
Bisher galt die Regel, dass ein Zug immer bis zum Ende eines leeren Bahnsteigs fahren muss. Diese Regel wird hier folgendermaßen geändert:
Pendelzüge fahren nur bis zum ersten Block und müssen diesen immer in der Richtung verlassen, aus der sie gekommen sind. Ist ein Pendelzug eingefahren, ist es deshalb auch erlaubt, dass ein
Zug aus der Gegenrichtung in das noch freien Bahnsteigsgleisstück einfahren darf.
Wenn allerdings der vordere Zug von 2 hintereinander stehenden Nicht-Pendelzügen ausfährt, soll das nun freie Bahnhofsgleisstück nicht von einem Pendelzug belegt werden können. Damit soll gewährleistet werden, dass die Ausfahrt des zweiten Nicht-Pendelzugs nicht behindert wird.
Um Pedelzüge nach diesen Regel zu steuern, werden weitere FS zu den Blöcken bk1A und bk1B eingerichtet, die nur für Pedelzüge gelten. Alle bisherigen FS zu den Blöcken bk1A und bk1B werden hingegen jetzt für Pedelzüge gesperrt.
Zu den bisherigen Zügen werden zum Testen des neuen Plans vier weitere Pendelzüge hinzugefügt. Auch hier wird der Einfachheit halber nur den Pedel-Loks eine Länge zugeordnet.
Lok-Kennung | Länge | Pedelzug |
---|---|---|
Lok_1K | 300 mm | nein |
Lok_2L | 600 mm | nein |
Lok_3XL | 1000 mm | nein |
Lok_4K | 300 mm | nein |
Lok_5PK | 300 mm | ja |
Lok_6PL | 600 mm | ja |
Lok_7PK | 300 mm | ja |
Lok_8PL | 600 mm | ja |
Zur Sperrung der bisherigen FS für alle Pendelzüge, die zu den Blöcken bk1A und bk1B führen, wird in den FS unter »Berechtigungen« bei »Pedelzug« »nein« aktiviert. Die neuen FS für Pedelzüge erhalten am Ende ihres Namens ein »-P«. Die FS »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« wird für eine spezielle Situation benötigt, die weiter unten erläutert wird.
Der Übersichtlichkeit halber werden auch hier nur die FS aus Richtung »bk3« erläutert.
Die FS aus Richtung »bk6« sind analog eingerichtet.
Fahrstraße | Zuglänge | Pendelzug erlaubt | Kreuzende Blöcke | Passende Loks |
|
---|---|---|---|---|---|
minimal | maximal | ||||
Von bk3 nach bk1A | |||||
[bk3+]-[bk1A-]_kurz | 1 | 300 | nein | bk1B | Lok_1K, Lok_4K |
[bk3+]-[bk1A-]_lang | 301 | 600 | nein | bk1B | Lok_2L |
[bk3+]-[bk1A-]_sehr_lang | 601 | 1000 | nein | bk1B | Lok_3XL |
Von bk3 nach bk1B | |||||
[bk3+]-[bk1B-]_kurz | 1 | 300 | nein | Lok_1K, Lok_4K | |
[bk3+]-[bk1B-]_lang | 301 | 600 | nein | Lok_2L | |
Neu für Pendelzüge von bk3 nach bk1B | |||||
[bk3+]-[bk1B-]_kurz-P | 1 | 300 | ja | Lok_5PK, Lok_7PK | |
[bk3+]-[bk1B-]_lang-P | 301 | 600 | ja | Lok_6PL, Lok_8PL | |
[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend | 301 | 600 | ja | bk1A | Lok_6PL, Lok_8PL |
In den Blöcken sind den neuen Pedelzug-FS die gleichen Rückmelder zugeordnet, wie den bisherigen FS.
Zuordnung der Rückmelder im Block bk1A für Pendel-FS | ||
---|---|---|
Fahrstraße | ENTER-Melder | IN-Melder |
Von bk3 nach bk1A | ||
[bk3+]-[bk1A-]_kurz-P | fb_bk1_4 | fb_bk1_1 |
[bk3+]-[bk1A-]_lang-P | fb_bk1_4 | fb_bk1_1 |
[bk3+]-[bk1A-]_lang-P_bk1A-kreuzend | fb_bk1_4 | fb_bk1_1 |
Fahrstraße | Pendelzug erlaubt | Kreuzende Blöcke | Rückmelder (Ausgänge) | Befehle für | |
---|---|---|---|---|---|
Nicht-Pendelzug-FS | Pendelzug-FS | ||||
Von bk3 nach bk1A | Steuerung von Fahrstraßen nach bk1B | ||||
[bk3+]-[bk1A-]_kurz | nein | bk1B | – | co_fs_3-1Blang_1A = off co_fs_3-1Bkurz_1A = off | co_fs_3-1BlangP_1A = off |
[bk3+]-[bk1A-]_lang | nein | bk1B | – | co_fs_3-1Bkurz_1A = off | – |
[bk3+]-[bk1A-]_sehr_lang | nein | bk1B | – | – | co_fs_3-1BkurzP_1A = on co_fs_3-1BlangP_1A = on |
Von bk6 nach bk1A | |||||
[bk6-]-[bk1A+]_kurz | nein | – | co_fs_6-1Akurz_1B | – | co_fs_3-1BkurzP_1A = on |
[bk6-]-[bk1A+]_lang | nein | – | co_fs_6-1Alang_1B | – | co_fs_3-1BkurzP_1A = on |
Pendelzüge von bk6 nach bk1A | |||||
[bk6-]-[bk1A+]_kurz-P | ja | – | co_fs_6-1AkurzP_1B | co_fs_3-1Bkurz_1A = off co_fs_3-1Blang_1A = off | co_fs_3-1BlangP_1A = off |
[bk6-]-[bk1A+]_lang-P | ja | – | co_fs_6-1AlangP_1B | co_fs_3-1Bkurz_1A = off | co_fs_3-1BlangP_1A = on |
Von bk1A nach bk4 | |||||
[bk1A-]-[bk4+] | nein | bk1B | – | – | co_fs_3-1BkurzP_1A = off |
Von bk1A nach bk5 | |||||
[bk1A+]-[bk5-] | nein | – | – | co_fs_3-1Blang_1A = on co_fs_3-1Bkurz_1A = on | co_fs_3-1BkurzP_1A = off co_fs_3-1BlangP_1A = on |
Von bk3 nach bk1B | |||||
[bk3+]-[bk1B-]_kurz | nein | – | co_fs_3-1Bkurz_1A | co_fs_6-1AkurzP_1B = on co_fs_6-1AlangP_1B = on | – |
[bk3+]-[bk1B-]_lang | nein | – | co_fs_3-1Blang_1A | co_fs_6-1AkurzP_1B = on co_fs_6-1AlangP_1B = on | – |
Pendelzüge von bk3 nach bk1B | |||||
[bk3+]-[bk1B-]_kurz-P | ja | – | co_fs_3-1BkurzP_1A | co_fs_6-1Akurz_1B = off co_fs_6-1Alang_1B = off | – |
[bk3+]-[bk1B-]_lang-P | ja | – | co_fs_3-1BlangP_1A | co_fs_6-1Akurz_1B = off | co_fs_6-1AlangP_1B = on |
[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend | ja | bk1A | – | co_fs_6-1Akurz_1B = off | co_fs_6-1AlangP_1B = on |
Von bk6 nach bk1B | |||||
[bk6-]-[bk1B+]_kurz | nein | bk1A | – | co_fs_6-1Akurz_1B = off co_fs_6-1Alang_1B = off | – |
[bk6-]-[bk1B+]_lang | nein | bk1A | – | co_fs_6-1Akurz_1B = off | – |
[bk6-]-[bk1B+]_sehr_lang | nein | bk1A | – | – | co_fs_6-1AlangP_1B = on co_fs_6-1AkurzP_1B = on |
Von bk1B nach bk4 | |||||
[bk1B-]-[bk4+] | nein | – | – | co_fs_6-1Akurz_1B = on co_fs_6-1Alang_1B = on | co_fs_6-1AlangP_1B = off co_fs_6-1AkurzP_1B = off |
Von bk1B nach bk5 | |||||
[bk1B+]-[bk5-] | nein | – | – | – | co_fs_6-1AkurzP_1B = off co_fs_6-1AlangP_1B = off |
Die Befehle für die Ausgänge, die Pendelzug-FS betreffen, setzen also die folgende Regelungen um (Im Folgenden werden nur die Regelungen erläutert, die für FS aus Richtung »bk3« gelten. Für FS aus Richtung »bk6« gelten analoge Regelungen.):
Regelung 1
FS »[bk3+]-[bk1B-]_kurz« und FS »[bk3+]-[bk1B-]_lang« sperren die Einfahrt für Pedelzüge von »bk6« nach »bk1a« über die Ausgänge »co_fs_6-1AkurzP_1B = on« und »co_fs_6-1AlangP_1B = on«. Damit ist gewährleistet, dass die Ausfahrt der Züge in »bk1B« nicht durch Pedelzüge in »bk1A« behindert wird. FS »[bk1B+]-[bk5-]« hebt diese Sperrung wieder auf.
Regelung 2
Ausgangs-Befehle in »[bk3+]-[bk1B-]_kurz-P« erlauben, dass auch kurze und lange Nicht-Pendelzüge in »bk1A« einfahren dürfen. In »[bk1B-]-[bk4+]« wird diese Erlaubnis wieder zurück genommen.
Regelung 3
Ausgangs-Befehle in »[bk3+]-[bk1B-]_lang-P« und »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« erlauben, dass auch kurze Nicht-Pendelzüge in »bk1A« einfahren dürfen. Auch diese Erlaubnis wird in »[bk1B-]-[bk4+]« wieder zurück genommen.
Regelung 4
Für den folgenden Fall muss noch eine spezielle Steuerung eingerichtet werden: Falls »Lok_6PL« in »bk1B« einfahren will, muss dafür gesorgt werden, dass nicht auch von »bk6« der lange Pendelzug »Lok_8PL« nach »bk1A« einfahren kann, da ja 2 lange Züge nicht in das Bahnsteiggleis passen.
Um dies zu verhindern, könnte die FS »[bk3+]-[bk1B-]_lang-P« den Ausgang »co_fs_6-1AlangP_1B« einschalten, der in FS »[bk6-]-[bk1A+]_lang-P« eingetragen ist. Dies reicht aber nicht aus. Wenn nämlich zeitgleich sowohl in »bk1A« als auch in »bk1B« ein langer Pedelzug einfahren will, verschließt Rocrail zunächst die geeigneten FS und führt erst danach die Befehle der FS aus. 1)
Dadurch kann es passieren, dass die FS für beide langen Pendelzüge verschlossen werden und dann beide Züge ins Bahnhofsgleis einfahren können. Die Befehle zum Einschalten der beiden Ausgäng »co_fs_3-1BlangP_1A« und »co_fs_6-1AlangP_1B« kämen dann also zu spät.
Diese Situation kann mit der zusätzlichen FS »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« abgefangen werden. In dieser FS ist der Block »bk1A« als kreuzender Block eingetragen. Außerdem ist der Ausgang »co_fs_3-1BlangP_1A« in der FS »[bk3+]-[bk1B-]_lang-P« standardmäßig eingeschaltet, so dass diese FS zunächst nicht zur Verfügung steht.
Die obige Situation läuft dann wie folgt ab:
Ausgangssituation
Ablauf
Regelung 5
Auf Grund dieser Steuerung muss jetzt noch die folgende Situation separat geregelt werden: Wenn in »bk1A« der Zug »Lok_7PK« eingefahren ist, wäre im Block »bk1B« noch Platz für »Lok_6PL«.
Nach der obigen Regelung kann »Lok_6PL« aber keine FS zugewiesen werden, da der von »Lok_7PK« belegte Block »bk1A« die FS »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« blockiert und die FS »[bk3+]-[bk1B-]_lang-P« durch den Ausgang »co_fs_3-1BlangP_1A« versperrt ist.
Um »Lok_6PL« die Einfahrt in »bk1B« zu ermöglich, ist also in der FS »[bk6-]-[bk1A+]_kurz-P« der Befehl »co_fs_3-1BlangP_1A = off« eingetragen. Damit kann Rocrail die FS »[bk3+]-[bk1B-]_lang-P« der »Lok_6PL« zuweisen. Sowie »Lok_6PL« wieder ausfährt, muss mit dem Befehl »co_fs_3-1BlangP_1A = on« in FS [bk1A+]-[bk5-] die FS »[bk3+]-[bk1B-]_lang-P« wieder gesperrt werden.
In diesem Abschnitt werden Skripte verwendet, um die gewünschten Aufgaben zu erledigen. Sie sind als Add-ons für die oben vorgestellten Lösungen gedacht. Für die bisher beschriebenen Funktionalitäten werden sie aber nicht benötigt.
Für das einwandfreie und vor allem unfallfreie Funktionieren der obigen Pläne ist eine wichtige Voraussetzung, dass alle Ausgänge richtig geschaltet sind. Durch ein händisches Umsetzen von Zügen in »bk1A« und »bk1B« kann es aber passieren, dass einige Ausgänge danach nicht mehr passend geschaltet sind.
Wenn z. B. »Lok_1K« händisch aus »bk1A« herausgenommen wird, bleiben die Ausgänge »co_fs_3-1Blang_1A« und »co_fs_3-1Bkurz_1A« ausgeschaltet. Wenn jetzt der automatische Fahrbetrieb wieder aufgenommen wird, könnte »Lok_2L« von »bk3« aus in »bk1B« einfahren, obwohl sie eigentlich bis »bk1A« durchfahren und erst dort anhalten sollte.
Noch kritischer wird es, wenn nach Beenden des Fahrbetriebs »bk1A« und »bk1B« frei sind und dann händisch z. B. »Lok_2L« in »bk1B« gesetzt wird. Der Ausgang »co_fs_6-1AlangP_1B« ist dann noch ausgeschaltet und es könnte von »bk6« aus die »Lok_8PL« in »bk1A« einfahren. Dies würde zu einem Zusammenstoß mit »Lok_2L« führen, da beide lange Züge sind und nicht zusammen in das Bahnhofsgleis passen.
Das folgende Skript »Init_Ausgaenge.xml« kann dabei helfen, die Ausgänge nach einem händischem Eingreifen wieder in einen ungefährlichen Zustand zu schalten. Das Skript wird unter »System-Aktionen…« eingetragen und beim Status »auto-on« aufgerufen.
<co id="co_fs_3-1Blang_1A" cmd="on"/> <co id="co_fs_3-1Bkurz_1A" cmd="on"/> <co id="co_fs_6-1Akurz_1B" cmd="on"/> <co id="co_fs_6-1Alang_1B" cmd="on"/> <co id="co_fs_3-1BlangP_1A" cmd="on"/> <!-- Falls lange oder sehr lange Züge in bk1A und bk1B stehen, muß auch verhindert werden, dass ein zu langer Pendelzug einfährt. --> <vr id="Lok_in_bk1A" text="" generated="true"/> <vr id="Lok_in_bk1B" text="" generated="true"/> <vr id="Laenge_Lok_in_bk1A" text="" value="" generated="true"/> <vr id="Laenge_Lok_in_bk1B" text="" value="" generated="true"/> <query vr="Lok_in_bk1A" table="bklist" id="bk1A" get="locid"/> <query vr="Lok_in_bk1B" table="bklist" id="bk1B" get="locid"/> <query vr="Laenge_Lok_in_bk1A" table="lclist" id="@Lok_in_bk1A" get="len"/> <query vr="Laenge_Lok_in_bk1B" table="lclist" id="@Lok_in_bk1B" get="len"/> <trace text="Lok_in_bk1A ' @Lok_in_bk1A ' mit Länge ' #Laenge_Lok_in_bk1A '"/> <trace text="Lok_in_bk1B ' @Lok_in_bk1B ' mit Länge ' #Laenge_Lok_in_bk1B '"/> <if condition="@Lok_in_bk1A - (null)"> <then> <!-- Zug in bk1A --> <if condition="#Laenge_Lok_in_bk1A > 300"> <then> <!-- langer oder sehr langer Zug in bk1A --> <if condition="#Laenge_Lok_in_bk1A < 601"> <then> <!-- langer Zug in bk1A --> <co id="co_fs_3-1BlangP_1A" cmd="on"/> </then> <else> <!-- sehr langer Zug in bk1A --> <co id="co_fs_3-1BkurzP_1A" cmd="on"/> <co id="co_fs_3-1BlangP_1A" cmd="on"/> </else> </if> </then> <!-- kurze Lok in bk1A --> <else> <!-- Hier ist nichts zu tun, da kurze und lange Pendelzüge in bk1A einfahren dürfen. --> </else> </if> </then> <else> <!-- bk1A ist frei --> <if condition="@Lok_in_bk1B - (null)"> <then> <!-- Zug in bk1B --> <if condition="#Laenge_Lok_in_bk1B > 300"> <then> <!-- langer oder sehr langer Zug in bk1B --> <if condition="#Laenge_Lok_in_bk1B < 601"> <then> <!-- langer Zug in bk1B --> <co id="co_fs_6-1AlangP_1B" cmd="on"/> </then> <else> <!-- sehr langer Zug in bk1B --> <co id="co_fs_6-1AkurzP_1B" cmd="on"/> <co id="co_fs_6-1AlangP_1B" cmd="on"/> </else> </if> </then> <!-- kurze Lok in bk1B --> <else> <!-- Hier ist nichts zu tun, da kurze und lange Pendelzüge in bk1B einfahren dürfen. --> </else> </if> </then> <else> <!-- bk1B ist auch frei --> <!-- Hier ist nichts zu tun, da bk1A und bk1B frei sind. --> </else> </if> </else> </if>
Zunächst werden unabhängg davon, wie bk1A und bk1B belegt sind, alle die Ausgänge eingeschaltet, die auch eingeschaltet sein müssten, wenn bk1A und bk1B frei sind. Und dann muss noch geprüft werden, ob lange oder sehr lange Züge in bk1A und bk1B stehen. Davon abhängig müssen die Ausgänge für Pendelzüge geschaltet werden, um zu verhindern, dass ein zu langer Pendelzug einfährt.
Allerdings greift dieser Schutzmechanismus nicht in allen Fällen. Wenn nämlich beim händisches Umsetzen der Züge die Automatik nicht vorher ausgeschaltet und nach dem Umsetzen wieder eingeschaltet wurde, wird dieses Skript nicht ausgeführt.
Da alle obigen Pläne ohne Aktionen bei Rückmeldern auskommen (mal abgesehen von den beiden Rückmelder, die einen Geisterzug auslösen sollen), können alle Zugbewegungen sehr schön mit der virtuellen Automatik 2) beobachtet werden.
Damit die virtuell automatisch gefahrenen Züge in allen Blöcken nur kurz anhalten und dann weiter fahren können, muss in allen Blöcken außer »bk3« bis »bk6« die Option »Warten« auf »Zufall« gesetzt werden. Für das bisherige virtuelle händische Testfahren wurden die Option »Warten« auf »Stopp« gesetzt, um die Zubewegungen und Blockbelegungen Schritt für Schritt beobachten zu können.
Um den Plan auf beide Weisen (virtuell automatisch und virtuell händisch) benutzen zu können, werden 2 Skripte benutzt, mit denen zwischen diesen beiden Modi hin und her geschaltet werden kann.
Das erste Skript »Alle_Loks_virtuell_starten.xml« wird durch einen Klick auf das Textfeld »tx_alle_Loks_virtuell_starten« aktiviert. Es setzt »Warten« in allen Blöcken außer »bk3« bis »bk6« auf »Zufall«, schaltet danach die Automatik ein und startet alle Loks mit der virtuellen Automatik.
<vr id="bk_Zufall" text="random" generated="true"/> <set vr="bk_Zufall" table="bklist" id="bk1A" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk1B" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk81" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk82" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk83" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk84" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk85" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk86" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk91" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk92" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk93" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk94" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk95" set="waitmode" setint="false"/> <set vr="bk_Zufall" table="bklist" id="bk96" set="waitmode" setint="false"/> <auto cmd="on"/> <auto cmd="startvirtual"/>
Das zweite Skript »Alle_Loks_stoppen.xml« wird durch einen Klick auf das textfeld »tx_alle_Loks_stoppen« aktiviert. Es stoppt alle Loks und wartet 5 Sekunden, bis alle noch fahrenden Loks im Zielblock angekommen sind. Danach wird »Warten« in allen Blocken außer »bk3« bis »bk6« auf »Stopp« gesetzt.
<auto cmd="stop"/> <sleep time="5000"/> <vr id="bk_Stopp" text="stop" generated="true"/> <set vr="bk_Stopp" table="bklist" id="bk1A" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk1B" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk81" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk82" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk83" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk84" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk85" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk86" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk91" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk92" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk93" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk94" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk95" set="waitmode" setint="false"/> <set vr="bk_Stopp" table="bklist" id="bk96" set="waitmode" setint="false"/>
Um die Fahrten der Züge während der virtuellen Automatik und insbesondere die Belegung der Blöcke »bk1A« und »bk1B« nachträglich in Ruhe ansehen zu können, wird ein drittes Skript »Gleisbelegung_protokollieren.xml« eingesetzt. Es wird in den Blöcken »bk1A«, »bk1B« und »bk3« bis »bk6« beim IN-Ereignis aufgerufen und schreibt bei jedem Aufruf eine Zeile in die Rocrail-Trace-Datei. In dieser Zeile wird zunächst die Lok genannt, die das IN-Ereignis ausgelöst hat, zusammen mit dem dazugehörige Block. Dann folgen die Belegung der Blöcke »bk1A«, »bk1B«, »bk3« und »bk6« im Augenblick dieses IN-Ereignisses. Diese Zeile könnte z. B. wie folgt aussehen:
... ---4K--in-6---- *6* Lok_4K >> *1A* << Lok_7PK *1B* Lok_6PL >> *3* ---
Diese Beispielzeile ist also wie folgt zu lesen:
Die Zeile des nächsten Beispiels wurde geschrieben, als »Lok_3XL« das IN-Ereignis von Block »bk3« ausgelöst hat. Zu diesem Zeitpunkt fuhr »Lok_1K« gerade von »bk6« über »bk1A« nach »bk1B«.
... ---3XL-in-3---- *6* Lok_1K >> *1A* Lok_1K >> *1B* Lok_1K >> *3* << Lok_3XL ---
In der 1. Zeile des nächsten Beispiels hat »Lok_4K« das IN-Ereignis von Block »bk3« ausgelöst,
während »Lok_1K« in »bk1A« und »Lok_5PK« in »bk1B« standen.
In der 2. Zeile hat »Lok_5PK« den Block »bk1B« verlassen und das IN-Ereignis von Block »bk4« ausgelöst,
während »Lok_8PL« in »bk6« einfuhr und weiterhin »Lok_1K« in »bk1A« und »Lok_4K« in »bk3« standen.
In der 3. Zeile hat »Lok_8PL« das IN-Ereignis von Block »bk6« ausgelöst,
während weiterhin »Lok_1K« in »bk1A« und »Lok_4K« in »bk3« standen.
---4K--in-3---- *6* *1A* Lok_1K >> *1B* Lok_5PK >> *3* << Lok_4K --- ---5PK-in-4---- *6* Lok_8PL >> *1A* Lok_1K >> *1B* *3* << Lok_4K --- ---8PL-in-6---- *6* Lok_8PL >> *1A* Lok_1K >> *1B* *3* << Lok_4K ---
Und hier noch eine etwas längere Beispielausgabe (ohne Erläuterung):
---4K--in-3---- *6* Lok_8PL >> *1A* *1B* *3* << Lok_4K --- ---4K--in-1A--- *6* Lok_8PL >> *1A* << Lok_4K *1B* *3* --- ---1K--in-3---- *6* Lok_8PL >> *1A* << Lok_4K *1B* << Lok_1K *3* << Lok_1K --- ---1K--in-1B--- *6* Lok_8PL >> *1A* << Lok_4K *1B* << Lok_1K *3* --- ---4K--in-5---- *6* Lok_8PL >> *1A* *1B* << Lok_1K *3* --- ---1K--in-5---- *6* Lok_8PL >> *1A* *1B* *3* --- ---6PL-in-3---- *6* Lok_8PL >> *1A* << Lok_8PL *1B* *3* << Lok_6PL --- ---8PL-in-1A--- *6* *1A* << Lok_8PL *1B* *3* << Lok_6PL --- ---1K--in-6---- *6* Lok_1K >> *1A* << Lok_8PL *1B* *3* << Lok_6PL --- ---8PL-in-5---- *6* Lok_1K >> *1A* *1B* *3* << Lok_6PL --- ---6PL-in-1B--- *6* Lok_1K >> *1A* *1B* Lok_6PL >> *3* --- ---1K--in-1A--- *6* *1A* Lok_1K >> *1B* Lok_6PL >> *3* --- ---6PL-in-4---- *6* Lok_2L >> *1A* Lok_1K >> *1B* *3* --- ---2L--in-6---- *6* Lok_2L >> *1A* Lok_1K >> *1B* *3* --- ---5PK-in-3---- *6* Lok_2L >> *1A* Lok_1K >> *1B* Lok_1K >> *3* << Lok_5PK --- ---1K--in-4---- *6* Lok_2L >> *1A* *1B* *3* << Lok_5PK --- ---2L--in-1B--- *6* *1A* *1B* Lok_2L >> *3* << Lok_5PK --- ---2L--in-4---- *6* Lok_4K >> *1A* *1B* *3* << Lok_5PK --- ---4K--in-6---- *6* Lok_4K >> *1A* *1B* Lok_5PK >> *3* << Lok_5PK --- ---5PK-in-1B--- *6* Lok_4K >> *1A* *1B* Lok_5PK >> *3* --- ---4K--in-1A--- *6* *1A* Lok_4K >> *1B* Lok_5PK >> *3* << Lok_1K --- ---1K--in-3---- *6* *1A* Lok_4K >> *1B* Lok_5PK >> *3* << Lok_1K --- ---5PK-in-4---- *6* *1A* Lok_4K >> *1B* *3* << Lok_1K --- ---4K--in-4---- *6* Lok_7PK >> *1A* *1B* *3* << Lok_1K --- ---7PK-in-6---- *6* Lok_7PK >> *1A* << Lok_1K *1B* << Lok_1K *3* << Lok_1K --- ---1K--in-1A--- *6* Lok_7PK >> *1A* << Lok_1K *1B* *3* --- ---2L--in-3---- *6* Lok_7PK >> *1A* << Lok_1K *1B* << Lok_2L *3* << Lok_2L --- ---1K--in-5---- *6* Lok_7PK >> *1A* *1B* << Lok_2L *3* << Lok_2L --- ---2L--in-1B--- *6* Lok_7PK >> *1A* *1B* << Lok_2L *3* --- ---2L--in-5---- *6* Lok_7PK >> *1A* *1B* *3* << Lok_4K --- ---4K--in-3---- *6* Lok_7PK >> *1A* *1B* *3* << Lok_4K --- ---7PK-in-1A--- *6* *1A* << Lok_7PK *1B* << Lok_4K *3* << Lok_4K --- ---4K--in-1B--- *6* Lok_8PL >> *1A* << Lok_7PK *1B* << Lok_4K *3* --- ---8PL-in-6---- *6* Lok_8PL >> *1A* << Lok_7PK *1B* << Lok_4K *3* --- ---5PK-in-3---- *6* Lok_8PL >> *1A* << Lok_7PK *1B* << Lok_4K *3* << Lok_5PK --- ---7PK-in-5---- *6* Lok_8PL >> *1A* *1B* << Lok_4K *3* << Lok_5PK --- ---4K--in-5---- *6* Lok_8PL >> *1A* *1B* *3* << Lok_5PK --- ---8PL-in-1A--- *6* *1A* << Lok_8PL *1B* Lok_5PK >> *3* << Lok_5PK --- ---5PK-in-1B--- *6* Lok_2L >> *1A* << Lok_8PL *1B* Lok_5PK >> *3* --- ---2L--in-6---- *6* Lok_2L >> *1A* << Lok_8PL *1B* Lok_5PK >> *3* --- ---8PL-in-5---- *6* Lok_2L >> *1A* *1B* Lok_5PK >> *3* --- ---5PK-in-4---- *6* Lok_2L >> *1A* *1B* *3* --- ---2L--in-1B--- *6* *1A* *1B* Lok_2L >> *3* --- ---3XL-in-6---- *6* Lok_3XL >> *1A* *1B* Lok_2L >> *3* << Lok_6PL --- ---2L--in-4---- *6* Lok_3XL >> *1A* *1B* *3* << Lok_6PL --- ---6PL-in-3---- *6* Lok_3XL >> *1A* *1B* *3* << Lok_6PL --- ---3XL-in-1B--- *6* *1A* *1B* Lok_3XL >> *3* << Lok_6PL --- ---4K--in-6---- *6* Lok_4K >> *1A* *1B* Lok_3XL >> *3* << Lok_6PL --- ---3XL-in-4---- *6* Lok_4K >> *1A* *1B* *3* << Lok_6PL --- ---6PL-in-1B--- *6* Lok_4K >> *1A* *1B* Lok_6PL >> *3* --- ---2L--in-3---- *6* Lok_4K >> *1A* Lok_4K >> *1B* Lok_6PL >> *3* << Lok_2L --- ---6PL-in-4---- *6* Lok_4K >> *1A* Lok_4K >> *1B* *3* << Lok_2L --- ---4K--in-1A--- *6* *1A* Lok_4K >> *1B* *3* << Lok_2L --- ---7PK-in-6---- *6* Lok_7PK >> *1A* Lok_4K >> *1B* *3* << Lok_2L --- ---4K--in-4---- *6* Lok_7PK >> *1A* *1B* *3* << Lok_2L ---
Das Skript »Gleisbelegung_protokollieren.xml« enthält folgende Code:
<vr id="Trace_fuer_Lok_in_bk1A_%callerid%" text="" generated="true"/> <vr id="Trace_fuer_Lok_in_bk1B_%callerid%" text="" generated="true"/> <vr id="Trace_fuer_Lok_in_bk3_%callerid%" text="" generated="true"/> <vr id="Trace_fuer_Lok_in_bk6_%callerid%" text="" generated="true"/> <vr id="Trace_fuer_Lok_im_%callerid%" text="" generated="true"/> <vr id="Lok_in_bk3_%callerid%" text="" generated="true"/> <vr id="Lok_in_bk6_%callerid%" text="" generated="true"/> <vr id="Lok_im_%callerid%" text="" generated="true"/> <!-- Trace-Ausgabe für Lok und Block vorbereiten, die das IN-Ereignis ausgelöst haben --> <query vr="Lok_im_%callerid%" table="bklist" id="%callerid%" get="locid"/> <vr id="Lok_im_%callerid%" text="@Lok_im_%callerid%-" start="4" length="3" tokeniser="-"/> <vr id="Trace_fuer_Lok_im_%callerid%" text="%callerid%----" start="2" length="5"/> <vr id="Trace_fuer_Lok_im_%callerid%" text="---@Lok_im_%callerid%-in-@Trace_fuer_Lok_im_%callerid%" tokeniser="-"/> <!-- Trace-Ausgabe für bk3 vorbereiten --> <query vr="Lok_in_bk3_%callerid%" table="bklist" id="bk3" get="locid"/> <if condition="@Lok_in_bk3_%callerid% # (null)"> <then> <vr id="Trace_fuer_Lok_in_bk3_%callerid%" text=" " generated="true"/> </then> <else> <vr id="Trace_fuer_Lok_in_bk3_%callerid%" text="@Lok_in_bk3_%callerid% " start="0" length="7" generated="true"/> <vr id="Trace_fuer_Lok_in_bk3_%callerid%" text="<< @Trace_fuer_Lok_in_bk3_%callerid%" generated="true"/> </else> </if> <!-- Trace-Ausgabe für bk6 vorbereiten --> <query vr="Lok_in_bk6_%callerid%" table="bklist" id="bk6" get="locid"/> <if condition="@Lok_in_bk6_%callerid% # (null)"> <then> <vr id="Trace_fuer_Lok_in_bk6_%callerid%" text=" " generated="true"/> </then> <else> <vr id="Trace_fuer_Lok_in_bk6_%callerid%" text="@Lok_in_bk6_%callerid% " start="0" length="7" generated="true"/> <vr id="Trace_fuer_Lok_in_bk6_%callerid%" text="@Trace_fuer_Lok_in_bk6_%callerid% >>" generated="true"/> </else> </if> <!-- Trace-Ausgabe für bk1A und bk1B vorbereiten --> <call id="Trace-Ausgabe_vorbereiten" param="bk1A,Trace_fuer_Lok_in_bk1A_%callerid%"/> <call id="Trace-Ausgabe_vorbereiten" param="bk1B,Trace_fuer_Lok_in_bk1B_%callerid%"/> <!-- Trace ausgeben --> <trace text="@Trace_fuer_Lok_im_%callerid% *6* @Trace_fuer_Lok_in_bk6_%callerid% *1A* @Trace_fuer_Lok_in_bk1A_%callerid% *1B* @Trace_fuer_Lok_in_bk1B_%callerid% *3* @Trace_fuer_Lok_in_bk3_%callerid% ---"/> <function id="Trace-Ausgabe_vorbereiten"> <!-- sub_TAv_ Eingabeparameter: %subparam1%: Block Ausgabeparameter: %subparam2%: Trace-Ausgabe --> <vr id="sub_TAv_Lok_%callerid%" text="" generated="true"/> <vr id="sub_TAv_Lok_normiert_%callerid%" text="" generated="true"/> <vr id="sub_TAv_Pendellok_%callerid%" text="" generated="true"/> <vr id="sub_TAv_Blockenterside_%callerid%" text="" generated="true"/> <query vr="sub_TAv_Lok_%callerid%" table="bklist" id="%subparam1%" get="locid"/> <vr id="sub_TAv_Lok_normiert_%callerid%" text="@sub_TAv_Lok_%callerid% " start="0" length="7" generated="true"/> <if condition="@sub_TAv_Lok_%callerid% # (null)"> <then> <vr id="%subparam2%" text=" " generated="true"/> </then> <else> <query vr="sub_TAv_Pendellok_%callerid%" table="lclist" id="@sub_TAv_Lok_%callerid%" get="commuter"/> <if condition="@sub_TAv_Pendellok_%callerid% # true"> <then> <!-- Pendellok --> <if condition="%subparam1% # bk1A"> <then> <!-- Pendellok hält in bk1A fährt nach bk5 --> <vr id="%subparam2%" text="<< @sub_TAv_Lok_normiert_%callerid% " generated="true"/> </then> <else> <!-- Pendellok hält in bk1B fährt nach bk4 --> <vr id="%subparam2%" text=" @sub_TAv_Lok_normiert_%callerid% >>" generated="true"/> </else> </if> </then> <else> <!-- keine Pendellok --> <query vr="sub_TAv_Blockenterside_%callerid%" table="lclist" id="@sub_TAv_Lok_%callerid%" get="blockenterside"/> <if condition="@sub_TAv_Blockenterside_%callerid% # true"> <then> <!-- Blockenterside ist "+" Lok fährt nach bk4 --> <vr id="%subparam2%" text=" @sub_TAv_Lok_normiert_%callerid% >>" generated="true"/> </then> <else> <!-- Blockenterside ist "-" Lok fährt nach bk5 --> <vr id="%subparam2%" text="<< @sub_TAv_Lok_normiert_%callerid% " generated="true"/> </else> </if> </else> </if> </else> </if> </function>
Das meiste in diesem Skript ist Textverarbeitung. Für die bessere Lesbarkeit werden die kürzeren Lok- und Block-Bezeichnungen noch mit Leer- oder Minuszeichen aufgefüllt. Im Trace erscheint dann alles »schön untereinander«. 3)
Hierbei erfordert das Einfügen der Richtungspfeile (>>) bei den Blöcken »bk1A« und »bk1B« etwas mehr Aufwand. Es muss abgefragt werden, ob ein Pendelzug eingefahren ist und wenn es kein Pendelzug ist, in welche Richtung der Zug fährt, um diese Pfeile richtig herum einsetzen zu können. Diese Aufgabe wird in der Funktion »Trace-Ausgabe_vorbereiten« erledigt.
Der Rest sind query-Abfragen. Mit ihnen wird erfragt, welche Lok gerade den Block belegt. Und für die Loks wird erfragt, ob dies eine Pendellok (commuter) ist. Falls nicht, wird noch Blockseite (blockenterside) erfragt, aus welcher sie eingefahren ist.