FANUC G65 и M98: почему изменение #1 в подпрограмме иногда не видно вызывающей программе
Таблица переменных без движения осей по общему руководству 0i-D сравнивает G65 и M98. Рассмотрены передача A в #1, восстановление уровня локальных переменных и отсутствие такой изоляции у общих переменных.
Содержание
Один и тот же фрагмент программы присваивает значение переменной, но после замены вызова на G65 переменная #1 основной программы при возврате будто не меняется. При M98 присвоенное значение сохраняется. Часто это различие семантики вызова, а не потеря присваивания в ЧПУ.
Различайте повторное использование программы и область переменных
Статья относится к 0i-D / 0i Mate-D с соответствующей функцией пользовательских макросов. В общедоступном зеркале оригинального руководства B-64304EN/02, §14.7, страница 206, вызовы различаются так: G65 передаёт аргументы макросу и меняет уровень локальных переменных; вызов подпрограммы M98 не предоставляет этого способа передачи аргументов и не меняет уровень. Возможность обратиться к одной O-программе не делает вызовы эквивалентными.
Результат можно проследить без движения осей
Ниже приведён авторский логический разбор без прерываний, сброса и других присваиваний. До вызова #1 текущего уровня равна 20.0. Вызываемая программа только присваивает видимой ей #1 значение 9.0, затем штатно возвращается.
| Точка наблюдения | G65 с передачей A4.0 | Обычный вызов подпрограммы M98 |
|---|---|---|
| #1 при входе в вызываемую программу | 4.0 на новом уровне | 20.0 на исходном уровне |
| #1 после присваивания | 9.0 на новом уровне | 9.0 на исходном уровне |
| #1 после возврата вызывающей программе | Восстановлено 20.0 исходного уровня | Остаётся 9.0 |
Раздел 14.7.1, страницы 207–208, задаёт соответствие A и #1; страница 211 поясняет сохранение предыдущего уровня локальных переменных при макровызове и восстановление при возврате M99. В таблице аргумент содержит десятичную точку, чтобы не смешивать пример с правилами минимальной дискретности ввода для адресов без точки. Это схема области переменных, а не полная программа для непосредственного запуска на станке.
Восстановление локальных переменных не восстанавливает все состояния
На странице 211 той же главы общие переменные описаны как доступные для чтения и записи на разных уровнях макросов. Поэтому, если результат расчёта нужен вызывающей программе, интерфейс должен явно определять место его сохранения. #1 вложенного макроса не является автоматически возвращаемым значением; нельзя произвольно занимать общие переменные, уже используемые изготовителем станка.
Например, разделение входов, временных величин и выходов позволяет сохранить внешнюю #1 для расчёта расстояния между отверстиями независимо от временного расчёта на вложенном уровне. Напротив, старая программа, использующая M98 для совместного доступа к локальным переменным, после замены только команды вызова без пересмотра интерфейса может оставить внешнему уровню прежнее значение.
Проверяйте цепочку вызовов, а не только номера
Для каждого вызова укажите его тип, локальный уровень при входе и ожидаемое значение после возврата. Сравните их в логической модели без движения и записи в I/O. Одинаковые номера на разных уровнях рассматривайте как разные места хранения. Функцию макросов также нельзя смешивать с компилятором макросов; область функций рассмотрена в разделе OPTION.