时,则先执行完这一移动指令后,再调用用户宏程序,直到模态宏调用被取消。所以,G66又称为移动调用指令。
取消模态宏调用使用指令G67。 范例:
主程序:
G66 P9802 R_ Z_ X_; //调用宏程序,并且对引数赋值 X_; //在有移动的程序段中,执行孔加工宏程序 M_; //非移动指令不执行孔加工宏程序 Y_; //执行孔加工宏程序 …
G67: //取消模态宏调用 …
孔加工宏程序(采用增量方式):
O9082; G00 Z#18; G01 Z#26; G04 X#24;
G00 Z-[ROUND[#18]+ROUND[#26]; M99;
执行这一程序的流程如图4-2所示。 二、模态宏调用指令G66.1
调用格式: G66.1 P<程序号> L<循环次数> <引数赋值>; 与模态宏调用指令G66类似,区别在于它是在主程序中使用G66进行模态宏调用后,每遇到一个程序段时,则先执行完该程序段后,再调用用户宏程序,直到模态宏调用被取消。
取消模态宏调用仍使用指令G67。 对于上面一个范例,修改如下:
主程序:
G66.1 P9802 R_ Z_ X_; //调用宏程序,并且对引数赋值
X_; M_; Y_; …
//在有移动的程序段中,执行孔加工宏程序 //执行孔加工宏程序,区别于G66调用指令 //执行孔加工宏程序
G67: //取消模态宏调用 …
孔加工宏程序不变,执行这一程序的流程如图4-3所示。
第 27 页
第三节 扩充G代码宏指令调用
用户宏除了用上述的模态调用指令G65和G66、G66.1外,本系统还提供扩充G代码宏调用的来调用用户宏程序。
调用格式:G<用户宏号码> <引数赋值>
为了实现这一方法,需要通过修改模态信息变量#1000来改变目前的插值模式。当用户宏程序在离开后保留此宏插值模式,就须在宏程序离开前将#1000设为自己的用户宏号码。这样在主程序中就能按上述G代码宏调用格式调用用户宏程序,此后只要遇到移动指令指令的程序段就会自动调用此用户宏程序,其实际操作将由此用户宏程序定义之。如此调用宏程序的扩充G指令就叫做G代码宏指令
G代码宏指令可看作是模态代码,它与G00/G01/G02/G03/G31/G33等G代码同组,因此它在遇到G00/G01/G02/G03/G31/G33或其它扩充插值G代码宏指令等插值指令时自动取消并被代替。
范例: 开发一个有模式循环的宏指令G21。 主程序: G21 X_ Z_ R_; // 设定G21插值模式,调用用户宏程序
X_; //调用用户宏程序 X_; //调用用户宏程序 X_; //调用用户宏程序 G00 Z_; // G21模式取消,并被G00模式代替
用户宏程序:
% @MACRO … // 宏程序
#1000 := 21; // 设定G21为目前的插值模式 M99;
第 28 页
第五章 用户宏程序范例
第一节 用户宏程序编写注意事项
1. 用户宏文档第一行必须为%@MACRO;程序段的每一行结束需加“;”结束
符;对于用户宏子程序最后需加“M99;”,以便能返回到主程序。 2. 变量赋值使用“:=”符号,不可仅用“=”符号。 3. 文档名储存需依照下列规则。
例如:编写G100之MACRO,需将该MACRO程序存在C:\\CNC\\MACRO目录底下,且文件名需为G0100,不需扩展名。 而编写G100.1之MACRO,需将该MACRO程序存在C:\\CNC\\MACRO目录底下,且文件名需为G100001,不需扩展名。 4. 请多使用局部变量(#1~#50), 模态变量(#2001~#2100,#3001~#3100)为所有扩
充G码的共享资源,请仅用于多个扩充G码间的数据交换,以节省共享资源;如果需要系统定义的初始值,请使用用户参数( #4001~#4100,#5001~ #5100 )。
5. 请不要使用全局变量(Global Variables,@1~@999),因为G码执行时,使用
者的数据是由自变量(A_,B_…,Z_)传入,由公共变量传递不符合使用习惯。 6. 系统在执行加工时对于MACRO程序会事先预编译,因此MACRO执行速度会超前于G、M 代码指令,因此当要求变量赋值或数据读取须与G、M代码指令发出的时间进程相同时,请于变量赋值或数据读取前加WAIT()指令,否则该变量赋值或该数据读取将无法与G、M 代码同步。 7. 不可改变模式G码(G00/G01/G02/G03/G33/G34/G35,G91/G90,
G40/G41/G42,…,)的状态,如果用户宏程序中需要改变其状态时,就需要模态信息的回复,
8. 对于长度或角度的自变量在运算前请使用STD()函数将单位标准化,以符合
工具机使用习惯。
9. 不可以改变坐标系统设定,G92/G54/G52等与坐标系统相关指令不能使用,
否则图形仿真功能将失去参考意义。 10. 请在程序中加上必要的注释,养成良好的编程习惯,以增加程序可读性和可
维护性,以帮助后续开发人员维护和排除问题。
第二节 用户宏程序编写范例
一、车床G21车床车牙
取材自车床G21车床车牙模式循环宏,其规格请参考车床程序使用手册
% @MACRO
第 29 页
// WHEN NO X(U) Z(W) ARGUMENTS,THEN LOAD MODAL INFORMATION // ELSE DO THREAD CUTTING // #8(E) LEAD COUNT PER INCH // #18(R) TAPER AMOUNT
// #2070 RECORDED TAPER AMOUNT // #2071 RECORDED Z AXIS AMOUNT
// PROCESS NO ARGUMENT CASE WHICH MAY CAUSE FROM MODAL RESTORE
IF( #21 = #0 AND #23 = #0 AND #24 = #0 AND #26 = #0 ) THEN M99;
END_IF;
// PROCESS TAPER IF (#1000 <> 21 ) THEN
// WHEN FIRST ENTRY, CLEAR TAPER MODAL STATE #2070 := 0; #2071 := 0; #2072 := #0; END_IF;
IF( #18 <> #0 ) THEN
// THERE ARE TAPER ADDRESS, RECORD IT INTO MODAL VARIABLE #2070 := #18; ELSE
// NO TAPER ADDRESS APPEAR, INHERIT MODAL STATE
#18 := #2070; END_IF;
IF( #9 <> #0 ) THEN
// THERE ARE LEAD ADDRESS, RECORD IT INTO MODAL VARIABLE #2072 := #9; ELSE
// NO LEAD ADDRESS APPEAR, INHERIT MODAL STATE #9 := #2072; END_IF;
IF( #23 <> #0 OR #26 <> #0 ) THEN
第 30 页
// WHEN THERE ARE W OR Z ADDRESS APPEAR, THEN // CHECK WHICH KIND OF COMMAND BEEN ADDRESS, AND // SAVE IT INTO MODAL VARIABLE IF( #26 <> #0 ) THEN // Z ADDRESS
#2071 := #26 - #1303; ELSE
// W ADDRESS #2071 := #23; END_IF; ELSE
// WHEN THERE ARE NO Z/W ADDRESS, THEN INHERIT IT FROM // MODAL VARIABLE #26 := #2071 + #1303; END_IF;
// PROCESS E ADDRESS
IF( #8 <> #0 AND #9 = #0 ) THEN IF( #1008 = 94 ) THEN
// FEED PER MINUTE, CALCULATE MM/MIN = LEAD * SPINDLE SPEED
#9 := (25.4 * #1034) / #8; #2072 := #9; ELSE
// FEED PER REVOLUTION, CALCULATE MM/REV = LEAD #9 := 25.4 / #8; #2072 := #9; END_IF; END_IF;
// STANDARDIZE ARGUMENT #9 := STD(#9,#1600); #21 := STD(#21,#1600); #23 := STD(#23,#1600); #24 := STD(#24,#1600); #26 := STD(#26,#1600); #18 := STD(#18,#1600);
第 31 页