User Tools

Site Tools


userpages:wolfgangk:geteiltesbahnhofsgleis

Geteiltes Bahnhofsgleis mit variablen Zuglängen

(Stand: 09.11.2022)

Userpages - Wolfgang (WolfgangK)

Aufgabenstellung und Überblick

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.

Erläuterung der ersten Lösung

geteiltes_bahnhofsgleis_plan.jpg
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.

Download des Rocrail-Plans

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.

Ablaufbeispiel

Nach den obigen Regeln könnte ein Ablauf also wie folgt aussehen:

Ausgangssituation

  • bk1A und bk1B sind frei und
  • alle Ausgänge eingeschaltet (rote Dreiecke).
  • Lok_4K, Lok_2L und Lok_3XL stehen in den bk8x-Blocks,
  • Lok_1K in einem der bk9x-Blocks.

Ablauf

  1. Lok_2L starten. Sie fährt über bk3 nach bk1A.
  2. Lok_4K starten. Sie fährt über bk3 nach bk1B.
  3. Lok_2L starten. Sie fährt über bk5 in einen der bk9x-Blöcke.

  4. Lok_3XL starten. Sie fährt aber nur bis bk3, da kein passender Bahnhofsblock frei ist.
  5. Lok_1K starten. Sie fährt aber nur bis bk6, da in bk1B noch ein Zug in Gegenrichtung steht.

  6. Lok_4K starten. Sie fährt über bk5 in einen der bk9x-Blöcke.

    Jetzt entscheidet der Zufall, welche der Loks »Lok_3XL« oder »Lok_1K« zuerst von Rocrail gestartet wird. In diesem Beispiel soll es »Lok_3XL« sein.

  7. Lok_3XL fährt zum Block bk1A.
  8. Lok_1K muss weiterhin in bk6 warten.

  9. Lok_3XL starten. Sie fährt über bk5 in einen der bk9x-Blöcke.
  10. Lok_1K fährt zum Block bk1B.
  11. Lok_2L starten. Sie fährt über bk6 nach bk1A.

Die Steuerungswerkzeuge

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:

  • Zu den beiden Blöcken werden für alle Richtungen und für alle Zuglängen separate Fahrstraßen (FS) händisch eingerichtet.
  • Zuglängen, kreuzende Blöcke und Ausgänge werden verwendet, um die Auswahl der FS zu steuern.
  • In den Blöcken werden jeder FS die passenden Rückmelder zugeordnet
  • und die Option »Ereignisse ignorieren, wenn nicht reserviert« aktiviert.
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!

Fahrstraßen von bk3 nach bk1A und bk1B

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.

Rückmelder: Anordnung im Gleis und FS-Zuordnung in bk1A und bk1B

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.

Ausgänge zur FS-Steuerung

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.

Ablaufbeispiel mit Steuerungsdetails

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«:

Anzeige der Fahrstraßen nach bk1A und bk1B
Linken Textblock zu lesen als
geteiltes_bahnhofsgleis_plan_ausschnitt_links.jpg FS von bk6 nach bk1A für kurze Züge, gesteuert über einen Ausgang
FS von bk6 nach bk1A für lange Züge, gesteuert über einen Ausgang
FS von bk3 nach bk1A für kurze Züge
FS von bk3 nach bk1A für lange Züge
FS von bk3 nach bk1A für sehr lange Züge
Rechter Textblock zu lesen als
geteiltes_bahnhofsgleis_plan_ausschnitt_rechts.jpg FS von bk3 nach bk1B für kurze Züge, gesteuert über einen Ausgang
FS von bk3 nach bk1B für lange Züge, gesteuert über einen Ausgang
FS von bk6 nach bk1B für kurze Züge
FS von bk6 nach bk1B für lange Züge
FS von bk6 nach bk1B für sehr lange Züge

Ausgangssituation

  • bk1A und bk1B sind frei.
  • Lok_4K, Lok_2L und Lok_3XL stehen in einem der bk8x-Blocks,
  • Lok_1K in einem der bk9x-Blocks.
  • Alle Ausgänge sind eingeschaltet (also »rot«).

