К содержимому

G-code

Команды, которые набираешь руками в консоли принтера.

Как читать строку G-code

Одна строка — одна команда. Сначала буква и номер (G1,M104), дальше параметры: снова буква и число. Порядок параметров значения не имеет, не указанный параметр не меняется —G1 X10 двигает только X, остальные оси остаются на месте.

БукваЧто значитПример
G / MСама команда. G — движение и координаты, M — всё остальноеG1, M104
X Y ZКоординаты, ммX10.5 Y20
EПодача прутка, ммE1.5
FСкорость подачи, мм/мин — не мм/сF1800 = 30 мм/с
SЗначение: температура, обдув 0–255, номерS210
PВремя в миллисекундах или номерP1000
TНомер инструмента (экструдера)T0
;Комментарий до конца строки, прошивка его не исполняет;LAYER:5

F задаётся в миллиметрах в минуту, а скорости в слайсере и в командах Klipper вроде SET_VELOCITY_LIMIT — в миллиметрах в секунду. Разница в шестьдесят раз: F1800 — это 30 мм/с.

Числа значат разное в разных режимахG90 и G91 переключают оси между абсолютными и относительными координатами, M82 и M83 делают то же с подачей прутка. Одна и та же строка G1 E5 в одном режиме выдавит 5 мм, в другом — отмотает пруток назад на разницу.
Ручные команды набирают в относительном режимеG91 и M83 перед серией команд, и всё считается от текущей точки. Абсолютные значения в консоли — источник половины ошибок.
Точка, а не запятаяДробное значение пишется через точку: X10.5. Запятую прошивка не разберёт.

Движение и координаты

КомандаЧто делаетВ Klipper
G0 / G1Перемещение. В прошивке это одна команда: G0 тоже выдавит пруток, если задан E. Слайсер по соглашению ставит G0 на переездытак же
G28Парковка. Без аргументов — все оси, G28 X — только Xтак же
G29Построить карту столаBED_MESH_CALIBRATE
G90Абсолютные координатытак же
G91Относительные координатытак же
M82 / M83Абсолютная и относительная подача филаментатак же
G92Назначить текущей позиции значениетак же
G10 / G11Ретракт и возврат по настройкам прошивкинужна секция [firmware_retraction]
G4 P1000Пауза, значение в миллисекундахтак же

Нагрев и обдув

КомандаЧто делаетВ Klipper
M104 S210Задать температуру сопла и продолжитьтак же
M109 S210Задать и ждать нагрева соплатак же
M140 S60Задать температуру стола и продолжитьтак же
M190 S60Задать и ждать нагрева столатак же
M105Показать текущие температурытак же
M106 S255Обдув детали, 0–255так же, но только для секции [fan]
M107Выключить обдувтак же
M303 E0 S210 C8Автонастройка PID сопла. Результат надо вписать командой M301 и сохранить M500, иначе он потеряется при перезагрузке. Как калиброватьPID_CALIBRATE HEATER=extruder TARGET=210, дальше SAVE_CONFIG

Настройки

КомандаЧто делаетВ Klipper
M92 E93Шаги на миллиметр для экструдераrotation_distance в printer.cfg
M201 / M203Предельные ускорения и скорости по осямнет — max_accel и max_velocity в секции [printer], на лету SET_VELOCITY_LIMIT
M204 S3000Ускорение печатитак же
M220 S100Множитель скорости печати, %так же
M221 S100Множитель подачи филамента, %так же
M500Сохранить настройки в памятьсамой M500 нет; близкое по смыслу — SAVE_CONFIG (перезапускает управляющую программу на хосте)
M501Загрузить сохранённые настройкинет — конфиг читается при старте
M502Сбросить к заводскимнет — править printer.cfg
M503Показать текущие настройкинет — смотреть printer.cfg

Диагностика и управление

КомандаЧто делаетВ Klipper
M114Текущие координатытак же. GET_POSITION печатает то же подробнее — низкоуровневые координаты для отладки
M115Версия прошивки и возможноститак же
M117 ТекстСтрока на дисплей и в интерфейснужна секция [display_status]
M119Состояние концевиковтак же, синоним QUERY_ENDSTOPS
M84Отключить моторытак же
M112Аварийная остановкатак же, дальше нужен FIRMWARE_RESTART
M600Смена филаментамакрос, в ядре нет

