基于工控机的G代码编译程序设计
IPC-based
Design
of
G-code
Compiler
Liu
Chong,Yang
Dai-Hua,Zhang
Xiao-Ting
(Faulty
of
Machinery
and
Electronic,China
University
of
Geosciences,Wuhan
430074)
Abstract:
The
functions
of
NC
compiler
are
analyzed
and
introduced.
A
to
design
G-code
compiler
based
on
IPC
(Industrial
Computer)
is
advanced.
An
IPC-based
G-code
compiler
is
designed
and
implemented,and
its
feasibility
is
verified
in
practice.
Keywords:
Industrial
Computer-based;
G-code;
Compiler;
Numerical
Control
System
数控代码的译码是数控系统中一个关键的部分,对CPU而言,它的工作量甚至比真正的插补还要大,特别是运动轨迹计算和F值计算部分,涉及到运算精度及实时性,是难度最大的一部分[1]。
对数控代码进行译码的方式主要有两种:解释和编译[2]。解释是对代码进行逐行的译码,速度较慢,结构简单,对代码边解释边执行;编译是先将加工代码转换为一定格式的数据流,再由控制系统直接进行对其读取,执行速度快,结构复杂。传统数控系统由于受软件(包括编程语言选择、算法实现、计算精度等)和硬件(包括CPU运行速度、程序存储器和数据存储器的空间等)的限制,较难实现对数控代码真正意义的编译,大多数采用的是解释方式来进行译码,其译码效果十分受限。
考虑到本项目设计是基于现代数控系统,硬件采用的是工控机系统,操作系统是Windows平台,程序采用了编译的方式完成对数控代码的译码。
1.
数控编译程序的功能
在数控系统的整体结构中,编译程序是一个独立的模块,它主要完成加工前对代码的处理,实现对代码正确性的检查验证、译码输出等操作;其输入的是数控G代码文件,输出的是可被运动控制卡提供的函数调用的参数数据流。编译程序主要完成以下功能:
(1)词法、语法检查
主要任务包括对数控代码进行组词规则、程序格式、是否关键字、字符是否合法等规则的检查,识别出代码中的各个基本语法单位,删除无用的空白字符、与输入介质相关的非实质性字符、注释等。
(2)语义分析
语义分析是对数控代码的逻辑合理性、正确性进行分析,需要对各个参数的合法性和有效性进行检查,并尽可能地实现智能化地检查错误,如是否超出行程、加工路线是否干涉等。完整的语义分析在编译系统中是相当复杂的。
(3)中间代码生成
中间代码为了能够在译码时以统一的格式进行处理而设计的一种代码格式。它是根据输入的数控代码生成的,只在程序中提供给其它函数使用,不会输出到目标代码,只是一种中间的数据交换。
(4)译码
译码主要完成对代码各个功能的解释,并将中间代码生成目标代码格式的数据流。其输出格式与目标代码相同,但只保存在内存中。
(5)输出目标数据
为方便其它程序调用译码结果,应将编译完成的数据输出到硬盘或其它存储介质中,输出时可以以文本文件或其它数据流格式输出。
2.
数控编译程序的实现方法
在对数控代码译码之前,必须先对其进行词法、语法和语义的检查,只有检查无误的代码才能进行译码,否则将返回出错信息,并提示用户进行修改。通过上述的检查后,为便于译码程序调用,需将数控代码转成统一的中间代码格式。译码程序直接对中间代码进行处理,并输出为统一的目标数据格式。程序的流程图如图1所示。
2.1
词法、语法分析程序的实现
待处理的G代码一般都是以文件格式存储的,这不便于在程序中的处理使用,更好的方法是将其读入内存。为实现上功能,程序中设计了一个类CGAttribute,用于将G代码读入到内存中,以便于对代码进行处理。该类除完成代码的读入外,还将代码以关键字分类(如G、F、X、Y等)的方式分隔存储,这种分类给后面的处理带来了很大方便。由于本系统是基于工控机开发的,机器内存高达256M,所以不必担心文件过长而引起内存不足,处理时可将代码一次全部读入。
对代码进行词法、语法检查时,程序会根据设定的规则对代码进行处理。首先要去除其中无效字符,如注释信息、程序段中的空格、N指令等。然后再按G代码的组词规则对其进行逐个检查,包括代码中的字符是否合法、代码的参数是否合理等。
图1
程序总体流程图
检查时是通过逐行读取的方式进行的,该过程完成了对代码的一次遍历。若某行中含有不符合规则的代码,则其行号、出错的信息代号记录,并在检查结束后将所有的出错信息反馈给用户,若有错主程序将停止后面的语义分析等操作。
2.2
语义分析程序的实现
一个编译器的功能强大与否在于它检查出来的错误的多少[3]。语义分析是对代码的逻辑合理性进行的判断,要想检查出更多的错误,规则的设计是十分关键和重要的。经分析G代码语言后,可以看出G代码程序在语义上具有以下规则特点:
①
代码必须是设计规则标准中有效的。如G98、G99代码是没有指定的,若在程序段中出现则是无效的;
②
G代码中同组代码在同一程序段中只能出现一次;
③
X、Y、Z、F、S等代码在同一程序段只能出现一次;
④
X、Y、Z、F、S等代码的值不能超过机床的设定范围;
⑤
圆弧运动指令(G02、G03)必须指定参数;
⑥
做圆弧运动时的IJK参数必须符合坐标平面设置要求,如使用G17平面时,只能指定I、J参数,设置K代码的参数无效;
⑦
F指令只对G01、G02、G03有效,对G00无效。
以上列出的仅是部分规则,常规的代码规则并未列出。由于本项目完成的是一台数控雕刻机的设计,并未用到标准中的全部G代码,所以在语义分析和后面的程序处理中,我们只考虑加工所能用到的代码。
语义分析也是通过逐行读取进行的,程序会对数控代码逐段地处理,该过程完成了对代码的又一次遍历。分析时若某行中含有不合规则的代码,则将该行的行号及出错的信息代号记录,并在检查结束后返回。
2.3
中间代码的结构
为了能够合理地存储中间代码的数据,程序中设计了一个类CSplitFn,该类可以在内存中保存数据,其主要结构如下:
class
CSplitFn{
public:
void
Set(char,int,int,float);//设置各个参数
public:
char
m_cKey;//代码关键字
int
m_nOrder;//代码在程序段中出现的顺序号
int
m_nCode;//参数,用于存储整数参数的代码值,如G、M等
float
m_fPara;//参数,用于存储带小数参数的代码值,如X、Y等
};
在完成程序的各个检查后,代码将以该类的组成形式进行存储,以供译码程序调用。
2.4
译码程序的实现
与编程的准则相一致,对一个程序段进行译码与数据处理时也要规定一些处理准则,主要的准则有4条。
①
刀具上一段的终点是下一段的起点
②
控制点的选择
③
按机床坐标系译码与计算
④
模态代码的处理
G代码中有许多代码是模态的,可能它只在程序段中指定一次,但在后续代码它就会一直保持有效;另外,部分参数的计算需要考虑两个或多个程序段才能完成,所以在译码时不仅要使用本程序段的信息,还要考虑上个程序段的信息。为了实现上述功能,程序设计了一个类CGStore,用于存储在译码时计算出来的各个参数。该类的结构如下:
class
CGStore
{
public:
int
ResetStore();//重置缓冲区
int
GetLastSetting();//获取上个缓冲区的参数值
long
Sanalogy;//主轴旋转速度
long
movex;//X方向进给值
long
movey;//Y方向进给值
long
movez;//Z方向进给值
int
MoveMode;//运动平面模式
/*===坐标变换参数===*/
float
offsetX;
//X轴偏置值
float
offsetY;
//Y轴偏置值
float
offsetZ;
//Z轴偏置值
/*===G代码====*/
int
GGroup[13];//分组存储G代码
int
MCode[10];
//分组存储M代码
int
nMcount;//M代码个数
/*===坐标参数===*/
float
XTheory;//X编程值
float
YTheory;//Y编程值
float
ZTheory;//Z编程值
float
Radius;//圆弧半径
float
Angle;//圆心角
CNode
Polar;//圆心坐标
/*===速度====*/
float
vectorSpeed;//矢量进给速度
CGStorepPreStore;//指向上个缓冲区的指针
};
该类可存储所有可能代码组合的参数信息,并可通过指针查询上个缓冲区中各个参数的值,方便地处理了模态代码的问题。译码时对中间代码进行逐个地分析,并计算出对应的各个参数,并存储在CGStore类型的变量中。
2.5
输出
译码完成后,各个信息都存储在CGStore类型的变量中,代码输出时只需选择需要的参数即可。在本项目中,控制程序制定的协议规定需要输出以下参数:G代码号、坐标平面、XYZ方向的移动量、进给速度、主轴旋转速度、M代码号等,考虑到直线运动和圆弧运动的差异性,输出时使用两种格式:
表1
输出代码格式表
直线插补
圆弧插补
参数
功能说明
参数
功能说明
int
GCode
G代码号
int
GCode
G代码号
int
MoveMode
运动坐标平面
int
MoveMode
运动坐标平面
long
movex
X轴方向偏置值
float
PolarX
圆心坐标X
long
movey
Y轴方向偏置值
float
PolarY
圆心坐标Y
long
movez
Z轴方向偏置值
float
angle
圆弧旋转角度(度)
float
Feed
进给速度
float
Feed
进给速度
long
Sanalogy
主轴旋转速度(转/分)
long
Sanalogy
主轴旋转速度(转/分)
int
Mcount
M代码个数
int
Mcount
M代码个数
int
MCode[10]
M代码值
int
MCode[10]
M代码值
其中,XYZ轴的偏置值输出的都是经转换后脉冲当量。代码输出后即可提供给控制程序调用。
3.
程序执行
本程序开发的硬件平台是研华工控机6003,CPU为赛扬1.7G,内存256M;操作系统是Windows
2000,利用VC++6.0开发完成。经对1000行待加工的G代码进行测试,算法的编译时间约为124毫秒。
4.
结束语
本论文设计实现了一个可编译G代码的程序,定义了部分语义分析的规则,构造了一种中间代码格式,提出了一种对G代码译码的方法。本程序已被用到项目的开发中,并经实践证明高效可用。
参考文献:
[1]
叶伯生.
计算机数控系统原理、编程与操作.
武汉:华中理工大学出版社.
1999
[2]
张承瑞等.
数控G代码解释器的设计与实现.
山东大学学报.
2002-12
[3]
蒋立源
康慕宁.
编译原理.第2版.
西安:西北工业大学出版社.
2000
[4]
赵东林等.
数控系统G
代码解释器的设计与实现.
制造业自动化.第28卷.第1期.2006
作者简介:
刘冲,男,中国地质大学(武汉)硕士研究生。主要从事数控技术、计算机技术、系统开发等研究。
杨代华,男,中国地质大学(武汉)机电学院教授。主要从事数控技术、系统改造与开发等研究。