User Tools

Site Tools


cds:german:skripte_2016_17

Skripte der Anlage Winter 2016/17


Anhand meiner Anlage aus der Wintersaison 2016/17 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.
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 1

Hier nun der Plan meiner Anlage, der die Basis für alle Erklärungen darstellt:

Anlagenplan 1


Der Plan kurz erklärt:
Links die Blöcke Bf_E1_Gl8, Bf_E1_Gl9, Bf_E1_Gl10, die einen Endbahnhof für Pendelzüge (Nahverkehr, NV) bilden (Ortschaft, Mindestbelegung = 3, FiFo = ein). Bf_E1_Gl11 ist ein Tank-/Wartungs-/Warte-/Abstellgleis für Pendelzüge, von Bf_E1_Gl7 nicht befahrbar (keine Fahrstraße). Die Blöcke Bf_E1_Gl5, Bf_E1_Gl6, Bf_E1_Gl7 bilden einen Schattenbahnhof für Fernverkehrs(FV)züge (Ortschaft, Mindestbelegung = 3, FiFo = ein), die Blöcke Bf_E1_Gl1, Bf_E1_Gl1, Bf_E1_Gl3, Bf_E1_Gl4 bilden einen Schattenbahnhof für Güter(GV)züge (Ortschaft, Mindestbelegung = 4, FiFo = aus). An Hand der grünen Richtungspfeile ist zu erkennen, dass alle Züge den Bahnhof über den Block Str3_E2_E1 angefahren werden und über den Block Str1_E1_E2 (bzw. auch Str1_E1) verlassen.
In der Mitte bilden die Blöcke Bf_E2_Gl1 bis Bf_E2_Gl7 einen Durchgangs- bzw. Abzweigbahnhof via Strecke Str1_E2 zum Endbahnhof KBf_E2_Gl1, KBf_E2_Gl2 und KBf_E2_Gl3 (Pendelzüge, Ortschaft, Mindestbelegung = 3, FiFo = ein). Block Bf_E2_Gl8 ist ein Abstellgleis für eine Rangierlok.
Im rechten Anlagenteil stellen die Blöcke Bf_E3_Gl1, Bf_E3_Gl6, Bf_E3_Gl7, Bf_E3_Gl8 einen Abstellbahnhof für GV (Ortschaft, Mindestbelegung = 4, FiFo = ein) dar, die Blöcke Bf_E3_Gl3 und Bf_E3_Gl5 einen für FV (Ortschaft, Mindestbelegung = 2, FiFo = ein). Die Blöcke Bf_E3_Gl2 und Bf_E3_Gl4 bilden die Gleise des (Güter-Nebenbahn-) GNB-Bahnhofs (Ortschaft, Mindestbelegung = 2, FiFo = ein) ab, Block Str4_E3 ist eine Haltestelle für NV.

Steuerung Endbahnhof E2

Es ist deutlich zu erkennen, dass der Endbhf. KBf_E2_Gl1, KBf_E2_Gl2 und KBf_E2_Gl3 ein deadlock-Problem aufweist. Sind die drei Blöcke belegt und ein weiterer NV-Zug fährt in die Strecke Str1_E2, so kann kein Zug den Endbhf. verlassen.
Anmerkung: Dies läßt sich auch anders lösen, z. B. durch Elimination des Blocks Str1_E2, doch wollte ich die Blöcke des ABzweig-/Durchgangsbhfs. so rasch als möglich frei bekommen und andererseits eine Wartemöglichkeit für Züge Richtung Abzweigbf haben.
Dazu habe ich folgendes Skript entwickelt:

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_NV_nach_E2">
 
<!-- Aufruf ENTER aus Str1_E2, Fahrtrichtung + -->
<if condition="%callerid% # Str1_E2" state="lc %lcid% = +" alltrue="true">
  <then>
    <vr id="Var_NV_E2" value="#Var_NV_E2 + 1"/>
	<tx id="T_Var_NV_E2" format="NV_E2: #Var_NV_E2"/>
	<if condition="#Var_NV_E2 = 3">
	  <then>
	    <sw id="W5_E2" cmd="close"/>
		<exit cmt="Script NV_nach_E2: FS Gl1 bis Gl6 nach Str1_E2 gesperrt"/>
	  </then>
	</if>
  </then>
