VC與Matlab混合編程之基於MATLAB RTW 的建模仿真

    本文章只是博主用來記錄自己的學習過程以及期間遇到的一些問題及解決方案的總結

        首先Matlab(Matlab7.0)仿真模型部分配置過程如下:



注:上面的圖是在Matlab2014a中截的,只是說明一下怎麼配置,整個工程是在Matlab7.0中做的。

模型中In1的輸入實現:(本人一開始一直不知道In1該怎麼用,蹭了一段時間,這算是第一個問題)

在命令行窗口執行以下命令即可

t=0:0.01:10;
u=stepfun(t,0);
t=t';
u=u';

完成以上配置後,Simulink模型中點擊Build,生成C代碼。

然後,在VC++6.0中進行編程,本人創建的是控制檯應用程序(Win32 console application)。

 注:一定要在創建的VC工程中加入上面生成的C代碼(所有.c和.h文件),以及在工程中設置包含Matlab的一些include文件和library文件的路徑。


#include   <stdio.h>
#include  "Matlab_RTW.h"
#include  "Matlab_RTW_private.h"
#include  "Matlab_RTW_types.h"
#include  "rt_nonfinite.h"
#include  "rtmodel.h"
#include  "rtwtypes.h"

void  RTWInitialize(void);
double  RTWOutput(void); 
void  RTWTerminate(void);
int  main( )
{
	int i ;
	double t=0;
	double model_out;
	FILE* pData = fopen("data.txt","w");	//data.txt存儲仿真結果
	if(pData==NULL)
	{
		printf("Failed to open file\n");
		return 0;
	}
	RTWInitialize();
	for (i = 0; i < 1000; i++)
	{
		model_out = RTWOutput();
		fprintf(pData,"%f\n",model_out);
		// printf("%f\n",model_out);	//內存不足容易丟失數據
		t = t + 0.01;
	}
	fclose(pData);
	RTWTerminate();
	return 0;
}
void  RTWInitialize(void)
{
	Matlab_RTW();	//模型註冊
	MdlInitializeSizes();	//初始化大小
	MdlInitializeSampleTimes();	//初始化採樣次數
	MdlStart();	//啓動模型
	Matlab_RTW_U.In1 = 1;	//給定輸入
}
double  RTWOutput(void)
{
	double Yout;
	MdlOutputs();	//計算系統輸出
	MdlUpdate();	//更新離散狀態向量
	Matlab_RTW_derivatives();	//計算連續模型導數
	Yout = Matlab_RTW_Y.Out1;	//記錄輸出結果
	return Yout;
}
void  RTWTerminate(void)
{
	MdlTerminate();	//模型停止
}


上面的程序中,本人用TXT文件來存儲仿真數據,因爲在DOS界面直接輸出仿真數據時,只有299個,本該是1000個,所以本人猜測是內存不足問題(這是第二個問題),所以用TXT文件較好,另外也比較容易將數據導入Matlab中繪製曲線觀看仿真效果。

至此整個仿真結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章