User Tools

Site Tools


userpages:lordbrummi:skripte:virtuellerenter

Table of Contents

Virtuelle Enter Melder zeitversetzt mittels physikalischem Rückmelder auslösen und Funktionen je nach Fahrstraße für eine bestimmte Zeit einschalten

Anlagenplan

Hier nun der Beispielplan.

Beispielplan


Plan kurz erklärt:

Alle Blöcke haben Rückmelder, die gleich wie der Block heissen, nur eben mit einem + oder - angehängt, je nachdem ob der Rückmelder auf der + oder auf der - Seite sich befindet.
Beispiel: Der Block z-cgu-seil hat auf seiner + Seite den Rückmelder z-cgu-seil+ und auf seiner -Seite den Rückmelder z-cgu-seil-.
Somit sind die Rückmelder schon aufgrund Ihrer ID offensichtlich den Blöcken zuordenbar.
Ich habe bewusst nicht einfache Namen wie abc gewählt, um auch bei den Scriptingbeispielen aufzuzeigen, wie wichtig korrekte Schreibweisen sind.

Wie man aufgrund der Richtungspfeile sieht, handelt es sich bei dem Beispielplan um einen Rechtsverkehrkreis eines Carsystems, aber die Skripte können natürlich genauso für die Bahn benutzt werden.
In keinem Block wird gehalten, außer in den beiden Bushaltestellenblöcken z-cgu-bus1 und z-cu-bus1.
Alle Rückmelder sind real, bis auf 4 Stück, welche mit einem Stern markiert sind, diese sind virtuell.

Welche Ziele sollen im ersten Schritt mit Scripting erreicht werden:

1.) Die virtuellen Rückmelder, welche mit dem Stern markiert sind, sind die Enter Melder des jeweils folgenden Blockes. Diese sollen, je nach Fahrstraße mit dem realen Rückmeldern vor der jeweiligen Weiche (mit Pfeil markiert) zeitversetzt aktiviert werden.
2.) Autos, die in die Bushaltestelle abbiegen sollen für 2 Sekunden rechts blinken. Ebenso sollen sie nach der Wartezeit im Bushaltestellenblock bei der Ausfahrt wieder 2 Sekunden lang links blinken.


1. Virtuelle Enter Melder je nach Fahrstraße zeitversetzt durch realen Melder auslösen:
<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
 
<trace text="Ich bin Rückmelder: %callerid%"/>
 
<if condition="%callerid% # z-cu-real1">
    <then>
    <trace text="Rückmelder z-cu-real1 wurde ausgelöst"/>
        <if state="st [z-cu-seilzu-]-[z-cu-bus1+] = locked">
          <then>          
          <sleep time="2000"/>
          <fb id="z-cu-bus1+" cmd="on"/>
          <sleep time="100"/>
          <fb id="z-cu-bus1+" cmd="off"/>
          </then> 
        </if>
        <if state="st [z-cu-seilzu-]-[z-cu-seil+] = locked">
          <then> 
          <sleep time="2000"/>
          <fb id="z-cu-seil+" cmd="on"/>
          <sleep time="100"/>
          <fb id="z-cu-seil+" cmd="off"/>
          </then> 
        </if>
    </then>
</if>
 
<if condition="%callerid% # z-cgu-real1">
    <then>
    <trace text="Rückmelder z-cgu-real1 wurde ausgelöst"/>
 
         <if state="st [z-cu-seil-schatten+]-[z-cgu-bus1-] = locked">
             <then> 
             <sleep time="2000"/>
             <fb id="z-cgu-bus1-" cmd="on"/>
             <sleep time="100"/>
             <fb id="z-cgu-bus1-" cmd="off"/>
             </then> 
         </if>
         <if state="st [z-cu-seil-schatten+]-[z-cgu-seil-] = locked">
             <then> 
             <sleep time="2000"/>
             <fb id="z-cgu-seil-" cmd="on"/>
             <sleep time="100"/>
             <fb id="z-cgu-seil-" cmd="off"/>
             </then> 
         </if>
     </then>
</if>
 
</xmlscript>


