|
|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹 8 _0 @5 h8 G% T( {! x1 m
详解A类宏( M( o. ?2 C3 Z1 [* `
分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。
9 {8 t, \6 p- K 用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。& P1 B+ \+ n& n8 S4 s4 c
宏指令是代表一系列指令的总指令,相当于子程序调用指令。# m# O5 `) f1 w2 S# A# v
用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。
& X6 b7 t* L# C o# S3 {" e 用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。2 T% E" ?& Y# Z; O
1、变量0 J+ X7 H+ Z7 W6 T, ?. K* `( f
在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。
j0 ~0 @7 U+ U% v# b(1)变量的表示 T/ d* e6 T) d8 ?& C9 U/ u
变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)
0 ~- E5 [) i7 U例:#5, #109, #501。) N G7 }/ I7 k( J3 P
(2)变量的引用' F+ m, Z3 G& ?2 s
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。
% m6 t0 Q3 U: T$ O& I例:对于F#103,若#103=50时,则为F50;
, @ J: F. g' V( P: D对于Z-#110,若#110=100时,则Z为-100;' f2 j5 N8 C2 `6 w
对于G#130,若#130=3时,则为G03。6 ]6 y- P; w ^' A8 h: q
(3)变量的类型 ' n$ _0 y0 Y3 r
0MC系统的变量分为公共变量和系统变量两类。2 f/ c. a* U/ M. ~1 e* I
1)公共变量
a3 m5 `0 l. y( r1 a4 e 公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。
: i# ?* {" a2 s2 {# x1 O$ c公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。 . ~) q8 h" A! H. P' T
4 T7 m8 Y% L9 \
9 b6 j8 `. l4 v ]
- E" s: P4 a4 V% p
2)系统变量
" J/ y9 g. x( o4 K' ] 系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。
5 ^* X& @1 d5 j0 G, y6 s 系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。0 H# Z8 V* N8 C6 C# ]
接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。: R) ? O$ @' r2 M% ~
2、宏指令G65
; r9 M5 h2 a# ~! a4 t5 g+ w 宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。 ~- L! ^; \! j n. a0 i
一般形式: G65 Hm P#i Q#j R#k
7 R5 Q8 o6 Q: [6 N9 A& g式中:--宏程序功能,数值范围01~99;
- \( l; }5 [0 Q* n( D2 [3 z2 ]#i--运算结果存放处的变量名;+ x) g" H! T" \" D- |! N
#j--被操作的第一个变量,也可以是一个常数;
0 E! {2 a6 w( Q. ^#k--被操作的第二个变量,也可以是一个常数。. W4 Y" r# o8 q5 ^* U
例如,当程序功能为加法运算时:
+ Y$ G6 ^3 h* S4 L程序 P#100 Q#101 R#102...... 含义为#100=#101+#102
) c: n3 _6 s+ r9 s% H9 h程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#1024 W* u4 p; d" ^6 \
程序 P#100 Q#101 R15...... 含义为#100=#101+15 ' J+ @9 ^) n# G, _
1 ?! V0 n' `2 }4 t! `8 F: k' q3、宏功能指令
" X9 I# s& s" j1 J/ G5 T& M* K
4 H" N5 B: t p/ T: A(1)算术运算指令 + f: K7 o7 C \3 E# Z2 D
: \! _. D3 q4 b; X0 k7 @
1)变量的定义和替换 #i=#j " o2 x3 K1 B3 S% v: @; L V4 r
' x+ h8 g9 X' q; {3 ^
编程格式 G65 H01 P#i Q#j5 X8 o; [0 b, G/ s, {7 w) H
例 G65 H01 P#101 Q1005; (#101=1005) + L/ v2 I( I6 V# l0 _
G65 H01 P#101 Q-#112;(#101=-#112) 4 ~8 E1 Q+ F0 u- }
2)加法 #i=#j+#k: ?* N! N+ Q0 W! ?+ f- A! g
编程格式 G65 H02 P#i Q#j R#k # w6 L+ z$ P! {
例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)1 |# C; u! a5 I* a& ^5 }$ O3 g+ ^
3)减法 #i=#j-#k9 v: V" B- r& Y4 n
编程格式 G65 H03 P#i Q#j R#k* f# W9 Y+ c, M g5 d
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)2 |' A5 w/ \& `8 _ d4 J
4)乘法 #i=#j×#k+ s1 M B( f4 @% U' h* \( k+ z
编程格式 G65 H04 P#i Q#j R#k4 w+ `8 q' b3 d9 R5 m4 m2 h- {: p2 Z
例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)
5 M0 n3 v# ^0 f1 }9 L& |5)除法 #i=#j / #k
# v+ Q6 s5 w3 b* ^* b& ^编程格式 G65 H05 P#i Q#j R#k: v$ l9 M; y- F4 P
例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103)
2 b; @9 q- u7 l7 c! l2 R6)平方根 #i=
9 m; A( f0 J- b& @/ [3 o3 x编程格式 G65 H21 P#i Q#j
8 b% P& n2 E0 w/ K& e e例 G65 H21 P#101 Q#102;(#101= )
. \0 h" w! i. q# Y/ ]& o" S3 f7)绝对值 #i=│#j│
* G* Y8 [- A+ d编程格式 G65 H22 P#i Q#j
( w9 L; h+ @9 Z- T! d* K例 G65 H22 P#101 Q#102;(#101=│#102│) 3 U! C- z/ y& Z) q: R
8)复合平方根1 #i=
D2 |7 w& V1 W( f5 f编程格式 G65 H27 P#i Q#j R#k( S+ ^% F: Q+ L3 D7 K
例 G65 H27 P#101 Q#102 R#103;( #101=
- O o; D; g) g! s0 `- R9 V9 @! i9)复合平方根2 #i= * R# v, R1 V# f3 I/ z, h4 G
编程格式 G65 H28 P#i Q#j R#k
; D8 c7 y, \6 }- |; w例 G65 H28 P#101 Q#102 R#103
$ t4 V$ s% [- y: O/ z- {7 g; p0 f9 f! K; j A
1)逻辑或 #i=#j OR #k: S$ m7 g# V% Q! d
编程格式 G65 H11 P#i Q#j R#k
o* v( v% B; z! C) _例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)8 }! n7 f& L; H
: N) w/ K; }% B+ H4 F8 R, ^4 {
2)逻辑与 #i=#j AND #k% { N" Q$ |9 R" J0 M+ S% A% y
编程格式 G65 H12 P#i Q#j R#k
! W2 i! s4 Y+ x2 @例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103
# \0 h! T) I/ V+ f( U# ]
9 G0 l- @9 c' V. S3 D$ {: w% y- e7 O s
' N5 }" a( z& A+ K
: @/ E, t' C1 {2 N9 o! S6 W$ n(3)三角函数指令 , u9 p6 j9 i$ |
6 D3 W$ r7 n3 T6 u
# k6 N3 V u) @% q; c+ n9 u: Z" |5 i' J9 u2 l3 F
1)正弦函数 #i=#j×SIN(#k) 4 y e! m7 |. L* Q! |
' e2 j3 X1 {/ @* q& h i
编程格式 G65 H31 P#i Q#j R#k (单位:度) .
0 w# u) w+ }6 l7 @1 A% D
: t1 L7 e' S8 d8 w7 r1 X) j8 @$ ~例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))- [1 [7 B7 B+ s% {$ O4 ~
2)余弦函数 #i=#j×COS(#k)2 W1 ^$ x. L+ q3 [
编程格式 G65 H32 P#i Q#j R#k (单位:度)
% f# t) A% }( Q6 ^5 W4 c S例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103))
: y/ c2 j9 ?& L; a5 ]8 v# |6 [+ f) k3)正切函数 #i=#j×TAN#k
/ O' E3 h, H" y1 A; n编程格式 G65 H33 P#i Q#j R#k (单位:度)1 N1 z# L% j0 e6 A
例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))0 |* X9 L2 K! D; G
4)反正切 #i=ATAN(#j/#k)+ K i! Q( s' A$ ~' }0 o/ ]% V; J
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
% Y ?. I' j4 }, |# L1 j7 s% @# g例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103)
. f9 O1 D$ ?. ?; o! i& h
) Q& g, v, y+ j) x , W( I# {$ H- L$ H
8 ?/ y4 ^" ?( a) t( L8 _7 y! Z
(4)控制类指令8 Y' c! }! q3 Z- C& r8 ^
0 p- |* u/ k% N2 i7 _
0 j3 }* u, i0 |% i6 ^$ I
* b+ L" `+ a' h! u编程格式 G65 H80 Pn (n为程序段号)
4 E- s# }7 l' Z; ?: t0 L例 G65 H80 P120;(转移到N120)
" M" b! x& y7 i2 }7 p" l2)条件转移1 #j EQ #k(=)* @, d' l" H7 U
编程格式 G65 H81 Pn Q#j R#k (n为程序段号)8 r( ?" N0 b: X6 X5 z* N
例 G65 H81 P1000 Q#101 R#102
$ ]* k. ^" { |当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。/ X, Y! f, W" I; o( P
3)条件转移2 #j NE #k(≠): ?1 q* N$ q0 _+ }5 f
编程格式 G65 H82 Pn Q#j R#k (n为程序段号)
9 J: D8 g7 |) D例 G65 H82 P1000 Q#101 R#102
* b" g9 {. K. e9 b5 I2 G当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。
+ j& s; n* M0 x* R& V W( r4 t" [4)条件转移3 #j GT #k (> )
9 V3 g& B; ~: O, g3 G% _6 M编程格式 G65 H83 Pn Q#j R#k (n为程序段号)2 Q y" h2 j# Y+ e7 `, t, P& P5 h
例 G65 H83 P1000 Q#101 R#102# i" g, R5 W: d" U
当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。& L1 N k0 u! p, n
5)条件转移4 #j LT #k(<)
3 {7 \9 T( }. _' T4 V2 e编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
q6 F& o0 k B2 O3 p7 W例 G65 H84 P1000 Q#101 R#102 6 A( }2 W; k1 }9 |8 S4 S
当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。
7 ]8 v" v+ h2 I) v8 }3 H+ _6)条件转移5 #j GE #k(≥)$ J0 `4 P* {8 _. a; V- C
编程格式 G65 H85 Pn Q#j R#k (n为程序段号)
% @% Q V0 h" f% u4 {4 f9 b- K例 G65 H85 P1000 Q#101 R#102
# ]7 f6 _: F, O2 g当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。! a* e8 r& a, Y
7)条件转移6 #j LE #k(≤), l: [/ m' A$ J9 J8 ]" S" P/ _! \2 g
编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)3 M$ |& T& s& Y8 [
例 G65 H86 P1000 Q#101 R#102
T! Z. q2 z1 f5 l" a$ x当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。; H: d) a! M: m' _" o8 {+ g1 j p( v
/ L+ G+ _( l( h* r1 f/ p4、使用注意
8 M3 Z# ^/ [) W$ C$ ~; S* d 为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
' h! C' \8 ^' C8 ]5 ^* z0 v(1)由G65规定的H码不影响偏移量的任何选择;6 E' X0 K2 w6 H. t" c+ d& _
(2)如果用于各算术运算的Q或R未被指定,则作为0处理;7 L" N& n# f9 ]' V, N' l9 r
(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。
. T* J9 Y( U6 @& v+ S. \(4)转移目标序号可以是变量。 , ~- u* [! u6 a9 W2 [
. k% w! ?6 h/ X/ ~0 U# H9 y) v5、用户宏程序应用举例 : & \% H E1 }: i, q% ~2 V% r
) v$ r; I6 x) b% s. `
用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。
/ ^" L+ ^1 x2 J, Y' d
9 Z+ h8 N: S, @2 D7 e5 ?3 j# C5 m8 w使用以下保持型变量:5 i; ^9 F$ u m _& M3 X; v
#502:半径r;
7 L+ ?: J1 l' H; s8 r#503:起始角度α;
! @3 Q, A5 \3 x& D2 n' _. f#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;0 B9 x3 r. i3 m* I2 \- f
#505:孔底Z坐标值;
' P6 T, Y8 [% q) e6 v; R8 a#506:R平面Z坐标值;1 N f4 Q9 Z2 L4 A9 P0 O# U& u
#507:F进给量。
! j- z( x, b3 |/ F$ C. `使用以下变量进行操作运算:
- K3 c+ m1 c) Q& ?( Q#100:表示第i步钻第i孔的记数器;
r1 ]$ q* v% F#101:记数器的最终值(为n 的绝对值);
2 T8 ]4 v6 s# F; y4 q#102:第i个孔的角度位置θi的值; ! I) {5 e9 b) c' h. N- F/ ^% V9 s
#103:第i个孔的X坐标值;
* E- b3 d; R4 X: W#104:第i个孔的Y坐标值;
% `( c* _" O8 f用用户宏程序编制的钻孔子程序如下: % h5 u+ a' F/ Z( _
O90109 |/ H7 k. I1 A1 f7 \1 i1 d4 B. k
N110 G65 H01 P#100 Q0 //#100 = 05 [# L% `9 [1 f5 M' Z' j
N120 G65 H22 P#101 Q#504 //#101 = │#504│$ [ p; D" s: d$ y6 ^+ o8 r" ^
N130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
( N1 v8 S# g) D) Z1 G6 p8 qN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504- `: `& y2 \) w t' r
N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n" d6 b( b8 [7 K; L _6 z# @
N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标
! @5 A% v# f4 ^! `3 UN170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标( _6 b% t |$ u% f. h8 W6 Z& \2 p
N180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)5 ~/ V: [9 D; b: i: q0 |. F
N190 G00 Z#506 //快速进到R平面1 d! l$ g F l8 h3 ^
N200 G01 Z#505 F#507 //加工当前孔% J# v, r( P" h1 ?
N210 G00 Z#506 //快速退到R平面/ x- F8 y8 h# d: n7 X* P& k
N220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数- f4 R+ ~; \' T J9 m, F" r
N230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段
/ J5 A; j& O* n. _) s [5 [9 BN240 M99 //子程序结束 8 Z( D- ~( u2 a0 c& T
9 L( S: ^" p- n% i8 D) k' ]
d. o- N( w& \- j3 }$ L, O3 B2 p4 B
调用上述子程序的主程序如下: * ^( h+ s: t. o
O0010
% ]+ k. n1 Q* W9 t6 J& B) hN10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系
9 c2 P( P% K& B' u NN20 M98 P9010 //调用钻孔子程序,加工圆周等分孔; P6 e a7 B* `0 C5 x3 E
N30 Z20 //抬刀
& Y8 G# I9 W& C, c# g8 t/ QN40 G00 G90 X0 Y0 //返回加工坐标系零点 - n0 q( p, u; V& @6 G3 A0 d t
N50 M30 程序结束
* w; P) `. B; p, Z o9 C设置G54:X=-400,Y=-100,Z=-50。 A1 ~0 a& C/ D# y# T
变量#500~#507可在程序中赋值,也可由MDI方式设定。 / @: Q: u3 J3 i& m
1 c0 H) Y1 D1 ?+ d5 A
B类宏G65
3 A- B n! Q7 \% y6 G. J; d4 C3 l6 K. D5 t* ]8 v/ b5 @
简单调用(G65)
3 A ^7 n; y2 y8 f+ E 功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。
7 R4 s3 w. k# E. C, @ 格式 G65 Pp Ll <自变量表>;: _, S0 W0 a7 U
其中: p 要调用的程序号
, m `5 w0 F; i. m9 P l 重复的次数(缺省值为1,取值范围1~9999)
# d$ T$ D! P" o- n8 ] 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应 8 m: o: k% V0 q+ n
的局部变量。
0 a8 l5 ]5 ?1 I# O' n+ c1 [4 a
' S; H: I4 {! C0 P m) {1 }$ R 自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:& g6 A& F9 ^0 v; x" n& [- j2 i3 z
( S4 ]% J, w: o. J
地址 变量号 地址 变量号 地址 变量号% e2 i8 ~* k Y, v* p$ m
A #1 E #8 T #20
4 N2 R( C7 c" s. N1 D8 X2 [0 eB #2 F #9 U #218 u9 l/ O4 h$ ?# Y
C #3 H #11 V #22
& a( O) ?' n E- B7 j7 w+ x4 VI #4 M #13 W #23
6 ^3 r; Z" Z# V9 QJ #5 Q #17 X #24
- |( K k+ u8 M. g+ TK #6 R #18 Y #25
" _: {( {. W, c3 ]* G9 CD #7 S #19 Z #26( I& g! R- q% h3 F) ?( |8 s9 y
☆ 地址G、L、N、O、P不能当作自变量使用。
! ^ `3 N7 }9 n% d4 e☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。
- Q- o( G; P6 o' O3 h 9 Y; `/ U- O4 U
第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使9 [; T ?9 N& B) N
用的字母自动确定:
4 ^: Q" h" i2 U地址 变量号 地址 变量号 地址 变量号: \3 b0 v1 V7 H4 {6 l6 _
A #1 K3 #12 J7 #23
: b6 n: G/ o W, B# U7 A+ UB #2 I4 #13 K7 #24
/ m2 o- x4 V9 oC #3 J4 #14 I8 #25
( o1 l3 I( E0 B; r& Y1 [I1 #4 K4 #15 J8 #267 `) l/ d$ ~+ ?- Z8 ]+ M* o
J1 #5 I5 #16 K8 #27
- R( C, z1 k, ?* s) O6 n( a' WK1 #6 J5 #17 I9 #28
4 T' R! f( d. X5 |& B/ xI2 #7 K5 #18 J9 #29# Z6 d3 V' v' N+ x
J2 #8 I6 #19 K9 #304 P# C2 \3 k7 k7 h; t
K2 #9 J6 #20 I10 #31
6 V. F$ U0 v- f5 d- ]# vI3 #10 K6 #21 J10 #32
4 ~5 R9 w% n8 l, k2 |9 \J3 #11 I7 #22 K10 #338 K- }2 m0 `0 K
☆ 在实际的程序中,I、J、K的下标不用写出来。
. T/ o4 t" M0 `9 x注意:, }; b; ~7 D* G& K' A+ ~
☆ 在自变量之前一定要指定G65。0 ^+ T- z& I, m5 y
☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
. {# d+ A7 y4 {" j- {0 v7 F9 k☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。. X. D$ y" u3 ^/ c) i9 q" n0 p6 R0 B
☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。
$ D: s* J9 q# L* |# R G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环
2 i/ I) u3 l& @/ y8 o0 S之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|