一、借助 ActiveX部件

Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用。

Matlab ActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令,以及直接从工作空间存取矩阵等,下面列出了Matlab自动化服务支持的几个主要方法,其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述:

● BSTR Execute([in] BSTR Command);
BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。
● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(doubl
e)* pr,[in, out] SAFEARRAY(double)* pi);
该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和虚部被分别存放到两个单独的Double型数组中。
● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi);
该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。

示例代码如下:
1 Dim Matlab As Object ’声明对象
2 Dim MReal1(55) As Double ’声明存放实部的Double型数组
3 Dim MImag() As Double ’声明存放虚部的Double型数组
4 Set Matlab=CreateObject(“Matlab.Application”) '初始化对象
5 Matlab.Execute(“a=hilb(5)”) '执行Matlab命令
6 Call Matlab.GetFullMatrix(“a”,“base”MReal1,MImag) '将结果分别存入实部、虚部数组
复制代码
二、借助DDE技术

DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端(Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab作为服务器时与其他应用程序的通信机制。



其中,DDE功能函数既可以由应用程序提供,也可以由Matlab引擎库提供。
初始化会话时,客户端应用程序必须指定两个参数service name(服务器应用程序的名称)和topic(会话主题)。

下面的示例说明了VB与Matlab建立并完成DDE会话的全过程:
7
8 说明: TextInput是输入文本框,TextOutput是输出文本框。在TextInput中输入Matlab命令回车后,由Matlab在后台执行并将结果返回给TextOutput显示。
9 Sub TextInput_KeyPress(KeyAscii As Integer)
10 If KeyAscii = vbKeyReturn then’初始化TextInputMatlab间的DDE会话
11 TextInput.LinkMode = vbLinkNone
12 TextInput.LinkTopic = “MATLAB|Engine”
13 TextInput.LinkItem =“EngEvalString”
14 TextInput.LinkMode = vbLinkManual
15 szCommand = TextInput.Text’执行Matlab命令
16 TextInput.LinkExecute szCommand
17 TextInput.LinkMode = vbLinkNone’初始化TextOutputMatlab间的DDE会话
18 TextOutput.LinkMode = vbLinkNone
19 TextOutput.LinkTopic = “MATLAB|Engine”
20 TextOutput.LinkItem =“EngStringResult”
21 TextOutput.LinkMode = vbLinkManual’返回执行结果并显示
22 TextOutput.LinkRequest
23 TextOutput.LinkMode = vbLinkNone
24 End If
25 End Sub
复制代码
三、通过M文件

Matlab产生的M文件不能直接在VB中调用,可利用mcc将M文件直接编译成.EXE文件,然后在VB中声明下面三个API函数,最后使用Shell命令即可实现VB与Matlab的无缝集成。
1. 用mcc生成独立的外部应用程序。可使用如下两种命令
mcc -p file.m 或 mcc -m file.m

2. 在VB中声明调用的三个API函数:
● Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
● Declare Function CloseHandle Lib “kernel32”(ByVal hObject As Long) As Long
● Declare Function OpenProcess Lib “kernel32”(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long

3. 示例代码array在vb什么意思啊
26
27 Dim lTask As Long, lret As Long, lHandle As Long’执行文件
28 lTask = Shell(“”, vbNormalFocus)
29 lHandle = OpenProcess(SYNCHRONIZE, False, lTask)’等待进程执行完毕
30 lret = WaitForSingleObject(lHandle, INFINITE)
31 lret = CloseHandle(lHandle)’ 文件执行完毕后,继续执行应用程序
32 ……
复制代码
通过以上编码,应用程序可以在执行过程中调用.EXE完成特定的计算或图形功能后,再继续其执行过程,从而实现与Matlab的集成。

四、引入MatrixVB

MatrixVB是MathWorks针对VB提供的一个Matlab库,它提供了600多个函数,包括基本的数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能等,为VB提供了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难。

MatrixVB是一个独立的产品(可以从www.mathworks得到),其使用十分方便。MatrixVB安装完成后,只需在VB工程中引用Mmatrix即可。

工业生产中经常需要对采集到的原始信号进行分析,并对分析结果进行实时的图形化显示,下面通过在VB中引用Mmatrix来实现这一功能。示例代码如下:
33
34 Dim ax as Variant ’声明坐标轴
35 Private Sub Form_Resize()
36 vbrefresh ax ’刷新坐标轴
37 End Sub
38 Private Sub Form_Load()
39 ax = vbaxes(Form1.hWnd) ’将坐标轴置于窗体
40 Call Form_Resize
41 End Sub
42 Private Sub Command1-Click()
43 Dim IC As Matrix ’声明向量
44 Dim m As Integer
45 从数据库中取原始信号存入一维向量I,取其对应的碳含量存入一维向量C
46 ’m为向量IC的元素个数
47 Call Icheck ( I , C , m ) ’调用校正函数
48 End Sub
49 Private Sub Icheck (I As Variant, C As Variant, ByVal m As Integer)
50 Dim IICCZ As Matrix
51 Dim a0a1a2 As Double
52 II = zeros(m1)
53 CC = zeros(m1)
54 II(colon(1m)) = I(colon(1m))
55 CC(colon(1m)) =C(colon(1m))’多项式拟和求解
56 Z = polyfit ( II, CC, 2 ) ’2 说明用二项式拟和
57 a0= Z.r1(1) ’a0为二次项系数
58 a1= Z.r1(2) ’a1为一次项系数
59 a2= Z.r1(3) ’a20次项系数
60 Clear axes ’清除坐标轴
61 T = Sort ( II ) ’对原始信号排序,以确定作图区间
62 J = Linspace (T(1).r1(1)T(1).r(m)20) ’横坐标向量
63 Cuv = plus (plus (times (a0times (XX) ),
64 times (a1X) )a2) ’纵坐标向量
65 Tmp = plot (JCuv) ’绘制曲线
66 Hold (“on”)
67 Tmp = plot (II, CC“r.”) ’绘制点
68 Hold (“off”)
69 End Sub
复制代码
执行以上代码,结果如图2所示:




总 结

以上几种方法对于Matlab与VB的集成都是行之有效的,但在实际应用中究竟采用哪一种方式应视具体情况而定。前两种方式比较适合Client/Server模式,后两种方式则应视应用系统的具体要求来做选择,相比较而言,借助M文件在执行效率上略高一筹,而引入MatrixV
B在使用上更为方便。总而言之,Matlab与VB集成可大大提高开发效率,对于解决工程问题是十分有意义的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。