/ docs / src / hal / hal-examples_fr.txt
hal-examples_fr.txt
  1  :lang: fr
  2  :toc:
  3  
  4  = Exemples pour HAL 
  5  
  6  [[Exemples-pour-HAL]]
  7  
  8  Tous ces exemples s'appuient sur une configuration créée par Stepconf, 
  9  elle a deux threads, _base-thread_ et _servo-thread_. 
 10  
 11  L'assistant de configuration Stepconf aura créé le fichier vide _custom.hal_ 
 12  et le fichier _custom_postgui.hal_.
 13  
 14  Le fichier custom.hal sera chargé après le fichier de configuration de HAL, 
 15  le fichier custom_postgui.hal sera chargé après que l'interface graphique ne le
 16  soit.
 17  
 18  == Changement d'outil manuel
 19  
 20  Dans cet exemple, il est supposé que la configuration a été réalisée et  
 21  qu'il faut lui ajouter la fenêtre de changement d'outil de HAL. Le composant
 22  de changement d'outil manuel de HAL est surtout intéressant si les outils
 23  sont mesurables avec précision en longueur et que les offsets sont stockés 
 24  dans la table d'outils. Si il est nécessaire de faire un _Toucher_ pour chaque
 25  outil, il sera préférable de scinder le programme G-code en plusieurs tronçons. 
 26  Pour utiliser la fenêtre de changement manuel d'outil de HAL, il faut d'abord 
 27  charger le composant _hal_manualtoolchange_ puis envoyer l'ordre 
 28  _iocontrol tool change_ vers le _change_ de hal_manualtoolchange ainsi 
 29  qu'envoyer le _changed_ de hal_manualtoolchange en retour sur le 
 30  iocontrol tool changed.
 31  
 32  Voici un exemple _avec_ utilisation du composant de HAL, pour clarifier tout cela: 
 33  ----
 34  loadusr -W hal_manualtoolchange 
 35  net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change 
 36  net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed 
 37  net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number 
 38  net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared 
 39  ----
 40  
 41  Et voici un exemple _sans_ le composant de changement manuel: 
 42  ----
 43  net tool-number <= iocontrol.0.tool-prep-number 
 44  net tool-change-loopback iocontrol.0.tool.-change => iocontrol.0.tool-changed 
 45  net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared 
 46  ----
 47  
 48  == Calcul de vitesse
 49  
 50  Cet exemple utilise _ddt_, _mult2_ et _abs_ pour calculer la vitesse de 
 51  déplacement sur un axe. Pour plus de détails, voir la section 
 52  <<cha:Composants-de-HAL, sur les composants de HAL>>.
 53  
 54  En premier il convient de vérifier si la configuration contient déjà des 
 55  composants temps réel. Il est possible de le vérifier en ouvrant la fenêtre de 
 56  Halshow et en cherchant les composants dans la section des pins. Si il y en a
 57  déjà en activité, il faudra augmenter leur nombre et ajuster l'instance de ces 
 58  composants à la valeur correcte. Ajouter le code suivant dans le fichier _custom.hal_.
 59  
 60  Charger les composants temps réel.
 61  ----
 62  loadrt ddt count=1 
 63  loadrt mult2 count=1 
 64  loadrt abs count=1 
 65  ----
 66  
 67  Ajouter les fonctions au thread pour qu'elles soient rafraîchies.
 68  ----
 69  addf ddt.0 servo-thread 
 70  addf mult2.0 servo-thread 
 71  addf abs.0 servo-thread 
 72  ----
 73  
 74  Faire les connections.
 75  ----
 76  setp mult2.in1 60 
 77  net xpos-cmd ddt.0.in 
 78  net X-IPS mult2.0.in0 <= ddt.0.out 
 79  net X-ABS abs.0.in <= mult2.0.out 
 80  net X-IPM abs.0.out 
 81  ----
 82  
 83  Dans la dernière section, nous avons fixé le _mult2.0.in1_ à 60 pour convertir
 84  les unités par seconde en unités par minute (dans cet exemple, des pouces/mn), 
 85  nous l'obtenons sur la sortie _ddt.0.out_.
 86  
 87  La commande _xpos-cmd_ envoie la position commandée à l'entrée _ddt.0.in_. 
 88  Le _ddt_ calcule la dérivée de la variation du signal sur son entrée.
 89  
 90  La sortie ddt2.0.out est multipliée par 60 pour obtenir des unités par minute.
 91  
 92  La sortie mult2.0.out est envoyée au composant _abs_ pour obtenir la valeur 
 93  absolue.
 94  
 95  La figure suivante montre le résultat quand l'axe X se déplace à 15 unités/mn 
 96  dans la direction négative. Noter que la valeur absolue peut être prise sur
 97  la pin _abs.0.out_ ou le signal X-IPM.
 98  
 99  [[cap:Velocity-Example]]
