CNCYRON
Connexion

Sous-programmes CNC — M98, M99

Les sous-programmes permettent de factoriser des séquences répétitives dans un programme CNC. Un appel M98 exécute le sous-programme puis revient au bloc suivant via M99. Syntaxe Fanuc, Siemens 840D SL et Heidenhain iTNC / TNC 640.

PROGRAMMATION — SOUS-PROGRAMMES M98/M99

M99 dans le programme principal (sans sous-programme actif) reboucle indéfiniment — M30 n'est jamais atteint, arrêt manuel obligatoire. M98 P__L__ sans L = 1 seul appel (pas de boucle infinie). G65 passe des arguments à la macro, M98 non — ne pas les interchanger. Action : réserver M99 exclusivement aux sous-programmes. Dans tout programme principal, terminer par M30. Vérifier qu'aucun M99 orphelin ne subsiste lors des modifications de code.

Syntaxe de base — Fanuc M98 / M99

; ----- Programme principal -----
O0100
N10 G21 G17 G40 G49 G80
N20 G90 G54
N30 T01 M06
N40 M03 S2000 M08
N50 G00 X10. Y10.
N60 M98 P0200        ; Appel sous-programme O0200 (1 fois)
N70 G00 X60. Y10.
N80 M98 P0200        ; Même sous-programme, autre position
N90 G00 X110. Y60.
N100 M98 P0200 L3    ; Appel 3 fois consécutives
N110 M30             ; Fin programme principal

; ----- Sous-programme -----
O0200
N10 G91              ; Mode incrémental dans le sous-prog
N20 G01 Z-10. F200
N30 X30.
N40 G00 Z15.
N50 G90              ; Retour mode absolu
N60 M99              ; Retour au programme principal

Note : M98 Pnnnn — les 4 derniers chiffres de P = numéro du sous-programme (Onnnn). M98 P20200 = appel O0200 × 2 fois (L implicite = premier(s) chiffre(s)).

Comparaison — Fanuc / Siemens / Heidenhain

3 commandes numériques comparées sur les sous-programmes — appel, retour, numérotation, répétition et note.
CNAppelRetourNumérotationRépétitionNote
Fanuc 0i / 30iM98 P__M99O1000–O9999M98 P__L__ (L = nb répétitions)P = numéro programme. L optionnel (défaut = 1). G65 P__ pour macros avec arguments.
Siemens 840D SLCALL "NOM_PROG"RET (ou M17)Nom de fichier arbitraireCALL "NOM_PROG" P__ (P = nb répétitions)Sous-programme dans même répertoire ou chemin complet. L100 P3 syntaxe raccourcie.
Heidenhain iTNC / TNC 640CALL LBL 10 REP5LBL 0Numéro de label (LBL)REP n (n = nb répétitions)Label dans le même programme (pas de fichier séparé). Cycles via CYCL DEF.

Exemple avancé — grille de trous 3×3 avec G52

; Perçage Ø8 sur grille 3×3 (pas 30 mm)
O0300                       ; Programme principal
N10 G21 G17 G40 G49 G80
N20 G90 G54
N30 T01 M06                 ; Foret Ø8
N40 G43 H01
N50 M03 S1800 M08

N60 G52 X0 Y0               ; Décalage local = 0 (rangée 1)
N70 M98 P0310               ; Appel sous-prog rangée
N80 G52 X0 Y30.             ; Décalage +30Y (rangée 2)
N90 M98 P0310
N100 G52 X0 Y60.            ; Décalage +60Y (rangée 3)
N110 M98 P0310
N120 G52 X0 Y0              ; Annulation décalage
N130 G00 Z100.
N140 M30

O0310                       ; Sous-programme : 1 rangée de 3 trous
N10 G83 Z-20. R2. Q5. F120
N20 X0 Y0                   ; Trou 1
N30 X30. Y0                 ; Trou 2
N40 X60. Y0                 ; Trou 3
N50 G80
N60 M99

4 cas d'utilisation recommandés

4 cas d'usage typiques des sous-programmes — motifs répétitifs, multi-faces, bibliothèque opérations, palpage.
Cas d'usageDescriptionGain
Motifs répétitifs (grilles de trous)Percer/fraiser le même profil à plusieurs positions XY. Un seul sous-programme, appelé N fois avec décalage d'origine (G52/TRANS).Code × 10 plus court, modification en un seul endroit
Opérations multi-facesMême usinage sur 4 ou 6 faces d'un cube. Le sous-programme contient les passes, le programme principal gère les rotations/décalages.Cohérence garantie entre toutes les faces
Bibliothèque d'opérations standardChanfrein, rayon, alésage, centrage — sous-programmes réutilisables entre différents programmes pièce.Standardisation atelier, moins d'erreurs
Sous-programme de mesure (palpeur)Macro d'étalonnage ou de mesure en cours d'usinage, appelée au début de chaque opération ou chaque pièce.Mesure in-process automatisée

