20. CNC Programming


• We need to be able to direct the position of the cutting tool. As the tool moves we will cut metal (or perform other processes).


• Obviously if we plan to indicate positions we will need to coordinate systems.


• The coordinates are almost exclusively cartesian and the origin is on the workpiece.


• For a lathe, the infeed/radial axis is the x-axis, the carriage/length axis is the z-axis. There is no need for a y-axis because the tool moves in a plane through the rotational center of the work. Coordinates on the work piece shown below are relative to the work.



• For a tool with a vertical spindle the x-axis is the cross feed, the y-axis is the in-feed, and the z-axis is parallel to the tool axis (perpendicular to the table). Coordinates on the work piece shown below relative to the work.



• For a tool with a horizontal spindle the x-axis is across the table, the y-axis is down, and the z-axis is out. Coordinates on the work piece shown below relative to the work.



• Some common programming languages include, (note: standards are indicated with an *)

ADAPT - (ADaptation of APT) A subset of APT

*APT - (Automatically Programmed Tool) A geometry based language that is compiled into an executable program.

AUTOSPOT - A 2D language developed by IBM. Later combined with ADAPT.

COMPACT/COMPACTII - A higher level language designed for geometrical definitions of parts, but it doesn’t require compilation.

EXAPT - A european flavor of APT

*G-Codes (EIA RS-274 G&M codes)

MAPT - (Microcomputer APT) - Yet another version of APT

UNIAPT - APT controller for smaller computer systems

Other Proprietary languages


• These languages have many similarities, but the syntax varies.



20.1 G-Codes

[an error occurred while processing this directive]


• This language was originally designed to be read from paper tapes. As a result it is quite simple.


• The language directs tool motion with simple commands


• Note, I show programs with spaces to improve readability, but these are not necessary.


• A basic list of ‘G’ operation codes is given below. These direct motion of the tool.

G00 - Rapid move (not cutting)

G01 - Linear move

G02 - Clockwise circular motion

G03 - Counterclockwise circular motion

G04 - Dwell

G05 - Pause (for operator intervention)

G08 - Acceleration

G09 - Deceleration

G17 - x-y plane for circular interpolation

G18 - z-x plane for circular interpolation

G19 - y-z plane for circular interpolation

G20 - turning cycle or inch data specification

G21 - thread cutting cycle or metric data specification

G24 - face turning cycle

G25 - wait for input #1 to go low (Prolight Mill)

G26 - wait for input #1 to go high (Prolight Mill)

G28 - return to reference point

G29 - return from reference point

G31 - Stop on input (INROB1 is high) (Prolight Mill)

G33-35 - thread cutting functions (Emco Lathe)

G35 - wait for input #2 to go low (Prolight Mill)

G36 - wait for input #2 to go high (Prolight Mill)

G40 - cutter compensation cancel

G41 - cutter compensation to the left

G42 - cutter compensation to the right

G43 - tool length compensation, positive

G44 - tool length compensation, negative

G50 - Preset position

G70 - set inch based units or finishing cycle

G71 - set metric units or stock removal

G72 - indicate finishing cycle (EMCO Lathe)

G72 - 3D circular interpolation clockwise (Prolight Mill)

G73 - turning cycle contour (EMCO Lathe)

G73 - 3D circular interpolation counter clockwise (Prolight Mill)

G74 - facing cycle contour (Emco Lathe)

G74.1 - disable 360 deg arcs (Prolight Mill)

G75 - pattern repeating (Emco Lathe)

G75.1 - enable 360 degree arcs (Prolight Mill)

G76 - deep hole drilling, cut cycle in z-axis

G77 - cut-in cycle in x-axis

G78 - multiple threading cycle

G80 - fixed cycle cancel

G81-89 - fixed cycles specified by machine tool manufacturers

G81 - drilling cycle (Prolight Mill)

G82 - straight drilling cycle with dwell (Prolight Mill)

G83 - drilling cycle (EMCO Lathe)

G83 - peck drilling cycle (Prolight Mill)

G84 - taping cycle (EMCO Lathe)

G85 - reaming cycle (EMCO Lathe)

G85 - boring cycle (Prolight mill)

G86 - boring with spindle off and dwell cycle (Prolight Mill)

G89 - boring cycle with dwell (Prolight Mill)

G90 - absolute dimension program

G91 - incremental dimensions

G92 - Spindle speed limit

G93 - Coordinate system setting

