新代数控车床宏程序说明书.docx
《新代数控车床宏程序说明书.docx》由会员分享,可在线阅读,更多相关《新代数控车床宏程序说明书.docx(28页珍藏版)》请在冰豆网上搜索。
![新代数控车床宏程序说明书.docx](https://file1.bdocx.com/fileroot1/2023-7/10/1a069316-e374-44c5-af6f-5e0473b8241f/1a069316-e374-44c5-af6f-5e0473b8241f1.gif)
新代数控车床宏程序说明书
实用标准
一.用户宏程序的基本概念
用一组指令构成某功能,并且象子程序一样存储在存储器中,再把这些存储的功能由一个指令来代表,执行时只需写出这个代表指令,就可以执行其相应的功能。
在这里,所存储的一组指令叫做宏程序体(或用户宏程序),简称为用户宏。
其代表指令称为用户宏命令,也称作宏程序调用指令。
用户宏有以下四个主要特征:
1)在用户用户宏程序中可以使用变量,即宏程序体中能含有复杂的表达式;2)能够进行变量之间的各种运算;
3)可以用用户宏指令对变量进行赋值,就象许多高级语言中的带参函数或过程,实参能赋值给形参;
4)容易实现程序流程的控制。
使用用户宏时的主要方便之处在于由于可以用变量代替具体数值,因而在加工同一类的工件时.只得将实际的值赋予变量既可,而不需要对每个不同的零件都编一个程序。
二.基本书写格式
数控程序文档中,一般以“%”字符作为第一行的起头,该行将被视为标题行。
当标题行含有关键字“@MACRO”时整个文档就会以系统所定义的MACRO语法处理。
如果该行无“@MACRO”关键词此档案就会被视为一般ISO程序文档格式处理,此时将不能编写用户宏和使用其MACRO语法。
而当书写ISO程序文档时标题行一般可以省略,直接书写数控程序。
“@MACRO”关键词必须是大写字母。
对于程序的注释可以采用“//……”的形式,这和高级语言C++一样。
例一:
MACRO格式文档
%@MACRO//用户宏程序文档,必须包含“@MACRO”关键词IF@1=1THEN
G00X100.;
ELSE
G00Z100.;
END_IF;
M99;
例二:
ISO格式文档
%这是标题行,可当作档案用途说明,此行可有可无
文档
实用标准
G00X100.;
G00Z100.;
G00X0;
G00Z0;
M99;
文档
实用标准
三.用户宏程序的编写
如前所述,变量是指可以在用户宏程序中的地址码后代替具体数值,在调用宏程序时进行赋值的符号#i(i=1,2,3,…)。
使用变量可以使用户宏程序具有通用性。
用户宏程序中可以使用多个变量,以变量编号进行识别。
1、变量的形式
变量是用符号#或@后面加上变量编号所构成的,即:
#i(i=1,2,3,…)
例如:
#5
#109
#1005
也可用#[<表达式>]的形式来表示。
例如:
#[#100]
#[#1001-1]
#[#6/2]
其实,通过用符号@后面加上变量编号也可构成的变量,即:
@i(i=1,2,3,…)
例如:
@5
@[@5]
但一般地,由符号@后面加上变量编号构成的变量称为全局变量,不提倡在用户宏程序中使用,具体见后面的介绍。
2、变量的引用
在地址符后的数值可以用变量置换。
例如:
若写成F#33,则当#33=1.5时,与F1.5相同。
若写成Z-#18,则当#18=20.0时,与Z-20.0相同。
但需要注意,作为地址符的O、N、/等,不能引用变量。
例如,O#27、N#1等,都是错误的。
3、未定义变量
尚未被定义的变量,被称为空(VACANT)。
变量#0,@0始终为空,经常被用作空变量使用。
3.变量赋值和引数赋值
变量赋值:
用户宏程序中变量赋值使用赋值运算符“:
=”,不可仅用“=”符
文档
实用标准
号。
因为在本系统中符号“=”是被规定为关系运算符,用来比较是否相等的。
例如#30:
=100,会将变量#30赋值为整数100;而#30=100,将不能为变量#30赋值,实际上是比较变量#30是否与整数100相等。
四.变量运算及变量表达式
1.用户宏运算符
要对变量进行各种运算操作就要用到运算符,它是“能对变量所存数据进行运算的符号”。
本系统的运算符及其优先级如表3-2所示。
表3-2运算符及其优先级
运算名
括号
函数调用运算
取负
求补运算
乘法运算
除法运算
模运算/求余运算加法运算
减法运算
关系运算
相等运算
不等运算
布尔逻辑/按位与布尔逻辑/按位异或布尔逻辑/按位或
2、基本算数运算符
符号
(),[]
<函数名>(<参数列表>)-
NOT
*
/
MOD
+
-
<,>,<=,>=
=
<>
&,AND
XOR
OR
优先级
1
2
3
3
4
4
4
5
5
6
7
8
9
10
11
(1)+
(2)-
(3)*
(4)/
(加法运算符,如3+5,#12+4)
(减法运算符,或取负运算符,如#33-16,-#16)(乘法运算符,如9*2,#13*8)
(除法运算符,如10/3,#43/15)
(5)MOD(模运算符,或称求余运算符,其两侧均应为整型数据,如7MOD4的值为3,当#18=20时#18MOD4的值为2)
文档
实用标准
3、算术表达式和运算符优先级
用算术运算符和括号将运算对象连接起来的、符合语法规则的式子称为算术表达式,运算对象可以是常数、变量、函数等。
例如:
#6*8/#32-1.5+#18+ROUND(#1)
这就是一个算术运算式,它可以作为一个整体赋值给某个变量,或用作其他表达式中的一个运算对象。
本系统按表表3-2规定了运算符的优先级和结合性。
在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。
如表达式#12-#41*5的左侧为减,右侧为乘号,而乘号优先于减号,因此,相当于#12-(#41*5)。
如果在一个运算对象两侧的运算符的优先级别相同,如#2-5+#23,则按规定的结合性(结合方向)处理,算术运算符的结合方向为“自左至右”,即先左后右。
因此5先与减号结合,执行#2-5的运算,再执行加#23的运算。
这样“自左至右的结合方向”又称为“左结合性”,即运算对象先与左面的运算符结合;对应地,也有“右结合性”的运算符,例如赋值运算符“:
=”就是。
4、关系运算符和关系表达式
关系运算符是逻辑运算中比较简单的一种。
所谓“关系运算”实际上就是“比较运算”。
将两个值进行比较,判断比较的结果是否符合给定的条件。
例如,#3>10是一个关系表达式,大于号(>)是一个关系运算符,如果#3=12,则满足给定的“#3>10”条件,因此关系表达式的值为“真”(即“条件满足”);如果#3=6,不满足“#3>10”条件,则称关系表达式的值为“假”。
本系统提供6种关系运算符:
(1)<(小于)
(2)<=(小于或等于)(3)>(大于)
(4)>=(大于或等于)(5)=(等于)
(6)<>(不等于)
优先级相同(高)
优先级(较高)优先级(低)
关于优先次序:
1、前4种关系运算符(<,<=,>,>=)的优先级别相同,它们却高于关系运算符“=”,而“=”又高于“<>”
2、关系运算符的优先级低于算术运算符。
3、关系运算符的优先级高于赋值运算符。
用两个关系运算符将两个表达式连接起来的式子,称为关系表达式。
文档
实用标准
例如:
#6>36,#13+4<>#23
关系表达式的值是一个逻辑值,即“真”或“假”。
例如,若#12为8,则关系表达式“#12=10”的值为“假”,“#12>=6”的值为“真”。
5、逻辑运算和逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。
本系统提供6种逻辑运算符和逻辑运算
(1)&,AND逻辑与
(2)XOR
(3)OR
逻辑或
逻辑异或
它们都是“双目(元)运算符”,它要求有两个运算量(操作数),逻辑运算举例如下:
#1AND#2
#1OR#2
若#1、#2为真,则#1AND#2为真。
若#1、#2之一为真,则#1XOR#2为真。
逻辑运算符低于关系运算符,见图3-1。
算术运算符
关系运算符
逻辑运算符
赋值运算符
图3-1
(高)
(低)
五.用户宏程序的流程控制
所谓程序的流程(FlowControl)是通过控制程序的执行方向,进而掌握程序动态。
这用户宏程序区别于一般数控程序的特征之一,也是用户选择用户宏程序编写数控代码的一大理由。
用户宏程序的流程控制包括无条件判断、循环控制、无条件转移三大类,这与其他的高级语言程序类似,下面将分别介绍其功能和使用语法。
1、条件判断
判断条件的真假,然后根据真假或者对应情况到指定的地方去执行程序,这方面的语句有IF和CASE语句。
1、IF条件语句
1)基本语法:
文档
实用标准
IF<条件表达式>THEN→<操作>→ELSEIF<条件表达式>THEN→<操作>→ELSE→<操作>→END_IF;
说明:
IF条件判断,根据真假情况到指定的地方去执行程序。
例如:
%@MACRO
//启动MACRO语法
#1:
=3.0;
G01X20.Z15.F200;
IF#1=1THEN;X(1.0*1);Z(1.0*1);
ELSEIF#1=2THEN;X(1.0*2);Z(1.0*2);
ELSEIF#1=3THEN;X(1.0*3);Z(1.0*3);
ELSE;X(1.0*4);Z(1.0*4);
END_IF;X(1.0)Z(1.0);
M30;
然而在实际使用中,可以有以下一些变形:
2)变形1
语法:
IF<条件表达式>THEN→<操作>→ELSE→<操作>→END_IF;
3)变形2
语法:
IF<条件表达式>THEN→<操作>→END_IF;
编程时可根据需要选择合适的语法格式。
2、循环控制
1、REPEAT直到型循环
语法:
REPEAT
<循环体>
UNTIL<条件表达式>END_REPEAT;
说明:
REPEAT直到型循环控制,先执行循环体,后判断条件表达式,当条件满足时退出循环。
例如:
%@MACRO
#10:
=30.;
//启动MACRO语法
文档
实用标准
#11:
=22.5.;
#12:
=#10/2;
#13:
=#11/2;
#14:
=2.0;
#15:
=1.5;
G01X#12Z#13F200.0;
REPEAT
G00X(#12+#14)Z(#13+#15);
G01X(#12+#14)Z(#13-#15);
X(#12-#14)Z(#13-#15);
X(#12-#14)Z(#13+#15);
X(#12+#14)Z(#13+#15);
#14:
=#14+2.0;
#15:
=#15+1.5;
UNTIL(#14>#12)OR(#15>#13)END_REPEAT;
X(1.0)Z(1.0);
M30;
3.WHILE当型循环
语法:
WHILE<条件表达式>DO→<循环体>→END_WHILE;
说明:
WHILE当型循环控制,先判断条件表达式,当条件满足时执行循环体,否则退出循环。
例如:
%@MACRO;
#10:
=20.;
#11:
=15.;
#12:
=#10/2;
#13:
=#11/2;
#14:
=2.0;
#15:
=1.5;
G01X#12Z#13F200.0;
WHILE(#14<=#12)AND(#15<=#13)DO
文档
实用标准
G00X(#12+#14)Z(#13+#15);
G01X(#12+#14)Z(#13-#15);
X(#12-#14)Z(#13-#15);
IF#14>6.0THEN
EXIT;
END_IF;
X(#12-#14)Z(#13+#15);
X(#12+#14)Z(#13+#15);
#14:
=#14+2.0;
#15:
=#15+1.5;
END_WHILE;
X(-5.0)Z(5.0);
M02;
4.FOR循环
语法:
FOR<循环变量>:
=<表达式1>TO<表达式2>[BY<表达式3>]DO<循环体>
END_FOR;
说明:
FOR循环控制,式中各参数意义如下
循环变量——控制循环次数的变量;
表达式1——循环计数的起始值,可为整数或表达式;
表达式2——循环计数的终止值,可为整数或表达式;
表达式3——循环计数每次的累加值,可为整数或表达式;
循环体——循环每次执行内容;
FOR循环执行过程为:
先给循环变量赋起始值,然后判断循环变量是否为终止值,当循环变量已为终止值时退出循环,否则执行循环体,再对循环变量加上每次累加值,
5、无条件转移
GOTO转移语句
语法:
GOTOn;
说明:
无条件地跳到指定的n行号执行,其中n可为整数或表达式。
GOTO常和IF语句搭配使用,那就是说当程序检查到某个条件满足时用GOTO语句去进一
文档
实用标准
步处理,但应尽量少用该语句以提高程序可读性。
范例:
%@MACRO
//启动MACRO语法
…
IF(#1=2)THENGOTO100;
G01X10.Z10.;
…
N100G01X30.Z30.;
…
M02;
EXIT循环中断语句
语法:
EXIT;
说明:
循环中断,跳离循环控制;用在循环控制中,通常EXIT都和IF语句搭配使用,当某个条件满足后就跳离循环。
请参考WHILE范例。
六.库函数
1、ABS
调用方法:
ABS(<参数>)
函数描述:
求一个数的绝对值
范例:
#1:
=ABS(-2.3);//#1的结果是2.3
[注]:
此处函数内“参数”既可为实际数值,也可为变量或表达式,以下若无特殊说明均按此处理。
2、SIN
调用方法:
SIN(<参数>)
函数描述:
求一个数的正弦值
范例:
#1:
=SIN(#10);
3、ASIN
调用方法:
ASIN(<参数>)
函数描述:
求一个数的反正弦值
范例:
#1:
=ASIN(#10);
文档
实用标准
4、MAX
调用方法:
MAX(<参数1,参数2>)
函数描述:
求两个数的最大值
范例1:
#1:
=MAX(10,20);//#1等于20
范例2:
#1:
=MAX(#2,#3);
5、SQRT
调用方法:
SQRT(<参数>)
函数描述:
求一个数的平方根值
范例1:
#2:
=SQRT(3);//#2等于1.732
范例2:
#16:
=SQRT(#10);
6、SIGN
调用方法:
SIGN(<参数>)
函数描述:
返回一个数的符号,-1表示该数是负数,1表示该数是正数,0表示该数是零。
范例:
IF(SIGN(#10)>0)THEN
…
END_IF;
5、CEIL
调用方法:
CEIL(<参数>)
函数描述:
返回比一个数大或与其相等的最小整数
范例1:
#2:
=CEIL(2.3);//#2等于3
范例2:
#2:
=CEIL(#10);
7、ROUND
调用方法:
ROUND(<参数>)
函数描述:
四舍五入化整,
范例1:
#2:
=ROUND(2.3);//#2等于2
文档
实用标准
范例2:
#2:
=ROUND(#10);
七.用户宏程序编写注意事项
1.用户宏文档第一行必须为%@MACRO;程序段的每一行结束需加“;”结束符;对于用户宏子程序最后需加“M99;”,以便能返回到主程序。
2.变量赋值使用“:
=”符号,不可仅用“=”符号。
3.文档名储存需依照下列规则。
例如:
编写G100之MACRO,需将该MACRO程序存在C:
\CNC\MACRO目录底下,且文件名需为G0100,不需扩展名。
而编写G100.1之MACRO,需将该MACRO程序存在C:
\CNC\MACRO目录底下,且文件名需为G100001,不需扩展名。
4.请多使用局部变量(#1~#50),模态变量(#2001~#2100,#3001~#3100)为所有扩充G码的共享资源,请仅用于多个扩充G码间的数据交换,以节省共享资源;如果需要系统定义的初始值,请使用用户参数
(#4001~#4100,#5001~#5100)。
5.请不要使用全局变量(GlobalVariables,@1~@999),因为G码执行时,使用者的数据是由自变量(A_,B_…,Z_)传入,由公共变量传递不符合使用习惯。
6.系统在执行加工时对于MACRO程序会事先预编译,因此MACRO执行速度会超前于G、M代码指令,因此当要求变量赋值或数据读取须与G、M代码指令发出的时间进程相同时,请于变量赋值或数据读取前加WAIT()指令,否则该变量赋值或该数据读取将无法与G、M代码同步。
7.不可改变模式G码(G00/G01/G02/G03/G33/G34/G35,G91/G90,G40/G41/G42,…,)的状态,如果用户宏程序中需要改变其状态时,就需要模态信息的回复,
8.对于长度或角度的自变量在运算前请使用STD()函数将单位标准化,以符合工具机使用习惯。
9.不可以改变坐标系统设定,G92/G54/G52等与坐标系统相关指令不能使用,否则图形仿真功能将失去参考意义。
10.请在程序中加上必要的注释,养成良好的编程习惯,以增加程序可读性和可维护性,以帮助后续开发人员维护和排除问题。
文档
实用标准
运算名
括号
函数调用运算取负
求补运算
乘法运算
除法运算
模运算/求余运算加法运算
减法运算
关系运算
相等运算
不等运算
布尔逻辑/按位与布尔逻辑/按位异或布尔逻辑/按位或
函数名
ABS
附录Ⅳ运算符及其优先级符号
(),[]
<函数名>(<参数列表>)-
NOT
*
/
MOD
+
-
<,>,<=,>=
=
<>
&,AND
XOR
OR
描述
求一个数的绝对值
范例:
优先级
1
2
3
3
4
4
4
5
5
6
7
8
9
10
11
ACOS
ASIN
ATAN
#1:
=ABS(-2.3);//#1的结果是2.3求一个数的反余弦值
范例:
#1:
=ACOS(#10);
求一个数的反正弦值
范例:
#1:
=ASIN(#10);
求一个数的反正切值
范例:
#1:
=ATAN(#10);
文档
实用标准
函数名
COS
MAX
MIN
SIN
SQRT
TAN
SIGN
CEIL
描述
求一个数的余弦值
范例:
#1:
=COS(#10);
求两个数的最大值
范例1:
#1:
=MAX(10,20);//#1等于20
范例2:
#1:
=MAX(#2,#3);
求两个数的最小值
范例1:
#1:
=MIN(10.0,20.0);//#1等于10.0
范例2:
#1:
=MIN(#10,#11);
求一个数的正弦值
范例:
#1:
=SIN(#10);
求一个数的平方根值
范例1:
#2:
=SQRT(3);//#2等于1.732..
范例2:
#2:
=SQRT(#10);
求一个数的正切值
范例:
#1:
=TAN(#10);
返回一个数的符号,-1表示该数是负数,1表示该数是正数,0表示该数是零
范例:
IF(SIGN(#10)>0)THEN
….
END_IF;
返回比一个数大或与其相等的最小整数
范例1:
文档
实用标准
函数名
FLOOR
ROUND
STD
STDAX
RANDOM
PUSH
POP
描述
#2:
=CEIL(2.3);//#2等于3
范例2:
#2:
=CEIL(#10);
返回比一个数小或与其相等的最大整数
范例1:
#2:
=FLOOR(2.3);//#2等于2
范例2:
#2:
=FLOOR(#10);
四舍五入化整
范例1:
#2:
=ROUND(2.3);//#2等于2
范例2:
#2:
=ROUND(#10);
参数规范化,读第一个参数为规范化对象,根据第二个参数使用最小增量方法,特别对小数编程尤为必要。
范例:
#9:
=STD(#9,#1600);//根据远轴规范化
参数规范化,读第一个参数为规范化对象,根据第二个轴地址参数使用最小增量方法
范例:
#24:
=STDAX(#24,X);//根据X轴规范化
#3:
=STDAX(#3,A);//根据A轴规范化
产生一个伪随机数
范例:
#1:
=RANDOM();
进宏堆栈
范例:
PUSH(#1);//变量#1内容进栈
PUSH(#3);//变量#3内容进栈
出宏堆栈
范例:
#1:
=POP();//出栈值赋给变量#1
文档
实用标准
函数名
STKTOP
描述
从栈顶依据索引获取堆栈元素,范例:
但不弹出此元素
ALARM
SLEEP
STKTOP(0);//栈顶元素
STKTOP
(1);//栈顶下的第一个元素
STKTOP
(2);//栈顶下的第二个元素
…etc
发出宏警告
范例:
ALARM(300);//发出标识号为300的警告ALARM(#1);//#1必须为整数
临时放弃执行循环
范例:
SLEEP();
文档