Команды Klipper: что набирать в консоли

У Klipper, кроме обычного G-code, есть свои команды — длинные, словами, с параметрами вида ИМЯ=значение. Их набирают в консоли Mainsail или Fluidd и вставляют в макросы. Часть из них появляется только вместе с секцией конфига: нет секции — нет команды, и Klipper ответит, что команда неизвестна.

Прошивка и конфиг

КомандаЧто делаетКак пишется
RESTARTПеречитать printer.cfg и перезапустить хостПосле правки конфига. Печать при этом обрывается
FIRMWARE_RESTARTТо же плюс перезапуск микроконтроллераНужен после ошибки MCU и после M112
SAVE_CONFIGДописать вычисленные значения в конец printer.cfg и перезапустить управляющую программу на хостеТак закрепляются PID, карта стола, z-offset. Во время печати не выполнять: перезапуск её обрывает
STATUSСостояние прошивкиПервое, что спрашивают при непонятной ошибке
HELPСписок доступных командТвои макросы попадают в этот же список
SET_IDLE_TIMEOUTТаймаут простоя на лету, секундыTIMEOUT=3600. Постоянное значение — в секции [idle_timeout]

Нагрев, стол и Z

КомандаЧто делаетКак пишется
TURN_OFF_HEATERSВыключить все нагреватели разом
SET_HEATER_TEMPERATUREЗадать температуру без ожиданияHEATER=extruder TARGET=200. Стол — heater_bed
TEMPERATURE_WAITЖдать, пока датчик выйдет на температуруSENSOR=extruder MINIMUM=200
PID_CALIBRATEАвтонастройка PID нагревателя. Как калиброватьHEATER=extruder TARGET=210, дальше SAVE_CONFIG. Стол — HEATER=heater_bed
BED_MESH_CALIBRATEПостроить карту столаАналог G29. Чтобы карта пережила перезапуск — SAVE_CONFIG, но не во время печати: он перезапускает управляющую программу и обрывает её
BED_MESH_PROFILEЗагрузить, сохранить или удалить профиль картыLOAD=default, SAVE=имя, REMOVE=имя
BED_MESH_CLEARСнять карту с текущей печати
SET_GCODE_OFFSETСдвинуть координаты, не трогая конфигZ_ADJUST=-0.02 MOVE=1 — подстройка зазора на первом слое
Z_OFFSET_APPLY_PROBEПеренести накрученный на лету Z-офсет в настройку датчикаДальше SAVE_CONFIG. Без датчика — Z_OFFSET_APPLY_ENDSTOP
PROBE_ACCURACYСерия замеров датчиком в одной точкеРазброс показывает, стоит ли верить датчику
QUERY_PROBEСработал датчик или нетПроверка проводки, пока каретка стоит

На лету, во время печати

КомандаЧто делаетКак пишется
SET_PRESSURE_ADVANCEПоменять Pressure Advance без перезапускаADVANCE=0.045. SAVE_CONFIG его не сохраняет — значение вписывают в [extruder] руками
SET_VELOCITY_LIMITСкорость, ускорение и рывок на летуVELOCITY=200 ACCEL=3000 SQUARE_CORNER_VELOCITY=5
SET_INPUT_SHAPERПараметры компенсатора резонансаSHAPER_TYPE_X=mzv SHAPER_FREQ_X=48.5
SET_RETRACTIONДлина и скорость firmware retractionНужна секция [firmware_retraction], сам ретракт — G10 и G11
SET_FAN_SPEEDСкорость именованного вентилятораFAN=имя SPEED=0.5, шкала 0–1
SET_STEPPER_ENABLEПитание отдельного мотораSTEPPER=stepper_x ENABLE=0. После этого положение оси недостоверно
STEPPER_BUZZДёрнуть один мотор туда-обратноSTEPPER=stepper_x — проверка проводки и направления
SAVE_GCODE_STATEЗапомнить координаты, режимы и скоростьNAME=метка
RESTORE_GCODE_STATEВернуть запомненноеNAME=метка MOVE=1 MOVE_SPEED=60 — со скоростью в мм/с
SET_GCODE_VARIABLEЗаписать значение в переменную макросаMACRO=PAUSE VARIABLE=saved_temp VALUE=210
RESPONDСообщение в консоль из макросаMSG="текст". Нужна секция [respond], тогда работает и M118
Полный список — у самой машиныHELP перечисляет всё, что понимает конкретно твоя сборка, вместе с твоими макросами. Справочник на сайте — про общее, конфиг у каждого свой.
Значения «на лету» живут до перезапускаSET_VELOCITY_LIMIT, SET_PRESSURE_ADVANCE, SET_GCODE_OFFSET ничего не пишут в конфиг. Подобрал — впиши руками в printer.cfg.
SAVE_CONFIG сохраняет не всёТолько то, что прошивка вычислила сама: PID, карту стола, z-offset датчика. Значение Pressure Advance туда не попадает.

