動態(tài)系統(tǒng)建模與仿真_第1頁
動態(tài)系統(tǒng)建模與仿真_第2頁
動態(tài)系統(tǒng)建模與仿真_第3頁
動態(tài)系統(tǒng)建模與仿真_第4頁
動態(tài)系統(tǒng)建模與仿真_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

動態(tài)系統(tǒng)建模與仿真第一頁,共六十五頁,編輯于2023年,星期五7.1Simulink工具箱簡介

7.1.1Simulink工具箱簡介

Simulink是Simulation(仿真)與link(連接)的簡寫形式,它提供一個動態(tài)系統(tǒng)建模、仿真和綜合分析的集成環(huán)境,是MATLAB最重要的組件之一,也是其它仿真工具箱的可視化仿真平臺。優(yōu)點:建模方便靈活,適用面廣,結構和流程清晰,效率高等。

第二頁,共六十五頁,編輯于2023年,星期五1Simulink啟動(1)在MATLAB命令窗口輸入“simulink”命令。(2)單擊MATLAB主窗口左下角的“Start”按鈕,在彈出的快捷菜單中單擊【Simulink】→【LibraryBrowser】命令。(3)單擊MATLAB主窗口工具欄里的工具。7.1.2Simulink組成圖7-1Simulink窗口界面第三頁,共六十五頁,編輯于2023年,星期五CommonlyUsedBlocks(常用模塊庫)Continuous(連續(xù)系統(tǒng)模塊庫)Discontinuous(非連續(xù)系統(tǒng)模塊庫)Discrete(離散系統(tǒng)模塊庫)LogicandBitOperations(邏輯與位操作模塊庫)LookupTables(查詢表模塊庫)MathOperations(數學操作模塊庫)ModelVerification(模型驗證模塊庫)2Simulink模塊庫組件

Simulink7.1模塊庫共包含16個子模塊庫,它們是:第四頁,共六十五頁,編輯于2023年,星期五Model-WideUtility,Ports&Subsystems(接口與子系統(tǒng)模塊庫),SignalAttributes(信號屬性模塊庫)SignalRouting(信號路由模塊庫)Sinks(輸出模塊庫)Sources(信號源模塊庫)User-DefinedFunctions(用戶自定義模塊庫)AdditionalMath&Discrete(附加數學和離散系統(tǒng)模塊庫)第五頁,共六十五頁,編輯于2023年,星期五

是為了加快建模速度,節(jié)省建模過程中尋找模塊的時間而將最常用的基本模塊集中放在一起形成的,在初學Simulink建模與仿真時,是使用最為頻繁的模塊庫。(1)CommonlyUsedBlocks(常用模塊庫)圖7-2第六頁,共六十五頁,編輯于2023年,星期五常用模塊庫包括總線信號生成器(BusCreator)模塊、總線信號選擇器(BusSelector)模塊、常數模塊(Constant)、數據類型轉換(DataTypeConversion)模塊,信號分離器(Demux)模塊,離散時間積分(Discrete-TimeIntegrator)模塊,增益(Gain)模塊,信號地(Ground)模塊,輸入接口(In1)模塊,積分(Integrator)模塊,第七頁,共六十五頁,編輯于2023年,星期五邏輯操作(LogicOperator)模塊,信號合成器(Mux)模塊,輸出接口(Out1)模塊,乘法(Product)模塊,關系操作(RelationalOperator)模塊,飽和(Saturation)模塊,示波器(Scope)模塊,子系統(tǒng)(Subsystem)模塊,求和模塊(Sum),開關轉換模塊(Switch),信號終端(Terminator)模塊,單位延遲(UnitDelay)模塊。第八頁,共六十五頁,編輯于2023年,星期五

連續(xù)系統(tǒng)(Continuous)模塊庫提供了連續(xù)系統(tǒng)Simulink建模與仿真的基本模塊,有:微分環(huán)節(jié)模塊(Derivative),積分環(huán)節(jié)模塊(Integrator),狀態(tài)空間模型(State-space),傳遞函數功能模塊(TransferFun),傳輸延遲模塊(TransportDelay),可變時間延遲模塊(VeriableTransportDelay),可變傳輸延遲模塊(VeriableTransportDelay)零極點增益模塊(Zero-Pole)(2)連續(xù)系統(tǒng)模塊庫

