Список макрокоманд языка Macro-B - система ЧПУ fanuc
-
На нашем форуме есть бесплатный простенький курс по программированию ЧПУ для систем FANUC и Sinumerik, включающий разбор синтаксиса, примеры кода и практические рекомендации. Курс полностью бесплатный! Для доступа к материалам требуется регистрация на форуме.
Custom Macro B - встроенный язык программирования контроллеров Fanuc, который превращает G-код из набора жёстких команд в полноценную программу с переменными, условиями, циклами и математикой. С его помощью можно создавать параметрические циклы, измерительные макросы, автоматическую коррекцию инструмента и многое другое - без написания тысяч строк G-кода вручную.
Совместимость: Fanuc 0i, 16i, 18i, 21i, 30i/31i/32i. Часть системных переменных отличается между моделями - всегда сверяйтесь с Parameter Manual конкретного контроллера.
Типы переменных
Переменные - основа Macro B. Все переменные обозначаются символом
#перед номером.Специальная переменная #0
#0 - всегда пустая (NULL). Нельзя присвоить значение. Используется для проверки: IF [#1 EQ #0] - аргумент не передан.Локальные переменные #1 – #33
Существуют только внутри одной макропрограммы. При отключении питания — обнуляются. При вызове через G65 им присваиваются переданные аргументы.
Аргумент G65 Переменная Аргумент G65 Переменная A #1 N - (зарезервировано) B #2 O - (зарезервировано) C #3 P - (зарезервировано) D #7 Q #17 E #8 R #18 F #9 S #19 H #11 T #20 I #4 U #21 J #5 V #22 K #6 W #23 L - (кол-во повторов) X #24 M #13 Y #25 Z #26 Буквы G, L, N, O, P не могут передаваться как аргументы - они зарезервированы для G-кода.
Общие переменные #100 – #999
#100 – #199 - общие, обнуляются при отключении питания #500 – #999 - общие, сохраняются при отключении питания (энергонезависимые)Используются для обмена данными между разными программами и хранения настроечных значений (смещения, допуски, счётчики деталей).
Системные переменные #1000 – #99999
Дают доступ к внутренним данным контроллера: позициям осей, коррекциям инструмента, рабочим смещениям, сигналам PLC. Подробнее - в разделе ниже.
Диапазоны значений переменных
Локальные и общие переменные могут содержать:
- значение 0
- значения в диапазоне от $$-10^{47}$$ до $$-10^{-29}$$
- значения в диапазоне от $$10^{-29}$$ до $$10^{47}$$
Если результат вычисления выходит за допустимый диапазон - включается сигнал тревоги P/S #111 (arithmetic overflow).
Арифметические операции
Оператор Описание Синтаксис Пример +Сложение #C=[#A+#B]#100=[#100+1]-Вычитание #C=[#A-#B]#101=[#5041-#18]*Умножение #C=[#A*#B]#102=[#1*3.14159]/Деление #C=[#A/#B]#103=[#24/2]^Возведение в степень #C=[#A^#B]#104=[2^8]MODОстаток от деления #C=[#A MOD #B]#100=[37 MOD 10]→ 7MODпредварительно округляет числа с плавающей запятой до целых.[7.9 MOD 3]→[8 MOD 3]→ 2.
Математические функции
Тригонометрические
Функция Описание Синтаксис Примечание SINСинус #C=SIN[#B]Угол в градусах COSКосинус #C=COS[#B]Угол в градусах TANТангенс #C=TAN[#B]TAN[1] = ошибка ATANАрктангенс #C=ATAN[#A]/[#B]Формат: atan2(A,B); результат в градусах ASINАрксинус #C=ASIN[#B]Диапазон: −90…+90° ACOSАрккосинус #C=ACOS[#B]Диапазон: 0…180° ATANв Macro B записывается через два аргумента в квадратных скобках:ATAN[Y]/[X]- аналог функции atan2 в других языках.ATAN[1]/[1]= 45.0°.Функции округления
Функция Описание Пример Результат ROUNDОкругление по правилам математики ROUND[3.5]4 ROUNDROUND[3.4]3 FIXВсегда в меньшую сторону (floor) FIX[3.9]3 FIXFIX[-3.1]-3 (к нулю!) FUPВсегда в большую сторону (ceil) FUP[3.1]4 FUPFUP[-3.9]-3 Важный нюанс:
FIXиFUPработают по направлению к нулю/от нуля, а не «вниз/вверх» в абсолютном смысле для отрицательных чисел.Дополнительные функции
Функция Описание Синтаксис SQRTКвадратный корень #C=SQRT[#B]ABSАбсолютное значение #C=ABS[#B]LNНатуральный логарифм #C=LN[#B](B > 0)EXPЭкспонента (e^x) #C=EXP[#B]BINПеревод BCD → бинарный #C=BIN[#B]BCDПеревод бинарный → BCD #C=BCD[#B]
Логические операции (побитовые)
Применяются для работы с сигналами PLC и флагами.
Оператор Описание Синтаксис Пример ORПобитовое ИЛИ #C=[#A OR #B][3 OR 5]= 7ANDПобитовое И #C=[#A AND #B][6 AND 3]= 2XORИсключающее ИЛИ #C=[#A XOR #B][5 XOR 3]= 6Перед выполнением побитовых операций числа округляются до целых.
Операторы сравнения (в условиях)
Оператор Математическое значение Синтаксис EQ= (равно) [#A EQ #B]NE≠ (не равно) [#A NE #B]GT> (больше) [#A GT #B]LT< (меньше) [#A LT #B]GE≥ (больше или равно) [#A GE #B]LE≤ (меньше или равно) [#A LE #B]
Управляющие конструкции
IF / THEN - условное выполнение одной команды
IF [условие] THEN команда (ПРИМЕР: установить переменную если X больше 50) IF [#24 GT 50] THEN #100=1 IF [#24 LE 50] THEN #100=0IF / GOTO - условный переход
IF [условие] GOTO Nxx (ПРИМЕР: перейти к метке N200 если счётчик достиг 5) IF [#100 GE 5] GOTO 200 #100=[#100+1] N200 (ПРОДОЛЖИТЬ ВЫПОЛНЕНИЕ)WHILE / DO / END - цикл с условием
WHILE [условие] DO n ...тело цикла... END nn- идентификатор цикла: допустимы только 1, 2, 3- Циклы могут быть вложены до 3 уровней
- Диапазоны DO-END не могут перекрещиваться
- Нельзя перейти по GOTO внутрь цикла извне
(ПРИМЕР: три вложенных цикла) WHILE [#1 GT 0] DO 1 WHILE [#2 GT 0] DO 2 WHILE [#3 GT 0] DO 3 #3=[#3-1] END 3 #2=[#2-1] END 2 #1=[#1-1] END 1GOTO — безусловный переход
GOTO Nxx (переход к кадру N) GOTO #100 (переход к кадру, номер которого в переменной #100)
Вызов макропрограмм: G65 и G66
G65 - однократный вызов макроса
G65 P<номер> L<кол-во повторов> <аргументы>;Параметр Описание PНомер вызываемой программы LКоличество повторений (по умолчанию 1) Аргументы Пары адрес=значение; значения попадают в #1–#26 (ВЫЗОВ МАКРОСА СВЕРЛЕНИЯ O9001 С АРГУМЕНТАМИ) G65 P9001 X25. Y30. Z-15. R5. F100. D8.; (X=#24, Y=#25, Z=#26, R=#18, F=#9, D=#7)G66 / G67 - модальный вызов макроса
G66 вызывает макрос после каждого блока с движением - пока не встретится G67 (отмена). Используется для циклических операций по точкам.
G66 P9001 Z-15. R5. F100. (АКТИВИРОВАТЬ МОДАЛЬНЫЙ ВЫЗОВ); G00 X10. Y10. (ВЫЗОВЕТ O9001 ПОСЛЕ ПЕРЕМЕЩЕНИЯ); X30. Y10.; X30. Y30.; G67 (ОТМЕНИТЬ МОДАЛЬНЫЙ ВЫЗОВ);
Системные переменные: справочник
Системные переменные - мощнейший инструмент Macro B. Они дают чтение/запись реальных данных контроллера прямо из программы.
Позиционные переменные (#5001 – #5104)
Переменная Описание #5001Позиция конца последнего блока по X (в рабочей СК) #5002Позиция конца последнего блока по Y #5003Позиция конца последнего блока по Z #5021Текущая позиция X (машинная СК) #5022Текущая позиция Y (машинная СК) #5023Текущая позиция Z (машинная СК) #5041Текущая позиция X (рабочая СК) #5042Текущая позиция Y (рабочая СК) #5043Текущая позиция Z (рабочая СК) #5061Позиция X в момент скип-сигнала (G31) #5062Позиция Y в момент скип-сигнала (G31) #5063Позиция Z в момент скип-сигнала (G31) Переменные коррекции инструмента (#2001 – #2999)
Переменная Описание #2001–#2200Износ по длине, офсеты 1–200 (Memory A) #2201–#2400Геометрия по длине, офсеты 1–200 (Memory A) #2401–#2600Износ по радиусу, офсеты 1–200 #2601–#2800Геометрия по радиусу, офсеты 1–200 #10001–#10200Износ по длине (расширенная, Memory C, 200+ офсетов) #11001–#11200Геометрия по длине (Memory C) #12001–#12200Износ по радиусу (Memory C) #13001–#13200Геометрия по радиусу (Memory C) Рабочие смещения (#2500 – #2999)
Переменная Описание #2500–#2506G54 смещения: X, Y, Z, A, B, C, 
#2600–#2606G55 смещения #2700–#2706G56 смещения #2800–#2806G57 смещения #2900–#2906G58 смещения #3000–#3006G59 смещения #7001–#7006G54.1 P1 (расширенные, Fanuc 16i/18i/30i) На разных моделях Fanuc нумерация рабочих смещений может отличаться. Проверяйте в Macro Variables Manual.
Управляющие системные переменные
Переменная Описание #3000Вывод аварийного сообщения и останов. #3000=1(СООБЩЕНИЕ)#3001Миллисекундный таймер (счётчик мс от включения) #3002Часовой таймер (сохраняется при выкл. питания) #3003Управление одиночным кадром: 0=вкл, 1=выкл для макроса #3004Управление Feed Hold: бит 0 = запрет останова подачи #3006Останов с сообщением на дисплее. #3006=1(ТЕКСТ)#3007Зеркальное отображение (биты X/Y/Z) #3011Текущий год и месяц (YYYYMM) #3012Текущий день и час (DDHH) #4001–#4022Коды G-команд текущего блока (модальные) #4102Активный B-код #4107Активный D-код (номер коррекции на радиус) #4109Активная подача F #4111Активный H-код (номер коррекции на длину) #4113Активный T-код #4119Активная скорость S Интерфейсные сигналы (#1000 – #1135)
Позволяют читать/писать сигналы PLC прямо из макроса.
Переменная Описание #1000–#1031Чтение сигналов UI (User Interface Input, 32 бита) #1100–#1131Запись сигналов UO (User Interface Output, 32 бита) (ПРОЧИТАТЬ СИГНАЛ UI#0 - например, датчик детали) #100=#1000 IF [#100 EQ 1] GOTO 100 (ЕСЛИ СИГНАЛ ЕСТЬ - ПЕРЕЙТИ) #3000=99 (ДЕТАЛЬ НЕ УСТАНОВЛЕНА - АВАРИЙНЫЙ ОСТАНОВ) N100 (ПРОДОЛЖИТЬ)
Практические примеры программ
Пример 1: Параметрический цикл сверления отверстий по окружности
O9010 (СВЕРЛЕНИЕ ПО ОКРУЖНОСТИ); (АРГУМЕНТЫ:); (X=#24 - ЦЕНТР ОКРУЖНОСТИ X); (Y=#25 - ЦЕНТР ОКРУЖНОСТИ Y); (Z=#26 - ГЛУБИНА СВЕРЛЕНИЯ); (R=#18 - РАДИУС БЕЗОПАСНОСТИ); (I=#4 - РАДИУС ОКРУЖНОСТИ); (Q=#17 - КОЛИЧЕСТВО ОТВЕРСТИЙ); (F=#9 - ПОДАЧА); #30=360/#17 (УГОЛ МЕЖДУ ОТВЕРСТИЯМИ); #31=0 (НАЧАЛЬНЫЙ УГОЛ); #32=0 (СЧЁТЧИК); WHILE [#32 LT #17] DO 1 #33=#24+#4*COS[#31] (X ОТВЕРСТИЯ); #34=#25+#4*SIN[#31] (Y ОТВЕРСТИЯ); G98 G81 X#33 Y#34 Z#26 R#18 F#9; #31=[#31+#30]; #32=[#32+1]; END 1 G80; M99;Вызов: 6 отверстий диаметром на окружности R40 мм, центр X0 Y0:
G65 P9010 X0 Y0 Z-15. R5. I40. Q6. F100.;
Пример 2: Автоматическое обновление коррекции износа инструмента
Макрос читает результат измерения щупом (в #100) и обновляет износ инструмента T1:
O9020 (КОРРЕКЦИЯ ИЗНОСА ПО РЕЗУЛЬТАТУ ЗАМЕРА); (#1=НОМИНАЛЬНЫЙ РАЗМЕР, #2=ДОПУСК); #105=#5041 (ПРОЧИТАТЬ ТЕКУЩУЮ ПОЗИЦИЮ X); #106=[#105-#1] (ОТКЛОНЕНИЕ ОТ НОМИНАЛА); IF [ABS[#106] GT #2] GOTO 50 (ЕСЛИ В ДОПУСКЕ - НЕ ТРОГАТЬ); (ОБНОВИТЬ ИЗНОС: ПРИБАВИТЬ ОТКЛОНЕНИЕ К ТЕКУЩЕМУ ЗНАЧЕНИЮ); #2001=[#2001+#106]; GOTO 99; N50 #3006=1 (ДЕТАЛЬ ВНЕ ДОПУСКА - ТРЕБУЕТСЯ ВМЕШАТЕЛЬСТВО); N99 M99;Вызов: номинал 50 мм, допуск ±0,02:
G65 P9020 A50.0 B0.02;
Пример 3: Счётчик деталей с сохранением
Использует энергонезависимую переменную #500:
O9030 (СЧЁТЧИК ДЕТАЛЕЙ); (#1=ПЛАНОВОЕ КОЛИЧЕСТВО); #500=[#500+1] (УВЕЛИЧИТЬ СЧЁТЧИК, СОХРАНЯЕТСЯ ПРИ ВЫКЛ); (ВЫВЕСТИ НОМЕР НА ДИСПЛЕЙ); #3006=#500 (ДЕТАЛЬ №: значение отображается); IF [#500 LT #1] GOTO 99 (НЕ ДОСТИГЛИ ПЛАНА); (ПЛАН ВЫПОЛНЕН); #3006=999 (ПЛАН ВЫПОЛНЕН - ТРЕБУЕТСЯ ПОДТВЕРЖДЕНИЕ); #500=0 (СБРОСИТЬ СЧЁТЧИК); N99 M99;Сброс счётчика вручную:
#500=0через MDI.
Пример 4: Измерительный макрос с G31 (Skip Signal)
G31 останавливает движение при получении сигнала от щупа. Позиция фиксируется в
#5061–#5063.O9040 (ИЗМЕРЕНИЕ ДЕТАЛИ ЩУПОМ ПО OSI Z); (#26=Z БЕЗОПАСНАЯ ВЫСОТА НАЧАЛА); (#9=ПОДАЧА ИЗМЕРЕНИЯ); (#18=R ПЛОСКОСТЬ); (#1=НОМИНАЛЬНЫЙ РАЗМЕР Z); G00 Z#26 (ПОДЪЁМ В БЕЗОПАСНУЮ ТОЧКУ); G31 Z[#1-5.] F#9 (ДВИЖЕНИЕ ВНИЗ ДО СИГНАЛА ЩУПА); #110=#5063 (ЗАПОМНИТЬ Z В МОМЕНТ КАСАНИЯ); #111=[#110-#1] (ВЫЧИСЛИТЬ ОТКЛОНЕНИЕ); (ЗАПИСАТЬ ОТКЛОНЕНИЕ В РАБОЧЕЕ СМЕЩЕНИЕ G54 ПО Z); #2503=[#2503+#111]; G00 Z#26 (ОТВЕСТИ ЩУП); M99;
Пример 5: Управление выводом сообщений и таймером
O9050 (ТАЙМЕР ВЫДЕРЖКИ С СООБЩЕНИЕМ); (#1=ВРЕМЯ ВЫДЕРЖКИ В СЕКУНДАХ); #3001=0 (СБРОСИТЬ МИЛЛИСЕКУНДНЫЙ ТАЙМЕР); #50=[#1*1000] (ПЕРЕВЕСТИ СЕКУНДЫ В МИЛЛИСЕКУНДЫ); WHILE [#3001 LT #50] DO 1 (ЖДАТЬ - НИЧЕГО НЕ ДЕЛАТЬ); END 1; M99;Вызов: выдержка 3,5 секунды:
G65 P9050 A3.5;
Пример 6: IF / GOTO для обработки ошибок
O9060 (ПРОВЕРКА АРГУМЕНТОВ ПЕРЕД РАБОТОЙ); IF [#24 NE #0] GOTO 10 (X ПЕРЕДАН - OK); #3000=1 (АРГУМЕНТ X НЕ ПЕРЕДАН); N10 IF [#26 NE #0] GOTO 20 (Z ПЕРЕДАН - OK); #3000=2 (АРГУМЕНТ Z НЕ ПЕРЕДАН); N20 IF [#9 GT 0] GOTO 30 (ПОДАЧА > 0 - OK); #3000=3 (ПОДАЧА РАВНА НУЛЮ ИЛИ НЕ ПЕРЕДАНА); N30 (ВСЕ АРГУМЕНТЫ ВЕРНЫ - ВЫПОЛНИТЬ РАБОТУ); G01 X#24 Z#26 F#9; M99;
Ограничения и нюансы
Ограничения WHILE
- Допускается только 3 идентификатора цикла (DO 1, DO 2, DO 3)
- Идентификаторы можно использовать неограниченное количество раз (не одновременно)
- Нельзя перейти по GOTO внутрь активного цикла — сигнал тревоги P/S #125
- Перекрещивающиеся диапазоны DO-END - сигнал тревоги P/S #124
GOTO и производительность
GOTO просматривает программу от текущей строки вперёд. Если метка не найдена впереди - начинает поиск с начала программы. Это замедляет выполнение. Рекомендация: размещайте метки перехода ниже команды GOTO.
Точность вычислений
Macro B хранит переменные в формате с плавающей запятой двойной точности (15 значащих цифр). Для точных расчётов позиций достаточно, но сравнение
[#100 EQ 0.1]может давать неожиданный результат из-за погрешности представления — используйтеABS[#100-0.1] LT 0.0001вместо прямого EQ.#3000 vs #3006
#3000=N(текст)- аварийный останов (P/S Alarm), программа не продолжится до сброса#3006=N(текст)- плановый останов (аналог M00 с сообщением), оператор нажимает Cycle Start для продолжения
Комментарии
(ЭТО КОММЕНТАРИЙ - ИГНОРИРУЕТСЯ КОНТРОЛЛЕРОМ) G01 X50. F200; (КОММЕНТАРИЙ В КОНЦЕ БЛОКА)- Вложенные скобки
( ( ) )- запрещены - Символ
;в конце блока - опционален в MDI, рекомендуется в файлах
Типичные ошибки Macro B
Ошибка Причина Решение P/S #111 Результат вычисления = ∞ или деление на 0 Проверить делитель на NE 0P/S #124 Перекрещивающиеся циклы DO Проверить пары DO n / END n P/S #125 GOTO внутрь цикла Переместить GOTO за пределы цикла P/S #126 DO с номером не 1/2/3 Использовать только DO 1, DO 2, DO 3 P/S #003 Неверный синтаксис команды Проверить скобки и операторы Бесконечный цикл Условие WHILE всегда истинно Добавить изменение условия внутри цикла G65 не передаёт аргумент Использованы буквы G/L/N/O/P Заменить на другую букву
-
K kirilljsx сослался на эту тему в
-
K kirilljsx переместил эту тему из ПO для чпу в
-
Быстрая шпаргалка
ПЕРЕМЕННЫЕ: #1–#33 локальные (аргументы вызова) #100–#199 общие, сбрасываются #500–#999 общие, постоянные #5041/42/43 текущая позиция X/Y/Z (рабочая СК) #2001–#2400 коррекции инструмента ВЫЗОВ МАКРОСА: G65 P9001 A#1 B#2 X50. Z-10. F100. УСЛОВИЕ: IF [#1 GT 10] THEN #2=1 IF [#1 EQ #0] GOTO 99 (аргумент не передан) ЦИКЛ: WHILE [#100 LT 10] DO 1 #100=[#100+1] END 1 АВАРИЙНЫЙ СТОП: #3000=1 (ТЕКСТ ОШИБКИ) ПЛАНОВЫЙ СТОП С СООБЩЕНИЕМ: #3006=1 (ТЕКСТ ДЛЯ ОПЕРАТОРА) ЗАПИСЬ В КОРРЕКЦИЮ T1 (износ длины): #2001=[#2001+0.01]
Что изучить
- Fanuc Custom Macro B Programming Manual (B-64304EN) - официальный мануал Fanuc
- Peter Smid «Fanuc CNC Custom Macros» - лучшая книга по теме на английском
- ГОСТ ISO 6983-1-2021 - стандарт на систему адресов ЧПУ
- G31 (Skip Cycle) - основа измерительных макросов; стоит изучить отдельно
- G65 vs G66 - разница в модальном вызове, важна для проходных циклов
Здравствуйте! Похоже, вас заинтересовал этот пост, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2022 - 2026 InvestSteel, Inc. Все права защищены.