CNCYRON
Programmation30 mars 2026 · 7 min de lecture

Sous-programmes CNC — M98, M99, G65 et macros Fanuc

Les sous-programmes évitent de répéter les mêmes séquences dans un programme CNC. M98/M99 pour les appels simples, G65 pour les macros paramétriques. Voici la syntaxe, les règles d'imbrication et des exemples atelier commentés.

M98 / M99 — appel simple

M98 P[numéro] L[répétitions] appelle le sous-programme numéro P. L indique le nombre de répétitions (défaut = 1). M99 termine le sous-programme et retourne au programme appelant.

; Programme principal O0001
G54 G90 G21
T01 M06          ; Fraise Ø10
G43 H01 Z50 M03 S3000

; Usiner la poche A (coin bas gauche)
G00 X10 Y10
M98 P1000        ; Appel sous-programme O1000

; Translater et répéter
G00 X60 Y10
M98 P1000        ; Même poche, autre position

M30              ; Fin programme

; ----- Sous-programme O1000 -----
O1000
G91              ; Incrémental pour le sous-prog
G01 Z-5 F200     ; Plonger 5 mm
G01 X30 F500
G01 Y20
G01 X-30
G01 Y-20
G00 Z10
G90              ; Retour absolu
M99              ; Retour au programme principal

Imbrication — sous-programme dans un sous-programme

Un sous-programme peut lui-même appeler un autre sous-programme (jusqu'à 4 niveaux sur Fanuc standard). Utile pour factoriser des mouvements élémentaires (ex. un cycle de perçage dans un programme de bridage).

O0002            ; Programme principal
  M98 P2000      ; Appelle O2000 (niveau 1)
  M30

O2000            ; Niveau 1
  M98 P3000      ; Appelle O3000 (niveau 2)
  M99

O3000            ; Niveau 2
  G01 X10 F300   ; Opération réelle
  M99

G65 — macros paramétriques Fanuc

G65 appelle une macro avec passage d'arguments. Les valeurs sont accessibles via les variables #1 (=A), #2 (=B), #3 (=C), #4 (=I), #5 (=J), #6 (=K)… jusqu'à 26 paramètres. Exemple : perçage sur un cercle (bolt hole pattern) paramétrique.

; Appel macro : 6 trous sur cercle Ø80, départ 0°, profondeur 20 mm
; A=Xcentre  B=Ycentre  C=rayon  I=nb_trous  J=angle_depart  K=profondeur
G65 P9010 A50 B50 C40 I6 J0 K-20

; ----- Macro O9010 — perçage sur cercle -----
O9010
#10 = 0                    ; Compteur trous
WHILE [#10 LT #4] DO1     ; Boucle #4 fois (= argument I)
  #11 = #3 * COS[#5 + #10 * 360.0 / #4]  ; X relatif
  #12 = #3 * SIN[#5 + #10 * 360.0 / #4]  ; Y relatif
  G90 G00 X[#1 + #11] Y[#2 + #12]
  G81 Z[#6] R5 F150       ; Cycle perçage profondeur #6
  #10 = #10 + 1
END1
G80                        ; Annuler cycle fixe
M99

Variables Fanuc — référence rapide

VariableNomUtilisation
#1–#26Arguments locaux A–ZTransmis par G65 — valeurs passées lors de l'appel macro
#100–#149Variables localesPersistantes dans la macro, remises à zéro hors contexte
#500–#549Variables communesPersistantes entre toutes les macros et programmes — survivent au reset
#1000+Variables systèmeDonnées machine : position, override, numéro outil actif…
#0Null / videVariable non initialisée — tester avec IF [#1 EQ #0]

3 règles à ne pas oublier

Toujours revenir en G90 absolu après un sous-programme en G91

Si le sous-programme utilise G91 (incrémental) et se termine sans remettre G90, le programme appelant continuera en incrémental → trajectoire erronée. Toujours remettre G90 avant M99 ou vérifier le mode actif au retour.

Ne pas modifier les correcteurs outil (H, D) dans un sous-programme

Un changement de correction longueur H ou diamètre D dans un sous-programme persiste après M99. Si la macro doit changer de correction, sauvegarder et restaurer la valeur via une variable #500+ avant et après.

Numéroter les sous-programmes hors de la plage 8000–9999 sur certains CN

Fanuc réserve O8000–O9999 pour les programmes système et macros constructeur. Utiliser O1000–O7999 pour vos sous-programmes. Sur certains contrôleurs, O9000+ est protégé en écriture par mot de passe machine.

Questions fréquentes

G-code débutantRéférence sous-programmes← Blog