G94 - Feed rate in ipm (EMCO Lathe)

G95 - Feed rate in ipr (EMCO Lathe)

G96 - Surface cutting speed (EMCO Lathe)

G97 - Rotational speed rpm (EMCO Lathe)

G98 - withdraw the tool to the starting point or feed per minute

G99 - withdraw the tool to a safe plane or feed per revolution

G101 - Spline interpolation (Prolight Mill)


• M-Codes control machine functions and these include,

M00 - program stop

M01 - optional stop using stop button

M02 - end of program

M03 - spindle on CW

M04 - spindle on CCW

M05 - spindle off

M06 - tool change

M07 - flood with coolant

M08 - mist with coolant

M08 - turn on accessory #1 (120VAC outlet) (Prolight Mill)

M09 - coolant off

M09 - turn off accessory #1 (120VAC outlet) (Prolight Mill)

M10 - turn on accessory #2 (120VAC outlet) (Prolight Mill)

M11 - turn off accessory #2 (120VAC outlet) (Prolight Mill) or tool change

M17 - subroutine end

M20 - tailstock back (EMCO Lathe)

M20 - Chain to next program (Prolight Mill)

M21 - tailstock forward (EMCO Lathe)

M22 - Write current position to data file (Prolight Mill)

M25 - open chuck (EMCO Lathe)

M25 - set output #1 off (Prolight Mill)

M26 - close chuck (EMCO Lathe)

M26 - set output #1 on (Prolight Mill)

M30 - end of tape (rewind)

M35 - set output #2 off (Prolight Mill)

M36 - set output #2 on (Prolight Mill)

M38 - put stepper motors on low power standby (Prolight Mill)

M47 - restart a program continuously, or a fixed number of times (Prolight Mill)

M71 - puff blowing on (EMCO Lathe)

M72 - puff blowing off (EMCO Lathe)

M96 - compensate for rounded external curves

M97 - compensate for sharp external curves

M98 - subprogram call

M99 - return from subprogram, jump instruction

M101 - move x-axis home (Prolight Mill)

M102 - move y-axis home (Prolight Mill)

M103 - move z-axis home (Prolight Mill)


• Other codes and keywords include,

Annn - an orientation, or second x-axis spline control point

Bnnn - an orientation, or second y-axis spline control point

Cnnn - an orientation, or second z-axis spline control point, or chamfer

Fnnn - a feed value (in ipm or m/s, not ipr), or thread pitch

Innn - x-axis center for circular interpolation, or first x-axis spline control point

Jnnn - y-axis center for circular interpolation, or first y-axis spline control point

Knnn - z-axis center for circular interpolation, or first z-axis spline control point

Lnnn - arc angle, loop counter and program cycle counter

Nnnn - a sequence/line number

Onnn - subprogram block number

Pnnn - subprogram reference number

Rnnn - a clearance plane for tool movement, or arc radius, or taper value

Qnnn - peck depth for pecking cycle

Snnn - cutting speed (rpm), spindle speed

Tnnn - a tool number

Unnn - relative motion in x

Vnnn - relative motion in y

Wnnn - relative motion in z

Xnnn - an x-axis value

Ynnn - a y-axis value

Znnn - a z-axis value

; - starts a comment (proLight Mill), or end of block (EMCO Lathe)


• The typical sequence of one of these programs is,

1. Introductory functions such as units, absolute coords. vs. relative coords., etc.

2. Define coordinates.

3. Feeds, speeds, etc.

4. Coolants, doors, etc.

5. Cutting tool movements and tool changes

6. Shutdown


• A program is given for the sample part below. Complete the last few lines.



• The following is an example of circular interpolation. This is valid for both milling and turning. Note that here we move to the start point, the command indicates the direction (clockwise or counterclockwise). The I, J values indicate the center of rotation, and the X, Y values indicate the point to stop at. We can also cut circular paths on other planes by resetting the cutting planes (G17, G18, G19).



• When cutting, it is useful to change our point of reference. When doing mathematics we tend to dimension relative to a main origin (absolute). In fact a machine will need to have coordinates specified with reference to a main origin. But when we examine parts we tend to refer to local origins for features. (Consider how you dimension details on a drawing.) These relative points refer to as local origins. We can also do moves as distances to the next point.



