User Tools

Site Tools


cds:german:skripte_2018_19

Skripte der Anlage Winter 2018/19


Anhand meiner Anlage aus der Wintersaison 2018/19 möchte ich meine Skripte vorstellen und erklären. Die Skripte dienen mehrheitlich dazu, die Automatik von Rocrail (RR) zu beeinflussen.
Wie Skripte erstellt und in RR via Aktionsdefinition eingebunden werden, ist hier erklärt; ich werde darauf nicht näher eingehen.
Weiters setze ich voraus, dass der p. t. Leser RR, seine Objekte und ihre Funktionalität kennt.
Anmerkung: Viele Wege führen zum Ziel! Alle hier vorgestellten Lösungen lassen sich mit hoher Wahrscheinlichkeit anders umsetzen. Alle Lösungen arbeiteten auf meiner Anlage zuverlässig und sind unter Bedachtnahme geringstmöglicher Redundanz in Bezug auf Coding und Ausführung entwickelt worden.

Anlagenplan

Der Plan meiner Anlage:

Anlagenplan


Der Plan kurz erklärt:
Links die Ebene 1 mit Schattenbahnhof für Nahverkehr, Güter-Nebenbahn, Fernverkehr und Güterverkehr. Links oben die Streckenblöcke in die Ebene 2, die in der Mitte unten ihre Fortsetzung finden. In der Mitte der Abzweigbahnhof mit 7 Gleisen. Rechts oben die Streckenblöcke in die Ebene 3, die in rechts unten ihre Fortsetzung finden. Rechts die Ebene 3 mit Schattenbahnhof für Nahverkehrs- bzw. Güter-Nebenbahnzüge (Aufstellblock), Fernverkehr und Güterverkehr

An Hand der Richtungspfeile ist zu erkennen, dass es ein sehr einfacher Gleisplan mit weitgehendem Richtungsbetrieb ist. Herzstück ist der Abzweigbahnhof in der Mitte, in dem sehr viel Betrieb herrscht.

Steuerung Aufstellblock E3_AB

Funktion analog hier.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Virtuelle_RM_im_AB">
 
<if condition="%callerid% # E3_AB_i1" state="fb E3_AB_i1 = on|fb Virt_E3_AB_i1 = off" alltrue="true">
  <then>
	<fb id="Virt_E3_AB_i1" cmd="on"/>
	<exit cmt="Virt_E3_AB_i1 = on"/>
  </then>
</if>
 
<if condition="%callerid% # E3_AB_i2" state="fb E3_AB_i2 = on|fb Virt_E3_AB_i2 = off" alltrue="true">
  <then>
	<fb id="Virt_E3_AB_i2" cmd="on"/>
	<fb id="Virt_E3_AB_i1" cmd="off"/>
	<exit cmt="Virt_E3_AB_i2 = on, Virt_E3_AB_i1 = off"/>
  </then>
</if>
 
<if condition="%callerid% # E3_Str4_e2i" state="fb E3_Str4_e2i = on|fb Virt_E3_AB_i2 = on|sw E3_12 = turnout" alltrue="true">
  <then>
	<fb id="Virt_E3_AB_i2" cmd="off"/>
	<exit cmt="Virt_E3_AB_i2 = off"/>
  </then>
</if>
 
</xmlscript>

Wichtig zu wissen ist, dass im AB die virtuellen Melder konfiguriert werden (nicht die realen!).

Aufstellblock E3_AB ein/aus

Funktion:
Aufstellblock ausschalten, wenn Automatik ausgeschaltet wird.
Aufstellblock einschalten, wenn Automatik eingeschaltet wird.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_AB_steuern">
 
<!-- Aufruf wenn Auto off -->
<if state="auto auto = off">
  <then>
    <sb id="Bf_E3_Gl1" exitstate="closed"/>
	<exit cmt="Aufstellblock geschlossen"/>
  </then>
</if>
 
<!-- Aufruf wenn Auto on -->
<if state="auto auto = on">
  <then>
    <sb id="Bf_E3_Gl1" exitstate="open"/>
	<exit cmt="Aufstellblock geoeffnet"/>
  </then>
</if>
 
</xmlscript>

Wichtig zu wissen ist, dass im AB die virtuellen Melder konfiguriert werden (nicht die realen!).

Fahrten Nahverkehr (NV) und Güter-Nebenbahn (GNB) nach E1 steuern