圖7-3第九頁,共六十五頁,編輯于2023年,星期五非連續(xù)系統(tǒng)模塊庫(DisContinity)在以前版本中也稱為非線性模塊庫,包含一些常用的非線性運算模塊,主要包括:

(3)非連續(xù)系統(tǒng)模塊庫

飽和非線性模塊(Saturation)死區(qū)非線性模塊(DeadZone)變化率限幅模塊(RateLimiter)變化率動態(tài)限幅模塊(RateLimiterDynamic)用于設置飽和輸出上下限。動態(tài)飽和非線性模塊(SaturationDanymic)可以根據輸入端口Up和Lo的設定值動態(tài)設置輸出的上限和下限。用于設定死區(qū)區(qū)間。動態(tài)死區(qū)非線性模塊(DeadZoneDanymic)可以根據輸入端口Up和Lo的設定值動態(tài)設置死區(qū)區(qū)間。用于設置信號輸出變化率限幅,即:上升變化率限幅(Risingslewrate)和下降變化率限幅(Fallingslewrate)??梢愿鶕斎攵丝赨p和Lo的設定值動態(tài)設置信號上升變化率限幅參數R和下降變化率限幅參數L。第十頁,共六十五頁,編輯于2023年,星期五磁滯回環(huán)模塊(Backlash):建立間隙模型。繼電模塊(Relay)量化模塊(Quantizer):用于輸入信號的量化處理。穿越值檢測模塊(HitCrossing):庫侖與黏性摩擦(Coulomb&ViscousFriction):返回零模塊(WraptoZero)繼電模塊輸出值可以在兩個設定值之間切換。當繼電器吸合時,它保持吸合狀態(tài)輸出直到輸入信號值小于繼電斷開值(Switchoffpoint)。當繼電器分離時,它保持分離狀態(tài)輸出直到輸入信號值大于繼電吸合值(Switchonpoint)。可按設定的穿越檢測方向(Hitcrossingdirection)檢測信號達到設定值的時間。此時輸出一個正脈沖。在零值為不連續(xù)點,在其它值為連續(xù)線性增益。當輸入信號值超過設定的極限值(Threshold),輸出信號返回到零值。第十一頁,共六十五頁,編輯于2023年,星期五單位延遲模塊(UnitDelay):延遲一個采樣周期整數延遲模塊(IntegerDelay):延遲輸入N個采樣周期,N為自然數。觸發(fā)延遲模塊(TappedDelay):延遲N個采樣周期后并輸出全部的輸入信息。離散時間積分器(Discrete-TimeIntegrator):離散積分器模塊可以代替積分器用來建立純離散采樣系統(tǒng)。在離散積分器模塊參數對話框里,可以設定初始狀態(tài)值、增益值、輸出飽和值。離散傳遞函數功能模塊(DiscreteTransferFcn):可以建立離散傳遞函數模型。離散濾波器模塊(DiscreteFilter):用于建立離散系統(tǒng)濾波器仿真模型。離散零極點增益模型(DiscreteZero-Pole):使用零點、極點、增益值建立離散系統(tǒng)的零極點增益模型。離散微分模塊(Difference):輸出當前輸入信號值與前一個采樣值之差。派生離散微分模塊(DiscreteDerivative):模塊的輸出值按下式計算:(3)離散系統(tǒng)模塊庫離散系統(tǒng)模塊庫主要包括用于建立離散采樣系統(tǒng)的模塊,包括:圖7-4第十二頁,共六十五頁,編輯于2023年,星期五離散狀態(tài)空間模型(DiscreteState-Space):離散狀態(tài)空間模型實現下面系統(tǒng)模型一階離散傳遞函數功能模塊(TransferFcnFirstOrder):用于建立一階的離散傳遞函數模型。傳遞函數引導或終止模塊(TransferFcnLeadorLag):用于實現輸入信號的離散時間引導或終止補償。實數零點傳遞函數功能模塊(TransferFcnRealZero):用于實現具有一個實數零點而無極點的傳遞函數模型。加權滑動平均模塊(WeightedMovingAverage):模塊采樣并保持最近N個輸入信號,并根據設定的權重參數值(weights)計算它們的平均值。該模塊適用于SISO系統(tǒng)或SIMO系統(tǒng)模型。記憶模塊(Memory):輸出前一時刻的輸入信號值。一階保持器(First-OrderHold):實現離散采樣系統(tǒng)的一階采樣保持功能。零階保持器(Zero-OrderHold):實現離散采樣系統(tǒng)的零階采樣保持功能。第十三頁,共六十五頁,編輯于2023年,星期五其它模塊請參考MATLAB軟件!第十四頁,共六十五頁,編輯于2023年,星期五7.2Simulink建模與仿真基本方法7.2.1簡單系統(tǒng)仿真模型的建立

