|
|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹
0 K7 _. {* i% p0 K: ?9 D详解A类宏$ R( r; j" W" k& O
分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。
2 ^1 P6 z5 |8 y) j 用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。9 t% e; L" z2 R# y
宏指令是代表一系列指令的总指令,相当于子程序调用指令。: z6 |3 z* n4 s! b5 G; m5 x
用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。0 M" a2 X0 O' \" v% Q
用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。$ ^+ y4 [2 W: H2 ]/ j0 i
1、变量$ L) K# } {# I
在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。
1 n" ^9 j1 F! i9 Z& k$ A7 Z" d(1)变量的表示
6 p; ?/ L/ R- Q2 T& @' A2 T1 \变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
' o4 t9 H# I: S& T& ]例:#5, #109, #501。
5 J+ [* S, E6 D(2)变量的引用) O5 h }9 F b% ]4 g& q5 y' u
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。/ s6 r) q; U" l. [. r1 \& d, j& n
例:对于F#103,若#103=50时,则为F50;; Z6 o( P0 y3 @/ ^
对于Z-#110,若#110=100时,则Z为-100;
, Z l( f% B, L对于G#130,若#130=3时,则为G03。
9 i8 T* ^( ?+ m8 S' D(3)变量的类型
$ V' n7 l7 Q7 t8 @$ r* F+ M* @ 0MC系统的变量分为公共变量和系统变量两类。
9 E. z0 c2 H( A- x1)公共变量 & A, @- h1 v8 B- b- c
公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。0 G P9 t; L; o H% a# @4 K
公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。 , D6 Z( f: C# n0 X" h
3 O- l& b8 P4 a/ X6 v7 T: w( u
! [: |7 q2 P4 X
& d1 \& A( i# |3 P, Z( O
2)系统变量 0 h0 ?- A; U0 G5 Q, ?8 P7 X# @
系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。; j' Y1 J* z: k% x; F" e
系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。
( E: Q! I+ {7 A5 \+ F* r# e 接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。
4 ~7 C" n2 s* l. }2、宏指令G65) z- _1 e# K; y6 Q( x8 U; U. {
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。
8 ~9 e. Z' j7 E0 Z2 L 一般形式: G65 Hm P#i Q#j R#k/ d3 w6 [2 ]# @( v
式中:--宏程序功能,数值范围01~99;
" F7 q, J: U0 H" |. q; Z2 {#i--运算结果存放处的变量名;; _6 Q( v* o5 N+ ]2 ~
#j--被操作的第一个变量,也可以是一个常数;
3 t3 ` z/ r/ \* o#k--被操作的第二个变量,也可以是一个常数。- M" Q, l( B1 Y) e& d" O7 Q
例如,当程序功能为加法运算时:' |* T( U5 F" n3 a9 X5 [! e5 U9 w6 P
程序 P#100 Q#101 R#102...... 含义为#100=#101+#102, @" t+ _& A: E O+ H8 d8 @. |4 o2 w
程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#1029 X. P0 E4 K4 U+ v: s9 \/ e3 S
程序 P#100 Q#101 R15...... 含义为#100=#101+15 4 d5 a* o7 F) R7 ?3 Q" n5 _+ X1 i* M
?: G1 q, E0 E' T7 r, j* G3、宏功能指令 4 O% v( b0 R, S) g8 i
( j Y# a/ V- ?+ M(1)算术运算指令
+ G4 A, ^6 l. x
* i0 y9 b4 f/ N" e$ }1)变量的定义和替换 #i=#j ) e) L' @, x2 q: \8 ^
$ l& S' y( s3 ?0 r, c
编程格式 G65 H01 P#i Q#j
# K; f9 c8 S# i+ a6 U& M例 G65 H01 P#101 Q1005; (#101=1005)
" M' {' c; n; t0 o) c$ C, r: F1 jG65 H01 P#101 Q-#112;(#101=-#112) ! d' X- n( I3 a4 M
2)加法 #i=#j+#k
$ a- D& z( |( Q$ s$ e5 O* F编程格式 G65 H02 P#i Q#j R#k
# F' _4 }4 [, c8 B例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)- }8 `- r/ U+ c9 w0 b8 h% T, C
3)减法 #i=#j-#k4 {% ]) m8 r4 y$ h
编程格式 G65 H03 P#i Q#j R#k
% Q8 b6 g/ u, A* [8 `/ Y例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)
4 _5 Q" M: C( J: Y$ b& @, t$ C+ O5 f. A4)乘法 #i=#j×#k) p' X5 q) z* K
编程格式 G65 H04 P#i Q#j R#k* H7 i) j+ W; A
例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)" o( o; M% P3 R
5)除法 #i=#j / #k
8 l% p: U; |% N1 n编程格式 G65 H05 P#i Q#j R#k
; A* \7 `0 L6 Y% s% g例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)
! n) ]' }1 A! h3 }) V: o4 s6)平方根 #i=
2 ~7 u; n: j# I ?3 {, t. O9 t6 R编程格式 G65 H21 P#i Q#j0 C2 `4 K4 O7 P' ]+ R% i8 z* P* W
例 G65 H21 P#101 Q#102;(#101= )* K' g$ G: x( P6 o* g, S
7)绝对值 #i=│#j│
4 \% J% _; ?) | N( V编程格式 G65 H22 P#i Q#j
1 K) Y0 {8 N: a: V例 G65 H22 P#101 Q#102;(#101=│#102│) ' M4 q# D, ^5 C5 }
8)复合平方根1 #i=
3 G8 i6 x- u' w0 A. L编程格式 G65 H27 P#i Q#j R#k+ b" j/ X" `) M" H) A' u! S
例 G65 H27 P#101 Q#102 R#103;( #101=
, v% E( a' @7 m' {9)复合平方根2 #i=
$ o) z4 Q* y5 d% ~0 A' [编程格式 G65 H28 P#i Q#j R#k, S3 O# T4 e8 Q9 v" W
例 G65 H28 P#101 Q#102 R#103
+ _& l( P% D0 c" z. z$ `& x* g/ Q& |; Q( ^) D' P: \8 p, V
1)逻辑或 #i=#j OR #k6 E& i4 J# }" v. x7 }( l) A0 i6 r
编程格式 G65 H11 P#i Q#j R#k
; _/ X H' G% \6 g7 f& L% L例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103), @: O) Q- w" B/ r9 `
' J) P; V' C: U4 `2)逻辑与 #i=#j AND #k: c, L: P& w# {4 f9 A6 J
编程格式 G65 H12 P#i Q#j R#k
, h$ A, l6 n' x# o ]5 p/ k6 _例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103
/ k) _" E( w5 b. q0 `9 P% r
/ _# y" l' m( ?2 C, Z: \
. {* ]' Z9 _+ Y. {& r# m8 v . M3 q( K6 d8 b6 s) }
) |) f& F0 U: F0 J- M- p
(3)三角函数指令
! w# L1 [4 ?2 S0 `5 y6 l7 {) N0 f3 ] p m5 q7 _9 w% p
% U9 D+ J- M! l, j
; B# _0 u# M6 n$ Q' j
1)正弦函数 #i=#j×SIN(#k)
4 Y+ U8 d6 J9 G) G* O# b. \) e! _8 E6 i2 K2 m- N
编程格式 G65 H31 P#i Q#j R#k (单位:度) ./ A( W+ N% n2 j; U' z5 g
4 m! B0 o- I+ [
例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))- N, \6 i; s& w5 g( M' e/ e
2)余弦函数 #i=#j×COS(#k)( E7 v6 ^ X2 B; j9 F9 V9 C$ I
编程格式 G65 H32 P#i Q#j R#k (单位:度)
& p/ ~6 D1 |+ R6 u1 U例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))+ q, X% }$ R7 E, N% }
3)正切函数 #i=#j×TAN#k& U' U7 G7 S9 @7 J7 U- N
编程格式 G65 H33 P#i Q#j R#k (单位:度)/ R+ _ h! p% ?/ a; k
例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))- l* N+ J+ v0 y( c/ n6 |
4)反正切 #i=ATAN(#j/#k)7 q7 r3 Q( l5 W6 x4 C% }0 Q
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
! T% N8 l4 Q$ O1 |# I2 Y例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
+ r; `2 n8 D- S- [. [' f
) m) I6 P) J n3 X5 R7 Z
1 d3 w. X7 q- N6 \1 y0 _
4 J1 k! I, R% M3 k(4)控制类指令
* m' E! t3 ]7 }+ H) \# o, r; I& `5 a0 a
: L. l3 f; D8 P0 r+ K
5 }2 K+ Z/ q! ^0 [7 E! h! W* a编程格式 G65 H80 Pn (n为程序段号)( b% |6 B6 e# ~& k
例 G65 H80 P120;(转移到N120) y- @- I6 D3 l7 w7 d9 @8 ^
2)条件转移1 #j EQ #k(=): _1 j2 I5 {9 ?6 R! t8 E
编程格式 G65 H81 Pn Q#j R#k (n为程序段号)1 Y, Q" |! H1 M. G6 y% b" Q, p
例 G65 H81 P1000 Q#101 R#102
! s4 d$ G, V$ k8 s/ x) n! R4 y& D当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。& K' B% M. h8 ~5 S
3)条件转移2 #j NE #k(≠)
/ |8 v% W' A! i7 L6 `, s" t: |编程格式 G65 H82 Pn Q#j R#k (n为程序段号)* d3 s0 O1 h2 F+ f# U5 N
例 G65 H82 P1000 Q#101 R#1028 y3 V6 U/ A1 h& c. ~# D; q( P4 C
当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。 n! d2 {. G8 X9 [/ ?9 I2 M2 Q
4)条件转移3 #j GT #k (> )
* W" N# ?. p" E- C) m2 T编程格式 G65 H83 Pn Q#j R#k (n为程序段号)8 E! e8 _/ ^, Z# e8 N2 x
例 G65 H83 P1000 Q#101 R#102
! b/ L6 g, V' y. z当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。! Y. h: Q/ W+ m7 K% A1 _: F
5)条件转移4 #j LT #k(<)
/ ^4 [+ Q) N/ T" X. V编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
# t, b Y1 W, B, p: ]0 u, q; y例 G65 H84 P1000 Q#101 R#102 3 h, V* M1 ]* z& x6 i
当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。0 } ^9 H- z# h: Y- ?) K$ j# {
6)条件转移5 #j GE #k(≥)! W% @, e% `) }* L
编程格式 G65 H85 Pn Q#j R#k (n为程序段号)% }+ {- k# h3 z% B; v
例 G65 H85 P1000 Q#101 R#102- g4 i, K1 J/ } m1 E0 y
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。5 \, ^' b. Q( E" I
7)条件转移6 #j LE #k(≤)$ W0 K, O. i0 r' C s( L
编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
& l1 Y: p6 @ E: t例 G65 H86 P1000 Q#101 R#102
4 c H* ^8 |3 p( |4 H当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。
" i) O" D- ~$ L1 I+ l J6 E d0 N
! O3 b" f2 u6 L5 |+ z/ c/ Q8 a4、使用注意
9 |" r0 r# {; E5 V1 N8 K( l& m 为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点; R& y' |* I* A$ o. |& ~. H' S
(1)由G65规定的H码不影响偏移量的任何选择;
# R. _! g# [) r(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
+ J$ a3 [5 V, g; h; j$ w(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。7 I6 W! g. P& z; V( Y
(4)转移目标序号可以是变量。
; g E6 R- l7 \+ _9 J: }% W% G: V3 j: r7 I5 H& u
5、用户宏程序应用举例 : . |9 B; H) a% p" V P& n. Y
' U8 X( Y6 v: A: n
用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。 % p R2 n% l' M! d( I
5 C" v, u; B" L1 a3 J0 Z5 _
使用以下保持型变量:4 D6 R, Y6 a1 Q: {/ \# Y
#502:半径r;; m2 o- I# j* Z& X6 D Q
#503:起始角度α;/ c( G# F. L- @5 p" J2 L+ @2 b
#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;, t R! A' V: a
#505:孔底Z坐标值;& u0 x) e. t, w/ P" d
#506:R平面Z坐标值;
5 c% b3 u5 N% I& e+ e/ y" D, f#507:F进给量。 0 T; N. D. ~1 {# q) L
使用以下变量进行操作运算:
4 \( N$ V9 [: s0 ?9 g( v#100:表示第i步钻第i孔的记数器;0 _* ?) p1 A. @
#101:记数器的最终值(为n 的绝对值);
3 r% o6 m N8 m#102:第i个孔的角度位置θi的值;
6 i. X9 a# m& c0 a9 f#103:第i个孔的X坐标值;
0 @3 M% \; G! S; B" \#104:第i个孔的Y坐标值;- P% n, v" q2 S( F
用用户宏程序编制的钻孔子程序如下:
1 S3 {1 ^- V' G$ z) P- \O9010
e: A/ C j' U ]3 ]N110 G65 H01 P#100 Q0 //#100 = 0! X+ x, q) C% U) i ]
N120 G65 H22 P#101 Q#504 //#101 = │#504│9 }+ R9 O7 H7 J. ] Y8 S
N130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o O; v. @# _; {! V: d& b
N140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504- v5 a$ u! f) M% x, Z# }
N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n
. Q0 N, b& e3 q [N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标( y% {' [/ ?! I& b
N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标
' S. F" B& ?$ _; k5 TN180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)2 [! e3 i+ ~: l! k5 J D
N190 G00 Z#506 //快速进到R平面
; k5 U+ E( d9 {- s7 ^: }N200 G01 Z#505 F#507 //加工当前孔
$ ~# O4 k: M: `' O& u6 fN210 G00 Z#506 //快速退到R平面
, s0 w( ^" w# Z+ @" iN220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数# F2 a; d& W2 \ M$ g) ~% X
N230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段& X: m3 p4 d3 G5 t8 y3 w" w
N240 M99 //子程序结束 ' S* d6 Y! W- [, h; c5 [
# o6 ]2 q( h: o; v
6 W* J9 N( j4 Z' Z" r
7 d& M' y/ [3 ?6 k& T' v
调用上述子程序的主程序如下:
) l0 t3 k. H! Q L$ o4 EO0010
- z/ ~0 [2 K* T: FN10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
3 h$ L0 N& u+ r1 [, e+ r( s1 xN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔
9 d4 V6 u, G+ o4 K: T7 m4 V2 KN30 Z20 //抬刀4 Q# U; e- x7 ^* W! F
N40 G00 G90 X0 Y0 //返回加工坐标系零点
( j1 j& F o9 _" }2 v% ~$ mN50 M30 程序结束. E' u Y4 s7 Y$ @/ u* c% T
设置G54:X=-400,Y=-100,Z=-50。
" H6 M0 I) f! i变量#500~#507可在程序中赋值,也可由MDI方式设定。
, a4 y4 n$ j$ \; [+ Y
b4 f9 u6 |) G; Z8 d% o- C* K3 {, CB类宏G65 \) m/ R* p2 M
B! v( V. |5 i0 ^# I
简单调用(G65)
1 Q5 O- {9 Z2 R6 p: E) ~, Q; { 功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。& Q4 e, v2 F# r) t2 Q7 t
格式 G65 Pp Ll <自变量表>;% V0 C; t1 V/ Q
其中: p 要调用的程序号
, S) n& {* `7 C2 Q& m l 重复的次数(缺省值为1,取值范围1~9999)! W7 P2 ?9 x" A. q
自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应
0 d2 q8 ^" A r; u7 F 的局部变量。" u b9 B' u$ `3 A* X0 J
4 X6 v! H# L' S7 c 自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:
+ w" ?8 U, [2 h
" c7 q2 q' i# x2 S地址 变量号 地址 变量号 地址 变量号
z; p! s) r$ {" l- g p4 zA #1 E #8 T #20
# d: Z; B" l% L7 h) M9 A# w$ E2 PB #2 F #9 U #21- T2 J$ d: H9 l! ]
C #3 H #11 V #22/ v1 T, b1 p( \% k$ _
I #4 M #13 W #23
! q2 K& S' a% U5 m: \5 {6 `& yJ #5 Q #17 X #24
+ g- Z2 M, l3 R- M" FK #6 R #18 Y #25
% u& a. H' H3 E, a/ W5 QD #7 S #19 Z #26
8 y) l$ ^5 n: q# E2 B" c- i% p☆ 地址G、L、N、O、P不能当作自变量使用。- b5 U4 G/ g1 H2 ?& A
☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。1 A$ ~! U: I4 G( S! h
: e% L% ?4 @" {. x& E# x 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使
1 u6 m/ v) c# q. }! F# c: I9 [% ^用的字母自动确定:
, H% F. v3 G5 F0 X0 ?地址 变量号 地址 变量号 地址 变量号
1 j5 v7 H4 T+ h/ sA #1 K3 #12 J7 #23; r# p# `' X: d
B #2 I4 #13 K7 #24
% z6 v7 z. H' Q5 d+ y# w* ZC #3 J4 #14 I8 #25, v- f; r! f8 n$ \' ?$ j
I1 #4 K4 #15 J8 #26+ Z9 l. ? ~+ T7 k
J1 #5 I5 #16 K8 #273 D8 c5 A5 u% q- [1 l
K1 #6 J5 #17 I9 #28
8 N) e# Q6 Q9 Q* J. @+ L; cI2 #7 K5 #18 J9 #29; h/ C9 _4 ~4 F* V8 T: A( n
J2 #8 I6 #19 K9 #30
7 B. c. i- A: ]0 c& Q, vK2 #9 J6 #20 I10 #31
. O+ ~$ ]4 g2 ^6 t9 b- dI3 #10 K6 #21 J10 #32
n' B0 @/ s; @" qJ3 #11 I7 #22 K10 #33 X2 g5 A$ [: e) {' }; A4 z
☆ 在实际的程序中,I、J、K的下标不用写出来。) O7 {" o Z+ a
注意:
8 s, I% {3 B, R; B+ X☆ 在自变量之前一定要指定G65。% c) q0 q/ h1 p3 \+ u, y5 f
☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。$ A9 b& h7 k6 B( H
☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。
5 P9 c4 K! \+ B: _* T! G4 c☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。" b/ F8 \7 L8 Y8 W6 e
G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环! T' Q, _8 B' ]! u1 N8 T( g
之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|