打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Visual C ++ 调用MATLAB的方法及其应用

摘要:介绍了MATLABengine的用途、主要库函数及VC调用MATLAB engine的详细步骤。利用这项技术,精确故障定位综合软件实现了以VC编写主界面,调用MATLAB完成故障分析和波形显示的功能,从而缩短了程序开发周期,减少了程序员的工作量。最后简单介绍了该软件的其它功能。

关键词:Visual C++;MATLABengine;精确故障定位

 

MATLAB是美国MathWorks公司自80年代中期推出的数学软件,它在矩阵运算、二维和三维图形的绘制、数值拟合等方面均有极强的功能,已被广泛运用于数字信号处理、电力系统仿真等各个领域。MATLAB的突出特点是简洁,它利用其丰富的函数资源,给用户带来最直观、最简洁的程序开发环境[2]

Visual C++是Microsoft公司推出的可视化编程环境,它是目前综合性最高、最强大、也是最复杂的软件开发工具之一,应用极为广泛[1]

精确故障定位综合软件是为多端信号输电线路故障精确定位系统所设计的,它实现的主要功能为:

(1) GPS同步循环采样;

(2) 嵌入超级终端应用程序,通过MODEM实现输电线路双端采样信号的传输;

(3) 分析故障数据,判断故障相别,精确定位故障点位置;

(4) 根据采样数据绘制故障电压、电流波形以及各相电压、电流的频谱图。

本软件的主界面是采用VC编写,而分析计算故障点位置及波形显示等功能由MATLAB实现。VC的图形界面编程能力强大,菜单、工具条、快捷方式等实现起来很简单,并且生成的应用程序可脱离VC编译环境独立运行,但要完成数学计算功能如傅立叶变换等就需用户自己编写函数,繁琐不便。而MATLAB有丰富的函数资源供用户直接调用,且其绘图功能强大,较之VC其语言更为简洁明了,并且生成的图形可轻松实现多种功能,诸如图形添加文字说明、缩放、旋转、坐标轴标注、曲线说明等,这些若由VC来实现将极为复杂。MATLAB也有不足之处,比如它不能脱离其编译环境运行,其次是它虽有界面编写功能,但对于一个综合性的软件来说其界面尚显简单粗糙,也不及VC编写直接快捷。因此可各取VC与MATLAB所长,这就涉及到如何在VC中调用MATLAB的问题。

1  关于MATLAB engine

1.1  MATLAB engine简介

MATLAB engine是其它编程语言如C、Fortran与MATLAB的应用程序接口,通过该接口,我们可以从自己的程序中调用MATLAB来完成计算等功能。比如,若要在自己的程序中完成矩阵计算、求逆、LU分解或是进行傅立叶变换时,利用C语言编程可能很复杂,而MATLAB是以矩阵和向量为基本数据单位的,且有丰富的库函数,调用MATLABengine来完成这些功能会很容易。再比如,要编制一个雷达信号分析综合软件,可用VC作前台界面,而将分析计算等功能放在后台的MATLAB中完成,这样可缩短程序开发周期。

MATLAB engine可作为程序中一个独立的过程在后台运行,这种特性有如下优点:

(1) 在UNIX上,MATLAB engine可运行在我们自己的计算机上,也可运行在工作站内任意一台机上,即便二者机型不同。这样,我们就可实现用户与工作站的接口并在工作站内速度较快的计算机上实现运算功能。

(2) 在使用MATLAB engine时,我们的程序只需与较小的engine库连接,而不必要与整个MATLAB相连,从而节省内存空间。

1.2  MATLAB engine库函数

MATLAB engine库中主要函数如下,这里只是粗略介绍,未涉及到在UNIX中的应用。具体例子可参考Matlab/extern/examples下engwindemo.c(windows)。

(1) engOpen

作用:启动MATLAB engine。

语法:

#include“engine.h”

Engine * engOpen(const char* startcmd);

其中,startcmd为一字符串,用于启动MATLAB过程。在Windows中,startcmd必须为NULL.

返回值:

为一指向Engine句柄的指针。

说明:

在PC机的Windows操作系统下,engOpen实质上打开了一个通往MATLAB的ActiveX通道。MATLAB5.3版支持ActiveX Automation,即允许1个应用程序(控制端)去控制另1个应用程序(服务端)的服务器协议。MATLAB安装完毕后,在DOS命令下键入:matlab/regserver,即可在Windows的注册表中登录关于MATLAB的ActiveX项。

(2) engClose

作用:退出MATLAB engine。

语法:

#include“engine.h”

int engClose(Engine * ep);

其中,ep是指向Engine的指针。

说明:

engClose发出退出MATLAB命令,成功返回时其值为0,否则为1。

(3) engEvalString

作用:执行表达式中的字符串命令。

语法:

#include“engine.h”

int engEvalString(Engine *ep,const char * string);

其中,ep是指向engine的指针,string是命令字符串,凡可在MATLAB命令窗口中执行的命令均可以字符串形式执行。例如,绘制0~2π间的正弦曲线,可用如下命令:

engEvalString(ep,”x=0:0.01:2 * pi;y=sin(x);plot(x,y);”);

(4) engGetArray

作用:从MATLAB engine工作空间内拷贝变量值。

语法:

#include“engine.h”

