|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹
; X6 N# ]* _" v# a详解A类宏
) ^+ a. Q v/ \5 P7 P* d分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。: ^2 e( m/ M( } n: @6 ^) \/ s8 G
用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。
+ M* `% q7 s4 m* ? V; v. a& C 宏指令是代表一系列指令的总指令,相当于子程序调用指令。% f& C [! Z( M. X4 o% A- w& r
用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。
" \, S L# H) g 用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。
8 b0 C H% Y8 W7 {& |" ^$ \1、变量; h3 |9 h+ Q7 [0 N# o0 _; `
在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。6 Y. x; u5 a7 j
(1)变量的表示4 s! Q/ [8 Q8 X
变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
. H0 Q& X- E. ]& i, @例:#5, #109, #501。) Y& [+ S! `4 H7 l' r' G$ t
(2)变量的引用& j k, R( ^$ {2 P5 g& n8 [ v9 z
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。
; O, L5 p0 w* c; Z例:对于F#103,若#103=50时,则为F50;
B, u7 P4 y2 A6 s0 x% @& s6 o) Y对于Z-#110,若#110=100时,则Z为-100;
( o* m$ T) L" V) A$ v7 O对于G#130,若#130=3时,则为G03。) B3 {: E" n2 r( ?: `4 u, f
(3)变量的类型 " F5 L- V0 Z3 I% R: `# o2 j5 X
0MC系统的变量分为公共变量和系统变量两类。
3 x/ S0 W3 F! X2 I6 f0 O1)公共变量 ( M* k7 b) q& ~6 ]
公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。
1 C# J) q \8 x& q2 \) U公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。 ?. q' T8 V Y
" C; `3 v' K7 u% |+ n1 j
& M9 l( m, }" m, `4 a% P; D ^' w2 C% H: h# Y
2)系统变量 0 A5 ?$ ?( s% J# R9 B4 U; r( U
系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。
1 l- r* l( T% @9 o1 R% L 系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。5 Q& y; H6 J- ~% u5 J- S
接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。* @2 q G$ u$ \5 p4 ^. m6 ?
2、宏指令G652 a7 L5 Y: t4 E/ ]* U! b7 Z( a
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。3 n6 w: V2 }" J7 n) E6 ?+ x( Q [: X
一般形式: G65 Hm P#i Q#j R#k
% Y4 }6 J2 _ R1 Z' a- B+ ^" i' \式中:--宏程序功能,数值范围01~99;
. D7 g- f) D" l6 V. d* r5 Q( x#i--运算结果存放处的变量名;% V; a0 D3 A$ H& a2 q/ H7 E" G6 ~
#j--被操作的第一个变量,也可以是一个常数;" w9 A: p0 m) B* p
#k--被操作的第二个变量,也可以是一个常数。3 d3 P% r8 U4 C, g5 G
例如,当程序功能为加法运算时:
, V, A/ W5 ]% |% ^) `1 u7 Z+ V程序 P#100 Q#101 R#102...... 含义为#100=#101+#102: a' h, m* ^) _8 Z4 ^+ o
程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102
/ d$ {2 l1 {1 |$ P8 e+ {; v程序 P#100 Q#101 R15...... 含义为#100=#101+15
) Q% w/ v; v% g4 G1 Q( [& p6 r) F6 F' W. c2 P
3、宏功能指令 ) p1 |" |( b% I$ h L2 b
2 a. X: j( A) v$ |
(1)算术运算指令
* A/ G3 a/ H2 g, L& _7 ?; |: a2 ]' c9 F$ S$ ^
1)变量的定义和替换 #i=#j
. B% g4 J+ {- c: c9 e; D: r8 [8 Y% Y0 t8 }/ G
编程格式 G65 H01 P#i Q#j/ u( x9 W+ u p) l+ B0 I2 A
例 G65 H01 P#101 Q1005; (#101=1005)
" t) y( z6 P2 E* b$ Q# JG65 H01 P#101 Q-#112;(#101=-#112) " Q! h9 L5 Y) p& p" R; A3 t4 U% X
2)加法 #i=#j+#k1 Q" }: W; W8 W: k7 b# [4 U
编程格式 G65 H02 P#i Q#j R#k
- P% h# M+ t' u% Q9 T例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
$ T1 _8 T) Q0 U8 |! G1 ~3)减法 #i=#j-#k1 Z4 J6 a. Q( @# g, Y0 d7 u
编程格式 G65 H03 P#i Q#j R#k: O- t T' E' _, X% }; l
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)
" p5 v8 W9 m7 ^0 G9 C2 P+ q4)乘法 #i=#j×#k
) [% }8 p5 U) Q. v- g0 H d编程格式 G65 H04 P#i Q#j R#k
* K4 A4 S7 M5 J例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)( \7 P5 R# G8 B& p; k+ h
5)除法 #i=#j / #k1 M* Q8 Y# ]1 x
编程格式 G65 H05 P#i Q#j R#k; ]4 R; f0 w0 y0 P3 A; K
例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)
* ^/ ?- H. ~ r9 w2 {9 B4 L6)平方根 #i= - e: X n. a% ^' y- s# w
编程格式 G65 H21 P#i Q#j
. E: H6 ~" I r+ ~& v例 G65 H21 P#101 Q#102;(#101= )
& Z) y7 v" A5 t' a* d7)绝对值 #i=│#j│/ ]8 o% N' O! h& L# J3 k+ w
编程格式 G65 H22 P#i Q#j, ]8 z" |" d/ `5 P {6 U
例 G65 H22 P#101 Q#102;(#101=│#102│)
+ G1 h1 \/ E! t: W; a* _# p2 r8)复合平方根1 #i= 0 i$ i* P8 r `" ^% J
编程格式 G65 H27 P#i Q#j R#k7 X1 K V; f4 {6 n" N% X* i; |
例 G65 H27 P#101 Q#102 R#103;( #101=
5 E+ T3 S1 G; G, g$ O+ t9 U- d9)复合平方根2 #i= \; t' J8 ~* b$ z3 A# J& H' c
编程格式 G65 H28 P#i Q#j R#k
" |+ {( a1 U% L$ C例 G65 H28 P#101 Q#102 R#103 & G" b8 W% r7 _5 O# B
7 ~' C, ~. S* q" L% y4 v- A1)逻辑或 #i=#j OR #k8 [0 P. C; m. Y. X1 [& m3 b* L) ]+ |
编程格式 G65 H11 P#i Q#j R#k# e: R6 T( s' K4 @4 Y. U' u/ C5 p
例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)
/ I3 c$ g# I( T* H% m
' }# @) q' C$ E+ B' b; o6 |( S9 ]2)逻辑与 #i=#j AND #k
* L. u7 F" @- ^% {9 x! _编程格式 G65 H12 P#i Q#j R#k
) v% f% \% T/ Y( e例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103 , s+ L# u1 o6 s! J7 }( M
$ H6 O9 j7 A5 q: X' j: q; M
. F- q0 A2 |* e q
. S4 P3 F+ }1 ?
1 a, r' ]: E" A9 W1 |" p' V(3)三角函数指令
4 `7 K) o( v* A5 Z/ C0 v, S4 [9 o& x1 \' }4 b
: v0 W2 S: v: b2 {: W. q& u+ I3 k
1)正弦函数 #i=#j×SIN(#k)
8 F, Q7 }1 a3 L; F! f
, p, C) `% j; p# d" h5 z编程格式 G65 H31 P#i Q#j R#k (单位:度) .
1 T( S% U# L8 X) r
. ~# Y: _0 j% ~例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))3 {: ^; p0 I0 O
2)余弦函数 #i=#j×COS(#k)
' \/ U2 a* m' O' K$ d0 A编程格式 G65 H32 P#i Q#j R#k (单位:度)
' l5 C% R* Z4 u' V! l5 X7 d1 ~1 h+ i例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))' E; e. u3 M3 V. T( b# u$ W" |4 t' f
3)正切函数 #i=#j×TAN#k6 \/ }; H, l$ t6 S5 z% |/ b6 n7 N! o
编程格式 G65 H33 P#i Q#j R#k (单位:度)9 Y& S9 V5 m% ~; J) N4 g9 G
例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))2 s) h- O& ~, y. c% N) s
4)反正切 #i=ATAN(#j/#k)) f% t( B: @" N, D: _5 x
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)3 a+ ^* u9 k- c
例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
+ X$ T: E0 V8 T+ \1 j1 p6 T6 p: ]( T& X K; M
- t4 }6 m1 l: }" G- R1 Y( ~, m, i _& r* H. i. o
(4)控制类指令6 }' }* A) H& c2 o8 }
9 w# E2 }/ \9 ~/ W4 P9 a
+ f7 \) O$ d& J5 O; I) s" E
* N9 }8 y: p v: r" A编程格式 G65 H80 Pn (n为程序段号)+ t% F/ i! p* o
例 G65 H80 P120;(转移到N120)
0 {6 ^- b0 ]7 w2)条件转移1 #j EQ #k(=)
0 B; a' R1 y* q4 T. C$ q0 `编程格式 G65 H81 Pn Q#j R#k (n为程序段号)
' h+ r0 u+ W5 k- U2 i! A. A$ S1 z例 G65 H81 P1000 Q#101 R#102
6 R7 i+ |# \: d3 v& o5 G! ?# R% W当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。1 j* y' U/ ]9 y" w: _# l) x
3)条件转移2 #j NE #k(≠)
+ R" n0 B; j1 S* R& V' f$ t8 q y编程格式 G65 H82 Pn Q#j R#k (n为程序段号)' ]7 Q+ z; y- _. {- @; A
例 G65 H82 P1000 Q#101 R#102
* o. |5 |& q Z- @0 E当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。+ @$ v/ f0 X2 H' `
4)条件转移3 #j GT #k (> )' X) W+ ], `+ l! C
编程格式 G65 H83 Pn Q#j R#k (n为程序段号)
w% C; ?- { D0 r* s例 G65 H83 P1000 Q#101 R#102
& W' N, }. @8 |2 ?当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。
* N/ S: _9 Q ^ B. N: [0 W5)条件转移4 #j LT #k(<)& B/ z( g9 @! e1 H5 w
编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
' ?8 K# A% j l* E例 G65 H84 P1000 Q#101 R#102 ) z$ O5 R7 p0 t# I% @5 Y
当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。) W1 u5 \# ~! v
6)条件转移5 #j GE #k(≥)
4 P1 \+ A9 n( i& R1 H编程格式 G65 H85 Pn Q#j R#k (n为程序段号)
9 h2 f! y6 m/ b5 [例 G65 H85 P1000 Q#101 R#102
, W4 f" ~ o3 ]) Q E当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。! C/ ~% ~: |" K' b8 M6 V
7)条件转移6 #j LE #k(≤)
. k' c! m" y) L, n* ~# y编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
& R$ `1 b* H/ J# _2 }9 o例 G65 H86 P1000 Q#101 R#102
9 E6 ~0 j; E! ?- b0 p3 R当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。
6 v) D+ k& t) @& _' h" K& F" p5 w% k1 |! j9 i( z4 R* h
4、使用注意
' e0 ~6 A: u) N+ X, j 为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;* i9 H7 B4 z" R5 n/ X
(1)由G65规定的H码不影响偏移量的任何选择;
/ X e. L7 D$ H. T(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
) j) U# V: y+ P) L(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。2 w$ ^4 \7 N* n% R& t2 ~2 l
(4)转移目标序号可以是变量。
8 ^/ _2 c# M- ~$ _+ ^2 S/ n/ W/ X( u; s. m
5、用户宏程序应用举例 : ! [: N1 I* y |7 z+ Q# Q& Q% N
7 O8 Z1 ^% W7 w6 Q
用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。 " x4 C& M, N: A( J3 V1 m( z
& N$ T. b6 }- ^$ B1 E0 c$ }# u/ y
使用以下保持型变量:" y" g1 q3 |2 K- M$ S; l- w
#502:半径r;
. ` a( {, S& @7 T2 R$ C! P#503:起始角度α; K" R" c' U" z$ w# A5 L
#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;
5 d; q5 h9 B5 e% o#505:孔底Z坐标值;
) s" [2 y# K+ q. |; h7 f6 a#506:R平面Z坐标值;9 M; e6 @5 p! w- L, ?
#507:F进给量。
' W$ C6 v* _8 O+ p4 ]8 R使用以下变量进行操作运算:
, Y' R( L) X" n' r0 M: e#100:表示第i步钻第i孔的记数器;
1 {# V* O/ @4 T' z1 ~& {$ S#101:记数器的最终值(为n 的绝对值);: e; K" {3 i& q: G7 d
#102:第i个孔的角度位置θi的值; ( @0 a; h/ d. ?1 Z) J
#103:第i个孔的X坐标值;
: m h& f( e6 _#104:第i个孔的Y坐标值;
5 V$ |: ]2 G/ _% Q+ c J6 l2 }4 A用用户宏程序编制的钻孔子程序如下:
7 I' f# B3 I' v$ A' M0 p4 kO9010: W5 M7 h% m3 q6 X& g9 } \/ Y
N110 G65 H01 P#100 Q0 //#100 = 0' e6 l8 E+ k- t3 \3 L
N120 G65 H22 P#101 Q#504 //#101 = │#504│
0 |2 |/ h6 y8 k- SN130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
$ ?+ p4 F) ^" l1 Q' e- m( h& `N140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #5042 w) x- ]" L& L2 a5 j
N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n' \4 D% x$ b! _' M0 u0 W1 {! M6 C
N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标 i7 j/ q' X; p! l6 i$ V1 u
N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标4 Y' m. K# R2 v
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)
( a3 _1 `5 C& E4 f, v/ z1 wN190 G00 Z#506 //快速进到R平面
# w* `2 l# E" P- j7 L3 K4 oN200 G01 Z#505 F#507 //加工当前孔
4 |" T8 C0 Z+ Y- I" D8 |6 VN210 G00 Z#506 //快速退到R平面
: x/ |- l" |$ y- ZN220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数
; R: M* U3 e. zN230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段1 G4 C3 @! r3 c8 {& P5 Y \: Z% `8 J$ w
N240 M99 //子程序结束 & A0 ` Q& r) A+ D' }& A. h
" a) I/ |4 ^( e' C3 y: O
' [& d4 g0 u& `( @3 F5 W6 E3 {; p4 e) R( ]8 \2 _
调用上述子程序的主程序如下: / g+ u7 s9 S* ^# ^( w
O0010
4 r8 \ y$ i: S7 S4 PN10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
- l" j- G3 ]9 Z- d# T- |N20 M98 P9010 //调用钻孔子程序,加工圆周等分孔3 C4 f9 G1 w+ {% A) |$ U
N30 Z20 //抬刀
& P* y" n/ t% U" b1 j! xN40 G00 G90 X0 Y0 //返回加工坐标系零点 * |/ C3 D$ a3 v: s
N50 M30 程序结束; k6 J9 j: H' {
设置G54:X=-400,Y=-100,Z=-50。
5 j/ D1 o$ y& |3 U变量#500~#507可在程序中赋值,也可由MDI方式设定。
p. {. @" _! L/ W/ E' Z) i6 c: n: S- N# S
B类宏G658 p# c+ p m/ Z% ^* z2 |
. r+ V9 }, y7 ]5 D
简单调用(G65)
" o) N8 C7 R: U2 f/ w8 s* r6 B& o 功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。; j- e! k- Z/ O8 z( I1 S
格式 G65 Pp Ll <自变量表>;; B+ i! y; y" \5 [& r6 Y
其中: p 要调用的程序号
+ t* E/ p( Q: {' l3 b5 y: R l 重复的次数(缺省值为1,取值范围1~9999)
* m6 Z% v4 N) l( G+ X S1 { 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应 " Z% E0 k9 g( Y: f4 ?. U7 j
的局部变量。
) p" D: d) d/ X8 ]& y! L- @% e% \ h& N9 q# s. ]
自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:
1 _/ m( |. h7 {! M# m) J; d9 d
7 s0 ?7 w6 @) v地址 变量号 地址 变量号 地址 变量号& @& m% m% t, \
A #1 E #8 T #20( \& U7 b z/ J+ T
B #2 F #9 U #21% ^# w2 V& V9 e, r' t
C #3 H #11 V #228 y5 m' ?* j' B ^: B' d2 ^2 s
I #4 M #13 W #23% q* E5 [2 o1 z: m4 C
J #5 Q #17 X #24
5 J2 S/ i6 g2 B% I1 PK #6 R #18 Y #25: m; X: j8 u' z5 C
D #7 S #19 Z #26; ^* a+ L$ V9 ]
☆ 地址G、L、N、O、P不能当作自变量使用。3 i2 a, q/ i7 p1 V+ ^
☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。
H3 }/ U# k( ?3 L" @
/ w$ y8 u- p2 h. G7 U4 [ 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使! `/ D: `5 E% i5 W; m
用的字母自动确定:$ ]& v$ E4 C/ z/ C+ l
地址 变量号 地址 变量号 地址 变量号, U8 i4 C6 e+ h+ z0 x) ~5 \& v
A #1 K3 #12 J7 #23$ d6 R; q# p5 a/ g
B #2 I4 #13 K7 #24
+ u' |% s a eC #3 J4 #14 I8 #25
" v E6 B5 Q; ?6 |I1 #4 K4 #15 J8 #26
: \9 ]3 d8 q$ CJ1 #5 I5 #16 K8 #27
7 s, \% v2 q5 _+ a: L% u/ }, Q' QK1 #6 J5 #17 I9 #28
4 `5 i5 T4 Z; z& Z! rI2 #7 K5 #18 J9 #291 _) b/ m) e' H8 _# A
J2 #8 I6 #19 K9 #30
# _3 K1 G3 x- e) f( W2 {" V, OK2 #9 J6 #20 I10 #31' G4 Y- P& J: D, P# D d
I3 #10 K6 #21 J10 #32
1 E' c! y9 v0 T) a c8 _4 ?) N3 L q7 LJ3 #11 I7 #22 K10 #33' E7 v' q* p+ F! v: M+ I. g
☆ 在实际的程序中,I、J、K的下标不用写出来。9 Z' [8 U" V6 y' f" l
注意:' ]* N2 K3 r3 Y q b5 Q- E3 V
☆ 在自变量之前一定要指定G65。
% U5 B7 z$ n8 J* }* |☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。: Z7 q: M) N2 a# H0 F T
☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。$ W" ?% B9 | E
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。
( |% B- l2 ]* m& { G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环
; _9 K+ p& X1 T7 d0 s# o之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|