- PVSM.RU - https://www.pvsm.ru -

Как я, учась в айти, работаю на 15-тонном советском станке и автоматизирую его без CAM‑системы и комментариев

Мне 19. Днем я очный студент‑айтишник, а в остальное время — единственный человек в цеху, кто работает на 15-тонном советском горизонтально‑фрезерном станке ИР-500 1982 года выпуска. Мозги [1] у этого монстра под стать эпохе: древняя японская стойка Fanuc 0-M начала 90-х.

Как я, учась в айти, работаю на 15-тонном советском станке и автоматизирую его без CAM‑системы и комментариев - 1

Сам ИР-500 — настоящий танк. По оси Z ездит сразу вся огромная чугунная коробка на рельсах. А когда эта масса разгоняется, пол вибрирует, но сам станок стоит намертво. Он воспринимает дикие нагрузки на минимальных оборотах — как легкую прогулку.

Но есть проблема, передачу файлов через кабель он не поддерживает, CAM‑систему не подключить.
Для меня, привыкшего к созданию 3D‑моделей и визуализации всех траекторий в Fusion360 было непросто адаптироваться.

Мои первые самостоятельные дни были очень болезненными, хотелось просто уволиться, ведь малейшая ошибка и невнимательность здесь — это не упавший сервер, а разнесенная фреза и тиски. Поэтому каждый первый запуск новой программы — это паранойя. Рука на остановке подачи, покадровый режим, минимальные перемещения и подача. И только когда фреза пускала стружку, я выдыхал и выкручивал подачу на максимум.

Пока детали требовали обработки в пару проходов, было все отлично. Но потом..

Началось спагетти из g‑кода

Пошли заказы на глубокое торцевание (или более сложные траектории, но сегодня не об этом), где можно потратить полсмены на написание программы.

Первые трудности появились, когда принесли стальную болванку, с которой нужно снять больше 15 мм металла со всех сторон. Моя торцевая фреза за один проход безопасно берет 4 мм. +деталь широкая, нужно делать несколько проходов по высоте (Y).

Обычные программы для таких деталей превращались в огромные портянки однообразных строк кода, в которых меняются только глубина (Z) и шаг по высоте (Y). Десятки строк унылого хардкода, где ошибиться — плевое дело. У меня были лишь безобидные случаи, забывал минус перед координатой Z и станок послушно резал воздух) Но можно ошибиться серьезнее, испортив тиски за 150 тысяч.

После этого момента я начал копаться в стойке и просторах интернета, чтобы найти способ перестать быть роботом. Я все‑таки учусь на айтишника и здравый смысл мне твердил, что писать хардкод руками — это преступление.

Немножко о стеке 1982 года

Оказалось, что в моей стойке поддерживается полноценное программирование (Custom Macro B), я был поражен, ведь эта функция в те годы стоила заводам приличных денег, ±как хорошая подержанная машина.

Однако не без минусов, по памяти конечно беда, она ограничена килобайтами, много программ не сохранить, приходится удалять старые программы, фоткая их на телефон.
Количество переменных тоже ограничено 33, но главная боль не в этом. Комментарии на этой стойке писать нельзя. Вообще. Любой код превращается в месиво на пузатом экране.

Здесь меня очень выручает Obsidian. В нем у меня лежит всё: бэкапы кода, фото как крепить каждую из заготовок, нули по оси Z для инструментов (многие фрезы живут в постоянных оправках, это экономит время). Там же я храню расшифровки самописных кодов. На стойку текст не выведешь, поэтому телефон стал моим вторым монитором.

Пишу Custom Macro B

Итак, выяснив, что у меня есть макросы, я начал их осваивать. Принцип оказался очень примитивным и ограниченным, есть только 1 цикл и условие IF. Поэтому вместо else приходится использовать много переходов на другие строки командой GOTO.
 Быстро освоив это все, я написал универсальный макрос для торцевания и вынес его в отдельную программу.
Теперь основная программа выглядит примерно так:

%
O1000;
(...)
G0 Z50. (SAFE-Z)

G65 P9001 X90. Y90. Z-10. D20. Q70. F400. K1.5 H10. I0.;

M30
%

G65 — это вызов макроса. Для программиста это обычный вызов функции с передачей аргументов. Буквы стойка автоматически конвертирует в локальные переменные от #1 до #33.

