Узел автоматики — оси, выходы и входы физического механизма: рука робота, сварочный позиционер, трек, схват. Ниже — путь от пустого блока до идущего цикла. Слова — в Понятиях, станочная сторона — в разделе Станки.
| Станок | Узел автоматики | |
|---|---|---|
| что исполняет | система ЧПУ (LinuxCNC) — интерпретатор G-code и решатель кинематики | контур реального времени без ЧПУ: цикл поднимается напрямую, интерпретатора G-code нет |
| откуда траектория | ВЫВОДИТСЯ из объёма, который надо снять с заготовки | её НАЗЫВАЕТ автор: каждая ось едет по своему заданию |
| чем меряется успех | деталь в допуске | цикл дошёл до конца, условия перехода сработали |
| кто доступен | кинематики, у которых есть решатель | ЛЮБОЙ механизм, включая тот, у которого решателя нет |
Поэтому программу движения можно написать и для трёхосевого фрезера, и для однооcевой ленты: «станочность» — это способность механизма, а не его порода.
Взять узел из каталога образцов (робот, позиционер, трек, схват) или собрать с нуля, описать оси и каналы, принести механизм.
Назначить узел на стенд — туда уедет описание, программа и профиль контура.
Написать цикл: шаги, дорожки, условия перехода, ожидание входа. Проверить в браузере.
Виртуальные серво, затем приводы. Наблюдение и работа у станка.
Меню ОБОРУДОВАНИЕ → Автоматика. Раздел называет себя прямо: «Блоки автоматики — двойники физических узлов (оси, шпиндели, выходы, входы с ролями и профилями)». Кнопка «Новый блок» открывает каталог образцов.
Образец — готовый узел из каталога: механизм с геометрией, паспорт каналов и программа-пример, которую можно разобрать и переписать. Каталог собран из реальных машин по STEP-моделям вендоров и донорам ROS; узел из него заводится одним нажатием, состав каналов вычитан из файла механизма. Кнопка «Свой блок с нуля» заводит пустой узел: оси, входы и выходы описываете вручную.
Состав каждого образца и словарь ролей каналов — справочник «Блоки автоматики»; из каких файлов состоит узел каталога — «Механизм и URDF».
Рисованных заготовок (конвейер, портал, стол, кран) в каталоге больше нет: узел заводится только реальным механизмом. Числа, унаследованные от образца, помечены значком «тип.» — «типовое число шаблона, не замер этого железа». Пока метка стоит, число — заготовка для разговора, а не факт вашего узла.
Карточка блока → вкладка «Настройки». Модель разложена по типам каналов.
Дискретные входы и выходы получают имена, которыми их зовёт программа. Аналоговый вход описывается величиной (давление, температура, уровень, вес, ток, расход, расстояние, усилие) и форматом сигнала. Формат назван так, чтобы было видно главное:
| Формат | Что это значит для диагностики |
|---|---|
| 4-20 мА | обрыв виден — ноль сигнала невозможен при исправной линии |
| 0-20 мА | обрыв не виден — ноль неотличим от «ничего» |
| 0-10 В | обрыв не виден |
| ±10 В | обрыв не виден |
| Отсчёты модуля | сырые значения, без пересчёта в величину |
Контроль обрыва задаётся отдельно: окно по сырому сигналу · вход исправности · не контролируется.
Правки уходят сами, через паузу после последнего нажатия. Это сделано намеренно: отдельная кнопка порождала два состояния — «на экране» и «на сервере», — и они расходились.
Паспорт привода — не украшение. Блок с неполным паспортом носит тег «паспорт неполон», а если без него пуск на приводах невозможен — «паспорт: пуск на серво откажет». Отказ называется заранее, а не в момент пуска.
Вкладка «URDF» на карточке блока. Механизм — это данные, а не код: звенья, шарниры, пределы, точки датчиков. Рисуете вы, в своём инструменте; платформа принимает и проверяет.
Кнопка «По умолчанию» возвращает заводскую печать (принесённый файл при этом перестаёт действовать — платформа предупреждает об этом прямо), «Экспорт» отдаёт текущий URDF файлом, «Импорт» раскрывает список входов:
.urdf, .xml, xacro);Панель одна и та же на карточке узла автоматики, станка и навесного — не переучиваетесь на каждом экране. Принесённый файл помечается тегом «свой файл», сгенерированный платформой — заводским тегом породы.
Связь механизма с узлом — по имени. Имена устроены как «вид канала плюс номер»:
| Имя | Что это |
|---|---|
| srv0, srv1, … | приводные шарниры — то, что едет |
| di0, di1, … | дискретные входы — точки датчиков |
| do0, do1, … | дискретные выходы |
| ai0, ai1, … | аналоговые входы |
Если механизм нарисован не вами и шарниры зовутся по-своему, файл не переименовывается. Вместо этого заполняется «Таблица имён»: слева «Шарнир файла», справа «Канал программы». Платформа считает незакрытые места и показывает их числом — «без канала: 2», «канал дважды: srv0».
Требуется только то, что рисуется. Геометрия <collision> принимается и игнорируется —
столкновений мы не считаем, и вердикт проверки говорит это дословно. Не стройте на ней расчёт:
двойник покажет позу механизма, но не остановит его перед препятствием.
Требования к файлу механизма целиком — справочник «Механизм — это данные, а не код».
Меш, названный только в <collision> и отсутствующий в <visual>,
в двойник не попадёт — звено окажется невидимым.
Узел живёт в облаке, но едет на боксе. Назначение связывает блок с конкретным стендом, и с этого момента туда уезжает всё, что нужно для самостоятельной работы: описание осей и каналов, профиль контура реального времени, текущая программа.
Смысл в том, что пакет самодостаточен. Цикл идёт на боксе; облако получает факт о том, что произошло, и отдаёт замысел — программу и команды «выполняй» / «стоп». Жесты (толчковое движение, сырые команды приводу) через эту границу не проходят — они остаются у оборудования.
Шину держит кто-то один. Если её занял другой режим, платформа скажет, кто именно: «Шину держит наладка (cncctl) — переключите её в «режим станка»» · «Стенд отдан автоматике — остановите цикл в автоматике».
Меню ПРОГРАММЫ → PLC-программы → «Новая программа». В окне «Новая программа движения» — имя (подсказка: «Например: подача заготовки») и блок. Блок выбирается один раз: он даёт программе оси, роли, профили и имена входов-выходов. Кнопка «Создать и открыть» ведёт в лабораторию PLC.
| Действие | Где | Что делает |
|---|---|---|
| move | ось | приехать в позицию — абсолютно или относительно |
| spin | ось | крутить заданное время |
| push | ось | давить моментом — в процентах от номинала |
| hold | ось | держать позицию заданное время |
| stop | ось | остановить |
| on / off | выход | включить / выключить |
| pulse | выход | импульс заданной длительности |
| waitFor | вход | ждать фронт или уровень на входе |
На уровне программы — rig() (состав), param() (крутилка с пределами),
recipes() (наборы уставок под материал или изделие) и record()
(какие величины писать тактом стенда).
Переход перебивает ход, который ещё идёт: следующий шаг начинается сразу, а не после того, как ось доедет. Стык при этом склеивается — новый шаг подхватывает и место, и скорость, с которыми ось шла, поэтому переход посреди хода не даёт рывка. Ось, летящую от новой цели, шаг штатно тормозит и разворачивает.
Внутри одной дорожки блоки играются очередью: следующий начинается там, где кончился предыдущий. Две дорожки на одну и ту же ось в одном шаге держать нельзя — это отказ, а не «победит последняя».
Устройство программы и разобранные примеры — справочник «Программы автоматики»; пути навесного у роботов — «Глаголы движения».
Полный справочник языка — «Справочник» рядом со списком программ
(в приложении, адрес /docs/plc): все действия, все формы условий и рецепты типовых задач
по IEC 61131-3. Он собирается из того же описания, по которому работает редактор, поэтому не расходится с ним.
В лаборатории программа проигрывается без стенда. Пять взглядов на одно и то же:
record().Отдельно задаётся, кто «нажимает» датчики в этой проверке: «Щёлкаю руками» — вход срабатывает по вашему клику, программа до этого стоит и ждёт; «Приходят сами» — датчик считается сработавшим через указанное время, и цикл проигрывается целиком.
«Приходят сами» — оценка для расчёта, на железо она не идёт. Время, за которое датчик срабатывает в браузере, вы придумали; на стенде его называет мир.
Пуск доступен и из списка программ, и из кокпита узла. У каждой программы — три переключателя рядом с кнопкой:
Виртуальная ось превьюется в симуляции и не идёт на железо. Это рабочее состояние для осей без подключённого привода: эмулятор не ломается, программа авторится заранее. Пуск на виртуальных серво идёт без EtherCAT и без сопоставления со слейвами мастера.
⚠ Момент на виртуальных осях — модель, а не замер. Порог момента пишется в промилле номинала. Если у привода не задан паспортный номинальный момент, шкалы промилле не существует — величина честно едет прочерком, и условие по моменту не сработает никогда. Заполните паспортный момент до того, как построите на нём переход.
Карточка узла → вкладка «Работа», блок «Прогоны»: последние запуски этого узла — какая программа, когда, чем кончилась. Исходов четыре, и четвёртый не «всё в порядке»:
Исход называет платформа, а не экран: с момента пуска она сама спрашивает стенд о плеере и штампует запись по его кадру — карточку держать открытой не нужно. «Исход неизвестен» остаётся в трёх случаях: плеер так и не подтвердил ход после пуска; связь с боксом пропала и не вернулась до предела ожидания; сервер платформы перезапустили посреди прогона.
Узел, который ещё не запускали, говорит «прогонов не было» — это состояние, а не сбой.
Несопоставленные серво блокируют пуск: подмены реального привода виртуальным «чтобы поехало» не происходит. Отказ показывается целиком, со своей причиной, а не общим «не получилось». Ниже — те, что встречаются на этом пути; тексты приведены дословно.
| Текст отказа | Что это значит | Что делать |
|---|---|---|
| в программе нет шагов — откройте её в лаборатории и сохраните | Программа существует, но пуста: шаги не сохранились. | Открыть в лаборатории и сохранить заново. Пустая программа не «ничего не делает» — она не исполняется вовсе. |
| стартовый шаг «…» не найден | Назван старт, которого в программе нет — обычно шаг переименовали или удалили. | Поправить имя стартового шага либо вернуть шаг. |
| шаги с одинаковым id: … | Два шага носят одно имя, и условие перехода не может выбрать между ними. | Переименовать один из названных. |
| серво …: две дорожки на один канал | Одной осью в шаге командуют две дорожки сразу. Раньше вторая молча затирала первую, и написанный ход просто исчезал. | Свести ходы в одну дорожку — внутри неё они и так играются очередью. |
| стык «…» — режим известен, но у нас не реализован | Назван способ склейки ходов из отраслевого словаря, которого мы пока
не делаем. Доступен один — previous, он же умолчание. | Убрать поле: без него шаг склеивается ровно так, как надо. |
| до этих шагов не дойти от старта: … | Шаги есть, но ни одно условие перехода к ним не ведёт — оторванная ветка. | Либо связать условием, либо убрать. Молча их пропустить нельзя: автор считал, что они работают. |
| ни один шаг не двигает серво — нечего исполнять | Программа состоит из ожиданий и выходов, ходов нет. | Проверить, туда ли писались ходы. Такой прогон закончился бы «успехом», ничего не сделав, — поэтому он отклоняется. |
| серво … нет в составе блока «…» | Программа адресует ось, которой у этого узла не объявлено. | Свериться с составом каналов узла: либо программа написана под другой узел, либо канал не заведён. |
| серво …: пустая дорожка (нет ходов) — добавьте блоки или уберите | Ось объявлена в шаге, но её дорожка пуста. | Дописать ход или убрать дорожку. Пустая дорожка — почти всегда недоделанная правка. |
| предел аварии «…» должен быть положительным | Порог, по которому прогон рвётся, задан нулём или отрицательным — то есть выключен молча. | Задать положительное значение либо убрать порог явно. |
| серво 0 не сопоставлено со слейвом мастера | Ось программы не связана с приводом на шине узла. | Сопоставить в наладке. Заранее и списком это же показывает проверка сопоставления — до нажатия «Прогон». |
| IO не сопоставлено: … | То же самое про вход или выход: программа его использует, железу он не сопоставлен. | Сопоставить канал ввода-вывода в наладке. |
| стенд автоматики … не найден | Узел, которому адресован прогон, в платформе отсутствует — удалён или указан не тот. | Выбрать узел заново. |
| стенд отказал без причины | Узел отказал, но своей причины не прислал. Платформа не сочиняет её за него. | Смотреть журнал агента на боксе: причина осталась там. Пустая причина — сама по себе повод проверить связь с узлом. |
Демонстрационную программу править нельзя: попытка сохранить в неё отвечает отказом «программа только для чтения» и ссылкой на её копию — работайте в копии.
Кокпит узла — все дорожки под одной шкалой времени: серво, входы и выходы видно разом, «кто когда крутится» читается с одного взгляда. Слева у каждой дорожки — состояние привода, лампа входа и живое положение.
| Величина | Единица | Смысл |
|---|---|---|
| Позиция | мм / об | где ось сейчас |
| Скорость | мм/с / об/с | как быстро едет |
| Момент | ‰ | промилле номинала привода |
| Рассинхрон (ferr) | об | насколько ось отстала от задания |
Осциллограф разворачивается прямо под выбранной дорожкой, в той же шкале времени — курсоры совпадают с блоками программы, и видно, какой шаг дал всплеск.
Пределы аварии по умолчанию — момент 600 ‰ и рассинхрон 0,05 об, удерживаемые дольше 0,2 с. Это стартовые значения, а не паспорт вашего узла: под конкретное железо их задают явно.
Правило четырёх окон действует и здесь. Любая настройка узла должна одинаково читаться в двойнике, на стенде, в наладке и на панели. Канал, заведённый только в одном из четырёх, оператор увидит вслепую.
В момент времени на стенде поднят ровно один режим; переключение гасит предыдущий. Сегодня о занятой шине сообщает сообщение об отказе, дальше это станет явным состоянием стенда.
Отдельный каталог на боксе, где живут уехавшие туда проекты — по каталогу на проект, на диске данных. Переживает пересоздание виртуальной машины: сегодня при этом теряется настройка режима.
Тело в 3D-виде карточки одевается в материалы исходного файла (не в общую подсветку платформы), и наведение подсвечивает ровно то звено, что под указателем. Тяга звена мышью больше не путает камеру: пока звено в руке, орбита стоит. Сделано в коде, выйдет ближайшим выкатом.
Два поворотных привода: наклон кладёт стол под шов, вращение прокручивает планшайбу под горелкой. Это образец каталога «Позиционер CRP WB2S-250» — его программа приведена ниже дословно; её можно взять целиком и переписать под своё железо.
Автоматика → «Новый блок» → образец «Позиционер CRP WB2S-250». В блоке появятся две оси с именами шарниров из механизма, механизм и его геометрия — вместе с блоком.
Пролог rig({ axes, outputs, inputs }) платформа печатает сама из состава узла — на место
метки // @rig в начале файла. Слева в нём стоят имена, которыми программа зовёт каналы
(«наклон», «вращение»), справа — номера каналов узла; писать его рукой не нужно и нельзя.
// @rig
machine({
title: 'WB2S-250 — наклон и оборот планшайбы',
initial: 'исходная',
states: {
'исходная': {
lanes: {
'наклон': [move(deg(0), { v: 0.1 })],
'вращение': [move(deg(0), { v: 0.1 })],
},
on: { done: 'наклон' },
},
'наклон': {
lanes: { 'наклон': [move(deg(45), { v: 0.1 })] },
on: { done: 'оборот' },
},
'оборот': {
lanes: { 'вращение': [move(deg(360), { v: 0.15 })] },
on: { done: 'обратный наклон' },
},
'обратный наклон': {
lanes: {
'наклон': [move(deg(0), { v: 0.1 })],
'вращение': [move(deg(0), { v: 0.15 })],
},
on: { done: 'пауза' },
},
'пауза': {
wait: 0.5,
on: { done: 'исходная' },
},
},
}) Читается сверху вниз: обе оси в ноль → стол наклоняется на 45° → планшайба делает полный оборот →
обе оси возвращаются одновременно (две дорожки в одном шаге) → полсекунды выдержки → цикл повторяется.
Углы идут через deg(): сама ось считает в оборотах. Пределы — из механизма
(наклон ±85°, вращение ±360°); диапазоны вендор не публикует, и в файле это названо предположением.
Логика покажет граф из пяти состояний, План — сколько занимает цикл, Модель — как при этом движется позиционер. Датчиков у этого узла нет; там, где они есть, на этом этапе их щёлкаете вы — режим «Щёлкаю руками».
Переключатель вирт → Пуск. Цикл идёт на стенде без EtherCAT. Смотрите дорожки в кокпите: наклон встаёт на 45°, вращение отрабатывает оборот.
Переключатель серво. Перед этим оси узла сопоставляются со слейвами в наладке, а паспорт привода заполняется — иначе блок носит тег «паспорт: пуск на серво откажет», а порог момента в промилле не с чем сравнить. Включите В цикле, когда цикл отработан и вы готовы к производственному прогону.
Ожидание входа — с названным исходом. Как только в цикле появится шаг,
который ждёт датчика (waitFor), назовите предел ожидания и исход по нему: пропустить,
встать или объявить аварию — решаете вы. Молчаливое «пойдём дальше» на сварочном позиционере означает
шов по пустому столу.
Ненаписанная граница читается как обещание, поэтому вот они — прямо.
| Не делает | Почему | Где это есть |
|---|---|---|
| Не исполняет G-code | У узла автоматики нет системы ЧПУ вовсе: контур поднимается напрямую, без LinuxCNC. Кадров, координат детали и рабочих смещений здесь не существует. | Станки |
| Не знает инструмента и слотов | Стола инструмента, смены инструмента и вылета у узла нет — это понятия реза. Навесное узла объявляется каналом, а не номером в столе. | Инструмент и навесное |
| Не выводит траекторию из детали | Путь называет автор, шаг за шагом. Движка, который считал бы, что снять с заготовки, у этого рода программ нет — это разные движки, а не режимы одного. | Операции реза |
| Не принимает жест из облака | Через границу проходит замысел — программа и команды «выполняй» / «стоп». Толчковое движение и сырые команды приводу остаются у оборудования. | Наладка · Панель у станка |
| Не проверяет отставание оси на вирт. осях | Порог ошибки слежения там проверять не по чему: обратной связи нет. Прогон на виртуальных осях не докажет, что ось выдержит нагрузку. | прогон на приводах |
| Не подставляет привод вместо несопоставленного | «Чтобы поехало» — самая дорогая подмена: она даёт зелёный прогон при неподключённом железе. Вместо неё — отказ с именем канала. | сопоставление в наладке |
| Не строит программу по ведомым шарнирам | Где механизм объявляет шарнир ведомым от другого, программа адресует ступени явно; там, где ведомых большинство, программы-примера нет вовсе — и это сказано прямо, а не заменено подделкой. | Механизм и URDF |
Дальше: Станки · Понятия · Программы автоматики · Установка бокса