第八章宏程序简介第一节概述在编程工作中,我们经常把能完成某一功能的一系列指令像子程序那样存入存储器,用一个总指令来代表它们,使用时只需给出这个总指令就能执行其功能。所存入的这一系列指令称作用户宏程序本体,简称宏程序。这个总指令称作用户宏程序调用指令。在编程时,编程员只要记住宏指令而不必记住宏程序。用户宏程序与普通程序的区别在于:在用户宏程序本体中,能使用变量;可以给变量赋值;变量间可以运算;程序可以跳转。而普通程序中,只能指定常量,常量之间不能运算,程序只能顺序执行,不能跳转,因此功能是固定的,不能变化。用户宏功能是用户提高数控机床性能的一种特殊功能。宏程序本体既可以由机床生产厂提供,也可以由机床用户自己编制。使用时,先将用户宏主体像子程序一样存入到内存里,然后用子程序调用指令调用。华中数控系统和FANUC数控系统的宏指令及变量大体相同,而西门子数控系统的宏指令及变量的定义则不大相同。第二节宏程序基础知识一、变量(HNC、FANUC系统)在常规的主程序和子程序内,总是将一个具体的数值赋给一个地址,为了使程序更具通用性、灵活性,在宏程序中设置了变量。华中世纪星和FANUC0i数控系统的变量有相同的表达方式,以“#”和数字来表示,比如:“#10”表示一个变量。而西门子SINUMERIK802D的变量又叫做R参数,它用字母“R”和数字来表示,比如“R10”。现在以列表形式来比较各系统的区别。表8-1变量的区别华中HNC-21MFANUC0iSINUMERIK802D局部变量#0~#49#1~#33R0~R299全局变量#50~#199#100~#199空变量#0局部变量和全局变量是华中世纪星和FANUC的说法。局部变量只能用于宏程序中存储数据,比如:运算结果等。当断电时,局部变量被初始化为空。调用宏程序时,自变量对局部变量赋值。全局变量在不同的宏程序中的意义相同。FANUC系统的空变量#0总是空,没有值能赋给该变量。(1)变量的表示变量可以用“#”号和跟随其后的变量序号来表示。#i(i=1,2,3,…)例:#5,#109,#501(2)变量的引用将跟随在一个地址后的数值用一个变量来代替,即引入了变量。例:对于F#103=50时,则为F50;对于Z=-#110,若#110=100时,则Z为-100;对于G#130,若#130=3时,则为G03。表8-2各系统变量引用和赋值的对比华中世纪星FANUC0iSINUMERIK802D定义变量#10=50.0#10=50.0R10=50.0变量引用G01X[#10]G01X#10G01X=R10改变引用变量的值的符号G01X[-#10]G01X-#10G01X=-R10(3)变量的类型FANUC-0iM系统的变量分为公共变量和系统变量两类。1)局部变量局部变量只能用在宏程序中存储数据,例如,运算结果。当断电时,局部变量被初始化为空。调用宏程序时,自变量对局部变量赋值。局部变量的序号为:#1~#332)公共变量公共变量是在主程序和主程序调用的各用户程序内公共的变量。也就是说,在一个宏指令中的#i与在另一个宏指令中的#i是相同的.公共变量的序号为:#100~#199;#500~#599。其中#100~199公共变量在电源断电后即清零,重新开机时被设置为“0”;#500~#599公共变量即使断电后,它们的值也保持不变,因此也称保持型变量。3)系统变量系统变量定义为:有固定用途的变量。它的值决定系统的状态。系统变量包括刀具偏置变量,接口的输入/输出信号变量,位置信息变量等。系统变量的序号与系统的某种状态有严格的对应关系。二、计算参数(SIEMENS系统)在SIEMENS系统中,变量称为计算参数。(1)表示方法用“R”和紧跟其后的序号来进行表示。如:R1,R5,R110等。SIEMENS系统中可以引用的参数为:R0~R299。(2)参数的赋值1)直接赋值可以在下面数值范围内直接赋值:+(0.0000001…9999.9999)如:R1=3.5678R5=27.2R4=-7R10=-12.3652)给地址赋值R参数可以给任意的NC地址赋值,但对地址N、G、L除外。赋值时,在地址符之后加“=”。例如:G0X=R1Y=R2(给X、Y赋值)三、常量在华中世纪星数控系统还定义了常量。PI:圆周率TRUE:条件成立(真)FALSE:条件不成立(假)四、运算符与表达式(1)算术运算符+,-,*,/表示加,减,乘,除。(2)条件运算符EQ(=),NE(≠),GT(),GE(≥),LT(),LE(≤)(3)逻辑运算符AND,OR,NOT(4)函数SIN,COS,TAN,ATAN,ATAN2,ABS,INT,SIGN,SQRT,EXP(5)表达式用运算符连接起来的常数,宏变量构成表达式。例如:175/SQRT[2]*COS[55*PI/180];#3*6GT14表8-3各系统使用的条件运算符含义华中世纪星FANUC0iSINUMERIK802D等于(=)EQEQ==不等于(≠)NENE大于(>)GTGT>大于或等于(≥)GEGE>=小于(<)LTLT=五、函数各个系统的常用函数如表8-4所示。表上所列的三角函数的角度单位是度,使用其它角度单位时需要换算。含义华中世纪星FANUC0iSINUMERIK802D正弦SIN[]SIN[]SIN()反正弦ASIN[]ASIN()余弦COS[]COS[]COS()反余弦ACOS[]ACOS()正切TAN[]TAN[]TAN()反正切ATAN[]ATAN[]ATAN2(,)绝对值ABS[]ABS[]ABS()平方根SQRT[]SQRT[]SQRT()表8-4各个系统的常用函数第三节常用宏指令及其应用实例一、赋值语句把常数或表达式的值送给一个宏变量称为赋值。在赋值语句中先计算,然后再赋值。格式:宏变量=常数或表达式例如:#2=175/SQRT[2]*COS[55*PI/180];#3=124.0表8-5各系统赋值语句的格式系统赋值语法常数表达式华中世纪星#10=50.0#21=180*SIN[20]+#10FANUC0i#10=50.0#21=180*SIN[20]+#10系统赋值语法常数表达式SINUMERIK802DR10=50.0R21=180*SIN(20)+R10说明:上表所列均表示把50.0这个常数赋给变量#10(或R10).二、运算次序(1)函数;(2)乘和除运算(*,/,AND);(3)加和减运算(+,-,OR,XOR)。三、跳转和循环指令在程序中,使用跳转和循环功能可以改变控制的流向,从而可以实现程序的控制。如下表8-6所示为三种数控系统跳转和循环语句的结构和种类。表8-6三种系统跳转和循环语句的结构和种类语句华中世纪星FANUC0iSINUMERIK802D格式:IF条件表达式……ELSE……ENDIF例如:格式:IF[条件表达式]GOTOn例如:IF[#1GT10]GOTON50……格式:IF条件表达式GOTOFMA2例如:IFR110GOTOFMA2语句华中世纪星FANUC0iSINUMERIK802DIF#1GT10G00G90Z100.0ELSEG00G90Z200.0ENDIF说明:当#1大于10则执行“G00G90Z100.0”否则执行“G00G90Z200.0N50G00G90Z100.0说明:当#1大于10时,跳转到行号为N50的程序段。这里的条件表达式需用方括号“[]”括起来。……MA2:G00G90Z100.0说明:当R1大于10时,跳转到有标记“MA2”的程序段。GOTOF表示向前跳转(即向程序结束的方向跳转.而GOTOB是向后跳转(即向程序开始的方向跳转.格式:WHILE条件表达式……ENDW例如:#3=1WHILE#3LT4G01G91X20.0Y20.0#3=#3+1ENDW说明:格式:WHILE[条件表达式]DOm;…….ENDm例如:#3=1WHILE[#3LT4]DO2G01G91X20.0Y20.0#3=#3+1END2说明:#3的初值为0,当#3小于4的条件满足时执行:西门子实现循环是使用上面的条件判断跳转.#3的初值为0,当#3小于4的条件满足时执行:“G01G91X20.0Y20.0”画出三个台阶的轨迹。当#3的值不满足条件时跳出循环体.“G01G91X20.0Y20.0”画出三个台阶的轨迹。语法里面的DOm和ENDm.这里的m是标号值.只能是1,2,3.当#3的值不满足条件时跳出循环体.西门子实现循环是使用上面的条件判断跳转.1、华中系统程序跳转功能(1)条件判别语句IF,ELSE,ENDIF格式(i):IF条件表达式;……;ELSE;……ENDIF;格式(ii):IF条件表达式;……;ENDIF;(2)循环语句WHILE,ENDW格式:WIIILE条件表达式;……;ENDW;(3)编程举例:例8-1:利用宏程序编程,加工如图8-1所示的工件。参考程序如下所示:图8-1半球程序说明O2001;半球#50=90角度为90度WHILE#50GE0大于或等于0度#51=30*COS[#50*PI/180]球面上任意一点横、纵坐标#52=30*SIN[#50*PI/180]G01X[#51]F200XZ平面内直线插补,加工球面Z[#52]#60=0WHILE#60LE360加工XY平面内的整圆#61=#51*COS[#60*PI/180]#62=#51*SIN[#60*PI/180]G01X[#61]Y[#62]#60=#60+2ENDW#50=#50-1ENDWM992、FANUC系统程序跳转功能(1)无条件转移(GOTO语句)转移到标有顺序号n的程序段,当指定1到99999以外的顺序号时,出现P/S报警No.128,可用表达式指定顺序号。格式:GOTOn;n—顺序号(1到99999)例:GOTO1;GOTO#10;(2)条件转移(IF语句)1)格式:IF[条件表达式]GOTOn;IF之后指定条件表达式。如果指定的条件表达式满足时,转移到标有顺序号n的程序段;如果指定的条件表达式不满足,执行下个程序段。例如:2)IF[条件表达式]THEN…;如果条件表达式满足,执行预先决定的宏程序语句(即THEN之后的语句),并且只执行一个宏程序语句。例:如果#1和#2的值相同,0赋给#3。IF[#1EQ#2]THEN#3=0;注意:条件表达式必须包括关系运算符。运算符插在两个变量中间或变量和常数中间,并且用括号([,])封闭。表达式可以替代变量。例8-2:计算数值1~10的总和。参考程序:程序说明O9500;#1=0;存储和数变量的初值#2=1;被加数变量的初值N1IF[#2GT10]GOTO2;当被加数大于10时转移到N2#1=#1+#2;计算和数#2=#2+#1;下一个被加数GOTO1;转到N1N2M30;程序结束(3)循环(WHILE语句)在WHILE后指定一个条件表达式。当指定条件满足时,执行从DO到END之间的程序,否则转到END后的程序段。说明:当指定的条件满足时,执行WHILE从DO到END之间的程序,否则,转而执行END之后的程序段。这种指令格式适用于IF语句。DO后的数字和END后的数字是指定程序执行范围的标号,标号值为1、2、3。若用1、2、3以外的值会产生P/S报警No.126。如下所示:嵌套:在DO—END循环中的标号1到3可根据需要多次使用。但是,当程序有交叉重复循环(DO范围的重叠)时,出现P/S报警No.124。结果如下所示:例8-3:计算数值1到10的总和。参考程序:O0001;#1=0;#2=1;WHILE[#2LE10]DO1;#1=#1+1;#2=#2+1;END1;M30;3、SIEMENS802D系统程序跳转功能(1)标记符——程序跳转目标标记符或程序段号用于标记程序中所跳转的目标程序段,用跳转功能可以实现程序运行分支。标记符可以自由选取,但必须有2-8个字母或数字组成,其中开始的两个字符必须是字母或下划线。跳转目标程序段中,标记符后面必须为冒号,标记符位于程序段首