Technical Article
三菱 M80 的 G65 写 D2.5,宏里的 #7 为什么变成8?
三菱 M80 加工中心的 G65 中,D 与第二个 I 都对应局部变量 #7。用一段调用追踪覆盖顺序,说明两种不冲突的传参写法,以及 Mastercam 后处理应核对的宏接口。
调用段明明写了 D2.5,自定义宏读到的 #7 却是8。先别改宏里的计算式:如果同一段后面还有第二个 I,这个 I 也会写入 #7。三菱 M80 加工中心的 G65 允许两种实参指定方式混用;两个地址落到同一个局部变量时,后写的值有效。
本文按三菱《M800/M80/E80/C80 Series Programming Manual (Machining Center System) (1/2)》IB-1501277-U,第14.4.1节、印刷页480–483说明 M80 的宏传参规则。讨论的是支持用户宏功能的加工中心系统,不把这里的字母映射当作其他控制系统的通用规则。
同一个 #7,被写了两遍
看这一段调用。P9001 表示被调用的宏程序号;这里只分析送入宏的局部变量,不提供轴运动程序。P9001 是示例编号;现场同号宏可能执行轴运动,因此先阅读被调用的宏,不能直接把这行送入未知的现有程序。
G65 P9001 D2.5 I10. I8.;
按地址出现顺序核对映射:
D2.5:按实参指定方式 I,D 对应 #7,先得到 #7=2.5。
I10.:第一次出现的 I 对应 #4,得到 #4=10。
I8.:第二次出现的 I 按实参指定方式 II 对应 #7,再把 #7 改成8。
因此宏开始执行时,这两个变量是 #4=10、#7=8。第二个 I 没有覆盖第一个 I 的 #4;它占用的是下一组 I 的变量位置。只盯着 D2.5,或者把所有 I 都认成 #4,都会查错方向。

为什么第二个 I 会碰到 D?
方式 I 常用字母直接对应局部变量,例如 A→#1、B→#2、C→#3、I→#4、J→#5、K→#6、D→#7、E→#8、F→#9。这里的 D 是实参地址,不能因为在其他程序段里见过 D 刀补号,就认定它在这段 G65 中也执行刀补选择。
方式 II 除 A、B、C 外,允许最多10组 I、J、K。第一组对应 #4、#5、#6;第二组对应 #7、#8、#9,之后继续排下去。于是第二个 I 与 D 撞到了 #7,第二个 J 与 E 撞到 #8,第二个 K 与 F 撞到 #9。
手册表格中的 I₁、I₂ 表示第几组 I,序号不写进实际调用段。本例只用到 I,因此写成 I10. I8.;如果还要传 J、K,应遵守手册规定的 I、J、K 顺序,不要让后处理按字母重新排序实参。
D 对应 #7 只说明“数值放在哪里”,不说明“这个数值是什么”。#7 代表切深、长度还是别的量,是自定义宏的接口约定。只有读过宏中 #7 的用途,才能判断这次覆盖会影响哪个尺寸。
修复时,先确定宏要从哪里收这个值
如果现有宏约定用 D 传入 #7,而 #4 仍需要10,最直接的修改是删去重复写 #7 的第二个 I:
G65 P9001 D2.5 I10.;
这样 #4=10、#7=2.5。若项目原本采用按组排列的 I、J、K 接口,则可保留这种接口,去掉 D,并让第二个 I 明确传2.5:
G65 P9001 I10. I2.5;
两种写法在本例涉及的 #4、#7 上得到同样的输入。选哪一种,要与宏程序现有接口保持一致;不能为了让 #7 暂时变对,就随意移动 D 到程序段末尾。那样仍保留了两个来源,下一次生成程序时还可能再次互相覆盖。

改 Mastercam 后处理,检查的是输出接口
如果 G65 由后处理生成,应把实际输出段与宏内局部变量逐项对照,而不是只核 P 号与 D 值。尤其要检查:模板是否已经输出 D、E、F,后面又追加了第二组 I、J、K;同名 I 是否在格式整理时被合并;参数排序是否改变了覆盖顺序。
这次问题的回归目标可以写得很具体:生成以上三段调用,按地址顺序核对“冲突段 #7=8;保留 D 的修正段 #7=2.5;按组传参的修正段 #7=2.5”,且三段的 #4 均为10。这是依据手册做的实参映射推导,不是实机加工记录。进入带运动的宏前,还要把宏实际使用的其他局部变量一并核对;本例没有替那些变量补默认值。
调用方式本身不同的问题,可接着看 三菱 G66 与 G66.1 的轴地址和实参区别;如果是把普通子程序调用改成宏调用,先看 G65 与 M98 的调用区别(Haas 示例)。
核对依据:三菱官方 IB-1501277-U,第14.4.1节:第481页方式 I 映射、第482页方式 II 分组、第483页两种方式混用时后写地址有效。本文数值与示意图均为独立编写的传参示例。