Ablauf

  1. Lok_2L starten.

    Für Ihre Fahrt ab »bk3« bekommt sie von Rocrail die FS »[bk3+]-[bk1A-]_lang« zugewiesen, da in dieser FS die passende Länge eingetragen ist. Auch die FS »[bk3+]-[bk1B-]_lang« würde passen. Diese FS ist aber durch den Ausgang »co_fs_3-1Blang_1A« gesperrt.

    Lok_2L fährt also nach bk1A.

    Über Befehle in der FS »[bk3+]-[bk1A-]_lang« wird der Ausgang »co_fs_3-1Bkurz_1A« ausgeschaltet, da ja in Block »bk1B« noch Platz für einen kurzen Zug ist. Damit ist jetzt die FS »[bk3+]-[bk1B-]_kurz« freigegeben.

    Auf ihrem Weg löst die Lok die Rückmelder »fb_bk1_4«, »fb_bk1_3«, »fb_bk1_2« und »fb_bk1_1« aus. Da im Block »bk1A« der FS »[bk3+]-[bk1A-]_lang« der Melder »fb_bk1_4« als ENTER und »fb_bk1_1« als IN zugeordnet ist, hält »Lok_2L« bei »fb_bk1_1« an. Die anderen Rückmelder werden in diesem Block also nicht beachtet.

    Alle Rückmelder sind aber auch im Block »bk1B« eingetragen und würden dort eine Geisterzug-Meldung auslösen. Dies wird durch die Option »Ereignisse ignorieren, wenn nicht reserviert« in »bk1B« verhindert, da »bk1B« ja nicht reserviert wurde (»bk1B« ist als kreuzender Block in dieser FS wohl gesperrt, aber nicht reserviert).

  2. Lok_4K starten.

    Für Ihre Fahrt ab »bk3« bekommt sie von Rocrail die FS »[bk3+]-[bk1B-]_kurz« zugewiesen, da in dieser FS die passende Länge eingetragen ist und der Block »bk1A«, zu dem es auch eine passende FS gäbe, besetzt ist.

    Sie fährt also nach »bk1B« und hält am Rückmelder »fb_bk1_3« an, da dieser im Block »bk1B« als IN-Melder für die FS »[bk3+]-[bk1B-]_kurz« eingetragen ist.

  3. Lok_2L starten.

    Für Ihre Fahrt nach »bk5« bekommt sie von Rocrail die FS »[bk1A+]-[bk5-]« zugewiesen. Über Befehle in dieser FS wird der Ausgang »co_fs_3-1Bkurz_1A« wieder eingeschaltet und damit die FS »[bk3+]-[bk1B-]_kurz« gesperrt. Nachfolgende Züge können jetzt also nicht mehr in »bk1B« einfahren sondern nur nach »bk1A«.

    Lok_2L fährt über bk5 weiter in einen der bk9x-Blöcke.

  4. Lok_3XL starten.

    In »bk3« muss sie anhalten, da es nur eine FS mit passenden Länge nach »bk1A« gibt
    und diese FS den Block »bk1B« als kreuzenden Block eingetragen hat. In »bk1B« steht ja weiterhin »Lok_4K«.

  5. Lok_1K starten.

    In »bk6« muss sie anhalten. Es gibt wohl zwei mögliche FS, die zu ihrer Länge passen. Aber die eine FS »[bk6-]-[bk1A+]_kurz« ist durch den Ausgang »co_fs_6-1Akurz_1B« gesperrt und die andere »[bk6-]-[bk1B+]_kurz« führt zu »bk1B«, der ja durch »Lok_4K« belegt ist.

  6. Lok_4K starten.

    Sie fährt über bk5 in einen der bk9x-Blöcke.

    Dabei löst sie noch die Rückmelder »fb_bk1_2« und »fb_bk1_1« aus, die aber wie oben beschrieben, von Rocrail nicht beachtet werden.

    Jetzt entscheidet der Zufall, welche der Loks »Lok_3XL« oder »Lok_1K« zuerst eine FS von Rocrail zugeordnet wird. Wie oben soll es auch hier wieder »Lok_3XL« sein. Ihr kann von Rocrail jetzt die FS »[bk3+]-[bk1A-]_sehr_lang« zugeordnet werden, da die Länge passt und der kreuzende Block frei ist.

  7. Lok_3XL fährt also zum Block bk1A.

    In der FS »[bk3+]-[bk1A-]_sehr_lang« werden keine Ausgänge ausgeschaltet, da ja kein Block für einen weiteren Zug frei ist. Auch auf ihrem Weg löst sie die Rückmelder »fb_bk1_4«, »fb_bk1_3«, »fb_bk1_2« und »fb_bk1_1« aus. Da im Block »bk1A« der FS »[bk3+]-[bk1A-]_sehr_lang« der Melder »fb_bk1_4« als ENTER und »fb_bk1_1« als IN zugeordnet ist, hält »Lok_3XL« bei »fb_bk1_1« an. Die anderen Rückmelder werden auch hier nicht beachtet.

  8. Lok_1K muss weiterhin in bk6 warten.

  9. Lok_3XL starten.

    Sie fährt über bk5 in einen der bk9x-Blöcke.

  10. Jetzt kann Lok_1K weiterfahren.

    Sie bekommt von Rocrail die FS »[bk6-]-[bk1B+]_kurz« zugewiesen, da in dieser FS die passende Länge eingetragen ist. Auch die FS »[bk6-]-[bk1A+]_kurz« würde passen. Diese FS ist aber durch den Ausgang »co_fs_6-1Akurz_1B« gesperrt.

    Lok_1K fährt also nach bk1B.

    Über Befehle in der FS »[bk6-]-[bk1B+]_kurz« werden die Ausgänge »co_fs_6-1Akurz_1B« und »co_fs_6-1Alang_1B« ausgeschaltet, da ja in Block »bk1A« noch Platz für einen kurzen oder langen Zug ist. Damit sind jetzt die FS »[bk6-]-[bk1A+]_kurz« und »[bk6-]-[bk1A+]_lang« freigegeben.

    Auf ihrem Weg löst die Lok die Rückmelder »fb_bk1_1«, »fb_bk1_2«, »fb_bk1_3« und »fb_bk1_4« aus. Da im Block »bk1B« der FS »[bk6-]-[bk1B+]_kurz« der Melder »fb_bk1_3« als ENTER und »fb_bk1_4« als IN zugeordnet ist, hält »Lok_1K« bei »fb_bk1_4« an. Die anderen Rückmelder werden auch hier nicht beachtet.

  11. Lok_2L starten.

    Für Ihre Fahrt ab »bk6« bekommt sie von Rocrail die FS »[bk6-]-[bk1A+]_lang« zugewiesen, da in dieser FS die passende Länge eingetragen ist und der Block »bk1B«, zu dem es auch eine passende FS gäbe, besetzt ist.

    Sie fährt also nach »bk1A« und hält am Rückmelder »fb_bk1_3« an, da dieser im Block »bk1A« als IN-Melder für die FS »[bk6-]-[bk1A+]_lang« eingetragen ist. Der Rückmelder »fb_bk1_2« wird auch ausgelöst, aber von Rocrail nicht beachtet. Rückmelder »fb_bk1_1« war in diesem Fall wieder der ENTER-Melder.