建立上圖所示系統(tǒng)框圖的Simulink仿真模型的基本方法如下;

1.啟動MATLAB/Simulink工具箱

2.建立Simulink空白模型Simulink空白模型的建立可方法如下:在MATLAB主窗口中選擇菜單File/New/Model。選擇Simulink模塊庫瀏覽器窗口的菜單File/New/Model。單擊Simulink模塊庫瀏覽器工具欄的新建圖標“”。第十五頁,共六十五頁,編輯于2023年,星期五3.根據系統(tǒng)框圖選擇模塊4.模塊的復制與刪除操作在模塊庫選中模塊后,按住鼠標左鍵不放并拖動到Simulink模型窗口指定位置,釋放鼠標左鍵,完成模塊的復制操作。在模塊庫選中模塊后,單擊鼠標右鍵,在彈出的快捷菜單中,單擊“AddtoExample_Model”命令將模塊添加到指定模型窗口,完成模塊的復制操作。在模塊庫選中模塊后,在庫瀏覽器窗口的Edit菜單中選擇Copy命令,用鼠標單擊目標模型窗口中指定位置,再從模型窗口的Edit菜單中選擇Paste,完成模塊的復制操作。當模型窗口已有所需模塊時,也可以直接從該處復制模塊,操作方是單擊鼠標右鍵,在彈出的快捷菜單中單擊“Copy”命令,然后用鼠標右鍵單擊模型窗口空白處,在彈出的快進誒菜單中單擊“Paste”命令來完成粘貼任務。此外,也可以使用編輯菜單進行復制、粘貼操作。當然還可以用鼠標右鍵按住所需復制的模塊不放,并拖動到指定位置完成復制操作,這可大大加快建模速度。第十六頁,共六十五頁,編輯于2023年,星期五5.模塊的連接將鼠標移動到模塊的輸出端子上,當鼠標出現“十字”符號后,按下鼠標左鍵并拖動到下級模塊的輸入端子上,完成模塊信號的連接。如上圖所示。選中信號輸出模塊,按下鍵盤“Ctrl”鍵并單擊下級模塊完成模塊信號的連接。在已存在的信號線上引出新的信號線時,可用鼠標右鍵單擊源信號線,并按住不放拖動到指定位置,完成信號線的分支連接。如圖所示,在模塊沒有完成連接時,以紅色虛線顯示,當連接完成后以黑色實線顯示。第十七頁,共六十五頁,編輯于2023年,星期五將各子模塊連接起來后,構成如圖所示的系統(tǒng)模型第十八頁,共六十五頁,編輯于2023年,星期五7.2.2Simulink仿真模型參數設置1.基本模塊參數設置在完成模塊的信號線連接并建立起系統(tǒng)的Simulink仿真模型后,需要設置模塊的參數。在Simulink模型里,雙擊需要修改參數的模塊,彈出參數設置對話框。2.仿真參數設置

單擊模型窗口的“Simulation”菜單,在彈出的下拉菜單中單擊“ConfigurationParameters”命令,打開“ConfigurationParameters”對話框如圖所示。

第十九頁,共六十五頁,編輯于2023年,星期五3.運行仿真與仿真輸出

