宏程序可用以下方法调用:
① 简单调用 G65;
② 模态调用 G66、G67;
③ 用 G 代码调用宏程序;
④ 用 M 代码调用宏程序;
⑤ 用 M 代码的子程序调用;
⑥ 用 T 代码的子程序调用。
1.宏程序调用和子程序调用的区别
① 用 G65 可以指定实参(传送给宏程序的数据),而 M98 没有此能力。
② 当 M98 程序段包含其他 NC 指令(如:G01 X100.0 M98 P )时,在该指令执行完后调用子程序,而 G65 则无条件调用宏程序。
③ 当 M98 程序段包含其他 NC 指令(如:G01 X100.0 M98 P )时,在程序单段运行模式下机床停止,而 G65 不会让机床停止。
④ G65 调用时,局部变量的层次被修改,而 M98 调用不会更改局部变量的层次。
2.简单调用 G65
宏程序的简单调用是指在主程序中,宏程序可以被单个程序段单次调用。
当指定 G65 调用时,地址 P 后指定的用户宏程序被调用,同时数据(实参)被传递给用户宏程序。
调用指令格式:G65 P(宏程序号)L(重复次数)(变量分配)
其中:G65——宏程序调用指令;
P(宏程序号)——被调用的宏程序号;
L(重复次数)——宏程序重复运行的次数(1~99),重复次数为 1 时,可省略不写;
(变量分配)——为宏程序中使用的变量赋值,通过使用实参描述,数值被指定给对应的局部变量。
宏程序与子程序相同的是一个宏程序可被另一个宏程序调用,最多可调用 4 重。例如:
O0001;
…
G65 P9010 L2 A1.0 B2.0;
…
M30;
O9010;
#3=#1+#2;
IF [#3 GT 360] GOTO 9;
G00 G91 X#3;
N9 M99;
3.实参描述(变量分配)
有两种实参描述类型,实参描述类型Ⅰ(见表 1⁃3)可同时使用除 G、L、O、N 和 P 之外的字母各一次。而实参描述类型 Ⅱ(见表 1⁃4)只能使用 A、B、C 各一次,使用 I、J、K 最多十次。实参描述类型根据使用的字符自动判断。
表 1⁃3 实参描述类型 Ⅰ
注:地址 G、L、N、O、P 不能用于实参;不需指定的地址可省略,省略地址对应的局部变量设成空(null)。
表 1⁃4 实参描述类型 Ⅱ
注:I、J、K 的下标(subscripts)用于表示实参描述的顺序,实际程序中不需写出。
4.使用限制
(1)格式
G65 必须在实参之前指定。
(2)实参描述 Ⅰ 和 Ⅱ 的混合
NC 内部识别实参描述 Ⅰ 和 Ⅱ,当二者混合指定时,实参描述类型由后出现的地址决定,即两种类型可同时使用,当多个地址对应同一个局部变量时,该变量的值由后出现的地址决定。
(3)小数点的位置
一个不带小数点的实参在数据传递时,其单位按其地址对应的最小精度解释,因此,不带小数点的实参,其值在传递时有可能根据机床的系统参数设置而被更改。所以一般应该在宏调用实参中使用小数点,这样可以保持程序的兼容性。
(4)调用嵌套
调用可嵌套四层,包括简单调用 G65 和模态调用 G66,但不包括子程序调用 M98。
(5)局部变量的层次
嵌套调用时,局部变量的层次指定为 0~4。主程序的层次为 0。宏程序每(嵌套)调用一次(G65、G66),局部变量的层次加一,原有局部变量的值被 NC 保存(不可见)。
当 M99 执行时,控制返回调用该子程序的位置。此时,局部变量层次减一,宏程序调用时保存的原有局部变量值被恢复。
宏程序的嵌套关系及局部变量和全局变量的使用如图 1⁃2 所示。
图 1⁃2 宏程序的嵌套关系及局部变量和全局变量的使用