Что делают G92, M84 и M600

G92 — назначить координату, не двигаясь

Команда не двигает ничего. Она объявляет, что текущая точка теперь называется так, как ты сказал: G92 E0 обнуляет счётчик выдавленного прутка, G92 X0 объявляет текущее положение каретки нулём по X. Слайсер вставляет G92 E0 в начало файла, а иногда и перед каждым слоем, чтобы значение Eне росло до десятков тысяч.

После неё абсолютная подача врётВ режиме M82 число в G1 E100 — не «выдави 100 мм», а «доведи счётчик до 100». Если печать уже намотала 350, эта строка не выдавит ничего: экструдер отмотает 250 мм назад. В Klipper до отмотки даже не дойдёт — движение только по E длиннее max_extrude_only_distance (по умолчанию 50 мм) прошивка отклоняет. Поэтому ручную выдавку делают только через M83.
Ею нельзя заменить парковкуG92 Z0 на весу заставит прошивку считать нулём ту высоту, где сопло стоит сейчас. Дальше печать либо повиснет в воздухе, либо каретка поедет в стол — по координатам всё будет правильно, по факту нет.
В Klipper обойти парковку так не выйдетДвижение по незапаркованной оси прошивка отклоняет — «Must home axis first». Принудительно назначить положение умеет только SET_KINEMATIC_POSITION, и она работает лишь при enable_force_move: True в секции [force_move]. Это отладочный инструмент: ограничители при таком движении не работают.

M84 — снять питание с моторов

Синоним M18. Ток с обмоток снимается, вал можно крутить рукой. В Marlin можно перечислить оси и задать таймаут простоя параметром S в секундах. Klipper гасит все моторы разом, отдельный мотор выключает SET_STEPPER_ENABLE, а таймаут простоя живёт в секции [idle_timeout].

Положение после неё неизвестноМотор без тока проворачивается от руки и от собственной инерции, и прошивка это знает: перед следующей печатью нужен G28. Набирать M84 во время печати — значит её оборвать.
Ось Z может просестьНа машинах с ремённой осью Z портал висит на моторах, и без тока он опускается под своим весом. На винтовой оси трапецеидальная резьба обычно держит сама.
Klipper выключает моторы самСекция [idle_timeout] по умолчанию ждёт 600 секунд простоя и выполняет TURN_OFF_HEATERS и M84. Это же правило ловит длинную паузу — см. раздел про температуру ниже.

M600 — смена филамента посреди печати

Слайсер вставляет её туда, где ты попросил сменить цвет или материал. В Marlin команда работает, только если при сборке прошивки включён ADVANCED_PAUSE_FEATURE: в стоковой сборке его может не быть, и тогда команда не распознаётся. Координаты парковки и длины выгрузки-загрузки задаются параметрами, а по умолчанию берутся из настроек прошивки.

В ядре Klipper команды M600 нет — её заводят макросом. Самый безопасный вариант: не писать отвод второй раз, а переслать вызов в PAUSE, где отвод и втягивание уже описаны.

[gcode_macro M600]
description: Смена филамента посреди печати
gcode:
  PAUSE

Дальше пруток меняют руками или кнопками интерфейса, а печать продолжает RESUME. Если в PAUSE у тебя стоит сброс сопла до дежурной температуры, для смены филамента её придётся держать выше порога экструзии — иначе кнопки прутка на этой паузе откажут, см. раздел ниже.

