|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹 2 C# x2 R9 E+ l" M5 n( Y
详解A类宏
- ?* B" a% ]5 `分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。- g$ f' s0 {! ~+ J
用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。2 Z0 b/ F* x" D* X
宏指令是代表一系列指令的总指令,相当于子程序调用指令。: H7 `1 F+ H w6 e+ ]1 l5 |
用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。
' r+ n F7 y7 x# G$ J1 I; H8 f 用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。- b! X6 t+ O. G5 t, F1 l K. c
1、变量
' G+ j# O8 ]/ H3 Q- L) v8 _ 在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。) y f& N4 u; O( F X
(1)变量的表示
l3 l8 x3 ^4 Y% w- B8 ]* E变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
& L! i+ u; {3 p2 C. f+ d例:#5, #109, #501。
4 z) ^6 A, @5 h) P) \5 l(2)变量的引用! P) w- f% w2 G& {- k* T; R
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。; L" G1 E3 W8 ?9 g
例:对于F#103,若#103=50时,则为F50;
6 F: o+ @( \/ X! l对于Z-#110,若#110=100时,则Z为-100;0 r8 ?5 ~# c$ }4 `) |' E! o
对于G#130,若#130=3时,则为G03。0 K' {7 h! r" g
(3)变量的类型
* M4 g3 ]- ?9 L( { 0MC系统的变量分为公共变量和系统变量两类。
. T. }. ]" I$ m) \1)公共变量 - |# f Y& i1 P& \0 C
公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。/ U& A/ ^+ H. }7 K7 b! h7 R
公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。
9 ]7 i9 W: G) Y, g6 B* J* J# O3 A4 ~/ n7 X
; X. l0 C+ I" L& y- f6 ]
b$ ]2 W$ _- L' b1 E9 d2)系统变量 8 w. U' l7 ]- I& H; i G, Q
系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。0 x& j+ c d8 ~ z( o
系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。
: T; G7 [ o8 u 接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。) U7 k' D- S3 p5 P n' ` G
2、宏指令G651 u: j `& V8 f) G- C/ x* t
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。
8 I9 t z* a, |& V5 ] 一般形式: G65 Hm P#i Q#j R#k
; b6 ]# h% K. L! p式中:--宏程序功能,数值范围01~99;
. a `& q' H \; |6 D#i--运算结果存放处的变量名;
" G4 @# `. |& T; k, _; ?- @# Y#j--被操作的第一个变量,也可以是一个常数;
( B$ Q% [* }$ _ b4 ]#k--被操作的第二个变量,也可以是一个常数。; {$ n3 X. C9 n: J1 I$ T
例如,当程序功能为加法运算时:
, A+ B3 ^- O) ?9 [% Z程序 P#100 Q#101 R#102...... 含义为#100=#101+#102 ?& N- r' m' R; U- \5 c: a* d& u) U
程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102! O9 D! H% J% _+ W& s5 ]" L
程序 P#100 Q#101 R15...... 含义为#100=#101+15 * n3 Y/ Q8 t1 _8 i6 o1 \) `
8 i9 e. W8 J2 }; @; ^
3、宏功能指令 ! y( u7 ?0 {2 P5 K" S
& l% N; f. ]9 k) ?(1)算术运算指令 4 D% H9 n7 g9 T. a* \9 f, R
5 ~2 q5 j1 ^* N$ d% Y* L
1)变量的定义和替换 #i=#j * S) y% d2 u. N/ Q
* X' C0 g' J8 n( @编程格式 G65 H01 P#i Q#j
) F" G& j b' |- n8 x例 G65 H01 P#101 Q1005; (#101=1005)
3 ?0 h/ i8 ~0 s2 i2 EG65 H01 P#101 Q-#112;(#101=-#112) 9 R9 [6 V0 G) b0 I7 L5 @
2)加法 #i=#j+#k
; Q6 _$ H% J. k; Z) t+ t( L4 v. O编程格式 G65 H02 P#i Q#j R#k
) x* ~* }- B5 Q例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103); x: ~2 W7 E% l" Z4 k/ t
3)减法 #i=#j-#k9 n# \) b1 C8 |6 G1 m
编程格式 G65 H03 P#i Q#j R#k- | e6 N; F+ Z- |
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103). b( A7 D$ O/ m$ A3 ^! v
4)乘法 #i=#j×#k; Y/ J( o% v: g: p& `
编程格式 G65 H04 P#i Q#j R#k
$ n& z* K5 \ }: g* U0 v3 i X& P( k例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)
. ?3 Q, {. [& K" q5)除法 #i=#j / #k9 A; E9 I+ z" A) `4 G' D
编程格式 G65 H05 P#i Q#j R#k
" x8 Z. Q7 I/ x; O例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)! f$ R& a2 f, C, T- J- v$ I1 T
6)平方根 #i=
$ U$ G( Y8 z* t4 V编程格式 G65 H21 P#i Q#j, s! M- B' }/ H
例 G65 H21 P#101 Q#102;(#101= ); D5 B* w4 c Q# y
7)绝对值 #i=│#j│9 H0 J1 W5 E2 [. O8 t* T! H7 |
编程格式 G65 H22 P#i Q#j5 n3 B; V5 v; r; r0 s l9 P
例 G65 H22 P#101 Q#102;(#101=│#102│) ( ^+ ^( u) W% y* o8 c4 t
8)复合平方根1 #i=
5 J; [9 n( i* p: e编程格式 G65 H27 P#i Q#j R#k2 t5 g8 u! Y G- S/ J7 t
例 G65 H27 P#101 Q#102 R#103;( #101=
4 _2 D) }- a2 ?! i8 ?# M9)复合平方根2 #i= ( h. h0 ^- i* j8 R
编程格式 G65 H28 P#i Q#j R#k# w4 ~- s3 Y0 s( e- [6 J0 c
例 G65 H28 P#101 Q#102 R#103
^$ U: W8 u; u, @" T) Z, H; U5 b/ ?
1)逻辑或 #i=#j OR #k
, L; M, `, c* d* ]编程格式 G65 H11 P#i Q#j R#k
! t& ^) ^8 F1 S. A7 H例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)
' P0 {5 @1 }6 \$ [/ z4 y' L" y
2)逻辑与 #i=#j AND #k* ?4 g. _3 b2 L
编程格式 G65 H12 P#i Q#j R#k9 K n; q: j( U# r" s+ E1 l
例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103 * o) ^0 k' B U7 K: p* C' A; X
% @5 g0 f* y" x8 Z, W
0 R. l/ [% N# j" m7 D" ^2 w
- v9 q ]- Y5 P% i% N; P8 c. N I, A! k# H' ?
(3)三角函数指令
/ z, B1 W+ n% L% c6 K9 O5 b4 h6 A; x! K$ n9 Y
- ?' v; K2 N; b* Z8 |3 M } J, a6 [# v2 k2 J7 C4 y
1)正弦函数 #i=#j×SIN(#k) # [5 S0 a% Q, i% y/ p5 x z
0 u7 o& J5 z& Y( i编程格式 G65 H31 P#i Q#j R#k (单位:度) .
7 X: n& v1 P9 D4 n% J0 ~9 D, e/ V
例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))
0 b* i) e% m( ]# j$ {' U8 u2)余弦函数 #i=#j×COS(#k)- e( p: f6 r* C/ K* o0 J
编程格式 G65 H32 P#i Q#j R#k (单位:度)
" z9 G* @1 e+ q例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))
( G2 O3 m; s# i+ t3)正切函数 #i=#j×TAN#k
1 P2 |2 Y& Y3 [% @# _! K编程格式 G65 H33 P#i Q#j R#k (单位:度)
. P2 d# P1 H4 s例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))
+ m6 z0 t5 D% C4)反正切 #i=ATAN(#j/#k)6 d: K3 e- P. @
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)% ^+ j; Q% e1 R- u+ ]1 i
例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)( J' X* {; ~* m$ p5 q1 \6 _- u
1 f0 C: l; k: z# a- D) q
6 o. u4 z9 m9 |! T0 j- g4 }
; y2 ~& k2 D3 ]7 j(4)控制类指令6 s& {3 n9 r$ F. T% g J3 R
, e7 h6 e4 a8 B; T" Q- a
/ I* }; _! r. }
6 U9 b1 |& f% h
编程格式 G65 H80 Pn (n为程序段号)0 G# V5 }' ?+ ^- s2 _. {+ I
例 G65 H80 P120;(转移到N120)% E8 P' z& u3 r* L! Q/ V& {1 `$ A
2)条件转移1 #j EQ #k(=)
$ J( P9 T1 B4 V6 M编程格式 G65 H81 Pn Q#j R#k (n为程序段号)
- ]. Q2 Q9 E/ w3 E4 c7 B例 G65 H81 P1000 Q#101 R#102
' W: ^ a1 W3 W2 Q当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。+ P( C O& {& Z
3)条件转移2 #j NE #k(≠)/ l4 ^$ ]0 g2 S7 n1 G& z5 V$ Q# V' I
编程格式 G65 H82 Pn Q#j R#k (n为程序段号)
- |- b+ e/ P! b% J例 G65 H82 P1000 Q#101 R#102
; ?7 F c. ?" @+ T% ^& @0 d! x2 t4 V当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。
6 l1 Q t: a( T p4)条件转移3 #j GT #k (> )
3 f; T0 B! L4 [编程格式 G65 H83 Pn Q#j R#k (n为程序段号)9 [8 q; W8 [! `/ ^. F
例 G65 H83 P1000 Q#101 R#102: ?% w+ K# l+ ]' _) y
当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。" b# U# g) ]- ^
5)条件转移4 #j LT #k(<)% ^ D" [( u, L; {: m/ O
编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
# u* a6 o! U$ g' h& g0 N; t( q5 Z例 G65 H84 P1000 Q#101 R#102
: L+ E9 A" |6 Q2 q1 f当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。/ ?$ F4 b- Q5 N0 n$ K$ y7 m
6)条件转移5 #j GE #k(≥)2 K& ]( h, a* h. w/ T
编程格式 G65 H85 Pn Q#j R#k (n为程序段号)" T% S& C1 A, P5 ~: K3 y, Q/ @
例 G65 H85 P1000 Q#101 R#1023 |. { N" e4 L0 J; ?: w' b
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。
1 p; B, U1 b$ b# o& r7)条件转移6 #j LE #k(≤)
- t5 w3 b4 ~- M; j8 [编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)7 s! v# V6 C7 T+ k
例 G65 H86 P1000 Q#101 R#102
& M( W0 r$ k! d: f/ W5 [当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。
1 a% N/ S0 B/ s- A0 P6 T. k2 v
. p1 g; x* Y. J% a" D0 i4、使用注意
; d; m+ {8 C1 }1 ^/ u; M 为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;% h: |- g4 X( _: ~0 g2 u; `
(1)由G65规定的H码不影响偏移量的任何选择;
/ y" K3 \" @' O4 r# n" v(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
7 q# B$ k$ h6 F r0 j: P, ?$ Q; W(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。: p5 g0 U) O3 s
(4)转移目标序号可以是变量。
" f- t: v+ R u2 M! W; [9 w# A, e+ o# j8 l( P4 L
5、用户宏程序应用举例 : ; c( a. S! x ?! ~8 ~7 P$ O
% C/ [1 t3 n) f! t8 {用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。 . n- {( S/ u& t/ @: J
# R7 T: w3 K" ?4 R+ l1 s {" ?使用以下保持型变量:" _ Y! z' S5 G, S/ m% Y& z
#502:半径r;6 q$ q' p9 q9 t! Q. F, n
#503:起始角度α;
% |6 p+ C/ l' e8 {/ q#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;
* e0 ~* P8 v0 V#505:孔底Z坐标值;% _9 {) Q' M* J, ?# |
#506:R平面Z坐标值;
- I+ a/ [, g L#507:F进给量。 q5 x+ K5 T% _& C9 U$ R8 G
使用以下变量进行操作运算:
$ ]& u: E( a% i. _$ L8 ^#100:表示第i步钻第i孔的记数器;
: A8 b5 X3 S% e% G) h* ]#101:记数器的最终值(为n 的绝对值);
+ r% h8 b+ e, L l1 e#102:第i个孔的角度位置θi的值;
& k0 F, s2 b! e* Y#103:第i个孔的X坐标值;
5 r. Y( j3 h* P5 c) `+ Q#104:第i个孔的Y坐标值;0 [( O; o/ ~: u' `7 n! ?- i
用用户宏程序编制的钻孔子程序如下:
, f( T' D5 z' ?9 J& ^5 mO9010
+ S( x+ ~* T; z/ Z1 rN110 G65 H01 P#100 Q0 //#100 = 07 E3 A- u4 M8 i3 {% Q
N120 G65 H22 P#101 Q#504 //#101 = │#504│
; J8 p! ~4 z: Q- Q' [ a TN130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
$ u6 k9 l, W$ k; {N140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504
, M2 N2 e4 {4 k1 pN150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n
) Q9 I4 M6 H. v- `9 K4 lN160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标
0 E1 N2 {+ K- m! NN170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标
1 k1 f9 h, k! _) S, Z3 _N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面); D! G1 j( \ U3 S/ N
N190 G00 Z#506 //快速进到R平面
" _" e; f( S. Q0 Q, E1 l) ON200 G01 Z#505 F#507 //加工当前孔6 g3 h$ L2 w; Y9 \( w
N210 G00 Z#506 //快速退到R平面
2 x9 }$ [9 S0 |N220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数" A" s+ |0 J4 z( S& W/ c4 M! ?* Q
N230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段
- k$ r9 \- s) ]& ?5 b# IN240 M99 //子程序结束
3 M2 k+ L8 |& _) R6 u
9 t& L4 I: _. S# y , N5 v+ ^2 }4 b9 w7 g9 u
* @ k% N9 k5 n3 T& _
调用上述子程序的主程序如下:
" o/ } A I6 \- R( iO00102 W0 v4 {4 m) r( N8 ~0 R K, c/ M8 a
N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
# j" r! F' W w ^& bN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔% R$ {7 J, m* c5 ]# p/ b' r
N30 Z20 //抬刀
' g4 |3 X) Y, S* x- ~( ]N40 G00 G90 X0 Y0 //返回加工坐标系零点
5 \+ ?* O3 f1 pN50 M30 程序结束
: y; `9 A( x" F0 i$ H4 O4 e; ^5 {设置G54:X=-400,Y=-100,Z=-50。
. B0 g& U$ c8 A3 E& \* B- j H m变量#500~#507可在程序中赋值,也可由MDI方式设定。 + W/ G( g. |& F9 u4 h5 O3 b
% @6 J& V, w# `
B类宏G65
h5 |9 t0 U# \0 I! H% Q2 ?) A( |% v
简单调用(G65)
: I0 Q2 r. M9 `8 b" O7 Z/ F' ] 功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。+ {- j/ C' [8 s7 S/ _
格式 G65 Pp Ll <自变量表>;, r6 ^' {0 s. J$ W. z' b
其中: p 要调用的程序号! P' W$ q0 v4 \$ i) F B8 l. y
l 重复的次数(缺省值为1,取值范围1~9999)
6 c2 m$ s5 j6 k& S, l% {4 L ]" y& ? 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应 : l4 D. X& s) ]$ r8 ?
的局部变量。
4 n+ U- W* K- w7 Y* \
! o9 [! M$ t) A. ?+ j 自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:! _% C* P) B- a0 k5 f" f) s( O
0 l, A/ H) q- t
地址 变量号 地址 变量号 地址 变量号+ z. ^' N1 H! i: e' y8 R2 T
A #1 E #8 T #20
2 f: ^% a) [% x u2 _( p2 ~B #2 F #9 U #215 A4 \( c: k; D
C #3 H #11 V #22) m. Z3 ?$ M% |, g! c8 L. g( H
I #4 M #13 W #23' K$ N Q% z1 c, `
J #5 Q #17 X #240 l3 s }% y; ]& D4 F3 {! I$ a
K #6 R #18 Y #250 V! `. Q+ b9 O3 x A/ a9 K
D #7 S #19 Z #26
: O. ^3 K2 S, L7 F% J3 i4 j: G* y( t☆ 地址G、L、N、O、P不能当作自变量使用。
/ l/ x2 Y9 N5 F3 }9 q+ B# Q☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。
8 L0 E0 z; S1 l9 S- @ - Y# n* F! I6 S" [* y
第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使0 C" ^5 R- ^) i2 X0 |, Z8 x
用的字母自动确定:( C+ @% ^- v+ B! \# C
地址 变量号 地址 变量号 地址 变量号
3 ?' r2 }, G7 v7 u" \+ kA #1 K3 #12 J7 #23
2 P2 g' s8 x7 GB #2 I4 #13 K7 #24
2 N4 L- ^$ e8 q+ @: LC #3 J4 #14 I8 #252 y5 S r' j1 c, L! \# E! ~
I1 #4 K4 #15 J8 #26
4 l% ^& a$ m9 {+ x9 DJ1 #5 I5 #16 K8 #27
' j; s& T% d# b! |# r+ U' D. oK1 #6 J5 #17 I9 #28
& w) {; @* \7 a' b/ ?I2 #7 K5 #18 J9 #29- b+ H$ I; ~) P- j5 E
J2 #8 I6 #19 K9 #30
6 @+ |! L- l; N8 q- m, }K2 #9 J6 #20 I10 #31
5 t0 j! F4 p; ~I3 #10 K6 #21 J10 #32, g$ f% U# p% |3 |9 T, ]4 c, q
J3 #11 I7 #22 K10 #33
& x4 S$ p9 g. I, u☆ 在实际的程序中,I、J、K的下标不用写出来。
* ?: f# E$ I3 r注意:
' [0 c; N* P" Q7 {4 N/ ^☆ 在自变量之前一定要指定G65。, b# s) Q. N) z6 n
☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。6 m7 H- k. h1 x% O3 T
☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。7 k3 P4 G; @" g$ T1 }
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。- }2 `+ e. e$ r& {5 D a
G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环
: n& O2 S1 i: V5 I5 ? z$ k之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|