基于Boost正则表达式的数控系统译码模块设计

2017-07-01 18:00王宏甲赵庆志刘慧山东理工大学机械工程学院山东淄博255000
组合机床与自动化加工技术 2017年4期
关键词:词法译码数控系统

王宏甲,赵庆志,刘慧(山东理工大学机械工程学院,山东淄博255000)

基于Boost正则表达式的数控系统译码模块设计

王宏甲,赵庆志,刘慧
(山东理工大学机械工程学院,山东淄博255000)

通过分析CNC程序的编制规则,针对数控系统运行过程中对译码模块准确、高效的设计要求,研究利用Boost正则库对数控系统的译码模块进行开发。此译码模块充分利用Boost正则库中匹配、查找、迭代等功能函数,在CNC程序代码的预处理、词法分析以及语法分析等方面,均采用正则表达式进行处理。实际运行结果表明,所开发的译码模块可准确、高效地工作。同时,基于正则表达式的编程易于理解,具有良好的可扩展性与可移植性。

数控系统;译码模块;正则表达式;Boost

0 引言

数控加工是通过编写符合一定规则的程序代码来驱动机床进行加工的。在数控系统中,译码模块起着沟通和传递加工信息,搭建人与数控系统桥梁的重要作用。开发准确、高效的译码模块是数控系统开发过程中的重要任务[1-2]。

传统的译码模块设计[3-6],大多采用逐字比较法,编写程序较为繁琐,译码效率比较低,不易移植与扩展。在文献[7-8]中,译码模块采用了正则表达式,但是在程序的设计上不够完善,并没有充分挖掘基于字地址格式[9]的NC代码编写特点,比如语法分析部分并不完善。

针对以上情况,本文采用Boost正则库并结合MFC中字符串CString类的相关功能函数,对语法分析部分进行了优化,设计了基于正则表达式的译码模块,实现高效、准确的译码工作,为后期数控系统的开发奠定了基础。

1 Boost正则库及其在VC++6.0环境下的调用

正则表达式[10]是由普通字符(字母、数字等)以及特殊字符(元字符)组合而成的特征模版。正则表达式作为一个模版,与待处理的文本字符串进行比对,从而验证字符串是否符合相应的模版特征。由于正则表达式在字符串处理方面具有功能强大和高效的特点,使得它在执行字符串查找、匹配、替换等操作时非常方便[11]。对于具有固定格式字符串的处理,往往要用到正则表达式。所以,本文采用正则表达式来处理具有固定格式和规范的NC代码,设计开发数控系统的译码模块。

Boost正则库是一个灵活的、高效的、功能强大的正则表达式库,在字符串文本处理方面具有强大的功能。在译码模块设计中主要用到了Boost.Regex中的regex_mach字符串匹配函数、regex_search字符串查找函数以及regex_iterator迭代器等功能。Boost正则库默认使用perl语法,后文中会有相应语法的简单介绍,详细内容请参考相关文献[12]。

在VC++6.0开发环境下,需安装Boost库后进行编译,才能进行相关函数的调用。

2 译码模块的总体框架设计

译码程序根据NC代码的编写规则从NC代码程序中提取并保存全部的加工指令和参数信息[7]。为了快速、准确地提取加工信息和运动指令,译码程序根据NC代码的编写规则,采用Boost正则库设计相应的正则表达式,进行词法、语法分析以及相关信息的提取工作。

对译码模块的总体设计如下:

(1)从txt文件中读取NC代码。

(2)对每一行的NC代码进行预处理,将注释以及空格移除,从而得到有效的字符程序段。

(3)对经过预处理后的每一行NC代码进行词法与语法分析。对依次读入的每一行NC代码,利用Boost正则表达式对NC代码进行词法检查与语法检查。如若出现错误,显示错误信息。

(4)对正确的NC代码进行数据提取。利用Boost正则表达式提取相应的字符串文本,然后转换成加工信息或者运动指令,并放入数据结构链表中。译码模块总体框架流程图,如图1所示。

图1 译码模块总体框架流程图

3 译码模块的功能设计

数控指令是由定义了一定功能的字母以及数据组合而成。一般每条指令完成一个动作,若干条指令按照一定的规则构成一段程序[3]。准备功能的G代码以及辅助功能的M代码是数控加工程序的基础。另外,数控指令还包括坐标功能字(X、Y、Z等),进给功能字F、主轴转速功能字S以及刀具功能字T等。

本文设计的译码模块参考FANUC数控系统,定义程序段书写格式为:

Nnnnn[Gnn](0或多个)[X[-]nnnn.nnn][Y[-]nnnn.nnn][Z[-]nnnn.nnn][I[-]nnnn.nnn][J[-]nnnn.nnn][K[-]nnnn.nnn][R[-]nnnn.nnn][Fnnnn][Mnn](0或多个)[Snnnn][Tnnnn]

注意:[]表示可以省略,本模块定义的指令字(NGXYZIJKRFMST),其顺序不可以任意颠倒,否则报错。

本文设计的译码模块,依据上述定义的程序段书写格式,进行逐行扫描。首先进行预处理,然后进行词法、语法分析以及NC代码信息的提取。

3.1 预处理分析

程序开始时,首先将NC文件载入,译码模块读取第一行NC代码,调用预处理函数BOOL PreProcess (CString Line_Text),去除NC代码中的无用的空格符、注释注解等无用的字符。

对于单个字符(空格符、回车符号等),可以直接调用MFC中Cstring类的函数int Remove(TCHAR ch),去除指定的字符。

对于注释等多字符匹配的设计,可以使用Boost正则表达式来解决。在一行文本中,“”后面的文本均为注释字符,所以定义用于匹配注释的正则表达式为boost::regex Note_reg("\.*")。正则表达式中出现的点号(.)跟星号(*)是元字符。点号的意思为匹配任意一个字符,星号的意思为匹配前导字符0次或者多次。

程序中的搜索与匹配工作,采用正则库中boost:: regex_search(Line_Text,Note_mat,Note_reg)函数,找到与Note_reg中定义的正则表达式匹配的字符段,并存储在Note_mat中。然后,采用CString类中的替换函数int Replace(LPCTSTR lpszOld,LPCTSTR lpszNew),将Line_Text中匹配的部分移除,完成预处理工作。

3.2 词法分析

预处理工作完成后,需要对NC代码进行词法分析。词法分析[5-6]主要是针对NC程序的指令字以及坐标字,相关参数等进行的初步分析,识别出NC代码中的各个单词。词法分析的主要任务是,发现NC代码中的非法字符,即不包含在字符集中的基本语法单元。

首先,根据各个功能字以及坐标字等NC代码基本语法单元的用法[9],定义用于词法分析的Boost正则表达式:

boost::regex Line_Reg("N\d{1,4}(G\d{2})*(X-? \d{1,3}(\.\d{1,3})?)?......(T\d{2}\d{2})?");

该正则表达式中,?为元字符,意思为匹配前导字符0次或者一次。d为数字字符集,后面的大括号为数字出现的个数。

通过该正则表达式,可以检索NC代码中的各个功能字以及坐标字是否符合本数控系统的定义,能够排除NC代码中的非法字符。词法分析流程图,如图2所示。

图2 词法分析流程图

当NC代码与定义的Line_Reg正则表达式匹配时,NC代码不存在词法错误。当不匹配时,译码程序通过定义各个功能字与坐标字的正则表达式,将NC代码与各个表达式逐一匹配,匹配成功的字段就从NC代码中移除,最后剩下的字段就是存在错误的代码,这一过程与语法分析中的NC代码提取相类似,具体过程参看下一节。

3.3 语法分析与提取NC代码信息

根据NC代码的语法规则,在词法正确的前提下,译码程序对NC代码的结构进行语法分析[5-6],及时发现语法错误,提醒编程人员修正。

在数控指令中,准备功能代码G和辅助功能代码M是数量较多的代码族。NC代码的编制主要是围绕这两类代码进行的。这两类指令的编制规则是语法分析的重要部分。

在G代码或者M代码中,对于代码功能相同或相近的指令,为防止代码出现冲突,须通过分组来辨识指令[13]。在每一行NC代码中,模态同组代码最多只能出现一次,否则程序指令冲突。在进行语法分析时,以组为单位开辟存储单元,通过各指令的特征数字对具体指令加以区别。

在语法分析的具体过程中,同样采用正则表达式进行相应的匹配工作。语法分析用到的正则表达式是对词法正则表达式的细化与分割。比如匹配G指令的正则表达式为boost::regex G_reg("(G)(\d {2})")将正则表达式用括号分成两部分,这样可以比较容易提取G指令的特征数字。为了提高效率,在进行语法分析的同时,对各个指令与参数进行提取,存储到结构链表中。

在语法分析中,采用匹配删除法,即把匹配成功的字符段删除。这样可以缩短NC代码长度,减小后续匹配时的迭代检查次数,提高了分析效率。针对G代码出现多次的情况,只要NC代码不是空串,就循环匹配,从而可以将G代码全部匹配完成。本译码程序在语法分析中,还采用指令属性搜索法。即根据指令本身的属性去搜索其参数,如果无法完成,则存在语法错误。在这一过程中,可专门开辟全局空间来存储模态指令和坐标字,用以模态指令和坐标字省略的情况。其语法检查与NC代码信息提取的流程,如图3所示。

图3 语法分析与NC代码信息提取流程图

4 译码模块测试

本文在VC++6.0的开发环境下进行数控系统的译码模块开发,其数控系统的运行界面,如图4所示。针对比较典型的NC代码错误,编写以下NC程序。

N1 G92 X-25.0 Y10.0 Z40.0

N2 G90 G00 G01 Z-16.0 M03

N3 G41 G01 X0 YA40.0 F100 M08 T0101

N4 X14.96 Y70.0

N5 X43.54

N6 G02 X102.0 Y64.0

N7 G03 X150.0 Y40.0 I48.0 J36.0 R60

N8 G01 X170.0

N9 Y0

N10 X0

N11 G00 G40 X-25.0 Y10.0 Z40.0 M09

N12 M30

本文将利用这一有错误的NC程序对译码模块进行测试,经测试后的结果,如图4所示。

图4 数控系统界面及译码模块报错

译码模块发现此NC代码中存在的错误有:N2行G1组模态指令G00与G01冲突M03指令缺少S参数,N3行非法关键词YA40.0,N6行G02指令缺少I、J参数,N7行G03指令I、J、R参数冲突等。

将修正后的程序,重新加载到数控系统中,仿真程序得到了预期的图形,说明译码模块得到正确的结果,达到预期的设计要求。其测试界面如图5所示。

图5 数控系统界面及译码成功

5 结论

本文采用Boost正则表达式来实现的译码模块,能够实现高效、准确地提取加工信息。Boost正则表达式简单易行,易于理解,接近模式化地编程,具有较强的可扩展性与可移植性,为后期数控系统的开发奠定了良好的基础。

[1]赵亮.多轴数控系统译码模块的研究[D].天津:天津大学,2012.

[2]任松涛.NC代码编译器的设计与实现[D].西安:西北工业大学,2007.

[3]许宇胜,杨文通,王蕾,等.一个NC代码翻译模块的设计与开发[J].机床与液压,2005(7):55-56,156.

[4]姚道敏,俞立钧,周伯荣,等.数控系统译码模块程序设计[J].组合机床与自动化加工技术,2007(7):73-76.

[5]李善锋,刘敬猛,陈柏成,等.一种嵌入式NC代码编译器的设计[J].组合机床与自动化加工技术,2012(2):45-48,53.

[6]章善财,夏链,韩江.通用NC代码编译器的设计与实现[J].组合机床与自动化加工技术,2014(10):53-56.

[7]王志伟,袁红兵.NC代码编译器的开发及其应用研究[J].机床与液压,2011,39(4):104-107.

[8]张葆青,闫石,宋海生.开放式数控系统代码解释模块的设计[J].机床与液压,2012,40(4):72-74.

[9]赵玉刚,宋现春.数控技术[M].北京:机械工业出版社,2003.

[10]邓凯元,姜磊.正则表达式匹配引擎性能分析[J].计算机与现代化,2011(7):105-107,110.

[11]翟自洋,林昌东.利用正则表达式进行查找/替换[J].中国科技期刊研究,2009,20(1):122-126.

[12]施瓦茨,菲尼克斯,福瓦.Perl语言入门[M].盛春,蒋永清,王晖,译.南京:东南大学出版社,2009.

[13]彼得·斯密德.数控编程手册[M].罗学科,刘瑛,黄根隆,等,译.北京:化学工业出版社,2011.

(编辑李秀敏)

Design of Decoding Module of CNC Based on Boost Regular Expression

By analyzing the compiling rules of CNC program,the development of the decoding module of CNC system was studied by using the Boost regular database for accurate and efficient design requirements of the decoding module in the operation of CNC system.The dcoding module makes full use of matching,search,iteration and other functions of Boost regular library.The pretreatment,lexical analysis and syntax analysis of CNC program code use the regular expressions.The results of actual operation show that the decoding module can be accurate and efficient,and the programming of regular expressions is easy to understand,and it has good expansibility and portability.

CNC;decoding module;regular expression;Boost

TH166;TG659

A

1001-2265(2017)04-0089-03

10.13462/j.cnki.mmtamt.2017.04.022

2016-09-01;

2016-10-08

王宏甲(1988—),男,山东潍坊人,山东理工大学硕士研究生,研究方向为数控技术与装备,(E-mail)whj1988928@163.com;通讯作者:赵庆志(1962—),男,山东日照人,山东理工大学教授,博士,研究方向为数控技术与装备、机电一体化技术,(E-mail)zhaoqzme@163.com。

WANG Hong-jia,ZHAO Qing-zhi,LIU Hui

(School of Mechanical Engineering,Shandong University of Technology,Zibo Shandong 255000,China)

猜你喜欢
词法译码数控系统
中外高端数控系统差距分析及对策
基于对数似然比与极化信道可靠度的SCF 译码算法
基于扩大候选码元范围的非二元LDPC加权迭代硬可靠度译码算法
基于FPGA的高性能电离层测高仪数控系统设计
分段CRC 辅助极化码SCL 比特翻转译码算法
基于校正搜索宽度的极化码译码算法研究
基于嵌入式Soft-PLC 的三轴数控系统设计
应用于词法分析器的算法分析优化
基于以太网的计算机与数控系统通信技术研究
词法分析程序的设计与实现研究