# Ukuetis G-code v2 Все команды делятся на две большие группы: - **Команды-настройки** (`P`-команды) — задают параметры работы печи: имя программы, термопару, максимальную температуру, допуски, коэффициенты PID, условия безопасности. Обычно располагаются в начале программы, но могут встречаться в любом месте — они применяются немедленно при исполнении. - **Команды-программы** (`K`-команды) — управляют непосредственно процессом обжига: задают линейный нагрев/охлаждение до заданной температуры (`K203`) или выдержку на температуре (`K107`). Исполняются последовательно и занимают время. --- ## Сводная таблица команд ### Настройки (P-команды) | Код | Описание | Статус | |-----|----------|--------| | `P001` | Имя программы | v2 ↓ | | `P101` | Предупреждение/ошибка по отклонению скорости нагрева от плана | gcode.md | | `P102` | Предупреждение/ошибка по отклонению температуры от плана | gcode.md | | `P103` | Предупреждение/ошибка по превышению абсолютной температуры | gcode.md | | `P106` | Ограничение максимальной температуры печи | v2 ↓ | | `P150` | Допуск по температуре (абсолютный или процентный) | v2 ↓ | | `P177` | Метка времени последнего сохранения (Unix timestamp), используется для синхронизации | v2 ↓ | | `P200` | Настройка термопар (основная, альтернативная, внешняя, внутренняя) | v2 ↓ | | `P201` | Правила безопасности (по мощности нагревателя или по температуре термопары) | v2 ↓ | | `P202` | Название печи | v2 ↓ | | `P220` | Контроль средней PID-ошибки в скользящем окне | v2 ↓ | | `P301` | Период ШИМ | gcode.md | | `P302` | Параметры PID-регулятора (коэффициенты и профили по температуре) | v2 ↓ | | `P303` | Автонастройка PID | gcode.md | | `P304` | Выбор нагревателя | gcode.md | | `P305` | Максимальный процент использования нагревателя | gcode.md | | `P306` | Мощность нагревателя печи в Ваттах; используется для расчёта энергопотребления | v2 ↓ | | `P800` | Разработчик программы | v2 ↓ | | `P801` | Тип программы | v2 ↓ | | `P802` | Комментарий к программе | v2 ↓ | | `P810` | UUID программы (идентификатор для матчинга статусов контроллера и сервера) | v2 ↓ | | `P850` | Расчётная длительность программы (только для UI, не исполняется) | v2 ↓ | ### Команды-программы (K/M-команды) | Код | Описание | Статус | |-----|----------|--------| | `K001` | Версия интерпретатора (маркер совместимости) | gcode.md | | `K101` | Нагрев/охлаждение до температуры с заданной скоростью или временем | gcode.md | | `K107` | Быстрый выход на температуру с опциональной выдержкой | v2 ↓ | | `K110` | Нагрев/охлаждение до температуры с макс. скоростью и опциональной выдержкой | gcode.md | | `K120` | Выключить нагрев | gcode.md | | `K121` | Выключить нагрев при достижении пирометрического конуса | gcode.md | | `K122` | Выключить нагрев при достижении пирометрического конуса (с учётом охлаждения) | gcode.md | | `K150` | Отправить уведомление с произвольным сообщением | gcode.md | | `K151` | Ожидание действия оператора | gcode.md | | `K200` | Пауза на заданное время (нагрев выключен) | gcode.md | | `K203` | Линейный разгон/охлаждение до целевой температуры | v2 ↓ | | `M200` | Управление вентиляцией (0/100) | gcode.md | | `M201` | Управление приточкой (0/100) | gcode.md | | `M202` | Управление заслонкой (0/100) | gcode.md | > **v2 ↓** — команда задокументирована в этом файле ниже. **gcode.md** — код из старого чернового формата, приведён только для справки. --- ## Pretty G-code Pretty G-code — расширение формата, которое позволяет делать команды более читаемыми для человека, добавляя свободный текст прямо в строку команды. **Принцип работы парсера:** Парсер обрабатывает каждую строку по следующим правилам: 1. Строка, начинающаяся с `;`, считается комментарием и игнорируется целиком. 2. Всё после `;` в середине строки игнорируется (встроенный комментарий). 3. Из остатка строки извлекаются токены вида `<Буква><Число>` — например `S1120`, `R130`, `H1.5`, `T600`. Всё, что не соответствует этому паттерну, **игнорируется**. 4. Первый токен строки — это имя команды (например `K203`, `P106`). Остальные — её аргументы. **Исключения:** - `P001` — имя программы читается как произвольная строка (до `;` или конца строки), а не как набор токенов `<Буква><Число>`. - `P200` — аргументы (`MAINTK`, `C1`, `TK`) не соответствуют паттерну `<Буква><Число>` и разбираются как ключевые слова по собственным правилам команды. Благодаря этому правилу можно писать: ```gcode K203 Move to S1120 °С with speed R130 °С/h ``` Парсер извлечёт из этой строки `K203`, `S1120`, `R130` и проигнорирует слова `Move`, `to`, `with`, `speed` и строку `°С/h`. Результат идентичен краткой записи `K203 S1120 R130`. --- ## K203 — линейный нагрев/охлаждение до целевой температуры ```gcode K203 S1120 R130 ; Подъём температуры до 1120°C со скоростью 130°C/ч K203 S980 H1.5 ; Переход к 980°C за 1.5 часа (скорость вычисляется автоматически) K203 S600 M45 ; Охлаждение/нагрев до 600°C за 45 минут K203 S300 ; Мгновенное изменение сетпоинта до 300°C (без расчёта скорости) ``` **Pretty G-code (human-readable комментарии):** ```gcode K203 Move to S1120 °С with speed R130 °С/h K203 Move to S980 °С in H1.5 hours K203 Move to S600 °С in M45 minutes K203 Move to S300 °С ``` **Параметры:** | Параметр | Описание | |---|---| | `S<температура °C>` | **Обязательно.** Положительное целевое значение. | | `R<°C/ч>` | Скорость нагрева/охлаждения. Взаимно исключается с `H`/`M`. | | `H<часы>` | Длительность в часах (может быть дробной). Используется для расчёта скорости. | | `M<минуты>` | Длительность в минутах (может быть дробной). Можно комбинировать с `H`. | **Особенности:** - Если заданы `H` и/или `M`, скорость вычисляется из текущей точки и целевой температуры. - При отсутствии `R`/`H`/`M` команда задаёт сетпоинт сразу, затем исполнитель ждёт стабилизации ~5 секунд. - Допускается охлаждение: целевая температура может быть ниже стартовой. --- ## K107 — быстрый выход на температуру с выдержкой ```gcode K107 S1120 ; Дождаться стабилизации на 1120°C K107 S1030 H2 ; Выдержка 2 часа после выхода на 1030°C K107 S850 M30 ; Выдержка 30 минут после выхода на 850°C ``` **Pretty G-code (human-readable комментарии):** ```gcode K107 Hold on S1220 °С for M5 minutes K107 Hold on S1030 °С for H3 hours ``` **Параметры:** | Параметр | Описание | |---|---| | `S<температура °C>` | **Обязательно.** Положительное целевое значение. | | `H<часы>` / `M<минуты>` | Необязательная выдержка после стабилизации. Можно комбинировать. | **Особенности:** - Сетпоинт устанавливается мгновенно. Исполнитель ждёт стабилизации ~20 секунд. - При наличии выдержки отсчёт начинается после стабилизации. Без выдержки команда завершается сразу после стабилизации. - Допускается переход на более низкую температуру. --- ## P177 — метка времени последнего сохранения ```gcode P177 Updated at 09.03.2026, 17:17:18 U1773065838 ``` **Особенности:** - Команда содержит метку времени Unix в параметре `U<секунды>`. - Текст до U-параметра (например `Updated at DD.MM.YYYY, HH:MM:SS`) игнорируется парсером. - Парсер извлекает только `U<целое_число>` — Unix timestamp в секундах. - Команда генерируется автоматически редактором при сохранении программы. - Используется для разрешения конфликтов при синхронизации между устройством и клиентом: побеждает файл с бо́льшим timestamp. - При отсутствии команды `P177` timestamp считается равным 0. --- ## P001 — имя программы ```gcode P001 Bisque firing ; Название загружаемой программы (для телеметрии и логов) ``` **Особенности:** - Строка имени начинается сразу после пробела и продолжается до конца строки или комментария `;`. - Последняя встреченная команда `P001` перезаписывает имя программы. - Имя сохраняется в прошивке и публикуется в MQTT. --- ## P106 — ограничение максимальной температуры печи ```gcode P106 S1250 ; Установить предельную температуру 1250°C ``` **Pretty G-code (human-readable комментарии):** ```gcode P106 Max temp: S1250 °С ``` **Параметры:** | Параметр | Описание | |---|---| | `S<°C>` | Целое положительное значение в градусах Цельсия. | При превышении предела срабатывает механизм безопасности и программа прерывается. --- ## P150 — допуск по температуре ```gcode P150 D3 ; Разрешённое отклонение ±3°C P150 P2 ; Разрешённое отклонение ±2% от целевого значения ``` **Pretty G-code (human-readable комментарии):** ```gcode P150 Temp tolerance in D3 °С P150 Temp tolerance in P0.8 % ``` **Особенности:** - Используйте `D<значение>` для абсолютного допуска в градусах. - Используйте `P<проценты>` для относительного допуска. Минимальное фактическое значение — 1°C (встроенное ограничение). - Последняя команда `P150` определяет активный режим допуска. `P0` переключает режим на процентный, но величина допуска берётся из последнего абсолютного значения. --- ## P200 — выбор основной термопары ```gcode P200 MAINTK C1 TK ; Основной канал C1, термопара типа K P200 MAINTK C1 TS ; Основной канал C1, термопара типа S ``` **Особенности:** - Поддерживаются типы: `B`, `E`, `J`, `K`, `N`, `R`, `S`, `T` (буква после `T`). - Формат состоит из ключевого слова `MAINTK`, указания канала `C1` и типа термопары. - Последняя команда `P200` задаёт активный тип и публикует его в телеметрии. --- ## P201 — правило безопасности по мощности нагревателя ```gcode P201 T800 P60 ; Прервать программу, если при мощности ≥60% температура ниже 800°C ``` **Pretty G-code (human-readable комментарии):** ```gcode P201 Stop if T < T1000 °С & PWM > P100 ``` **Параметры:** | Параметр | Описание | |---|---| | `T<°C>` | Целевая температура в °C (целое число). | | `P<проценты>` | Минимальная мощность нагревателя в процентах (0…100). | --- ## P202 — название печи ```gcode P202 Plavka ; Название печи ``` **Особенности:** - Строка значения читается как произвольный текст (до `;` или конца строки). - Используется как метаданные: публикуется в телеметрии и отображается в UI. - Последняя встреченная команда `P202` перезаписывает значение. --- ## P220 — контроль средней PID-ошибки ```gcode P220 T25 ; Прервать программу при |ошибке PID| > 25°C в скользящем окне ``` **Pretty G-code (human-readable комментарии):** ```gcode P220 Set max PID error T30 °С ``` **Параметры:** | Параметр | Описание | |---|---| | `T<°C>` | Положительное значение порога в градусах (до 2000°C). | **Особенности:** - Значение применяется сразу после команды и действует до следующего изменения. --- ## P302 — параметры PID-регулятора ```gcode P302 P1.50 I0.0020 D0.25 ; Глобальные коэффициенты PID P302 P2.00 I0.0030 D0.40 T600 ; Профиль PID для температур ниже 600°C ``` **Pretty G-code (human-readable комментарии):** ```gcode P302 Set PID: P1.5 I0.0015 D3 for T < T400 °C P302 Set PID: P1.5 I0.0015 D3 ``` **Параметры:** | Параметр | Описание | |---|---| | `P` | Пропорциональный коэффициент (**обязателен**). | | `I` | Интегральный коэффициент (**обязателен**). | | `D` | Дифференциальный коэффициент (**обязателен**). | | `T<°C>` | Создаёт профиль, который применяется при температурах ниже указанного порога. | **Особенности:** - Обязательны все три аргумента: `P`, `I`, `D`. - Дополнительный параметр `T<температура>` создаёт профиль для температур ниже указанного порога. Можно задать до восьми профилей; они сортируются по возрастанию `T`. - Команда без `T` обновляет текущие коэффициенты PID немедленно. - Повторные вызовы `P302` допускаются в любом месте программы; последняя команда без `T` задаёт базовые параметры. --- ## P306 — мощность нагревателя печи ```gcode P306 P9000 ; Мощность нагревателя 9000 Вт ``` **Pretty G-code (human-readable комментарии):** ```gcode P306 Kiln power P9000 W P306 P3500 ``` **Параметры:** | Параметр | Описание | |---|---| | `P<Ватты>` | **Обязательно.** Номинальная мощность нагревателя в Ваттах (целое положительное). | **Особенности:** - Мощность публикуется в MQTT в топик `/telemetry/gcode/kiln_power_w` при исполнении команды. - На основе заданной мощности и текущего PWM-процента контроллер каждую секунду интегрирует потреблённую энергию: ``` E += kiln_power_w × pwm_percent / 100 × (1с / 3600) [кВт·ч] ``` - Накопленная энергия с начала текущего обжига публикуется в MQTT в топик `/telemetry/gcode/current_energy_kwh`. - Счётчик обнуляется при каждом старте новой программы (переходе в статус `RUNNING`). - Если команда `P306` не задана, расчёт энергии не производится и топик не публикуется. - Последняя встреченная команда `P306` задаёт активную мощность и перезаписывает предыдущее значение. --- ## P800 — разработчик программы ```gcode P800 OVO ``` **Особенности:** - Строка значения читается как произвольный текст (до `;` или конца строки). - Используется как метаданные программы: публикуется в телеметрии и отображается в UI. - Последняя встреченная команда `P800` перезаписывает значение. --- ## P801 — тип программы ```gcode P801 Высокий ``` **Особенности:** - Строка значения читается как произвольный текст (до `;` или конца строки). - Задаёт классификацию или режим программы; используется как метаданные. - Последняя встреченная команда `P801` перезаписывает значение. --- ## P802 — комментарий к программе ```gcode P802 Специальный режим для маленьких печей, которые быстро остывают: в нем есть медленное охлаждение в конце ``` **Особенности:** - Строка комментария читается как произвольный текст (до `;` или конца строки). - Используется как поясняющий текст к программе; отображается в UI. - Последняя встреченная команда `P802` перезаписывает значение. --- ## P810 — UUID программы ```gcode P810 I3f47ac10-58b2-4a45-ad3d-e10b8c7f00a1 ``` **Особенности:** - Строка UUID читается как произвольный текст (до `;` или конца строки). - Используется для матчинга статусов: контроллер публикует этот UUID в MQTT, сервер по нему сопоставляет запущенную программу с актуальным статусом. - При загрузке программы UUID выставляется в MQTT-топик и остаётся там на всё время выполнения программы. - Последняя встреченная команда `P810` перезаписывает значение. --- ## P850 — расчётная длительность программы ```gcode P850 Firing and cooling to 300°C will take 1 day, 2 hours, 27 minutes S95270 ``` **Параметры:** | Параметр | Описание | |---|---| | `S<секунды>` | Расчётная длительность в секундах (целое число). | **Особенности:** - Команда содержит расчётное время в параметре `S<секунды>`. - Текстовая часть строки (до параметра `S`) игнорируется парсером — это human-readable описание для удобства чтения файла. - Генерируется автоматически редактором при сохранении программы на основе расчёта длительности. - **Не исполняется прошивкой** — служит исключительно для отображения расчётного времени в UI. - При отсутствии команды `P850` длительность программы считается неизвестной. --- ## Пример последовательности **Стандартный G-code:** ```gcode ; Settings P001 "Stoneware cycle" ; Название программы P200 MAINTK C1 TK ; Основной канал C1, термопара типа K P106 S1280 ; Максимальная температура 1280°C P150 D3 ; Допуск ±3°C P302 P1.30 I0.0025 D0.35 T600 ; PID-профиль для температур ниже 600°C P302 P1.10 I0.0015 D0.20 ; Базовые коэффициенты PID P201 T750 P70 ; Аварийное условие по мощности P220 T20 ; Контроль средней ошибки PID ; Program K203 S600 R180 ; Разгон до 600°C со скоростью 180°C/ч K203 S980 H1.5 ; Переход к 980°C за 1.5 часа K107 S980 H0.5 ; Выдержка 30 минут на 980°C K203 S1220 R80 ; Подъём до 1220°C со скоростью 80°C/ч K107 S1220 M45 ; Выдержка 45 минут K203 S300 ; Плавное охлаждение до 300°C (сетпоинт снизится мгновенно, исполнитель дождётся стабилизации) ``` **Pretty G-code:** ```gcode P001 Stoneware cycle P200 MAINTK C1 TK P106 Max temp: S1280 °С P150 Temp tolerance in D3 °С P302 Set PID: P1.30 I0.0025 D0.35 for T < T600 P302 Set PID: P1.10 I0.0015 D0.20 P201 Stop if T < T750 °С & PWM > P70 P220 Set max PID error T20 °С K203 Move to S600 °С with speed R180 °С/h K203 Move to S980 °С in H1.5 hours K107 Hold on S980 °С in H0.5 hours K203 Move to S1220 °С with speed R80 °С/h K107 Hold on S1220 °С for M45 minutes K203 Move to S300 °С ```