1宏程序设计宏程序与子程序类似,对编制相同加工的操作可以使程序简化.同时宏程序中可以使用变量,算术和逻辑运算及转移指令,还可以方便地实现循环程序设计。使相同加工操作的程序更方便,更灵活。本章以FANUC系统为例介绍宏程序设计的内容。12.1变量的定义宏程序中使用的变量与日常生活中使用的变量不同,变量用符号“#”后跟变量的变量号指定。变量可分为四种类型。1.空变量#0为空变量,该变量不能赋值。2.局部变量#1~#33为局部变量,局部变量只能在宏程序中存储数据。当断电时局部变量被初始化为空,调用宏程序时,自变量对局部变量赋值。局部变量的数值范围10-29~1047或-1047~-10-29,如果计算结果超过该范围则发出P/S报警No.111。3.公共变量#100~#199、#500~#999为公共变量,公共变量在不同的宏程序中意义相同。当断电时,变量#100~#199被初始化为空,变量#500~#999的数据不会丢失。全局变量的数值范围10-29~1047或-1047~-10-29,如果计算结果超过该范围则发出P/S报警No.111。4.系统变量#1000~为系统变量,系统变量用于读和写CNC运行时的各种数据,如刀具的当前位置和补偿值等。5.变量与地址(自变量)的对应关系系统可用两种形式的自变量指定,表12-1为自变量指定I的自变量与变量的对应关系。表12-2为自变量指宾II的自变量与变量的对应关系。表12-1自变量指定I的变量对应关系地址(自变量)变量号地址(自变量)变量号地址(自变量)变量号A#1I#4T#20B#2J#5U#21C#3K#6V#22D#7M#13W#23E#8Q#17X#24F#9R#18Y#25H#11S#19Z#26在自变量指定I中,G、L、O、N、P不能用,地址I、J、K必须按顺序使用,其它地址顺序无要求。举例:G65P3000L2B4A5D6J7K8正确(J、K符合顺序要求)在宏程序中将会把4赋给#2,把5赋给#1,把6赋给#7,把7赋给#5,把8赋给#6举例:G65P3000L2B3A4D5K6J5不正确(J、K不符合顺序要求)2表12-2自变量指定II的变量对应关系地址(自变量)变量号地址(自变量)变量号地址(自变量)变量号A#1K3#12J7#23B#2I4#13K7#24C#3J4#14I8#25I1#4K4#15J8#26J1#5I5#16K8#27K1#6J5#17I9#28I2#7K5#18J9#29J2#8I6#19K9#30K2#9J6#20I10#31I3#10K6#21J10#32J3#11I722K10#33自变量指定II使用A、B、C和1次,使用I、J、K各10次。系统能够自动识别自变量指定I和自变量指定II并赋给宏程序中相应的变量号。如果自变量指定I和自变量指定II混合使用,则后指定的自变量类型有效。举例:G65A1.0B2.0I-3.0I4.0D5.0p1000宏程序中:#1:1.0#2:2.0,#3:#4:-3.0#5:#6:#7:5.0说明:I4.0为自变量指定II,D为自变量指定I,所以#7使用指定类型中的D5.0,而不使用自变量指定II中的I4.0。6.本级变量#1~#33作用于宏程序某一级中的变量称为本级变量,即这一变量在同一程序级中调用时含义相同,若在另一级程序(如子程序)中使用,则意义不同。本级变量主要用于变量间的相互传递,初始状态下未赋值的本级变量即为空白变量。局部变量#1~#33(一个宏程序中的同名变量)从0到4级,主程序是0级。每调用一个含有同名变量的宏程序,级别加1,前一级的变量被保存。当一个宏程序结束(执行M99)时,级别减1。例如:主程序宏程序宏程序宏程序宏程序(0级)(1级)(2级)(3级)(4级)O0001O0002O0003O0004O0005#1=1;#1=2#1=3#1=4#1=5G65P2A2;G65P3A3G65P4A4G65P5P5…………………………M99M30M99M99M99312.2变量的运算对宏程序中的变量可以可以进行算术运算和逻辑运算。1.算术运算可以进行加、减、乘、除运算。运算功能和格式如表12-3所示。举例:G00X[#1+#2]X坐标的值是变量1与变量2之和。2.三角函数计算对宏程序中的变量可进行正弦(SIN)、反正弦(ASIN)、余弦(COS)、反余弦(ACOS)、正切(TAN)、反正切(ATAN)函数运算。三角函数中的角度以度为单位。运算功能和格式如表12-3所示。表12-3变量运算功能表类型功能格式举例备注算术运算加法#i=#j+#k#1=#2+#3常数可以代替变量减法#i=#j-#k#1=#2-#3乘法#i=#j*#k#1=#2*#3除法#I=#j*#k#1=#2/#3三角函数运算正弦#i=SIN[#j]#1=SIN[#2]角度以度指定35°30’表示为35.5常数可以代替变量反正弦#i=ASI[#j]#1=ASIN[#2]余弦#i=COS[#j]#1=COS[#2]反余弦#i=ACOS[#j]#1=ACOS[#2]正切#i=TAN[#j]#1=TAN[#2]反正切#i=ATAN[#j]#1=ATAN[#2]其它函数运算平方根#i=SQRT[#j]#1=SQRT[#2]常数可以代替变量绝对值#i=ABS[#j]#1=ABS[#2]舍入#i=ROUN[#j]#1=ROUN[#2]上取整#i=FIX[#j]#1=FIX[#2]下取整#i=FUP[#j]#1=FUP[#2]自然对数#i=LN[#j]#1=LN[#2]指数对数#i=EXP[#j]#1=EXP[#2]逻辑运算与#i=#jAND#k#1=#2AND#2按位运算或#i=#jOR#k#1=#2OR#2异或#i=#jXOR#k#1=#2XOR#2转换运算BCD转BIN#i=BIN[#j]#1=BIN[#2]BIN转BCD#i=BCD[#j]#1=BCD[#2]对于反反正弦(ASIN)取值范围如下:当参数(No.6004#0)NAT位设为0时:270°~90°当参数(No.6004#0)NAT位设为1时:-90°~90°当#j超出-1~1时发出P/S报警No.111。对于反余弦(ACOS)的取值范围如下:取值范围180°~0°4当#j超出-1~1时发出P/S报警No.111。对于反正切(ATAN)的取值范围如下:当参数(No.6004#0)NAT位设为0时:0°~360°当参数(No.6004#0)NAT位设为1时:-180°~180°3.其它函数计算对宏程序中的变量还可以进行平方根(SQRT)、绝对值(ABS)、舍入(ROUN)、上取整(FIX)、下取整(FUP)、自然对数(LN)、指数(EXP)运算。运算功能和格式如表12-3所示。对于自然对数LN[#j],相对误差可能大于10-8。当#j≤0时,发出P/S报警No.111。对于批数函数EXP[#j],相对误差可能大于10-8。当运算结果大于3。65×1047(j大约110)时,出现溢出并发出P/S报警No.111。对于取整函数ROUN[#j],根据最小设定单位四舍五入。例如,假设最小设定单位为1/1000mm,#1=1.2345,则#2=ROUN[#1]的值是1.0。对于上取整FIF[#j],绝对值值大于原数的绝对值。对于下取整FUP绝对值小于原数的绝对值。例如,假设#1=1.2,则#2=FIX[#1]的值是2.0。假设#1=1.2,则#2=FUP[#1]的值是1.0。假设#1=-1.2,则#2=FIX[#1]的值是-2.0。假设#1=-1.2,则#2=FUP[#1]的值是-1.0。4.逻辑运算对宏程序中的变量可进行与、或、异或逻辑运算。逻辑运算是按位进行。运算功能和格式如表12-3所示。5.数制转换变量可以在BCD码与二进制之间转换。6.关系运算由关系运算符和变量(或表达式)组成表达式。系统中使用的关系运算符如下。(1)等于(EQ)用EQ与两个变量(或表达式)组成表达式,当运算符EQ两边的变量(或表达式)相等时,表达式的值为真,否则为假。例如,#1EQ#2,当#1与#2相等时,表达式的值为真。(2)不等于(NE)用NE与两个变量或表达式组成表达式,当运算符NE两边的变量(或表达式)不相等时,表达式的值为真,否则为假。例如,#1NE#2,当#1与#2不相等时,表达式的值为真。(3)大于等于(GE)用GE与两个变量或表达式组成表达式,当左边的变量(或表达式)大于或等于右边的变量(或表达式)时,表达式的值为真,否则为假。例如,#1GE#2,当#1大于或等于#2时,表达式的值为真。否则为假。(4)大于(GT)用GT与两个变量或表达式组成表达式,当左边的变量(或表达式)大于右边的变量(或表达式)时,表达式的值为真,否则为假。5例如,#1GT#2,当#1大于#2时,表达式的值为真。否则为假。(5)小于等于(LE)用LE与两个变量或表达式组成表达式,当左边的变量(或表达式)小于或等于右边的变量(或表达式)时,表达式的值为真,否则为假。例如,#1LE#2,当#1小于或等于#2时,表达式的值为真。否则为假。(6)小于(LT)用LT与两个变量或表达式组成表达式,当左边的变量(或表达式)小于右边的变量(或表达式)时,表达式的值为真,否则为假。例如,#1GE#2,当#1大于#2时,表达式的值为真。否则为假。7.运算优先级运算符的优先顺序是(1)函数。函数的优先级最高。(2)乘、除、与运算。乘、除、与运算的优先级次于函数的优先级。(3)加、减、或、异或运算。加、减、或、异或运算的优先级次于乘、除、与运算。乘、除、与运算的优先级。(4)关系运算。关系运算的优先级最低。用方括号可以改变优先级,括号不能超过5层。超过5层时,发出P/S报警No.111。8.变量值的精度变量值的精度为8位十进制数。例如,用赋值语句#1=9876543210123.456时,实际上#1=9876543200000.000。用赋值语句#2=9876543277777.456时,实际上#1=9876543300000.000。12.3宏程序结构宏程序从结构上可以有顺序结构、分支结构和循环结构。本节介绍分支和循环结构的实现方法。1.无条件转移(GOTO)格式:GOTOn;n为顺序号(1~9999)例如,GOTO6;语句组N6G00X100;执行GOTO6语句时,转去执行标号为N6的程序段。2.条件转移(IF)格式:IF[关系表达式]GOTOn;例如,IF[#1LT30]GOTO7语句组N7G00X100X5如果#1大于30,转去执行标号为N7的程序段,否则执行GOTO7下面的语句组。63.条件转移(IF)格式:IF[表达式]THENTHEN后只能跟一个语句。例如,IF[#1EQ#2]THEN#3=0;当#1等于#2时,将0赋给变量#3。4.循环(WHILE)格式:WHILE[关系表达式]DOm;语句组;ENDm;当条件表达式成立时执行从DO到END之间的程序,否则转去执行END后面的程序段。例如,#1=5;WHILE[#1LE30]DO1;#1=#1+5;G00X#1Y#1;END1;M99;当#1小于等于30时,执行循环程序,当#1大于30时结束循环返回主程序。12.4宏程序的调用与返回1.宏程序的简单调用宏程序的简单调用是指在主程序中,宏程序可以被单个程序段单次调用。调用指令格式:G65P(宏程序号)L(重复次数)(变量分配)其中:G65——宏程序调用指令P(宏程序号)——被调用的宏程序代号;L(重复次数)——宏程序重复运行的次数,重复次数为1时,可省略不写;(变量分配)——为宏程序中使用的变量赋值。宏程序与子程序相同的一点是,一个宏程序可被另一个宏程序调用,最多嵌套4层。2.宏程序的开始与返回宏程序的编写格式与子程序相同。其格式为:O0010(0001~8999为宏程序号)//程序名N10……//指令……N30M99//宏程序结束宏程序以程序号开始,以M99结束。12.5宏程序应用举例例1:加工如图12-1所示的椭圆表面,材料为中碳钢。