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。
差异不仅是路径变长,还包括多出37 mm的Y向位移。因此宏接口应先区分“缺省”“明确零”“其他数值”,再按该输入的业务含义决定是否允许它。不能在本来允许零坐标的接口里简单禁止0,也不能用加0把缺省值偷偷改成有效坐标。更多宏程序主题见OPTION栏目。
