User Tools

Site Tools


userpages:hermannk:departdelaychange-de

Abfahrt-Verzögerung - Änderung

Userpages - Hermann (hermannk)

Diese XML-Skriptlösung wurde von einem Benutzer angefordert, der zusätzliche Zeit für die integrierte "Abfahrtsverzögerung" eines Blocks benötigte.

Hier geht es direkt zum Arbeitsbereich -Download.

Einführung

Der Wert "Abfahrtsverzögerung" (in Sekunden) ist Teil der Eigenschaften eines Blocks. Wenn die Lok den Befehl "Start" erhält, wird der Geschwindigkeitsbefehl um den Wert "Abfahrtsverzögerung" verzögert (siehe Block - Abfahrt-Verzögerung).
Aus besonderen Gründen sollte dieser Wert zur Laufzeit für bestimmte Lokomotiven erhöht werden.

Dazu muss der "departdelay" -Wert eines Blocks geändert werden.

<bk id="bk1" departdelay="10"/> \\

Das zeitliche Ablauf ist wichtig! Beim DEPART-Ereignis des Blocks ist es zu spät! Zu diesem Zeitpunkt wird der alte "departdelay" -Wert angewendet.
Daher verwendet diese Lösung hier
- das IN-Ereignis, um den neuen "departdelay" -Wert des Blocks einzutragen und
- das DEPART-Ereignis, um den "departdelay" -Wert des Blocks auf seinen ursprünglichen Wert zurückzusetzen.
Damit wird mit der Verzögerung des neuen "departdelay" -Wertes der Geschwindigkeits-Befehl an die Lok gesendet.

Allerdings wird das XML-Skript nur für die Lokomotiven ausgeführt, die zur Klasse "DELAY" gehören.

<query vr="vr_ddS_class" table="lclist" id="mylocomotive" get="class"/>
<if condition="@vr_ddS_class = DELAY"> \\
Hier geht es direkt zum Arbeitsbereich -Download.

Eine Erklärung des Scripts

- Vorbereitung
- der Status IN
- der Status DEPART
- Änderung des Wertes für die Abfahrt-Verzögerung

Vorbereitung

Zunächst wird eine Lösung für einen Block mit dem Namen "bk1" gezeigt. Am Ende ist die allgemeine Lösung zu sehen.
Das XML-Script hat die Kennung "ac_departdelaySet.xml".
Die Kennungen für alle Variablen dieses Scripts beginnen mit "vr_ddS_".

Der neue "departdelay" -Wert wird in der Variablen "vr_ddS_delayValue" ganz am Anfang des Scripts gespeichert, um eine Änderung dieses Wertes durch den Benutzer sehr einfach zu ermöglichen. In dieser Lösung gibt es nur einen alternativen "departdelay" -Wert.

<vr id="vr_ddS_delayValue" text="" value="10" generated="true"/>

Da das Script zu zwei verschiedenen Ereignissen aufgerufen wird, wird das aktuelle Ereignis in der Variablen "vr_ddS_state" gespeichert.

<vr id="vr_ddS_state" text="%state%" generated="true"/>

Da das Script nur für Lokomotiven mit der Klasse "DELAY" arbeiten soll, wird eine Abfrage nach der Lokomotiv-Kennung und eine Abfrage nach der Lokomotiv-Klasse durchgeführt und in "vr_ddS_locid" bzw. "vr_ddS_class" gespeichert.

<vr id="vr_ddS_locid" text="" generated="true"/>
<query vr="vr_ddS_locid" table="bklist" id="%callerid%" get="locid"/>
<vr id="vr_ddS_class" text="" generated="true"/>
<query vr="vr_ddS_class" table="lclist" id="@vr_ddS_locid" get="class"/>

Zum Abschluss der Vorbereitung wird der Wert für die neue Abfahrt-Verzögerung "vr_ddS_newValue" gelöscht.

<vr id="vr_ddS_newValue" text="0" value="0" generated="true"/>
<trace text="ac_departdelaySet: begin %callerid% @vr_ddS_state @vr_ddS_locid @vr_ddS_class " />

