发表于:2010/1/30 15:21:44
#90楼
HNC-21T车削循环宏程序
HNC-21T车削循环宏程序(1) 车削循环指令的实现及子程序调用的参数传递
HNC-21T的固定循环指令采用宏程序方法实现,这些宏程序调用具有模态功能。
由于各数控公司定义的固定循环含义不尽一致,采用宏程序实现固定循环,用户可按自己的要求定制固定循环,十分方便。华中数控随售出的数控装置赠送固定循环宏程序的源代码staticcy。
为便于用户阅读下面固定循环宏程序的源代码,先介绍一下HNC-21T宏程序/子程序调用的参数传递规则。
G代码在调用宏(子程序或固定循环,下同)时,系统会将当前程序段各字段(A~Z共26字段,如果没有定义则为零)的内容拷贝到宏执行时的局部变量#0-#25,同时拷贝调用宏时当前通道九个轴的绝对位置(机床绝对坐标)到宏执行时的局部变量#30-#38。
调用一般子程序时,不保存系统模态值,即子程序可修改系统模态并保持有效;而调用固定循环时,保存系统模态值,即固定循环子程序不修改系统模态。
下表列出了宏当前局部变量#0~#38所对应的宏调用者传递的字段参数名。
宏当前局部变量 宏调用时所传递的字段名或系统变量
#0 A
#1 B
#2 C
#3 D
#4 E
#5 F
#6 G
#7 H
#8 I
#9 J
#10 K
#11 L
#12 M
#13 N
#14 O
#15 P
#16 Q
#17 R
#18 S
#19 T
#20 U
#21 V
#22 W
#23 X
#24 Y
#25 Z
#26 固定循环指令初始平面Z模态值
#27 不用
#28 不用
#29 不用
#30 调用子程序时轴0的绝对坐标
#31 调用子程序时轴1的绝对坐标
#32 调用子程序时轴2的绝对坐标
#33 调用子程序时轴3的绝对坐标
#34 调用子程序时轴4的绝对坐标
#35 调用子程序时轴5的绝对坐标
#36 调用子程序时轴6的绝对坐标
#37 调用子程序时轴7的绝对坐标
#38 调用子程序时轴8的绝对坐标
对于每个局部变量,都可用系统宏AR[]来判别该变量是否被定义,是被定义为增量或绝对方式。该系统宏的调用格式如下:
AR[#变量号]
返回:
0: 表示该变量没有被定义;
90:表示该变量被定义为绝对方式G90;
91:表示该变量被定义为相对方式G91。
例:下面的主程序O1000在调用子程序O9990时,设置了I、K之值,子程序O9990可分别通过当前局部变量#8、#10来访问主程序的I、K之值。
%1000
G92 X0 Z0
M98 P9990 I20 K40
M30
%9990
IF [AR[#8] EQ 0] OR [AR[#10] EQ 0]
; 如果没有定义I、K值,
M99 ; 则返回
ENDIF
N10 G91 ; 用增量方式编写宏程序
IF AR[#8] EQ 90 ; 如果I值是绝对方式G90
#8=#8-#30 ;将I值转换为增量方式, #30为X的绝对坐标
ENDIF
…
M99
HNC-21/22T子程序嵌套调用的深度最多可以有九层,每一层子程序都有自己独立的局部变量(变量个数为50)。当前局部变量为#0-#49,第一层局部变量为#200-#249,第二层局部变量为#250-#299,第三层局部变量#300-#349,依此类推。
在子程序中如何确定上层的局部变量,要依上层的层数而定,例:
o0099
g92 X0 Z0
N100 #10=98
M98 P100
M30
o100
N200 #10=100 ;此时N100所在段的局部变量#10为第一层#210
M98 P110
M99
o110
N300 #10=200 ;此时N200所在段的局部变量为第二层#260
; N100所在段的局部变量#10为第一层#210
M99
为了更深入地了解HNC-21/22T宏程序,这里给出一个利用小直线段逼近整园的数控加工程序:
O1000
G92 X0 Z0
M98 P2 X-50 Z0 R50 ;宏程序调用,加工整圆
M30
O2
; 加工整圆子程序,园心为(X,Z),半径为R
; X -> #23 Z -> #25 R -> #17
IF [AR[#17] EQ 0] OR [#17 EQ 0] ;如果没有定义R
M99
ENDIF
IF [ AR[#23] EQ 0 ] OR [ AR[#25] EQ 0 ] ;如果没有定义圆心
M99
ENDIF
#46=#1163 ; 记录模态码#1163,是G90 OR G91?
G91 ;用相对编程G91
IF [ AR[#23] EQ 90 ] ;如果X为绝对编程方式
#23=#23-#30 ; 则转为相对编程方式
ENDIF
IF [ AR[#25] EQ 90 ] ; 如果Z为绝对编程方式
#25 = #25-#32 ; 则转为相对编程方式
ENDIF
#0=#23+#17*COS[0];
#1=#25+#17*SIN[0];
G01 X[#0] Z[#1];
#10=1
WHILE [#10 LE 100] ;用100段小直线逼近圆
#0 = #17*[ COS[#10*2*PI/100]-COS[[#10-1]*2*PI/100] ]
#1 = #17*[ SIN[#10*2*PI/100]-SIN[[#10-1]*2*PI/100] ]
G01 X[#0] Z[#1]
#10=#10+1
ENDW
G[#46] ; 恢复模态
M99