Work offset shifting between cycles on 1500MX

Hey everyone, I’m running into a weird problem with the probe macros on the 1500MX on repeat cycles.

I added an individual x, y, and z probe routine to a .nc file to set the wcs before running the cycle. (the corners have a chamfer too large to support the corner macro)

My impression was that this would be pretty straightforward. Write them according to the docs, insert at the top of the program, and that’s it.

It seems to work for the most part, except on completion of the cycle, the WCS seems to shift up, left and forward several mm, and the next probe cycle fails because it doesn’t contact the part.

I’ve checked for the usual suspects, and the program isn’t calling G92 there’s no odd use of G40/41, and my understanding is that M30 would cancel those offsets anyway.

Here’s the header block for what I’m running:

Program

%

G92.1 G90 G64 G17 G40 G80 G94 G91.1 G49

G21 (MM)

G30 (Move to G30 position)

M5 (Turn off spindle)

M9 (Turn off coolant)

(Values for the parameters below must be entered)

#<_first_position_to_probe> = -2 (absolute value to probe to in the positioning wcs)

#<_measuring_wcs> = 1 (given with number between 1 and 500 to be used with G54.1 Pxxx, set equivalent to positioning wcs if same)

#<_z_wcs_offset> = 0 (value to set found coordinate to in the measuring wcs)

T99 G43 H99 M6 (Change to spindle probe)

G54 (set to positioning wcs)

F#<_probe_rapid_feed_per_min>

(Enter values for XYZ position to position probe)

G0 X65 Y45 (rapid move to XY location to start probing)

G1 Z75 (rapid move to Z clearance height)

F#<_probe_rough_feed_per_min>

(Enter value for Z location to start probing)

G1 Z25 (protected move to Z probing height)

o<probe_z> call

G54 (reset to positioning wcs)

G90 (reset to absolute positioning)

G30 (retract to G30 location)

M1

G90 G64 G17 G40 G80 G94 G91.1 G49

G21 (MM)

G30 (Move to G30 position)

M5 (Turn off spindle)

M9 (Turn off coolant)

(Values for the parameters below must be entered)

#<_first_position_to_probe> = 2 (absolute value to probe to in the positioning wcs)

#<_measuring_wcs> = 1 (given with number between 1 and 500 to be used with G54.1 Pxxx, set equivalent to positioning wcs if same)

#<_x_wcs_offset> = 0 (value to set found coordinate to in the measuring wcs)

T99 G43 H99 M6 (Change to spindle probe)

G54 (set to positioning wcs)

F#<_probe_rapid_feed_per_min>

(Enter values for XYZ position to position probe)

G0 X-25 Y35 (rapid move to XY location to start probing)

G1 Z25 (rapid move to Z clearance height)

F#<_probe_rough_feed_per_min>

(Enter value for Z location to start probing)

G1 Z-5 (protected move to Z probing height)

o<probe_x_edge> call

G54 (reset to positioning wcs)

G90 (reset to absolute positioning)

G30 (retract to G30 location)

M1

G90 G64 G17 G40 G80 G94 G91.1 G49

G21 (MM)

G30 (Move to G30 position)

M5 (Turn off spindle)

M9 (Turn off coolant)

(Values for the parameters below must be entered)

#<_first_position_to_probe> = 2 (absolute value to probe to in the positioning wcs)

#<_measuring_wcs> = 1 (given with number between 1 and 500 to be used with G54.1 Pxxx, set equivalent to positioning wcs if same)

#<_y_wcs_offset> = 0 (value to set found coordinate to in the measuring wcs)

T99 G43 H99 M6 (Change to spindle probe)

G54 (set to positioning wcs)

F#<_probe_rapid_feed_per_min>

(Enter values for XYZ position to position probe)

G0 X35 Y-25 (rapid move to XY location to start probing)

G1 Z25 (rapid move to Z clearance height)

F#<_probe_rough_feed_per_min>

(Enter value for Z location to start probing)

