|
|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹
0 `: B% G' i7 Q, X详解A类宏* E$ K: o! e. j& S5 `
分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。/ ]: _* [$ z: I. z4 i* W. J
用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。
3 N* V/ `0 O. {& D; N5 O" h 宏指令是代表一系列指令的总指令,相当于子程序调用指令。
) ~5 e8 `/ ?$ G+ F; c5 V* }" N 用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。, I7 A! f9 f* v! o
用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。
( `) o; q% ~. Q( U0 Z5 N9 W1、变量
8 [3 f' A- X# ]/ W 在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。
, G* _: @: f7 Z(1)变量的表示
2 X8 l" P) y7 @9 P+ s变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
# _! m( ~: ^, S' A4 P例:#5, #109, #501。
[" A w# m8 m. z3 F, @" X6 {- V+ v(2)变量的引用6 t% m: i: q5 a4 V g2 d) ^7 L
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。0 z% [! S3 `/ L: S) z1 z6 G
例:对于F#103,若#103=50时,则为F50;
' R$ q3 z$ P/ X$ k1 j对于Z-#110,若#110=100时,则Z为-100;. B0 h B! h k% \0 b, f B1 V1 W
对于G#130,若#130=3时,则为G03。
- S& S- j. X4 w(3)变量的类型 ?* _! a+ Q/ i5 {1 C6 ` F
0MC系统的变量分为公共变量和系统变量两类。
" m H" E, X, M, L5 {0 [7 E% h9 a1)公共变量 0 N# O5 j* N" m" `& A m0 B4 H0 C
公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。
0 |. O' B- f6 ^* b2 ?公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。 : l o# q* q# y G- S3 ^" t1 ~. T
# S8 z) o: h* ~) R# M0 T' g5 {% x2 t, [" q9 f
3 R+ [; {9 X; |! _1 a
2)系统变量 $ c% D9 @- f$ j& [* _4 C% @
系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。+ P+ a6 h& c; z
系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。
3 \/ r5 A" `: |; j 接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。2 ^- r" C" R& r* V$ o# D
2、宏指令G65; p, N3 Y$ B7 d. M. s3 Y
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。* F, e6 B( Y( V
一般形式: G65 Hm P#i Q#j R#k7 _7 R8 z& l1 |" r8 c5 a* X
式中:--宏程序功能,数值范围01~99;( S8 T! Z2 ^- T. C7 v
#i--运算结果存放处的变量名;
3 E) x1 D2 y9 M; n#j--被操作的第一个变量,也可以是一个常数;
3 T1 c: g W1 a#k--被操作的第二个变量,也可以是一个常数。
0 Y: x- u8 E Z6 G2 h2 E9 m6 n例如,当程序功能为加法运算时:, H3 m$ D' E: v5 j1 o, ~2 w$ ?
程序 P#100 Q#101 R#102...... 含义为#100=#101+#102
2 {( T; E m( K2 i; J' b程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102
' l9 ^+ ]' w# k; ~( F4 ?3 q; x程序 P#100 Q#101 R15...... 含义为#100=#101+15
) F, D/ o W: c' f! y" S. i$ _7 D& j6 y7 L
3、宏功能指令 7 N7 O9 Y5 U4 X; m% d
: i0 w% l Q+ @. x( V
(1)算术运算指令 7 c9 d1 @4 Q6 `( S7 Z
% o: d- C7 ?# J4 g
1)变量的定义和替换 #i=#j ) p* U4 v4 [& W/ i4 ]) t J2 n
5 \$ a$ u. K$ W( K0 G* D编程格式 G65 H01 P#i Q#j
' W Y/ k+ ]% J) K例 G65 H01 P#101 Q1005; (#101=1005)
3 C! g3 h+ k' w/ j1 O: _G65 H01 P#101 Q-#112;(#101=-#112) $ _) A* k" c, @9 v0 t9 x _
2)加法 #i=#j+#k/ l7 B- b' f" c1 H0 z+ r4 |6 M. W0 N! Y
编程格式 G65 H02 P#i Q#j R#k
' y! b; i" P6 p ~% Z例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)$ g3 z2 f! D v% \* ~% {/ w$ N
3)减法 #i=#j-#k
' j: n8 q5 V" g- b" c编程格式 G65 H03 P#i Q#j R#k' \. d+ F1 r9 c2 m- S* C& j) g
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)
8 r; v( W. Y/ H- c5 R4)乘法 #i=#j×#k9 C2 G0 u7 ? i1 U/ ~& T6 \8 h* b
编程格式 G65 H04 P#i Q#j R#k: L) i# p' x, I/ U* S1 p- n( K1 @8 |) ^
例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)9 G" O/ y7 m) ]7 g8 L
5)除法 #i=#j / #k
6 {0 U: @9 H& o5 D2 K3 j编程格式 G65 H05 P#i Q#j R#k
4 N5 ?( w9 x3 g. b& B& [例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103) C* F4 v8 B& d1 y
6)平方根 #i= ) p; t9 n* h0 y% p% s
编程格式 G65 H21 P#i Q#j
% o! K: }4 r1 x, V- }& f+ j例 G65 H21 P#101 Q#102;(#101= )
/ H5 a9 [5 Y5 w% u/ ?7)绝对值 #i=│#j│, z; P4 }/ }! z
编程格式 G65 H22 P#i Q#j0 j/ b( M1 `7 O! s; v
例 G65 H22 P#101 Q#102;(#101=│#102│) ' h2 {3 |6 M+ m- B& \- x: V3 g8 V: P) k ?
8)复合平方根1 #i= 3 u4 t" l5 G* a v7 K% E, _
编程格式 G65 H27 P#i Q#j R#k5 v& }% x6 M, a8 ~( X
例 G65 H27 P#101 Q#102 R#103;( #101=
& q% ^# ]* B' N; A/ f9)复合平方根2 #i=
2 t# e6 f# r; P" E* {' V+ K# ]: a+ r编程格式 G65 H28 P#i Q#j R#k) R' ^1 N d/ y8 Q" ]. z2 c4 A
例 G65 H28 P#101 Q#102 R#103
2 }4 \) \0 q. D9 y* t
* g* O; P& N, S" Q: L7 ~2 V4 w* R1)逻辑或 #i=#j OR #k- s) }, @) h0 P b) G! `+ A* T- b2 a
编程格式 G65 H11 P#i Q#j R#k6 s1 K3 V# _) R2 p% k
例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)
" C4 i# g: S# c3 }+ I3 C c
& j/ K8 U' N: b. e- g2)逻辑与 #i=#j AND #k b+ i: P! ?7 ^6 f) a
编程格式 G65 H12 P#i Q#j R#k' {6 E$ T4 e0 m+ E
例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103
. M% r! j. \$ k+ B1 P! G7 }
+ A# i& k" }8 t% I( h/ [6 i4 b: \# s! f. x1 s
' @* s& ?) Y* U& P; g. z" F5 p
+ u' o3 T+ ?7 d b1 B(3)三角函数指令 ! z7 N( a9 v9 S
1 p5 a/ r% T# S$ n6 z* _
9 ^( @- p* G& _$ P2 e B/ N
/ Q N# Z8 I" P" ~. u
1)正弦函数 #i=#j×SIN(#k)
% a9 F0 v4 j3 m1 V
/ Y! ^" m2 Y- W; S* C: |编程格式 G65 H31 P#i Q#j R#k (单位:度) .+ V$ ~( M" J, W- q( q1 O' V9 A
+ p- L4 k& i+ I- p: W9 F! u0 k例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))
' t* ?8 h; z: f& O: o+ U9 y2)余弦函数 #i=#j×COS(#k)
3 `7 x7 J- F2 ?& F0 M编程格式 G65 H32 P#i Q#j R#k (单位:度)
, E2 @( M) d1 |3 t1 u4 p例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))& a+ I2 | `$ M8 i( I/ z
3)正切函数 #i=#j×TAN#k+ P# ~' {6 B T! `4 I: j
编程格式 G65 H33 P#i Q#j R#k (单位:度)* r8 f3 _# p3 D6 Y7 j6 K
例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))4 Q% y8 Q+ L. D4 o+ j: s9 P
4)反正切 #i=ATAN(#j/#k)
. K$ F# v! W$ s$ ]& i; `编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
: P( t9 r% ?2 N4 W( R) t例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
' Z7 }5 { L/ m3 P2 o" X9 s- U) r+ T4 R
+ f- V4 D. o' {
4 G/ N9 K4 w) R. \$ Q6 v; F! D(4)控制类指令
" C2 P- q6 B* |
; q1 H3 e4 K0 Y. s& V7 K
8 A" R% h1 u0 U( R+ g, Q( f. u$ q2 U, z% ]* C! W" X+ ^
编程格式 G65 H80 Pn (n为程序段号)
& D( }& S- l5 b例 G65 H80 P120;(转移到N120)
# [5 d$ S: I+ ~2)条件转移1 #j EQ #k(=)
, I8 V7 M0 h& l# }编程格式 G65 H81 Pn Q#j R#k (n为程序段号)8 a2 _$ Q8 d, o) D7 m' O) `
例 G65 H81 P1000 Q#101 R#102
, V/ c0 a; O4 Z# ]当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。
: [( h1 m2 ~8 O' |' w% x3 X8 L3)条件转移2 #j NE #k(≠)
) P! f! r+ G+ ~% P9 X2 u( B编程格式 G65 H82 Pn Q#j R#k (n为程序段号)
% c) C0 c- l5 G# X9 b, ~例 G65 H82 P1000 Q#101 R#1022 S; d6 B, k& s' W, q$ P, U6 _
当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。
]- t# u* b' ]4)条件转移3 #j GT #k (> )
3 s* t, S2 ~' g- ~ j- X5 b编程格式 G65 H83 Pn Q#j R#k (n为程序段号)
4 \+ l- S% [2 o% S8 ?- A例 G65 H83 P1000 Q#101 R#102
. j1 g1 l/ U6 P% u; r当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。
3 E. O* J. @# [/ G5)条件转移4 #j LT #k(<)! t4 [0 y1 r( \
编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
D8 r6 @% {) l/ y% \例 G65 H84 P1000 Q#101 R#102
+ S' e+ U+ g9 R3 k当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。
/ N) Z! ?, a9 j) Y6)条件转移5 #j GE #k(≥)
2 O4 i& r6 C) x+ `+ ]8 X编程格式 G65 H85 Pn Q#j R#k (n为程序段号): N, a/ N, X1 {& M! T: z6 {
例 G65 H85 P1000 Q#101 R#1027 d( a2 Q6 U4 f
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。
- R1 f. A8 }1 B; J: X2 ]1 `* {7)条件转移6 #j LE #k(≤)1 [4 H4 W D5 [4 F/ {+ C7 F7 G
编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
3 |$ S0 Y. p0 ]7 b8 j例 G65 H86 P1000 Q#101 R#102
7 N& H( U/ S7 o3 n当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。; W' L8 @( X; |! y, ^$ z" m9 u
5 r7 D- D* n" D6 n- W' p$ i) M4、使用注意; r) x: \ Y" _& u, ?
为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
G! v4 @" q8 g4 Z/ Y3 y' L% n0 p(1)由G65规定的H码不影响偏移量的任何选择;
% B& i, e5 X5 F, a/ x, r(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
5 e# Z0 L, F5 j- i U(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。' l. Y* O; D) o. s
(4)转移目标序号可以是变量。 ; d( p1 `7 p5 E6 ^& R2 L
! X, J4 W# {: `9 _
5、用户宏程序应用举例 : & X% ?: C# Y8 N5 J+ l- T7 e
: ]9 K0 }" H5 l3 w; X- z用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。 # k; E+ j z$ O2 ^+ B9 A! r0 |
0 Q3 h$ D1 J( _: J4 ?, C% I9 M使用以下保持型变量:) B9 R6 x5 t, x. X( M# E3 R
#502:半径r;* K6 A+ e. e+ F" |9 D- |7 s/ {
#503:起始角度α;& N; k' m, \# n+ j3 M2 X& ^. Q
#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;
* o* I7 e. j* ^$ s' y3 B#505:孔底Z坐标值;/ I# X$ |! d3 }) P
#506:R平面Z坐标值;" f9 a) l. _ L% r
#507:F进给量。 $ Z9 U7 |* ?, X& @+ b- T; I/ X
使用以下变量进行操作运算:/ Q9 e) d8 ^4 d# u# O
#100:表示第i步钻第i孔的记数器;" [! L" X% D6 g& w3 S- I" F
#101:记数器的最终值(为n 的绝对值);* J* M3 u3 t B$ b
#102:第i个孔的角度位置θi的值;
2 P$ t) s7 }5 x0 o! {- y#103:第i个孔的X坐标值;( t) y' I* V2 s4 x( i4 K' j
#104:第i个孔的Y坐标值;! n, n+ I! `- A5 s
用用户宏程序编制的钻孔子程序如下: " R6 [. \8 v9 ~
O90100 L: b- i5 N0 c& I
N110 G65 H01 P#100 Q0 //#100 = 0
9 X5 U/ z* j+ O7 D8 |% }N120 G65 H22 P#101 Q#504 //#101 = │#504│# D2 h2 e) |3 b5 o8 w4 d
N130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
; f+ T7 A- y& Y" O1 IN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #5046 {1 ~) [9 `8 {: H. }4 _3 V1 `
N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n
6 S0 B% K0 C& A, R3 C$ ON160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标
f4 H( L" D2 w: G7 Z6 }! kN170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标2 T# ]/ J5 x3 `: r: K1 _: I
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)
0 u# Z3 V4 i+ `. {1 G4 KN190 G00 Z#506 //快速进到R平面
+ y: J, { f* U1 v* f$ g1 k0 DN200 G01 Z#505 F#507 //加工当前孔
4 B& C! E- f& v, QN210 G00 Z#506 //快速退到R平面5 g, X0 U, q+ a3 z @/ |! N; W1 V8 F
N220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数9 {8 d1 `( v3 ]' H5 C4 F! S
N230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段7 G* N6 s& M) Y3 w" T9 H
N240 M99 //子程序结束
+ t. F( @" e+ @* z: h% ` a: F% n) P
2 n9 [8 I( m+ V, a0 N/ T% j 2 ^/ d% e5 }* G' e k" R1 {4 Y8 t
+ v v8 u# N" {* o调用上述子程序的主程序如下:
$ ?2 Y& {. i' W. x: FO0010
: B$ g* j/ E- S' Q7 u7 EN10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系: i% }9 q' n; V/ W0 I
N20 M98 P9010 //调用钻孔子程序,加工圆周等分孔
3 H: V+ Q8 x3 {4 p. C9 B& ?N30 Z20 //抬刀+ r2 F6 H4 t3 b. V) W8 R- M
N40 G00 G90 X0 Y0 //返回加工坐标系零点
/ H3 u7 q1 L4 r# x. N5 Z1 lN50 M30 程序结束
4 o- _7 f# i& f设置G54:X=-400,Y=-100,Z=-50。- c/ Q# Q" P8 L7 x [
变量#500~#507可在程序中赋值,也可由MDI方式设定。
2 a& r6 `$ m/ z+ N
* f3 U" o) i5 W9 a" s+ tB类宏G65" `+ e5 W4 ^- J0 l1 {* ^$ S3 }
9 |# _ c a! h% t9 [- L
简单调用(G65)
$ F% _6 u0 u; g' r* z2 t9 \ 功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。- H8 V+ v" t+ P- g5 m I
格式 G65 Pp Ll <自变量表>;
& V/ U* I1 S1 n$ | x 其中: p 要调用的程序号; L+ q8 y: i5 ]5 q9 C- B0 G( w4 h
l 重复的次数(缺省值为1,取值范围1~9999)
' W& t1 v. K- E% q" R 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应
& d$ ]/ r9 N% g5 t7 ` 的局部变量。7 A C0 k K' E. C. @" G
, L7 l+ f7 `0 K& o5 g3 u
自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:2 g- u* [& c0 @6 ^& |
1 T" _5 A( g4 f地址 变量号 地址 变量号 地址 变量号
$ p) G9 d& P! Q% y$ D6 a f4 S) F' u4 tA #1 E #8 T #20+ K4 ~, |8 r4 E P
B #2 F #9 U #21' T, x. H& m8 Y0 _9 n& L/ \# ^' c
C #3 H #11 V #22: j# |# Z" k6 g6 ^ ` H
I #4 M #13 W #23' X6 j" t- A1 W- H* ~( s: \) S) L
J #5 Q #17 X #24, @; ~7 W W& K
K #6 R #18 Y #25. Z2 h# R' \* m& b# @
D #7 S #19 Z #26, Z1 Z5 ^" J6 G+ ~7 W( P
☆ 地址G、L、N、O、P不能当作自变量使用。" P4 m& E* B5 W% c) s4 U
☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。
, B0 h0 f$ `/ }) l , S6 H3 U- _, a6 w% b ?! ^4 o
第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使
0 V9 q$ c3 W* w' r" j, ^$ e/ h9 C! P用的字母自动确定:% D2 _# f, K0 o; L9 r( s- n5 ]
地址 变量号 地址 变量号 地址 变量号
4 z8 { Q4 w! C( eA #1 K3 #12 J7 #23
/ x& @% K5 x2 P- `# \7 v0 F( hB #2 I4 #13 K7 #24% |. H% c1 \( q" D
C #3 J4 #14 I8 #25. w! u- K2 O7 b
I1 #4 K4 #15 J8 #26
/ w* \! f* ^, |J1 #5 I5 #16 K8 #27
3 J9 k- k# ?; j$ k/ Z! OK1 #6 J5 #17 I9 #288 F' x( C a8 l1 `; |
I2 #7 K5 #18 J9 #29
3 v- p# _8 A+ h1 P, w2 pJ2 #8 I6 #19 K9 #30
# [6 i- S8 C2 R2 V( z- s; I8 BK2 #9 J6 #20 I10 #313 {' ^% K9 m5 w: K- U( w
I3 #10 K6 #21 J10 #32; S6 a$ j# [2 K* E) ?% y6 o
J3 #11 I7 #22 K10 #33
. `( D6 t9 N% y6 M☆ 在实际的程序中,I、J、K的下标不用写出来。
' S' n$ {; ^2 R4 p. K注意:: h, b& m z) w) c+ O. d
☆ 在自变量之前一定要指定G65。
+ B# T R3 y/ r☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
$ B! G/ w- M% w5 r2 J( }☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。- ?6 |: b& j, z
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。
1 p: f; A$ i" @8 @ G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环 s, w: W( H2 G: X$ n
之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|