日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MATLAB中的S-Function的用法(C语言)

發布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MATLAB中的S-Function的用法(C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.?S-Function簡介 ?

S-Function是system-function的縮寫。說得簡單,S-Function就是用MATLAB所提供的模型不能完全滿足用戶,而提供給用戶自己編寫程序來滿足自己要求模型的接口。

?

2. MEX函數與M文件的區別

第一,??MEX 函數能實現的回調函數比M-文件能實現的回調函數要多得多;

第二,??MEX 函數直接訪問內部數據結構SimStruct,SimStruct 是Simulink 用來保存關于S-function 信息的一個數據結構;

第三,??MEX 函數也可使用MATLAB MEX 文件API 直接來訪問MATLAB 的工作空間。

如果一個C MEX文件與一個M文件具有相同的名字,則C MEX文件被優先使用,即在S-Function塊中使用的是C MEX文件。

?

3. 基礎知識

3.1 直接饋通(direct feedthrough)

?直接饋通表示系統的輸出或可變采樣時間是否受到輸入的控制

a.??輸出函數(mdlOutputs或flag==3)是輸入u的函數。即,如果輸入u在mdlOutputs中被訪問,則存在直接饋通。

b.??對于一個變步長S-Function的“下一個采樣時間”函數(mdlGetTimeOfNextVarHit或flag==4)中可以訪問輸入u。

例如,一個需要其輸入的系統(也就是具有直接饋通)是運算y=kXu,其中,u是輸入,k是增益,y是輸出。

又如,一個不需要其輸入的系統(也就是沒有直饋通)是一種簡單的積分運算:

輸出:y=x;

導數:dx/dt=u

其中,x是狀態,dx/dt是狀態對時間的導數,u是輸入,y是輸出。

正確設置直接饋通標志是十分重要的,因為它影響模型中塊的執行順序,并可用檢測代數環。

3.2?dynamically sized inputs?

主要是給出:輸入連續狀態數目(size.NumContStates),離散狀態數目(size.NumDiscStates)?,輸出數目(size.NumOutputs),輸入數目(size.NumInputs),Direct Feedthrough(size.Dir Feedthrough)。?

3.3 setting sample times and offsets

setting smaple times and offsets主要設置采樣時間.

3.4?Level-1 和Level-2

Level 1 提供一個簡單的接口,可與少部分的S函數API交互。Matlab對于這種方式的支持更多的是為了保持與以前版本的兼容,現在推薦采用的是Level 2 S函數。

?

4. S-Function實例

S-Function的仿真流程

例如要創建一個有1輸入(2維),2輸出(1維),3個參數,還有全局變量的S-Function。 過程如下:

a. 新建sfunction的C語言文件

打開simulink,點擊User-Defined Functions里面的S-Function Examples。這個里面有多個語言版本的模板,有C,C++,Ada,Fortran和M語言的版本,其實都大同小異,只要了解幾個函數就很容易使用了。 選擇C語言的版本:從S-function模塊中選擇C-file S-functions里面的Basic C-MEX template。打開后,另存為自己的模塊名字,如test.c 。下面我們來分析代碼:?

#define S_FUNCTION_NAME test//這里把文件名sfuntmpl_basic修改為test #define S_FUNCTION_LEVEL 2 #include "simstruc.h" //程序里面要用到的頭文件在這里引用,如“math.h”等。 float global_var; //定義全局變量 static void mdlInitializeSizes(SimStruct *S) {//這個函數用來設置輸入、輸出和參數的。ssSetNumSFcnParams(S, 3); /*設置參數個數,這里為3 */if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {return;}ssSetNumContStates(S, 0);//設置連續狀態的個數,缺省為0;ssSetNumDiscStates(S, 0);//設置離散狀態的個數,缺省為0;if (!ssSetNumInputPorts(S, 1)) return;//設置輸入變量的個數,這里為1ssSetInputPortWidth(S, 0, 2); //設置輸入變量0的維數為2 ssSetInputPortRequiredContiguous(S, 0, true); //設置input0的訪問方式,true就是臨近訪問,這樣指針的增量后就可以直接訪問下個input端口了。 ssSetInputPortDirectFeedThrough(S, 0, 1);// 設置輸入端口的信號是否mdlOutputs函數中使用,這兒設置為true。if (!ssSetNumOutputPorts(S, 2)) return;//設置輸出變量的個數 ssSetOutputPortWidth(S, 0, 1);//設置輸出變量0的維數為1維ssSetOutputPortWidth(S, 1, 1);//設置輸出變量1的維數為1維 ssSetNumSampleTimes(S, 1); //設置采樣時間,此處為1s。ssSetNumRWork(S, 0);//不管ssSetNumIWork(S, 0);ssSetNumPWork(S, 0);ssSetNumModes(S, 0);ssSetNumNonsampledZCs(S, 0); ssSetOptions(S, 0); //下面可以寫全局變量的初始化程序 global_var=1; } static void mdlInitializeSampleTimes(SimStruct *S)//暫時不管 {ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);ssSetOffsetTime(S, 0, 0.0);} #define MDL_INITIALIZE_CONDITIONS /* Change to #undef to remove function */ #if defined(MDL_INITIALIZE_CONDITIONS)static void mdlInitializeConditions(SimStruct *S)//暫時不管 {} #endif /* MDL_INITIALIZE_CONDITIONS */ #define MDL_START /* Change to #undef to remove function */ #if defined(MDL_START) static void mdlStart(SimStruct *S)//暫時不管 {} #endif /* MDL_START */ static void mdlOutputs(SimStruct *S, int_T tid)//這里填入相關的運算、算法等 { real_T *para1 = mxGetPr(ssGetSFcnParam(S,0)); real_T *para2 = mxGetPr(ssGetSFcnParam(S,1)); real_T *para3 = mxGetPr(ssGetSFcnParam(S,2)); const real_T *u = (const real_T*) ssGetInputPortSignal(S,0); real_T *y1 = ssGetOutputPortSignal(S,0); real_T *y2 = ssGetOutputPortSignal(S,1); y1[0]=u[0]*para1[0]+u[1]*para2[0]; y2[0]=u[1]*para3[0]+u[0]*para1[0]; } #define MDL_UPDATE /* Change to #undef to remove function */ #if defined(MDL_UPDATE)static void mdlUpdate(SimStruct *S, int_T tid){} #endif /* MDL_UPDATE */ #define MDL_DERIVATIVES /* Change to #undef to remove function */ #if defined(MDL_DERIVATIVES)static void mdlDerivatives(SimStruct *S){} #endif /* MDL_DERIVATIVES */ static void mdlTerminate(SimStruct *S)//這里需要把global變量全部初始化,否則下次運行程序時,全局變量還是之前的值。 { }#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ #include "simulink.c" /* MEX-file interface mechanism */ #else #include "cg_sfun.h" /* Code generation registration function */ #endif

?b. 編譯

在matlab的command?window?里面輸入“mex?test.c”,即可將test.c編譯為mex文件。

c.調用sfunction

在simulink空間里面拉入sfunction,在s-function name里面填入test,參數里面填入要設定的參數,然后仿真即可。


//

?轉載:http://www.cnblogs.com/xpvincent/archive/2013/01/18/2866978.html



總結

以上是生活随笔為你收集整理的MATLAB中的S-Function的用法(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美精品久久久久 | 日本亚洲在线 | 亚洲国产精品久久久 | 在线免费观看一区二区 | 亚洲欧美在线一区二区 | 激情小说在线 | 九九爱视频 | 免费毛片大全 | 日本在线一级片 | 国产成人麻豆精品午夜在线 | 国产av一区二区三区传媒 | av电影中文字幕 | 亚洲AV无码成人片在线观看 | 午夜时刻免费入口 | 三级免费 | 国产视频xxx| 欧美极品少妇×xxxbbb | 亚洲在线观看一区 | 亚洲国产一区二区三区四区 | 日韩1页| 亚洲制服丝袜一区 | 日韩h在线 | 美女擦边视频 | 中文字幕在线播出 | 四虎啪啪 | 日韩有码一区二区三区 | 一级黄色aa| 无码国内精品人妻少妇蜜桃视频 | 久久精品国产亚洲av麻豆蜜芽 | 九一国产在线观看 | 草草福利影院 | 成人激情视频在线播放 | 午夜视 | 9色av| 国产欧美日韩精品一区 | 亚洲精品xxxx | 中文 日韩 欧美 | 色哟哟视频| 国产精品一线二线 | 美女精品一区 | 天堂在线v| 日批动态图| 国产aⅴ无码片毛片一级一区2 | 麻豆av一区二区三区久久 | 亚洲欧美在线看 | 91av免费观看| 在线成人免费电影 | 阿v免费在线观看 | 国产精品第6页 | 成人在线视频观看 | 天天操天天干天天 | 深夜国产在线 | 欧美激情一区二区三区免费观看 | 激情综合小说 | 久久久久久成人精品 | 精品久久久影院 | 黄色网页在线看 | 欧美图片一区二区 | 九九这里只有精品视频 | 国产精选一区 | 又色又爽又黄无遮挡的免费视频 | 美景之屋电影免费高清完整韩剧 | 欧美区国产区 | 老司机深夜福利网站 | 麻豆电影网站 | 一区二区三区亚洲精品 | 高跟av | 海角社区id| 国产福利视频在线 | 99久久亚洲精品日本无码 | 日免费视频 | av片久久| 日韩色婷婷 | 亚洲精品喷潮一区二区三区 | 一本色道久久hezyo无码 | 日视频| 亚洲一级Av无码毛片久久精品 | 成人国产精品久久久 | 加勒比综合网 | 致命弯道8在线观看免费高清完整 | 天堂在线视频免费 | 国产一级α片 | 国产日韩欧美视频 | 亚洲欧洲一区 | 神马午夜精品 | 免费的av在线 | 欧美视频免费 | 六月婷婷激情网 | 少妇视频在线观看 | 亚洲一区二区综合 | 一区二区三区亚洲视频 | 啪啪自拍视频 | 麻豆国产在线播放 | 久久精品视频在线免费观看 | 欧美激情视频一区二区 | 日本久久久久久久久 | 久久久精品视频一区 | 91亚洲影院 | 三点尽露的大尺度国产 |