User Tools

Site Tools


xmlscripting-fr

Script XML

Avertissement

  1. Ne pas remplacer des fonctions standard Rocrail avec des scripts XML.
  2. N'essayez pas de mutiler le moteur automatique Rocrail.
  3. Les scripts sont exécutés de manière asynchrone, et nécessite un savoir-faire en matière de programmation multithread.
  4. Si vous rencontrez un comportement inattendu: Arrêter les actions XMLScript.
  5. En cas d'incertitude: N'utilisez pas de scripts XML, ou demandez de l'aide sur le Forum.
  6. Ne pas utiliser les mêmes variables dans dans de multiples scripts XML, qui seront réglées sur de nouvelles valeurs, pour éviter des résultats inattendus incluant des pannes du Serveur.

A V E R T I S S E M E N T


Introduction

:!: 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.


Exigences

  • UTF-8 Editor, par exemple Notepad++ ou Gedit or l'éditeur xml interne de rocview pour éditer un fichier XML sur le serveur comme décrit ci-dessous sur cette page.
  • L'éditeur Notepad de windows n'est pas pris en charge.
  • Quelques connaissances en programmation XML.


Recommandation

  • Faire des XmlScripts court et sans aller en longueur et sans longues boucles; Cela bloquera l'objet appelant du traitement des événements et des commandes s'il n'est pas défini comme Asynchrone.
  • N'essayez pas de surpasser le mode automatique; Publiez une demande de fonctionnalité dans le forum si quelque chose de basique manque.
  • Les ID d'objet avec des espaces ne sont pas pris en charge; utilisez plutôt des caractères de soulignement.
  • Les noms de variable/fonction ne doivent pas contenir des caractères d'opération comme "+-*<>^!=?%/".


Paramètrage

Les espaces dans le chemin d'accès ou le non de fichier ne sont pas autorisés!

  1. Créez un Script Xml et enregistrez_le dans un fichier. (voir: Exemple simple)
  2. Créez un programme action "run ext." .
  3. Sélectionnez le fichier Script Xml . (Si le fichier Script se trouve dans le répertoire de l'espace travail, un chemin n'est pas nécessaire.)
  4. Prêt à employer cette action sur n'importe quel objet Rocrail.


Exemple simple

Mettre le réseau sous tension et démarrer le mode auomatique :

<xmlscript>
  <sys cmd="go"/>
  <auto cmd="on"/>
</xmlscript>


Edition sur le Serveur

Pour créer et modifier les Scripts Xml sur le serveur, la boite de dialogue d'action peut être utilisée:

Ouvre l'éditeur. L'analyseur a détecté une erreur après validation ou enregistrer.

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>

Validation

Vérifiez si le code Xml est "bien formé". 1)

Insertion


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.


macOS

:!: 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.


Paramètres d'appel

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>



Déclarations

foreach

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'.


while

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 100.


if

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".


switch

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.

Exemple avec des nombres

<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.

Exemple avec chaîne de caractères

<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 .


call

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>

Restrictions

  • Dans une fonction "Call" n'est pas pris en charge.


exit

Quitez le Script Xml. Le cmt="reason" peut être utilisé pour le traçage

<xmlscript>
  <if condition="">
    <then>
      <exit cmt="Test."/>
   </then>
  </if>
</xmlscript>


break

Termine une boucle "foreach" 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>


trace

Les traces Script Xml seront de couleur verte dans Rocview.

<xmlscript>
  <trace text="Hi there! I'm %callerid%. :)"/>
</xmlscript>


sleep

Un temps de sommeil en ms.

<xmlscript>
  <foreach table="lclist">
    <if condition="">
      <then>
        <sleep time="100"/>
     </then>
    </if>
  </foreach>
</xmlscript>


sub

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.

query

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.

  <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. :!:

Exemple de fonction

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>


set

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.

clock

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.


Format de condition

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
- teste 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

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.

connect

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.


Format Etat/Classe

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


Etat Objets

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.

Classe Objets

Nom de l'objet Type d'Objet
Block bk
Loco lc
Route st


Commandes

Note:

  • Avec"Commands All" toutesles commandes d'objets spécifiées sont prises en charge dans Rocrail plan.xml
  • Les commandes spéciales d'action sont répertoriées séparément.


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 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.
Group est requis avec Loconet
<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 Evé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%"/>
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"
<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
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 Avec modifier, les sous-nœuds seront remplacés par les nouveaux. Les sous-nœuds Als seront supprimés si aucun nouveau sous-nœud n'est disponible. → Utilisez change à la place. <model cmd="change">
<tx id="x" backred="255" backgreen="0" backblue="0"/>
</model>

Valeurs d'attribut

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"/>


ID de l'objet

L'ID d'objet peut contenir des variables.
Voir les variables possibles: Variables texte

Exemple

<xmlscript>
  <tx id="%callerid%-%substate%" format="%lcimg%"/>
</xmlscript>


Variables système

Format variable

Avec l'attribut format, il est possible de formater le contenu variable de la même manière que printf.

Exemple

<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


Noms des variables

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:

  • changer le nom de la variable d'origine de "vr_idx"
  • Dans le script "MyScriptNumber1.xml" mettre le nom de la variable "vr_MSN1_idx" et
  • dans le script "MyScriptNumber2.xml" mettre le nom de variable "vr_MSN2_idx" etc.

Variables définies comme "Generated"

Tant qu'une variable n'a pas besoin de stocker des valeurs d'une exécution à l'autre de Rocrail, ces variables peuvent être définies comme "generated":

Exemple

<xmlscript>
  <vr id="vr_MSN3_lastUsedLocomotive" value="0" text="br89"/>
  <vr id="vr_MSN3_tmp" value="0" text="" generated="true"/>
</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.


Astuces

Bien mettre en forme XML

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
< &lt;
& &amp;
> &gt;

Exemple

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% &lt; &amp;time"

Cei est également valable pour l'analyseur de syntaxe XML Rocrail.


1)
Un document Xml avec une syntaxe correcte s'appelle "bien formé".
2)
10073+
3)
12.545+
xmlscripting-fr.txt · Last modified: 2022/07/07 15:32 by phil45