</if>
 
<!-- Aufruf ENTER aus Str1_E2, Fahrtrichtung - -->
<if condition="%callerid% # Str1_E2" state="lc %lcid% = -" alltrue="true">
  <then>
    <vr id="Var_NV_E2" value="#Var_NV_E2 - 1"/>
	<tx id="T_Var_NV_E2" format="NV_E2: #Var_NV_E2"/>
	<sw id="W5_E2" cmd="open"/>
	<exit cmt="Script NV_nach_E2: FS Str1_E2 nach Gl1 bis Gl6 geoeffnet"/>
  </then>
</if>
 
</xmlscript>

und einmal (!) als Aktion in den Block Str1_E2, Status "enter", keine Aktionsbedingung, eingebunden.

Wie arbeitet das Skript?
Im Wesentlichen schließt und öffnet das Skript die Weiche W2_E5. Visualisiert wird dies durch die graue Färbung dieser Weiche (siehe Bild).
Die Ausgangslage ist, dass die drei Blöcke KBf_E2_Gl1, KBf_E2_Gl2 und KBf_E2_Gl3 frei sind. Fährt ein Zug vom Abzweigbf. kommend in den Block Str1_E2 ein (von der "+"-Seite), so wird die Variable Var_NV_E2 inkrementiert (+1). Der aktuelle Wert der Variablen wird am Plan ausgegeben, siehe Textfeld "NV_E2". Ist der Endbahnhof gefüllt, hat die Variable Var_NV_E2 den Wert "3". Jetzt wird die Weiche W2_E5 außer Betrieb genommen. Nunmehr können keine Züge aus den Blöcken Bf_E2_Gl1 bis Gl6 Richtung Endbf. fahren. Genial einfach!

Verlässt ein Zug einen Block des Endbfs. E2 und fährt von der "-"-Seite in den Block Str1_E2 ein, so wird die Variable dekrementiert (-1), der Wert ausgegeben und die Weiche wieder in Betrieb genommen.

In diesem gezeigten Lösungsbeispiel zeigt sich die Eleganz des Einsatzes von Skripts: Mit einem einfachen Skript und einem Skriptaufruf ist das Problem gelöst.

(Man darf immer klüger werden, sprich dazu lernen: Die hier beschriebene Funktionalität lässt sich auch mit Rocrail-Bordmitteln erreichen. Das Mittel der Wahl ist Blockgruppen/Bedingungen.)

Ausfahrt Fernverkehr (FV) aus Ebene 3

FV aus Ebene 3 soll erst ausfahren dürfen, wenn aus Ebene 1 ein FV-Zugs ausgefahren ist.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_Abfahrt_FV_E1_E3">
 
<!-- Aufruf aus Str3_E3 bei ENTER und Zug = FV -->
<if condition="%callerid% # Str3_E3|%lccargo% # ice" alltrue="true">
  <then>
    <bk id="Str3_E3" cmd="classdel" class="FV"/>
	<exit cmt="Script Abfahrt_FV_E1_E3: Klasse FV in Str3_E3 gelöscht"/>
  </then>
</if>
 
<!-- Aufruf aus Str1_E1 bei ENTER und Zug = FV -->
<if condition="%callerid% # Str1_E1|%lccargo% # ice" alltrue="true">
  <then>
    <bk id="Str3_E3" cmd="classadd" class="FV"/>
	<exit cmt="Script Abfahrt_FV_E1_E3: Klasse FV in Str3_E3 hinzugefügt"/>
  </then>
</if>
 
</xmlscript>

Aus den Kommentarzeilen im Skript ist ersichtlich, wie das Skript aufgerufen wird.

Steuerung von NV- (Nahverkehr-)Fahrten von Ebene 2 (_E2) nach Ebene 1 (_E2)

