主程序与子程序不在同一程序模块中_宏程序:看不懂的子程序高级应用,供大家参考...

在子程序中,可能会改变系统模态值。例如,主程序中的是绝对编程(G90),而子程序中用的是相对编程(G91),如果调用了这个子程序,主程序的模态就会受到影响。当然,对于简单的程序,你可以在子程序返回后再加一条G90指令变回绝对编程。但是,如果编写的子程序不是你自己用,别人又不知道你改变了系统模态值,直接调用就有可能出问题。有没有办法,使子程序不影响主程序的模态值呢?简单的办法就是,进入子程序后首先把子程序会影响到的所有模态用局部变量保存起来,然后再往后执行,并且在子程序返回时恢复保存的模态值,看下面的例子:

294a18952320eaea0ed478cb45bd5434.png

%102

;不管原来是什么状态,先记录下来

#45=#1162 ; 记录第12 组模态码#1162 是G61 或 G64?

#46=#1163 ; 记录第13 组模态码#1163 是G90 或 G91?

;现在可以改变已记录过的模态

G91 G64 ;用相对编程G91 及连续插补方式G64

…… ;这里是其它程序

;子程序结束前恢复记录值

G[#45] G[#46] ;恢复第12 组13 组模态

M99

由此可见,系统变量虽然是不能直接改写的,但并不是不能改变的。系统模态值是可以被指令改变的。

固定循环也是用宏程序实现的,而且固定循环中它改变了系统模态值,只是在固定循环子程序中采用了保护措施,在固定循环宏子程序返回时,恢复了它影响过的系统模态,所以外表看它对系统模态没有影响。这可以通过分析系统提供的固定循环宏程序看出来。

291d56f8f0aae29aeda436f15b72ff39.png

对于每个局部变量,还可用系统宏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 ,依此类推。在子程序中如何确定上层的局部变量要依上层的层数而定。由于通过系统变量来直接访问局部变量容易引起混乱,因此不提倡用这种方法。

0fc3bab8f6e0f9c11ca46e99e210f38c.png

%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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值