|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹 1 q- Q. V6 \! k! c) b* a1 ]
详解A类宏
" [7 _4 u, B) J0 {分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。
Q- X5 ^! u! p 用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。# f1 R% m/ S2 ~/ m3 \5 v' o
宏指令是代表一系列指令的总指令,相当于子程序调用指令。
2 q3 Z* F0 N' c: ^" E8 K 用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。& P6 @. Z9 d% e5 E# W
用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。
/ p9 Z9 j0 k0 R8 R1、变量
- z9 I& t) [. { 在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。% Z5 ?; b+ a$ b( X3 z4 L
(1)变量的表示
8 ^8 N% i! A4 C% Z6 O5 E7 s+ _变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
+ u/ n2 C6 v! t& h* r4 T* \例:#5, #109, #501。0 X* t* L4 `* }
(2)变量的引用, r- a, _' t5 [+ @- S5 m
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。8 P; u: U! N! q# m, d: \* q5 K
例:对于F#103,若#103=50时,则为F50;
% q- Y. u) X8 ?7 g对于Z-#110,若#110=100时,则Z为-100;
: \: q+ O; b1 w* E a- L3 @对于G#130,若#130=3时,则为G03。
) r" J( _" o; p- m(3)变量的类型
& M+ w9 K i: y9 L& P/ O 0MC系统的变量分为公共变量和系统变量两类。
3 Y/ j" H* n1 O2 q' y3 |3 E' \1)公共变量
+ y( w8 {0 _/ u: x2 p) B- i/ H 公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。
9 b( l" q0 [5 R2 C8 C# K0 U, Z公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。 ! F: i- s0 f' P( N, r/ P
3 e x2 Q' n! n7 `5 _
7 ^" E6 M# y5 E# A# h! q* o9 r8 ]8 L! f* ^
2)系统变量
" D# n( G; U7 r `0 }5 A) T 系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。. D. @. ]( w2 g' F
系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。
& \" _7 k) D! P4 w8 z9 b' R 接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。' n9 `. ]4 x; s+ z
2、宏指令G65
0 _9 T% W% k2 M 宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。/ P$ X1 Y1 _" ^
一般形式: G65 Hm P#i Q#j R#k
) m" z( t9 s4 p" P1 v. K式中:--宏程序功能,数值范围01~99;
& |( `" x& B1 k7 R#i--运算结果存放处的变量名;
3 G3 r0 @2 n: O6 Q, f8 B#j--被操作的第一个变量,也可以是一个常数; k: O4 u& C& ` C& r9 @
#k--被操作的第二个变量,也可以是一个常数。
9 a1 ?' M8 W0 Y7 i2 d1 a5 ^例如,当程序功能为加法运算时:
' s2 W2 D* U9 j程序 P#100 Q#101 R#102...... 含义为#100=#101+#1023 a) G: A/ {3 G' R% [: ~' C9 k
程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#1026 y, r8 G* l: e! F# N+ G) w
程序 P#100 Q#101 R15...... 含义为#100=#101+15 # j( T4 C& W) K5 Y
5 D" T+ x' B) p
3、宏功能指令 / @5 `3 |1 l* r: G5 q
' h, _* b' h- |% R
(1)算术运算指令 0 w1 {' C; s& W7 k/ w) d
/ K |3 k9 R+ q$ f, G% S
1)变量的定义和替换 #i=#j
% t. @0 [, V' i5 z( {: l" m- f4 Y+ s, e
编程格式 G65 H01 P#i Q#j/ q. i) L& a# _/ b
例 G65 H01 P#101 Q1005; (#101=1005)
6 z! k( c U3 d q. K) B: k* dG65 H01 P#101 Q-#112;(#101=-#112) + [" M1 ]. \- I* r" m" c
2)加法 #i=#j+#k4 D) I! }. T' m$ t. @1 W+ z
编程格式 G65 H02 P#i Q#j R#k . ^! @- t. F6 i3 p
例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
) l1 v; @& R9 h0 E4 F$ b3)减法 #i=#j-#k
# V! }& E( I/ D' x编程格式 G65 H03 P#i Q#j R#k
/ c* S- w3 C9 B$ i l0 T- S; Y例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)
* n+ _# N4 G' o0 I5 S/ E4)乘法 #i=#j×#k2 [/ o# c* [" q" ]/ @
编程格式 G65 H04 P#i Q#j R#k
& a! a+ T: b: o3 H! C9 b( q例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)
, ]& J0 w, Q" j% A5)除法 #i=#j / #k
$ Q$ R6 V, j- X; D/ W: P$ Q编程格式 G65 H05 P#i Q#j R#k. Y* B: S/ a- `% @2 }
例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)
! J+ F7 J7 V) G @, B4 x* k6)平方根 #i=
: W1 v; V9 W8 ]' j编程格式 G65 H21 P#i Q#j4 _; h" {6 y& n* O7 {
例 G65 H21 P#101 Q#102;(#101= )8 h' t9 m& ]- M. M
7)绝对值 #i=│#j│% ]0 E- K3 o8 ]5 Z) B8 R
编程格式 G65 H22 P#i Q#j
8 {1 h9 Q' Q( N$ ?) Y( F例 G65 H22 P#101 Q#102;(#101=│#102│) - n% n$ P; U1 \- W$ w7 o( A
8)复合平方根1 #i= & y; L: ?6 S( x% G/ |! w
编程格式 G65 H27 P#i Q#j R#k
+ \0 p1 Y, ~" \' Q0 Z5 g m9 N例 G65 H27 P#101 Q#102 R#103;( #101= l7 ?2 W% p- r
9)复合平方根2 #i=
, @$ g$ i L' z编程格式 G65 H28 P#i Q#j R#k ~, s# W* j! @, s) T, }
例 G65 H28 P#101 Q#102 R#103 ) l! f3 ?) |8 @6 ?( O# l
' \0 K! g9 |+ B3 u/ b
1)逻辑或 #i=#j OR #k
5 ]8 d# g. q, m) Q m( D& {) c编程格式 G65 H11 P#i Q#j R#k
; m0 _3 R x3 n/ o$ H例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)2 T" G7 W7 E# K' X
4 V( h6 q4 }+ F! T: Q7 d0 y
2)逻辑与 #i=#j AND #k+ I- K1 c! N& Z m9 g
编程格式 G65 H12 P#i Q#j R#k4 |9 P. L2 w B! o1 L6 H
例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103 % P( y# J8 O) P
c; q. x' c+ i7 _' z
/ ]2 A# Y/ Y2 s% R% M {" C- L8 E: L$ e
/ a9 P% t9 ~ c6 Z) W+ \& o
4 x% Y; r1 x/ q: T+ I, ~1 ?(3)三角函数指令
: Z2 u4 M* g S( X9 k1 Y9 l# y
" O' u* e# }0 |) z4 ]) y+ r
' l s/ e( Q; `7 O% O7 |2 {1 l0 n9 `- ]4 i& W
1)正弦函数 #i=#j×SIN(#k) . {" x O6 v# S4 M2 T8 A
- a) M4 F2 r5 i! z0 k2 O
编程格式 G65 H31 P#i Q#j R#k (单位:度) .8 Y7 q, v; P, T4 ?- Y
+ ^" V9 o- |; E
例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))( T* I: K+ l$ p+ F
2)余弦函数 #i=#j×COS(#k)% b- \7 o* q2 i* W* o
编程格式 G65 H32 P#i Q#j R#k (单位:度)
; r) l% s5 [+ [2 N, L3 J9 U" Z, B例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))8 P G& t8 W+ [; [8 }7 ~
3)正切函数 #i=#j×TAN#k
! E. h* b5 w7 |$ f! f3 I# h/ M6 |0 C编程格式 G65 H33 P#i Q#j R#k (单位:度)
* z; J1 x% u& h例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))5 ^9 Q; p% Y, ^( V! t
4)反正切 #i=ATAN(#j/#k): B5 G0 E3 B+ U7 B( \
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
& L3 c6 K) m' i6 D. W' ^ ]3 h例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103), D6 u8 I2 D; g1 U6 h' N
3 ]/ U0 Y% h: q" x9 l
+ p, l: V1 d' |
G& h9 a) X: e
(4)控制类指令
$ F/ K; `* Y v$ w: W( s/ X! c* Y+ D! z* q5 w; D2 f# G
2 G+ d q* d- Z) @- M- s' L
1 Q" \6 x. o8 X; } E编程格式 G65 H80 Pn (n为程序段号)
( U9 E0 A( r9 [& j: v7 D5 Q例 G65 H80 P120;(转移到N120)
0 L* l: o+ X% z& V( G2)条件转移1 #j EQ #k(=): Y- b% V; K, O" s2 V
编程格式 G65 H81 Pn Q#j R#k (n为程序段号)' Z y# f& C+ q {
例 G65 H81 P1000 Q#101 R#102
U" {, e9 A6 f% B当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。0 D' W! e0 c2 Q. L" c, R. X+ P' }. a
3)条件转移2 #j NE #k(≠)% i( a4 ^3 r$ e6 [
编程格式 G65 H82 Pn Q#j R#k (n为程序段号)
# [$ \# S8 l. V# [( U+ |' B例 G65 H82 P1000 Q#101 R#102
) z( m. |: D7 T+ g* T. U6 x) L当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。3 S! {4 o: B' U# r5 Q
4)条件转移3 #j GT #k (> )
/ |/ S9 ~, D7 P) }! {5 y编程格式 G65 H83 Pn Q#j R#k (n为程序段号)
5 ` g9 c; f' [ Y: n1 j例 G65 H83 P1000 Q#101 R#1021 d- V) }: @- B' L B
当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。* B* f8 ]8 ~! X) M& |: S% w8 B$ n
5)条件转移4 #j LT #k(<)
$ c+ W/ z+ o- A- r2 e: I编程格式 G65 H84 Pn Q#j R#k (n为程序段号)6 l5 n1 o, e% |2 K) b. B" X
例 G65 H84 P1000 Q#101 R#102
- W( j& l+ |: C- ]8 W当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。! \$ B1 l, {9 F1 T) N# U# u6 D
6)条件转移5 #j GE #k(≥)
: k2 m. K, Z9 H编程格式 G65 H85 Pn Q#j R#k (n为程序段号)2 B; L; k. h) X) t2 l- ^
例 G65 H85 P1000 Q#101 R#102- k; ^3 p6 M7 l& p" v0 ]! y
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。$ \8 O% x, J! J6 F6 _- m5 q
7)条件转移6 #j LE #k(≤)
6 B8 B, L( u$ o9 J c编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
5 f N) f3 R, H3 M' j. U例 G65 H86 P1000 Q#101 R#1024 i5 s8 Z. W! P V' J; S
当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。. @$ [% d, s) T% s
1 Z3 C9 ^$ w+ d% i3 B2 x
4、使用注意
0 G1 T- T8 c* a* ]4 R 为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
% R8 k! g& U7 S$ [(1)由G65规定的H码不影响偏移量的任何选择;
- c# g; o6 W; e) e(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
! R* J. x8 }3 c6 \- z9 u(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。. @5 Q/ @6 w4 J+ k
(4)转移目标序号可以是变量。
9 j F9 B$ ?% ?, S1 ?- I+ W" S, ]/ e& p4 V$ y; e+ M
5、用户宏程序应用举例 :
4 H* n; N# k! y( r0 x+ I3 `: x+ u4 w
5 K% e! `, C+ C7 L9 g用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。 $ P* U. x1 m9 r) X
3 P/ K2 ^* U1 s7 D4 r$ E) ]
使用以下保持型变量:+ Z3 h8 d3 m3 I0 `
#502:半径r;
8 {6 J! J t. C- u8 G" A T1 p#503:起始角度α;) }2 K+ Q d' y: \, q
#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;+ O7 |! p: T7 [2 d `- x6 D
#505:孔底Z坐标值;; ]% c S, A( O# @/ \
#506:R平面Z坐标值;& Y: z2 Q4 J+ x& X2 J
#507:F进给量。
. |0 f1 o; a& `( E. S0 d0 K使用以下变量进行操作运算:
. [& D; G( I8 a$ B7 g5 x: W0 G2 o1 y' o#100:表示第i步钻第i孔的记数器;8 K k# {; m* L2 R! l9 C9 M" r
#101:记数器的最终值(为n 的绝对值);+ _4 a1 c" V& W% b0 O
#102:第i个孔的角度位置θi的值;
4 H, B( b. t: i: m8 Z# B) N#103:第i个孔的X坐标值;& m4 h# s+ e5 ~1 Y" p
#104:第i个孔的Y坐标值;
) s. k& h+ }! m0 x8 m6 {8 C! \用用户宏程序编制的钻孔子程序如下:
$ e; x% I* U; {O90108 t% [2 A; A. U7 w
N110 G65 H01 P#100 Q0 //#100 = 0$ X5 T1 Z* t) g& {! s
N120 G65 H22 P#101 Q#504 //#101 = │#504│' Y% ?# T# |7 C! W3 k
N130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
- {* t' d: N ]7 X/ r. O. o2 RN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504
( S- W* b* l8 L% x& TN150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n, v- U5 u) `2 q; C, z' T3 Z4 l
N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标# n+ J( m% g- z: v F7 }
N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标' e( o/ e! ?5 Y" i+ N$ A' V
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)) D% N3 c4 [# V# W$ Q+ q
N190 G00 Z#506 //快速进到R平面2 b% i' P! p5 ~8 h. |
N200 G01 Z#505 F#507 //加工当前孔
$ [1 N! ^ y+ z3 }" l( GN210 G00 Z#506 //快速退到R平面. m8 s5 e9 w4 F. ]
N220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数
" j! ~2 A4 w; c/ m3 h+ K7 SN230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段9 D/ F4 v& m1 J; D- D5 {
N240 M99 //子程序结束
; v' B9 ?, X% U
3 Y2 s/ l; P5 d8 ` 0 _+ m- @3 r1 q% w7 @# I
% `3 [2 c# v* J调用上述子程序的主程序如下:
$ q* r9 q3 R% g# _O0010
, ?, G( i. ^) ~N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
1 R% ?. ]0 M3 sN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔
! E2 U* R9 M* _1 Z8 E1 O' SN30 Z20 //抬刀
: n" z+ L* k& H2 [4 i+ x$ pN40 G00 G90 X0 Y0 //返回加工坐标系零点 8 G- n% A8 {: i# L
N50 M30 程序结束
! P: x, O4 `2 I: Y设置G54:X=-400,Y=-100,Z=-50。# l6 \: U4 L# R# ]' I
变量#500~#507可在程序中赋值,也可由MDI方式设定。
4 M( h7 Y9 A5 p
1 H8 u! a6 Y: K" PB类宏G65/ ?; `. E# w. U
: A: @1 j- D! K5 P( S9 S
简单调用(G65)& f% Q+ I( }/ k! O' ~& y
功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。
O; c4 C7 p: C 格式 G65 Pp Ll <自变量表>;' u/ x$ r. S2 s9 ^, d O* q
其中: p 要调用的程序号
; e# Q* w! j$ f9 l+ @0 R l 重复的次数(缺省值为1,取值范围1~9999)8 \% f& c6 c" u3 |" Z8 ^
自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应
8 F. k0 q; l8 d/ C: W 的局部变量。
# ]9 y8 E+ Q1 Z: ?1 K% Q, ~3 [
7 h5 h3 m# g* ?. S1 V 自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:! q8 r' q# k) m% N! H* F
4 O+ D B5 E: s2 U地址 变量号 地址 变量号 地址 变量号
/ M' s: q$ e7 wA #1 E #8 T #20
& ?+ G" {) s) ]4 s# wB #2 F #9 U #21
* w2 p! |3 _* @3 O$ fC #3 H #11 V #22
: x4 N4 p* b+ f' F" ?' II #4 M #13 W #23; D' X: S8 z/ j/ y
J #5 Q #17 X #24
/ A5 x( s I7 R8 B! a C7 v" ]K #6 R #18 Y #25* W2 f8 |# k7 t; I" ]! R8 n
D #7 S #19 Z #26) {9 a1 p4 k9 t7 G+ N
☆ 地址G、L、N、O、P不能当作自变量使用。2 b0 h, v$ F9 C4 \1 O8 z
☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。" F; s5 M; q6 P/ q6 I" ^+ y
# j* ^" L* ` q7 G 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使8 C, l4 Y8 ]7 O X0 O! B% ]: g
用的字母自动确定:% A- B$ X2 d; e) N# e: v# f
地址 变量号 地址 变量号 地址 变量号
. h1 g7 \. h" S9 v/ s9 }A #1 K3 #12 J7 #23
! r9 Z" D/ r# ^1 s) P+ ZB #2 I4 #13 K7 #24
; d% [3 j" @; _C #3 J4 #14 I8 #259 e: w. B! O$ x& b2 E" n: i a8 ^
I1 #4 K4 #15 J8 #26
: h4 t% G3 _ X \J1 #5 I5 #16 K8 #27- f }8 Z' [! B {. `, }3 q
K1 #6 J5 #17 I9 #28
* V% D4 @! G9 C; ^/ jI2 #7 K5 #18 J9 #29
7 M$ r% J* b0 V* u( b) w% i8 pJ2 #8 I6 #19 K9 #309 L' E( H5 L6 O5 _" e+ w
K2 #9 J6 #20 I10 #31/ s5 b1 h' M+ Y- a. K
I3 #10 K6 #21 J10 #32$ N" D5 L" ^! d. x3 Y) l
J3 #11 I7 #22 K10 #33* T/ t7 I$ M2 F6 D0 O
☆ 在实际的程序中,I、J、K的下标不用写出来。
# e& Q7 f, D; p/ S/ q* A/ @( G注意:
5 n7 t9 c, w0 F- r& N" u☆ 在自变量之前一定要指定G65。
/ \) w+ \7 a6 K; c/ f0 W% F& k☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
* w& S6 W# p1 t6 M6 ~- v☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。* A+ w$ C; a8 P2 B/ w
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。3 k, ]1 V1 j4 q, r3 m) q/ t- L1 N$ m
G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环
& ]7 u- u& E6 }7 i- H之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|