|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹
+ t+ b: z5 h7 X; ~& ^详解A类宏
7 D* R8 n) [- j; i. m4 h$ L分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。1 W, z0 l7 E& {" t9 {; q6 d0 Q+ }/ u
用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。
. i8 B* d0 o% a 宏指令是代表一系列指令的总指令,相当于子程序调用指令。( a- W9 `3 o! f% v: P! l0 v
用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。
7 u/ Z+ L1 y, I, i 用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。8 d w# _3 y0 q' S* |
1、变量/ Y% ?3 n4 i) P# Z1 a6 N# d. J
在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。
! K3 p' e J) I* k* @! m# d) W5 x(1)变量的表示
! d3 L" f2 h/ ?* p- o- P变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)1 Q9 X) J6 z# B" a N0 t# F
例:#5, #109, #501。
5 Z0 Z5 A/ ~' g: ]" [5 O(2)变量的引用
" b* g! ]' u4 N$ c; r; |+ i 将跟随在一个地址后的数值用一个变量来代替,即引入了变量。
( o9 `* F9 G% b# o3 f例:对于F#103,若#103=50时,则为F50;
. f: V9 b4 k5 E7 F对于Z-#110,若#110=100时,则Z为-100;: n' c* `% I& [: S4 x: }7 o
对于G#130,若#130=3时,则为G03。
# ?2 A* h! k# _) N3 E$ ^(3)变量的类型
8 T3 m6 ]- P+ ]' h7 ^3 J 0MC系统的变量分为公共变量和系统变量两类。
. _6 ] ~2 s j# Z$ p" h ^, S1)公共变量
% B1 D7 _8 X1 g8 H! C 公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。; K! q$ |6 f& Q" m2 _; N5 @
公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。 8 {; i* d; a5 P A& K' _2 I7 o5 N
! j* Z; H6 d Q" u6 {, P' g- O4 @
+ w7 A1 |2 P4 W' s
H/ m# H" B5 ~) S' |9 k) c+ ~1 V2)系统变量
# L b: Z% F& ]9 b) V( [1 R 系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。" x/ T* t$ G$ j: J {0 H
系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。
3 ?% _# x5 ^7 q0 T8 B4 X 接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。
; w. o _: n- v* b# O# Y6 N2、宏指令G65$ }( t6 F( r* b: G% J2 q- s' b9 D% o
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。
& ?8 K% o4 B0 K1 B& d: H0 ~ 一般形式: G65 Hm P#i Q#j R#k. e+ o. P) l6 [6 G9 T( A2 g; K
式中:--宏程序功能,数值范围01~99;
# W* k0 E+ ]' b0 m#i--运算结果存放处的变量名;
* I+ M* l! l) X* v#j--被操作的第一个变量,也可以是一个常数;! l6 r. { \+ G$ a1 I9 y
#k--被操作的第二个变量,也可以是一个常数。
& J8 x5 j' P6 F. ?* }* u- T例如,当程序功能为加法运算时:
0 @2 J& Y% C+ v+ o( L5 S& g; R# D$ @程序 P#100 Q#101 R#102...... 含义为#100=#101+#102
3 s2 @2 }1 j6 P程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102
+ z. \0 I- Q5 k, n* h程序 P#100 Q#101 R15...... 含义为#100=#101+15
6 p: L0 g! y' {8 u, ?* b
- `# U( C+ G2 p, i3、宏功能指令
' a6 [) @2 y9 Q6 r6 N6 r8 q' I0 n. N% p! L. `% W9 i1 a
(1)算术运算指令
# p. @9 D% h( V, k( h
* N2 p3 j' |3 {" B {% U( I1)变量的定义和替换 #i=#j * e1 Z! X/ ]( B
0 ?8 F( C5 F: U* t' m编程格式 G65 H01 P#i Q#j
% P. X) e: H/ f+ o例 G65 H01 P#101 Q1005; (#101=1005)
1 _4 L2 g" ^: M* iG65 H01 P#101 Q-#112;(#101=-#112)
& |+ b$ A. `. N/ l- o2)加法 #i=#j+#k T, G% v9 `8 r
编程格式 G65 H02 P#i Q#j R#k - w$ A6 U4 n/ _0 q- c- Q* f
例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
p- i2 `3 p% _) m4 @/ y% t3)减法 #i=#j-#k8 b% x5 j7 q1 k9 A
编程格式 G65 H03 P#i Q#j R#k# i) l, b3 M& G" e O0 Z
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103). d* C7 y; d. ~
4)乘法 #i=#j×#k
! w1 Q% F# [- }6 g; }编程格式 G65 H04 P#i Q#j R#k+ T4 ]; V# t, B( T4 f0 l' y
例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)6 S! S' x" p. _& A0 ?
5)除法 #i=#j / #k2 \$ W9 f# U, x$ p
编程格式 G65 H05 P#i Q#j R#k
3 i* t) r3 F( v# w例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)
1 _7 b( `; L+ G* G6)平方根 #i= " H6 t3 |2 f; ^7 s( v2 e5 j) o5 i& {
编程格式 G65 H21 P#i Q#j2 I) R1 I2 F: }: p7 U& o
例 G65 H21 P#101 Q#102;(#101= )
& q) i8 G3 q- b- }! [$ o' Z/ c/ [7 ]3 o7)绝对值 #i=│#j│
7 O! T3 {" p% Z+ J编程格式 G65 H22 P#i Q#j
7 Z. O }* r# g例 G65 H22 P#101 Q#102;(#101=│#102│)
. G1 K7 ~0 X( ~0 M8)复合平方根1 #i=
`+ y) S& E8 B3 q9 v) S编程格式 G65 H27 P#i Q#j R#k
# C" X$ A4 g8 P+ ~例 G65 H27 P#101 Q#102 R#103;( #101=
; [" l6 D4 L: E y j9)复合平方根2 #i=
! O0 ^# ~* z6 L y( C9 x编程格式 G65 H28 P#i Q#j R#k
6 ?2 q; c8 B3 o8 i6 A例 G65 H28 P#101 Q#102 R#103
- }/ ?( K8 l0 U7 i3 T3 Q
& g" n* b3 ]3 J1)逻辑或 #i=#j OR #k
' S% G1 X# P1 v+ N( X) I e4 {编程格式 G65 H11 P#i Q#j R#k: @9 B3 W# u+ c/ O% X
例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)
" i3 r' V- H/ q- u2 t1 `6 B$ y7 s5 d: o$ y
2)逻辑与 #i=#j AND #k2 ?2 `5 o( O, L* p
编程格式 G65 H12 P#i Q#j R#k$ r9 q& z* ^( _3 k( a
例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103
# ~5 \+ V" @. f: A7 s7 E! ?3 w5 C( _: X' o+ j8 L
* ^# K. D7 S0 W$ x& N Y) {; P
( I O; D% h0 L/ g, ]# I; ?
, w5 B, m( ~; B6 P1 }* m(3)三角函数指令 " c9 s- a( G! F5 t; ? I
" }7 C: A! x% S! k " x) R0 U, ?+ ], z6 ?! v1 L A
4 P9 ?/ [1 V2 C" |' Q6 I, I1)正弦函数 #i=#j×SIN(#k) 2 D7 _& e6 N1 u( c% o" ?8 p0 s
9 I( \3 _. {9 v1 E编程格式 G65 H31 P#i Q#j R#k (单位:度) .
5 D. U' Q- n4 t- e$ u! f5 }- p* Y" {% u% |! I
例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))
: e6 o" {5 a2 Y) m r; g3 {8 m2)余弦函数 #i=#j×COS(#k)
" y; _: I& U+ E0 B' W' F% S2 ], [4 s2 y编程格式 G65 H32 P#i Q#j R#k (单位:度)
; n, W1 r5 |' `" o0 N, h例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))
( m$ g2 s0 m2 W( k! o1 v, D3)正切函数 #i=#j×TAN#k E6 ~) p" ]7 }8 W9 \/ g2 J
编程格式 G65 H33 P#i Q#j R#k (单位:度)
. Q$ {. R! Q7 _1 [例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))
7 p {6 k" N: |% y% j* E4)反正切 #i=ATAN(#j/#k)& Q9 o& V0 g+ ^
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
4 M. u3 k$ p" r I9 n例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
6 F3 ?4 a; w# W* z3 _
% u/ ]( |( \: q& d z4 V& a
$ h' s: d6 E5 ]/ Z7 g. \; o& d/ z# _7 k: B
(4)控制类指令: ^1 b, I! |" y( K# o
4 A- b' G& @6 M3 V5 { # Z6 \( O% H8 F
3 v1 y3 f4 K1 g: b2 a9 ^
编程格式 G65 H80 Pn (n为程序段号)) L" `& e8 h* J1 O
例 G65 H80 P120;(转移到N120)( s/ T/ v- p6 W% R' x
2)条件转移1 #j EQ #k(=)
' x) V/ ^+ o; `- j编程格式 G65 H81 Pn Q#j R#k (n为程序段号)8 ?% |8 O% ^0 |
例 G65 H81 P1000 Q#101 R#102
- K @ a1 A+ v- p Y) l" C k( q4 A( r当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。
) |% d8 Z# S ~- o) a: S) o3)条件转移2 #j NE #k(≠)) D) p& x) z: v( }2 p* s6 P: y ]7 a
编程格式 G65 H82 Pn Q#j R#k (n为程序段号)# l7 |4 H9 ^1 x, e4 X" S
例 G65 H82 P1000 Q#101 R#102
5 \) N- Y, y. B# ]当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。" W' N8 e( [3 r$ l5 P7 x$ E
4)条件转移3 #j GT #k (> )4 ^! P O+ t: s, {' C& C. c
编程格式 G65 H83 Pn Q#j R#k (n为程序段号); |. q$ m7 i: N( K7 t) u0 S( H
例 G65 H83 P1000 Q#101 R#102
0 S, h- ^* X: `/ r# p7 c当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。
7 n; @* p/ G/ ?: M% T' A- R5)条件转移4 #j LT #k(<)
- `" y" {3 w) O; d; _8 R( s8 V4 f+ A编程格式 G65 H84 Pn Q#j R#k (n为程序段号)& f! }; w7 ~+ I, G4 X. P# X
例 G65 H84 P1000 Q#101 R#102
5 d8 ?6 z* o& O w( O/ Q当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。
$ q) X2 ], \ I0 R4 L6)条件转移5 #j GE #k(≥)
/ j% W) R0 x& I! U编程格式 G65 H85 Pn Q#j R#k (n为程序段号)4 ]5 b8 b. {9 V. v, g
例 G65 H85 P1000 Q#101 R#102
2 M" o9 Y+ N* ~当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。
) A2 Y o) A# A1 F$ e7)条件转移6 #j LE #k(≤)
# {1 J- B3 h0 i# i1 s编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
. m& l/ `6 h' T5 z- k1 w例 G65 H86 P1000 Q#101 R#102
6 b: @6 Y8 \& {当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。* R4 S Y+ [6 [" C
! t4 E L" P; s8 |% X
4、使用注意
$ u# H4 B9 x& X: n4 u, X* M# Y 为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
# |& ^; P( r2 @(1)由G65规定的H码不影响偏移量的任何选择;/ X/ t: a$ ?% Z3 a& ?/ l5 @
(2)如果用于各算术运算的Q或R未被指定,则作为0处理;0 ^% v8 K# X- U/ m7 I j. t
(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。9 Q, Z( x( }7 Z' }9 Y
(4)转移目标序号可以是变量。 5 I5 B( C/ P2 [" j
0 C6 B3 L4 O+ D' k& h
5、用户宏程序应用举例 :
3 q( B- W! J1 |5 S' A! A- j/ ^4 _2 j0 C4 m( E- f
用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。
1 d' `# ~: Q7 ]1 A0 b' M; q" q+ Z2 }! }% x0 H! ]
使用以下保持型变量:8 k; ] H1 V3 H% T' w
#502:半径r;
% H3 I3 u( y n# _9 x0 G+ @#503:起始角度α;
( u6 ?0 j! {1 [5 E#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;
N# q# U1 \3 q- u* ^4 I/ f#505:孔底Z坐标值;
. V) k: H+ ~1 Z7 `% Q#506:R平面Z坐标值;; Z5 S5 U- e# v, Y- Z1 V; d4 o5 _
#507:F进给量。
7 a6 e0 ~5 ?3 k: }# P w使用以下变量进行操作运算:/ c' f/ c; W) x/ L H2 q1 g g& N( R
#100:表示第i步钻第i孔的记数器;
6 z+ M/ }" D9 P2 N$ v#101:记数器的最终值(为n 的绝对值);
: |2 t4 J2 {6 S#102:第i个孔的角度位置θi的值;
; n, L7 @7 F9 r/ N9 t; Q2 d! n: _#103:第i个孔的X坐标值;
0 J+ S% O) Y0 f/ \; s4 @#104:第i个孔的Y坐标值;, @$ [# K5 t3 d3 |9 e; Z
用用户宏程序编制的钻孔子程序如下:
. Q7 L6 y% W; XO9010
- ]! H5 B, n! t- sN110 G65 H01 P#100 Q0 //#100 = 0: f7 l+ ], [: ?/ g" T# g
N120 G65 H22 P#101 Q#504 //#101 = │#504│
( {; W8 L2 u" }* FN130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
+ F, i# m b0 hN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504
/ x0 d' B# [: f! y7 h+ d7 g' }N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n( N/ N3 S% [7 |
N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标. m- [+ s4 q1 s* p, A
N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标+ D% U! F9 Q. A Z9 t I2 H1 F
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)
- e& A r3 F6 q# ]; }) e& LN190 G00 Z#506 //快速进到R平面5 u7 x# E5 ? ^, }/ X* d
N200 G01 Z#505 F#507 //加工当前孔! g% k8 G* J4 y& j! ?, I3 o) y
N210 G00 Z#506 //快速退到R平面- Q$ d. K' T9 Z- s+ k- n# F
N220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数
( y- s% n& c& {7 c3 LN230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段
0 g6 ~& z& j! L6 l9 l9 oN240 M99 //子程序结束 0 M( y5 ^8 L" B+ ]5 M/ r' l
9 @9 I0 O7 j' ~' k5 g6 ^ ! b# C* {8 U$ g# w
- t0 K3 G: {5 W# b/ W4 f
调用上述子程序的主程序如下: ' I$ | l* ?1 Z+ ~" N
O0010, Q0 [6 z+ a$ i9 x/ \. d& n
N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
" c2 p A" P* q- q7 zN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔
9 \- q) V, s9 N) p: _# ?N30 Z20 //抬刀
) p0 t& l9 M. s& i, ZN40 G00 G90 X0 Y0 //返回加工坐标系零点 ( R/ v1 a7 j8 I
N50 M30 程序结束& i5 f% ]( e. m0 U* M2 _* Z- e
设置G54:X=-400,Y=-100,Z=-50。9 d5 W" E! c9 ~; Y- Q" o, ]
变量#500~#507可在程序中赋值,也可由MDI方式设定。
3 ?( C6 l& K- Y. }
; e& j7 y3 y! jB类宏G659 Q; q5 P9 V' E+ n6 m! h
( t. x, J; K3 ^8 z, i2 D简单调用(G65)
0 _4 m! b# T) i) r 功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。
7 `8 I* C a S' U: ~4 I 格式 G65 Pp Ll <自变量表>;( c. G& A# f+ C' d7 b2 g0 {. I
其中: p 要调用的程序号
- |# ]* t$ k1 w, V# i6 @- T# I+ ~ l 重复的次数(缺省值为1,取值范围1~9999)/ w! G6 a( S U* r/ _' E; ]
自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应 8 Q1 r H5 q" `# o) f
的局部变量。
3 R2 z) b: c2 ^6 i8 j5 K* }+ O; Q! L/ A2 |
自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:5 a9 H; m# p1 z; S6 U
. m4 Q6 l. W5 n" _
地址 变量号 地址 变量号 地址 变量号
# @4 N( z% n" i& r xA #1 E #8 T #20! Y/ h/ J+ w. c4 R
B #2 F #9 U #216 v5 X6 }8 T V, b8 c( A
C #3 H #11 V #222 k# }% c6 ] ?9 ~; ] a7 |& z
I #4 M #13 W #23
$ R1 k3 r+ F: P6 _J #5 Q #17 X #249 j/ i$ ^8 l+ S
K #6 R #18 Y #25* T* s5 l5 g g4 w$ _6 e
D #7 S #19 Z #26% m1 {# q# `' `" ^" X" n6 E
☆ 地址G、L、N、O、P不能当作自变量使用。
. o% ~9 Z" f" ~5 {' v☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。
4 A3 x* @% E& @$ a; }; m+ K
" J1 T3 e& Z3 D. j- g$ Y! F; |1 v 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使
1 E* c) u% q9 ~: b( Z- M5 K7 c用的字母自动确定:
# W* C g; e8 [. }地址 变量号 地址 变量号 地址 变量号! Y5 p0 z- d) M& {; n6 D5 B
A #1 K3 #12 J7 #23
; Q: x6 r& f3 Z* KB #2 I4 #13 K7 #24. ~4 Y" a% A" h9 d
C #3 J4 #14 I8 #25% {6 _, ?+ U- P
I1 #4 K4 #15 J8 #26$ d0 ?7 k. S; }% [/ _7 E: L& `
J1 #5 I5 #16 K8 #27; }! e& K+ F) h" Y7 g _
K1 #6 J5 #17 I9 #28
- V8 P0 Z" u" X, aI2 #7 K5 #18 J9 #29" v: s1 u+ y; h
J2 #8 I6 #19 K9 #309 _5 B; l3 \& @" f! V
K2 #9 J6 #20 I10 #31/ g" e! h( c( b/ o9 O1 D) o8 H
I3 #10 K6 #21 J10 #32
! C# s3 r1 w! a2 P7 S! |J3 #11 I7 #22 K10 #33 h( s: s( P4 K& @+ r
☆ 在实际的程序中,I、J、K的下标不用写出来。
* ~, E' Z, `2 B9 A6 v# z. X注意:
2 t) F, y, W- w: R6 |1 o* X☆ 在自变量之前一定要指定G65。
$ n- k9 i7 w' R0 t) h. s☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
+ ?8 x" S" S. ~; g6 F: a☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。 ?- |% t* F4 p8 S+ X4 {: V( U
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。
' `' A7 p; O* @ O" k; Q G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环/ s: x5 e I0 j$ G: f) y* q
之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|