資源描述:
《matlab(Simulink)中S-function函數(shù)編寫規(guī)則》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、matlab(Simulink)中S-function函數(shù)編寫規(guī)則s函數(shù)是systemFunction的簡稱,用它來寫自己的simulink模塊。(夠簡單吧,^_^,詳細(xì)的概念介紹大伙看幫助吧)可以用matlab、C、C++、Fortran、Ada等語言來寫,這兒我只介紹怎樣用matlab語言來寫吧(主要是它比較簡單)先講講為什么要用s函數(shù),我覺得用s函數(shù)可以利用matlab的豐富資源,而不僅僅局限于simulink提供的模塊,而用c或c++等語言寫的s函數(shù)還可以實(shí)現(xiàn)對(duì)硬件端口的操作,還可以操作windowsAPI等的先介紹一下simulin
2、k的仿真過程(以便理解s函數(shù)),simulink的仿真有兩個(gè)階段:一個(gè)為初始化,這個(gè)階段主要是設(shè)置一些參數(shù),像系統(tǒng)的輸入輸出個(gè)數(shù)、狀態(tài)初值、采樣時(shí)間等;第二個(gè)階段就是運(yùn)行階段,這個(gè)階段里要進(jìn)行計(jì)算輸出、更新離散狀態(tài)、計(jì)算連續(xù)狀態(tài)等等,這個(gè)階段需要反復(fù)運(yùn)行,直至結(jié)束。在matlab的workspace里打editsfuntmpl(這是matlab自己提供的s函數(shù)模板),我們看它來具體分析s函數(shù)的結(jié)構(gòu)。它的第一行是這樣的:function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先講輸入與輸出變量的含義:t是采樣時(shí)間
3、,x是狀態(tài)變量,u是輸入(是做成simulink模塊的輸入),flag是仿真過程中的狀態(tài)標(biāo)志(以它來判斷當(dāng)前是初始化還是運(yùn)行等);sys輸出根據(jù)flag的不同而不同(下面將結(jié)合flag來講sys的含義),x0是狀態(tài)變量的初始值,str是保留參數(shù)(mathworks公司還沒想好該怎么用它,嘻嘻,一般在初始化中將它置空就可以了,str=[]),ts是一個(gè)1×2的向量,ts(1)是采樣周期,ts(2)是偏移量。下面結(jié)合sfuntmpl.m中的代碼來講具體的結(jié)構(gòu):switchflag,%判斷flag,看當(dāng)前處于哪個(gè)狀態(tài)case0,[sys,x0,st
4、r,ts]=mdlInitializeSizes;flag=0表示處于初始化狀態(tài),此時(shí)用函數(shù)mdlInitializeSizes進(jìn)行初始化,此函數(shù)在sfuntmpl.m的149行我們找到他,在初始化狀態(tài)下,sys是一個(gè)結(jié)構(gòu)體,用它來設(shè)置模塊的一些參數(shù),各個(gè)參數(shù)詳細(xì)說明如下size=simsizes;%用于設(shè)置模塊參數(shù)的結(jié)構(gòu)體用simsizes來生成sizes.NumContStates=0;%模塊連續(xù)狀態(tài)變量的個(gè)數(shù)sizes.NumDiscStates=0;%模塊離散狀態(tài)變量的個(gè)數(shù)sizes.NumOutputs=0;%模塊輸出變量的個(gè)數(shù)si
5、zes.NumInputs=0;%模塊輸入變量的個(gè)數(shù)sizes.DirFeedthrough=1;%模塊是否存在直接貫通(直接貫通我的理解是輸入能%直接控制輸出)sizes.NumSampleTimes=1;%模塊的采樣時(shí)間個(gè)數(shù),至少是一個(gè)sys=simsizes(sizes);%設(shè)置完后賦給sys輸出舉個(gè)例子,考慮如下模型:dx/dt=fc(t,x,u)也可以用連續(xù)狀態(tài)方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u)也可以用離散狀態(tài)方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u)也可以用輸出狀態(tài)方
6、程描述:y=C*x+D*u設(shè)上述模型連續(xù)狀態(tài)變量、離散狀態(tài)變量、輸入變量、輸出變量均為1個(gè),我們就只需改上面那一段代碼為:(一般連續(xù)狀態(tài)與離散狀態(tài)不會(huì)一塊用,我這兒是為了方便說明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不變。繼續(xù)在mdlInitializeSizes函數(shù)中往下看:x0=[];%狀態(tài)變量設(shè)置為空,表示沒有狀態(tài)變量,以我們上面的假設(shè),可改%為x0=[0,0](離散和連續(xù)的狀態(tài)變量我們都設(shè)它初值為0)
7、str=[];%這個(gè)就不用說了,保留參數(shù)嘛,置[]就可以了,反正沒什么用,可%能7.0會(huì)給它一些意義ts=[00];%采樣周期設(shè)為0表示是連續(xù)系統(tǒng),如果是離散系統(tǒng)在下面的mdlGet%TimeOfNextVarHit函數(shù)中具體介紹嘻嘻,總算講完了初始化,后面的應(yīng)該快了在sfuntmpl的106行繼續(xù)往下看:case1,sys=mdlDerivatives(t,x,u);flag=1表示此時(shí)要計(jì)算連續(xù)狀態(tài)的微分,即上面提到的dx/dt=fc(t,x,u)中的dx/dt,找到mdlDerivatives函數(shù)(在193行)如果設(shè)置連續(xù)狀態(tài)變量個(gè)數(shù)為
8、0,此處只需sys=[];就可以了(如sfuntmpl中一樣),按我們上述討論的那個(gè)模型,此處改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u%我