Макросы Klipper: PRINT_START, PRINT_END и полезные примеры

Как устроены макросы Klipper: секция gcode_macro, параметры, переменные, шаблоны Jinja2 и доступ к состоянию принтера. Пишем PRINT_START и PRINT_END, разбираем макросы паузы, смены пластика, загрузки и выгрузки, подключаем их в Orca Slicer, Cura и PrusaSlicer, и избегаем типичных ошибок.
Коротко: макрос Klipper — это своя G-code-команда, описанная в printer.cfg секцией [gcode_macro ИМЯ]. Внутри — обычные команды плюс шаблоны Jinja2: параметры (params), переменные (variable_), условия и доступ к состоянию принтера (printer). Главные макросы — PRINT_START и PRINT_END: вся логика старта и окончания печати переносится из слайсера в принтер, а слайсер передаёт только температуры. Ещё полезны пауза и смена пластика (M600), загрузка и выгрузка нити, парковка. Ниже — синтаксис, рабочие примеры и подключение в слайсерах.
Зачем нужны макросы
В Marlin стартовый код живёт в слайсере, и в каждом слайсере он свой. В Klipper логику удобно держать в принтере: слайсер вызывает PRINT_START с температурами, а что именно делать — хоминг, сетка стола, прогрев, очистка — решает макрос. Поменяли процедуру — правите одно место, а не профили в трёх слайсерах. Макросы также дают кнопки в Mainsail и Fluidd для частых действий. Klipper или Marlin, Mainsail и Fluidd.
Синтаксис

Минимальный макрос:
[gcode_macro PARK]
description: Парковка головы
gcode:
G90
G1 X10 Y10 Z30 F6000
Команды внутри gcode: пишутся с отступом. Всё, что в фигурных скобках, — шаблон: Klipper подставляет значения перед выполнением. Параметры, переданные при вызове (PARK Z=50), доступны как params.Z. Обязательно задавайте значение по умолчанию и тип: {params.Z|default(30)|float}.
PRINT_START
Пример для принтера с датчиком стола:
[gcode_macro PRINT_START]
gcode:
{% set BED = params.BED|default(60)|float %}
{% set EXTRUDER = params.EXTRUDER|default(210)|float %}
M140 S{BED}
M104 S150
G28
M190 S{BED}
BED_MESH_CALIBRATE
M109 S{EXTRUDER}
G92 E0
G1 X5 Y20 Z0.3 F5000
G1 Y150 E15 F1500
G92 E0
Логика: стол начинает греться сразу, сопло — до 150 °C (чтобы не текло при калибровке и не пачкало датчик), затем хоминг, прогрев стола, сетка, нагрев сопла до рабочей и полоса очистки. Адаптируйте координаты полосы под свой стол. Автокалибровка стола.
PRINT_END
[gcode_macro PRINT_END]
gcode:
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set z = [printer.toolhead.position.z + 10, max_z]|min %}
G91
G1 E-2 F2700
G90
G1 Z{z} F3000
G1 X10 Y200 F6000
M104 S0
M140 S0
M107
M84
Здесь используется состояние принтера: голова поднимается на 10 мм, но не выше максимума оси Z.
Подключение в слайсере

Конечный G-code во всех слайсерах — просто PRINT_END. Важно: если слайсер видит в стартовом коде свои команды нагрева, он не добавит их сам; если не видит — может добавить M190/M109 до вашего макроса. В Orca и PrusaSlicer это обычно решается автоматически, в Cura иногда нужно отключить вставку температур. Профиль принтера.
Переменные
Переменные хранят значения между вызовами или служат настройками:
[gcode_macro LOAD_FILAMENT]
variable_load_distance: 80
gcode:
M109 S{params.TEMP|default(220)|float}
M83
G1 E{printer["gcode_macro LOAD_FILAMENT"].load_distance} F300
G1 E20 F150
Менять переменную во время работы — командой SET_GCODE_VARIABLE MACRO=LOAD_FILAMENT VARIABLE=load_distance VALUE=100.
Пауза и смена пластика
Для паузы Klipper нужна секция [pause_resume]; готовые макросы PAUSE, RESUME и CANCEL_PRINT идут в комплекте конфигов Mainsail и Fluidd — подключите их через [include mainsail.cfg]. Смену пластика M600 делают макросом, который вызывает PAUSE, паркует голову и выгружает нить; Klipper сам M600 не знает. Слайсеры вставляют M600 на нужном слое для смены цвета. Многоцветная печать.
Переопределение команд
rename_existing позволяет расширить существующую команду: например, переименовать встроенную M109 и добавить в новую ожидание стабилизации. Используйте осторожно и не переопределяйте команды безопасности.
Типичные ошибки
- Нет отступа у строк в
gcode:— Klipper не загрузит конфиг. - Параметры без default — макрос падает при вызове без значения.
- Строка вместо числа — забыли
|float, сравнение работает неверно. - Шаблон вычисляется один раз — значения
printer.*берутся на момент запуска макроса, а не после каждой строки. Для «свежих» данных разбейте логику на два макроса. - Двойной нагрев — слайсер добавил свои команды температуры перед макросом.
Справочник команд — в официальной документации Klipper (разделы Command Templates и G-Codes). G-code.
Частые вопросы
Что такое макрос Klipper?
Своя команда G-code из секции gcode_macro в printer.cfg.
Как передать температуру из слайсера?
Вызвать PRINT_START BED=… EXTRUDER=… с переменными слайсера.
Как задать значение по умолчанию?
Фильтр default: {params.BED|default(60)|float}.
Почему не работает M600?
В Klipper его нет — нужен свой макрос и секция pause_resume.
Где взять готовые макросы?
В конфигах Mainsail и Fluidd и в официальных примерах Klipper.
Как применить изменения?
Сохранить printer.cfg и выполнить FIRMWARE_RESTART или RESTART.
Нужна 3D-печать на заказ?Студия Universe3D в Тюмени: фотополимерная печать, моделирование, покраска. Доставка по России и СНГ.
Оставить заявку