Der linke Teil der Anlage (Ebene 1) hält 4 Gleise für NV-Züge bereit: Bf_E1_Gl8, Bf_E1_Gl9, Bf_E1_Gl10, Bf_E1_Gl11. Sind diese 4 Gleise besetzt, müsste ein weiterer NV-Zug im Einfahrts-Block Str3_E2_E1 warten und blockierte somit den Zulauf zu den anderen FV- und GV-Gleisen. Eine mögliche Lösung ist, die Fahrten von NV-Zügen in den Block Str1_E2_E1 zu zählen und bei Erreichen der Anzahl “4” diese Fahrten zu unterbinden. Mittels folgendem Skript wurde diese Lösung realisiert:

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_NV_nach_E1">
 
<!-- Zug in Bf_E1_Gl11 gefangen - W15_E1 öffnen? Aufruf bei RESERVED -->
<if condition="%callerid% # Bf_E1_Gl11" state="st [Bf_E1_Gl11-]-[Bf_E1_Gl8+] = closed|co S4 = off" alltrue="true">
  <then>
    <sw id="W15_E1" cmd="open"/>
  </then>
</if>
 
<!-- Anzahl NV -->
<!-- vr id="Var_NV_E1" value="0"/-->
 
<!-- Ist Zug NV? -->
<if condition="%lccargo% # person|%lccargo% # lightgoods|%lccargo% # light" alltrue="false">
  <then>
    <!-- Aufruf ENTER aus Str1_E2_E1 -->
    <if condition="%callerid% # Str1_E2_E1">
      <then>
        <vr id="Var_NV_E1" value="#Var_NV_E1 + 1"/>
		<tx id="T_Var_NV_E1" format="NV_E1: #Var_NV_E1"/>
		<if condition="#Var_NV_E1 = 4">
		  <then>
		    <bk id="Str1_E2_E1" cmd="classdel" class="NV"/>
			<bk id="Str1_E2_E1" cmd="classdel" class="GNB"/>
			<bk id="Bf_E2_Gl7" cmd="classdel" class="NV"/>
			<bk id="Bf_E2_Gl7" cmd="classdel" class="GNB"/>
			<st id="[Bf_E1_Gl11-]-[Bf_E1_Gl8+]" state="closed"/>
			<st id="[Bf_E1_Gl11-]-[Bf_E1_Gl9+]" state="closed"/>
			<st id="[Bf_E1_Gl11-]-[Bf_E1_Gl10+]" state="closed"/>
			<if state="bk Bf_E1_Gl11 = free">
			  <then>
			    <sw id="W15_E1" cmd="close"/>
			  </then>
			</if>
			<exit cmt="Script NV_nach_E1: Klassen NV und GNB gelöscht"/>
		  </then>
		</if>
	  </then>
	</if>
    <!-- Aufruf ENTER aus Str1_E1_E2 -->
    <if condition="%callerid% # Str1_E1_E2">
      <then>
        <vr id="Var_NV_E1" value="#Var_NV_E1 - 1"/>
		<tx id="T_Var_NV_E1" format="NV_E1: #Var_NV_E1"/>
		<if condition="#Var_NV_E1 = 3">
		  <then>
			<bk id="Str1_E2_E1" cmd="classadd" class="NV"/>
			<bk id="Str1_E2_E1" cmd="classadd" class="GNB"/>
			<bk id="Bf_E2_Gl7" cmd="classadd" class="NV"/>
			<bk id="Bf_E2_Gl7" cmd="classadd" class="GNB"/>
            <if state="co S4 = off">
              <then>
                <sw id="W15_E1" cmd="open"/>
			  </then>
			</if>
			<st id="[Bf_E1_Gl11-]-[Bf_E1_Gl8+]" state="open"/>
			<st id="[Bf_E1_Gl11-]-[Bf_E1_Gl9+]" state="open"/>
			<st id="[Bf_E1_Gl11-]-[Bf_E1_Gl10+]" state="open"/>
			<exit cmt="Script NV_nach_E1: Klassen NV und GNB hinzugefügt"/>
		  </then>
		</if>
	  </then>
    </if>
  </then>
  <else>
    <exit cmt="Script_NV_nach_E1: Kein NV oder kein GNB"/>
  </else>
