FANUC G65与M98:为什么子程序改了#1,有时主程序看不到?
依据0i-D通用操作手册,用无运动的变量跟踪表比较G65和M98。解释参数A传入#1、局部变量层级恢复,以及公共变量不受这层隔离的影响。
同样调用一段含变量赋值的程序,改用G65后,返回时主程序里的#1似乎“没变”;改回M98,数值却保留下来。这常常是调用语义的差异,并不说明CNC丢失了赋值。
先区分程序复用与变量作用域
本文适用于具备相应自定义宏功能的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栏目。
