版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第12章編寫M語(yǔ)言S-函數(shù)12.1S-函數(shù)12.2在模型中創(chuàng)立S-函數(shù)12.3S-函數(shù)的概念12.4編寫M語(yǔ)言S-函數(shù)12.5M文件S-函數(shù)范例 12.1S-函數(shù)
12.1.1S-函數(shù)的定義
S-函數(shù)是系統(tǒng)函數(shù)(SystemFunction)的簡(jiǎn)稱,是指采用非圖形化的方式描述一個(gè)模塊。S-函數(shù)使用特定的調(diào)用語(yǔ)法,這種語(yǔ)法可以與Simulink中的方程求解器相互作用,S-函數(shù)中的程序從求解器中接收信息,并對(duì)求解器發(fā)出的命令做出適當(dāng)?shù)捻憫?yīng)。這種作用方式與求解器和內(nèi)嵌的Simulink模塊之間的作用很相似。S-函數(shù)的格式是通用的,它們可以用在連續(xù)系統(tǒng)、離散系統(tǒng)和混合系統(tǒng)中。完整的S-函數(shù)結(jié)構(gòu)體系包含了描述一個(gè)動(dòng)態(tài)系統(tǒng)所需的全部能力,所有其他的使用情況(比方用于顯示目的)都是這個(gè)默認(rèn)體系結(jié)構(gòu)的特例。S-函數(shù)允許用戶向Simulink模型中添加用戶自己的模塊,它作為與其他語(yǔ)言相結(jié)合的接口程序,可以用MATLAB、C、C++、Fortran或Ada語(yǔ)言創(chuàng)立自己的模塊,并使用這些語(yǔ)言提供的強(qiáng)大功能,用戶只需要遵守一些簡(jiǎn)單的規(guī)那么即可。例如,M語(yǔ)言編寫的S-函數(shù)可以調(diào)用工具箱和圖形函數(shù);C語(yǔ)言編寫的S-函數(shù)可以實(shí)現(xiàn)對(duì)操作系統(tǒng)的訪問(wèn)。
用戶還可以在S-函數(shù)中實(shí)現(xiàn)用戶算法,編寫完S-函數(shù)之后,用戶可以把S-函數(shù)的名稱放在S-Function模塊中,并利用Simulink中的封裝功能自定義模塊的用戶接口。12.1.2S-函數(shù)的工作方式
假設(shè)要?jiǎng)?chuàng)立S-函數(shù),那么用戶必須知道S-函數(shù)的工作方式,假設(shè)要理解S-函數(shù)的工作方式,也就要求理解Simulink仿真模型的過(guò)程,因此也就需要理解模塊的數(shù)學(xué)含義。
1.Simulink模塊的數(shù)學(xué)含義
Simulink中模塊的輸入、狀態(tài)和輸出之間都存在數(shù)學(xué)關(guān)系,模塊輸出是采樣時(shí)間、輸入和模塊狀態(tài)的函數(shù)。圖12-1描述了模塊中輸入和輸出的流程關(guān)系。圖12-12.Simulink仿真過(guò)程
Simulink模型的仿真執(zhí)行過(guò)程包括兩個(gè)階段。第一個(gè)階段是初始化階段,在這個(gè)過(guò)程中,模塊的所有參數(shù)都被傳遞給MATLAB進(jìn)行求值,因此所有的參數(shù)都被確定下來(lái),并且模型的層次被展開,但是原子子系統(tǒng)仍被作為單獨(dú)的模塊進(jìn)行對(duì)待。另外,Simulink把庫(kù)模塊結(jié)合到模型中,并傳遞信號(hào)寬度、數(shù)據(jù)類型和采樣時(shí)間,確定模塊的執(zhí)行順序,并分配內(nèi)存,最后確定狀態(tài)的初值和采樣時(shí)間。然后Simulink進(jìn)入第二個(gè)階段,仿真開始,也就是仿真循環(huán)過(guò)程。仿真是由求解器控制的,它計(jì)算模塊的輸出,更新模塊的離散狀態(tài),計(jì)算連續(xù)狀態(tài),在采用變步長(zhǎng)求解器時(shí),求解器還需要確定時(shí)間步長(zhǎng)。求解器計(jì)算連續(xù)狀態(tài)時(shí)包含下面幾個(gè)步驟:(1)每個(gè)模塊按照預(yù)先確定的順序計(jì)算輸出,求解器為待更新的系統(tǒng)提供當(dāng)前狀態(tài)、時(shí)間和輸出值,反過(guò)來(lái),求解器又需要狀態(tài)導(dǎo)數(shù)的值。
(2)求解器對(duì)狀態(tài)的導(dǎo)數(shù)進(jìn)行積分,計(jì)算新的狀態(tài)的值。
(3)狀態(tài)計(jì)算完成后,模塊的輸出更新再進(jìn)行一次。這里,一些模塊可能會(huì)發(fā)出過(guò)零警告,促使求解器探測(cè)出發(fā)生過(guò)零的準(zhǔn)確時(shí)間。在每個(gè)仿真時(shí)間步期間,模型中的每個(gè)模塊都會(huì)重復(fù)這個(gè)循環(huán)過(guò)程,Simulink會(huì)按照初始化過(guò)程所確定的模塊執(zhí)行順序來(lái)執(zhí)行模型中的模塊。而對(duì)于每個(gè)模塊,Simulink都會(huì)調(diào)用函數(shù),以計(jì)算當(dāng)前采樣時(shí)間中的模塊狀態(tài)、微分和模塊輸出。這個(gè)過(guò)程會(huì)一直繼續(xù)下去,直到仿真結(jié)束。這里把系統(tǒng)和求解器在仿真過(guò)程之間所起的作用總結(jié)一下。求解器的作用是傳遞模塊的輸出,對(duì)狀態(tài)導(dǎo)數(shù)進(jìn)行積分,并確定采樣時(shí)間,求解器傳遞給系統(tǒng)的信息包括時(shí)間、輸入和當(dāng)前狀態(tài)。系統(tǒng)的作用是計(jì)算模塊的輸出,對(duì)狀態(tài)進(jìn)行更新,計(jì)算狀態(tài)的導(dǎo)數(shù)和生成過(guò)零事件,并把這些信息提供給求解器。在S-函數(shù)中,求解器和系統(tǒng)之間的對(duì)話是通過(guò)不同的標(biāo)志來(lái)控制的。求解器在給系統(tǒng)發(fā)送標(biāo)志的同時(shí)也發(fā)送數(shù)據(jù),系統(tǒng)使用這個(gè)標(biāo)志來(lái)確定所要執(zhí)行的操作,并確定所要返回的變量的值。求解器和系統(tǒng)之間的這種關(guān)系可以用圖12-2描述。圖12-23.S-函數(shù)的控制流
S-函數(shù)的調(diào)用順序是通過(guò)flag標(biāo)志來(lái)控制的。在仿真初始化階段,通過(guò)設(shè)置flag標(biāo)志為0來(lái)調(diào)用S-函數(shù),并請(qǐng)求提供數(shù)量(包括連續(xù)狀態(tài)、離散狀態(tài)和輸入、輸出的個(gè)數(shù))、初始狀態(tài)和采樣時(shí)間等信息。然后,仿真開始,設(shè)置flag標(biāo)志為4,請(qǐng)求S-函數(shù)計(jì)算下一個(gè)采樣時(shí)間,并提供采樣時(shí)間。接下來(lái)設(shè)置flag標(biāo)志為3,請(qǐng)求S-函數(shù)計(jì)算模塊的輸出。然后設(shè)置flag標(biāo)志為2,更新離散狀態(tài)。當(dāng)用戶還需要計(jì)算狀態(tài)導(dǎo)數(shù)時(shí),可設(shè)置flag標(biāo)志為1,由求解器使用積分算法計(jì)算狀態(tài)的值。計(jì)算出狀態(tài)導(dǎo)數(shù)和更新離散狀態(tài)之后,通過(guò)設(shè)置flag標(biāo)志為3來(lái)計(jì)算模塊的輸出,這樣就結(jié)束了一個(gè)時(shí)間步的仿真。當(dāng)?shù)竭_(dá)結(jié)束時(shí)間時(shí),設(shè)置flag標(biāo)志為9,結(jié)束仿真。這個(gè)過(guò)程如圖12-3所示。圖12-34.S-函數(shù)回調(diào)方法
S-函數(shù)是由一組S-函數(shù)回調(diào)方法組成的,這些回調(diào)方法在每個(gè)仿真階段執(zhí)行不同的任務(wù)。在模型仿真過(guò)程中,在每次仿真階段,Simulink都會(huì)為模型中的每個(gè)S-Function模塊調(diào)用適宜的方法。S-函數(shù)回調(diào)方法可以執(zhí)行的任務(wù)包括:
初始化—在首次仿真循環(huán)開始之前,Simulink會(huì)初始化S-函數(shù)。在這個(gè)過(guò)程中,Simulink會(huì)執(zhí)行下面的操作:
初始化SimStruct,這是一個(gè)包含S-函數(shù)信息的仿真結(jié)構(gòu);
設(shè)置輸入端口和輸出端口的個(gè)數(shù)及維數(shù);
設(shè)置模塊采樣時(shí)間;
分配空間和sizes數(shù)組。計(jì)算下一個(gè)采樣時(shí)間點(diǎn)—如果用戶已經(jīng)創(chuàng)立了一個(gè)變采樣時(shí)間模塊,那么此時(shí)會(huì)計(jì)算下一個(gè)采樣點(diǎn)的時(shí)間,也就是計(jì)算下一個(gè)步長(zhǎng)。
以最大時(shí)間步計(jì)算輸出—在本次調(diào)用結(jié)束后,所有模塊的輸出端口在當(dāng)前時(shí)間步上都是有效的。
以最大時(shí)間步更新離散狀態(tài)—在本次調(diào)用中,所有模塊都應(yīng)該執(zhí)行一次更新,也就是為下一次仿真循環(huán)更新一次離散狀態(tài)。積分——這主要應(yīng)用于具有連續(xù)狀態(tài)和/或非采樣過(guò)零的模型。如果用戶的S-函數(shù)帶有連續(xù)狀態(tài),那么Simulink會(huì)在最小時(shí)間步上調(diào)用S-函數(shù)的輸出和微分局部,因此Simulink也就可以為用戶的S-函數(shù)計(jì)算狀態(tài)。如果用戶的S-函數(shù)(只是對(duì)CMEX文件)帶有非采樣的過(guò)零,那么Simulink會(huì)在最小時(shí)間步上調(diào)用用戶S-函數(shù)的輸出和過(guò)零局部,因此也就可以確定過(guò)零產(chǎn)生的具體位置。 12.2在模型中創(chuàng)立S-函數(shù)
12.2.1在模型中使用S-函數(shù)
為了在模型中參加S-函數(shù),應(yīng)該首先從Simulink的User-DefinedFunctions模塊庫(kù)中把S-Function模塊拖到模型窗口中,然后在S-Function模塊對(duì)話框中的S-functionname參數(shù)文本框內(nèi)指定S-函數(shù)的名稱,如圖12-4所示。
在圖12-4中,模型包含了兩個(gè)S-Function模塊,這兩個(gè)模塊都引用了相同的源文件,即myfun。這個(gè)文件可以是CMEX文件,也可以是M文件,如果CMEX文件和M文件都有相同的名稱,那么Simulink會(huì)優(yōu)先考慮CMEX文件。圖12-412.2.2向S-函數(shù)中傳遞參數(shù)
S-Function模塊參數(shù)對(duì)話框內(nèi)有一個(gè)S-functionparameters參數(shù),在其下面的文本框內(nèi)用戶可以指定傳送到相應(yīng)S-函數(shù)中的參數(shù)值。當(dāng)然,用戶必須知道S-函數(shù)要求的參數(shù)和這些參數(shù)的調(diào)用順序,然后按照S-函數(shù)要求的順序輸入?yún)?shù),并用逗號(hào)分隔,參數(shù)值可以是常數(shù)、在模型工作區(qū)中定義的變量名稱或MATLAB表達(dá)式。
圖12-5說(shuō)明了如何使用S-functionparameters文本框輸入用戶定義的參數(shù)。圖12-5中的模型調(diào)用了名稱為limintm的采樣S-函數(shù),函數(shù)的源代碼存儲(chǔ)在toolbox/simulink/blocks目錄中。limintm函數(shù)包括三個(gè)參數(shù):下限值、上限值和初始條件。如果時(shí)間積分在上限和下限之間,那么函數(shù)輸出輸入信號(hào)的時(shí)間積分;如果時(shí)間積分小于下限,那么輸出下限值;如果時(shí)間積分大于上限,那么輸入上限值。從圖中的S-Function模塊對(duì)話框中可以看到,這里分別指定下限、上限和初始條件為2、3和2.5。當(dāng)輸入信號(hào)是幅值為1的正弦波時(shí),示波器的輸出結(jié)果見圖12-5所示。
用戶利用Simulink中的封裝功能為S-函數(shù)模塊創(chuàng)立用戶對(duì)話框和圖標(biāo)后,封裝后的對(duì)話框可以很容易地為S-函數(shù)指定其他的參數(shù)。圖12-512.2.3何時(shí)使用S-函數(shù)
對(duì)于大多數(shù)系統(tǒng)來(lái)說(shuō),使用Simulink提供的現(xiàn)成模塊就能夠?qū)崿F(xiàn)系統(tǒng)功能,而不需要借助S-函數(shù),但在開發(fā)一個(gè)新的通用模塊時(shí),應(yīng)當(dāng)使用S-函數(shù)。S-函數(shù)會(huì)將已有的代碼結(jié)合進(jìn)來(lái),而不需要在Simulink中重新實(shí)現(xiàn)算法。此外,在S-函數(shù)中,公式是由文本輸入的,當(dāng)表達(dá)一個(gè)復(fù)雜系統(tǒng)時(shí)很適合,尤其是隨時(shí)間而變化的系統(tǒng)。利用S-函數(shù)用戶還可以實(shí)現(xiàn)在仿真過(guò)程的每個(gè)階段進(jìn)行微調(diào)。因此,如果用戶想要?jiǎng)?chuàng)立自定義的Simulink模塊,那么可以考慮使用S-函數(shù)。對(duì)于下面的應(yīng)用都可以使用S-函數(shù),它們包括:
向Simulink中添加新的通用模塊;
添加用來(lái)表示硬件設(shè)備驅(qū)動(dòng)的模塊;
把已有的代碼合并到Simulink中進(jìn)行仿真;
把一個(gè)系統(tǒng)描述為一組數(shù)學(xué)方程時(shí),利用S-函數(shù)可以采用文本方式輸入復(fù)雜的方程,而不必花太多的時(shí)間繪制方程;
在模型中使用圖形動(dòng)畫。 12.3S-函數(shù)的概念
S-函數(shù)有一些非常關(guān)鍵的概念,理解這些概念對(duì)于正確創(chuàng)立S-函數(shù)是非常重要的。這些概念包括:
直接饋通;
動(dòng)態(tài)確定輸入數(shù)組的維數(shù);
設(shè)置采樣時(shí)間和偏差值。12.3.1直接饋通
直接饋通的含義就是輸出直接受輸入端口值的影響,對(duì)于變采樣時(shí)間模塊,也可以說(shuō)是變采樣時(shí)間直接受輸入端口值所控制。如果模塊滿足以下條件,那么就說(shuō)S-函數(shù)的輸入端口具有直接饋通特性:
輸出函數(shù)(mdlOutputs函數(shù)或flag?==?3)是輸入u的函數(shù),也就是說(shuō),如果輸入u在mdlOutputs函數(shù)中被存取,那么模塊具有直接饋通特性。模塊的輸出也可以包括圖形輸出,如XYGraph示波器。具有變采樣時(shí)間的S-函數(shù)中的mdlGetTimeOfNextVarHit函數(shù)(或flag==?4)直接讀取輸入u,那么模塊具有直接饋通特性。
舉一個(gè)直接饋通的例子,如果系統(tǒng)的輸入和輸出關(guān)系為y=k×u,這里,u是輸入,k是增益,y是輸出,那么系統(tǒng)的輸出直接受輸入值的影響。
舉一個(gè)非直接饋通的例子,如果系統(tǒng)的輸出和輸入滿足以下這個(gè)簡(jiǎn)單的積分算法:
輸出:
微分:這里,x是狀態(tài),是對(duì)應(yīng)時(shí)刻的狀態(tài)微分,u是輸入,y是輸出。需要說(shuō)明的是,是Simulink積分的一個(gè)變量,它對(duì)于正確設(shè)置直接饋通標(biāo)志是非常重要的,因?yàn)樗绊懼P椭心K的執(zhí)行順序,而且還用來(lái)檢測(cè)代數(shù)環(huán)。12.3.2動(dòng)態(tài)設(shè)置數(shù)組維數(shù)
用戶編寫的S-函數(shù)可以支持任意維數(shù)的輸入數(shù)組,既然如此,當(dāng)開始仿真時(shí),在求取驅(qū)動(dòng)S-函數(shù)的輸入向量的維數(shù)時(shí),用戶可以動(dòng)態(tài)確定實(shí)際輸入的維數(shù)。輸入維數(shù)也可以用來(lái)確定函數(shù)中連續(xù)狀態(tài)的個(gè)數(shù)、離散狀態(tài)的個(gè)數(shù)和輸出的個(gè)數(shù)。
M文件S-函數(shù)只有一個(gè)輸入端口,這個(gè)輸入端口也只能接收一維(向量)信號(hào),但是,這個(gè)信號(hào)的寬度可以是不同的。在M文件S-函數(shù)內(nèi),為了表示輸入的信號(hào)寬度是動(dòng)態(tài)指定的,可以在sizes結(jié)構(gòu)中指定屬性為-1值,這個(gè)結(jié)構(gòu)在mdlInitializeSizes調(diào)用時(shí)被返回。例如,如果想要在仿真運(yùn)行時(shí)由輸入向量的維數(shù)確定輸入或輸出的維數(shù),那么可以指定sizes.NumInputs=-1或sizes.NumOutputs=-1,也可以動(dòng)態(tài)指定連續(xù)狀態(tài)和離散狀態(tài)的數(shù)目。如果使用length(u)函數(shù)調(diào)用S-函數(shù),那么用戶可以確定S-Function模塊中實(shí)際輸入的寬度,如果指定寬度值為0,那么輸入端口被從S-Function模塊中刪除。
例如,圖12-6中的模型有兩個(gè)相同的S-Function模塊,上面的S-Function模塊由一個(gè)帶有三個(gè)輸出分量的Mux向量模塊所驅(qū)動(dòng),下面的S-Function模塊由一個(gè)帶有標(biāo)量輸出的模塊驅(qū)動(dòng)。通過(guò)動(dòng)態(tài)指定S-Function模塊的輸入,相同的S-函數(shù)可以出現(xiàn)在同一個(gè)環(huán)境中,Simulink會(huì)動(dòng)態(tài)調(diào)用這些帶有適當(dāng)維數(shù)輸入向量的模塊。與此相似,如果其他的模塊特征也被指定為動(dòng)態(tài)確定,如輸出的個(gè)數(shù)離散狀態(tài)或連續(xù)狀態(tài)的個(gè)數(shù),那么Simulink會(huì)把這些向量定義為與輸入向量具有相同的長(zhǎng)度。
因此說(shuō),M語(yǔ)言S-函數(shù)在指定輸入端口和輸出端口的寬度上給出了很大的靈活性。圖12-612.3.3設(shè)置采樣時(shí)間和偏移量
用戶在編寫M文件S-函數(shù)時(shí),可以靈活地指定執(zhí)行S-函數(shù)的時(shí)間。Simulink在指定采樣時(shí)間上給出了如下選項(xiàng):
連續(xù)采樣時(shí)間—針對(duì)具有連續(xù)狀態(tài)和/或非采樣過(guò)零的S-函數(shù),對(duì)于這種類型的S-函數(shù),輸出以最小時(shí)間步改變。
連續(xù)但固定在最小時(shí)間步的采樣時(shí)間—針對(duì)必須在每個(gè)最大仿真步上執(zhí)行,但在最小時(shí)間步內(nèi)不改變數(shù)值的S-函數(shù)。
離散采樣時(shí)間—如果用戶的S-Function模塊的動(dòng)作帶有離散時(shí)間間隔,那么用戶可以定義采樣時(shí)間,用以控制Simulink何時(shí)調(diào)用S-Function模塊,也可以定義延遲每個(gè)采樣點(diǎn)的偏移量,偏移量的數(shù)值不能超過(guò)所對(duì)應(yīng)的采樣時(shí)間。采樣時(shí)刻點(diǎn)的時(shí)間值由下式確定:這里,n是整數(shù),表示當(dāng)前的仿真步,n的第一個(gè)值總是零。如果用戶定義了一個(gè)離散采樣時(shí)間,那么Simulink在每個(gè)采樣時(shí)刻上都會(huì)調(diào)用S-函數(shù)的mdlOutput函數(shù)和mdlUpdate函數(shù)。變采樣時(shí)間—離散采樣時(shí)間的兩次采樣時(shí)間間隔是可變的,在每次仿真步開始時(shí),帶有變采樣時(shí)間的S-函數(shù)都需要計(jì)算下一個(gè)采樣時(shí)刻值。
繼承采樣時(shí)間—有時(shí),S-Function模塊不具有繼承采樣時(shí)間的特征,也就是說(shuō),它或者是連續(xù)采樣,或者是離散采樣,這取決于系統(tǒng)中其他模塊的采樣時(shí)間,用戶可以指定模塊的采樣時(shí)間為inherited(繼承性)。舉例來(lái)說(shuō),Gain模塊就可以繼承驅(qū)動(dòng)其模塊的采樣時(shí)間。對(duì)于一個(gè)模塊,它可以繼承以下模塊的采樣時(shí)間:驅(qū)動(dòng)模塊;
目標(biāo)模塊;
系統(tǒng)中最快的采樣時(shí)間。
假設(shè)要把模塊的采樣時(shí)間設(shè)置為可繼承的,那么可在M文件S-函數(shù)中設(shè)置采樣時(shí)間為-1。S-函數(shù)可以是單速率系統(tǒng)或多速率系統(tǒng),多速率S-函數(shù)可以有多個(gè)采樣時(shí)間。采樣時(shí)間對(duì)以以下形式指定:[采樣時(shí)間,偏移量]。有效的采樣時(shí)間對(duì)為:
[CONTINUOUS_SAMPLE_TIME,0.0]
[CONTINUOUS_SAMPLE_TIME,F(xiàn)IXED_IN_MINOR_STEP_OFFSET]
[VARIABLE_SAMPLE_TIME,0.0]
[離散采樣時(shí)間間隔,偏移量]這里:
CONTINUOUS_SAMPLE_TIME=0.0
FIXED_IN_MINOR_STEP_OFFSET=1.0
VARIABLE_SAMPLE_TIME=-2.0
另外,用戶也可以從驅(qū)動(dòng)模塊中指定采樣時(shí)間的繼承性,在這種情況下,S-函數(shù)只能有一個(gè)采樣時(shí)間對(duì),即:
[INHERITED_SAMPLE_TIME,0.0]
或者
[INHERITED_SAMPLE_TIME,固定在最小時(shí)間步的偏移量]
這里:
INHERITED_SAMPLE_TIME=-1.0下面的說(shuō)明可以幫助用戶指定采樣時(shí)間。
在最小積分步內(nèi)改變的連續(xù)S-函數(shù)應(yīng)該指定采樣時(shí)間為:[連續(xù)采樣時(shí)間,0.0]。
在最小積分步內(nèi)不改變的連續(xù)S-函數(shù)應(yīng)該指定采樣時(shí)間為:[連續(xù)采樣時(shí)間,固定在最小時(shí)間步的偏移量]。
以指定速率改變的離散S-函數(shù)應(yīng)該指定離散采樣時(shí)間對(duì):[離散采樣時(shí)間間隔,偏移量],這里,離散采樣時(shí)間間隔>0.0,0.0≤偏移量<離散采樣時(shí)間間隔。
以變速率改變的離散S-函數(shù)應(yīng)該指定變步長(zhǎng)離散采樣時(shí)間:[變采樣時(shí)間,0.0],調(diào)用mdlGetTimeOfNextVarHit函數(shù)求取變步長(zhǎng)離散任務(wù)中的下一個(gè)采樣時(shí)間。如果用戶的S-函數(shù)中沒有內(nèi)在的采樣時(shí)間,那么用戶必須指定采樣時(shí)間為繼承采樣時(shí)間,這有兩種情況:
隨模塊輸入改變的S-函數(shù),甚至在最小積分步內(nèi)也隨輸入改變,應(yīng)該設(shè)置采樣時(shí)間為:[繼承采樣時(shí)間,0.0]。
隨模塊輸入改變的S-函數(shù),但是在最小積分步內(nèi)不隨輸入改變,也就是說(shuō),在最小積分步內(nèi)保持固定不變,應(yīng)該設(shè)置采樣時(shí)間為:[繼承采樣時(shí)間,固定在最小時(shí)間步的偏移量]。12.4編寫M語(yǔ)言S-函數(shù)
12.4.1M文件S-函數(shù)模板M文件S-函數(shù)是由如下形式的MATLAB函數(shù)組成的:
[sys,x0,str,ts]=f(t,x,u,flag,p1,p2,…)S-函數(shù)包含四個(gè)輸出:sys包含某個(gè)子函數(shù)的返回值,它的含義隨標(biāo)志flag的不同而不同;x0為所有狀態(tài)的初始化向量;str是一個(gè)空矩陣;ts返回的是采樣時(shí)間。f是S-函數(shù)的名稱,它的輸入是t、x、u和flag,后面還可以帶一系列的參數(shù)。其中,t是當(dāng)前時(shí)間;x是對(duì)應(yīng)S-函數(shù)模塊的狀態(tài)向量;u是模塊的輸入;flag標(biāo)識(shí)要執(zhí)行的任務(wù);p1、p2是模塊的參數(shù)。在模型仿真過(guò)程中,Simulink會(huì)反復(fù)調(diào)用f,同時(shí)用flag標(biāo)識(shí)需要執(zhí)行的任務(wù),每次S-函數(shù)執(zhí)行任務(wù)后會(huì)把結(jié)果返回到具有標(biāo)準(zhǔn)格式的結(jié)構(gòu)中。M文件返回的輸出向量包含以下元素:
sys—返回變量的全稱,返回的數(shù)值取決于flag值。例如,對(duì)于flag=3,sys包含S-函數(shù)的輸出。
x0—初始狀態(tài)值(如果系統(tǒng)中沒有狀態(tài),那么是一個(gè)空向量)。除非flag=0,否那么忽略x0。
str—以備將來(lái)使用,M文件S-函數(shù)必須把它設(shè)置為空矩陣[]。
ts—包含模塊采樣時(shí)間和偏差值的兩列矩陣。例如,如果想要在每個(gè)時(shí)間步(連續(xù)采樣時(shí)間)上都運(yùn)行用戶的S-函數(shù),那么設(shè)置ts為[00];如果想要用戶的S-函數(shù)以與被連接模塊相同的速率(繼承采樣時(shí)間)運(yùn)行,那么設(shè)置ts為[-10];如果想要用戶的S-函數(shù)在仿真開始時(shí)間之后,從0.1秒開始每0.25秒(離散采樣時(shí)間)運(yùn)行一次,那么設(shè)置ts為[0.250.1]。用戶可以創(chuàng)立執(zhí)行多個(gè)任務(wù),而且每個(gè)任務(wù)以不同采樣速率執(zhí)行的S-函數(shù),也就是多速率S-函數(shù),這時(shí),ts應(yīng)該以采樣時(shí)間上升的順序指定用戶S-函數(shù)中使用的所有采樣速率。例如,假設(shè)用戶S-函數(shù)自仿真起始時(shí)間開始每0.25秒執(zhí)行一個(gè)任務(wù),而另一個(gè)任務(wù)自仿真開始后從0.1秒開始每1秒執(zhí)行一次,那么用戶的S-函數(shù)應(yīng)該設(shè)置ts為[0.250;1.00.1]。這會(huì)使Simulink在以下時(shí)刻執(zhí)行S-函數(shù):[00.10.250.50.751.01.1…],用戶的S-函數(shù)確定在每個(gè)采樣時(shí)刻執(zhí)行的是哪個(gè)任務(wù)。
用戶也可以創(chuàng)立連續(xù)執(zhí)行某些任務(wù)的S-函數(shù)(也就是在每個(gè)時(shí)間步都執(zhí)行)和以離散間隔執(zhí)行其他任務(wù)的S-函數(shù)。編寫M文件S-函數(shù)時(shí),推薦使用S-函數(shù)模板文件,即sfuntmp1.m。這個(gè)文件存儲(chǔ)在matlab根目錄下的toolbox/simulink/blocks文件夾中,它包含了完整的S-函數(shù),并能夠?qū)lag標(biāo)志進(jìn)行跟蹤。它由一個(gè)主函數(shù)和一組子函數(shù)組成,每個(gè)子函數(shù)對(duì)應(yīng)一個(gè)特定的flag值。主函數(shù)由一個(gè)開關(guān)轉(zhuǎn)移結(jié)構(gòu)(switch-case結(jié)構(gòu))根據(jù)標(biāo)志將Simulink轉(zhuǎn)移到相應(yīng)的子函數(shù)中,這個(gè)子函數(shù)稱為S-函數(shù)調(diào)用方法,它執(zhí)行仿真過(guò)程中S-函數(shù)要求的任務(wù)。
表12-1列出了遵守這個(gè)標(biāo)準(zhǔn)格式的M文件S-函數(shù)的內(nèi)容,第二列是文件中包含的所有子函數(shù)。注意:這里推薦讀者在創(chuàng)立M文件S-函數(shù)時(shí)使用模板中的結(jié)構(gòu)和命名慣例,因?yàn)檫@便于其他人理解用戶所創(chuàng)立的M文件S-函數(shù),而且也便于用戶維護(hù)S-函數(shù)。當(dāng)調(diào)用M文件S-函數(shù)時(shí),Simulink總是把標(biāo)準(zhǔn)的模塊參數(shù)t、x、u和flag傳遞給S-函數(shù)作為函數(shù)變量。Simulink也可以把用戶指定的附加的模塊專用參數(shù)傳遞給S-函數(shù),用戶可在S-函數(shù)的模塊參數(shù)對(duì)話框中的S-functionparameters文本框內(nèi)指定這些參數(shù)。如果模塊對(duì)話框指定了附加參數(shù),那么Simulink會(huì)把這些參數(shù)作為附加的函數(shù)變量傳遞給S-函數(shù),在S-函數(shù)變量列表中附加變量在標(biāo)準(zhǔn)變量的后面,并按照模塊對(duì)話框中對(duì)應(yīng)參數(shù)的顯示序列排列。12.4.2定義S-Function模塊特征
為了使Simulink識(shí)別M文件S-函數(shù),用戶必須提供S-函數(shù)的某些特定信息,這些信息包括輸入、輸出和狀態(tài)的個(gè)數(shù),以及其他的模塊特征。
假設(shè)要為Simulink提供這些信息,可在仿真的初始化階段使用標(biāo)志0第一次調(diào)用S-函數(shù),這時(shí),mdlInitializeSizes子函數(shù)被調(diào)用,mdlInitializeSizes子函數(shù)開始調(diào)用simsizes函數(shù):
sizes=simsizes;
這個(gè)函數(shù)用于返回未初始化的sizes結(jié)構(gòu),用戶必須裝載包含有S-函數(shù)信息的sizes結(jié)構(gòu)。表12-2列出了sizes結(jié)構(gòu)的屬性,并說(shuō)明了每個(gè)屬性包含的信息。初始化sizes結(jié)構(gòu)后,再調(diào)用simsizes:
sys=simsizes(sizes);
這樣會(huì)把sizes結(jié)構(gòu)中的信息傳遞到sys。sys是存儲(chǔ)信息的向量,以備Simulink使用。 12.5M文件S-函數(shù)范例
12.5.1無(wú)狀態(tài)M文件S-函數(shù)
在開始編寫M文件S-函數(shù)時(shí),需要考慮以下幾個(gè)問(wèn)題:
有多少個(gè)連續(xù)狀態(tài)?
有多少個(gè)離散狀態(tài)?
有多少個(gè)輸入?
有多少個(gè)輸出?
這個(gè)S-函數(shù)帶有直接饋通嗎?
這個(gè)S-函數(shù)包含多少個(gè)采樣時(shí)間?在仿真開始的初始化階段,通過(guò)使用標(biāo)志0,S-函數(shù)被第一次調(diào)用,這里,mdlInitializeSizes子函數(shù)被調(diào)用。這個(gè)子函數(shù)應(yīng)該提供上面所提問(wèn)題的信息:mdlInitializeSizes還提供初始條件x0和采樣時(shí)間ts,ts是一個(gè)m×2的矩陣,其中第k行包含了對(duì)應(yīng)于第k個(gè)采樣時(shí)間的采樣周期值和偏移量,同時(shí),在子系統(tǒng)中將str設(shè)置為[]。
例12-1不含參數(shù)的簡(jiǎn)單增益系統(tǒng)。
圖12-7中的S-Function模塊有一個(gè)輸入標(biāo)量信號(hào),要求該模塊將輸入信號(hào)乘2,并將結(jié)果顯示在示波器中。圖12-7包含S-函數(shù)的M文件代碼在S-函數(shù)模板sfuntmp1.m中建模,使用這個(gè)模板,用戶可以創(chuàng)立與C語(yǔ)言MEXS-函數(shù)類似的M文件S-函數(shù),這可以更容易地將M文件轉(zhuǎn)換為CMEX文件。
假設(shè)要實(shí)現(xiàn)不含狀態(tài)不含參數(shù)的系統(tǒng),那么需要對(duì)模板做三處修改:
在主函數(shù)中,修改函數(shù)的名稱,并修改文件名使其與函數(shù)名稱對(duì)應(yīng)。
初始化:在mdlInitializeSizes中,確定輸入和輸出的個(gè)數(shù)。對(duì)于帶有至少一個(gè)輸入和一個(gè)輸出的簡(jiǎn)單系統(tǒng),它總是直接饋通的。function[sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;輸出:在mdlOutputs中,編寫輸出方程,并通過(guò)變量sys返回。例如,在一個(gè)將輸入乘2的S-函數(shù)中,輸入方程為:
functionsys=mdlOutputs(t,x,u)
sys=[2*u];下面是timestwo函數(shù)文件完整的M代碼:
function[sys,x0,str,ts]=timestwo(t,x,u,flag)
%Dispatchtheflag.Theswitchfuncitoncontrolsthecallsto
%S-functionroutinesateachsimulationstage.
switchflag
case0
[sys,x0,str,ts]=mdlInitializeSizes;%Initialization
case3
sys=mdlOutputs(t,x,u);%Calculateoutputs
case{1,2,4,9}
sys=[];%Unusedflags
otherwise
error(['Unhandledflag=',num2str(flag)]);%Errorhanding為了在Simulink中測(cè)試這個(gè)S-函數(shù),可雙擊模型中的S-Function模塊,翻開模塊參數(shù)對(duì)話框,在S-functionname參數(shù)框內(nèi)輸入timestwo。由于這個(gè)模型是不含有參數(shù)和狀態(tài)的,因此可對(duì)S-functionparameters參數(shù)不做修改,如圖12-8(a)所示。運(yùn)行仿真,在示波器中顯示的波形如圖12-8(b)所示。(a)(b)圖12-8例12-2含參數(shù)的可變?cè)鲆嫦到y(tǒng)。
如果需要用戶輸入系統(tǒng)的參數(shù),那么這些參數(shù)必須在S-函數(shù)中第一行的輸入?yún)?shù)中列出。主函數(shù)應(yīng)當(dāng)做適當(dāng)?shù)男薷?,以便將用戶參?shù)傳遞到子函數(shù)中;子函數(shù)的定義也應(yīng)該進(jìn)行相應(yīng)的修改,以便通過(guò)輸入?yún)?shù)接收用戶的參數(shù)。
現(xiàn)在,圖12-9中的模型可實(shí)現(xiàn)一個(gè)可變?cè)鲆嫦到y(tǒng),它的增益值作為S-Function模塊中的參數(shù)由用戶輸入。圖12-9對(duì)S-函數(shù)模塊進(jìn)行的修改包括:最頂部的函數(shù)做了改動(dòng),函數(shù)中增加了新的參數(shù),并采用新的函數(shù)名。
function[sys,x0,str,ts]=sfun_vargain(t,x,u,flag,gain)
由于增益參數(shù)只是用來(lái)計(jì)算輸出值的,因此對(duì)mdlOutputs的調(diào)用可修改為:
case3,
sys=mdlOutputs(t,x,u,gain);
對(duì)mdlOutputs子函數(shù)的定義也做了相應(yīng)的修改,將增益作為參數(shù)輸入:
functionsys=mdlOutputs(t,x,u,g)
sys=g*u;在編寫S-函數(shù)時(shí),應(yīng)該區(qū)分哪些參數(shù)會(huì)影響一個(gè)子函數(shù)的執(zhí)行,然后針對(duì)這些參數(shù)做相應(yīng)的改動(dòng)。
注意,輸出通過(guò)增益和輸入的乘積得到,并通過(guò)sys返回。
在S-Function對(duì)話框內(nèi)設(shè)置參數(shù),S-functionname的參數(shù)名為sfun_vargain,設(shè)置S-functionparameters參數(shù)值為10,如圖12-10(a)所示。運(yùn)行仿真,得到的結(jié)果如圖12-10(b)所示。(a)圖12-10(b)圖12-1012.5.2連續(xù)狀態(tài)S-函數(shù)
在實(shí)現(xiàn)一個(gè)連續(xù)系統(tǒng)時(shí),mdlInitializeSizes子函數(shù)應(yīng)做適當(dāng)?shù)男薷模ù_定連續(xù)狀態(tài)的個(gè)數(shù)、狀態(tài)初始值和設(shè)置采樣時(shí)間ts為0,說(shuō)明系統(tǒng)為連續(xù)采樣。
例12-3積分器S-函數(shù)。
這里建立一個(gè)簡(jiǎn)單的積分器,它的狀態(tài)初始值作為用戶輸入,系統(tǒng)模型如圖12-11所示。圖12-11由于狀態(tài)初始值作為輸入?yún)?shù),因此S-函數(shù)中的第一行定義輸入的初始狀態(tài)參數(shù)為initial_state:
function[sys,x0,str,ts]=sfun_int(t,x,u,flag,initial_state)
然后將初始狀態(tài)initial_state傳遞給初始化函數(shù)mdlInitializeSizes。模型導(dǎo)數(shù)函數(shù)
對(duì)于一個(gè)積分器,狀態(tài)方程為:因此還需要編寫mdlDerivatives子函數(shù),將狀態(tài)的導(dǎo)數(shù)向量通過(guò)sys變量返回:
functionsys=mdlDerivatives(t,x,u)
sys=[u];如果系統(tǒng)包含多于一個(gè)狀態(tài),那么可以通過(guò)索引x(1),x(2),…得到各個(gè)狀態(tài)。自然地,對(duì)于多個(gè)狀態(tài),就會(huì)有多個(gè)導(dǎo)數(shù)與之對(duì)應(yīng),在這種情況下,sys為一個(gè)向量,其中包含了所有連續(xù)狀態(tài)的導(dǎo)數(shù)。與通常一樣,修改后的mdlOutputs中應(yīng)包含輸出方程。
在S-Function對(duì)話框內(nèi)設(shè)置參數(shù),S-functionname的參數(shù)名為sfun_int,設(shè)置S-functionparameters參數(shù)值為5,如圖12-12(a)所示。運(yùn)行仿真,得到的結(jié)果如圖12-12(b)所示。(a)(b)圖12-12
例12-4蹦極S-函數(shù)。
在這里利用S-函數(shù)實(shí)現(xiàn)第6章中的蹦極跳系統(tǒng),方程為:其中,h為距地面的距離;方程中的常值為,彈力系數(shù)k=5,a1=1,a2=1,g=10。用戶可以在S-函數(shù)中輸入長(zhǎng)度、質(zhì)量和離地面的距離。系統(tǒng)模型如圖12-13所示。其中,h為距地面的距離;方程中的常值為,彈力系數(shù)k=5,a1=1,a2=1,g=10。用戶可以在S-函數(shù)中輸入長(zhǎng)度、質(zhì)量和離地面的距離。系統(tǒng)模型如圖12-13所示。
修改主函數(shù)中的函數(shù)名稱為sfun_bungee,系統(tǒng)沒有輸入,使用一個(gè)if-else結(jié)構(gòu)實(shí)現(xiàn)b(x)判斷選擇。在S-Function模塊對(duì)話框內(nèi)輸入?yún)?shù)值,按照S-函數(shù)中的順序輸入S-functionparameters參數(shù)值,如圖12-14(a)。設(shè)置仿真時(shí)間為100個(gè)時(shí)間單位,運(yùn)行仿真,結(jié)果曲線如圖12-14(b)所示。(a)圖12-14(b)圖12-14下面是sfun_bungee函數(shù)文件完整的M代碼。
function[sys,x0,str,ts]=sfun_bungee(t,x,u,flag,len,weight,dist_ground)
%bungeejumpingsfunction:k=5;a1=1;a2=1;g=10;
%length,weight,distancefromgroundareinputparameters
k=5;a1=1;a2=1;g=10;
switchflag,
case0,
[sys,x0,str,ts]=mdlInitializeSizes(len);
case1,
sys=mdlDerivatives(t,x,u,weight,k,a1,a2,g);
case2,
sys=mdlUpdate(t,x,u);case3,
sys=mdlOutputs(t,x,u,dist_ground);
case4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandledflag=',num2str(flag)]);
end
function[sys,x0,str,ts]=mdlInitializeSizes(len)
sizes=simsizes;
sizes.NumContStates=2;sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=0;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;%atleastonesampletimeisneeded
sys=simsizes(sizes);
%initializetheinitialconditions.%
x0=[-len;0];
%strisalwaysanemptymatrix.%
str=[];12.5.3離散狀態(tài)S-函數(shù)
在實(shí)現(xiàn)一個(gè)離散系統(tǒng)時(shí),mdlInitializeSizes子函數(shù)應(yīng)做適當(dāng)?shù)男薷?,包括確定離散狀態(tài)的個(gè)數(shù)、狀態(tài)初始值和設(shè)置采樣時(shí)間。
狀態(tài)初始化function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=1;sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
%initializetheinitialconditions.%
x0=[0];
%strisalwaysanemptymatrix.%
str=[];
%initializethearrayofsampletimes.%
ts=[10];mdlUpdate和mdlOutputs函數(shù)也要做適當(dāng)?shù)男薷?,最?jiǎn)單的例子是單位延遲,因?yàn)閱挝谎舆t的方程為y(n+1)=u(n),等價(jià)的狀態(tài)方程表達(dá)式為:
x(n+1)=u(n)
y(n)=x(n)模型更新
mdlUpdate和mdlOutputs應(yīng)當(dāng)修改為:
functionsys=mdlUpdate(t,x,u)
sys=u;
functionsys=mdlOutputs(t,x,u)
sys=x;例12-5單位延遲S-函數(shù)。
編寫S-函數(shù)實(shí)現(xiàn)單位延遲功能,當(dāng)給定正弦波輸入時(shí),觀察輸出波形。
模型如圖12-16(a)所示,設(shè)置S-Function模塊參數(shù)對(duì)話框中的S-函數(shù)的名稱為sfun_und_,模塊中沒有額外參數(shù),由于這是一個(gè)含有一個(gè)離散狀態(tài)的S-函數(shù),因此在初始化時(shí)設(shè)置sizes.NumDiscStates=1。假設(shè)要實(shí)現(xiàn)延遲功能,可設(shè)置采樣時(shí)間ts,這里設(shè)置ts=
[0.10],表示采樣時(shí)間為0.1秒。如果設(shè)置ts=[-10],那么表示S-函數(shù)繼承驅(qū)動(dòng)模塊的采樣時(shí)間,那么得到的波形應(yīng)該與輸入的波形相同。運(yùn)行仿真,在示波器中觀察結(jié)果波形,圖12-15(b)中示波器上面的窗口顯示的是輸入信號(hào)波形,下面的窗口顯示的是S-函數(shù)的輸出波形。(a)(b)圖12-15用戶也可以封裝S-Function模塊,這樣可以在模塊圖標(biāo)上標(biāo)明該函數(shù)的功能,如在封裝編輯器的Icon選項(xiàng)頁(yè)內(nèi)輸入繪制命令:disp('UnitDelay'),那么所得S-Function模塊如圖12-16所示。圖12-16sys=simsizes(sizes);
x0=0;str=[];ts=[0.10];%Sampleperiodof0.1seconds(10Hz)
%endmdlInitializeSizes%============================================================%mdlUpdate%Handlediscretestateupdates,sampletimehits,andmajortimesteprequirements.
%============================================================
functionsys=mdlUpdate(t,x,u)sys=u;%endmdlUpdate
%=============================================
%mdlOutputs
%ReturntheoutputvectorfortheS-function
%=============================================
functionsys=mdlOutputs(t,x,u)
sys=x;
%endmdlOutputs例12-6人口系統(tǒng)S-函數(shù)。
編寫一個(gè)S-函數(shù)描述人口的動(dòng)態(tài)變化。設(shè)繁殖率為r,資源為k,初始人口數(shù)量為init,那么人口變化規(guī)律為系統(tǒng)模型如圖12-17所示。圖12-17修改S-函數(shù)的第一行:
function[sys,x0,str,ts]=sfun_population(t,x,u,flag,r,k,init)
對(duì)子函數(shù)的調(diào)用為:
case0,
[sys,x0,str,ts]=mdlInitializeSizes(init);
case2,
sys=mdlUpdate(t,x,u,r,k);
在這個(gè)例子中,p為狀態(tài),輸出等于狀態(tài),于是,更新函數(shù)和輸出函數(shù)為:
functionsys=mdlUpdate(t,x,u,r,k)
sys=[r*x*(1-x/k)];
functionsys=mdlOutputs(t,x,u)
sys=[x];翻開S-Function對(duì)話框,設(shè)置S-functionname參數(shù)為sfun_population,設(shè)置S-functionparameter參數(shù)值為1.05、1e6、100000,如圖12-18(a)所示。選擇變步長(zhǎng)ode45求解器,仿真100個(gè)時(shí)間單位,運(yùn)行仿真后得到的結(jié)果曲線如圖12-18(b)所示。(a)圖12-18(b)圖12-18下面是sfun_population函數(shù)文件完整的M代碼:
function[sys,x0,str,ts]=sfun_population(t,x,u,flag,r,K,init)
%populationdynamics.Rate(r),resources(K)andinitialpopulation
%(init)areuserinputs.
switchflag,
case0,
[sys,x0,str,ts]=mdlInitializeSizes(init);
case1,
sys=mdlDerivatives(t,x,u);
case2,
sys=mdlUpdate(t,x,u,r,K);
case3,
sys=mdlOutputs(t,x,u);
case4,sys=mdlGetTimeOfNextVarHit(t,x,u);
case9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandledflag=',num2str(flag)]);
end
function[sys,x0,str,ts]=mdlInitializeSizes(init)
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=1;
sizes.NumOutputs=1;
sizes.NumInputs=0;sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;%atleastonesampletimeisneeded
sys=simsizes(sizes);
%initializetheinitialconditions.%
x0=[init];
%strisalwaysanemptymatrix.%
str=[];
%initializethearrayofsampletimes.%
ts=[10];
%endmdlInitializeSizes%===================================================
%mdlDerivatives
%Returnthederivativesforthecontinuousstates.
%==============================================
functionsys=mdlDerivatives(t,x,u)
sys=[];
%endmdlDerivatives
%================================================
%mdlUpdate
%Handlediscretestateupdates,sampletimehits,andmajortimesteprequirements.
%==================================================
functionsys=mdlUpdate(t,x,u,r,K)
sys=[r*x*(1-x/K)];12.5.4混合系統(tǒng)S-函數(shù)
混合系統(tǒng)是包含連續(xù)狀態(tài)和離散狀態(tài)的系統(tǒng),在實(shí)現(xiàn)混合系統(tǒng)時(shí),mdlInitializeSizes子函數(shù)應(yīng)做適當(dāng)?shù)男薷?,用戶需要在子系統(tǒng)中指定連續(xù)狀態(tài)和離散狀態(tài)的個(gè)數(shù)、狀態(tài)初始值和設(shè)置采樣時(shí)間。
在處理混合系統(tǒng)時(shí),用戶應(yīng)明確指定flag參數(shù)值,以便正確調(diào)用系統(tǒng)中連續(xù)局部和離散局部的子函數(shù)。對(duì)于混合S-函數(shù),或者對(duì)于任何一個(gè)多速率S-函數(shù),Simulink在所有的采樣時(shí)刻都需要調(diào)用mdlUpdate、mdlOutputs和mdlGetTifeOfNextVarHit函數(shù),這就意味著用戶必須知道所處理的采樣時(shí)刻,并執(zhí)行對(duì)應(yīng)時(shí)刻的更新函數(shù)。例12-7混合系統(tǒng)S-函數(shù)。
圖12-19是一個(gè)由連續(xù)積分器和離散單位延遲模塊組成的混合系統(tǒng)。圖12-19這里用S-函數(shù)實(shí)現(xiàn)圖12-19的功能,S-函數(shù)的名稱為sfun_mix。
下面是sfun_mix函數(shù)文件完整的M代碼:
function[sys,x0,str,ts]=sfun_mix(t,x,u,flag)
%Samplingperiodandoffsetforunitdelay.
dperiod=1;
doffset=0;
switchflag
case0
[sys,x0,str,ts]=mdlInitializeSizes(dperiod,doffset);%Initialization%
case1
sys=mdlDerivatives(t,x,u);%Derivatives%
case2,
sys=mdlUpdate(t,x,u,dperiod,doffset);%Updat
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年重型鋼軌焊接勞務(wù)分包正式合同
- 2024年綜合性IT解決方案外包協(xié)議樣本版
- 2024年私人房產(chǎn)買賣合同范本:繼承房產(chǎn)交易3篇
- 2025年度版權(quán)質(zhì)押合同:某藝術(shù)家與銀行的版權(quán)質(zhì)押貸款
- 二零二五年度井蓋采購(gòu)合同含專利技術(shù)許可2篇
- 2025年度生態(tài)園生物多樣性保護(hù)承包協(xié)議3篇
- 2024年訂婚合同標(biāo)準(zhǔn)格式版B版
- 2025版潔具行業(yè)環(huán)保公益項(xiàng)目合作協(xié)議3篇
- 2024年離婚父母子女撫養(yǎng)費(fèi)具體合同范本版B版
- 二零二五年度建筑用涂料租賃服務(wù)協(xié)議3篇
- 2025年1月山西、陜西、寧夏、青海普通高等學(xué)校招生考試適應(yīng)性測(cè)試(八省聯(lián)考)政治
- DB3707T 131-2024 城鎮(zhèn)居民供熱服務(wù)規(guī)范
- 《廣東省智慧高速公路建設(shè)指南(試行)》
- 護(hù)理年終個(gè)人工作總結(jié)
- 社區(qū)中心及衛(wèi)生院65歲及以上老年人健康體檢分析報(bào)告模板
- 年度分析報(bào)告格式范文
- 2024年度吉林省國(guó)家電網(wǎng)招聘之法學(xué)類典型題匯編及答案
- 山東省臨沂市2023-2024學(xué)年高一上學(xué)期1月期末考試 物理 含答案
- 2024年世界職業(yè)院校技能大賽中職組“嬰幼兒保育組”賽項(xiàng)考試題庫(kù)-下(多選、判斷題)
- 2023年福建公務(wù)員錄用考試《行測(cè)》真題卷及答案解析
- 中華人民共和國(guó)學(xué)前教育法
評(píng)論
0/150
提交評(píng)論