1. NC编程基础
1.1 坐标系定义
机床中使用右手笛卡尔直角坐标系,如图1.1。机床中的运动是指刀具和工件之间的相对运动,通常假设是刀具相对于工件进行运动。
图1.1 坐标系定义
图1.2 车铣复合机床坐标系定义
车铣复合机床的坐标系统如图1.2,是以机床的原点为坐标原点建立起来的XZ轴直角坐标系。其中,Z轴与机床主轴的旋转中心线重合,为纵向进刀方向,远离主轴端面的方向为正方向;X轴与主轴轴线垂直,为横向进刀方向,远离主轴旋转中心的方向为正方向。
常用车铣复合系统的坐标系统定义如下:
- 机床坐标系MCS:坐标系的原点定在机床零点,它也是所有坐标轴的零点位置。该点由机床生产厂家确定,机床开机后通过回参考点确定机床坐标系;
- 工件坐标系WCS:编制零件加工程序时所设定的坐标系,其中Z轴的零点可以任意设置,X轴的零点始终位于旋转轴中心线上。工件坐标系通过可设定的零点偏置指令得到。
1.2 NC程序的结构和内容名称规定
一个NC程序由一系列程序段(见后续章节)构成。每个程序段说明一个加工步骤,在一个程序段中以“字”的形式写出各个指令,在加工步骤中,最后一个程序段包含一个特殊字,表明程序段结束:M02,M30。
1.2.1 程序名称
每个程序有一个程序名,在编制程序时须按以下规则定义程序名:
程序名以字母开头,只能由字母、数字或下划线组成;
- 不能使用分隔符;
- 区分大小写;
- 不能与系统中标准循环相重名;
- 小数点作为文件的扩展名,主程序后缀名可兼容多种格式,如(txt、iso等等);
- 子程序后缀名必须为iso;
- 程序名不能超过32个字符。
示例:
SHLLE_527.iso
1.2.2 程序段和结构
一个加工程序是由一系列顺序执行的程序段组成,每个程序段单独占一行,每一个程序段执行一个加工步骤、逻辑处理或数学运算功能。
示例:
N10 G94 G01 Z80 F100 ;第一程序段
N20 G00 X100 ;第二程序段
N30 ……
N40 M02 ;程序结束
一个程序段由若干个字组成,各功能的执行顺序是独立于其排列先后的,由数控系统内部自动重新加以排列,但是为了使程序段结构清晰明了,当程序段中有很多指令时,建议按如下顺序排列:
示例:
/N10□G…□X…□Z…□F…□S…□T…□D…□M…
;注释
其中:
/ 表示在运行过程中可以跳过的程序段;
N… 表示程序段号,段号由最多五位数字组成;
□ 表示中间空格;
; 表示其后文字描述是对程序段进行说明。
同一段程序中的指令按以下先后顺序执行:
- 程序段号N
- 换刀指令T和D
- 速度指令F和S
- 功能G
- 段前执行的M功能(详见P18)
- 坐标指令X和Z等
- 段后执行的M功能(详见P18)
在一个程序段中可以编程多个功能G和功能M,不过其它的功能只能有一个(X,Z,T,F等等)。功能G被分成不同的组,不能在同一个程序段中使用两个或两个以上同组的功能G。
程序段号一般以5或10为间隔进行编辑,以便以后插入新程序段时不会改变程序段号的顺序。虽然不编写程序段号也不会影响程序的执行,但是仍然建议在涉及坐标运动和辅助功能等指令的程序段前添加一个程序段号,以增加可读性。程序段号与后面之间指令必须空一格。
1.2.3 字结构及地址
字是程序段的组成元素,由它构成控制指令。字由以下几部分组成(如图1.3):
- 地址符:地址符是一个字母或字符串。
- 数值:数值是一个数字串,它可以带正负号和小数点,通常正号可以省略。
图1.3 字结构
1.2.4 运算/计算功能
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
DIV | 两数相除,结果取整 |
MOD | 两数相除,取其余 |
SIN( ) | 正弦,括号内参数单位为度 |
COS( ) | 余弦,括号内参数单位为度 |
TAN( ) | 正切,括号内参数单位为度 |
ASIN( ) | 反正弦,计算结果单位为度 |
ACOS( ) | 反余弦,计算结果单位为度 |
ATAN( ) | 反正切,计算结果单位为度 |
ATAN2( ) | 反正切2,计算结果单位为度 |
SQRT( ) | 平方根 |
ABS( ) | 绝对值 |
POT( ) | 二次幂(平方) |
TRUNC( ) | 取整数 |
LN( ) | 自然对数 |
EXP( ) | 指数函数 |
1.2.5 比较运算符和逻辑运算符
= = | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于或者等于 |
<= | 小于或者等于 |
&& | 与 |
|| | 或 |
! | 非 |
1.2.6 信息编程
信息编程在一个独立的程序段中。当程序执行到所在的行时,信息显示在屏幕上方的信息显示区域,并且一直有效。一个新的信息显示,上一条信息上滚。在MSG信息显示指令中还可加入表达式、变量等,在显示时将这些表达式、变量的当前值显示出来(类似高级语言的print语句)。
示例:
MSG (“THIS IS A SAMPLE=”, 25*4)
显示结果为:“THIS IS A SAMPLE=100”
1.2.7 程序字体颜色
以下规则适用于程序后缀名是小写iso的程序:
- 默认一般字体都是黑色显示;
- 关键字为蓝色显示,并且关键字同其它字需要用符号隔开(加减乘除符号、逗号、点号、分号、冒号、左右小括弧、等号、横线、空格、制表符及换行符);
- 特殊情况:
- 以“//”开头的,为绿色;
- 以“#”开头的为灰色(仅当“#”作为字符串开头如此,“#”作为连接符与其他连接符用法一样);
- 以双引号““”开头的为褐色;
- 以单引号“’”开头的为橘红色,一般需要另一个单引号“’”配合,两个单引号匹配后中间字符橙黄色显示,代表字符常量。
1.3 子程序
原则上主程序和子程序之间并没有区别。零件加工主程序也可作为子程序被调用。可以用子程序编写经常重复进行的加工,比如某一确定的轮廓形状。子程序单独在一个文件中进行编程,在需要时进行调用。
子程序的一种形式就是加工循环,加工循环包含一般通用的加工工序,如螺纹切削,坯料切削加工等等。通过对规定的计算参数赋值就可以实现各种具体的加工。为了方便地选择某一个子程序,必须给子程序取一个程序名。程序名可以自由选择,但必须符合相关规定(与主程序相同),并且建议具有一定含义。
1.3.1 子程序的分类和定义
子程序分类:
标准子程序:不带参数的子程序,可以被主程序和其他子程序调用。
参数子程序:调用参数子程序时,通过传递参数给子程序来实现具体功能。
子程序定义:
标准子程序:和主程序一样。
参数子程序:子程序中开头处必须有PROC,末尾处RET。
1.3.2 子程序调用
在一个程序中(主程序或子程序)可以直接用程序名调用子程序。被调用的子程序必须与主程序在同一目录下。子程序调用要求占用一个独立的程序段。如果要求多次连续地执行某一子程序,则在编程时必须在所调用子程序的程序名后对地址P进行次数编程,最大次数为99次。
示例1:标准子程序的调用,后面“()”可以省略
N10 WELLE7() P3 ;调用子程序WELLE7 3次
或N10 CALL WELLE7() P3 ;调用子程序WELLE7 3次
示例2:参数子程序的调用(假设WELLE8有5个参数)
N10 WELLE8(10, 50, R32, , R45) P5 ;调用子程序WELLE8 5次
或N10 CALL WELLE8(10, 50, R32, , R45) ;调用一次子程序WELLE8
实参可以是常量、变量或R参数,没有赋值的参数以零代之,也就是说第四个参数为零。
注意:
- 在退出子程序后,主程序中必须重新进行技术定义(G91/G90,G71/G70,DIAMOF/DIAMON等等)。另外,子程序的名称是区分大小写的,后缀名必须是小写iso;
- 在子程序中执行M02时,程序跳出子程序,返回到主程序,同时主程序结束。
1.3.3 程序嵌套深度
子程序不仅可以从主程序中调用,也可以从其它子程序中调用,这个过程称为子程序的嵌套,嵌套的深度可以为12级(包括主程序)。
图1.4 程序调用嵌套
1.3.4 子程序参数传递
子程序参数传递分为两种形式,按值传递和按地址传递。按值传递的参数仅作为输入参数,在被调用子程序中参与计算,即使其值发生变化也不反馈回上层程序。而按地址传递的参数作为输入输出参数,在被调用子程序中参与计算后,其值将重新返回至上层程序。为实现参数的按地址传递,只需在被调用子程序的对应参数前加上“VAR”关键字即可。
示例:
PROC SUB1 (……)
DEF REAL PT
DEF REAL M2PIT
……
SUB2 (PT, M2PIT)
……
RET
PROC SUB2 (VAR REAL PT, REAL M2PIT)
……
RET
在子程序“SUB1”中定义了两个参数“PT”和“M2PIT”。在调用子程序“SUB2”时,“PT”为按地址传递,“M2PIT”为按值传递。调用的目的是在“SUB2”中根据“M2PIT”的值对“PT”进行相应修改,并把结果反馈给“SUB1”继续使用。即“SUB2”对“PT”的更改能够传递至“SUB1”。
1.4 程序跳转
NC程序在运行时以写入时的顺序执行程序段。程序在运行时可以通过插入程序跳转指令改变执行顺序。跳转目标只能是有标记符或一个程序段号的程序段。此程序段必须位于该程序之内。
标记符可以自由选取,但必须符合相关规定(与程序名称相同),标记符后面必须跟冒号,并且必须位于程序段段首,如果程序段有段号,则标记符紧跟着段号。
示例:
Label1: G01 X20 ;Label1是标记符,跳转目标程序段
…
N100 GOTOB Label1 ;跳转至Label1程序段
1.4.1 绝对跳转
跳转指令必须占用一个独立的程序段。
示例:
GOTOF Label ;向前跳转(程序结束的方向)
GOTOB Label ;向后跳转(程序开始的方向)
1.4.2 有条件跳转
用IF条件语句表示有条件跳转。如果满足跳转条件,则进行跳转。跳转目标只能是有标记符或程序段号的程序段。该程序段必须在此程序之内。有条件跳转指令必须是独立的程序段。
示例:
IF 条件 GOTOF Label ;向前跳转
IF 条件 GOTOB Label ;向后跳转
条件为比较逻辑运算,其运算符及其意义如下:
= = 等于
! = 不等
> 大于
< 小于
> = 大于或等于
< = 小于或等于
示例:
N10 IF R1>1 GOTOF Label ;R1大于1时,跳转到Label程序段
1.5 变量定义
1.5.1 定义格式和变量类型
一个变量名称包含字母、数字和下划线,且只能使用字母开头。
变量定义的格式为:
DEF 类型 名称 [= 数值]
示例:
DEF INT ANZAHL
DEF INT ANZAHL = 7
也可以对连续的变量进行定义并赋值:
DEF 类型 名称1 [=数值1],名称2 [=数值2],名称3 [=数值3],……
示例:
DEF REAL HH1=1, HH2=2, HH3=3
变量的类型包括以下几种:
INT 整数型,意即整数的数字
REAL 实数型,意即带小数的数字,包括整数
BOOL 布尔型,其值只能是“TRUE”或者“FALSE”
CHAR 字符型,是与ASCII代码相对应的单个字符,用单引号标识
STRING 字符串型,由多个字符组成的符号串,用双引号标识
AXIS 轴类型,代表轴地址,0为X轴,1为Y轴,2为Z轴
示例:
DEF CHAR FORM = 'A'
DEF CHAR FORM [2] = ('A','B')
DEF STRING MDG = “ALARMING”
1.5.2 数组定义
编程:
DEF CHAR NAME [N, M]
DEF INT NAME [N, M]
DEF REAL NAME [N, M]
DEF AXIS NAME [N, M]
DEF STRING NAME [M]
DEF BOOL NAME [N, M]
说明:
数组最多可以由2维尺寸定义,但字符串类型的数组变量只能定义成一维尺寸。第一个数组单元从地址[0, 0]开始,例如,当数组为3×4的二维数组时,最大可能的数组地址为[2, 3]。
数组单元可以在程序运行时,也可以在数组定义时进行赋值。
数组定义时:
DEF REAL FELD [2, 3] = (10, 20, 30, 40)
程序运行时:
可以对单个单元进行赋值。
示例:
FELD [0, 0] = 10
FELD [0, 1] = 20
……
也可以进行连续赋值,示例:
FELD [0, 0] = SET (10, 20, 30, 40)
有多少初值被编程就有多少数组单元被赋值,没有赋值的单元会自动被填上0,如果赋值数量超过数组单元数,就会触发系统报警。使用“SET”关键字可以从指定的单元开始连续赋值。
另外,还可以使用“REP”关键字对数组赋予相同的数值,示例在数组定义中:
DEF REAL FELD [10, 3] = REP (9.9)
以上定义中,所有数组单元均为9.9。又或者在程序运行中进行定义:
DEF REAL FELD [10, 3]
FELD [0, 0] = REP (100)
FELD [5, 0] = REP (-100)
数组的前半部分为100,后半部分为-100。
1.6 程序结构
1.6.1 CASE语句
编程格式:
CASE 表达式 OF 常量1 GOTOF LABEL1 … DEFAULT GOTOF LABELn
示例:
DEF INT VAR1, VAR2
CASE (VAR1+VAR2) OF 7 GOTOF MARK1 9 GOTOF MARK2 DEFAULT GOTOF MARK3
MARK1: G00 X1 Y1
MARK2: G00 X2 Y2
MARK3: G00 X3 Y3
1.6.2 IF语句
编程格式:
IF 表达式
NC程序段
ELSE
NC程序段
ENDIF
IF-ELSE-END模块用于二选一,如果表达式的值为TRUE,则执行IF分支中的程序模块,否则ELSE分支被执行。这个ELSE分支可以取消。
示例:
DEF INT VAR1, VAR2
IF VAR1>VAR2
G00 X1 Y1
ELSE
G00 X2 Y2
ENDIF
IF语句可以嵌套使用,嵌套层数不能超过9层。
1.6.3 WHILE语句
编程格式:
WHILE 表达式
NC程序段
ENDWHILE
只要表达式的值为TRUE,WHILE循环就被执行。要想跳出循环,需要在结构体中不断修改表达式的值,直到其为FALSE。
示例:
DEF REAL HH=9
G01 X0
WHILE HH>0
G91 X=HH
HH=HH-1
ENDWHILE
1.7 指令表
地址 | 含义 | 编程 |
D | 刀具补偿号 | D… |
用于某个刀具T…的补偿参数,D0表示不使用刀补,一个刀具最多有9个D号。 | ||
F | 进给率 | F… |
刀具/工件的进给速度,对应G94或G95,单位分别为毫米/分钟或毫米/转。 | ||
G | G功能 | G… |
G功能按G功能组划分,一个程序段中只能有一个G功能组中的一个G功能指令。G功能分为模态和非模态两种方式。 | ||
G00 | 快速定位 | G00 X… Z… |
G01 | 直线插补 | G01 X… Z… F… |
G02 | 顺时针圆弧插补 | 圆心和终点: |
G02 X… Z… I… K… F… | ||
半径和终点: | ||
G02 X… Z… CR=…F… | ||
张角和圆心: | ||
G02 AR=… I… K… F… | ||
张角和终点: | ||
G02 AR=… X… Z… F… | ||
G03 | 逆时针圆弧插补 | G03…;其它同G02 |
G33 | 恒螺距螺纹插补 | 圆柱螺纹: |
G33 Z… K… SF=… | ||
端面螺纹: | ||
G33 X… I… SF=… | ||
锥螺纹,螺距为K | ||
G33 Z… X… K… SF=… | ||
锥螺纹,螺距为I | ||
G33 Z… X… I… SF=… | ||
G04 | 暂停给定时间 | G04 H…,单独程序段 |
G74 | 返回参考点 | G74 X… Z…,单独程序段 |
G75 | 返回固定点 | G75 X… Z…,单独程序段 |
G25 | 工作区域下限 | G25 X… Z…,单独程序段 |
G26 | 工作区域上限 | G26 X… Z…,单独程序段 |
G17 | XY平面 | |
G18 | ZX平面 | |
G19 | YZ平面 | |
G40 | 取消刀具半径补偿 | |
G41 | 调用刀具半径补偿,刀具在轮廓左侧移动 | |
G42 | 调用刀具半径补偿,刀具在轮廓右侧移动 | |
G500 | 取消可附加零点偏移 | |
G501 | 设定可附加零点偏移 | |
G54 | 第一可设定零点偏移 | |
G55 | 第二可设定零点偏移 | |
G56 | 第三可设定零点偏移 | |
G57 | 第四可设定零点偏移 | |
G58 | 第五可设定零点偏移 | |
G59 | 第六可设定零点偏移 | |
G53 | 取消可设定零点偏移 | |
G60 | 准确定位方式,模态有效 | |
G64 | 连续路径加工方式,默认有效,模态有效 | |
G09 | 非模态准确定位 | |
G70 | 英制尺寸(长度) | |
G71 | 公制尺寸(长度) | |
G90 | 绝对尺寸 | |
G91 | 增量尺寸 | |
G94 | 直线进给率,毫米/分 | |
G95 | 旋转进给率,毫米/转 | |
G96 | 使用恒定切削速度(F毫米/转,S米/分) | G96 S… LIM=… F… |
G97 | 取消恒定切削速度 | |
WALIMON | 工作区域限制生效 | 单独程序段 |
WALIMOF | 工作区域限制取消 | 单独程序段 |
DIAMOF | 关闭直径编程,半径数据输入 | 单独程序段 |
DIAMON | 打开直径编程,直径数据输入 | 单独程序段 |
H | 暂停时间 | 参见G04 |
I | 插补参数,X轴尺寸。在G02和G03中为圆心坐标;在G33中表示螺距大小。 | 参见G02,G03和G33 |
K | 插补参数,Z轴尺寸,其余同I | 参见G02,G03和G33 |
M | 辅助功能 | M… |
M00 | 程序无条件暂停 | 单独程序段 |
M01 | 程序有条件暂停 | 单独程序段 |
M02 | 主程序结束,主轴停止并返回程序起始处,工件计数加1 | 单独程序段 |
M03 | 主轴顺时针旋转 | |
M04 | 主轴逆时针旋转 | |
M05 | 主轴停止 | |
M19 | 主轴定位 | M19 SP=…,单独程序段 |
M30 | 主程序结束,主轴停止并返回程序起始处,工件计数加1 | 单独程序段 |
M90 | 工件计数加1,用于自动加工单元的无限循环加工计数,不得与M02、M30存在于同一程序中,否则工件计数会发生错误。 | 单独程序段 |
N | 程序段号 | N… |
P | 子程序调用次数 | N10 WELLE7() P3 |
调用三次 | ||
R0~R99 | R参数 | R1=30 |
R2=SIN(R1) | ||
RET | 子程序结束 | 单独程序段 |
S | 主轴转速,此时值不可为负。 | S… |
G96时单位为米/分钟,其余均为转/分钟。 | ||
T | 刀具号 | T… |
X | 坐标轴 | X… |
Z | 坐标轴 | Z… |
C | C轴 | C… |
ANG= | 在轮廓中定义直线的角度 | N10 G01 X… Z… |
在G00或G01中定义直线的一种方法:平面中只有一个终点坐标已知,或者在几个程序段表示的轮廓中最后的终点坐标已知。单位为度。 | N20 X… ANG=… | |
AR= | 圆弧插补张角 | 参见G02和G03,AR范围0~360 |
CALL | 子程序调用 | N10 CALL WELLE7() |
单独程序段 | ||
CHF= | 倒角 | N10 X… Z… CHF=… |
在两个轮廓之间插入给定长度的倒角。 | N20 X… Z… | |
CHR= | 倒角 | N10 X… Z… CHR=… |
在两个轮廓之间插入给定边长的倒角。 | N20 X… Z… | |
CR= | 圆弧插补半径 | 参见G02和G03 |
DEF | 变量定义 | DEF INT VAR1=12 |
在程序开始处定义BOOL、INT、REAL、CHAR等类型的局部用户变量。 | DEF REAL VAR2=2.4 | |
GOTOB | 向后跳转 | N10 LABEL1: … |
… | ||
N100 GOTOB LABEL1 | ||
GOTOF | 向前跳转 | N10 GOTOF LABEL2 |
… | ||
N100 LABEL2: … | ||
IF | 跳转条件 | N10 IF R1>5 GOTOF LABEL3 |
… | ||
N100 LABEL3: … | ||
LIM= | 使用G96时的主轴转速上限 | 参见G96 |
MSG( ) | 显示信息,文本位于双引号内 | MSG(“MESSAGE TEXT”) |
单独程序段 | ||
RND= | 倒圆角 | N10 X… Z… RND=… |
N20 X… Z… | ||
SET( ) | 数组赋值,从指定元素开始连续赋值 | 参见数组赋值 |
REP( ) | 数组赋值,从指定元素开始赋予相同值 | DEF REAL VAR3[12] = REP(4.5) |
此时所有元素值均为4.5 | ||
SF= | 使用G33时的螺纹起始角 | 参见G33,SF范围0~360 |
SP= | 使用M19时的主轴定位角度 | 参见M19,单独程序段 |
SPOS= | 定位主轴角度 | SPOS= 30 |
单独程序段 | ||
MIRROR | 镜像 | MIRROR X0 |
单独程序段 | ||
TRANSMIT | 激活端面插补 | 单独程序段 |
TRACYL( ) | 激活柱面插补 | 单独程序段 |
TRAFOOF | 取消端面插补或柱面插补 | 单独程序段 |
M70 | 轴模式 | |
M71 | 主轴模式 | |
SETMS ( ) | 指定当前加工主轴 |
1.8 G功能分组
1 平面(M) |
2 单位(M) |
3 编程模式(M) |
4 刀具补偿(M) |
5 零点偏置(M) |
G17 X/Y |
G70 英制 |
G90 绝对(R) |
G40 取消(R) |
G53 取消(R) |
G18 Z/X(R) |
G71 公制(R) |
G91 增量 |
G41 左刀补 |
G54-G59 零点偏置 |
G19 Y/Z |
|
|
G42 右刀补 |
G501 设定可附加零点偏置 |
|
|
|
|
G500 取消可附加零点偏置 |
6 特殊(A) |
7 连续路径加工 |
8 进给率(M) |
9 范围限制(A) |
10 运动 |
G04 暂停 |
G60 精准停(M) |
G94 mm/min(R) |
G25 工作区下限 |
G00快速定位(M、R) |
G74 返回参考点 |
G64 连续路径加工(M、R) |
G95 mm/r |
G26 工作区上限 |
G01 直线插补(M) |
G75 返回固定点 |
G09 精确停(A) |
G96 恒定线速度 |
|
G02 圆弧(顺时针,A) |
|
|
G97 取消恒线速度 |
|
G03 圆弧(逆时针,A) |
|
|
|
|
G33 螺纹加工(A) |
1.9 M功能分组
组1: |
||||
M功能 |
类型 |
说明 |
参数 |
备注 |
M00 |
N |
程序停止 |
|
单独程序段 |
M01 |
N |
选择性程序停止 |
|
单独程序段 |
M02 |
N |
主程序结束,复位到程序开始 |
|
单独程序段 |
M30 |
N |
程序结束,复位到程序开始 |
|
单独程序段 |
M90 |
N |
工件计数加1,用于自动加工单元的无限循环加工计数,不得与M02、M30存在于同一程序中,否则工件计数会发生错误。 |
|
单独程序段 |
组2 |
||||
M功能 |
类型 |
说明 |
|
|
M03 |
MI |
主轴或动力头顺时针旋转 |
|
|
M04 |
MI |
主轴或动力头逆时针旋转 |
|
|
M05 |
MRF |
主轴或动力头停止 |
|
|
M19 |
N |
主轴或动力头定位 |
须带SP |
单独程序段 |
说明:
- 不能在同一个程序段中指定两个或两个以上同组的M代码;
- 同一程序段中最多可以编程5个M代码;
- I段前执行:当运动指令和M功能在同一程序段中出现时,M指令在运动指令之前执行;
- F段后执行:当运动指令和M功能在同一程序段中出现时,M指令在运动指令之后执行;
- M指令和T指令在同一程序段出现时,T指令先执行;
- 用户自定义M指令必须单独程序段。