Simulink中的自定義模塊_第1頁(yè)
Simulink中的自定義模塊_第2頁(yè)
Simulink中的自定義模塊_第3頁(yè)
Simulink中的自定義模塊_第4頁(yè)
Simulink中的自定義模塊_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選文檔目錄Fcn 模塊 1MATLAB Fcn模塊 2S Function (System Function) 21. 函數(shù)的函數(shù)頭 42. 函數(shù)分析 43. 帶參數(shù)的S 函數(shù) 84.S 函數(shù)格式及說(shuō)明 9simulink 中子模塊的封裝1.6Fcn 模塊Fcn 模塊對(duì)它的輸入進(jìn)行指定的表達(dá)式運(yùn)算。使用的表達(dá)式可由下面的一個(gè)或多個(gè)部分組成。u - 模塊的輸入。如果 u 是一個(gè)向量,u(i) 表示此向量的第i 個(gè)元素; u(1)或者 u 表示第一個(gè)元素?cái)?shù)值常數(shù)(例如表達(dá)式5.2*u)算術(shù)運(yùn)算符(+ - * / A例如表達(dá)式uA2+5.2)關(guān)系運(yùn)算符(=!=> < >=<

2、=)- 表達(dá)式返回1,如果關(guān)系為真;否則返回0邏輯運(yùn)算符(&&| !) 表達(dá)式返回1,如果關(guān)系為真; 否則返回0括號(hào)數(shù)學(xué)函數(shù)(abs, acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor,hypot, ln, log, log10, pow, power, rem, sgn, sin, sinh, sqrt, tan, tanh.)Workspace 中定義的變量-如果變量名字不是 Matlab 保留字符(比如sin) ,變量名字會(huì)被傳遞給Matab ,從而在Maltab Workspace 中獲取相應(yīng)給定的值。

