Imprimer   Dernière mise à jour 25/05/2022
Index
index rubriques

Les interfaces de programmation JAO 2013

La programmation, autrement dit l’automatisation de conduite de maquettes ferroviaires sous JAO, peut être réalisée avec trois moyens :

Les macro-commandes, interface de premier niveau avec le logiciel

Les composants COM interface entre le logiciel JAO et les scripts, voire avec les programmes développés par les utilisateurs.

Une table de décision, interface avec ce que l’on peut appeler la logique de comportement du logiciel.


Macro-commandes

JAO offre trois environnements d'utilisation des macro-commandes.
Chaque environnement se caractérise par son processus de déclenchement:
- L’environnement des Macro-commandes déclenchées par des évènements physiques.
Macro décrites en fichier macros.d09 ou macros.d09.txt et traitées par le service de pilotage du système JAO.
- L’environnement des Macro-commandes déclenchées par des évènements physiques et des évènements logiques.
Macro décrites en fichier macros_Ex.txt et traitées par le service de pilotage du système JAO.
- L’environnement des Macro-Commandes invoquées sous script.
Macro décrites en fichier de script ou de source compilée et traitées librement sous langage de programmation.
En script, les macro-commandes sont généralement utilisées en complément des fonctionnalités offertes par l’interface COM de JAO, ceci pour simplifier ou optimiser la programmation.

Les évènements physiques sont fournis par :
- Les capteurs, capteurs de canton, capteurs du TCO et capteurs libres.
- Le clavier, touches de fonctions F1 à F12 et Alt F1 à Alt F12.

Les évènements dits logiques sont ceux fournis par le logiciel sur changement d'état des convois et des cantons.

Macro-commandes sur évènements physiques (capteurs de cantons)

Une ‘macro-commande’ est composée de 3 éléments :

1.   La description de l’évènement déclencheur, capteur

2.   La description optionnelle des conditions d’exécution des commandes

3.   La description des commandes à traiter lorsque les conditions sont remplies

4.   La description Facultative des commandes à traiter lorsque les conditions ne sont pas remplies, commandes précédées par le caractère ;

 

Le fichier macros.D09 contient autant de macro-commandes qu’il est nécessaire pour automatiser la conduite du réseau, une macro par ligne. Le fichier peut contenir des commentaires ; ils sont identifiés par le caractère * placé en début de ligne.

Description de l’évènement
Un évènement est décrit par un N° de capteur et l'état de celui-ci.
Les deux valeurs doivent impérativement être prises en compte pour identifier la nature de l'évènement : un N° de capteur seul n'est pas représentatif de son origine.

Un N° de capteur peut représenter :

1. Un capteur de canton, valeurs possibles entre 1 et 256
   Les états des capteurs de canton sont 0 ou 1 inactif/actif
2. Un capteur dit libre ou capteur volant, valeurs possibles entre 1 et 128
   Les états des capteurs libres sont 2 ou 3 inactif/actif
3. Un capteur du TCO , valeurs possibles entre 129 et 144
   Les états des capteurs du TCO sont 2 ou 3 inactif/actif
4. Un capteur 'virtuel'  résultant de la capture d'une touche de fonction clavier ou de l'émulation de celle-ci, valeur unique 0
    Les états des capteurs dits touches de fonctions' sont compris entre 101 et 124 ; ils correspondent aux touches clavier dites de fonctions F1 à F20  et Alt F1 à Alt F12.

Exemples
 - pour un capteur de canton:  129,1 capteur de canton 129 actif
 - pour un capteur libre ; 12,2 capteur libre 12 inactif
 - pour un capteur TCO: 129,3 capteur TCO 129 actif
 - pour une touche de fonction: 0,103 pour F3 invoqué au clavier.

 

Description des conditions d’exécution
Une condition est codifiée sous un  ou deux caractères suivi(s) d’arguments numériques séparés par une virgule.
Les conditions sont toujours décrites entre parenthèses. Plusieurs conditions peuvent être associées par les caractères :
    - & pour et
    - | pour ou