雙擊“Scope”模塊,彈出如圖所示仿真輸出結果仿真參數配置完畢后,可運行仿真,方法有三種:①單擊模型窗口工具欄工具②單擊“Simulation”菜單,在彈出的下拉菜單中單擊“Start”命令③同時按下快捷鍵“Ctrl+T”。第二十頁,共六十五頁,編輯于2023年,星期五7.3動態(tài)系統(tǒng)Simulink仿真模型的建立由系統(tǒng)框圖建立Simulink仿真模型由傳遞函數建立Simulink仿真模型由狀態(tài)方程建立Simulink仿真模型由微分方程建立Simulink仿真模型第二十一頁,共六十五頁,編輯于2023年,星期五7.1.1由系統(tǒng)框圖建立Simulink仿真模型在控制領域,控制系統(tǒng)通常以功能框圖的形式進行描述,與Simulink仿真模型在結構上十分相似,因此通過被控系統(tǒng)的框圖,很容易建立其Simulink仿真模型。下面以直流電機雙閉環(huán)調速系統(tǒng)為例來說明通過系統(tǒng)框圖建立Simulink仿真模型的基本方法。第二十二頁,共六十五頁,編輯于2023年,星期五r(t)為給定輸入,采用階躍信號。y(t)為系統(tǒng)輸出,表示直流電機的轉速。ASR和ACR分別為轉速調節(jié)器、電流調節(jié)器,由PI調節(jié)器組成。根據直流雙閉環(huán)調速系統(tǒng)工程整定方法,進行ASR和ACR的參數整定時,首先斷開轉速環(huán),整定電流調節(jié)器ACR。然后接通轉速環(huán),整定轉速環(huán)ASR,同時調節(jié)電流環(huán)參數。根據上述分析,首先建立直流雙閉環(huán)調速系統(tǒng)的高層仿真模型,其中轉速調節(jié)器和電流調節(jié)器由空白子系統(tǒng)組成,如圖所示。轉速調節(jié)器子系統(tǒng)Simulink模型電流調節(jié)器子系統(tǒng)Simulink模型第二十三頁,共六十五頁,編輯于2023年,星期五7.1.2由傳遞函數建立Simulink仿真模型由系統(tǒng)傳遞函數建立Simulink仿真模型可直接使用Continue模塊庫的TransferFun模塊,下面以實例說明?!纠}】已知某單位負反饋系統(tǒng)開環(huán)傳遞函數為試建立其Simulink仿真模型并進行仿真。第二十四頁,共六十五頁,編輯于2023年,星期五建立模型過程如下:(1)建立一個空白的Simulink仿真模型窗口,如圖(a)所示。(3)建立傳遞函數的模型。(2)選擇系統(tǒng)所需的Simulink模塊(4)連接模塊并設置仿真參數(5)運行仿真第二十五頁,共六十五頁,編輯于2023年,星期五7.1.3由狀態(tài)方程建立Simulink仿真模型由系統(tǒng)狀態(tài)方程建立Simulink仿真模型可直接使用Continue模塊庫的State-space模塊,下面以實例說明?!纠恳阎诚到y(tǒng)狀態(tài)空間模型為:試建立其simulink仿真模型,并求其單位階躍響應。第二十六頁,共六十五頁,編輯于2023年,星期五求解過程如下:(2)選擇系統(tǒng)所需的Simulink模塊(1)建立一個Simulink空白仿真模型窗口(3)連接模塊并設置參數(4)設置仿真參數并運行仿真第二十七頁,共六十五頁,編輯于2023年,星期五7.1.4由微分方程建立Simulink仿真模型第一是將系統(tǒng)微分方程轉換為傳遞函數模型,第二是將微分方程轉換為狀態(tài)空間模型,第三是由微分方程直接建立Simulink仿真模型。

由微分仿真建立Simulink仿真模型有三種方法,【例】已知某系統(tǒng)數學模型是一個高階微分方程:且輸出量y的各階導數初始值均為零,試建立其Simuink仿真模型。第二十八頁,共六十五頁,編輯于2023年,星期五求解過程如下:

(1)將高階微分方程轉換為一組一階微分方程:設輸出方程。則得:第二十九頁,共六十五頁,編輯于2023年,星期五(2)建立每個一階微分方程的Simulink仿真模型這里首先需要知道微分環(huán)節(jié)的Simulink模型如圖(a)所示因此可以建立Simulink仿真模型如圖(b、c、d)所示第三十頁,共六十五頁,編輯于2023年,星期五(3)建立微分方程組的simulink仿真模型。

