Программа сохранена. Дальше — шесть ступеней, и на каждой платформа либо пускает дальше, либо называет причину. Конфиг контроллера всегда порождается из двойника в момент запуска; на стенде его не правят.
| ступень | что происходит | где | что видно / что держит |
|---|---|---|---|
| установка | где лежит заготовка, ноль детали | карточка станка → установка | Machine.current_setup · work_offsets.p1 → G54 |
| preflight | статические проверки программы против двойника | карточка программы → бейдж и «Pre-flight check» | отчёт: ошибки блокируют, предупреждения — нет |
| launch | поднять LinuxCNC из двойника: конфиг генерится и уезжает на бокс | карточка станка → кнопка питания, рядом переключатель «вирт. оси / реальные приводы» | режим sim или servo хранится в двойнике, его видят все окна |
| home | привязать оси: нули по абсолютным энкодерам | кнопка «Привязать оси (Home)?» | на абсолютных энкодерах — защёлка флага без поиска; без базы AUTO-программа не пускается |
| send | положить программу в контроллер | кнопка «Пуск» — кладёт, если ещё нет, и пускает | гейт: слот без вылета с названным происхождением блокирует отправку |
| обратная связь | позиции, ошибка слежения, statusword приводов | монитор станка, осциллограф cncctl | факт идёт снизу вверх: двойник отражает, не назначает |
Снимки с живого cncai.ru. Порядок — тот, в котором работает человек: программа → станок → оснастка и «Сделать текущим» → пуск → монитор.

/programs/cut или /programs/motion → «Новая программа». Род выбран списком, дальше он не меняется.

Один раз. Список делит станки по пригодности роду: «под CAM» и «на фланце захват, а не шпиндель». Внутри лабы станок не переспрашивают.

Лаборатория: глаголы реза или движения, Ctrl+↵ — программа сохранена, preflight показан счётчиком ошибок / предупреждений / справок.

«На станок»: оснастка по программе (слоты, вылет), «Сделать текущим» — стенд и профили осей, режим запуска (виртуальные оси или серво), проверки поимённо.