mxArray * engGetArray(Engine* ep,const char * name);

其中,ep为指向engine的指针,name是从engine中得到的mxArray名。

说明:

engGetArray 从ep所指向的engine中读取mxArray变量,正确返回时其值为一指向新分配的mxArray类型结构的指针,否则为NULL.

(5) engPutArray

作用:将变量放入MATLAB engine的工作空间。

语法:

#include“engine.h”

int engPutArray(engine *ep,const mxArray * mp);

其中,ep为指向engine的指针,mp为指向mxArray的指针。

说明:

engPutArray将mxArray写入engineep。如果工作空间中mxArray不存在,则被创建。若有同名的mxArray存在,它将被一新的mxArray取代。

2  软件编写详细步骤

本软件编制的环境:

pwin98,VC++6.0,MATLAB5.3,假设VC与MATLAB均装在C盘下。

(1) 生成几个连接库文件

VC++要成功调用MATLABengine,还需要库文件的支持。

目录c:\Matlab\extern\include下有如下文件:libeng.def,libmx.def,libmat.def。

在DOS命令下生成如下库文件:

c:\>cd\Matlab\extern\include\

c:\Matlab\extern\include>lib/def:libeng.def/out:libeng.lib

同样,可生成libmat.lib,libmx.lib。

把生成的这三个库文件加入VC中的project->settings->link->object/librarymodules项。

(2) 编写.mat文件

在MATLAB编译环境下,生成函数文件[2]。例如,本软件中实现波形分析功能,绘电压波形时,从采样程序自动生成的故障数据文件中读取数据至矩阵C,abc三相电压分别对应于矩阵C的第一、二、三列,以电压为纵坐标,时间t为横坐标,于是用plot语句即可作出电压波形。电流、频谱图也可用同样的方法分别作出。图1为一m侧故障电压波形示例图。

 

 

(3) 生成VC主界面

VC的界面编写很容易,可加入菜单、快捷方式和工具条,并设计一新图标[1],如图2所示。

 

 

(4) 将(2)中生成的.M文件加入VC工程中

利用engine可将(2)中生成的.M文件加入VC工程中。

首先,在调用engine的文件开头加入:#include“engine.h”。

其次,在CmainFrame的构造函数中加入如下代码:

Engine * ep;

if (!(ep=engOpen(NULL)))

MessageBox(“Can't start MATLAB engine”,NULL,MB_OK);

Return 0;

并在析构函数中加入代码:

engClose(ep)

而对应于菜单波形分析->电压波形,只需加入:

engEvalString(ep,“vv”)即可。

其中,vv是在第(2)步MATLAB中编制的绘电压图的函数文件。

其它如电流图、频谱图、故障分析功能的实现也与上述类似。

(5) 设置其它编译项

其它相关设置还包括:

在DOS命令下运行Matlab/regserver

Project->C/C++->Preprocessor->Preprocessordefinitions加上:MATLAB_MEX_FILE

Tools->Options->Directories

Include files添加:c:\Matlab\extern\include

Library files添加:c:\Matlab\extern\include

3  本软件其它功能

本软件还实现了采样、通讯等功能,现简要分述如下:

(1) 采样

由于本系统需在与输电线路相关的多端母线处采集电流、电压信号,并且这些信号必须是同时同步采集到的,故采用了基于GPS的同步采样。GPS的特点是可为全球各地随时提供一个高精度的时钟,并能保证各地之间的时间误差在1 μs以内,这样就保证了各端信号的同步[3]。采样程序是预先用C语言编制的,可将其在VC下生成可执行文件,再用SDK函数CreatProcess嵌入VC运行。

(2) 通讯

使用调制解调器(MODEM)通过通信通道,可实现输电线路各侧信号的交换。将Windows附件中的超级终端应用程序嵌入VC,运行时新建一连接,手动拨号即可实现信号传输与交换。

(3) 帮助

为方便用户的使用,本软件还编写了帮助文件,用户可通过目录和索引方便地查询软件运行环境、软件功能及各菜单项使用方法及用途等。

4  结束语

本软件实现了多端信号精确定位故障系统的功能。采用VC编制界面使得人机界面友好,操作简单方便,一目了然。而计算及绘图功能MATLAB由MATLAB后台运行,用户只需按照提示操作,比如在弹出的对话框中选择数据文件名即可看到需要的波形或故障分析结果。当然,本软件还有待进一步改进和完善。

 

 

 

参考文献

 

[1] Kate Gregory.白军,谭力,刘明辉译.Visual C++5开发使用手册.北京:机械工业出版社,1998.

[2] 张宜华.精通MATLAB 5.北京:清华大学出版社,1998.

[3] Qingwu Gong,Yunping Chen,Chengxue Zhang,Zhimei Wang.A Study ofthe Accurate Fault Location System for Transmission Line Using Multi TerminalSignals.Proceedings of IEEE PES Winter Meeting 2000.

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
转载:VC++与Matlab混合编程之引擎操作详解(2)引擎API详解
C 语言调用Matlab程序例子
MATLAB引擎方式函数库
【MATLAB与C的混合编程】之【C程序调用Matlab计算引擎】(1)
'MеtaTrader 4 和 MATLAB Engine 的交互(虚拟 MATLAB 机)'
VC++和Matlab(转)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服