---
title: "Coolant Won't Turn On During a Drill Cycle: The G-Code Side"
description: "Dry drilling inside a canned cycle is usually an M8 placement problem: the command arrived late, landed in the wrong mode, or asked the wrong system."
url: https://gcodepractice.com/journal/coolant-won-t-turn-on-during-drill-cycle-g-code/
canonical: https://gcodepractice.com/journal/coolant-won-t-turn-on-during-drill-cycle-g-code/
author: "Lawrence Arya"
authorUrl: https://www.linkedin.com/in/vibecoding/
published: 2026-06-07
updated: 2026-06-07
category: "Guides"
tags: ["coolant", "m8", "drill cycle", "troubleshooting"]
lang: en
---

# Coolant Won't Turn On During a Drill Cycle: The G-Code Side

> **TL;DR** When coolant fails to run during a drill cycle, work the code side before the plumbing: the usual finding is M8 placement, the command sits after the cycle has already begun its first holes, rides on a line where its timing relative to motion surprises you, or was cancelled by an M9 left active in a subprogram or earlier operation. The reliable pattern puts M8 on or before the positioning move ahead of the cycle call, and through-spindle coolant is its own builder-specific M-code, not M8. Plumbing problems exist too, and the code check costs nothing first.

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 code | What actually happens | The fix |
| --- | --- | --- |
| M8 after the cycle call line | First hole or holes run dry before coolant lands | Move M8 to or before the positioning move ahead of the cycle |
| M8 deep in the program, M9 in a subprogram or earlier op | Coolant cancelled and never re-armed | Re-command M8 after any operation that owns an M9 |
| M8 on a line whose motion-versus-switch timing differs by control | Coolant arrives mid-move or post-move | Give M8 its own line, or pair it with a non-cutting move |
| Deep-hole cycle assuming through-tool coolant from M8 | Flood runs, the hole bottom stays dry | Use 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](https://linuxcnc.org/docs/html/gcode/m-code.html), 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](/journal/how-to-read-g-code-to-find-errors/) 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](/journal/g81-vs-g83-drilling-canned-cycles/): peck cycles without working coolant defeat their own purpose, packing chips into a hole the [cutting fluid](https://en.wikipedia.org/wiki/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](/journal/i-keep-forgetting-which-m-code-turns-off-the-coolant/), 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](/journal/lnc-controller-g-code-list/). 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](/journal/how-to-manually-enter-g-code-in-mach3/) 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](/g-code-practice/) keep sharp.

## Sources

- [LinuxCNC: M-code reference](https://linuxcnc.org/docs/html/gcode/m-code.html)
- [Helman CNC: Fanuc reference material](https://www.helmancnc.com/fanuc-alarm-codes-for-cnc-machines/)
- [Wikipedia: Cutting fluid](https://en.wikipedia.org/wiki/Cutting_fluid)

## 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.

---

Source: https://gcodepractice.com/journal/coolant-won-t-turn-on-during-drill-cycle-g-code/
Author: Lawrence Arya — https://www.linkedin.com/in/vibecoding/