將各個微分單元連接起來就構成了整個系統(tǒng)的Simulink仿真模型,結果如下圖所示。第三十一頁,共六十五頁,編輯于2023年,星期五(4)設置Simulink仿真參數。上圖中u取單位階躍響應信號,Simulink求解器取默認參數配置。運行仿真得輸出響應曲線如圖下圖所示。第三十二頁,共六十五頁,編輯于2023年,星期五7.4Simulink子系統(tǒng)技術

在使用Simulink進行建模與仿真時,經常會遇見很復雜的系統(tǒng),難以用一個簡單的Simulink框圖模型來進行描述。與軟件開發(fā)方法一樣,此時可將復雜系統(tǒng)的模型進行功能劃分,將其分割為各個獨立的子系統(tǒng),然后再采用以下兩種策略加以實現:(1)自下而上的策略:首先建立復雜系統(tǒng)中的每一個功能模塊,然后再組合這些模塊,逐漸建立整個系統(tǒng)的模型。(2)自上而下的策略:首先建立復雜系統(tǒng)的整體結構模型,然后再逐一實現每一部分的模型。無論那種策略,對于復雜系統(tǒng)模型的建立,都要用到子系統(tǒng)技術。本節(jié)主要介紹子系統(tǒng)及其封裝技術。第三十三頁,共六十五頁,編輯于2023年,星期五7.4.1子系統(tǒng)的創(chuàng)建方法1.通過port&subsystem模塊庫建立子系統(tǒng)

在建立子系統(tǒng)時,比較方便的是首先使用Port&Subsystem的Subsystem模塊建立一個空白子系統(tǒng),然后對空白子系統(tǒng)進行編輯,最后再建立系統(tǒng)整體的Simulink仿真模型。這里以閉環(huán)系統(tǒng)的PID控制為例來說明子系統(tǒng)的建立方法。如圖所示第三十四頁,共六十五頁,編輯于2023年,星期五在已經建立好的復雜系統(tǒng)模型之中建立子系統(tǒng)。其基本方法是:首先選擇將要生成子系統(tǒng)的一組模塊,然后選擇Simulink模型編輯器的菜單【Edit:CreateSubsystem】或者單擊鼠標右鍵選擇CreateSubsystem選項,都將生成子系統(tǒng)模塊。如圖所示。2.直接建立子系統(tǒng)第三十五頁,共六十五頁,編輯于2023年,星期五7.4.2子系統(tǒng)的封裝方法在上述PID控制的子系統(tǒng)模型中,如果需要修改PID的參數,則需要打開其子系統(tǒng)模型窗口。為了能不打開該子系統(tǒng)模塊窗口而修改其內部參數,Simulink提供了子系統(tǒng)封裝技術。以上述建立的PID控制器子系統(tǒng)為例來說明子系統(tǒng)封裝的基本步驟。

(1)選中子系統(tǒng),單擊鼠標右鍵,在彈出的對話框中單擊“MaskSubsystem”命令或者單擊菜單【Edit】→【MaskSubsystem】,彈出子系統(tǒng)封裝編輯窗口,如圖所示。在“Drawingcommands”編輯窗口,可以給模塊圖標上繪制圖形,如使用plot繪制圖形、disp顯示文字、image顯示已有圖形第三十六頁,共六十五頁,編輯于2023年,星期五

(1)子系統(tǒng)圖標設置,單擊Icon按鈕,設置子系統(tǒng)圖標。在“Drawingcommands”編輯窗口,可以給模塊圖標上繪制圖形,如使用plot繪制圖形、disp顯示文字、image顯示已有圖形例:使用如下命令可得到如圖所示結果disp(‘PIDController‘)plot(sin(0:0.1:2*pi),cos(0:0.1:2*pi)/2)image(imread('library.bmp'))封裝編輯框基本設置第三十七頁,共六十五頁,編輯于2023年,星期五(2)參數設置:單擊Parameters按鈕,建立封裝模塊內部變量與封裝對話框之間的聯系。單擊按鈕或按鈕可以增加或刪除變量“Type”可選擇參數為:“Edit”表示用文本編輯框輸入參數“Popup”表示以下拉菜單形式輸入參數“checkbox”表示以復選框形式輸入參數