</if>
 
</xmlscript>

Aus den Kommentarzeilen im Skript ist ersichtlich, wie das Skript aufgerufen wird.
Wie das Skript funktioniert, kann man hier nachlesen (Blocknamen unterschiedlich).

Steuerung des FV (Fernverkehr) und GV (Güterverkehr)

In Ebene 1 gibt es einen Bf. für FV und GV, detto in Ebene 3. Ließe man der RR-Automatik freien Lauf, starteten diese Züge ungeregelt, gesteuert nur durch die jeweiligen Ortschaftseinstellungen. Dies kann z. B. dazu führen, dass ein FV-Zug im Block Str3_E2_E1 zum Halten kommt, weil aus dem FV-Bf. in Ebene 1 (Bf_E1_5, Bf_E1_Gl6, Bf_E1_Gl7) aus diversesten Gründen noch kein Zug ausgefahren ist. Das nachfolgende Skript regelt einen kontinuierlichen FV- und GV-Fluss:

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_Abfahrt_FV_GV_E1_E3">
 
<!-- Ausfuehrung nur bei FV und GV -->
<if condition="%lccargo% # ice|%lccargo% # goods" alltrue="false">
  <then>
    <!-- Aufruf aus Str3_E3 bei ENTER und Zug = FV -->
    <if condition="%callerid% # Str3_E3|%lccargo% # ice" alltrue="true">
      <then>
        <bk id="Str3_E3" cmd="classdel" class="FV"/>
	    <exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse FV in Str3_E3 gelöscht"/>
      </then>
	</if>
	<!-- Aufruf aus Str3_E3 bei ENTER und Zug = GV -->
	<if condition="%callerid% # Str3_E3|%lccargo% # goods" alltrue="true">
      <then>
        <bk id="Str3_E3" cmd="classdel" class="GV"/>
	    <exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse GV in Str3_E3 gelöscht"/>
      </then>
	</if>
 
	<!-- Aufruf aus Str1_E1 bei ENTER und Zug = FV -->
	<if condition="%callerid% # Str1_E1|%lccargo% # ice" alltrue="true">
	  <then>
		<bk id="Str3_E3" cmd="classadd" class="FV"/>
		<exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse FV in Str3_E3 hinzugefügt"/>
	  </then>
	</if>
	<!-- Aufruf aus Str1_E1 bei ENTER und Zug = GV -->
	<if condition="%callerid% # Str1_E1|%lccargo% # goods" alltrue="true">
	  <then>
		<bk id="Str3_E3" cmd="classadd" class="GV"/>
		<exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse FV in Str3_E3 hinzugefügt"/>
	  </then>
	</if>
  </then>
</if>
 
</xmlscript>

Aus den Kommentarzeilen im Skript ist ersichtlich, wie das Skript aufgerufen wird.
Wie das Skript funktioniert, kann man hier nachlesen (Blocknamen unterschiedlich).

Weitere Skripts siehe "Anlagenplan 2".

Anlagenplan 2

Hier nun der Plan meiner leicht abgeänderten Anlage, der die Basis für alle Erklärungen darstellt:

Anlagenplan 2


Der Plan kurz erklärt:
Im Vergleich zum Anlagenplan 1 wurde der rechte Anlagenteil vereinfacht. Die Komplexität wurde reduziert, indem die Aus- und Einfahrt des Bfs. baulich entflochten wurden. Das Bfs.gleis Bf_E3_Gl9 ist hinzugekommen, hier halten ausschließlich Nahverkehrszüge (vorher war die Haltestelle der Block Str4_E3). Der Rest ist unverändert.

Die unter "Anlagenplan 1" angeführten Skripte kommen auch hier zur Anwendung.
In der Folge werden weitere Skripte vorgestellt.

