摘要:为简化起重机动态特性分析的难度,加快动特性分析速度,采用Visual C++编译器里的核心类集MFC来绘制可视化窗口,并编写C++程序调用MATLAB函数来精确的求解门、桥式起重机动态系统模型,实现VC++与MATLAB的协同合作,完成起升动态性的自动分析,并通过两个例子论证了该自动分析的可行性。
关键词:Visual C++;MATLAB;协同技术;自动分析;门、桥式起重机;动态特性;弹性
中图分类号:TH21;TP29
Abstract:To realize the collaboration between Visual C++ and MATLAB,and achieve the automatic analysis on the dynamic of lifting for the purpose of reducing the difficult of the analysis and acceleratting the speed of the analysis,we draw a visual windows by the MFC which is heart classes of the VC++ and solve the dynamic model of the door or bridge cranes by the MATLAB function which called by the C++ source program.And uesd two instances to prove its practicability.
Key words:Visual C++;MATLAB;Collaborative Simulation; Automatic Analysis;Bridge Door Cranes;Dynamic Properties;Elastic
0 前言
Visual C++(简称VC++)是以MFC为核心的开发效率最高的面向对象的开发环境。使用MFC类库和VC++提供的高度可视的应用程序开发工具,可使应用程序开发变得更简单,极大地缩短开发周期,提高代码的可靠性、可重用性以及安全性,并且能脱离编程环境运行,操作者不需了解编程便可很容易的使用。但是在工程计算上,其编程相当不方便,并且也不能很好的绘制数学图形。
MATLAB是矩阵实验室(Matrix Laboratory)的简称,它在数学类科技应用软件中在数值计算方面首屈一指。它集科学计算、图形处理、自动控制、信号处理、神经网络于一体,是目前在工程中使用极为广泛的软件。但它也存在一些缺陷:数学函数过多,需要操作者掌握一定的编程技术;界面开发能力较差;使用的是解释性语言,大大限制了它的执行速度;源代码的公开不利于算法和数据的保密;局限于MATLAB 运行环境而不能用于开发商用软件。
如果把VC++与MATLAB相互结合,把MATLAB加入到VC++的程序中,将大大的减少编程的工作量,提高软件开发和执行效率,并且能增强VC++处理科学计算、图形处理、自动控制等方面的能力,充分发挥VC++开发界面、发送控制信息的优越性,以及MATLAB强大的科学计算等能力,从而实现对目标对象的自动分析技术。该自动分析技术也可以为科学研究和工程技术提供更强的技术支持。
1 VC++与MATLAB协作的几种方法
1.1 在VC++中实现MATLAB可执行程序
采用MATLAB命令mcc可以将MATLAB程序编译成mex程序,而采用mex命令可以将C/C++或FORTRAN程序编译成mex程序。采用编译器可以比较好的隐藏代码和算法,提高保密性。该方法是在VC中创建一个DLL工程,然后在MATLAB的Command Window中调用该动态文件。该方法并没有充分发挥出MATLAB的功能,没有解决MATLAB软件的可视化能力,也没用发挥出VC++的强大功能。
1.2 在VC++中调用MATLAB数学库
该方法是利用mcc命令将*.m文件转换成*.cpp和*.hpp文件,并把生成的文件包含到VC++项目中,由VC++来执行。该方法能够脱离MATLAB环境而独立运行程序,可以发布给没有MATLAB的用户使用。然而,它不能使用MATLAB的函数eval()和input(),不能调用图形句柄系统的函数,不能调用MATLAB工具箱的函数等,这使MATLAB的使用受到了极大的限制。
1.3 在VC++中调用MATLAB引擎
MATLAB引擎是MATLAB提供的一组编程接口,通过引擎,其他编程环境(如VC++)可以使用MATLAB提供的计算和图形功能。使用引擎与VC++连接,可以充分发挥VC++在界面编写以及硬件访问等方面的优势,而比较复杂的信号处理、计算等任务则交由MATLAB完成,而运算结果可以交由VC++6.0继续使用。这种方法唯一的缺点就是不能脱离MATLAB环境运行,且运行速度较慢。因此,对于那些实时性要求不高,而数据处理任务较重的场合,使用MATLAB引擎确是一个比较好的方法,本文是利用该方法来实现自动分析。
2 自动分析的实现
2.1 模型建立并编写MATLAB程序
建立门式、桥式起重机模型[2][3],如图1所示:

