
Как написать макрос измерения для ЧПУ
Стандартные измерительные циклы закрывают 80% задач — но что делать, когда нужно измерить нестандартный элемент, записать результат в конкретный корректор или принять решение прямо внутри программы? Ни один готовый цикл этого не сделает.
В этой статье разберём структуру пользовательского макроса измерения для ЧПУ: как устроены переменные, как вызвать щуп, обработать результат и записать коррекцию — на примере Fanuc Custom Macro B, с параллелями для Heidenhain и Siemens Sinumerik.
Что такое макрос измерения и зачем он нужен
Современные станки с ЧПУ могут быть оснащены измерительным щупом для обмера детали после выполнения всей обработки или её части — это удобно, когда необходимо свести к минимуму количество брака. Пакеты измерительных циклов (макросов) устанавливаются и остаются резидентными на станке с ЧПУ. В этих циклах используется традиционный метод программирования на базе G-кодов. Но готовые пакеты — это библиотека чужих решений. Когда геометрия детали нестандартна или нужна нестандартная логика коррекции, приходится писать макрос самостоятельно.
Некоторые размеры, которые необходимо контролировать при обработке детали, не могут быть измерены с помощью стандартных измерительных циклов, реализованных в ЧПУ. Именно для таких случаев и существует пользовательское макропрограммирование.
Ключевое правило: макрос измерения — это не просто «щуп + запись координаты». Это логический блок: подвод → касание → считывание переменной → вычисление отклонения → запись в корректор → безопасный отвод.
Архитектура макроса: переменные и их типы
На Fanuc (Custom Macro B) все вычисления ведутся через системные переменные. Понимание их типов — основа грамотного макроса.
Локальные переменные (#1–#33)
Используются только внутри текущего вызова макроса. Аргументы, переданные через G65, попадают именно сюда: адрес A → #1, B → #2, X → #24, Y → #25, Z → #26 и т.д.
Общие переменные (#100–#199, #500–#999)
#100–#199 обнуляются при сбросе питания. #500–#999 сохраняются в памяти ЧПУ постоянно — используйте их для хранения эталонных значений и накопленных коррекций.
Системные переменные (#1000 и выше)
Содержат данные о положении осей, состоянии щупа, корректорах инструмента. Ключевые для измерений:
| Переменная | Содержание |
|---|---|
| #5021 | Текущая позиция по X в МСК |
| #5022 | Текущая позиция по Y в МСК |
| #5023 | Текущая позиция по Z в МСК |
| #5061 | Позиция по X в момент пропуска (G31) |
| #5062 | Позиция по Y в момент пропуска (G31) |
| #5063 | Позиция по Z в момент пропуска (G31) |
| #2001–#2200 | Корректоры геометрии инструмента |
| #2401–#2600 | Корректоры износа инструмента |
Макропрограммы Fanuc (обычно серия 9000) обеспечивают точность определения координат на микронном уровне — в зависимости от применяемого щупа.
Вызов щупа и команда G31
Измерение строится на команде G31 (пропуск по сигналу). Щуп движется в заданном направлении, и как только срабатывает датчик касания, ЧПУ фиксирует текущие координаты в переменных #5061–#5063 и прерывает движение.
Базовая структура измерительного кадра:
G91 G31 Z-20. F200
Здесь: инкрементальное перемещение по Z на 20 мм вниз со скоростью 200 мм/мин. При касании координата Z фиксируется в #5063.
Важно: перед G31 щуп должен быть активирован (выдвинут, включён радиоканал). На большинстве станков это реализуется через M-функцию, заданную производителем, — например, M51/M50 у Renishaw или через обращение к PMC-сигналам.
Проверка факта касания
После G31 всегда проверяйте, произошло ли касание, или щуп прошёл полный путь вхолостую:
IF [#5063 EQ #5023] THEN #3000=1 (PROBE NO CONTACT)
Если переменная пропуска совпадает с текущей позицией до команды — касания не было. Это критически важная защита от ложных результатов.
Пример: макрос измерения торца детали по оси Z
Задача: измерить фактическое положение верхнего торца детали и скорректировать нулевую точку G54 по Z.
O9001 (MEASURE Z SURFACE)
;
#100 = #5023 (запомнить текущую Z перед движением)
G91 G31 Z-30. F150 (движение к детали, ожидание касания)
#101 = #5063 (зафиксировать Z касания)
;
IF [#101 EQ #100] THEN #3000=10 (ОШИБКА: НЕТ КАСАНИЯ)
;
G91 G0 Z5. (безопасный отвод)
;
; Вычислить отклонение от эталона (#500 = эталонная Z)
#102 = #101 - #500
;
; Записать коррекцию в G54 (смещение Z = системная переменная #5203)
#5203 = #5203 + #102
;
M99 (конец макроса, возврат)
Вызов макроса из основной программы:
G65 P9001
Для измерительной системы Renishaw вызов готового цикла выглядит так: G65 P9814 D50 Z-10 S4 — цикл обмера отверстия/вала, или G65 P9815 X0 Y0 I20 J20 S6 — цикл обмера внутреннего углового элемента.
Ваш собственный макрос использует ту же механику вызова через G65.
Передача аргументов: делаем макрос универсальным
Жёстко прописанные значения в теле макроса — плохая практика. Используйте аргументы G65, чтобы один макрос работал для разных деталей и позиций.
G65 P9001 Z-30. F150. A#500
Внутри макроса:
- #26 = переданное значение Z (глубина подвода)
- #9 = скорость подвода (адрес F → #9)
- #1 = эталонное значение (адрес A → #1)
Кадр движения тогда принимает вид:
G91 G31 Z[#26] F[#9]
Это позволяет использовать один макрос O9001 для измерения любой поверхности по Z, просто меняя аргументы вызова.
Ключевое правило: храните эталонные значения в переменных #500–#999. Они сохраняются при отключении питания и не сбрасываются при нажатии RESET.
Запись результатов в корректоры
Зонд перемещается в заданную точку и при касании определяет фактические геометрические параметры. Полученные данные заносятся в таблицу корректоров инструмента в ЧПУ.
На Fanuc корректоры инструмента доступны через системные переменные:
| Тип коррекции | Переменная | Пример |
|---|---|---|
| Геометрия (длина) инструмента T01 | #2001 | #2001 = #2001 + #102 |
| Износ (длина) инструмента T01 | #2401 | #2401 = #102 |
| Смещение G54 по X | #5201 | #5201 = #5201 - #101 |
| Смещение G54 по Y | #5202 | #5202 = #5202 - #101 |
| Смещение G54 по Z | #5203 | #5203 = #5203 + #102 |
Запись коррекций на Heidenhain (Q-параметры)
На TNC 640 вместо # используются Q-параметры. Команда FN 18: SYSREAD считывает системные данные, CYCL DEF 9.0 и пользовательские циклы — аналог макросов Fanuc:
FN 18: SYSREAD Q1 ID210 NR4 IDX1 ; считать позицию X
Q10 = Q1 - Q50 ; отклонение от эталона
FN 13: ERROR = 10 ; выдать ошибку при выходе из допуска
Запись коррекций на Siemens Sinumerik
В Sinumerik используются переменные типа R (R1–R249) и системные переменные $AA_IM[X] (позиция по оси). Запись в коррекцию инструмента:
$TC_DP3[1,1] = $TC_DP3[1,1] + R10
Ветвление и обработка ошибок
Макрос без логики ветвления — просто последовательность кадров. Настоящая мощь приходит с условными операторами.
IF / GOTO на Fanuc:
IF [#102 GT 0.1] GOTO 100 (если отклонение более 0.1 мм — прыжок)
IF [#102 LT -0.1] GOTO 200 (если отклонение < -0.1 мм — прыжок)
GOTO 300 (иначе — в допуске)
N100 #3000=20 (РАЗМЕР ЗАВЫШЕН — БРАК)
N200 #3000=21 (РАЗМЕР ЗАНИЖЕН — БРАК)
N300 (РАЗМЕР В ДОПУСКЕ — ПРОДОЛЖИТЬ)
WHILE-цикл для многоточечного измерения:
#150 = 0 (счётчик точек)
#151 = 0 (накопитель суммы)
WHILE [#150 LT 4] DO1
G65 P9001 (измерение в текущей точке)
#151 = #151 + #101
#150 = #150 + 1
G91 G0 X25. (шаг к следующей точке)
END1
#152 = #151 / 4 (среднее из 4 точек)
Такие циклы позволяют ускорить наладку, повысить качество обработки, снизить количество брака и автоматически корректировать смещения, обеспечивая высокую стабильность в серийном производстве.
Безопасность и отладка макроса
Написать макрос — половина дела. Безопасная отладка — вторая половина.
Перед первым запуском:
- Запустите макрос в режиме Single Block (покадровое выполнение)
- Установите подачу F на 10–20% через Override
- Проверьте значения переменных вручную через экран диагностики ЧПУ
Типичные ошибки:
- Нет безопасного отвода после касания — щуп остаётся в контакте с деталью при следующем движении
- Запись в неверный корректор — например, #2001 вместо #2401: геометрия вместо износа
- Не проверяется факт касания — макрос записывает «нулевое» касание как реальный результат
- Нет ограничения на максимальное отклонение — при случайном промахе макрос запишет в корректор значение 30 мм вместо 0.03 мм
Ключевое правило: всегда ограничивайте максимально допустимое значение коррекции:
IF [ABS[#102] GT 1.0] THEN #3000=99. Защита от аварийной записи в корректоры — обязательна.
Подобрать измерительный щуп для вашего станка →
Быстрая памятка: как написать макрос измерения
- Определить задачу → что измеряем (поверхность, отверстие, торец), куда записываем результат (G54, корректор инструмента)
- Выбрать переменные → #100–#199 для промежуточных, #500–#999 для эталонов и накоплений
- Написать подвод → G0 к точке старта, затем G31 с рабочей подачей 100–300 мм/мин
- Считать результат → #5061/#5062/#5063 для позиции касания
- Проверить касание → сравнить переменную пропуска с исходной позицией, при несовпадении — аварийный останов
- Вычислить отклонение → разница между фактом и эталоном
- Ограничить коррекцию → ABS-проверка перед записью в корректор
- Записать коррекцию → в #5201–#5206 (G54–G59) или #2001–#2999 (инструмент)
- Безопасный отвод → G0 от детали перед M99
- Отладить в Single Block → проверить все переменные на экране диагностики
Смотреть измерительные щупы для ЧПУ →
Связанные статьи
Похожие статьи

7 июля 2026 г.
Совместимость измерительных циклов с вашей стойкой ЧПУ
Как проверить совместимость измерительных циклов со стойкой ЧПУ: Fanuc, Heidenhain, Siemens. Что мешает запустить цикл и как это исправить.
Читать статью
7 июля 2026 г.
Совместимость щупа со стойкой ЧПУ: что проверить
Как проверить совместимость измерительного щупа со стойкой ЧПУ: интерфейс, протокол передачи сигнала, циклы измерения, монтажный конус и питание.
Читать статью
22 января 2026 г.
Совместимость щупов Renishaw со стойками ЧПУ: Fanuc, Siemens, Heidenhain
Как подключить щуп Renishaw к стойке Fanuc, Siemens 840D, Heidenhain iTNC или TNC 640. Какой интерфейс выбрать, какие макросы нужны и где взять циклы измерения.
Читать статью