Programmierbare Vorsignale sind ein Feature in JGR's Patch Pack. Das Feature selbst hatte JGR schon in TTDPatch implementiert und später für OpenTTD überarbeitet.

Programmierbare Signale ermöglichen das Festlegen der Regeln, die bestimmen, wann ein Vorsignal "Halt!" oder "Freie Fahrt!" zeigen soll. Damit hat man als Spieler nun weitestgehende Kontrolle über das Signalverhalten. Die Regeln der Signalprogrammierung ersetzen die Vorsignal-Regeln. Oder anders gesagt: Man kann die Vorsignal-Regeln ändern. Man kann allerdings kein Signal programmieren, welches die Einfahrt in einen besetzten Block erlaubt, so viel Sicherheit muss sein.

Icon
Dieses Feature richtet sich an erfahrene Spieler. Da es sich nicht mit Pfadsignalen kombinieren lässt, ist der Nutzen sehr überschaubar. In den meisten Fällen wird man mit Pfadsignalen und der dort möglichen Einflussnahme auf die Wegfindung bessere Ergebnisse erreichen.
Programmierbare Vorsignale

Programmierbare Vorsignale können genauso aufgebaut werden wie normale Vorsignale. Es gibt also die Varianten als Formsignal und Lichtsignal sowie die Möglichkeit die Signale in eine oder beide Richtungen aufzustellen.

Verfügbarkeit

Programmierbare Vorsignale sind nur in JGR's Patch Pack verfügbar und dort auch nur, wenn folgende Einstellungen korrekt eingestellt sind:

  • Die Option für realistisches Bremsen von Zügen ist nicht aktiviert

  • Die programmierbaren Vorsignale sind aktiviert

Icon
Ein spezielles Signalset ist nicht erforderlich, kann aber benutzt werden. Auf den Bildern auf dieser Seite habe ich kein Signalset geladen.

Vorbeifahrt

Programmierbare Vorsignale

Das Vorbeifahren an programmierbaren Vorsignalen unterscheidet sich nicht von normalen Vorsignalen. Sie können nur passiert werden, wenn sich der Zug dem Signal von der Vorderseite nähert. Aus der anderen Richtung wird der Zug am Signal halten und umkehren.

Verhalten

Programmierbare Vorsignale sind Blocksignale, das heißt sie zeigen immer rot, wenn sich ein Zug in dem zugehörigen Signalblock befindet.

Die Bedingungen, wann ein programmierbares Vorsignal bei freiem Signalblock "Freie Fahrt!" anzeigen kann, müssen programmiert werden. Ohne ein Programm wird ein programmierbares Vorsignal immer "Halt!" zeigen, egal welche anderen Signale um den Signalblock herum angeordnet sind und ob der Block frei ist oder nicht.

Das Programm besteht aus einer Folge von verschachtelbaren Anweisungen. Damit werden Bedingungen definiert und miteinander verknüpft, die genau bestimmen, wann das Signal "Freie Fahrt!" bzw. "Halt!" zeigen soll.

Programmieren

Programmier-GUI

Das Programmieren erfolgt über eine eigene GUI, die aus dem Signalbaumenü heraus aufgerufen wird. Zuerst wählt man das Schraubenschlüssel-Symbol und klickt damit auf das Signal was man programmieren will. Damit öffnet sich das Fenster für die Programmierung. Das zeigt das aktuell mit dem Signal verknüpfte Programm an und enthält Schaltflächen, über die man das Programm verändern kann. Dazu wählt man mit der Maus eine der Anweisungen aus, wodurch die passenden Schaltflächen aktiv werden. So kann man nun alles anpassen, wie man es haben will.

Das Programm selbst besteht aus mehreren Teilen:

  • Bedingung: Eine Bedingung hat die folgende Form:

    WENN (Kriterium)
      DANN (Anweisung1)
    SONST (Anweisung2)

    Wenn das Kriterium erfüllt ist, wird Anweisung1 ausgewertet, ansonsten wird Anweisung2 ausgewertet. Anweisung1 und Anweisung2 können nun wieder Bedingungen oder Aktionen sein, so lassen sich komplexe Verknüpfungen erzeugen.

  • Aktion: "Mach das Signal rot" bzw. "Mach das Signal grün"

  • Kriterium: Vereinfacht ausgedrückt eine Abfrage, die man mit "ja" oder "nein" beantworten kann.

