Fanuc — один из самых популярных контроллеров ЧПУ в металлообработке и деревообработке. Программирование циклов на G-кодах позволяет автоматизировать повторяющиеся операции, снизить риск ошибок и значительно ускорить обработку деталей. В этой статье разберём, как написать свой цикл, какие команды использовать, и приведём реальные примеры кода.
1. Что такое цикл в Fanuc
В системе Fanuc цикл — это последовательность команд, оформленная в виде подпрограммы или встроенной функции, которая вызывается с разными параметрами. Основное назначение цикла — автоматизация повторяющихся действий, таких как сверление, нарезание резьбы, выборка карманов или фрезеровка ряда отверстий.
2. Виды циклов в Fanuc
- Встроенные циклы (fixed cycles) — вызываются стандартными G-кодами, например G81, G82, G83 для сверления, G84 для нарезания резьбы.
- Пользовательские циклы (custom cycles) — создаются программистом в виде подпрограммы с параметрами.
3. Почему стоит писать собственный цикл
Встроенные циклы удобны, но имеют ограниченную гибкость. Например, вам может понадобиться комбинированная операция: сверление + зенковка + выборка фаски за один вызов. Это можно реализовать только через пользовательский цикл.
4. Структура программы для Fanuc
Пример минимальной структуры:
O0001 (Основная программа)
...
M98 P1000 L5 (Вызов подпрограммы O1000 5 раз)
...
M30 (Конец программы)
O1000 (Пользовательский цикл)
(Здесь команды обработки)
M99 (Возврат в основную программу)
5. Объявление переменных
В Fanuc для передачи параметров в цикл используются адреса #1, #2, #3… (локальные переменные) или #100… (общие переменные).
Например:
#1 = 10.0 (Координата X)
#2 = 20.0 (Координата Y)
#3 = -5.0 (Глубина Z)
6. Пример простого цикла сверления
O0001
#1=0 (Начальная X)
#2=0 (Начальная Y)
#3=-10 (Глубина)
#4=20 (Количество отверстий)
#5=30 (Шаг между отверстиями по X)
N10 G90 G54 G00 X#1 Y#2
M98 P1000 L#4
M30
O1000
G81 X#1 Y#2 Z#3 R2.0 F100
#1 = [#1 + #5]
M99
Здесь подпрограмма O1000 выполняет сверление и сдвигает координату X на заданный шаг.
7. Использование WHILE/END
Fanuc поддерживает циклы WHILE, что позволяет обойтись без L-параметра:
#6=0
WHILE[#6 LT #4] DO1
G81 X#1 Y#2 Z#3 R2.0 F100
#1 = [#1 + #5]
#6 = [#6 + 1]
END1
8. Защита цикла от ошибок
Перед началом выполнения цикла стоит проверять, что глубина резания не превышает допустимых значений, а шаг не равен нулю:
IF[#5 EQ 0] THEN #3000=1 (Ошибка: шаг = 0)
IF[#3 GT 0] THEN #3000=2 (Ошибка: глубина > 0)
9. Реальный пример цикла фрезеровки кармана
O2000 (Цикл фрезеровки прямоугольного кармана)
#1=50 (Длина)
#2=30 (Ширина)
#3=-5 (Глубина)
#4=2 (Подача на глубину)
#5=5 (Боковой припуск)
#6=200 (Подача мм/мин)
G91 Z5.0
#7=0
WHILE[#7 GT #3] DO1
G01 Z[#7-#4] F#6
G01 X#1 F#6
G01 Y#2
G01 X-#1
G01 Y-#2
#1=[#1-#5*2]
#2=[#2-#5*2]
#7=[#7-#4]
END1
G90
M99
10. Практические советы
- Используйте комментарии в коде — это облегчит чтение.
- Тестируйте цикл на холостом ходу с поднятым инструментом.
- Всегда задавайте безопасную точку возврата (R-плоскость) в сверлильных циклах.
- При работе с WHILE следите за условиями выхода — бесконечный цикл приведёт к аварии.
11. Оптимизация кода
Чтобы ускорить обработку, избегайте лишних перемещений, используйте приращения (G91), комбинируйте перемещения по нескольким осям, минимизируйте количество смен инструмента.
12. Не бойтесь циклов
Пользовательские циклы Fanuc позволяют повысить эффективность производства, снизить риск ошибок и обеспечить стабильное качество. Освоение G-кодов и умение комбинировать их в циклы — это навык, который отличает опытного оператора от новичка.
Диагностический макро‑чек‑лист и универсальный цикл сверления для Fanuc
Блок 1. Диагностический макро‑чек‑лист (ловим частые ошибки) — O9001
Назначение: вызывать перед любым циклом/подпрограммой (M98 P9001
). Проверяет модальные состояния, параметры и выдаёт понятные предупреждения/аварии.
Код O9001
(***************** O9001 — ПРЕ‑ЧЕК ПЕРЕД ЦИКЛОМ *****************)
(Назначение: вызывать перед любым циклом/подпрограммой: M98 P9001)
(Проверяет модальные состояния и параметры. Выдаёт ALARM при рисках.)
O9001
(— 1. Единицы измерения — проверь: G21 мм или G20 дюймы)
IF[ NOT[ [#4006 EQ 21] OR [#4006 EQ 20] ] ] THEN #3000=100 (НЕ ЗАДАНЫ ЕДИНИЦЫ G20/G21)
(— 2. Плоскость — должна быть G17 для XY-обработки)
IF[ #4003 NE 17 ] THEN #3000=101 (НЕВЕРНАЯ ПЛОСКОСТЬ. НУЖНА G17)
(— 3. Режим отсчёта — чаще нужен абсолют G90)
IF[ #4001 NE 90 ] THEN #3000=102 (НЕ G90. ПРОВЕРЬ РЕЖИМ)
(— 4. Коррекция длины — если фрезерование/сверление с G43)
(Комментарий: опционально жёстко требовать G43; снимите, если не нужно)
IF[ #4120 EQ 1 ] THEN (Проверяем только при фрезеровании — код 4120=1)
IF[ #2000 EQ 0 ] THEN #3000=103 (НЕТ G43 H? ПРОВЕРЬ КОРРЕКЦИЮ ДЛИНЫ)
ENDIf
(— 5. Шпиндель и подача — базовые проверки)
IF[ #4123 EQ 0 ] THEN #3006=1 (ВНИМАНИЕ: ШПИНДЕЛЬ ОТКЛЮЧЕН)
IF[ #4008 EQ 94 ] THEN (G94 мм/мин — ок)
IF[ #9 LE 0 ] THEN #3000=104 (F<=0 В РЕЖИМЕ G94)
ELSEIF[ #4008 EQ 95 ] THEN (G95 мм/об — ок)
IF[ #9 LE 0 ] THEN #3000=105 (F<=0 В РЕЖИМЕ G95)
ELSE
#3000=106 (НЕИЗВЕСТНЫЙ РЕЖИМ ПОДАЧИ)
ENDIf
(— 6. Безопасная плоскость R и глубина Z при сверлении/зенковке/развертке)
(Если в вызываемом цикле используются #R и #Z — делайте явные проверки)
IF[ DEF[#100] ] THEN (пример: #100 — R-плоскость передана снаружи)
IF[ #100 LT 1. ] THEN #3006=2 (ПРЕДУПРЕЖДЕНИЕ: R НИЗКО)
ENDIf
IF[ DEF[#101] ] THEN (пример: #101 — глубина Z-)
IF[ #101 GE 0 ] THEN #3000=107 (ГЛУБИНА Z ДОЛЖНА БЫТЬ МИНУС)
ENDIf
(— 7. Охлаждение — необязательная рекомендация)
IF[ #4127 EQ 0 ] THEN #3006=3 (ПРЕДУПРЕЖДЕНИЕ: ОХЛАЖДЕНИЕ ВЫКЛ)
(— 8. Механизм аварийного выхода из WHILE — сторож‑счётчик)
IF[ NOT[ DEF[#500] ] ] THEN #500=0 (Сторож итераций. Обнулить, если не задан)
(Рекомендуется в циклах инкрементить #500 и проверять, что #500<#501 лимита)
M99
Как использовать O9001
(Перед своим циклом)
G21 G17 G90
M98 P9001 (Если что-то не так — получите понятный ALARM/сообщение)
Подсказки по системным переменным: #4006
— G20/G21; #4003
— G17/18/19; #4001
— G90/91; #4008
— G94/95; #4123
— шпиндель; #4127
— охлаждение. Если DEF[]
не поддерживается на вашей версии Macro B, замените проверки на собственные соглашения.
Блок 2. Универсальный параметрический цикл O8000 (линия, сетка, окружность; G81/G83)
Возможности: размещение отверстий по линии, сетке или окружности; автоматический выбор G81/G83 по параметру «пек»; контроль безопасной плоскости, подачи, шпинделя и охлаждения; сторож от «вечных» WHILE.
Код O8000
(***************** O8000 — УНИВЕРСАЛЬНЫЙ ЦИКЛ СВЕРЛЕНИЯ *****************)
(ВЫЗОВ ПРИМЕРЫ:
(1) Линия по X: 5 отверстий, шаг 30 мм:
#1=100. (X0) #2=50. (Y0)
#3=-12. (Z глубина) #4=1000. (F мм/мин)
#5=5 (N отверстий) #6=30. (DX шаг)
#7=0. (DY шаг, не нужен) #8=5. (R-плоскость)
#9=1200. (S) #10=1 (M—охлажд: 0 выкл, 1 M8)
#11=1 (MODE: 1=линия, 2=сетка, 3=окружность)
#12=0. (GRID Ny) #13=0. (GRID шаг DY)
#14=0. (PECK: 0=G81, >0=G83 пек)
M98 P8000
(2) Сетка 4x3, шаг 40x25:
#1=10. #2=20. #3=-15. #4=800. #5=4 #6=40. #7=25. #8=3. #9=1000. #10=1 #11=2 #12=3 #13=25. #14=0 M98 P8000
(3) Окружность 8 отверстий, R=60, центр XC=200, YC=150:
#1=200. (XC) #2=150. (YC) #3=-10. #4=900. #5=8 (N)
#6=60. (R радиус) #7=0. (не используется)
#8=3. (R-плоскость) #9=1500. #10=1 #11=3 #14=0.5 (пек => G83) M98 P8000 )
O8000
(— ВХОДНЫЕ ПАРАМЕТРЫ — СОГЛАШЕНИЕ)
( #1=X0/центрX, #2=Y0/центрY, #3=Z глубина-, #4=F, #5=N, #6=DX/радиус, #7=DY )
( #8=R-плоскость, #9=S, #10=охлаждение[0/1], #11=MODE(1/2/3), #12=Ny(для сетки), #13=Шаг DY(для сетки), #14=PECK )
(— БАЗОВЫЕ ПРОВЕРКИ)
IF[ #5 LT 1 ] THEN #3000=201 (N<1)
IF[ #3 GE 0 ] THEN #3000=202 (ГЛУБИНА ДОЛЖНА БЫТЬ МИНУС)
IF[ #4 LE 0 ] THEN #3000=203 (F<=0)
IF[ #8 LT 0.5 ] THEN #3006=4 (R НИЗКАЯ — ПРОВЕРЬ)
(— МОДАЛИ И БЕЗОПАСНОСТЬ)
G90 G17
S#9 M3
IF[ #10 GT 0 ] THEN M8
G98 (Возврат в начальную точку после цикла)
G00 X#1 Y#2
G00 Z#8
(— ОПРЕДЕЛЕНИЕ ЦИКЛА G81/G83 ПО ПАРАМЕТРУ #14)
IF[ #14 LE 0 ] THEN #15=81 (режим гладкого сверления)
IF[ #14 GT 0 ] THEN #15=83 (режим прерывистого сверления)
(— СТОРОЖ ОТ БЕСКОНЕЧНЫХ ЦИКЛОВ)
#501 = 0 (счётчик итераций)
#502 = 10000 (жёсткий верхний лимит)
(— ВЕТКА 1: ЛИНИЯ (по X, шаг #6, всего #5))
IF[ #11 EQ 1 ] THEN
#I=0
WHILE[ #I LT #5 ] DO1
IF[ #501 GE #502 ] THEN #3000=204 (OVERFLOW LINE)
IF[ #14 LE 0 ] THEN G#15 X[#1 + #I*#6] Y#2 Z#3 R#8 F#4
IF[ #14 GT 0 ] THEN G#15 X[#1 + #I*#6] Y#2 Z#3 R#8 Q#14 F#4
#I = #I + 1
#501 = #501 + 1
END1
ENDIf
(— ВЕТКА 2: СЕТКА N x Ny (шаги #6,#13), строки по Y)
IF[ #11 EQ 2 ] THEN
IF[ #12 LT 1 ] THEN #3000=205 (Ny<1 ДЛЯ СЕТКИ)
#ix=0
WHILE[ #ix LT #5 ] DO2
#iy=0
WHILE[ #iy LT #12 ] DO3
IF[ #501 GE #502 ] THEN #3000=206 (OVERFLOW GRID)
#Xpos = #1 + #ix*#6
#Ypos = #2 + #iy*#13
IF[ #14 LE 0 ] THEN G#15 X#Xpos Y#Ypos Z#3 R#8 F#4
IF[ #14 GT 0 ] THEN G#15 X#Xpos Y#Ypos Z#3 R#8 Q#14 F#4
#iy = #iy + 1
#501 = #501 + 1
END3
#ix = #ix + 1
END2
ENDIf
(— ВЕТКА 3: ОКРУЖНОСТЬ — #5 отверстий по кругу радиуса #6, центр #1/#2)
IF[ #11 EQ 3 ] THEN
#k=0
WHILE[ #k LT #5 ] DO4
IF[ #501 GE #502 ] THEN #3000=207 (OVERFLOW CIRCLE)
#ang = 360./#5 * #k
#Xc = #1 + #6 * COS[#ang]
#Yc = #2 + #6 * SIN[#ang]
IF[ #14 LE 0 ] THEN G#15 X#Xc Y#Yc Z#3 R#8 F#4
IF[ #14 GT 0 ] THEN G#15 X#Xc Y#Yc Z#3 R#8 Q#14 F#4
#k = #k + 1
#501 = #501 + 1
END4
ENDIf
G80 (Отмена сверлильных циклов)
G00 Z#8
M9
M5
M99
Быстрые подсказки
-
Для зенковки используйте
G82
и добавьтеP
— паузу на дне. -
При необходимости замените
G98
наG99
, чтобы возврат шёл на R‑плоскость. -
Параметр
#14
> 0 — включаетG83
с пекомQ
(уточните единицы пека в документации вашей стойки). -
Контролируйте сторож:
#501
инкрементируется,#502
— лимит; при переполнении сработает авария.