User Tools

Site Tools


besra:german:xml

Nutzerseite von Besra

Navigation:


XML-Skriptbeispiele


Ein- und Ausschalten der Block-Option "Warten"

Das folgende kleine Skript dient dazu, die Warte-Option in einem Block mit Hilfe eines Schalters ein- und auszuschalten. Das ist z.B. manchmal praktisch, wenn vor dem Betriebsende schnell aufgeräumt werden soll.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
  <if state="co SCHALTER = on">
    <then>
      <bk id="BLOCK" cmd="waiton"/>
    </then>
    <else>
      <bk id="BLOCK" cmd="waitoff"/>
    </else>
  </if>
</xmlscript>

Hierbei ist SCHALTER durch die Kennung des Ausgangs zu ersetzen, mit dem die Warteoption geschaltet werden soll und mit dem das Skript aufgerufen wird. BLOCK ist mit der Kennung des Blocks zu ersetzen, bei dem die Warteoption geschaltet werden soll. Wie immer bei XML-Skripten ist darauf zu achten, dass Kennungen keine Leerzeichen enthalten dürfen.

Ein optisch passendes Schaltersymbol findet sich auf der Seite Eigene SVG-Symbole unter Schalter-Symbol für Warten.


Tauschen der Blockeinfahrtseite mit einem Taster

Wozu das? Nun ja, auf meiner Anlage gibt es einen ausschließlich manuell betriebenen Schattenbahnhof, wo alle die Loks herumstehen, die gerade nicht automatisch fahren sollen.

Die Zufahrt vom Schattenbahnhof zweigt von einem eingleisigen, in beiden Richtungen benutzen Streckenteil ab. Wenn eine Lok auf's Abstellgleis soll, dann bekommt sie von mir im Automatik-Betrieb als Ziel Block A (Bl_A) zugewiesen - das ist der Block vor dem Abzweig. Danach wird sie manuell auf ihren Platz gefahren und die Belegung von Bl_A zurückgenommen. Wenn dieselbe Lok irgendwann einmal wieder das Licht erblicken soll, dann wird die Lokbelegung in Bl_A gesetzt und die Lok von Hand aus dem Schattenbahnhof nach Bl_A gefahren und kann dort gestartet werden.

Nur gibt es dabei ein kleines Problem: Die Lok fuhr in der Automatik in Bl_A ein und zwar auf der Plus-Seite. Von Hand wurde sie dann vorwärts, also auf der Minus-Seite, aus dem Block herausgefahren. Die Blockeinfahrtseite war also Plus.
Wenn die Lok irgendwann einmal wieder auf die Anlage gefahren wird - und das kann nach einigen Monaten sein - hat sich Rocrail eines noch immer gemerkt: Blockeinfahrtseite ist Plus. Vielleicht kann man es schon ahnen? Richtig, die Lok wird von Hand wieder aus dem Schattenbahnhof auf die Anlage geholt und da sich dort eine Wendeschleife befindet, kommt sie vorwärts in Bl_A an - jetzt aber auf der Minus-Seite. Damit sie in der Automatik wieder richtig starten kann, muss also nach dem Belegen des Blocks gleich noch einmal ins Block-Kontextmenü gegangen werden und die Blockeinfahrtseite getauscht werden.

Um dies etwas einfacher zu gestalten und sich den zweiten Weg ins Block-Kontextmenü zu sparen, kommt neben das Blocksymbol ein als Taster konfigurierter Ausgang, mit dessen Hilfe über eine Aktion das folgende Skript aufgerufen wird:

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
  <!-- Skript zum Tauschen der Blockeinfahrtseite in Bl_A -->
  <foreach table="lclist" state="lc %oid% = Bl_A">
    <if state="lc %lcid% = +">
      <then>
        <!-- Einfahrtseite Block tauschen -->
        <lc id="%lcid%" cmd="blockside" />
        <trace text="Lok %lcid% in Block A: Einfahrtseite getauscht"/>
      </then>
      <else>
        <trace text="Lok %lcid% in Block A: Einfahrtseite OK, nicht getauscht"/>
      </else
    </if>    
  </foreach>
</xmlscript>

In der Zeile [<foreach…] wird nun die Loktabelle [lclist] nach einer Lok abgeklappert, die in Bl_A steht. Welche Lok das ist steht danach in der Variablen [%lcid%]. Mit dem folgenden [<if…] wird geprüft, ob die Blockeinfahrtseite dieser Lok Plus ist und wenn ja, sorgt der Befehl [blockside] dafür, dass sie getauscht wird auf Minus. Wenn nicht Plus, dann wird auch nicht getauscht.


Lok-Liste kurz halten

Die Lok-Liste im Lok-Bedienfeld enthält zeigt normalerweise alle definierten Loks an. Wenn man relativ viele Loks hat, kann diese Liste aber unübersichtlich lang werden. Vielleicht stehen gar nicht alle Loks auf der Anlage oder einige Loks stehen z.B. auf einem Abstellgleis, sind jedenfalls nicht unmittelbar für den Betrieb verfügbar. Dann ist es praktisch, diese Loks nicht in der Liste zu haben. So kann man sie nicht versehentlich auswählen während fahrbereite Loks schneller auffindbar sind.