Wichtig: Die Auswertung des Programms wird beendet, wenn man zu einer Aktion kommt. Damit stellt man das Signal, die restlichen Anweisungen werden ignoriert.

Icon
Der Code-Editor überprüft nicht, ob das Programm in irgendeiner Weise sinnvoll oder korrekt ist. Man problemlos mehrere Aktionen hintereinander im Programm stehen haben, oder Aktionen außerhalb einer Bedingung oder mehrere Bedingungen hintereinander - diese werden nie ausgeführt werden, weil das Programm niemals dort ankommen wird. Man kann auch Programme definieren, die das Signal niemals umschalten. Es liegt in der Verantwortung des Spielers, dass das Programm so funktioniert, wie man es sich gedacht hat.

Kriterien zur Programmierung

Folgende Kriterien sind innerhalb einer Bedingung benutzbar:

  • immer

    Dieses Kriterium ist immer erfüllt. Die Bedingung hat dann die Form

    WENN immer
      DANN (Anweisung1)
    SONST (Anweisung2)
    Es wird immer Anweisung1 ausgeführt, Anweisung2 wird nie erreicht.

  • nie
  • Dieses Kriterium ist nie erfüllt. Die Bedingung hat dann die Form

    WENN nie
      DANN (Anweisung1)
    SONST (Anweisung2)
    Es wird immer Anweisung2 ausgeführt, Anweisung1 wird nie erreicht.

  • grüne Signale
  • Damit ist die Anzahl der Ausfahrt- und Combo-Vorsignale im Signalblock gemeint, die gerade "Freie Fahrt!" zeigen. Normale Blocksignale werden bei der Zählung ignoriert. Die Bedingung hat dann die Form

    WENN (grüne Signale [Vergleich] [Wert])
      DANN (Anweisung1) 
    SONST (Anweisung2)
    Die Vergleichsoperation (gleich, ungleich, größer, kleiner, ...) und der Wert (eine beliebige Zahl) lassen sich über die entsprechenden Schaltflächen einstellen. Je nachdem, ob die Bedingung erfüllt ist, wird dann entweder Anweisung1 oder Anweisung2 ausgeführt.

  • rote Signale
  • Damit ist die Anzahl der Ausfahrt- und Combo-Vorsignale im Signalblock gemeint, die gerade "Halt!" zeigen. Normale Blocksignale werden bei der Zählung ignoriert. Die Bedingung hat dann die Form

    WENN (rote Signale (Vergleich) (Wert))
      DANN (Anweisung1)
    SONST (Anweisung2)
    Die Vergleichsoperation (gleich, ungleich, größer, kleiner, ...) und der Wert (eine beliebige Zahl) lassen sich über die entsprechenden Schaltflächen einstellen. Je nachdem, ob die Bedingung erfüllt ist, wird dann entweder Anweisung1 oder Anweisung2 ausgeführt.

  • Signalzustand
  • Man kann den Zustand eines anderen Signals abfragen. Das abzufragende Signal muss ein einseitiges Ausfahrt- oder Combo-Vorsignal sein. Die Bedingung hat dann die Form

    WENN (Signal auf Feld xy) ist Grün
      DANN (Anweisung1)
    SONST (Anweisung2)
    Wenn also das Signal auf Feld xy "Fahrt frei!" zeigt, wird Anweisung1 ausgeführt, wenn das Signal "Halt!" zeigt, wird Anweisung2 ausgeführt.

  • Slotauslastung
  • Slots gehören konzeptionell zur eingeschränkten Wegfindung der Pfadsignale und werden dort erläutert. Man kann bei programmierbaren Vorsignalen die Werte von Slots lesen, aber nicht verändern.

    WENN Auslastung von (Slotname) (Vergleich) (Wert)
      DANN (Anweisung1)
    SONST (Anweisung2)
    Man muss vor der Programmierung einen passenden Slot angelegt haben, damit man ihn hier über das entsprechende Menü auswählen kann. Die Vergleichsoperation (gleich, ungleich, größer, kleiner, ...) und der Wert (eine beliebige Zahl) lassen sich über die entsprechenden Schaltflächen einstellen. Je nachdem, ob die Bedingung erfüllt ist, wird dann entweder Anweisung1 oder Anweisung2 ausgeführt.

  • Verfügbare Slotkapazität
  • Slots gehören konzeptionell zur eingeschränkten Wegfindung der Pfadsignale und werden dort erläutert. Man kann bei programmierbaren Vorsignalen die Werte von Slots lesen, aber nicht verändern.

    WENN Verfügbare Kapazität von (Slotname) (Vergleich) (Wert)
      DANN (Anweisung1)
    SONST (Anweisung2)
    Man muss vor der Programmierung einen passenden Slot angelegt haben, damit man ihn hier über das entsprechende Menü auswählen kann. Die Vergleichsoperation (gleich, ungleich, größer, kleiner, ...) und der Wert (eine beliebige Zahl) lassen sich über die entsprechenden Schaltflächen einstellen. Je nachdem, ob die Bedingung erfüllt ist, wird dann entweder Anweisung1 oder Anweisung2 ausgeführt.

  • Zählerwert
  • Zähler gehören konzeptionell zur eingeschränkten Wegfindung der Pfadsignale und werden dort erläutert. Man kann bei programmierbaren Vorsignalen die Werte von Zählern lesen, aber nicht verändern.

    WENN Wert von (Zählername) (Vergleich) (Wert)
      DANN (Anweisung1)
    SONST (Anweisung2)
    Man muss vor der Programmierung einen passenden Zähler angelegt haben, damit man ihn hier über das entsprechende Menü auswählen kann. Die Vergleichsoperation (gleich, ungleich, größer, kleiner, ...) und der Wert (eine beliebige Zahl) lassen sich über die entsprechenden Schaltflächen einstellen. Je nachdem, ob die Bedingung erfüllt ist, wird dann entweder Anweisung1 oder Anweisung2 ausgeführt.