Im Bf. E1 gibt es Platz für 3 Züge vom Typ NV und GNB; die Blöcke E1_Gl10, 11, 12. Käme ein vierter Zug dieser Typen an, müßte er vor dem Bf. warten und blockierte somit alle anderen Zugtypen. Das folgende xmlScript steuert die Anzahl der Fahrten der Zugtypen NV und GNB zum Bf. E1. Das Textfeld "NV/GNB:" recdts oberhalb vom Block E1_Gl12 zeigt die aktuelle Anzahl von Zügen (hier "2") dieser Zugtypen im Bf. und am Weg zum Bf. an.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_NV_GNB_nach_E1">
 
<!-- Anzahl NV_GNB -->
<!-- vr id="Var_NV_GNB_E1" value="0"/-->
 
<!-- Ist Zug NV oder GNB -->
<if condition="%lccargo% # local|%lccargo% # lightgoods" alltrue="false">
  <then>
    <!-- Aufruf ENTER aus E2-E1_Str1 -->
    <if condition="%callerid% # E2-E1_Str1">
      <then>
        <vr id="Var_NV_GNB_E1" value="#Var_NV_GNB_E1 + 1"/>
		<tx id="T_Var_NV_GNB_E1" format="#Var_NV_GNB_E1"/>
		<if condition="#Var_NV_GNB_E1 = 3">
		  <then>
		    <bk id="E2-E1_Str1" cmd="classdel" class="NV"/>
			<bk id="E2-E1_Str1" cmd="classdel" class="GNB"/>
			<!-- <trace text="Script NV_GNB_nach_E1: Klassen NV und GNB gelöscht"/> -->
			<exit cmt="Script NV_GNB_nach_E1: Klassen NV und GNB gelöscht"/>
		  </then>
		</if>
	  </then>
	</if>
    <!-- Aufruf ENTER aus E1-E2_Str1 -->
    <if condition="%callerid% # E1-E2_Str1">
      <then>
        <vr id="Var_NV_GNB_E1" value="#Var_NV_GNB_E1 - 1"/>
		<tx id="T_Var_NV_GNB_E1" format="#Var_NV_GNB_E1"/>
		<if condition="#Var_NV_GNB_E1 = 2">
		  <then>
			<bk id="E2-E1_Str1" cmd="classadd" class="NV"/>
			<bk id="E2-E1_Str1" cmd="classadd" class="GNB"/>
			<!-- <trace text="Script NV_GNB_nach_E1: Klassen NV und GNB hinzugefügt"/> -->
			<exit cmt="Script NV_GNB_nach_E1: Klassen NV und GNB hinzugefügt"/>
		  </then>
		</if>
	  </then>
    </if>
  </then>
  <else>
    <!-- <trace text="Script_NV_GNB_nach_E1: Kein NV oder kein GNB"/> -->
    <exit cmt="Script_NV_GNB_nach_E1: Kein NV oder kein GNB"/>
  </else>
</if>
 
</xmlscript>

Mit ein wenig xmlScript-Wissen ist das Skript leicht nachzuvollziehen. Die aufrufenden Objekte mit den dazugehörigen Stati sind in den Kommentierungen angegeben. Gesteuert werden die NV/GNB-Fahrten durch Setzen und Löschen der Klassen "NV" und "GNB" in den Blöcken "E1_E2_Str1" und "E2_E1_Str1".

Fahrten Nahverkehr (NV) und Güter-Nebenbahn (GNB) nach E3 steuern

Im Bf. E3 gibt es im Aufstellblock E3_AB nur Platz für 2 Züge vom Typ NV und GNB. Käme ein dritterZug dieser Typen an, müßte er vor dem Bf. warten und blockierte somit alle anderen Zugtypen. Das folgende xmlScript steuert die Anzahl der Fahrten der Zugtypen NV und GNB zum Bf. E3. Das Textfeld "NV/GNB:" links oberhalb vom Block E3_AB zeigt die aktuelle Anzahl von Zügen (hier "2") dieser Zugtypen im Bf. und am Weg zum Bf. an.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_NV_GNB_nach_E3">
 
<!-- Anzahl NV_GNB -->
<!-- vr id="Var_NV_GNB_E1" value="0"/-->
 