Rocrail bietet für diesen Fall eine nützliche Funktion: Die Anzeige der Lok im Lok-Bedienfeld kann ein- oder ausgeschaltet werden.
Das funktioniert direkt in der Lok-Tabelle durch Entfernen des Hakens bei Anzeigen. Allerdings ist die Lok-Liste bei eingeschalteter Automatik normalerweise nicht erreichbar und der Weg über die Lok-Liste ist mit einigen Klicks verbunden. Es geht aber auch einfacher: Im Kontext-Menü einer Lok im Lok-Bedienfeld ist Ausblenden verfügbar. Das macht genau dasselbe, geht aber mit einem Rechtsklick auf die Lok und Auswahl von Ausblenden recht fix.

Blendet man abstellte Loks konsequent aus, bleibt die Lok-Liste schön kurz. Wie bekommt man eine solche nicht angezeigte Lok aber wieder zu Gesicht? Das geht wiederum - etwas umständlich - über die Lok-Tabelle, oder sehr einfach, wenn man sie wieder in einen Block setzt. Dazu wählt man aus dem Kontext-Menü des Blocks Lokbelegung setzen aus. Um auch ausgeblendete Loks angezeigt zu bekommen, den Haken bei "zeige alle" setzen. Die gewählte Lok wird dann dem Block zugewiesen und sie wird dadurch auch automatisch wieder in der Lok-Liste angezeigt. Sehr praktisch.

Alles schön soweit. Nur - man kann das Ausblenden natürlich auch einmal vergessen. Das ist kein Schaden und wirklich nicht weiter schlimm. Irgendwann wird es schon auffallen. Rocrail wäre aber nicht Rocrail, wenn es nicht auch eine Lösung gegen das Vergessen böte.
Hier kommt nun ein XML-Skript ins Spiel. Wie wäre es, Rocrail durch Klick auf einen als Taster konfigurierten Ausgang dazu zu bewegen, alle Loks, die sich augenblicklich in keinem Block befinden, auszublenden? Dazu braucht man also einen Taster und eine Aktion, die bei eingeschaltetem Ausgang (Status on) das Skript aufruft.

Das Skript ist sehr übersichtlich und sieht so aus:

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
  <foreach table="lclist" state="lc %oid% ! block">
    <lc id="%lcid%" show="false"/>
  </foreach>
</xmlscript>

In der Zeile [<foreach…] wird die Lok-Tabelle [lclist] nach allen Loks abgeklappert, die nicht in einem Block stehen. Für jede dieser Loks wird nun [show="false"] gesetzt und somit die Anzeige ausgeschaltet.

Sollen diese Loks zusätzlich noch deaktiviert werden, kann das Skript mit dieser Zeile zwischen [<foreach…] und [</foreach>] ergänzt werden.

<lc id="%lcid%" cmd="deactivate"/>

Optimierung

So kurz wie das gerade gezeigte Skript auch ist, es hat zwei Nachteile: 1. bleiben mit Hilfe des Skriptes ausgeblendete Loks nur für die Dauer der Sitzung ausgeblendet. Nach einem Neustart von Rocrail sind sie wieder eingeblendet. Das ist zwar auch nicht tragisch, weil man einfach noch einmal auf den Taster klicken könnte und schon sind sie wieder ausgeblendet; aber ganz schön ist es nicht. 2. werden Loks, die sich in einer Mehrfachtraktion befinden aber nicht die Hauptlok sind, ebenfalls ausgeblendet bzw. deaktiviert, auch wenn sich die Mehrfachtraktion in einem Block befindet.

Das erste Problem lässt sich mit [<model cmd="change">] schnell lösen:

    <model cmd="change">
      <lc id="%lcid%" show="false"/>
    </model>

Das gesamte Skript sieht dann so aus:

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
  <foreach table="lclist" state="lc %oid% ! block">
    <model cmd="change">
      <lc id="%lcid%" show="false"/>
    </model>
  </foreach>
</xmlscript>

Für das zweite Problem muss ermittelt werden, ob eine Mehrfachtraktion vorliegt, bevor ausgeblendet wird. Das ist allerdings um Einiges komplizierter als es klingen mag. Da ich keine Mehrfachtraktionen nutze, reicht mir glücklicherweise das Skript in seiner zuvor dargestellten Form. Für Leser, die Mehrfachtraktionen benutzen, oder für solche, die es einfach nur wissen wollen, hält Hermann auf seiner Nutzerseite dankenswerterweise eine sehr ausführliche Dokumentation bereit. Sehr zu empfehlen! Lokomotiven aktivieren/de-aktivieren

besra/german/xml.txt · Last modified: 2022/01/27 18:26 by besra