CNCYRON
Connexion
ProgrammationMacros G655 avril 2026 · 10 min de lecture

Sous-programmes et programmation paramétrique CNC — guide complet

Les sous-programmes (M98/M99) et les macros paramétriques (G65, variables #1-#149, WHILE/DO, IF/GOTO)transforment un programme CNC linéaire en code réutilisable et maintenable. Ce guide progresse des bases (appel simple M98) jusqu'aux macros paramétriques avancées (G65 + control flow), avec exemples Fanuc commentés et équivalents Siemens / Heidenhain.

SOUS-PROGRAMMES & MACROS — RÉFÉRENCE

M98 P[numéro] appelle un sous-programme simple, M99 y retourne. G65 P[numéro] A.. B..appelle une macro paramétrique avec passage d'arguments mappés sur les variables locales #1 (=A), #2 (=B), … #26 (=Z). Variables : #1-#26 locales arguments G65, #100-#149 locales programme, #500-#549 NVRAM persistantes, #1000+ système lecture seule, #0 null. Control flow Fanuc : IF [cond] GOTO N_, WHILE [cond] DO m / END m (jusqu'à 3 niveaux DO imbriqués). Imbrication M98 : 4 niveaux standard (8 sur Fanuc 30i récents) — au-delà alarme PS0124. Règle absolue : revenir en G90 avant M99 si le sous-programme passe en G91. Équivalents : Siemens L[n] ou CALL + paramètres R, Heidenhain CALL LBL [n] + Q-params Q1-Q399. Numérotation : éviter O8000-O9999 réservé constructeur Fanuc.

1. Bases — appel simple M98/M99

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. Idéal pour factoriser une séquence répétée plusieurs fois (poche identique en différentes positions).

; Programme principal O0001 — appel simple M98/M99
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 la même poche en autre position
G00 X60 Y10
M98 P1000

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 OBLIGATOIRE
M99               ; Retour au programme appelant

2. Imbrication — sous-programme dans sous-programme

Un sous-programme peut lui-même appeler un autre sous-programme. Fanuc autorise jusqu'à 4 niveaux (8 sur 30i récents). Au-delà, l'alarme PS0124 (nesting overflow) est déclenchée.

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             ; Retour au niveau 1, puis niveau 0

3. Concepts intermédiaires — variables et control flow

