Simulink建模和仿真_第1頁(yè)
Simulink建模和仿真_第2頁(yè)
Simulink建模和仿真_第3頁(yè)
Simulink建模和仿真_第4頁(yè)
Simulink建模和仿真_第5頁(yè)
已閱讀5頁(yè),還剩122頁(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、圖7.1.1 Simulink模型元素關(guān)聯(lián)圖 表表7.2.2 Sinks7.2.2 Sinks庫(kù)庫(kù)表表7.2.3 Discrete7.2.3 Discrete庫(kù)庫(kù)表表7.2.4 Continuous7.2.4 Continuous庫(kù)庫(kù)表表7.2.5 7.2.5 MathMath庫(kù)庫(kù)表表7.2.6 Function and Tables7.2.6 Function and Tables函數(shù)函數(shù) 表表7.2.7 Nonlinear 7.2.7 Nonlinear 庫(kù)庫(kù)表表7.2.8 7.2.8 Signal Signal and and SystemsSystems庫(kù)庫(kù)表表7.2.8 Signal

2、 and Systems7.2.8 Signal and Systems庫(kù)庫(kù)圖圖7.2.3 Sinks7.2.3 Sinks庫(kù)庫(kù) 圖圖7.2.4 Discrete7.2.4 Discrete庫(kù)庫(kù) 圖圖7.2.5 Continuous7.2.5 Continuous庫(kù)庫(kù) 圖圖7.2.6 Math7.2.6 Math庫(kù)庫(kù) 圖圖7.2.7 Nonlinear7.2.7 Nonlinear庫(kù)庫(kù) 圖圖7.2.8 Signak & Systems7.2.8 Signak & Systems庫(kù)庫(kù) 圖圖7.2.9 Subsystems7.2.9 Subsystems庫(kù)庫(kù) 圖圖7.2.10 Fu

3、nctions & Tables7.2.10 Functions & Tables庫(kù)庫(kù) 圖圖7.2.11 7.2.11 積分模塊屬性對(duì)話框積分模塊屬性對(duì)話框 圖圖7.3.1 7.3.1 選取多個(gè)模塊選取多個(gè)模塊 圖圖7.3.2 7.3.2 在同一模在同一模型窗口內(nèi)型窗口內(nèi)復(fù)制模塊復(fù)制模塊 圖圖7.3.3 7.3.3 模塊參數(shù)設(shè)置對(duì)話模塊參數(shù)設(shè)置對(duì)話 圖圖7.3.4 7.3.4 模塊特性設(shè)置對(duì)話框模塊特性設(shè)置對(duì)話框 如果參數(shù)的值不是字符串或數(shù)字,參數(shù)值的位置會(huì)顯示N/S(not supported)。如果參數(shù)名無(wú)效,參數(shù)值的位置將顯示“?”。 圖圖7.3.5 7.3.5 設(shè)置屬性

4、格式字符串后的效果設(shè)置屬性格式字符串后的效果圖圖7.3.7 7.3.7 模塊的陰影效果模塊的陰影效果 圖圖7.3.6 7.3.6 調(diào)整模塊的方向調(diào)整模塊的方向 圖圖7.3.8 7.3.8 兩模塊不在同一水平線上兩模塊不在同一水平線上 圖圖7.3.9 7.3.9 調(diào)整連線的位置(一)調(diào)整連線的位置(一) 圖圖7.3.10 7.3.10 調(diào)整連線的位置(二)調(diào)整連線的位置(二) 圖圖7.3.11 7.3.11 連線的連線的分支分支 圖圖7.3.12 7.3.12 用粗線表示用粗線表示向量向量 圖圖7.3.13 7.3.13 在連線上顯示數(shù)據(jù)類型在連線上顯示數(shù)據(jù)類型 (3) (3) 信號(hào)標(biāo)記信號(hào)標(biāo)記

5、 為了使模型更加直觀、可讀性更強(qiáng),我們可以為傳輸?shù)男盘?hào) 作標(biāo)記。 建立信號(hào)標(biāo)記的辦法是:雙擊要做標(biāo)記的線段,出現(xiàn)一個(gè)小 文本編輯框,在里面輸入標(biāo)記的文本,這樣就建立了一個(gè)信 號(hào)標(biāo)記。信號(hào)標(biāo)記可以隨信號(hào)的傳輸從一些模塊中進(jìn)行傳遞。 支持這種傳遞的模塊有Mux、Demux、Inport、From、 Selector、Subsystem和Enable。 圖圖7.3.14 7.3.14 信號(hào)標(biāo)記的建立信號(hào)標(biāo)記的建立 圖圖7.3.15 7.3.15 信號(hào)標(biāo)記的傳遞信號(hào)標(biāo)記的傳遞 xeFwFhF圖圖7.4.1 7.4.1 斜坡上的汽車斜坡上的汽車 由牛頓第二定律,汽車的運(yùn)動(dòng)方程為:hweFFFxm eFK

6、gFe100,10002000汽車的質(zhì)量為假設(shè)其中m代表汽車的質(zhì)量,x為汽車的位移。 在實(shí)際系統(tǒng)中總會(huì)有下界和上界,上界為發(fā)動(dòng)機(jī)的最大推動(dòng)力,下界為剎車時(shí)的最大制動(dòng)力。22VP001.02ACDtVw011.0sin10201. 0sin20001. 0txFwx0001.0sin0093.0 xFh0001.0sin30 xxKFdesiredeccFdesiredx eK50eK比例控制器的輸入為汽車的期望速度值,它由一個(gè)滑塊增益模塊(Slider Gain)外加一個(gè)常數(shù)輸入模塊(Constant)組成。比例控制器由一個(gè)用來(lái)計(jì)算速度誤差的求和模塊(Sum)和一個(gè)增益模塊Ke組成。發(fā)動(dòng)機(jī)輸出

