VC++仿真范文(精选4篇)
VC++仿真 第1篇
Word作为一个文字处理器应用程序, 具有强大的文档编排能力, 是一款不可或缺的字处理软件。因此, 如何用自主研发的软件操纵Word文档, 按照用户所需的格式生成报告, 成为大家所关注的问题。可以用VC调用组件对象的方式, 操纵Word文档, 生成所需的报告, 实现Word文档自动化。由于自动化程序接口及COM技术原理和细节的复杂性, 在这里不对其进行详细介绍, 旨在通过文中介绍的编程实例, 让大家从应用角度对其进行理解和掌握。目前, 关于实现Word文档自动化的文章较多, 但生成的文档大都格式简单, 不能达到专业性报告文档的需要。详细介绍了Word文档自动化操作的细节, 使VC控制Word文档像用户手动操作一样, 生成格式多样的报告。
2 程序
用VC实现Word文档自动化的方法有多种, 本文通过在VC环境下导入Word类库, 最终生成格式固定的仿真报告, 报告中包含文字、表格和图片。
2.1 建立工程并加载Word类库
启动Visual C++6.0, 用MFC AppWizard (exe) 创建一个名为Test的基于对话框的工程。然后在工程中加载Word类 (对象) 库, 步骤如下:
(1) 点击View菜单下的ClassWizard菜单项, 选择Add ClassFrom a type Library。
(2) 在Office的安装目录下找到格式为.olb的Word类库。一般情况下类库的位置为Microsoft Officeoffice11msword.olb或Microsoft Officeofficemsword9.olb等。
(3) 点击所需的对象, 如:_Application、Documents等。可按住Ctrl键, 一次选择多个对象, 点击OK加入工程。表1列出了所需的全部对象及其基本含义。
(4) 在CTestDlg类的.h文件中添加#include"msword.h"和#include
2.2 初始化COM组件
在CTestApp类中InitInstance () 函数里添加如下代码, 进行COM组件初始化:
2.3 生成Word文档
为简便起见, 只在对话框中添加一个名为“生成报告”的按钮, 点击这个按钮, 程序就在用户指定的位置生成一个格式如图1的Word报告。
2.3.1 创建Word对象, 启动Word应用程序
要用VC操纵Word应用程序, 首先要创建一个Word应用程序的对象 (本例程序中的app) 。在“生成报告”按钮的消息响应函数OnCreatrepor中添加如下代码:
电路仿真报告
报告人:XX
仿真环境:XXX仿真软件
内容:
1) 元器件参数
2) 仿真数据
步骤:
1) XXXXXXXX
2) XXXXXXXX
3) XXXXXXXX
一、元器件参数
仿真电路的元器件参数如表1所列
二、仿真结果
图1仿真报告
2.3.2 添加报告文字内容和图片
至此, 报告第1段标题行输入完毕, 接着顺序输入报告的其他段。除第13, 18段是表格所在段落, 其余各段的格式设置方法与第1段类似, 只需修改相应参数即可。有首行缩进的段落需要调用Paragraph类的SetCharacterUnitFirstLineIndent函数, 将函数的参数设为2, 代表首行缩进两个字符。
第16段是仿真波形图所在段落, 其实现代码如下:
2.3.3 在报告中插入表格
前面先输入文字和图片, 用TypeParagraph预留出表格所在段落, 最后再插入表格, 这么做的原因是:表格插入后, 原有的段落序号会发生改变, 例如图1中, 表格的每一个单元格里都有一个换行符, 这说明每个单元格都代表一个段落。这将影响原来设定的段落格式。在OnCreatreport函数里继续添加代码如下:
以上4行5列的表格1就以指定格式插入在第13段了。表格2的插入方法与表格1类似, 但要注意表格插入的段落位置:由于表格1的插入, 原先应该位于第18段的表格2变成了第41 (18+4*6-1) 段。
2.3.4 保存文档, 退出程序
在报告的所用内容输入完毕以后, 要保存写好的文档, 然后退出Word应用程序, 并释放所有用到的资源。
2.3.5 自定义函数
下面给出自定义函数SetEleparatabProperty、SetTableBorderBlack和FillElePaTab的代码。
SetEleparatabProperty函数的作用是设置表格的行高和列宽等属性, 参数*ptable代表需要被设置属性的表格。
SetTableBorderBlack函数的作用是设置表格边框为黑色, 之所以调用这个函数是因为在程序开发过程中发现, 在不同的计算机中, 缺省情况下, Word表格的边框属性不一致, 有的表格边框可见, 有的不可见, 有的是黑色, 有的是灰色。当表格边框不可见时, 生成的表格就不利于用户阅读, 为克服这个缺陷, 编写了SetTableBorderBlack函数。
FillElePaTab函数的作用是将仿真数据填写到表格中。参数*ptable代表填写数据的表格, elelist是保存数据的链表, Elepara是这个链表元素的结构体。
3 结语
文中程序在VC++6.0、Office2003、Office2007环境下测试通过, 运行正常。
介绍了用VC操纵Word应用程序生成仿真报告的实例。文中是用VC顺序输出了文档的全部内容。对于格式固定的文档, 也可以先建立一个.dot格式的Word文档模板, 将文档中的固定内容 (如文档标题等) 先添加到模板中, 在需要动态添加内容的位置添加书签, 然后在2.3.1中标号为 (1) 的代码中添加模板的路径, 如:
CComVariant Template (_T ("F:仿真资料报告模板Mytemplate.dot") ) ;
然后在程序中添加Bookmarks和Bookmark类, 用这两个类的成员函数动态添加文档内容即可。
Word具有强大的文档编排能力, 操作灵活方便, 要想在VC环境下同样实现其强大的功能, 要对Word类库以及类成员函数较为熟悉, 作为专业化的标准类库, Word类库中类以及相关方法和属性的命名都做到了见名知意的命名原则, 可以通过观察函数名称来猜测它的作用, 例如Paragraph类的SetCharacterUnitFirstLineIndent函数根据Indent判断可能是缩进排版。另外还要灵活运用已有函数达到自己的目的。例如需要表格在文档中居中, 而Table类并没有相关的居中函数, 参照Paragraph类里居中函数的名称, 在整个工程中搜索SetAlignment, 搜索结果显示在Rows和Row类中都有SetAlignment函数, 经试验, 它们都能实现表格居中的效果, 为方便起见, 利用Rows类的SetAlignment函数来实现目标。
摘要:在EDA软件开发过程中, 为了方便用户分析仿真结果, 经常需要让软件“自动”生成各种仿真报告。介绍在VC环境下控制Word文档自动生成仿真报告的方法, 实现了Word与其他软件的无缝连接。
关键词:VC,Word自动化,表格,图片
参考文献
[1]孙鑫.VC++深入详解.北京:电子工业出版社, 2006.
[2]Dale Rogerson.COM技术内幕-微软组件对象模型.北京:清华大学出版社, 1999.
基于VC++数控插补仿真的研究 第2篇
1 插补原理
插补技术[2]是数控系统控制的核心技术。数控装置根据输入的零件程序的信息, 将程序段所描述的曲线的起点、终点之间的空间进行数据密化, 从而形成要求的轮廓轨迹, 这种“数据密化”机能就称为“插补”。根据输出形式的不同, 有基准脉冲插补和数据采样插补两种形式[3], 数值积分法属于基准脉冲插补。
1.1 数值积分法 (DDA) 基本原理[4]
如图1所示, 有一函数y=f (t) , 该函数求积分的运算就是求此函数曲线所包围的面积, 此面积可以近似认为是曲线下许多小矩形面积之和。即面积为
式中, yi为t=ti时函数f (t) 值。
在上式中, 如取△t为基本单位“1” (相当于一个脉冲) , 则上式可简化为
设置一个累加器, 而且令累加器的容量为一个单位面积。用此累加器来实现这种累加运算, 累加过程中超过一个单位面积时, 产生溢出脉冲, 则累加过程中所产生的溢出脉冲总数就是要求的面积近似值。用一个数值积分器可以实现这一功能, 图2是数字积分器的逻辑图。
1.2 数字积分法直线插补原理
若加工Ⅰ象限直线, 如图3所示, 其起点为坐标原点, 终点坐标为E (xe, ye) 。假设刀具进给速度在两个坐标轴上的速度分量为vx、vy。则可求得刀具在x、y方向上的微小位移量△x、△y分别为
根据图3中的几何关系可得
式中, K为比例系数。
因此, 坐标轴上的微小位移量变为
可见, 刀具从原点O走向终点E的过程, 可以看作是各个坐标轴每经过一个单位时间间隔△t以增量Kxe和Kye同时进行累加的过程, 即
取△t为一个单位时间间隔“1”, 现假设经过n次累加后, 刀具正好到达终点E, 则上式为:
则有n K=1, 式中, n为累加次数, K为比例系数。为保证坐标轴上每次分配的进给脉冲不超过一个单位, 则:
另外, xe和ye的最大允许值受系统中相应寄存器的容量所限制, 假设寄存器容量为m位, 则当各位全为1时, 对应最大允许数值为2m-1, 所以有下式成立:
据此不妨选取, 则, 也就是说, 经过n=2m次累加后, 动点将正好到达终点E。
2 用VC++编程实现
2.1 插补流程图
直线插补流程图如图4所示。
2.2 插补仿真程序
2.3 插补仿真实例
结合VC++的可视化环境, 插补仿真的实现如图5所示。
3 结语
采用本插补仿真软件, 通过可视化的形象手段动态地演示插补过程, 使初学者更加直观地理解数控插补原理, 在教学上能增加课程的生动性, 是数控技术课程教学的有效辅助手段。
参考文献
[1]钟建琳, 陈秀梅, 马振, 等.教学用数控插补仿真系统[J].机械设计与制造, 2003 (3) :62-64.
[2]王润孝.机床数控原理与系统[M].西安:西北工业大学出版社, 2000.
[3]王侃夫.机床数控技术基础[M].北京:机械工业出版社, 2002.
[4]晏初宏.数控机床[M].北京:机械工业出版社, 2002.
VC++仿真 第3篇
数控插补轨迹仿真研究的目的是提高对插补算法、数控原理、数控系统软件的认识和理解,为从事数控系统维护及数控系统开发奠定基础。因此,数控插补轨迹仿真的研究方法与思路不论是对于高校学生学习数控技术课程,还是对准备进行数控系统软件开发的工程技术人员而言都具有积极意义。目前,也有学者进行了这方面的研究工作[1~3],但他们的研究主要是以直线插补为主,由于圆弧插补存在过象限问题,相较直线插补而言要复杂许多,因此上述研究文献甚少涉及圆弧插补,即使有所提及也语焉不详。有鉴于此,本文以VC++为工具,以数字积分插补法(DDA法)为例来讨论圆弧插补轨迹仿真的实现过程。
1 DDA圆弧插补的基本原理[4]
DDA法即数字积分法,它利用数字积分思想确定刀具沿各坐标轴的位移,使刀具沿着所加工的曲线进给。如图1所示的第一象限逆时针圆弧AB为例说明DDA圆弧插补原理。
图1所示圆弧以原点为圆心,圆的方程为:
将(1)式两边对时间t求导,可得动点P沿两个坐标轴的速度分量:
由(2)式可得坐标轴方向的微小位移增量:
据(3)式可写出第一象限逆圆加工时DDA插补表达式:
式中:Δt为插补周期,可取单位时间间隔1;n为插补次数。
由此,可得DDA圆弧插补的原理如图2所示。DDA圆弧插补的基本原理可描述为:每经过一个插补周期,数控系统发出一个控制脉冲,x、y坐标被积函数寄存器的内容被送入积分累加器中累加一次,如果有溢出,则相应坐标轴方向产生一个溢出脉冲,经伺服系统驱动进给机构走过一个脉冲当量;同时更新一次x或y被积函数寄存器的值(加1或减1)。
2 VC++编程仿真DDA圆弧插补
为方便地查看DDA圆弧轨迹插补的过程,在VC++中采用了单文档结构建立插补仿真软件工程,插补过程的主要程序是在该工程视类的绘图函数On Draw()中实现的,其VC++程序的主要流程如图3所示。
程序流程中一些主要问题说明如下:
圆弧的起、终点及圆心坐标等是通过一个对话框类采用编辑框控件变量由用户输入内存的,为了便于这些变量在各函数间的使用,将它们设置成全局变量,在需要用到的函数中通过外部变量extern方式引入。
定义画笔并将画笔选入设备描述表中的目的是为轨迹插补绘图准备绘线工具。
比例因子的引入和计算插补步长是为了实现插补图形的实时缩放。其基本思路是:通过设置函数On Mouse Wheel()来捕捉鼠标滚轮的滚动情况,滚轮每顺或逆时针滚动一次时比例因子被赋值为2或0.5,然后用该比例因子乘以圆弧的起、终点及圆心坐标并把它们作为外部变量引入On Draw()绘图函数,当使用者滚动鼠标滚轮时实现图形的自动缩放;将已放大或缩小的圆弧坐标值除以圆弧坐标原值可得插补步长,这样就可以使插补步长匹配缩放之后的图形。
为简化起见,插补轨迹的VC++程序是按照圆弧的圆心都在坐标原点来编写的。因此,不论待插补的圆弧圆心是否在坐标原点,都通过坐标变换的方法使圆心位于坐标原点上。坐标变换的具体方法是:将圆弧的起终点、圆心坐标均减去圆心相应方向坐标。需要注意的是:每一步插补计算完毕后在窗口中绘制插补轨迹时,需要将相应方向的圆心坐标加回来,这样才能显示出插补轨迹的正确位置。
计算圆弧起、终点与坐标轴夹角的正余旋值(sinαq、cosαq、sinαz、cosαz)是为了后续判断圆弧起终点象限之用,因为不同象限插补的方法有所差异。
插补变量的初始化主要包括:定义插补所需被积函数寄存器、积分累加器等变量,对被积函数寄存器变量赋初值和对积分累加器变量清零等。计算插补寄存器容量是为了判断积分累加器在累加过程中是否有溢出,当积分累加器中的值大于等于插补寄存器容量时会在某一坐标方向上进给一步。
图3中主要列出的是DDA圆弧插补VC++程序的前期准备部分,当判断是顺圆或逆圆插补后才转入具体的圆弧插补程序,其程序流程如图4所示。
这里以逆圆,经坐标变换后的起点在第一象限、终点在第二象限的单步插补为例说明程序编制方法,其VC++主要程序代码如下:
DDA圆弧插补程序中的四点说明:
1)上面只给出了逆圆第一象限为起点,第二象限为终点的VC++程序,顺圆插补和其它象限的情况类似处理。图4中第n、n+1、n+2象限的数量由圆弧起终点是否跨象限和跨象限的数量决定。
2)圆弧插补中跨象限问题的处理是采用拆分圆弧的方法,程序中体现在作为for循环结束判据的x、y坐标的变化上。当跨象限时,一个坐标为0,另一个坐标的绝对值为圆弧半径。
3)在图4的程序流程和上面的程序代码中可以看到:不论x、y坐标是否等于第n象限的终点坐标,不论累加是否有溢出均执行了插补一步的“dc.Line To((x+oyxx),(y+oyxy))”程序段。这是因为当x、y坐标等于第n象限的终点坐标或累加没有溢出时,插补这一步的起终点坐标相同,不会有实际的画笔移动,因此不会出现插补错误。
4)上面给出的是单步插补轨迹显示程序,对于连续插补的情况与上述程序基本相同,不同的是:去掉“if(i==mmm)break;”等语句。
3 插补仿真实例
当圆弧起、终点和圆心坐标(单位:象素)分别为(4,5)、(-12,-3)、(-2,-3)时的插补轨迹如图5所示。为了明确插补过程,在插补轨迹的右边还通过一个弹出式列表框显示出了每一步的坐标值和进给方向等信息。
4 结束语
采用开发的DDA圆弧插补轨迹仿真软件可以方便地实现圆弧插补的单步或连续轨迹显示,增强了插补的直观性。同时,VC++编程实现插补仿真的过程与数控系统实现插补的过程在原理、方法上有相通之处,这有利于更好地理解数控插补原理,对维护、开发数控系统软件也有一定的借鉴意义。
摘要:本文在分析DDA圆弧插补基本原理及其插补算法的基础上,介绍了采用VC++编程实现DDA圆弧插补轨迹仿真的方法与步骤,给出了VC++插补流程和部分程序代码,实现了插补轨迹的可视化,为学习和研究数控插补原理提供了帮助。
关键词:DDA圆弧插补,仿真,VC++
参考文献
[1]钟建琳,陈秀梅,马振,等.教学用数控插补仿真系统[J].机械设计与制造,2003,(03):62-64.
[2]凡进军,刘让贤,郭紫贵,等.基于VC++数控插补仿真的研究[J].机械工程师,2010,(5):88-90.
[3]侯运鑫,张桂香,高玉龙等.基于C++Builder的数控插补动态仿真[J].山东理工大学学报(自然科学版),2009,23(03):51-54.
VC++仿真 第4篇
MATLAB是美国MathWorks公司推出的一套功能非常强大的商业数学软件,是一款将数值分析、矩阵计算、信号处理、图形显示和电子仿真等结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。但MATLAB解释性语言执行效率低,局限于MATLAB环境而不利于商业开发,源代码公开不利于算法与数据的保密性等,大大限制了它的执行速度和推广应用[1]。
Visual C++(简称VC)是Microsoft公司推出的当前主流的强大可视化集成编程环境,开发环境强大,开发的程序执行速度快,几乎可以开发从底层软件到直接面向用户的各个方面的软件。但在科学计算函数库方面显得不够丰富,读取、显示数据图形不方便[2]。
MATLAB的应用程序界面开发功能远不如VC方便强大,VC在工程计算方面则要比MATLAB繁琐得多。因此实现MATLAB和VC的混合编程,可以充分利用MATLAB强大的科学计算功能和丰富的工具箱,开发出高效、实用的程序,为科研工作和工程开发提供强大的技术支持[3,4]。
本文通过MATLAB的编译器将MATLAB函数编译成可以脱离MATLAB环境的动态链接库,然后在VC环境中编写应用程序界面并加载调用动态连接库,实现了MATLAB的数学函数与VC的无缝连接。以显示时滞混沌系统的图形为例,对MATLAB图形结果显示做了初步研究,实现了MATLAB图形在VC中的调用。
1 在MATLAB环境下的函数编写和编译操作
1.1 编写MATLAB函数文件(m文件)
为了说明问题,以绘制时滞混沌系统的时间历程图和相图为例,本文选取了直接绘制图形和通过函数参数传递绘制图形两类情况。首先在MATLAB环境下编写相关的函数和子函数文件。
(1)第一类:直接绘制图形
已知时滞值tau的时滞混沌系统的时间历程图和相图[5]的dde_lv.m函数文件,程序如下:
(2)第二类:通过函数参数传递绘制图形
可变时滞值tau的时滞混沌系统的时间历程图和相图的dde_phd.m函数文件,程序如下:
其中,dde_lvf子函数文件同上。
1.2 对MATLAB编译环境进行设置
在MATLAB环境中运行mex setup命令,按屏幕提示选择有关选项,此处选编译器为Microsoft Visual C/C++version6.0 in C:Program FilesMicrosoft Visual Studio,路径按实际情况选择。然后在MATLAB环境中运行mbuild setup命令,设置方法同上。
1.3 利用MATLAB提供的mcc编译器命令将m文件转换成动态链接库
(1)第一类情况在MATLAB环境中的运行
其中生成的文件中只有三个文件:hrp.dll、hrp.h、hrp.lib有用,hrp为编译后文件的名字。
(2)第二类情况在MATLAB环境中的运行
其中共生成13个文件:dde_phd.cpp、dde_phd.hpp、dde_lvf.cpp、dde_lvf.hpp、dde_phd_mainhg.cpp、subplot.cpp、subplot.hpp、xlabel.cpp、xlabel.hpp、ylabel.cpp、ylabel.hpp、zlabel.cpp、zlabel.hpp.
2 在VC中调用MATLAB数学函数库,实现混合编程
第一步:用VC建立相应类型的工程(MFCAppwizard(exe)(单文档)),文件名为yanshi,生成了相应的源文件和头文件。
第二步:在VC的编译环境下进行设置。
(1)选择菜单Tools-Options-在属性页中选择Directories-下拉框中选择IncludeFiles,在其最后加入c:MATLAB6P5EXTERNINCLUDECPP。
其中c:MATLAB6P5为MATLAB的安装路径。再在下拉框中选择LibraryFiles,在最后加入c:MATLAB6P5EX-TERNLIBWIN32MICROSOFTMSVC60。
c:MATLAB6P5EXTERNLIBWIN32该步设置结束,以后就不用再设置。
(2)选择菜单Project-Settings-属性页Link-下拉列表中选择Input,在Object/librarymodules文本框中加入libmmfile.lib、libmatlb.lib、libmx.lib、libmat.lib、libmatpm.lib、sgl.lib、libmwsglm.lib、libmwservices.lib,然后在IgnoreLibraries中加入msvcrt.lib。
(3)选择C/C++属性页,在下拉列表中选择Preprocessor,在Preprocessordefinitions中加入MSVC、IBMPC、MSWIND,再在下拉框中选择PrecompliedHeaders,选中Automatic use of precompiled headers,在其中填入stdafx.h。
第三步:把MATLAB环境编译生成的文件复制,添加到VC程序根目录下。
(1)选择菜单Project-Settings-属性页Link-下拉列表中选择Input,在Object/librarymodules文本框中加入hrp.lib。
(2)把生成的三个文件中的hrp.h文件加入到当前工程中,以及生成的13个文件中的所有cpp文件加入到当前工程中。
第四步:编写代码,加入头文件。
建立菜单ID_hrs、对话框IDD_hrs(建立对应的对话框类Chrs,通过点击按钮显示图形)。
(1)MainFrm.cpp中加入头文件:#include"hrs.h",然后在函数中添加如下代码:
(2)在主对话框中添加显示图形按钮Button1(显示直接绘制图形),并添加按钮的相应函数OnButton1,在按钮响应函数所在文件hrs.cpp中添加如下头文件代码:#include"hrp.h",然后在按钮响应函数中添加代码:
对不同m文件生成的lib文件名不一样,那么OnButton1中间的3句代码也不一样,可以查看相应的hrp.h文件写出相应的3句代码。
(3)在主对话框中添加显示图形按钮Button2(通过参数传递绘制图形),并添加按钮的相应函数OnButton2;再添加时滞值输入编辑框,并在Member Variables为其添加成员函数m_edit1(value float),最后在按钮响应函数所在文件中添加如下头文件代码:#include"dde_phd.h",并在按钮响应函数中添加如下代码:
第五步:编译连接成可执行文件,运行程序。
经VC编译器编译连接生成可执行文件,点击按钮Button1直接显示时滞混沌系统图形,或者在编辑框输入参数,点击按钮Button2后图形即可显示,即实现了时滞混沌系统的图形仿真处理。
3 结束语
MATLAB是工程人员常用的编程语言,但m文件不能脱离MATLAB这个应用程序环境,从而大大制约了程序的可移植性和通用性。本文采用目前较为流行的VC应用程序开发环境完成图形界面设计、数据管理操作。首先利用MATLAB数学库完成软件核心算法设计,很大程度上降低了编程难度和工作量,然后利用编译器调用MATLAB动态连接库,实现了m文件在其他编程环境中的编译与运行,大大提高了程序的执行效率,更极大拓展了MATLAB的应用范围。通过MATLAB与VC混合编程只需很少的程序即可实现复杂的功能,不但算法简单,而且节省了内存资源,在很大程度上降低了软件开发的难度和工作量。故这种方法在开发大型软件时优势更明显,具有很大的实用性和可操作性。
参考文献
[1]张志涌.精通MATLAB[M].北京:北京航空航天大学出版社,2000.
[2]贺淮清,刘浩翰,郭航.Visual C++的使用及面向对象软件工程实例分析[M].北京:电子工业出版社,2007.
[3]郭虹,薄云飞,林冬.VC++与MATLAB混合编程技术研究[J].计算机工程,2002,28(9):269-271.
[4]鲁强,孔英会.MATLAB与Visual C++混合编程的实现[J].现代电子技术,2003,(1):27-28.