Команды, которой нет в прошивкеЧетырёхзначные M-коды в общий набор не входят: такие номера заводят под себя производители, стандарт их не описывает. M1006 — из тех, о которых спрашивают чаще всего: в списке команд Marlin и Klipper его нет, на них строка получит ответ, что команда неизвестна. Что он делает, зависит от прошивки, из которой пришёл файл, — смотри документацию своей модели, общего ответа тут нет.

Как управлять обдувом и какой вентилятор за что отвечает

Вентиляторов на принтере минимум два, и путать их дорого. Обдув детали дует на только что уложенную линию — им управляет слайсер командойM106. Обдув хотэнда дует на термобарьер и не даёт пластику размягчаться выше зоны расплава; он включается по температуре нагревателя и командой из файла не управляется. Выключишь его — пруток раздуется в термобарьере и встанет пробкой.

Что нужноMarlinKlipper
Обдув детали на полнуюM106 S255M106 S255
Обдув детали вполсилыM106 S128M106 S128
Выключить обдув деталиM107M107
Второй вентилятор обдуваM106 P1 S255 — номер задаётся при сборке прошивкиSET_FAN_SPEED FAN=имя SPEED=1 для секции [fan_generic имя]
Обдув хотэндаАвтоматический вентилятор, командой не задаётсяСекция [heater_fan], включается по температуре нагревателя
Обдув платыНастройка прошивки, не командаСекция [controller_fan], включается по работе моторов и нагревателей
Вентилятор по датчикуСекция [temperature_fan], цель — SET_TEMPERATURE_FAN_TARGET

Шкала M106 — 0–255 в обеих прошивках: S128это примерно половина. У SET_FAN_SPEED в Klipper шкала другая, от 0 до 1.

Номер вентилятора — свойство прошивки, а не стандартаВ Marlin P выбирает номер, нумерация с нуля, и какой разъём получил какой номер, решает сборка конкретной прошивки. В Klipper номеров нет вообще: секция [fan] одна, M106 управляет только ею, а всё остальное — именованные секции [fan_generic] и команда SET_FAN_SPEED.
Обдув хотэнда трогать нельзяВ Klipper это секция [heater_fan]: вентилятор включается, когда его нагреватель горячее порога, и выключается сам. В Marlin ту же роль играет автоматический вентилятор с порогом из конфигурации прошивки. По умолчанию порог в обеих около 50 °C.
На малых значениях вентилятор не страгиваетсяУ крыльчатки есть порог запуска, и он свой у каждого вентилятора: значение, с которого она не идёт с места, у одних около S25, у других заметно выше или ниже. При этом уже раскрученная крыльчатка на том же значении держится. Свой порог ищут на слух — M106 с шагом вверх с остановленного вентилятора. В Klipper на это есть kick_start_time — короткий импульс на полную при старте, и off_below — порог, ниже которого скорость считается нулём. В Marlin те же роли у FAN_KICKSTART_TIME и FAN_MIN_PWM.
Ручной M106 во время печати недолговеченОн держится ровно до следующей команды обдува в самом файле, а слайсер переключает обдув на границах слоёв и участков. Чтобы поменять надолго, правят профиль или множитель в интерфейсе.
Обдув нужен не всем материаламPLA печатают с обдувом на полную, ABS и ASA — почти без него, иначе слои расходятся. Значения по материалам — в таблице материалов.

Чем макрос Klipper отличается от команды

Команда G-code — часть языка, её понимает сама прошивка. Макрос — имя, за которым стоит список команд, объявленный в конфиге секцией[gcode_macro ИМЯ]. Для файла печати и для интерфейса разницы нет: макрос вызывается так же, как обычная команда, и вHELP стоит в одном списке с ней.

Внутри макроса работают шаблоны Jinja2: условия и вычисления считаются в момент вызова, а в прошивку уходит уже готовый текст. Отсюда и берутся макросы, которые смотрят на состояние машины — координаты, заданную температуру, габарит осей.