der Status IN

Es wird jetzt vorausgesetzt, dass eine Lokomotive mit der Klasse "DELAY" sich IN diesem Block befindet.
Der Original-Wert der Abfahrt-Verzögerung wird in der Variablen "vr_ddS_orgValue" gespeichert.

    <vr id="vr_ddS_orgValue" text="-1" value="-1" generated="false"/>
    <query vr="vr_ddS_orgValue" table="bklist" id="%callerid%" get="departdelay"/>

Der neue Wert der Abfahrt-Verzögerung wird schon mal in der Variablen " vr_ddS_newValue" vorbereitend gespeichert.

    <vr id="vr_ddS_newValue" value="#vr_ddS_delayValue"/>

der Status DEPART

Es wird vorausgesetzt, dass eine Lokomotive der Klasse "DELAY" diesen Block verlässt (Ereignis "DEPART").
Jetzt wird der alte Original-Wert der Abfahrt-Verzögerung vorbereitend in der Variablen " vr_ddS_newValue" gespeichert.

    <vr id="vr_ddS_newValue" value="#vr_ddS_orgValue"/>

Änderung des Wertes für die Abfahrt-Verzögerung

Es wird immer noch vorausgesetzt, dass eine Lokomotive der Klasse "DELAY" sich in diesem Block befindet.
Die Datenstruktur (model) des aufrufenden Blockes (%callerid%) soll bezüglich der Abfahrt-Verzögerung ("departdelay") auf den Wert in "#vr_ddS_newValue" geändert werden:

  <model cmd="change">
    <bk id="%callerid%" departdelay="#vr_ddS_newValue"/>
  </model>

Achtung: es wird das Wert-Attribute ("#") - nicht das Text-Attribut ("@") - bei "#vr_ddS_newValue" angewendet!

Das Script (die Ein-Block-Lösung)

Diese Variante der Lösung wird nur für einen einzigen Block in einem Plan funktionieren.
Alle Kommentar-Zeilen und alle Trace-Zeilen wurden hier entfernt:

<xmlscript>
<vr id="vr_ddS_delayValue" text="" value="10" generated="true"/>
<vr id="vr_ddS_state" text="%state%" generated="true"/>
<vr id="vr_ddS_locid" text="" generated="true"/>
<query vr="vr_ddS_locid" table="bklist" id="%callerid%" get="locid"/>
<vr id="vr_ddS_class" text="" generated="true"/>
<query vr="vr_ddS_class" table="lclist" id="@vr_ddS_locid" get="class"/>
<vr id="vr_ddS_newValue" text="0" value="0" generated="true"/>
<if condition="@vr_ddS_class = DELAY">
<then>
  <if condition="@vr_ddS_state = in">
  <then>
    <vr id="vr_ddS_orgValue" text="-1" value="-1" generated="false"/>
    <query vr="vr_ddS_orgValue" table="bklist" id="%callerid%" get="departdelay"/>
    <vr id="vr_ddS_newValue" value="#vr_ddS_delayValue"/>
  </then>
  </if>
  <if condition="@vr_ddS_state = depart">
  <then>
    <vr id="vr_ddS_newValue" value="#vr_ddS_orgValue"/>
  </then>
  </if>
  <model cmd="change">
    <bk id="%callerid%" departdelay="#vr_ddS_newValue"/>
  </model>
</then>
</if>
</xmlscript>

Das Script (die allgemeine Lösung für mehrere Blöcke)

Diese Variante des Scripts funktioniert für mehrere Blöcke in einem Plan.
Dazu wird der Kennung jeder Variablen die Kennung des aufrufenden Blocks ("%callerid%") hinzugefügt.
Die Variable "vr_ddS_state" wird somit zu "vr_ddS_%callerid%_state" (was dann für den Block "bk1" zu "vr_ddS_bk1_state" wird) und so weiter.
:!: Das setzt "wohl-geformte" Kennungen für die betroffenen Blöcke voraus (keine Leerzeichen, keine Sonderzeichen, keine …).
Alle Kommentar-Zeilen und alle Trace-Zeilen wurden hier entfernt:

