windows10 缺少solidworks 性能运行时性能所具备的关键更新

西安理工大学 硕士学位论文 基于SolidWorks的机构运动仿真研究 姓名:韩锐 申请学位级别:硕士 专业:机械设计及理论 指导教师:郗向儒
摘要基于 SolidWorks 的机构运动仿真研究学科名称:机械设计及理论 论文作者:韩 锐 签名____________ 签名____________指导教授:郗向儒(副教授) 答辩时间:2004 年 3 月 摘 要本文针对机构运动创新设计实验的需要, 研究了在 SolidWorks 平台上进行机构运 动仿真与分析的方法。对使用 Visual C++开发运动仿真系统需要解决的实体建模、数 据库操作、数据处理、参数曲线输出、屏幕运动仿真等关键技术进行了研究。开发了 机构运动仿真软件,实现了三维实体机构的运动仿真。 首先,研究了在 SolidWorks 平台上进行参数化实体建模的方法。本文对两种不同 的参数化建模方法进行了比较,选择了其中一种通过修改模型参数实现参数化建模的 方法,实现了简单零件的三维参数化建模,简化了建模过程,提高了建模效率。 其次,针对不同机构的特点,采用了三种不同的算法来处理运动仿真数据,在此 基础上, 提出了在数据处理部分使用 MATLAB C++数学函数库进行求解的方法, 简化 了求解的过程。通过这种方法计算出了各构件的位置、速度和加速度等运动学参数。 建立了 Access 数据库对数据统一进行管理, 并将所有构件的运动学参数保存在数据库 中。 再次, 将运动分析与 SolidWorks 软件相结合, 利用其提供的 API 接口, 在 VC++6.0 开发环境对下对 SolidWorks 进行了二次开发, 实现了简单机构的实体运动仿真和多机 构组合的实体运动仿真。 最后, 利用 MATLAB 软件的图形显示功能, 将运动学分析结果进行了可视化处理, 并以图表的方式显示出来,取得了较好的直观效果。【关键词】 : SolidWorks;运动仿真; Visual C++; DLL;二次开发; MATLABI 目录Research of Mechanism Movement Simulation Based on SolidWorksSpeciality:Mechanical Design Candidate: Han Rui Supervisor: Xi Xiangru Argument date:Mar.2004ABSTRACTBased on the request mechanism kinematics innovation design, this thesis studies the method of movement simulation on the platform of SolidWorks. Discusses key techniques on how to realize the movement simulation system with Visual C++. These techniques include solid mass modeling, database, data processing, chart output and movement simulation on screen. The movement simulation of solid mechanism is realized. Firstly,The method of parameterized solid modeling on the SolidWorks platform is studied. Two difference methods of parameterized solid m one of the methods is strict introduced. The three-dimensional parameterized design of simple part is realized. It simplifies the modeling process and raises the modeling efficiency. Secondly,Three algorithms is presented to deal with different mechanism, based on it, a method of using the C++ Math Library of MATLAB is presented to simplify the solving process in the data processing. The parameters of position, velocity and acceleration are calculated by using the method. An Access database is build to manage the date, and all of the parameters are saved in database. Thirdly,Integrated kinematics analysis with SolidWorks software. Perform the second development on SolidWorks 2001+ by VC++6.0 and API interface. The three-dimensional solid kinematics simulation of simple mechanism and multi-mechanism is achieved.I& Theory signature:_______ signature: _______ 西安理工大学硕士学位论文 At last,The result of kinematics analysis is processed and visualized by using the display function of Matlab. The results of the application are very favorable.Key Words: SolidWMovement S Visual C++; DLL; SecondaryD MATLABII 第一章 绪论1 绪论1.1 引言近些年来,随着计算机技术的发展,计算机图形处理能力日益增强, 以计算机为主要工具的仿真技术也迅速发展起来,并很快应用于工程领 域。在计算机辅助下进行机械零件的设计、校核,并进行系统运动仿真 已经逐渐成为机械设计的发展方向。 在传统的设计与制造过程中,首先是方案设计及论证,然后进行产 品设计。在设计完成后,为了验证设计,通常要制造样机进行试验,有 时这些试验甚至是破坏性的。当通过试验发现缺陷时,又要回头修改设 计并再用样机验证。只有通过周而复始的设计 --试验 --设计过程,产品 才能达到要求的性能。这一过程是冗长的,尤其对于结构复杂的系统,设 计周期无法缩短,更不用谈对市场的灵活反应了。在大多数情况下,工 程师往往为了保证产品按时投放市场而中断这一过程,使产品在上市时 便有先天不足的毛病。在市场竞争的背景下,基于实际样机上的设计验 证过程严重地制约了产品的质量的提高、成本的降低和对市场的占有。 随着经济贸易的全球化,要想在竞争日趋激烈的市场上取胜,缩短开发 周期,提高产品质量,降低成本以及对市场的灵活反应都已成为竞争者 们所追求的运营方式,谁早推出产品,谁就占有市场。然而,传统的设 计与制造方式却无法满足这些要求。 计算机运动仿真作为计算机仿真技术的一个重要分支,可以归入虚 拟现实技术 VR(Virtual Reality)的范畴,它汇集了计算机图形学、多媒体 技术、实时计算技术、人机接口技术等多项关键技术。作为一门新兴的 高技术,已经成为工程技术领域计算机应用的重要方向。尤其在航天、 国防及其它大规模复杂系统的研制开发过程中,计算机运动仿真已经成 为不可缺少的工具。借助于这项技术,工程师们可以在计算机上建立机1 西安理工大学硕士学位论文械系统的虚拟模型,伴之以三维可视化处理,模拟其在现实环境下系统 的运动和动力特性,并根据仿真的结果来精化和优化系统的设计。计算 机运动仿真技术已经越来越成为人们代替或部分代替样机制作、工艺试 验,以获取所需数据结果并最终完成对产品的性能测试及验证的有力技 术手段【1】 。 虚拟模型技术应当属于计算机辅助工程(CAE)的一个分支,它的核心 部分是多体系统运动学与动力学建模理论及其技术实现。作为应用数学 一个分支的数值算法及时地提供了求解这种问题的有效的快速算法。近 年来的计算机可视化技术以及动画技术的发展为这项技术提供了友好的 用户界面, CAD/FEA 等技术的发展为虚拟模型技术的应用提供了技术环 境。借助于虚拟模型技术,设计过程先从整机开始,按照“由上至下” 的顺序进行,这样可以避免由于系统设计方面的失误而付出的昂贵代价。 目前, 虚拟模型和计算机仿真技术【 2】 【 3】已经广泛地应用在各个领域里:汽车制造业、工程机械、航天航空业、国防工业及通用机械制造业; 所涉及到的产品从庞大的卡车到照相机的快门,天上的火箭到轮船的锚 机。在各个领域里,针对各种不同的产品,虚拟模型技术都为用户节省 了开支和时间,并提供了满意的设计方案。1.2 国内外研究现状虚拟模型和计算机仿真技术是一项涉及多个学科领域的前沿技术, 发达国家于 20 世纪 80 年代提出了相关概念,这项技术在过去的 10 年里 获得了迅速发展并达到实用阶段。和一些先进国家相比,我国在这个领 域还有一定差距,但已经引起了国家有关部门和科学家们的重视,九五 规划、国家自然科学基金、国家高技术产业规划都把虚拟现实技术 VR 列入了研究项目。国内一些高校和研究部门在紧跟国际先进技术的同时, 也积极投入到了这一领域当中,并且取得了一定的研究成果。 清华大学计算机科学与技术系对虚拟现实和临场感方面进行了研2 第一章 绪论究,在克服立体图闪烁的措施和深度感试验方面采用了一些独特的方法。 他们针对室内环境的特点,提出借助图像变换,使立体视觉图像中对应 水平特征呈现形状一致性,以利于实现特征匹配,并获取物体三维结构 的新颖算法。 哈尔滨工业大学机械系在机构的三维运动仿真方面进行了不少研 究,他们使用 OpenGL 开发的机构三维仿真软件成功地模拟出了一些常 用机构的运动状态,并在此基础上加入了一些计算机辅助设计和分析的 功能。该校计算机系成功地摹拟出了人的脸部动作,如表情的合成和唇 动的合成。 浙江大学 CAD&CG 国家重点实验室开发出了一套桌面虚拟建筑环 境实时漫游系统,实现了立体视觉,同时提供的交互工具使系统的真实 感达到了较高的水平。 北京航空航天大学计算机系着重研究了虚拟环境中物体物理特性的 表示和处理,在虚拟现实的视觉接口方面开发出了部分软硬件,提供了 用于飞行员训练的虚拟现实系统。 西安交通大学信息工程研究所对立体显示技术进行了研究,提出了 一种基于 JPEG 标准压缩编码新方案,获得了较高的压缩比。 西北工业大学在基于 UG 的二次开发方面进行了不少研究。 西安理工大学机械与精密仪器学院在基于 SolidWorks 的二次开发方 面也做了不少工作,开发了连杆机构和弧面分度凸轮的运动仿真软件。 上海交通大学图像处理及模式识别研究所,国防科技大学计算机研 究所, 北京工业大学 CAD 研究中心等单位也都在这一领域做了一定的工 作,并取得了一定的研究成果。 综合国内外的研究现状,为了实现构件的造型和运动仿真,采用的 方法归纳起来可分为三类【 4】 : (1).开发专业的运动软件,这种方法可以进行多种机构的运动仿真和 运动学、动力学分析。这种方法的开发工作量大,开发周期长,开发的3 西安理工大学硕士学位论文费用也很高,主要由专业的软件开发商来完成,具有代表性的软件有 ADAMS。 (2).利用具有真实感的应用软件进行三维实体造型和运动仿真,通常 使用的软件是 OpenGL 和 3DS,OpenGL 是 OpenGraphicsLib 的缩写,它 独立于硬件,独立于操作系统,包含有 100 多个图形函数,开发者可以 通过这些函数建立三维模型。由于 OpenGL 包含的图形函数的数量和功 能有限,目前尚不适合构造比较复杂的机械零件,应用于运动仿真领域 的也仅限于简单机构;3DS 是目前世界上应用最广泛的三维建模,动画, 渲染软件 , 被广泛地应用于电视及娱乐业中,该软件功能强大,使用方 便,但是造型结束后实体的形状和尺寸都不能被实时或交互更改,如果 用于运动仿真就显得柔性不足。 (3). 针 对 成 熟 软 件 的 二 次 开 发 方 法 。 这 些 成 熟 的 软 件 包 括 AutoCAD( 二维 ) 、 UG、 Pro/E、 SolidWorks (三维)等,其中 AutoCAD 二次开发多用于平面图形,很少应用与三维实体造型,其余几种软件本 身就是工程软件,对机械零件的造型能力很强,其二次开发的接口也比 较成熟,开发具有很大的灵活性,二次开发的产品很多已经进入工程使 用阶段。 本文基于 SolidWorks 进行机构运动仿真软件的开发,主要是从以下 几方面考虑: (1).SolidWorks 是当今世界基于 NT/Windows 平台的三维机械 CAD 软件系统的主流产品,目前已在国内外中小型企业中得到广泛应用。 (2).易学、易用,操作过程直观、简单,功能强大。 (3).完全汉化,使用过程中无任何语言障碍。 (4).可向下兼容二维 AutoCAD, 使得以前采用 AutoCAD 进行的设计 可以继续使用和转化。 (5).根据需求,可以很方便地利用 VB 和 VC++对其进行二次开发。 (6).与其它三维设计软件系统具有非常好的兼容性。4 第一章 绪论1.3 本文的主要工作1.3.1 三维环境下的零件建模与装配为了实现机构的运动仿真,首先必须利用 SolidWorks 强大的实体造 型功能构造出运动构件的三维模型,其中包括:齿条,大、小齿轮,销【6】 轮,槽轮,凸轮,杆等运动构件,以及轴、销等辅助构件,文献 【 5】 详细介绍了零件的建模方法。通过实际测量现实中运动构件的实际参数, 本文在 SolidWorks 中生成零件的三维实体模型。本文综合了各种机构的 运动特点,仔细选择了每个零件的原点位置,并将完成建模的零件统一 存放在专门的目录之中,完成三维零件库的建立。 只有的三维实体模型还不能模拟机构的运动, 需要运动的零件模型必 须进行装配,这种装配通常是手动完成的。这种方法不但费时费力,而 且可能产生装配错误,影响后面进行的运动仿真。本文采用程序装配的 方法,自动在前一个机构的输出构件上装配新的机构。如果前面的机构 不存在,则自动将主动构件的坐标原点定位于装配体的坐标原点。进行 运动仿真时,首先根据需要找到并打开运动构件的三维实体模型,然后 根据实际情况设置各个构件在装配体中的位置,使每个构件都正确的安 装在装配体之中。1.3.2 实体机构的运动仿真完成装配的机构还不能运动,只能维持装配时的状态,为了再现机 构的实际运动,必须根据不同机构的特点,计算各个构件之间的相对位 置。运动参数的计算都是在机构装配时根据实际情况自动完成的,算出 的结果保存在指定的 Access 数据库之中。有了各个构件之间相对运动关 系的数据,就可以在 SolidWorks 中进行运动仿真了。各个构件的运动都 是通过时间控制的,即每隔一个时间间隔就从数据库中取出算好的构件5 西安理工大学硕士学位论文位置数据,并用此数据设置对应的构件,当时间单位足够小的时候,单 步的机构运动图像在视觉上表现为连续的机构运动,从而模拟出了机构 的运动状况。通过控制计时器的参数和状态,可以实现机构运动的开始, 暂停,反转,停止等操作。另外,为了更清晰的展现每个机构的运动情 况,各个机构还可以单独运动,使用户更清楚的了解每个机构的运动情 况。为了实现构件和数据的对应,本文使用了链表,每装配一个构件就 在链表上添加一个节点,每个链表元素又是一个结构体,节点的数据代 表了构件和数据的对应关系,这种方法使程序具备了灵活性,用户可以 动态添加构件而程序不至于陷入混乱。 以 Windows 为平台, 本文利用 Visual C++6.0 对 SolidWorks 2001plus 进行开发,生成了动态链接库,在运行 SolidWorks 时加载动态链接库, 以上的装配、运动等操作就会出现在 SolidWorks 菜单上,可以用菜单选 项实现这些操作,也可以使用工具条的按钮进行操作,使用方便。1.3.3 求解构件运动参数,输出计算结果在机构装配时完成的计算仅包含了构件的位置参数,单凭这些数据 还不足以完成机构的运动分析,还需要计算构件的速度(角速度)和加 速度(角加速度) 。为此,本文根据不同机构的特点设计了相应的算法, 并调用 Matlab Math Library 实现了求解算法,求解程序被编译生成了动 态链接库(DLL) ,在应用程序中调用相应的算法 DLL 就实现了对应算 法的求解,计算完成后释放这些 DLL 以避免其占用系统资源,这种方法 编程简便,完全脱离 Matlab 环境运行,求解的结果保存在指定的 Access 数据库中以备查询。用户可以直接打开数据库查找指定位构件的运动参 数,也可以通过菜单使用图形界面查看运动参数,本文使用的图形界面 使用了 Matlab 引擎,用户感兴趣的图像局部可以任意放大观看,生成的 图像可以直接粘贴到 Word 等字处理软件中进行保存。通过以上方法,用 户可以方便的查询、保存运动仿真的结果,进一步了解构件的运动情况。6 第二章 三维实体的建模与装配2 三维实体的建模与装配早期的计算机运动仿真都是以二维图形的形式出现的,从最初的以 简单的线条来模拟现实之中的各种机构,发展到后来精细化的二维图形 运动仿真,都没有突破二维的界限。客观地讲,二维图形对空间复杂机 构的运动仿真显得力不从心。随着计算机软硬件和计算机图形学的发展, 三维实体运动仿真成为可能。三维仿真系统中的运动构件都以三维实体 的形式出现,更符合人的视觉习惯和思维习惯,更能够代表显示生活中 的实际情况,也使空间机构的运动仿真成为现实。 本章阐述了 SolidWorks 中进行二次开发的一般过程以及三维实体的 建模和装配方法。在建模方面,指出了三维实体的两种不同建模方法, 利用自定义的资源完成了实体的参数化建模。另外,还介绍了构件位姿 设置的过程和方法。2.1 SolidWorks 及其二次开发技术简介2.1.1 三维造型软件 SolidWorks【 5】SolidWorks 软件是在 Windows 环境下开发的三维实体设计软件,它 能够充分利用 Windows 的优秀界面,为设计师提供了简易方便的工作界 面。 SolidWorks 首创的特征管理,能够将设计过程的每一步记录下来, 并形成特征管理树,显示在屏幕的左侧。设计师可以随时点取任意一个 特征进行修改,还可以随意调整特征树的顺序,以改变零件的形状。由 于 SolidWorks 全面采用 Windows 的技术,因此在零件设计时可以对零件 的特征进行“剪切、复制、粘贴”等操作。SolidWorks 软件提供完整的、 免费的开发工具(API),用户可以用微软的 Visual Basic、 Visual C++或其 它支持 OLE 的编程语言建立自己的应用方案。通过数据转换接口, SolidWorks 可以很容易地将目前市场几乎所有的机械 CAD 软件集成到现7 西安理工大学硕士学位论文在的设计环境中来。 SolidWorks 是 Windows 原创的三维实体设计软件,全面支持微软的 OLE 技 术 。 它 支 持 OLE2.0 的 API 后 继 开 发 工 具 已 经 改 变 了 CAD/CAE/CAM 领域传统的集成方式,使得不同的应用软件能集成到同 一个窗口,共享同一数信息,以相同的方式操作,没有文件传输的烦恼。 SolidWorks 软件在用户界面方面的方便程度是世界公认的 , 该软件自 1995 年问世以来,先后共获得工业界的十几次大奖,这在同档次软件中 是获奖次数最多的软件。2.1.2 基于 SolidWorks 的二次开发技术【 6】为了方便用户进行二次开发,SolidWorks 提供了 OLE 应用程序开发 接口 SolidWorks API,其中包含有数以百计的功能函数,用户可以使用支 持 OLE 编程的开发工具,如用 VB、 VBA、 C、 VC++等都能对这些功能 函数进行调用,为程序员提供了直接访问 SolidWorks 的能力。通过适当 的方法调用 SolidWorks API,应用其中丰富的函数进行二次开发, 可以建 立适合用户需要的专用 SolidWorks 运动仿真模块。如果采用 VC6.0 作为 开发工具,进行开发的步骤是:首先,从 SolidWorks 公司的网站下载向导 文 件 SWizard.awx, 将 其 拷 贝 至 C: \ Microsoft VisualStudio\Common\MSDev98\Template 目录下。然后,在 VC 中用该向导创 建 DLL 工程,加入相关代码,编译生成*.dll 文件。还有一种方法就是应 用 C:\Program Files\SolidWorks\samples 下的三个示例工程为基础进行开 发,它们分别是 testapp、userdll 和 comuserdll,这些工程已经具备了基本 的程序框架,程序员可以在此基础上开发自己的应用程序。一般而言, 开发人员首先需要在 SolidWorks 的界面上添加自己的菜单项,以此作为 激活用户程序的接口,完成与用户的数据交换。在上述过程中,用户程 序必须响应 SolidWorks 的一些消息通知,以保证各个操作的合法性。 SolidWorks API 提供了两种接口的方式:Dispatch 和 COM。两者都8 第二章 三维实体的建模与装配可以实现 OLE 自动化,但作者发现,Dispatch 接口和 COM 接口生成的 DLL 插件具有各自的特点:采用 COM 接口生成的 DLL 在 Windows 注册 表注册成功后,可通过选择 SolidWorks “工具”菜单下的“插件” , 将 DLL 程序载入,下次启动 SolidWorks 时,DLL 插件能够自动加载,通常 情况下,只要没有在“插件”菜单项中清除 DLL 插件,每次启动后都能 出现插件菜单,使用下载的向导文件 SWizard.awx 生成的 DLL 插件就是 这种类型; Dispatch 接口生成的 DLL 不需要进行注册表注册,启动 SolidWorks 后,在“文件”菜单下的“打开”菜单中选择需要加载的 DLL 程序,即可以将 DLL 插件嵌入 SolidWorks,Dispatch 接口生成的 DLL 也 可以注册,不过需要程序员自己编写注册程序, SolidWorks 自带的示例 工程 testapp 和 userdll 生成的 DLL 插件就是这种类型。本文使用了 Dispatch 接口方式开发运动仿真程序。 进行 SolidWorks 二次开发之前,还必须熟悉 SolidWorks API 对象。 SolidWorks API 接口采用面向对象的方法, 所有的函数都是有关对象的方 法或属性。SolidWorks 提供了大量的 API 对象用于二次开发,这些对象 涵盖了全部的 SolidWorks 的数据模型,通过对这些对象属性的设置和方 法的调用, 就可以在用户自己开发的 DLL 中实现与 SolidWorks 相同的功 能和操作。2.2 SolidWorks 插件(add-in)程序中的资源在普通的 VC++程序中,用户可以定义和使用自己创建的资源,包 括对话框、工具条、光标、位图等,这些资源均可以在程序中自由使用。 二次开发的 SolidWorks 插件程序中也可以创建自己的资源,但资源的使 用方法却与普通 VC 程序有所不同,如果直接使用插件程序中的资源, SolidWorks 主程序通常会在显示用户资源之后停止响应,只能用强制中 断的方式才能关闭 SolidWorks ,造成这种现象的原因是系统无法返回 SolidWorks 原有的资源,从而使 SolidWorks 无法使用。9 西安理工大学硕士学位论文如果在插件程序中包含自定义的资源,那么这些资源在使用时必须 遵循以下顺序: 1. 获取并保存当前资源 2. 设置用户资源为当前资源 3. 使用用户资源 4. 释放用户资源 5. 重新设置以前保存的资源 本课题使用了工具条和对话框资源,用户通过屏幕菜单可以添加工 具条,再用工具条上的按钮打开对话框,完成三维模型主要参数的输入, 然后根据输入的参数生成需要的三维模型。下面分别介绍如何添加工具 条和对话框。2.2.1 SolidWorks 中的自定义工具条在 SolidWorks 中 添 加 工 具 条 需 要 用 到 LoadMappedBitmap 、 AddToolbar、 AddToolbarCommand、 ShowToolbar 等 SolidWorks API 函数, 这些函数的用法可以通过查阅 SolidWorks API help 得到。 首先,在 VC++ 工程中添加自定义工具条, SolidWorks API 函数 AddToolbar 需要定义两种大小不同的工具条资源,一种为 16×16 像素, 另一种为 32×32 像素,这两个资源分别定义为 IDR_TOOLBAR_SMALL 和 IDR_TOOLBAR_BIG。 然后,在程序菜单项对应的函数中添加如下代码: HINSTANCE CurrentResource=AfxGetResourceHandle(); //获取并保存当前资源 HINSTANCE NewInstance=LoadLibrary(_T(&TestApp.dll&)); //加载动态链接库 “ TestApp.dll” AfxSetResourceHandle(NewInstance); //设置应用程序使用用户资源 m_SmallToolbar.LoadMappedBitmap(IDR_TOOLBAR_SMALL);HBITMAP hbmSmallImageWell= (HBITMAP)m_SmallToolbar.GetSafeHandle();m_LargeToolbar.LoadMappedBitmap(IDR_TOOLBAR_BIG);10 第二章 三维实体的建模与装配 HBITMAP hbmLargeImageWell= (HBITMAP)m_LargeToolbar.GetSafeHandle();m_ToolbarId=m_pSolidWorks-&AddToolbar(_T(&TestApp&), _T(&TestToolbar&),(long)hbmSmallImageWell,(long)hbmLargeImageWell); m_pSolidWorks-&AddToolbarCommand(_T(&TestApp&),m_ToolbarId,0,_T(& ToolCB0@ToolbarUpdate0,第一个图标&)); //第一个按钮对应函数 ToolCB0 m_pSolidWorks-&AddToolbarCommand(_T(&TestApp&),m_ToolbarId,1,_T(& ToolCB1@ToolbarUpdate0,第二个图标&));//第二个按钮对应函数 ToolCB1 … //其他按钮 m_pSolidWorks-&ShowToolbar (_T(&TestApp&), m_ToolbarId);//显示工具条 FreeLibrary(NewInstance); //释放用户资源 AfxSetResourceHandle(CurrentResource); //重置原资源 以上程序严格遵循了上文提到的 5 步顺序。最后,启动 SolidWorks, 加载插件程序 TestApp.dll,用菜单可以加载并显示工具条,加载后的工具 条如图 2-1 所示:用户工具条图 2-1 在 SolidWorks 环境下添加工具条2.2.2 在 SolidWorks 中使用自定义对话框在 SolidWorks 中使用自定义对话框的方法与使用工具条的方法类 似,都要注意资源的使用顺序。首先在 VC++ 工程中添加对话框资源 IDD_DIALOG1,其对应的 C++类为 CexchangDialog,同时,在调用对话 框的*.cpp 文件头添加: #include &ExchangDialog.h& 然后,在菜单项或工具条项对应的函数中添加如下代码: HINSTANCE CurrentResource=AfxGetResourceHandle(); //获取并保存当前资源11 西安理工大学硕士学位论文HINSTANCE NewInstance=LoadLibrary(_T(&TestApp.dll&)); //加载动态链接库“ TestApp.dll” AfxSetResourceHandle(NewInstance); CExchangD dlg.DoModal(); FreeLibrary(NewInstance); AfxSetResourceHandle(CurrentResource); //设置应用程序使用用户资源 //创建类的对象 dlg //显示对话框 //释放用户资源 //重置原资源在菜单项或工具条中调用以上程序,即可在 SolidWorks 中添加自定 义对话框,图 2-2 所示的是设置曲柄滑块机构中曲柄和连杆长度的对话 框。图 2-2 曲柄滑块机构设置对话框2.3 参数化建模方法在 SolidWorks 中参数化建模可以通过两种方法实现,一种方法是用 户根据需要直接用程序生成需要的模型,称为完全程序化参数建模;另 一种方法是利用已有的模型,通过修改模型参数的方法得到需要的模型, 称为参数修改法建模。12 第二章 三维实体的建模与装配2.3.1 完全程序化参数建模采用程序方法进行建模时,建模的过程完全由程序进行控制,相当 于将手动分步建模的过程由计算机连续完成。理论上讲,凡是手工建模 能够完成的复杂模型都可以用这种方法生成。完全程序建模的方法特别 适合生成具有多个变参数的模型,建模的灵活性强,不需要模型库的支 持,可以在建模的同时完成设计计算、强度校核、寿命计算等工作,程 序可实现的功能强大,参数的输入也可以采用数据库等多元化的方法。 通常情况下, 这种方法的程序设计工作量较大, 要求程序员对 SolidWorks API 函数具有较高的理解和运用能力,适合于模型比较简单、参数变量 多或参数间有关联的情况。由于 SolidWorks API 的函数较多,全部熟悉 比较困难,一个简单的了解函数应用的办法是通过 SolidWorks 中的宏来 记录用户在造型过程中的操作,所有的操作会以 VBscript 的形式保存下 来,而几乎所有的 VC++函数名与 VBscript 的函数名相同或类似,然后 通过帮助得到相应函数的用法。 完全程序化参数建模的效率与模型的复杂程度有关,模型越复杂则 建模的时间越长,编制程序的工作量越大。完全程序化建模的执行过程 与手工建模的过程基本一致,较容易理解,这种方法的难点在于要求程 序员对 SolidWorks API 函数具有较高的理解和运用能力,而实际上要做 到这一点是需要付出一定的时间和努力的。对于初学者,使用这种方法 有助于更好的理解和运用 SolidWorks API 函数。2.3.2 参数修改法建模参数修改法建模是通过修改现有模型的参数来实现参数化建模的方 法,采用参数修改法建模必须有模型库的支持,模型库通常由用户事先 用手工方式建立,保存在程序指向的目录下。需要使用时,从模型库中 打开模型文件,对指定的尺寸参数进行修改、重建,就可以获得满足要13 西安理工大学硕士学位论文求的模型。这种方法的程序设计工作量小,与造型过程无关,适用于模 型标准化程度高的情况或造型过程复杂、可变参量少的情况。参数修改 法建模对模型库的要求较高,手工建模时需要综合考虑尺寸标注方式, 尽量避免尺寸参数间的关联和制约关系,需要修改的尺寸参数必须独立 标注,尺寸标注的名称可通过查阅其属性获得。可变参数的输入可以通 过对话框、数据库等多种方式实现,也可以从程序设计计算的结果中获 得。修改模型参数前必须打开零件库中对应的零件,打开零件的操作可 以由手动完成,也可以通过程序完成。 这种建模方法不需要程序员掌握大量的 API 建模函数,程序的复杂 程度与模型的复杂程度无关。由于参数修改必须对应指定的标注对象和 零件对象,所以这种建模方法对模型库的依赖性很强,模型库一旦确定 就不能随意修改,否则将造成程序无法正常运行。 如图 2-4 所示的曲柄零件,杆长 L 是参数化建模需要修改的参数, 该曲柄零件与其他模型零件一样, 保存在指定的模型库目录下, 通过 API 函 数 OpenDoc4( ) 可 以 在 程 序 中 打 开 模 型 库 中 的 曲 柄 模 型 文 件 roddg1 .SLDPRT。 打开曲柄零件的草图,如图 2-5 所示,在草图中找到杆长参数 L,其 数值为 150mm,是独立标注的长度参数,选中并查看其属性可得到该标 注对象的名称为: “ D14@草图 1” ,该对象就是程序的目标对象。参数化 建模时,在程序中要首先找到该标注对象,然后调用相应的 API 函数对图 2-4 曲柄的长度参数图 2-5 曲柄的草图14 第二章 三维实体的建模与装配其重新进行设置就可以改变模型的参数。最后重建模型、刷新屏幕,就 可以得到需要的模型。下面程序将修改杆长参数,将其设置为 50mm。 LPDISPATCH retval=UserApp-&getSWApp()-&ActivateDoc(_T(&roddg1&)); //找到杆件对象 LPDISPATCH modDisp =UserApp-&getSWApp()-&GetActiveDoc(); //获得 IModelDoc 对象 m_pMod //获得 IPartDoc 对象 part1IModelDoc m_pMod(modDisp); IPartDoc part1(modDisp);LPDISPATCH pDim=m_pMod.Parameter(&D14@草图 1&); //找到标注对象 IDimension Dime(pDim); Dime.SetValue(RodLength/1000); part1.EditRebuild(); m_pMod.WindowRedraw(); //获得 IDimension 对象 Dime //设置 D14 的值为 RodLength =50 //零件重建 //屏幕刷新程序中“roddg1”为模型库中曲柄零件的文件名, &D14@草图 1& 为标 注对象的名称, Rlength 变量来自对话框的输入,由于 SetValue()函数使 用的长度单位是 m,所以 Rlength 还要除以 1000 转化为 m。由图 2-6 可 以看到,曲柄长度有了明显变化。(a) 曲柄长度 L=150mm(b) 曲柄长度 L=50mm图 2-6 曲柄长度参数变化前后对比图通过以上的方法,本文建成了运动仿真用的模型库,其中的主要零 件如表 2-1 所示。15 西安理工大学硕士学位论文表 2-1 模型库主要零件示意图 零件名称 几何图形 实体模型槽轮销轮齿轮 28齿轮 42齿条凸轮连杆16 第二章 三维实体的建模与装配2.4 三维实体零件的装配2.4.1 坐标系与位姿矩阵的变换如图 2-7 所示,在 SolidWorks 中,对于每一个装配体,系统会提供 一个整体坐标系 xyz ;对于装配体中的每一个零件来说,又有一个局部坐 标系 x′y′z ′ (又称零件坐标系) ,整体坐标系 只有一个,局部坐标系可以有多个。为了保 持坐标的统一,整体坐标系在程序中一般很 少进行变换,而零件坐标系正好相反。为了 实现装配或运动仿真,零件在装配体中必然 要进行平移,旋转等操作,这就要对零件坐 标系进行变换。 装配体中零件的位姿 ( 包括零件的位置 坐标和沿三个坐标轴的旋转 ) 是由一个 4 × 4 位姿矩阵规定的,该矩阵表示了整体坐标系与局部坐标系的相对关系。 运动仿真中零件的平移, 旋转等操作都是通过设置位姿矩阵实现的, 设置位姿矩阵的过程即坐标变换的过程。在本课题中,主要用到了三维 平移变换和绕坐标轴的三维旋转变换。 a. 三维平移变换 一个三维空间点 P ( x, y, z ) 平移 T (Tx , Ty , Tz ) 后到达 P′ ( x′, y′, z ′ ) ,其 平移变换方程为图 2-7 整体坐标与局部坐标x′ = x + Tx ? ? y′ = y + Ty ? ? z ′ = z + Tz ?用齐次坐标矩阵表示( 2-1)17 西安理工大学硕士学位论文? x ' ? ?1 ? '? ? ? y ? = ?0 ? z ' ? ?0 ? ? ? ? 1 ? ?00 0 Tx ? ? x ? ? ? 1 0 Ty ? ? ? y? 0 1 Tz ? ? z ? ?? ? 0 0 1 ? ?1 ?( 2-2)即P′ = T ? P式(2-3)中 ?1 ?0 T =? ?0 ? ?0( 2-3)0 1 0 00 Tx ? 0 Ty ? ? 1 Tz ? ? 0 1?( 2-4)T 为三维平移变换矩阵。b. 绕坐标轴的三维旋转变换 在三维旋转中,旋转角 θ 是这样规定的:从坐标轴正向朝坐标原 点看去,逆时针旋转时 θ 为正值,顺时针旋转时为 θ 为负值。 与式(2-3)类似,三维旋转变换有 P′ = R ? P ( 2-5)根据绕坐标轴的不同,变换矩阵 R 有如下三种形式: ( 1) 绕 z 轴旋转变换:三维实体绕 z 轴旋转 θ 时,所有点的 z 坐标不变,x、y 坐标发生变化,其变换矩阵为 ? cos θ ? sin θ Rz (θ ) = ? ? 0 ? ? 0 ? sin θcos θ 0 00 0 1 00? 0? ? 0? ? 1?(2-6)(2) 绕 y 轴旋转变换:三维实体绕 y 轴旋转 θ 时,所有点的 y 坐标不变,x、z 坐标发生变化,其变换矩阵为18 第二章 三维实体的建模与装配? cosθ ? 0 Ry (θ ) = ? ? ? sin θ ? ? 00 sin θ 1 0 0 cos θ 0 00? 0? ? 0? ? 1?(2-7)( 3) 绕 z 轴旋转变换: 三维实体绕 z 轴旋转 θ 时,所有点的 z 坐标不变,x、y 坐标发生变化,其变换矩阵为0 ?1 ?0 cos θ Rx (θ ) = ? ?0 sin θ ? 0 ?00 ? sin θ cosθ 00? 0? ? 0? ? 1?(2-8)2.4.2 向装配体中添加实体零件SolidWorks 向装配体中添加零件有两种方法:手动方法和程序方法。手动方法的自动化程度很低,不适合在本课题中应用;用程序方法添加 零件时,必须首先打开要添加的零件文件,然后才能用 API 函数添加到 装配体的指定位置。 在 SolidWorks API 中, 打开零件文件是通过 OpenDoc4()函数实现的, 向装配体中添加零部件是通过 assemblyDoc 对象的 AddComponent2()函 数实现的,AddComponent2()函数的具体使用方法如下:LPDISPATCH modDisp =UserApp-&getSWApp()-&GetActiveDoc(); IAssemblyDoc assembly(modDisp); assembly.AddComponent2(&C:\\sw\\roddg1.SLDPRT&,x,y,z); AddComponent2() 函数只能指定加入零件的原点在整体坐标系中的位置坐标,即只能指定零件原点相对于整体坐标的位移 x、y、z,不能指 定零件的旋转。 对于大多数的应用场合, 仅使用 AddComponent2()函数是 不能完成零件的最终装配的,要完全完成零件的装配,还要对装配体中 零件的位姿进行设置。19 西安理工大学硕士学位论文2.4.3 零件的位姿设置上文已经提到,零件的局部坐标系和整体坐标系之间的相对关系由 一 个 的 4 × 4 位 姿 矩 阵 规 定 , 矩 阵 中 的 元 素 值 为 P0 , P2 … P 15 , 通 过SolidWorks API 中 Component 对象的 GetXform()函数可返回位姿矩阵中的元素值。各元素值在矩阵中的位置与数学中的有所不同,其位置为:? P0 ?P ? 3 ? P6 ? 13 ?P P 1 P4 P7 P 14 P2 P5 P8 P 15 P9 ? ? P 10 ? ? P 11 ? P 12 ?( 2-9)即如需指定零件的 X 位置,需将 P9 元素设置为指定的 X 值,矩阵形 式为? P0 ?P ? 3 ? P6 ? 13 ?P P 1 P4 P7 P 14 P2 P5 P8 P 15 X? ? P 10 ? ? P 11 ? P 12 ?(2-10)零件绕 z 轴旋转 ? 角的矩阵形式为? cos ? ? sin ? ? ? P6 ? 13 ? P ? sin ? cos ? P7 P 14 P2 P5 P8 P 15 P9 ? ? P 10 ? ? P 11 ? P 12 ?( 2-11)位姿设置的过程如图 2-8 所示,每个装配体都有唯一的一个根构件, 根构件通常是第一个添加到装配体中的零件,在根构件后面添加到装配 体中的零件作为根构件的子构件,可以从根构件开始,逐一遍历所有子 构件,在遍历过程中,不断提取当前构件的构件名,当提取的构件名与 需要改变位姿的零件名相符时,即可调用相应的 API 函数对其位姿进行 设置,具体方法是:调用 ModelDoc 对象的 GetActiveConfiguration()函数 和 Configuration 对象的 GetRootComponent()函数可获得装配体的根构件20 第二章 三维实体的建模与装配RootComponent , RootComponent为开始 获取装配体 根构件 获取构件总数 nChildComponent 对象,再调用 Component 对象的 GetChildren() 函数及相应的转换可 以获得装配体中的构件总数 nChild 。以nChild 为判断条件循环遍历装配体中的所有零件, Component 对象的 GetName() 函数可以获得当前构件的装配名称,当 获得的构件名与需要旋转的零件名一致 时,构造一个 4 × 4 位姿矩阵,矩阵中存 储了改变后的构件位姿, 调用 Component 对象的 SetXform()函数, 用新的位姿矩阵 替换原有的位姿矩阵,刷新屏幕后即可 改变指定零件的位姿。通过“遍历─设 置”这一过程,就可对装配构件的初始 位姿进行设置。Nn&=nChildNn=n+1Y 获取当前构件名构 件 名 相 符 Y 设置构件位姿 结束图 2-8 位姿设置流程图位姿设置的总体思路都是首先通过遍历的方法选中需要改变位姿的 构件,再用构造的新矩阵替换原有矩阵。选中构件的方法有很多种,可 以通过构件名的方法,也可以通过构件的其他特征进行选择。2.5 构件的运动控制构件的运动控制就是控制构件以一定运动规律在屏幕上运动,运动 控制与装配中的位姿设置有一些区别,也有一定联系。两者的区别在于: 装配时,每个构件只需要设置一次位姿;而运动控制需要按照一定的时 间间隔连续的设置构件的位姿,当时间间隔足够小的时候,用户在屏幕 上看到的就是连续运动的构件。两者的联系在于:设置位姿的过程都是 按照图 2-8 所示的流程进行的。 通过对计时器及相关标志位的控制,可以实现构件运动的正反转、21 西安理工大学硕士学位论文暂停和停止。首先声明一个回调函数 waitdoall,该函数由计时器触发, 每隔一定的时间间隔调用一次。函数声明如下:void CALLBACK waitdoall( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );设置计时器的函数如下:timerall=SetTimer(NULL,1,30,(TIMERPROC)waitdoall); waitdoall 函数的代码如下: void CALLBACK waitdoall( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime ) {if(judge%2==0) {……} }其中出现的 int 型变量 judge,点击暂停按钮会调用以下函数改变 judge 的值,实现运动的暂停和继续。//判断是否暂停 //判断方向,设置构件位姿void CPartList::rotpause() { judge=judge+1; }要停止构件运动,只需要关闭计时器,点击停止按钮调用如下函数关闭 计时器。void CPartList::rotstop() { killtime=KillTimer(NULL,timerall); judge=0; }22 第三章 机构运动分析3 机构运动分析机构运动分析是研究机械共性问题的重要方法,也是机构动力分析 的基础,古典的机构运动分析图解法比较直观,能够满足一般工程应用 的精度要求,但是对于高精度要求的机构分析,通常采用解析法。机构 分析向量解析法的基本思路是写出机构的封闭向量多边形在 xy 坐标轴上 的投影方程式(位置方程) ,求解得到运动轨迹方程。本章主要介绍槽轮 机构,导杆机构,曲柄滑块机构,凸轮机构等的运动分析。【 8】 3.1 槽轮机构【7】如图 3-1 所示,槽轮机构由具有圆销的主动销轮和具有直槽的从动 槽轮构成,主动销轮作连续转动,当圆销未进入径向槽时,槽轮内凹的 锁止弧被销轮的锁止弧锁住而静止;当圆销开始进入径向槽时,锁止弧 脱开,槽轮在圆销的驱动下转动;当圆销开始脱离径向槽时,锁止弧又 被锁住而静止,从而实现从动槽轮的间歇转动。 图 3-1 的槽轮机构中,槽轮和销轮的 中心距为 a ,圆销的中心回转半径为 R1 , 销轮的转角为 ?1 ,槽轮的转角为 ? 2 ,均匀 分布的圆销数为 n ,槽数为 z 。当主动销 轮转动一周时,从动槽轮的运动时间 t2 与 主动销轮的运动时间 t1 之比,称为槽轮机 构的运动系数,用 τ 表示,即 aR1 图 3-1 槽轮机构 23τ=t2 z?2 =n t1 2z( 3-1)由于槽轮是作间歇转动的, 故必须有 停歇时间,所以运动系数总是小于 1,因 西安理工大学硕士学位论文此又(3-1)式可得,主动拨盘的圆销数 n 与槽轮槽数 z 的关系式为 2z ( 3-2) n& z?2 1 当 n = 2, z = 4 时,代入(3-1)式可得图 3-1 所示的槽轮机构 τ = 。 2 图 3-2 所示为槽轮机构中圆销和轮槽处在 运动期间的任意位置, 主动拨盘转角 ?1 和从动 槽轮转角 ? 2 之间的关系为O2?2tg? 2 =R1 sin ?1 AB = O2 B a ? R1 cos ?1( 3-3)式中 a 为中心距 O1O2 , R1 为圆销的中心回A?1B R1R 转半径,令 λ = 1 ,代入(3-3)式,得到 a? 2 = arctanλ sin ?1 1 ? λ cos ?1(3-4)式( 3-4 )适用于槽轮运动期间,当槽轮 机构处于锁止状态时 ? 2 不随 ?1 改变。O1图 3-2 槽轮机构简图3.2 曲柄滑块机构【9】如图 3-3、 3-4 所示的对心曲柄滑块机构中, 当曲柄 AB 绕轴心 A 整 周回转时,滑块 C 便在导路内往复运动,已知曲柄长度 l1 、曲柄转角 ?1 及 连杆长度 l2 ,则曲柄 AB 能整周回转的条件为l1 ≤ l2化范围为( 3-5)当曲柄整周转动时,滑块的铰接中心 C 到曲柄回转中心 A 的距离 xc 的变l2 ? l1 ≤ xc ≤ l1 + l2两极限位置间的距离为滑块的行程 S,其表达式为( 3-6)S = 2l124( 3-7) 第三章 机构运动分析yB?2CK l1J K l2 JJK Xc图 3-4 曲柄滑块机构向量图A?1x图 3-3 曲柄滑块机构简图根据已知条件,求解连杆的转角 ? 2 以及滑块的位置 xc 。 机构的封闭向量方程式为: K J K JJ K l1 + l2 = xc 在两个坐标轴上的投影方程为:l1 cos ?1 + l2 cos ? 2 = xc ? ? l1 sin ?1 + l2 sin ? 2 = 0 ?( 3-8)( 3-9)由式(3-9)的第二式得:sin ? 2 = ?l1 sin ?1 = ?λ sin ?1 l2( 3-10)上式中 λ =l1 为曲柄与连杆的长度比,由该式可求出连杆的转角 ? 2 。 l2求解滑块的位置 xc ,首先要从公式(3-10)中求得 ? 2 ,代入(3-9) 第一式,求得:xc = l1 cos ?1 + l2 cos(arcsin(?λ sin ?1 ))【 11】 3.3 导杆机构【10】( 3-11)如图 3-5 所示的摆动导杆机构中, 主动件是曲柄 AC,当其整周旋转 时,滑块便在导杆 BC 上滑动,导杆 BC 绕固定轴心 B 往复摆动。当曲柄 转到与导杆垂直时, 就是导杆的极限位置, 已知曲柄长度 l2 , 曲柄转角 ? 2 ,25 西安理工大学硕士学位论文曲柄等角速度 ω 2 及中心距 l1 ,摆角 γ 为两极限位置夹角, 则sinγ2=l AC l2 = (3-12) l AB l1yC下面根据已知条件推导导杆的转角? 3 。图 3-6 所示的机构的封闭向量方程式为:K J K K l1 + l2 = s ( 3-13)A?2在两个坐标轴上的投影方程为:l1 + l2 sin ? 2 = s sin ? 3 ? ? ( 3-14) l2 cos ? 2 = s cos ? 3 ??3B 图 3-5 导杆机构简图x两式相除,得到:tg?3 = l1 + l2 sin ? 2 (3-15) l2 cos ? 2J K l2由(3-15)式可求出导杆的转角 ? 3 。? 3 = arctanl1 + l2 sin ? 2 (3-16) l2 cos ? 2K l1K s【 12】 3.4 凸轮机构【7】图 3-6 导杆机构向量图如图 3-7 所示的凸轮机构,凸轮绕轴 O 转动,推动从动杆在导路中 上下往复运动。当从动件处于最高位置时,凸轮轮廓曲线与从动件在 A 点接触,接触点到绕轴 O 的距离为 OA,现在设想凸轮固定不动,让从 动件连同导路一起绕轴 O 转过 ? 角,接触点到绕轴 O 的距离为 OB。已 知凸轮的为椭圆形,凸轮绕轴 O 在凸轮几何中心正下方,其结构尺寸如 图 3-8 所示,现在要根据已知的结构数据,求解出坐标轴平移、旋转后OB 的表达式。26 第三章 机构运动分析假设原坐标系的坐标分别为x, y , 坐 标 变 换 后 的 坐 标 分 别 为 x , y 。当坐标原点位于椭圆的几何中心时,椭圆的方程为A?x2 y 2 + =1 a 2 b2( 3-17)Bx由图 3-6 可知, a=37, b=33, 代入( 3-17)式,得坐标轴改变之 前的椭圆方程为:Ox图 3-7 凸轮机构x2 y2 + =1 37 2 332( 3-18)坐标轴平移变换的方程为x = x + x0 ? ? y = y + y0 ?( 3-19)坐标轴旋转变换的方程为x = x cos ? ? y sin ? ? ? (3-20) y = x sin ? + y cos ? ?综合(3-19) 、 ( 3-20) ,得出同 时平移和旋转的变换方程为图 3-8 凸轮结构尺寸图x = x0 + x cos ? ? y sin ? ? ? ( 3-21) y = y0 + x sin ? + y cos ? ?在本文的椭圆凸轮中,由图 3-8 可知,x0 = 0 , y0 = ?15 ,代入( 3-21) 式,得出坐标轴平移、旋转后的表达式为x = ? y sin ? ? ? y = ?15 + y cos ? ?将( 3-22)式代入(3-18)式,即( 3-22)27 西安理工大学硕士学位论文sin 2 ? y 2 + 30 y sin ? + 225 y 2 cos 2 ? + =1 37 2 332整理( 3-23)式,得到 y 的一元二次方程为(3-23)(1089 + 280 cos ? ) y22+ 32670sin ? y ? 1245816 = 0(3-24)一元二次方程的求根公式为y1,2 ?b ± b 2 ? 4ac = 2a(3-25)由(3-24)式可知 a = (1089 + 280 cos 2 ? ) , b = 32670sin ? , c = ?1245816 , 代入( 3-25)式,并舍去负根,可求出 y 的表达式。28 第四章 机构运动参数的管理与处理4 机构运动参数的管理与处理由机构运动规律得出的位置参数还需要进一步进行处理才能得到机 构运动参数(包括位置参数、速度参数、加速度参数) ,通过 Matlab C++ 函数库与 VC++联合编程的方法,可对位置参数进行求解。 求解后的运动参 数都以数组的形式存在于内存之中,但内存中的数组无法在程序结束运 行后保存下来,因此如果不对运动参数进行管理,用户就无法对机构进 行进一步的分析。通过一定的数据库操作将数据保存在数据库中,可使 程序与数据相对独立,减少模块间的依赖。本章将对机构运动参数数据 存储和管理方式、VC++6.0 数据库开发技术、数据库结构、数据的提取、 处理和存储等问题进行讨论。4.1 数据库的选择及数据库开发技术由于 SolidWorks 的数据库管理能力较弱,所以不得不借助其他数据 库管理系统,目前市场上提供的桌面数据库主要有两类:(1) 仅 提 供 存 储 和 简 单 数 据 操 作 的 数 据 库 , 代 表 产 品 有 Access 、 dBASE、FoxPro 等。 (2) 较完备的大型数据库管理系统, 代表产品有 Oracle、 SQL Sever 等。用大型数据库管理系统来开发专用的数据库应用系统是适宜的,若 用来开发 CAD 系统往往存在很多问题, 因为要编写专用的接口程序来解 决数据库与 CAD 系统的集成问题,这种接口程序通用性差。为了克服上 述缺陷,许多高级语言都在其内部嵌入了数据库功能,由于是在单一的 开发环境下来开发应用程序及数据库系统,故可以保证各个部分的无缝 集成,从而大大提高了开发运行效率及系统的稳定性【 13 】 【 14 】。本课题采用 Access 数据库对机构运动的位置参数、经过处理后的速 度、加速度参数统一进行存储和管理,Access 是一个小巧的数据库管理29 西安理工大学硕士学位论文系统,完全满足本课题对数据库的要求。因此选用 Access 作为数据库管 理的工具,使用 VC++对数据库进行操作。VC++ 提 供 了 多 种 访 问 数 据 库 的 技 术 【 22 】【 40 】, 主 要 有 ODBC(Open Date-Base Connectivity) 、 MFC ODBC(Microsoft Foundation Classes ODBC)、 OLE DB ( Object Link&Embedding DataBase) 、 ADO(ActiveX Data Object)、DAO(Date Access Object)等,其中 DAO(数据访问对象),原来是微软为 Visual Basic 和 Access Basic 设计的一种简单的数据访问方法,用 于操纵 Access 数据。 后来有了 OLE Automation 技术, 它就可以用于 C++ 编程了。数据库应用程序如果只需与 Access 数据库接口时,使用 DAO 编程较方便。 MFC DAO 是微软用于访问 Microsoft Jet 数据库文件 (*.mdb) 的数据库开发工具,仅用来支持 Access 数据库,应用范围相对固定。 几种数据库接口的关系如图 4-1 所示。应用 /浏览器ADO OLE DB ODBCDAO数据库图 4-1 数据库接口关系本课题中的数据库主要用于 CAD 仿真数据的存储和调用, 只用到一 些基本的数据库操作,数据库技术并不是本课题研究的重点,因此,易 用性和可靠性是首要的考虑因素,DAO 本身技术并不是最先进的,但是 其可靠性和易用性已经被时间证明。 最终, 本文选用了 DAO 来对 Access 数据库进行操作。30 第四章 机构运动参数的管理与处理4.2 数据库的设计与实现4.2.1 数据库的结构本课题的运动仿真系统中,所有运动零件的运动学参数都保存在一 个 Access 数据库中,该数据库的命名为 Mydb.mdb,保存在指定目录下, 数据库中包含有一些不同的表,每张表对应一个运动零件。该数据库的 结构如图 4-2 所示:表2 齿轮1 gear28 表1 凸轮 cam 数 据库 表3 齿轮 2 gear42 ... ... ... 表n 槽轮 chao1图 4-2 数据库结构图每当用户进行了运动仿真,系统就在数据库中为每一个运动零件保 存一张表,如图 4-3 所示。表中保存着对应零件的运动学参数,这张表 在运动仿真结束后会保留下来,供用户调用数据。直到下次用户进行运图 4-3 数据库31 西安理工大学硕士学位论文动仿真时用到了相同的零件,系统才会删除原表。 本文中槽轮、销轮、曲柄、凸轮等运动零件都对应有唯一的表,通常 在运动仿真时根据机构情况删除原表后创建一张空表,表的结构基本相 同,下面以凸轮为例说明表的字段信息。如表 4-1 所示:表 4-1 表的字段定义名称 字段名 类型序号 ID long转角 VALUE doubleX 位置 XPOS doubleY 位置 YPOS doubleZ 位置 ZPOS double角速度 v double角加速度 a double空表建好后,根据情况向空表中写入计算得到的运动参数。系统会 自动对数据库进行保存,用户可以在运动仿真结束后在 Access 环境下打 开由运动仿真程序生成、保存的数据库,并选择打开不同的表查看各个 零件的运动学数据,打开后的凸轮表如图 4-4 所示图 4-4 凸轮运动参数表4.2.2 数据的流动与存储本数据库中所有数据表的数据都不是一次全部写入的,通常情况下, 由机构运动分析得出的机构位置参数会在建立新表时加入数据库,这些 数据包括:序号、转角以及在三个坐标轴上的位置,存入的位置参数有 两个用途,一方面用于设置零件的位姿,使屏幕上的机构连续运动起来, 实现运动仿真;另一方面,系统要调用运动参数处理模块对机构的位置 数据,从而得到速度(角速度) ,加速度(角加速度)等运动学参数。 在数据库表的内部,数据的流动情况如图 4-5 所示32 第四章 机构运动参数的管理与处理机构运动 分析位置参数 Access 数据表速度参数 加速度参数加速 度分 析位置参数速度分析图 4-5 数据库表数据流程图以凸轮为例,位置分析得出的位置数据首先存入数据库,凸轮由于转 轴固定,所以只对转角参数进行处理,从数据表中提取凸轮的转角参数, 在数据处理模块中求导后返回角速度参数,再次从数据表中提取凸轮的 角速度参数,在数据处理模块中求导后返回角加速度参数,经过数据库 操作,保存在表的字段 a 中。经过以上过程,一张凸轮数据库表才能彻 底完成。4.2.3 数据库的实现要在 VC++中使用 DAO 操作 Access 数据库,必须在 VC++工程中添 加必要的头文件才能使用 DAO 的对象和方法。本课题的应用中,在stdafx.h 文件中添加以下代码。 #include &afxcmn.h& #include &afxcoll.h& #include &afxdb.h& #include &afxdao.h&为了便于在 VC++工程中实现数据库操作, 本文创建了 datebases 类。 绝大部分的数据库操作函数都在 datebases 类中实现,其中其中主要的函 数包括:打开数据库,数据表的创建,添加数据记录,提取数据表的数 据,关闭数据库等。33速度参数 西安理工大学硕士学位论文( 1) 打开数据库 void datebases::dbOpen() { try{ m_db.Open(&C:\\sw\\db\\MYDB.MDB&); } catch(CDaoException* e) { DisplayDaoException(e); e-&Delete(); } }//打开数据库( 2) 创建数据表 void datebases::CreateTable(CDaoDatabase &m_db,CString tbname) { CString str= if (m_db.IsOpen()) { CDaoTableDef m_NewTable(&m_db); m_NewTable.Create(str); //创建数据表 … m_NewTable.CreateField(&ID&,dbLong,1); //添加 ID 字段 … } } (3) 添加数据记录 void datebases::addnbcam(CDaoRecordset &rs) { for (int i=0;i&=720;i++) { rs.AddNew(); COleVariant tempFieldV long IdNo=i; rs.SetFieldValue(_T(&ID&),IdNo); … } rs.Update(); … }//写入 Value 值//数据更新(4) 关闭数据库 void datebases::dbClose(CDaoDatabase &m_db) { if (m_db.IsOpen()) m_db.Close(); //关闭数据库34 第四章 机构运动参数的管理与处理}(5) 提取数据表的数据 void datebases::dbToArray(CDaoRecordset &rs) { COleVariant tempFieldV rs.MoveFirst(); while(!rs.IsEOF()) {tempFieldValue=rs.GetFieldValue(&VALUE&);//数据提取 tempArray [i]=V_R8( &tempFieldValue ); //转换后保存 … } rs.MoveNext(); }4.3 模块化的运动参数处理方案4.3.1 Matlab/VC++联合编程在应用软件的开发过程中,经常要涉及到很多方面的技术环节,如界 面的开发,数据的输入、存储、查询,数据的调用和处理,结果的可视 化等。要提高程序的开发效率,将程序模块化是行之有效的方法,不同 的环节使用各自的模块,可以降低程序开发的难度,提高程序的易读性。 本文中涉及大量的数值计算, 如果采用 VC++进行编程会耗费大量的时间 和精力,因此,将参数处理部分模块化是必然的选择。【 31 】 参数处理部分的核心和关键是数据的处理算法, 这方面正是 Matlab的专长,尤其是 Matlab 工具箱中提供各种完善的数据分析手段,特别适Matlab 本身也是一个开放的系统, 合大量的数据处理和复杂的数值计算。具有多种接口功能,易于实现与 VC++的集成。Matlab 是 Mathworks 公司 80 年代中期推出的面向科学与工程计算的高级语言。它在处理矩阵运算,数学分析和数值变换等方面有着明显的 优势;VC++可以方便的生成应用软件的各种界面,其良好的底层开放性 易于同其他软件建立接口,从而将各个模块无缝的连接起来。Matlab 的35 西安理工大学硕士学位论文应用程序界面开发功能远不如 VC++强大, VC++在工程计算方面则要比Matlab 繁琐得多。因此,在 VC++的基础上,使用 Matlab 开发参数处理模块,能够集合 Matlab 语言和 VC++语言各自的专长,更快捷、更完美 的解决工程数据计算中的问题。4.3.2 联合编程的实现途径Matlab/VC++联合编程【 28】~【30】主要有三种实现的方法: ( 1) 使用 Matlab API 进行连接; ( 2) 通过编译转换工具将 M 文件转换为 CP P 文件在 VC++中调用; ( 3)使用 Matlab 提供的 C/C++数学库 (Math 用 Matlab 函数。下面分别介绍这三种方法。 Library)直接调Matlab 应用程序接口(API)主要由三部分组成, 它们分别是: ( 1) MEX文件,它是 Matlab 系统在其运行环境种调用外部程序的接口,必须在Matlab 的工作环境内部,通过 Matlab 调用才能运行; ( 2)MAT 文件应用程序, 它是 Matlab 与外部程序进行输入输出交换的接口, 可以脱离 Matlab 环境独立运行,但功能十分有限,只能 用于程序间的数据交换; ( 3 ) Matlab 计算引擎函数库,它是外部程序调用打开引擎 开始初始化 失败出错提示Matlab 数学运算工具函数进行有关数学运算的接口,也可以脱离 Matlab 环 境独立运行, 但运行应用程序的计算机 必须安装 Matlab,应用程序执行时,在 后台启动一个 Matlab 进程, Matlab 是 被作为一个计算引擎来使用的。Matlab 引擎的接口结构框图如图 4-6 所示。以 上三种接口中 ,接口 (1)、 (2)不支持图形 处理, 接口 (3)支持图形处理功能。 本文 使用了 Matlab 引擎显示运动曲线。36 图 4-6 Matlab 引擎的接口结构框图删除矩阵并 关闭引擎 结束 发送数据到 Matlab处理 失败 构造矩阵并 赋值取出数据出错提示 第四章 机构运动参数的管理与处理Matlab 的 C/C++数学库 (Math Library)是由 Matlab 提供的基于 C/C++语言的数学函数库, C/C++程序通过 C/C++数学库直接调用 Matlab 函数, 其中包含大约 400 个能够 Matlab 数学函数, 可以在未安装 Matlab 的系统 上运行。 本课题采用直接调用 Matlab C/C++数学库的方法, 通过在 VC++ 中调用生成的动态链接库,实现了 Matlab 与 VC++的联合编程。4.3.3 Matlab C/C++数学库的接口Matlab C/C++数学库提供的编程接口,能完全脱离 Matlab 环境,其接口调用方法与 Matlab 语言环境中的调用习惯十分相似。 在 Matlab C/C++数学库中,定义了大量的类和函数,其中最重要的 和最基础的类就是 mwArray 类,通过定义 mwArray 类来封装多 (0~ 32) 维数据结构,使 mwArray 类支持绝大部分 Matlab 运算符的操作和 Matlab 基本数学函数的操作。mwArray 类为以上所有函数和运算符提供了统一的接口,通过这个接口,外部的数学函数和运算符可以方便的对 mwArray 类的对象进行数 学计算。这种方法使 mwArray 类的实现变得相当简单,同时 mwArray 类 的这种实现方法,可以避免由于 Matlab 函数的多种形式的调用和多输出 而造成的混淆和冲突。4.4 运动参数处理模块的开发和使用4.4.1 运动参数处理模块的构成运动参数处理模块主要是根据已知的构件位置参数求解构件的速度 参数和加速度参数(或角速度参数和角加速度参数) 。根据不同的机构特 点,求解的算法也要进行必要的调整。 不同的算法程序构成了运动参数处理模块的核心,一种算法就是一 个动态链接库 (Dynamic-Link Library) ,应用程序根据不同的机构,调用37 西安理工大学硕士学位论文不同的动态链接库,实现运动参数的处理。本课题用到的动态链接库由VC++通过 Matlab C/C++数学库的接口生成。下面以本文设计的多项式求导法为例创建动态链接库,程序流程图如图 4-7 所示原始数据 生成拟合 多项式 对拟合多项式 求一阶导数 求解各点的 一阶导数值 结束图 4-7 多项式求导法计算过程4.4.2 动态链接库的 (DLL)的创建【 35 】按照上述方法,开发数据处理模块的动态链接库,必须具备以下目录 和文件(本文中 Matlab 的安装路径为 C:\MATLAB6p1,下同) :C:\MATLAB6p1\extern C:\MATLAB6p1\extern\include\*.h C:\MATLAB6p1\extern\include\cpp\*.hpp C:\MATLAB6p1\extern\lib\win32\*.lib C:\MATLAB6p1\extern\lib\win32\microsoft\msvc60\*.lib下面以创建多项式求导法的动态链接库为例,说明开发的具体步骤: a.创建动态链接库 进入 VC++6.0 环境,打开 File 菜单的 New 菜单项,弹出 New 对话框,选中 MFC AppWizard(dll),并命名为 polyfitderval,在随 后 的 第 二 页 选 择 第 二 项 : 普 通 动 态 链 接 库 使 用 共 享 MFC DLL (Regular Dll using shared MFC DLL) ,然后单击 Finish。 b.设置 VC++6.0 环境 在 Tools-&Option-&Directories-&Include files 中添加:C:\MATLAB6p1\extern\include C:\MATLAB6p1\extern\include\cpp在 Tools-&Option-&Directories-&Library files 中添加:38 第四章 机构运动参数的管理与处理C:\MATLAB6p1\extern\lib C:\MATLAB6p1\extern\lib\win32\microsoft\msvc60在 Project-&Add to Project-&Files 中添加:C:\MATLAB6p1\extern\lib\win32\microsoft\msvc60\*.lib C:\MATLAB6p1\extern\lib\win32\libmatpm.lib在 Project-&Setting-&C/C++页中的 Category-&Preprocessor 中加入MSVC、MSWIND在 Project-&Setting-&C/C++页中的 Category-&CodeGeneration 中选 择 Multithread DLL c.头文件的设置 在 polyfitderval.h 的头文件声明后加入如下语句:extern &C& _declspec(dllexport) double *mypolyfitderval(double polyx[],double polyy[],int polyn,int polyinge);其中 polyx 为时间数组、 polyy 为位置数组, polyn 为多项式拟 合的次数,polyinge 为数组的大小。 在 polyfitderval.cpp 的头文件声明中加入如下语句:#include &math.h& #include &matlab.h& #include &matlab.hpp&d.加入算法程序 在 polyfitderval.cpp 的头文件声明后加入如下语句:extern&C&_declspec(dllexport)double*mypolyfitderval(doublepolyx[],double polyy[],int polyn,int polyinge) { mwArray polya(1,polyinge,polyx); mwArray polyb(1,polyinge,polyy); mwA39 西安理工大学硕士学位论文mwA mwA polyc=polyfit(polya,polyb,polyn);//相当于 polyc=polyfit(x,y,n); polyd=polyder(polyc); polye=polyval(polyd,polya); double* presult=mxGetPr(polye.GetData()); }e.编译和生成 选择编译 (Compile)菜单下的生成(Build) polyfitderval.dll, 编译后 生成了数据处理模块文件 polyfitderval.dll 和 polyfitderval.lib。将这两 个文件拷贝到应用程序工程目录下, 就可以在应用程序中调用该动态 链接库进行数据处理了。//相当于 polyd=polyder(polyc); //相当于 v=polyval(polyd,x);4.4.3 动态链接库的调用应用程序使用动态链接库(DLL)时, 如图 4-8 所示, 有两种链接方法: 隐式链接和显式链接。隐式链接在运行时由操作系统为用户使用动态链 接库提供管理; 显式链接由应用程序控制动态链接库的加载(Load)或卸载(Free) 。隐式调用 应用程序`导入库 (*.lib)显式调用动态链接库 (*.dll)图 4-8 动态链接库调用方法隐式链接的动态链接库必须与同名的动态链接库导入库 (*.LIB)一同40 第四章 机构运动参数的管理与处理使用,系统在应用程序运行时将从链接器提供的信息中得到 DLL 的位置 和加载方法,将其映射到进程的地址空间,程序可以任意使用 DLL 中的 函数而不必关心函数是如何加载和调用的, DLL 一旦载入就一直在进程 中,直到进程结束。这种方法的特点是操作简便,函数调用方便,但占 用系统资源较多。 在使用隐式链接时,在 VC++6.0 中选中工程 (Projects) 菜单的设置(Settings)项,在工程设置(Project Setting)对话框的链接(Link)页中的对象/库 模 块 (Object/Library Modules) 编 辑 框 中 增 加 导 入 库 的 文 件 名 ( 如polyfitderval.dll), 在程序中将动态链接库提供的头文件(如 Polyfitderval.h)加入到应用程序中,理论上就可以调用动态链接库中的函数了。 但是,由于本课题的特殊性,隐式链接这种方法并不可行,按照以 上标准方法,经过多次尝试,应用程序还是无法调用 DLL 中的数据处理 函数。经过分析,认为可能是由于本课题中的应用程序本身就是一个动 态链接库,用一个动态链接库调用另一个动态链接库虽然在理论上可行, 但是由于版本、设置以及其他方面的不同,实践方面还是存在一定问题。 所以只能采取另一种链接方法─显式链接。 显式链接可以让用户自行设置所需 DLL 的链接方式,用户需要使用DLL 中的函数时,在程序中控制加载 DLL,函数使用后,可以在程序中控制卸载 DLL,这样,就实现了动态链接库的动态使用。与隐式链接相 比,显式链接具有更好的灵活性,占用系统资源较少,不过比隐式链接 使用上麻烦一些。动态加载动态链接库时,首先通过 LoadLibrary()函数 或 MFC 的全局函数 AfxLoadLibrary() 将 DLL 模块映射到内存空间,AfxLoadLibrary()函数的原型为: HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName)如 果 DLL 成 功 加 载 就 可 以 使 用 GetProcAddress() 函 数 通 过LoadLibrary()函数或 AfxLoadLibrary()函数返回的模块句柄得到 DLL 中函数的地址,函数成功后返回指向函数的指针;函数使用后,要使用41 西安理工大学硕士学位论文FreeLibrary()函数或 AfxFreeLibrary()函数 DLL,AfxFreeLibrary()函数的原型为:BOOL AFXAPI AfxFreeLibrary(LPCTSTR hInstLib)如果成功则返回 TURE。本文用显式链接的方法实现了动态链接库 的函数调用,具体操作时,数据处理函数需要 4 个参数,分别是代表时 间参数的 double 型数组 xvalue,代表位置参数的 double 型数组 yvalue, 代表多项式拟合次数的 int 型参数 polyn,还有代表数组中数据个数的 int 型参数 polyinge, 其中 polyinge 的数值必须与 xvaluep yvalue 中数据的个 数相同,否则系统会出错。调用动态链接库的代码如下:HINSTANCE matlabDLL=NULL; matlabDLL = LoadLibrary(&Polyfitderval.dll&); //加载 DLLtypedef double *(CALLBACK* mypolyfitderval)(double polyx[],double polyy[],int polyn,int polyinge); mypolyfitderval matlabO matlabOpen=(mypolyfitderval)GetProcAddress(matlabDLL,&mypolyfitd erval&); COleVariant tempFieldV double v[n]; double xvalue[n], yvalue[n];.......//对 xvaluepyvalue 赋值double *retvaluev=NULL; retvaluev=(*matlabOpen)(xvalue,yvalue,15,721); //函数调用 for(int nn=0;nn&=(n-1);nn++) v[nn]=*(retvaluev+nn); FreeLibrary(matlabDLL); //数据转存 //释放 DLL以上就是动态链接库的调用方法和过程,对于不同的算法,都可参 照上述方法进行调用,调用时要特别注意被调函数的参数个数和类型。42 第四章 机构运动参数的管理与处理4.5 运动参数处理的算法4.5.1 多项式求导法多项式求导法的主要根据运动位置参数生成拟合多项式,再对该多 项式求导,然后求解对应各点的导数值,得到速度参数。再次使用该方 法(即再次调用动态链接库)对速度参数求导,得到加速度参数。多项 式求导算法占用资源少,程序相对简单,适用于运动较平稳的机构。但 是算法本身的局限性导致了计算一阶导数时边界出现误差,这种误差在 计算二阶导数时导致了边界出现更大的误差。所以在程序设计的后期, 这种算法逐渐被复杂差分算法替代。4.5.2 复杂差分算法对运动参数进行处理的核心是由已知数据计算数值微分, 由于微分定 义为:f ( x + h) ? f ( x) dy = lim h → 0 dy ( x + h) ? ( x)则 y = f ( x ) 的微分可近似为:(5-2)dy f ( x + h ) ? f ( x ) ≈ ( h & 0) dx ( x + h) ? ( x)( 5-3)它是 y 的有限差分除以 x 的有限差分。在 Matlab 中 diff ( y )./ diff ( x ) 计 算数组元素之间的差分,就可以近似求得函数的微分,同时,由于是计 算数组元素间的微分,故所得到的输出数组比原始数据数组少了一个元 素。这样,必须舍弃 x 数组的一个元素,当舍弃 x 的第一个元素时,diff ( y )./ diff ( x ) 给出向后差分近似;而舍弃 x 的最后一个元素,则给出向前差分近似。 在本课题中,这种差分算法存在两个缺点:43 西安理工大学硕士学位论文其一,每进行一次微分,数组减少一个元素,如果要计算加速度,则 数组减少两个元素,这样就破坏了数据的统一性,每次调用动态链接库 都要特别关注数组的大小,同时也增加了数据库操作的难度,造成了数 据管理的混乱。 其二,无论是向前微分近似还是向后微分近似,计算曲线与理论曲线 总是存在相位差,如图 4-9 所示。逐步减小程序的步长可以使两条曲线 逐步接近,但两条曲线通常不会重合,特别是理论计算应为零的点,实 际计算曲线一般都不为零,即存在零点误差。(a)。向前插分近似(b).向后插分近似图 4-9 简单差分计算的误差要用差分算法处理运动参数, 直接使用向前差分或向后差分算法显然 是不行的,本课题中,我们通过改进差分算法来避免出现以上提到的缺 点, 这种改进的算法在这里称为 “复杂差分算法” 。 算法核心部分的 Matlab 程序如下: ……vt1=diff(y1)./diff(x); vt101=diff(y101)./diff(x); vs1=interp1(x2,vt1,x,'spline'); vs2=interp1(x102,vt101,x,'spline'); v=(vs1+vs2)/2;44 第四章 机构运动参数的管理与处理复杂差分算法的流程如图 4-10 所示: 仔细观察向前差分和向后差分的相 位差,发现其向前的偏差和向后的偏差 几乎相同,这就为我们提供了一条思路: 采用前后相位差相互抵消的方法消除计 算误差。为了解决计算曲线存在相位误 差的问题,本文尝试采用了前后差分相 加,得到新矩阵后再除以 2 的方法,取 得了很好的效果,特别是在零点问题的向前差分 矩阵元素减少原始数据数据前处理向后差分 矩阵元素减少样条插值 恢复矩阵大小样条插值 恢复矩阵大小矩阵相加矩阵元素减半解决上得到了比较满意的结果。改进后 的算法基本上消除了零点误差,其他部 分的数据误差也相对较小。为了解决差 分后数组元素减少的问题,本文采用了 在差分以后用一维插值中的三次样条插值来补充数组元素的方法,这种 插值方法在一维插值中精度最高,平滑性最好,补充后的矩阵与原始数 组元素个数相同,便于再次应用复杂差分算法计算高阶导数。 上面已经给出了复杂差分算法的核心 Matlab 程序,但以上程序还不 能直接移植到动态链接库的程序中, Matlab 程序中出现了“ ./ ”符号,输出图 4-10 复杂差分算法流程图VC++的编译器无法识别这样 Matlab 特有的符号, 而且 VC++也无法处理矩阵与数字的除法运算,所以,必须使用 C++数学库中定义的相应的函 数来实现以上给出的 Matlab 程序,为此,需要将上面的程序转化为以下 形式: ……r1=diff(y); r2=diff(y1); r3= plus(r1,r2); r4=diff(x);45 西安理工大学硕士学位论文r5= plus(r4,r4); r6=rdivide(r3,r5);将复杂差分算法编译成为动态链接库,在应用程序中调用其处理机构 的运动参数,得到了比较满意的结果。4.5.3 槽轮机构处理算法槽轮机构有具有圆柱销的主动销轮和具有直槽的从动槽轮构成, 主动 销轮做等速连续运动,当圆销未进入径向槽时,槽轮因其内凹的锁止弧 被外凸的锁止弧锁住而静止;当圆销开始进入径向槽时,槽轮在圆销的 驱动下转动,如图 4-11 所示:图 4-11 槽轮机构的运动槽轮机构的运动和动力特性,通常用别代表销轮和槽轮的角速度, ε 2 代表槽轮的角加速度。很显然,分析槽ω2 ε 和 22 来衡量,其中 ω1 、ω 2 分 ω1 ω1轮的运动特性和动力特性所采用的评价方法与一般机构并不相同,为此, 需要在复杂差分算法的基础上进一步改进算法。以满足槽轮机构分析的 需要。这里,我们称改进后的算法为“槽轮机构处理算法” 。 槽轮机构处理算法的思路是:用复杂差分算法计算出 ω 2 、 ε 2 ,用多 项式求导法计算出 ω1 ,最后计算46ω2 ε 和 22 并输出结果。这样处理可以发 ω1 ω1 第四章 机构运动参数的管理与处理挥两种算法各自的特点,由复杂差分算法来计算运动变化剧烈的槽轮, 精度高但运算量大;由多项式求导法来计算运动平缓的销轮角速度,由 于只需计算一阶导数,计算精度较高且计算量小。槽轮处理算法使用了 已有的算法,编程时只需加以应用,由于前面已经详细介绍了用到的两 种算法,这里就不再赘述。本算法取得了比较满意的计算结果,以销轮 等速转动的槽轮机构为例,销轮在π2时槽轮出现 ω max =2.1,与理论计算相比,误差约为 0.1%,槽轮的 ε max =5.65,误差 约为 0.56 %,比较符合实际情况。用槽轮处理算法计算的槽轮机构的运 动曲线如图 4-12 所示:???槽轮转角 (rad)? ?槽轮角速度 (ω 2ω1 )─槽轮角加速度 (ε 2ω12)拨盘转角 (rad) 图 4-12 槽轮机构的运动曲线47 第五章 机构仿真系统的设计和使用5 机构仿真系统的设计和使用在机构研究中,对不同机构的运动学特性进行分析和仿真对于现代 设计有着重要的意义,前面几章介绍了运动仿真中需要用到的一些技术 和思路,要将这些不同的方法综合起来解决实际问题,还需要用软件来 实现。编制程序的过程就是将不同的技术、算法、过程综合在一起,协 调大量不同种类的运算,将原本分别独立的各种计算过程连接起来,使 其自动、连贯完成的过程。通过运动仿真可快速观察特定机构的运动状 态,分析不同机构的运动学参数,提高机构设计的速度和质量。本章运 用面向对象的结构化语言 Visual C++6.0 对 SolidWorks 2001 plus 进行了二 次开发,实现了不同机构的造型和运动仿真,输出了相应的运动仿真曲 线。同时也对不同机构的联合运动进行了有益的尝试。5.1 系统的总体功能结构运动仿真程序以 Visual C++6.0 为平台,将不同的技术和方法融合在 一起。针对运动仿真的需要,开发出不同的功能模块,每个模块都相对 独立,同时又相互联系。有的模块直接对应运动仿真的某项输入或输出, 用户可以直观感觉到模块的作用;有的模块为中间过程模块,在程序运 行时在后台工作,用户感觉不到。程序的功能结构如图 5-1 所示。 三维模型库:创建所有程序中可能用到的三维模型,其中的模型可 以直接使用,也可能在更改参数后使用。所有模型在使用之前都由程序 自动打开。 数据管理:运动仿真的所有构件的参数都由 Access 数据库统一进行 管理,数据的输入、传递、输出等操作由 C++程序调用数据库操作指令 来实现,保存仿真分析结果数据。 参数处理:根据机构的类型,结构参数等已知条件求解位置参数,48 西安理工大学硕士学位论文再根据位置参数利用一定的算法求解速度和加速度参数。 运动仿真:将仿真结果以动态的形式显示出来,用三维实体模拟实 际机构的运动,并根据保存的仿真结果数据绘制位移、速度、加速度曲 线图。SolidWorks 运动仿真软件Visual C++*.dll各功能模块Access*.mdb三维模型库数据管理参数处理运动仿真现 有 构 件 模 型参 数 化 建 模数 据 输 入数 据 传 递数 据 输 出位 置 计 算速 度 计 算加 速 度 计 算实 体 运 动 仿 真参 数 曲 线 输 出图 5-1 程序功能结构图5.2 系统的调用关系运动仿真系统由程序文件,数据库文件,模型文件等组成,其核心是 由 VC++编制的 *.dll 动态链接库程序,这里称为核心程序,在程序运行 过程中,该核心程序将根据需要调用其他文件。 当需要装配三维实体时,核心程序会打开三维模型库中的对应零件 文件;当需要计算加速度时,核心程序会调用对应的算法动态链接库程 序,并将求解的结果存入打开的数据库文件中;当需要显示运动曲线时, 核心程序会调用 Matlab 引擎和读取数据库文件。核心程序本身承担一部 分的计算功能,机构位置参数就是核心程序求解的,但核心程序更重要 的功能在于协调各个程序的工作,传递各种数据以及提供友好的用户界 面。系统的调用过程结构如图 5-2 所示:49 第五章 机构仿真系统的设计和使用SolidWorks APIAdd-in ManagerAccessVisual C++*.dlldatabaseDate processing Dll3_D model libraryVisual C++Matlab EngineMatlab math library图 5-2 系统调用过程结构图由于选择了 VC++作为核心程序的编程语言,确保了各个程序间数据 在同一平台下的兼容性和通用性。5.3 系统的设计与实现确定了系统的功能结构和调用关系,下面就要编制程序来加以实 现。首先,为了能够进行实体运动仿真,必须实现机构的选择和装配, 当装配体中没有其他机构时,第一个加入的机构就是源动机构,源动构 件的初始角速度都是 1(rad/s),如果机构的从动件也做旋转运动,则后面 加入的机构将连接到从动件上并以从动件的角速度作为初始速度,否则, 后面加入的机构将连接到主动件上,并以主动件的角速度作为初始速度。 其次,为了控制实体运动仿真,还要实现运动仿真的开始、暂停、停止 和反转,为此,本文采用了定时器的方法加以控制。再次,为了实现各 种运动参数曲线的显示,本文使用了 Matlab 引擎技术,利用 Matlab 强大 的自适应图形显示功能, 克服了普通 VC++程序中图形显示范围不可调整 的缺点,实现了图形的最优显示和图像的任意缩放。系统的程序流程图 如图 5-3 所示:50 西安理工大学硕士学位论文开始选择机构类型 选择实体仿真 的状态 设置装配原点 设置源动件 位置 停止 关闭定时器 打开数据库 选择需要输出 参数曲线的机 构类型装配体为空 否 获取装配原点 获取源动件 位置 计算并存储 位置数据 打开模型库中 模型是暂停judge=judge+1提取运动参数正转打开 MATLAB 引擎反转 显示参数曲线 N=720 N=0启动定时器 参数化建模 否 装配 是 显示对话框 输入机构 参数 重建模型否judge%2=0 是 正转提取位置参数否是 是 N&=720 是 是 槽轮算法 设置构件位姿 否 N&=0 是 设置构件位姿齿轮机构 否 槽轮机构 否 复杂差分算法多项式求导法N=N+1N=N-1数据存储关闭定时器图 5-3 运动仿真系统程序流程图51 第五章 机构仿真系统的设计和使用对于组合机构,系统会在内存中创建一张链表,链表对每个运动部 件创建了一个节点,每个节点都是一个结构体,结构体中包含了运动部 件的名称和部件的编号,如图 5-4 所示。每次向装配体中添加新机构时, 系统就在链表的尾部添加相应的节点,链表中的信息将用于运动仿真时 位姿的设置和数据的传递。链表会在系统关闭时释放。Pname-1 Ppos-1 Pname-2 Ppos-2 Pname-3 Ppos-3 … … Pname-n Ppos-n NULL headrear图 5-4 链表示意图在程序设计中,每种机构都对应一个类,每个类中包含了与该机构 对应的变量和函数,单个机构进行运动仿真时,很容易实现数据在类的 内部传递。进行组合机构运动仿真时,前一个机构的位置数据和运动数 据要传递到下一个机构中,数据必须在不同的类之间进行传递。由于本 程序的特殊性,无法使用全局变量进行不同类之间数据的传递,作者通 过反复实验,最终通过声明友元的方法实现了组合机构之间数据的传递 问题。5.4 软件界面和使用介绍使用运动仿真软件时,首先运行 SolidWorks,成功启动后用“新建” 按钮创建一个装配体 Assem1,然后用打开文件的方法在指定目录下找到testapp.dll 并将其打开,如果该动态链接库成功加载,则 SolidWorks 菜单栏上会出现“运动仿真 (Y)” 一项,展开的下拉菜单包含有不同的菜单选 项,展开后的菜单如图 5-5 所示:52 西安理工大学硕士学位论文5-5 实体运动仿真系统界面单击下拉菜单上的“显示工具条” ,会显示如图 5-6 所示的工具条。 用工具条上的五个汉字按钮可以向装配体中添加机构,各汉字按钮分别 代表:齿轮齿条机构、槽轮机构、曲柄滑块机构、导杆机构、凸轮机构。 汉字按钮后面的四个图标按钮分别代表:正转、停止、暂停、反转。5-6 系统工具条使用本软件可以进行单个机构的运动仿真,也可以进行组合机构的 运动仿真。 需要对单独一个机构进行运动仿真时,例如:槽轮机构。首先在工具 条上选择一个代表机构的汉字按钮“槽” ,系统会自动打开槽轮机构的三 、槽轮( chao1.SLDPRT) 、轴 个零件文件,包括:销轮( chao2.SLDPRT) (ax.SLDPRT) 。三个零件打开后,系统自动进行装配,然后将两个运动53 第五章 机构仿真系统的设计和使用零件的运动数据存入数据库以备调用。装配完成后,可以使用工具条上 的图标按钮或下拉菜单来控制屏幕上的机构运动,也可以利用下拉菜单 上的“槽轮机构图像”选项来显示槽轮的运动曲线。 如果需要对组合机构进行运动仿真,例如:需要在齿轮齿条机构上 再连接导杆机构。首先在工具条上选择汉字按钮“齿” ,系统在前台会自 动完成齿轮齿条机构的装配,在后台会自动完成运动数据的相关处理以 及数据库操作。然后,再选择工具条上的汉字按钮“导” ,系统会弹出一 个对话框要求用户指定曲柄和导杆的长度,如果用户的输入不能满足导 杆存在的条件,系统会弹出对话框予以提示,如图 5-7 所示:图 5-7 提示对话框输入适当的数据,导杆机构就会自动装配到齿轮机构上,装配完成 后,用工具条上的图标按钮控制运动仿真,如图 5-8 所示:图 5-8 齿轮 -导杆组合机构54 西安理工大学硕士学位论文组合机构运动曲线的显示方法与单个机构的运动曲线的显示方法相 同,都是通过选择下拉菜单上的选项完成的,以图 5-8 为例,分别在下 拉菜单上选择“齿轮机构图像”和“导杆机构图像” ,屏幕上就会弹出相 应的运动曲线窗口。 如果需要进一步分析运动仿真的详细数据,可以打开数据库文件mydb.mdb,数据库中有唯一的表对应于不同的运动构件,构件与数据表的对应关系见表 5-1:表 5-1 数据表与零件名对应表数据表名linegear gear28 gear42 chao2 chao1 rodqbhk2 rodqbhk1 block1 roddg2 roddg1 rodcam cam零件名称齿条 齿轮 28 齿轮 42 销轮 槽轮 连杆 曲柄 滑块 导杆 曲柄 推杆 凸轮机构名称齿轮 -齿条机构 齿轮 -齿条机构 齿轮 -齿条机构 槽轮机构 槽轮机构 曲柄滑块机构 曲柄滑块机构 曲柄滑块机构 导杆机构 导杆机构 凸轮机构 凸轮机构通过表 5-1 可知, 导杆的运动数据保存在数据表 roddg2 中, 打开 roddg2 就可以查看导杆的详细运动参数,包括:位置、转角、角速度和角加速 度,用同样的方法也可以查看大小齿轮、齿条以及曲柄的运动学参数。55 第六章 机构运动仿真应用实例6 机构运动仿真应用实例本文中的机构运动仿真可分为两类:一类是简单机构的运动仿真, 包括齿轮齿条机构、槽轮机构、曲柄滑块机构、导杆机构和凸轮机构。 另一类是组合机构,是由不同的简单机构搭建组合而成的机构。下面分 别介绍两类机构的仿真实例。6.1 简单机构的运动仿真6.1.1 齿轮机构齿轮机构进行运动仿真的图像如图 6-1 所示:小齿轮为 28 齿,大齿 轮的齿数为 42,齿轮和齿条的模数都为 2。小齿轮的运动参数曲线如图6-2 所示,小齿轮的转速为 1rad/s。图上可见角加速度曲线有一定震荡,但数量级为 10?12 ,分析可能是由于求解时最后一位的舍入误差所致。图 6-1 齿轮机构56 西安理工大学硕士学位论文图 6-2 大齿轮运动曲线图6.1.2 槽轮机构槽轮机构装配后的屏幕图像如图 6-3 所示,运动仿真时,其中的销 轮作为主动件, 以 1rad/s 的角速度匀速转动。 槽轮为从动件,销轮刚开始运动时销轮静止 不动,当销轮的圆销进入槽后带动销轮一起 运动。图 6-4、6-5 表示了槽轮在不同的销轮 转动方向和不同的销轮转动速度下的运动 参数曲线。由图中可以看出槽轮开始运动 时,相对角加速度从 0 跳变到 1,说明槽轮 开始运动时是有冲击的。对比图 6-4、 6-5, 可见在不同的销轮转速下,槽轮的相对速度 和加速度曲线不变,这是由于该曲线是由槽 轮速度比销轮速度得到的,加速度也是相比图 6-3 槽轮机构57 第六章 机构运动仿真应用实例得到的,槽轮的计算方法较特殊。图 6-4 销轮转速 1rad/s,槽轮运动曲线图 6-5 销轮转速 -0.666rad/s,槽轮的运动曲线58 西安理工大学硕士学位论文6.1.3 曲柄滑块机构曲柄滑块机构首先要设置参数,如图 6-6 所示,点击“安装”按钮 后,系统会根据用户输入的数据生成三维模型并装配,运动仿真中的曲 柄滑块机构如图 6-7 所示。当曲柄为主动件,以 1rad/s 匀角速度转动时, 图 6-8、 6-9 表示了曲柄滑块机构中的连杆在不同曲柄长度条件下的运动图 6-6 曲柄滑块机构设置对话框图 6-7 曲柄滑块机构59 第六章 机构运动仿真应用实例参数曲线,图 6-10、6-11 表示了曲柄滑块机构中的滑块在不同曲柄长度 条件下的运动参数曲线。图 6-8 曲柄长度 110mm-连杆长度 300mm, 连杆运动参数曲线图 6-9 曲柄长度 240mm-连杆长度 300mm, 连杆运动参数曲线60 西安理工大学硕士学位论文图 6-10 曲柄长度 110mm-连杆长度 300mm, 滑块运动参数曲线图 6-11 曲柄长度 240mm-连杆长度 300mm, 滑块运动参数曲线由图 6-8、 6-9 可以看到,当连杆与曲柄成一条直线时,连杆的角速 度出现最大值,角加速度出现最小值。在连杆长度不变,曲柄长度增加 的情况下,连杆的转角(即连杆与水平方向的夹角)最大值随之增加,61 第六章 机构运动仿真应用实例角速度和角加速度也有不同程度的增加,其中角加速度的增加幅度大于 角速度的增加幅度。由图 6-10、 6-11 可以看到,当连杆与曲柄成一条直 线时,滑块处于极限位置,速度为零。在连杆长度不变,曲柄长度增加 的情况下,滑块的位移、速度和加速度也有明显的增加。当曲柄长度与 连杆程度接近时,滑块的加速度曲线呈现出明显的双峰形态。6.1.4 导杆机构导杆机构首先要设置结构参数,如图 6-12 所示,点击“装配”按钮 后,系统会根据用户输入的数据生成三维模型并装配,如图 6-13 所示。图 6-12 导杆机构设置对话框图 6-13 导杆机构 62 西安理工大学硕士学位论文输入的导杆长特指两倍的机架长度 L,图 6-14、 6-15 表示摆动导杆 机构中的导杆在不同曲柄长度条件下的运动参数曲线。图 6-14 曲柄长度 50mm-机架长度 150mm,导杆运动曲线图 6-15 曲柄长度 110 mm -机架长度 150mm,导杆运动曲线63 第六章 机构运动仿真应}

我要回帖

更多关于 solidworks缺少dll 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信