Table of Contents
XMLScript
- Aktionen definieren | Aktions-Steuerung | System-Aktionen | Aktions-Bedingung | XMLScript | Beispiele | Beispiel 2 Bahnübergang
XMLScript ist nur mit gültigem Unterstützungs-Schlüssel verfügbar. |
NICHT FÜR UNERFAHRENE ANWENDER ! ! ! |
---|
Warnung
- Standard-Rocrail-Funktionen nicht durch XMLScript ersetzen.
- Nicht versuchen, die Rocrail-Automatik durch den Wolf zu drehen.
- Die Scripte werden asynchron augeführt und erfordern Kenntnisse in Multithreading-Programmierung.
- Wenn unerwartetes Verhalten auftritt: Die XMLScript-Aktionen deaktivieren.
- Wenn Unsicherheit besteht, kein XMLScript verwenden oder im Forum um Hilfe buitten.
- Nicht die gleichen Variablen in mehreren XMLScripten verwenden, denn die Werte könnten neu gesetzt werden,
was zu unerwarteten Ergebnissen, einschließlich Serverabstürzen führen kann.
H A F T U N G S A U S S C H L U S S
Einführung
Es sollten immer erst die grundlegenden Rocrail-Funktionen bekannt sein, bevor mit XMLScript das Rad neu erfunden wird. |
XML-Skripte können in Kombination mit der Aktion Ext. Programm starten benutzt werden.
Das primäre Ziel von XML-Skripten ist die Vereinfachung und die Reduzierung der Anzahl von Aktionen und Bedingungen.
Das für Skripting verwendete XML ist das gleiche, wie im Rocrail plan.xml.
Voraussetzungen
- UTF-8-kompatibler Editor, z.B. Notepad++ oder Gedit oder der Rocview-interne XML-Editor um eine XML-Datei auf dem Server zu editieren. (unten auf dieser Seite beschrieben)
- Der Windows-Notepad-Editor wird nicht unterstützt.
- Einige Programmier- und XML-Kenntnisse
Empfehlung
- Die XmlScripte kurz sowie ohne lange Pausen (sleep) und lange Schleifen (loop) halten.
Sonst blockiert es das aufrufende Objekt bei der Bearbeitung von Ereignissen und Befehlen, wenn es nicht als Asynchron definiert ist. - Nicht versuchen, den Automatik-Modus zu überlisten; Satttdessen eine Funktions-Erweiterung (feature request) im Forum posten, wenn etwas Grundsätzliches vermisst wird.
- Objekt-Kennungen mit Leerzeichen werden nicht unterstützt; stattdessen Unterstriche verwenden.
- Variablen-/Funktions-Namen dürfen keine Steuerzeichen, wie + - * < > ^ ! = ? % / enthalten.
Einstellung
Leerzeichen in Pfad und Dateiname werden nicht unterstützt!
- XmlScript erzeugen und in einer Datei speichern. (Siehe: Einfaches Beispiel)
- Erzeugen einer "Ext. Programm starten"-Aktion.
- Die XmlScript-Datei auswählen. (Wenn sich die Script-Datei im Arbeitsbereich-Ordner befindet, ist die Pfadangabe nicht erforderlich.)
- Bereit, diese Aktion bei jedem Rocrail-Objekt zu verwenden.
Einfaches Beispiel
Schaltet die Gleisspannung ein und startet den Automatik-Modus:
<xmlscript> <sys cmd="go"/> <auto cmd="on"/> </xmlscript>
Auf dem Server editieren
Das Erzeugen und Editieren von XMlScripten auf dem Server kann über den Aktionsdialog erfolgen:
Öffnen des XmlScript-Editors. Alternativ kann der Editor auch in der Übersicht durch Doppelklick auf eine Aktion geöffnet werden. | Nach Prüfen oder Speichern wurde ein Parser-Fehler1) erkannt. |
Wenn das XMlScript auf dem Server noch nicht existiert, wird ein XMlScript-Skelett erzeugt:
<?xml version="1.0" encoding="UTF-8"?> <xmlscript> </xmlscript>
Wird zu "<xmlscript>" die Erweiterung "<desc="xxx">" angegeben (z. B. der Scriptname), so wird dieser auch im Trace aufgeführt. \
Also z.B:
<?xml version="1.0" encoding="UTF-8"?> <xmlscript desc="Mein_Script.xml"> </xmlscript>
XMLScript-Editor
Finden
Im linken Feld eingegebener Text wird im Script gesucht und markiert.
Suchen und ersetzen
Bei aktivierter Option wird der gefundene Text durch den im rechten Feld eingegeben Text ersetzt.
Prüfen
Prüft, ob das XML-Skript "Well Formed" ist. 2)
Einfügen
Fügt ausgewählte Anweisungen oder Befehle an der Cursor-Position ein.
Die [\n]-Optionen steuern die Line-Feeds (Zeilenvorschub-Zeichen) vor und nach der Anweisung.
macOS
Um diesen Editor zu verwenden, muss die Option "Typographische Interpunktion" deaktiviert sein, um das Erzeugen ungültiger XML's zu vermeiden:
Systemeinstellungen → Sprache & Region → Systemeinstellung "Tastatur" → Text
Mit dieser voreingestellten Option, werden doppelte Bindestriche (--), die in XML-Kommentaren verwendet werden, in einfache lange Bindestriche (—),
sowie ("gerade") Anführungszeichen in typographische (“geschweift”) konvertiert.
Das macht das XMlScript ungültig.
Aufruf-Parameter
Auf Aufruf-Parameter kann durch Variablen mit der Benamung "%param1%…%paramN%" zugegriffen werden.
Siehe: Aktions-Steuerung Parameter
Beispiel-Schnipsel:
<xmlscript> <if condition="%frombkid% # %param1%"> <then> </then> </if> </xmlscript>
Anweisungen
foreach
Die foreach-Schleife wird für "tu dieses mit allem in dieser Tabelle" verwendet, optional mit einer Bedingung und/oder einem Status.
Die Schleife kann mit einer break- oder exit-Anweisung gestoppt werden.
Wenn die Bedingung und/oder der Status nicht passt, wird zum nächsten Objekt in der Tabelle gesprungen.
<xmlscript> <foreach table="lclist" condition="#var2%oid% < &time|#var1 < &time" alltrue="true"> <fn fnchanged="3" f3="true"/> <vr id="var2%oid%" text="empty"/> <vr id="var2%oid%" value="0"/> <lc cmd="go"/> <sleep time="10"/> </foreach> </xmlscript>
Dieses Skript wird die Lok-Tabelle iterieren3), für jede Lok die Funktion 3 (F3) einschalten und das Start-Kommando (go) geben.
Die oid, die Kennung des aktuellen Objekts in der Liste, wird in der foreach-Schleife automatisch generiert.
Falls die Tabelle lclist ist, kann auch die Kurzkennung verwendet werden: %soid%".4)
<xmlscript> <foreach table="lclist" condition="%lcclass% # BA"> <lc cmd="go"/> </foreach> </xmlscript>
Diese foreach-Schleife startet alle Loks mit der Klasse BA.
<xmlscript> <foreach table="lclist" state="co Test = on"> <if state="lc %oid% = Block3|lc %oid% = Block2|lc %oid% = Block1" alltrue="false"> <then> <lc cmd="go"/> </then> </if> </foreach> </xmlscript>
Startet jede Lok, die sich in Block 'Block3', 'Block2' oder 'Block1' befindet.
while
Die while-Anweisung ist eine Schleife und kann Bedingungen, Status und Klassen prüfen. Zumindest eines davon sollte definiert sein, sonst wird die while-Schleife nicht ausgeführt.
Solange die Anweisung wahr ist, werden die Befhle im while ausgeführt.
<xmlscript> <vr id="var1" value="0"/> <while condition="#var1 < 10" max="100"> <vr id="var1" value="#var1 + 1"/> <continue condition="#var1 = 4" cmt="var1 is 4"/> <sys cmd="go"/> </while> </xmlscript>
Wenn die while-Schleife endlos ist, wird sie gestoppt, wenn das max-Attribut erreicht wird, das auf 10 voreingestellt ist.
Höhere Werte als 100 werden auf 100 begrenzt, um Serverblockierungen und Unfälle automatisch fahrender Lokomotiven zu vermeiden.
if
Die if-Anweisung wird für die Ablauf-Steuerung verwendet und kann Bedingungen, Status und Klassen prüfen.
Wenn die Anweisung wahr ist, werden die Befehle im then ausgeführt, wenn sie nicht wahr ist, werden die else-Befehle ausgeführt.
Das else ist optional.
<xmlscript> <if condition="#var1 < &time" state="sg sem3 = green" class="bk 4711 = AB" alltrue="true" connect="and"> <then> <lc id="@loco" cmd="go"/> <tx id="booster1" format="var1 is #var1"/> </then> <else> <lc id="@loco" cmd="stop"/> <lc id="@loco" cmd="classset" class="AB"/> <bk id="4711" cmd="classdel" class="AB"/> <bk id="4711" cmd="classadd" class="CD"/> </else> </if> </xmlscript>
Der Text-Inhalt der Variable loco enthält die Lok-Kennung.
Wenn die Lok-Kennung nicht existiert, wird nach einem Block mit dieser Kennung gesucht und im Falle das dieser existiert, wird die Lok-Kennung in dem Block verwendet.
Sowohl condition als auch state können in der if-Bedingung verwendet werden. Mindestens eines von beiden muss angegeben werden.
<xmlscript> <if state="st b1-b2 = locked|st b2-b3 = locked" alltrue="false"> <then> <tx id="tx1" format="route is locked"/> </then> <else> <tx id="tx1" format="route not locked"/> </else> </if> </xmlscript>
Text tx1 zeigt "route is locked" wenn Fahrstrasse "b1-b2" ODER Fahrstrasse"b2-b3" den Status locked hat.
Ist keine der Routen im Status locked, zeigt tx1 "route not locked".
switch
Der Ganzzahlwert der Variablen wird verwendet, um den Fall mit dem gleichen Wert auszuwählen.
Wenn nichts passendes gefunden wird, wird der voreingestellte Wert verwendet, falls er definiert ist.
Zahlen-Beispiel
<xmlscript> <switch var="#var1"> <case val="0"> <sys cmd="go"/> </case> <case val="1"> <auto cmd="on"/> </case> <default> <sys cmd="stop"/> </default> </switch> </xmlscript>
Eine case-Anweisung kann mehrere Ganzzahlwerte in folgendem Format enthalten:
<case val="0|1|5|8">
Einer der Werte muss passen.
Zeichenketten-Beispiel
<xmlscript> <switch var="%callerid%"> <case val="loco1"> <sys cmd="go"/> </case> <case val="but1"> <sys cmd="reset"/> </case> </switch> </xmlscript>
Hinweis: Eine switch-Anweisung hat nichts mit einem Rocrail-Weichen-Objekt zu tun. Es entspricht z.B. "select case"
anderer Programmiersprachen.
call
Funktionen müssen auf der ersten Ebene des XMLScripts deklariert werden und eine Kennung (ID) haben.
Aufruf (call) mit der gewünschten ID: <call id="doeIets"/>
5)
Mehrere Funktionen sind erlaubt.
Auf Parameter kann durch %subparam1%
…%subparamN%
zugegriffen werden.
<xmlscript> <function id="doeIets" param="test1,test2"> <tx id="tx1" format="function doeIets"/> </function> <switch var="#var1"> <case val="0"> <sys cmd="go"/> </case> <default> <sys cmd="stop"/> <call id="doeIets"/> </default> </switch> </xmlscript>
Einschränkungen
- Calls in Funktionen werden nicht unterstützt.
- Max. Aufruf Tiefe ist 5.
exit
Zum Verlassen des XML-Skrips. cmt=“reason” kann für die Ablaufverfolgung (Tracing) angegeben werden.
<xmlscript> <if condition=""> <then> <exit cmt="Test."/> </then> </if> </xmlscript>
break
Beendet eine foreach- und while-Schleife mit oder ohne Bedingung. cmt=“reason” kann für die Ablaufverfolgung (Tracing) angegeben werden.
Diese Anweisung hat keinen Effekt, wenn sie nicht innerhalb einer foreach-Schleife erfolgt.
<xmlscript> <foreach table="lclist"> <if condition=""> <then> <break cmt="Test."/> </then> </if> </foreach> </xmlscript>
trace
XmlScript-Traces werden in Rocview in grüner Farbe angezeigt.
<xmlscript> <trace text="Hi there! I'm %callerid%. :)"/> </xmlscript>
sleep
Eine Pausen-Zeit in ms.
<xmlscript> <foreach table="lclist"> <if condition=""> <then> <sleep time="100"/> </then> </if> </foreach> </xmlscript>
sub
Ruft ein anderes XML-Skript mit file=“script.xml”
und mit Funktion id="functionName"
auf.
<xmlscript> <sub file="lib1.xml" id="doeIets" param="test1,test2"/> </xmlscript>
Wenn die Funktions-ID auf Unterstrich, id="_", eingestellt wird, wird das gesamte XML-Script außer den Funktions-Definitionen ausgeführt.6)
Wenn keine Funktions-ID eingestellt ist, wird die %oid% verwendet, um eine passende Funktion zu finden.
Auf Parameter kann durch %subparam1%
…%subparamN%
zugegriffen werden.
Bibliotheks-Beispiel lib1.xml:
<xmlscript> <function id="doeIets"> <sys cmd="stop"/> </function> </xmlscript>
Die Funktions-ID muss zum Aufruf von Funktionen aus einer XMlScript-Bibliotheks-Datei verwendet werden.
Sehr hilfreich, wenn mehrere XMlScripte sich gemeinsam Funktionen teilen.
query
Mit der query-Anweisung (Abfrage) kann eine Variable verwendet werden, um das Attribut Text oder Integer-Wert eines bestimmten Objekts zu erhalten.
Ein query bietet nur Objekt-Eigenschaften, aber keine Laufzeit-Informationen.
<query vr="var1" table="waybilllist" id="%oid%" get="cartype"/>
Nach dem query kann die Variable für Vergleiche von Text und/oder Zahlen verwendet werden. Normaler Text hat einen Null-Wert als Ergebnis.
Um einen Wert von einem Sub-Knoten zu erhalten:
<query vr="var1" table="sclist" id="%oid%" sub="scentry" subidx="3" get="text"/>
Anstelle von subidx
kann auch subid
verwendet werden, wenn der Sub-Knoten eine Kennung (ID) hat.
Query-Variable müssen XMLScript-eindeutig sein, um unerwartete Ergebnisse zu vermeiden. |
Funktions-Beispiel
Die Lok-Kennung, locid, wird vom Block cb4 in Variable lcid abgerufen.
Der Funktions-Befehl erfordert eine Lok-Kennung, die vom Textinhalt der Variablen @lcid bereitgestellt wird. .
<xmlscript> <query vr="lcid" table="bklist" id="cb4" get="locid"/> <fn id="@lcid" fnchanged="3" f3="true"/> </xmlscript>
set
Mit der set-Anweisung (Einstellen)kann eine Variable verwendet werden, um das Attribut Text oder Integer-Wert eines bestimmten Objekts, abhängig von setint
zu setzen.
<set vr="var1" table="waybilllist" id="%oid%" set="cartype" setint="false"/>
Um einen Wert eines Sub-Knotens einzustellen:
<set vr="var1" table="sclist" id="%oid%" sub="scentry" subidx="3" set="text" setint="false"/>
Anstelle von subidx
kann auch subid
verwendet werden, wenn der Sub-Knoten eine Kennung (ID) hat.
clock
15401+ |
Mit dem "clock get"-Befehl:
<clock cmd="get"/>
werden drei Variable aktualisiert.
Variablen-Name | Wert | Text |
---|---|---|
modeltime | Stunde * 3600 + Minute * 60 + Sekunden | hh:mm.ss |
realtime | Stunde * 3600 + Minute * 60 + Sekunden | hh:mm.ss |
systemtick | Anzahl von 10ms seit Rocrail-Server-Start | - |
Der systemtick läuft bei 4294967295 (119,3 Stunden) auf 32bit und 18446744073709551615 auf 64bit-Systemen über.
Format von Bedingungen
Wert | Komparator | Wert |
Weitere Bedingungen müssen mit einem Pipe-Zeichen (senkrechter Strich: | ) ohne zusätzliche Leerzeichen getrennt werden.
condition="#var2%oid% < &time|#var1 < &time"
Für mögliche Variable siehe: Text-Variable
System-Variablen | |
---|---|
&time | Modell-Zeit in Sekunden |
Komparatoren | |
---|---|
= | gleich; Zahlen |
! | nicht gleich; Zahlen |
# | gleich; Text |
- | nicht gleich; Text |
> | größer als; Zahlen |
< | kleiner als; Zahlen |
~ | enthält; Text (@var_1 ~ @var_2 ist wahr, wenn der Text in @var_2 im Text von @var_1 enthalten ist.) ab rocrail 2.1.1010 |
alltrue
Alltrue ist standardmäßig 'true', wenn es nicht angegeben wird.
Wenn alltrue auf 'false' gesetzt wird, muss nur eine der Bedingungen "condition"/"state"/"class" wahr sein.
connect
Falls die if-Anweisungen "condition", "status" und/oder "class" enthalten, sind diese standardmäßig mit and verknüpft.
Wenn nur einer der Werte wahr sein muss, kann das "connect"-Attribut auf or gesetzt werden.
Format von Status/Klassen
Objekt-Typ | Objekt-Kennung ohne Leerzeichen | Komparator | Status-/Klassen-Wert |
Die Werte müssen mit Leerzeichen getrennt werden.
state="st b1-b2 = locked|st b2-b3 = locked"
Objekt-Kennungen dürfen keine Leerzeichen enthalten! Stattdessen z.B. Unterstriche oder Punkte verwenden.
Komparatoren | |
---|---|
= | Status: gleich |
! | Status: nicht gleich |
Status-Objekte
Objekt-Name | Objekt-Typ | Status-Werte | Hinweis |
---|---|---|---|
Signal | sg | red, green, yellow, white, blank, aspect number | |
Weiche | sw | left, right, straight, turnout, locked, free, unlocked, open, closed | |
Rückmelder | fb | true, false, on, off | on und off sind alternativ: true = on; false = off |
Ausgang | co | on, off, active | |
Ortschaft | location | free | Der 'frei'-Status prüft, ob die Lok erlaubt ist und ob ein Ortschafts-Block frei ist. |
Block | bk | free, !free, occupied, closed, open, reserved | |
Drehsscheibe | tt | free, occupied, closed, open, reserved, #, pending | Das Zeichen # steht für die aktuelle Brückenposition. Der Status pending ist wahr, während sich die Brücke bewegt. |
Fahrstraße | st | free, locked, unlocked, closed | |
System | sys | go, stop | |
Automode | auto | on, off | |
Lokomotive | lc | fwd, rev, +, -, min, mid, cruise, max, block, "blockID", steam, diesel, electric, automobile, idle, wait, automatic, f0…f28, home, shunting, train, !train | block ist wahr, wenn die Lok in einem Block ist "blockID" ist wahr, wenn die Lok in einem Block mit "blockID" ist train ist wahr, wenn der Lok ein Zug zugeordnet ist !train ist wahr, wenn der Lok kein Zug zugeordnet ist |
Wagen | car | empty, loaded, maintenance, cartype, waybill, f0…f28, "blockID" | Siehe Lokomotive |
Frachtschein | waybill | waiting, shipping, delivered, "destinationID", "originID" | |
Text | tx | on, off | Falls der Typ "Schalter" eingestellt ist. |
Klassen-Objekte
Objekt-Name | Objekt-Typ |
---|---|
Block | bk |
Lok | lc |
Fahrstraße | st |
Befehle
Objekt-Name | Objekt-Typ | Befehle | Status | Hinweise | Beispiel |
---|---|---|---|---|---|
Lok | lc | Alle https://wiki.rocrail.net/rocrail-snapshot/rocrail/wrapper-en.html#lc | Das Block-Kennungs-Attribut (bkid) kann verwendet werden, um die Lok-Kennung von einem Block zu erhalten. Befehl "regularreset" ist mit "softreset" gleich, aber es entfernt auch den zugewiesenen Fahrplan. | ||
Funktion | fn | Alle und fndesc, fncmd, group 1..7 | Das Funktionsänderungs-Attribut (fnchanged) oder die Funktions-Beschreibung (fndesc) signalisieren, welche Funktion geändert wurde: f0…f28 (true/false) Der Funktions-Befehl (fncmd) kann für on/off/flip verwendet werden. group wird mit Loconet benötigt | <fn id="loco1" fndesc="Horn" fncmd="flip" group="2"/> F1-F4 group="1" F5-F8 group="2" … F25-F28 group="7" |
|
Weiche | sw | Alle | <sw id="W5" cmd="close"/> | ||
Signal | sg | Alle | |||
Zubehör-Gruppe | accgroup | on, off, flip | |||
Ausgang | co | Alle | <co id="S1" cmd ="on"/> | ||
Gleisspannung | powercmd | on, off | Die ID ist die Booster-Kennung. Wenn leer, gilt der Befehl für alle Booster | ||
Block | bk | Alle, reservieren | open, closed | Im Fall des Reservieren-Befehl Lok-Kennung (lcid) verwenden. | <bk id="x" state="closed"/> |
Rückmelder | fb | Alle, on, off, flip | <fb id="AF" cmd="on"/> | ||
Fahrstraße | st | go, lock, free, classset, classadd, classdel | Die Befehle "lock" und "free" benötigen das zusätzliche Attribut locid="myLoco". | <st id="x" state="closed"/> | |
Text | tx | showon, showoff, blink, on, off, click | Update-Ereignis durch Format-Attribut. Die optionalen bkid und lcid können auch im Befehl verwendet werden. | <tx id="tx1" format="the loco id is %lcid%"/> <text id="xyz" cmd="blink" blink="true"/> |
|
Variable | vr | random, start, stop start, length (for substring) | Setzen durch Attribute: value="0" (Wert) text="zero"; (Wert-Text). Um sie nur temporär anzulegen generated="true" setzen. Update: mit 2.1.3268+ ist das der Standard-Wert. Um sie statisch anzulegen generated="false" setzen. | <vr id="var1" text="Rocrail"/> <vr id="var2" text="@var1-XML-Scripting." tokeniser="-"/> <vr id="var2" text="@var1" start="1" length="3"/> |
|
Aktionskontrolle | actionctrl | Die Kennung in der Aktionskontrolle ist eine Referenz auf ein existierendes Objekt. Bedingungs-Kind-Knoten können hinzugefügt werden. | |||
Fahrdienstleiter | operator | emptycar, loadcar, addcar, leavecar. | Im Wagen-Kennungs-Attribut (carids) muss eine kommaseparierte Liste von Wagen-Kennungen spezifiziert werden. | ||
System | sys | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#sys | |||
Automat | auto | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#auto | |||
Wagen | car | empty, loaded, maintenance, assignwaybill, resetwaybill, loco & function | empty, loaded, maintenance, cartype, location | <car id="test" cmd="assignwaybill" waybill="testbill"/> | |
Aufstellblock | sb | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#sb | |||
Fiddle Yard | seltab | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#seltab | |||
Ortschaft | location | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#location | <location id="Blaak" cmd="info" svalue="tx1"/> | ||
Uhr | clock | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#clock | Modellzeit auf Systemzeit einstellen: <clock divider="1" hour="%syshour%" minute="%sysmin%"/> |
||
Drehscheibe | tt | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#tt | |||
Extern | ext | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#ext | |||
Wetter | weather | setweather, weathertheme, go, stop | |||
Licht | light | flip, enable, disable | Aktiviert ein Licht von LightControl. | ||
Licht-Steuerung | lightctrl | go, stop | Aktiviert / deaktiviert die Licht-Steuerung (LightControl). | <lightctrl cmd="go"/> <lightctrl cmd="stop"/> |
|
Model | model | Alle https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#model | Kommando "modify" wird nicht unterstützt → Stattdessen "change" verwenden. | <model cmd="change"> <tx id="x" backred="255" backgreen="0" backblue="0"/> </model> |
|
Geschwindigkeits- Messstrecke | mv | reset, sets1, sets2, setdistance, setdistanceR, setcalibrate, setcalctrainlen | <mv cmd="sets2" s2="fb4712"/> <mv cmd="setcalibrate" calibrate="true"/> |
Attribut-Werte
Wenn ein Befehls-Attribut-Wert mit einem Fragezeichen '?' beginnt, wird er durch den Attribut-Wert des darauf bezogenen Objekts ersetzt.
Beispiel:
<lc id="loco1" cmd="useschedule" scheduleid="?startupscid"/>
Der Wert "?startupscid" wird ersetzt durch startupscid von loco1:
20160422.085709.015 r9999I tid0x8BA OXmlScri 0571 execute [lc] id[loco1] cmd[useschedule] oid[] callerid[wefiu] 20160422.085709.016 r9999I tid0x8BA OXmlScri 0521 replaced attribute value: scheduleid="?startupscid" with "1-2" 20160422.085709.017 r9999a tid0x8BA OLoc 3644 <lc id="loco1" cmd="useschedule" scheduleid="1-2"/>
Objekt-Kennungen
Die Objekt-Kennungen können Variable enthalten.
Siehe für mögliche Variable: Text-Variable
Beispiel
<xmlscript> <tx id="%callerid%-%substate%" format="%lcimg%"/> </xmlscript>
System-Variablen
Variablen-Formatierung
Mit dem Format-Attribut ist es möglich, Variablen-Inhalt auf die gleiche Art zu formatieren, wie printf
.
Beispiel
<xmlscript> <vr id="var1" value="3" text="Hello"/> <vr id="var2" value="5" text="RocrailFans"/> <vr id="var3" format="%s%02d:%04d%s" text="@var1 #var1 #var2 @var2"/> <trace text="@var3"/> </xmlscript>
Ausgabe mit dem Format-Attribut sieht so aus:
Hello03:0005RocrailFans
Ausgabe ohne das Format-Attribut sieht so aus:
Hello 3 5 RocrailFans
Variablen-Namen
Innerhalb oben beschriebener Grenzen können Variablen-Namen frei gewählt werden; aber es kann vorkommen, daß zwei gleichnamige Variablen in zwei unterschiedlichen Skripten, die zur gleichen Zeit aufgerufen werden, Konflikte hervorrufen, Solche Fälle kann man vermeiden, indem man die Variablen-Namen je Script mit einem eigenen Präfix versieht:
- der ursprüngliche Variablen-Name "vr_idx"
- wird im Script "MeinScriptNummer1.xml" geändert zu "vr_MSN1_idx" und
- wird im Script "MeinScriptNummer2.xml" geändert zu "vr_MSN2_idx" und
Temporäre Variablen
Um eine Variable von Laufzeit zu Laufzeit in Rocrail zu speichern, muss diese Variable als „generiert“ "false" definiert werden:
Beispiel
<xmlscript> <vr id="vr_MSN3_zuletztBenutzteLokomotive" value="0" text="br89" generated="false"/> <vr id="vr_MSN3_tmp" value="0" text=""/> </xmlscript>
Die Variable "vr_MSN3_zuletztBenutzteLokomotive" wird in der Rocrail Plan-Datei gespeichert.
Die Variable "vr_MSN3_tmp" wird nicht in der Rocrail Plan-Datei gespeichert, sondern mit dem Beenden von Rocrail gelöscht.
Tipps
Regelkonformes XML
Um das XML-Skript auf Konformität zu überprüfen, kann es mit einem Web-Browser geöffnet werden.
Einige Zeichen müssen dafür durch Escape-Codes ersetzt werden:
Zeichen | Code |
---|---|
< | < |
& | & |
> | > |
Beispiel
Folgendes ist nicht regelkonform, wird aber vom Rocrail-XML-Parser akzeptiert:
condition="#var2%oid% < &time"
Um dieses Beispiel mit einem Web-Browser zu überprüfen muss es wie folgt abgeändert werden:
condition="#var2%oid% < &time"
Das geänderte Beispiel ist für den Rocrail-XML-Parser ebenfalls gültig.