• When using the prolight mill we can add program elements to request that an external device (ie robot) load or unload parts. We will assume that the robot has been connected to the robotic interface port available. This port has four inputs and two outputs. The example below assumes that the input #1 indicates a part has been dropped off and the mill can start. Output #1 will be turned on to request that the robot pick up a part and load new stock.



• In previous examples we calculated the cutter offsets by hand. Modern NC machines keep a record of the tool geometry. This can then be used to automatically calculate offsets (you don’t need to put the tool size in the program).


• The best way to think of tool compensation is when cutting a profile, should we be to the left or right of the line.



• In the previous example we notice how the shape is distorted by how the cutter navigates the corners. There are additional commands to help with these problems.



• Typical commanded cycles include,

- rectangular pocket milling

- circular pocket milling

- slot or elongated hole milling

- peck drilling

- tapping


• For practice, develop the part program for the component shown below




20.2 APT

[an error occurred while processing this directive]


• This language allows tools to be programmed using geometrical shapes. This puts less burden on the programmer to do calculations in their heads.


• APT programs must be converted into low level programs, such as G-codes.


• An example of an APT program is given below.



• Some samples of the geometrical and motion commands follow. These are not complete, but are a reasonable subset.


• GEOMETRY: The simplest geometrical construction in APT is a point

p=POINT/x,y,z - a cartesian point

p=POINT/l1,l2 - intersection of two lines

p=POINT/c - the center of a circle

p=POINT/YLARGE,INTOF,l,c - the largest y intersection of a line and a circle

*Note: we can use YSMALL,XLARGE,XSMALL in place of YLARGE


• GEOMETRY: Lines are one of the next simplest definitions,

l=LINE/x1,y1,z1,x2,y2,z2 - endpoint cartesian components

l=LINE/p1,p2 - endpoints

l=LINE/p,PARLEL,l - a line through a point and parallel to another line

l=LINE/p,PERPTO,l - a line through a point and perpendicular to a line

l=LINE/p,LEFT,TANTO,c - a line from a point, to a left tangency point on a circle

l=LINE/p,RIGHT,TANTO,c - a line from a point, to a right tangency point on a circle

l=LINE/LEFT,TANTO,c1,LEFT,TANTO,c2 - defined by tangents to two circles

l=LINE/LEFT,TANTO,c1,RIGHT,TANTO,c2 - defined by tangents to two circles

l=LINE/RIGHT,TANTO,c1,LEFT,TANTO,c2 - defined by tangents to two circles

l=LINE/RIGHT,TANTO,c1,RIGHT,TANTO,c2 - defined by tangents to two circles


• GEOMETRY: Circles are very useful for constructing geometries

c=CIRCLE/x,y,z,r - a center and radius

c=CIRCLE/CENTER,p,RADIUS,r - a center point and a radius

c=CIRCLE/CENTER,p,TANTO,l - a center and a tangency to an outside line

c=CIRCLE/p1,p2,p3 - defined by three points on the circumference

c=CIRCLE/YLARGE,l1,YLARGE,l2,RADIUS,r - tangency to two lines and radius

*Note: we can use YSMALL,XLARGE,XSMALL in place of YLARGE


• GEOMETRY: More complex geometric constructions are possible

PLANE/ - defines a plane

QUADRIC/a,b,c,d,e,f,g,h,i,j - define a polynomial using values

GCONIC/a,b,c,d,e,f - define a conic by equation coefficients

LCONIC/p1,p2,... - defines a conic by lofting (splining) points

RLDSRF/ - a ruled surface made of two splines

POLCON/ - define a surface using cross sections

PATERN/ - will repeat a motion in a linear or circular array


• Once we have constructed points, lines and circles we can then proceed to direct the tool to follow the path.


• MOTION: We can use the basic commands to follow the specified geometry

FROM/p - specify a start point

FROM/x,y,z - specify a start point

GOTO/p - move to a final point

GOTO/x,y,z - move to a final point

GOTO/TO,p - move until the tool touches a point

GOTO/TO,l - move until the tool touches a line

GOTO/TO,c - move until the tool touches a circle

GOLFT/l1,TO,l2 - go on the left of l1 until the tool touches l2

GORGT/l1,TO,l2 - go on the right of l1 until the tool touches l2

GOBACK/l1,TO,l2 - reverses direction along l1 to l2

GOBACK/l1,TO,c1 - reverses direction along l1 to c1

GOUP/l1,TO,l2 - goes up along l1 to l2

GODOWN/1l,TO,l2 - goes down along l1 to l2