Équivalents Siemens 840D SL — CALL et L__

; ----- Programme principal Siemens 840D -----
PROG_PRINCIPAL

G17 G90 G54
T1 D1 M6
S2000 M3 M8

; Appel sous-programme avec répétition (P3 = 3 fois)
CALL "RANGEE_TROUS" P3    ; Appel avec 3 répétitions

; Alternative : syntaxe raccourcie
L100 P3                   ; L100 = sous-programme numéroté

G0 Z100
M30

; ----- Sous-programme : RANGEE_TROUS -----
; (fichier séparé nommé "RANGEE_TROUS.SPF")
PROC RANGEE_TROUS

G81 Z=-20 RTP=2 RFP=0 DP=-18 F150
X0 Y0        ; Trou 1
X30 Y0       ; Trou 2
X60 Y0       ; Trou 3
G80

RET           ; Retour programme principal (équiv. M99 Fanuc)
              ; M17 également accepté sur Siemens

Pièges atelier et conseils terrain

DANGER
M99 dans programme principal — rebouclement infini, arrêt manuel obligatoire
M99 sans sous-programme actif (dans le programme principal) provoque un rebouclement infini — M30 n'est jamais atteint, la machine ne s'arrête plus automatiquement. Utile pour tests (cycles répétés indéfiniment), dangereux en production. Réserver M99 exclusivement aux sous-programmes. Vérifier qu'aucun M99 orphelin ne subsiste lors des modifications.
INFO
M98 P__L__ — L répétitions consécutives
M98 P0200 L3 = appel O0200 3 fois consécutivement. L optionnel (défaut = 1). L1 à L9999. Note Fanuc : M98 P20200 = équivalent M98 P0200 L2 (les 4 derniers chiffres = numéro programme, le(s) premier(s) = nombre de répétitions). Préférer la syntaxe explicite P0200 L3 pour la lisibilité.
ATTENTION
Imbrication 4 niveaux max (Fanuc standard)
Sous-programme appelant un autre sous-programme : 4 niveaux maxi sur Fanuc standard, 8 sur certains modèles. Au-delà : alarme Fanuc P/S 005 "TOO MANY NESTED LEVELS". Éviter au-delà de 3 niveauxpour la lisibilité et le debug. Documenter l'arbre d'appels en commentaires en début de programme principal.
ATTENTION
M98 vs G65 — choix selon paramètres
M98 P__ : appel simple, aucun argument transmis — utiliser variables communes #100-#199 (persistantes session) pour partager des données. G65 P__ : appel macro avec arguments A= B= D= … mappés sur #1-#26 dans la macro. G65 pour paramétrique (cycles personnalisés), M98 pour sous-programmes fixes.
INFO
Partage de paramètres M98 via variables communes #100-#199
M98 ne passe pas d'arguments, mais les variables communes #100-#199 (session) ou #500-#999 (persistantes) sont partagées entre tous les programmes. Initialiser dans le programme principal (#100 = 25.0), utiliser dans le sous-programme (G01 X#100 F200). Initialiser explicitement les variables pour éviter les valeurs résiduelles entre cycles.
DANGER
M30 obligatoire programme principal — pas M99
Le programme principal doit se terminer par M30 (fin + rembobinage) ou exceptionnellement M02 (fin sans rembobinage). M30 garantit le retour à l'état "prêt" pour le prochain cycle. Ne JAMAIS terminer un programme principal par M99 — rebouclement infini garanti.
📄 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

Aller plus loin — calculateurs et ressources

Macros Fanuc Custom Macro B/programmation-cnc/g-code/macros-fanuc/Variables #1-#999, IF/WHILE/GOTO, G65 arguments — sous-programmes paramétriques.Décalages d'origine G54-G59/programmation-cnc/g-code/decalages-origine/G52 décalage local cumulatif — base des sous-programmes multi-positions.Cycles fixes de perçage/programmation-cnc/g-code/cycles-percage/G81-G85 dans sous-programme + L répétitions = grilles de trous efficaces.Codes G et M — référence/programmation-cnc/g-code/codes-g-m/M98/M99 dans liste complète + M30 fin programme.Calculateur vitesse de coupe Vc/calculateurs/vitesse-de-coupe/Définir Vc une fois en début de programme, réutiliser dans tous les sous-programmes.Côtes hors tolérances/problemes-usinage/cotes-hors-tolerances/Erreur de paramètre dans sous-programme = série entière hors cote sans alarme.