|
|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹 9 T! ^7 \( ?1 A% B
详解A类宏
* ~& x' J- N" @" u# ^分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。3 T) N+ J* a6 s$ |' N3 _8 p; Q
用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。) @7 Z( B t9 s, f
宏指令是代表一系列指令的总指令,相当于子程序调用指令。
0 }. k* i6 q# x$ C( f 用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。
2 U I) l* [7 \0 {5 {# O/ d6 z 用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。7 k' v1 k" r7 Q; _1 v4 f" I" X
1、变量
" ?; L, y9 c- k1 i 在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。0 N7 `6 L% K1 w- i, N
(1)变量的表示
9 l2 Z% {$ b- s) M$ v2 @变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)8 ]* Q7 Q8 l8 c0 S" ^4 T' c0 `/ y
例:#5, #109, #501。5 w6 A& P$ L5 p3 I* ]) k* E q& Q
(2)变量的引用
6 i; r7 Y% L3 l 将跟随在一个地址后的数值用一个变量来代替,即引入了变量。
! j% G8 U% h$ q例:对于F#103,若#103=50时,则为F50;( ]! e' }2 ]2 v& O: E
对于Z-#110,若#110=100时,则Z为-100;
& x/ V M: s4 Z! N5 v" a4 b* Z4 u对于G#130,若#130=3时,则为G03。0 }. z. S4 A" L/ f" W
(3)变量的类型 & B5 y `. Q* Q" Y
0MC系统的变量分为公共变量和系统变量两类。4 h( J2 }1 U% C( v
1)公共变量
( s4 x. {; W$ @+ @ 公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。
R% A9 x0 n' o6 |7 ^6 h& G& f公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。 4 _0 H" U4 W4 t A' X# {
) _9 _) t$ u0 ^" d" k
5 g: }0 F7 L/ k2 A& y
s- [" p& Z+ }; {
2)系统变量
/ T; c1 h1 V5 w( X) O! q, d3 C" V$ u 系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。
- c0 ~' \# x. ~ 系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。# t. b) N. V4 a) ] t
接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。# k$ n2 b9 E) f+ M2 B
2、宏指令G65" g- c+ z2 ]% |) _/ r/ u7 @) c
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。
; i: @ M# Y$ C# O' T4 o: ~ 一般形式: G65 Hm P#i Q#j R#k4 c: U6 \5 P# y& _0 E
式中:--宏程序功能,数值范围01~99;
5 V$ L/ D' H! g- L. a#i--运算结果存放处的变量名;
5 q/ c8 N) W: ~; a( N! m5 p#j--被操作的第一个变量,也可以是一个常数;8 ^' U6 J! q K1 \( r
#k--被操作的第二个变量,也可以是一个常数。$ ?$ y1 h5 W- i- q% ^
例如,当程序功能为加法运算时:
$ e7 g+ Y( f& A4 d3 n2 v ~* i程序 P#100 Q#101 R#102...... 含义为#100=#101+#102
7 g6 {8 |9 p( Z4 m, A. S' p* n程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#1026 U8 T; H9 ]3 Q* p: T
程序 P#100 Q#101 R15...... 含义为#100=#101+15 / E0 |6 N/ Q% @3 z6 s4 `$ ~
: d$ O( @! G, h7 Y. d0 y" J! m3、宏功能指令
! Q! U: j' [1 n( e7 n3 f: j1 l2 p6 Y
3 ~* ?* q' A) E(1)算术运算指令
2 l6 ^* q" K7 T8 O9 [, {* P1 O6 `# G3 I/ y. A/ _
1)变量的定义和替换 #i=#j # ]" o5 [/ V9 u6 m! I5 W4 n
0 A: p2 r X7 y- ^编程格式 G65 H01 P#i Q#j- R4 Q: W5 R. ?4 G
例 G65 H01 P#101 Q1005; (#101=1005)
( U% C4 W) h7 t+ w1 ~2 |3 }% jG65 H01 P#101 Q-#112;(#101=-#112) " r0 V& w9 K7 B4 c: a
2)加法 #i=#j+#k
9 H4 N1 R% g5 {- w* K5 Y编程格式 G65 H02 P#i Q#j R#k 1 C& P" S& M7 j' p5 t8 N+ k# ]
例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
1 K' y$ a1 e( V: G; J6 ^7 l3)减法 #i=#j-#k
& V% o7 }- {( L9 ]6 A编程格式 G65 H03 P#i Q#j R#k" r/ x8 p, _/ l) s* L
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)! b# i/ D/ P7 [. o
4)乘法 #i=#j×#k6 U. ~) Q0 P$ z# A: a' Y
编程格式 G65 H04 P#i Q#j R#k5 D# U% H+ _6 E& _6 m* _
例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)
5 W/ b7 X) [- y$ b# A2 G, L5)除法 #i=#j / #k
5 w- g. g2 d1 q+ V5 b; e6 T编程格式 G65 H05 P#i Q#j R#k4 P) j( N6 S+ E5 d! ^) w9 B' ]) d
例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103); q* d% @' P, X2 J
6)平方根 #i=
# v. D4 X8 p* U3 ]4 D编程格式 G65 H21 P#i Q#j) s" E( [& c) r" M* Q1 c
例 G65 H21 P#101 Q#102;(#101= ), k2 x: v9 ^! ]5 f* U; l, o6 l3 F" ~
7)绝对值 #i=│#j│* G' [9 A( \: O0 o
编程格式 G65 H22 P#i Q#j
( v; |4 d U" a例 G65 H22 P#101 Q#102;(#101=│#102│)
& m# F& d5 g3 B& r U( T: F8)复合平方根1 #i=
1 C, M0 Z) F$ I' b7 j8 ^8 j0 D编程格式 G65 H27 P#i Q#j R#k
" O& `: m% l8 B2 C- K2 W2 t! O9 B例 G65 H27 P#101 Q#102 R#103;( #101= / V4 r ]& O3 |6 z- O8 J8 j" B
9)复合平方根2 #i= | B- G% n- E+ ?
编程格式 G65 H28 P#i Q#j R#k
5 K2 l0 S( ^6 S! `8 U- n例 G65 H28 P#101 Q#102 R#103
& A5 p/ A6 v) H9 @, O
+ Y9 _ b; @# S6 M! `# S1 I: Y1)逻辑或 #i=#j OR #k
' f, X; p/ `6 c编程格式 G65 H11 P#i Q#j R#k {3 Y( K- {' G$ }. ?/ m
例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103): L/ o, f! }! F9 q g' b1 D
2 t, V' [) W2 B! X2)逻辑与 #i=#j AND #k& s2 A- \: z3 p1 B3 k3 v
编程格式 G65 H12 P#i Q#j R#k
?$ N1 v5 m& q k6 i J例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103 ! ^4 t( r/ F3 e4 o0 |0 l
' Z# D6 v; Z% {* j. {
$ T; a, Q# c* M- b
! N+ A+ T4 K# t
6 E; i- ]5 z* z$ j(3)三角函数指令
: e4 ~( F. H- L+ B$ r/ M; t7 @6 o
$ g( ~* |. a; N7 K- @- N( p _
9 r- V' N, }' C0 I/ t
' I& B) v- E0 V# G1)正弦函数 #i=#j×SIN(#k) # B' [) R! Y$ g5 |
( @$ C1 N. \4 f) {7 q$ S9 |1 ~
编程格式 G65 H31 P#i Q#j R#k (单位:度) .1 M4 T+ g) ^' T" B6 _% a
* ^+ e* `5 G; _3 z0 A) a例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))) m7 D8 x5 A$ y8 @2 y6 m1 e/ u
2)余弦函数 #i=#j×COS(#k)9 k [! w9 c" C- c% x
编程格式 G65 H32 P#i Q#j R#k (单位:度), ?& D7 p3 T! Z* ]6 C( m
例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103)) T3 i5 x' c, N( T) e) s T5 A
3)正切函数 #i=#j×TAN#k. B3 @: b6 O# P0 Q6 g3 U4 Y
编程格式 G65 H33 P#i Q#j R#k (单位:度)5 O' n5 Z, C8 p- w) ^7 P/ r
例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))
$ b' p+ J0 h( J- W5 l# u/ g4)反正切 #i=ATAN(#j/#k)
8 n J2 J, n. g' B; t编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
0 |: D2 v- V* L" O f例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
+ L2 t- j, z) s$ w- }0 ]7 v; h: x) @2 t- ? F4 a& H& ^$ ^4 H
) a1 Y9 j8 E% I6 J
- N) [. x9 }7 `' | Y; Y2 m% K
(4)控制类指令. ` |$ U' e: h" q
/ | y; k5 v: ~& t
( U' c! R5 w! `
% w/ j- o' T7 E) v: w2 _: ?; h8 ~+ _编程格式 G65 H80 Pn (n为程序段号)
) x3 R1 y" z. W% |4 U% p* I例 G65 H80 P120;(转移到N120)
* D4 L3 _. r2 \ I3 Q6 ]2)条件转移1 #j EQ #k(=)
! n+ p3 `& r1 F" E7 j' K$ ~编程格式 G65 H81 Pn Q#j R#k (n为程序段号)5 q% f( X# Q, W9 V# y1 @
例 G65 H81 P1000 Q#101 R#1025 k3 w+ i& N+ h A4 v
当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。
8 L1 Z; m8 C5 _# J: g6 h i* t& K3)条件转移2 #j NE #k(≠)* x5 b1 ^4 E3 A4 H% k$ ]6 Y
编程格式 G65 H82 Pn Q#j R#k (n为程序段号)
- ~. g9 O, i9 h% {% x7 g例 G65 H82 P1000 Q#101 R#102
& b9 J5 m: `" m7 v% {/ g2 o当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。* l9 o3 Z, }# @' f0 x* k! ^
4)条件转移3 #j GT #k (> )% ]: [( c% m8 p+ H. O$ e- l4 ]
编程格式 G65 H83 Pn Q#j R#k (n为程序段号): X! F! M! w6 D) f: @, C% `; S6 G: u
例 G65 H83 P1000 Q#101 R#1022 j9 M& ^, w: O9 l* ~
当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。
' g7 y/ _+ z2 Y! B$ f+ m5)条件转移4 #j LT #k(<)
6 L' ]& g Z* _编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
" ]) h' K( `: W0 b; {! j# V. A2 E" u例 G65 H84 P1000 Q#101 R#102
! j0 i1 e* v) ?( ]3 d3 l/ g当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。2 F6 S) X3 k2 \
6)条件转移5 #j GE #k(≥)
* p9 F6 W, n4 K) h& ~编程格式 G65 H85 Pn Q#j R#k (n为程序段号)
- Z/ Q' A; r U" y. o7 ^7 N例 G65 H85 P1000 Q#101 R#102$ z* \! W% L9 @; A- q
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。
+ L! K, M! }' p; Z4 P0 y, c7 Q7)条件转移6 #j LE #k(≤)5 L( o* H/ L. q- y. }# [
编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)5 I0 n. @" |# W1 p9 d# e- t' J( {) P
例 G65 H86 P1000 Q#101 R#102
1 z/ h g) H. i: Z当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。3 p: j5 s7 j( i5 Z6 I# z& O
8 R4 B7 u* {) U8 M( u7 ^3 f1 d2 f4、使用注意: q9 t' C# z% b: T V( o
为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
# y [- @- o% o/ A(1)由G65规定的H码不影响偏移量的任何选择;
( M3 l+ L; ]0 u0 u) X8 N, L(2)如果用于各算术运算的Q或R未被指定,则作为0处理;- ]8 B! x$ v7 F/ E1 A0 P' h; A
(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。
$ |' m- i" }0 r# Z( d( E" S3 x7 }* B(4)转移目标序号可以是变量。
9 F- k7 k- _. g* V! k+ x& e- o' ^6 I, g: E9 V& ]* M
5、用户宏程序应用举例 : 4 I: H0 `3 u8 E; w! u* f
4 _0 }$ y6 Z% p$ ~; t: U/ X6 N
用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。 0 Z/ N9 O5 v, C$ U8 t! D
! O6 [" ^4 ?$ x" t$ S2 t
使用以下保持型变量:
/ v! S7 F$ j3 }3 }#502:半径r;
0 |4 q* i; ~4 K0 ?$ T% T# q#503:起始角度α;# o* [! _% B: j
#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;
2 ^. x7 P! |+ @, |* }#505:孔底Z坐标值;
/ i- Q% B. ?- T u4 P. H3 h' m7 |#506:R平面Z坐标值;2 D0 k9 Q- v* i- j ^+ R
#507:F进给量。 8 T. x2 j. c3 j) F# ] D6 l
使用以下变量进行操作运算:2 Q( X2 N4 T: s! k; ~9 ]; Z
#100:表示第i步钻第i孔的记数器;2 t! n. z5 e+ M* L7 k' G4 L
#101:记数器的最终值(为n 的绝对值);; ?" j6 u& @/ Z w3 l& W8 _( Q
#102:第i个孔的角度位置θi的值; 1 M1 H5 t- @4 ~7 W# N1 T6 O
#103:第i个孔的X坐标值;5 I* {/ y6 O8 @% R
#104:第i个孔的Y坐标值;! ]; w( s' t: g- v
用用户宏程序编制的钻孔子程序如下:
4 }6 V5 u1 Z8 k' N' ^O9010( C* | {7 L! c" e$ U
N110 G65 H01 P#100 Q0 //#100 = 0
0 l* A7 P) X& q0 e2 ?N120 G65 H22 P#101 Q#504 //#101 = │#504│- Y6 G4 ^: ^' Z* O# {
N130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
; [5 e C7 j0 h4 YN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504
# @* k8 x+ s0 x; Z: g$ Y" b2 y5 |+ `N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n
' w" _3 @! q3 d" w0 A3 ]: s9 [N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标* R& U* h1 l4 Y& T- z
N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标# l5 b" w& J" t2 w! b
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)3 ^" e) D% p$ F5 K+ k6 J1 N3 S1 V
N190 G00 Z#506 //快速进到R平面
6 x& }0 |; G3 W H( E0 ^" tN200 G01 Z#505 F#507 //加工当前孔7 E* ~) K$ p( R3 m" Z
N210 G00 Z#506 //快速退到R平面
+ T. }, w. V& w- q7 s, S) ^N220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数/ A u, J& R6 O% T; T5 R
N230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段
) V* l6 N1 o% t) f" G; BN240 M99 //子程序结束 a2 @3 W) G( m& r
4 [- v. C2 b# ?: j' R, z
& d$ W2 X8 ?* A4 D u, e# e0 F5 o
B1 E9 ?7 d. |7 } t$ b
调用上述子程序的主程序如下: " @! @: k4 A( o0 ^
O0010) r* z/ {) P/ I# h' _
N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
; }) l) ^0 F9 b; B5 wN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔
9 b2 _; V. j V7 YN30 Z20 //抬刀% b( v, c" O0 i) v' b- R
N40 G00 G90 X0 Y0 //返回加工坐标系零点
* [ ?5 ? U% ^1 x. Q/ CN50 M30 程序结束4 N6 Y; o- g% b7 r- Z2 ~- z
设置G54:X=-400,Y=-100,Z=-50。- R3 i2 e8 h1 A3 Q
变量#500~#507可在程序中赋值,也可由MDI方式设定。 6 s" b$ V3 v+ ~2 e
! K/ ?7 w% c, m% u# H3 p" wB类宏G65$ ^; c* L$ S1 N
$ l |( S- I( V7 t
简单调用(G65)8 _) n0 F1 C7 D* b0 f3 \% y& G
功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。
& k' Y+ p) N- \6 A3 W 格式 G65 Pp Ll <自变量表>;, z; ]; u# u* |- S5 V
其中: p 要调用的程序号3 v0 _) P' q3 G- d
l 重复的次数(缺省值为1,取值范围1~9999)
; e8 c3 H; D) j& A; i. ?5 f 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应 7 h6 @- {! `4 O3 S* g, [6 [
的局部变量。) S& U) v; W% B7 Q2 h1 C* V- P+ \$ h
/ l. r! t2 w& d }: }3 A
自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:
' l/ ^7 o( y- X9 A& m/ t9 h1 S
7 Q5 s1 A7 S) y地址 变量号 地址 变量号 地址 变量号
9 X- y) z5 k0 E- W: u% S3 c/ pA #1 E #8 T #20
4 k+ K* i% E3 x% UB #2 F #9 U #21* U5 s m# B0 Q5 I8 ]& {2 m
C #3 H #11 V #22! a% r [' {' H& F+ F! F. ~( p
I #4 M #13 W #235 {: o# B; c7 Q9 S9 y2 z
J #5 Q #17 X #24/ k) u4 E+ D; e/ C7 }: H( T9 m( K
K #6 R #18 Y #25
+ F- P, o. @6 j3 y9 U9 }D #7 S #19 Z #26
' {8 K( J _$ U& _4 r$ {2 C☆ 地址G、L、N、O、P不能当作自变量使用。
3 f2 x6 I8 a2 E j( h☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。) M* q: s( n; w0 S1 i/ m
8 ]# i9 Z5 C0 H 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使
) W# j5 |. M2 c5 A6 V2 T; {9 C1 b用的字母自动确定:' c; R+ b5 D" u
地址 变量号 地址 变量号 地址 变量号/ h8 w5 m7 Z9 ^! h3 E7 b% B/ T
A #1 K3 #12 J7 #23
6 s! y! G6 `" {* V- ?- UB #2 I4 #13 K7 #24
$ Z, e* I* x( P6 g0 E4 X; RC #3 J4 #14 I8 #25
, n" Q8 \$ w5 Y( M5 i2 a2 D/ wI1 #4 K4 #15 J8 #261 r: T {8 `0 w2 X7 }
J1 #5 I5 #16 K8 #271 G4 w9 C! T2 U( c
K1 #6 J5 #17 I9 #284 Z( P9 B9 s! J& _; U: V/ S
I2 #7 K5 #18 J9 #29
' X4 @% {/ q( A; u6 n' e0 H e$ t' WJ2 #8 I6 #19 K9 #306 D# a% \( x- [7 l; b: U
K2 #9 J6 #20 I10 #31
0 g$ T; w4 k- ?& g* P3 m6 cI3 #10 K6 #21 J10 #32
2 p* S3 Q' \. KJ3 #11 I7 #22 K10 #33
0 Y/ k/ N8 x5 A2 T☆ 在实际的程序中,I、J、K的下标不用写出来。
) H1 E A3 l ^* |注意:
; o$ M* a/ g, M6 t5 i☆ 在自变量之前一定要指定G65。
/ |+ c# [( T# T& m$ u☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。1 O5 ?- n3 f1 j1 h$ t# W, Y
☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。' p+ `" [+ C! u# _
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。
$ A5 {" P6 u } V+ I7 k/ H G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环9 t, I9 A% _8 ~5 ^8 t
之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|