Add gcode.md

This commit is contained in:
2026-03-12 02:39:49 +03:00
commit fe04182654

460
gcode.md Normal file
View File

@@ -0,0 +1,460 @@
# 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 ↓ |
| `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<kp>` | Пропорциональный коэффициент (**обязателен**). |
| `I<ki>` | Интегральный коэффициент (**обязателен**). |
| `D<kd>` | Дифференциальный коэффициент (**обязателен**). |
| `T<°C>` | Создаёт профиль, который применяется при температурах ниже указанного порога. |
**Особенности:**
- Обязательны все три аргумента: `P<kp>`, `I<ki>`, `D<kd>`.
- Дополнительный параметр `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` перезаписывает значение.
---
## 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 °С
```