Fahrstraßen, Signale und elektrische Weichen

  • Vereinfacht gesagt ist eine Fahrstraße ein speziell gesicherter Fahrweg. Typischerweise gehört zu einer Fahrstraße eine oder mehrere Weichen, die vor Aktivierung der Fahrstraße in eine bestimmte Lage gebracht werden müssen, es sind Meldeeinrichtungen verknüpft, um festzustellen, wo sich ein Fahrzeug auf der Strecke befindet, und es gibt Signale, die den Fahrer über den Zustand der Weichen und der Fahrstraße informieren. In diesem Artikel geht es darum, wie Fahrstraßen im MapEditor eingerichtet werden.

    1 Weichen vorbereiten

    Es ist nicht nötig, aber empfehlenswert, den Weichen (zumindest denen, die in Fahrstraßen verwendet werden sollen) Namen zu geben. Hierzu im "Gleis"-Modus mit der rechten Maustaste auf diejenige Markierung klicken, die in Richtung Weichenspitze zeigt, und im Kontextmenü auf "Weiche konfigurieren..." klicken.



    Im erscheinenden Dialogfeld kann sofort der Weichenname eingegeben werden.


    2 Bezirk anlegen

    Der Übersichtlichkeit aber auch der Performance halber werden Fahrstraßen zu Bezirken gruppiert, die jeweils unabhängig voneinander arbeiten. Man kann sich diese wie einzelne Stellwerke vorstellen.


    Für die Performance relevant ist die Gruppierung insbesondere deshalb, weil jeder Bezirk eine Ausschluss-Matrix enthält, die die Größe "Anzahl der Fahrstraßen zum Quadrat" hat, und über die bei der Anforderung einer Fahrstraße nachgeschaut wird, ob bereits eine "feindliche" Fahrstraße eingelegt ist. Angenommen, man hätte ein großes Netz mit 20 Stellwerken à 10 Fahrstraßen. Würde man nun keine Bezirke definieren, dann würde man eine 200x200-Matrix benötigen, die dementsprechend 40.000 Einträge benötigt. Würden die Fahrstraßen zu den jeweiligen Stellwerken gruppiert werden, dann wären es 20 Matrizen mit nur noch 10x10 = 100 Feldern, also nur insgesamt 1.000 Einträgen (gegenüber 40.000!).


    Die Bezirke werden über die in vielen anderen Bereichen bekannte Listen-Box verwaltet, die sich links im Abschnitt "Fahrstraßen" befindet.


    3 Fahrstraße anlegen

    Im Eigenschaften-Dialogfeld (erreichbar per Doppelklick oder die Schaltfläche mit dem Rechteck unterhalb der Liste) kann zunächst dem Bezirk ein Name gegeben werden und es können folgende Grundeinstellungen für den Bezirk angegeben werden:

    • Auflösung, wenn Gleis wieder frei gemeldet wird: Aktive Fahrstraßen werden automatisch aufgelöst, wenn die zugehörigen Gleise wieder als frei gemeldet werden, nachdem zuvor ein Zug darauf gestanden hat. Option ist standardmäßig eingeschaltet.
    • Signale zeigen nur an, falls aktiv: Ist diese Option aus, dann erscheinen die Weichensignale auch dann, wenn eine zugehörige Fahrstraße "weichenmäßig" aktiviert werden könnte, d.h. sie geben praktisch ständig den Stand der Weiche an. Leuchtet dennoch kein Weichensignal, auch wenn die Option abgeschaltet ist, dann sind die aktuellen Weichenlagen so, dass es keine sinnvolle Fahrstraße gibt. Option ist standardmäßig eingeschaltet.
    • Auflösung bei Weichenstellen: Wird eine Weiche manuell gestellt, die eigentlich durch eine aktive Fahrstraße geschützt wird, dann soll die Fahrstraße aufgelöst werden. Option ist standardmäßig eingeschaltet.
    • Auto-Aktivierung bei Gleisbelegung: Falls eine Fahrstraße befahren wird, die nicht eingelegt ist, die Weichenstellungen aber passen und auch keine "feindliche" Fahrstraße eingelegt ist, dann soll sie automatisch aktiviert werden.

    Darunter können mit "Hinzufügen" und "Löschen" die einzelnen Fahrstraßen erstellt oder entfernt werden. Wird eine davon angeklickt, können direkt unterhalb der Liste deren Eigenschaften bearbeitet werden:



    Dies umfasst aktuell den Namen der einzelnen Fahrstraße und die Weichen, die gestellt werden sollen, wenn die Fahrstraße aktiviert wird.

    3.1 Weichen und Pfade hinzufügen

    Obwohl das Fenster offen ist, kann der MapEditor im Hintergrund weiter bedient werden. Die folgenden Schritte können zwar bereits vor Öffnen des Dialogfeldes durchgeführt werden, genauso aber auch dann, wenn es bereits offen ist:


    Zuerst muss in den "Gleise"-Modus gewechselt werden. Dann werden mit [Shift] alle Pfade ausgewählt, entlang derer die Fahrstraße verläuft:



    Schließlich muss man nur die gewünschte Fahrstraße erstellen/auswählen und auf "Im Editor markierten Pfade hinzufügen" anklicken. Die markierten Pfade werden dann für die Gleisfreimeldung gespeichert und aus den Markierung wird automatisch ermittelt, welche Weichen gestellt werden müssen, um diesen Fahrweg zu ermöglichen.


    Sobald die Weichen importiert wurden, kann dies anhand des Eintrages der Fahrstraße in der Liste geprüft werden, ob alles geklappt hat - dort werden nämlich die zu überfahrenden/stellenden Weichen mit ihrem Namen vermerkt.

    3.2 Weichen und Pfade löschen

    Gelöscht werden die Weichen und Pfade einfach durch Klick auf "Alle Pfade und Weichen aus Fahrstraße entfernen".

    4 Trigger/Baken konfigurieren

    Nun, nachdem die Fahrstraßen definiert wurden, geht es daran, mittels Triggern deren automatisches Aktivieren und Deaktivieren zu ermöglichen. "Trigger" sind spezielle (in der Simulation unsichtbare) Szenerieobjekte. Trigger werden vielfältige Aufgaben übernehmen können, momentan dienen sie aber noch nur dem Einlegen und Auflösen von Fahrstraßen.

    4.1 Trigger platzieren

    Man findet das Trigger-Objekt rechts in der Kategorie "Helfer". Es muss einfach nur "ungefähr" auf dem Gleis platziert werden; die interne "Verknüpfung" mit dem Gleis wird dennoch gewährleistet. Eine exakte Ausrichtung/Drehung ist auch nicht nötig, aber die grobe Richtung (vorwärts oder rückwärts) ist sehr wichtig, weil die Sensoren/Trigger jeweils immer nur auf die Sensoren/Trigger "ihrer" Richtung reagieren.


    Mittels Rechtsklick auf den Trigger und Auswahl von "Trigger-Eigenschaften..." wird das Eigenschafts-Dialogfeld aufgerufen:



    Zunächst wird hier ausgewählt, zu welchem Fahrstraßen-Bezirk der Trigger gehören soll.


    Sendet das Fahrzeug einen Stellbefehl an den Trigger, dann soll dieser - je nach Stellbefehl - eine bestimmte Fahrstraße einlegen. Dieses Verhalten kann in den folgenden drei Dropdown-Menüs eingestellt werden. Soll der Trigger bestimmte oder alle Stellbefehle ignorieren, dann ist jeweils " - " auszuwählen.


    Verlässt das Fahrzeug den Bereich der Fahrstraße, dann soll diese wieder aufgelöst (deaktiviert) werden. Sofern dies nicht über die Gleisfreimeldung erfolgt/erfolgen soll, kann für diesen Zweck einem Trigger ebenfalls eine Fahrstraße zugewiesen werden. Hierbei "wartet" der Trigger aber nicht auf eine bestimmte Information/Aufforderung seitens des Fahrzeuges, sondern die Aufhebung wird sofort bei "Berührung" des Triggers ausgelöst.


    5 Einfache Signale anschließen

    Für einfache Signale (z.B. Einheits-Weichensignale nach BOStrab wie W1, W2, W3 usw.), bei denen ein Szenerieobjekt nur anzeigt, ob eine bestimmte Fahrstraße eingelegt ist, oder nicht, kommt ein vereinfachtes System zur Anwendung:

    • Platzieren und Auswählen des Signals
    • Auswählen des Bezirks links
    • Auf "Mark. Obj. zum Bezirk hinzuf." unterhalb der Bezirks-Liste klicken
    • Die Fahrstraße auswählen, die dieses Signal anzeigen soll

    6 Komplexere Signale

    6.1 Signalobjekt konfigurieren

    Komplexe Signale müssen zuerst vorbereitet werden: Im Object & Vehicle Tool gibt es im Bereich "Allgemeine Einstellungen" die Schaltfläche "Signalbegriffe". Hierüber kann ein Texteingabe-Feld geöffnet werden, in welches (vereinfacht gesagt) diejenigen Signalbegriffe eingetragen werden müssen, die das Signal zeigen kann. Hierbei ist aber zu beachten, dass

    • das "Nichtvorhandensein" von Fahrstraßen usw., also ein Hp0 oder ein dunkles Weichensignal usw., nicht ein eigener Signalbegriff sind
    • keine "Kombinationen" eingetragen werden
    • maximal sind 32 Zeilen und somit Begriffe erlaubt

    Kann das Signal beispielsweise sowohl Vor- als auch Hauptsignal-Begriffe anzeigen, dann erhält es bspw. die Einträge:

    • Hp1
    • Hp2
    • Vr1
    • Vr2

    FALSCH wäre also sowas wie:

    • Hp0+Vr0
    • Hp1+Vr0
    • Hp2+Vr0
    • Hp1+Vr1
    • usw.

    Warum das so ist, wird vermutlich klarer, wenn wir uns mit der Konfiguration im MapEditor beschäftigt haben! :-)

    6.2 Signal im MapEditor konfigurieren

    Sobald dem Signal-Objekt auf die beschriebene Weise die möglichen Signalbegriffe mitgeteilt wurden, erscheint im MapEditor, wenn man auf das Signal mit rechts klickt, im Kontextmenü der Eintrag "Signal-Eigenschaften". Wird dieser angeklickt, öffnet sich das hierfür vorgesehene Dialogfeld.


    Von der Struktur her gibt es für jeden Signalbegriff einen Listen-Abschnitt, zu dem jeweils beliebig viele Fahrstraßen hinzugefügt werden können. Die Anzahl der Signalbegriffe ergibt sich durch die Eingaben beim Signal-Objekt im Object & Vehicle Tool. Für jeden Fahrstraßeneintrag kann jeweils individuell der Bezirk ausgewählt werden, damit es auch möglich ist, Signalbegriffe bezirksübergreifend zusammen zu stellen. Außerdem wird jeweils ausgewählt, ob geprüft werden soll, ob

    • die Fahrstraße aktiv ist,
    • deren Gleise belegt sind,
    • sie aktiv ist und gleichzeitig ihre Gleise nicht belegt sind oder
    • sie "möglich" ist, d.h. die zugehörigen Weichen bereits passend liegen

    Das ganze System arbeitet nun wie folgt: Für jeden Signalbegriff wird stets geprüft, ob für zumindest eine der Fahrstraßen die ausgewählte Bedingung erfüllt ist. Falls dies der Fall ist, "gilt" dieser Signalbegriff. Schließlich werden die so ermittelten "Gesamtzustände" jeder Fahrstraße kodiert und per Script an das Signal übertragen.

    7 Fahrzeug ausrüsten

    Damit ein Fahrzeug mit den Baken interagieren kann, muss es mindestens einen Sensor bekommen, Zweirichtungsfahrzeuge benötigen mindestens einen jeweils an jedem Ende. Eingerichtet wird dieser in den Objekteinstellungen im Abschnitt "Sensoren":



    Die Parameter bedeuten:

    • Y-Position: Die Position des Sensors am Fahrzeug in Längsrichtung
    • Gegen Fahrtrichtung: Die Sensoren interagieren immer nur mit jenen Triggern, die dieselbe Ausrichtung haben, weshalb hier entsprechend angegeben werden muss, in welche Richtung dieser Sensor eingebaut werden soll.

    8 Script-Implementierung

    8.1 Fahrzeug

    Scriptseitig gibt es bereits folgende Möglichkeiten der Interaktion zwischen Fahrzeug-Sensor und Strecken-Trigger:

    • Senden von Meldungen an alle in Reichweite befindliche Trigger mit SendMessageToTrigger(Self; ID: string; value: string; sensor_index: integer) . Bisher unterstützt wird die ID "SWITCH" mit den Werten (jeweils als String!) "0" (links), "1" (rechts) und "2" (geradeaus) zum Übertragen eines Stellbefehls oder "toggle" zum Umschalten zwischen zweier der drei aufgeführten Fahrstraßen.
    • Wird in das Script eine Prozedur eingebunden mit der Deklaration procedure OnEnterLeaveTrigger(triggerid: string; entering: boolean; sensorindex: integer), dann wird diese stets aufgerufen, wenn das Fahrzeug einen Trigger erreicht oder verlässt. "Triggerid" wird aktuell nicht verwendet, später wird es z.B. zur Identifikation für das IBIS usw. verwendet werden.

    Im GT6N werden zum Beispiel beide Funktionen zusammen verwendet: Wenn der Fahrer einen Stellbefehl aktiviert, dann wird dieser Wert (für eine bestimmte maximale Wegstrecke) "vorgemerkt". Wird dann OnEnterLeaveTrigger ausgelöst, dann benutzt das Script sofort SendMessageToTrigger und sendet damit den Stellbefehl an den Trigger. Denkbar sind aber auch andere Varianten: Wenn der Trigger einen größeren Radius hat (z.B. für Kontakt-Stellbefehle oder längere Kontaktschleifen), dann könnte SendMessageToTrigger auch unmittelbar ausgelöst werden, wenn der Fahrer den Stellbefehl betätigt.

    8.2 Einfache Signale

    So ähnlich wie bei den Ampeln muss lediglich die "PUBLIC"-Variable signalroute_active: boolean; eingebunden werden. Wenn alles korrekt verknüpft ist und die Fahrstraße eingelegt wird, wird diese Variable "true", sonst ist sie "false". Hiermit lassen sich aber dementsprechend nur einfache Signale realisieren. Komplexe Signale kommen später! ;-)

    8.3 Komplexe Signale

    Auch bei komplexen Signalen werden die Daten über eine "PUBLIC"-Variable, nämlich signalstate: integer; übertragen. Achtung: Im Gegensatz zu einfachen Signalen handelt es sich hierbei um eine Integer-Variable!


    In diese werden nun im Betrieb die Signalbegriffe bitweise eingetragen – siehe hierzu auch Bit-Flags erklärt . Verfügt das Signal z.B. über die Begriffe Hp1, Hp2, Hp3 und Hp4, dann wird der Wert der Variable signalstate die folgenden Werte annehmen:

    • 1, falls nur die Hp1-Bedingungen gelten
    • 2, falls nur die Hp2-Bedingungen gelten
    • 4, falls nur die Hp3-Bedingungen gelten oder
    • 8, falls nur die Hp4-Bedingungen gelten.

    Gelten mehrere Bedingungen gleichzeitig, dann werden diese Werte einfach zusammengerechnet.


    Auseinander nehmen kann man die Bedingungen dann wie folgt:

    • wenn (signalstate and 1) <> 0, dann ist die Hp1-Bedingung erfüllt
    • wenn (signalstate and 2) <> 0, dann ist die Hp2-Bedingung erfüllt
    • wenn (signalstate and 4) <> 0, dann ist die Hp3-Bedingung erfüllt
    • wenn (signalstate and 8) <> 0, dann ist die Hp4-Bedingung erfüllt

    Komplexer, aber trotzdem problemlos ist es, wenn Zusatz-Anzeiger zur Anwendung kommen.


    Beispiel: Ein nur Hp4-fähiges U-Bahnsignal mit Gleis-Nummern-Anzeige. Die Signalbegriffe wären dann:

    • Hp4
    • Gleis 1
    • Gleis 2
    • Gleis 3
    • Gleis 4
    • Gleis 5
    • Gleis 6
    • Gleis 7
    • Gleis 8
    • Gleis 9

    Angenommen, es gibt drei Fahrstraßen A, B und C, die auf Gleis 3, 4 und 7 führen.


    Dann werden im MapEditor in der Signal-Konfiguration dem Signalbegriff Hp4 alle drei Fahrstraßen zugeordnet, den Signalbetriffen Gleis 3, Gleis 4 und Gleis 7 jeweils nur die Fahrstraße A, B und C, und den restlichen Signalbegriffen werden gar keine Fahrstraßen zugeordnet.


    Nach obiger Formel wird die Variable signalstate dann folgende Werte annehmen:

    • Fahrstraße A: Hp4+Gleis 3, d.h. 1 + 8 = 9
    • Fahrstraße B: Hp4+Gleis 4, d.h. 1 + 16 = 17
    • Fahrstraße C: Hp4+Gleis 7, d.h. 1 + 128 = 129

    Im Signalscript können dann die Signalbegriffe wieder mit den obigen "and-Formeln" auseinander genommen werden:

    Falls (signalstate and 1) <> 0, dann soll das Signal auf Hp4 gehen, sonst auf Hp0. Nur, wenn es Hp4 zeigt, dann soll er die restlichen Werte in signalstate prüfen und dann entsprechend daraus ableiten, wie er die jeweiligen Gleisnummern anzeigen soll.