电气电子教学学报
JOURNALOFEEE
Vol.28 No.3Jun.2006
基于MATLABengine的自动控制理论仿真实验设计
常 鸣1,袁 浩2,郝 莹2
(11天津大学 系统工程研究所,天津300072;21天津大学 自动化学院,天津300072)y
摘 要:介绍了一种通过采用MATLABengine函数进行数据传输的MATLAB与VC++联合编程的方法,并给出在/自动控制理论0仿真实验中的应用。这种方法用VC++设计前台用户界面,将MATLAB作为后台的计算与绘图引擎。因此无需学生掌握MATLAB语言的编程方法,就能达到仿真实验目的,掌握控制理论的关键知识点。关键词:自动控制理论;仿真实验;联合编程;MATLAB引擎中图分类号:TP39119;TP13;G434
文献标识码:B 文章编号:1008-0686(2006)03-0060-04
DesignofSimulationExperimentfor/AutomaticControlTheory0Based
onMATLABengine
CHANGMing1,YUANHao2,HAOYing2
(1.InstituteofSystemEngineering,TianjinUniversity,Tianjing300072;2.SchoolofAutomation,TianjinUniversity,Tianjin300072,China)
Abstract:ThispaperpresentsahybridprogrammingmethodbyusingMATLABenginefunctionstocom-bineMATLABandVC++,andprovidesanapplicationofsimulationexperimentforthe/AutomaticCon-trolTheory0course.Accordingtothismethod,VC++isusedtodevelopthegraphicaluserinterfaceandMATLABisconsideredasthecomputinganddrawingengines.Inthisway,studentswillgainthekeyknowledgefromtheexperimentwithoutmasteringtheMATLABprogramminglanguage.
Keywords:automaticcontroltheory;simulationexperiment;combinedprogramming;MATLABengine;
用。通过运用它所包含的TOOLBOX与SIMU-LINK工具,可以对各式各样的控制系统进行分析、设计、建模与计算,可以满足绝大多数的实验要求。然而,MATLAB等科学计算语言大都为专业人士设计,有其自身的规则或语法。若未经一段时间的摸索与学习,作为实验工具而言,一般的学生难以较好的掌握。因此须对学生进行适当的培训,才能使实验达到满意效果。
MATLAB作为一个开放的系统,提供了多种与其它高级语言的接口,通过这些接口可以搭成与外部程序的桥梁,进行数据传输,从而可以在高级语
0 引言
/自动控制理论0是自动化技术的基础,也是高等院校自动化类专业的核心课程。它研究的内容是对各种各样的控制系统建立数学模型、分析计算及控制校正,使其满足人们所要求的性能指标。自动控制理论不仅具有相当的理论深度,需要学习者有较好的数学基础,也需要大量实验的验证与仿真,使学生加深理解,掌握相关原理与方法。
目前,MATLAB作为流行的科学计算工具,在控制理论领域的仿真与设计上已经得到了广泛应
收稿日期:2006-02-17;修回日期:2006-06-03
y
作者简介:常 鸣(1982-),男,甘肃敦煌人,硕士生在读,从事交通系统工程与复杂网络的研究;
袁 浩(1959-),男,天津市人,高级实验师,实验室主任,从事自动控制与电力电子的教学与研究;郝 莹(1968-),女,山西新绛人,本科,工程师,从事计算机控制等实验室教学工作。第3期常 鸣等:基于MATLABengine的自动控制理论仿真实验设计
61
言编制的程序中调用MATLAB函数,实现MAT-LAB强大的计算与绘图功能,完成对实验系统的设计。笔者采用此种模式,利用VC++6.0与MAT-LAB6.5联合开发了自动控制理论仿真实验软件,并已投入实际的实验教学,达到了很好的效果。
为使C/C++语言能调用MATLAB,首先要通过engOpen命令打开engine库,然后将mxArray转换成在MATLAB中可操作的形式,这将分成两步完成:
(1)将mxArray转换成MATLAB可理解的形式,可以通过两种不同的方式。一种方式是用命令mxCreat来创建矩阵,之后用mxSetName对它们进行命名;另一种方式是选择将一个自定义的数据结构复制到mxArray中。需要注意的一点是MAT-LAB在存储矩阵时是按列序来保存的,而C/C++中是按行序来保存的,所以必须分清下标。(2)将矩阵放入MATLABengine的工作区中,可以用engPutVariable命令来完成(此时MAT-LAB已准备好接受命令了)。这些命令可以在普通C/C++语言命令中给出,但是要用engEvalString以字符串的形式传递给MATLAB。
以下是调用MATLABengine绘制根轨迹的一段程序,通过这个例子,可以清楚的看到MATLABengine的使用方法。用VisualC++创建一个基于对话框的应用程序,在对话框中设置Button控件OnRootdlg2draw1,在对话框.cpp文件中加入en-gine.h头文件。界面示图及代码如下:
voidCRootDlg2JOnRootdlg2draw1(){
Engine*ep; mxArray*a,*b;
M定义一个MATLABengine对象M在MATLAB中定义矩阵变量a,b函分子多项式0s2+1s+2系数
doubleBXX[3]={1,2,3}; M在c++中定义数组表示开环传
函分母多项式s2+2s+3系数
if(!(ep=engOpen(\"\\0\"))) {
fprintf(stderr,\"\\nCan'tstartMATLABengine\\n\"); exit(-1);
1 用MATLABengine实现仿真功能
通过MATLAB所提供的engine函数即可实
现C/C++语言对MATLAB的调用。MATALBengine函数库是MATLAB提供的一系列程序的集合,它允许用户在自己的应用程序中对MATLAB函数进行调用,将MATLAB作为一个计算引擎使用,让其在后台运行,即相当于在后台启动了一个MATLAB进程。MATLAB引擎函数库在用户程序与MATLAB进程之间起一个桥梁作用,完成数据交换和命令的传送。1.1 engine库函数
现将MATLAB中的engine库函数列在表1中,以便下文的叙述。
表1 MATLAB引擎库函数
函数engOpenengCloseengGetVariable
功 能
打开一个MATLAB计算引擎关闭一个MATLAB计算引擎
从MATLAB计算引擎得到一个MATLAB的矩阵
输送一个MATLAB矩阵到MATLAB计算引擎中
执行一条MATALB命令
创建一个缓冲区来储存MATLAB的文本输出
engPutVariableengEvalStringengOutputBuffer
doubleAXX[3]={0,1,2}; M在c++中定义数组表示开环传
MATLABengine也用到一些前缀为mx的接口函数,这些函数在介绍MEX文件编程的资料中有详细说明。在下面示例中将注明相关函数用法。1.2 通过C/C++调用engine的编程
图1 MATLAB引擎示例
62
电气电子教学学报 第28卷
} M启动MATLABengine,在本地启动,函数所带的参数字符
串为空,如果在网络中
M则需写出主机名,即engOpen(/主机名0)
M以上为第一部分创建矩阵,下面将数据传送到MATLABengine工作区去进行运算绘图
a=mxCreateDoubleMatrix(1,3,mxREAL);
b=mxCreateDoubleMatrix(1,3,mxREAL);
M申明a,b变量为1@3的矩阵
memcpy((char*)mxGetPr(a),(char*)AXX,3*sizeof(doub-le));
memcpy((char*)mxGetPr(b),(char*)BXX,3*sizeof(doub-le));
engPutVariable(ep,\"a\a);engPutVariable(ep,\"b\b);
M这两条语句将矩阵a,b送到MATLAB工作区里
engEvalString(ep,\"sys=tf(a,b);rlocus(sys);\");
s+2的根轨迹M执行命令,绘制2
s+2s+3
mxDestroyArray(a);mxDestroyArray(b);engEvalString(ep,\"close\");
M执行MATLAB命令关闭所创建的窗口
engClose(ep);}
M退出MATLAB引擎
M销毁所创建的矩阵,释放内存M将定义的数组值赋给矩阵a,b
(3)同上,在source文件夹中加入libmx.lib,libmat.lib,libeng.lib三个文件,它们在$MATLAB\\extern\\lib\\win32\\microsoft\\msvc60目录下能找到。
(4)在project-〉setting中的link项中写入\"libmat.liblibmx.liblibeng.lib\"。
(5)将libmx.lib,libmat.lib,libeng.lib,engine.h等文件复制到VC++所创建的对话框工程目录下。
经过以上几个步骤即可在VisualC++环境中调用MATLABengine。根据实验设计要求,如图3、图4所示,还可以通过用编辑框采集由用户输入的数据参数,或同时绘制几条相关曲线进行比较。只要熟悉VisualC++和MATLAB的基本命令即可实现上述功能,限于篇幅,具体方法在此不再赘述。其中engine函数的调用与上述示例类似。
图2为输出图形。
图3 由用户给定参数实例
图2 通过MATLABengine绘制出的根轨迹图形
需要说明的是,上面所运用的engine函数和指令都是基于MATLAB6.5版的,与之前版本中的个别函数有所不同。另外,在运用VisualC++进行engine调用时,还必须对运行环境进行如下设置:
(1)在所需调用MATLAB的.cpp文件开头加入#include\"engine.h\"。
(2)在VC左侧Workspace窗口中FileView子项文件树的headerfiles文件夹中加入engine.h头文件,它在$MATLAB\\extern\\include目录下。图4 不同曲线的比较显示
(下转第94页)
94
电气电子教学学报 第28卷
T450、T451为PLC内部的软继电器,不存在触点、线圈失效故障,从而提高了系统的可靠性。
4 结束语
PLC中的计时器与触点式继电器相比具有计时准确、动作无误、触点数目无限制的特点。在机床电气控制中,可用来组成时间互锁器,改善控制效果,实现无速度继电器的反接制动,对系统各组成部分实行监控等多种控制功能,使电气自动控制变得方便简洁、可靠。若能适时地指导学生对于实际问题采用不同的方法去处理,这样既能拓宽学生的知识面,又能激发学生学习的积极性,对学生的创新精神的培养具有较大的促进作用。参考文献:
图7 PLC控制梯形图
犜450的常闭触点接通Q430,电机在/v0状态下运行。这样就保证了/Y-v0的切换是在电机/无电0的状态下进行,且这两个动作有时间差,避免了KM2在电机带电情况下断电拉弧,时间继电器(上接第62页常鸣等文)
[1] 秦曾煌1电工学(上册,第六版)[M]1北京:高等教育出版社,
2004
[2] 张凤珊1电气控制及可编程序控制器[M]1北京:中国轻工业
出版社,1994
计算与绘图,其效率远高于用高级语言开发自己的算法。因此,这种联合编程方式在实验教学领域值得广泛地推广。参考文献:
[1] 张志涌1精通MATALB6.5版教程[M]1北京:北京航空航天
大学出版社,2003
[2] 飞思科技产品研发中心1MATALB6.5应用程序接口编程
[M]1北京:电子工业出版社,2003
[3] (美)小克鲁格林斯基(Kruglinski,D.J.)著1VisualC++技
术内幕[M]1潘爱民,王国印译1北京:清华大学出版社,1998
2 小结
该实验软件已经在两个年级的本科生相关课程的教学中得到应用,反应良好。运用MATLAB与高级语言进行联合编程,可以充分发挥二者在各自领域的优势,采用当前流行的面向对象编程工具可以方便地编写出友好的实验界面,进行数据采集与交互;而运用MATLABengine等接口技术,可以让MATLAB在后台充当计算引擎,进行数据的分析、(上接第86页唐永红等文)
因而按照程序设计语言课程特点,适应时代的需要,需不断探索适合培养学生创新思维能力的实验教学方法。参考文献:
[1] 谭浩强1C语言程序设计(第二版)[M]1北京:清华大学出版
社,1999
[2] 梁力1程序设计基础与C语言[M]1西安:西安电子科技大学
出版社,2001
[3] 刘振安1C语言实践[M]1西安:西安电子科技大学出版社,
1995
6 结束语
随着计算机软件技术的日新月异,社会对软件技术人才也日益需要。对于当代大学生,无论是计算机或是非计算机专业的学生都应具备一定的程序设计能力。学会一种计算机语言,掌握编程思想,对于学习其它计算机语言可以起到触类旁通的作用。而学习计算机语言课程当然离不开上机实践环节,否则只是纸上谈兵,只有通过实践,才能真正的学会使用语言来解决各种实际问题,并开发出新产品。
因篇幅问题不能全部显示,请点此查看更多更全内容