|
|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹 - |3 v6 U6 c$ D& L
详解A类宏
' ]7 E9 V. \3 J& g0 O+ m/ _3 h/ [分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。/ l1 `$ | B6 C! @1 `
用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。
2 i: H2 }+ Q8 G& G3 M# J 宏指令是代表一系列指令的总指令,相当于子程序调用指令。
8 l. h* i# ]7 P$ }: ]% L+ }$ s/ b 用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。& X8 `7 x# ^: z/ U' {" \
用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。
3 a( s- U& ~' M" \1、变量
. T% n+ Q5 O' M 在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。& \2 _+ e% a- |. b0 |
(1)变量的表示
9 [% I/ S9 x% C: P变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
8 N" R. A0 m4 c/ i7 E6 h例:#5, #109, #501。
6 V4 D# ~' _: G! P* f1 N(2)变量的引用" k; i4 [& T* y4 o4 X" v
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。! E4 M8 I/ K. h
例:对于F#103,若#103=50时,则为F50;. G9 [4 E. w' D) d8 r# I0 O1 O
对于Z-#110,若#110=100时,则Z为-100;, ?7 q0 F7 ?2 G
对于G#130,若#130=3时,则为G03。
0 K, @2 E$ X, ?# P8 Z# M1 m+ i; i(3)变量的类型
) o# p& Y" e: |$ [" ? A/ c$ S! ^ 0MC系统的变量分为公共变量和系统变量两类。$ H' z9 i* r! m- i3 K+ K8 ~4 R
1)公共变量
7 f! Q# Y+ [4 P; x; c 公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。' j" p. U$ _) s- D ~8 a
公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。
: a7 b5 ^- u" S4 K/ @% G$ t
1 ?0 l! q% O, ` t
8 h8 N: h) J3 u, p) h, I) y: S% F+ _+ P8 ~2 ^) c* P
2)系统变量
% T& h" R( h; N% d2 j7 y 系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。
+ _6 @" a( G! T" g% }/ u$ m$ V 系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。
$ p* V9 x# [, F) M+ s 接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。; U) \ h2 q. G1 y1 Y5 x4 t+ g2 `& L/ D
2、宏指令G65
9 Z. ?$ D+ {9 g6 Y 宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。
3 T6 _, B* p" M% A6 b# k& G" M8 } 一般形式: G65 Hm P#i Q#j R#k
) L5 P9 f- `7 I& p( u8 S式中:--宏程序功能,数值范围01~99;& o7 S! o/ }8 |/ c/ v/ V
#i--运算结果存放处的变量名; \3 p7 {* Q; J, ]0 G5 d2 g
#j--被操作的第一个变量,也可以是一个常数;
% M: f5 j0 Q* M3 X#k--被操作的第二个变量,也可以是一个常数。
* C- }5 q5 Y1 E4 n: D' A% Y5 [例如,当程序功能为加法运算时:
6 v$ f' p: V) I$ H% b" l程序 P#100 Q#101 R#102...... 含义为#100=#101+#1028 p% t6 B, X s, p( Q! D
程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102
" I: n' a. F& U2 r ^2 L$ N5 E程序 P#100 Q#101 R15...... 含义为#100=#101+15
3 o' y7 B V6 l1 ?) w; b. L
5 d8 B3 [6 F2 a3、宏功能指令 8 P g' m `- a; c9 S6 X
5 t3 H, z* T( C% y
(1)算术运算指令 1 y% s& d4 l1 s. k3 K3 e
) j( r* u( Q( G6 S: P P- y7 c% d) k
1)变量的定义和替换 #i=#j
+ s- |. D+ A; I+ O" |: X& |6 V9 o! J, c7 k
编程格式 G65 H01 P#i Q#j
* ?; t/ n( o. ~' X j5 w& Y' J% t例 G65 H01 P#101 Q1005; (#101=1005)
3 f5 j$ Q* h HG65 H01 P#101 Q-#112;(#101=-#112)
6 I0 e- |: B! I2)加法 #i=#j+#k2 O# `+ h- r9 Z% x; l* F
编程格式 G65 H02 P#i Q#j R#k
1 k( M+ p* e! ^# b0 ~$ R m例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
# U, }) \! f. t/ T$ U4 D. o* s3)减法 #i=#j-#k. n4 x7 U& H7 `! ?; w+ l6 g
编程格式 G65 H03 P#i Q#j R#k' d( j5 A9 d% T( o" C6 N
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)' L6 W" Z* u% B3 o
4)乘法 #i=#j×#k
1 p5 \; n6 ^' N+ e编程格式 G65 H04 P#i Q#j R#k
. Z O- |8 I" j" o5 \" K例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)$ q2 S" l' ^% R7 z- r
5)除法 #i=#j / #k
% U' g+ S( v4 H; W" @) ~编程格式 G65 H05 P#i Q#j R#k
1 A# }$ p1 n ]$ L# u例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)$ q- T k- }" @; E+ p. m* K
6)平方根 #i=
4 m- r+ i/ R! h6 M$ O( ^& W5 w编程格式 G65 H21 P#i Q#j, ^7 w# o' U9 A. T. _+ N6 Y
例 G65 H21 P#101 Q#102;(#101= )% \" a$ h+ _( K! ^9 \
7)绝对值 #i=│#j│
! x6 w8 i H3 z编程格式 G65 H22 P#i Q#j* f; U7 |( B3 p+ |' F4 l
例 G65 H22 P#101 Q#102;(#101=│#102│) % c7 a: ^( `. g5 I! P; m
8)复合平方根1 #i=
" }3 @& }+ x( o编程格式 G65 H27 P#i Q#j R#k/ V9 K4 F5 C0 ^. o! c
例 G65 H27 P#101 Q#102 R#103;( #101=
1 b' L r; y) Y+ u: \3 M9)复合平方根2 #i=
1 J! c5 e5 [/ U9 N7 _/ v编程格式 G65 H28 P#i Q#j R#k
, m9 ^0 n# b- t例 G65 H28 P#101 Q#102 R#103
: s) b+ h+ H6 i" x/ O
+ c# |- a# d1 |7 [" [1 i7 D- b1)逻辑或 #i=#j OR #k0 T0 W0 i- A+ H& P& ]
编程格式 G65 H11 P#i Q#j R#k# s8 X/ N2 s7 K' ~2 [6 i
例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)
5 I* M5 Y2 a" C
; f8 N) ~% C Y' Z2)逻辑与 #i=#j AND #k
' K6 \: c* u J" m0 r& `( W编程格式 G65 H12 P#i Q#j R#k8 V/ ?" U) @0 Z7 f+ s
例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103
+ b; R% |! j# ^3 T5 t: \/ x7 L6 m
$ i2 V% \3 D, J5 u+ [
s0 y7 {8 x9 |: }$ q4 z8 G) p
& }& s! I @, l(3)三角函数指令 7 z7 e" C- M8 m. L7 ?
. V5 {. m) j( A5 e+ C
- ~0 j- \1 |: G! i$ n
: G1 w# l/ I0 r/ T0 `4 X/ J1)正弦函数 #i=#j×SIN(#k) ! I' O4 [. N+ `* j
7 g( g1 v0 V, x* w) l: a% X编程格式 G65 H31 P#i Q#j R#k (单位:度) .
8 ]" ^; s$ r) ]& {/ w1 H; f2 v" e: v( O% P& C+ N% E
例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))
8 S7 ?8 |1 g( v! ~# M2)余弦函数 #i=#j×COS(#k); b" B0 G- W4 V7 `* Q. n( w$ G
编程格式 G65 H32 P#i Q#j R#k (单位:度)( K! d# a+ A6 _. H3 n c$ U
例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))
1 _. Z/ V- x3 M( C% ^1 }3)正切函数 #i=#j×TAN#k7 @: _1 M- C9 }" V" u4 ]3 \* m
编程格式 G65 H33 P#i Q#j R#k (单位:度)
6 P2 W# I! `7 A1 W% l例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103)). T o4 v+ o: V8 e) c
4)反正切 #i=ATAN(#j/#k)/ Z V! J, O) l( h$ |/ {- B
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)1 b f$ A- y- C B: ^7 ?
例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
: l2 ?8 W5 H; ]
/ i$ a0 O2 ^( G- W! Q, U ; ]; a9 v3 q8 U3 r+ N
+ ?, n) ~- j6 z3 G; j5 H4 M& j
(4)控制类指令
4 b y8 `2 j3 \! P
r ^- S+ L- z S) o# [& e
, ^3 N5 w7 N: f( [4 o/ o) J. u' h' w; M/ N) x- ^
编程格式 G65 H80 Pn (n为程序段号)
2 I8 h, q$ f! N+ a% ~例 G65 H80 P120;(转移到N120). Z( }7 W: g1 a c6 s
2)条件转移1 #j EQ #k(=)
* s$ f, _4 u4 v编程格式 G65 H81 Pn Q#j R#k (n为程序段号) L' D, o! G$ M9 s6 S# e
例 G65 H81 P1000 Q#101 R#102
* v# I- q9 z- x: v; m当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。! V/ x; C% `/ u% ~$ R# p; q
3)条件转移2 #j NE #k(≠)
* Y. N- K; F2 ~( K3 e编程格式 G65 H82 Pn Q#j R#k (n为程序段号)
0 \$ a6 ~9 u9 [3 i% e例 G65 H82 P1000 Q#101 R#102 G# L, E3 [3 q0 G; z% Y
当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。
. M) g% x$ N! M/ s1 Q5 v4)条件转移3 #j GT #k (> )
$ i6 U! r: I9 b. I4 y$ W% `编程格式 G65 H83 Pn Q#j R#k (n为程序段号)
7 ^! ~8 V" {0 a7 c例 G65 H83 P1000 Q#101 R#102/ E% z: U5 z0 U1 x( w
当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。+ r! v! x4 G4 G
5)条件转移4 #j LT #k(<)
. Z6 `! @3 s& d% N% h# t' Q编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
; Z5 H( H& r: z! e+ I/ L例 G65 H84 P1000 Q#101 R#102 * I/ |3 N2 V+ e5 W
当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。
% x% `" z; E* [) p/ L) t/ m6 ?6)条件转移5 #j GE #k(≥)7 U9 [+ [7 |) S' i' b: N
编程格式 G65 H85 Pn Q#j R#k (n为程序段号)0 q5 g4 a' u* R# M6 L1 f
例 G65 H85 P1000 Q#101 R#1021 j2 X' x: ^8 S [: x
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。$ F1 e+ R; \4 G# l7 W3 q
7)条件转移6 #j LE #k(≤)
. S+ z8 ^# {% ~- `4 P& ^编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
5 ?' P! { O# l7 F% U( [例 G65 H86 P1000 Q#101 R#102' F* n4 u% ?5 N! C4 w3 \# L1 G
当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。. {" B/ |) b( H
' D' v( m, N$ \; s+ H) d+ Q4、使用注意; ?9 ?8 ]5 K1 A3 S k; Z+ ]
为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
: L% a! l; r" T1 S) |(1)由G65规定的H码不影响偏移量的任何选择;
, Z( \1 C" W- ?' |% n' W' k(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
3 N! h B$ M* g0 k( s+ D(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。
( ]9 M+ ], D+ r/ N7 p(4)转移目标序号可以是变量。 / i6 B. h9 M! o/ ~% M) C3 ], j1 e
6 J0 e! a, O+ g8 X. h
5、用户宏程序应用举例 :
9 @8 c: R ^, H& s, ~2 n" I3 W0 Q2 h. r! ?5 A
用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。
- s) M$ r' C: j. T& H# t2 ]9 A9 o* @
使用以下保持型变量:1 L1 r$ ^) [$ C5 u& W
#502:半径r;8 w) X& ~7 H% n' m+ g$ ?
#503:起始角度α;
1 u- a3 ~( P) n5 u- V#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;! _3 e9 Z: [' m+ c# {3 C( R
#505:孔底Z坐标值;9 @: N* S+ }8 j9 `
#506:R平面Z坐标值;6 q: y* @ \+ |# ~/ y
#507:F进给量。
2 {9 ?9 \- n4 X/ E4 u2 L& R使用以下变量进行操作运算: T5 T8 O8 ~& g8 v- R. u7 T
#100:表示第i步钻第i孔的记数器;& Z Y( M, i$ ~
#101:记数器的最终值(为n 的绝对值);
9 [& N! B* ]+ ~! B" m1 ^#102:第i个孔的角度位置θi的值;
& j/ V) F4 }7 | k& @: F#103:第i个孔的X坐标值;8 ?. M. P" ?1 G. x0 f! o8 S
#104:第i个孔的Y坐标值;& t5 S a( r# H" d8 ?
用用户宏程序编制的钻孔子程序如下: * N N: F4 T9 E/ @' H0 G
O9010 u2 x4 b4 e) ^' c, C
N110 G65 H01 P#100 Q0 //#100 = 0$ v& y; q$ ~% ^! Y
N120 G65 H22 P#101 Q#504 //#101 = │#504│
; j' o* O( J) s, \+ uN130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
9 ~6 \+ p. e8 r3 HN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504: C1 C# n5 \9 g% B. I4 i- ?
N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n
/ L3 d) T2 i+ J" ?N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标
/ _" Z" M/ J: }( B; D( w+ gN170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标3 K5 p9 Q8 P" M- Y( Y
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)
- T/ D' x! g) G! ^N190 G00 Z#506 //快速进到R平面
6 I2 p/ s. I) ~ s5 d- [3 JN200 G01 Z#505 F#507 //加工当前孔
6 z: s: x( ^ z: [" v7 E+ _4 O. bN210 G00 Z#506 //快速退到R平面
" O% e5 [/ l9 t2 i6 m5 Y! iN220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数8 y. S0 o& v! L3 k! o' l
N230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段% h7 h5 N* r+ y: r- b1 h
N240 M99 //子程序结束 ! h2 w# j0 ^# G3 x. P
0 D2 ~) C+ `- Y; s: m' P8 O3 b4 X/ r 7 H' V% m$ J5 h9 ^
0 i; [+ }1 w5 c; F调用上述子程序的主程序如下:
. i5 |# V1 S) jO00106 ^, o" O' V4 s
N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
- Q( |% g" J8 j* `6 F% LN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔& A% ~5 ^. u! e( j8 D% N- [
N30 Z20 //抬刀
2 g' A3 k* u; s1 q9 a4 M( u5 X4 WN40 G00 G90 X0 Y0 //返回加工坐标系零点
' F% z, R, E; ?/ R3 ]* `% GN50 M30 程序结束+ B9 q% }- S2 n: W& V) R3 o
设置G54:X=-400,Y=-100,Z=-50。
& b- w' P7 k7 Z- `变量#500~#507可在程序中赋值,也可由MDI方式设定。 0 Y/ u+ V2 e2 Z: g; |) l' @+ e
. J/ x. c# M9 _& L/ z
B类宏G65; S/ l* @1 O; P9 H2 [; X
2 I. }: v# v- \. Z/ E
简单调用(G65)$ x& `& C& g: V2 g! t/ `* P, S1 h
功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。
" R. J' J) ^/ J! a9 j+ l! y 格式 G65 Pp Ll <自变量表>;
- m/ g, u, n/ a# t9 m0 i 其中: p 要调用的程序号) \: m& i1 R5 `+ @* _
l 重复的次数(缺省值为1,取值范围1~9999)
0 i; o( d: B' n2 I1 |3 C 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应 a/ \$ a6 E% Y
的局部变量。
, ]! V. @% G/ F: H. _8 h5 \' t7 [% \7 O+ k* g& U
自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:/ K2 `2 t, I+ [2 d# Q k- N; T. {
( g3 b) O0 Z6 @, o# ?6 H地址 变量号 地址 变量号 地址 变量号
+ i. Y, d# j" Y6 [4 a* L: yA #1 E #8 T #20
4 X1 k' N3 n% [/ n1 p8 Y2 v4 ]0 p' gB #2 F #9 U #21
' f% {+ s( b9 T+ _2 v/ o9 C% bC #3 H #11 V #22
- v9 T; ^. Q4 h4 sI #4 M #13 W #23
+ X* ]+ k2 }, L/ i4 q' HJ #5 Q #17 X #24
+ K1 R' L9 z+ o3 s1 K# g' VK #6 R #18 Y #25
" l" r2 f8 s: w3 V$ mD #7 S #19 Z #26 N! Y0 f1 ^ j
☆ 地址G、L、N、O、P不能当作自变量使用。
2 g3 J1 u6 o/ q- h$ O4 T☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。
* u% ?) `& Y8 o( \
4 ^/ m2 L1 U; h0 U$ x" s/ v7 @' z 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使
9 L! {5 e/ A1 R1 }1 E9 |' g* K用的字母自动确定:
! b# i2 z; d6 B6 \5 r# z: b J( ?地址 变量号 地址 变量号 地址 变量号; n5 C2 O( i9 Q! I) V, U2 o
A #1 K3 #12 J7 #23
; J, N, d0 p% B- A6 _9 o7 BB #2 I4 #13 K7 #24" c1 s! C9 y$ p; T
C #3 J4 #14 I8 #25
" M8 A- Y) Q$ i; C8 ^3 LI1 #4 K4 #15 J8 #26
8 J* v1 Z' ~2 u RJ1 #5 I5 #16 K8 #270 q! c6 |! d( V7 M
K1 #6 J5 #17 I9 #28
* z* y/ Y2 f# a# d) d' HI2 #7 K5 #18 J9 #29
! M0 F1 N6 y# m5 O. }$ G9 I, ZJ2 #8 I6 #19 K9 #30
& t0 x# i8 B$ a, Z# F# |& q/ O9 V% |- bK2 #9 J6 #20 I10 #315 W: F i9 M4 q: V# L% t
I3 #10 K6 #21 J10 #32
6 L) x( w! P, ]0 t2 IJ3 #11 I7 #22 K10 #335 c( Z( \4 z- F/ b( k9 z
☆ 在实际的程序中,I、J、K的下标不用写出来。
) e- |5 a9 x0 L! k/ {" {注意:
+ C" K) I; t2 o☆ 在自变量之前一定要指定G65。) E9 U# z) h" }) t- K
☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
; u, i( k# S( A9 ^. J9 X" c. l4 T☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。; D! u3 s+ Z( G1 A# u+ c- U
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。& a& M! ]/ ^1 K3 @; r T7 ~8 f
G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环( j S3 {3 `% s; \) Y8 h% ?% V* Z
之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|