Files
linuxcnc/nc_files/macros.md
Thaddeus Hughes ad1f8719d6 big overhaul
2026-04-05 20:51:43 -05:00

4.1 KiB
Executable File

Macros & Subroutines

Custom M-codes and G-code subroutines for the Lagun mill LinuxCNC configuration.

All macro .ngc files live in nc_files/subs/ and are loaded automatically via the SUBROUTINE_PATH setting in the INI.

Mode Flags (Bitmask)

All material-removal macros (except drill/bore) take mode as the first argument:

Bit Value Set (1) Clear (0)
0 +1 Conventional milling Climb milling
1 +2 Both-ways milling One-way milling
2 +4 Plunge entry Helix entry
3 +8 Outside Inside

Default mode (0) = climb, one-way, helix entry, inside.

Global Named Parameters

Parameter Description Required?
#<_z_top> Top of material / start Z height Required
#<_z_bot> Final cut depth Required
#<_z_clearance> Safe Z retract height Optional, falls back to #<_z_top>
#<_rampang> Helix entry angle in degrees Optional, defaults to 5.0
#<_stepover> Stepover distance Optional, defaults to 40% of tool diameter

Tool diameter is read automatically from #5410 (the built-in LinuxCNC parameter for the current tool's diameter from the tool table). A tool must be loaded (T M6 G43) before calling any material-removal macro.

A negative fincut value causes macros to rough only, leaving that amount of material for a separate finishing pass.

M-Codes (Shell Scripts)

M101 - Enable Z-Axis

Sets HAL signal z-override to True, enabling CNC control of Z.

M102 - Disable Z-Axis

Sets HAL signal z-override to False, allowing manual quill control.

Utility Subroutines

z_home - Rapid to Machine Z0

Rapids the quill to machine Z=0 (fully up) using G53 to bypass all offsets.

o<z_home> call

Drilling Subroutines

drill - Peck Drill

o<drill> call [x][y] [peck]

Calls M101 to enable Z. Retracts to Z Top between pecks with 0.020" rapid-approach gap.

drill_man - Manual Drill

o<drill_man> call [x][y]

Calls M102 to disable Z, then M0 pause. No Z globals needed.

drill_retr - Semi-Manual Drill with Retract

o<drill_retr> call [x][y]

Material Removal Subroutines

pocket_circ - Circular Pocket

o<pocket_circ> call [mode] [x][y] [diameter] [fincut]

pocket_rect - Rectangular Pocket (Zigzag)

o<pocket_rect> call [mode] [x1][y1] [x2][y2] [fincut]

Zigzag along the long axis, stepping by #<_stepover>. Perimeter cleanup pass at the end.

frame_rect - Rectangular Frame

o<frame_rect> call [mode] [x1][y1] [x2][y2] [radius]

frame_circ - Circular Frame

o<frame_circ> call [mode] [x][y] [diameter] [fincut]

slot - Slot / Obround

o<slot> call [mode] [x1][y1] [x2][y2] [width] [fincut]

bore - Helical Bore

o<bore> call [x][y] [d] [stepdown]

No mode arg. Uses #<_z_top>, #<_z_bot>, and #5410.

poly_frame - Polygon Perimeter

o<poly_frame> call [mode] [x][y] [n_sides] [apothem] [rotation] [fincut]

Apothem = flat-to-flat / 2. Rotation in degrees (0 = first vertex on +X, CCW positive).

poly_pocket - Polygon Pocket

o<poly_pocket> call [mode] [x][y] [n_sides] [apothem] [rotation] [fincut]

Typical Program Header

#<_z_clearance> = 0.2
#<_rampang>     = 5.0
#<_z_top>       = 0.05
#<_z_bot>       = -0.25

G10 L1 P1 Z0.0 R0.125    ; set tool 1 offset and 1/4" radius
T1 M6                      ; load tool (sets #5410 = 0.250)
G43                         ; activate TLO

M101                        ; enable z-axis
G90                         ; absolute coordinates
G54                         ; fixture #1
F5.0                        ; feedrate

o<pocket_circ> call [0] [0][0] [1.0] [0]

Known Bugs & Limitations

  1. Some combinations of values cause hangs. LinuxCNC has no stall/timeout detection; a macro stuck in an infinite loop hangs the whole machine. Iteration limits have been added to pocket_circ's spiral loop as a safety measure.

  2. Slot arc directions may be wrong under some combinations — inverted arc ends seen under certain mode/geometry combinations.