У каждой породы есть программа, которую человек видит первой, — и та же программа идёт входом приёмочного сценария: создать станок → preflight → запуск → база → отправка → пин HAL. Пример обязан проходить чисто; ожидание записано числами до прогона. 20 пород, своя программа у 19 пород, остальные работают «как фрезер».
/machines: по карточке на породу, зрелость — бейджем.| порода | программа | род | болванка, мм | смены | слово S | конечная поза | зрелость |
|---|---|---|---|---|---|---|---|
| mill-xyz | торцовка (общая: торцовка) | cut | 40 × 30 × 10 | T9 → T4 | 12000 | — | серийный |
| mill-5axis-trunnion | три грани за один установ | cut | 40 × 30 × 10 | T9 → T4 → T4 | 12000 | B = 90 · C = 90 | бета |
| mill-5axis-head | плита: косые отверстия по кругу и скос кромок | cut | 100 × 80 × 30 | T9 → T4 → T4 → T4 → T4 → T9 → T9 → T9 → T9 | 12000 | B = -20 · C = -270 | бета |
| lathe-2axis | вал из прутка | cut | 20 × 20 × 40 | T1 → T2 → T3 | 1200 | — | бета |
| laser-plotter | раскрой лучом | cut | 40 × 30 × 10 | стола нет | 30 | X = 4.9 · Y = 4.9 | бета |
| robot-kr16 | перекладка A→B | motion | 40 × 30 × 10 | стола нет | не пишется | — | R&D |
| kuka-welder | прямой шов 300 мм | motion | 40 × 30 × 10 | стола нет | не пишется | — | R&D |
| kuka-welder-positioner | кольцевой шов: стол крутит, горелка стоит | motion | — | стола нет | не пишется | — | R&D |
| robot-hexapod | обход с наклоном платформы | motion | 40 × 30 × 10 | стола нет | не пишется | X = 0 · Y = 0 · Z = 450 | R&D |
| robot-linear-delta | контур дельтой | cut | 40 × 30 × 10 | T9 | 12000 | X = 2 · Y = 2 · Z = 5 | R&D |
| robot-tripod | наклоны головки | motion | 40 × 30 × 10 | стола нет | не пишется | Z = -10 | R&D |
| wire-edm | контур проволокой | cut | 40 × 30 × 10 | стола нет | не пишется | X = 4.855 · Y = 4.855 · Z = 5 | R&D |
| kuka-welder-ring | Кольцевой шов на стыке труб (KUKA): максимальная дуга | motion | 40 × 30 × 10 | стола нет | не пишется | — | — |
| robot-kr16-transfer | перекладка A→B глаголом transfer | motion | 40 × 30 × 10 | стола нет | не пишется | — | — |
| robot-kr16-flip | переворот детали на месте (рецепт flip) | motion | 40 × 30 × 10 | стола нет | не пишется | — | — |
| mill-xyz+gripper | перекладка тиски → паллета | motion | 40 × 30 × 10 | стола нет | не пишется | — | — |
| trivkins-twin | кольцевой шов на позиционере | motion | 40 × 30 × 10 | стола нет | не пишется | A = 360 | — |
| mill-xyz+dispenser | валик герметика по контуру | motion | 100 × 60 × 20 | стола нет | не пишется | — | — |
| mill-5axis-head+welder | шов с наклоном головы 150 мм | motion | 40 × 30 × 10 | стола нет | не пишется | B = 0 · C = 0 | — |
| kuka-welder-positioner-seam | продольный шов: деталь повёрнута столом | motion | — | стола нет | не пишется | — | — |
«Стола нет» — у головы без стола инструментов (проволока, луч, схват) смены быть не должно; «не пишется» —
порода не печатает слово S, и требовать его значило бы врать про станок. Конечная поза — где обязан
оказаться инструмент по окончании программы: так проверяется доезд замысла до железа у пород без шпинделя.
R&D — кинематика работает на виртуальных осях, на живом железе не проверена. Матрица пород — треугольник, а не квадрат: станок с большими возможностями обязан исполнять примеры менее требовательных.
stock(40, 30, 10);
face({ depth: 0.4, tool: T9 });
drill({ points: [[10, 10], [30, 20]], depth: 3, tool: T4 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Торцовка 0.8 мм | python_face | T9 · Ø6 | depth_mm · path_tolerance_mm · rect · rpm · step_down · step_over · tool_diameter |
| 2 | Сверловка Ø6.8 | python_drill | T4 · Ø6.8 | depth_mm · path_tolerance_mm · peck_mm · points · rpm |
stock(40, 30, 10);
face({ depth: 0.4, tool: T9 }); // в нуле ориентации: верх детали
index({ b: 90 }); // боковая грань — под инструмент
drill({ points: [[10, 5]], depth: 3, tool: T4 }); // боковая грань
index({ b: 90, c: 90 }); // та же поза, повёрнута вокруг Z
drill({ points: [[8, 5]], depth: 3, tool: T4 }); // соседняя грань
Паспорт экземпляра при создании станка: {"z_travel_mm":200,"trunnion_rot_point_z_mm":-218}.
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Торцовка верха | python_face | T9 · Ø6 | depth_mm · path_tolerance_mm · rect · rpm · step_down · step_over · tool_diameter · work_orientation |
| 2 | Отверстие в боковой грани | python_drill | T4 · Ø6.8 | depth_mm · path_tolerance_mm · peck_mm · points · rpm · work_orientation |
| 3 | Отверстие в соседней грани | python_drill | T4 · Ø6.8 | depth_mm · path_tolerance_mm · peck_mm · points · rpm · work_orientation |
stock(100, 80, 30);
face({ depth: 0.4, tool: T9 }); // верх детали, голова прямо (B0)
// Косые отверстия Ø6.8 по окружности R25: голова наклонена на 20°, поворот C — по кругу.
// Точки — в кадре грани index(B, C); глубина = воздух до наклонной
// поверхности входа + ход в металле по оси сверла.
index({ b: 20, c: 0 }); drill({ points: [[33.753, 40]], depth: 16.551, tool: T4 }); // вход (25, 40) детали, 8.551 мм воздуха + 8 по оси
index({ b: 20, c: 90 }); drill({ points: [[24.356, 50]], depth: 13.13, tool: T4 }); // вход (50, 65) детали, 5.13 мм воздуха + 8 по оси
index({ b: 20, c: 180 }); drill({ points: [[33.753, 40]], depth: 16.551, tool: T4 }); // вход (75, 40) детали, 8.551 мм воздуха + 8 по оси
index({ b: 20, c: 270 }); drill({ points: [[24.356, 50]], depth: 13.13, tool: T4 }); // вход (50, 15) детали, 5.13 мм воздуха + 8 по оси
// Скос 20° верхней кромки по РЕАЛЬНЫМ рёбрам болванки — те же четыре позы, фреза Ø6.
index({ b: 20, c: 0 }); chamfer({ polygon: [[12.049, -3.0], [12.049, 83.0], [-20.0, 83.0], [-20.0, -3.0]], size: 1.5, tool: T9 }); // ребро (0,0)→(0,80) детали
index({ b: 20, c: 90 }); chamfer({ polygon: [[12.049, -3.0], [12.049, 103.0], [-20.0, 103.0], [-20.0, -3.0]], size: 1.5, tool: T9 }); // ребро (0,80)→(100,80) детали
index({ b: 20, c: 180 }); chamfer({ polygon: [[12.049, -3.0], [12.049, 83.0], [-20.0, 83.0], [-20.0, -3.0]], size: 1.5, tool: T9 }); // ребро (100,80)→(100,0) детали
index({ b: 20, c: 270 }); chamfer({ polygon: [[12.049, -3.0], [12.049, 103.0], [-20.0, 103.0], [-20.0, -3.0]], size: 1.5, tool: T9 }); // ребро (100,0)→(0,0) детали
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Торцовка верха | python_face | T9 · Ø6 | depth_mm · path_tolerance_mm · rect · rpm · step_down · step_over · tool_diameter · work_orientation |
| 2 | Косое отверстие Ø6.8 (B20 C0) | python_drill | T4 · Ø6.8 | depth_mm · path_tolerance_mm · peck_mm · points · rpm · work_orientation |
| 3 | Косое отверстие Ø6.8 (B20 C90) | python_drill | T4 · Ø6.8 | depth_mm · path_tolerance_mm · peck_mm · points · rpm · work_orientation |
| 4 | Косое отверстие Ø6.8 (B20 C180) | python_drill | T4 · Ø6.8 | depth_mm · path_tolerance_mm · peck_mm · points · rpm · work_orientation |
| 5 | Косое отверстие Ø6.8 (B20 C270) | python_drill | T4 · Ø6.8 | depth_mm · path_tolerance_mm · peck_mm · points · rpm · work_orientation |
| 6 | Скос кромки 20° (B20 C0) | python_chamfer | T9 · Ø6 | depth_mm · edges · path_tolerance_mm · polygon · rpm · tool_diameter · vbit_angle · work_orientation |
| 7 | Скос кромки 20° (B20 C90) | python_chamfer | T9 · Ø6 | depth_mm · edges · path_tolerance_mm · polygon · rpm · tool_diameter · vbit_angle · work_orientation |
| 8 | Скос кромки 20° (B20 C180) | python_chamfer | T9 · Ø6 | depth_mm · edges · path_tolerance_mm · polygon · rpm · tool_diameter · vbit_angle · work_orientation |
| 9 | Скос кромки 20° (B20 C270) | python_chamfer | T9 · Ø6 | depth_mm · edges · path_tolerance_mm · polygon · rpm · tool_diameter · vbit_angle · work_orientation |
bar({ diameter: 20, length: 40 });
turn({ stages: [{ length: 12, diameter: 16 }, { length: 8, diameter: 10 }], tool: T1 });
groove({ z: 4, width: 2, diameter: 12, tool: T2 });
partOff({ z: 20, tool: T3 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Обточка профиля | python_turn_profile | T1 · Ø0 | doc_mm · face · feed · finish_mm · path_tolerance_mm · rpm · stages · stock_diameter_mm |
| 2 | Канавка Ø12 | python_groove | T2 · Ø0 | diameter_mm · doc_mm · feed · path_tolerance_mm · rpm · stock_diameter_mm · tool_width_mm · width_mm · z_mm |
| 3 | Отрезка на Z20 | python_part_off | T3 · Ø0 | bore_diameter_mm · doc_mm · feed · path_tolerance_mm · rpm · stock_diameter_mm · tool_width_mm · z_mm |
stock(40, 30, 10);
contour({ polygon: [[5,5],[35,5],[35,25],[5,25]], offset: 'outside', depth: 2 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Раскрой контура | python_contour | — · Ø0.2 | depth_mm · feed · laser_power · offset · path_tolerance_mm · polygon · rpm · step_down · tool_diameter |
// ПЕРЕНОС БЕЗ ПЕРЕВОРОТА: взять деталь в точке A и положить в B.
// Ни болванки, ни фрезы: у рода `motion` автор называет ПУТЬ.
const a = [900, -300, 300]; // координаты ЯЧЕЙКИ, не детали (= место mill-1.vise)
const b = [900, 300, 300]; // = место pallet-out
const h = 150; // высота переноса над захватом, мм
orient([180, 0, 0]); // инструмент вниз
phase('подход');
moveTo([a[0], a[1], a[2] + h]);
jaws('open', { onTheMove: true }); // разводим НА ХОДУ
phase('захват');
moveTo(a, { feed: 1500 });
jaws('close', { span: 60 }); // пролёт детали — один литерал с ops
dwell(0.3); // дать зажиму сработать до подъёма
phase('перенос');
moveTo([a[0], a[1], a[2] + h], { feed: 1500 });
moveTo([b[0], b[1], b[2] + h]);
phase('укладка');
moveTo(b, { feed: 1500 });
jaws('open'); // отпустить
moveTo([b[0], b[1], b[2] + h], { feed: 1500 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Перекладка A→B | python_motion_path | — · Ø0 | grasp_from · gripper_port · home_abc · home_xyz · path_json |
// ПРЯМОЙ ШОВ: подвести горелку к началу стыка, наклонить ОТ НОРМАЛИ
// детали, зажечь дугу, пройти шов рабочим ходом, погасить, отойти.
// Дуга — такое же действие в точке, как смыкание губок; сварка —
// не род. Буквы осей носителя (кисть/голова/люлька) печатает движок.
const v = param('подача шва', 480); // 8 мм/с профиля горелки
const a = [900, -150, 300]; // начало стыка, координаты ДЕТАЛИ (угол болванки)
const b = [900, 150, 300]; // конец стыка
const h = 30; // подвод/отход над деталью, мм
orient({ tilt: 0, turn: 0 }); // по нормали детали
phase('подход');
moveTo([a[0], a[1], a[2] + h]);
orient({ tilt: 30, turn: 45 }); // наклон от нормали и азимут
moveTo(a, { feed: v });
phase('шов');
weld({ to: b, feed: v }); // зажечь → пройти → погасить; выход дуги — из двойника
phase('отход');
moveTo([b[0], b[1], b[2] + h], { feed: v });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | прямой шов 300 мм | python_motion_path | — · Ø0 | arc_port · feed_mm_min · grasp_from · home_abc · home_xyz · orientation_model · path_json |
// КОЛЬЦЕВОЙ ШОВ НА ПОЗИЦИОНЕРЕ: горелка стоит, деталь крутит стол.
// Шов назван на ДЕТАЛИ (кромка трубы у планшайбы), ячейку считает платформа.
const v = param('подача шва', 480); // 8 мм/с профиля горелки
const r = 50; // радиус шва на детали, мм
const k = 30 / Math.SQRT2; // отход 30 мм по оси горелки
const home = [700, 0, 800]; // парковка (место home)
part({ label: 'труба', shape: 'cylinder', size: [100, 100, 100], at: [0, 0, 0], on: 'U' }); // деталь ячейки — та же, что cell_parts
orient({ tilt: 0, turn: 0 });
phase('подход');
table({ turn: 0, tilt: 45 }); // наклон к руке
orient({ part: 'труба', bisect: [[0, 0, 1], 'rim'] }); // биссектриса: лицо планшайбы, стенка трубы
moveTo({ rim: r + k, z: k }, { part: 'труба' });
moveTo({ rim: r, z: 0 }, { part: 'труба', feed: v }); // верх кромки при этой позе стола
phase('шов');
weld({ table: { turn: 360 }, radius: r, feed: v }); // зажечь -> оборот детали -> погасить
phase('отход');
moveTo({ rim: r + k, z: k }, { part: 'труба', feed: v });
moveTo(home); // стол выравнивается из парковки
table({ tilt: 0 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Кольцевой шов на позиционере | python_motion_path | — · Ø0 | arc_port · cell_parts · feed_mm_min · grasp_from · home_abc · home_xyz · orientation_model · path_json |
// ШЕСТЬ СТЕПЕНЕЙ СВОБОДЫ ОДНИМ ПУТЁМ: платформа идёт по квадрату и
// на каждой стороне держит СВОЙ наклон, а в конце разворачивается
// вокруг своей оси. Положение и ориентацию гексапод задаёт вместе —
// это и есть то, чего декартов стол не умеет.
const r = param('полуразмер квадрата', 60); // зона ±120 мм
const z = param('высота обхода', 400); // зона 300…500 мм
const t = param('наклон', 10); // предел ±20°
orient([0, 0, 0]); // платформа горизонтально
phase('выход на высоту обхода');
moveTo([r, 0, z]);
phase('сторона 1');
orient([0, t, 0]);
moveTo([0, r, z], { feed: 1500 });
phase('сторона 2');
orient([t, 0, 0]);
moveTo([-r, 0, z], { feed: 1500 });
phase('сторона 3');
orient([0, -t, 0]);
moveTo([0, -r, z], { feed: 1500 });
phase('сторона 4');
orient([-t, 0, 0]);
moveTo([r, 0, z], { feed: 1500 });
phase('разворот платформы');
orient([0, 0, 15]);
moveTo([0, 0, z], { feed: 1500 });
Паспорт экземпляра при создании станка: {"spindle_max_rpm":24000}.
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Обход с наклоном платформы | python_motion_path | — · Ø0 | grasp_from · home_abc · home_xyz · path_json |
stock(40, 30, 10);
contour({ polygon: [[5,5],[35,5],[35,25],[5,25]], offset: 'outside', depth: 2, tool: T9 });
Паспорт экземпляра при создании станка: {"spindle_max_rpm":24000}.
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Контур Ø6 | python_contour | T9 · Ø6 | depth_mm · offset · path_tolerance_mm · polygon · rpm · step_down · tool_diameter |
// ПОДАЧА И ДВА НАКЛОНА. У трипода мировые оси Z A B: он подаёт
// головку вперёд (Z) и наклоняет её (A, B). Осей X и Y у него нет
// вовсе, поэтому программа их и не называет.
const t = param('наклон', 15); // предел породы ±25°
orient([0, 0, 0]); // головка прямо
phase('подача');
moveTo([0, 0, -20]);
phase('наклон A');
orient([t, 0, 0]);
moveTo([0, 0, -40], { feed: 1500 });
phase('наклон B');
orient([0, t, 0]);
moveTo([0, 0, -40], { feed: 1500 });
phase('выравнивание');
orient([0, 0, 0]);
moveTo([0, 0, -20], { feed: 1500 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Наклоны головки | python_motion_path | — · Ø0 | grasp_from · home_abc · home_xyz · path_json |
// КОНТУР ПРОВОЛОКОЙ: заправить → три прохода убывающим зазором → стоп.
// Проволока режет насквозь за один обход: прохода по Z нет.
stock(40, 30, 10);
thread(); // заправка проволоки — процедура головы
const c = [[5,5],[35,5],[35,25],[5,25]];
cut('rough', { polygon: c }); // черновой: максимальный съём
cut('finish1', { polygon: c }); // чистовой 1: offset меньше
cut('finish2', { polygon: c }); // чистовой 2: offset ещё меньше
cutWire(); // проволока стоп
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Заправка проволоки · процедура головы | python_effector_procedure | — | procedure_id |
| 2 | Контур электродом · режим реза rough | python_contour | — · Ø0.25 | cut_mode · cut_mode_port · feed · offset · path_tolerance_mm · polygon · process · wire_diameter_mm · wire_on_port |
| 3 | Контур электродом · режим реза finish1 | python_contour | — · Ø0.25 | cut_mode · cut_mode_port · feed · offset · path_tolerance_mm · polygon · process · wire_diameter_mm · wire_on_port |
| 4 | Контур электродом · режим реза finish2 | python_contour | — · Ø0.25 | cut_mode · cut_mode_port · feed · offset · path_tolerance_mm · polygon · process · wire_diameter_mm · wire_on_port |
| 5 | Проволока стоп · глагол головы | python_effector_procedure | — | verbs |
// выгрузка витрины лабы «weld-ring-pipe-joint»: weldRing(...)
weldRing({
at: [place('weld-bench')[0], place('weld-bench')[1], place('weld-bench')[2] + 60],
axis: 'z',
dia: 60,
standoff: 10,
feed: 300,
lead: 0,
work: 45,
});
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Кольцевой шов на стыке труб (KUKA): максимальная дуга | python_motion_path | — · Ø0 | arc_port · feed_mm_min · grasp_from · home_abc · home_xyz · orientation_model · path_json |
// ПЕРЕКЛАДКА МАКРО-ГЛАГОЛОМ: путь выводит платформа (рецепт примитивов).
transfer({ from: [900, -300, 300], to: [900, 300, 300], approach: 150, dwell: 0.3 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Перекладка A→B (transfer) | python_transfer | — · Ø0 | approach_mm · grasp_from · gripper_port · home_abc · home_xyz · orientation_abc · pick_xyz · pickup_dwell_s · place_xyz |
// ПЕРЕВОРОТ: сменить опорную грань, путь — рецепт примитивов.
part({ size: [40, 30, 10], at: [900, -300, 300], grip: 'side' });
flip({ feed: 1500, dwell: 0.3 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Переворот на месте (flip) | python_transfer | — · Ø0 | approach_mm · grasp_from · gripper_port · home_abc · home_xyz · jaw_span_mm · orientation_abc · pick_xyz · pickup_dwell_s · place_abc · place_xyz |
// ЯЧЕЙКА ФРЕЗЕРА: снять деталь с тисков (A) и положить на паллету (B).
// Схват на шпиндельной бабке; поворотных осей нет — губки смотрят вниз.
const a = [200, 300, -150]; // тиски
const b = [600, 300, -150]; // паллета выхода
const h = 100; // подъём переноса, мм
phase('подход');
moveTo([a[0], a[1], a[2] + h]);
jaws('open', { onTheMove: true });
phase('захват');
moveTo(a, { feed: 1500 });
jaws('close', { span: 40 }); // пролёт = ширина детали
dwell(0.3);
phase('перенос');
moveTo([a[0], a[1], a[2] + h], { feed: 1500 });
moveTo([b[0], b[1], b[2] + h]);
phase('укладка');
moveTo(b, { feed: 1500 });
jaws('open');
moveTo([b[0], b[1], b[2] + h], { feed: 1500 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Перекладка тиски → паллета | python_motion_path | — · Ø0 | grasp_from · gripper_port · home_xyz · path_json |
// КОЛЬЦЕВОЙ ШОВ: горелка стоит на стойке, деталь крутит позиционер.
// Линейных осей нет — путь только по A; дуга в точке, как губки.
const f = param('подача шва, °/мин', 720);
const a0 = param('начало шва, °', 0);
phase('подвод');
orient([a0, 0, 0]); moveTo([0, 0, 0]); // планшайба к началу шва
phase('шов');
// дуга вкл → ОДИН ПОЛНЫЙ ОБОРОТ рабочим ходом → дуга выкл (буква стола
// печатается как названа — RIG-wrap-table-2, table_axes у as_named)
orient([a0 + 360, 0, 0]); moveTo([0, 0, 0], { feed: f });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Кольцевой шов на позиционере | python_motion_path | — · Ø0 | arc_port · feed_mm_min · grasp_from · orientation_model · path_json |
// ЯЧЕЙКА ФРЕЗЕРА: сопло дозатора ведёт валик по контуру верхней
// грани болванки — отступ от кромки, углы срезаны фаской.
const pts = [[215.0, 310.0, -148.0], [285.0, 310.0, -148.0], [290.0, 315.0, -148.0], [290.0, 345.0, -148.0], [285.0, 350.0, -148.0], [215.0, 350.0, -148.0], [210.0, 345.0, -148.0], [210.0, 315.0, -148.0], [215.0, 310.0, -148.0]];
const up = [pts[0][0], pts[0][1], -70];
phase('подход');
moveTo(up);
moveTo(pts[0], { feed: 1500 });
phase('валик');
dispense('on');
for (const p of pts.slice(1)) moveTo(p, { feed: 1500 });
dispense('off');
phase('отвод');
moveTo([pts[pts.length - 1][0], pts[pts.length - 1][1], up[2]], { feed: 1500 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Валик герметика по контуру | python_motion_path | — · Ø0 | dispense_port · grasp_from · home_xyz · path_json |
// ПРЯМОЙ ШОВ: подвести горелку к началу стыка, наклонить ОТ НОРМАЛИ
// детали, зажечь дугу, пройти шов рабочим ходом, погасить, отойти.
// Дуга — такое же действие в точке, как смыкание губок; сварка —
// не род. Буквы осей носителя (кисть/голова/люлька) печатает движок.
const v = param('подача шва', 480); // 8 мм/с профиля горелки
const a = [50, 100, -50]; // начало стыка, координаты ДЕТАЛИ (угол болванки)
const b = [200, 100, -50]; // конец стыка
const h = 30; // подвод/отход над деталью, мм
orient({ tilt: 0, turn: 0 }); // по нормали детали
phase('подход');
moveTo([a[0], a[1], a[2] + h]);
orient({ tilt: 30, turn: 45 }); // наклон от нормали и азимут
moveTo(a, { feed: v });
phase('шов');
weld({ to: b, feed: v }); // зажечь → пройти → погасить; выход дуги — из двойника
phase('отход');
moveTo([b[0], b[1], b[2] + h], { feed: v });
Паспорт экземпляра при создании станка: {"z_travel_mm":300}.
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | шов с наклоном головы 150 мм | python_motion_path | — · Ø0 | arc_port · feed_mm_min · grasp_from · home_abc · home_xyz · path_json |
// ПРОДОЛЬНЫЙ ШОВ ТРУБЫ НА ПОЗИЦИОНЕРЕ: стол ставит шов наверх, горелка идёт по детали.
// Точки шва — в кадре ДЕТАЛИ (труба на планшайбе), ячейку считает платформа.
const v = param('подача шва', 480);
const r = 50, h = 30;
const home = [700, 0, 800];
part({ label: 'труба', shape: 'cylinder', size: [100, 100, 100], at: [0, 0, 0], on: 'U' }); // деталь ячейки — та же, что cell_parts
orient({ tilt: 0, turn: 0 });
phase('подход');
table({ turn: 90, tilt: -60 }); // шов наверх
orient({ part: 'труба', bisect: [[-1, 0, 0], [-0.866025, 0.0, 0.5]] }); // по нормали стенки, 15° от планшайбы
moveTo([-r - h, 0, 30], { part: 'труба' });
moveTo([-r, 0, 30], { part: 'труба', feed: v });
phase('шов');
weld({ to: [-r, 0, 70], part: 'труба', feed: v });
phase('отход');
moveTo([-r - h, 0, 70], { part: 'труба', feed: v });
moveTo(home);
table({ turn: 0, tilt: 0 });
| шаг | операция | движок | слот · Ø | параметры |
|---|---|---|---|---|
| 1 | Продольный шов на повёрнутой детали | python_motion_path | — · Ø0 | arc_port · cell_parts · feed_mm_min · grasp_from · home_abc · home_xyz · orientation_model · path_json |
Порождено из кода · снято 2026-09-24.