Перейти к содержанию

Список макрокоманд языка Macro-B - система ЧПУ fanuc

Перенесена Fanuc
2 1 4.5k 1
  • На нашем форуме есть бесплатный простенький курс по программированию ЧПУ для систем 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] → 7

    MOD предварительно округляет числа с плавающей запятой до целых. [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
    ROUND ROUND[3.4] 3
    FIX Всегда в меньшую сторону (floor) FIX[3.9] 3
    FIX FIX[-3.1] -3 (к нулю!)
    FUP Всегда в большую сторону (ceil) FUP[3.1] 4
    FUP FUP[-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] = 7
    AND Побитовое И #C=[#A AND #B] [6 AND 3] = 2
    XOR Исключающее ИЛИ #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=0
    

    IF / GOTO - условный переход

    IF [условие] GOTO Nxx
    
    (ПРИМЕР: перейти к метке N200 если счётчик достиг 5)
    IF [#100 GE 5] GOTO 200
    #100=[#100+1]
    N200 (ПРОДОЛЖИТЬ ВЫПОЛНЕНИЕ)
    

    WHILE / DO / END - цикл с условием

    WHILE [условие] DO n
      ...тело цикла...
    END n
    
    • n - идентификатор цикла: допустимы только 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 1
    

    GOTO — безусловный переход

    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#2506 G54 смещения: X, Y, Z, A, B, C, ®
    #2600#2606 G55 смещения
    #2700#2706 G56 смещения
    #2800#2806 G57 смещения
    #2900#2906 G58 смещения
    #3000#3006 G59 смещения
    #7001#7006 G54.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 0
    P/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 Заменить на другую букву

  • kirilljsxK kirilljsx сослался на эту тему в
  • kirilljsxK 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 - разница в модальном вызове, важна для проходных циклов