Besseres Abbremsen der Züge in bk1A und bk1B

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.

geteiltes_bahnhofsgleis_plan_mit_zusatz-rm.jpg
Der Block »bk1_ghost« wird weiter unten im Abschnitt »Wiederherstellen der Betriebssicherheit in bk1A und bk1B« erläutert.

Download des Rocrail-Plans

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

Wiederherstellen der Betriebssicherheit in bk1A und bk1B

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.

Lösung zum Stoppen des Zugs

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.

geteiltes_bahnhofsgleis_aktionssteuerung_fb_bk1_plus.jpg   geteiltes_bahnhofsgleis_aktionssteuerung_fb_bk1_plus_bedingungen.jpg

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:

  1. Züge, die durch eine defekte Weiche fälschlicher Weise zu den bk1-Blöcken geleitet werden, und
  2. Züge, die aus einem der bk1-Blöcke ausfahren wollen, ohne dass für sie eine FS gesperrt wurde.

Um fehlerhafte Geisterzug-Meldungen zu vermeiden, sollten auch die beiden RM »fb_bk1_plus« und »fb_bk1_minus« als Punktmelder eingerichtet sein.

Zulassen von Pendelzügen

geteiltes_bahnhofsgleis_plan_mit_pendelzug.jpg

Download des Rocrail-Plans

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

