殷健良,仲梁维
(200093 上海市 上海理工大学机械学院)
标准化、智能化、网络化成为工业发达国家注塑模具制造业的基本特征。近些年我国注塑模具的制造水平得到了很大提高[1]。热流道(Hot Runner Systems)是在注塑模具中使用的、将融化的塑料粒子注入模具型腔中的加热组件系统。热流道模具是将传统式模具或三板式模具的浇道与流道经过加热,于每一成形时不需要取出流道和浇道的一种崭新构造[2]。对注塑制造行业而言,热流道技术是行业发展中的一次重大技术革命,能够节约资源、提升生产效率、提高产品质量以及延长模具使用年限,同时有很好的经济效益[3]。
目前,一些生产商使用软管作为热流道系统的管道。软管灵活性高、可伸展、可压缩,可维护性好,但软管存在比较致命的缺点——成本高,因此有些热流道系统生产商使用硬管替代软管以节约成本,同时还能提高热流道系统的外观和品质。
由于企业在热流道系统管路设计过程中涉及大量管路建模和排布操作,尤其是建模,管路路数众多,需要做分层排布等操作,实际过程中工程技术人员耗费大量时间反复修改以完善管路排布,但企业需要快速给出管路排布方案和全部精确的三维管路模型,用于自动折弯机的工艺环节。因此考虑借助 SolidWorks 开发一款能够实现基于热流道系统的基础框架模型,自动排布热流道管路以提高设计效率。虽然系统基于注塑行业热流管管道系统开发,但其他需要进行路径连接的系统,如液压系统管道或电路的排布亦可参照本算法思路进行开发。
系统可实现3 个功能模块:信息的提取与转换,按距离最短确定路径,进行管路排布和干涉处理。输入为SolidWorks 热流道注塑系统3D 图,输出为管道的SolidWorks 零件文件。软件流程图如图1 所示。
图1 软件流程图Fig.1 Software flow chart
借助vs2012 开发平台使用vb.net 作为开发语言实现软件算法编写及功能开发,并基于SolidWorks 三维CAD 软件以及其为用户提供的API开发接口,实现管路的数据采集和排布的三维显示。SolidWorks API 对象模型如图2 所示,是一个自上而下的树形结构。
图2 SolidWorks API 对象模型Fig.2 SolidWorks API object model
SolidWorks 的二次开发主要分为2 种,一种是基于COM 开发,使用官方提供的Addin 模板生成的dll 插件;另一种是基于EXE 可执行文件[4]。前者会运行在SolidWorks 主进程之下,与SolidWorks内聚性较高,运行速度也会更快,用户安装和使用更加方便。后者运行在单独的进程中,耦合性较高,运行速度慢,但可扩展性更强,所以一般在开发扩展性不强的产品软件时,会优先使用第一种开发方式。软件界面如图3 所示,用户输入参数,点击绘图按钮即可完成管道排布方式的计算和展示。
图3 软件界面Fig.3 Software interface
在计算管道路径之前,必须对热流道系统的三维坐标进行数据采集。需要采集的数据分别为管道的起点、终点和表示哪里可以经过管道的中间线。本文使用xml 配置文件结合SolidWorks 的API 接口(以下简称SWAPI)进行数据点的获取。其中热流道系统的三维模型是一个装配体,由于装配体中不能获取零件的特征,所以要在特征中获取点后按照草图→零件图→装配体的顺序向上进行坐标变换。
xml 是一种可扩展标记语言(Extensible Markup Language),常被用来传输和存储数据[5]。本文使用xml 作为配置文件,使用DTD 文件对xml 文档的书写规则进行简单约束。软件使用xml 文档传输、持久化SolidWorks 应用信息和采集的信息点的特征树结构及特征名称,如图4 所示。
图4 存储SolidWorks 应用和特征信息的xml 文档Fig.4 SolidWorks application and feature information in XML document
使用
通过程序解析XML 的方式通常有两2 种:第一种为DOM 的方式,将标记语言文档一次性加载进内存,在内存中形成一棵DOM 树,其优点是操作方便,可以对文档进行CRUD 的所有操作;另一种是SAX 的方式进行逐行读取,基于事件驱动,优点是不占内存。由于本文的XML 大小较小,功能简单,故采用比较方便的dom 读取方式。vb.net开发语言System.XML 类库下提供了十分方便的XML 解析类XMLDocument。
读取XML 配置文件模块在软件业务逻辑开始时被执行,将解析后的结果进行一定的处理和封装,比如字符串替换双花括号中的变量,存储到内存中。
SWAPI 获取三维模型点的信息的模块随后被执行,该模块需要通过SWAPI 接口找到XML 配置文件中所定义的各个装配体、零件、特征,对应方式为字符串匹配名称。其中,由总装配体获取到子装配体所对应的SWAPI 接口中的方法为IAssemblyDoc.GetComponents();由装配体获取零件所使用的方法为IComponent2.GetChildren();由零件获取特征时使用IComponent2.FirstFeature(),该方法返回一个指向第一个特征的引用,可以使用Feature.GetNextFeature()方法进行零件特征树的遍历,遍历的方法参照图的深度优先搜索,将图4 中XML 文件中线架主体和接线板的装配——零件——特征信息映射成图的表示形式,如图5 所示。
图5 XML 文件中特征树结构的图的映射Fig.5 Using XML-Graph map to express feature tree structure
通过上文方法获取了起点、终点、可经过点的信息,但通过该方法获取的这些点的坐标的坐标系是其所在草图的坐标系,而计算管路路径、弯折点和三维导出是在装配体中完成的,需要进行坐标的转换统一成装配体坐标系下。
使用SWAPI 实现坐标转换,无论是从草图到零件还是从零件到装配体,都需要存放2 个不同坐标系之间的关系的MathTransform 对象,该对象通过草图接口(ISketch)中的ModelToSketchTransform属性可以获得草图到零件的MathTransform 对象,或者通过组件接口(IComponent)的Transform2 属性可以获得零件到装配体的MathTransform 对象。另一个需要的对象是需要变换的点的对象,类型为MathPoint。将MathTransform 作为参数传入
MathPoint MathPoint.MultiplyTransform(MathTransform mathTransform)方法,即可完成SolidWorks 中不同坐标系下的坐标转换
SolidWorks 中的坐标变换是通过变换矩阵来完成的[6],矩阵如式(1)所示
式中:(Xa,Ya,Za)——原始坐标,对应的是MathPoint 对象;a-i——4 阶变换矩阵,为旋转矩阵;(j,k,l)——平移矢量;(n,o,p)——无实际意义。上面获得的MathTransform 对象封装了该变换矩阵表示的信息。最后返回的MathPoint 对象为(Xb,Yb,Zb)。
将零件中的点转换到装配体中的方法与草图转到零件中的方法类似,只不过MathTransform 对象是通过装配体中零件的对象中的Transform2 属性获取的。提取的信息数据如图6 所示,字段x,y,z 表示位置信息,direction 字段表示方向向量。
图6 部分信息提取结果Fig.6 Partial Point Information
完成信息采集后,按照点的信息,需要确定每一条起点到终点的路径,路径的确定原则考虑到成本问题采用最短路径原则,主要应用Dijkstra 算法。由于Dijkstra 算法生成最短路径需要3 个必要参数:起点、终点以及由n 个结点组成的n 阶邻接矩阵,所以在使用图的最短路径算法之前,需要进行数据预处理以确定这3 个参数。
在生成路径之前需要对点的信息进行预处理,生成Dijkstra 中需要的结点信息。当前不能直接生成结点的原因是从线架草图提取的线都是不连续的,如图7 所示,因此首先需要将不连续的线按照一定算法连接形成结点。
图7 数据预处理前的草图Fig.7 Sketch before data preprocessing
针对不同的情况形成结点的算法如下:比较所有线段与线段之间的距离关系,找出距离十分相近的2 条线段。这2 条线段有如下2 种情况:
(1)两条线段延长线的交点在其中一条线段上,如图7 中3 号和5 号线段。对于这种线段,首先确定交点在哪条线段上,3 号线段和5 号线段中,交点在5 号线段上,沿着3 号线段的方向新建线段连接3 号线段端点和两线段交点,并将交点记为5号线段的打断点。其中还有一种特殊情况:两条线的交点为其中一条线段的端点,如图7 中7 号和6号或8 号线段,与非特殊情况不同之处在于不用将交点记为打断点;
(2)两条线段的交点在两条直线的延长线上,如图7 中2 号和4 号线段。首先找到交点,连接交点与2 号线段,4 号线段距离较近的端点即可。
上述程序完成后将有打断点的直线在打断点进行打断,并进行去重。通过SWAPI 中IModelDoc.SketchManager.CreateLine() 方法将处理后的结果可视化(软件中没有这一步,这里仅为方便展示),得到的结果如图8 所示。
图8 数据预处理后的草图Fig.8 Sketch after data preprocessing
有了所有结点的连接信息之后,需要生成邻接矩阵。先将n 个结点组成的n 阶邻接矩阵初始化,每个结点的值设置为10 000(替代正无穷,需要远大于正常数值,但不能过大,否则进行计算时会超出int 的范围),再双重循环遍历各个可以连接的结点,将结点之间的距离作为权重写入邻接矩阵。
Dijkstra 算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题,算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。迪杰斯特拉算法采用的是贪心算法的策略,贪心策略体现在每次都选择一个距离源点最近的节点加入最短路径节点集合,算法只支持非负权图,时间复杂度为O(n2),比较适合作为热流管系统求解最短路径的算法[7]。
对于一条路径,路径中的每个结点将维护2 个数据结构:shortest 和visited,shortest 存储起点到该节点的最短路径。visited 存储起点到该节点的最短路径是否求出,用0 和1 表示,1 表示已经访问过(求出)[8]。
Dijkstra 算法一次遍历可以获得从某一个起点到所有节点的最短路径以及线路所经过的结点,在所有结点中找到终点对应的结点即可获得起点到终点的相关信息。图9 显示了在所有路径中第4 个节点和第11 个节点的位置,图10 显示了将4 号节点作为起点、11 号节点作为终点的管路经过Dijkstra算法计算得到的最短路径。
图9 4 号点和11 号点在草图中的位置Fig.9 Positions of Point 4 and Point 11 in sketch
图10 Dijkstra 算法计算得到的4 号点到11 号点的路径Fig.10 The path from Point 4 to Point 11 calculated by Dijkstra algorithm
本文已介绍了获得到管路起点、终点、可经过点的位置和方向,以及每条管路需要经过的中间点。程序在此需要这些信息确定管路安装的顺序、排布方式、干涉检查。此部分算法的策略为在安装顺序、排布方式确定过程中尽最大可能避免干涉,如果在干涉检查时发现管路之间有干涉再进行调整。
确定每根管道的安装顺序是整个管路排布中最重要的步骤之一。确定管路安装顺序的主要的:(1)如果不按照指定顺序进行管路排放,在管理排布时极易在管道转弯、线路分支和合并处出现管路互相干涉现象;(2)防止出现安装困难或者安装不上的问题。在多管道且管道都比较长的情况下,在计算出合适的排布方式后,很容易出现管道之间相互卡住的,导致安装困难甚至完全不能安装。
确定管道安装顺序的步骤如下:
第1 步:将所有管道按照最后一个经过点的不同进行分类,按照类别的不同安装的不同排序。这样做的原因是:任意空间中的多条线路,当它们规划路径的要求一致并终点相同时,路线的走向总是趋同的,即多条终点相同管路遇到一个分岔路口时,它们所选择的方向总是相同的。但由于每根管道的阀接口点(终点)不同,所以不能按照阀接口点进行分类,而要按照路径在线架上的最后一个经过点进行分类。
第2 步:遍历每个经过点,判断在所有路径中该点前一个点是不是有多个,若有则称此点为合并点,将新管路成为合并管路。合并的情况又分为2种:一种是起点型的合并,即该经过点是作为合并的新管路的线架上第一个经过点;另一种是中途型的合并,如图8 所示。
第3 步:按照前2 步得到的信息,找出当前情况下所有能进行安装的管道,管道需满足如下条件:(1)管路的类别为所有尚未计算安装的管路中类别的最小值;(2)管路中所有的合并点都没有尚未安装的但又不是合并管路的管路。
排布方式的确定概述如下:
首先按照管道的外径和间距要求,将在管道路径的经过点处将管路的横截面分为网格,如图11所示。
图11 管路横截面网格化Fig.11 Meshing tubes cross section
此部分的贪心策略体现在管路在各个横截面之间时是互不干涉的,因此一条管路在每个横截面之间只能上下移动(改变所在行),不能左右移动(改变所在列),管路在到达第一个横截面时其所在的列就是它在后面所有横截面所在的列。列的确定只要按照某个顺序(从左往右或从右往左)即可。
对于行的确定,在安装顺序确定中获取管道的类别和每个经过点横截面所在处是不是合并点。先将横截面按高度分为非合并管路层的和合并管路层的,合并管路层通过的管路是新合并进来的管路,非合并管路层通过原来就在这条路线上的管路。在2 种分类中,管路的类别不同,管路的高度不同,每条新的管路的行都为其所在列上最小行。
干涉检查采用图的深度优先搜索策略,其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。在干涉检查环节中节点存放的是线路2 个相邻经过点之间的连线的信息,具体实现为:从每条管路的第一个节点开始,遍历每一个未被访问的结点,每遍历到一个新的结点,计算它与其他管路结点间距离的最小值,如果小于管路的外径,则认为发生干涉,处理的方法为将管路这两个结点向上移动,移动距离为管路的外径(行+1),直到所有管路均不发生干涉为止。
为了让工程师快速给出管路排布方案,用于自动折弯机的工艺环节,需要基于 SolidWorks 实现精确化的三维管路模型绘制功能以提高效率。
在总装配图中绘制管道的步骤:(1)在总装配体下选取一个平面作为3D 草图的基准平面;(2)在基准平面上插入3D 草图;(3)将上文获取的管道路径的结点连成直线,绘制草图直线;(4)对草图直线进行扫描,设置参数。最终结果如图12 所示。
图12 管路排布结果Fig.12 The result of tube arrangement
针对实际注塑系统热流道中大量的硬管设计和排布操作,使用三维软件结合二次开发技术实现管道的计算机辅助设计,设计导出三维的管道零件,从中获取弯折点的信息和管道的长度。
本研究存在的缺点和不足:(1)当前在管路排布中,每2 个截面进行分析,保证管路在二截面中的合理,但是从整个管道路径角度来看,并不一定是最合理的排布;(2)对于实际环境中的复杂情况,例如管路中有障碍需要绕开、线架为上下多层的立体结构,在实际中需要进行人工交互,不能实现自动化设计。
从实际应用和效果出发,该程序已经能适用于大部分的热流道管路的智能快速设计,大大提高加工效率,较少人工成本和出错概率。