Ausfahrt Fernverkehr (FV) und Güterverkehr (GV) aus Ebene 3

FV und GV soll aus Ebene 3 erst ausfahren dürfen, wenn aus Ebene 1 ein FV- oder GV-Zug ausgefahren ist.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_Abfahrt_FV_GV_E1_E3">
 
<!-- Ausfuehrung nur bei GV im Block Str2_E3 bei OCCUPIED -->
<if condition="%callerid% # Str2_E3|%lccargo% # goods" alltrue="true">
  <then>
    <bk id="Str1_E1" cmd="classadd" class="GV"/>
	<exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse GV in Str1_E1 hinzugefügt"/>
  </then>
</if>
 
<!-- Ausfuehrung nur bei FV und GV -->
<if condition="%lccargo% # ice|%lccargo% # goods" alltrue="false">
  <then>
    <!-- Aufruf aus Str3_E3 bei ENTER und Zug = FV -->
    <if condition="%callerid% # Str3_E3|%lccargo% # ice" alltrue="true">
      <then>
        <bk id="Str3_E3" cmd="classdel" class="FV"/>
	    <sw id="W15_E3" cmd="open"/>
		<st id="[Bf_E3_Gl4+]-[Str3_E3+]" state="open"/>
		<st id="[Bf_E3_Gl2+]-[Str3_E3+]" state="open"/>
		<st id="[Bf_E3_Gl1+]-[Str3_E3+]" state="open"/>
		<exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse FV in Str3_E3 gelöscht"/>
      </then>
	</if>
	<!-- Aufruf aus Str3_E3 bei ENTER und Zug = GV -->
	<if condition="%callerid% # Str3_E3|%lccargo% # goods" alltrue="true">
      <then>
        <bk id="Str3_E3" cmd="classdel" class="GV"/>
		<sw id="W12_E3" cmd="open"/>
		<st id="[Bf_E3_Gl9+]-[Str3_E3+]" state="open"/>
	    <exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse GV in Str3_E3 gelöscht"/>
      </then>
	</if>
 
	<!-- Aufruf aus Str1_E1 bei ENTER und Zug = FV -->
	<if condition="%callerid% # Str1_E1|%lccargo% # ice" alltrue="true">
	  <then>
		<bk id="Str3_E3" cmd="classadd" class="FV"/>
		<if state="sw W12_E3 = open">
		  <then>
		    <sw id="W15_E3" cmd="close"/>
		    <st id="[Bf_E3_Gl4+]-[Str3_E3+]" state="closed"/>
		    <st id="[Bf_E3_Gl2+]-[Str3_E3+]" state="closed"/>
		    <st id="[Bf_E3_Gl1+]-[Str3_E3+]" state="closed"/>
		  </then>
		</if>
		<exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse FV in Str3_E3 hinzugefügt"/>
	  </then>
	</if>
	<!-- Aufruf aus Str1_E1 bei ENTER und Zug = GV -->
	<if condition="%callerid% # Str1_E1|%lccargo% # goods" alltrue="true">
	  <then>
	    <bk id="Str3_E3" cmd="classadd" class="GV"/>
	    <bk id="Str1_E1" cmd="classdel" class="GV"/>
	    <if state="sw W15_E3 = open">
		  <then>
		    <sw id="W12_E3" cmd="close"/>
		    <st id="[Bf_E3_Gl9+]-[Str3_E3+]" state="closed"/>
		  </then>
		</if>
		<exit cmt="Script Abfahrt_FV_GV_E1_E3: Klasse GV in Str3_E3 hinzugefügt, in Str1_E1 gelöscht"/>
	  </then>
	</if>
  </then>
</if>
 
</xmlscript>

Aus den Kommentarzeilen im Skript ist ersichtlich, wie das Skript aufgerufen wird.

Steuerung Ausfahrt Güterverkehr (GV) aus Ebene 1