此處變量名稱要與子系統(tǒng)參數名稱相同第三十八頁,共六十五頁,編輯于2023年,星期五(3)初始化設置:單擊“Initialization”按鈕,彈出封裝編輯器參數初始化設置對話框。第三十九頁,共六十五頁,編輯于2023年,星期五(4)文檔編輯。單擊“Documentation”按鈕,彈出如圖所示的文檔編輯窗口。在這里可建立子系統(tǒng)的文檔說明。第四十頁,共六十五頁,編輯于2023年,星期五

經過上述操作,完成對PID子系統(tǒng)的封裝操作,雙擊子系統(tǒng)模塊,彈出參數設置對話框如圖所示。第四十一頁,共六十五頁,編輯于2023年,星期五7.5S-函數與Simulink仿真7.5.1S-函數簡介

S-函數是系統(tǒng)函數(SystemFunction)的簡稱,是指用指定語言描述的一個非圖形化功能模塊(以區(qū)別Simulink的系統(tǒng)模塊),是Matlab為用戶提供的一個擴展功能接口。用戶可以采用MATLAB語言,C、C++,Fortran或者Ada等語言編寫S函數。S-函數由一種特定的語法構成,用來描述并實現連續(xù)系統(tǒng)、離散系統(tǒng)、混合系統(tǒng)等模型。S函數可接收來自Simulink求解器的相關信息,并對求解器發(fā)出的命令作出響應,這種交互作用類似Smulink系統(tǒng)模塊與求解器的交互作用。第四十二頁,共六十五頁,編輯于2023年,星期五7.5.2.S-函數的用法在動態(tài)系統(tǒng)設計、仿真與分析中,用戶可以使用Simulink瀏覽器里用戶自定義模塊庫中的S-Functiong模塊來調用已編寫的S-函數。S-Function模塊默認為一個單輸入單輸出的系統(tǒng)模塊,如果有多個輸入或者輸出信號,可以采用Mux模塊和Demux模塊對信號進行組合和分離操作。在Simulink空白模板里粘貼“S-Function”模塊,雙擊該模塊彈出參數設置對話框,如圖所示。第四十三頁,共六十五頁,編輯于2023年,星期五創(chuàng)建S-函數源文件。在Simulink模型框圖中添加S-Function模塊,并進行正確的參數設置。在Simulink模塊框圖中按照定義好的功能連接輸入輸出端口進行基本仿真參數設置,單擊工具欄工具,運行仿真。一般而言,使用S-函數的基本步驟如下:

創(chuàng)建S-函數源文件的方法有很多,用戶可以按照S-函數語法格式自行編寫每一行代碼,但是這樣做既費時費力,又容易出錯。Simulink為用戶提供了很多S-函數的模板和例子,我們可以根據自己的需要修改相應的模板或者例子即可。詳細的Simulink模板文件在后面介紹。第四十四頁,共六十五頁,編輯于2023年,星期五7.5.3S-函數模板單擊SimulinkLibrary的“User-DefinedFunction”前的擴展按鈕,再雙擊“S-functionExamples”模塊彈出如圖7-477所示的S-函數實例模塊庫。圖中包括用M文件、C語言、C++、Ada、和Fortran語言編寫的S-函數實例。第四十五頁,共六十五頁,編輯于2023年,星期五【例題】以S-函數完成對輸入信號的運算:y=3*u+2。解:基本步驟如下:(1)建立Simulink仿真模型,如圖所示

第四十六頁,共六十五頁,編輯于2023年,星期五2)打開S-函數模板源文件如下function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)switchflag,case0,[sys,x0,str,ts]=mdlInitializeSizes;case1,sys=mdlDerivatives(t,x,u);case2,sys=mdlUpdate(t,x,u);case3,sys=mdlOutputs(t,x,u);case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);otherwise

