basic_hal_fr.txt
1 :lang: fr 2 :toc: 3 4 = Commandes et composants de base 5 6 [[sec:Commandes-de-HAL]] 7 8 == Commandes de Hal 9 10 Des informations plus détaillées peuvent être trouvées dans la man 11 page en tapant 'man halcmd' dans une console. Pour voir la 12 configuration de HAL ainsi que le statut de ses pins et paramètres 13 utiliser la fenêtre HAL Configuration dans le menu 'Machine' d'AXIS. 14 Pour visualiser le statut des pins, ouvrir l'onglet 'Watch' puis 15 cliquer dans l'arborescence sur les pins qui doivent être visualisées 16 dans la fenêtre watch. 17 18 .Fenêtre de configuration de HAL 19 20 image::images/HAL_Configuration.png[alt="Fenêtre de configuration de HAL"] 21 22 === loadrt 23 24 La commande 'loadrt' charge un composant temps réel de HAL. Les 25 composants temps réel doivent être ajoutés au thread temps réel pour 26 être fonctionnels. Il n'est pas possible de charger un composant de 27 l'espace utilisateur dans l'espace temps réel. 28 29 Syntaxe et exemple: 30 31 ---- 32 loadrt <component> <options> 33 34 loadrt mux4 count=1 35 ---- 36 37 === addf 38 39 La commande 'addf' ajoute une fonction à un thread temps réel. Si 40 l'assistant StepConf a été utilisé pour créer la configuration, deux 41 threads ont été créés. 42 43 - base-thread (le thread haute vitesse) ce thread prends en main les 44 items nécessitant une réponse très rapide comme la génération 45 d'impulsions, la lecture et l'écriture sur le port parallèle. 46 - servo-thread (le thread basse vitesse) ce thread prends en main les 47 items n'étant pas influencés par la vitesse comme le contrôleur de 48 mouvement, l'API Classic Ladder et les commandes manuelles. 49 50 Syntaxe et exemple: 51 ---- 52 addf <component> <thread> 53 54 addf mux4 servo-thread 55 ---- 56 57 === loadusr[[sec:loadusr]] 58 59 La commande 'loadusr' charge un composant de HAL de l'espace 60 utilisateur. Les programmes de l'espace utilisateur ont leur propre 61 processus séparé qui optionnellement communique avec les autres composants 62 de HAL via leurs pins et paramètres. Il n'est pas possible de charger 63 un composant temps réel dans l'espace utilisateur. 64 65 Les drapeaux peuvent être un ou plusieurs parmi les suivants: 66 67 -W:: 68 pour attendre que le composant soit prêt. Le composant est supposé 69 avoir le même nom que le premier argument de la commande. 70 71 -Wn <nom>:: 72 pour attendre un composant, qui porte le nom donné sous la forme <nom>. 73 74 -w:: 75 pour attendre la fin du programme 76 77 -i:: 78 pour ignorer la valeur retournée par le programme (avec -w) 79 80 Syntaxe et exemple: 81 ---- 82 loadusr <component> <options> 83 84 loadusr halui 85 loadusr -Wn spindle gs2_vfd -n spindle 86 ---- 87 88 En anglais ça donne 'loadusr wait for name spindle component gs2_vfd name spindle'. 89 Le -n spindle est une partie du composant gs2_vfd et non de la commande loadusr. 90 91 === net[[sub:net]] 92 93 La commande 'net' crée une 'connexion' entre un signal et une ou plusieurs pins. 94 Si le signal n'existe pas, net le crée. Les flèches de direction '<=', '=>' et 95 '<=>' sont seulement là pour aider à la lecture de la logique, ils ne sont pas 96 utilisés par la commande net. Un espace doit séparer les flèches de direction 97 des noms de pin. 98 99 .Syntaxe et exemple: 100 ---- 101 net signal-name pin-name <direction optionnelle> (<second pin-name optionnel>) 102 103 net home-x axis.0.home-sw-in <= parport.0.pin-11-in 104 ---- 105 106 Dans l'exemple ci-dessus, 'home-x' est le nom du signal, 'axis.0.home-sw-in' est 107 une pin de direction IN, '<=' est une flèche de direction optionnelle et 108 'parport.0.pin-11-in' est une pin de direction OUT. Cela peut paraître déroutant 109 mais les labels in et out, pour une broche de port parallèle, indiquent la 110 direction physique dans laquelle travaille la broche et non comment elle est 111 traitée dans HAL. 112 113 Une pin peut être connectée à un signal si elle obéit aux règles suivantes: 114 115 * Une pin IN peut toujours être connectée à un signal. 116 * Une pin IO peut être connectée à moins qu'une pin OUT soit présente sur le signal. 117 * Une pin OUT peut être connectée seulement si il n'y a pas d'autre pin OUT ou IO 118 sur le signal. 119 120 Le même 'signal-name' peut être utilisé dans de multiples commandes net pour 121 connecter des pins additionnelles, tant que les règles précédentes sont observées. 122 123 .Direction du signal[[cap:Signal-Direction]] 124 125 image::images/signal-direction.png[align="left", alt="Direction du signal"] 126 127 Voici un exemple qui montre le signal xStep avec la source qui est stepgen.0.out 128 et avec deux lecteurs, parport.0.pin-02-out etparport.0.pin-08-out. Simplement 129 la valeur de stepgen.0.out est envoyée au signal xStep et cette valeur est alors 130 envoyée sur parport.0.pin-02-out. 131 ---- 132 # signal source destination 133 net xStep stepgen.0out => parport.0.pin-02-out 134 ---- 135 136 Puisque le signal xStep contient la valeur de stepgen.0.out (la source) il est 137 possible de ré-utiliser le même signal pour envoyer la valeur à d'autres lecteurs, 138 utiliser simplement le signal avec les autres lecteurs sur de nouvelles lignes: 139 ---- 140 # signal destination2 141 net xStep => parport.0.pin-08-out 142 ---- 143 144 Ce qui peut également s'écrire en une seule ligne: 145 ---- 146 # signal source destination1 destination2 147 net xStep stepgen.0.out => parport.0.pin-02-out parport.0.pin-08-out 148 ---- 149 150 151 .Pins I/O 152 Les pins appelées I/O pins comme 'index-enable', ne suivent pas cette règle. 153 154 === setp[[sub:setp]] 155 (((setp))) 156 157 La commande 'setp' ajuste la valeur d'une pin ou d'un paramètre. Les 158 valeurs valides dépendront du type de la pin ou du paramètre. 159 160 C'est une erreur si les types de donnée ne correspondent pas. 161 162 Certains composants ont des paramètres qui doivent être positionnés avant 163 utilisation. Il n'est pas possible d'utiliser 'setp' sur une pin connectée à 164 un signal. 165 166 Syntaxe et exemple: 167 ---- 168 setp <pin/parameter-name> <value> 169 170 setp parport.0.pin-08-out TRUE 171 ---- 172 173 === sets [[sub:sets]] (((sets))) 174 175 La commande 'sets' positionne la valeur d'un signal. 176 177 Syntaxe et exemple: 178 179 ---- 180 sets <signal-name> <value> 181 182 net mysignal and2.0.in0 pyvcp.my-led 183 sets mysignal 1 184 ---- 185 186 C'est une erreur si: 187 188 * Le nom de signal n'existe pas 189 * Le signal à déjà été écrit 190 * La valeur n'est pas du type correct pour le signal 191 192 === unlinkp 193 194 La commande 'unlinkp' déconnecte la pin du signal auquel elle est connectée. 195 Si aucun signal n'a été connecté à la pin avant de lancer cette commande, 196 rien ne se passe. 197 198 Syntaxe et exemple: 199 ---- 200 unlinkp <pin-name> 201 202 unlinkp parport.0.pin-02-out 203 ---- 204 205 === Commandes obsolètes 206 207 Les commandes suivantes sont dépréciées et seront retirées dans les futures 208 versions. Toute nouvelle configuration doit utiliser la commande <<sub:net,'net'>>. 209 210 === linksp 211 212 La commande 'linksp' a été remplacée par la commande 'net'. 213 214 La commande 'linksp' créait une 'connexion' entre un signal et une pin. 215 216 Syntaxe et exemple: 217 ---- 218 linksp <signal-name> <pin-name> 219 220 linksp X-step parport.0.pin-02-out 221 ---- 222 223 === linkps 224 225 La commande 'linkps' a été remplacée par la commande 'net'. 226 227 La commande 'linksp' créait une 'connexion' entre une pin et un signal. C'est la 228 même chose que linksp mais les arguments sont inversés. 229 230 Syntaxe et exemple: 231 ---- 232 linkps <pin-name> <signal-name> 233 234 linkps parport.0.pin-02-out X-Step 235 ---- 236 237 === newsig 238 239 the command 'newsig' creates a new HAL signal by the name <signame> 240 and the data type of <type>. Type must be 'bit', 's32', 'u32' or 241 'float'. Error if <signame> already exists. 242 243 Syntaxe et exemple: 244 ---- 245 newsig <signame> <type> 246 247 newsig Xstep bit 248 ---- 249 250 D'autres informations peuvent être trouvées dans le manuel de HAL ou 251 la man page de 'halrun'. 252 253 == HAL Data[[sec:HAL-Data]] 254 footnote:[NDT la description des données de HAL reste en Anglais, elle sont 255 suffisamment simples pour être comprises.] 256 257 === Bit (((Bit))) 258 259 A bit value is an on or off. 260 261 - bit values = true or 1 and false or 0 (True, TRUE, true are all valid) 262 263 === Float (((Float))) 264 265 A 'float' is a floating point number. In other words the decimal point 266 can move as needed. 267 268 - float values = a 64 bit floating point value, with approximately 53 bits of 269 resolution and over 1000 bits of dynamic range. 270 271 For more information on floating point numbers see: 272 273 http://fr.wikipedia.org/wiki/Nombre_flottant[http://fr.wikipedia.org/wiki/Nombre_flottant] 274 275 === s32 (((s32))) 276 277 An 's32' number is a whole number that can have a negative or positive 278 value. 279 280 - s32 values = integer numbers -2147483648 to 2147483647 281 282 === u32 (((u32))) 283 284 A 'u32' number is a whole number that is positive only. 285 286 - u32 values = integer numbers 0 to 4294967295 287 288 == Fichiers Hal 289 290 Si l'assistant StepConf a été utilisé pour générer la configuration 291 trois fichiers HAL ont dû être créés dans le répertoire de la 292 configuration. 293 294 - ma-fraiseuse.hal (si ne nom de la config est "ma-fraiseuse") Ce 295 fichier est chargé en premier, il ne doit pas être modifié sous peine 296 de ne plus pouvoir l'utiliser avec l'assistant StepConf. 297 - custom.hal Ce fichier est le deuxième à être chargé et il l'est avant 298 l'interface utilisateur graphique (GUI). C'est dans ce fichier que ce 299 trouvent les commandes personnalisées de l'utilisateur devant être 300 chargées avant la GUI. 301 - custom_postgui.hal Ce fichier est chargé après la GUI. C'est dans ce 302 fichier que se trouvent les commandes personnalisées de l'utilisateur 303 devant être chargées après la GUI. Toutes les commandes relatives aux 304 widgets de pyVCP doivent être placées ici. 305 306 == Composants de HAL 307 308 Deux paramètres sont automatiquement ajoutés à chaque composants HAL quand il 309 est créé. Ces paramètres permettent d'encadrer le temps d'exécution d'un composant. 310 311 +.time+(((time))) 312 313 +.tmax+(((tmax))) 314 315 316 'time' est le nombre de cycles du CPU qu'il a fallu pour exécuter la fonction. 317 318 'tmax' est le nombre maximum de cycles du CPU qu'il a fallu pour exécuter la fonction. 319 'tmax' est un paramètre en lecture/écriture, de sorte que l'utilisateur peut le 320 mettre à 0 pour se débarrasser du premier temps d'initialisation de la fonction. 321 322 == Composants de logiques combinatoire 323 324 Hal contient plusieurs composants logiques temps réel. Les composants 325 logiques suivent une tables de vérité montrant les états logiques des 326 sorties en fonction de l'état des entrées. Typiquement, la manipulation 327 des bits d'entrée détermine l'état électrique des sorties selon la 328 table de vérité des portes. 329 330 === and2 331 332 Le composant 'and2' est une porte 'and' à deux entrées. Sa table de 333 vérité montre la sortie pour chaque combinaison des entrées. 334 335 Syntaxe 336 ---- 337 and2 [count=N] or [names=name1[,name2...]] 338 ---- 339 340 Fonctions 341 342 +and2.n+ 343 344 Pins 345 346 and2.N.in0 (bit, in) 347 and2.N.in1 (bit, in) 348 and2.N.out (bit, out) 349 350 Table de vérité 351 352 [width="90%", options="header"] 353 |======================================== 354 |in0 | in1 | out 355 |False | False | False 356 |True | False | False 357 |False | True | False 358 |True | True | True 359 |======================================== 360 361 === not 362 363 Le composant 'not' est un simple inverseur d'état. 364 365 Syntaxe 366 ---- 367 not [count=n] or [names=name1[,name2...]] 368 ---- 369 370 Fonctions 371 372 not.all 373 not.n 374 375 Pins 376 377 not.n.in (bit, in) 378 not.n.out (bit, out) 379 380 Table de vérité 381 382 [width="90%", options="header"] 383 |======================================== 384 |in | out 385 |True | False 386 |False | True 387 |======================================== 388 389 === or2 390 391 Le composant 'or2' est une porte OR à deux entrées. 392 393 Syntaxe 394 ---- 395 or2[count=n] or [names=name1[,name2...]] 396 ---- 397 398 Functions 399 400 +or2.n+ 401 402 Pins 403 404 or2.n.in0 (bit, in) 405 or2.n.in1 (bit, in) 406 or2.n.out (bit, out) 407 408 Table de vérité 409 410 [width="90%", options="header"] 411 |======================================== 412 |in0 | in1 | out 413 |True | False | True 414 |True | True | True 415 |False | True | True 416 |False | False | False 417 |======================================== 418 419 === xor2 420 421 Le composant 'xor2' est une porte XOR à deux entrées (OU exclusif). 422 423 Syntaxe 424 ---- 425 xor2[count=n] or [names=name1[,name2...]] 426 ---- 427 428 Fonctions 429 430 +xor2.n+ 431 432 Pins 433 434 xor2.n.in0 (bit, in) 435 xor2.n.in1 (bit, in) 436 xor2.n.out (bit, out) 437 438 Table de vérité 439 440 [width="90%", options="header"] 441 |======================================== 442 |in0 | in1 | out 443 |True | False | True 444 |True | True | False 445 |False | True | True 446 |False | False | False 447 |======================================== 448 449 === Exemples en logique combinatoire 450 451 Un exemple de connexion avec un "and2", deux entrées vers une sortie. 452 ---- 453 loadrt and2 count=1 454 addf and2.0 servo-thread 455 net my-sigin1 and2.0.in0 <= parport.0.pin-11-in 456 net my-sigin2 and2.0.in1 <= parport.0.pin-12-in 457 net both-on parport.0.pin-14-out <= and2.0.out 458 ---- 459 460 Dans cet exemple un and2 est chargé dans l'espace temps réel, puis 461 ajouté à servo thread. Ensuite la broche d'entrée 11 du port parallèle 462 est connectée à l'entrée in0 de la porte. Puis la broche d'entrée 12 du 463 port est connectée à l'entrée in1 de la porte. Enfin la sortie 464 and2.0.out de la porte est connectée à la broche de sortie 14 du port 465 parallèle. Ainsi en suivant la table de vérité du and2, si les broches 466 11 et 12 du port sont à 1, alors sa sortie 14 est à 1 aussi. 467 468 == Composants de conversion 469 470 === Somme pondérée (weighted_sum) 471 472 La somme pondérée converti un groupe de bits en un entier. La conversion est la 473 somme des 'poids' des bits présents plus n'importe quel offset. C'est similaire 474 au 'binaire codé décimal' mais avec plus d'options. Le bit 'hold' interrompt le 475 traitement des entrées, de sorte que la valeur 'sum' ne change plus. 476 477 La syntaxe suivante est utilisée pour charger le composant weighted_sum. 478 ---- 479 loadrt weighted_sum wsum_sizes=size[,size,...] 480 ---- 481 482 Crée des groupes de weighted_sum, chacun avec le nombre donné de bits d'entrée (size). 483 484 Pour mettre à jour la weighted_sum, le process_wsums doit être attaché à un thread. 485 486 ---- 487 addf process_wsums servo-thread 488 ---- 489 490 Ce qui met à jour le composant weighted_sum. 491 492 Dans l'exemple suivant, une copie de la fenêtre de configuration de HAL d'Axis, 493 les bits '0' et '2' sont TRUE, ils n'ont pas d'offset. Le poids ('weight') du bit 0 494 est 1, celui du bit 2 est 4, la somme est donc 5. 495 496 .weighted_sum (somme pondérée) 497 ---- 498 Component Pins: 499 Owner Type Dir Value Name 500 10 bit In TRUE wsum.0.bit.0.in 501 10 s32 I/O 1 wsum.0.bit.0.weight 502 10 bit In FALSE wsum.0.bit.1.in 503 10 s32 I/O 2 wsum.0.bit.1.weight 504 10 bit In TRUE wsum.0.bit.2.in 505 10 s32 I/O 4 wsum.0.bit.2.weight 506 10 bit In FALSE wsum.0.bit.3.in 507 10 s32 I/O 8 wsum.0.bit.3.weight 508 10 bit In FALSE wsum.0.hold 509 10 s32 I/O 0 wsum.0.offset 510 10 s32 Out 5 wsum.0.sum 511 ---- 512 513