Le résultat d’une condition, vrai/faux peut être inversé en la préfixant par le caractère ^ (not, non en français)
Ex : (^o14,?&^o15,?&^o16,?&(5,?&o10,?)
La négation s'applique sur 10 niveaux ; les niveaux sont matérialisés par les parenthèses.
Exemple d’une macro-commande avec commentaire :
*Affectation d’itinéraires pour garer 2 ou 3 convois sur passage d’un convoi quelconque canton 8
8,1 (^o14,?&^o15,?&^o16,?&(o5,?|o10,?)) Q5B!,54Q10B!55Q8B!,56

Description des commandes
Une commande est codifiée sous un ou deux caractères, les commandes sont décrites en série sans séparateur. L’utilisation d'espaces est possible pour améliorer la lisibilité
Ex : V1,50Q14V!,100
Les commandes à exécuter lorsque les conditions ne sont pas remplies peuvent sont décrites au besoin après le caractère séparateur ; 
Ex : V1,50Q14V!,100 ; V1,80
La description peut comporter une 'macro différée'

Macro différée
U
ne macro exécutée après un délais exprimé en millisecondes. Les macros différées sont décrites entre les caractères { et }, chaque élément de la description est séparée du suivant par la caractère ;
{temps en millisecondes ; conditions facultatives ; commandes sur contions valides ; commandes facultatives sur conditions non validées }
Ex : {10000 ; q27t27,!&ia5,! ; µ'\WMsgDep1'} sous 10 secondes si le train en 27 est sur l'itinéraire 5 jouer le fichier son MsgDep1 (wav ou mp3)
   ou {10000 ; q27t27,!&ia5,! ; µ'\WMsgDep1';µ'\WMsgRetard1'} sous 10 secondes si le train en 27 est sur l'itinéraire 5 jouer le fichier son MsgDep1 (wav ou mp3) sinon jouer le fichier indiquant un retard
   ou {10000 ; ; µ'\WMsgDep1';µ'\WMsgRetard1'}  commande différée sans condition.

Les conditions
- o Occupé ou réservé par un convoi:  N° de canton, N° de convoi Ex: (o6,1). Le N° de convoi peut être 0 pour tester si aucun convoi n'occupe le canton. Le N° de convoi peut être remplacé par ? qui donne la condition ‘Canton occupé ou pas par un convoi’ ou par ! qui donne le numéro de convoi mémorisé par qN° de canton.
Occupé doit être compris comme une affectation de convoi donnée à un canton et non pas comme une occupation réellement physique d'un canton.
- s Statut requis pour le convoi  sStatut,Nø de convoi. Ex: (s1,10) avec
  0 à l’arrêt
  1 vers l’arrêt (équivalent à 0)
  2 au ralenti ou vers ralenti
  3 en accélération vitesse non limitée
  4 en palier vitesse non limitée
  5 absent, le convoi n'est pas présent
- se Attribut étendu requis pour le convoi  seStatut,Nø de convoi. Ex: (se35,1)
Les attributs convoi reflètent la situation d'un convoi à un instant t,  ils évoluent rapidement, leur emploi peut s'avérer délicat.
Pour plus d'informations nous contacter.
Voir la documentation au format pdf

- i ‘Itinéraire demandé’  iN° d’itinéraire affecté, N° de convoi. Ex: (i54,1)
  L'itinéraire est soit à prendre soit actif
- ia ‘Suit l’itinéraire’  iaN° d’itinéraire affecté, N° de convoi. Ex: (ia54,1)
  L'itinéraire est actif, le convoi suit effectivement l'itinéraire.
- iv ‘Suit le canton virtuel’  ivN° de canton virtuel, N° de convoi. Ex: (iv129,1)
  Le canton virtuel est actif, le convoi suit effectivement l'itinéraire.
    Les numéros d'itinéraires et de cantons virtuels peuvent être remplacés par ? pour signifier un itinéraire ou un canton virtuel quelconque
 
- a ‘Se dirige vers le canton +1’  aN°de canton, N° de convoi.   Ex: (a14,2)
- b ‘Se dirige vers le canton +2’  bN°de canton, N° de convoi.   Ex: (b15,2)
     Le canton +2 du convoi peut changer en fonction de l'état des voies l'emploi de cette condition peut s'avérer délicate.
- p ‘A quitté le canton’ pN°de canton, N° de convoi. Ex: (p12,4)
- t ‘Tête de convoi’ tN°de canton, N° de convoi. Ex: (t2,4) le convoi 4 est sur le canton 2
  Le N° de convoi peut être remplacé par ! caractère à utiliser pour le résultat de l’interrogation codée comme suit
- q ‘Mémoriser le N° de convoi qui occupe le canton spécifié’ qN°de canton. Ex: (q12)
- qt ‘Mémoriser le N° de convoi spécifié’ qN°de convoi. Ex: (qt199)
- qs 'quel sens (polarité)' qsN° de canton, polarité 0|1  Ex:qs31,1
- c 'Aiguillage positionné direct ou dévié' cN° d'aiguillage,0 ou 1. Ex: (c2,1)
- cp 'Aiguillage positionné direct ou dévié, testé en tenant compte de la latence' cpN° d'aiguillage,0 ou 1. Ex: (cp2,1)
    La latence de positionnement d'aiguille est donnée en paramètre de fonctionnement
    les conditions c et cp donnent le même résultat lorsque la latence de positionnement d'aiguille n'est pas utilisée.
- e 'Etat capteur de canton'  eN° de capteur,état.  Ex: (e135,1)
- f(R|V|J|E)N° de signal  'Feu Rouge, Vert, Jaune ou Eteint)  Ex: (fR11)
 ou
   f(R|V|J|E)N° de canton, sens Ex:(fR11,1)    équivalent à (fR139)
- g 'Canton verrouillé' gN° de canton. Ex:(g17)
- r 'Canton explicitement réservé' rN° de canton. Ex:(r17)
  Attention: Il s'agit des cantons au delà de n+1,des cantons réservés du fait de leur appartenance à un canton virtuel ou à une série de cantons courts.
  Cette condition ne doit pas être confondue avec la condition o, 'canton occupé ou réservé par un convoi'.
    rN° de canton, N° de convoi,  N° de convoi peut être remplacé par ! Ex:(r17,1)
- z 'Zone fin de canton' z5. Ex:(z5) le convoi 5 est en fin de canton
- av 'est en marche avant' avN° de convoi Ex:(av1) le convoi 1 est en marche avant
- ar 'est en marche arrière' arN° de convoi Ex:(ar1)
- as 'est à vide' asN° de convoi Ex:(as1)
- ac 'est chargé' acN° de convoi Ex:(ac1)
- af  'moteur froid' afN° de convoi Ex:(af1)
- an 'moteur normal, chaud' anN° de convoi Ex:(an1)
- § 'Test de variable utilisateur' §numéro ou !(=|<|>)valeur ou ! Ex: §52>10  §52<§35
- §. ou train. (notation plus conviviale) Test de variables propres aux trains
    §.s  le statut du convoi
    §.v la vitesse demandée en %
    §.p le canton précédent
    §.t le canton occupé (tête de train)
    §.a le canton suivant +1
    §.b le canton suivant +2
    §.i l'itinéraire courant (utilisé ou à prendre)
    §.ia l'itinéraire actif (utilisé)
    §.ps temps alloué pour arrêt (du ralenti à l'arrêt)
    §.pr temps alloué pour ralentir (jusqu'au ralenti)
    §.pa temps alloué pour accélérer (jusqu'au maxi autorisé)
    §.z(numéro de variable) ou train.var(numéro de variable)
les variables propres aux train.  Le nombre de variables est illimités.

 Rappel sur les variables globales §('numéro de variable)
   350 variables numériques sont à disposition des utilisateurs ; elles peuvent prendre les valeurs comprises entre -2147483647  et +2147483647
    Test de variable en binaire avec & opération binaire .Une valeur binaire est ici un bit ou une combinaison de bits parmi les 32 bits que comporte les nombres utilisés en variable
        Exemple de représentation binaire 32 correspond à 100000 en binaire
        Pour faciliter l'utilisation de valeurs binaires le caractère ' utilisé en préfixe permet de désigner la position du bit, valeurs comprises entre 1 et 32
        Exemple §1&'4 test si le bit 4 est à 1 dans la variable §1 soit en binaire 1000
        Si §1 contient 9 soit en binaire 1001 l'opération §1&'4  ou §1&8  retournera vrai
        Exemple: §1&9 test si les bits 4 et 1 sont à 1 dans la variable §1 soit en binaire 1001
        Si §1 contient 9 le test est équivalent à §1=9 par contre si §1 contient toute valeur impliquant que les bits 4 & 1 soit à 1 comme 25, 11001 en binaire, le test binaire sera positif alors que le test par égalité ne le sera pas.
    Voir paragraphe 'Les variables §(n) ci dessous

- §E2 Test sur variable évènement en macro de type2 (macros_ex.txt)
    La variable §E2  contient le numéro de canton sur lequel c'est produit l'évènement
    exemple  1[](4,8,10,16,28)[§300=§e2](+) Affectation sur la variable §300 du n° de canton  sur lequel c'est produit l'évènement
- §E3 Test sur variable évènement en macro de signalisation (signaux.res.txtt)
    La variable §E3  contient le numéro de canton sur lequel c'est produit l'évènement
    exemple  /m:SR8(26,6,8,16,1,9,10)Sj8Sj142(§e3=8&q§e3s&§t§e3,!) Affectation de feu clignotant sur évènement produit par le canton 8
- §S Test sur variable sens de fonctionnement logique affecté au canton §Snuméro  (=|<|>) valeur
 Ex: §S52=1 est ce que le sens 1 est affecté au canton 52
   les 128 variables peuvent prendre les valeurs 1 ou 0 pour spécifier la polarité ou 4 pour indiquer que le canton n'a pas été utilisé. La valeur 4 est affectée dès que le canton est libéré.
   NB: L'utilisation des variables §S peut s'avérer délicate
Si la condition qs permet de tester la polarité effective,  §S ne permet de tester que le sens logique celui qui  traduit la présence effective ou imminente d'un train dans le sens 0 ou 1. La valeur de retour 4 peut être interprétée comme une absence de train sur le canton.

- §t Variable temps JA0, §t contient le temps horloge de JAO exprimé en minutes, valeur comprise entre 1 est 1440(24*60).
Exemple
0,101(§t>719 ) §230=§t §232=§230§230/60§231=§230§231*60§232-§231µ'/NHeure JAO:  Cet Après Midi à §230 heure §232 minutes"'
0,101(§t<720 ) §230=§t §232=§230§230/60§231=§230§231*60§232-§231µ'/NHeure JAO:  Ce matin à §230 heure §232 minutes"'

- §c Variable Temps écoulé depuis le démarrage de JAO en millisecondes
- qs 'Contrôle de la polarité d'alimentation (le sens) sur un canton' qsN° de canton,0|1 La polarité est celle utilisée par le dernier train ayant emprunté le canton.
Exemple qs12,0 sens 0 sur le canton 12 Dépend de l'occupation. Si le canton est occupé par la tête de train le test est valide Si le canton n'est pas occupé ou si le canton est occupé par le canton n+2 d'un convoi le test risque de ne pas être pertinent: La polarité affectée est celle utilisée par le dernier train ayant emprunté le canton. Si le canton est occupé par le canton n+1 d'un convoi en allure non contrainte, 3 ou 4, le test est valide, dans le cas contraire il risque de ne pas être pertinent.
- qa 'Contrôle d'occupation du canton n+1 d'un convoi' qaN° de convoi objet du test,N°de convoi occupant le canton
- qb 'Contrôle d'occupation du canton n+2 d'un convoi' qbN° de convoi objet du test,N°de convoi occupant le canton
   Identique à qa avec le canton n+2 du convoi objet du test.
Exemples:
      q12qa!,!  Est ce que le canton suivant du convoi occupant le canton 12 est réservé par ce convoi.
      qa5,1 Est ce que le canton suivant du convoi 5 est réservé par le convoi 1.
      qa5,5 Est ce que le convoi 5 a réservé le prochain canton qu'il doit emprunter
Si le canton est inoccupé ou verrouillé le test n'est pas valide
L'occupation des  cantons n+1 et n+2 d'un convoi est principalement fixée par JAO sur les évènements capteurs d'entrée et de sortie de canton. Cette caractéristique est à l'origine des difficultés d'utilisation des conditions qa et qb, en particulier lorsqu'elles sont mise en oeuvre sur évènements capteurs.
Exemple de difficulté:
  5,1(q5qb!,!) V!,100   macro sur entrée ou sortie de canton 5
  Nous souhaitons savoir si le convoi présent sur le canton 5 a réservé son canton +2 et dans ce cas nous lui allouerons la puissance maximum.
  Le test pourra être positif si le moteur JAO a lui aussi traité l'évènement et si il a affecté le canton +2 du convoi ou si le convoi est sur un itinéraire type canton virtuel avec réservation anticipée des cantons.
en prime
+ ‘A suivre’ autrement dit si les conditions ne sont pas remplies, poursuivre avec une ou des macros suivantes répondant à la même description d'évènement.

Les variables §(n)
En macro-commandes il n’y a pas de variables que l'on pourrait nommer librement, les noms de variables en macro sont composés à partir du caractère § suivi d’un nombre compris entre 1 et 350.
Les variables §(n) sont partagées avec les scripts y compris java script en page HTML.
D'autres variables sont réservées à des usages spécifiques, qui seront développés en fonction des besoins utilisateurs. L'une d'entre elles, la variable §351 est utilisée pour gérer le fond d'écran du synoptique.
Exemple §1  ou §100
L’usage de ces variables est extrêmement limité contrairement à ce que l’on peut faire avec les variables JAO en script, il est possible:
-       D'affecter une valeur numérique comprise entre -2147483648 et +2147483647
-       De faire une opération arithmétique simple additionner ou soustraire, multiplier ou diviser un nombre
-       De faire un test de comparaison également simple, égal, plus petit ou plus grand qu’un nombre.
-      
De faire un test de comparaison binaire, ce qui en pratique correspond à l'usage de flags ou drapeaux, un usage qui peut s'avérer très utile.

Syntaxe :
Affectation :  nom de la variable suivi du caractère , ou = et de sa valeur
Exemple §1,7 ou §1=7
Il est possible d’utiliser le résultat d’une interrogation soit pour la valeur soit pour la désignation de la variable
Exemple: utiliser une variable de même désignation qu’un convoi
    fournir la valeur 7 à la variable de même numéro que  le convoi en canton 100 :  Q100§!,7 en supposant que le canton 100 soit occupé par le convoi 1 nous aurons §1=7
Exemple: utiliser une variable pour mémoriser un numéro de convoi
    mémoriser le numéro de convoi occupant le canton 27 sous la variable §2 :  Q27§2, !
Opérations numériques :
Simples additions ou soustractions
Exemple ajouter 2 à la variable §1 : §1+2
Il est possible comme en affectation d’utiliser le résultat d’une interrogation
Exemple faire +1 au passage des convois sur le canton 100 : Q27§!+1 le résultat sera la quantification du nombre de passages canton 100 pour tous les convois qui l’ont parcouru.
Exemple d’exploitation en condition (§5>0) si le convoi 5 est passé au moins une fois par le canton 27
Opérations binaires :
Un nombre est composé de 32 bits, il est possible de changer la valeur d'un ou plusieurs bits.
Pour désigner un bit il convient d'utiliser le caractère simple quotte ' suivi du numéro de bit tel que '5 pour désigner le bit 5
L'affectation d'un bit est réalisée par l'opération | qui signifie positionner le bit à 1 s'il ne l'est pas tel que  §350|'1
ou par l'opération ^ qui signifie positionner le bit à 0 s'il ne l'est pas tel que  §350^'1
Pour affecter plusieurs bits il convient d'utiliser la somme de leurs valeurs numériques. La valeur numérique d'un bit est une puissance de 2, 2 puissance (n° de bit -1).
le bit 1 donne 1 s'il est affecté  le bit 2 donne 2 le bit 3 donne 4 etc ...
L'opération   §350|3 affecte la valeur 1 aux bits 1 et 2.

Opérations logiques :
Les signes = < et > permettent de faire des tests simples de contenu numérique.
Le signe & permet de tester un ou plusieurs bits d'une variable.

Les variables réservées, la variable §351 dédiée à la gestion du fond d'écran du synoptique

Le fond d'écran du synoptique est blanc par défaut, avec la variable §351 il est possible:
- D'affecter une couleur et la forme de sa répartition, unie ou dégradée.
- D'animer le fond d'écran
Méthode de gestion du fond d'écran
La gestion de couleur du fond d'écran est réalisée à partir de 4 variables de numéros consécutifs tel que:
- Variable n (exemple §201) valeur 0 pour obtenir un fond uni, valeurs 1 à 255 pour obtenir un fond dégradé.
- Variable n+1 (exemple §202) valeurs comprises entre 0 et 255, composante Rouge de la couleur souhaitée.
- Variable n+2 (exemple §203) valeurs comprises entre 0 et 255, composante Verte de la couleur souhaitée.
- Variable n+3 (exemple §204) valeurs comprises entre 0 et 255, composante Bleu de la couleur souhaitée.
Le numéro de la première variable (exemple 201) doit être affecté à la variable §351 pour obtenir la couleur de fond d'écran souhaitée.§351=0 inhibe l'affectation de couleur.

Exemples de macro-commandes de gestion de fond d'écran:
Fond Rouge intense: §351=201§201=0§202=255§203=0§204=0
Fond Jaune dégradé du blanc au jaune: §351=201§201=255§202=255§203=255§204=0
Journée d'été chaude: §351=201§201=255§202=169§203=0§204=70
Nuit d'hiver froide: §351=201§201=145§202=73§203=0§204=85

Les variables en lecture seule
- §E2 Test sur variable évènement en macro de type2 (macros_ex.txt)
    La variable §E2  contient le numéro de canton sur lequel c'est produit l'évènement
    exemple  1[](4,8,10,16,28)[§300=§e2](+) Affectation sur la variable §300 du n° de canton  sur lequel c'est produit l'évènement
- §E3 Test sur variable évènement en macro de signalisation (signaux.res.txtt)
    La variable §E3  contient le numéro de canton sur lequel c'est produit l'évènement
    exemple  /m:SR8(26,6,8,16,1,9,10)Sj8Sj142(§e3=8&q§e3s&§t§e3,!) Affectation de feu clignotant sur évènement produit par le canton 8
- §S Test sur variable sens de fonctionnement logique affecté au canton §Snuméro  (=|<|>) valeur
 Ex: §S52=1 est ce que le sens 1 est affecté au canton 52
   les 128 variables peuvent prendre les valeurs 1 ou 0 pour spécifier la polarité ou 4 pour indiquer que le canton n'a pas été utilisé. La valeur 4 est affectée dès que le canton est libéré.
   NB: L'utilisation des variables §S peut s'avérer délicate
Si la condition qs permet de tester la polarité effective,  §S ne permet de tester que le sens logique celui qui  traduit la présence effective ou imminente d'un train dans le sens 0 ou 1. La valeur de retour 4 peut être interprétée comme une absence de train sur le canton.

- §t Variable temps JA0, §t contient le temps horloge de JAO exprimé en minutes, valeur comprise entre 1 est 1440(24*60).
Exemple
0,101(§t>719 ) §230=§t §232=§230§230/60§231=§230§231*60§232-§231µ'/NHeure JAO:  Cet Après Midi à §230 heure §232 minutes"'
0,101(§t<720 ) §230=§t §232=§230§230/60§231=§230§231*60§232-§231µ'/NHeure JAO:  Ce matin à §230 heure §232 minutes"'

- §c Variable Temps écoulé depuis le démarrage de JAO en millisecondes

Les variables §.  variables destinées en macro-commandes  à  fournir les valeurs des propriétés du convoi sélectionné via Q(n) ou QT(n)
Les variables assignées aux trains §.z
 
§. ou train.
 (notation plus conviviale)
 §.s  le statut du convoi
 §.v la vitesse demandée en %
 §.p le canton précédent
 §.t le canton occupé (tête de train)
 §.a le canton suivant +1
 §.b le canton suivant +2
 §.i l'itinéraire courant (utilisé ou à prendre)
 §.ia l'itinéraire actif (utilisé)
 §.ps temps alloué pour arrêt (du ralenti à l'arrêt)
 §.pr temps alloué pour ralentir (jusqu'au ralenti)
 §.pa temps alloué pour accélérer (jusqu'au maxi autorisé)
 §.z(numéro de variable) ou train.var les variables propres au train désigné par §. Le nombre de variables est illimités.
En manœuvre, commande MXnnn,vvv,2 les variables §.z1 à §.z9 reçoivent automatiquement les principaux attributs de fonctionnement du train.
 - des occupations, cantons Précèdent(§.z1),. Occupé(§.z2) et les 2 suivants(§.z3 et §.z4)
 - du numéro d'itinéraire courant (§.z5))
 - de la vitesse demandée(§.z6))
 - variables 7, 8 et 9 réservées pour un usage ultérieur(§.z7 §.z8 §.z9)

Pour info:
 La taille mémoire induite par l'affectation de ces variables correspond à numéro le plus élevé * 4 bytes. pour 1000 variables cela donne 4000 bytes soit environ 4 kilo bytes
 
Exemples: Q7§340=§.v la variable 340 contient la vitesse demandée pour le convoi  présent sur canton 7
                QT2§340=§.v la variable 340 contient la vitesse demandée pour le convoi  2
                (q20&se16,!&s0,!&o§.a,?&^o§.a,!a&§.v>50) §.z3=§.v-10V!,§.z3 ralentir un train sur canton 20 lorsqu'il en suit un autre.
                (q17&se16,!&^o§.p,0&^o§.p,!) test d'occupation du canton précédent d'un train en fin de canton 17
                Q17 Q§.p §300=§.v+10 V!,§300 ajustement de la vitesse du train qui suit celui présent sur canton 17 


Les commandes
Codification adoptée pour la description : nnn utilisé pour N° de convoi et aaa pour N° d’un tiers objet

 

Autres commandes asservissement électronique

Autres commandes
Ce n'est pas impossible, nous consulter ...

Pilotage en ligne de commande ou sous fichiers de commandes '.cmd' (batch)
Aide à la mise au point des macro-commandes

Les macro-commandes peuvent être invoquées à partir d'une 'invite de commande' en utilisant le programme jaocmd.exe. Jaocmd supporte toutes les macros conditions facultatives incluses suivant la syntaxe dites de type 1:
    les conditions entre parenthèses suivies des commandes.
Exemples:
jaocmd D7
jaocmd "(o29,7) µ'jppdep.vbs ""29"" ""7000"" ' "
jaocmd "{2000;;SJ68µ'debug.vbs ""1"" ""Allumage atelier après 2 secondes""'}{5000;;C78,0µ'debug.vbs ""1"" ""Ouverture de la porte après 5 secondes""'}{10000;;V65,100µ'debug.vbs ""1"" ""Le convoi vide sort""'}"

Jaocmd permet également:
1) De démarrer le pilote, jaocmd simul pour préparer une simulation ou jaocmd pilote pour préparer en fonctionnement avec asservissement de maquette.
2) De charger et démarrer le réseau, jaocmd load "nom du réseau"
3) De faire une pause jaocmd sleep nombre de secondes
Ces fonctions s'adressent à des utilisateurs 'avertis' qui souhaiteraient automatiser le pilotage de leur réseau, en particulier un démarrage en ouverture de session Windows ou au démarrage du PC serveur.

NB:
Le passage d'un argument contenant le caractère " sous invite de commande suppose que l'argument soit lui même encadré par " et que le caractère " contenu en argument soit doublé.
JAOCmd ne permet pas d'obtenir d'indicateur de résultat des commandes passées ni directement la valeur des variables §.
Les erreurs signifiées concernent uniquement les dysfonctionnements dus soit par défaut de lancement du réseau soit sur anomalie de communication entre jaocmd et le serveur JAO.
Pour obtenir la valeur des variables il est possible d'invoquer le script debug.vbs comme le montre l'exemple ci-après
jaocmd "µ'debug.vbs ""variable 3=§3"" ' "

Macro-commande sur évènements physiques et logiques

Fichier  macros_ex.txt
Une ‘macro-commande’ est composée de 4 éléments :

1.   Le numéro de macro commande (sans signification particulière, destiné à faciliter la documentation)
2.   Les commandes d'initialisations (facultatives)
3.   La description du périmètre d'exploitation (une liste de cantons ou une catégorie d'évènements)
Le périmètre permet de cibler les cantons sur lesquels un évènements se produit qu'il soit physique ou logique.

4.   La description des commandes proprement dites
Ce sont les commandes décrites sous § 'Commandes' , elles peuvent comporter des commandes différées § 'les macros différées' ainsi que les commandes alternatives celles qui seront exécutées si les conditions ne sont pas remplies.
5.   La description des conditions d’exécution des commandes
Ce sont les conditions décrites sous  § 'Conditions'

Plusieurs groupes d'éléments 4 & 5, commandes et conditions,  peuvent être décrits,
Ils sont utilisés conditionnellement, si les conditions du groupe précédent ne sont pas remplies ou si le signe + a été inscrit en fin de conditions du groupe précédent

 

Macro-commandes sur  Evènements hors cantons
Les périodes de non évènement sur capteur physique peuvent être interceptées sur périmètres 129, 130 et 131. Ces périmètres prédéfinis désignent des catégories d'évènements et non plus des cantons:
- Périmètre 129 absence d'évènement capteur pendant 10 secondes
- Périmètre 130 absence d'évènement capteur pendant 1 minute
- Périmètre 131 évènement , au moins un évènement capteur sous 10 secondes

 - Périmètre x avac x>131 évènement créé par macro XF tel que XF10000 (pourquoi pas)
Macro-commandes sur erreur
- Périmètre 132 erreur, erreur signalée

Structure du fichier de description macros_ex.txt

La structure du fichier de description macros_ex.txt se présente comme suit :
'N° de macro'['commandes d'initialisation']('liste des cantons du périmètre ou * ou 129, 130 131 132')['commandes lot 1']('conditions Lot 1') ...
Le Numéro de macro commande est au libre choix de l'utilisateur il n'y a pas de contrainte
le caractère * en préfixe de ligne permet d'insérer des commentaires

Exemples

*Surveillance  avec un signal visuel (exploitation dérivée de la signalisation)
1[SJ126,0](17,5,7)[SE126,0](^t17,2)[SJ126,0](t17,2&(s1,2|s0,2)&o5,42)[SV126,0](t17,2&(o7,42|o7,2))[SR126,0](t17,2&^(o5,42)&^o7,42&^o7,2)
2[](*)[SR125,0](s0,42|s1,42)[SJ125,0](s2.42)[SV125,0]()
*Surveillance de fonctionnement et arrêt automatique
*Mise en œuvre et collaboration avec des scripts réagissant sur évènements nommés testalerte.vbs et testccourt.vbs
*les variables 1 à 100 sont utilisées pour comptabiliser des situations de convois compteurs de passage sur canton
*les variables 101 à 106 sont utilisées pour identifier des états
3[§101=1§102=1](31) [Q31§!+1§102=0](o31,?&q31&(s2,!|s0,!)&§102=1)[§102=1](q31&s3,!+) [E"Alerte"§103+1->](§103=0&q31§!>5)
4[§103=1§104=1](17) [Q17§!+1§103=0](o17,?&q17&(s2,!|s0,!)&§103=1)[§103=1](q17&s3,!+) [§104+1](E"Alerte"§104=0&q17§!>5)
5[§105=1§106=-1](2,10) [Q2V!,0§106=!§105=0$déblocage 2,10 arrêt convoi](§105=1q2t2,!&a10,!&o10,!&s0,!) [Q2V!,100§106=-1§105=1$relance convoi bloquant](§105=0&q2t2,!&§106=!&o10,0)
*Arrêt automatique après 10 minutes d'inactivité
*Pas d'évènement capteurs pendant 1 minute : Si 10 cycles contigus arrêt de fonctionnement
1300[§351=0](130) [§250+1](§250<9)[§250+1 µ'debug.vbs "60" "Arrêt fonctionnement du réseau//après §250 minutes d inactivité."' ->]()
*Evènements capteur dans les 10 dernières secondes: remise à 0 des compteurs
1310[](131) [§250=0§249=0]()

Utilisation des macros en mode commande et en fichier de commandes

L'utilitaire JAOCmd permet d'invoquer des macro-commandes avec ou sans condition à partir d'une invite de commande (cmd)
"(conditions) commandes"
Pour utiliser cette fonctionnalité il est nécessaire de lancer au préalable une simulation ou un fonctionnement réel de réseau. A défaut JAOCmd retourne 1, un code retour qu'il est possible de tester avec errorlevel 1.
Le résultat des commandes ne fait pas l'objet de code retour, if errorlevel 1 n'est  exploitable que pour tester l'activité effective de fonctionnement du réseau.

Exemple, arrêt de tous les convois actifs d'un réseau pouvant comporter 40 convois:
En ligne de commande for /L %1 in (1,1,40) do jaocmd "(^s5,%1)J%1"
Dans un fichier .bat ou .cmd for /L %%1 in (1,1,40) do jaocmd "(^s5,%%1)J%1"

JAOCmd permet d'utiliser les variables JAO, variables dites §. Cette caractéristique permet d'une certaine manière de tester les résultats de macro-commandes.
Exemple dans un fichier .bat ou .cmd, Arrêter un convoi si actif et présent sur l'un des deux cantons 1 ou 2 puis démarrer un autre convoi si la condition est satisfaite. La variable §300 sera utilisée et pour conditionner le démarrage du deuxième convoi
jaocmd "§300=0"
jaocmd "(^s5,1&(t1,1|t2,1))J1§300=1"
jaocmd "(§300=1)A2"

JAOCmd fournit deux commandes spéciales, une commande pour charger un réseau et une commande pour marquer une pause
jaocmd load "demo" provoque le chargement du réseau demo et son démarrage
jaocmd sleep 10000 provoque une attente de 10 secondes 10000 milli

Ces deux commandes permettent d'automatiser le démarrage d'un réseau
Exemple de fichier .bat ou .cmd démarrage du réseau demo en simulation:
@echo off
if exist "c:\program Files\jao\jaoserver1.exe" (start "" "c:\program Files\jao\jaoserver1.exe" /S) else (start "" "c:\program Files (x86)\jao\jaoserver1.exe" /S)
if errorlevel 1 goto exit
jaocmd sleep 5000
jaocmd "load" "demo"
if errorlevel 1 goto exit
jaocmd sleep 5000
if exist "c:\program Files\jao\simulation.vbe" (start "" cscript "c:\program Files\jao\simulation.vbe") else (start "" cscript "c:\program Files (x86)\jao\simulation.vbe")
:exit


Les composants COM

JAO expose une partie de ses composants logiciels sous une interface Microsoft COM. Cette disposition permet aux utilisateurs de programmer le comportement de leurs maquettes, de créer leurs propres processus et d’étendre les fonctionnalités du système. Il ne s’agit pas d’une interface objet ‘riche’ celle-ci ne permet pas d’hériter  à proprement dit des objets développés par JAO, elle permet uniquement  d’en utiliser les propriétés et les fonctions essentielles. Bien que JAO ne soit pas encore décliné en version 64 bits, l’interface est quant à elle 32 et 64 bits. Il n’y a pas, de ce fait, de restriction d’usage en scripts tels que vbs, js ou autres dont dérivés tels que HTA.

Utilisation en script

Le composant

Le composant objet à déclarer est JAOCom.Pilote, soit par exemple:
En script visual basic, vbs :
    Dim objJAO: Set objJAO= CreateObject("JAOCom.Pilote")
En python, py:
    import win32com.client
    objJAO=win32com.client.Dispatch("JAOCom.Pilote")
En powershell, ps1:
    $jao=New-Object -ComObject JAOCom.Pilote
   

Les fonctions et propriétés
(description disponible en ligne sous explorateur d'objets COM)

Variables partagées
- SetVar(nom de variable,valeur) -> vrai ou faux
  vrai la variable a été affectée, faux dépassement de mémoire 5000 caractères pour l'ensemble des variables
- GetVar(nom de variable) ou Var(nom de variable) -> valeur de la variable
Les variables partagées sont effacées au démarrage du serveur jaoserver1, lancement d'un réseau (simulation ou asservissement maquette)
Les variables §n, n compris entre 1 et 350 inclus, sont partagées avec les macro-commandes.

Gestion du réseau à exploiter
- Version Propriété version de l'interface COM
- Reseau Propriété nom de réseau exploité
- LoadReseau(nom) Piloter le réseau spécifié
- IsRunning() true/false Etat de fonctionnement

Gestion des convois
- ConvoiName(N° convoi) -> nom du convoi

- CantonOccup(N° canton) -> numéro de convoi + type d'occupation
Pour les cantons occupés par la tête d'un convoi  CantonOccup(N° canton) retourne toujours le numéro de convoi
Pour les autres cantons CantonOccup(N° canton) peut retouner
le numéro de convoi +1024 s'il s'agit d'une réservation
2048 ou le numéro de convoi + 2048 s'il s'agit d'un canton verrouillé

- ConvoiCantons(N° convoi) -> string les 4 cantons (séparateur,)
 Exemple 1,2,3,4 canton précèdent 1, occupé 2 suivants 3 et 4

- ConvoiStatus(N° convoi) -> string Etat,statut,attributs_situation,temps,attributs_31,attributs_64  (séparateur,)
 Etat: 0 convoi non activé sinon convoi en cours d'utilisation
 Statut: 0 ou 1 arrêt 2 ralenti 3 accélération 4 en palier
 attributs_situation: 1 arrêt demandé 2 demi-tour demandé 4 intervention opérateur demandée 8 en arrêt sur itinéraire
    valeurs combinées possibles 6 pour 4 et 2 par exemple. Il existe d'autres valeurs combinatoires (binaires) l'exploitation doit donc être faite avec des
    & logiques tel que if situation and 4 then en visual basic script ou if(situation & 4) en java script 
 Temps le temps d'arrêt programmé en secondes
 attributs_31 et attributs_64: Deux nombres sous forme de string (à convertir au besoin) dont chaque bit en représentation binaire correspond à un attribut du convoi.
 attributs_31 est un nombre de 32 bits dont les 31 premiers bits sont utilisés, il correspond généralement en script au type de nombre double.
 attributs_64 est un nombre de 64 bits contenant l'ensemble des attributs utilisés par les programmes JAO, il est difficilement exploitable en script, les nombres de 64 bits n'ayant pas de type dans cet environnement.
attributs_31 est facilement exploitable, un exemple fourni en vbs avec le script  ExpliquerStatutConvoi.vbs 
attributs_64 est difficilement exploitable sous script en format numérique, une exploitation en format string est possible.
Exemple le résultat "1,2,2,0,," correspond à actif en ralenti demi tour demandé

- ConvoiPuDde(N° convoi) -> Puissance demandée
- ConvoiPu(N° convoi) -> string puissances min,ral,max,dde,appliquée (séparateur,)
- ConvoiCurrentIti(N° convoi) -> No Itinéraire
- SetConvoiStatus(N° convoi,Etat,Statut)
- SetConvoiPuDde(N° convoi,Puissance)
- SetConvoiCurrentIti(N° convoi,num Iti)
- GetConvoiSens(N° convoi) obtenir le sens de marche du convoi 0= Marche Avant ou 1=Marche Arrière
- SetConvoiSens(N° convoi,0|1) fixer le sens de marche du convoi 0= Marche Avant ou 1=Marche Arrière
- GetConvoiCharge(N° convoi) obtenir l'indicateur de 'charge' du convoi 0=Vide  ou 1=Chargé
- SetConvoiCharge(N° convoi,0|1) définir  l'indicateur de 'charge' du convoi 0= Vide ou 1=Chargé
- GetConvoiChaud(N° convoi) obtenir l'indicateur de 'fonctionnement moteur' du convoi 0=Froid  ou 1=Chaud
- SetConvoiChaud(N° convoi,0|1) définir  l'indicateur de 'fonctionnement moteur' du convoi 0=Froid  ou 1=Chaud
- AjustPU(N° de correction 1 ou plus) Ajustement de la courbe d'affectation de puissance, courbe 1=natif, courbe 2 et suivante=ajustement

Gestion des voies
- GetSens(N° Alim)
- SetSens(N° Alim,sens 1 ou 0 [true|false])
- GetAlim(N° Alim)
- SetAlim(N° Alim,valeur)
- GetBoolCapt(N° capteur)
- GetIntCapt(N° capteur)
- GetBoolCaptFree(N° capteur)
- GetIntCaptFree(N° capteur)
- SimulCapt(N° Capt, Etat (0/1)
 - SetAig(N° Aig, position 1 directe ou 0 [true|false])
 - GetPosAig(N° Aig) true directe | false déviée

Gestion TCO
- GetTCO(N°)

Gestion de la signalisation
- GetSig(libellé feux,N° canton) libellé=R|V|J|E suivi de 0 ou 1 pour le sens Retourne vrai|faux
- SetSig(libellé feux,N° canton) libellé=R|V|J suivi de 0 ou 1 pour le sens
- ResetSig(Type de reset,N° canton) type=0|1|2 sens 0 sens 1 ou les deux sens(par défaut)

Gestion du temps
Le temps JAO est matérialisé par une horloge qu'il est possible de programmer pour accélérer le temps suivant un coefficient compris entre 2 et 3600; 3600 n'est qu'une limite théorique, disons raisonnable enfin presque ...
- GetMinutes donne le nombre de minutes correspondant à l'heure de l'horloge JAO
- GetStringTime donne l'heure de l'horloge JAO sous forme HH:MM
- GetTimeCoef donne le coefficient actuel de l'horloge JAO
- SetTimeCoef(coef) fixe le coefficient de l'horloge JAO

Gestion par évènements
- FirePrivateEvent(nom évènement)  -> Vrai (true) si évènement signalé sinon erreur

- WaitPrivateEvent(nom évènement,Tps max milli-seconde) -> Vrai=1 évènement signalé sinon timeout
    Huit évènements sont prédéfinis avec des noms réservés ainsi qu'avec tous les noms de convois:
    Cn avec n numéro de convoi ou Nom de convoi tel que WaitPrivateEvent("C12", 1000) signale les changements sur le convoi numéro 12
      WaitPrivateEvent("BB 63743", 1000) signale les changements sur le convoi nommé BB 63743
    ou le nom de convoi tel que  WaitPrivateEvent("BB 63743", 1000)
    E1_n avec n numéro de convoi tel que WaitPrivateEvent("E1_12", 0) signale une vitesse excessive
    E2_n avec n numéro de convoi tel que WaitPrivateEvent("E2_47", 500) signale une Erreur conséquente, un arrêt d'urgence, un débordement ...
    E1 tel que WaitPrivateEvent("E1", 0) signale une vitesse excessive tout convoi
    E2 tel que WaitPrivateEvent("E2", 0) signale une Erreur conséquente, tout convoi, un arrêt d'urgence un débordement ...
    NEvt tel que WaitPrivateEvent("NEvt", 0) signale l'absence d'évènement capteur pendant 10 secondes
    NEvt2 tel que WaitPrivateEvent("NEvt2", 0) signale l'absence d'évènement capteur pendant 1 minutes
    Evt tel que WaitPrivateEvent("Evt", 0) signale une période de 10 secondes avec évènement capteur
   Quatre évènements sont prédéfinis pour signaler des changements globaux:
    JAOError WaitPrivateEvent("JAOError", 0) signale une erreur faisant l'objet d'une trace en log
    JAOCapteur WaitPrivateEvent("JAOCapteur", 0) signale un évènement capteur quel qu'il soit, un des capteurs a changé d'état
    JAOSig WaitPrivateEvent("JAOSign", 0) signale un évènement signaux quel qu'il soit, un des feux a changé d'état
    JAOAlim WaitPrivateEvent("JAOAlim", 0) signale un évènement alimentation quel qu'il soit, une des alimentations a changée de valeur

- WaitForJAOAnyEvent(Tps max milli-seconde) vrai (true) si au moins un évènement JAO signalé sinon timeout
- WaitForJAOEvent(Tps max milli-seconde, N° Capteur) vrai (true) si au moins un évènement JAO signalé sinon timeout
- WaitFor2JAOEvent(Tps max milli-seconde, N° Capteur 1, N° Capteur 2) -> Vrai=un des deux évènements JAO signalés sinon timeout

Lorsque la valeur donnée pour timeout est 0 l'attente d'évènement est sans interruption

Commandes par macro
- MacroCmd(conditions et/ou commandes) telles que décrites sous § 'Conditions' et  § 'Commandes'

Gestion de l'interface avec l'électronique JAO
- StopAutoRun() Arrêter l'asservissement USB
- StartAutoRun() ou Start Lancer l'asservissement USB retourne true/false
- Connect() Utiliser la carte USB
- DeConnect() Réservé à un usage spécifique, voir spécifications détaillées

Gestion de l'environnement d'exécution
- RunAs Relance si nécessaire le script ou process avec privilège étendu (UAC pour les initiés)
- GetAdminStatus Le statut utilisateur 0=User, 1= Admin et  2=Admin avec privilège UAC élevé

Le document de synthèse sur la programmation sous JAO 2013