Стенд поднимает LinuxCNC из двойника; home; пуск. Монитор показывает DRO, строку, 3D по факту; отказ приходит текстом гейта дословно.
Статические проверки: доли секунды на программу любой длины, без симуляции съёма. Отчёт делит находки на ошибки (пуск заперт), предупреждения и справки. Коды — те, что печатает платформа.
| что охраняет | код | уровень | что говорит человеку |
|---|---|---|---|
| безопасная высота | safe_z_outside_axis_limit | предупреждение | текст собирается из контекста операции |
| геометрия: заготовка, инструмент, зона | deep_hole_no_peck | предупреждение | Отношение глубины к диаметру …× (depth=…, Ø…). Длинные отверстия требуют peck-drilling, иначе стружка забьёт канавки и сломает сверло. |
| envelope_<ось>_violation | ошибка — пуск заперт | Ось …: машинная координата (G53) …… вне хода […, …]… — на …… …. Ось …: …… вне хода […, …]… — на …… …. Ось …: … мм вне зоны […, …] мм — на … мм … (деталь … + ноль ……). Ось …: не поместится — ……. | |
| holder_collision | по ситуации | Зазор между держателем фрезы и верхом заготовки … мм (gauge_length=… мм, depth=… мм). Минимум … мм. | |
| table_crash | ошибка — пуск заперт | Рез уходит на … мм ниже дна заготовки (толщина … мм), а подклад не задан — фреза придёт в стол. | |
| through_cut_deeper_than_pad | ошибка — пуск заперт | Подрез … мм больше подклада … мм — фреза пройдёт подложку насквозь и достанет стол. | |
| through_cut_without_pad | ошибка — пуск заперт | Шаг объявлен сквозным, а в установке станка подкладки нет — выходить резу некуда, фреза придёт в стол. | |
| tool_too_large_for_pocket | ошибка — пуск заперт | Диаметр фрезы … мм больше меньшей стороны кармана (… мм). Карман не поместится. | |
| tool_too_short | ошибка — пуск заперт | Длина режущей части фрезы … мм меньше глубины реза … мм + 1 мм запаса. Фреза физически не сможет дорезать. | |
| zone_check_disabled_stand_no_mechanics | справка | Проверка выхода за рабочую зону не выполнена: …. | |
| кинематика и система координат | kinematics_frame_mismatch | ошибка — пуск заперт | Робот стартует в углах суставов, а программа — в координатах ячейки. |
| общее | gcode_missing | предупреждение | G-code ещё не сгенерирован — нечего валидировать. |
| machine_checks_not_run | предупреждение | Шаг «…» НЕ СВЕРЕН со станком (конверт осей, режимы, парковочная высота): кинематику шага прочитать не удалось — …: … | |
| tool_missing | предупреждение | Инструмент … не найден в библиотеке. | |
| оси станка | axis_not_on_machine | ошибка — пуск заперт | Программа адресует ось …, которой у станка нет: его оси — …. |
| программа движения и дом | motion_program_predates_home | предупреждение | Программа собрана до того, как у станка появилась начальная точка — перегенерируйте её, иначе рука стартует оттуда, где стоит. |
| режимы: обороты и подача | axis_speed_unclaimed | предупреждение | Подача зажата потолком оси … (… мм/мин), а источник этого потолка не назван — число принято умолчанием, не паспортом привода. |
| feed_above_recommended | предупреждение | Подача F=… выше расчётной (…) на …%. | |
| feed_too_high | ошибка — пуск заперт | Подача F=… мм/мин превышает расчётную (…) в …× — риск поломки фрезы. | |
| feed_too_low | предупреждение | Подача F=… ниже расчётной (…) более чем в 3× — риск 'натирания' (rubbing) вместо резания. | |
| material_missing | предупреждение | Материал не задан или не распознан ('…') / — подачу и обороты не с чем сверить. | |
| plunge_feed_too_high | предупреждение | Плунж по Z идёт с F=… > plunge_feed_mm_min=… (профиль). | |
| rpm_above_machine_max | ошибка — пуск заперт | S… превышает максимум … ……. | |
| rpm_below_machine_min | предупреждение | S… ниже минимума … …… — VFD может не выйти на режим. / луч может не пробить материал. | |
| spindle_ceiling_assumed | предупреждение | Обороты зажаты потолком шпинделя … об/мин, а это число … — режим посчитан под потолок, который никто не подтверждал. | |
| резьба | thread_not_cuttable | ошибка — пуск заперт | …: … |
| thread_quality | предупреждение | …: … | |
| таблица инструмента | missing_g43 | предупреждение | После 'M6 T…' (стр. …) не найден парный 'G43 H…' — длина инструмента не активна. |
| tool_slot_not_in_table | ошибка — пуск заперт | M6 T… — слот … отсутствует в tool.tbl станка (есть: …). | |
| tool_table_empty | справка | Стол инструментов станка пуст (0 слотов) — вызовы M6 в программе (, T…) НЕ сверены с tool.tbl: слот может как существовать, так и не существовать физически. | |
| установка и ноль детали | stock_larger_than_program | по ситуации | Программа посчитана по … … мм, а на станке замерено … мм (… мм). Глубины и контур считаны от размера, которого нет. / Останется необработанный припуск — деталь выйдет не та. |
| stock_smaller_than_program | по ситуации | Программа посчитана по … … мм, а на станке замерено … мм (… мм). Глубины и контур считаны от размера, которого нет. / Останется необработанный припуск — деталь выйдет не та. | |
| work_zero_invalid_axis_recalibrated | ошибка — пуск заперт | текст собирается из контекста операции | |
| zero_corner_changed | ошибка — пуск заперт | G-code посчитан от угла «…», а в установке станка сейчас «…» — все координаты отсчитаны от другой точки. | |
| zero_disagrees_with_setup_place | предупреждение | текст собирается из контекста операции |
Порождено из backend/src/aicnc/services/preflight_validator.py (PreflightIssue), machine_gate.py (launch refusals); «…» — место числа или имени из вашей программы.
Два гейта про инструмент — про разное. Preflight ловит «инструмент операции не найден в библиотеке» — это про замысел. Отправку блокирует «у слота нет вылета с названным происхождением» — это про факт станка. Стенд без механики понижает второй отказ до замечания в ответе отправки.
Эталон породы проходит чисто. Программа-пример каждой породы обязана дать preflight без предупреждений и отправку без замечаний — жалоба у эталона означает, что порода не настроена, а не «мелочь на экране».
| режим | что это | зачем |
|---|---|---|
| вирт. оси (sim) | все оси loopback, шины нет; момента нет — вылет не измерить | проверить программу и порядок кадров без риска |
| приводы (servo) | EtherCAT, реальные серво, момент внутри шага движения | то же самое, но железо отвечает |
Режим берётся из факта, а не из ответа кнопки: маркер стенда и cia402 в HAL говорят, на чём
поднят контроллер; ответ команды говорит лишь о запросе. Пока стенд не подтвердил переход, кнопка крутится.
| отказ запуска | слой | что говорит |
|---|---|---|
| machine_deenergized | controller | нельзя выполнить …: станок во ВЗВЕДЁННОМ аварийном стопе |
| stand_snapshot_unavailable | redis | Снимок состояния стенда недоступен — не видно, идёт ли сейчас |
| launch_would_interrupt_run | program | текст собирается из состояния стенда |
Смена режима на поднятом станке спрашивает подтверждение: LinuxCNC перезапустится из двойника, привязка осей слетит. Момент на серво подаётся только внутри шага движения: включили → поехали → выключили, снятие подтверждается измерением.
Ответ кнопки доказывает, что запрос принят, и ничего больше. Факт снимается с другого канала: пин, позиция, слово состояния привода — и его видно на экране.
| окно | где | что видно |
|---|---|---|
| монитор станка | /machines/{id}/monitor | DRO по осям, состояние, шпиндель, подача; метка «чем поднято»; живой трек двойника; графики положения, скорости, момента в % номинала |
| осциллограф cncctl | вкладка слейва «Осциллограф» | 1 кГц по шине: положение, скорость, момент, ОШИБКА СЛЕЖЕНИЯ; режим «Команда vs реально» — где привод не успевает |
| привод в cncctl | карточка слейва на шине | statusword: под моментом ли, фолт с расшифровкой, стадия CiA-402; параметры по группам |
| карточка станка | /machines/{id} | теги состояния: на связи · поднят · двойник разошёлся · инструмент не найден; тексты отказов дословно |
Момент — в процентах от номинала привода: пока паспортный номинальный момент не задан, шкалы в Н·м не существует, и платформа её не рисует. Доработка параметра доказывается разницей обратной связи до и после.
Установка, подъём и прогон, тексты отказов дословно, наблюдение.
Открыть → РуководствоПроверка в браузере, пуск из кокпита, наблюдение узла.
Открыть → РуководствоВладелец шины, привязка оси к приводу, питание и момент, джог, осциллографы.
Открыть → РуководствоУправление и контроль без облака: станки и VM, стенд, экран оператора.
Открыть →