<xmlscript>
<vr id="vr_ddS_delayValue" text="" value="10" generated="true"/>
<vr id="vr_ddS_%callerid%_state" text="%state%" generated="true"/>
<vr id="vr_ddS_%callerid%_locid" text="" generated="true"/>
<query vr="vr_ddS_%callerid%_locid" table="bklist" id="%callerid%" get="locid"/>
<vr id="vr_ddS_%callerid%_class" text="" generated="true"/>
<query vr="vr_ddS_%callerid%_class" table="lclist" id="@vr_ddS_%callerid%_locid" get="class"/>
<vr id="vr_ddS_%callerid%_newValue" text="0" value="0" generated="true"/>

<if condition="@vr_ddS_%callerid%_class = DELAY">
<then>
  <if condition="@vr_ddS_%callerid%_state = in">
  <then>
    <vr id="vr_ddS_%callerid%_orgValue" text="-1" value="-1" generated="false"/>
    <query vr="vr_ddS_%callerid%_orgValue" table="bklist" id="%callerid%" get="departdelay"/>
    <vr id="vr_ddS_%callerid%_newValue" value="#vr_ddS_delayValue"/>
  </then>
  </if>

  <if condition="@vr_ddS_%callerid%_state = depart">
  <then>
    <vr id="vr_ddS_%callerid%_newValue" value="#vr_ddS_%callerid%_orgValue"/>
  </then>
  </if>

  <model cmd="change">
    <bk id="%callerid%" departdelay="#vr_ddS_%callerid%_newValue"/>
  </model>
</then>
</if>
</xmlscript>

Installation

Der verwendete Test-Plan sieht so aus. (hier geht es direkt zum Arbeitsbereich -Download.)

die Aktions-Definition

Die Aktion hat die Kennung "ac_departdelaySet" und ruft das externe XML-Script "ac_departdelaySet.xml" auf.

die Block-Eigenschaften

Im Block sollte "Warten" = JA eingestellt sein.
Die Abfahrt-Verzögerung kann jeden beliebigen Wert haben - hier im Beispiel werden "4" Sekunden verwendet (siehe Block - Abfahrt-Verzögerung).

In der Liste der Aktionen für diesen Block sollte stehen
- die Aktions-Kennung "ac_departdelaySet" für den Status "in"
- die Aktions-Kennung "ac_departdelaySet" für den Status "depart"

Die anderen Einträge zeigen lediglich den Abfahrt-Verzögerungs-Wert des Blocks in einem Textfeld des Plans an. Sie sind im Test-Arbeitsbereich enthalten. Sie sind für die Funktionalität des Abfahrt-Verzögerungs-Scrips nicht erforderlich.

Was bisher für den Block "bk1" vorgestellt wurde ist dann auch für den Block "bk2" konfiguriert worden in diesem Test-Arbeitsbereich.

Die Lokomotiv-Eigenschaften

Bei der Lokomotive sollte "Benutze Abfahrt-Verzögerung" = JA eingetragen sein (siehe Lokomotive - Abfahrt-Verzögerung verwenden).
Bei der Lokomotive sollte bei Klasse = "DELAY" eingetragen sein (siehe Lokomotive - Klasse).

Test-Reihenfolge

- starte den Automatik-Modus,
- starte jede Lokomotive (bitte nicht "Start Virtual" anwenden),
- simuliere die Rückmelder (durch Anklicken) und
- achte auf die zeitliche Verzögerung, mit der die Lok losfährt.

Bemerkung: der "departdelay" -Wert wird von Rocrail nicht benutzt, wenn die Lokomotive mit "Start Virtual" gestartet wird!
Viel Spass.

Der Arbeitsbereich

Der Arbeitsbereich zum testen des Scripts.

userpages/hermannk/departdelaychange-de.txt · Last modified: 2021/02/28 22:33 by hermannk