7、力的上界和下界由兩個(gè)最值模塊來(lái)實(shí)現(xiàn)(也可以用非線性模塊庫(kù)中的飽和模塊來(lái)實(shí)現(xiàn))。 圖圖7.4.2 7.4.2 比例速比例速度控制度控制的汽車的汽車模型模型圖圖7.4.3 7.4.3 汽車的速度變化曲線汽車的速度變化曲線說(shuō)明:說(shuō)明:此模型也是一個(gè)輕度剛性問(wèn)題的很好的例子,為了觀察剛性的影響,先以解法0DE45l來(lái)運(yùn)行模型,然后選擇0DE15S再運(yùn)行仿真,觀察其區(qū)別。圖7.4.4 連續(xù)PID控制器 vKup0tiivdtKu0iuvKuddTkvkvud1zzTKzVzUdd1圖圖7.4.5 7.4.5 離散控制器的汽車模型離散控制器的汽車模型 75,75. 0,50dipKKK圖圖7.4.6 7.

8、4.6 汽車速度控制曲線汽車速度控制曲線圖圖7.5.1 7.5.1 比例速度比例速度控制的汽控制的汽車模型車模型 圖圖7.5.2 7.5.2 子模塊化了的汽車模型子模塊化了的汽車模型 (a) (a) 控制子系統(tǒng)控制子系統(tǒng) (b) (b) 發(fā)動(dòng)機(jī)動(dòng)力子系統(tǒng)發(fā)動(dòng)機(jī)動(dòng)力子系統(tǒng)圖7.5.3 子系統(tǒng)分解 子系統(tǒng)的另外一個(gè)重要的功能是把反復(fù)使用的模塊組壓縮成子系統(tǒng)后重復(fù)使用。在本例中,如果要比較在同一控制系統(tǒng)控制下不同發(fā)動(dòng)機(jī)的工作效率,只需要替換新的發(fā)動(dòng)機(jī)子系統(tǒng)而不是重建一個(gè)新的系統(tǒng)。這樣的控制系統(tǒng)就可以反復(fù)利用。注意:這種做法不僅節(jié)省了建模時(shí)間,而且可以保證在多次建模中不會(huì)因失誤而在控制子系統(tǒng)中出現(xiàn)差錯(cuò)

9、,這在大型的復(fù)雜系統(tǒng)建模中是非常重要的。創(chuàng)建Simulink子系統(tǒng)共有兩種方法:一種辦法是對(duì)已存在的模型的某些部分或全部使用菜單命令【Edit/Create Subsystem】進(jìn)行壓縮轉(zhuǎn)化,使之成為子系統(tǒng);另一種方法是使用Connections模塊庫(kù)中的Subsystem模塊直接創(chuàng)建子系統(tǒng)。下面分別介紹這兩種方法。一、壓縮子系統(tǒng)一、壓縮子系統(tǒng)把已經(jīng)存在的Simulink模型中的某個(gè)部分或全部壓縮成子系統(tǒng)的操作如下:步驟一:步驟一:首先使用范圍框?qū)⒁獕嚎s成子系統(tǒng)的部分選中,包括模塊和信號(hào)線,如圖7.5.4所示。 圖7.5.4 選中要壓縮的模塊注意:注意:在這種情況下只能用范圍框,而不能用Shi

10、ft逐個(gè)選定。 為了能使范圍框框住所有需要的模塊,重新安排模塊的 位置常常似乎是必要的。步驟二:步驟二:在模塊窗口菜單選項(xiàng)中選擇【EditCreat Subsystem】,Simulink將會(huì)用一個(gè)子系統(tǒng)模塊代替被選中的模塊組,如圖7.5.5所示。圖圖7.5.5 7.5.5 壓縮后的模型圖壓縮后的模型圖 步驟三:步驟三:子系統(tǒng)模塊將有一個(gè)默認(rèn)輸入端口和輸出端口。輸入端口和輸出端口的默認(rèn)名分別為In1和Out1。調(diào)整子系統(tǒng)和模型窗口的大小使之美觀,如圖7.5.6所示。圖圖7.5.6 壓縮后的模型圖壓縮后的模型圖 若想查看子系統(tǒng)內(nèi)容或?qū)ψ酉到y(tǒng)進(jìn)行再編輯,可以雙擊子系統(tǒng)模塊,則會(huì)出現(xiàn)一個(gè)顯示子系統(tǒng)內(nèi)

11、容的新窗口。在窗口內(nèi),除了原始的模塊外,Simulink自動(dòng)添加了輸入模塊和輸出模塊,分別代表子系統(tǒng)的輸入端口和輸出端口。改變它們的標(biāo)簽會(huì)使子系統(tǒng)的輸入輸出端口的標(biāo)簽也隨著變化。特別注意:特別注意:菜單命令【Edit/Creat Subsystem】沒(méi)有相反的操作命令。也就是說(shuō)一旦將一組模塊壓縮成子系統(tǒng),就沒(méi)有直接還原的處理方法了(UNDO除外)。因此一個(gè)理想的處理方法是在壓縮子系統(tǒng)之前先把模型保存一下,作為備份。二、子系統(tǒng)模塊二、子系統(tǒng)模塊在創(chuàng)建模型的時(shí)候,如果需要一個(gè)子系統(tǒng),也可以直接在子系統(tǒng)窗口中創(chuàng)建。這樣就省去了上面的壓縮子系統(tǒng)和重新安排窗口的步驟。例7.5.1 模擬如圖7.5.7所示

12、的彈簧質(zhì)量系統(tǒng)的運(yùn)動(dòng)狀態(tài)。單個(gè)小車系統(tǒng)的運(yùn)動(dòng)方程如下:nnnnnnnxxknxkmx1111 1x2x3x圖圖7.5.7 彈簧質(zhì)量系統(tǒng)彈簧質(zhì)量系統(tǒng) 先建立如圖7.5.8所示的單個(gè)小車系統(tǒng)的子系統(tǒng) nx1nx1nx圖圖7.5.8 單個(gè)小車系統(tǒng)單個(gè)小車系統(tǒng) 使用子系統(tǒng)模塊創(chuàng)建如圖7.5.9所示的子系統(tǒng),此子系統(tǒng)用來(lái)模擬一個(gè)小車的運(yùn)動(dòng)。子系統(tǒng)的輸入為小車的左距x(n-1)和右距x(n+1),輸出為小車的當(dāng)前位置x(n).子系統(tǒng)完成之后,關(guān)閉 子系統(tǒng)窗口。復(fù)制兩次此子系統(tǒng)模塊,并如圖7.5.10所示鏈接起來(lái)。圖圖7.5.9 7.5.9 小車小車1 1的子系統(tǒng)模型的子系統(tǒng)模型 圖圖7.5.10 使用子系

13、統(tǒng)的三小車模型使用子系統(tǒng)的三小車模型為了可以對(duì)每個(gè)小車的參數(shù)進(jìn)行賦值,要做以下設(shè)置: 對(duì)小車1,將標(biāo)簽為L(zhǎng)eftSpring的增益模塊的增益系數(shù)設(shè)置為k1,標(biāo)簽為RightSpring 的增益模塊的增益系數(shù)設(shè)置為k2,標(biāo)簽為1/mass的增益模塊的增益系數(shù)設(shè)置為1/m1。設(shè)置速度積分模塊的初始值為0,位置積分模塊的初始值為1。 對(duì)小車2,將標(biāo)簽為L(zhǎng)eftSpring 的增益模塊的增益系數(shù)設(shè)置為k2,標(biāo)簽為RightSpring 的增益模塊的增益系數(shù)設(shè)置為k3,標(biāo)簽為1/mass的增益模塊的增益系數(shù)設(shè)置為1/m2。設(shè)置速度積分模塊的初始值為0,位置積分模塊的初始值為1。 對(duì)小車3,將標(biāo)簽為L(zhǎng)ef

14、tSpring的增益模塊的增益系數(shù)設(shè)置為k3,標(biāo)簽為RightSpring 的增益模塊的增益系數(shù)設(shè)置為k4,標(biāo)簽為1/mass的增益模塊的增益系數(shù)設(shè)置為1/m3。設(shè)置速度積分模塊的初始值為0,位置積分模塊的初始值為1。7.5.2 子系統(tǒng)的封裝子系統(tǒng)的封裝封裝技術(shù)是將Simulink子系統(tǒng)“包裝”成一個(gè)模塊,并可以如同使用Simulink內(nèi)部模塊一樣使用的技術(shù)。每個(gè)封裝模塊都可以有一個(gè)自定義的圖標(biāo)用來(lái)設(shè)定參數(shù)的對(duì)話框,參數(shù)設(shè)定方法也與Simulink模塊庫(kù)中的內(nèi)部模塊完全相同。為了更好的理解封裝的含義,見圖7.5.10所示的模型。此模型與例7.5.1中的模型完全等價(jià),但它要更容易使用。雙擊Spr

15、ing-mass1模塊可以打開該模塊屬性的對(duì)話框。與例7.5.1中打開每個(gè)模塊去修改參數(shù)不同,這里可以直接在此對(duì)話框中輸入?yún)?shù)。對(duì)話框的結(jié)構(gòu)與形式都和“原裝”的模型毫無(wú)兩樣。本節(jié)將主要以此彈簧質(zhì)量系統(tǒng)為例來(lái)詳細(xì)介紹創(chuàng)建一個(gè)封裝模塊的步驟。創(chuàng)建一個(gè)封裝模塊的主要步驟分為三步: 創(chuàng)建一個(gè)子系統(tǒng); 選中子系統(tǒng),選擇模型窗口菜單中的【EditMask subsystem】選項(xiàng)生成封裝模塊; 使用封裝編輯器設(shè)置封裝文本、對(duì)話框和圖標(biāo)。一、子系統(tǒng)到封裝模塊的轉(zhuǎn)換一、子系統(tǒng)到封裝模塊的轉(zhuǎn)換當(dāng)按照上節(jié)中介紹的方法創(chuàng)建以彈簧質(zhì)量子系統(tǒng)模塊之后(如圖7.5.10所示),將其復(fù)制到一個(gè)新的窗口中,如圖7.5.11所

16、示。選中此模塊,在窗口的菜單中執(zhí)行【EditMask subsystem】指令,彈出如圖7.5.12所示的一個(gè)封裝編輯對(duì)話框。該對(duì)話框有三個(gè)選項(xiàng)卡。下面分別討論這三個(gè)選項(xiàng)卡的功能和使用。圖圖7.5.11 將子系統(tǒng)復(fù)制到新窗口將子系統(tǒng)復(fù)制到新窗口 圖圖7.5.12 封裝編輯對(duì)話框封裝編輯對(duì)話框(1) 文本頁(yè)文本頁(yè) Documentation圖7.5.13是編輯器的文本頁(yè)。它也包括三個(gè)區(qū)域,每個(gè)區(qū)域都為一個(gè)自由區(qū),既可填寫也可以不填寫。 Mask type:該區(qū)內(nèi)容將作為模塊的類型顯示在封裝模塊的對(duì)話框中。 Block description:此區(qū)中的內(nèi)容將顯示在封裝模塊對(duì)話框的上部,它的位置在后

17、面的圖中可能看得更清楚。其內(nèi)容腦殼描述模塊的功用的簡(jiǎn)短語(yǔ)句或其它關(guān)于使用此模塊的注意事項(xiàng)等。 Block help:當(dāng)對(duì)話框中的【help】按鈕按下時(shí),MATLAB的幫助系統(tǒng)將顯示此區(qū)中的內(nèi)容,其內(nèi)容應(yīng)當(dāng)包括使用此模塊的詳細(xì)說(shuō)明。(2) 初始化頁(yè)初始化頁(yè) Initialization初始化頁(yè)是用來(lái)設(shè)置封裝模塊參數(shù)項(xiàng)的,如圖7.5.14所示。此頁(yè)也包括三個(gè)區(qū)域。 上區(qū)為Mask type區(qū)。此封裝類型區(qū)與文本頁(yè)中的封裝類型區(qū)是等同的,可以在任意一頁(yè)中定義或改變封裝類型。 中區(qū)是用來(lái)設(shè)置封裝模塊對(duì)話框中的輸入變量項(xiàng)目,如輸入變量或操作選擇等等。此區(qū)包括一個(gè)滾動(dòng)項(xiàng)目列表、一套“加入”、“刪除”和“移

18、動(dòng)”按鈕,以及5個(gè)設(shè)置項(xiàng)目屬性的編輯區(qū)。 底區(qū)為Initialization commands,在此區(qū)中可以輸入MATLAB語(yǔ)句,如定義變量、初始變量值等等。 封裝子系統(tǒng)與非封裝子系統(tǒng)的一個(gè)重要的區(qū)別在于模塊對(duì)話框中變量的作用范圍。非封裝子系統(tǒng)模塊中的變量可以直接在MATLAB工作間中賦值。而封裝子系統(tǒng)的模塊則不能。封裝子系統(tǒng)有一個(gè)獨(dú)立于MATLAB工作間及其它子系統(tǒng)的內(nèi)部存儲(chǔ)空間、這個(gè)特點(diǎn)可以防止模塊變量與其它工作間中無(wú)關(guān)變量的沖突。因此,在封裝模塊中用到的變量要在封因此,在封裝模塊中用到的變量要在封裝編輯器對(duì)話區(qū)或初始命令區(qū)中設(shè)置。裝編輯器對(duì)話區(qū)或初始命令區(qū)中設(shè)置。圖圖7.5.13 封裝編

19、輯器的文本頁(yè)封裝編輯器的文本頁(yè) 圖圖7.5.14 封裝編輯器的初始化頁(yè)封裝編輯器的初始化頁(yè)(3) 圖標(biāo)頁(yè)圖標(biāo)頁(yè) Icon編輯器的圖標(biāo)頁(yè)如圖7.5.12所示,它是用來(lái)給封裝模塊設(shè)計(jì)自定義圖標(biāo)的。此頁(yè)分6個(gè)區(qū)。頂區(qū)的【Mask type】同其它兩頁(yè)中的【Mask type】是等同的?!綝eawing commands】區(qū)是以MATLAB語(yǔ)句來(lái)繪制圖標(biāo)的編輯區(qū)。其余的4個(gè)區(qū)是用來(lái)指定圖標(biāo)的屬性,理解了圖標(biāo)的這些屬性再來(lái)分析圖標(biāo)的繪制命令是很容易的。 Icon fram: 第一個(gè)屬性為圖標(biāo)框選項(xiàng),他由一個(gè)下拉菜單組成,分別有可見、不可見選項(xiàng)。所謂的圖標(biāo)框即圖標(biāo)的邊界線。 Icon transparen

20、cy:第二個(gè)屬性為圖標(biāo)的透明度選項(xiàng),也是由一個(gè)下拉菜單組成,有兩個(gè)選項(xiàng),透明和不透明。 Icon rotation:第三個(gè)選項(xiàng)為圖標(biāo)旋轉(zhuǎn)選項(xiàng),其下拉菜單選項(xiàng)為固定和旋轉(zhuǎn)。這個(gè)選項(xiàng)決定了當(dāng)執(zhí)行【FormatFlip block】或【FormalRotate Block】指令時(shí)的圖標(biāo)形狀。 Drawing cooedenates:最后一個(gè)區(qū)是圖形坐標(biāo)區(qū),用來(lái)設(shè)置繪圖的比例。它有三個(gè)選項(xiàng): Pixed:用來(lái)設(shè)置繪圖系為絕對(duì)坐標(biāo)系,其效果為當(dāng)模塊圖調(diào)整大小時(shí),圖標(biāo)不隨其大小的改變而改變。此參數(shù)下的坐標(biāo)系應(yīng)為象素點(diǎn)坐標(biāo),圖標(biāo)的左下角為坐標(biāo)系的原點(diǎn)。 Autoscale:該選項(xiàng)使得圖標(biāo)圖形恰好充滿整個(gè)模塊

21、。 Normalized:該選項(xiàng)是設(shè)置繪圖比例在0河1之間的選項(xiàng)。圖標(biāo)的左下角的坐標(biāo)定義為(0,0),模塊的右上角坐標(biāo)定義為(1,1)。當(dāng)模塊調(diào)整大小的時(shí)候,坐標(biāo)系同樣被調(diào)整。 二、查看封裝和解封裝二、查看封裝和解封裝對(duì)于一個(gè)已封裝的子系統(tǒng)要想查看其封裝前子系統(tǒng)的具體內(nèi)容,可以選著菜單命令【EditLook Under mask】。若要對(duì)已經(jīng)封裝的模塊進(jìn)行解封裝操作,要先選中此模塊,打開封裝編輯器,按下Unmask按鈕,則封裝就被解開。若要再次封裝此子系統(tǒng),選著【EditMask subsystem】即可?;卣{(diào)是一種回調(diào)是一種MATLAB命令,他在某種事件,如打開模塊或命令,他在某種事件,如打

22、開模塊或雙擊模塊等情況發(fā)生時(shí)執(zhí)行。雙擊模塊等情況發(fā)生時(shí)執(zhí)行。例如,通常雙擊一個(gè)模塊時(shí),屏幕上將會(huì)顯示出此模4塊的對(duì)話框。而對(duì)示波器模塊,雙擊它將會(huì)執(zhí)行一個(gè)顯示示波器的回調(diào)函數(shù)?;卣{(diào)與回調(diào)與MATLAB的圖形處理有著很緊密的聯(lián)系。的圖形處理有著很緊密的聯(lián)系。例如,當(dāng)使用圖形處理工具創(chuàng)建一個(gè)菜單時(shí),每個(gè)菜單選項(xiàng)通常是與同一個(gè)回調(diào)相對(duì)應(yīng)的,它會(huì)在選項(xiàng)被選中時(shí)自動(dòng)執(zhí)行?;卣{(diào)可以是一句非常簡(jiǎn)單的MATLAB命令。例如,若菜單選項(xiàng)為【Close Figure】,比較合適的回調(diào)語(yǔ)句是MATLAB命令close?;卣{(diào)在更多的情況下是一個(gè)可以完成指定操作的回調(diào)在更多的情況下是一個(gè)可以完成指定操作的M文文件。件。

23、7.6.1 回調(diào)函數(shù)的介紹回調(diào)函數(shù)的介紹使用MATLAB的set_param命令可以加載回調(diào),具體格式為set_param(object,parameter,value)其中: object為包含模型名或模塊路徑的MATLAB字符串。如果回調(diào)是關(guān)于模型動(dòng)作的,則object為模型名。例如,一模型以car_mod.mdl為名保存,則object應(yīng)當(dāng)為car_mod。如果回調(diào)是關(guān)于模塊的,則此模塊的Simulink路徑將成為object。例如,對(duì)于car_mod模型中的子系統(tǒng)Controller中的Gain_1模塊,object應(yīng)為字符串car_mod/Controller/Gain_1。 par

24、ameter是一個(gè)包含回調(diào)參數(shù)的MATLAB字符串。 value是包含回調(diào)函數(shù)名的字符串。例如,回調(diào)一名為set_gain.m的M文件,則value應(yīng)為字符串set_gain。例7.6.1 考慮圖7.6.1所示的Simulink模型。若模型以callb_1.mdl為名保存,其中常數(shù)塊的值設(shè)置為In_val。希望在用戶打開模型的時(shí)候,模型會(huì)自動(dòng)提示要求輸入In_val的值。圖圖7.6.1 使用回調(diào)初始化的模型圖使用回調(diào)初始化的模型圖用下面名為initm_1.m的簡(jiǎn)單M文件來(lái)實(shí)現(xiàn)回調(diào),此M文件只有一個(gè)一條語(yǔ)句: In_val=input(Enter the valuv:);為了在模型打開的時(shí)候自動(dòng)

25、加載此回調(diào),打開模型,并在MATLAB命令窗口中輸入: set_param(callb_1,PreloadFcn,inetm_1)保存此模型并關(guān)閉。下一次打開模型的時(shí)候,MATLAB會(huì)自動(dòng)提示: Enter the value:并將輸入值賦給In_val變量。若希望當(dāng)仿真開始之前而不是模型打開時(shí)再輸入?yún)?shù)值,則需要下面的命令來(lái)加載回調(diào): set_param(callb_1,InitFcn,inetm_1)7.6.2 基于回調(diào)的圖形用戶界面基于回調(diào)的圖形用戶界面使用回調(diào)可以很容易地為使用回調(diào)可以很容易地為Simulink模型創(chuàng)建一個(gè)圖形用戶界模型創(chuàng)建一個(gè)圖形用戶界面。面。線性模塊庫(kù)中的滑塊增益模

26、塊就是一個(gè)很好的例子。此模塊是一個(gè)帶有回調(diào)所產(chǎn)生的用戶界面的增益模塊,其界面如圖7.6.2所示。本小節(jié)介紹這種圖形界面的創(chuàng)建過(guò)程和相關(guān)的程序問(wèn)題。圖圖7.6.2 滑塊增益模塊的用戶界面窗口滑塊增益模塊的用戶界面窗口 在Simulink模型中,帶有基于回調(diào)的圖形界面的模塊可以通過(guò)雙擊使回調(diào)函數(shù)加載。打開后應(yīng)響應(yīng)如下事件: 雙擊模塊打開用戶界面(OpenFcn)。此回調(diào)應(yīng)包括創(chuàng)建界面圖形并對(duì)其初始化的程序,而且程序還要確認(rèn)在打開之前沒(méi)有其它同一模塊的圖形界面打開。 刪除該模塊(DeleteFcn),則關(guān)閉相應(yīng)的界面圖形。 包含該模塊的模型被關(guān)閉(ModelCloseFcn),則關(guān)閉界面。 包含該模

27、塊的子系統(tǒng)被關(guān)閉(ParentCloseFcn),則關(guān)閉界面。 界面窗口的控制按鈕操作。經(jīng)驗(yàn)表明在回調(diào)M文件中加入加載回調(diào)的語(yǔ)句是非常有用的。一旦程序被執(zhí)行,則回調(diào)將會(huì)成為模型的一個(gè)參數(shù)部分,運(yùn)行速度大大提高。如下所示的一段程序代碼可以作為回調(diào)函數(shù)M文件的一個(gè)樣板,讀者可以從中看出此類文件的一般規(guī)律,稍作修改,即可應(yīng)用于其它情況。function clbktplt(varargin)% Callback function template% Install this callback by invoking it with the command% clbktplt(init_block)%

28、at the MATLAB prompt with the appropriate model file open and selected.% To use the template, save a copy under a new name. Then replace % clbktplt with the new name everywhere it appears.action = varargin1 ;switch action, case init_block, init_fcn ; % Block initialization function, % located in thi

29、s M-file case create_fig, if(findobj(UserData,gcb) % Dont open two for same block disp(Only open one instance per block can be opened) else % Here, put all commands needed to set up the figure and its % callbacks. left = 100 ; % Figure position values bottom = 100 ; width = 100 ; height = 100 ; h_fi

30、g = figure(Position,left bottom width height, . MenuBar,none) ; set(h_fig,UserData,gcb) ; % Save name of current block in % the figures UserData. This is % used to detect that a clbktplt fig % is already open for the current block, % so that only one instance of the figure % is open at a time. end c

31、ase close_fig, % Close if open when model is closed. h_fig = findobj(UserData,gcb) ; if(h_fig) % Is the figure for current block open? close(h_fig) ; % If so, close it. end case rename_block, % Change the name in the figure UserData. h_fig = findobj(UserData,gcb) ; if(h_fig) % Is the figure open? se

32、t(h_fig,UserData,gcb) ; % If so, change the name. end %*%* init_fcn * %* case UserAction1, % Place cases for various user actions % here. These callbacks should be defined % when the figure is created.endfunction init_fcn()% Configure the block callbacks% This function should be executed once when t

33、he block is created% to define the callbacks. After it is executed, save the model% and the callback definitions will be saved with the model. There is no need% to reinstall the callbacks when the block is copied; they are part of the% block once the model is saved.sys = gcs ;block = sys,/InitialBlo

34、ckName ; % Replace InitialBlockName with the % name of the block when it is % created and initialized. This does % not need to be changed when the block % is copied, as the callbacks wont be % reinstalled.set_param(block,OpenFcn, clbktplt create_fig,. ModelCloseFcn,clbktplt close_fig, . DeleteFcn, c

35、lbktplt close_fig, . NameChangeFcn,clbktplt rename_block) ;S函數(shù)函數(shù)是擴(kuò)展Simulink功能的強(qiáng)有力工具,它使用戶可以利用MATLAB、C語(yǔ)言、C+語(yǔ)言等程序創(chuàng)建自己定義的Simulink模塊。例如,對(duì)一個(gè)工程的幾個(gè)不同的控制系統(tǒng)進(jìn)行設(shè)計(jì),而此時(shí)已經(jīng)用M文件建立了一個(gè)動(dòng)態(tài)模型,在這種情況下,可以將模型加入到S函數(shù)中,然后使用獨(dú)立的Simulink模型來(lái)模擬這些控制系統(tǒng)。S函數(shù)還可以改善仿真的效率,尤其是在帶有代數(shù)環(huán)的模型中。S函數(shù)使用一種特殊的調(diào)用規(guī)則來(lái)使得用戶可以與Simulink的內(nèi)部解法器進(jìn)行交互,這種交互通Simulink內(nèi)

36、部解法器與內(nèi)置的模塊之間的交互非常相似。而且可以適用于不同性質(zhì)的系統(tǒng),例如連續(xù)系統(tǒng)、離散系統(tǒng)以及混合系統(tǒng)。 圖圖7.7.1 包含包含S函數(shù)的模型函數(shù)的模型 圖圖7.7.2 S函數(shù)模塊的對(duì)話框函數(shù)模塊的對(duì)話框 7.7.2 S函數(shù)的工作原理函數(shù)的工作原理S函數(shù)具有一套不同的調(diào)用方法,可以在仿真的不同階段完成不同的調(diào)用任務(wù)。在模型仿真的不同階段,Simulink會(huì)對(duì)模型中S函數(shù)模塊選擇適當(dāng)?shù)姆椒▉?lái)完成調(diào)用。S函數(shù)可以完成的任務(wù)大體分為以下幾種。(1) 初始化初始化。在進(jìn)入仿真循環(huán)之間,Simulink首先初始化S函數(shù),主要完成任務(wù): 初始化包含S函數(shù)信息的仿真結(jié)構(gòu)SimStruct。 設(shè)置輸入輸出端

37、口的數(shù)目和維數(shù)。 設(shè)置模塊的采樣時(shí)間。分派內(nèi)存區(qū)和sizes數(shù)組。(2) 計(jì)算下一個(gè)采樣點(diǎn)計(jì)算下一個(gè)采樣點(diǎn)。若用戶使用了可變采樣時(shí)間的模塊,在這一階段需要計(jì)算下一個(gè)采樣點(diǎn)時(shí)間,也就是說(shuō)要計(jì)算下一個(gè)時(shí)間步長(zhǎng)。(3) 計(jì)算主時(shí)間步的輸出量。計(jì)算主時(shí)間步的輸出量。此調(diào)用結(jié)束后,所有模塊的輸出端口對(duì)當(dāng)前的時(shí)間步都是有效的。(4) 更新主時(shí)間步的離散狀態(tài)。更新主時(shí)間步的離散狀態(tài)。(5) 積分計(jì)算積分計(jì)算。這一步只有當(dāng)模型帶有連續(xù)狀態(tài)或帶有非采樣過(guò)零點(diǎn)時(shí)才有效。若S函數(shù)帶有連續(xù)狀態(tài),則Simulink以較小的時(shí)間步長(zhǎng)來(lái)調(diào)用S函數(shù)的輸出和微分方法;若S函數(shù)具有非采樣過(guò)零點(diǎn),Simulink將以較小的時(shí)間步來(lái)

38、計(jì)算S函數(shù)的輸出和過(guò)零點(diǎn)部分。7.7.3 S函數(shù)中的幾個(gè)概念函數(shù)中的幾個(gè)概念S函數(shù)中有幾個(gè)關(guān)鍵的概念需要詳細(xì)解釋,對(duì)這幾個(gè)概念的深入理解對(duì)正確使用S函數(shù)是非常重要的。(1) 直接饋入直接饋入所謂的直接饋入是指模塊的輸出或采樣時(shí)間是由它的一個(gè)輸入端口的值直接控制。判斷S函數(shù)地輸入端口是否有直接饋入的判據(jù)有: 輸出函數(shù)(mdlOutpits或者flag=3)是一個(gè)參數(shù)包含u的函數(shù)。 若改S函數(shù)是一個(gè)可變采樣時(shí)間的S函數(shù),且下一個(gè)采樣時(shí)間點(diǎn)的計(jì)算中要用到輸入?yún)?shù)u時(shí),也可以判斷此S函數(shù)為直接饋入型。(2) 動(dòng)態(tài)尺寸的輸入動(dòng)態(tài)尺寸的輸入S函數(shù)可以支持任意維的輸入,此時(shí),輸入的維數(shù)是由輸入變量的維數(shù)動(dòng)態(tài)

39、確定的。同時(shí),輸入變量的維數(shù)也決定了連續(xù)和離散狀態(tài)量的個(gè)數(shù)以及輸出變量的維數(shù)。M文件S函數(shù)只能有一個(gè)輸入端口,并且輸入端口只能接收一維信號(hào)。然而,信號(hào)可以是變寬度的。在一個(gè)M文件S函數(shù)里,為了指定輸入的寬度是動(dòng)態(tài)的,可以指定sizes結(jié)構(gòu)的適當(dāng)區(qū)域的值為1。也可以在S函數(shù)調(diào)用的時(shí)候使用length(u)來(lái)確定實(shí)際輸入的寬度。若指定寬度值為0,則輸入端口會(huì)從S函數(shù)模塊中去掉。例如,圖7.7.3所示表示了在同一個(gè)模型中使用同一個(gè)S函數(shù)模塊的兩種情況,前者的S函數(shù)模塊是由一個(gè)三元素向量驅(qū)動(dòng),后者則是由一個(gè)標(biāo)量輸出模塊信號(hào)驅(qū)動(dòng),為了表明S函數(shù)函數(shù)模塊的輸入是動(dòng)態(tài)的,兩個(gè)S函數(shù)模塊是完全相同的Simul

40、ink自適應(yīng)地使用合適的尺寸來(lái)調(diào)用函數(shù)。類似地,若其它模塊屬性如輸出變量數(shù)和狀態(tài)數(shù)也被指定為動(dòng)態(tài)尺寸的,Simulink將會(huì)定義這些變量與輸入變量同維。圖圖7.7.3 同一個(gè)模型中使用同一個(gè)同一個(gè)模型中使用同一個(gè)S函數(shù)模塊的兩種情況函數(shù)模塊的兩種情況 (3) 采樣時(shí)間的設(shè)置與采樣延遲采樣時(shí)間的設(shè)置與采樣延遲M文件S函數(shù)和C語(yǔ)言S函數(shù)都在指定S函數(shù)的運(yùn)行時(shí)間上有高度的自適應(yīng)度。Simulink為采樣時(shí)間提供了下面的幾種選著。 連續(xù)采樣時(shí)間連續(xù)采樣時(shí)間:適用于具有連續(xù)狀態(tài)和非采樣過(guò)零點(diǎn)的S函數(shù)。這種S函數(shù)的輸出按最小時(shí)間步改變。 連續(xù)但固定最小步長(zhǎng)的采樣時(shí)間連續(xù)但固定最小步長(zhǎng)的采樣時(shí)間:適用于需要

41、在每一個(gè)主仿真時(shí)間步執(zhí)行,但在最小仿真步內(nèi)值不改變的。 離散采樣時(shí)間離散采樣時(shí)間:若S函數(shù)得行為發(fā)生具有離散時(shí)間間隔的函數(shù),用戶可以定義一個(gè)采樣時(shí)間來(lái)規(guī)定Simulink何時(shí)調(diào)用函數(shù)。而且用戶還可以定義一個(gè)延遲時(shí)間offset來(lái)延遲采樣點(diǎn),但offset的值不能超過(guò)采樣周期。若用戶定義了一個(gè)離散采樣時(shí)間,則Simulink就會(huì)在所定義的每個(gè)采樣點(diǎn)調(diào)用S函數(shù)的mdlOutpit和mdlUpdate方法。 可變采樣時(shí)間可變采樣時(shí)間:相鄰采樣點(diǎn)的時(shí)間間隔可變得離散采樣時(shí)間。在這種采樣時(shí)間的情況下,S函數(shù)要在每一步仿真的開始,計(jì)算下一個(gè)采樣點(diǎn)的時(shí)刻。 繼承采樣時(shí)間繼承采樣時(shí)間:在有些情況下,S函數(shù)模塊

42、自身沒(méi)有特定的采樣時(shí)間,它本身的狀態(tài)是連續(xù)的還是離散的完全取決于系統(tǒng)中的其它模塊。此時(shí),該S函數(shù)模塊的采樣時(shí)間屬性可以設(shè)為繼承。例如gain模塊就是一個(gè)繼承輸入信號(hào)采樣時(shí)間的例子。一般,一個(gè)模塊可以從以下幾個(gè)方式來(lái)繼承采樣時(shí)間: 繼承驅(qū)動(dòng)模塊的采樣時(shí)間; 繼承目標(biāo)模塊的采樣時(shí)間; 繼承系統(tǒng)中最快的采樣時(shí)間。7.7.4 S函數(shù)動(dòng)畫函數(shù)動(dòng)畫基于S函數(shù)地動(dòng)畫就是一個(gè)由沒(méi)有狀態(tài)函數(shù)、沒(méi)有輸出變量的S函數(shù)生成的動(dòng)畫。因此它們只能作常規(guī)顯示。這種S函數(shù)有兩個(gè)主要部分:初始化部分初始化部分和更新部分更新部分。 在初始化過(guò)程中要?jiǎng)?chuàng)建圖形窗口及動(dòng)畫對(duì)象; 在更新過(guò)程中,動(dòng)畫對(duì)象的屬性將作為S函數(shù)模塊的輸入函數(shù),