100  .Exemple avec la vitesse
101  (((Velocity exemple)))
102  
103  image::images/velocity-01.png[]
104  
105  == Amortissement d'un signal
106  
107  Cette exemple montre comment les composants de HAL _lowpass_, _limit2_ ou
108  _limit3_ peuvent être utilisés pour amortir de brusques changements d'un signal.
109  
110  Nous sommes sur un tour dont la broche est pilotée par un servomoteur. Si nous 
111  envoyions directement la consigne de vitesse de broche sur le servo, celui-ci
112  chercherait, à partir de la vitesse courante, à atteindre la vitesse commandée
113  le plus vite possible. Cette situation est problématique et peut détériorer
114  le matériel. Pour amortir ce changement de vitesse, nous pouvons faire passer 
115  la sortie _spindle.N.speed-out_ à travers un limiteur avant d'aller au PID, 
116  de sorte que la valeur de commande du PID soit amortie.
117  
118  Les trois composants intégrés pour amortir le signal seront:
119  
120  limit2::
121  - Limite le signal de sortie pour qu’il soit entre min et max.
122  - Limite sa vitesse de montée à moins de MaxV par seconde. (dérivée première)
123  
124  limit3::
125  - Limite le signal de sortie pour qu’il soit entre min et max.
126  - Limite sa vitesse de montée à moins de MaxV par seconde. (dérivée première)
127  - Limite sa vitesse de montée à moins de MaxV par seconde^2^. (dérivée seconde)
128  
129  lowpass::
130  - Filtre passe-bas. 
131  
132  Pour plus de détails voir <<cha:Composants-de-HAL, les composants de HAL>> 
133  ou les man pages des composants concernés.
134  
135  Placer le code suivant dans un fichier appelé _softstart.hal_. 
136  ----
137  loadrt threads period1=1000000 name1=thread  
138  loadrt siggen  
139  loadrt lowpass  
140  loadrt limit2  
141  loadrt limit3  
142  net square siggen.0.square => lowpass.0.in limit2.0.in limit3.0.in  
143  net lowpass <= lowpass.0.out  
144  net limit2 <= limit2.0.out  
145  net limit3 <= limit3.0.out  
146  setp siggen.0.frequency .1  
147  setp lowpass.0.gain .01  
148  setp limit2.0.maxv 2  
149  setp limit3.0.maxv 2  
150  setp limit3.0.maxa 10  
151  addf siggen.0.update thread  
152  addf lowpass.0 thread  
153  addf limit2.0 thread  
154  addf limit3.0 thread  
155  start  
156  loadusr halscope 
157  ----
158  
159  Ouvrir un terminal et et lancer le fichier avec la commande suivante:
160  ----
161  halrun -I softstart.hal
162  ----
163  
164  Pour démarrer l'oscilloscope de HAL pour la première fois, cliquer _OK_ pour
165  accepter le thread par défaut.
166  
167  Ensuite, il faut ajouter les signaux à suivre aux canaux du scope. Cliquer sur 
168  le canal _1_ puis sélectionner _square_ depuis l'onglet _Signaux_. Répéter 
169  pour les canaux suivants en ajoutant _lowpass_, _limit2_ et _limit3_.
170  
171  Ensuite, pour régler le signal du déclencheur cliquer sur le bouton 
172  _Source_ est sélectionner _square_. Le bouton devrait changer pour 
173  _Source Canal 1_.
174  
175  Puis, cliquer sur _Simple_ dans le groupe _Mode Run_. L'oscillo 
176  devrait faire un balayage puis, afficher les traces.
177  
178  Pour séparer les signaux et mieux les visualiser, cliquer sur un canal et 
179  utiliser le curseur de position verticale pour positionner les traces.
180  
181  .Amortissement d'un signal carré[[cap:Softstart]]
182  
183  image::images/softstart-scope_fr.png[]
184  
185  Pour voir l'effet d'un changement du point de réglage des valeurs des composants,
186  il est possible de passer des commandes depuis le terminal. Par exemple,pour 
187  voir différentes valeurs de gain pour le passe-bas, taper la commande suivante,
188  puis essayer différentes valeurs:
189  ----
190  setp lowpass.0.gain .01
191  ----
192  
193  Après un changement de réglage, relancer Halscope pour visualiser l'effet.
194  
195  Pour terminer, taper _exit_ dans le terminal pour fermer halrun et halscope. 
196  Ne pas refermer le terminal avec halrun en marche, la mémoire ne serait pas
197  vidée proprement, ce qui pourrait empêcher LinuxCNC de se charger.
198  
199  Pour tout savoir sur Halscope et Halrun <<sec:Intro-tutoriel, voir le
200  tutoriel de HAL>>.
201  
202  == HAL en autonome
203  
204  Dans certains cas il peut être utile de lancer un écran GladeVCP avec juste HAL.
205  Par exemple, nous avons un moteur pas à pas a piloter et tout ce qu'il nous faut
206  pour notre application est une simple interface avec _Marche/Arrêt_ plutôt que
207  charger une application de CNC complète.
208  
209  Dans l'exemple qui suit, nous allons créer ce simple panneau GladeVCP.
210  
211  .Syntaxe de base
212  ----
213  # charge l'interface graphique winder.glade et la nome winder
214  loadusr -Wn winder gladevcp -c winder -u handler.py winder.glade
215  
216  # charge les composants temps réel
217  loadrt threads name1=fast period1=50000 fp1=0 name2=slow period2=1000000
218  loadrt stepgen step_type=0 ctrl_type=v
219  loadrt hal_parport cfg="0x378 out"
220  
221  # ajoute les fonctions aux threads
222  addf stepgen.make-pulses fast
223  addf stepgen.update-freq slow
224  addf stepgen.capture-position slow
225  addf parport.0.read fast
226  addf parport.0.write fast
227  
228  # effectue les connections de hal
229  net winder-step parport.0.pin-02-out <= stepgen.0.step
230  net winder-dir parport.0.pin-03-out <= stepgen.0.dir
231  net run-stepgen stepgen.0.enable <= winder.start_button
232  
233  
234  
235  # démarre les threads
236  start
237  
238  # commenter la ligne suivante pendant les essais et utiliser le mode interactif
239  pour voir les pins etc.
240  # option halrun -I -f start.hal
241  
242  # attends que la GUI gladevcp nommée winder soit terminée
243  waitusr winder
244  
245  # arrête tous les threads
246  stop
247  
248  # décharge tous les composants de HAL avant de quitter
249  unloadrt all
250  ----