李善锋,刘敬猛,陈柏成,徐 东
(北京航空航天大学自动化科学与电气工程学院,北京 100191)
一种嵌入式NC代码编译器的设计*
李善锋,刘敬猛,陈柏成,徐 东
(北京航空航天大学自动化科学与电气工程学院,北京 100191)
针对嵌入式数控系统运行过程中对NC代码解释的高准确率与高效率的要求,基于自顶向下的递归下降分析法,提出一种应用于嵌入式数控系统NC代码编译器的设计方法。文章主要分别从词法分析、语法分析和解释执行等方面进行编译器的设计与实现。实际运行结果表明:该方法能够高效地构建编译器,可快速、准确地对NC代码进行编译,具有良好的可移植性;为嵌入式数控系统的NC代码编译提供了一种简单有效的解决方案。
NC编译器;嵌入式数控;指令特征分类;递归下降分析
随着嵌入式技术和数控技术的日益发展,各种架构互异的嵌入式数控系统设计方案被提出,嵌入式数控硬件资源的限制,要求NC编译器应具有良好的编译效率。由于在嵌入式数控系统中采用的运动控制模块不尽相同,几乎每种嵌入式数控系统都必须开发自身专用的NC代码编译器。虽然这是嵌入式技术本身专用性的体现,但是也因此给数控开发人员带来了繁重的开发工作,易出现重复开发,编译器难以维护等问题[1]。
因此,本文主要从提高嵌入式NC编译器通用性和改善编译效率方面阐述NC编译器设计。通过分析加工指令与形状之间的关系,基于指令特征的数据集合输出方法提高词法扫描效率,基于自顶向下特征预测的语法分析加快匹配速度。将运动控制相关硬件驱动封装成函数库,NC编译器主体与具体运控硬件模块相对独立,仅在解释执行时通过输出的八元式信息调用运控函数库中相应的运动执行函数。在移植到具体嵌入式数控系统中时,NC编译器主体完全不用改动,只需根据具体运控模块编写一个运控函数库,提高NC编译器的可移植性。
NC代码编译器是数控系统的三个核心组成部分之一,其主要功能就是将用户程序,包括其中的轨迹信息、速度大小和辅助功能等信息,翻译为运动控制模块能够处理的格式[2]。编译过程通常要经过词法分析、语法分析、错误处理和解释执行,各个步骤中的程序实现既相互独立,又形成串联过程。
NC编译器所完成的任务就是将加工代码转换成底层运动控制模块所能识别的代码,其主要的功能如图1所示。目前数控系统中对NC代码的处理方法主要有两种,分别是逐行解释实现方法和编译实现方法。前者是在逐行对代码进行解释的同时,根据对上一行代码的解释所得信息进行加工处理,这种方法实现较简单,但顺序的控制方式会导致系统加工效率低下,程序间的转接不易处理等问题。后者在应用编译程序对加工程序进行整体编译后,进行解释执行,这种方法对程序处理整体性强、效率高,本系统中NC代码编译器就是采用此法来实现。此外,还有时间重叠流水处理的解释控制方式等一些处理方法[3]。
图1 NC代码编译器功能示意图
编译器一般由以下模块组成:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成及错误处理等。这些模块的工作基本上是呈串联式的:首先,词法分析程序将高级语言程序转化成符号表示的代码;接着,语法分析程序对这些符号进行语法检查和归类;然后,进行语义检查,并生成中间代码;中间代码经过优化,最后被转化成目标代码。这些步骤对NC编译器而言同样适用,但是NC代码结构简单,基本上是顺序执行,关键字也较少,是典型的上下文无关的正则文法,因此,NC编译器的结构相对复杂高级语言编译器而言简单很多。
NC编译器设计的主要部分有:词法分析、语法分析、错误检测处理和解释执行。
基于嵌入式数控的应用背景,NC编译器应具有很好的执行效率,在词法分析时,通过分析加工指令与形状之间的关系,将面、型腔、侧面、槽孔等特征分解成若干加工指令的集合。根据指令的特点进行分类,使数据以集合的形式输出。这种基于特征的数据集合输出方法可以在词法扫描时提高分析效率。在语法分析时,采用自顶向下分析法,从开始符号出发递归下降推导,试图尽早自上而下地为输入串建立一个语法树,尽快地从顶层预测分析输出匹配式,提高语法分析效率。
为提高通用性,设计时尽量把与硬件直接相关的部分独立出来。将运动相关硬件操作模块独立封装在一个函数库中。在解释执行时,根据输出的八元式数据集合在运动函数库中查找执行。若移植到其它嵌入式数控系统,只需添加相应运动控制函数库即可,大大提高了NC编译器的通用性,降低了开发难度。其运行的基本流程结构如图2所示。
图2 NC代码编译器工作流程图
如图2所示,NC编译器首先对NC源文件按字符流扫描,根据词法规则产生中间符号文件;若没有词法错误便可进行语法分析,根据相应语法规则产生出运动控制模块可识别的加工信息就可以进行解释执行。在词法分析和语法分析过程中如有错误,则将错误类型和错误定位信息反馈给用户更正NC源程序。图中除虚线连接的运控函数库是与硬件直接相关外,其余部分均具有较高的通用性。这种将运控相关驱动函数编译成库,相对独立于NC编译器的思想,提高了其可移植性。
考虑到嵌入式的应用范围,通用性和编译效率的折衷,具体代码实现时NC编译器完全用C语言实现。嵌入式系统内存都不是很大,宜采用执行效率高的C语言开发。
NC代码的结构是由功能字母加上数据形成功能指令,在指令后添加加工参数,则形成一段加工指令,一段加工指令控制机床完成一个动作,而每一个程序则由若干段加工指令组成,比如G码、M码,以及其他一些功能字组成的指令[4]。数控加工主要用到的是准备功能G码和辅助功能M码。准备功能字是使数控机床建立起某种加工方式的指令,如插补、刀具补偿、固定循环等,G功能字由地址符G和其后的两位数字组成,从G00~G99共100种功能,目前采用的是JB3208-83标准;辅助功能字是用于指定主轴的旋转方向、启动、停止、冷却液的开关,工件或刀具的夹紧和松开,刀具的更换等功能,辅助功能字由地址符M和其后的两位数字组成。
NC程序一般是针对某一个或某一些特征进行的加工,为了更好的与NC编程思想一致,使词法分析结果与加工过程更加接近,就对NC指令进行了分类,得到了基于特征的数据集合输出方法。通过分析加工指令与形状之间的关系,将面、型腔、侧面、槽孔等特征分解成以下4种加工指令的集合,如表1所示。
表1 NC指令功能特征分类
对于由以上功能指令组成的数控程序,将它翻译为运动控制模块可识别语言的第一步是进行程序的词法分析。词法分析的主要功能是:对源程序按字符流进行扫描,按设定的词法规则识别出各类符号,产生中间符号系列,这些符号系列将用于语法分析,对源程序的词法分析采用正则表达式。
本系统词法分析的流程是:每次从源文件中读一行放入缓冲区,去掉源程序中的空白和注释,再从缓冲区中每次读取一个字符进行判断,根据字符类别的不同进行相应的处理,识别出的每一个字符都填入符号表中。符号表的定义如下结构体所示:
通过申明全局符号表,用于存储词法分析的字符信息,并返回符号表的入口,作为token表的第二个元素。这样构成的token表的第一个元素是种别码,而对于第二个元素,如果该符号是关键字,则第二个元素为-1,否则token表的第二元素为该单词在符号表中的入口地址。
词法分析过程中会进行错误检查,主要是检查程序中是否出现非法字符。经过循环解析,词法分析模块会产生符号系列文件,该文件后续用作为语法分析的源文件。词法分析流程如图3所示。
图3 词法分析结构流程图
现输入一段NC代码,该代码的加工意义是快速移动到指定位置,代码如下所示:
以上程序经过词法分析的结果为:
NC代码编译器的语法分析模块的功能是按照NC代码的语言规则,将由词法分析得出的符号串进行识别,识别出其中的功能字的语法成分。其工作原理是:读取词法分析结果的符号串,判别是否为NC代码的句子,如果是,就输出句子;否则,说明源程序有语法错误,记录错误。
本设计中采用的是自顶向下分析法中的递归下降分析法[5],它的基本思路是:从文法的开始符号出发,按最左推导方式向下推导,试图推导出分析的输入串,尽早从顶层进行预测指令匹配分析。设计时具体实现方法是:为每个非终结符构造一个子程序,如果这个非终结符右部只有一个候选式,则由从左至右的顺序构造其识别过程;如果其右部是终结符,则判断其能否与输入相等,相等则读下一个符号,否则,说明出错;如果右部是非终结符,则调用该符号的子程序进行识别;如果右部有多个候选式,则按分支识别。如图4所示为NC语法分析过程。
图4 语法分析流程图
NC代码的优点是顺序执行,其执行过程没有循环和选择结构,语言规则简单,因此,一段NC代码的执行首先读取其程序段号,然后辨识其操作功能字以及功能字后的参数,如下程序段所示:
该段程序语法分析的结果为:
在这段程序的语法分析过程中,其操作码、参数等将保存在一个8成员的结构体中,该结构体以八元式的形式输出至语法分析结果文件,即解释执行的流程文件。八元式结构体定义如下所示:
经过词法分析和语法分析后,如果没有错误记录,则说明所输入的NC源码是符合NC语法规则的正确代码。编译器输出的八元式文件中的每一句都是操作运动控制模块动作的命令和参数,这些命令要通过查找操作表,找到其相应的运动控制函数库并且传递参数,解释执行程序完成的就是相应的查找和传递过程。
设计时将与硬件密切相关的运动控制模块驱动封装成一个函数库,使之与编译器主体相对独立,提高编译器的通用性。运动控制函数库一般要实现基本运控函数如:机械原点运动、外部开关运动、手轮控制运动、直线插补、圆弧插补等。本系统中运控模块采用的是PCL6045专用运动控制芯片,系统要作相应的运动,只需通过八元式数据集合输出相应的运控参数如:距离、速度、加速度、目标位置和中心位置等,传递给相应的运动控制函数。
整个编译器将和刀补模块一起成为数控应用的一个用户任务[6],在系统运行过程中要调用编译器时,向消息邮箱发送调用消息,当任务被激活时,如果查询邮箱有调用消息,则进行解释执行,流程如图5所示。
图5 解释执行流程图
一个高性能嵌入式数控系统要实现高速、高精控制,对编译器的一个技术指标要求是每秒编译1000程序段以上。实验测试平台是一个三轴联动雕刻床,每个轴由步进电机驱动,经过丝杠将旋转运动转换为直线运动。实验测试系统采用的ARM10处理器PXA270主频为520M Hz,内存64MB。为了验证编译器解析功能和性能,选择尽可能包含较全面功能NC程序段的源程序。编译实验结果如表2所示。
表2 NC程序编译效率实验
由于零件2的NC程序中包含宏计算指令,平均每段指令编译耗时比零件1、3多。一般说来宏计算指令和固定循环指令等复杂功能指令都会比普通指令编译耗时长一些。通过对不同零件的NC程序进行编译实验可以看到编译器编译效率可以很好的满足数控系统的要求。
编译一个长735段NC代码的小狗复杂轮廓程序,需耗时330ms,平均编译一个程序段所需时间为0.45ms,并进行加工测试。图6所示为测试平台样机及小狗轮廓程序加工结果,显示编译器解析准确。
图6 测试平台与实验结果
NC编译器作为数控系统的一个核心软件模块,承担了将用户输入的NC代码编译为运动控制模块所能识别机器码的任务。NC编译器主要由词法分析、语法分析、错误检查和解释执行四个模块组成,本文重点对词法分析,语法分析和解释执行的实现原理及提高编译效率的措施作了论述。采用指令特征的数据集合输出方法提高了词法扫描效率,基于自顶向下的预测语法分析加快匹配速度。通过移植到具体的嵌入式数控中进行编译效率测试与实际加工实验,验证了编译器对加工程序解析的完整性和准确性,编译速度完全满足数控系统要求。
[1]徐小明,王硕桂.基于PC的开放式数控系统代码编译器的开发[J]. 机床与液压,2009,37(11):4244.
[2]沙智华,张恒芳,等.通用数控代码编译系统研究与实现[J]. 中国机械工程,2003,14(9):1011-1014.
[3]任松涛,秦现生,白晶.NC代码解释器的开发[J].中国制造业信息,2007,36(5):54-57.
[4]徐星月,叶佩青.基于Lex和Yacc的开放式数控代码解释器的开发[J].现代制造工程,2007(6):23-25.
[5]姚道敏,俞立钧,等.数控系统译码模块程序设计[J].组合机床与自动化加工技术,2007(7):78-81.
[6]谈峰.主流开放式数控系统体系结构比较分析[J].机械设计与制造,2008(3):169-170.
A Design of Compiler for NC Code in Embedded NC System
LI Shan-feng,LIU Jing-meng,CHEN Bai-cheng,XU Dong
(School of Automation Science and Electrical Engineering,Beihang University,Beijing 100191,China)
In allusion to the demand for high precision and high efficiency of the NC code compiler from the NC system,based on the top-down analysis method of recursive descent grammar,a novel design of general NC code complier in embedded NC system is presented.The design and implementation of compiler are described from different aspects:lexical analysis,syntax analysis,interpreted executing and so on.The practical results show that the method can construct the compiler efficiently,compile the NC code faster and more correctly,owned fine portability;which provides a simple and effective solution for NC code compiler in embedded NC system.
NC code compiler;embedded NC system;NC code classification;recursive descent analysis
TP273
B
1001-2265(2012)02-0045-04
2011-06-28;
2011-07-25
国家科技重大专项“高档数控机床与基础制造装备”的子课题“全数字高档数控装置”(2009ZX04009-014)
李善锋(1985—),男临沂人,北京航空航天大学自动化学院硕士研究生,研究方向为检测技术与自动化装置;通讯作者:刘敬猛(1967—),男,安徽霍邱县人,北京航空航天大学自动化学院副教授,研究方向为检测技术与自动化装置,(E-mail)ljm@buaa.edu.cn。
(编辑 李秀敏)