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 ----