G1 Z-5 (protected move to Z probing height)

o<probe_y_edge> call

G54 (set to positioning wcs)

G90

G30

(1500 MX Honda CNC Setup)

(P/N= Rev. 1)

(Cycle Time= 0 HRS. 2 MIN. 47 SEC.)

(Date Posted 5/11/2026 10:47 )

(WCS = G)

(STOCK - NYLON)

(TOOL LIST)

(T04 = 6MM CRB 4F25 LOC)

(T02 = 2MM CRB 4FL 6.3 LOC)

G17 G40 G49 G50 G54 G64 G80 G90 G91.1 G94

G21

G30

N10 ( Area Clearance1 )

(6MM CRB 4F25 LOC)

M6 T4 G43 H04

S10000 M3 M7

G54

G52 X61.9 Y47.85 Z-4.1

M98 P0002

G52 X0 Y0

N20 ( Area Clearance3 )

G52 X61.9 Y47.85 Z-4.1

M98 P0003

G52 X0 Y0

M5 M9

G30

N30 ( Area Clearance2 )

M1

(2MM CRB 4FL 6.3 LOC)

M6 T2 G43 H02

S10000 M3 M7

G54

G52 X61.9 Y47.85 Z-4.1

M98 P0004

G52 X0 Y0

M5 M9

G30

G0 G53 Z0

G0 G53 X7. Y0.

M30

For reference, the methodology I’m following is the one on the pathpilot knowledge base, which seems to conflict with the method laid out in the user manual somewhat.

Every numbered subroutine called exclusively consists of G1, rapids, coolant control, and M99 to jump back to the header.
Any help debugging this would be extremely helpful

Tyson,

Which version of Pathpilot are you on?

Thank you,

Norman

Currently I’m on 2.14.2

Tyson,

Hang on, is this code written by hand or by a CAM system? Is the Z axis off by about 4mm?

Thank you,

Norman

it’s around 3 mm off (could be 2, could be 4) after the first cycle.

It’s posted with an old tormach post for camworks and updated/edited by hand

I’m in the middle of trying to get a multi-unit workflow up and running (probing being important for that) which is why I’ve broken things out into subs etc.

without probing (meaning the only difference is omitting the probe routines) the same file runs cycles repeatably without shifting the WCO

Tyson,

I would find out if there’s any way to have Camworks not output G52’s. The specific issue is that you don’t have “G52 Z0”, but realistically, when you’re probing the part there’s no reason to have them at all.

Thank you,

Norman

Thanks, Norman.

I’m somewhat confused as to why this would cause issues only in the case that I add probing routines, as runs correctly/repeatably otherwise. G52 operates similarly to G92, except the offset shouldn’t be persistent cycle to cycle, no?

Or is this a case where Tormach/Linuxcnc just doesn’t fully support G52?

I’d love to know what I’m missing here.

EDIT:


Okay, so the linuxcnc docs seem to be saying that G52 stores offset in the G92 registers, which do persist, so it functionally circumvents the intended behavior you’d see in other gcode flavors. Good to know, but I’m still not sure why the zero only shifts with probing in that case?

Past experience tells me G52 is the best way to break out subroutines for multi-step workflows where you have to flip or rotate the work piece, but if it doesn’t work here it doesn’t work.

Tyson,

I’d guess that there might be a bug with G52 and M2 but otherwise I am not sure.

Thank you,

Norman

Thanks, Norman.

I’ve fixed the issue pretty simply with your help.

Adding G92.1 and G52 X0 Y0 Z0 to the program right before M30 clears the state. If the linuxcnc docs are accurate, they should do the exact same thing (since they’d clear the same registers) – I’ll do an A/B test on which one fixes the issue (or if both do) when I have more time.

The program runs correctly now with the additions, but, oddly enough, the preview shows the offset that was showing up after running a cycle, (in reality, but not in the preview) prior to adding those lines, and visually updates at an incorrect position while running a cycle. Don’t know how to explain that, but it works as intended now.