|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹
: |1 t/ y: b- H. s/ w$ @/ }" O详解A类宏
; d0 _; R" U0 i. J3 e0 v" [分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。
& p# H' s: ~0 x 用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。: }7 Y0 o: k8 h" o$ X% t- a3 x$ O
宏指令是代表一系列指令的总指令,相当于子程序调用指令。- P6 [% K' {0 n; P* T
用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。1 F; }0 u4 n$ ]' b3 Y; w0 e1 [
用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。7 N$ s4 X( ^1 f! O/ o5 l! q
1、变量
; l. W$ g# m5 t( Z 在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。: E5 ^0 {+ T7 R9 q& k
(1)变量的表示+ R( U; [ n0 X0 }9 g$ s5 H% @( j
变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
4 D: I+ M( t0 v: I例:#5, #109, #501。% H8 |6 ?$ J5 m# X
(2)变量的引用
; ]/ A+ @" Z+ w+ n 将跟随在一个地址后的数值用一个变量来代替,即引入了变量。
t( K( w7 {: g6 c: t& v6 q7 C( |9 q/ i例:对于F#103,若#103=50时,则为F50;
2 W; |# F3 t- s1 P对于Z-#110,若#110=100时,则Z为-100;
5 {/ m8 ~2 b* @* L' ?4 j p对于G#130,若#130=3时,则为G03。
+ l& K+ f* l6 l/ S0 b(3)变量的类型 * K9 T+ D6 i" z0 F
0MC系统的变量分为公共变量和系统变量两类。
- C0 k: q3 E0 L* e5 X$ C1)公共变量 2 D' }5 t; r$ v
公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。/ t' Q5 [# Q& v1 A0 I9 h
公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。
7 h* Q6 ^; j+ P& V3 }; q
' N6 s6 _, k) T+ ~+ \6 Y, S/ x4 b5 q! V; \7 X+ k
* f8 h# }1 F$ [: H; u2)系统变量 , y, q! ^* I/ O- X3 f4 g5 z
系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。% D/ l% \0 B8 ?
系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。1 l1 t3 l1 `- C7 B& z
接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。" Y/ U& @# j/ v- ]$ L2 R
2、宏指令G654 w# p- N6 G/ h- _ q
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。
9 o2 l2 U9 W+ W; K5 o9 h 一般形式: G65 Hm P#i Q#j R#k
5 E3 y! H, J: | u式中:--宏程序功能,数值范围01~99;
+ S; p# N. Z( J' @* a+ K- |#i--运算结果存放处的变量名;
5 r$ g/ v) \4 Q9 T/ `1 _8 P# d6 {( I#j--被操作的第一个变量,也可以是一个常数;+ Q9 i/ w( T0 `% n
#k--被操作的第二个变量,也可以是一个常数。) ?4 B8 O+ l' b! h
例如,当程序功能为加法运算时:
2 b* d( s4 i8 h8 Y2 r# L! f程序 P#100 Q#101 R#102...... 含义为#100=#101+#102
* T1 n$ J- D- ?% O程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102) g4 a; e! D6 ?
程序 P#100 Q#101 R15...... 含义为#100=#101+15
0 \5 ]4 x+ Y5 I" T: `+ p
7 G& l& b' h% [. B( M3、宏功能指令
; ]: J0 _% C# R" g' w, b
6 B* Z: b, w$ Q# x(1)算术运算指令
' X, Y! F) y- g X' u+ h2 G% y+ u
1)变量的定义和替换 #i=#j . P8 F2 j8 N& m& `# U
" I, u9 R" h; {% U/ z' i编程格式 G65 H01 P#i Q#j+ c5 T- f- a0 s
例 G65 H01 P#101 Q1005; (#101=1005)
3 @% [* ~+ N0 X# bG65 H01 P#101 Q-#112;(#101=-#112) % Q# I, e; J) L5 L9 s: m7 n! m
2)加法 #i=#j+#k8 S2 M/ `, E/ w8 u' Z
编程格式 G65 H02 P#i Q#j R#k
, ]6 U, z/ {# E9 _$ @# E$ s0 v例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
g) f: I# `* v& ?, t+ n6 ]0 V3)减法 #i=#j-#k' W: z! v8 l; l, s4 p5 A3 r
编程格式 G65 H03 P#i Q#j R#k
+ \* g% z0 X1 n V4 `( R: _' |+ I例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)) X1 d |7 Q$ \4 c0 [% b
4)乘法 #i=#j×#k
4 r8 ^& H- u# X7 m# m% x% H$ h编程格式 G65 H04 P#i Q#j R#k8 Y9 i" p8 h2 P$ s+ P" _* e
例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103) o/ q3 z8 _& y& ]' _
5)除法 #i=#j / #k" s, G9 W# B8 A
编程格式 G65 H05 P#i Q#j R#k
/ L5 e/ n+ n' t* t1 |4 `& O, ^1 N) O例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)! Y1 W. F [' c* U0 P0 [9 [+ R+ d
6)平方根 #i=
* o3 V) S8 p6 N+ Z编程格式 G65 H21 P#i Q#j" J: {0 ~6 E3 Q" F
例 G65 H21 P#101 Q#102;(#101= )( A0 ]0 U0 w P; H' H% F' q6 |
7)绝对值 #i=│#j│- \) j( Z% z8 Z% F$ E
编程格式 G65 H22 P#i Q#j
! T4 `6 S3 S3 V* E5 U7 N例 G65 H22 P#101 Q#102;(#101=│#102│) , }/ s1 t1 Y2 i' J& u2 ~$ m
8)复合平方根1 #i=
+ Q! O' c. u* V: b; q# t编程格式 G65 H27 P#i Q#j R#k6 G1 N& `" |. l
例 G65 H27 P#101 Q#102 R#103;( #101=
6 E3 K& l& ^: c# M! }" e* g9)复合平方根2 #i=
; F. } P/ T; K6 m% S7 B编程格式 G65 H28 P#i Q#j R#k$ E7 _* q9 s8 ?
例 G65 H28 P#101 Q#102 R#103 ; A" S/ g2 W( ~* H
+ D$ z: w4 n$ F2 O9 r
1)逻辑或 #i=#j OR #k
" M1 d" l6 a% N8 I编程格式 G65 H11 P#i Q#j R#k) \5 `! K0 G+ ?# Y1 V* E
例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)! j. p" l, i* a; f; _7 l
, }8 t; C5 R8 F# z/ y2)逻辑与 #i=#j AND #k% }# i5 r, a/ q0 T2 }6 {2 T' S7 \
编程格式 G65 H12 P#i Q#j R#k
4 k/ J' {6 d o" p {例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103 ! ~! E+ n* y* W. A/ x1 S
M; p+ e' M% h0 [
( d' e) t) e/ M
( G, D5 M: P, @9 J/ q
3 _( q' v8 Q4 x+ |% B' ^(3)三角函数指令 - s$ M4 Y ?' {: t: N
5 U" r. t! q L* J' K& w& |
) G1 e4 P$ E3 h% J
( k+ n" j3 c8 J+ g) X1)正弦函数 #i=#j×SIN(#k) 1 j+ x6 n$ e; k" ]: t
/ u2 ]# d4 d) w编程格式 G65 H31 P#i Q#j R#k (单位:度) .
8 H, n8 I& h ?* `- v3 O; U! l; c6 F p; d
例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))* k6 D! k' L4 F7 R/ u& Z
2)余弦函数 #i=#j×COS(#k)4 g" A6 Q' s5 W' t3 x+ ~ Q
编程格式 G65 H32 P#i Q#j R#k (单位:度)
5 s& {( l' `7 ^- k% {例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))7 P) j% B8 Y" v; ]
3)正切函数 #i=#j×TAN#k
* D3 d5 X3 Y' b* i4 ~2 P编程格式 G65 H33 P#i Q#j R#k (单位:度)
: X0 h2 S# O( h例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))* m+ C4 `: R$ ?$ L* E
4)反正切 #i=ATAN(#j/#k)# A0 p( n6 w6 L' f1 u8 H. B7 t5 K
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
0 y8 g* ^" Q" I例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)6 q4 i; Y1 N. n0 }5 X
: K/ n e7 C& Z! b S9 h
5 _( u1 ^2 j0 Z( f& s9 w9 ]
2 O1 x3 I& b" l3 _# z1 d3 a
(4)控制类指令) v" M5 d, L, h# E) g
4 G$ T v! V+ _* T# c4 | `
8 W6 k8 h5 E. E: z1 U! L$ |) s+ c% v9 y# [4 c
编程格式 G65 H80 Pn (n为程序段号)
) k. P' M9 W) I3 n0 N4 d- _例 G65 H80 P120;(转移到N120) h! G5 k& j, Z
2)条件转移1 #j EQ #k(=)% p9 L; S5 H4 F4 L$ L; c* _7 E2 ~
编程格式 G65 H81 Pn Q#j R#k (n为程序段号)
. {6 l! E) U, l. W8 u例 G65 H81 P1000 Q#101 R#102. ~- O; S5 K8 t- u$ m
当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。
* ]% B+ A( R. X0 G( ]5 @3)条件转移2 #j NE #k(≠) s! n' v: M5 w9 B+ o
编程格式 G65 H82 Pn Q#j R#k (n为程序段号)0 y6 o7 B; X! Y' m9 H& O
例 G65 H82 P1000 Q#101 R#102
& f9 U/ D! e$ h% P当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。$ D+ H# w) b% N
4)条件转移3 #j GT #k (> )
$ N" G* P( }* I+ k4 B8 u编程格式 G65 H83 Pn Q#j R#k (n为程序段号)4 P' T4 c: F& T) r, I" g: |
例 G65 H83 P1000 Q#101 R#102
- ?! X& a! Z0 e7 L. }" _. _当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。
; R5 J. H" V* ^, f9 ~8 s2 E5)条件转移4 #j LT #k(<)6 R0 K8 s/ o! y0 ^* W7 \! `# L
编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
! G) x% f9 X$ k3 @' ]. a ?; x2 z例 G65 H84 P1000 Q#101 R#102 + d. x' n s, @3 G3 b! \5 N
当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。
' d* e) q* _" m$ _0 Q6 A4 z+ U6)条件转移5 #j GE #k(≥)
9 _1 \% H0 t. A. F: l2 U编程格式 G65 H85 Pn Q#j R#k (n为程序段号)( F# q/ T$ v- Q5 ?
例 G65 H85 P1000 Q#101 R#102; M" ?0 B4 o- o7 q8 _8 {+ H# e
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。
: D& R3 p( R/ l s* S7)条件转移6 #j LE #k(≤)
/ }. m* J0 F3 \7 v编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)) X; H6 k5 E& u) [' o! l9 ^) y4 ~% I
例 G65 H86 P1000 Q#101 R#102
p2 y! ]- ^3 u/ R当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。, A v/ F" ?3 L* Y! E) X
. u0 ?3 `7 o1 O4 ?' Z- _' }. a; B
4、使用注意
7 \- F+ Y- E% ~, L& W8 `/ a' C 为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
2 |% s/ O' e" J9 [$ _(1)由G65规定的H码不影响偏移量的任何选择;
0 K7 u8 A) u! d(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
1 W) o. ?1 z7 K(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。) {2 h9 @. U P, }
(4)转移目标序号可以是变量。 $ g7 ?2 K% H/ F' A
) j. d4 i2 }8 S% X; j0 A: |0 A5、用户宏程序应用举例 :
, L0 `1 a. G, A6 V' x# N7 c
{ N. h. `3 D+ U# Q' Z用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。
* W9 R! N/ E3 B1 B. r4 W3 e( [" J" E" q
使用以下保持型变量:
) p5 @) L, a/ o* \# \2 x# r#502:半径r;1 g" l6 Z. g- C" c9 h) d. f; s
#503:起始角度α;
2 V% o6 y5 F9 i& X: ^/ r* ^#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;
# T" S4 }( _3 M( c8 T/ w#505:孔底Z坐标值; A5 G8 e. k6 b# i8 N
#506:R平面Z坐标值;* P4 S) J6 c% \) X v+ P0 D
#507:F进给量。
& i+ L3 M0 y- q4 o/ m! f使用以下变量进行操作运算:
, c5 X s* {0 n* p& N#100:表示第i步钻第i孔的记数器;7 H$ a; J" w9 S: f: H- n3 j# T
#101:记数器的最终值(为n 的绝对值);9 c/ V. T* f/ Q" e6 u
#102:第i个孔的角度位置θi的值; # S& n% q# {' _7 I+ T1 {
#103:第i个孔的X坐标值;, K) ^0 Z" x9 `0 z* W
#104:第i个孔的Y坐标值;# g4 u7 }; C: K8 R2 d
用用户宏程序编制的钻孔子程序如下:
# ~3 x( l: G9 yO9010+ F$ i) I: v/ W( U* u+ f
N110 G65 H01 P#100 Q0 //#100 = 0
) [$ t" x# m' v5 o6 z5 S1 u1 C: WN120 G65 H22 P#101 Q#504 //#101 = │#504│
/ a! S- G1 j: ?" D/ XN130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
0 W% ~& e$ f; U; O$ TN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504
; X+ h" n+ D7 X6 u6 D7 NN150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n# k9 F# C% l. c; [. f$ S
N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标
/ X9 w% X C* G! m5 J1 {$ `- [N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标2 d9 I [" r) f1 @: ]
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)
n# u3 y7 c3 t/ C6 |3 H; ]8 MN190 G00 Z#506 //快速进到R平面& c0 Z8 Q* o8 M9 Z) F- r
N200 G01 Z#505 F#507 //加工当前孔. ]& `2 `1 c2 T0 Z
N210 G00 Z#506 //快速退到R平面
1 K1 R2 B+ {8 d8 I2 f( J1 R1 vN220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数
3 v/ A+ S! K+ m H bN230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段3 k3 g( {# t+ L c, D4 r
N240 M99 //子程序结束
/ L8 y6 z' P; B( S I5 \8 X5 u- I9 c* m1 D& P
: u" n V6 T! t& ?# ?
: W* o* I8 \7 s- K6 S0 s. A
调用上述子程序的主程序如下: , |6 k* F% J: T8 Q, I% X% l# U' F
O0010' I6 s# z* ?- o
N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系( e/ d- g! ~. o4 q& _
N20 M98 P9010 //调用钻孔子程序,加工圆周等分孔( f# J+ ]' ~& x& r# t# w
N30 Z20 //抬刀
7 x h9 c1 n7 H/ r; G$ }N40 G00 G90 X0 Y0 //返回加工坐标系零点 - P t# ~2 M+ S+ n% O; I
N50 M30 程序结束
' M! `4 I- J/ U- G% F1 {设置G54:X=-400,Y=-100,Z=-50。" }% f) B7 T9 ~$ |8 ^" y
变量#500~#507可在程序中赋值,也可由MDI方式设定。 . r4 k' |9 ~7 T
# x, |% L$ q2 Q; L/ i5 kB类宏G65
- S8 `; {- E0 U1 F; J
8 I: v0 c& m1 S0 Q8 J简单调用(G65)6 r" f) G, Y7 H$ e1 C
功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。3 D; C& U' z) n1 o
格式 G65 Pp Ll <自变量表>;% K# M, k* U' I1 ]
其中: p 要调用的程序号/ i' g6 N- N1 e' O
l 重复的次数(缺省值为1,取值范围1~9999)
+ e" t/ l) Z! v; A 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应 0 N! g C. \. P( n6 j3 q
的局部变量。1 @' X( L" H- H9 s3 ~) P" V
9 N2 ] n2 o7 i3 d
自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:* {" c+ j8 }( J8 p- e8 U
# G; n8 b1 |0 P4 D4 @地址 变量号 地址 变量号 地址 变量号, ]. R$ e! F0 g6 B; g8 @$ P- O5 c
A #1 E #8 T #20
* |8 h( |( E" a8 Y$ fB #2 F #9 U #21
/ w/ W9 G, I6 P; G+ w }C #3 H #11 V #22
5 w& T1 K% J( k' E' ]I #4 M #13 W #23
; i' k# K5 E8 p& v1 BJ #5 Q #17 X #244 x; d6 \4 n# {4 Y- z# K
K #6 R #18 Y #25
2 g$ G O7 ~+ B8 _6 f) nD #7 S #19 Z #26
* L& E: [ Y0 Q☆ 地址G、L、N、O、P不能当作自变量使用。
! O8 s: N6 j6 l/ n' h3 ?☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。6 y4 d2 H. w; A* y0 n
0 M v0 D8 Y( [; N( K 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使. w' _; K+ Y+ b8 [" f% j
用的字母自动确定:$ i( }- c7 E3 a' S y
地址 变量号 地址 变量号 地址 变量号# y# G, n9 m7 k; f7 [+ u
A #1 K3 #12 J7 #23
' B! y" j" O: K) d. zB #2 I4 #13 K7 #24- f( Y# F1 h1 k
C #3 J4 #14 I8 #252 T/ Q t+ X% B8 w
I1 #4 K4 #15 J8 #26
' D) r8 O$ t4 k& e# F7 PJ1 #5 I5 #16 K8 #270 b! P G, b$ L. v1 A5 O G
K1 #6 J5 #17 I9 #28; w( B& d! O5 {, Z; ?7 w
I2 #7 K5 #18 J9 #29
5 G% C4 l/ g6 y! g; q3 R2 bJ2 #8 I6 #19 K9 #30
! v; p% Q2 O- hK2 #9 J6 #20 I10 #31
' @( U6 Z$ p+ x- V6 Z3 d$ i$ WI3 #10 K6 #21 J10 #32
F8 D5 Q: k- N6 ^: RJ3 #11 I7 #22 K10 #33
# I1 g' B# f l& Z4 v6 }2 ^! E6 Q☆ 在实际的程序中,I、J、K的下标不用写出来。
/ |& i) g' f8 w% S' R注意:0 e% Q& j% N' k8 X# l
☆ 在自变量之前一定要指定G65。6 @4 Q q" }8 m9 s
☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
# j2 b$ ^2 R" c4 d% _5 R2 i☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。) @- W1 ^" E5 J/ T5 e
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。
- c; L% O9 ^/ w g2 j G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环
- Q7 b, l) e' X; m5 B# d之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|