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
| Variable | Nom | Utilisation |
|---|---|---|
| #1–#26 | Arguments locaux A–Z | Transmis par G65 — valeurs passées lors de l'appel macro |
| #100–#149 | Variables locales | Persistantes dans la macro, remises à zéro hors contexte |
| #500–#549 | Variables communes | Persistantes entre toutes les macros et programmes — survivent au reset |
| #1000+ | Variables système | Données machine : position, override, numéro outil actif… |
| #0 | Null / vide | Variable 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.