/ docs / src / gcode / o-code_fr.txt
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: