



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、s函數(shù)是system Function的簡稱,用它來寫自己的 simulink模塊。(夠簡單吧,A A,詳細 的概念介紹大伙看幫助吧)可以用matlab、C、C+、Fortran、Ada等語言來寫,這兒我只介紹怎樣用matlab語言來寫吧(主要是它比較簡單)先講講為什么要用 s函數(shù),我覺得用s函數(shù)可以利用 matlab的豐富資源,而不僅僅局限 于simulink提供的模塊,而用 c或C+等語言寫的s函數(shù)還可以實現(xiàn)對硬件端口的操作, 還可以操作windows API等的先介紹一下simulink的仿真過程(以便理解s函數(shù)),simulink的仿真有兩個階段:一個為初始化,這個階段主要是設(shè)置一些參
2、數(shù),像系統(tǒng)的輸入輸出個數(shù)、狀態(tài)初值、采樣時間等;第二個階段就是運行階段,這個階段里要進行計算輸出、更新離散狀態(tài)、計算連續(xù)狀態(tài)等等,這個階段需要反復(fù)運行,直至結(jié)束。在matlab的workspace里打edit sfuntmpl(這是matlab自己提供的s函數(shù)模板),我們 看它來具體分析s函數(shù)的結(jié)構(gòu)。 它的第一行是這樣的:function sys,x0,str ,ts=sfuntmpl(t,x,u,flag)先講輸入與輸出變量的含義:t是采樣時間,x是狀態(tài)變量,u是輸入(是做成 simulink模塊的輸入)二,flag是仿真過程中的狀態(tài)標志(以它來判斷當(dāng)前是初始化還是運行等);sys輸出根據(jù)f
3、lag的不同而不同(下面將結(jié)合flag來講sys的含義),x0是狀態(tài)變量的初始值,str 是保留參數(shù)(mathworks公司還沒想好該怎么用它,嘻嘻,一般在初始化中將它置空就可 以了,str=) , ts是一個1X2的向量,ts(1)是采樣周期,ts(2)是偏移量。下面結(jié)合sfuntmpl.m中的代碼來講具體的結(jié)構(gòu):switch flag,%判斷flag ,看當(dāng)前處于哪個狀態(tài)case 0,sys,x0,str ,ts=mdlInitializeSizes;flag=0 表示處于初始化狀態(tài),此時用函數(shù)mdllnitializeSizes 進行初始化,此函數(shù)在sfuntmpl.m 的 149 行我
4、們找到他,在初始化狀態(tài)下,sys是一個結(jié)構(gòu)體,用它來設(shè)置模塊的一些參數(shù),各個參數(shù)詳細說明如下size = simsizes;% 用于設(shè)置模塊參數(shù)的結(jié)構(gòu)體用simsizes來生成sizes.NumContStates = 0;% 模塊連續(xù)狀態(tài)變量的個數(shù)sizes.NumDiscStates = 0;% 模塊離散狀態(tài)變量的個數(shù)sizes.NumOutputs = 0;%模塊輸出變量的個數(shù)sizes.Numlnputs = 0;% 模塊輸入變量的個數(shù)sizes.DirFeedthrough = 1;%模塊是否存在直接貫通(直接貫通我的理解是輸入能直接控制輸出)sizes.NumSampleTimes
5、 = 1;%模塊的采樣時間個數(shù),至少是一個sys = simsizes(sizes); % 設(shè)置完后賦給 sys輸出舉個例子,考慮如下模型:口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個,我們就只需改上 面那一段代碼為:(一般連續(xù)狀態(tài)與離散狀態(tài)不會一塊用,我這兒是為了方便說明)sizes.NumContStates=1;sizes.
6、NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInpu ts=1;其他的可以不變。繼續(xù)在mdllnitializeSizes函數(shù)中往下看:x0 = 口;狀態(tài)變量設(shè)置為空,表示沒有狀態(tài)變量,以我們上面的假設(shè),可改 為x0=0,0(離散和連續(xù)的狀態(tài)變量我們都設(shè)它初值為0)str = ;%這個就不用說了,保留參數(shù)嘛,置口就可以了,反正沒什么用,可 能7.0會給它一些意義ts = 0 0; %采樣周期設(shè)為0表示是連續(xù)系統(tǒng),如果是離散系統(tǒng)在下面的 mdlGet %TimeOfNextVarHit函數(shù)中具體介紹嘻嘻,總算講完了初始化,后面的應(yīng)該快了 在sfuntm
7、pl的106行繼續(xù)往下看:case 1,sys=mdlDerivatives(t,x,u);flag=1表示此時要計算連續(xù)狀態(tài)的微分,即上面提到的dx/dt=fc(t,x,u)中的dx/dt,找到mdlDerivatives函數(shù)(在193行)如果設(shè)置連續(xù)狀態(tài)變量個數(shù)為0,此處只需sys=;就可以了(如 sfuntmpl中一樣),按我們上述討論的那個模型,此處改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u%我們這兒x(1)是連續(xù)狀態(tài)變量,而 x(2)是離散的,這兒只用到連續(xù)的,此時的輸出sys就是微分繼續(xù),在sfuntmpl的112行:case 2,sys=mdlUpdate
8、(t,x,u);flag=2表示此時要計算下一個離散狀態(tài),即上面提到的x(k+1)=fd(t,x,u),找到mdlUpd ate函數(shù)(在206行)它這兒sys=;表示沒有離散狀態(tài),我們這而可以改成 sys=fd(t,x(2),u) 或 sys=H*x(2)+G*u;%sys 即為 x(k+1)看來后面幾個一兩句話就可了,呵呵,在 sfuntmpl的118行case 3,sys=mdlOutputs(t,x,u);flag=3表示此時要計算輸出,即 y=fo(t,x,u),找到mdlOutputs函數(shù)(在218行),如上,如 果sys=表示沒有輸出,我們改成sys=fo(t,x,u)或sys=C
9、*x+D*u %sys此時為輸出y好像快完了,嘻嘻,在 sfuntmpl的124行case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);flag=4表示此時要計算下一次采樣的時間,只在離散采樣系統(tǒng)中有用(即上文的mdlInitializeSizes中提到的ts設(shè)置ts(1)不為0)連續(xù)系統(tǒng)中只需在mdlGetTimeOfNextVarHit函數(shù)中寫上sys=;這個函數(shù)主要用于變步長的設(shè)置,具體實現(xiàn)大家可以用edit vsfunc看vsfunc.m這個例子最后一個,在 sfuntmpl的130行case 9,sys=mdlTerminate(t,x,u); |flag
10、=9表示此時系統(tǒng)要結(jié)束,一般來說寫上在 mdlTerminate函數(shù)中寫上sys=就可,如果你在結(jié)束時還要設(shè)置什么,就在此函數(shù)中寫 關(guān)于sfuntmpl這個s函數(shù)的模板講完了。s函數(shù)還可以帶用戶參數(shù),下面給個例子,和 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 =
11、 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);x0=;str=;ts=0,0;case 3, sys=gain*u;case 1,2,4,9,sys = 口;endSIMULINK s-function 的設(shè)計Simulink為用戶提供了許多內(nèi)置的基本庫模塊,通過這些模塊進行連接而構(gòu)成系統(tǒng)的模型。對于那些經(jīng)常使用的模塊進行組合并封裝可以構(gòu)建出重復(fù)使用的新模塊,但它依然是基于Simulink原來提供的內(nèi)置模塊。而Simulink s-function 是
12、一種強大的對模塊庫進行擴展的新工具。(一)、s-function 的概念s-function是一個動態(tài)系統(tǒng)的計算機語言描述,在MATLAB里,用戶可以選擇用 m文件編寫,也可以用c或mex文件編寫,在這里只給大家介紹如何用m文件編寫s-function 。S-function提供了擴展Simulink模塊庫的有力工具,它采用一種特定的調(diào)用語法,使函數(shù)和 Simulink解法器進行交互。S-function最廣泛的用途是定制用戶自己的 Simulink模塊。它的形式十分通用,能夠支持連續(xù)系統(tǒng)、離散系統(tǒng)和混合系統(tǒng)。(二卜建立m文件s-function1、使用模板文件:sfuntmp1. m 格式:
13、sys,x0=function(t,x,u,flag)該模板文件位于 MATLAB根目錄下toolbox/simulink/blocks目錄下。模板文件里s-function的結(jié)構(gòu)十分簡單,它只為不同的 flag的值指定要相應(yīng)調(diào)用的m文件子函數(shù)。比如當(dāng) flag=3時,即模塊處于計算輸出這個仿真階段時,相應(yīng)調(diào)用的子函數(shù)為 sys=mdloutputs(t,x,u) 。模板文件使用switch語句來完成這種指定,當(dāng)然這種結(jié)構(gòu)并不唯一,用戶也可以使用 if語 句來完成同樣的功能。而且在實際運用時,可以根據(jù)實際需要來去掉某些值,因為并不是每個模塊都需要經(jīng)過所有的子函數(shù)調(diào)用。模板文件只是Simulin
14、k為方便用戶而提供的一種參考格式,并不是編寫s-function的語法要求,用戶完全可以改變子函數(shù)的名稱,或者直接把代碼寫在主函數(shù)里,但使用模板文件的好處是,比較方便,而且條理清晰。使用模板編寫s-function ,用戶只需把s-函數(shù)名換成期望的函數(shù)名稱,如果需要額外的輸入?yún)⒘?,還需在輸入?yún)?shù)列表的后面增加這些參數(shù),因為前面的 4個參數(shù)是simulink調(diào)用 s-function時自動傳入的。對于輸出參數(shù),最好不做修改。接下去的工作就是根據(jù)所編s-function要完成的任務(wù),用相應(yīng)的代碼去替代模板里各個子函數(shù)的代碼即可。Simulink在每個仿真階段都會對 s-function進行調(diào)用,在
15、調(diào)用時,Simulink會根據(jù)所處的仿 真階段為flag傳入不同的值,而且還會為sys這個返回參數(shù)指定不同的角色, 也就是說盡管 是相同的sys變量,但在不同的仿真階段其意義卻不相同,這種變化由 simulink自動完成。 m文件s-function可用的子函數(shù)說明如下:mdlInitializeSizes(flag=0):定義s-function模塊的基本特性,包括采樣時間、連續(xù)或者離散 狀態(tài)的初始條件和 sizes數(shù)組。mdlDerivatives(flag=1):計算連續(xù)狀態(tài)變量的微分方程。mdlUpdate(flag=2):更新離散狀態(tài)、采樣時間和主時間步的要求。mdlOutputs(
16、flag=3):計算 s-function 的輸出。mdlGetTimeOfNextVarHit(flag=4):計算下一個采樣點的絕對時間,這個方法僅僅是在用戶 在mdlInitializeSizes 里說明了一個可變的離散采樣時間。概括說來,建立 s-function可以分成兩個分離的任務(wù):初始化模塊特性包括輸入輸出信號的寬度,離散連續(xù)狀態(tài)的初始條件和采樣時間。將算法放到合適的 s-function子函數(shù)中去。2、定義s-function的初始信息為了讓Simulink識別出一個 m文彳s-function ,用戶必須在s-函數(shù)里提供有關(guān) s-函數(shù)的說 明信息,包括采樣時間、連續(xù)或者離散狀
17、態(tài)個數(shù)等初始條件。這一部分主要是在 mdlInitializeSizes 子函數(shù)里完成。Sizes數(shù)組是s-function函數(shù)信息的載體,它內(nèi)部的字段意義為:NumContStates(sys(1):連續(xù)狀態(tài)的個數(shù)(狀態(tài)向量連續(xù)部分的寬度)NumDiscStates(sys(2):離散狀態(tài)的個數(shù)(狀態(tài)向量離散部分的寬度)NumOutputs(sys(3):輸出變量的個數(shù)(輸出向量的寬度)NumInputs(sys(4):輸入變量的個數(shù)(輸入向量的寬度)DirFeedthrough(sys(5):有不連續(xù)根的數(shù)量NumSampleTimes(sys(6):采樣時間的個數(shù),有無代數(shù)循環(huán)標志如果字
18、段代表的向量寬度為動態(tài)可變,則可以將它們賦值為一1。注意DirFeedthrough是一個布爾變量,它的取值只有 0和1兩種,0表示沒有直接饋入,此時用戶在編寫 mdlOutputs子函數(shù)時就要確保子函數(shù)的代碼里不出現(xiàn)輸入變量u; 1表示有直接饋入。NumSampleTimes表示采樣時間的個數(shù),也就是 ts變量的行數(shù),與用戶對ts的定義有關(guān)。需要指出的是,由于 s-function會忽略端口,所以當(dāng)有多個輸入變量或多個輸出變量時,必 須用mux模塊或demux模塊將多個單一輸入合成一個復(fù)合輸入向量或?qū)⒁粋€復(fù)合輸出向量 分解為多個單一輸出。3、輸入和輸出參量說明S-function默認的4個輸入?yún)?shù)為t、x、u和flag ,它們的次序不能變動,代表的意義分別 為:t:代表當(dāng)前的仿真時間,這個輸入?yún)?shù)通常用于決定下一個采樣時刻,或者在多采樣速率 系統(tǒng)中,用來區(qū)分不同的采樣時刻點,并據(jù)此進行不同的處理。x:表示狀態(tài)向量,這個參數(shù)是必須的,甚至在系統(tǒng)中不存在狀態(tài)時也是如此。它具有很靈 活的運用。u:表示輸入向量。flag :是一個控制在每一個仿真階段調(diào)用哪一個子函數(shù)的參數(shù),由Simulink在調(diào)用時自動取值。S-function默認的4個返回參數(shù)為sys、x0、它們的次序不能變動,代表的意義分別為:sys:是一個通用的返
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)場出租帶豬圈合同范例
- 危房申請合同范例
- 公司餐飲配送合同范例
- 上海郊區(qū)房屋租賃合同范例
- 公司水果采購合同范例
- 廠區(qū)安保合同范例
- 書畫加盟合同范例
- 個人房子買賣合同范例
- 廚房裝潢合同范例
- 廠區(qū)修路合同范例
- 廣西武宣縣甘祿龍伴礦業(yè)有限公司武宣縣風(fēng)沿礦區(qū)鉛鋅礦采礦權(quán)出讓收益評估報告
- GB/T 41837-2022溫泉服務(wù)溫泉水質(zhì)要求
- GB/T 7588.2-2020電梯制造與安裝安全規(guī)范第2部分:電梯部件的設(shè)計原則、計算和檢驗
- GB/T 17457-2019球墨鑄鐵管和管件水泥砂漿內(nèi)襯
- 緊急采購申請單
- 復(fù)旦大學(xué)英語水平測試大綱9300詞匯表講義
- 最新青島版科學(xué)四年級上冊《溫度計的秘密》優(yōu)質(zhì)課件
- DB63-T 1675-2018+建筑消防設(shè)施維護保養(yǎng)技術(shù)規(guī)范
- 四年級上冊美術(shù)課件-第12課 精美的郵票 ▏人教新課標 ( ) (共21張PPT)
- 爐內(nèi)水處理磷酸鹽處理(PT)、磷酸鹽隱藏匯總課件
- 邊坡變形觀測報告
評論
0/150
提交評論