您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Delphi与MATLAB数据接口方案初探
Delphi与MATLAB数据接口方案初探(2007-01-1516:17:56)最近初步接触delphi和matlab互调的问题,查阅了相关的文章.以下的方案不错,可是当中有一些小纰漏,所以还是费了我一番工夫调试.为了使后来者能省去不必要的过程,将原方案进行调整,并且程序均编译通过,现将内容奉上与大家共享,有不妥之处望见谅!版权属于原文作者!!一、基本思路Matlab输入数据的方法很多,其中利用M文件,直接把数据按元素列表方式引入Matlab工作内存方法,不仅语法简单,而且运行时只要输入文件名,Matlab就会自动按顺序执行M文件中的语句;Matlab数据输出的方法也有很多种,为了便于与Delphi应用程序接口,我们可以利用Matlab的指令Save输出数据。如指令Saveoutfile.datxy-ascii-double,可将变量x和y以16位ASCII码形式存入outfile.dat文件。基于上述matlab数据输入,输出的方法,我们可以利用M文件为中转,实现Delphi和Matlab的数据交换,当是要注意以下几点:(1)由于Matlab的基本数据单位是矩阵,所以在delphi应用程序中我们只有通过文件变量,将参与运算的数据输出成M文本文件,以创建和保存矩阵数据。(2)由于Delphi应用程序在前台运行,因此在应用程序中调用Windows函数WinExec,即可执行Matlab.exe。(3)由于M文件,只有在Matlab集成环境中才能被识别和自动执行,而根据后台的要求不能显示地进入Matlab集成环境,考虑到Matlab环境变量由matlabrc.m文件定义,因此我们可以通过对matlabrc.m文件的修改(将Matlab要完成的输入数据、进行计算、输出数据过程、编写成M文件,加入matlabrc.m中),从而实现Matlab的后台运作。二、Delphi如何将数据传递给Matlab这里举例说明更直观一些例:进行矩阵运算(b'*b)*(b'*y'),其中b是3*2矩阵,y是1*3矩阵。在Delphi应用程序中,可以采用以下的程序段将参与运算的矩阵b、y保存成M文件,这样Matlab就可以通过执行相应的M文件,获得参与运算的矩阵b、y。应用程序段如下:(程序段中fb、fy是事先定义好的textfile类型的文件变量,l是初值为1的整数,b、y是事先定义好的数组变量,存储用于构造矩阵的数值;'D:\matlab\yourfolder\delphioutb.m'是保存矩阵b的M文件路径及文件名,'D:\matlab\yourfolder\delphiouty.m'是保存矩阵y的M文件路径及文件名)*********创建保存矩阵b的M文件*********//注:在Matlab中整个输人矩阵必须以[]为其首尾,矩阵的行与行之间必须用分号;或回车位隔离,矩阵元素必须由逗号,或空格分离。assignfile(fb,'d:\matlab\yourfolder\delphioutb.m');Rewrite(Fb);write(fb,'b=[');l:=1;forj:=1to3dofori:=1to2doifi=1thenbeginWrite(Fb,b[l],',');l:=l+1;endelsebeginifj3thenbeginWrite(Fb,b[l],';');l:=l+1;endelsebeginWrite(Fb,b[l],']');l:=l+1;end;end;CloseFile(Fb);*********创建保存矩阵y的M文件*********assignfile(fy,'D:\matlab\yourfolder\delphiouty.m');Rewrite(Fy);write(fy,'y=[');fork:=1to3doifk3thenwrite(Fy,y[k],',')elsewrite(fy,y[k],']');CloseFile(Fy);三、Matlab如何接受应用程序传递来的数据并进行计算前面介绍过,由于M文件只有在Matlab集成环境中才能被识别和自动执行,而根据后台运作的要求不能显示地进人Matlab集成环境。但我们可以通过对matlabrc.m文件的修改,将Matlab要完成的操作编写成M文件,加人matlabrc.m中。下面笔者仍依前面例题的计算要求,来说明如何编写Matlab接收数据、进行计算、数据输出的M文件(取名为D:\matlab\yourfolder\Mymatlabfile.m).1、用记事本输入以下代码,保存在自己的目录(如D:\matlab\yourfolder)下,取名为Mymatlabfile.mdelphioutb//保存矩阵b的M文件delphiouty//保存矩阵y的M文件m=(b'*b)*(b'*y')saveD:\matlab\yourfolder\matlaboutfile.datm-ascii-doublequit2、将D:\matlab\toolbox\local\matlabrc.m首先保存为一个备份文件matlabrcbak.m,然后对原文件进行编辑,将下列语句加在文件最后:ifexist('D:\matlab\yourfolder\Mymatlabfile.m')Mymatlabfileend3、完成上述内容后,只要在应用程序中启动MATLAB,就会看到Matlab在启动后自动执行了Mymatlabfile文件,并且生成相应结果。四、在Delphi中如何启动Matlab将前面步骤处理完后,我们可以用以下程序隐式启动Matlab:在上一步中我们在原文件修改后加它另存D:\matlab\toolbox\local\Mymatlabrc.m文件,然后在delphi中输入以下语句:copyfile('D:\matlab\toolbox\Mymatlabrc.m','c:\matlab\toolbox\local\matlabrc.m',false);winexec('D:\matlab\bin\win32\matlab.exe',SW_MINIMIZE);实际过程就是先执行拷贝,将原来的matlabrc文件修改成我们期待的内容,然后执行matlab.五、Delphi如何接受Matlab输出结果Matlab将计算结果通过saveD:\matlab\yourfolder\matlaboutfile.datm-ascii-double进行输出,所以我们可以通过下面程序获取计算结果,并将结果通过mid放进delphi中添加的memo组件中:(Fa为textfle类型变量)ifFileExists('D:\matlab\yourfolder\matlaboutfile.dat')thenAssignFile(Fa,'D:\matlab\yourfolder\matlaboutfile.dat');Reset(Fa);memo1.Clear;WhilenotEof(Fa)dobeginreadln(Fa,mid);memo1.Lines.Add(mid);end;closefile(Fa);另外,在应用上述步骤完成接口后,还需要在应用程序中添加以下代码,以还原Matlab原始环境参数设定:copyfile('D:\matlab\toolbox\local\matlabrcbak.m','D:\matlab\toolbox\local\matlabrc.m',false);实际就是将备份的文件拷贝回来,以恢复matlabrc原来面目Delphi与MATLAB的数据接口方案探讨(2)(2007-01-1516:20:31)方案二基于DDE技术的动态数据交换一、基本思路方案一需要用文件形式来进行两者的数据传递,那么是否有两者直接数据传递的解决方案呢,答案是肯定的。我们知道DDE是基于Windows的一种消息机制,在客户机和服务器程序间通过互相传通消息进行“对话”,它允许两个或两个以上的应用程序之间进行实时的数据交换。根据这点,我们可以利用DDE来实现Delphi和matlab的数据传输。二、DDE应用协议DDE中提出对话的一方称为客户程序(client),而作出反应的一方称为服务器程序(server)。DDE服务器负责维护其他Windows程序所使用的数据,而DDE客户机则负责从服务器获取数据。应用程序之间的动态数据交换必须遵守DDE协议,DDE协议主要有三层,应用程序层(Application)、对话主题层(Topic)和对话项目层(Item),各层的定义分别为:1应用程序层(Application)应用程序层主要是建立对话的通道,DDE对话通常是由客户程序引起的,包括初始化有关参数、准备开始对话等。2对话主题层(Topic)对话主题是DDE服务器所能识别的数据单元,通常是一个文件名、窗体名,在Delph中还可以是Serverconv组件的名字、对于Matiab服务器,主题主要有两个:System和Engine,详见表一。3对话项目层(Item)对话项目层是用来确定客户程序和服务器程序进行动态数据交换的内容,如发送数据、接受数据或者数据库中的字段、表格中的单元等.在Delphi中应用程序中,就是DdeServerItem组件的名字。在Matlab中两个主题System和Engine分别包含有Systems,Format,Topics,EngEvalstring,EngSringResult,EngFigureResult等项目,在表一中可以查看详细情况.Madab和Delphi都支持DDE技术,既可以作为客户程序。又可以作为服务器程序、这里我们仅以Delph作为客户程序,Matlab作为服务器程序进行探讨,Delphi客户机通过DDE组件提供的函数与Matlab的DDE服务器模块进行对话,完成数据的动态交换.三、Delphi的DDE组件表1MatlabDDE服务器的组成System主题项目:功能:Systems包含System主题所支持的全部项目列表Format包含MatlabDDE服务器所支持的全部数据格式名的字符串列表Topics包含MatlabDDE服务器所支持的全部主题名的列表Engine主题项目:功能:EngEvalString发送命令到Matlab服务器中执行EngStringResult从Matlab服务器中请求获取文本格式的数据EngFigureResult从Matlab服务器中请求获取图形格式的数据matrix从Matlab服务器中请求获取矩阵数据Delphi提供了四个用于DDE的组件:Ddeclicntconv,Ddeclienlitem,Ddeserverconv和Ddeserverconv,其中前两个是用作客户程序,后两个是用作服务器程序.在将Delphi作为客户程序时,必须用到Ddeclientconv和Ddeclientitem组件、Ddeclientconv用于客户端同服务器建立对话和确立对话主题.重要的属性和方法有ConnectMode,Ddeservice,Ddetopic,Setlink,Pokedata.ExecuteMacro等:Ddeclientitem用于客户端注册对话项目常用的属性和方法有Ddeconv,Ddeltem,Lines,对话时与服务器程序密切相关,向服务器端发送的数据和从服务器端返回的数据往往都在于此组件的lines属性中。它们的具体用法和定义可以从Delphi帮助文件中查到。四、MatlabDDE服务器在将Matlab作为服务器访问时,必须提供服务器的名字、主题和项目.在Win32系统中,Matlab的DDE服务器名为Matlab,支持两个对话主题:System和Engine,每个主题下面有几个项目,通过它们可以完成不同的任务.从表一中可以查着其对应的功能.Madab作为服务器时,支持三种数据传输格式:文本格式、元文件图、XLTallle、其中文本格式用于存放空字符结尾的字符率数据格式.元文件图用于存放
本文标题:Delphi与MATLAB数据接口方案初探
链接地址:https://www.777doc.com/doc-2909190 .html