![]() |
PAS POUR LES UTILISATEURS DÉBUTANTS !!! |
---|
Vérifier les fonctionnalités de base de Rocrail avant de réinventer la roue avec les scripts XML.
Le script XML peut être utilisé en combinaison avec l'action exécuter un programme externe .
Son objectif principal est de simplifier et de réduire le nombre d'action et de conditions.
Le script XML utilisé est le même que celui utilisé dans Rocrail plan.xml.
Les espaces dans le chemin d'accès ou le non de fichier ne sont pas autorisés!
Mettre le réseau sous tension et démarrer le mode auomatique :
<xmlscript> <sys cmd="go"/> <auto cmd="on"/> </xmlscript>
Pour créer et modifier les Scripts Xml sur le serveur, la boite de dialogue d'action peut être utilisée:
Si le Script Xml n'existe pas déjà sur le serveur, une ossature script Xml sera créé:
<?xml version="1.0" encoding="UTF-8"?> <xmlscript> </xmlscript>
L'éditeur de Script Xml peut également être ouvert en double-cliquant sur l'index.
Si le "<Script Xml>" est modifié avec la description "<desc="xxx">" (par exemple, nom du Script ), la description sera affichée dans l'emplacement. Par exemple.
<?xml version="1.0" encoding="UTF-8"?> <xmlscript desc="My_Script.xml"> </xmlscript>
Vérifiez si le code Xml est "bien formé". 1)
Insérez l'instruction ou la commande sélectionnée en position de curseur.
Le [\n] de la boite de dialogue contrôle les flux de lignes avant et après l'instruction.
Pour utiliser cet éditeur, l'option "Utilisez les guillemets et les tirets" doit être désactivée pour éviter de créer un Xml invalide:
Préférence du système → Language & Région → Préférence Clavier → Texte
Avec cette option activée par défaut, elle convertit automatiquemen les deux tirets (--), utilisés en commentaires Xml, dans les signes (—), les guillemets rectilignes et caractères typographiques de type (“curly”).
.
Cela rendra le Script Xml non valide.
Les paramètres d'appel peuvent être accessible par des variables avec le nommage "%param1%…%paramN%".
Voir: Paramètre de contrôle d'action
Fragment:
<xmlscript> <if condition="%frombkid% # %param1%"> <then> </then> </if> </xmlscript>
La boucle foreach est utilisée pour "faire ceci à tout dans cette table" avec une condition optionnel d'état Et/Ou.
La boucle peut être arrêtée avec une déclaration de pause ou de sortie.
Si la condition d'état Et/Ou ne correspond pas, il passe à l'objet suivant dans ce tableau.
<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>
Ce Script itérait la table locomotive et allumera la fonction 3 et donnera la commande Go pour chaque locomotive.
L'oid, l'ID de l'objet actuel dans la liste, est automatiquement généré dans la boucle.
dans le cas ou le tableau est lclist, l'ID courte peut également être utilisée: %soid%".2)
<xmlscript> <foreach table="lclist" condition="%lcclass% # BA"> <lc cmd="go"/> </foreach> </xmlscript>
Cette "foreach" démarre chaque locomotive avec la classe 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>
Démarrer chaque locomotive qui réside dans le 'Bloc3', 'Bloc2' ou 'Bloc1'.
L'instruction while est une boucle et peut vérifier, le statut et la classe. Au moins l'un d'entre eux devrait être défini, sinon la boucle while ne sera pas exécutée.
Tant que l'instruction est vraie, les commandes dans while seront exécutées.
<xmlscript> <vr id="var1" value="0"/> <while condition="#var1 < 10" max="10"> <vr id="var1" value="#var1 + 1"/> <continue condition="#var1 = 4" cmt="var1 is 4"/> <sys cmd="go"/> </while> </xmlscript>
Si la boucle while est sans fin, elle sera arrêtée par l'attribut max qui de par défaut de 10.
Les valeurs maximales supérieures à 100 seront tronquées à 100 pour éviter le blocage et le plantage du serveur automatiquement lorsque les locomotives fonctionnent.
L'instruction if est utilisée pour le contrôle du flux et peut vérifier la condition, les états et la classe.
Si la déclaration est vraie, les commandes seront alors (then) exécutées, Sinon (else) ce n'est pas vrai, les autres commandes seront exécutées.
Le else est optionel.
<xmlscript> <if condition="#var1 < &time" state="sg sem3 = green" class="bk 4711 = AB" alltrue="true"> <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>
La valeur de la variable texte de la loco contient l'ID de la locomotive.
Si l'ID de la locomotive n'existe pas, un bloc sera recherché par cette identification et, s'il existe l'identification de la locomotive dans le bloc sera utilisé.
Lacondition et l' état peuvent être utilisés dans l'instruction if . Au moins une d'entre elles doit être spécifiée.
<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>
Le texte tx1 est défini sur "Itinéraire est verrouillé " si l'itinéraire "b1-b2" OU l'itinéraire "b2-b3" est en état verrouillé.
Si ces itinéraires ne sont pas verrouillés, le texte tx1 est défini "Itinéraire non verrouille".
La valeur entière de Switch var est utilisée pour sélectionner la "case" avec la même valeur.
Si aucune correspondance n'a été trouvée, la valeur par défaut sera utilisée au cas où elle serait définie.
<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>
Les valeurs de cas multiples sont obsolètes, et sont fortement déconseillés à utiliser.
Un cas peut avoir plusieurs valeurs entières dans le format suivant:
<case val="0|1|5|8">
Une des valeurs doit correspondre.
<xmlscript> <switch var="%callerid%"> <case val="loco1"> <sys cmd="go"/> </case> <case val="but1"> <sys cmd="reset"/> </case> </switch> </xmlscript>
Note: Une déclaration "switch" n'a rien à voire avec l'objet-switch Rocrail .
Les fonctions doivent être déclarées dans le premier niveau de Sript Xml et doivent avoir défini l'ID.
Appelez la fonction avec l'ID souhaité: <call id="doeIets"/>
Plusieurs fonctions sont autorisées.
les paramètres sont accessibles par %subparam1%…%subparamN%.
<xmlscript> <function id="doeIets"> <tx id="tx1" format="function doeIets"/> </function> <switch var="#var1"> <case val="0"> <sys cmd="go"/> </case> <default> <sys cmd="stop"/> <call id="doeIets" param="test1,test2"/> </default> </switch> </xmlscript>
Quitez le Script Xml. Le cmt="reason" peut être utilisé pour le traçage
<xmlscript> <if condition=""> <then> <exit cmt="Test."/> </then> </if> </xmlscript>
Termine pour chaque et pendant une boucle avec ou sans condition. Le cmt="reason" peut être utilisé pour le traçage.
Cette déclaration n'a aucun effet si elle n'est pas dans une boucle "foreach".
<xmlscript> <foreach table="lclist"> <if condition=""> <then> <break cmt="Test."/> </then> </if> </foreach> </xmlscript>
Les traces Script Xml seront de couleur verte dans Rocview.
<xmlscript> <trace text="Hi there! I'm %callerid%. :)"/> </xmlscript>
Un temps de sommeil en ms.
<xmlscript> <foreach table="lclist"> <if condition=""> <then> <sleep time="100"/> </then> </if> </foreach> </xmlscript>
Appelez un autre Script Xml avec un file="script.xml" et la fonction id="functionName"
<xmlscript> <sub file="lib1.xml" id="doeIets" param="test1,test2"/> </xmlscript>
Si l'ID de la fonction est définie au caractère de soulignement id="_", l'intégralité du Script Xlm sera exécuté à l'exclusion des définitions de fonction.3)
Si aucune ID de fonction n'est définie %oid% sera utilisé pour trouver une fonction d'ajustement.
Les paramètres sont accessibles par %subparam1%…%subparamN%.
Exemple librairie lib1.xml:
<xmlscript> <function id="doeIets"> <sys cmd="stop"/> </function> </xmlscript>
L'ID de fonction doit être utilisé pour appeler des fonctions à partir d'un fichier de bibliothèque Script Xml.
Le plus utile si plus d'un Script Xlm partage des fonctions communes.
Avec l'instruction query, une variable peut être utilisée pour obtenir le texte de l'attribut et la valeur entière d'un certain objet.
Une requête ne fournit que des propriétés d'objet et aucune information d'exécution.
<query vr="var1" table="waybilllist" id="%oid%" get="cartype"/>
Aprés la requête, la variable peut être utilisée pour comparer le texte et/ou les chiffres. Le texte normal aura un résultat de valeur nulle.
Pour obtenir une valeur à partir d'un "sous-nœud":
<query vr="var1" table="sclist" id="%oid%" sub="scentry" subidx="3" get="text"/>
Au lieu de subidx le subid peut également être utilisé si le "sous-nœud" a une ID.
Les variables de requête doivent être uniques dans XMLScript pour éviter des résultats inattendus. |
L'identifiant de locomotive, locid, est extrait du bloc cb4 dans la variable lcid.
La commande de fonction nécessite un identifiant de locomotive, qui est fournie par le contenu textuel de la variable @lcid.
<xmlscript> <query vr="lcid" table="bklist" id="cb4" get="locid"/> <fn id="@lcid" fnchanged="3" f3="true"/> </xmlscript>
Avec l'instruction"set", une variable peut être utilisée pour définir le texte d'attribut ou la valeur entière d'un certain objet.
<set vr="var1" table="waybilllist" id="%oid%" set="cartype" setint="false"/>
Pour définir une valeur d'un"sous-nœud":
<set vr="var1" table="sclist" id="%oid%" sub="scentry" subidx="3" set="text" setint="false"/>
Au lieu de subidx le subid peut être utilisé si le sous-nœud a une ID.
15401+ |
Avec la commande clock get:
<clock cmd="get"/>
Trois variables seront mise à jour.
Nom de la variable | Valeur | Texte |
---|---|---|
modeltime | heure * 3600 + minute * 60 + secondes | hh:mm.ss |
realtime | heure * 3600 + minute * 60 + secondes | hh:mm.ss |
systemtick | comptage par tranche de 10ms depuis que le serveur Rocrail a démarré | - |
Le systemtick débordera à 4294967295(119.3 heures) sur 32 bits et 18446744073709551615 sur les systèmes 64 bits.
valeur | comparateur | valeur |
Les conditions supplémentaires doivent être séparées avec un caractère spécifique "|" sans blanc supplémentaire:
condition="#var2%oid% < &time|#var1 < &time"
Voir les variables : Variables texte
Variables Système | |
---|---|
&time | modèle de temps en secondes |
Comparateurs | |
---|---|
= | nombre égal |
! | nombre inégal |
# | texte égal |
- | texte inégal |
> | plus grand que le nombre |
< | plus petit que le nombre |
~ | contient du texte (@var_1 ~ @var_2 est vrai, quand le texte de var_1 contient complètement le texte de var_2) - depuis la version 2.1.1010 |
alltrue est vrai par défaut s'il n'est pas défini.
Si alltrue est mis à "faux" pour une seule des conditions, l'un des états et l'une des classes doivent être vrais.
Dans le cas où les instructions if contiennent des conditions, les états ou les classes, ceux-ci sont connectés par défaut avec and.
Si un seul des éléments doit être vrai, l’attribut connect peut être défini sur or.
Type d'objet | ID d'object sans blancs | Comparateur | Valeur Etat/Classe |
Les valeurs doivent être séparées par des blancs.
Les états supplémentaires doivent être séparés avec un caractère de type |sans blanc supplémentaire:
state="st b1-b2 = locked|st b2-b3 ! locked"
Les ID d'objet avec des espaces ne sont pas pris en charge; Utilisez plutôt des caractères de soulignement ou des points.
Comparateurs | |
---|---|
= | Etat égal |
! | Etat inégal |
Nom de l'objet | Type d'objet | Valeur d'état | Remarques |
---|---|---|---|
Signal | sg | red, green, yellow, white, blank, aspect number | |
Switch | sw | left, right, straight, turnout, locked, free, unlocked | |
Sensor | fb | true, false, on, off | true (vrai) = on, false (faux) = off |
Output | co | on, off, active | |
Location | location | free | L'état 'free' vérifiera si la locomotive est autorisée et si un bloc d'emplacement est libre. |
Block | bk | free, occupied, closed, open, reserved | |
Turntable | tt | free, occupied, closed, open, reserved, #, pending | Le # représente la position courante du pont. Si l'état en attente est vrai, le pont se déplace. |
Route | st | free, locked, unlocked, closed | |
System | sys | go, stop | |
Automode | auto | on, off | |
Locomotive | lc | fwd, rev, +, -, min, mid, cruise, max, block, "blockID", steam, diesel, electric, automobile, idle, wait, auto, f0…f28 | bloc est vrai si la loco est dans un bloc "blockID" est vrai si la locomotive est dans un bloc avec son "blockID" train est vrai si un train est assigné à la locomotive !train est vrai si aucun train n'est assigné à la locomotive |
Car | car | empty, loaded, maintenance, cartype, waybill, "blockID" | voir locomotive |
Waybill | waybill | waiting, shipping, delivered, "destinationID", "originID" | |
Text | tx | on, off | Si l'option interrupteur à bascule est activée. |
Nom de l'objet | Type d'Objet |
---|---|
Block | bk |
Loco | lc |
Route | st |
Note:
Nom de l'objet | Type d'objet | Commandes | Etats | Remarques | Exemple | |
---|---|---|---|---|---|---|
Loco | lc | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#lc | l'attribut "bkid" peut être utilisé pour obtenir un ID de locomotive dans un bloc. La commande "regularreset" est identique à "softreset" mais supprime également le calendrier assigné. | |||
Function | fn | All and fndesc, fncmd, group 1..7 | La description de fonction "fnchanged" ou le "fndesc", attribut les signaux dont la fonction a été modifiée: f0…f28 (true (vrai)/false(faux)). Le fncmd peut être utilisé pour la bascule on/off. | <fn id="loco1" fndesc="Horn" fncmd="flip" group="2"/> F1-F4 group="1" F5-F8 group="2" … F25-F28 group="7" | ||
Switch | sw | All | ||||
Signal | sg | All | ||||
Accessory Group | accgroup | on, off, flip | ||||
Output | co | All | ||||
Power | powercmd | on, off | L'"id" est le "boosterID". Si laissé vide la est pour tous les boosters | |||
Block | bk | All, reserve | open, closed | Utilisez "lcid" en cas de commande "reserve". | <bk id="x" state="closed"/> | |
Sensor | fb | All, on, off, flip | ||||
Route | st | go, lock, free, classset, classadd, classdel | open, closed | La commande verrouillage et déverrouillage nécessite l'attribut supplémentaire locid="myLoco". | <st id="x" state="closed"/> | |
Text | tx | showon, showoff, blink, on, off, click | Événement de mise à jour de l'attribut format. L'option bkid et lcid peuvent être utilisés dans la commande également. | <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) | Valeur de l'attribut: valeur="0" texte="zero" Pour le rendre temporaire régler generated="true" Mise à jour: avec 2.1.3268+ c'est la valeur par défaut Pour la rendre statique réglez generated="false" | <vr id="var1" text="Rocrail"/> <vr id="var2" text="@var1-XML-Scripting." tokeniser="-"/> <vr id="var2" text="@var1" start="1" length="3"/> | ||
Action control | actionctrl | l'"id" dans l'"actionctrl" est une référence à une action existante. Condition, ajoutez des "nœuds-enfants". | ||||
Operator | operator | emptycar, loadcar, addcar, leavecar | Dans l'attribut "carids" une liste de viture doit être spécifiée . | |||
System | sys | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#sys | ||||
Automat | auto | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#auto | ||||
Car | car | empty, loaded, maintenance, assignwaybill, resetwaybill, loco & function | empty, loaded, maintenance, cartype, location | <car id="test" cmd="assignwaybill" waybill="testbill"/> | ||
Staging block | sb | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#sb | ||||
Fiddle Yard | seltab | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#seltab | ||||
Location | location | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#location | <location id="Blaak" cmd="info" svalue="tx1"/> | |||
Clock | clock | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#clock | Régler clock à l'heure du système: <clock divider="1" hour="%syshour%" minute="%sysmin%"/> | |||
Turntable | tt | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#tt | ||||
External | ext | All http://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-fr.html#ext | ||||
Weather | weather | setweather, weathertheme, go, stop | ||||
Light | light | flip, enable, disable | Activer un éclairage de LightControl. | |||
LightControl | lightctrl | go, stop | Activer / désactiver LightControl. | <lightctrl cmd="go"/> <lightctrl cmd="stop"/> | ||
Model | model | Tout https://rocrail.net/software/rocrail-snapshot/rocrail/wrapper-en.html#model | La modification n'est pas prise en charge, utilisez change à la place. | <model cmd="change"> <tx id="x" backred="255" backgreen="0" backblue="0"/> </model> | ||
MVTrack | mv | reset, sets1, sets2, setdistance, setdistanceR, setcalibrate, setcalctrainlen | <mv cmd="sets2" s2="fb4712"/> <mv cmd="setcalibrate" calibrate="true"/> |
Si une valeur d'attribut de commande commence par un point d'interrogation, elle sera remplacée par la valeur d'attribut de l'objet référencé.
Exemple:
<lc id="loco1" cmd="useschedule" scheduleid="?startupscid"/>
la valeur "?startupscid" sera remplacée par startupscid de 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"/>
L'ID d'objet peut contenir des variables.
Voir les variables possibles: Variables texte
<xmlscript> <tx id="%callerid%-%substate%" format="%lcimg%"/> </xmlscript>
Avec l'attribut format, il est possible de formater le contenu variable de la même manière que printf.
<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>
Sortie avec l'attribut format ressemblant à:
Hello03:0005RocrailFans
Sortie sans l'attribut format ressemblant à:
Hello 3 5 RocrailFans
Sans les limites décrites au dessus, les noms des variables peuvent être librement nommé; mais dès que deux scripts avec les mêmes noms de variables fonctionnent en même temps les scripts peuvent ne pas fonctionner correctement. Dans ces cas un préfixe spécifique au script ajouté au nom de la variable peut éviter toute confusion:
Au lieu de stocker une variable d'exécution en exécution dans Rocrail, ces variables doivent être définies comme "generated" "false":
<xmlscript> <vr id="vr_MSN3_lastUsedLocomotive" value="0" text="br89" generated="false"/> <vr id="vr_MSN3_tmp" value="0" text=""/> </xmlscript>
La variable "vr_MSN3_lastUsedLocomotive" sera stockée dans le dossier du plan Rocrail.
La variable "vr_MSN3_tmp" sera effacée quand Rocrail sera arrêté et ne sera stockée dans le dossier du plan Rocrail.
Pour vérifier si le Script Xml est bien mise en forme, il peut être ouvert dans un navigateur Web .
Certains caractères doivent être "escaped (remplacés)":
Caractères | Escaped |
---|---|
< | < |
& | & |
> | > |
Ce n'est pas bien mis en forme, mais accepté par l'analyseur de syntaxe XML Rocrail :
condition="#var2%oid% < &time"
Pour vérifier avec un navigateur WEB il doit être changé en:
condition="#var2%oid% < &time"
Cei est également valable pour l'analyseur de syntaxe XML Rocrail.