




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
./S函數的簡介及編寫摘自恒潤科技S-function的編寫S函數模板編輯環(huán)境進入:在MATLAB主界面中直接輸入:editsfuntmpl即可彈出S函數模板編輯的M文件環(huán)境,修改即可。在MATLAB主界面中直接輸入:sfundemos,即可調出S 函數的許多編程例子。S函數模板的相關基礎:M文件S函數的引導語句為:S函數默認的四個輸入參數:t,x,u,flagS函數默認的四個輸出函數:sys,x0,str,ts各個參數的含義如下:T:代表當前的仿真時間,該輸入決定了下一個采樣時間;X:表示狀態(tài)向量,行向量,引用格式:X<1>,X<2>U:表示輸入向量;Flag:控制在每一個仿真階段調用哪一個子函數的參數,由SIMULINK在調用時自動取值;Sys:通用的返回變量,返回的數值決定Flag值,mdlUpdates里:列向量,引用格式:Sys<1,1>,Sys<2,1>;mdlOutputs里:行向量,引用格式:Sys=x.X0:初始的狀態(tài)值;列向量,引用格式:X0=[0;0;0]Str:空矩陣,無具體含義;Ts:包含模塊采樣時間和偏差的矩陣。[period,offset]當Ts為-1時,表示與輸入信號同采樣周期。S函數工作方式:Flag=0時,調用mdlInitializeSizes函數,定義S函數的基本特性,包括采樣時間,連續(xù)或者離散狀態(tài)的初始條件和Sizes數組;Flag=1時,調用mdlDerivatives函數,計算連續(xù)狀態(tài)變量的微分方程;求所給表達式的等號左邊狀態(tài)變量的積分值的過程。Flag=2時,調用mdlUpdate函數,用于更新離散狀態(tài),采樣時間和主時間步的要求;Flag=3時,調用mdlOutputs函數,計算S函數的輸出;Flag=4時,調用mdlGetTimeOfNextVarHit函數,計算下一個采樣點的絕對時間,這個方法僅僅是使用戶在mdlInitializeSize里說明一個可變的離散采樣時間;Flag=9時,調用mdlTerminate函數,實現仿真任務的結束。S函數仿真過程:初始化:mdlInitializeSizes,初始化S函數初始化SimStruct,包含了S函數的所有信息;設置輸入、輸出端口數;設置采樣時間;分配存儲空間。數值積分:mdlDerivatives用于連續(xù)狀態(tài)的求解和非采樣過零點;如果存在連續(xù)狀態(tài),調用mdlDerivatives和mdlOutput兩個子函數;如果存在非采樣過零點,調用mdlOutput和mdlZeroCrossings子函數,以定位過零點。更新離散狀態(tài):mdlUpdate計算輸出:mdlOutputs,計算所有輸出端口的輸出值。計算下一個采樣時間點:mdlGetTimeOfNextVarHit仿真結束:mdlTerminate,在仿真結束時調用。S函數的編寫:參數初始設定:初始化sizes結構,再調用simsizes函數;Sizes結構體:NumContStates:連續(xù)狀態(tài)的個數NumDiscStates:離散狀態(tài)的個數NumOutputs:輸出變量的個數NumInputs:輸入變量的個數DirFeedthrough:有無直接饋入,值為1時表示輸入直接傳到輸出口NumSampleTimes:采樣時間的個數,值為1時表示只有一個采樣周期Simsizes函數的調用:sys=simsizes<sizes>,即將sizes結構體中的信息傳遞給sys。狀態(tài)的動態(tài)更新:連續(xù)模塊的狀態(tài)更新由mdlDerivatives函數來進行;離散模塊的狀態(tài)更新由mdlUpdate函數來進行;輸出信號的計算:計算出模塊的輸出信號,系統(tǒng)的輸出仍然由sys變量返回。M文件S函數的模塊化:在動態(tài)系統(tǒng)仿真設計,分析中,用戶可以使用S-Function模塊來調用S-函數。S-Function模塊是一個單輸入單輸出的模塊,如果有多個輸入與輸出信號,可以使用Mux模塊與Demux模塊對信號進行組合和分離操作;在S-Function模塊的參數設置對話框中,包含了調用的S函數名和用戶輸入的參數列表,如下圖所示:S-Function模塊是以圖形的方式提供給用戶一個調用S函數的接口,S函數中的源文件必須由用戶自行編寫;S-Function模塊中的S-函數名和參數值列表必須與用戶填寫的S函數源文件的名稱和參數列表完全一致,包括參數的順序。S-Function模塊建立流程:6、m-file模版編寫附:創(chuàng)建一個有1輸入〔2維,2輸出〔1維,3個參數,還有全局變量的s-function。1.新建sfunction的C語言文件打開simulink,點擊User-DefinedFunctions里面的S-FunctionExamples。這個里面有多個語言版本的模板,有C,C++,Ada,Fortran和M語言的版本,其實都小異,只要了解幾個函數就很容易使用了。選擇C語言的版本:從S-function模塊中選擇C-fileS-functions里面的BasicC-MEXtemplate。打開后,另存為自己的模塊名字,如test.c。下面我們來分析代碼:#defineS_FUNCTION_NAMEtest//這里把文件名sfuntmpl_basic修改為test#defineS_FUNCTION_LEVEL2#include"simstruc.h"http://程序里面要用到的頭文件在這里引用,如"math.h"等。floatglobal_var;//定義全局變量staticvoidmdlInitializeSizes<SimStruct*S>{//這個函數用來設置輸入、輸出和參數的。ssSetNumSFcnParams<S,3>;/*設置參數個數,這里為3*/if<ssGetNumSFcnParams<S>!=ssGetSFcnParamsCount<S>>{return;}ssSetNumContStates<S,0>;//設置連續(xù)狀態(tài)的個數,缺省為0;ssSetNumDiscStates<S,0>;//設置離散狀態(tài)的個數,缺省為0;if<!ssSetNumInputPorts<S,1>>return;//設置輸入變量的個數,這里為1ssSetInputPortWidth<S,0,2>;//設置輸入變量0的維數為2ssSetInputPortRequiredContiguous<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;}staticvoidmdlInitializeSampleTimes<SimStruct*S>//暫時不管{ssSetSampleTime<S,0,CONTINUOUS_SAMPLE_TIME>;ssSetOffsetTime<S,0,0.0>;}#defineMDL_INITIALIZE_CONDITIONS/*Changeto#undeftoremovefunction*/#ifdefined<MDL_INITIALIZE_CONDITIONS>staticvoidmdlInitializeConditions<SimStruct*S>//暫時不管{}#endif/*MDL_INITIALIZE_CONDITIONS*/#defineMDL_START/*Changeto#undeftoremovefunction*/#ifdefined<MDL_START>staticvoidmdlStart<SimStruct*S>//暫時不管{}#endif/*MDL_START*/staticvoidmdlOutputs<SimStruct*S,int_Ttid>//這里填入相關的運算、算法等{real_T*para1=mxGetPr<ssGetSFcnParam<S,0>>;real_T*para2=mxGetPr<ssGetSFcnParam<S,1>>;real_T*para3=mxGetPr<ssGetSFcnParam<S,2>>;constreal_T*u=<constreal_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];}#defineMDL_UPDATE/*Changeto#undeftoremovefunction*/#ifdefined<MDL_UPDATE>staticvoidmdlUpdate<SimStruct*S,int_Ttid>{}#endif/*MDL_UPDATE*/#defineMDL_DERIVATIVES/*Changeto#undeftoremovefunction*/#ifdefined<MDL_DERIVATIVES>staticvoidmdlDerivatives<SimStruct*S>{}#endif/*MDL_DERIVATIVES*/staticvoidmdlTerminate<SimStruct*S>//這里需要把global變量全部初始化,否則下次運行程序時,全局變量還是之前的值。{}#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論