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.
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
Une 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.
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
-
De faire une opération arithmétique simple
additionner ou soustraire, multiplier ou diviser 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
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
mémoriser le numéro de convoi occupant le canton 27 sous la variable §2 :
Q27§2, !
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 s
ou par l'opération ^ qui
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
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.
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"" ' "
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
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
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
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)
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