Kombinieren von Regeln

Die Bedingungen innerhalb eines Programms lassen sich verschachteln. Damit kann man Verknüpfungen von Regeln erzeugen. Das sieht dann ungefähr so aus:

WENN (Bedingung1) DANN
  WENN (Bedingung2)
    DANN (Anweisung1)
  SONST (Anweisung2)
SONST
  WENN (Bedingung3)
    DANN (Anweisung3)
  SONST (Anweisung4)
Je nachdem, in welcher Kombination die Bedingungen ganz oder teilweise erfüllt sind, wird eine der vier Anweisungen ausgeführt.

So könnte man zum Beispiel ein Signal an einer Umleitungsstrecke so programmieren, dass es nur "Freie Fahrt!" zeigt, wenn die Hauptstrecke voll ist und noch Platz auf der Umleitungsstrecke ist.

Beispiele

Blocksignal

Das Verhalten der normalen Blocksignale lässt sich durch folgendes Programm darstellen:

Stelle Signal auf grün

Das Blocksignal kennt keine Bedingungen oder Abfragen anderer Signale. Es prüft nur, ob der Block frei ist, und das wird unabhängig von der Programmierung sowieso geprüft.

Vorsignal

Das normale Vorsignalverhalten lässt sich durch folgendes Programm darstellen:

WENN (grüne Signale ungleich 0) DANN 
  (Stelle Signal auf grün)
SONST 
  (Stelle Signal auf rot)

Die Anzahl der grünen Signale bezieht sich auf die Anzahl der Ausfahrt-Vorsignale und Combo-Vorsignale im entsprechenden Signalblock. Wenn diese Anzahl nicht null ist (also mindestens ein Signal grün ist), zeigt auch das programmierte Vorsignal grün.

Prioritäten von Gleisen

Beispiel für programmierbare Vorsignale