Der GV hat in Ebene 1 und in Ebene 3 jeweils einen Schattenbahnhof (Sbf) mit jeweils 4 Gleisen. Würden beide Sbfe jeweils mit Mindestbesetzung = 4 und FiFo = ein konfiguriert sein, führen immer die gleichen beiden GV-Züge. Ich habe daher Fifo im SBf Ebene 1 ausgeschaltet und ein Skript konzipiert, das immer die beiden zuletzt angekommenen Güterzüge am Ausfahren hindert.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_FS_Bf_E1_GV">
 
<!-- FS öffnen -->
<!-- Aufruf aus Str1_E1 bei OCCUPIED und Zug = GV -->
<if condition="%callerid% # Str1_E1|%lccargo% # goods">
  <then>
    <!-- FS öffnen, wenn Zähler 1 -->
    <if condition="#Var_Bf_E1_Gl1 = 1">
	  <then>
        <st id="[Bf_E1_Gl1-]-[Str1_E1-]" state="open"/>
	  </then>
	</if>
	<if condition="#Var_Bf_E1_Gl2 = 1">
	  <then>
        <st id="[Bf_E1_Gl2-]-[Str1_E1-]" state="open"/>
	  </then>
	</if>
	<if condition="#Var_Bf_E1_Gl3 = 1">
	  <then>
        <st id="[Bf_E1_Gl3-]-[Str1_E1-]" state="open"/>
	  </then>
	</if>
	<if condition="#Var_Bf_E1_Gl4 = 1">
	  <then>
	    <st id="[Bf_E1_Gl4-]-[Str1_E1-]" state="open"/>
	  </then>
	</if>
    <!-- Zählen -->
    <if state="st [Bf_E1_Gl1-]-[Str1_E1-] = closed">
      <then>
        <vr id="Var_Bf_E1_Gl1" value="#Var_Bf_E1_Gl1 + 1"/>
	  </then>
	</if>
	<if state="st [Bf_E1_Gl2-]-[Str1_E1-] = closed">
      <then>
    	<vr id="Var_Bf_E1_Gl2" value="#Var_Bf_E1_Gl2 + 1"/>
	  </then>
	</if>
	<if state="st [Bf_E1_Gl3-]-[Str1_E1-] = closed">
      <then>
    	<vr id="Var_Bf_E1_Gl3" value="#Var_Bf_E1_Gl3 + 1"/>
	  </then>
	</if>
	<if state="st [Bf_E1_Gl4-]-[Str1_E1-] = closed">
      <then>
        <vr id="Var_Bf_E1_Gl4" value="#Var_Bf_E1_Gl4 + 1"/>
	  </then>
	</if>
  </then>
</if>
 
<!-- FS sperren -->
<!-- Aufruf aus Bf_E1_Gl1 bei OCCUPIED -->
<if condition="%callerid% # Bf_E1_Gl1">
  <then>
    <vr id="Var_Bf_E1_Gl1" value="0"/>
    <st id="[Bf_E1_Gl1-]-[Str1_E1-]" state="closed"/>
	<exit cmt="Script_FS_Bf_E1_GV: FS [Bf_E1_Gl1-]-[Str1_E1-] geschlossen"/>
  </then>
</if>
 
<!-- Aufruf aus Bf_E1_Gl2 bei OCCUPIED -->
<if condition="%callerid% # Bf_E1_Gl2">
  <then>
    <vr id="Var_Bf_E1_Gl2" value="0"/>
    <st id="[Bf_E1_Gl2-]-[Str1_E1-]" state="closed"/>
	<exit cmt="Script_FS_Bf_E1_GV: FS [Bf_E1_Gl2-]-[Str1_E1-] geschlossen"/>
  </then>
</if>
 
<!-- Aufruf aus Bf_E1_Gl3 bei OCCUPIED -->
<if condition="%callerid% # Bf_E1_Gl3">
  <then>
    <vr id="Var_Bf_E1_Gl3" value="0"/>
    <st id="[Bf_E1_Gl3-]-[Str1_E1-]" state="closed"/>
	<exit cmt="Script_FS_Bf_E1_GV: FS [Bf_E1_Gl3-]-[Str1_E1-] geschlossen"/>
  </then>
