在之前的案例中有讲到车床中使用参数方程的方式加工椭圆曲线的事例,在铣削加工中如何用好参数方程的方式编写相关的曲线轨迹呢?
这里介绍一下在西门子的NC程序中,使用自定义的宏变量,配合程序跳转与选择指令,加工心形线的例子 。本文采用3种不同的宏程序编程方法,展示一下西门子灵活的NC高级语言编程,也就是说采用下面的三个子程序,XX_IFENDIF.SPF,XX_WHILEEND.SPF,XX_FOREDF.SPF 都可以加工出心形线,三种编程法彼此之间是并列的,实际使用时择一即可。
高级编程指令 | 解释 | 在本文中的应用 |
DEF REAL,INT | 定义变量,(REAL 实数 ,INT 整数) | 主程序“XX_CASE.MPF”的开头 |
CASE …OF…DEFAULT | CASE条件满足1执行“label1” 满足2执行“label2”其它情况执行”label3” | 主程序 “XX_CASE.MPF” |
GOTOF | 向前跳转 | 主程序 “XX_CASE.MPF” |
IF,ELSE,ENDIF | IF如条件满足时,顺序执行程序到ENDIF,否则执行else 之后程序到ENDIF | 子程序“XX_IFENDIF.SPF” |
WHILE;ENDWHILE | WHILE如条件满足时,顺序执行程序到ENDWHILE | 子程序“XX_WHILEEND.SPF” |
FOR “VARIBE V1 TO V2,ENDFOR | 在变量“V1”至“V2”范围内执行到ENDFOR截止的程序 | 子程序“XX_FOREDF.SPF” |
首先明确一下心形线的参数方程:x=a*(2*cosθ-cos2θ), y=a*(2*sinθ-sin2θ)。
主程序XX_CASE.MPF部分 | ||
N10 DEF INT XX_CASE | 定义整数型变量XX_CASE,作为分支结构选择 | |
N20 XX_CASE=0 | 初始化,支结构选择XX_CASE; | |
N30 CASE XX_CASE OF 1 GOTOF LABEL_1 2 GOTOF LABEL_2 DEFAULT GOTOF LABEL_3 | 根据分支结构变量XX_CASE决定程序走向; 1对应LABEL_1; 2对应LABEL_2; 其他值 对应LABEL_3; 在这个案例中主程序会跳转到Label_3并执行后面的程序段,因为XX_CASE=0 | |
N40 LABEL_1: N50 CALL "XX_FOREDF.SPF" N60 M30 | LABEL_1对应子程序"XX_FOREDF.SPF"; | |
N70 LABEL_2: N80 CALL "XX_WHILEND.SPF" N90 M30 | LABEL_2对应子程序"XX_WHILEND.SPF"; | |
N100 LABEL_3: N110 CALL "XX_IFENDIF.SPF" N120 M30 | LABEL_3对应子程序" XX_IFENDIF.SPF"; |
子程序XX_FOREDF.SPF部分 | ||
N10 DEF REAL X_XX,Y_XX,CZ_XX,DZ_XX,JD_XX,BC_XX | 定义实数型变量,心形线当前点的X坐标, 心形线当前点的Y坐标等 | |
N20 JD_XX=0 N30 BC_XX=5 N40 CZ_XX=60 | 初始化,心形线当前点的离心角JD_XX; 心形线下一点和当前点的离心角偏差BC_XX; 心形线的长半轴CZ_XX; | |
N60 T="CUTTER 6"M6 N70 M3S666 N80 G90G54G0X0Y0 N90 G1F1000 | 选刀换刀; 主轴转速; 心形线中心; G1进给; | |
N110 FOR JD_XX=0 TO 360 N120 X_XX=CZ_XX*(2*COS(JD_XX)-COS(2*JD_XX)) N130 Y_XX= CZ_XX*(2*SIN(JD_XX)-SIN(2*JD_XX)) N150 X=X_XX Y=Y_XX N170 ENDFOR | 使用心形线的参数方程计算其对应的X坐标和Y坐标; N110心形线离心角360以内执行FOR ENDFOR间语句;计算心形线下一点的离心角(自加1,不同于其它的可调值BC_XX); N120,N130计算心形线当前点的X坐标, 心形线当前点的Y坐标; N150小线段运行至心形线当前点; N170运行完360内所有点,程序往下继续执行; | |
N180 JD_XX=0 | 心形线当前点的离心角JD_XX回到初始值(对循环嵌套,回初始值很重要); | |
N190 X0Y0 | 回中心; | |
N200 M17 | 程序结束; |
子程序XX_WHILEND.SPF部分 | ||
N10 DEF REAL X_XX,Y_XX,CZ_XX,DZ_XX,JD_XX,BC_XX | 定义实数型变量,心形线当前点的X坐标, 心形线当前点的Y坐标等 | |
N20 JD_XX=0 N30 BC_XX=1 N40 CZ_XX=60 | 初始化,心形线当前点的离心角JD_XX; 心形线下一点和当前点的离心角偏差BC_XX; 心形线的长半轴CZ_XX; | |
N60 T="CUTTER 6"M6 N70 M3S666 N80 G90G54G0X0Y0 N90 G1F1000 | 选刀换刀; 主轴转速; 心形线中心; G1进给; | |
N110 WHILE JD_XX<=360 N120 X_XX=CZ_XX*(2*COS(JD_XX)-COS(2*JD_XX)) N130 Y_XX= CZ_XX*(2*SIN(JD_XX)-SIN(2*JD_XX)) N140 JD_XX=JD_XX+BC_XX N150 X=X_XX Y=Y_XX N170 ENDWHILE | 使用心形线的参数方程计算其对应的X坐标和Y坐标; N110心形线离心角360以内执行WHILE ENDWHILE间语句; N120,N130计算心形线当前点的X坐标, 心形线当前点的Y坐标; N140计算心形线下一点的离心角; N150小线段运行至心形线当前点; N170运行完360内所有点,程序往下继续执行; | |
N180 JD_XX=0 | 心形线当前点的离心角JD_XX回到初始值(对循环嵌套,回初始值很重要); | |
N190 X0Y0 | 回中心; | |
N200 M17 | 程序结束; |
子程序XX_IFENDIF.SPF部分 | ||
N10 DEF REAL X_XX,Y_XX,CZ_XX,DZ_XX,JD_XX,BC_XX | 定义实数型变量,心形线当前点的X坐标, 心形线当前点的Y坐标等 | |
N20 JD_XX=0 N30 BC_XX=1 N40 CZ_XX=60 | 初始化,心形线当前点的离心角JD_XX; 心形线下一点和当前点的离心角偏差BC_XX; 心形线的轴长CZ_XX; | |
N60 T="CUTTER 6"M6 N70 M3S666 N80 G90G54G0X0Y0 N90 G1F1000 | 选刀换刀; 主轴转速; 心形线中心; G1进给; | |
N100 XXLP: N110 IF JD_XX<=360 N120 X_XX=CZ_XX*(2*COS(JD_XX)-COS(2*JD_XX)) N130 Y_XX= CZ_XX*(2*SIN(JD_XX)-SIN(2*JD_XX)) N140 JD_XX=JD_XX+BC_XX N150 X=X_XX Y=Y_XX N160 GOTOB XXLP N170 ENDIF | 使用心形线的参数方程计算其对应的X坐标和Y坐标; N110心形线离心角360以内执行IFENDIF间语句; N120,N130计算心形线当前点的X坐标, 心形线当前点的Y坐标; N140计算心形线下一点的离心角; N150小线段运行至心形线当前点; N160 返回标签XXLP处; N170运行完360内所有点,程序往下继续执行; | |
N180 JD_XX=0 | 心形线当前点的离心角JD_XX回到初始值(对循环嵌套,回初始值很重要); | |
N190 X0 Y0 | 回中心; | |
N200 M17 | 程序结束; |
模拟结果如图

1. 本文简单介绍了3种程序控制结构IF ENDIF,WHILE ENDWHILE,FOR ENDFOR;以及程序跳转GOTO和程序分支CASE;浅显易懂,适合初学者了解西门子灵活的NC编程。
2. 3个子程序把结尾的M17改为M30即为主程序,可以单独测试,模拟,使用。(子程序以M17结尾,主程序以M30结尾)
在网站中还有个使用铣削工艺加工椭圆的事例也供大家参考:http://www.ad.siemens.com.cn/CNC4YOU/Home/Article/185
注:本文图形参照百度 https://baike.baidu.com/item/%E6%A4%AD%E5%9C%86/684466?fr=aladdin,程序则依照Sinutrain 中Sinumerik Operate的软件版本SW4.7SP2进行原创。