|
|
发表于 2011-7-12 08:32:36
|
显示全部楼层
回复 1# 钟云驹
6 {8 m" j' R1 S" U7 n& C详解A类宏
7 [. J9 ?4 M) K) t分类:默认分类 字号: 大大 中中 小小 用户宏功能是提高数控机床性能的一种特殊功能。使用中,通常把能完成某一功能的一系列指令像子程序一样存入存储器,然后用一个总指令代表它们,使用时只需给出这个总指令就能执行其功能。& D( P- W! ^: d9 h. B U& T9 o* A
用户宏功能主体是一系列指令,相当于子程序体。既可以由机床生产厂提供,也可以由机床用户自己编制。
( K* m, q0 ^. r" z) X Q& h 宏指令是代表一系列指令的总指令,相当于子程序调用指令。
! Z7 o2 {# p% O& t! w 用户宏功能的最大特点是,可以对变量进行运算,使程序应用更加灵活、方便。
5 _1 `2 U' L, Y! v( k 用户宏功能有A、B两类。这里主要介绍A类宏功能,B类宏功能请参见本课程的B类宏程序介绍。& {6 X x5 j* x8 |6 i( ~
1、变量$ Q9 \1 P0 j( }& n( F0 J/ G
在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址。为了使程序更具通用性、更加灵活,在宏程序中设置了变量,即将变量赋给一个地址。+ c: x% Q( [! b8 _+ }
(1)变量的表示- k2 U: C( n f% J: g) t: k& {0 k! z
变量可以用“#”号和跟随其后的变量序号来表示:#i(i=1,2,3......)' a+ K: q A/ Y! t
例:#5, #109, #501。+ d/ D7 z1 p& v
(2)变量的引用3 b+ o- _0 k- P E/ Q
将跟随在一个地址后的数值用一个变量来代替,即引入了变量。9 w8 z' j1 u- M3 L+ t) C
例:对于F#103,若#103=50时,则为F50;- f" `4 K+ w l" @- R8 K& A8 e5 G# {
对于Z-#110,若#110=100时,则Z为-100;5 o4 t1 p! s4 \
对于G#130,若#130=3时,则为G03。6 A; b! a- v- ?1 K
(3)变量的类型
& X6 }. n# o8 A+ L* Y 0MC系统的变量分为公共变量和系统变量两类。3 f) G# X9 i4 I5 v
1)公共变量
1 q; C3 v; D2 @ 公共变量是在主程序和主程序调用的各用户宏程序内公用的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的。" t" G! t) D8 T, d
公共变量的序号为:#100~#131;#500~#531。其中#100~#131公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#531公共变量即使断电后,它们的值也保持不变,因此也称为保持型变量。
7 w! A3 c2 Y6 @( W
& X# v# t% j* W; a! O& f: Z5 Y3 J, s6 r
9 a) E5 ?) u4 K4 A' W0 g% ~, a$ F
2)系统变量 ) b) O( O, O; j3 b. I: O: {
系统变量定义为:有固定用途的变量,它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。
1 |/ |) t4 y% `" V+ S: S y 系统变量的序号与系统的某种状态有严格的对应关系。例如,刀具偏置变量序号为#01~#99,这些值可以用变量替换的方法加以改变,在序号1~99中,不用作刀偏量的变量可用作保持型公共变量#500~#531。
, A; _" ~7 i) K+ t1 a/ z7 {6 W" k 接口输入信号#1000~#1015,#1032。通过阅读这些系统变量,可以知道各输入口的情况。当变量值为“1”时,说明接点闭合;当变量值为“0”时,表明接点断开。这些变量的数值不能被替换。阅读变量#1032,所有输入信号一次读入。' j8 K1 Y$ w! w& D6 |
2、宏指令G659 r- Z9 @9 t: v6 |1 x
宏指令G65可以实现丰富的宏功能,包括算术运算、逻辑运算等处理功能。8 T0 }; A# l- V
一般形式: G65 Hm P#i Q#j R#k
) _; z4 O/ U) x( K% z5 ?式中:--宏程序功能,数值范围01~99;
5 X8 ^4 I; x9 D( \6 I6 G#i--运算结果存放处的变量名; F$ `4 E- r, T3 s k9 F# @/ D6 l" f& ~6 {
#j--被操作的第一个变量,也可以是一个常数;6 |$ ?/ L( }0 E8 ~( B" ^0 }6 Q! v
#k--被操作的第二个变量,也可以是一个常数。
3 A1 Y- f9 m8 |, L9 h1 G例如,当程序功能为加法运算时:
; W* N+ Z8 J2 C3 O: D8 [程序 P#100 Q#101 R#102...... 含义为#100=#101+#102
( l, f V% s! [- m, \' J程序 P#100 Q-#101 R#102...... 含义为#100=-#101+#102) u9 i# X1 j+ ]# O
程序 P#100 Q#101 R15...... 含义为#100=#101+15
" R% S; u# E* E$ J- F$ w& @
) }5 m9 B8 N2 H# z' M3、宏功能指令
, R _- l1 {' }: a E2 F: r" k7 P2 i6 c! L
(1)算术运算指令
t) p# P5 {% M( k$ A
$ |# Y7 ?9 d- W* q2 O, B& j+ y1)变量的定义和替换 #i=#j : ~, H* {/ {) U' E# a7 N4 @
& T& U2 R8 Q3 F: T D5 G Y- e$ }/ _
编程格式 G65 H01 P#i Q#j/ V* I5 O1 L0 S4 L
例 G65 H01 P#101 Q1005; (#101=1005)
1 n- T5 U, d! t0 tG65 H01 P#101 Q-#112;(#101=-#112)
3 i& d5 w7 w% ^( y1 @ U2)加法 #i=#j+#k
) N; M6 _9 X0 G$ S6 R+ U编程格式 G65 H02 P#i Q#j R#k 6 P E% b% V/ r& w
例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103)
; H$ [, r8 u/ d# j+ ~8 D1 l& i% ~; E. E3)减法 #i=#j-#k$ j0 g* w# m, S, _6 h1 \+ C
编程格式 G65 H03 P#i Q#j R#k0 e: i4 A6 o, h
例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103)
6 q' r6 u, m2 s" A4)乘法 #i=#j×#k( d3 K* L4 @$ k0 p }6 s
编程格式 G65 H04 P#i Q#j R#k9 n1 N: p& }+ {( v6 j
例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103)
" Y; J1 Q% _5 o3 q# ^5)除法 #i=#j / #k
. h3 G9 y4 j$ }7 f% \2 o5 ?! J ^编程格式 G65 H05 P#i Q#j R#k; T1 y+ Z; l7 m: T6 W9 @4 I
例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103); G( v2 N& N) N# ~, o4 o
6)平方根 #i= ( y t6 q4 j5 Z3 l X2 s
编程格式 G65 H21 P#i Q#j! W* `# B* M3 ^" G5 o; n9 d3 i" }+ O
例 G65 H21 P#101 Q#102;(#101= )
6 w2 n8 f( t" p7 Q6 W- { Q7)绝对值 #i=│#j│- m( w3 T& ], O
编程格式 G65 H22 P#i Q#j
/ |" W# D( l8 E) _例 G65 H22 P#101 Q#102;(#101=│#102│) + @& f3 s5 g" c/ p5 r; h
8)复合平方根1 #i=
) F! j- _& _* u# p/ w) c& A编程格式 G65 H27 P#i Q#j R#k( g+ |( T3 p* g, e4 I
例 G65 H27 P#101 Q#102 R#103;( #101=
0 a6 `9 \3 e; Y, T% m5 }5 i9)复合平方根2 #i= ; J/ y5 L" K9 S8 C+ D' p, a
编程格式 G65 H28 P#i Q#j R#k: D. n5 m( J7 ?/ K
例 G65 H28 P#101 Q#102 R#103
* N+ H. X5 \& I1 s V% [# R8 b$ Q( }) _$ M- t! z6 M0 [& r
1)逻辑或 #i=#j OR #k
! G- k# t" z2 B1 O* K编程格式 G65 H11 P#i Q#j R#k
' a' v9 d9 F1 |+ S例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103)
) s6 p9 r5 U0 J: R( _: y0 B; r
0 {9 N1 P/ C4 ?& |3 J- n2)逻辑与 #i=#j AND #k2 ~2 s1 \) {5 y* V
编程格式 G65 H12 P#i Q#j R#k) M9 v. [7 w7 N3 S
例 G65 H12 P#101 Q#102 R#103;#101=#102 AND #103 / J5 j) _! j8 ]- B4 Y
$ |/ K% W& A8 n& n' A8 J1 O* f Q9 a- ?* n% S$ P
~% X U8 D8 h* G
- n3 q& q/ \2 }% ^/ {
(3)三角函数指令 9 q1 H1 A% y+ `/ A- f0 P/ m' j
, H% F: F% Y( e9 b7 n
* h, N, ^' F9 _+ A4 ~5 N" o% q( C: x* e4 q8 h4 H) O/ R. i) _
1)正弦函数 #i=#j×SIN(#k)
/ k2 l4 H% ~5 L1 b w* q- j" G0 O x
编程格式 G65 H31 P#i Q#j R#k (单位:度) .
3 U/ k' p+ g9 j# Z
3 }7 F: F9 D, A4 K例 G65 H31 P#101 Q#102 R#103;(#101=#102×SIN(#103))
# w/ X1 A9 V3 B1 s' N2)余弦函数 #i=#j×COS(#k)- ?$ P( N* m c4 E% j( l
编程格式 G65 H32 P#i Q#j R#k (单位:度)& {2 k: k" N; B6 h0 {5 n
例 G65 H32 P#101 Q#102 R#103;(#101=#102×COS(#103)) x* O& I) W& g0 i
3)正切函数 #i=#j×TAN#k* m/ F" l, b3 C( d. n! ~
编程格式 G65 H33 P#i Q#j R#k (单位:度)
, m9 m J9 `2 n6 I例 G65 H33 P#101 Q#102 R#103;(#101=#102×TAN(#103))
7 W; p5 w) h1 A% q4)反正切 #i=ATAN(#j/#k), x3 _1 [6 f, i7 X- G- s
编程格式 G65 H34 P#i Q#j R#k (单位:度,0o≤ #j ≤360o)
8 E1 U% g) x, B9 o0 O. H例 G65 H34 P#101 Q#102 R#103;(#101=ATAN(#102/#103). P. P/ z! {; k( R ^ j+ X; g
9 C; N$ z. b% u
- ~/ K9 V1 [/ T) @ h$ |' o0 \; j L1 `4 V* D$ ?( K) A- \: T
(4)控制类指令+ E2 J9 D1 d0 T* c
9 [ ~1 l: |) p8 a5 L! \
( [# l% p5 g4 D1 \4 h2 w: w1 `9 \& r6 k
编程格式 G65 H80 Pn (n为程序段号). g& z) z* P" w1 S( b# E
例 G65 H80 P120;(转移到N120)" i, a8 l7 x3 C$ K
2)条件转移1 #j EQ #k(=)
( u9 }5 D, V1 Z: f5 _( @+ ~; D编程格式 G65 H81 Pn Q#j R#k (n为程序段号)' n6 V, r7 _1 j0 E+ A! A
例 G65 H81 P1000 Q#101 R#102
, r5 D* |& c+ A7 e" d当#101=#102,转移到N1000程序段;若#101≠ #102,执行下一程序段。
8 k4 y/ y1 `4 E( _+ W5 t5 r3)条件转移2 #j NE #k(≠)
" J: F: G4 b9 X5 o% i, r8 Q& h编程格式 G65 H82 Pn Q#j R#k (n为程序段号)
: H& \0 g7 `2 }9 C# U# r: X0 k例 G65 H82 P1000 Q#101 R#102. X. l7 P; r$ D5 Z8 D$ y1 }1 C- y2 d
当#101≠ #102,转移到N1000程序段;若#101=#102,执行下一程序段。
- Y' M' z- p& c! c4)条件转移3 #j GT #k (> )/ t; B6 g3 i6 x9 z, ?
编程格式 G65 H83 Pn Q#j R#k (n为程序段号)+ M0 y1 W- ]9 G# f8 J8 M8 Z: G
例 G65 H83 P1000 Q#101 R#1028 M# G3 B _4 U) O# `- I
当#101 > #102,转移到N1000程序段;若#101 ≤#102,执行下一程序段。7 v# {; l/ p! W2 o! Q& C4 c$ w
5)条件转移4 #j LT #k(<)
" @! H8 x# U6 {( F7 ^5 z9 p3 ~0 y& \编程格式 G65 H84 Pn Q#j R#k (n为程序段号)
4 Y5 A h# w2 Q$ @( h例 G65 H84 P1000 Q#101 R#102
8 b1 z7 d0 c4 S, G( J4 D当#101 < #102,转移到N1000;若#101 ≥ #102,执行下一程序段。
, z7 }1 I: c; g6)条件转移5 #j GE #k(≥)
+ q" h) B6 P% r/ D编程格式 G65 H85 Pn Q#j R#k (n为程序段号)! F" K3 T& c I, x. ^; z1 M
例 G65 H85 P1000 Q#101 R#102
% y! h% a% n" ?. G' {' `3 a当#101≥ #102,转移到N1000;若#101<#102,执行下一程序段。- {# Z0 D+ Y: S1 w( P4 Z- h/ O
7)条件转移6 #j LE #k(≤)( e" M+ ?+ l$ |3 L- v
编程格式 G65 H86 Pn Q#j Q#k (n为程序段号)
3 p& V) _0 R' @# N& Y7 m1 m例 G65 H86 P1000 Q#101 R#102
: h& [$ R1 q$ w3 |8 x1 r+ J* b当#101≤#102,转移到N1000;若#101>#102,执行下一程序段。! g6 N/ v& R& X) |* u
! A+ K& N: p9 e5 q6 Y3 A, Q* z D% m4、使用注意+ h7 `, R4 o* i
为保证宏程序的正常运行,在使用用户宏程序的过程中,应注意以下几点;
5 D; P) L3 T# R' U" f( `7 V(1)由G65规定的H码不影响偏移量的任何选择;0 g$ P `8 @9 \0 n$ [, @
(2)如果用于各算术运算的Q或R未被指定,则作为0处理;
$ a7 i6 j% ~) w- @2 a8 D$ Q(3)在分支转移目标地址中,如果序号为正值,则检索过程是先向大程序号查找,如果序号为负值,则检索过程是先向小程序号查找。. q t8 `4 S# C, ]7 Q3 t% h' u
(4)转移目标序号可以是变量。
- W% O9 r6 r9 H6 Q, l
. |9 I: b4 ]: |, F8 F' p5、用户宏程序应用举例 :
$ G' m" a7 ^& g, ^" B0 y3 I; i6 b1 U1 I* W. _$ I- L
用宏程序和子程序功能顺序加工圆周等分孔。设圆心在O点,它在机床坐标系中的坐标为(X0,Y0),在半径为r的圆周上均匀地钻几个等分孔,起始角度为α,孔数为n。以零件上表面为Z向零点。
2 m. u+ A+ ?; v S
$ Z+ `+ t- m' c# r5 H. C9 @+ u使用以下保持型变量:
6 m& R. G& z Z+ V1 j9 d#502:半径r;4 k! ?+ I8 Q7 X4 [. v+ r% Z
#503:起始角度α;
, o; K* M; v2 d6 o#504:孔数n,当n>0时,按逆时针方向加工,当n<0时,按顺时针方向加工;' H' Z; j5 _% e0 I! N! Y
#505:孔底Z坐标值;5 D) P" X9 m5 F, |% g+ }
#506:R平面Z坐标值;$ v4 C4 d' X1 x! f f; U
#507:F进给量。
' U" u" I; `! c3 i7 c; b使用以下变量进行操作运算:
/ G. x9 g1 i6 e#100:表示第i步钻第i孔的记数器;8 }, F' k% E8 V. ]
#101:记数器的最终值(为n 的绝对值);
. l! R* r+ k) r4 l( B9 N#102:第i个孔的角度位置θi的值;
2 c- T7 \% y( F1 R#103:第i个孔的X坐标值;
+ e- u: t' w, D" J% i#104:第i个孔的Y坐标值;2 m( z% ]$ R% e! E
用用户宏程序编制的钻孔子程序如下: ( Q+ N5 I9 U# { O
O90100 W$ J) l5 z# L
N110 G65 H01 P#100 Q0 //#100 = 0
. D7 |: M! V# y6 ^. iN120 G65 H22 P#101 Q#504 //#101 = │#504│
7 Z# |* Z5 ]& [/ e- u% _N130 G65 H04 P#102 Q#100 R360 //#102 = #100 ×360o
$ e6 L3 e- E6 d O% F: xN140 G65 H05 P#102 Q#102 R#504 //#102 = #102 / #504, n& Q+ Z& U7 s% q3 Q& m7 X) d
N150 G65 H02 P#102 Q#503 R#102 //#102 = #503 + #102当前孔角度位置θi =α+ (360o×i) / n' q# E9 K6 H2 i, D
N160 G65 H32 P#103 Q#502 R#102 //#103 = #502 ×COS(#102)当前孔的 X坐标& U1 w# h8 l0 s! \ D
N170 G65 H31 P#104 Q#502 R#102 //#104 = #502 ×SIN(#102) 当前孔的Y坐标
' d! p3 [9 Y p4 K( q! I0 NN180 G90 G00 X#103 Y#104 //定位到当前孔(返回开始平面)
) C1 ~ Y$ [: _. A8 A% `7 `) C( O8 b/ Y/ iN190 G00 Z#506 //快速进到R平面6 U9 v" z+ {1 H5 }% m0 n
N200 G01 Z#505 F#507 //加工当前孔
. ~* P2 \# V; w. hN210 G00 Z#506 //快速退到R平面
6 A K6 s5 I; EN220 G65 H02 P#100 Q#100 R1 //#100 = #100+1孔计数8 \4 B7 A! V% J# l
N230 G65 H84 P-130 Q#100 R#101 //当#100 < #101时,向上返回到130程序段) _; z# q. [* x: T
N240 M99 //子程序结束
G- ]( B8 e0 h0 T# _
) D: l6 a$ T3 g" ]$ }; ] 7 b. J9 j* U2 F2 {3 D; s& G. g' I
( o5 A+ l, ?9 o0 j+ ~
调用上述子程序的主程序如下: / x8 }" P( J/ D8 ~4 C8 r" o. Y
O0010 F- w( W/ E. E3 m+ [( D$ W
N10 G54 G90 G00 X0 Y0 Z20 //进入加工坐标系4 h6 R/ k9 | [
N20 M98 P9010 //调用钻孔子程序,加工圆周等分孔
% m7 J+ J' e. R, qN30 Z20 //抬刀
# b8 T3 ?; I- ^, c v" AN40 G00 G90 X0 Y0 //返回加工坐标系零点
2 a9 C9 S$ r2 w0 F, x8 B6 {$ IN50 M30 程序结束
& Q2 R: {% q6 }, \5 x" P p设置G54:X=-400,Y=-100,Z=-50。6 n) Y% ^/ _: T) J
变量#500~#507可在程序中赋值,也可由MDI方式设定。 6 _( ?1 N) L$ \. y; z& y2 z
! b% `, d4 ?4 h6 N( C1 O; a
B类宏G652 d2 Z" V3 C) D- u! \/ @
8 N& r, T9 i) k( U* Q简单调用(G65)( ?# G+ `" r0 E5 M4 w
功能 G65被指定时,地址P所指定的程式被调用,自变量能传递到用户宏程序中。
$ H" s0 l; o& f5 q2 b6 N' C0 r( D 格式 G65 Pp Ll <自变量表>;
3 K$ {0 N0 c- S 其中: p 要调用的程序号
+ `) H% h) G$ u/ b% p l 重复的次数(缺省值为1,取值范围1~9999)
, c: z& E8 }9 t9 O7 z% K9 F 自变量 传递给被调用程式的数。通过使用自变量表,值被分配给相应
; A: L) t' Q8 u. }' p 的局部变量。
' X1 R9 i5 `- Y. y2 N9 D2 m
( V7 h7 f# X( Z. A, [ 自变量分为两类。第一类可以使用的字母只能使用一次,各自变量与局部变量的对用关系如下:. W( I( w% ?; \: ^& F: W
- ?- c3 `$ f# J, A4 N, D* I
地址 变量号 地址 变量号 地址 变量号
/ @0 `' |6 z: G, u/ _+ wA #1 E #8 T #20
+ w& v7 Z' q% n( FB #2 F #9 U #21
5 k, }+ [% b# Y! }+ G. xC #3 H #11 V #22
0 P, h- E8 |) U2 k/ v. K: _I #4 M #13 W #23
7 l) P! r' e. l9 RJ #5 Q #17 X #24
' U) |9 T8 V4 X8 k% s. C( cK #6 R #18 Y #255 v- ?( \ Q7 r1 {! P
D #7 S #19 Z #26
& }4 Z0 d% c( E☆ 地址G、L、N、O、P不能当作自变量使用。
4 n$ j4 S7 l( }* f7 B$ e& v☆ 不需要的地址可以省略,与省略的地址相应的局部变量被置成空。
, x2 h8 p+ k% ]4 G& g9 L% F% t% K! M
$ P: _8 m& ?6 @( K 第二类可以使用A、B、C(一次),也何以使用I、J、K(最多十次)。自变量使用的类别根据使
: t- l$ u: P C! x8 p1 n: M- U用的字母自动确定:7 Q3 u/ Q! V0 b5 @2 L/ n. O
地址 变量号 地址 变量号 地址 变量号 h1 u6 t; J- v
A #1 K3 #12 J7 #23" k3 m1 M: x) F8 S3 d U' c7 K
B #2 I4 #13 K7 #24
. J I/ V; A! R% p( c, vC #3 J4 #14 I8 #25
f% J0 m8 z3 D0 S% S6 GI1 #4 K4 #15 J8 #26' a% _* J0 a& v; f/ k
J1 #5 I5 #16 K8 #276 f; \1 C) }# V0 p$ P) r4 W
K1 #6 J5 #17 I9 #28
- K9 W. r, I0 [* S- x+ q& P- U: uI2 #7 K5 #18 J9 #292 ]8 ]4 `4 m4 }% g9 `3 O7 H: l
J2 #8 I6 #19 K9 #30
7 Z/ j2 ]( \& v7 n# ^" Q. p) N: qK2 #9 J6 #20 I10 #31
7 o5 S1 Q8 e3 p0 rI3 #10 K6 #21 J10 #32
' l K4 j) w R. DJ3 #11 I7 #22 K10 #33
6 n/ w1 r, ^' u☆ 在实际的程序中,I、J、K的下标不用写出来。
3 O8 B& ^3 x/ t* Q( _注意:
: d! S% j4 \, r) S☆ 在自变量之前一定要指定G65。( n P- X) }# n+ s! i. |
☆ 如果将两类自变量混合使用,系统自己会辨别属于哪类,最后指定的那一类优先。
7 F' e7 \# X% M) t4 o% ]☆ 传递的不带小数点的自变量的单位与每个地址的最小输入增量一致,其值与机床的系统结构非常一致。为了程序的兼容性,建议使用带小数点的自变量。
% b5 W$ J2 `% f. P☆ 最多可以嵌套含有简单调用(G65)和模态调用(G66)的程序4级。不包括子程序调用(M98)。局部变量可以嵌套0~4级。主程序的级数是0。用G65和G66每调用一次宏,局部变量的级数增加一次。上一级局部变量的值保存在NC 中。宏程序执行到M99时,控制返回到调用的程序。这时局部变量的级数减1,恢复宏调用时存储的局部变量值。
9 A* L- I$ y, r G65简单宏调用可方便地向被调用的副程式传递数据,但是用它制作诸如固定循环2 N3 C9 D, b# U* O1 K7 n& J
之类的移动到坐标后才加工的程式就无能为力了。 |
评分
-
查看全部评分
|