In diesen zugegebenermaßen recht konstruierten Beispiel werden verschachtelte Bedingungen verwendet, um einzelnen Bahnsteigen eines Bahnhofes Prioritäten zu geben. Wenn der Bahnhof leer ist, soll der mittlere Bahnsteig angefahren werden. Ist der belegt, soll der linke Bahnsteig genutzt werden, und erst wenn beide Bahnsteige belegt sind soll der rechte Bahnsteig genutzt werden.

Der Signalblock rechts vom Bahnhof muss ein Vorsignalblock sein, da sonst das Programmieren der Signale auf der linken Seite nicht korrekt functioniert. Deswegen stehen an den äußeren Bahnsteigen auch Combo-Vorsignale - für die Programmierung muss man den Vorsignalstatus am anderen Ende des Bahnsteigs abfragen, gleichzeitig müssen diese Signale die Einfahrt in den Signalblock rechts des Bahnhofs regeln.

Das programmierbare Vorsignal am linken Bahnsteig hat folgendes Programm (A ist die Koordinate des Signals vor dem mittleren Bahnsteig):

WENN Signal auf A ist Grün DANN
  Stelle Signal auf Rot
SONST
  Stelle Signal auf Grün 
Somit zeigt das Signal für den linken Bahnsteig nur grün, wenn der mittlere Bahnsteig belegt ist. Das Combo-Vorsignal am Ende des Bahnsteigs wird ignoriert, ein normales Combo-Vorsignal würde dies berücksichtigen und die Zufahrt zum Bahnsteig sperren, wenn gerade ein Zug aus einem anderen Bahnsteig abfährt.

Das programmierbare Vorsignal am rechten Bahnsteig hat ein komplizierteres Programm, denn es muss die Signale der beiden anderen Bahnsteige berücksichtigen (A ist die Koordinate des Signals am mittleren Bahnsteig, B die Koordinate des Signals am linken Bahnsteig):

1 WENN Signal auf A ist Grün DANN
2   Stelle Signal auf Rot
3 SONST
4   WENN Signal auf B ist Grün DANN
5     Stelle Signal auf Rot
6   SONST
7    Stelle Signal auf Grün
Wenn also der mittlere Bahnsteig frei ist, bleibt das Signal rot. Wenn der mittlere Bahnsteig belegt ist, landet das Programm auf Zeile 4 und wertet den Zustand des Signals am linken Bahnsteig aus. Ist dieses Signal grün, wird Zeile 5 ausgewertet, ansonsten kommen wir zu Zeile 7.

Kopieren von Regeln

Da man im Streckennetz ziemlich viele Signale hat, wird das Festlegen der Regeln für jedes einzelne Signal sehr mühsam, insbesondere wenn die Regeln immer die gleichen sind. Anstatt nun jedes Signal mühsam neu programmieren zu müssen, kann kann man bestehende Programmierungen kopieren.

Um eine existierende Programmierung zu kopieren, öffnet man das Menü für die Programmierung des Signals, auf das die Programmierung kopiert werden soll. Nun hat man hier die Möglichkeit, ein Programm von einem anderen Signal zu kopieren. Man drückt die entsprechende Schaltfläche und wählt das Signal, von dem kopiert werden soll. Fertig. Wichtig: Man hat nun zwei Kopien des gleichen Programms. Wenn man nun also merkt, dass das Programm einen Fehler enthält, muss man es an jedem Signal einzeln reparieren bzw. einmal reparieren und dann erneut auf alle anderen Signale kopieren.

Verwendung

Wie eingangs erwähnt ist das größte Problem der programmierbaren Vorsignale, dass es keine Pfadsignale sind. Damit sind die Verwendungsmöglichkeiten verschwindend gering. Für Pfadsignale gibt es die Möglichkeit zur Beschränkung der Wegsuche, diese funktioniert sehr ähnlich, kann aber auf wesentlich mehr Bedingungen zurückgreifen (zum Beispiel den Fahrplan des Zuges und diverse Eigenschaften des Zuges selbst) und ist somit deutlich mächtiger.