Чтобы было понятнее, вот расшифровка:

  • P9001 — номер программы, в которой сохранен макрос.

  • X90. / Y90. — ширина и высота детали в мм.

  • Z-10. — финальная глубина.

  • D20. — диаметр фрезы (20 мм).

  • Q70. — перекрытие прошлого реза в процентах. Фреза будет смещаться на 70% от своего диаметра (14 мм).

  • F400. — рабочая подача (400 мм/мин).

  • K1.5 — съем за один проход по Z.

  • H10. (необязательный) — плоскость безопасности по Z.

  • I0. (необязательный) — координата нуля детали по оси X.

А вот сам код макроса. В нем есть комментарии в скобках для вас и моей базы в телефоне. На станке крутятся голые цифры.

%
O9001; (FACING MACRO-B)

N10 (STATE SAVING)
#100 = #4003 (G9091 SAVE)
G90


N20 (SANITY CHECKS)
IF [#24 EQ #0] GOTO 9901 (X - WIDTH)
IF [#25 EQ #0] GOTO 9902 (Y - HEIGHT)
IF [#26 EQ #0] GOTO 9903 (Z - DEPTH END)
IF [#7 LT 1.] GOTO 9904 (D - CUTTER)
IF [#17 LT 1.] GOTO 9905 (Q - STEPOVER)
IF [#9 LT 1.] GOTO 9906 (F - FEED)
IF [#6 EQ #0] GOTO 9907 (Z - STEP)


N30 (INITIALIZATION)
IF [#11 NE #0] GOTO 31
#11 = 10.

N31 IF [#4 NE #0] GOTO 32
#4 = 0.

N32 
#8 = [#7 * [#17/100]] (STEPOVER_MATH)
#10 = 0. (Z-START)
#12 = [[#7 / 2] + 5.] (SAFE-X)
#14 = 1. (ZIG-ZAG, 1 - CLIMB)

IF [#25 GT #8] GOTO 33
(SINGLE PASS Y)
#13 = [#25 / 2] (Y - START)
#25 = #13 (Y - END)
#22 = #13 (SAVE Y-START)
GOTO 40

N33 (MULTI PASS Y)
#13 = [#8 - [#7 / 2]]
#25 = [#25 - [#7 / 2]]
#22 = #13

 
N40 (MAIN)
G0 X[#4 - #12] Y#13; (START_POSITION)
Z#11
 
WHILE [#10 GT #26] DO 1 (CYCLE-Z)
#10 = [#10 - #6]
IF [#10 GT #26] GOTO 41
#10 = #26

N41 G0 Z#11
Y#13 
Z#10

WHILE [#13 LE #25] DO 2 (CYCLE-Y)

IF [#14 EQ 1.] GOTO 43
G1 X[#4-#12] F#9
GOTO 44
N43 G1 X[#24+#12+#4] F#9
N44 #14 = -#14

IF [#13 EQ #25] GOTO 49
#13 = [#13+#8]
IF [#13 LT #25] GOTO 45
#13 = #25
N45 G0 Y#13;
END 2

N49 #13 = #22 (RESTORE Y-START)
END 1


N50 (RESTORE)
N90
G0 Z#11
G#100 (G90/G91)
GOTO 9999

(ERRORS)
N9901 M00 (ERR: X - WIDTH)
GOTO 9999
N9902 M00 (ERR: Y - HEIGHT)
GOTO 9999
N9903 M00 (ERR: Z - DEPTH)
GOTO 9999
N9904 M00 (ERR: D - CUTTER)
GOTO 9999
N9905 M00 (ERR: Q - STEPOVER)
GOTO 9999
N9906 M00 (ERR: F - FEED)
GOTO 9999
N9907 M00 (ERR: Z - STEP)

N9999 M99
%

Моя логика

Я постарался перенести в G‑код базовые паттерны из программирования.

1) Сохранение состояния
В блоке N10 я читаю системную переменную #4003. Она хранит текущий режим: абсолютный (G90) или инкрементальный (G91). Я сохраняю это значение в глобальную переменную #100, включаю G90 для своих расчетов, а в конце (N90) возвращаю все как было. Если этого не сделать, после выхода из цикла станок может поехать не туда, будет неприятно.

2) Защита от дурака
Блок N20 — это валидация входных данных. В Fanuc пустая переменная равна #0 (аналог null). Если я забыл передать ширину детали (#24), условие IF [#24 EQ #0] сработает и перекинет меня на строку GOTO 9901.

3) Защита от перереза глубины
В начале цикла я вычитаю шаг из текущей глубины, но если глубина не делится на шаг без остатка, то последний проход будет глубже чем нам нужно.
Решение здесь банально: Если результат выше дна (IF [#10 GT #26]), скрипт прыгает на кадр N41 и продолжает резать. Но как только глубина больше, скрипт игнорирует прыжок и жестко приравнивает текущую глубину к финальной: #10 = #26.

4) Вариативность высоты
В блок N30, После тестов кода на граничные условия (код, при значении Y меньше диаметра фрезы, не входил в цикл и тупо включал режим дятла, без перемещений) я добавил проверку IF [#25 GT #8] GOTO 33 — если высота (Y) меньше перекрытия (Q), то иди всегда по центру, без смещений.

В конце программы на строке N9901 стоит команда M00 — безусловный останов. Станок замирает. Я смотрю на экран, вижу, что выполнение остановилось на кадре 9901, открываю Obsidian на телефоне и читаю: «Ага, ошибка 9901 — забыл указать ширину по X».

Вторая частая ошибка на этой стойке — забыть точку. Если написать подачу F400 без точки, станок прочитает это не как 400 мм/мин, а как 400 микрон (0.4 мм/мин). Фреза будет ползти вечность. Поэтому я проверяю значения на < 1.. Задал диаметр фрезы в микронах? Ловлю ошибку 9904.

Также в блоке N30 я задаю некоторые дефолтные значения. Если я не передал начальную координату X или плоскость безопасности Z, макрос сам назначит им нуль и 10 мм соответственно.

Первый запуск и потные ладони

Писать код — одно. Запускать его на 15-тонном куске железа — совсем другое.

Сначала я прогнал макрос через симулятор CIMCO на ноуте. Траектории отрисовались идеально. Но симулятор не учитывает особенности стойки с возможными ошибками.

Поэтому первый запуск на станке был в воздухе, все прошло отлично.
Но на второй, я пошел сразу в бой по хардкору. В шпинделе — 100-миллиметровая сковородка. В тисках — стальная болванка. Включаю покадровый режим (Single Block) — станок выполняет всего по одной строке кода. Левая рука намертво лежит на кнопке удержания подачи (Feed Hold), правая жмет Cycle Start.

Станок с гулом опускается на первый проход. Стружка летит, звук ровный, по координатам идеально. Жму дальше. Цикл отрабатывает шаг по Y, переходит на следующий слой по Z. Математика фиксации дна сработала четко — последний проход снял ровно заданный припуск.

Преимущества подхода

Многие не задумываются, но большинство привычных нам циклов в ЧПУ — от банального сверления G81–G84 до автосмены инструмента через M06 — написаны таким же способом. Поэтому любой, кто освоит макросы — может сам запрограммировать цикл, адаптировав его под свои задачи.

Понятно, что сейчас почти везде есть CAM‑системы. Но чтобы просто подготовить базу и сторцевать пару миллиметров с черновой болванки, идти за компьютер — это лишние 10 минут. Макрос позволяет оператору просто замерить деталь и вбить одну строчку на пульте. И торцеванием это не ограничивается. Вы часто сверлите сетки отверстий или делаете гравировку даты? — это всё можно отдать математике станка, освободив CAM‑программиста для более сложных задач.

И для полного удобства этот вызов можно привязать к кастомному G‑коду через параметры стойки (например, сделать G100 X90...). Тогда для оператора это будет как родной безопасный цикл станка.

Подведем итоги

Раньше на написание программы торцевания для такой детали уходило минут двадцать, а то и полсмены нудного стучания по клавиатуре пульта, руки затекали. Сейчас — 10 секунд. Замерил заготовку, вбил семь параметров в строку G65, нажал зеленую кнопку.

Сама стойка Fanuc 0-M старше меня на двадцать с лишним лет. В ней нет CAM‑системы, нет графики, нет даже комментариев. Но логика программирования везде одинакова. Если есть переменные, циклы и операторы, то легко заставить поумнеть даже советский фрезерный танк. Дерзайте, парни.

На этом всё. Это мой первый макрос, поэтому судите строго и тыкайте в ошибки, буду этому рад. Также буду рад ответить на все вопросы по коду и режимам резания в комментариях.

Автор: Hafeg

Источник [2]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/457216

Ссылки в тексте:

[1] Мозги: http://www.braintools.ru

[2] Источник: https://habr.com/ru/articles/1074868/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1074868