DAStudio.error('Simulink:blocks:unhandledFlag',num2str(flag));endfunction[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=0;sizes.NumOutputs=0;sizes.NumInputs=0;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;%定義采用周期的個數sys=simsizes(sizes);x0=[];str=[];ts=[00];functionsys=mdlDerivatives(t,x,u)sys=[];functionsys=mdlUpdate(t,x,u)

sys=[];functionsys=mdlOutputs(t,x,u)sys=[];functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;sys=t+sampleTime;functionsys=mdlTerminate(t,x,u)sys=[];ts是一個1×2的向量,ts(1)定義采樣周期,ts(2)是偏移量。當ts(1)=0表示系統(tǒng)為連續(xù)系統(tǒng),當ts(1)=-2表示系統(tǒng)采樣時間由flag=4的mdlGetTimeOfNextVarHit函數決定。輸入變量中,t是采樣時間,x是狀態(tài)變量,u是輸入變量(從Simulink輸入來的變量信息,當有多個輸入時,u為一個行向量,flag是仿真過程中的狀態(tài)標志或稱之為控制變量,由它來判斷當前將要調用的回調函數;輸出變量sys根據flag的不同而返回不同的內容。)第四十七頁,共六十五頁,編輯于2023年,星期五在本例題中,為了完成設定的函數功能y=3*u+2,可將上述S-函數的模板進行如下修改(這里只列出需要修改的部分):首先將S函數文件首行修改為:function[sys,x0,str,ts]=Mysfun(t,x,u,flag),并將文件另存為Mysfun。其次,找到function[sys,x0,str,ts]=mdlInitializeSizes,作如下修改:

sizes.NumOutputs=1;

sizes.NumInputs=1;然后,再找到functionsys=mdlOutputs(t,x,u),作如下修改:

sys=3*u+2;最后,將該文件保存到當前目錄下的Mysfun.m文件中。第四十八頁,共六十五頁,編輯于2023年,星期五(3)雙擊仿真模型中的S-function模塊打開參數設置對話框,并修改S-function的名稱為“Mysfun”。(4)修改仿真參數,完成仿真。這里仿真求解器參數取系統(tǒng)默認值,運行仿真,可得如圖所示仿真結果。第四十九頁,共六十五頁,編輯于2023年,星期五【例】已知某系統(tǒng)狀態(tài)方程為:試用S-函數建立其仿真模型,并求其單位階躍響應曲線。解:首先打開S-函數模板文件。打開S-函數模板文件除了按照上述介紹的方法,也可以在CommandWindows中輸入命令:>>opensfuntmpl或者

>>editsfuntmpl執(zhí)行命令后系統(tǒng)彈出M文件的S-函數編輯窗口。實現上述系統(tǒng)的S-函數程序代碼如下所示:第五十頁,共六十五頁,編輯于2023年,星期五function[sys,x0,str,ts]=Mysfun01(t,x,u,flag)switchflag,case0,

%初始化%[sys,x0,str,ts]=mdlInitializeSizes;case1,%求導數sys=mdlDerivatives(t,x,u);case2,%狀態(tài)更新%sys=mdlUpdate(t,x,u);case3,%計算輸出%sys=mdlOutputs(t,x,u);%計算下一個采樣時刻%case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,%結束處理%sys=mdlTerminate(t,x,u);otherwise%錯誤處理%DAStudio.error('Simulink:blocks:unhandledFlag',num2str(flag));endfunction[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;sizes.NumContStates=3;%系統(tǒng)有三個連續(xù)狀態(tài)變量sizes.NumDiscStates=0;sizes.NumOutputs=1;%系統(tǒng)有一個輸出變量sizes.NumInputs=1;%系統(tǒng)有一個輸入變量sizes.DirFeedthrough=0;%系統(tǒng)不存在直通環(huán)節(jié)sizes.NumSampleTimes=1;%只有一種采樣時間sys=simsizes(sizes);x0=[0;0;0];%str=[];ts=[00];functionsys=mdlDerivatives(t,x,u)x(1)=-1*x(1)+3*u;x(2)=-2*x(2)-22*u;x(3)=-3*x(3)+20*u;sys=x;第五十一頁,共六十五頁,編輯于2023年,星期五functionsys=mdlUpdate(t,x,u)sys=[];functionsys=mdlOutputs(t,x,u)sys=-x(1)-x(2)-x(3);functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;%設置采樣周期sys=t+sampleTime;functionsys=mdlTerminate(t,x,u)sys=[];將上述S-函數在當前目錄下保存為M文件Mysfun01,再建立Simulink仿真模型如圖所示,并設置S-function模塊的參數為S-functionname,仿真參數取默認值,運行仿真可得仿真結果如圖所示。第五十二頁,共六十五頁,編輯于2023年,星期五7.5.4添加用戶參數的S-函數

當S-函數需要添加用戶參數時,要注意兩點。第一,在S-函數源代碼中,用到該參數的各個子函數,在函數聲明部分均應添加該參數,第二,在Simulink模型中設置“S-function”模塊參數時,參數的名稱和順序必須與S-函數源代碼中的參數名稱和順序完全一致。下面以建立一個三角波函數發(fā)生器為例來說明帶參數項的S-函數的建立與使用?!纠吭嚱imulink下三角波函數發(fā)生器,且三角波頻率幅值可調。解:首先編寫生成三角波S-函數的M文件,打開M文件模板程序,做如下所改:第五十三頁,共六十五頁,編輯于2023年,星期五function[sys,x0,str,ts]=sanjiaobo(t,x,u,flag,A,Freq)%輸入參數A為三角波幅值,Freq為三角波頻率switchflag,case0,[sys,x0,str,ts]=mdlInitializeSizes;case1,sys=mdlDerivatives(t,x,u);case2,sys=mdlUpdate(t,x,u);case3,sys=mdlOutputs(t,x,u,A,Freq);%注意在輸出函數部分用到附加參數

case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);otherwiseerror(['Unhandledflag=',num2str(flag)]);end第五十四頁,共六十五頁,編輯于2023年,星期五function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=0;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;%只有一種采樣時間sys=simsizes(sizes);x0=[];str=[];%initializethearrayofsampletimests=[00];functionsys=mdlDerivatives(t,x,u)sys=[];functionsys=mdlUpdate(t,x,u)sys=[];functionsys=mdlOutputs(t,x,u,A,Freq)T=1/Freq;%求三角波周期m=rem(u,T);%u為外部輸入時間信息,rem為求余函數K=floor(u/T);%floor為向零取整r=4*A*Freq;c=T/2;if((m>=0)&(m<c))sys=r*(u-(K+0.25)*T);elseif((m>=c)&(m<=T))sys=-[r*(u-(K+0.75)*T)];elsesys=A;endfunctionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;sys=t+sampleTime;functionsys=mdlTerminate(t,x,u)sys=[];

%仿真結束第五十五頁,共六十五頁,編輯于2023年,星期五

將上述M文件的S函數在當前目錄下保存為sanjiaobo.m文件,建立Simulink仿真模型如圖(a)所示。雙擊“S-function”模塊,在彈出的參數設置對話框種,設置“S-functionname”為“saniaobo”,設置“S-functionParameter”為“1,1500”,如圖(b)所示。Simulink求解器參數“Maxstepsize”設置為1e-5,“Stoptime”設置為0.2s,其它取系統(tǒng)默認值。第五十六頁,共六十五頁,編輯于2023年,星期五單擊Simulink模型窗口工具,運行仿真得如圖7-56所示結果(圖中顯示時間范圍為0~7e-3s)。第五十七頁,共六十五頁,編輯于2023年,星期五7.5.5離散系統(tǒng)的S-函數

【例】已知離散PID表達式為:u(k)=Kp*e(k)+Ki*T*+Kd*[e(k-1)-e(k-2)]/T試使用S-函數實現離散PID控制器,并建立Simulink仿真模型。解:首先打開S-函數M-文件的模板程序,建立離散PID的

S-函數源文件。結果如下:第五十八頁,共六十五頁,編輯于2023年,星期五function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag,Kp,Ki,Kd)switchflag,case0,[sys,x0,str,ts]=mdlInitializeSizes;case1,sys=mdlDerivatives(t,x,u);case2,sys=mdlUpdate(t,x,u,Kp,Ki,Kd);case3,sys=mdlOutputs(t,x,u);case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);otherwiseDAStudio.error('Simulink:blocks:unhandledFlag',num2str(flag));end%endsfuntmpl第五十九頁,共六十五頁,編輯于2023年,星期五function[sys,x0,str,ts]=mdlInitiali

溫馨提示

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

評論

0/150

提交評論