# Programmation de commande numérique

La programmation de commande numérique (CN) permet de définir des séquences d'instructions permettant de piloter des machines-outil à commande numérique. Cette programmation est actuellement fortement automatisée à partir de plans réalisés en CAO.
Dans le cas d'une commande numérique physique, c'est le directeur de commande numérique (DCN) qui interprète les instructions contenues dans les séquences, reçoit les informations des capteurs et agit sur les actionneurs.
On trouve aussi des pilotes de commande numériques qui sont des programmes (logiciels) informatiques s'exécutant sur un PC, avec éventuellement une délégation partielle des calculs vers une carte spécialisée.

## Langage

À l'origine, le langage de programmation était le G-code, développé par l'EIA au début des années 1960, et finalement normalisé par l'ISO en février 1980 sous la référence RS274D/ (ISO 6983).
Compte tenu de l'absence de développements ultérieurs et de la grande variété des configurations de machines-outils, peu de contrôleurs à commande numérique respectent de manière stricte ce standard. Des extensions et variantes ont été ajoutées indépendamment par divers fabricants et concepteurs de programmes, ce qui fait que les opérateurs doivent connaître les différents dialectes et particularités des machines qu'ils utilisent. Les programmes informatiques utilisent des pilotes adaptés à chaque machine et à sa configuration, les pilotes étant personnalisables par les utilisateurs.
Pendant longtemps, les programmes étaient directement écrits par les opérateurs des machines CNC. Depuis le développement des ordinateurs personnels, des programmes de FAO (fabrication assistée par ordinateur, ou en anglais CAM, Computer Aided Manufacturing) ont été développés afin d'écrire les séquences de code ISO automatiquement à partir de fichiers de dessin et des paramètres des outils finaux. Les interventions directement dans le code sont devenues marginales.
Pour vérifier le bon fonctionnement des séquences d'usinage, il existe des programmes de simulation d'usinage permettant une visualisation de la pièce telle qu'elle sera conçue lors de l'usinage.
La séquence de fabrication complète est donc :
CAO (conception assistée par ordinateur) → FAO (développement des séquences) → Simulation de coupe → Exécution de la fabrication.
À côté de l'ISO, de nouveaux codes sont apparus, différents selon le Directeur de Commande Numérique. Ils intègrent de plus en plus de l'ISO, des langages propres aux constructeurs (symbolique, C, etc.) ainsi que des interfaces de programmation interactives destinées à simplifier la programmation.

### Pour quelle utilisation

Développé à l'origine pour des machines-outils agissant par enlèvement de matière, le code ISO est désormais utilisé dans un domaine très vaste de la fabrication, avec des adaptations :
* usinage par enlèvement de matière : tournage, fraisage, perçage, gravure, défonçage ;
* découpe avec : couteau, laser, jet d'eau, plasma, flamme ou oxydation ;
* poinçonnage ;
* impression 3D : par dépôt de matière ("fabrication additive"), durcissement d'une résine.

### Les codes

