o-code_fr.txt
1 :lang: fr 2 :toc: 3 4 = Les O-codes 5 6 [[cha:O-codes]] 7 8 == Utilisation des O-codes 9 10 Les O-codes permettent le contrôle de flux dans les programmes NGC. 11 Ils commencent par une lettre *O*, qu'il ne faut pas confondre avec le 12 chiffre *0*. Chaque bloc est associé à une adresse, qui est la valeur utilisée 13 après la lettre *O*. Il faut prendre soin de bien faire correspondre les 14 adresses des O-codes. 15 16 .Exemple de numérotation 17 ---- 18 o100 sub 19 (noter que les blocs if - endif utilisent des numéros différents) 20 o110 if [#2 GT 5] 21 (du code ici) 22 o110 endif 23 (encore du code ici) 24 o100 endsub 25 ---- 26 27 Le comportement est indéfini si: 28 29 * Le même nombre est utilisé pour plusieurs blocs 30 * D'autres mots sont utilisés sur une ligne contenant un mot O-. 31 * Un commentaire est utilisé sur une ligne contenant un mot O-. 32 33 [TIP] 34 L'utilisation de la lettre *o* minuscule facilite la distinction avec le 35 chiffre *0* qui peut être tapé par erreur. Par exemple: + 36 *+o100+* est plus facile à distinguer de *+0100+* que *+O100+*. 37 38 [[sec:Sous-programmes]] 39 == Sous-programmes: *sub*, *endsub*, *return*, *call* 40 (((Sous-programmes)))(((sub)))(((endsub)))(((return)))(((call))) 41 42 Les sous-programmes s'étendent d'un 'O- sub' à un 'O- endsub'. 43 Les lignes, à l'intérieur du sous-programme (le corps du 44 sous-programme), ne sont pas exécutées dans l'ordre, mais 45 elles sont exécutées à chaque fois que le sous-programme 46 est appelé avec un 'O-call'. 47 48 .Exemple de sous-programme 49 ---- 50 O100 sub (sous-programme de mouvement rapide à l'origine) 51 G53 X0 Y0 Z0 52 O100 endsub 53 (autres lignes) 54 O100 call (ici, appel du sous-programme) 55 M2 56 ---- 57 58 Pour plus de détails sur ces instructions voir: 59 60 * <<sec:G53-Mouvement-Coordonnees-Absolues, mouvement G53>>, 61 * <<sec:G0, mouvement rapide G0>>, 62 * <<sec:M2-M30, fin de programme M2>>. 63 64 .O- return 65 À l'intérieur d'un sous-programme, 'O- return' peut être exécuté, 66 pour retourner immédiatement au code appelant, 67 comme si 'O- endsub' avait été rencontré. 68 69 .Exemple avec 'O- return' 70 ---- 71 o100 sub 72 o110 if [#2 GT 5] (teste si le paramètre #2 est supérieur à 5) 73 o100 return (si le test est vrai, retourne au début du sous-programme) 74 o110 endif 75 (autre code ici, qui sera exécuté si le paramètre #2 est inférieur à 5) 76 o100 endsub 77 ---- 78 79 Voir également les sections: 80 81 * <<sec:Operateurs-Binaires, les opérateurs binaires>>, 82 * <<sec:parametres, les paramètres>>. 83 84 .O- call 85 'O- call' peut prendre jusqu'à 30 arguments optionnels, qui sont 86 passés au sous-programme comme '#1', '#2' , ..., '#N'. Les paramètres de '#N+1' à 87 '#30' ont la même valeur dans le contexte de l'appel. 88 Au retour du sous-programme, les valeurs des 89 paramètres #1 jusqu'à #30 (quel que soit le nombre d'arguments) sont 90 restaurés aux valeurs qu'ils avaient avant l'appel. 91 92 Parce que '1 2 3' est analysé comme le nombre 123, les paramètres 93 doivent être placés entre crochets. L'appel de sous-programme suivant, 94 s'effectue avec 3 arguments: 95 96 .Exemple d'appel 'O-' 97 ---- 98 O200 call [1] [2] [3] 99 ---- 100 101 Les corps de sous-programme ne peuvent pas être imbriqués. Ils ne 102 peuvent être appelés qu'après avoir été définis. Ils peuvent être 103 appelés depuis d'autres fonctions et peuvent s'appeler eux même 104 récursivement, s'il est judicieux de le faire. Le niveau maximum 105 d'imbrication des sous-programmes est de 10. 106 107 Les sous-programmes n'ont pas de 'valeur de retour', mais ils peuvent 108 changer la valeur des paramètres au dessus de #30 et ces changements 109 sont visibles depuis le code appelant. Les sous-programmes peuvent 110 aussi changer la valeur des paramètres nommés globaux. 111 112 [[sec:Boucles]] 113 == Boucles: *do*, *while*, *endwhile*, *break*, *continue* 114 (((Boucles)))(((do)))(((while)))(((endwhile)))(((break)))(((continue))) 115 116 La boucle 'while' a deux structures possibles: 'while - endwhile' et 'do - while'. 117 Dans chaque cas, la boucle est quittée quand la condition du 'while' devient 118 fausse. La différence se trouve en fin de test de la condition. La boucle 119 'do - while' exécute le code dans la boucle puis test la condition. 120 La boucle 'while - endwhile' effectue le test d'abord. 121 122 .Exemple avec 'while - endwhile' 123 ---- 124 (dessine la forme d'une dent de scie) 125 G0 X1 Y0 (déplacement en position de départ) 126 #1 = 1 (assigne la valeur 1 au paramètre #1) 127 F25 (fixe la vitesse d'avance travail) 128 o101 while [#1 LT 10] 129 G1 X0 130 G1 Y[#1/10] X1 131 #1 = [#1+1] (incrémente le compteur de test) 132 o101 endwhile 133 M2 (fin de programme) 134 ---- 135 136 .Exemple avec 'do - while' 137 ---- 138 #1 = 0 (assigne la valeur 0 au paramètre #1) 139 o100 do 140 (debug, paramètre 1 = #1) 141 o110 if [#1 EQ 2] 142 #1 = 3 (assigne la valeur 3 au paramètre #1) 143 (msg, #1 s'est vu assigné la valeur 3) 144 o100 continue (saute au début de la boucle) 145 o110 endif 146 (le code d'usinage ici) 147 #1 = [#1 + 1] (incrémente le compteur de test) 148 o100 while [#1 LT 3] 149 (msg, boucle terminée) 150 M2 151 ---- 152 153 À l'intérieur d'une boucle while, 'O- break', quitte immédiatement 154 la boucle et 'O- continue', saute immédiatement à la prochaine 155 évaluation de la condition du 'while'. Si elle est vraie, la boucle 156 recommence au début. Si elle est fausse, la boucle est quittée. 157 158 [[sec:Conditionnels]] 159 == Conditionnel: *if*, *elseif*, *else*, *endif* 160 (((Conditionnel: if, elseif, else, endif)))(((if)))(((else)))(((elseif)))(((endif))) 161 162 Le 'if' conditionnel exécute un groupe d'instructions avec le même nombre 'O' 163 qui commence avec 'if' et se termine avec 'endif'. Les conditions optionnelles 164 'elseif' et 'else' peuvent se trouver entre le 'if' et le 'endif'. 165 166 Si la condition du 'if' est vraie, les instructions qui suivent le 'if' seront 167 exécutées jusqu'à, au maximum, l'instruction conditionnelle suivante. 168 169 Si la condition du 'if' est fausse, alors les instructions conditionnelles 170 'elseif' suivantes seront évaluées l'une après l'autre. Si la condition du 171 'elseif' est vraie alors les instructions suivant ce 'elseif' seront exécutées 172 jusqu'à l'instruction conditionnelle suivante. Si aucune des conditions du 'if' 173 ou du 'elseif' n'est vraie, alors les instructions suivant le 'else' seront 174 exécutées. Quand une condition est vraie, les autres instructions 175 conditionnelles du groupe ne sont plus évaluées. 176 177 .Exemple avec 'if - endif' 178 ---- 179 O102 if [#31 EQ 3] (si le paramètre #31 est égal à 3 alors S2000) 180 S2000 181 O102 endif 182 ---- 183 184 .Exemple avec 'if - elseif - else - endif' 185 ---- 186 o102 if [#2 GT 5] (si le paramètre #2 est supérieur à 5 alors F100) 187 F100 188 o102 elseif [#2 LT 2] (sinon si le paramètre #2 est inférieur à 2 alors F200) 189 F200 190 o102 else (sinon le paramètre #2 vaut entre 2 et 5 alors F150) 191 F150 192 o102 endif 193 ---- 194 195 [[sec:Repetitions]] 196 == Répétition: *Repeat* 197 (((Repeat))) 198 199 La répétition 'repeat', exécutera les blocs contenus entre 'repeat' et 200 'endrepeat' le nombre de fois spécifié entre crochets. L'exemple 201 suivant montre comment usiner une séries de 5 formes diagonales 202 commençant à la position courante. 203 204 .Exemple avec 'repeat' 205 ---- 206 (Usine 5 formes diagonales) 207 G91 (Mode incrémental) 208 O103 repeat [5] 209 (insérer le code d'usinage ici) 210 G0 X1 Y1 (Mouvement en diagonale vers la position suivante) 211 O103 endrepeat 212 G90 (Mode absolu) 213 ---- 214 215 == Indirection 216 (((Indirection))) 217 218 L'adresse de O- peut être donnée par un paramètre ou un calcul. 219 220 .Exemple d'indirection 221 ---- 222 O[#101+2] call 223 ---- 224 225 .Calcul des valeurs dans les O-codes 226 Voici un condensé des sections utiles aux calculs des O-codes: 227 228 * <<sec:parametres, les paramètres>>, 229 * <<sec:Expressions, les expressions>>, 230 * <<sec:Operateurs-Binaires, les opérateurs binaires>>, 231 * <<sec:Fonctions, les fonctions>>. 232 233 == Appel de fichier 234 (((Appel de fichier))) 235 236 Pour appeler un sous-programme par son nom, ce sous-programme doit contenir 237 un 'sub' et un 'endsub'. Le fichier appelé doit se trouver dans le répertoire 238 pointé par la variable 'PROGRAM_PREFIX' ou 'SUBROUTINE_PATH' du fichier ini. 239 Les noms de fichiers ne peuvent inclure que des lettres *minuscules*, des 240 chiffres, des points et des tirets bas. Un fichier de sous-programme nommé ne 241 peut contenir qu'une seule définition de sous-programme. 242 243 .Exemple: l'appel d'un fichier nommé 244 ---- 245 o<monfichier> call (appel un fichier nommé) 246 ---- 247 248 .Exemple: l'appel d'un fichier numéroté 249 ---- 250 o123 call (appel un fichier numéroté) 251 ---- 252 253 Dans le fichier appelé doit se touver le 'sub' et le 'endsub' 254 correspondant à l'appel. Le fichier doit être un fichier valide. 255 256 .Exemple: le fichier 'monfichier.ngc' appelé 257 ---- 258 o<monfichier> sub 259 (du code ici) 260 o<monfichier> endsub 261 M2 262 ---- 263 264 [NOTE] 265 Les noms de fichiers doivent être en lettres minuscules, ainsi 'o<MonFichier>' 266 sera transformé en 'o<monfichier>' par l'interpréteur. 267 268 // vim: set syntax=asciidoc: