董立岩,尹相杰,田 耕,辛晓华,李永丽,张 亮,孙 鹏
(1.吉林大学 计算机科学与技术学院,长春 130012; 2.东北师范大学 计算机科学与信息技术学院,长春 130117)
数控机床是现代机械加工的主要生产技术,使用越来越普遍,但数控加工设备的价格较高,给数控技术的普及和推广带来了难题[1-2].数控仿真系统有效地解决了该问题,它能在计算机上完全模拟真实机床的工作.在仿真系统中,用户通过指令和机床进行交互,但这些指令是为了用户能方便使用与记忆而开发的一门高级指令语言,系统无法读懂这些语言.指令解释器的出现使该问题迎刃而解.指令解释器作为用户与系统交互的桥梁,是仿真系统的核心部分,它能从词法、 语法和语义上检查用户输入指令代码的正确性,以获取刀具的加工位置和运动趋势信息[3],按一定的机制解释出能使机床系统读懂的命令串,真正控制机床运动.因此,设计一种速度快、 精度高且具有很强通用性和兼容性的指令解释器是设计高效仿真系统的前提.本文介绍了指令解释器的原理,并给出一个快速、 高效解释器的设计过程.
图1 指令解释器工作原理Fig.1 Working scheme of command interpreter
指令解释器通过对用户输入的NC程序进行解释,生成仿真系统可执行的代码,从而驱动加工过程.解释器从结构上主要分为NC程序的预处理和NC程序的翻译两部分.NC程序的预处理是从语法、 语义对程序进行检查[4-5],发现代码错误则进行相应的处理,并对缺省指令进行补充[6];NC程序的翻译则是先把程序翻译成系统能读懂的代码,再把结果返回给系统,控制系统工作[3,6-7],工作原理如图1所示.
2.1 指令的格式化 用户输入的程序格式具有多样性,但不管格式怎么多样系统都应该能正确地识别和分析指令.为处理方便,需在对指令分析前,先统一格式化这些指令,实现步骤如下:1) 去除指令中无用的信息;2) 字符串统一转换为大写形式;3) 根据英文字符作为标识,对模块进行划分;4) 在各模块之间添加空格作为标识.
通过上述处理即可返回统一格式的字符串.在这种格式中指令类型和参数之间、 参数和参数之间都以空格隔开.如指令G01 X100 Z100,G01 X100 Z100,G01 X100 Z100这3条指令实际上都是指同一条指令,经过格式化处理在内部都变为统一格式G01 X100 Z100[5].
2.2 词法和语法检查 用词法分析对数控程序进行初步检查,主要包括程序是否以数字或非法字符开头、 在负号前是否出现了非坐标功能字、 小数点的前后是否都是数字等情况.语法分析是根据指令的规则对代码检查,检查指令类型是否合法、 后面的参数是否完整等[8].本文在实现时将二者混合在一起.
本文采用CMDI格式存储模式.CMDI格式是先在CMDI类中合理地定义静态变量,再把提取到的信息放到相应的变量中,如G01中把G赋给m_Type,把01赋给m_Instruction.CMDI格式除了能较好地对指令信息进行高效存取,还能方便地实现指令的补充[9].因为在指令或参数有缺省的情况下可直接继承上次指令中的信息,以达到补充指令的目的.实现过程如下.
输入:要进行处理的指令串tempLine;
输出:通过检查输出true,否则输出false;
1) strs←tempLine.Split(‘ ’): 以空格为分隔符,把指令串分割成字部分放到字符串数组strs中;
2)v←Foreach(strs): 遍历字符串v,如果遍历完成,则转6);
3) first_value←v.substring(0,1): 得到字符串v的第一个字符;
argument←v.substring(1): 得到第一个字符后面的字符串;
4) check_result←check(first_value,argument): 根据first_value和argument,进入到check函数相应的处理部分,进行词法和语法检查;
5) 如果check_result==false,返回false,否则转2);
6) return true.
2.3 语义检查 主要检查参数数值是否合理,如检查数值是否越界,所给点是否能真正地构成圆弧等.语义检查的设计过程如下:
1) 根据CMDI格式中存储的m_Type和m_Instruction判断该指令类型;
2) 通过switch和case多分支开路语句定位到该指令的语义检查函数,其中每个语义检查函数都是针对每种指令专门设计的;
3) 在语义检查函数中,对指令中参数的合理性进行检查,其中参数可直接访问CMDI格式中相应的变量;如对G01,只需获取DestinationX和DestinationZ对数值是否越界经行检查,取F对步长是否过大进行检查;
4) 当语义合理时返回true,否则返回false.
2.4 指令解释 指令解释作为指令解释器的核心,把通过词法、 语法、 语义检查,并补充后的指令解释成系统能读懂的命令串,作为刀具移动的根据.本文为每种类型的指令都单独设计了指令解释函数.函数TranslateMDI_All作为指令解释的总入口,根据m_Type和m_Instruction的组合即可确定需要调用的指令解释函数.每条指令解释时所需的参数确定,可先在CMDI中得到具体的参数,再根据参数,最终把一条指令翻译成可使系统理解的指令串[10-12].刀具的轨迹由直线和圆弧构成.
1) 直线类型关键算法的算法描述.
解释直线型指令时,已知刀具当前的位置(CurrentX,CurrentZ)、 指令要使刀具到达的位置(DestinationX,DestinationZ)和步长F(指定在Z方向上每次移动的距离).在仿真系统中要真正模拟实际应用中的机床运动过程,不能仅依靠提供简单的两个点,在系统中要根据几何的无限逼近思想,把指令解释成X_Z_的形式.根据两点可以确定直线的斜率:k=(DestinationZ-CurrentZ)/(DestinationX-CurrentX),把F赋值给X方向的步长stepX,由斜率可确定X每走一步后Z方向的移动步长stepZ=(stepX)/k.这样X方向每走一步,Z方向移动相应的步长,然后在最后一步做好越界的判断处理,即可模拟出一条直线的轨迹,步长越小轨迹越接近一条直线,如图2所示.
图2 直线形解释原理Fig.2 Linear explanation scheme
当起点位置和终点位置的X或Z相同时算法较简单,本文只考虑两者都不相等的情况.假设起点sp为(x1,z1),终点ep为(x2,z2).定义变量rx和rz分别表示起点到终点位置在X方向和Z方向的矢量距离;变量DirX和DirZ分别表示在X和Z矢量方向的正负,1表示为正,-1表示为负;tx和tz分别表示已经走的矢量位移,初始值都为0;slope=rx/(rz)表示直线的斜率;Step表示指令的步长;result存储解释后得到的命令串,初始为空.算法如下.
输入:起点sp和终点ep.
输出:系统可以读懂的指令串result.
1) 如果((tx!=rx)||(tz!=rz))则转2),否则转8);
2) 如果 abs(tz+Step*DirZ)≤rz则转3),否则转5);
3) result←result+“X”+(Step*DirZ×slope).ToString( )+“;”
result←result+“Z”+(Step*DirZ).ToString( )+“;”,更新result;
4)tx←tx+Step×DirZ×slope,tz←tz+ Step×DirZ,更新tx,tz,转1);
5) disx←rx-tx,disz←rz-tz计算x和z方向的位移余量;
6) result←result+“X”+disx.ToString( )+“;”;
result←result+“Z”+disz.ToString( )+“;”,更新result;
7)tx←rx,tz←rz,更新tx,tz,转2);
8) result←result+“End”,在result后添加“End”作为命令串结束的标识;
9) return result.
2) 圆弧类型的关键算法描述.
图3 圆弧形解释原理Fig.3 Arc-shaped explain principle
圆弧类型命令解释的算法借鉴于求圆周率的割圆法,割圆法用一个边数足够多的外切多边形无限接近于圆,本文在解释指令过程中用多边形的轨迹模拟圆弧轨迹,在命令解释时圆弧的接近程度受限于指令中所指定的步长,步长越小,越接近圆弧.解释后的结果和直线解释结果的表示形式相同,用X_Z_的形式表示.解释原理如图3所示.
在车床中所画的圆弧不会出现一个z值有两个x值对应的情况,所以本文只考虑z和x的值都满足单调性的圆,并在最后一次不够步长的情况特殊考虑.与直线情况一样,分别定义变量rx,rz,tx,tz,DirX,DirZ,step和result,并分别赋予相应的值.定义dir表示顺弧还是逆弧,顺弧为1,逆弧为-1; sp和ep分别表示起点和终点;cz和cx表示所到点的z轴和x轴的坐标值,分别初始化为起点的坐标值;dx为临时存储z轴移动后x轴的坐标值.算法如下.
输入:起点sp,终点ep,半径R.
输出:系统可读懂的指令串result.
1) round_center←Center(sp,ep,R,dir,DirZ),求出圆心round_center;
2) 如果tz!=rz,转3);否则转9);
3) 如果abs(tz+step+DirZ)≤abs(rz),转4),否则转8);
4)tz←tz+step+DirZ,cz←sp.z+tz,更新tz和cz;
5)dx←Get_X(sp,ep,round_center,R,cz,dir,DirZ),根据信息求出dx;
6) result←result+“X”+(dx-cx).ToString( )+“;”;
result←result+“Z”+(step+DirZ).ToString( )+“;”,更新result;
7)cx←dx,更新cx,转2);
8)tz←rz,cz=ep.z,转5);
9) result←result+“End”,在result后添加“End”作为命令串结束的标识;
10) return result.
把指令解释器整合到机床系统中,运行一段经典的NC程序,再把解释后的指令串result传递给系统.下面分别从宏观和微观层面上进行效果分析.
3.1 宏观分析 图4和图5分别为仿真软件制造商斯沃的车床系统与本文开发系统运行同一程序的二维效果图.比较图4和图5可见,用本文指令解释器在车床系统中解释运行结果,加工产品的轮廓更清晰,圆弧更圆滑,更接近真实加工效果.
图4 斯沃仿真软件运行效果Fig.4 Operating results by Swatch simulation software
图5 本文系统运行效果Fig.5 Operating results by the present system
3.2 微观分析 先将加工轮廓在二维图中表示,并对关键点进行编号,如图6所示.
下面分别记录本文要加工每个点的理论值和加工后的实际测量值,并定义评估数值接近程度的变量精度,该变量的最大值为1,越接近于1表示数值越接近.设理论值为(x,z),测量值为(x1,z1),则精度=1-(abs(x-x1)+abs(z-z1)).分析结果列于表1.
因为加工过程和测量过程不能避免误差的存在,所以测量值在一定范围内波动是合理的.通过微观分析可见,关键点的定位与理论值几乎接近,符合仿真系统高精度的要求.
图6 二维轮廓Fig.6 Two-dimensional profile
表1 轨迹关键点数值分析Table 1 Track key numerical analysis
[1] NA Ming.Study and Realization of Open CNC System Machining Instruction Code Interpreter [D].Shenyang: Shenyang University of Technology,2006.(那铭.开放式数控系统加工指令代码解释器的研究与实现 [D].沈阳:沈阳工业大学,2006.)
[2] ZHANG Shu-cheng.Research on the Open NC Systems Based on PC [D].Hefei: Hefei University of Technology,2008.(张书诚.基于PC的开放式数控系统研究 [D].合肥:合肥工业大学,2008.)
[3] WANG Shang-bin,LI Jia-ji,WANG Pin,et al.Research and Implementation of NC Code Interpreter in Virtual NC Machining System [J].Modular Machine Tool &Automatic Manufacturing Technique,2009(2):77-80.(王尚斌,李家霁, 王品, 等.虚拟数控加工中NC代码解释技术的研究与实现 [J].组合机床与自动化加工技术,2009(2):77-80.)
[4] CAO Sheng-bin,MA Xi-pei,JIA Hui-xin,et al.Study on the Control System and Algorithm of NC Code Compiler for the Miniature CNC Milling Machine [J].Machinery Design &Manufacture,2013(3):159-161.(曹胜彬,马西沛,贾会欣, 等.微型数控铣床控制系统及NC代码编译算法的研究 [J].机械设计与制造,2013(3):159-161.)
[5] WANG Zhi-wei,YUAN Hong-bing.Development and Application of NC Code Compiler [J].Machine Tool and Hydraulics,2011,2(4): 104-107.(王志伟,袁红兵.NC代码编译器的开发及其应用研究 [J].机床与液压,2011,2(4): 104-107.)
[6] LIU Jie.Research and Development of CNC System for Lathes [D].Nanjing: Nanjing University of Aeronautics and Astronautics,2011.(刘杰.车床数控系统研究与开发 [D].南京:南京航空航天大学,2011.)
[7] HAO Ming-hui,SONG Fang,HAO Shuang-hui,et al.Research on CNC Simulation System with Instruction Interpretations [J].Machine Tool and Hydraulics,2007,35(10): 175-178.(郝明晖,宋芳,郝双晖, 等.NC指令解释数控仿真系统的研究 [J].机床与液压,2007,35(10): 175-178.)
[8] LI Mao-sheng,GAO Rong.Pretreatment on Compiling Program for CNC Machining [J].Machinery Design &Manufacture,2011(10): 162-164.(李茂胜,高荣.数控加工程序的编译预处理 [J].机械设计与制造,2011(10): 162-164.)
[9] LIU Si-sheng,LI Song-sheng,CHEN Ping.Design and Implementation of CNC G Code Interpreter and Simulation Module [J].Machinery Design &Manufacture,2012(1):172-173.(刘思胜,李松生,陈萍.数控G代码解释器和仿真模块的设计与实现 [J].机械设计与制造,2012(1):172-173.)
[10] REN Song-tao.The Design and Implementation of Code Complier for NC [D].Xi’an: Northwestern Polytechnic University,2007.(任松涛.NC代码编译器的设计与实现 [D].西安:西北工业大学,2007.)
[11] TIAN Yong-zhong,ZHOU Jian-ping,LIANG Chu-hua.G-Code Compiler Design and Research in the Open CNC System [J].Machinery Design &Manufacture,2011(3):154-155.(田永中,周建平,梁楚华.开放式数控系统中G代码编译器的设计与研究 [J].机械设计与制造,2011(3):154-155.)
[12] ZHENG Jian-hua,LI Di,ZHU Rong,et al.Design Strategy for Embedded CNC Model Verification [J].Computer Science,2008(12): 268-272.(郑建华,李迪, 朱蓉, 等.嵌入式数控系统模型层验证设计策略研究 [J].计算机科学,2008(12): 268-272.)