图1 门式、桥式起重机弹性动力学模型 预张紧阶段时[2][3]的数学模型的MATLAB求解程序为: %求解微分方程,得出x10、x20的函数表达式,求解解时注意单位
s=dsolve('D2x10=-(k(1)+k(2))/M(1)*x10+k(2)/M(1)*x20','D2x20=k(2)/M(2)*x10-(k(2)+k(3))/M(2)*x20-k(3)*v/M(2)*t0','x10(0)=0','x20(0)=0','Dx10(0)=0','Dx20(0)=0','t0');
注意,这里得出来的结果均为字符表达式,必须把他们转换成常数表达式,才能进行计算。利用下面的语句能转换成常数表达式。
x10=eval(s.x10);
x20=eval(s.x20); %该语句的功能是将得出的结果转换成常数表达式
预张紧阶段结束条件的MATLAB求解程序为:
f=v*t0+x10+x20-M(3)*9.8/k(3);
t0=solve(f); %求解函数f(t),得出t0值。
x10=eval(s.x10);x20=eval(s.x20); %解出x10、x20值 起吊阶段时[2][3]的数学模型的MATLAB求解程序为: %求解系统固有频率,求解时注意单位
p1=M(1)*M(2)*M(3);
p2=M(2)*M(3)*k(1)+(M(1)+M(2))*M(3)*k(2)+(M(2)+M(3))*M(1)*k(3));
p3=(M(1)+M(2)+M(3))*k(2)*k(3)+(M(2)+M(3))*k(1)*k(3)+k(1)*k(2)*M(3);
p4=k(1)*k(2)*k(3);
p=[p1 -p2 p3 -p4];
omiga2=roots(p);
omiga=sqrt(omiga2);
上述代码实现了门式、桥式起重机动力学分析,可通过后续的VC++编程将它们以图形和文本的形式输出。
2.2 用Visual C++连接MATLAB 自动分析对话框的建立 创建名为model的MFC工程项目,并建立如图2所示的参数输入界面,完成相应的控件链接、图形链接。给“开始仿真”按钮控件创建一个控制函数,使其能实现协作分析,如OnButtonSimulation()。
在做界面实要注意:1.导入的图片像素必须低于256像素,本文是将图片打印再扫描,才能导入到VC++里面;2.在点选不同模型的单选控件时能让图片进行切换,方法之一是让该图片显示,其他图片隐藏;3.界面左上角的图标可以改成具有代表性的*.ico图标,在启用这个图标时,要注意把它的"file name"改成工程项目的名字,不然所生成的可执行文件没有图标。

图2 垂直无角度起升振动对话框 Visual C++环境设定 要实现Visual C++调用MATLAB引擎进行混合编程,需要几个MATLAB库:libeng.lib、libmx.lib、libmat.lib。这些库文件要通过动态链接库libeng.dll、libmx.dll、libmat.dll生成,它们存在于MATLAB\extern\include目录下。
上面已建好一个名为model的MFC工程项目,在该项目的菜单栏中选择Tool|Options菜单,打开Options窗口,选择Directories选项,在Show directories for下拉菜单中选择Include files,添加MATLAB中的includes文件夹(如D:\MATLAB7\EXTERN\INCLUDE)。
《廊坊师范学院学报(社会科学版)》
《黑龙江环境通报》
《青岛农业大学学报(社会科学版)》
编辑QQ
编辑联络
