|
|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹 - I# _4 t" S5 [" S# L- G5 y
详解A类宏; u: ]3 ]5 u$ f: R g) l: s+ d0 m
分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。
7 ` y1 A; Z& c1 e) ? 用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。
8 F8 }% W8 P7 M 宏指令是代表一系列指令的总指令,相当于子程序调用指令。
* m8 z( Q/ N* V+ f6 z" B 用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。$ ?* G" N3 P: }" B8 n2 b6 B7 z- }
用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。7 z; g$ W* z( l! q5 W/ Y* e0 {
1、变量
* S: A# L! l- K: N 在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。
+ R% s0 e5 G. Y5 q0 w+ z(1)变量的表示' ?" h( q1 J9 h* T7 F
变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
, \8 n+ k9 Y5 X* Q% `( T6 `例:#5, #109, #501。3 Q2 h- p4 d, P; w3 Z
(2)变量的引用* f/ a# ~# _2 p
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。+ c5 J, e% H! Z; O
例:对于F#103,若#103=50时,则为F50;
) Y: B3 U9 k9 H* _对于Z-#110,若#110=100时,则Z为-100;
3 J( X4 y+ \/ Q( ]' W$ z- M对于G#130,若#130=3时,则为G03。
1 x3 B$ A8 o3 u _(3)变量的类型
/ @" t' c6 t" O/ |. c7 a& a 0MC系统的变量分为公共变量和系统变量两类。
4 j- \) A9 U0 I I1)公共变量 ! K( e3 [' O3 X" a# i
公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。
1 F' w+ R+ k4 i! d公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。
9 a' N! L2 q$ ` _
2 P+ T) N* t" b! T
& W8 u- }! H% _& R7 d+ M+ I" U5 s6 f1 ]* K9 U( [( d1 Z* f
2)系统变量
$ t8 x% S: |8 j/ ]) D 系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。4 V: l. s7 s' ~+ b) }/ r- ^
系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。- G: m) Z9 f' q. @3 @
接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。5 C+ W) I. n- ?0 w% B
2、宏指令G65
- s/ N5 |5 d9 j) w% h 宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。
( H$ |7 m! I! B& ^) `% | 一般形式: G65 Hm P#i Q#j R#k
7 h* m) B. n- f式中:--宏程序功能,数值范围01~99;5 z3 u& M) g# x5 D+ E/ i4 r5 B
#i--运算结果存放处的变量名;
/ s% y9 ]* w/ D7 Z#j--被操作的第一个变量,也可以是一个常数;
( h0 L9 `# E5 e) e3 g* S5 D# J7 ?#k--被操作的第二个变量,也可以是一个常数。( G' S) B \& f/ C' X+ F" y! p
例如,当程序功能为加法运算时:
7 q- p* ]0 U) b* ]4 I% r% i程序 P#100 Q#101 R#102...... 含义为#100=#101+#102
; J/ X; K' H, L% v# K程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102
) a% b8 j6 c+ l* T2 L3 H程序 P#100 Q#101 R15...... 含义为#100=#101+15
0 Z, P) W) Q% ~# ~' C2 ~8 }2 m T! m
3、宏功能指令 * {" G0 Q3 ^! W, n& V: g$ H3 v
, `2 G& D* E. q7 y; l(1)算术运算指令 4 |- _* |- x9 P* |6 G/ `/ E# }8 W+ v
+ b7 C) F+ f; m* [
1)变量的定义和替换 #i=#j
$ z/ \: M0 n5 U0 u' X. r. q7 r+ ?* ?( l6 m& O7 U7 o& i* T- h) {
编程格式 G65 H01 P#i Q#j3 a9 E( `+ H) m5 ]0 F: E
例 G65 H01 P#101 Q1005; (#101=1005) 8 _5 y, C, I* ^ X" b
G65 H01 P#101 Q-#112;(#101=-#112)
- F' x7 {6 _1 f- s4 M& y2)加法 #i=#j+#k
1 j* W% U2 u S% q3 S' Z9 H编程格式 G65 H02 P#i Q#j R#k + k9 G9 K+ c" I$ w; _
例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
$ y: R/ y3 z8 S% u+ L/ p: K7 n2 x$ ?3)减法 #i=#j-#k
2 {! ]9 |+ g% g( {5 f- }. h& w) |编程格式 G65 H03 P#i Q#j R#k5 X z, O, L4 ^$ W7 Z
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)0 r7 J% ?4 _3 {% Z% K6 F
4)乘法 #i=#j×#k
( W; A$ X5 @1 L1 @% h9 E编程格式 G65 H04 P#i Q#j R#k
5 p- h1 ~; c( `0 _. }) T例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)" [, d5 ?' G0 V2 h4 @$ s+ q( [
5)除法 #i=#j / #k
$ o, ^7 {% h: y/ [0 H6 W7 |7 o编程格式 G65 H05 P#i Q#j R#k
+ G i& _$ n5 V% g例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)
! ~1 a& V! ]1 U h1 n$ V6)平方根 #i= 0 W3 p4 Z- T3 C4 G
编程格式 G65 H21 P#i Q#j) ^# d# A, A I1 I1 a& C& p
例 G65 H21 P#101 Q#102;(#101= )4 |1 E" C- h; c1 _) e
7)绝对值 #i=│#j│
2 U; q `8 i! M4 V- h编程格式 G65 H22 P#i Q#j
' Y& h3 B' s- p1 a( Y例 G65 H22 P#101 Q#102;(#101=│#102│)
# O! X2 v+ @! t" f/ }, T8)复合平方根1 #i=
- L& k: S+ K8 w编程格式 G65 H27 P#i Q#j R#k
( v8 R9 R, i' ]% U5 p例 G65 H27 P#101 Q#102 R#103;( #101= ! _& k: G8 L, v/ X8 t( n
9)复合平方根2 #i=
- K* D. X7 W# B编程格式 G65 H28 P#i Q#j R#k- W: U1 y1 _3 z+ X
例 G65 H28 P#101 Q#102 R#103
2 R, q$ `$ q+ K3 w8 W- r9 F4 t) w+ o+ x$ D, v" |
1)逻辑或 #i=#j OR #k
) m& A4 n' Y" A" D8 m z/ r0 f编程格式 G65 H11 P#i Q#j R#k
, C/ J: j4 R" L例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)
4 Q3 S0 {2 b" ]5 y: s
9 v$ b; W" l, ~2)逻辑与 #i=#j AND #k: K8 D, {5 e& ^3 R
编程格式 G65 H12 P#i Q#j R#k
, ^+ e: @& x* U! y' k- R3 V7 O8 b$ i例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103
/ m; ^4 C7 B1 B/ W1 e$ q& ~* f# A5 g/ F" ?
0 r7 r/ X; L; u& R% |
4 o) s+ I8 Z1 m8 x6 K6 H/ O5 x
! q! @1 s& z, E! q! w( B4 }3 M(3)三角函数指令 ; m; L J" a4 {5 |' t1 Y
4 }' [8 M8 K6 ?; [5 Z4 j( C; U
@3 o% C/ a6 O% ?1 ]& x
$ D, O' F% t2 y" O% ~1)正弦函数 #i=#j×SIN(#k) % n3 U8 X- f( L) y
! e8 v; T8 a2 ?5 E, g编程格式 G65 H31 P#i Q#j R#k (单位:度) .( E4 u: O1 q2 `+ L1 E( ?, d
( y4 C- @7 f% r3 n例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))6 p0 _( ?0 J* s- F4 a. ]
2)余弦函数 #i=#j×COS(#k)
( U& t4 X1 U/ @ I) S4 H1 z8 _7 A5 A编程格式 G65 H32 P#i Q#j R#k (单位:度)
7 D$ [2 J+ g. I例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))
8 G7 E0 B* [) `- t& ?/ c3)正切函数 #i=#j×TAN#k
+ h' o4 X) E' ]' q. o编程格式 G65 H33 P#i Q#j R#k (单位:度)+ K9 {; S, A" p; e2 i
例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))& k8 e% b4 _9 U" p+ ~$ r6 }* F
4)反正切 #i=ATAN(#j/#k)
3 _0 B7 E7 I5 V- k' h6 {1 n. g+ h编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
9 a4 x- t0 ], U% g# X例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
; S7 l8 r: c& b" e, i1 B
7 r i/ ]4 J! Y' V# y
% {) B4 c" g1 J& B4 w1 U0 ~) D0 J
$ S8 h @8 D! ? @) S x5 O$ D(4)控制类指令- J8 m% D2 e- ]
C+ G# _+ o* P
& r6 Q; o% S6 d+ R" W5 i0 j; @
a' V1 |, k& z! p$ G. j6 f编程格式 G65 H80 Pn (n为程序段号)
3 t. N5 Z' n' n% p6 r( Y% R例 G65 H80 P120;(转移到N120)/ y1 j9 B- s& T+ F2 p% P
2)条件转移1 #j EQ #k(=)
% Y# U' p7 q/ n# u0 h1 g4 v编程格式 G65 H81 Pn Q#j R#k (n为程序段号)
1 S2 V9 p- g0 R) n, b例 G65 H81 P1000 Q#101 R#1028 P3 p3 d$ O- V8 q& f
当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。0 B9 l# y1 a8 L ^/ [) m1 I
3)条件转移2 #j NE #k(≠)3 \4 B s! ~' S6 ]2 c
编程格式 G65 H82 Pn Q#j R#k (n为程序段号) z( Q2 }4 j- h2 E
例 G65 H82 P1000 Q#101 R#102
T/ A: N9 Z* y0 U8 E, D8 _当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。/ F) C0 ]6 |- U
4)条件转移3 #j GT #k (> )) r) w% d" ?; ^4 S( p) h! Z; e, n
编程格式 G65 H83 Pn Q#j R#k (n为程序段号)
( x0 G+ Z0 }2 x3 u" @- ?# m4 |6 x. C) H例 G65 H83 P1000 Q#101 R#102
$ s% X- {$ Q! V& r& \当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。* V* x A; ^& W( a) w7 v
5)条件转移4 #j LT #k(<)' U$ z0 h/ Z4 X- Z8 C) v% f
编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
( _) D) y6 R3 L& G例 G65 H84 P1000 Q#101 R#102 ) F8 m1 t6 [, h- L4 j9 V! I* S3 b$ P
当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。
+ P& r4 s+ @5 D: v/ h6 m8 T) `: x% k3 y6)条件转移5 #j GE #k(≥)
2 {* f5 T" W0 Q5 A, M6 ]' v4 x5 u编程格式 G65 H85 Pn Q#j R#k (n为程序段号)$ V0 d% w6 u" L( n/ B' C
例 G65 H85 P1000 Q#101 R#102( S: J$ ]$ S6 m
当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。
. T. k9 r' j/ I7)条件转移6 #j LE #k(≤)
4 u; |& }3 K$ I- I! p# ?4 t编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
" T4 ]3 W2 N. J. l; N例 G65 H86 P1000 Q#101 R#102
; d6 n3 M8 B2 L/ Y当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。
/ E- m% e# P% C) B- m, h; i& j" l3 f/ c& \3 h7 B% g
4、使用注意" f, G5 C- I# }: s; I
为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
' C( I2 t' T8 E2 l(1)由G65规定的H码不影响偏移量的任何选择;' @$ o3 I4 D3 W
(2)如果用于各算术运算的Q或R未被指定,则作为0处理; p: G5 Z* M# {
(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。
5 A9 s7 _7 E& x: G" Y5 U2 B(4)转移目标序号可以是变量。 " `" [: p' m8 C* M- N" Z7 C. U
' W% U3 h( l- \ a$ ^5、用户宏程序应用举例 : ' y) B8 h7 K( x: l) B/ a H
4 z! C& V% K' t' E7 B0 r用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。
7 B* b% E! B K, ?: s0 j4 x+ Q! m5 L4 u8 H
使用以下保持型变量:
% K0 \' v) X* X4 q+ s#502:半径r;
8 n* a& `+ N' y' M4 E) T#503:起始角度α;
" N( u( B+ `( |4 D#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;6 e: n' O- [8 p% ]
#505:孔底Z坐标值;8 u: }% B, o$ h0 d
#506:R平面Z坐标值;
) v' u8 ~% J' R; }" P. t#507:F进给量。 9 c7 V7 I. G9 k$ v, c C% T: C% V
使用以下变量进行操作运算:, d& V t- ~+ [( x9 Y& J1 T
#100:表示第i步钻第i孔的记数器; L- @. }5 ^2 E8 l6 C7 `, D
#101:记数器的最终值(为n 的绝对值);
6 t8 {' Y; \* j& Z7 \* Q6 ]#102:第i个孔的角度位置θi的值;
" p% Z+ C4 D7 C+ Y+ X5 g#103:第i个孔的X坐标值;$ Y* m& ^; L5 U0 g9 ]4 k
#104:第i个孔的Y坐标值;9 ?4 }, `6 k( m, A1 R
用用户宏程序编制的钻孔子程序如下:
9 y9 U2 E6 h5 i! F( QO9010) I" ?0 o0 Y( Y
N110 G65 H01 P#100 Q0 //#100 = 0 f( a- Y8 @) P! Y8 b5 k1 U
N120 G65 H22 P#101 Q#504 //#101 = │#504│9 p) p. t4 I& H5 h4 D
N130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o+ ^0 J/ {, d( w2 o3 r! G& S
N140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504, G6 A% O0 b( H! `
N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n! H: U& c+ r! i d8 F
N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标5 E S4 S! q! K z+ c7 l
N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标# s. s4 O9 b" b: K* h
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)
! x C3 B2 \9 oN190 G00 Z#506 //快速进到R平面
; @; ?3 u( h' V5 VN200 G01 Z#505 F#507 //加工当前孔8 O) N, U# K( t# }7 G" `
N210 G00 Z#506 //快速退到R平面
! L, q0 g" E/ F k/ Y! S& BN220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数
: Q/ ]9 f& U2 m0 k, AN230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段) B& o: p; J: U2 N" [- ]" y
N240 M99 //子程序结束 - b3 c/ L2 L9 _! A* @" |! u& \$ b! w
2 ~( M! n5 J8 P5 L' b! U
5 b' T) [# G* a5 {6 I- d0 D1 c
' t+ ?9 Z: i3 ?0 r" k0 X调用上述子程序的主程序如下: $ Q. I1 }- S- v3 J9 Z2 c2 }
O00103 F- }. {8 B0 _7 N& n
N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
6 h+ W3 B" _1 B) g a2 aN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔7 Z, W' r, e6 A* L: e) I2 I- J8 C5 I
N30 Z20 //抬刀0 N# p* t5 _) X
N40 G00 G90 X0 Y0 //返回加工坐标系零点 3 D; Z$ ~. z3 K* e+ z2 j
N50 M30 程序结束
2 i2 b. }, ^1 `! f4 Z" D4 \$ V设置G54:X=-400,Y=-100,Z=-50。- d, Z6 u/ g) U J. U+ F
变量#500~#507可在程序中赋值,也可由MDI方式设定。
3 L( {, k7 B, C' \: O8 }. |8 D- N {
B类宏G65
2 ^" V8 E( K- l7 L4 q2 D" \: v1 j I7 `& s1 A, o
简单调用(G65)) X+ v8 s9 N7 Q* W! w: _7 ?+ D5 i
功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。) f) X( K) O0 Q v6 P) L) h
格式 G65 Pp Ll <自变量表>;+ O }7 v1 D2 c* |
其中: p 要调用的程序号$ t% {: i' y. @9 |* B
l 重复的次数(缺省值为1,取值范围1~9999)6 `: g6 O, p6 s2 J. L3 x
自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应
+ P5 n1 U1 O& D" ~ 的局部变量。
- O7 l( o+ u. r# j1 n; r7 P
0 s1 z: A: T& W. b1 ] 自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:
, Z; R) q( X' Q1 [0 b
+ Q h. G: ?5 D7 v) o地址 变量号 地址 变量号 地址 变量号" d- ^- f0 h0 F- e% P
A #1 E #8 T #20
0 X2 C2 h; w! X* N$ u3 ^/ w# DB #2 F #9 U #21' P6 W& v2 [" @
C #3 H #11 V #22 V. a8 `3 L# t. @6 S& g
I #4 M #13 W #23
# n2 B7 a% Y# `+ FJ #5 Q #17 X #24* g5 Z( t' ]* R& f( @9 I
K #6 R #18 Y #25) k" d9 m: u7 S- ]1 I. `/ h
D #7 S #19 Z #262 P) j; S9 h- p, k& d+ ^2 D q
☆ 地址G、L、N、O、P不能当作自变量使用。
% X' X7 W1 e. m: d1 \☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。$ ^' R/ }. X, i9 W: c$ I- ^
" k: N$ }8 L. o3 g3 {; n4 e8 g
第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使' C9 Y4 x+ e- Q1 Y
用的字母自动确定:1 J! b0 i4 B$ w" Y
地址 变量号 地址 变量号 地址 变量号
5 P8 \- q Y' _$ @, }( u$ NA #1 K3 #12 J7 #236 v; S+ C5 b- a! h" x8 s" B
B #2 I4 #13 K7 #24
9 q5 g3 N) P& `. l) d, xC #3 J4 #14 I8 #25% }! ? V: _+ U4 [8 k
I1 #4 K4 #15 J8 #26
* E5 j3 O) q. i4 U" k' ^! |J1 #5 I5 #16 K8 #27
3 ~5 I7 J: W& t7 ^, W# _K1 #6 J5 #17 I9 #28
0 E Y) v& |% l( R7 N5 H5 vI2 #7 K5 #18 J9 #29
# ~# E. x" X5 XJ2 #8 I6 #19 K9 #30 P: Q E8 d) y0 j7 m
K2 #9 J6 #20 I10 #31
2 j: G0 }2 \2 Y* g' x( cI3 #10 K6 #21 J10 #328 O& @5 |' m9 M' a, s9 h% M
J3 #11 I7 #22 K10 #33
1 z. K9 B2 Y& w _4 z( ]* U5 e☆ 在实际的程序中,I、J、K的下标不用写出来。! w, V; O( X. B1 V' ?! l9 N
注意:/ X6 P0 [. A% }8 c/ Y* a
☆ 在自变量之前一定要指定G65。8 P$ b+ b S9 B+ U1 s! E
☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
0 s& F5 w D' Z4 e) p2 r( B☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。
" r5 [: ~' v. R# ]) w( q% f5 }☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。" \3 `5 w( P/ q! y4 Z
G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环/ l; P$ w8 w: ]! D
之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|