3、矩陣或者向量必須具體到其對(duì)應(yīng)的元素。(比如A(1,1)注意: Fcn 模塊中使用的表達(dá)式不支持矩陣運(yùn)算,同樣不支持(:) 符。模塊輸入可以是標(biāo)量或者向量,但輸出總是標(biāo)量數(shù)值。MATLAB Fcn 模塊MATLAB Fcn 模塊對(duì)它的輸入進(jìn)行指定的Matlab 函數(shù)或者表達(dá)式運(yùn)算。輸出尺寸必須和模塊中定義的尺寸相符,否則報(bào)錯(cuò)。下面是 MATLAB Fcn 模塊中可以使用的有效表達(dá)式sinatan2(u(1),u(2)u(1)Au(2)注意:同 Fcn 模塊相比,在仿真中MATLAB Fcn 模塊速度要慢,因?yàn)樗枰诿總€(gè)積分步驟中調(diào)用Maltab 編譯器。 因此建議使用Fcn 模塊或者M(jìn)ath

4、Function模塊代替MATLAB Fcn 模塊,或者編寫M 文件或者M(jìn)EX 文件 S 函數(shù)代替它。S Function (System Function)S 函數(shù),即系統(tǒng)函數(shù),用來(lái)擴(kuò)展Simulink 模塊庫(kù)。一個(gè)S 函數(shù),相當(dāng)于一個(gè) Simulink 模塊,只不過(guò)這個(gè)模塊不是在Simulink Library 中已經(jīng)存在的,用戶需要根據(jù)自己對(duì)Simulink 的功能需求,使用指定的編程語(yǔ)言來(lái)定制自己的Simulink 模塊。S 函數(shù) 支持 Matlab, C, C+, Ada, or Fortran 等語(yǔ)言,編寫S 函數(shù)需要按照一定的格式,具體如何編寫S 函數(shù),參考Matlab 自帶文檔

5、。如果能用現(xiàn)有的Simulink 模塊庫(kù)中的模塊滿足需求,不建議使用S 函數(shù)編寫。所謂 s 函數(shù)是 system Function 的簡(jiǎn)稱 , 用它來(lái)寫自己的simulink 模塊 . s函數(shù)可以用matlab 、 C、 C+ 、 Fortran 、 Ada 等語(yǔ)言來(lái)寫,這兒只介紹怎樣用 matlab 語(yǔ)言來(lái)寫吧(主要是它比較簡(jiǎn)單)先講講為什么要用s 函數(shù),我覺(jué)得用s 函數(shù)可以利用matlab 的豐富資源,而不僅僅局限于simulink 提供的模塊,而用c 或 c+ 等語(yǔ)言寫的s 函數(shù)還可以實(shí)現(xiàn)對(duì)硬件端口的操作,還可以操作windows API 等先介紹一下simulink 的仿真過(guò)程(以便理

6、解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 里輸入 edit sfuntmpl( 這是 matlab 自己提供的s),我們看它來(lái)具體分析s 函數(shù)的結(jié)構(gòu).1. 函數(shù)的函數(shù)頭函數(shù)的第一行:function sys,x0,str,ts=sfuntmpl(t,x,u,flag) , 先講輸入與輸出變量的含義:t 是采樣時(shí)間;x 是狀態(tài)變量;u 是輸入(

7、是做成simulink 模塊的輸入);flag 是仿真過(guò)程中的狀態(tài)標(biāo)志(以它來(lái)判斷當(dāng)前是初始化還是運(yùn)行等)sys 輸出根據(jù)flag 的不同而不同(下面將結(jié)合flag 來(lái)講 sys 的含義 );x0 是狀態(tài)變量的初始值;str 是保留參數(shù)(mathworks 公司還沒(méi)想好該怎么用它, 一般在初始化中將它置空就可以了, str=);ts是一個(gè)1 X2的向量,ts(1)是采樣周期,ts(2)是偏移量2. 函數(shù)分析下面結(jié)合sfuntmpl.m 中的代碼來(lái)講具體的結(jié)構(gòu):switch flag, % 判斷 flag ,看當(dāng)前處于哪個(gè)狀態(tài)case 0,sys,x0,str,ts=mdlInitializeS

8、izes;/ 解釋說(shuō)明flag=0 表示當(dāng)前處于初始化狀態(tài),此時(shí)調(diào)用函數(shù)mdlInitializeSizes進(jìn)行初始化,此函數(shù)在該文件的第149 行定義 . 其中的參數(shù)sys 是一個(gè)結(jié)構(gòu)體,它用來(lái)設(shè)置模塊的一些參數(shù),各個(gè)參數(shù)詳細(xì)說(shuō)明如下size = simsizes;%用于設(shè)置模塊參數(shù)的結(jié)構(gòu)體用simsizes 來(lái)生成sizes.NumContStates = 0;%模塊連續(xù)狀態(tài)變量的個(gè)數(shù)sizes.NumDiscStates = 0;%模塊離散狀態(tài)變量的個(gè)數(shù)sizes.NumOutputs = 0;%模塊輸出變量的個(gè)數(shù)sizes.NumInputs = 0;%模塊輸入變量的個(gè)數(shù)sizes.D

9、irFeedthrough = 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)方程描述:y=C*x+D*u設(shè)上述模型連續(xù)狀態(tài)變量、離散狀態(tài)變量、輸入變量、輸出變量均為1 個(gè),我們就只需改上面那一段代碼為(一般連續(xù)狀態(tài)與

10、離散狀態(tài)不會(huì)一塊用, 我這兒是為了方便說(shuō)明):sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不變, 繼續(xù)在 mdlInitializeSizes 函數(shù)中往下看:x0 = ;%狀態(tài)變量設(shè)置為空,表示沒(méi)有狀態(tài)變量,以我們上面的假設(shè),可改為 x0=0,0( 離散和連續(xù)的狀態(tài)變量我們都設(shè)它初值為0)str = ;%保留參數(shù) , 置 就可以了 , 沒(méi)什么用ts = 0 0; %采樣周期設(shè)為0 表示是連續(xù)系統(tǒng), 如果是離散系統(tǒng)在下面的mdlGetTimeOfNextVarHit 函

11、數(shù)中具體介紹case 1,sys=mdlDerivatives(t,x,u); /flag=1表示此時(shí)要計(jì)算連續(xù)狀態(tài)的微分, 即上面提到的dx/dt=fc(t,x,u)中的dx/dt, 找到193 行的函數(shù)mdlDerivatives,如果設(shè)置連續(xù)狀態(tài)變量個(gè)數(shù)為0,此 處 只 需sys=就 可 以 了, 按 我 們 上 述討 論 的 那 個(gè)模 型 , 此 處 改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u,我們這兒x(1)是連續(xù)狀態(tài)變量,而x(2)是離散的 , 這兒只用到連續(xù)的, 此時(shí)的輸出sys 就是微分case 2,sys=mdlUpdate(t,x,u);/flag=

12、2 表示此時(shí)要計(jì)算下一個(gè)離散狀態(tài), 即上面提到的x(k+1)=fd(t,x,u),找到 mdlUpdate 函數(shù) , 它這兒 sys= 表示沒(méi)有離散狀態(tài), 我們這兒可以改成sys=fd(t,x(2),u) 或 sys=H*x(2)+G*u;%sys 即為 x(k+1)case 3,sys=mdlOutputs(t,x,u); /flag=3 表示此時(shí)要計(jì)算輸出, 即 y=fo(t,x,u), 找到 218 行的 mdlOutputs函數(shù) . 如果 sys= 表示沒(méi)有輸出, 我們改成sys=fo(t,x,u) 或 sys=C*x+D*u %sys此時(shí)為輸出ycase 4,sys=mdlGetTi

13、meOfNextVarHit(t,x,u); /flag=4 表示此時(shí)要計(jì)算下一次采樣的時(shí)間, 只在離散采樣系統(tǒng)中有用(即上文的 mdlInitializeSizes 中提到的ts 設(shè)置 ts(1) 不為 0), 連續(xù)系統(tǒng)中只需在mdlGetTimeOfNextVarHit 函數(shù)中寫上sys=. 這個(gè)函數(shù)主要用于變步長(zhǎng)的設(shè)置 , 具體實(shí)現(xiàn)大家可以用edit vsfunc 看 vsfunc.m 這個(gè)例子case 9,sys=mdlTerminate(t,x,u); /flag=9 表示此時(shí)系統(tǒng)要結(jié)束,一般來(lái)說(shuō)寫上在mdlTerminate 函數(shù)中寫上sys= 就可 , 如果你在結(jié)束時(shí)還要設(shè)置什么

14、,就在此函數(shù)中寫完了.3. 帶參數(shù)的S 函數(shù)此外,s函數(shù)還可以帶用戶參數(shù),下面給個(gè)例子,它和simulink下的gain模塊功能一樣function sys,x0,str,ts = sfungain(t,x,u,flag,gain)switch flag,case 0,sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = sim

15、sizes(sizes);x0=;str=;ts=0,0;case 3,sys=gain*u;case 1,2,4,9,sys = ;end做好了 s 函數(shù)后 , simulink -> user-defined function 下拖一個(gè)S-Function 到你的模型, 就可以用了. 在 simulink -> user-defined function還有個(gè) s-Function Builder, 他可以生成用c 語(yǔ)言寫的s 函數(shù) . 或者在 matlab的 workspace 下打 sfundemos, 可以看到很多演示s 函數(shù)的程序4.S 函數(shù)格式及說(shuō)明function

16、sys,x0,str,ts = sfuntmpl(t,x,u,flag)% SFUNTMPL 是M-文件S函數(shù)模板% 通過(guò)剪裁,用戶可以生成自己的S 函數(shù),不過(guò)一定要重新命名% 利用 S 函數(shù)可以生成連續(xù)、離散混合系統(tǒng)等,實(shí)現(xiàn)任何模塊的功能% M- 文件 S 函數(shù)的語(yǔ)法為:% SYS,X0,STR,TS = SFUNC(T,X,U,FLAG,P1,.,Pn)% 參數(shù)含義:%t 是當(dāng)前時(shí)間%x 是S 函數(shù)相應(yīng)的狀態(tài)向量%u 是模塊的輸入%flag是所要執(zhí)行的任務(wù)% FLAG 結(jié)果功能%0SIZES,X0,STR,TS 模塊初始化%1DX計(jì)算模塊導(dǎo)數(shù)更新模塊離散狀態(tài)計(jì)算模塊輸出計(jì)算下一個(gè)采樣時(shí)間點(diǎn)

17、結(jié)束仿真%2DS%3Y%4TNEXT%9% 用戶切勿改動(dòng)輸出參數(shù)的順序、名稱和數(shù)目% 輸入?yún)?shù)的數(shù)目不能小于1 ,這四個(gè)參數(shù)的名稱和排列順序不能改動(dòng)% 用戶可以根據(jù)自己的要求添加額外的參數(shù),位置依次為第5, 6, 7, 8,9 等。% S 函數(shù)的 flag 參數(shù)是一個(gè)標(biāo)記變量,具有6 個(gè)不同值,分別為0, 1, 2, 3, 4, 9% flag 的 6 個(gè)值分別指向6 個(gè)不同的子函數(shù)% flag 所指向的子函數(shù)也成為回調(diào)方法(Callback Methods)switch flag,%初始化,調(diào)用“模塊初始化”子程序%case 0,sys,x0,str,ts=mdlInitializeSize

