调试心得
在实现opnet和matlab的顺利联调时,需要在opnet的compilation和link中进行相关设置,主要是为了让opnet中的编译器了解matlab中的一些头文件和库文件等。
Compilation的设置为:
1.
Comp_flags_common参数中设置如下:
/W3 /D_CRT_SECURE_NO_DEPRECATE
/IC:\PROGRA~1\OPNET\145~1.A\models\std\include
/IC:\MATLAB\extern\include。起作用是包含一些必要的matlab头文件。
Link的设置为:
1.
Bind_shobj_flags参数中设置如下:
/LIBPATH:"C:\MATLAB\extern\lib\win32\microsoft"(说明:我的matlab是直接安装在c盘根目录下面的)该设置的作用是让opnet包含一些用到matlab的库函数文件。
2.
Bind_shobj_libs参数中设置如下:
libmx.lib libmat.lib libeng.lib
心得体会:vc6.0+matalb+opnet联合调试
我们的项目中具体是在opnet中调用matlab的引擎函数库。但是opnet的进程域模型是基于c和c++语言的。所以要实现联合调试需要把这三个软件的基本参数进行细致设置。
首先,我的电脑中的环境变量设置:
Include设置:
C:\Program
Files\Microsoft Visual Studio\VC98\atl\include;C:\Program
Files\Microsoft Visual Studio\VC98\mfc\include;C:\Program
Files\Microsoft Visual Studio\VC98\include;C:\Program
Files\OPNET\14.5.A\sys\include;C:\Program
files\OPNET\14.5.A\models\std\include;C:\MATLAB\extern\include
Lib设置:
C:\Program
Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program
Files\Microsoft Visual Studio\VC98\lib;C:\Program
Files\OPNET\14.5.A\sys\lib;C:\Program
Files\OPNET\14.5.A\sys\pc_intel_win32\lib;C:\MATLAB\extern\lib\win32\microsoft
MSDevDir设置:
C:\Program
Files\Microsoft Visual Studio\Common\MSDev98
Path设置:
C:\Program
Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program
Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program
Files\Microsoft Visual Studio\Common\Tools;C:\Program
Files\Microsoft Visual Studio\VC98\bin;C:\Program
Files\OPNET\14.5.A\sys\pc_intel_win32\bin;C:\MATLAB\bin\win32(红体字是关键的设置,它包括了libmx.dll)
以下是我的一个txt文档中的内容:
以下参数设置前提:
matlab的安装目录:C:\MATLAB;
opnet的安装目录:C:\Program Files\OPNET;
vc6.0的安装目录:C:\Program Files\Microsoft Visual
Studio\VC98
自己要根据自己安装的这三个软件进行合理设置与修改。即主要是为了包含头文件和库文件,所以注意结合自己的安装目录进行修改就可以了。
opnet中的环境变量设置:
1.compilation设置:
/W3
/D_CRT_SECURE_NO_DEPRECATE
/IC:\PROGRA~1\OPNET\145~1.A\models\std\include
/IC:\MATLAB\extern\include
2.link设置:
/LIBPATH:"C:\MATLAB\extern\lib\win32\microsoft"
libmx.lib
libmat.lib libeng.lib
我的电脑中的环境变量设置如下:
include
C:\Program
Files\Microsoft Visual Studio\VC98\atl\include;C:\Program
Files\Microsoft Visual
Studio\VC98\mfc\include;C:\Program Files\Microsoft Visual
Studio\VC98\include;C:\Program
Files\OPNET\14.5.A\sys\include;C:\Program
Files\OPNET\14.5.A\models\std\include;C:\MATLAB\extern\include
lib
C:\Program
Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program
Files\Microsoft Visual
Studio\VC98\lib;C:\Program
Files\OPNET\14.5.A\sys\lib;C:\Program
Files\OPNET\14.5.A\sys\pc_intel_win32\lib;C:\MATLAB\extern\lib\win32\microsoft
msdevdir
C:\Program
Files\Microsoft Visual Studio\Common\MSDev98
path
C:\Program
Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program
Files\Microsoft
Visual
Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft
Visual
Studio\Common\Tools;C:\Program Files\Microsoft Visual
Studio\VC98\bin;C:\Program
Files\OPNET\14.5.A\sys\pc_intel_win32\bin;C:\MATLAB\bin\win32
Matlab小实验
注意事项:
1.
先要顺利的完成上面的opnet和matlab的联调工作。各种平台联调参数设置如上面所示。
2.
在opnet中进行进程域,节点域,网络域模型的建立。关键编写管道阶段里面的程序。体现出matlab心道的确对opnet的仿真产生了影响。
3.
小站要放在一个校园网的小地图里面以保证视距可见;调节节点高度;设置发包的开始时间为0;提升容错门限值好在仿真变量中进行设置(我实验中用0.1和0.05)就可以明显的看到我们自己编写的管道阶段程序对仿真结果的影响。
3月15日总结:
mxArray *T=NULL;
double
time[10]={0,1,2,3,4,5,6,7,8,9};
mxArray
*sun=NULL;
double
*num_err;
char
suncmd[200]="a=1;b=30;c=a+b;";
//方法一为对每个matlab的运行语句进行逐个书写运行
T=mxCreateDoubleMatrix(1,10,mxREAL);
memcpy((char*)mxGetPr(T),(char*)time,10*sizeof(double));
engPutVariable(ep,"T",T);
engEvalString(ep,"D=.5*(-9.8).*T.^2;");
engEvalString(ep,"plot(T,D);");
engEvalString(ep,"title('position vs. time for a falling
object');");
engEvalString(ep,"xlabel('tiem(seconds)');");
engEvalString(ep,"ylabel('position(meters)');");
方法二:把需要运行的程序放在一个字符数组中,一句话进行调用,最后只提取自己感兴趣的变量。
engEvalString(ep,suncmd);
if((sun=engGetVariable(ep,"c"))==NULL)
{
op_sim_end("'t get the variable","","","");
}
else
{
num_err =
mxGetPr(sun);
}
printf("the number is: %d",(int) *num_err);
方法三:把书写好的matlab的m文件写好后存在matlab的搜索路径里面。在c语言中只是对这个函数名进行直接调用就可以了。
engEvalString(ep,"abc");
if((sun=engGetVariable(ep,"c"))==NULL)
{
op_sim_end("'t get the variable","","","");
}
else
{
num_err =
mxGetPr(sun);
}
printf("the number is: %d",(int) *num_err);
// 释放使用完的空间
mxDestroyArray(T);
mxDestroyArray(sun);