* Fonctions préparatoires (G), fonctions d'appel de mode d'interpolation (G 0), cycle machine
* Coordonnées de points (X, Y, Z, A, B, C, I, J, K)
* Vitesses, avances… (S, F)
* Fonctions auxiliaires (M) qui permettent d'enclencher la lubrification, de changer d'outil, ou de déclencher des accessoires.
    X position absolue
    Y position absolue
    Z position absolue
    A position (rotation autour de l'axe X)
    B position (rotation autour de l'axe Y)
    C position (rotation autour de l'axe Z)
    U position relative ou axe secondaire
    V position relative ou axe secondaire
    W position relative ou axe secondaire
    M code fonction "machine" ou "modale" (un autre type d'action ou de code machine(*)) (parfois référencé comme fonction 'diverse' (Miscellaneous en anglais))
Permet aussi de contrôler des entités externes à la machine proprement dite (magasin auxiliaire, refroidisseur, compteur ETC, embarreur)
    D ou H association d'un correcteur de jauge outil
    F vitesse de déplacement, ou expression d'un temps de pause (G04) en seconde
    S vitesse de rotation
    C s'il est intégré dans un bloc de cycle fixe ébauche ou finition, C désigne un chanfrein
    N numéro de ligne
Le numéro de bloc n'est pas obligatoire (l'ordre numérique des numérotations de blocs "N" n'est pas non plus obligatoire) à chaque ligne avec les commandes ISO, il désigne juste un endroit du programme où l'on peut ordonner un saut d'opération ou un départ d'opération, le plus souvent avant un changement d'outil, ou au départ d'une boucle.
    V permet de contrôler une vitesse de rotation dans une machine avec diverses configurations
    R Rayon d'arc ou option passée à un sous programme
    P Temps de pause ou option passée à un sous programme ou appel de sous programme (Précédé de M98, ou G65 par ex dans un appel de Macro_programme intégrant des calculs)
    T Sélection d'outil
    I Centre X des données d'un arc
    J Centre Y des données d'un arc
    K Centre Z des données d'un arc
    D diamètre de coupe ou décalage pour l'épaisseur d'outil
    H décalage pour la hauteur de l'outil
(*) Les codes M contrôlent l'ensemble de la machine, permettant son démarrage, son arrêt, la mise en route de l'arrosage, etc. Alors que les autres codes concernent le cheminement de l'outil.
Les fonctions M (de M00 à M09) sont communes à tous les types de CNC, les différents constructeurs de machines CNC proposent leurs propres fonctions M (à partir de M10 jusqu'à M89... ensuite au-dessus de M100).
Des machines différentes peuvent utiliser le même code pour effectuer des fonctions différentes : même les machines qui utilisent le même contrôleur CNC.
Une version standardisée du G-code connue sous la dénomination BCL est utilisée, mais sur très peu de machines.
Le G-code est interprété par les traceurs photographiques Gerber, les contrôleurs de machine-outil et certains de leurs opérateurs.
Les fichiers G-code sont produits par des programmes de CFAO tels que GO2cam, ESPRIT, SmartCAM, Gibbscam, SolidCAM, Featurecam, Artcam, Edgecam (S4X), Surfcam, OneCNC, Router-CIM, Alphacam, TopSolid'Cam, e-NC, GPSoftware, Mastercam, EFICN (EFICAD), PowerMill (Delcam), etc. Ces applications utilisent en général des convertisseurs appelés post-processeurs pour optimiser le code en vue de son utilisation sur une machine particulière. Les post-processeurs sont généralement modifiables par l'utilisateur afin d'optimiser leur usage.
Le G-code est aussi produit par certains programmes de CAO spécialisés dans la conception de circuit imprimé. De tels programmes doivent être adaptés pour chaque type de machine outil.
Quelques machines CNC utilisent des programmes "interactifs", qui permettent de programmer avec des agents en cachant partiellement ou totalement le G-code. Quelques exemples populaires sont Mazak Mazatrol, Hurco Ultimax et le langage interactif Mori Seiki's CAPS.
Common G Codes (avec certaines extensions non standardisées) :
| G00 | Déplacement rapide |
| G01 | Interpolation linéaire |
| G02 | Interpolation circulaire (sens horaire, anti-trigo) |
| G03 | Interpolation circulaire (sens anti-horaire, trigo) |
| G04 | Arrêt programme et ouverture carter (pour nettoyer) (temporisation - suivi de l'argument F ou X en secondes) |
| G10/G11 | Écriture de données / Effacement de données (suivi de l'argument L suivant le type de données à écrire) |
| G17 | Sélection du plan X-Y |
| G18 | Sélection du plan X-Z |
| G19 | Sélection du plan Y-Z |
| G20 | Programmation en pouces |
| G21 | Programmation en mm |
| G28 | Retour à la position d'origine |
| G31 | Saute la fonction (mode Interrupt utilisé pour les capteurs et les mesures pièces et de longueur d'outil) |
| G33 | Filetage à pas constant |
| G34 | Filetage à pas variable |
| G40 | Pas de compensation de rayon d'outil |
| G41 | Compensation de rayon d'outil à gauche |
| G42 | Compensation de rayon d'outil à droite |
| G54 à G59 | Activation du décalage d'origine pièce (Offset) |
| G68 / G68.1 | Activation du mode "Plan incliné" (Tilted plane working) pour les centres d'usinage 5 axes |
| G70 | Cycle de finition |
| G71 / G71.7 | Cycle d'ébauche suivant l'axe Z (appel de profil balisé entre les arguments P et Q) |
| G75 | Cycle de gorge |
| G76 / G76.7 | Cycle de filetage |
| G83 | Cycle de perçage débourrage |
| G69 | Annulation du mode Tilted plane working (Plan incliné) |
| G84 | Cycle de taraudage rigide |
| G90 | Déplacements en coordonnées absolues |
| G91 | Déplacements en coordonnées relatives |
| G94/G95 | Déplacement en pouces par minute/pouce par tour |
| G96 ; G97 | Vitesse de coupe constante (vitesse de surface constante) ; Vitesse de rotation constante ou annulation de G96 |

### Codes spéciaux

Spécifique à certains constructeurs
Suivant le paramétrage du système et la résolution décimale, il est nécessaire (ou pas) de programmer les valeurs avec le "dot" (point)
Par exemple : G00 X40. (la machine se déplacera à la position X 40mm)
G00 X40. (le point derrière la valeur entière est nécessaire)
G43 : Prise en compte de la longueur (fraisage)
M98 : appel de sous programmes
#: (hashtag) déclaration / écriture / lecture / calcul de variables personnalisées
#1 à #33 = variables locales (#1 à #26 correspondent aux lettres de l'alphabet pour les arguments de cycles de macros personnalisées si la machine est équipée de l'option "CUSTOM MACRO")
#100 à #199 = variables utilisateurs (effacement remise à zéro sur RESET)
#500 à #999 = variables système (mémorisées après RESET ou coupure CNC)
Spécifique NUM
* EB : rayon à l'intersection de deux lignes
* G77 : appel de blocs
* G79 : saut de bloc

### Codes CNC ISO de base

    Les 0 ne sont pas obligatoires (DEVANT un autre chiffre : M02 peut s’écrire M2. Par contre M30 reste M30 sinon ça deviendrait M3....)
    M00, M01 : arrêt du programme, arrêt optionnel ou avec condition
    M02 : arrêt du programme
    M03, M04, M05 : broche sens horaire, sens antihoraire, arrêt de broche
    M06 : changement d'outil
    M07, M08, M09 : mise en route arrosage, arrêt arrosage
    M21 : activation pression broche ; M21 à M27 : palier pression selon outils
    M30 : fin du programme, réinitialisation, rembobinage
    M99 : fin du sous-programme
    G96, G97 : vitesse de coupe constante, vitesse de rotation constante
    G92 / G50 : vitesse de broche maximum
    G95, G94 : déplacement mm/tr, déplacement mm/min
    G00, G01 : mouvement rapide, interpolation linéaire (coupe suivant une ligne droite)
    F : vitesse de déplacement
    S : vitesse de broche
    Coordonnées d'axes X, Y, Z, A, B, C

#### Fonctions préparatoires G

* La fonction d'interpolation linéaire rapide G0 (interpolation linéaire en mode rapide).
* La fonction d'interpolation linéaire (à la vitesse programmée) G1 (interpolation linéaire en mode de travail).
* La fonction d'interpolation circulaire G2 (interpolation circulaire sens horaire) et G3 (interpolation circulaire sens trigonométrique).
* La fonction de temporisation (programmable avec F,X ou P) G4.
* La fonction d'arrêt précis en fin de bloc G9.
Il est aussi possible sur certains pupitres de programmation d'utiliser ces deux codes (G2 G3) pour créer une interpolation circulaire, des fonctions d'interpolation à base de courbe NURBS G6.2.
Sur les fraiseuses équipées de tête birotative les codes G17,G18,G19 définissent l'axe des cycles de perçage, taraudage... et le plan dans lequel seront réalisées les interpolations circulaires et activé le correcteur de rayon d'outil.
* G17 : Axe d'outil Z, interpolations G2,G3 et correction rayon dans le plan X Y.
* G18 : Axe d'outil Y, interpolations G2,G3 et correction rayon dans le plan Z X.
* G19 : Axe d'outil X, interpolations G2,G3 et correction rayon dans le plan Y Z.
Les codes de la famille G52, G53, G54, G55...sont utilisés pour :
* Programmer un décalage d'origine ;
* Définir que les déplacements sont relatifs à l'origine machine ;
* Choisir le numéro de l'origine pièce.
Certains codes G de la famille G60 G70 peuvent être utilisés par les fabricants de DNC pour :
* Le choix de la programmation cartésienne ou polaire ;
* L'activation d'un facteur d'échelle ;
* La mise en action d'une fonction miroir ;
* La programmation en mesure métrique ou en pouce.
Les codes G90 G91définissent la programmation absolue ou incrémentale des cotes.
Des cycles préprogrammés sont également accessibles sur la plupart des machines : G 81, 82, 83... pour les cycles de perçage, taraudage, etc. avec l'annulation par G 80. D'autres cycles peuvent être présents selon le type de machine (tour "cycle d'ébauche G71,G72,G73...", fraiseuse, aléseuse, fil...).

#### Fonctions auxiliaires M

* Mise en rotation broche M3 horaire, M4 anti-horaire. Arrêt par M5. (Selon les CN M3 peut activer un laser de découpe ou faire tourner un servomoteur et M4 arrêter le laser ou faire tourner un servomoteur : par exemple commandes numériques de traçage "CNC plotter")
* Changement outil automatique ou manuel M6.
* Mise en route de l'arrosage externe M8. Arrêt par M9.
* Mise en route de l'arrosage par le centre de la broche M7 Arrêt par M9
* Fonction de fin de programme M2 ou M30.
* Fonction d'arrêt programme M00.
* Fonction d'arrêt optionnel programme M01
* Fonction d'activation d'axe angulaire en remplacement de broche tournage "M88-89" (selon commande- Sauf mazak qui gère automatiquement)

#### Origines

* Origine programme (OP) : c'est le point origine du programme à partir duquel les mouvements de la machine sont programmés.
* Origine Machine (OM): Cette expression existe dans des manuels de constructeurs de machines-outils sans pour autant apporter de réponse, voire sans fondement. L'origine machine est une coordonnée mesure particulière. Lors de l’initialisation de l’axe (dans le cas de capteurs relatifs) au passage du top zéro de la règle, le processus d’initialisation permet de forcer la valeur du registre du point courant par la valeur de l’axe dans le registre P16 (cas d’un DCN NUM). Cette valeur est souvent non nulle qui remet en cause la notion d’ « origine » d’une part, et « machine » d’autre part puis que c’est une coordonnée mesure particulière. Cette expression est sans fondement dans le cas de technologie de règle absolue, et sans fondement tout court.
* Origine mesure (Om) : L'origine mesure est propre à chaque axe asservi. Dans le cas d'une structure articulaire de type RRPPP (rotoïde, rotoïde, prismatique, prismatique, prismatique) il existe 5 origines mesures. Chaque axe mesure est constitué d'une origine et d'une dimension. La dimension de l'espace vectoriel de cette structure est de dimension 5. Suivant le type de technologie des capteurs permettant l'asservissement des axes, il est nécessaire de procéder à l'initialisation de la partie opérative avec la partie commande. Dans le cas de capteur relatif, les POM (Prise d'origines mesure) servent à établir les références de la mesure sur chaque axes des machines outils ne possédant pas de règles avec des capteurs absolus (détection du zéro du capteur de mesure).
Les origines mesures appartiennent à l'espace articulaire (espace de la structure cinématique de la machine en robotique). L'espace travail, ou de la tâche est celui où se trouvent les autres éléments de la cellule élémentaire de production. La dimension vectorielle est 3. Il y a donc un endomorphisme d'espaces vectoriels entre l'espace articulaire de la machine et l'espace travail. Il est donc totalement inutile de représenter le zéro mesure comme un point concourant de tous les axes dans l'espace travail. C'est un sophisme.
* Origine porte pièce (Opp) : C'est le point caractéristique de la liaison encastrement supposée parfaite entre la machine et le porte-pièce. En tournage on le place souvent à l'intersection de la face avant du mandrin et de l'axe de la broche (axe Z, pour les mandrins qui ne sont pas changés régulièrement). En fraisage pour des raisons de standardisation on alèse des centreurs sur les tables des machines outils pour le situer plus facilement.
* Origine pièce (Op) :(appelé G... 54 par exemple, G55, etc.) C'est le point d'intersection de l'isostatisme. Ce point situe la pièce par rapport au porte-pièce.
* Distance origine programme (OP) - origine machine (OM) : c'est la distance que la machine doit additionner pour passer de son origine (OM) à l'origine du programme (OP).
* "DECALAGE" (dec) : distance vectorielle de l'origine porte-pièce (Opp) à l'origine programme (OP).
* "PREF" (pref) : distance vectorielle de l'intersection des origines mesure de chaque axe qu'on appelle souvent Origine mesure pour simplifier (Om) à l'origine porte-pièce.
(POM ou OM) + PREF = OPP OPP + DECALAGE = OP
En synthèse, les définitions des différentes origines sont issues d'un modèle de structure articulaire de machine constitué de liaisons prismatiques cartésiennes. Le modèle géométrique permettant de lier l'espace travail à l'espace articulaire est l'identité, amalgamant les origines mesures de la structure articulaire avec l'origine des solides dans l'espace travail.
« Comprendre le fonctionnement d’une machine à commande numérique. - Application à la MOCN - Un modèle pour quoi faire ? », sur cfc-technic.fr, 2006

#### Corrections

Correction de la machine permettant de tenir compte des différentes longueurs et diamètres d'outil.
* en fraisage : correcteur de longueur de fraise : Parfois activé automatiquement lors du changement outil (M6). Sur certains DNC G43, annulation par G49 sur d'autre DNC la lettre D suivie du numéro de correcteur ou 0 pour annuler ; Pour le correcteur de rayon de fraise: G41 et G42, annulation par G40. Sur certains DCN, le petit rayon de bout d'outil est compensable par un correcteur préfixé @.
* G41 positionne l'outil à gauche de la trajectoire programmée d'une valeur égale à la valeur du correcteur.
* G42 positionne l'outil à droite de la trajectoire programmée d'une valeur égale à la valeur du correcteur.
* en tournage : correcteur de longueur d'outil, correcteur en diamètre et compensation de rayon de bec: G41 et G42, annulation par G40.
De plus, la correction d'outils en cours d'usinage appelée "correction dynamique" permet de compenser l'usure de l'outil.

#### Axes

* Les axes X et Y sont disposés suivant un repère orthonormé direct par rapport à Z.
* L'axe X est celui qui permet la plus grande distance de déplacement. Le dernier axe étant l'axe Y ; sur certaines machines, on trouve des axes supplémentaires appelés Axe A, B, C. Les axes A, B, C sont des axes rotatifs, A tournant autour de X, B autour de Y, C autour de Z.
* Mouvements de rotation A, B, C
Le sens de rotation positif des axes A, B, C sont comptés en s'imaginant qu'une vis pas à droite, tournant dans le sens des aiguilles d'une montre avance en direction +X, +Y, +Z en se considérant à la place de l'outil. Si c'est un axe déplaçant la pièce au lieu de l'outil, on inverse le sens des axes, le positif devient négatif.
* On rencontre de plus les désignations U, V, W pour d'autres axes supplémentaires, portiques, tourelles secondaires ou accessoires.
* Le sens + permet un accroissement des dimensions de la pièce.

## Exemple

Ceci est un programme typique qui montre l'usage du G-Code pour tourner une pièce de 1 pouce de diamètre et 1 pouce de long. On part de l'hypothèse que la barre de matière est déjà dans la machine et qu'elle dépasse légèrement en longueur et en diamètre. (Attention : Ceci est un programme typique, il pourrait ne pas fonctionner sur une machine réelle ! Soyez particulièrement attentifs au point 5 ci-dessous.)
Exemple :
| N01 M216 | Mise en route du contrôleur de charge |
| N015 G20 T00 G99 | Programmation en pouces, annulation des décalages outils, avance en pouces/révolution. |
| N02 G00 X20 Z20 | Déplacement rapide en dehors de la pièce, pour donner le point de départ de l'outil |
| N03 G50 S2000 | Définit la vitesse de rotation maximum de la broche |
| N04 T03 | Choisit l'outil #3 dans le carrousel |
| N05 G96 S854 M42 M03 M08 | Découpe à vitesse variable, 854 pieds/min, grande vitesse de broche, démarrage de la broche en rotation horaire, démarrage de la lubrification |
| N06 G00 X1.1 Z1.1 T0303 | Déplacement rapide vers un point situé à 0,1 pouce du bout de la barre et à 0,05 pouce du bord, en utilisant les valeurs de réglage de l'outil #3 |
| N07 M01 | Arrêt optionnel |
| N08 G01 Z1.0 F.05 | Avance horizontalement, en avance de travail, jusqu'à ce que l'outil soit à 1 pouce de la référence |
| N09 X0.0 | Descend jusqu'à ce que l'outil soit au centre - en face du bout de la barre |
| N10 G00 Z1.1 | Avance rapide à 0,1 pouce du bout de la barre |
| N11 X1.0 | Avance rapide jusqu'à la position correspondant au diamètre extérieur fini |
| N12 G01 Z0.0 | Avance horizontalement, en avance de travail, en coupant la barre à 1 pouce de diamètre jusqu'à la référence |
| N13 G00 X1.1 | Avance rapide en s'écartant de 0,05 pouce de la surface de la pièce |
| N14 X20 Z20 | S'éloigne de la pièce, toujours en avance rapide |
| N15 M05 M09 | Arrête la broche et coupe l'arrosage |
| N16 M215 | Coupe le contrôleur de charge |
| N17 M30 | Fin du programme |
En principe on ne met pas des numéros qui se suivent pour les lignes. Cela permet d'en intercaler de nouvelles si nécessaire. Plutôt que de faire : N1, N2, N3, etc. On inscrit N10, N20, N30, etc. Comme ça, si l'on doit rajouter des lignes de modification, on peut le faire. N50, N60 peut ainsi devenir N50, N52, N54, N60...
Quelques remarques :
* On peut développer un style de programmation, même sur un programme aussi court. Le groupement des codes de la ligne N05 aurait pu être distribué sur plusieurs lignes. Ceci faciliterait le suivi pas à pas de l'exécution du programme.
* Beaucoup de codes sont "Modaux" ce qui veut dire qu'ils restent actifs tant que l'ordre n'a pas été annulé ou remplacé par un ordre contradictoire. Par exemple, après avoir choisi la vitesse de coupe variable (G97), elle reste active jusqu'à la fin du programme. En service, la vitesse de broche va augmenter au fur et à mesure que l'outil se rapproche du centre de manière à maintenir une vitesse de coupe constante. De la même manière, après avoir sélectionné la vitesse de déplacement rapide (G00) tous les mouvements seront rapides jusqu'à ce qu'une vitesse de déplacement (G01, G02, G03) soit sélectionnée.
* Il est d'usage courant d'avoir un contrôleur de charge/vitesse sur une machine à commande numérique. Ce contrôleur va arrêter la machine si la broche ou les vitesses de déplacement dépassent des valeurs prédéfinies lors du paramétrage de la machine. Le rôle du contrôleur de charge est d'éviter la casse machine en cas de bris d'outil ou d'erreur de programmation. De plus, dans une certaine mesure il peut donner une information sur un outil qui devient trop usé et nécessite un remplacement ou un ré-affutage.
* Il est d'usage courant d'amener l'outil rapidement à un point "sûr" proche de la pièce - dans ce cas à 0,1 pouce - et ensuite de démarrer le déplacement lent de l'outil. La distance de sécurité requise dépend du savoir-faire et de l'aisance du programmeur.
* Si le programme est faux, la probabilité d'un crash machine est élevée ! Ceci peut être très coûteux. Il est possible de prévoir à intervalles réguliers des arrêts optionnels (code M01) qui permettent au programme d'être exécuté par séquences. Les arrêts optionnels restent dans le programme mais sont négligés lors d'une exécution normale. Heureusement, la plupart des programmes de CFAO sont livrés avec des simulateurs de déplacements affichant les mouvements lors de l'exécution du programme. Beaucoup de machines CNC modernes permettent aussi au programmeur d'exécuter une simulation et de vérifier les paramètres opératoires de la machine en tout point de l'exécution. Ceci permet au programmeur de découvrir des erreurs sémantiques (par opposition aux erreurs de syntaxe) avant de perdre des matériaux ou des outils avec un programme erroné.

### Exemple d'un programme simple de fraisage CNC

* O100;
* G0 G90 G40 G80 G49
* G91 G28 Z0
* M6 T1;
* G90 G17 G80 G40 G54 G0 X0 Y-7;
* M3 S2500 M8;
* G0 G43 H1 Z-4;
* G1 Y20. F150;
* X40;
* Y0;
* X-5;
* G0 Z200:
* M9;
* M5;
* G28 G91 G0 Z0;
* G28 G91 G0 Y0;
* M30;
Ligne 1, numéro de programme
Ligne 2: Rappel des codes modaux permettant de reprendre facilement en cas d'arrêt en milieu de cycle: G0 (rapide), G90 (coordonnées absolu), G40 (annulation de correction de rayon), G80 (Annulation de cycles de perçages), G49 (Annulation de la correction de longueur)
Ligne 3: Retour à l'origine en Z pour éviter les déplacements non désirés en cas de reprise du programme après un arrêt dans la pièce
Ligne 4, appel en broche de l'outil n$^o$ 1 (qui est en réalité un appel du sous-programme pilotant le changeur d'outil (M6) avec le paramètre T1
Ligne 5, - donné en absolu (G90), -travail suivant plan X,Y(G17), -Annulation des cycles perçage-taraudage (G80), annulation tout correcteur en mémoire dans la machine(G40),
-origine pièce Offset (G54), -déplacement rapide (G0) à un point (X0 Y-5)
Ligne 6, mise en rotation de l'outil à 2 500 tr/min (S2500) et mise en fonction de l'arrosage (M8) (M13 replace les codes M3, sélectionne le sens de rotation, et M8, marche arrosage)
Ligne 7, déplacement rapide a Z-4 (profondeur de coupe) en prenant en compte la longueur d'outil (G43) du correcteur n°1 (H1)
Ligne 8 à 11, déplacements en vitesse de travail (G1), G1 est une fonction modale et est donc valable pour tous les points suivants.
Ligne 12, déplacement rapide (G0) a un point (Z200)
Ligne 13, arrêt de l'arrosage (M9)
Ligne 14, arrêt de la broche (M5)
Ligne 15 à 16, Retour au origine machine (G28), Distance avec relatif (G91), -déplacement rapide (G0) avec le système de coordonnées de la machine (G53) à Z0 Y0 (outil en haut, table au plus près de l'opérateur)
Ligne 17, M30 fin de programme (M30 inclus M5 et M9 ceux-ci ne sont donc pas obligatoires ils sont placés en ligne 10 et 11 pour laisser quelques secondes d'égouttage au système d'arrosage, avant les manipulations de l'opérateur.)
Notez que le programme ne prévoit rien pour le cheminement de l'outil. Si la machine est une fraiseuse et utilise une fraise de rayon 6 mm, la pièce sera en pratique 12 mm plus petite que définie (6 mm par côté). Une commande G-code doit être utilisé pour corriger le cheminement de l'outil.

### Exemple d'un programme simple de tournage CNC

Un exemple simple : une barre d'une longueur de 40 mm et d'un diamètre de 20 mm. Le code de base pourrait se lire comme suit :
Il est de bon aloi d'abuser des commentaires entre parenthèses, afin d'indiquer les opérations, les outils utilisés, afin que n'importe quel utilisateur puisse comprendre le code. Sur certaines DNC le point-virgule ";" est le symbole de début de commentaire et le reste de la ligne est alors ignoré par la DNC
    Le point de départ a été changé pour permettre de "prendre la correction de rayon", car elle se fait suivant le sens déplacement du point précédant (X-10) au point de passage en G41 (X0) l’outil ne se déplacera en réalité que de 4 mm et non pas 10, du fait de la correction.
    Dans ce cas, le contrôleur voit la première ligne et ajuste la position de l'outil de coupe à 6 mm à l'extérieur du tracé de découpe. Maintenant la machine va créer une pièce conforme à celle dessinée. Selon l'outil de coupe utilisé, la correction peut être définie si nécessaire. Par exemple, un laser avec un faisceau très fin peut nécessiter une correction de 0,005 pouce, alors qu'une machine à jet d'eau avec une buse de diamètre intérieur 0,060 pouce va nécessiter une correction de 0,030 pouce.

## Aide à la programmation de profils complexes

La Programmation Géométrique de Profil (P.G.P.) du fabricant de DNC NUM permet d'utiliser directement les cotes du dessin de définition pour écrire le programme.
Principe :
* programmation en absolu (G90)
* programmation classique valable
* programmation par blocs : un élément géométrique par bloc
* élément géométrique entièrement ou incomplètement défini (dans un ou deux blocs suivants)
Éléments géométriques :
* Élément d'angle EA
* Élément congé EB+
* Élément chanfrein EB-
* Élément tangent ET
* Élément sécant ES
* Discriminant E+ / E-
Le langage PROGET 2' du constructeur SELCA utilise 5 codes G, pouvant être assimilés à 5 instruments du dessinateur industriel.
* G20 pour le compas dans le cas de cercles de centre et rayon connus.
* G21 pour le gabarit multi rayons pour les rayons de raccordement.
* G13 pour le rapporteur d'angle dans le cas de droite inclinée.
* G10 et G11 pour la règle.