《武汉工程大学学报》  2014年10期 52-56   出版日期:2014-10-30   ISSN:1674-2869   CN:42-1779/TQ
数控激光加工路径链表快速搜索优化


0引言 在传统的激光加工系统中,均采用数控代码手工编程,只能处理简单轨迹零件的加工过程,在编程中容易出错,效率低.随着CAD技术的不断发展,国内外研究人员将CAD技术应用于激光加工中.其中图形交换文件(Drawing Exchange File,以下简称: DXF)作为Autodesk公司开发的用于AutoCAD与其它软件之间进行CAD数据交换的一种文件格式,其可读性好,占用内存小,易于二次开发,被用于各种图形化数控加工系统[15].胡胜红[6]等人利用Visual C++成功对DXF文件进行解析,完成对简单几何面域图形的快速扫描.由于在DXF文件中,图形元素的记录顺序是以设计人员在CAD中随机绘制图形的先后顺序为主要依据,且控制点的顺序是随系统默认,容易导致激光加工过程中路径的无序性,增加了激光加工过程中的空程路径[7].因此,快速搜索合适的最短激光加工路径对提高加工效率十分必要.笔者采用高级语言Delphi编程完成DXF文件的解析,并对图元信息进行存储优化,实现了DXF数据与激光加工路径之间的数据转换,减少激光空程加工时间,提高加工效率.1DXF图形文件与加工过程转换1.1DXF文件解析一个完整的DXF文件由表1所列的各部分组成.DXF文件是由很多的代码和值组成的数据对构造而成,这里的代码称为组码.需指定组码的值的类型和用途,每个组码的值必须为单独的一行.该组码不仅指出了其对应组值的类型,而且与此组值配对.通过以上配对的组码和组值,DXF文件被组织成由记录构成的段,而记录又是由按顺序排列的组码和数据条目所构成的[89]. 表1DXF文件的基本构成Table1The main structure of DXF file段名含义HEADER记录AutoCAD系统的所有标题变量的当前值或是当前工作环境CLASS包含应用程序内的信息,该类的实例包含在块段、实体段、对象段的数据之中TABLE包含有线型表、图层表、字样表和视图表,每个表又包含可变数目的表项BLOCKS记录图中所有块的名称、位置、比例及该块成员等信息ENTITIES记录各种实体如线、圆、弧等的所在图层位置、粗细、颜色等所有几何数据信息OBJECTS包含图形中的非图形对象ENDSEC标识文件结束 1.2 加工数据的获取DXF文件中的内容都是以组码/组值的形式出现,在读取DXF文件的时候,只需要了解模型的几何信息,因此只用扫描解析DXF文档的ENTITIES实体段区域,它包含了所绘制图形的所有数据,其中实体类型包括直线(LINE)、圆(CIRCLE)、圆弧(ARC)、椭圆(ELLIPSE)、多段线(POLYLINE)、文本(TEXT)等十几种[1011].DXF文件的解析过程可以分解成搜索各种图元并将各种图元组合起来的过程.针对DXF文件的每一个段及子类,只需搜索到对应的字符串,然后顺序去读取其后的图元数据信息[1213],解析流程如图1所示. 图1DXF文件实体段解析Fig.1The parsing diagram of ENTITIES segment of DXF file第10期王学华,等:数控激光加工路径链表快速搜索优化武汉工程大学学报第36卷1.3加工过程转换以直线段(LINE)为例,该图元的第一行组码10、20、30 和 11、21、31 分别代表直线段的坐标起点(X1,Y1,Z1)和终点 (X2、Y2、Z2)标志,而其具体的坐标数值则存在其对应的下一行(组值)中.与直线相关的数据信息以及与直线图元相关的读取、写入、绘制等函数在Delphi中定义类的过程如下:Type Dxf_Cline= ClassPublic Movetype:Integer; //0:表示移动,不加工;1:表示加工.startX,startY,endX,endY:Integer; //定义直线的起点和终点Previous:Dxf_Cline;Next:Dxf_Cline;……将DXF文件中的图元按其类型进行分类解析,提取的各图元信息存储于各类数据结构中,将各图元类作为链表结构中的结点并按DXF文件中图元出现的先后顺序存储在给定的链表结构中,链表中的每一结点元素即为一种类型的图元,则可以构成图元的数据链表结构.在链表中每个结点中有两个用于链接其他结点的指针,一个指向前趋结点(Previous),另一个指向后继结点(Next),构成双向链表,如图2所示. 图2图元的链表结构Fig.2List structure of entities读取直线段并显示在界面上的部分程序示例如下:Define DXF_line_count:Integer // DXF文件文本的行数i:Integer; // 行数计数str:String;// 中间变量,储存DXF文本的一行内容if str=’AcDbLine’ then // 读取直线图元信息startX:= round(strtofloat(mdxf.Lines[i+2])) ; // 读取直线段起始坐标XstartY:= height_coordiateround(strtofloat(mdxf.Lines[i+4])) ;//读取直线段起始坐标YendX:= round(strtofloat(mdxf.Lines[i+8])) ; //读取终点坐标XendY:= height_coordiateround(strtofloat(mdxf.Lines[i+10])) ;//读取终点坐标YImage.Canvas.MoveTo(startX, startY) ;Image.Canvas.LineTo(endX,endY) ;//绘制直线……读取椭圆、圆等其它类型的数据过程与直线类似.例如,在实体段中用查询方法找到椭圆(AcDbEllipse)子类标记后,分别读取到椭圆的中心点坐标(centerX,centerY)、长轴的长度(LongR)、以及偏移量(deltaX,deltaY)等信息,根据椭圆的标准方程将其转化为离散点(X,Y)的读取,即可完成椭圆轨迹的生成.其中,X=LongR·cos θ ,Y=LongR·sin θ,θ=arcsin(centerYLongR) +π180·(deltaYdeltaX).2加工路径优化实例在实体段ENTITIES中,若交换图形元素出现的先后顺序和改变该图元的控制点排序,对实体图形的位置和形状没有影响,因此在解析提取DXF文件的有效图元数据信息时,对随机无序的离散图元进行连接处理之后再应用最近距离排序算法,可以有效的提高激光加工过程的效率.图3为路径加工优化示意图,以图3为例,虚线箭头表示模拟加工路径,优化前的加工顺序是和设计人员的绘图顺序一致,从编程零点V0→V1→V2→V3,依次完成后回到加工原点V0.通过采取最近距离法优化之后,读取第一个图形的起点,开始进行加工,到直线的终点结束,在进行下一个图元拾取时,找寻离上一个终点距离最近的端点为新的起始点,完成下一个图元的加工,路线则变为从V0→V1→V3→V2→V0,大大缩短加工距离,提高了加工效率. 图3路径优化加工示意图Fig.3Sample of route optimization processing 图4为路径优化前后数据点的位置状态.优化前图形数据只是按照初始的CAD存储顺序进行,优化后,激光加工路径从某个图元起点开始,移动至该图元终点后,寻找离其距离最近的下一个图元的起点. 图4路径优化前后数据点的位置变化Fig.4Changes in position of data points for route optimization 结合MPC03运动控制卡的驱动,将优化后直线段的数据转换为激光数控加工路径的关键程序示例如下:……hDll:=LoadLibrary(’mpc03LS.dll’);//获取动态链接库句柄,加载板卡驱动函数库 If hDll<>0 then Begin@init_board:=GetProcAddress(hDll,’init_board’);@set_vector_profile:=GetProcAddress(hDll,’set_vector_profile’); @con_hmove2:=GetProcAddress(hDll,’con_hmove2’); @fast_hmove2:=GetProcAddress(hDll,’fast_hmove2’); @fast_pmove:=GetProcAddress(hDll,’fast_pmove’); @con_line2:=GetProcAddress(hDll,’con_line2’);@fast_line2:=GetProcAddress(hDll,’fast_line2’);……End……//运动函数声明Tinit_board=function():integer; stdcall;//对控制卡硬件和软件初始化Tcon_line2=function(ch1:integer;pos1:INTEGER;ch2:integer;pos2:INTEGER):integer; stdcall;//两轴做常速直线运动Tfast_line2=function(ch1:integer;pos1:INTEGER;ch2:integer;pos2:INTEGER):integer; stdcall;//两轴做快速直线运动Var //变量声明hDll: THandle;init_board: Tinit_board; con_hmove2:Tcon_hmove2 ;con_line2:Tcon_line2;fast_line2:Tfast_line2; Dline: Dxf_Cline;If init_board< >0 then Begin While Dline < > nil Do// 以下代码实现连续加工Beginset_laser_mode(Dline.Movetype);//激光开set_vector_conspeed(1000);//设置加工速度con_line2(m_card.Y_axis, Dline.endY,m_card.X_axis, Dline.endX); //正常加工While not (check_done(0) = 0 and check_done(1) = 0) doapplication.processmassage;set_laser_mode(0);//激光关Dline.next;EndEnd……3运行结果与结论通过对AutoCAD中DXF文件的构成及数据格式的解析,以直线段LINE图元为例在Delphi开发平台上建立了DXF文件与激光数控加工过程的数据转换接口,运行结果如图4所示.通过遍历图元数据链表结点及搜索最近邻距离的方式,重新对图元数据排序,以MPC03运动控制卡为实例,实现了激光数控加工过程路径的优化,减少了空程路径,提高了激光数控加工的效率.致谢感谢武汉桑普瑞奇科技有限公司和武汉工程大学提供的开发和试验平台!