FANUC系统用户宏程序
用户宏程序1.概念反复进行同一切削动作时,使用子程序效果较好,但若使用用户宏程序的话,可以使用运算指令、条件转移等,适于编制更简单、通用性更强的程序。并且与子程序一样,在加工程序中用简单地命令就可以调用用户宏程序。在FANUC系统中,包含变量、转向、比较判别等功能的指令称为宏指令。包含有宏指令的子程序称为宏程序。这里以FANUC系统中B类用户宏程序来作简单介绍,也就是FANUCPowerMaterO系统所用的方法。
宏程序的最大特征有以下几个方面:
(1)可以在宏程序主体中使用变量。
(2)可以进行变量之间的演算。
(3)可以用宏程序命令对变量进行赋值。
使用宏程序时的主要方便之处在于由于可以用变量代替具体数值,因而在加工同一类的工件时,只需将实际的值赋与变量既可,而不需要对每一个零件都编一个程序。
例:a=10,b=20,c=5,d=8时其精加工轨迹运行程序为:
N10G00X0Z0;N20G03X10.W-5.R5.F100;N30G01X20.W-8.;N40G00X100.Z100.;a,b,c,d值变化时则又需要编一个程序。
实际上我们可以将程序写为:
N10G00X0.Z0.;N20G03XaW-cRcF100;N30G01XbW-d;N40G00X100.Z100.;此时可以将其中变量,用宏程序中的变量#i的对应为:a:#1;b:#2;c:#3;d:#7。则宏程序即可写成如表6-14所示形式:
表6-14
例6-10宏程序编写主程序宏程序O1234N10G50X100.Z100.;N20M03S1000;N30G65P9810A10.B20.C5.D8.;N40M05;N50M30;O9810;N10G00X0.Z0.;N20G03X#1W-#3R#3F100;N30G01X#2W-#7;N40G00X100.Z100.;N50M99;用A,B,C,D分别代表变量#1,#2,#3和#7,用a,b,c和d赋值后,用宏命令G65P9810AaBbCcDd来调用。
如上述所示,当加工同一类,但只是尺寸不同的工件时,只需改变宏命令的数值即可,而没有必要针对每一个零件都编一个程序。
2.变量在一般的加工程序中,G代码移动距离可直接用数值指令,如G00X100.0。但在用宏程序中,数值可直接指定,也可用变量号指定。因此,变量是指可以在宏主体的地址上代替具体数值,在调用宏主体时再用引数进行赋值的符号:#i(i=1,2,3……)。使用变量可以
使宏程序具有通用性。宏主体中可以使用多个变量,以变量号码进行识别。
(1)变量形式。变量是用符号#后面加上变量号码所构成的,即:#i(i=1,2,3,……)。
例如:#5;#109;也可以用公式的形式指令,但此时必须用括号把公式括起来。即:#[表达式]的形式来表示。例如:#[#1+#2-12](2)变量的引用。在程序内引用变量时,是在地址
符后指定变量号。例如F#33,则当#33=1.5时,与F1.5相同;Z-#18,当#18=20.0时,与Z-20.0指令相同。
用公式指定时在公式的前后要加上括号。例如:G01X[#1+#2]F#3;注意:1)作为地址符的O,N,/等,不能引用变量。如:O#27,N#1等都是错误的。
2)用程序定义变量值时,可以省略小数点。没有小数点变量的数值单位为各地址字的最小设定单位。因此,传递没有小数点的变量,将会因机床的系统设置不同发生变化,在宏程序调用中使用小数点可以提高程序的兼容性。
3)被引用的变量值,按各地址的最小设定单位进行四舍五入。例如:对于最小设定单位为1/1000的CNC,当#1为12.3456,若执行G00X#1;相当于G00X12.346;若要改变变量值的符号引用时,要在“#”符号前加上“-”号。例如:G00X-#1;
(3)未定义变量。没有定义变量值的状态称为空变量。#0通常为空变量,可以读取但不能写入。空变量不等于变量值为0的状态。
1)引用未定义变量时,连同地址字无效。例如:#1为0,#2为〈空〉时,若执行G00X#1Z#2时,为G00X0;2)在运算式中,除了被〈空〉置换的场合以外,与数值0相同。
3)在等于或不等于这些条件比较式中,〈空〉与零不同。例如:#1=〈空〉,#2=100,#3=50,执行#3=#1+#2以后,#3=100。
表6-15
变量的种类变量号变量的种类功能#0通常为空该变量总为“空”不能赋予值#1~#33局部
变量各宏程序可独自使用,保存计算结果。关电源时进行初始化,变量值为空。调用宏程序时,代入变量值#100~#149#500~#531公共变量在不同的宏程序之间,可以公共使用的变量。当关电源时,#100~#149变量初始化为空变量,#500~#531变量,仍保存原有数据#1000~系统变量进行读取、写入当前位置、刀具补偿量等NC各种数据的变量
说明:1)局部变量:#1~#33。所谓局部变量,就是在宏程序中局部使用的变量。换句话说,在某一时刻调出的宏程序中所使用的局部变量#1和另一时刻调用的宏程序(无论与前一个宏程序相同还是不同)中所使用的#1是不同的。因此,在多重调用时,当宏指令地址A调用宏指令地址B的情况下,也不会将A中的变量破坏。
2)公共变量:#100~#149,#500~#531。与局部变量相对,公共变量是在主程序,以及调用的子程序中通用的变量,因此,在某个宏程序中运算得到的公共变量的结果#i,可以用到别的用户宏中。
公共变量主要由#100~#149及#500~#531构成。其中前一组是非保持型,即断电后就被清零,后一组是保持型,即断电后仍被保存。
3)系统变量:#1000~。系统变量是根据用途而被固定的变量。主要有以下各种如表6-16
所示。
表6-16
系统变量
在宏程序中要改变某些模态信息,可以先保存进入时的模态信息,结束再恢复状态。
这样可以使数控系统保持该宏程序运行前后模态信息一致。这样的宏程序具有很好的安全性,即使不是该宏程序的编写者也可以放心地使用。
3.宏程序通常把下述的程序段称为宏语句:
*含代数运算和逻辑运算指令(=)的程序段;*含控制指令(GOTO,DO,END)的程序段;*含宏调用指令(用G代码调用如G65,G66,G67或用M代码调用)的程序段。
具有宏语句的程序称为宏程序。宏语句以外的程序段称为NC语句。
(1)运算指令。变量可以进行下述运算如表6-17所式。
表6-17
运算指令功能格式说明定义#i=#j
和差积商#i=#j+#k;#i=#j-#k;#i=#j*#k;#i=#j/#k;
正弦余弦正切反正切#i=SIN﹝#j﹞;#i=COS﹝#j﹞;#i=TAN﹝#j﹞;#i=ATAN﹝#j/#k﹞;角度用角度单位指令,如:
90度30分为90.5度平方根#i=SQRT﹝#j﹞;取整后的数值的绝对值比变量号码用途#1000~#1015接口信号(输入),按位读取的信号#1100~#1115接口信号(输出),按位写入的信号#2001……#2316刀具补偿量#3000宏报警信息#3001,#3002,#3011,#3012时
间信息#3003,#3004控制自动运转#3005SETTING数据#3007镜像#4001~#4022G代码#4109F代码#4113M代码#4114顺序号#4115程序号#4119S代码#4120T代码#5001……#5102当前位置、刀具和伺服位置偏差量#5201……#5322工件原点偏置量
绝对值四舍五入化整下取整上取整#i=ABS﹝#j﹞;#i=ROUND﹝#j﹞;#i=FIX﹝#j﹞;#i=FUP﹝#j﹞;原来的数值大时称为上取整,反之,称为下取整。
逻辑和“异”门逻辑乘#i=#jOR#k;#i=#jXOR#k;#i=#jAND#k;对二进制进行逻辑运算从十进制变换为二进制从二进制变换为十进制#i=BIN﹝#j﹞;#i=BCD﹝#j﹞;用于与PMC的信号交换1)运算的优先级:①函数;②乘、除类运算(*,/,AND,MOD);③加、减类运算(+,-,OR,XOR);例:#1=#2+#3*SIN[#4];运算顺序为:①函数SIN[#4];②乘#3*……;③加#2+……;2)括号的嵌套:当要变更运算的优先顺序时,使用括号。包括函数的括号在内,括号最多可用到5重,超过5重时则出现报警。
例:#1=SIN[[[#2+#3]*#4+#5]*#6];(2)控制语句。在程序中,使用GOTO,IF语句,可以改变程序的流程。转移与循环有以下3种:
GOTO语句(无条件转移)
转移和循环
IF语句(条件转移,如果……)
WHILE语句(当……循环)
1)无条件转移(GOTO语句)。无条件转移到顺序号为n的程序段。
格式:GOTOn;n:顺序号(1~99999)另外,顺序号可用表达式表示。
例:GOTO1;GOTO#10;2)条件转移(IF语句)。IF后面是条件式。如果条件成立,则转移到顺序号为n的程序段,否则,执行下一个程序段。
例如:如果#1值比10大,则转移到顺序号N60的程序段。
格式:IF[#1GT10]GOTO60;条件不成立→按程序顺序执行;
条件成立→执行N60G00G91X10.0;
说明:①条件式是由比较的2个变量之间,或一个常量与一个变量之间,写上比较运算符,然后再用方括号[]全部括起来而构成的。不用变量,也可用运算式。
②运算符是由2个英文字母构成,用来判断大、小或相等的,如表6-18所示。
表6-18
运算符运算符意义EQ等于(=)
NE不等于(≠)
GT大于(>)
GE大于或等于(≥)
LT小于(<)
LE小于或等于(≤)
[例6-11]:求1到10之和。
解:用FANUC系统编制宏程序,见表6-19。
表6-19
例6-11编程程序说明O9500N10#1=0;N20#2=1;N30IF[#2GT10]GOTO70;N40#1=#1+#2;N50#2=#2+1;N60GOTO30;N70M30;宏程序号结果的初值加数的初值若加数大于10,则转移到N70计算结果下一个加数转移到N30程序结束3)循环(WHILE语句)。在WHILE语句后必须指定一个条件表达式。
格式:WHILE[条件式]DOm;(m=1,2,3)
……
ENDm;
……说明:①在条件成立期间,执行WHILE之后的DO到END间的程序。条件不成立时,执行END的下一个程序段。条件式和运算符与IF语句相同。DO和END后的m数值是指定执行范围的识别号,可使用1,2,3,非1,2,3时报警。
②嵌套:在DO~END之间的循环识别号(1~3)可使用任意次,但是不能执行交叉循环,
否则要报警,如表6-20所示。
表6-20
WHILE语句的嵌套识别号(1~3)可多次使用DO的范围不能交叉DO的多重数最多可到3重WHILE[……]DO1;……END1;……WHILE[……]DO1;……END1;
WHILE[……]DO1;……WHILE[……]DO2;END1;……END2;
WHILE[……]DO1;……WHILE[……]DO2;
WHILE[……]DO3;……END3;……END2;……END1;不能跳出循环体程序不能转移到循环体中
WHILE[……]DO1;IF[……]GOTOn;END1;Nn;
IF[……]GOTOn;……WHILE[……]DO1;Nn……;END1;
注意:*如果省略WHILE语句,只指令了DOm,则从DO到END之间形成无限循环。
*在GOTO语句中,转移到顺序号时,要进行检索,因此反向进行的处理时间要比顺方向长,为了缩短处理时间,应使用循环WHILE语句。
*在条件式中,只有使用EQ,NE时,空和“0”是不同的,在其它条件中,把空和“0”都视为相同。
[例6-12]:用WHILE语句求1到10之和。
解:N10#1=0;N20#2=1;
N30WHILE[#2LE10]DO1;N40#1=#1+#2;N50#2=#2+1;N60END1;N70M30;(3)宏程序的调用。宏程序调用和一般子程序调用之间的差别:主要在于宏程序调用可以在调用语句中传递数据到宏程序内部,而子程序调用(M98)则没有这功能。其次,M98程序段可以与另一数据指令共处同一条指令,如G01X100.M98P1000;在执行时,先执行G01X100.;然后,再运行子程序O1000。而宏程序调用语句是自成一行。宏程序的调用有以下方法:
单纯调用(G65)
宏程序调用
模态调用(G66,G67)
用G代码、M代码等调用宏程序1)单纯调用(G65)。用指令G65可调用地址P指令的宏程序,并将赋值的数据送到用户宏程序中。
格式:G65P_L_〈引数赋值〉;说明:G65:是宏调用代码;P_:P之后为宏程序主体的程序号码;L_:循环次数(省略时为1);〈引数赋值〉:是由地址符及数值(有小数点)构成,由它给宏主体中所对应的变量赋予实际数值;例:O0001;
O9010……
N10#3=#1+#2;G65P9010L2A1.0B2.0;
N20IF[#3GT360]GOTO40;
……
N30G00G91X#3;M30;
N40M99;引数赋值有以下两种形式:
①引数赋值Ⅰ。除去G,L,N,O,P地址符以外都可作为引数赋值的地址符,大部分无顺序要求,但对I,J,K则必须按字母顺序排列,对没使用的地址可省略。
例如:
B_A_D_…I_K_…正确;
B_A_D_…J_I_…不正确。
引数赋值Ⅰ所指定的地址和用户宏主体内所使用变量号码的对应关系见表6-21所示。
表6-21
引数赋值Ⅰ的地址和变量号码的对应关系引数赋值Ⅰ的地址宏主体中的变量
引数赋值Ⅰ的地址
宏主体中的变量A#1Q#17B#2R#18C#3S#19
D#7T#20E#8U#21F#9V#22H#11W#23I#4X#24J#5Y#25K#6Z#26M#13
②引数赋值Ⅱ。A,B,C只能用一次,I,J,K作为一组引数,最多可指定10组。当给三维坐标赋值时,使用此种参数。引数赋值Ⅱ的地址和宏主体中使用变量号码的对应关系见表6-22所示。
表6-22
引数赋值Ⅱ的地址和变量号码的对应关系引数赋值Ⅱ的地址宏主体中的变量
引数赋值Ⅱ的地址
宏主体中的变量
A#1K5#18B#2I6#19C#3J6#20I1#4K6#21J1#5I7#22K1#6J7#23I2#7K7#24J2#8I8#25K2#9J8#26I3#10K8#27J3#11I9#28K3#12J9#29I4#...