printer — состояние машиныОбращение вида printer.toolhead.position, printer.extruder.target, printer.toolhead.axis_maximum подставляет значение на момент выполнения. Так макрос узнаёт, где сопло и до какой температуры его грели.
variable_ — своё значение внутри макросаСтрока вида variable_park_x: 10 заводит переменную, которую правят в одном месте. Поменять её из другого макроса можно командой SET_GCODE_VARIABLE — так одно действие передаёт значение другому.
rename_existing — переопределениеЕсли макрос называется так же, как существующая команда, прежняя обязана получить новое имя: rename_existing: BASE_PAUSE. Без этой строки Klipper не запустится: имя уже занято, и запуск падает с gcode command PAUSE already registered. Обратная ошибка — Existing command 'PAUSE' not found in gcode_macro rename: переименовывать нечего, команды с именем самого макроса в конфиге нет.
Правка конфига требует перезапускаRESTART перечитывает printer.cfg. FIRMWARE_RESTART вдобавок перезапускает микроконтроллер — он нужен после ошибки MCU и после M112.

Как поставить печать на паузу и отвести сопло

Команды PAUSE и RESUME появляются в Klipper вместе с секцией [pause_resume] в конфиге. Сама по себе пауза только останавливает подачу файла и запоминает состояние — сопло остаётся стоять над деталью и подтекает в одну точку. Отвод, подъём по Z и втягивание прутка добавляет макрос поверх базовой команды.

Сначала проверь, нет ли такого макроса у тебя. Mainsail и Fluidd приносят свои: в подключаемом конфиге интерфейса (mainsail.cfg, fluidd.cfg — строка[include …] в начале printer.cfg) уже переопределены PAUSE, RESUME иCANCEL_PRINT. Вторая секция [gcode_macro PAUSE]рядом с ними ошибки не вызовет — и это хуже ошибки. Повтор секции Klipper проблемой не считает: две одинаковые секции сливаются в одну, и по каждой строке побеждает прочитанное последним. Твоя секция ниже строки[include mainsail.cfg] молча заменит клиентский макрос, унаследовав его переменные variable_, которых у тебя нет; поставленная выше — так же молча останется без действия. В логе ни того, ни другого не видно.

Если готовый макрос уже естьНе переписывай его. Поведение клиентских макросов настраивается отдельной секцией переменных — _CLIENT_VARIABLE: там задают, парковаться ли по своим координатам, на сколько поднимать сопло и сколько втягивать. Точный набор переменных сверь с документацией своего интерфейса, он отличается по версиям.
Если своё действие всё-таки нужноВ клиентских макросах есть переменные-хуки, куда вписывают имя собственного макроса — он вызывается на паузе и на возобновлении. Это способ добавить своё, не трогая чужие определения. Имена хуков смотри там же, в документации интерфейса.

Макрос паузы

[gcode_macro PAUSE]
description: Пауза с отводом сопла
rename_existing: BASE_PAUSE
# Значения ниже — пример. Подставь свои: координаты в пределах стола,
# подъём — сколько влезает над деталью, втягивание — как у твоего профиля.
variable_park_x: 10
variable_park_y: 10
variable_lift_z: 10
variable_retract: 1.5
gcode:
  {% set p = printer["gcode_macro PAUSE"] %}
  {% set max_z = printer.toolhead.axis_maximum.z|float %}
  {% set act_z = printer.toolhead.position.z|float %}
  {% set lift = [p.lift_z|float, max_z - act_z]|min %}
  BASE_PAUSE
  G91
  M83
  G1 E-{p.retract} F2100
  G1 Z{lift} F900
  G90
  G1 X{p.park_x} Y{p.park_y} F6000
