Haas Tool Diameter Offsets: Changing D Values with G10

Jason IP5 min read
Other ManufacturerOther TopicTechnical Reference
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

How Haas Applies Tool Diameter Offsets

On a Haas mill, T1 M06 performs only the tool change: it puts Tool 1 in the spindle but reads in neither the length nor the diameter offset. G43 by itself does nothing, and G41/G42 by themselves do not call the current tool's diameter automatically. Because H and D are modal, a G41 or G42 programmed without a D word will reuse the previous D value — behavior reported as specific to Haas and not common on other controls. Note that one operator in the source reports M06 T01 activating H and D on their machine; given the conflicting reports, the safe practice is to call offsets explicitly at every tool change:

(TOOL DESCRIPTION)
T1 M06
G00 G43 H01 D01

With this format the H and D words appear only at the tool change, so moving a tool to a different station requires a single edit. A different D is called later in the program body only when a special dimension adjustment needs a second diameter offset for the same tool. When Setting 15, H & T Code Agreement, is ON, the control checks that the H number matches the tool number (H01 for Tool 1, H02 for Tool 2). No such check exists for D — any D number is accepted, so the programmer is solely responsible for calling the correct diameter register.

Changing Diameter Values with G10 L12

Macros are not required to change tool diameter entries dynamically. Use the G10 programmable offset entry command:

G10 L12 G90 P1 R.5   (sets diameter entry for tool 1 to 0.5)
G10 L12 G91 P1 R.002 (increments the existing entry by 0.002)

G90 writes the R value absolutely; G91 increments or decrements the current register content. These commands can be placed anywhere in the program before the point where the value is needed. The offset registers retain their last loaded value until changed manually through the offset table or by another G10/macro write. Per one operator's manual, the system variable map is:

Data System variables
Tool diameter/radius geometry offsets #2401–#2499
Tool diameter/radius wear offsets #2601–#2699

Verify these ranges against your control's manual before writing variables directly. With macro capability, the same registers can be loaded by assignment, e.g. #2401 = 0.50 for D01. For a measured tool that is 0.002 under size, do not erase and re-enter the register — adjust the existing value incrementally (G91 G10 or a wear-register edit) so the change is relative to what is already proven.

Multiple D Registers per Tool

Scattering G10 lines through a program forces a find-and-edit session for every change. The recommended structure clusters all diameter entries at the top of the program under spare register numbers. Haas controls provide capacity for several hundred diameter offsets, far beyond the 10–25 tools a typical carousel holds, so each physical tool can own a block of D numbers:

G10 L12 G90 P1 R0.250  (T1 finish diameter)
G10 L12 G90 P11 R1.0   (T1 oversize 'false' diameter for roughing)
G10 L12 G90 P21 R...   (T1 second alternate)

Call them with D01, D11, D21, matching the P numbers. Uses include separate wear directions for ID vs. OD finishing with one tool, and roughing with an inflated register. Example from practice: a 1/2 in. tool interpolating a 1.875 in. ID hole, with the subroutine written around the 0.9375 in. hole radius. Program P11 R1.0, then G41 D11 before calling the sub — the control applies a 0.5 in. radius value, the tool moves out only 0.4375 in., and a starter hole is roughed. Cancel comp, return, then G41 D01 and run the same sub to finish to size.

The binding constraint: the largest "false" D value must be smaller than twice the smallest concave radius in the profile, or the control raises a tool too big alarm. Where small concave radii exist, keep two subroutine copies (copy/paste) and strip the tight concave features from the version called with the large offset.

Macro-Driven Dynamic Offsets

With the macro option, a tool-change subroutine can write the diameter register and call the offsets in one pass:

O6901 (TOOL CHANGE MACRO SUB)
G10 G90 L12 P#7 R#18
G80 M09
G90 M06 T#20
G#8 M08 S#19 M03
G43 H#20 D#7
M99

Call pattern in the main program:

G65 P6901 E54 R0.500 S5000 T01 D01
G65 P6901 E54 R0.505 S7500 T08 D08  (roughing pass, +0.005 dia)
G65 P6901 E54 R0.499 S7500 T08 D08  (finishing pass)

Here the E word loads the D register number (#7), R loads the diameter value (#18), and the macro writes the offset, changes the tool, and applies G43/G41 compensation with matching H and D. The same program shows rough/finish pairs at R0.505 vs. R0.499 for one physical tool.

Stale Offsets, Restart Behavior, and the Safety Line

A recurring field problem is the control cutting with an old diameter value after the offset was edited. The evidence-supported causes and controls:

  1. Program interrupted before M30. Stopping mid-program and pressing RESET leaves the last offset values in memory. A program restart reuses the last values picked up from the offset registers rather than re-reading the table, unless the control processes an M30 or starts from the beginning and re-executes the preceding lines.
  2. Add a safety line. Start every program with comp cancellation and initial conditions, e.g. G00 G17 G20 G40 G49 G80 G90 G98. G40 cancels diameter compensation; the control ignores diameter offsets until the next G41 Dnn or G42 Dnn.
  3. Restart from the beginning. After an offset edit, restart at line 1 (or at least re-run the tool-change block with its G43 H/D calls) so the correct registers are read in.
  4. Program Restart parameter. One operator states this parameter must be ON for the strict tool-change format to behave; another reports using restart only to return a tool to a cut path and otherwise leaving it off. Treat this as machine/policy dependent — verify on your control which behavior your configuration produces before relying on mid-program restarts.

On first runs, use feed hold liberally and attempt to repeat any anomalous comp behavior before changing the program; several reported cases could not be reproduced after a clean start from M30.

FAQ

How do I change a Haas tool diameter offset from within a program?

Use G10 L12 G90 P1 R0.5 to write 0.5 into diameter register 1 (no macro option required). Switch to G91 to increment the existing value up or down, then call it with G41 D01.

Why is my Haas using the old tool diameter after I edited the offset?

If the program was reset before reaching M30, the restart routine reuses the last offset values in memory instead of re-reading the registers. Put G40 in the safety line and restart from the beginning or from the tool-change block with its G43 H/D calls.

Should I replace or adjust an existing diameter offset when the tool is 0.002 under?

Adjust the existing entry rather than re-entering it: use G10 L12 G91 with the R delta, or edit the wear register. Diameter wear registers are reported at #2601–#2699 and hold their value until changed.

Back to blog