昨天回实验室,师弟们使用DSHplus-3.6与matlab simulink联合仿真出现问题,主要是DSHplus-3.6导出模型失败,帮忙给解决了下。
由于本人不是搞仿真的,对matlab也只是了解一下,所以难免有错误,不对的地方请指正。
软件版本:DSHplus-3.6测试版 matlab 6.5 vc++ 6.0
1,设置matlab:
在matlab中输入命令mex -setup ,会提示是否让matlab自己搜索编译器,选择y,然后选择编译器等等,选择 VC++ 6.0(当然首先要安装该软件)。这一步需要注意的是如果matlab是7.0的版本,好像需要把vc++ 6.0安装到C盘根目录的vs98目录下,共享文件夹COMMON也要安装到C盘根目录下,会有提示的;
注意:这一步只有执行一次即可,以后再不用执行,除非你重新安装了编译器、换了编译器或者更换了用户。
2,建立模型,设置DSHplus-3.6,导出模型:
DSHplus-3.6的仿真方式使用嵌入到simulink中仿真,即把在DSHplus-3.6建立的仿真模型导出成matlab可以识别的动态链接库,matlab调用这些动态链接库来仿真。导出前需要先编译模型(不知道是不是必须的,也不知道是干啥),在 "选项"中选择使用"VC++ 6.0"。
然后选择"导出",选择"matlab s-function",选择"embeded"和"cosimulation"。单击"start",会让你选择导出文件目录和文件名,例如文件夹为d:\de,文件名输入de.cpp,点击确认,看下面的信息栏,首先会编译de.cpp,这个应该是模型的核心部分,主要跟DSHplus相关,它会使用DSHplus的头文件和库;需要注意的是DSHplus自带borland c++ 5.3,这一步默认是使用borland c++编译链接的(选项里面有设置,头文件路径,编译选项,库路径等等,但是都不需要设置,默认的就好),而且可能也只能使用它编译链接,因为各编译器的库不能兼容,而DSHplus自带的库明显是borland c++ 5.3编译的,vc++无法链接。
编译的这一步一般都会没有错误。下一步是编译跟matlab的接口程序(s-fuction)部分,也就是de_dll.c文件,DSHplus会直接调用matlab的mex命令来编译,估计可能是使用 mex de_dll.c de.lib命令编译,但是因为编译模型核心部分时,没有生成de.dll的引入库de.lib,故这一步会失败,到底为啥没有生成引入库,搞不明白,一方面第一步编译模型核心部分de.dll时,是使用的borland c++,这是肯定的,不能更改,所以也就不能生成VC++使用的引入库,即使能生成,也不能直接在VC++中使用,难道是DSHplus-3.6设计的失误?
3,生成引入库:
DSHplus-3.6不能直接编译生成de_dll.dll,那我们只能手工生成了,在matlab下执行mex de_dll.c出现:
>> mex de_dll.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
de_dll.obj
Creating library _lib4186.x and object _lib4186.exp
de_dll.obj : error LNK2001: unresolved external symbol _getModuleData
de_dll.obj : error LNK2001: unresolved external symbol _unmapModule
de_dll.obj : error LNK2001: unresolved external symbol _mapModule
de_dll.obj : error LNK2001: unresolved external symbol _setModuleData
de_dll.dll : fatal error LNK1120: 4 unresolved externals
D:\MATLAB6P5\BIN\WIN32\MEX.PL: Error: Link of 'de_dll.dll' failed.
??? Error using ==> mex
Unable to complete successfully
很明显,是不能链接。
执行D:\Program Files\Microsoft Visual Studio\VC98\Bin>dumpbin /exports de.dll>de.def (VC++的目录根据安装自己更改)
de.def文件内容:
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file de.dll
File Type: DLL
Section contains the following exports for de.dll
0 characteristics
0 time date stamp Thu Jan 01 08:00:00 1970
0.00 version
1 ordinal base
5 number of functions
5 number of names
ordinal hint RVA name
2 0 00001CB5 _getModuleData
3 1 000019C6 _mapModule
4 2 00001D7D _setModuleData
1 3 00001E47 _setOutputCallback
5 4 00001BDE _unmapModule
Summary
1000 .edata
1000 .idata
2000 .reloc
18000 CODE
7000 DATA
1000 TLS
很明显,不能链接的函数在de.dll中,所以要生成de.dll的引入库!
生成方法:
a, 执行D:\Program Files\MinGW\bin>pexports de.dll>de.def (pexports程序在MinGW的发行包中)
生成de.def文件内容:
LIBRARY de.dll
EXPORTS
_getModuleData
_mapModule
_setModuleData
_setOutputCallback
_unmapModule
b,对照dumpbin /exports de.dll>de.def 生成的de.def中函数列表的ordinal项,在每个函数后加上@x,中间有一空格,x为相应函数的ordinal项。
c,去掉每个函数前面的下划线;(在使用lib.exe生成引入库时,会自动加上下划线),de.def成为如下形式:
LIBRARY de.dll
EXPORTS
setOutputCallback @1
getModuleData @2
mapModule @3
setModuleData @4
unmapModule @5
d,生成引入库。D:\Program Files\Microsoft Visual Studio\VC98\Bin>lib.exe /def:de.def
就生成了引入库。
4,生成接口dll:
在matlab下执行 mex de_dll.c de.lib 一般就OK了(需要事先把dshplus的inlcude头文件目录加入到系统环境变量的inlclude中)。
5,在matlab下打开de.cdl,仿真即可
注意:从上面看,可能全部使用borland c++ 5.3编译器,会自动生成引入库和自动调用mex 生成dll成功,这就需要安装borland c++ 5.3,matlab中使用mex -setup设置borland c++ 5.3为默认编译器等等。
附录:
关于由dll生成引入库,请参考《VC中无LIB时的DLL隐式链接,制作与VC++相符合的LIB函数符号输入库》
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
因为模型核心dll的导出函数是统一的,所以如果工程不改名的话(例如从dshplus导出时都选择de.cpp),则可以一直使用这个de.lib链接,如果想改名则改动de.def的第一行的de.dll到其他名字,重新生成lib即可。
没有评论:
发表评论