rename_existing: BASE_PAUSEБазовая команда получает новое имя, и макрос может её вызвать. Без строки Klipper не стартует: gcode command PAUSE already registered. Если же секции [pause_resume] в конфиге нет, переименовывать нечего, и запуск падает с Existing command 'PAUSE' not found in gcode_macro rename — именно так ломается конфиг у того, кто скопировал макрос, а секцию завести забыл.
Координаты запоминать не нужноСекция [pause_resume] сама сохраняет состояние под меткой PAUSE_STATE, а BASE_RESUME сам возвращает сопло в точку остановки со скоростью recover_velocity. Свой SAVE_GCODE_STATE здесь — второе такое же сохранение и второй возврат по тому же пути.
Таймаут простоя не ждётСекция [idle_timeout] по умолчанию через 600 секунд гасит нагрев и обесточивает моторы — вместе с паузой. Пока в макросе нет SET_IDLE_TIMEOUT, пауза живёт десять минут, а дальше возвращаться некуда: положение осей потеряно. Строка добавляется ниже, в разделе про температуру.
BASE_PAUSE стоит до движенийПечать обязана остановиться раньше, чем каретка поедет в сторону. Переставишь строку ниже — отвод пойдёт вперемешку с продолжающейся печатью.
G91 и M83Относительные координаты и относительная подача: подъём и втягивание считаются от текущей точки. Строка G90 перед парковкой возвращает абсолютные — координаты стола задаются в них.
Строка с liftБерёт меньшее из двух: заданный подъём и остаток до потолка оси. Без этого на высокой детали Klipper отклонит движение за габарит, и макрос оборвётся посреди отвода.
Когда подниматься некудаУ детали почти в полный рост остаток до потолка нулевой, и подъёма не будет: сопло поедет в парковку прямо по верхней поверхности и протащит по ней борозду. На такой высоте отводить некуда — оставь только втягивание прутка и убери из макроса перегон по XY либо ставь паузу ниже, пока запас по Z ещё есть.
Скорости в F — мм/минF2100 — это 35 мм/с на втягивании, F900 — 15 мм/с на подъёме, F6000 — 100 мм/с на перегоне. Медленнее не нужно, быстрее — по возможностям машины.
Координаты парковки проверь на своём столе10 и 10 — пример для стола, у которого в переднем левом углу пусто. Держатели стекла, клипсы и щётка для сопла живут как раз там. На принтере с подвижным столом парковка по Y выкатывает деталь вперёд — убедись, что ей есть куда ехать.

Возобновление

[gcode_macro RESUME]
description: Возврат в точку остановки и продолжение печати
rename_existing: BASE_RESUME
gcode:
  {% set p = printer["gcode_macro PAUSE"] %}
  G91
  M83
  G1 E{p.retract} F2100
  BASE_RESUME

Пруток возвращают, пока сопло стоит в стороне: капля упадёт мимо детали. BASE_RESUME сам отвезёт сопло в точку остановки, вернёт режимы координат и продолжит печать; скорость возврата задаёт параметр recover_velocity секции[pause_resume].

Как понизить температуру сопла на паузе

Смысл в том, что горячее сопло на долгой паузе течёт, а пруток внутри деградирует: PLA карамелизуется, PETG вспенивается, и первые сантиметры после возобновления идут с пузырями. Сброс до дежурной температуры это останавливает. Для короткой паузы на минуту-другую сбрасывать нагрев не нужно — обратный выход на температуру займёт дольше, чем сама пауза.

Заданную температуру перед сбросом надо запомнить: её берут из состояния экструдера и кладут в переменную макроса командойSET_GCODE_VARIABLE. Строки ниже дописываются к макросу паузы из предыдущего раздела.

# К переменным PAUSE добавляются две.
# 160 — пример: температура ниже порога экструзии, чтобы пруток
# перестал течь, но сопло не остыло до комнатного.
variable_standby: 160
variable_saved_temp: 0

# Эти три строки идут в конец gcode: у PAUSE, после парковки.
  SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=saved_temp VALUE={printer.extruder.target}
  SET_HEATER_TEMPERATURE HEATER=extruder TARGET={p.standby}
  SET_IDLE_TIMEOUT TIMEOUT=3600

На возобновлении нагрев обязан идти первым, до возврата прутка.M109 ждёт выхода на температуру, и только после этого экструдеру разрешено двигаться.

# Эти строки идут в начало gcode: у RESUME, до возврата прутка.
# Таймаут возвращается не к жёсткому числу, а к тому, что стоит
# в твоей секции [idle_timeout]: значение берётся из конфига.
  {% set t = printer["gcode_macro PAUSE"].saved_temp|float %}
  {% if t > 0 %}
  M109 S{t}
  {% endif %}
  SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout}