GODLTA/x,y,z - does a relative move

Note: TO can be replaced with PAST, ON to change whether the tool goes past the structure, or the center stops on the structure.


• MOTION: The following commands will create complex motion of the tool

POCKET/ - will cut a pocket

PSIS/ - will call for the part surface


• As would be expected, we need to be able to issue commands to control the machine.


• CONTROL: The following instructions will control the machine outside the expected cutting tool motion.

CUTTER/n1,n2 - defines diameter n1 and radius n2 of cutter

MACHIN/n,m - uses a post processor for machine ‘n’, and version ‘m’

COOL/ANT/n - either MIST, FLOOD or OFF

TURRET/n - sets tool turret to new position

TOLER/n - sets a tolerance band for cutting

FEDRAT/n - sets a feedrate n

SPINDL/n,CW - specifies n rpm and direction of spindle


• We can also include some program elements that are only used for programming


• PROGRAM: The following statements are programming support instructions

REMARK - starts a comment line that is not interpreted

$$ - also allows comments, but after other statements

NOPOST - turns off the post processor that would generate cutter paths

CLPRNT - prints a sequential history of the cutter center location

SQRTF(n) - calculates the floating point square root

FINI - stop program

PARTNO/n - allows the user to specify the part name

LOOPST and LOOPND - loop instructions

RESERV/n,m - defines an array of size ‘n’ by ‘m’

JUMPTO/n - jump to line number


• Note: variables can also be defined and basic mathematical operations can be performed.


• Note: macro functions are also available.



20.3 Proprietary NC Codes

[an error occurred while processing this directive]


• NC code Example (for the Dyna Milling Machine)



20.4 Graphical Part Programming

[an error occurred while processing this directive]


• Basically,

1. Part geometry is entered in 2D or 3D.

2. Tool geometry and machine tool type are entered.

3. Speeds and feeds are entered or calculated based on tool and work material.

4. Inside/outside of geometry, and initial stock sizes are selected.

5. Cutter paths are generated.

6. Cutter paths are converted to a machine specific language (eg, G-codes).


• These programs are usually built into better CAD systems or are available as stand alone software


• Some machine tools have these programmers built into the controller.



20.5 NC Cutter Paths

[an error occurred while processing this directive]


• When we have simple features, paths are easy to generate. These features include,

- steps

- pockets

- holes

- etc.


• Typically paths for these will repeat as shown below,



• For complex surfaces we want to contour appropriately. These surfaces will almost always be represented with spline patches.



• Recall that a spline patch can be represented parametrically



• A simple algorithm to cut the surface is shown below.




20.6 NC Controllers

[an error occurred while processing this directive]


• NC control programs are essentially quite simple. The source code for a basic controller is given below.



********** Add in C-code for AMP project



20.7 Practice Problems

[an error occurred while processing this directive]


1. Examine the part below. It is set up so that the origin is at the bottom left. The cutting tool has a diameter of 1/2”, and the material is 1/8” thick.



a) Write the equations needed to find the tangency point on the top left of the piece.



b) Develop an NC program to mill the part. The program should be complete and include all instructions required. If necessary, assume a location for the tangency point.



2. Examine the part below. It is set up so that the origin is at the bottom left corner. The cutting tool has a diameter of 1/2”, and the material is 1/8” thick. Develop an NC program to mill the part. The program should be complete and include all instructions required.







20.8 Laboratory - CNC Integration

[an error occurred while processing this directive]



Integration of CNC equipment.



Students will develop programs to load and unload the NC machines with robots, and then produce parts.



1. Use your NC programming software to generate an NC program to cut the top 1/2” of a 3” radius ball on the mill. Test the program on-line.

2. Use the NC generation software to cut a 1/4” deep, 2”long oval into the surface of a 1” brass bar. Test the program on-line.

3. Simulate both programs before arriving at the laboratory.

4. Develop a robot program to load/unload the NC mill with the RV-M1. Test the program on-line

5. Develop a program for the RT-3000 to load/unload the lathe. Test the program on-line.



1. In the lab test the programs on the different devices in groups of 3

2. One group of (6?) should connect the RV-M1 to the Mill, and the other group should connect the RT-3000 to the lathe.

3. The groups that did the connection should split into smaller groups and modify the programs on the robots and NC machines.



1. Your individual NC and robot programs.

2. The final group NC and robot programs.



[an error occurred while processing this directive]