Пустое значение и ноль в макропрограммах FANUC: почему «прибавить 0» меняет смысл пропущенного аргумента
Правила макропрограмм 16i/18i-MB различают неопределённую переменную, числовой ноль, прямое присваивание и арифметическое преобразование. Авторские координаты и таблица условий показывают, почему пропуск нужно выявлять до вычислений, а не проверкой ненулевого значения.
Содержание
Разрешить пропуск входного аргумента макропрограммы и разрешить числовое значение 0 — разные решения. Если программа их смешивает, пустой ввод, означавший отсутствие участия оси, может превратиться в нулевую целевую координату этой оси.
Правило этой редакции: пустое значение не является другой записью 0
Руководство оператора FANUC 16i/18i-MB B-63534EN/02, §15.1, страницы 394–395, и §15.5, страница 414 (общедоступное зеркало оригинального руководства) поясняет: #0 всегда имеет пустое значение; при непосредственном использовании пустой переменной как значения адреса оси этот адрес игнорируется. Прямое присваивание сохраняет пустое состояние, арифметика обрабатывает его как 0. EQ и NE различают пустое значение и 0, остальные сравнения принимают пустое за 0. Здесь рассматривается только семантика Custom Macro этой редакции, без предположения об одинаковом времени жизни переменных в других сериях.
Вычисление до проверки может уничтожить признак «не задано»
В авторском примере входная #1 обозначает необязательную абсолютную координату Y. При прямом копировании #2=#1 пустая #1 оставляет #2 пустой. Если ради «единого формата» заменить это на #2=#1+0, #2 станет числовым 0. Число как будто не изменилось, но состояние ввода уже другое.
| Состояние ввода | #1 EQ #0 | #1 NE 0 | Результат #1+0 |
|---|---|---|---|
| Не определено | Истина | Истина | Числовой 0 |
| Явно задано 0 | Ложь | Ложь | Числовой 0 |
| Явно задано 12 | Ложь | Истина | Числовое 12 |
Поэтому истинность NE 0 не доказывает, что вызывающая программа передала ненулевой аргумент: неопределённое значение тоже удовлетворяет этому условию. Пропуск следует выявлять до умножения на масштаб, добавления смещения или вычисления математической функции. После вычисления 0 уже не показывает, получен ли он из пропуска или явного ввода.
Последствия для траектории могут быть значительными
Это автономная геометрическая схема, а не программа резания. Пусть текущие XY=(10,37) mm, движение линейное в абсолютных координатах, цель X равна 32, а Y берётся из #2; других преобразований и коррекции инструмента нет. При пустой #2 адрес Y не задаётся, конечная точка (32,37), длина 22 mm. При #2 равной 0 конечная точка становится (32,0), длина √(22²+37²)≈43.046 mm.
Меняется не только длина пути: добавляется перемещение по Y на 37 mm. Поэтому интерфейс макропрограммы сначала должен различать пропуск, явно заданный ноль и другие числа, затем решать допустимость по смыслу аргумента. Нельзя просто запретить 0 там, где нулевая координата допустима, или незаметно превращать пропуск в действующую координату прибавлением 0. Другие темы макропрограмм — в разделе OPTION.