资源描述
Open CNC Macro
用户宏程序开发
新代科技
2005/8/1
第 50 页
前言
本发展环境OpenCNC开发的目的在于方便Macro程序的撰写及测试,使得程序设计师得以在实际上线执行程序之前可以先作一程序的测试,经由图形化的接口而得知其程序是否有逻辑上的错误存在。
目录
第一章OpenCNC开发环境安装及使用说明 1
第一节 系统需求 1
第二节 软件安装 1
第三节 使用说明 2
第二章 用户宏编程的基本概念和基本书写格式 4
第一节 用户宏编程的基本概念 4
第二节 基本书写格式 6
一、用户宏文档格式 6
二、普通数控程序段格式 6
三、用户宏程序段格式 8
第三章 用户宏程序的编写 9
第一节 变量 9
一、变量及其使用方法 9
二、变量赋值和引数赋值 9
三、变量的种类 10
第二节 变量运算及变量表达式 13
一、用户宏运算符 13
二、基本算数运算符 14
三、算术表达式和运算符优先级 14
四、关系运算符和关系表达式 14
五、逻辑运算和逻辑表达式 15
第三节 用户宏程序的流程控制 15
一、条件判断 16
二、循环控制 18
三、无条件转移 21
第四节 库函数 21
一、数学函数类 22
二、信息传递类 23
三、操作辅助类 24
四、文档操作类 25
五、仿真绘图类 25
第四章 宏程序的调用 27
第一节 简单宏调用 27
一、简单宏调用指令 27
二、模态信息的回复 27
第二节 模态宏调用 27
一、模态宏调用指令G66 27
二、模态宏调用指令G66.1 28
第三节 扩充G代码宏指令调用 29
第五章 用户宏程序范例 30
第一节 用户宏程序编写注意事项 30
第二节 用户宏程序编写范例 30
一、车床G21车床车牙 30
附 录 35
附录Ⅰ 基本G码指令一览表 35
附录Ⅱ 地址码一览表 36
附录Ⅲ 引数赋值的地址码和变量的对应关系表 36
附录Ⅳ 运算符及其优先级 37
附录Ⅴ 系统变量分配表 37
附录Ⅵ 库函数 41
附录Ⅶ 程序调用方法 48
第一章OpenCNC开发环境安装及使用说明
第一节 系统需求
个人计算机:80486以上的中央处理器
操作系统:NT 4.0以上的版本,Windows95以上的版本(需先安装MSIE 3.0)
硬盘空间:约1MB的硬盘空间
第二节 软件安装
1、将安装磁盘放入3.5吋磁盘驱动器中,执行SETUP。建议在开始安装之前先行关闭其它的窗口应用程序。
2、 稍待片刻即可进入下面之安装画面。
3、选择Next继续安装的工作。
4、选择Browse更改所要安装的目录或是接受内定的目录,选择Next继续安装的工作。
5、 稍待片刻即可完成安装。
第三节 使用说明
操作说明:
1、首先选取OpenCNC的图标,在图标上以鼠标左键点两下,即可进入主画面:
2、将所欲仿真之Macro程序存成*.nc文件,复制到syntec\OpenCNC\CNCfiles\底下,或是利用操作系统的注册编辑器(regedit),自行设定一目录以存放所编辑的*.mmp文件,选取主窗口中的Load选项,将档案加载,选取开始模拟即可,仿真的结果会显示在结果显示区。
3、 如欲自行设定一目录以存放所编辑的*.mmp 档,请执行regedit,选取HKEY_LOCAL_MACHINE®SOFTWARE®Syntec®OpenCNC®2.0,选取选项”MacroStorage”,将设定值改为:
C:\Program Files\Syntec\OpenCNC\CNCFiles\;” Your files location ”
功能说明:
1、设定所欲显示的空间:
XYZ XY YZ ZX
各个空间设定如上所示。
2、 坐标参数设定:调整各轴的上限和原点的位置。
3、Single Step:设定为Single Step可以一步步的执行程序。
4、开始模拟:开始执行程序,并将结果显示于结果显示区。
5、停止模拟:暂停程序的执行。
6、重设:重新设定系统。
7、开启新档:开启一个新的Macro程序。
8、加载程序:加载Macro程序。
9、储存档案:储存目前的Macro程序。
10、另存新檔:以新的文件名储存目前的Macro程序。
11、 讯息显示区:显示错误讯息,此外亦可用来显示程序中各个变量值;命令栏(Command)可以输入所欲察看的变量名称,而变量值会显示在讯息显示区。
13、Macro程序中变量的部份请参照第二章「系统变量」的说明。
第二章 用户宏编程的基本概念和基本书写格式
第一节 用户宏编程的基本概念
用一组指令构成某功能,并且象子程序一样存储在存储器中,再把这些存储的功能由一个指令来代表,执行时只需写出这个代表指令,就可以执行其相应的功能。
在这里,所存储的一组指令叫做宏程序体(或用户宏程序),简称为用户宏。其代表指令称为用户宏命令,也称作宏程序调用指令。
使用时,编程人员只需会使用用户宏指令即可,而不必去关心宏程序体中的指令内容。
例如,在下述程序流程中,可以这样使用用户宏:
主程序 用户宏
… … O9011
G65 P9011 A10 I5; … …
… … X#1Y#4;
在这个程序的主程序中,用G65 P9011调用用户宏程序O9011,并且对用户宏中的变量赋值:#1=10、#4=5(A代表#1、I代表#4)。而在用户宏中未知量用变量#1及#4来代表。
用户宏有以下四个主要特征:
1)在用户用户宏程序中可以使用变量,即宏程序体中能含有复杂的表达式;
2)能够进行变量之间的各种运算;
3)可以用用户宏指令对变量进行赋值,就象许多高级语言中的带参函数或过程,实参能赋值给形参;
4)容易实现程序流程的控制。
使用用户宏时的主要方便之处在于由于可以用变量代替具体数值,因而在加工同一类的工件时.只得将实际的值赋予变量既可,而不需要对每个不同的零件都编一个程序。
下面再以一个示意性的例子来说明用户宏的概念。
当图1-1中A、B、U、V的尺寸分别为A=20、B=10、U=40、V=20时,其程序为:
O1;
G9l G00 X20.0 Y10.0;
G01 Y10.0;
X40.0;
Y-20.0;
X-40.0;
G00 X-20.0 Y-10.0;;
但是当图中A、B、U、V尺寸变化时则又需要编一个类似的程序。
实际上,我们可以将程序写为:
O1;
G91 G00 XA YB;
G01Y V;
XU;
Y-V;
X-U;
G00 X-A Y-B;
此时可以将其中变量,用用户宏中的变量#i代替,而字母与#i的对应关系为:
A —— #1
B —— #2
U —— #21
V —— #22
则用户宏程序即可写成如下形式
09801;
G9l G00 X#l Y#2;
G01 Y#22;
X#21
Y-#22;
X-#21;
G00 X-#1 Y-#2;
M99;
使用时就可以用下述用户宏指令来调用:
G65 P9801 A20.0 B10.0 U40.0 V20.0;
由于地址码A 、B、U、V分别与变量#1、#2、#21、#22有着一定的对应关系,执行以上用户宏调用程序段时,实际数值就会将被赋予给对应的变量,其对应结果为#1=20.0,#2=10.0,#21=40.0,#22=20.0;然后被调用的用户宏程序再按所得到的变量值在宏程序中进行运算或执行指令,结束后返回主程序。
实际使用时,一般还需要在这一指令前再加上F、S、T指令及进行坐标系设定等。
如上述所示,当加工同一类,但只是尺寸不同的工件时,只需改变用户宏命令的数值即可,而没有必要针对每一个零件都编一个程序。
第二节 基本书写格式
一、用户宏文档格式
数控程序文档中,一般以“%”字符作为第一行的起头,该行将被视为标题行。当标题行含有关键字“@MACRO”时整个文档就会以系统所定义的MACRO语法处理。如果该行无“@MACRO”关键词此档案就会被视为一般ISO程序文档格式处理,此时将不能编写用户宏和使用其MACRO语法。而当书写ISO程序文档时标题行一般可以省略,直接书写数控程序。“@MACRO”关键词必须是大写字母。
对于程序的注释可以采用“//……”的形式,这和高级语言C++一样。
例一:MACRO格式文档
% @MACRO //用户宏程序文档,必须包含“@MACRO”关键词
IF @1 = 1 THEN
G00 X100.;
ELSE
G00 Y100.;
END_IF;
M99;
例二:ISO格式文档
% 这是标题行,可当作档案用途说明,此行可有可无
G00 X100.;
G00 Y100.;
G00 X0;
G00 Y0;
M99;
二、普通数控程序段格式
数控程序是由若干个程序段所组成,而每个程序段是由若干个程序字和程序段结束组成。
例如:N20 G01 X25 Y-36 F100 S300 T02 M03;
而程序字又是由地址符及其后面的数字所组成,如N(地址码)20(数字)、Y(地址码)-36(数字)。在程序中能作指令的最小单位是字,仅用地址码或仅用数字是不能作为指令
的。
程序段的格式如下:
N-
G-
X-
Y-
Z-
……
F-
S-
T-
M-
;
顺序号
准备功能字
尺寸字
进给功能字
主轴转速功能字
刀具功能字
辅助功能字
程序段结束
程序字
程序段内各字说明如下:
(1)顺序号 放在程序段前用以识别各程序段,它由地址码N及其后面的5位以内数字组成的。程序段号不是必须的,可在需要时用,数字号码的顺序也是任意的,可以每段都加也可只加在需要的地方。
例如:N20——表示该的程序段号为20。
(2)准备功能字 也称G功能字,使数控机床做好某种操作准备指令,它由地址码G及其后面的两位以内数字所组成。主要指令有:
1)动作指令 如G01(直线插补)、G02(圆弧插补);
2)平面指令 如G17(设定XY工作平面);
3)刀补指令 如G41(左刀径补偿);
4)其它指令。
G代码及功能可参见表2-1。
G代码分为模态代码(又称续效代码)和非模态代码两种。所谓模态代码是指某一G代码(如G01)一经指定就一直有效,直到后面程序段中使用同组G代码(如G03)才能取代它。而非模态代码只在指定的本程序段中有效。下一程序段需要时必须重写(如G04)。另外,不同组的G代码可以放在同一程序段中。但在同一程序段中出现2个以上同一组的G代码指令时,则只有最后的G代码有效。
(4)尺寸字 由地址码、+、—符号及绝对值(或增量)的数值组成。它主要包括以下几项:
1)坐标轴的移动指令 例如: X35.418。
2)附加轴的移动指令 如回转轴的转动,例如:A45。
3)圆弧圆心坐标 它是在圆弧插补时用来指定圆弧圆心的值,用I、J、K表示。
(5)进给功能字 指定刀具中心运动时的进给速度,由地址码F及其后面的数字组成。这个数字的单位取决于每个数控系统所采用的进给速度的指定方法。
例如:F100——表示进给速度为100mm/min。
(6)主轴功能字 指定主轴转速或速度,由地址码S及其后面的数字组成,单位为转速单位(r/min)。
例如:S300——表示主轴转速为800r/min。
(7)刀具功能字 指定刀号以选择刀具,由地址码T及其后面的数字组成,刀具功能字的数字就表示指定的刀号,数字的位数由所用的系统决定。
例如:T08——表示第八号刀。
(8)辅助功能字 又称M功能字,主要用来表示机床操作时各种辅助动作及其状态,它由地址码M及其后面的两位数字组成。常用辅助代码可参见表1-3。
表1—3 常用辅助功能
代码
功能说明
代码
功能说明
M00
程序停止
M08
切削液开
M01
选择停止
M09
切削液关
M02
程序结束
M30
程序结束
M03
主轴正转
M98
调用子程序
M04
主轴反转
M99
返回主程序
M05
主轴停止
(9)程序段结束 写在每一程序段之后,表示程序结束,一般用符号“;”表示。
表1-2 地址码一览表
功能
地址
意义
程序号
:/ O / %
程序编号
顺序号
N
程序段编号
准备功能
G
建立工作方式
尺寸字
X、Y、Z
各坐标的移动指令
A、B、C、U、V、W
各附加轴的移动指令
R
圆弧半径
I、J、K
圆弧圆心的(增量)坐标
进给功能
F
指定进给的速度
主轴功能
S
指定主轴的旋转速度
刀具功能
T
刀具选择中用于指定刀号
辅助功能
M
实现机床操作的各种辅助动作
偏置号
H、D
偏置号的指定,长度偏移用H,半径补偿用D
暂停
P、X
暂停时间指定
子程序号指定
P
在M98程序段中,用以指定子程序号
顺序号指定
P
在顺序号的位置,程序被重复执行
重复次数
L
子程序或固定循环的重复次数
参数
P、Q、R
固定循环中参数的指定
三、用户宏程序段格式
用户宏程序段的书写格式与普通数控程序段格式相似,每个程序段也是由若干个程序字和程序段结束组成,但是在地址码后面的具体数值可以被变量置换。
例如:N100 G33 U-(#18*2-#31) W(#23-SIGN(#23)*#33) Q#37 F(#9*#11);
可见,两者的不同之处就是组成程序字的地址符后面不仅仅可以是数字,而且可以是变量或者变量的表达式,如G(地址码)33(数字)、U(地址码) -(#18*2-#31) (表达式)、Q(地址码)#37(变量)。
但需注意的是,作为地址码的O、N、/等不能引用变量,其余功能字均可在用户宏中按上述格式使用,功能字的意义和使用方法不变。
第三章 用户宏程序的编写
第一节 变量
一、变量及其使用方法
如前所述,变量是指可以在用户宏程序中的地址码后代替具体数值,在调用宏程序时进行赋值的符号#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 始终为空,经常被用作空变量使用。
二、变量赋值和引数赋值
1、 变量赋值
用户宏程序中变量赋值使用赋值运算符“:=”,不可仅用“=”符号。因为在本系统中符号“=” 是被规定为关系运算符,用来比较是否相等的。
例如#30:=100,会将变量#30赋值为整数100;而#30=100,将不能为变量#30赋值,实际上是比较变量#30是否与整数100相等。
2、 引数赋值
对于用户宏程序的另外一些接口变量,如何获得实际的数值,这是通过引数赋值实现的,下面我们再回头看看第一章第一节中的用户宏程序调用例子:
G65 P9801 A20.0 B10.0 U40.0 V20.0;
执行这条用户宏调用程序段后,子程序中的变量就会得到#1=20.0、#2=10.0、#21=40.0、#22=20.0的结果,这就是引数赋值。
实际上,用户宏编程系统中,地址码A、B、C、D……分别与变量#1、#2、#3、#7……有着一定的对应关系,当执行用户宏调用程序段时,地址码后面的实际数值就被赋予给用户宏程序中所对应的变量,这个过程就称为引数赋值。
除去G、L、N、O、P以外的地址码都可作为引数赋值的地址码,大部分无顺序要求,但对I、J、K则必须按字母顺序排列,对没有使用的地址可省略。
例如:
B_ A_ D_ …I_ K_… 正确,而
B_ A_ D_ …J_ I_… 就是不允许。
引数赋值所指定的地址码和用户宏程序中所使用的变量编号的对应关系如表2-1所示。
表2-1 引数赋值的地址码和变量的对应关系
引数赋值的地址码
用户宏中的变量
引数赋值的地址码
用户宏中的变量
A
#1
P
#16
B
#2
Q
#17
C
#3
R
#18
D
#7
S
#19
E
#8
T
#20
F
#9
U
#21
H
#11
V
#22
I
#4
W
#23
J
#5
X
#24
K
#6
Y
#25
M
#13
Z
#26
[注]:关于扩充的地址码,X1=,请使用GETARG(address)函式读取。
三、变量的种类
按变量的组成符号和编号可将变量分为局部(Local)变量、系统变量(System)和全局变量(Global),其性质和用途都是不同的。
1、 局部变量:#1 ~ #50
所谓局部变量,就是在用户宏程序内部使用的变量,它只在定义它的用户宏程序中有效,也就是说只有该用户宏程序内使用,在此用户宏程序以外是使用不到这些变量的。
但这并不意味着在此外的用户宏程序就不可以再使用#i这样的变量编号,因为在某一时刻调出的用户宏中所使用的局部变量编号#i和另一时刻调用的用户宏(也不论与前一个用户宏相同还是不同)中所使用的#i是不同的,或者说不同的用户宏调用实例中的#i所占用系统内存地址是不同的,即使在多重调用情况下,当用户宏A调用用户宏B的情况下,也不会将A中的局部变量破坏。
我们可以用局部变量级的这样一个概念来理解,作用于宏程序某一级中的变量称为本级变量,即这一变量在同一程序级中调用时内容相同,若在另一级程序(如子程序)中使用,则意义不同。本级变量主要用于变量间的相互传递,初始状态下未赋值的本级变量即为空白变量。
如图2-1,就是用G代码(或G65时)调用宏时,局部变量级会随着调用多重度的增加而增加,即存在如图的关系:
主程序 用户宏 用户宏
(第1级) (第2级)
G65 P_
O_
G65 P_
M99
O_
G65 P_
M99
局部变量
(0级) (1级) (2级)
#1
…
…
#50
#1
…
…
#50
#1
…
…
#50
上图说明了以下几点:
1)主程序中具有#1~#50的局部变量(0级)。
2)用G65调用宏(第1级)时,主程序的局部变量(0级)被保存起来。再重新为用户宏(第1级)准备了另一套局部变量#1~#50(第1级),可以再向它赋值。
3)下一用户宏(第2级)被调用时,其上一级的局部变量(第l级)被保存,再准备出新的局部变量#1-#50(第2级),如此类推。
4)当用M99从各用户宏回到前一程序时,所保存的局部变量(第0、1、2级)存在的状态出现。对于没有赋值的局部变量,其初始状态为空,用户可自由使用。
2、 系统变量:#1000~#31986
系统变量是根据用途而被固定的变量。主要有以下各种表2-2,详情请见附录。
表2-2 系统变量分配
变量编号
用途
#1000~#1058
模态信息
#1500~#1624
运行控制/状态
#1301~#1436
运行时状态变量
#1800~#1916
模态变量
#4001~#5100
用户参数
#6001~#6032
信号接口
#7001~#7101
模式组变量
#11000~#12999
刀具补偿变量
#20001~#25986
工件坐标系补偿值 (工件零点偏移值)
#26001~#31986
参考点
3、 全局变量:@1~@14095
与局部变量相对,全局变量是在主程序以及调用的子程序中通用的变量,它在不同程序级中调用时内容相同,即它在同一系统中的所有程序中都有效,因为全局变量在系统中所占用的内存地址是唯一不变的。因此,对于任何一个全局变量@i,它都可以在主程序和用户宏或者用户宏之间相互使用,传递数值,并对其操作。
全局变量在@1~@14095的范围内,按用途主要分为四组。
其中@1~400和@656~@999两组可以被用户宏程序所使用(可读可写),但它们具有不同的性质和使用方法,前者中的变量常用于一般的运算,可以用操作面板(人机界面)来读取显示;而后者中的变量为保持形变量有记忆性变量,可以被永久保存,即掉电不丢失,在操作面板上可进行读写操作。具体可见表2-3。
表2-3全局变量使用对照表
变量编号
说明
宏程序
人机界面
永久保存
@1~@400
一般运算用变量
读/写
只读
否
@401~@655
对应PLC寄存器R1 ~ R255:
@401=R1
…
@655=R255
※
※
※
@656~@999
有记忆性变量
读/写
读/写
是
@10000~@14095
对应PLC寄存器R0~R4095:
@10000=R0
…
@14095=R4095
※
※
※
[注]:※表示具体参见资源分配表表2-4中对应寄存器。
而@401~@655和@10000~@14095两组变量则影射为PLC中系统预定义的一些寄存器,用户宏程序对其的读写规则和使用方法不尽相同,具体可参见表2-4资源分配表中对应的寄存器,至于更详细的寄存器资源用途和规则可参阅《OpenCNC PLC发展手册》书中介绍。
表2-4资源分配表
编号
说明
读写规则
是否可位(Bit)存取
永久保存
宏程序或人机接口
阶梯程序
R0~R39
CNC系统接口区
只读
※
是
否
R40~R49
PLC警报讯息区
R50~R80
使用者自行定义
读/写
读/写
是
否
R81~R100
对应到系统参数3401~3420 PLC参数
只读
只读
是
否
R101~R102
刀具状态
读/写
读/写
是
是
R103~R255
使用者自行定义
读/写
读/写
是
是
R256~R511
否
R512~R639
CNC系统接口区
只读
※
是
否
R640~R1023
否
R1023~R4095
使用者自行定义
读/写
读/写
否
否
[注]:※表示更详细的寄存器资源用途和规则可参阅《OpenCNC PLC发展手册》一书。
第二节 变量运算及变量表达式
一、用户宏运算符
要对变量进行各种运算操作就要用到运算符,它是“能对变量所存数据进行运算的符号”。本系统的运算符及其优先级如表3-2所示。
表3-2 运算符及其优先级
运算名
符号
优先级
括号
( ),[ ]
1
函数调用运算
<函数名>(<参数列表> )
2
取负
-
3
求补运算
NOT
3
乘法运算
*
4
除法运算
/
4
模运算/求余运算
MOD
4
加法运算
+
5
减法运算
-
5
关系运算
<,>,<=,>=
6
相等运算
=
7
不等运算
<>
8
布尔逻辑/按位与
&,AND
9
布尔逻辑/按位 异或
XOR
10
布尔逻辑/按位 或
OR
11
二、基本算数运算符
(1) + (加法运算符,如3+5,#12+4)
(2) - (减法运算符,或取负运算符,如#33-16,-#16)
(3) * (乘法运算符,如9*2,#13*8)
(4) / (除法运算符,如10/3,#43/15)
(5)MOD (模运算符,或称求余运算符,其两侧均应为整型数据,如7 MOD4的值为3,当#18=20时#18 MOD4的值为2)
三、算术表达式和运算符优先级
用算术运算符和括号将运算对象连接起来的、符合语法规则的式子称为算术表达式,运算对象可以是常数、变量、函数等。
例如:#6*8/#32-1.5+#18+ ROUND(#1)
这就是一个算术运算式,它可以作为一个整体赋值给某个变量,或用作其他表达式中的一个运算对象。
本系统按表表3-2规定了运算符的优先级和结合性。在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。如表达式#12-#41*5的左侧为减,右侧为乘号,而乘号优先于减号,因此,相当于#12-(#41*5)。
如果在一个运算对象两侧的运算符的优先级别相同,如#2-5+#23,则按规定的结合性(结合方向)处理,算术运算符的结合方向为“自左至右”,即先左后右。因此5先与减号结合,执行#2-5的运算,再执行加#23的运算。这样“自左至右的结合方向”又称为“左结合性”,即运算对象先与左面的运算符结合;对应地,也有“右结合性”的运算符,例如赋值运算符“:=”就是。
四、关系运算符和关系表达式
关系运算符是逻辑运算中比较简单的一种。所谓“关系运算”实际上就是“比较运算”。将两个值进行比较,判断比较的结果是否符合给定的条件。
例如,#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”的值为“真”。
五、逻辑运算和逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。
本系统提供6种逻辑运算符和逻辑运算
(1) &,AND 逻辑与
(2) XOR 逻辑或
(3) OR 逻辑异或
它们都是“双目(元)运算符”,它要求有两个运算量(操作数),逻辑运算举例如下:
#1 AND #2 若#1 、#2为真,则#1 AND #2为真。
#1 OR #2 若#1 、 #2之一为真,则#1 XOR #2为真。
逻辑运算符低于关系运算符,见图3-1。
(高)
(低)
算术运算符
关系运算符
逻辑运算符
赋值运算符
图3-1
第三节 用户宏程序的流程控制
所谓程序的流程(Flow Control)是通过控制程序的执行方向,进而掌握程序动态。这用户宏程序区别于一般数控程序的特征之一,也是用户选择用户宏程序编写数控代码的一大理由。用户宏程序的流程控制包括无条件判断、循环控制、无条件转移三大类,这与其他的高级语言程序类似,下面将分别介绍其功能和使用语法。
一、条件判断
判断条件的真假,然后根据真假或者对应情况到指定的地方去执行程序,这方面的语句有IF和CASE语句。
1、IF条件语句
1)基本语法:
IF <条件表达式> THEN
<操作>
ELSEIF <条件表达式> THEN
<操作>
ELSE
<操作>
END_IF;
说明:IF条件判断,根据真假情况到指定的地方去执行程序。
例如:
% @MACRO // 启动MACRO语法
#1 := 3.0;
G01 G91 G92 X20. Y15. F200000;
IF #1 = 1 THEN
X(1.0*1);
Y(1.0*1);
ELSEIF #1 = 2 THEN
X(1.0*2);
Y(1.0*2);
ELSEIF #1 = 3 THEN
X(1.0*3);
Y(1.0*3);
ELSE
X(1.0*4);
Y(1.0*4);
END_IF;
X(1.0) Y(1.0);
M30;
然而在实际使用中,可以有以下一些变形:
2)变形1
语法:
IF <条件表达式> THEN
<操作>
ELSE
<操作>
END_IF;
3)变形2
语法:
IF <条件表达式> THEN
<操作>
END_IF;
编程时可根据需要选择合适的语法格式。
2、CASE分支语句
语法:
CASE <条件表达式> OF
<条件值>:
<操作>
<条件表达式>,<条件表达式>,<条件表达式>:
<操作>
<条件表达式>,…<条件表达式>:
<操作>
ELSE
<操作>
END_CASE;
说明:CASE多条件判断分支,根据条件表达式运算结果所对应的条件值(整数),分别执行不同程序区块。
例如:
% @MACRO // 启动MACRO语法
#1 := 8;
G01 G91 G92 X20. Y15. F200000;
CASE #1 OF
1:
X(1.0*1);
Y(1.0*1);
2:
X(1.0*2);
Y(1.0*2);
3,4,5:
X(1.0*#1);
Y(1.0*#1);
ELSE
X(1.0*6);
Y(1.0*6);
END_CASE;
X(1.0) Y(1.0);
M30;
二、循环控制
1、REPEAT直到型循环
语法:
REPEAT
<循环体>
UNTIL <条件表达式> END_REPEAT;
说明:REPEAT直到型循环控制,先执行循环体,后判断条件表达式,当条件满足时退出循环。
例如:
% @MACRO // 启动MACRO语法
#10 := 30.;
#11 := 22.5.;
#12 := #10/2;
#13 := #11/2;
#14 := 2.0;
#15 := 1.5;
G01 G92 X#12 Y#13 F200.0;
REPEAT
G00 X(#12+#14) Y(#13+#15);
G01 X(#12+#14) Y(#13-#15);
X(#12-#14) Y(#13-#15);
X(#12-#14) Y(#13+#15);
X(#12+#14) Y(#13+#15);
#14 := #14 + 2.0;
#15 := #15 + 1.5;
UNTIL (#14 > #12) OR (#15 > #13) END_REPEAT;
X(1.0) Y(1.0);
M30;
2、WHILE当型循环
语法:
WHILE <条件表达式> DO
<循环体>
END_WHILE;
说明:WHILE当型循环控制,先判断条件表达式,当条件满足时执行循环体,否则退出循环。
例如:
% @MACRO // 启动MACRO语法
#10 := 20.;
#11 := 15.;
#12 := #10/2;
#13 := #11/2;
#14 := 2.0;
#15 := 1.5;
G01 G92 X#12 Y#13 F200.0;
WHILE (#14 <= #12) AND (#15 <= #13) DO
G00 X(#12+#14) Y(#13+#15);
G01 X(#12+#14) Y(#13-#15);
X(#12-#14) Y(#13-#15);
IF #14 > 6.0 THEN
EXIT;
END_IF;
X(#12-#14) Y(#13+#15);
X(#12+#14) Y(#13+#15);
#14 := #14 + 2.0;
#15 := #15 + 1.5;
END_WHILE;
X(-5.0) Y(5.0);
M02;
2、FOR循环
语法:
FOR <循环变量> := <表达式1> TO <表达式2> [ BY <表达式3>] DO
<循环体>
END_FOR;
说明:FOR循环控制,式中各参数意义如下
循环变量——控制循环次数的变量;
表达式1——循环计数的起始值,可为整数或表达式;
表达式2——循环计数的终止值,可为整数或表达式;
表达式3——循环计数每次的累加值,可为整数或表达式;
循环体 ——循环每次执行内容;
FOR循环执行过程为:先给循环变量赋起始值,然后判断循环变量是否为终止值,当循环变量已为终止值时退出循环,否则执行循环体,再对循环变量加上每次累加值,继续判断直到循环变量为终止值时退出循环。
范例:
% @MACRO // 启动MACRO语法
#1 := 2.0; (*INITIAL RADIUS*)
#2 := 8.0; (*FINIAL RADIUS*)
#3 := 9; (* SIDES*)
#4 := 360.0 / #3; (*THETA*)
#5 := (180.0 + #4)/2; (*START ANGLE*)
G91 G92 X0. Y0. F300000;
G01 X(#1);
FOR #6:=#1 TO #2 BY 2.0 DO
#7 := 2.0 * #6 * COS(180.0-#5);
#8 := (#7/2.0) / COS(180
展开阅读全文