<!-- Ist Zug NV oder GNB -->
<if condition="%lccargo% # local|%lccargo% # lightgoods" alltrue="false">
  <then>
    <!-- Aufruf ENTER aus E2-E3_Str1 -->
    <if condition="%callerid% # E2-E3_Str1">
      <then>
        <vr id="Var_NV_GNB_E3" value="#Var_NV_GNB_E3 + 1"/>
		<tx id="T_Var_NV_GNB_E3" format="#Var_NV_GNB_E3"/>
		<if condition="#Var_NV_GNB_E3 = 2">
		  <then>
		    <bk id="E2-E3_Str1" cmd="classdel" class="NV"/>
			<bk id="E2-E3_Str1" cmd="classdel" class="GNB"/>
			<!-- <trace text="Script NV_GNB_nach_E3: Klassen NV und GNB gelöscht"/> -->
			<exit cmt="Script NV_GNB_nach_E3: Klassen NV und GNB gelöscht"/>
		  </then>
		</if>
	  </then>
	</if>
    <!-- Aufruf ENTER aus E3_Str4 -->
    <if condition="%callerid% # E3_Str4">
      <then>
        <vr id="Var_NV_GNB_E3" value="#Var_NV_GNB_E3 - 1"/>
		<tx id="T_Var_NV_GNB_E3" format="#Var_NV_GNB_E3"/>
		<if condition="#Var_NV_GNB_E3 = 1">
		  <then>
			<bk id="E2-E3_Str1" cmd="classadd" class="NV"/>
			<bk id="E2-E3_Str1" cmd="classadd" class="GNB"/>
			<!-- <trace text="Script NV_GNB_nach_E3: Klassen NV und GNB hinzugefügt"/> -->
			<exit cmt="Script NV_GNB_nach_E3: Klassen NV und GNB hinzugefügt"/>
		  </then>
		</if>
	  </then>
    </if>
  </then>
  <else>
    <!-- <trace text="Script_NV_GNB_nach_E3: Kein NV oder kein GNB"/> -->
    <exit cmt="Script_NV_GNB_nach_E1: Kein NV oder kein GNB"/>
  </else>
</if>
 
</xmlscript>

Mit ein wenig xmlScript-Wissen ist das Skript leicht nachzuvollziehen. Die aufrufenden Objekte mit den dazugehörigen Stati sind in den Kommentierungen angegeben. Gesteuert werden die NV/GNB-Fahrten durch Setzen und Löschen der Klassen "NV" und "GNB" in den Blöcken "E2_E3_Str1" und "E3_Str4".

Schleifenfahrten Ebene E3 verhindern

Das xmlScript verhindert Schleifenfahrten auf Ebene 3, wenn ein Zug aus Ebene 2 Richtung Ebene 3 ausfährt. Anderenfalls müssten Züge im Block E2_E3_Str2, der in einer Steigung liegt, halten.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_Routenwahl_E3">
 
<!-- Aufruf durch Block E3_Str1, ENTER -->
<if condition="%callerid% # E3_Str1">
  <then>
    <if state="bk E2-E3_Str1 = free" alltrue="true">
      <then>
	    <exit cmt="Script_Routenwahl_E3: Kein Nachfolgezug"/>
	  </then>
    <else>
	  <if state="st [E3_Str3+]-[E3_Gl1+] = locked|st [E3_Str3+]-[E3_Gl2+] = locked|st [E3_Str3+]-[E3_Gl3+] = locked|st [E3_Str3+]-[E3_Gl4+] = locked|st [E3_Str3+]-[E3_Gl5+] = locked|st [E3_Str3+]-[E3_Gl6+] = locked|st [E3_Str3+]-[E3_Gl7+] = locked" alltrue="false">
	    <then>
		  <st id="[E3_Str2+]-[E3_Str1+]" state="closed"/>
		  <st id="[E3_Str2+]-[E3_Str4-]" state="closed"/>
		  <exit cmt="Script_Routenwahl_E3: FS geschlossen"/>
	    </then>
	  </if>
	</else>
	</if>
  </then>
</if>
 
<!-- Aufruf durch Block E3_Str3, ENTER -->
<if condition="%callerid% # E3_Str3">
  <then>
	<if state="st [E3_Str2+]-[E3_Str1+] = closed|st [E3_Str2+]-[E3_Str4-] = closed" alltrue="true">
	  <then>
		<st id="[E3_Str2+]-[E3_Str1+]" state="open"/>
		<st id="[E3_Str2+]-[E3_Str4-]" state="open"/>
		<exit cmt="Script_Routenwahl_E3: FS geöffnet"/>
	  </then>
	</if>
  </then>
</if>
 
</xmlscript>

Mit ein wenig xmlScript-Wissen ist das Skript leicht nachzuvollziehen.

Lebenszyklus der Anlage

Oktober 2018 bis 03.04.2019

cds/german/skripte_2018_19.txt · Last modified: 2019/05/01 16:15 by cds