18、s;%連續(xù)狀態(tài)變量計(jì)算,調(diào)用“計(jì)算模塊導(dǎo)數(shù)”子函數(shù) %case 1,sys=mdlDerivatives(t,x,u);%更新,調(diào)用“更新模塊離散狀態(tài)”子函數(shù) %case 2,sys=mdlUpdate(t,x,u);%輸出,調(diào)用“計(jì)算模塊輸出”子函數(shù) %case 3,sys=mdlOutputs(t,x,u);%計(jì)算下一時(shí)刻采樣點(diǎn),調(diào)用“計(jì)算下一個(gè)采樣時(shí)刻點(diǎn)”子函數(shù) % case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);%結(jié)束,調(diào)用“結(jié)束仿真”子函數(shù) %case 9,sys=mdlTerminate(t,x,u);%其他的 flag%otherwiseDASt

19、udio.error('Simulink:blocks:unhandledFlag', num2str(flag); end % end sfuntmpl% ”模塊初始化”子函數(shù)%返回大小、初始條件和樣本function sys,x0,str,ts=mdlInitializeSizes% 調(diào)用simsizes函數(shù),返回規(guī)范格式的sizes構(gòu)架%這條指令不要修改sizes = simsizes;%模塊的連續(xù)X態(tài)個(gè)數(shù),0是默認(rèn)值% 用戶可以根據(jù)自己的要求進(jìn)行修改sizes.NumContStates = 0;%模塊的離散X態(tài)個(gè)數(shù),0是默認(rèn)值% 用戶可以根據(jù)自己的要求進(jìn)行修改size

20、s.NumDiscStates = 0;% 模塊的輸出個(gè)數(shù),0是默認(rèn)值% 用戶可以根據(jù)自己的要求進(jìn)行修改sizes.NumOutputs = 0;%模塊的輸入個(gè)數(shù),0是默認(rèn)值% 用戶可以根據(jù)自己的要求進(jìn)行修改sizes.NumInputs= 0;% 模塊中包含的直通前向饋路個(gè)數(shù),1是默認(rèn)值% 用戶可以根據(jù)自己的要求進(jìn)行修改sizes.DirFeedthrough = 1;%模塊中采樣時(shí)間的個(gè)數(shù),1是默認(rèn)值,至少需要一個(gè)樣本時(shí)間% 用戶可以根據(jù)自己的要求進(jìn)行修改sizes.NumSampleTimes = 1;% 初始化后的構(gòu)架sizes經(jīng)simsizes函數(shù)處理后向sys賦值%這條指令不要修改

21、sys = simsizes(sizes);% 給模塊初始值變量賦值,是默認(rèn)值% 用戶可以根據(jù)自己的要求進(jìn)行修改x0 =;%系統(tǒng)保留變量%切勿改動(dòng),保持為空str =;%“二元對(duì)”描述采樣時(shí)間及偏移量。0 0是默認(rèn)值% 0 0適用于連續(xù)系統(tǒng)% -1 0則表示該模塊采樣時(shí)間繼承其前的模塊采樣時(shí)間設(shè)置ts = 0 0;% end mdlInitializeSizes%=%計(jì)算導(dǎo)數(shù)向量function sys=mdlDerivatives(t,x,u)% 此處填寫計(jì)算導(dǎo)數(shù)向量的指令% 是模塊的默認(rèn)值% 用戶必須把算得的離散狀態(tài)的導(dǎo)數(shù)向量賦給syssys =;% end mdlDerivatives%

22、=%計(jì)算離散狀態(tài)向量function sys=mdlUpdate(t,x,u)% 此處填寫計(jì)算離散狀態(tài)向量的指令% 是模塊的默認(rèn)值%用戶必須把算得的離散狀態(tài)向量賦給syssys = ;% end mdlUpdate%=%計(jì)算模塊輸出向量function sys=mdlOutputs(t,x,u)% 此處填寫計(jì)算模塊輸出向量的指令% 是模塊的默認(rèn)值% 用戶必須把算得的模塊輸出向量賦給 syssys =;% end mdlOutputs%= =%計(jì)算下一采樣時(shí)刻function sys=mdlGetTimeOfNextVarHit(t,x,u)% 該子函數(shù)僅在“采樣時(shí)間”情況下使用% sample

23、Time = 1是模塊默認(rèn)設(shè)置,表示在當(dāng)前時(shí)間 1秒后再調(diào)用本 模塊%用戶可以根據(jù)自己的要求修改sampleTime = 1;% 將計(jì)算得到的下一采樣時(shí)刻賦給 sys% 切勿改動(dòng)sys = t + sampleTime;% end mdlGetTimeOfNextVarHit%=function sys=mdlTerminate(t,x,u)%模板默認(rèn)設(shè)置,一般情況不要改動(dòng)sys = ;% end mdlTerminatesimulink 中子模塊的封裝對(duì)于比較復(fù)雜的系統(tǒng),模塊化思想是很有必要的,使得思路較為清晰、錯(cuò)誤容易排查。對(duì)復(fù)雜的系統(tǒng)進(jìn)行仿真,如果將其中獨(dú)立的功能進(jìn)行封裝,會(huì)顯得特別清爽。 這學(xué)期做了電機(jī)仿真和伺服系統(tǒng)仿真,特別感覺(jué)到子模塊封裝的必要性,有效的提高了系統(tǒng)的可讀和可維護(hù)性。在 simulink 中建立子模塊的步驟如下:1、建立系統(tǒng)框圖。這步需要確定輸入輸出的個(gè)數(shù),輸入端為sources中的 in , 輸出端為sinks 中的 out 。 將 Simulink 庫(kù)下的 Ports&Subsystems 中的 Subsystem 拉至 simulink 框圖中。2、功能的搭建。點(diǎn)擊建好的子模塊,在其中進(jìn)行功能模塊的搭建。3、子模塊的封裝。所謂封裝 ( masking ) ,即將其對(duì)應(yīng)的子系統(tǒng)內(nèi)部結(jié)構(gòu)隱含以來(lái)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論