/ docs / src / hal / basic_hal_fr.txt
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