1. Utilisation des O-codes

Les O-codes permettent le contrôle de flux dans les programmes NGC. Ils commencent par une lettre O, qu’il ne faut pas confondre avec le chiffre 0. Chaque bloc est associé à une adresse, qui est la valeur utilisée après la lettre O. Il faut prendre soin de bien faire correspondre les adresses des O-codes.

Exemple de numérotation
o100 sub
(noter que les blocs if - endif utilisent des numéros différents)
  o110 if [#2 GT 5]
    (du code ici)
  o110 endif
  (encore du code ici)
o100 endsub

Le comportement est indéfini si:

  • Le même nombre est utilisé pour plusieurs blocs

  • D’autres mots sont utilisés sur une ligne contenant un mot O-.

  • Un commentaire est utilisé sur une ligne contenant un mot O-.

Astuce
L’utilisation de la lettre o minuscule facilite la distinction avec le chiffre 0 qui peut être tapé par erreur. Par exemple:
o100 est plus facile à distinguer de 0100 que O100.

2. Sous-programmes: sub, endsub, return, call

Les sous-programmes s'étendent d’un O- sub à un O- endsub. Les lignes, à l’intérieur du sous-programme (le corps du sous-programme), ne sont pas exécutées dans l’ordre, mais elles sont exécutées à chaque fois que le sous-programme est appelé avec un O-call.

Exemple de sous-programme
O100 sub (sous-programme de mouvement rapide à l'origine)
  G53 X0 Y0 Z0
O100 endsub
  (autres lignes)
O100 call (ici, appel du sous-programme)
M2

Pour plus de détails sur ces instructions voir:

O- return

À l’intérieur d’un sous-programme, O- return peut être exécuté, pour retourner immédiatement au code appelant, comme si O- endsub avait été rencontré.

Exemple avec O- return
o100 sub
  o110 if [#2 GT 5] (teste si le paramètre #2 est supérieur à 5)
    o100 return (si le test est vrai, retourne au début du sous-programme)
  o110 endif
  (autre code ici, qui sera exécuté si le paramètre #2 est inférieur à 5)
o100 endsub

Voir également les sections:

O- call

O- call peut prendre jusqu'à 30 arguments optionnels, qui sont passés au sous-programme comme #1, #2 , …, #N. Les paramètres de #N+1 à #30 ont la même valeur dans le contexte de l’appel. Au retour du sous-programme, les valeurs des paramètres #1 jusqu'à #30 (quel que soit le nombre d’arguments) sont restaurés aux valeurs qu’ils avaient avant l’appel.

Parce que 1 2 3 est analysé comme le nombre 123, les paramètres doivent être placés entre crochets. L’appel de sous-programme suivant, s’effectue avec 3 arguments:

Exemple d’appel O-
O200 call [1] [2] [3]

Les corps de sous-programme ne peuvent pas être imbriqués. Ils ne peuvent être appelés qu’après avoir été définis. Ils peuvent être appelés depuis d’autres fonctions et peuvent s’appeler eux même récursivement, s’il est judicieux de le faire. Le niveau maximum d’imbrication des sous-programmes est de 10.

Les sous-programmes n’ont pas de valeur de retour, mais ils peuvent changer la valeur des paramètres au dessus de #30 et ces changements sont visibles depuis le code appelant. Les sous-programmes peuvent aussi changer la valeur des paramètres nommés globaux.

3. Boucles: do, while, endwhile, break, continue

La boucle while a deux structures possibles: while - endwhile et do - while. Dans chaque cas, la boucle est quittée quand la condition du while devient fausse. La différence se trouve en fin de test de la condition. La boucle do - while exécute le code dans la boucle puis test la condition. La boucle while - endwhile effectue le test d’abord.

Exemple avec while - endwhile
(dessine la forme d'une dent de scie)
G0 X1 Y0 (déplacement en position de départ)
#1 = 1 (assigne la valeur 1 au paramètre #1)
F25 (fixe la vitesse d'avance travail)
o101 while [#1 LT 10]
  G1 X0
  G1 Y[#1/10] X1
  #1 = [#1+1] (incrémente le compteur de test)
o101 endwhile
M2 (fin de programme)
Exemple avec do - while
#1 = 0 (assigne la valeur 0 au paramètre #1)
o100 do
  (debug, paramètre 1 = #1)
  o110 if [#1 EQ 2]
    #1 = 3 (assigne la valeur 3 au paramètre #1)
    (msg, #1 s'est vu assigné la valeur 3)
    o100 continue (saute au début de la boucle)
  o110 endif
  (le code d'usinage ici)
  #1 = [#1 + 1] (incrémente le compteur de test)
o100 while [#1 LT 3]
(msg, boucle terminée)
M2

À l’intérieur d’une boucle while, O- break, quitte immédiatement la boucle et O- continue, saute immédiatement à la prochaine évaluation de la condition du while. Si elle est vraie, la boucle recommence au début. Si elle est fausse, la boucle est quittée.

4. Conditionnel: if, elseif, else, endif

Le if conditionnel exécute un groupe d’instructions avec le même nombre O qui commence avec if et se termine avec endif. Les conditions optionnelles elseif et else peuvent se trouver entre le if et le endif.

Si la condition du if est vraie, les instructions qui suivent le if seront exécutées jusqu'à, au maximum, l’instruction conditionnelle suivante.

Si la condition du if est fausse, alors les instructions conditionnelles elseif suivantes seront évaluées l’une après l’autre. Si la condition du elseif est vraie alors les instructions suivant ce elseif seront exécutées jusqu'à l’instruction conditionnelle suivante. Si aucune des conditions du if ou du elseif n’est vraie, alors les instructions suivant le else seront exécutées. Quand une condition est vraie, les autres instructions conditionnelles du groupe ne sont plus évaluées.

Exemple avec if - endif
O102 if [#31 EQ 3] (si le paramètre #31 est égal à 3 alors S2000)
    S2000
O102 endif
Exemple avec if - elseif - else - endif
o102 if [#2 GT 5] (si le paramètre #2 est supérieur à 5 alors F100)
  F100
o102 elseif [#2 LT 2] (sinon si le paramètre #2 est inférieur à 2 alors F200)
  F200
o102 else (sinon le paramètre #2 vaut entre 2 et 5 alors F150)
  F150
o102 endif

5. Répétition: Repeat

La répétition repeat, exécutera les blocs contenus entre repeat et endrepeat le nombre de fois spécifié entre crochets. L’exemple suivant montre comment usiner une séries de 5 formes diagonales commençant à la position courante.

Exemple avec repeat
(Usine 5 formes diagonales)
G91 (Mode incrémental)
O103 repeat [5]
    (insérer le code d'usinage ici)
    G0 X1 Y1 (Mouvement en diagonale vers la position suivante)
O103 endrepeat
G90 (Mode absolu)

6. Indirection

L’adresse de O- peut être donnée par un paramètre ou un calcul.

Exemple d’indirection
O[#101+2] call
Calcul des valeurs dans les O-codes

Voici un condensé des sections utiles aux calculs des O-codes:

7. Appel de fichier

Pour appeler un sous-programme par son nom, ce sous-programme doit contenir un sub et un endsub. Le fichier appelé doit se trouver dans le répertoire pointé par la variable PROGRAM_PREFIX ou SUBROUTINE_PATH du fichier ini. Les noms de fichiers ne peuvent inclure que des lettres minuscules, des chiffres, des points et des tirets bas. Un fichier de sous-programme nommé ne peut contenir qu’une seule définition de sous-programme.

Exemple: l’appel d’un fichier nommé
o<monfichier> call (appel un fichier nommé)
Exemple: l’appel d’un fichier numéroté
o123 call (appel un fichier numéroté)

Dans le fichier appelé doit se touver le sub et le endsub correspondant à l’appel. Le fichier doit être un fichier valide.

Exemple: le fichier monfichier.ngc appelé
o<monfichier> sub
  (du code ici)
o<monfichier> endsub
M2
Note
Les noms de fichiers doivent être en lettres minuscules, ainsi o<MonFichier> sera transformé en o<monfichier> par l’interpréteur.