Rocrail als Gleisbildstellpult in Xml-Script

Ausgehend von der Userpage von Pirat-Kapitan zum Thema habe ich versucht ein ähnliches Verhalten in einem einzigen Xml-Skript nachzubilden. Das Erstellen eines solchen Skriptes ist im internen Xml-Skript-Editor von Rocrail oder in einem externen Textprogramm möglich.

Im Plan werden Ausgänge an den Blöcken platziert.
Jeder Ausgang ruft dasselbe Skript für die Tasterauswertung auf:

Es sind keine Bedingungen für den Aufruf nötig.

Vorteile dieser Methode:
- Es müssen viel weniger Aktionen erstellt werden.
- Bestandteile können per copy/paste wiederverwendet werden, zum Beispiel bei der Ausfahrt aus einem mehrgleisigen Bahnhof in Richtung Strecke. Nur die Namen der Ausgänge und der Fahrstraßen sind jeweils anzupassen.
- Das Erstellen der Tastersteuerung wird dadurch beschleunigt und die spätere Wartung wird erleichtert.

Zu beachten gilt es:
- Beim Umbenennen von Fahrstraßen in der Plandatei können diese Änderungen allerdings nicht von Rocrail ins Skript übertragen werden, dieses befindet sich ja in einer externen Datei. Dann müssen die Namen von Hand im Skript nachgezogen werden.
- Xml-Skript unterstützt keine Leerzeichen in Objektnamen. Vor Beginn sind diese in Namen von Blöcken, Fahrstraßen und Ausgängen zu entfernen oder durch Unterstriche zu ersetzen.

Reset der Ausgänge

Bei der Methode mit den Aktionen ist für jeden Ausgang eine Aktion “RESETxxx” nötig, damit der Ausgang zeitverzögert wieder auf “off” gesetzt wird. Das zeitverzögerte Rücksetzen mit einem einzigen Xml-Skript funktioniert NICHT, weil mehrere Objekte auf den gleichen Timer in der Aktionssteuerung zugreifen würden, welche die Aktion mit dem Reset-Skript aufrufen würde.
Die Ausgänge werden daher im Auswertungsskript zurückgesetzt, wenn eine passende Kombination erkannt wurde.
Wenn falsch getippt wurde, oder der Benutzer sich nach dem Antippen des ersten Schalters anders entscheidet, müssen die Schalter manuell auf rot gesetzt werden.
Das Rücksetzen der Schalter durch das Skript gibt dem Benutzer neben dem Stellen der Weichen allerdings auch eine visuelle Bestätigung, dass sein Befehl erkannt und ausgeführt wurde.
Sollte dieses Verhalten nicht erwünscht sein, kann immer noch mit einer “RESETxxx”-Aktion pro Schalter gearbeitet werden.

Die Ein-Taster-Methode

Die Ein-Taster-Methode eignet sich überall dort, wo es von einem Block aus nur einen möglichen Fahrweg gibt. Sie kann in Xml-Skript gut über eine Switch-Abfrage abgearbeitet werden. Dazu wird die Variable %callerid% benutzt, die den Namen des aufrufenden Objektes, hier also des aufrufenden Tasters beinhaltet.
In diesem Beispiel werden mit einer Switch-Anweisung zwei Ausgänge abgefragt, passende Weichen gestellt, und die Ausgänge zurückgesetzt:

<switch var="%callerid%">                 <!-- Switch-Anweisung -->
    <case val="OGL1N">                    <!-- Abfrage für Schalter OGL1N -->
        <sw id="W307" cmd="turnout"/>
        <sw id="W401" cmd="turnout"/>       
        <co id="OGL1N" cmd="off"/>
    </case>
    <case val="OGL2N">                    <!-- Abfrage für Schalter OGL2N -->
        <sw id="W307" cmd="straight"/>
        <sw id="W401" cmd="turnout"/>	
        <co id="OGL2N" cmd="off"/>
    </case>
</switch>                                 <!-- Ende der Switch-Anweisung -->

Die Zwei-Taster-Methode

Die Zwei-Taster-Methode wird angewendet, wenn von einem Block aus mehrere Fahrwegsmöglichkeiten bestehen. Im Xml-Skript wird sie über die Abfrage aller möglichen Kombinationen von Tastern mittels if-Abfragen realisiert.
Die if-Abfrage für die Kombination von Schalter OAW2N und Schalter OKS1O ist hier in der ersten Zeile zu sehen:

<if state="co OAW2N = on|co OKS1O = on">             <!-- if-Abfrage -->
    <then>
        <st id="autogen-[AW2+]-[KS1-]" cmd="go"/>
        <co id="OAW2N" cmd="off"/>                   <!-- Rücksetzen der beiden Ausgänge -->
	<co id="OKS1O" cmd="off"/>
    </then>
</if>

Jede Kombination braucht nur einmal abgefragt zu werden, die Reihenfolge in welcher die Ausgänge gedrückt werden ist für das Stellen des Fahrweges nicht relevant. Die aufgerufene Fahrstraße stellt die Weichen unabhängig von der Richtung, in der die Strecke nachher gefahren wird.

"Virtuelle" Fahrstraße, der Fahrweg als Summenzug aller Einzelweichen dieses Weges

Hier wird per Skript keine Fahrstraße gestellt, es werden die einzelnen benötigten Weichen direkt angesprochen. Dieses Vorgehen eignet sich besonders für Abschnitte, für die es keine Fahrstraße im Plan gibt.
Zu sehen in diesem Beispiel in der 2. und der 3. Zeile:

<case val="OGL1N">
        <sw id="W307" cmd="turnout"/>                <!-- Stellen der ersten Weiche -->
        <sw id="W401" cmd="turnout"/>                <!-- Stellen von weiteren Weichen -->
        <co id="OGL1N" cmd="off"/>
</case>

Real existierende Fahrstraßen, der Fahrweg als vorhandene Fahrstraße

Es existiert im Plan eine Fahrstraße für den Fahrweg. Diese wird per Skript gestellt, aber nicht verschlossen.
Zu sehen hier in der 3. Zeile:

<if state="co OAW1N = on|co OGL1N = on">
    <then>
        <st id="autogen-[AW1+]-[GL1-]" cmd="go"/>    <!-- Stellen der Fahrstaße -->
        <co id="OAW1N" cmd="off"/>
	<co id="OGL1N" cmd="off"/>
    </then>
</if>

Aufbau der Skriptdatei

Zu Beginn des Skriptes erfolgen alle if-Abfragen für die Zwei-Taster-Steuerung.
Dann werden mit einer switch-Abfrage die Taster für die Ein-Taster-Methode abgefragt.

Der folgende Plan soll den Hintergrund zu diesem Aufbau des Skriptes verdeutlichen:

Bei der Nord-Ausfahrt aus GL1-3 des Bahnhofs kann der Fahrweg zu einem weiter entfernten Block (z.B. AW1) mit der Zwei-Taster-Methode gestellt werden.
Das Skript setzt anschließend die betreffenden Taster auf Rot.
In der Switch-Abfrage weiter unten im Skript kann für die Bahnhofsausfahrt (GL1-3) noch einmal eine Tasterabfrage erfolgen, die nur die Ausfahrtsweichen für einen Rangierbetrieb nahe am Bahnhof stellt.
Diese Abfrage greift nur, wenn der Ausgang im Bahnhofsgleis zuerst gedrückt wird.
Bei der Zwei-Tastermethode muss bei einer solchen Konfiguration allerdings zwingend zuerst der Ausgang vom entfernten Block, danach erst der Ausgang des Bahnhofsgleises betätigt werden.

Praktische Anwendung und Beispielskript

Im Plan aus dem vorigen Abschnitt wurden sämtliche Abstellgleise (AB1-7) sowie die Ausfahrt des Schattenbahnhofes (SBF) mit der Ein-Taster-Methode realisiert, da diese immer in Gleis 3 enden.
Auch die Südausfahrten des Bahnhofes (GL1-3) zur Strecke können mit einem Tastendruck gestellt werden.
Die Nordausfahrten des Bahnhofes können wie oben erläutert mit beiden Methoden gestellt werden.
(Dieses Verhalten kann durch Auskommentieren der betreffenden Switch-Anweisungen im Skript ganz schnell auf eine alleinige Zwei-Taster-Abfrage reduziert werden)
Alle anderen Kombinationen (Ausweichstelle AW1/2 und Kehrschleifen KS1/2) funktionieren mit der Zwei-Taster-Methode.

Beispielskript:
skript-taster.zip


Personal Tools