Dieses Script wird an den (realen) Rückmeldern z-cu-real1 und z-cgu-real1 beim Status ON aufgerufen.
Die %callerid% enthält das Objekt, daß das Script aufgerufen hat.
Die %callerid% ist also einer von den beiden realen Rückmeldern, die im Plan mit dem Pfeilsymbol markiert sind.
Mittels if-Abfragen wird geprüft welcher Melder es war und dann je nach gestellter Fahrstraße der entsprechende virtuelle Melder nach 2 Sekunden aktiviert und 100msec später wieder deaktiviert.

In der Praxis bedeuted dies:
Ein Auro fährt auf die Weiche zu und löst den physikalischen Melder z-cu-real1 oder z-cgu-real1 aus.
Zu diesem Zeitpunkt hat es sich bereits die Fahrstraße geradeaus oder rechts weg in die Bushaltestelle gestellt.
Dadurch wird der entsprechende Enter Melder 2 Sekunden später kurz ausgelöst.
(nach 2 Sekunden ist das Auto bereits über die Weiche hinweggefahren, somit kann der Startblock und die FS sicher freigegeben werden)

Vorsicht:
Die hier beschriebene Vorgehensweise (zeitversetztes Auslösen von virtuellen Enter Meldern um vorzeitig Startblock und Fahrstraßen freizugeben) sollte nie bei der Bahn angewendet werden!
Es kann dadurch zu Unfällen kommen wenn eine Weiche durch einen nachfolgenden Zug umgeschaltet wird, während sich noch der vordere Zug auf der Weiche befindet. Außerdem kann es zu Auffahrunfällen führen.
Dies sollte also nur für Autos und nur durch erfahrene Rocrail Nutzer angewandt werden!

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
 
<!------ Bushaltestelle blinken -------->
 
<trace text="I am %callerid%"/>
<trace text="%lcid%"/>
 
<if condition="%callerid% # z-cu-seil-schatten+" state="st [z-cu-seil-schatten+]-[z-cgu-bus1-] = locked" alltrue="true">
     <then>
        <fn lc id="%lcid%" fndesc="BL-R" fncmd="on"/>
        <sleep time="2000"/>
        <fn lc id="%lcid%" fndesc="BL-R" fncmd="off"/>
        <exit/>
     </then>
</if>
 
 
<if condition="%callerid% # z-cu-seilzu-" state="st [z-cu-seilzu-]-[z-cu-bus1+] = locked" alltrue="true">
     <then>
        <fn lc id="%lcid%" fndesc="BL-R" fncmd="on"/>
        <sleep time="2000"/>
        <fn lc id="%lcid%" fndesc="BL-R" fncmd="off"/>
        <exit/>
    </then>
</if>
 
 
<if condition="%callerid% # z-cgu-bus1|%callerid% # z-cu-bus1" alltrue="false">
    <then>
        <fn lc id="%lcid%" fndesc="BL-L" fncmd="on"/>
        <sleep time="2000"/>
        <fn lc id="%lcid%" fndesc="BL-L" fncmd="off"/>
        <exit/>
    </then>
</if>
 
</xmlscript>


Dieses Script wird bei den IN Meldern der Blöcke z-cu-seil-schatten und z-cu-seilzu beim Status on aufgerufen.
Es schaltet die Funktion, die die Bezeichnung BL-R und BL-L haben.

Hinweis:

Follower in Fifo-Blöcken (Autos) führen derzeit noch keine Blockaktionen (In,Enter,Ocuupied etc.) aus. Deshalb wird das Script blinken derzeit am IN Melder ausgeführt und nicht beim Block occupied.

Wichtig:

Wichtig ist bei beiden Aktionsdefinitionen, daß dort der Haken 'Ascynron' gesetzt ist (siehe roter Pfeil im Bild)!
Da in den Scripten mit <sleep time="xx"> teils mehrere Sekunden pausiert wird, gingen sonst durch andere Fahrzeuge an den entsprechenden Blöcken bzw. Rückmeldern ausgeführte Aktionen unter.
Durch das asyncrone Ausführen der Scripte wird dies verhindert.

Beispielplan
userpages/lordbrummi/skripte/virtuellerenter.txt · Last modified: 2022/11/10 16:39 by lordbrummi