1.普通子程序
普通子程序指没有宏的子程序,程序中各种加工的数据是固定的,子程序编好后,子程序的工作流程就固定了,程序内部的数据不能在调用时“动态”地改变,只能通过“镜像”、“旋转”、“缩放”、“平移”来有限的改变子程序的用途。
例
%4001
G01 X80 F100
M99
子程序中数据固定,普通子程序的效能有限。
2.宏子程序
宏子程序可以包含变量,不但可以反复调用简化代码,而且通过改变变量的值就能实现加工数据的灵活变化或改变程序的流程,实现复杂的加工过程处理。
例
%4002
G01 Z[#1] F[#50] ;Z坐标是变量;进给速度也是变量,可适应粗、精加工。
M99
例 对圆弧往复切削时,指令G02、G03交替使用。参数#51改变程序流程,自动选择。
%4003
IF #51 GE 1
G02 X[#50] R[#50] ;条件满足执行G02
ELSE
G03 X[-#50] R[#50] ;条件不满足执行G03
ENDIF
#51=#51*[-1] ;改变条件,为下次做准备
M99
子程序中的变量,如果不是在子程序内部赋值的,则在调用时,就必需要给变量一个值。这就是参数传递问题,变量类型不同,传值的方法也不同。
3.全局变量传参数
如果子程序中用的变量是全局变量,调用子程序前,先给变量赋值,再调用子程序。
例:
%400
#51=40 ;#51为全局变量,给它赋值
M98 P401 ;进入子程序后#51的值是40
#51=25 ;第二次给它赋值
M98 P401 ;再次调用子程序,进入子程序后#51的值是25
M30
%401 ;子程序
G91G01X[#51]F150 ;#51的值由主程序决定
M99
4.局部变量传参数
问题:
%400
N1 #1=40 ;为局部变量#1赋值
N2 M98 P401 ;进入子程序后#1的值是40吗?
M30
%401
N4 G91G01X[#1] ;子程序中用的是局部变量#1
M99
结论:
主程序中N1行的#1与子程序中N4行的#1不是同一个变量,子程序不会接收到40这个值。怎么办呢?
局部变量的参数传递,是在宏调用指令后面添加参数的方法来传递的。上面的程序中,把N1行去掉,把N2行改成如下形式即可:
N2 M98 P401 B40
比较一下,可知多了个B40,其中B代表#1,紧跟的数字40代表#1的值是40。这样就把参数40传给了子程序%401中的#1。更一般地,我们用G65来调用宏子程序(称宏调用)。
G65指令:
G65是专门用来进行宏子程序调用的,但在华中数控系统里面,G65和M98功能相同,可以互换。
宏子程序调用指令G65的格式:
G65 P__ L__ A__ B__ … Z__
P 子程序号
L 调用次数
A~Z 参数,每个字母与一个局部变量号对应。A对应#0,B对应#1,C对应#2,D对应#3,……如A20,即#0=20;B6.5,即#1=6.5;其余类推。换句话说,如果要把数50传给变量#17,则写R50。
G65代码在调用宏子程序时,系统会将当前程序段各字母(A~Z共26个,如果没有定义则为零)后跟的数值对应传到宏子程序中的局部变量#0-#25 。下面列出了宏调用时,参数字母与变量号的对应关系:
子程序中的变量 : #0 #1 #2#3#4#5#6#7#8#9#10#11#12
传参数用的字母: A、B 、C、D、E、F、G、H、I、J、K、L、M
子程序中的变量:#13 #14 #15 #16 #17 #18 #19 #20 #21 #22 #23 #24 #25
传参数用的字母:N、O、P、Q、R、S、T、U、V、W、X、Y、Z
要注意,由于字母G、P、L等已被宏调用命令、子程序号和调用次数占用,所以不能再用来传递其它任意数据。传进去的是,G65即#6=65,P401即#15=401(子程序号),L2即#11=2。为了便于参数传递,编写子程序时要避免用#6、#15、#11等变量号来接收数据,但这些变量号可以用在子程序中作为内部计算的中间变量暂存数据。
另外,G65代码在调用宏子程序时,还会把当前九个轴的绝对位置(工件绝对坐标)传入局部变量#30~#38。#30~#38与轴名的对应关系由机床制造厂家规定,通常#30为X轴,#31为Y轴,#32为Z轴。固定循环指令初始平面Z 模态值也会传给变量#26。通过#30~#38可以轻易得到进入子程序时的轴坐标位置,这在程序流程控制中是很有用的。