在子程序中,可能会改变系统模态值。例如,主程序中的是绝对编程(G90),而子程序中用的是相对编程(G91),如果调用了这个子程序,主程序的模态就会受到影响。当然,对于简单的程序,你可以在子程序返回后再加一条G90指令变回绝对编程。但是,如果编写的子程序不是你自己用,别人又不知道你改变了系统模态值,直接调用就有可能出问题。有没有办法,使子程序不影响主程序的模态值呢?简单的办法就是,进入子程序后首先把子程序会影响到的所有模态用局部变量保存起来,然后再往后执行,并且在子程序返回时恢复保存的模态值,看下面的例子:
例
%102
;不管原来是什么状态,先记录下来
#45=#1162 ; 记录第12 组模态码#1162 是G61 或 G64?
#46=#1163 ; 记录第13 组模态码#1163 是G90 或 G91?
;现在可以改变已记录过的模态
G91 G64 ;用相对编程G91 及连续插补方式G64
…… ;这里是其它程序
;子程序结束前恢复记录值
G[#45] G[#46] ;恢复第12 组13 组模态
M99
由此可见,系统变量虽然是不能直接改写的,但并不是不能改变的。系统模态值是可以被指令改变的。
固定循环也是用宏程序实现的,而且固定循环中它改变了系统模态值,只是在固定循环子程序中采用了保护措施,在固定循环宏子程序返回时,恢复了它影响过的系统模态,所以外表看它对系统模态没有影响。这可以通过分析系统提供的固定循环宏程序看出来。
对于每个局部变量,还可用系统宏AR[]来判别该变量是否被定义,是被定义为增量或绝对方式。该系统宏的调用格式如下:
AR[#变量号]
返回值:
0 表示该变量没有被定义
90 表示该变量被定义为绝对方式G90
91 表示该变量被定义为相对方式G91
例 下面的主程序%1000 在调用子程序%9990 时设置了I JK 之值,子程序%9990 可分别通过当前局部变量#8 #9 #10 来访问主程序的I J K 之值
%1000
G92 X0Y0Z0
M98 P9990 I20 J30 K40
M30
%9990
IF [AR[#8] EQ 0] OR [AR[#9] EQ 0] OR [AR[#10] EQ 0]
M99 ; 如果没有定义I J K 值,则返回
ENDIF
N10 G91 ; 用增量方式编写宏程序
IF AR[#8] EQ 90 ; 如果I 值是绝对方式G90
#8=#8-#30 ;将I 值转换为增量方式, #30 为X 的绝对坐标
ENDIF
M99
HNC-21M 子程序嵌套调用的深度最多可以有七层,每一层子程序都有自己独立的局部变量,变量个数为50 。当前局部变量为#0-#49, 第一层局部变量为#200-#249 ,第二层局部变量为#250-#299,第三层局部变量#300-#349 ,依此类推。在子程序中如何确定上层的局部变量要依上层的层数而定。由于通过系统变量来直接访问局部变量容易引起混乱,因此不提倡用这种方法。
例
%0099
G92 X0 Y0 Z0
N100 #10=98
M98 P100
M30
%100
N200 #10=222 ;此时N100 所在段的局部变量#10 为第0层#210
M98 P110
M99
%110
N300 #10=333 ;此时N200 所在段的局部变量#10为第1层#260,即#260=222
;此时N100 所在段的局部变量#10为第0层#210,即#210=98
M99