Dry holes from a cycle that should have been flooded is a two-suspect problem, and the cheap suspect goes first: before anyone opens a coolant valve or pulls a filter, read the program, because the most common version of this failure is the machine doing exactly what the code said, which was not what the programmer meant. The M8 arrived late, landed somewhere its timing surprises you, or was quietly cancelled upstream.

Why placement is the prime suspect

Coolant commands are switches, and switches obey two rules that geometry words do not: they execute in sequence with the motion around them, with timing details that vary by control, and they stay thrown until something throws them back. Both rules conspire inside canned cycles, where one program line expands into many machine moves: a switch commanded inside or after that expansion lands wherever the control’s sequencing puts it, and a switch cancelled three operations ago stays cancelled through every cycle since. Reading for coolant is therefore reading for two things, where the M8 sits relative to the cycle, and whether any M9 upstream still owns the state.

The placement suspects, in order of frequency

The pattern in the codeWhat actually happensThe fix
M8 after the cycle call lineFirst hole or holes run dry before coolant landsMove M8 to or before the positioning move ahead of the cycle
M8 deep in the program, M9 in a subprogram or earlier opCoolant cancelled and never re-armedRe-command M8 after any operation that owns an M9
M8 on a line whose motion-versus-switch timing differs by controlCoolant arrives mid-move or post-moveGive M8 its own line, or pair it with a non-cutting move
Deep-hole cycle assuming through-tool coolant from M8Flood runs, the hole bottom stays dryUse the machine’s own through-spindle M-code

The standard coolant words themselves are small and stable, M7 mist, M8 flood, M9 off, documented identically in references like the LinuxCNC M-code list, which is part of why this failure hides so well: every individual line looks correct, and the wrongness lives in ordering and inheritance, the state species of error wearing a wet disguise.

Why cycles make the timing visible

Outside a cycle, an M8 a line late costs nothing anyone notices. A canned cycle compresses many holes into one call, so a late M8 turns into a countable number of dry holes, and chip evacuation is most of why G83 exists at all: peck cycles without working coolant defeat their own purpose, packing chips into a hole the cutting fluid was supposed to flush. The reliable pattern is boring and universal: coolant commanded before cycle entry, conventionally on the positioning move, and verified once per program by watching the output on a dry run, the cheapest empirical check in machining, since the result sprays.

The inheritance version deserves its own paragraph because it survives prove-outs: a program that tested clean can drill dry in production when operation order changes, a subprogram with a tidy M9 at its end gets inserted upstream, and nothing downstream re-arms the flood. The forgetting-which-M-code family, M7, M8, and M9 confusion included, compounds it when an edit meant to stop the mist stops everything.

The through-spindle exception

Deep-hole work on machines with through-spindle coolant adds the dialect trap: M8 is flood by convention, and through-tool systems are builder options with their own M-codes, varying per machine, the same builder-owned-edge situation as every option code. A G83 written for a through-tool machine and run on flood-only iron, or vice versa, drills dry where it matters most, at the bottom of a deep hole, and the machine’s manual is the only authority on which number the option answers to.

When the code is innocent

The physical suspects get their turn once the code reads clean: tank level, clogged lines or nozzles, a tripped pump overload, nozzles aimed where the tool used to be rather than where it is. The diagnostic split is observability, command the coolant from MDI with the spindle safe: if M8 from MDI runs the pump, the plumbing is innocent and the program’s placement is guilty; if MDI produces nothing, the program was innocent and maintenance owns it. Two minutes, definitive, and either way the dry-hole mystery ends with a cause instead of a shrug. The fluency that makes the code half of this fast, M-code placements and cycle structure readable at a glance, is the standard recall material the free 60-second rounds on the G-code practice page keep sharp.

Sources

Frequently asked questions

Why won’t coolant turn on during my drill cycle?

Check the code before the plumbing: the most common cause is M8 placement, after the cycle call, timing-surprising relative to motion, or cancelled by an upstream M9 nobody re-armed. The dependable pattern is M8 on or before the positioning move ahead of the cycle.

Where should M8 go relative to a canned cycle?

Before the cycle starts cutting: conventionally on the positioning move preceding the cycle call, or its own line ahead of it. Commanding coolant before entry behaves identically everywhere.

Does M8 turn on through-spindle coolant?

Usually not: M8 is flood by convention, and through-spindle systems are builder options with their own M-codes. The machine’s manual owns the number, and deep-hole cycles depend on getting it right.

How do I check coolant behavior without wasting parts?

Dry-run with the coolant system live and watch when it starts relative to the cycle, then confirm with M8 from MDI: if MDI runs the pump, the plumbing is innocent and placement is guilty.