Fahrstraßen von bk3 nach bk1A und bk1B

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

Ausgänge zur FS-Steuerung

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

  • bk1A und bk1B sind frei.
  • Lok_6PL startet in bk3.
  • Lok_8PL startet in bk6.
  • Ausgang co_fs_3-1BlangP_1A ist eingeschaltet (also »rot«).
  • Beide Loks wollen also in das Bahnhofsgleis einfahren.

Ablauf

  • Rocrail kann jetzt nur eine der beiden FS zuweisen.
  • Wenn Rocrail die FS »[bk6-]-[bk1A+]_lang-P« verschließt, wird auch der Block »bk1A« reserviert, so dass danach die FS »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« nicht mehr zur Verfügung steht, da der kreuzende Block »bk1a« ja schon belegt ist.
  • Wenn Rocrail umgekehrt zuerst die FS »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« reserviert, steht der Block »bk1A« für die FS »[bk6-]-[bk1A+]_lang-P« nicht zur Verfügung, solange die FS »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« noch geschlossen ist. Danach wäre der Block »bk1A« wohl wieder frei, aber bis dahin hat die FS »[bk3+]-[bk1B-]_lang-P_bk1A-kreuzend« schon den Ausgang »co_fs_6-1AlangP_1B« eingeschaltet und somit diese FS gesperrt.

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.

Initialisierung und virtuelle Automatik

geteiltes_bahnhofsgleis_plan_mit_pendelzug_plus.jpg

Download des Rocrail-Plans

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.

Initialisierung

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 &gt; 300">
	<then> <!-- langer oder sehr langer Zug in bk1A -->
		<if condition="#Laenge_Lok_in_bk1A &lt; 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 &gt; 300">
		<then> <!-- langer oder sehr langer Zug in bk1B -->
			<if condition="#Laenge_Lok_in_bk1B &lt; 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.

Virtuelle Automatik

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"/>

Protokollieren der Zugbewegungen in bk1aA und bk1B

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:

  • »Lok_4K« hat in »bk6« das IN-Ereignis ausgelöst (4K--in-6).
  • In »bk6« (*6*) wartet Lok_4K also auf die Einfahrt nach (>>) »bk1A« oder »bk1B«.
  • In »bk1A« (*1A*) wartet Lok_7PK auf die Ausfahrt nach (<<) in »bk5«.
  • In »bk1B« (*1B*) wartet Lok_6PL auf die Ausfahrt nach (>>) in »bk4«.
  • »bk3« (*3*) ist gerade frei.

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="&lt;&lt; @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% &gt;&gt;" 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="&lt;&lt; @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% &gt;&gt;" 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% &gt;&gt;" generated="true"/>
			</then>
			<else> <!-- Blockenterside ist "-" Lok fährt nach bk5 -->
				<vr id="%subparam2%" text="&lt;&lt; @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.

1)
Wenn in den Rocrail-Eigenschaften unter »Automatik« die »Schaltzeit für Fahrstraße« auf einen höheren Wert (z. B. 2000) gesetzt wird (nach solchen Änderungen Rocrail immer neu starten), kann gut beobachtet werden, wie erst die FS geschlossen und dann die Befehle zum Schalten der Ausgänge nacheinander ausgeführt werden.
2)
Die virtuelle Automatik funktioniert nur mit gültigem Unterstützungsschlüssel.
3)
Dies ist aber nur gewährleistet, wenn der Trace in einer nichtproportionalen Schrift wie z. B. Courier angezeigt wird. Normalerweise werden solche Schriften in der Console verwendet. Im Server-Fenster von Rocview sieht diese Ausgabe auf Grund der proportionalen Schrift nicht so gut aus.
userpages/wolfgangk/geteiltesbahnhofsgleis.txt · Last modified: 2022/11/09 13:24 by wolfgangk