PROGRAMS · TOOLS · SHOP KNOWLEDGE

Machinist Resources

Useful CNC programs, machining notes, and tools I use. Copy what helps and put it to work.

HAAS G13 CIRCULAR POCKET

7.875 diameter × .250 deep

This example uses a .500-inch center-cutting end mill. X0 Y0 is the pocket center and Z0 is the top of the part.

Before you run it

  • On a Haas Classic control, press SETTING/GRAPH, go to Setting 40, and set it to DIAMETER.
  • Enter .500 on the tool-offset page for the tool that matches what you have in the spindle. Write down the previous value and put it back when you are finished.
  • K is the finished pocket radius. Change it to one-half of your required finished diameter.
  • To use a different-diameter cutter, change the tool number and Q, then enter the new cutter diameter on the matching tool-offset page.
  • Start with I.300 as shown. The I value only needs to be smaller than the largest circle diameter you are going to cut.
  • Change the spindle speed, feedrate, pocket depth, and safe positions for your machine, cutter, material, and setup.

Verify every value for your machine and setup. Run Graphics, then single-block it above the part before cutting.

%
O00503 (ROUND POCKET)

T21 M06 (.500 CENTER-CUTTING END MILL)
G00 G90 G17 G40 G49 G80 G54
S7640 M03
G00 X0. Y0.
G43 H#3026 Z1.
M08
G00 Z.1

