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 (update 11.09.2023). |
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. |
- Vorbereitung
- der Status IN
- der Status DEPART
- Änderung des Wertes für die Abfahrt-Verzögerung
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 " />
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"/>
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"/>
Es wird immer noch vorausgesetzt, dass eine Lokomotive der Klasse "DELAY" sich in diesem Block befindet.
Die Datenstruktur des aufrufenden Blockes (%callerid%) soll bezüglich der Abfahrt-Verzögerung ("departdelay") auf den Wert in "#vr_ddS_newValue" geändert werden:
<set vr="vr_ddS_newValue" table="bklist" id="%callerid%" set="departdelay" setint="true"/>
Achtung: es wird das Wert-Attribute ("#") - nicht das Text-Attribut ("@") - bei "#vr_ddS_newValue" angewendet!
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> <set vr="vr_ddS_newValue" table="bklist" id="%callerid%" set="departdelay" setint="true"/> </then> </if> </xmlscript>
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> <set vr="vr_ddS_%callerid%_newValue" table="bklist" id="%callerid%" set="departdelay" setint="true"/> </then> </if> </xmlscript>
Der verwendete Test-Plan sieht so aus. (hier geht es direkt zum Arbeitsbereich -Download.)
Die Aktion hat die Kennung "ac_departdelaySet" und ruft das externe XML-Script "ac_departdelaySet.xml" auf.
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.
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).
- 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.
Update: 11.09.2023
Das XMLscript "ac_departdelaySet.xml" wurde geändert:
alt:
<model cmd="change"> <bk id="%callerid%" departdelay="#vr_ddS_%callerid%_newValue"/> </model>
neu:
<set vr="vr_ddS_%callerid%_newValue" table="bklist" id="%callerid%" set="departdelay" setint="true"/>
Der Arbeitsbereich zum testen des Scripts.