ConceptSyntaxeExemple
Sous-programme simple M98/M99M98 P[numéro] L[répétitions]M98 P1000 L4 → appelle O1000 quatre fois
Variables locales #1-#33 via G65G65 P[sous-prog] [adresse=valeur…]G65 P9010 X25. Y15. Z-5. → #24=25, #25=15, #26=-5
Variables communes #100-#149#100 = [expression]#100 = #100 + 10. → incrémente à chaque appel
Branchement IF/GOTO + boucle DO/WHILEIF [cond] GOTO N[num] · DO m … END mIF [#100 GT 100] GOTO 99 → sortie si > 100

4. Variables Fanuc — référence rapide

Le système de variables Fanuc se compose de 5 plages distinctes, avec des règles de portée et de persistance différentes. Connaître ces plages évite les conflits de partage et les pertes de données entre macros.

VariableNomUtilisation
#1-#26Arguments locaux A-ZTransmis par G65 — valeurs passées lors de l'appel macro. Isolées par niveau d'imbrication.
#100-#149Variables locales (communes au programme)Persistantes pendant la macro, partagées entre niveaux. Remises à zéro au reset selon config.
#500-#549Variables communes NVRAMPersistantes entre macros et programmes — survivent au reset, sauvées en NVRAM.
#1000+Variables systèmeDonnées machine en lecture seule : position, override, numéro outil, palpeur.
#0Null / videVariable non initialisée — tester IF [#1 EQ #0] pour argument optionnel.

5. Macros G65 paramétriques — exemples avancés

5.1. Réseau de trous sur cercle — G65 + variables paramétriques

G65 transmet les paramètres : #1=A (Xc), #2=B (Yc), #3=C (rayon), #7=D (nb trous). WHILE/DO crée la boucle. Macro générique réutilisable pour tout réseau circulaire.

O0700 (APPEL RÉSEAU TROUS)
G54 G90 T0101 M6
G43 H1 Z50.
G97 S1500 M3 M8
G0 X0. Y0.

; Appel macro G65 : centre (0,0), rayon 40, 6 trous, départ 0°
G65 P9020 A0. B0. C40. D6. F0.

G0 Z100. M5 M9
M30

O9020 (MACRO : TROUS SUR CERCLE)
; #1=A=X centre, #2=B=Y centre, #3=C=rayon, #7=D=nb trous, #9=F=angle départ
#101 = #9                    (angle courant)
#102 = 360 / #7              (incrément angulaire)
#103 = 0                     (compteur)

WHILE [#103 LT #7] DO 1
  #24 = #1 + #3 * COS[#101]  (X position)
  #25 = #2 + #3 * SIN[#101]  (Y position)
  G0 X#24 Y#25
  G81 Z-15. R2. F150.        (cycle perçage)
  #101 = #101 + #102          (angle suivant)
  #103 = #103 + 1             (compteur)
END 1

G80
M99

5.2. Poche rectangulaire paramétrique — M98/M99 + variables #100

#100-#104 définissent la poche. Le WHILE découpe en passes de ap=3 mm jusqu'à la profondeur finale. Pattern type pour ébauche multipasse paramétrée.

O0800 (PROGRAMME PRINCIPAL)
G54 G90 T0202 M6  (FRAISE Ø10)
G43 H2 Z50.
G97 S3500 M3 M8

; Variables : longueur, largeur, profondeur, ap par passe
#100 = 60.    (longueur X)
#101 = 40.    (largeur Y)
#102 = -15.   (profondeur Z finale)
#103 = 3.     (ap par passe)
#104 = 0.     (Z courant)

G0 X-5. Y-5. Z5.

WHILE [#104 GT #102] DO 1
  #104 = #104 - #103
  IF [#104 LT #102] THEN #104 = #102
  G1 Z#104 F300.
  M98 P0801        (usinage contour poche)
END 1

G0 Z50. M5 M9
M30

O0801 (SOUS-PROG CONTOUR POCHE)
; Contour poche 60×40, centre (0,0)
G41 D2
G1 X-30. Y-20. F600.
Y20.
X30.
Y-20.
X-30.
G40 G1 X-35. Y-25.
M99

6. 3 règles à ne pas oublier

DANGER
1. Toujours revenir en G90 absolu avant M99
Si le sous-programme utilise G91 (incrémental) et se termine sans remettre G90, le programme appelant continuera en incrémental → trajectoire erronée potentiellement catastrophique. Toujours remettre G90 avant M99 ou vérifier le mode actif au retour. Convention industrielle : tout sous-programme qui a basculé en G91 doit le rebasculer en G90 dans son bloc de fin.
ATTENTION
2. 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. Sinon, le programme appelant utilisera la nouvelle correction sans le savoir.
INFO
3. Numéroter hors plage 8000-9999 (réservée constructeur Fanuc)
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 — vous ne pourriez de toute façon pas écraser la zone.

Pour aller plus loin — articles connexes

G-code pour débutants/blog/gcode-debutant-guide-complet/14 codes G/M essentiels — base avant macros et sous-programmesInterpolation circulaire G02/G03/blog/g02-g03-interpolation-circulaire-cnc/Arcs et cercles — combinables avec WHILE pour boucles circulairesCoordonnées polaires G15/G16/blog/coordonnees-polaires-g15-g16-cnc/Combiner G16 + WHILE pour réseau trous paramétriqueProgrammation Haas/blog/programmation-haas-guide-debutant/M97 sous-programme local + variables #500 persistantes HAASCycles Siemens SINUMERIK/blog/siemens-sinumerik-cycles-usinage-programmation/Équivalents L/CALL/PROC sur SINUMERIK 840DRéférence sous-programmes/programmation-cnc/g-code/sous-programmes/Hub programmation — codes G/M, dialectes constructeurs
📄 OUTIL ATELIER — PDF À IMPRIMER

Mémo Atelier CNC — Paramètres de coupe par matière

Vc, fz, Ra pour 10 matières (acier, inox, alu, titane, Inconel...) + 7 formules essentielles + checklist 16 points. 2 pages, format A4, à imprimer et garder près de la machine.

Aucun spam. Désabonnement en 1 clic. Données utilisées uniquement pour l'envoi de ressources CNCYRON, conformément à notre politique de confidentialité.

Questions fréquentes

Sources et références

Calculer paramètres avant programmation

Vitesse de broche N/calculateurs/vitesse-broche/N = (1000 × Vc) / (π × D) — paramètre S des macrosAvance fraisage Vf/calculateurs/avance-fraisage/Vf = fz × z × N — paramètre F des boucles WHILETemps usinage/calculateurs/temps-usinage/Évaluer gain temps d'une macro paramétrée