43、且它的變化導(dǎo)致動(dòng)畫對(duì)象的運(yùn)動(dòng)可能會(huì)以其它形式變化。(1) 動(dòng)畫的初始化S函數(shù)動(dòng)畫的初始化語(yǔ)句包括S函數(shù)的初始化和圖形的初始化。采樣時(shí)間應(yīng)設(shè)置為較小的數(shù)值以便動(dòng)畫可以看起來(lái)更加連續(xù)。但同時(shí)也不能太小,因?yàn)槟菚?huì)使得仿真過(guò)程運(yùn)行起來(lái)太慢。首先需要檢驗(yàn)與當(dāng)前S函數(shù)模塊相聯(lián)系的動(dòng)畫圖形是否已打開。這里使用的方法是將當(dāng)前模塊的路徑保存到圖形的UserData參數(shù)中。此時(shí)使用gcd函數(shù)是一種比較安全的方法,因?yàn)樵赟函數(shù)的執(zhí)行過(guò)程中,gcd總會(huì)返回S函數(shù)模塊的路徑。完成此任務(wù)的MATLAB命令可為如下形式: if(findobj(UserData,gcb) % 若模型已經(jīng)打開,則不作任何事 else % 初始

44、化圖形 end其中的初始化圖形語(yǔ)句可由figure命令實(shí)現(xiàn),例如 h_fig=figure(Position,x_pos,y_pos,width,height然后,將當(dāng)前S函數(shù)模塊的路徑保存到圖形UserData中,這樣對(duì)圖形的存在性檢驗(yàn)才會(huì)正常工作。下面的語(yǔ)句可以用來(lái)設(shè)置UserData: set(h_fig,UserData,gcb);使用MATLAB繪圖命令繪制動(dòng)畫圖形。接著保存這些圖形元素的句柄。例如,要繪制由向量x_array和y_array定義的曲線,使用下面的語(yǔ)句: hdl=plot(x_array,y_array);圖形初始化的最后一步是保存這些仿真元素的句柄。這里使用的方法是

45、將這些元素成組地保存到一個(gè)MATLAB變量中,并把此變量保存到S函數(shù)模塊的UserData中。UserData中可以保存MATLAB的任何變量,包括單元數(shù)組合結(jié)構(gòu)。假設(shè)要繪制兩個(gè)圖形元素的動(dòng)畫,而它們的句柄名分別為hd1和hd2,下面的語(yǔ)句會(huì)把它們保存到一個(gè)結(jié)構(gòu)中。 t_data.hd1=hd1; t_data.hd2=hd2; set_param(gcd,UserData,t_data);(2) 動(dòng)畫的更新動(dòng)畫的更新由于設(shè)置采樣時(shí)間為正數(shù),所以動(dòng)畫S函數(shù)可以被看成是離散模塊。Simulink將以flag=2在采樣時(shí)間執(zhí)行S函數(shù)。更新函數(shù)會(huì)從S函數(shù)模塊UserData中讀取即將改變得圖形對(duì)象的

46、句柄。例如,如果句柄以結(jié)構(gòu)變量的形式儲(chǔ)存,則它們可以寫成如下形式。 T_data=get_param(gcd,UserData); hd1=t_data.hd1; hd2=t_data.hd2;然后計(jì)算改變得對(duì)象屬性的新值,并使用set命令更新屬性。 Set(handle,propertyName,propertyValue);其中handle為對(duì)象的句柄,propertyName為有即將改變得對(duì)象屬性的對(duì)象名構(gòu)成的MATLAB字符串。propertyValue為新的屬性值。例7.7.1 在本例中,將創(chuàng)建一個(gè)在半球形槽內(nèi)往復(fù)滾動(dòng)的圓盤的動(dòng)畫。分析:假設(shè)圓盤在槽內(nèi)做無(wú)滑動(dòng)的滾動(dòng),則系統(tǒng)的運(yùn)動(dòng)方程

47、為)(5.1sinrRg 2 .32, 2,12grRg其中:,為重力加速度,和的動(dòng)力學(xué)關(guān)系為rrR 圖7.7.4為此系統(tǒng)運(yùn)動(dòng)方程的Simulink模型,它用一個(gè)動(dòng)畫S函數(shù)模塊來(lái)顯示圓盤運(yùn)動(dòng)。 S函數(shù)為一個(gè)M文件,其程序代碼如下,function sys,x0,str,ts = s_anm81s(t,x,u,flag)% S-file animation example 1% This example demonstrates buidling an animation % using a single S-file with no callbacks.% Based on sfuntmpl.

48、m, supplied with SIMULINK% Copyright (c) 1990-96 by The MathWorks, Inc.% switch flag, case 0, % Initialization sys,x0,str,ts=mdlInitializeSizes; case 1, % Derivatives sys=mdlDerivatives(t,x,u); case 2, sys=mdlUpdate(t,x,u); case 3, sys=mdlOutputs(t,x,u); % Compute output vector case 4, % Compute tim

49、e of next sample sys=mdlGetTimeOfNextVarHit(t,x,u); case 9, % Finished. Do any needed sys=mdlTerminate(t,x,u); otherwise % Invalid input error(Unhandled flag = ,num2str(flag);end%*%* mdlInitializeSizes * %*function sys,x0,str,ts=mdlInitializeSizes()% Return the sizes of the system vectors, initial %

50、 conditions, and the sample times and offets.sizes = simsizes; % Create the sizes structuresizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 0;sizes.NumInputs = 1;sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 1;sys = simsizes(sizes); x0 = ; % There are no statesstr = ; % str is a

51、lways an empty matrix % Update the figure every 0.25 sects = 0.25 0; %initialize the array of sample times. % Initialize the figure% The handles of the disk and index mark are stored % in the blocks UserData. if(findobj(UserData,gcb) % Figure is open, do nothingelse h_fig = figure(Position,200 200 4

52、00 300, . MenuBar,none,NumberTitle,off, . Resize,off, . Name,gcs, Rolling Disk) ; set(h_fig,UserData,gcb) ; % Save name of current block % in the figures UserData. % This is used to detect % that a rolling disk figure % is already open for the % current block, so that % only one instance of the % fi

53、gure is open at a time % for a given instance of the % block. r = 2 ; R = 12 ; q = r ; thp = 0:0.2:pi ; xp = R*cos(thp); yp = -R*sin(thp) ; xp = xp,-R,-(R+q),-(R+q),(R+q), (R+q),R ; yp = yp,0,0,-(R+q),-(R+q),0,0 ; cl_x = 0,0 ; cl_y = 0,-R ; % Make the disk thp = 0:0.3:2.3*pi ; xd = r*cos(thp); yd =

54、r*sin(thp) ; hd = fill(xp,yp,0.85,0.85,0.85); % Draw trough hold on ; % So it wont get erased set(hd,erasemode,none); axis(equal);axis(off); hd0 = plot(cl_x,cl_y,k-); % Draw the centerline set(hd0,erasemode,none); % During this initialization pass, create the disk % (hd2) and the index mark (hd3). t

55、heta = 0 ; xc = (R-r)*sin(theta); % Find center of disk yc = - (R-r)*cos(theta) ; psi = theta*(R-r)/r ; xm_c = r*sin(psi) ; % Relative position of index mark ym_c = r*cos(psi) ; xm = xc + xm_c ; % Translate mark ym = yc + ym_c ;hd2 = fill(xd+xc, yd+yc, . 0.85,0.85,0.85) ; % Draw disk and markhd3 = p

56、lot(xc,xm,yc,ym,k-); set_param(gcb,UserData,hd2,hd3) ;End%*%* mdlDerivatives *%*function sys=mdlDerivatives(t,x,u)% Compute derivatives of continuous statessys = ; % Empty since no continuous states%*%* mdlUpdate *%*function sys=mdlUpdate(t,x,u)% Compute update for discrete states.sys = ; % Empty since this model has no states.% Update the figurer = 2 ; R = 12 ;q = r ;userdat = get_param(gcb,UserData) ;hd

溫馨提示

  • 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)論