(***** G13 CIRCULAR POCKET KEY *****)
(X Y = POCKET CENTER)
(Z = FINAL POCKET DEPTH)
(K = FINISHED POCKET RADIUS)
(K = FINISHED DIAMETER DIVIDED BY 2)
(I = FIRST CUT RADIUS)
(START WITH I.300)
(I MUST BE LESS THAN LARGEST CIRCLE DIAMETER)
(Q = RADIAL STEPOVER)
(Q MUST BE LESS THAN TOOL DIAMETER)
(D = CUTTER COMP OFFSET NUMBER)
(F = CUTTING AND PLUNGE FEEDRATE)
(G13 = CCW CIRCULAR POCKET)
(#3026 = TOOL IN SPINDLE)
(***********************************)

G13 I.300 K3.9375 Q.200 Z-.250 D#3026 F30.

G00 Z1.
M09
M05
G53 G00 G49 Z0.
G53 G00 Y0.
M30
%

HAAS G47 CIRCULAR ENGRAVING

Reusable circular text and serial-number template

This is the exact O00504 program proven by HTJ on a 2004 Haas VF-2 Classic Haas Control. It places text counterclockwise around a circle, can start or center the text at any angle, and can repeat the same text or automatically advance serial numbers.

Machine-proven G47 circular engraving on a round test plate
The actual test used to prove the program on the machine. The clean bottom engraving reads ABCD-123 #7.
%
O00504 (CIRCULAR G47 ENGRAVING TEMPLATE - REV G) 

( PROVEN HTJ 9/8/26 )

(2004 HAAS VF-2 CLASSIC HAAS CONTROL) 
(REV F WAS PROVEN ON THE MACHINE) 
(REV G CHANGES COMMENTS ONLY - CUTTING CODE IS UNCHANGED) 
(G54 X0 Y0 = CENTER OF ENGRAVING CIRCLE) 
(G54 Z0 = TOP OF FINISHED ENGRAVING SURFACE) 
(TEXT CAN START AT OR BE CENTERED ON THE SELECTED ANGLE) 
(TEXT ADVANCES COUNTERCLOCKWISE) 
(TOPS OF CHARACTERS POINT TOWARD CIRCLE CENTER) 
(CIRCLE DIAMETER PASSES THROUGH MIDDLE OF CHARACTER HEIGHT) 
(BLOCK DELETE OFF = PAUSE AT Z1.000 BEFORE ENGRAVING) 
(BLOCK DELETE ON = SKIP PAUSE AFTER PROGRAM IS PROVEN) 

(******** OPERATOR EDIT SECTION ********) 
#100= 15. (ENGRAVING TOOL NUMBER) 
#101= 10000. (SPINDLE RPM) 
#102= 0.003 (ENGRAVING DEPTH - POSITIVE VALUE) 
#103= 10. (CUTTING FEED - PLUNGE FEED IS AUTOMATICALLY HALF) 
#104= 5. (DIAMETER THROUGH MIDDLE OF CHARACTER HEIGHT) 
#105= 0.250 (HEIGHT OF EACH CHARACTER) 
#106= 0.300 (CHARACTER SPACING MEASURED AROUND THE CIRCLE) 
#107= 0. (CIRCLE CENTER X - USE 0 WHEN G54 X0 IS CENTER) 
#108= 0. (CIRCLE CENTER Y - USE 0 WHEN G54 Y0 IS CENTER) 
#109= 0.100 (RAPID HEIGHT ABOVE PART BEFORE ENGRAVING) 
#110= 0.010 (G47 RETRACT HEIGHT ABOVE G54 Z0) 
#111= 10. (FIXED CHARACTER COUNT - DOES NOT INCLUDE AUTO SERIAL) 
#112= 270. (ANGLE WHERE TEXT STARTS OR IS CENTERED) 
#113= 1. (0=FIRST CHARACTER STARTS AT ANGLE; 1=TEXT CENTERS THERE) 
#114= 1. (0=NO AUTO SERIAL; 1=APPEND AND ADVANCE AUTO SERIAL) 

(AUTO SERIAL INSTRUCTIONS - ONLY USED WHEN #114=1) 
(#580 HOLDS THE NEXT SERIAL NUMBER TO BE ENGRAVED) 
(IF #580 IS EMPTY, THE FIRST SERIAL NUMBER WILL BE 1) 
(AFTER ENGRAVING FINISHES, #580 AUTOMATICALLY INCREASES BY 1) 
(#580 KEEPS ITS VALUE WHEN THE MACHINE IS POWERED OFF) 
(TO CHANGE THE NEXT SERIAL, OPEN THE MACRO VARIABLES PAGE) 
(PRESS CURRENT COMMANDS AND PAGE DOWN TO MACRO VARIABLES) 
(TYPE 580, PRESS DOWN ARROW, TYPE THE NUMBER, PRESS WRITE/ENTER) 

(FIXED CHARACTER INSTRUCTIONS) 
(#600 IS THE FIRST CHARACTER; #601 IS THE SECOND) 
(THE PATTERN CONTINUES THROUGH #629 FOR CHARACTER 30) 
(SET #111 TO THE NUMBER OF FIXED CHARACTERS BEING USED) 
(FIND EACH CHARACTER IN THE KEY AND ENTER ITS NUMBER BELOW) 
(ALSO CHANGE THE SLOT COMMENT SO IT SHOWS THE NEW CHARACTER) 

(******** G47 CHARACTER KEY ********) 
(SPACE=32 #=35 DASH=45) 
(0=48 1=49 2=50 3=51 4=52) 
(5=53 6=54 7=55 8=56 9=57) 
(A=65 B=66 C=67 D=68 E=69) 
(F=70 G=71 H=72 I=73 J=74) 
(K=75 L=76 M=77 N=78 O=79) 
(P=80 Q=81 R=82 S=83 T=84) 
(U=85 V=86 W=87 X=88 Y=89 Z=90) 
(************************************) 

(CURRENT FIXED TEXT IS ABCD-123 SPACE #) 
(WITH #580 SET TO 1, AUTO SERIAL MAKES THE RESULT ABCD-123 #1) 

#600= 65. (SLOT 01 - A) 
#601= 66. (SLOT 02 - B) 
#602= 67. (SLOT 03 - C) 
#603= 68. (SLOT 04 - D) 
#604= 45. (SLOT 05 - DASH) 
#605= 49. (SLOT 06 - 1) 
#606= 50. (SLOT 07 - 2) 
#607= 51. (SLOT 08 - 3) 
#608= 32. (SLOT 09 - SPACE) 
#609= 35. (SLOT 10 - #) 
#610= 32. (SLOT 11 - UNUSED) 
#611= 32. (SLOT 12 - UNUSED) 
#612= 32. (SLOT 13 - UNUSED) 
#613= 32. (SLOT 14 - UNUSED) 
#614= 32. (SLOT 15 - UNUSED) 
#615= 32. (SLOT 16 - UNUSED) 
#616= 32. (SLOT 17 - UNUSED) 
#617= 32. (SLOT 18 - UNUSED) 
#618= 32. (SLOT 19 - UNUSED) 
#619= 32. (SLOT 20 - UNUSED) 
#620= 32. (SLOT 21 - UNUSED) 
#621= 32. (SLOT 22 - UNUSED) 
#622= 32. (SLOT 23 - UNUSED) 
#623= 32. (SLOT 24 - UNUSED) 
#624= 32. (SLOT 25 - UNUSED) 
#625= 32. (SLOT 26 - UNUSED) 
#626= 32. (SLOT 27 - UNUSED) 
#627= 32. (SLOT 28 - UNUSED) 
#628= 32. (SLOT 29 - UNUSED) 
#629= 32. (SLOT 30 - UNUSED) 
(******** END OPERATOR EDIT SECTION ********) 

(******** DO NOT EDIT BELOW THIS LINE ********) 
(THE MACHINE MUST HAVE THE MACRO OPTION AND SETTING 29 MUST BE OFF) 
(USE 0 TO 30 FIXED CHARACTERS) 
(AUTO SERIAL ACCEPTS 1 THROUGH 99 AND DOES NOT ADD LEADING ZEROS) 
(ANGLE LOCATIONS: 0=+X, 90=+Y, 180=-X, 270=-Y) 
(MODE 0 KEEPS THE FIRST CHARACTER AT THE SELECTED ANGLE) 
(MODE 1 KEEPS THE COMPLETE TEXT CENTERED AT THE SELECTED ANGLE) 
(THE PROGRAM STOPS WITH AN ALARM IF AN EDITED VALUE IS INVALID) 

G00 G17 G20 G40 G49 G80 G90 G94 
G103 P1 (PREVENT SERIAL NUMBER FROM UPDATING TOO EARLY) 
G54 

IF [ #111 LT 0. ] THEN #3000= 1 (FIXED COUNT MUST BE 0 TO 30) 
IF [ #111 GT 30. ] THEN #3000= 1 (FIXED COUNT MUST BE 0 TO 30) 
IF [ #112 LT 0. ] THEN #3000= 7 (START ANGLE MUST BE 0 TO 359.999) 
IF [ #112 GE 360. ] THEN #3000= 7 (START ANGLE MUST BE 0 TO 359.999) 
IF [ #113 LT 0. ] THEN #3000= 8 (ANGLE MODE MUST BE 0 OR 1) 
IF [ #113 GT 1. ] THEN #3000= 8 (ANGLE MODE MUST BE 0 OR 1) 
IF [ #113 NE FIX[ #113 ] ] THEN #3000= 8 (ANGLE MODE MUST BE 0 OR 1) 
IF [ #114 LT 0. ] THEN #3000= 9 (AUTO SERIAL MUST BE 0 OR 1) 
IF [ #114 GT 1. ] THEN #3000= 9 (AUTO SERIAL MUST BE 0 OR 1) 
IF [ #114 NE FIX[ #114 ] ] THEN #3000= 9 (AUTO SERIAL MUST BE 0 OR 1) 
IF [ #114 EQ 0. ] GOTO10 
IF [ #580 EQ #0 ] THEN #580= 1. (FIRST USE STARTS AT SERIAL 1) 
IF [ #580 LT 1. ] THEN #3000= 2 (SET SERIAL 1 TO 99) 
IF [ #580 GT 99. ] THEN #3000= 2 (SET SERIAL 1 TO 99) 
N10 
IF [ #104 LE 0. ] THEN #3000= 3 (CIRCLE DIAMETER MUST BE POSITIVE) 
IF [ #105 LE 0. ] THEN #3000= 4 (CHARACTER HEIGHT MUST BE POSITIVE) 
IF [ #106 LE 0. ] THEN #3000= 5 (CHARACTER SPACE MUST BE POSITIVE) 

T#100 M06 
S#101 M03 
G00 G90 G54 X#107 Y#108 
G43 H#3026 Z1. 

/ M00 (SANITY CHECK - IS THE TOOL ONE INCH ABOVE THE PART?) 
S#101 M03 (RESTART SPINDLE AFTER SANITY CHECK) 
M08 (TURN COOLANT ON) 

G00 Z#109 

(CALCULATE WHERE EACH CHARACTER BELONGS ON THE CIRCLE) 
#120= [ #104 / 2. ] (RADIUS THROUGH MIDDLE OF CHARACTERS) 
#121= [ #120 + #105 / 2. ] (RADIUS TO BOTTOM OF CHARACTERS) 
#122= [ #106 / #120 * 57.2957802 ] (ANGLE BETWEEN CHARACTERS) 
#130= 0. (NUMBER OF AUTOMATIC SERIAL DIGITS) 
IF [ #114 EQ 1. ] THEN #130= 1. 
IF [ [ #114 EQ 1. ] AND [ #580 GE 10. ] ] THEN #130= 2. 
#131= [ FIX[ #111 ] + #130 ] (TOTAL CHARACTER COUNT) 
#129= #112 (FIRST CHARACTER ANGLE) 
IF [ #113 EQ 0. ] GOTO20 
IF [ #131 LE 0. ] GOTO20 
#129= [ #112 - [ [ #131 - 1. ] * #122 / 2. ] ] 
N20 
WHILE [ #129 LT 0. ] DO3 
#129= #129 + 360. 
END3 

(ENGRAVE THE FIXED CHARACTERS ENTERED ABOVE) 
#123= 0. (START WITH FIRST CHARACTER) 
WHILE [ #123 LT FIX[ #111 ] ] DO1 
#124= [ #129 + #123 * #122 ] (ANGLE OF THIS CHARACTER) 
WHILE [ #124 GE 360. ] DO2 
#124= #124 - 360. 
END2 
#125= [ #107 + #121 * COS[ #124 ] ] (X START OF THIS CHARACTER) 
#126= [ #108 + #121 * SIN[ #124 ] ] (Y START OF THIS CHARACTER) 
#127= [ 90. + #124 ] (ROTATE TOP OF CHARACTER TOWARD CENTER) 
IF [ #127 GT 360. ] THEN #127= #127 - 360. 
#128= #[ 600 + #123 ] (READ CHARACTER FROM EDITABLE SLOT) 
IF [ #128 LT 32. ] THEN #3000= 6 (INVALID ASCII CHARACTER) 
IF [ #128 GT 126. ] THEN #3000= 6 (INVALID ASCII CHARACTER) 
G47 P#128 X#125 Y#126 I#127 J#105 R#110 Z [ - #102 ] F#103 E [ #103 / 2. ] 
#123= #123 + 1. 
END1 

(IF AUTO SERIAL IS ON, ENGRAVE IT AFTER THE FIXED TEXT) 
IF [ #114 EQ 0. ] GOTO120 
#123= FIX[ #111 ] 
IF [ #580 GE 10. ] GOTO100 

(SERIAL 1 THROUGH 9) 
#128= [ 48. + FIX[ #580 ] ] 
GOTO110 

N100 (ENGRAVE TENS DIGIT FOR SERIAL 10 THROUGH 99) 
#124= [ #129 + #123 * #122 ] 
WHILE [ #124 GE 360. ] DO2 
#124= #124 - 360. 
END2 
#125= [ #107 + #121 * COS[ #124 ] ] 
#126= [ #108 + #121 * SIN[ #124 ] ] 
#127= [ 90. + #124 ] 
IF [ #127 GT 360. ] THEN #127= #127 - 360. 
#128= [ 48. + FIX[ #580 / 10. ] ] 
G47 P#128 X#125 Y#126 I#127 J#105 R#110 Z [ - #102 ] F#103 E [ #103 / 2. ] 
#123= #123 + 1. 
#128= [ 48. + FIX[ #580 ] - 10. * FIX[ #580 / 10. ] ] 

N110 (ENGRAVE LAST SERIAL DIGIT) 
#124= [ #129 + #123 * #122 ] 
WHILE [ #124 GE 360. ] DO2 
#124= #124 - 360. 
END2 
#125= [ #107 + #121 * COS[ #124 ] ] 
#126= [ #108 + #121 * SIN[ #124 ] ] 
#127= [ 90. + #124 ] 
IF [ #127 GT 360. ] THEN #127= #127 - 360. 
G47 P#128 X#125 Y#126 I#127 J#105 R#110 Z [ - #102 ] F#103 E [ #103 / 2. ] 

N120 (ALL ENGRAVING IS FINISHED) 
G00 Z#109 
IF [ #114 EQ 1. ] THEN #580= FIX[ #580 ] + 1. (ADVANCE SERIAL) 

M09 
M05 
G53 G00 Z0. (SEND Z AXIS FULLY UP FIRST) 
G53 G00 Y0. (THEN BRING TABLE TO OPERATOR) 
G103 P0 (RETURN CONTROL TO NORMAL LOOK-AHEAD) 
M30 
%

What this program needs

  • A Haas control with the macro option and G47 text engraving.
  • Setting 29 must be OFF.
  • Set G54 X0 Y0 at the center of the engraving circle.
  • Set G54 Z0 at the top of the finished engraving surface.

What you edit

  • Edit only the clearly marked OPERATOR EDIT SECTION. Leave everything below DO NOT EDIT BELOW THIS LINE alone.
  • #100 through #110 control the tool, RPM, depth, feed, circle size, character size and spacing, center location, and Z clearances.
  • #111 is the number of fixed characters you are using, from 0 through 30.
  • #112 is the selected angle: 0 is +X, 90 is +Y, 180 is -X, and 270 is -Y.
  • #113=0 starts the first character at that angle. #113=1 centers the complete engraving at that angle.
  • #114=0 repeats the same fixed text every cycle. #114=1 adds an automatic serial number and advances it after a completed engraving cycle.
  • #600 is character slot 1, #601 is slot 2, and the pattern continues through #629. Use the character key printed in the program and keep each slot comment updated so the text is readable at the machine.

Automatic serial numbers

When #114=1, macro variable #580 holds the next serial number to engrave. If it is empty, the program starts at 1. To restart or jump to another number, open the Haas macro-variables page and change variable 580. This version accepts serial numbers 1 through 99 without leading zeros.

Prove-out procedure

  1. Check every operator-edit value and confirm the correct tool is loaded.
  2. Run Graphics first, then single-block above scrap material.
  3. Leave Block Delete OFF during prove-out. The optional-stop block pauses with the tool at Z1.000 so you can confirm it is one inch above the part.
  4. After Cycle Start, the program explicitly restarts the spindle and turns coolant on before engraving.
  5. After the program is proven for your setup, turn Block Delete ON to skip the sanity-check stop.

This code ran successfully on the machine shown, but you are responsible for verifying every tool, offset, clearance, setting, and value on your own machine. Test on scrap first.