160 °C — ниже порога экструзииKlipper запрещает двигать пруток холоднее min_extrude_temp, по умолчанию это 170 °C. Дежурные 160 в порог не проходят намеренно: на паузе пруток шевелить незачем, а вот в макросе возобновления нагрев обязан стоять раньше любой команды с E, иначе Klipper остановится с ошибкой.
Кнопки прутка на такой паузе не работаютЗагрузка и выгрузка филамента в интерфейсе — это движение E, и на дежурных 160 °C Klipper его отклонит: «Extrude below minimum temp». Пруток руками тоже не вытянуть — он застынет в сопле. Если пауза нужна как раз для смены филамента (M600), дежурную температуру не сбрасывают вовсе либо держат её выше min_extrude_temp — например 180 для PLA, — а сброс до 160 оставляют для пауз, на которых пруток не трогают.
Проверка на ноль в RESUMEУсловие t > 0 нужно на случай, если паузы не было и запомненная температура пустая: без него M109 S0 оказался бы в начале возобновления.
Стол на паузе не выключайОстывший стол отпускает деталь, и после возобновления печатать будет уже не по чему. Понижают только сопло.
Таймаут простоя обрывает долгую паузуСекция [idle_timeout] по умолчанию ждёт 600 секунд и выполняет TURN_OFF_HEATERS и M84: нагрев выключен, моторы обесточены, возвращаться в точку не с чего. Поэтому в макросе стоит SET_IDLE_TIMEOUT. На возобновлении таймаут возвращают не числом 600, а значением из своей же секции: макросу оно доступно через printer.configfile.settings, как в примере выше. Жёсткая цифра затрёт настройку тому, у кого в конфиге стоит не 600. У клиентских макросов Mainsail для этого есть отдельная переменная.
Дежурную температуру подбирают под материал160 — рабочий пример для PLA и PETG. Ориентир простой: заметно ниже температуры печати, чтобы расплав загустел, но не с комнаты — обратный выход на 210–240 занимает десятки секунд, и всё это время деталь стоит остывшая.
След от паузы на детали остаётсяМесто остановки видно швом или полосой: слой успел остыть, и следующий ложится на холодное. Полностью это не лечится, но короткая пауза и сохранённый нагрев стола делают шов незаметнее.

Готовые последовательности

Выдавить 100 мм для калибровки экструдера

M109 S210
G91
M83
G1 E50 F50
G1 E50 F50

Сто миллиметров разбиты на две команды по 50 не для удобства счёта: Klipper отклоняет движение только по E, если оно длиннееmax_extrude_only_distance — а это по умолчанию 50 мм. Строка G1 E100 там оборвётся с «Extrude only move too long», и запущенная из файла оборвёт печать. Два движения по 50 проходят и в Klipper, и в Marlin. Скорость 50 мм/мин — намеренно медленно, иначе экструдер проскользнёт и результат будет про сцепление, а не про шаги. Калькулятор E-steps.

Прочистить сопло холодной протяжкой

M109 S240
G91
M83
G1 E20 F100

Дальше сопло остужают до 90 °C и ждут не по таймеру, а по датчику. В Marlin это одна строка:

M109 R90

В Klipper — две:

M104 S90
TEMPERATURE_WAIT SENSOR=extruder MAXIMUM=90

Остывание с 240 до 90 занимает две-четыре минуты — сколько именно, зависит от хотэнда и обдува. Пауза G4 P60000 отсчитает ровно минуту и отпустит тебя к ещё горячему соплу, поэтому её тут и нет. Перед протяжкой отпусти прижим экструдера — иначе будешь тянуть пруток через сжатую шестерню и сточишь на нём лыску вместо того, чтобы вытащить. Тянуть рукой одним движением, вверх; на конце останется слепок сопла вместе с нагаром.

Проверить геометрию без печати

G28
G90
G1 Z5 F600
G1 X10 Y10 F3000
G1 X200 Y10
G1 X200 Y200
G1 X10 Y200
G1 X10 Y10

Подъём на 5 мм стоит первым не зря: после G28 сопло на нуле, и обход периметра пошёл бы по столу. Опускать обратно не надо. Дальше каретка обходит периметр: слышны стуки или клины — проблема механическая, настройками не лечится. Координаты рассчитаны на стол 220 × 220; на другом габарите подставь свои.

Ни один из рецептов не заканчивается на M84. Моторы после них выключают руками и только на машине с винтовой осью Z: на ремённой портал без тока опускается под своим весом — сопло уедет в стол или в деталь.

Дальше