</if>
 
<!-- Aufruf aus Bf_E1_Gl4 bei OCCUPIED -->
<if condition="%callerid% # Bf_E1_Gl4">
  <then>
    <vr id="Var_Bf_E1_Gl4" value="0"/>
    <st id="[Bf_E1_Gl4-]-[Str1_E1-]" state="closed"/>
	<exit cmt="Script_FS_Bf_E1_GV: FS [Bf_E1_Gl4-]-[Str1_E1-] geschlossen"/>
  </then>
</if>
 
</xmlscript>

Aus den Kommentarzeilen im Skript ist ersichtlich, wie das Skript aufgerufen wird.

Steuerung Güternebenbahn (GNB) von Ebene 2 nach Ebene 3

In der Ebene 3 gibt es 2 Gleise für GNB: Bf_E3_Gl2 und Bf_E3_Gl4. Um zu vermeiden, dass ein dritter GNB-Zug von Ebene 2 Richtung Ebene 3 aufbricht und dann im Block Str2_E3 vor dem Schattenbahnhof (Sbf) warten muss (und alle anderen Züge somit blockiert), habe ich dieses Skript entwickeln, das die Ausfahrt von GNB-Zügen aus Ebene 2 regelt:

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript desc="Script_NV_GNB_nach_E3">
 
<!-- Aufruf ENTER aus Str1_E2_E3 und Zug GNB? -->
<if condition="%lccargo% # lightgoods|%callerid% # Str1_E2_E3" alltrue="true">
  <then>
    <vr id="Var_GNB_E3" value="#Var_GNB_E3 + 1"/>
	<tx id="T_Var_GNB_E3" format="GNB_E3: #Var_GNB_E3"/>
	<if condition="#Var_GNB_E3 = 2">
	  <then>
	    <bk id="Str1_E2_E3" cmd="classdel" class="GNB"/>
		<exit cmt="Script_NV_GNB_nach_E3: Klasse GNB gelöscht"/>
	  </then>
	</if>
  </then>
</if>
 
<!-- Aufruf ENTER aus Str3_E3 und Zug GNB? -->
<if condition="%lccargo% # lightgoods|%callerid% # Str3_E3" alltrue="true">
  <then>
    <vr id="Var_GNB_E3" value="#Var_GNB_E3 - 1"/>
	<tx id="T_Var_GNB_E3" format="GNB_E3: #Var_GNB_E3"/>
	<bk id="Str1_E2_E3" cmd="classadd" class="GNB"/>
	<exit cmt="Script_NV_GNB_nach_E3: Klasse GNB hinzugefügt"/>
  </then>
</if>
 
<!-- Aufruf ENTER aus Str1_E2_E3 und Zug NV? -->
<if condition="%lccargo% # person|%callerid% # Str1_E2_E3" alltrue="true">
  <then>
    <bk id="Str1_E2_E3" cmd="classdel" class="NV"/>
	<exit cmt="Script_NV_GNB_nach_E3: Klasse NV gelöscht"/>
  </then>
</if>
 
<!-- Aufruf ENTER aus Str3_E3 und Zug NV? -->
<if condition="%lccargo% # person|%callerid% # Str3_E3" alltrue="true">
  <then>
    <bk id="Str1_E2_E3" cmd="classadd" class="NV"/>
	<exit cmt="Script_NV_GNB_nach_E3: Klasse NV hinzugefügt"/>
  </then>
</if>
 
</xmlscript>

Aus den Kommentarzeilen im Skript ist ersichtlich, wie das Skript aufgerufen wird.
Der Inhalt der Variablen "Var_GNB_E3" ist im Textfeld "T_Var_GNB_E3" im Plan (unterhalb der 3 Schalter) zu sehen.

Lebenszyklus der Anlage

Die Anlage gibt es ab Ostern 2017 nicht mehr; ich baue über die Wintermonate immer wieder eine neue.
14.04.2017: RIP

cds/german/skripte_2016_17.txt · Last modified: 2018/11/12 08:56 (external edit)