01-NC编程语言
1.1 变量定义
变量功能:
通过使用变量可以灵活地编制程序。编程人员可以灵活地运用变量计算建立一个高度灵活的程序档案,从而省去很多编程的工作。
变量类型:
控制系统将变量分为以下几种,见表1.1:
表1.1 变量类型
类型 |
注释 |
用户定义的变量 |
由用户定义的变量,带名称和类型,如:计算参数 |
R参数 |
专门的、预定义的计算变量,给定地址R及随后的数字。预定义的计算变量类型为REAL。 |
系统变量 |
供控制系统使用的变量,可以在程序中进行处理(读或写)。系统变量可以存取刀具补偿,控制系统状态等。 |
变量的命名规则:
● 变量名称可以包含字母、数字和下划线,且不能以下划线开头。
● 变量名称最多由31个字符组成
1.1.1 用户变量
用户变量类型:
用户定义的变量类型,见表1.2:
表1.2 用户定义的变量类型
类型 |
意义 |
值的范围 |
INT |
整数型,即整数的数字 |
±(231 -1) |
REAL |
实数型,即带小数的数字,包括整数 |
±(10-300~10+300) |
BOOL |
布尔型,逻辑值,其值只能是“TRUE”(1)或者“FALSE”(0) |
1或0 |
CHAR |
字符型,是与ASCII代码相对应的单个字符,用单引号标识 |
0~255 |
STRING |
字符串型,由多个字符组成的符号串,用双引号标识 |
最多200个字符 |
AXIS |
轴类型,代表轴地址,0为X轴,1为Y轴,2为Z轴,3为A轴,4为B轴,5为C轴 |
0,1,2,3,4,5 |
从使用范围分,用户变量可分为局部变量和全局变量。局部变量,只能在当前编辑的程序中使用。与之相对的全局变量,则可实现在不同程序之间传递使用的要求。
使用局部变量时就在当前程序中定义即可,而全局变量的定义不在某个执行程序中而是在特定的文件中进行,且这一文件的位置也是固定的,在program目录下的variables文件夹中,文件名称具有固定的扩展名.var。(不符合上述两个条件系统则认为是普通程序文件。)
局部变量定义格式:
DEF 类型 名称 [= 数值] ;变量定义赋值
DEF 类型 名称1 [=数值1],名称2 [=数值2],名称3 [=数值3]…
;连续的变量定义赋值
全局变量定义格式:
DEF 类型 名称 ;变量定义
DEF 类型 名称1 ,名称2 ,名称3 ;连续的变量定义
注意事项:
1)INT、REAL、BOOL、AXIS类型的变量默认的初始值为0,CHAR和STRING默认的初始值为空。
2)局部变量在定义的时候可以赋初值,而在全局变量定义文件中,不允许给变量赋初值,比如DEF REAL AX_POS=0.5这样的语句是不允许的。
3)在全局变量定义文件中,除了变量定义语句、M02/M30关键字和以分号起头的注释以外,不允许出现其他的非空字符。而”M02”或”M30”也可以不写,在执行完最后一句定义语句后自动结束。
举例:
局部变量:
DEF CHAR FORM = 'A'
DEF STRING MDG = “FIYANG”
DEF REAL HH1=1,HH2=2,HH3=3
全局变量:
DEF REAL AX_POS
DEF STRING NAME6
1.1.2 R参数
说明:
专门的、预定义的全局变量,给定地址R及随后的数字。预定义的计算变量类型为REAL。正常情况下,如果没有进一步的说明,则在地址R下有100个计算变量供使用,从R0到R99,可采用算术运算进行数学计算。R参数可在R参数界面进行修改,也可在程序中赋值。
示例:
R1=10
R2=SIN (30)
R3=R1*R2
可以在一行中对多个R参数进行赋值:
R1=10 R2=SIN (30) R3=R1*R2
1.1.3 系统变量
功能:
系统变量提供了机床和控制系统的设置、状态等信息。
名称 |
类型 |
含义 |
$P_S |
REAL |
编程的主轴转速 |
$P_F |
REAL |
编程的进给速度 |
$P_TOOLNO |
INT |
当前有效的刀具号 |
$P_TOOL |
INT |
当前有效的补偿号 |
$P_TOOLL[n] |
REAL |
当前有效的刀具长度补偿,对于G17,$P_TOOLL[3]为Z方向长度,对于G18,$P_TOOLL[2]为Z方向长度,对于G19,$P_TOOLL[1]为Z方向长度。 |
$P_TOOLR |
REAL |
当前有效的刀具半径补偿 |
$P_AXN1 |
REAL |
当前横坐标轴,G17时为X轴,G18时为Z轴,G19时为Y轴 |
$P_AXN2 |
REAL |
当前纵坐标轴,G17时为Y轴,G18时为X轴,G19时为Z轴 |
$P_AXN3 |
REAL |
当前加工坐标轴,G17时为Z轴,G18时为Y轴,G19时为X轴 |
$P_EP[AXIS] |
REAL |
刀具在当前工件坐标系下的理论坐标。考虑到增量模式、坐标系变换和换刀等因素,该变量值不一定等于前一程序段的编程值 |
$METRIC_SYSTEM |
BOOL |
是否公制尺寸。TRUE—公制,FLASE—英制。 |
$RADIUS_COMPENSATION |
STRING |
刀具半径补偿。1—G40,2—G41,3—G42 |
1.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[n,m]
说明:
- 定义数组时,数组的一维和二维大小最大为32767。
- 数组可以在程序运行期间或者数组定义的时候进行赋值。
- 第一个数组单元从变址[0,0]开始,当数组大小为[3,4]时,最大可能的数组变址为 [2,3]。
- 数组初始化的方法有以下几种:
3)程序执行过程中使用值列表初始化,SET
赋予初值与定义时一样。作为数值在此也可以使用表达式。赋予初值开始于程序的数组变址。
举例:
EE[0,0]=10 ;单个元素赋值
EE[0,0]=SET(10,20,30,40) ;连续赋值
4)程序执行过程中使用相同的值初始化,REP
举例:
DEF REAL EE[10,3]
EE[0,0]=REP(10)
1.3 赋值
功能:
变量可以在程序中被赋予一个合适类型的值。赋值总是要求一个独立的程序段,每个程序段可以有多个赋值语句。
指令格式:
变量=常数、变量或表达式
举例:
AA1=2.3 R1=1 ;常量赋值
AA1=R1 ;变量赋值
AA1=-R1 ;表达式赋值
1.4 计算
功能:
计算功能主要是用于R参数和实数、整数、字符变量。
运算符:
包括的运算符见表1.3:
表1.3 运算符号
运算符 |
含义 |
+ |
加法 |
- |
减法 |
* |
乘法 |
/ |
除法 |
DIV |
两数相除,结果取整 |
MOD |
两数相除,取余 |
SIN( ) |
正弦,括号内参数单位为度 |
COS( ) |
余弦,括号内参数单位为度 |
TAN( ) |
正切,括号内参数单位为度 |
ASIN( ) |
反正弦,计算结果单位为度 |
ACOS( ) |
反余弦,计算结果单位为度 |
ATAN( ) |
反正切,计算结果单位为度 |
ATAN2( ) |
反正切2,计算结果单位为度 |
SQRT( ) |
平方根 |
ABS( ) |
绝对值 |
POT( ) |
二次幂(平方) |
TRUNC( ) |
取整数 |
LN( ) |
自然对数 |
EXP( ) |
指数函数 |
举例:
AA=10+12
N10 G94 G90 G01 Z80 F100 ;以100mm/min的速度移动到Z轴坐标为 80的位置
N20 G01 X=40+80 ;移动到X轴坐标为(40+80=)120的位置
N30 G01 X=10*2 ;移动到X轴坐标为(10*2=)20的位置
N40 Z=6MOD4 ;移动到Z轴坐标为(6MOD4=)2的位置
N50 Y=5*SIN(30) ;移动到Y轴坐标为(5*SIN(30)=)2.5的 位置
N60 Z=ABS(-5) ;移动到Z轴坐标为(ABS(-5)=)5的位置
N70 Z=TRUNC(3.7) ;移动到Z轴坐标为(TRUNC(3.7)=)3 的位置
1.5 比较运算和逻辑运算
功能:
比较运算可以用来表达某个跳转条件。完整的表达式也可以进行比较。逻辑运算用来将真值联系起来。
比较和逻辑运算符:
比较和逻辑运算符见表1.4:
表1.4 比较和逻辑运算符
|
运算符 |
含义 |
比较运算符 |
== |
等于 |
!= |
不等于 |
|
> |
大于 |
|
< |
小于 |
|
>= |
大于等于 |
|
<= |
小于等于 |
|
逻辑运算符 |
&& |
与 |
|| |
或 |
|
! |
非 |
说明:
- 比较函数可用于CHAR、INT、REAL和BOOL类型的变量。对于CHAR类型变量,比较代码值。
- 比较运算的结果始终为BOOL型。逻辑运算只能用于BOOL类型变量。通过内部类型转换也可将其用于CHAR、INT和REAL数据类型。
- 逻辑运算的0表示false;不等于0表示true。
举例:
N10 AA1=10 AA2=20 AA3=30
N20 IF(AA2-AA1)>AA3 GOTOF BB ;比较运算
…
N80 IF(AA1>20)&&(AA2>30)GOTOF CC ;逻辑运算
1.6 运算的优先级
功能:
每个运算操作都被赋予一个优先级。在计算一个表达式时,有高一级优先权的运算总是首先被执行。在优先级相同的运算中,运算由左到右进行。在算术表达式中可以通过圆括号确定所有运算的顺序并且由此脱离原来普通的优先计算规则。
运算符的优先级:
运算符的优先级从高到低见表1.5:
表1.5 运算符优先级
序号 |
运算符 |
含义 |
1 |
! |
非 |
2 |
*,/ |
乘,除 |
3 |
+,- |
加,减 |
4 |
&& |
与 |
5 |
|| |
或 |
6 |
==,>,<,>=,<= |
比较运算 |
1.7 程序跳转
运行NC程序时是以写入时的顺序执行程序段。程序在运行时可以通过插入程序跳转指令改变执行顺序。跳转目标只能是有标记符或一个程序段号的程序段,并且此程序段必须位于该程序之内。
标记符可以自由选取,但只能由字母、数字或下划线组成,首字符只能是字母。标记符后面必须跟冒号,并且必须位于程序段段首,如果程序段有段号,则标记符紧跟着段号。
举例:
Label1: G01 X20
…
N100 GOTOB Label1
功能:
CASE指令提供根据INT类型实际值不同而进行转移的可能。被CASE指令检测的常量采用什么值程序就转移到所属跳转目标确定的位置。
指令格式:
CASE 表达式 OF 常量1 GOTOF LABEL1 … DEFAULT GOTOF LABELn
CASE 表达式 OF 常量1 GOTOB LABEL1 … DEFAULT GOTOF LABELn
1.7.1 绝对跳转
跳转指令必须占用一个独立的程序段。
示例:
GOTOF Label ;向后跳转(程序结束的方向)
GOTOB Label ;向前跳转(程序开始的方向)
1.7.2 有条件跳转
用IF条件语句表示有条件跳转。如果满足跳转条件,则进行跳转。跳转目标只能是有标记符或程序段号的程序段。该程序段必须在此程序之内。有条件跳转指令必须是独立的程序段。
示例:
IF 条件 GOTOF Label ;向后跳转
IF 条件 GOTOB Label ;向前跳转
条件为比较逻辑运算,其运算符及其意义如下:
= = 等于
! = 不等
> 大于
< 小于
> = 大于或等于
< = 小于或等于
示例:
N10 IF R1>1 GOTOF Label ;R1大于1时,跳转到Label程序段
1.8 CASE语句
功能:
CASE指令提供根据INT类型实际值不同而进行转移的可能。被CASE指令检测的常量采用什么值程序就转移到所属跳转目标确定的位置。
指令格式:
CASE 表达式 OF 常量1 GOTOF LABEL1 … DEFAULT GOTOF LABELn
CASE 表达式 OF 常量1 GOTOB LABEL1 … DEFAULT GOTOF LABELn
说明:
- GOTOF:以正向跳转为目标的跳转指令(方向为程序结尾)。
- GOTOB:以反向跳转为目标的跳转指令(方向为程序开头)。
- DEFAULT:对于常量没有前面确定值的情况,可以用DEFAULT指令确定跳转目标。
- 如果DEFAULT指令没有被编程,在这种情况下紧跟在CASE指令之后的程序段将成为跳转目标。
举例:
DEF INT VAR1, VAR2
CASE (VAR1+VAR2) OF 2 GOTOF MARK1 4 GOTOF MARK2 DEFAULT GOTOF MARK3
MARK1: G01 X1 Y1
MARK2: G01 X2 Y2
MARK3: G01 X3 Y3
1.9 IF语句
功能:
一个IF-ELSE-ENDIF程序段用来在两个选择之间进行选择。如果表达式的值为true,则执行IF分支中的程序段。否则执行ELSE分支中的程序段。ELSE分支也可以取消。IF语句可以嵌套使用。
指令格式:
IF 表达式
NC程序段
ELSE
NC程序段
ENDIF
举例:
DEF INT VAR1, VAR2
IF VAR1>VAR2
G00 X1 Y1
ELSE
G00 X2 Y2
ENDIF
1.10 WHILE语句
功能:
在WHILE语句中,只要表达式值为true,循环就被执行。要想跳出循环,需要在循环中不断修改表达式,直到其值为false。WHILE语句可以嵌套使用。
指令格式:
WHILE 表达式
NC程序段
ENDWHILE
举例:
DEF REAL HH=9
G01 X0
WHILE HH>0
G91 X=HH
HH=HH-1
ENDWHILE
1.11 信息编程
信息编程在一个独立的程序段中。当程序执行到所在的行时,信息显示在屏幕上方的信息显示区域,并且一直有效。一个新的信息显示,上一条信息上滚。在MSG信息显示指令中还可加入表达式、变量等,在显示时将这些表达式、变量的当前值显示出来(类似高级语言的print语句)。
举例:
MSG (“THIS IS A SAMPLE=”, 25*4)
显示结果为:“THIS IS A SAMPLE=100”
在这一基础上,信息编程能实现三种模式的报警号:信息(I)、警告(W)、错误(E)。
编程时要求第一个引号中信息编号首字母为大写的“I/W/E”那么系统就会自动判别并在显示结果中加上方括号,其中:
“I”表示当前正在进行的系统操作
“W”可用于提示操作者使用不规范,若不予相关改进,系统也能照常运行
“E”表示由编程错误、设置参数错误、操作错误等引起的错误报警,出现这个报警时系统会进入错误状态,在解决问题后需要按复位键解除报警才能继续执行操作。
为了避免与系统报警冲突,建议在首字母后跟数字来共同组成信息编号。
举例:
MSG (“I7142”,“工作台移动”)
显示结果为:[I7142] 工作台移动
MSG (“W12620”,“请关闭防护门”)
显示结果为:[W12620] 请关闭防护门
MSG (“E34701”,“错误使用开关”)
显示结果为:[E34701] 错误使用开关