[MATLAB中基于S-FUNCTION的SIMULINK自定義模塊實現(xiàn)] lm2596S模塊

        發(fā)布時間:2020-02-16 來源: 短文摘抄 點擊:

          收稿日期:2006-09-22?   作者簡介:劉佑祥(1946-),男,湖北武漢人,武漢科技大學中南分校信息工程學院副教授。?   (武漢科技大學中南分校 信息工程學院,湖北 武漢 430223 )?
          摘 要: 本文分析了在MATLAB中實現(xiàn)SIMULINK自定義函數(shù)的重要意義,系統(tǒng)地闡述了通過S-FUNCTION實現(xiàn)SIMULINK自定義模塊的兩種途徑,以及基于這兩種途徑的詳細實現(xiàn)方案,并針對實際應用給出了詳細設(shè)計實例。 ?
           關(guān)鍵詞:MATLAB;SIMULINK;自定義模塊;S-FUNCTION ??
          
          1 MATLAB及SIMULINK簡介 ?
          
          1.1 功能強大的科學計算軟件MATLAB ?
          MATLAB是Matrix Laboratory的縮寫,顧名思義,其基本數(shù)據(jù)單位是矩陣。所以,它的指令表達式與數(shù)學、工程中常用的形式十分相似,用來求解計算問題要比用C,F(xiàn)ORTRAN等語言完成相同的事情簡捷得多,因此早期主要用于現(xiàn)代控制中復雜的矩陣、向量的各種運算。由于 MATLAB提供了強大的矩陣處理和繪圖功能,很多專家因此在自己擅長的領(lǐng)域里用它編寫了許多專門的MATLAB工具包,如控制系統(tǒng)工具包、系統(tǒng)辨識工具包、信號處理工具包、魯棒控制工具包、最優(yōu)化工具包等等幾十種工具包。由于MATLAB功能的不斷擴展,現(xiàn)在的MATLAB軟件除具備卓越的數(shù)值計算能力外,還提供了專業(yè)水平的符號計算,文字處理,可視化建模仿真和實時控制等功能。所以今天的MATLAB已不僅僅局限與現(xiàn)代控制系統(tǒng)分析和綜合應用,它已是一種包羅眾多學科的功能強大的“技術(shù)計算語言”。 ?
          
          1.2 使用MATLAB進行程序設(shè)計的突出優(yōu)點 ?
          和傳統(tǒng)的科學計算軟件語言相比,MATLAB語言具有以下的突出優(yōu)點: ?
          語言簡潔緊湊,使用方便靈活,庫函數(shù)極其豐富。MATLAB程序書寫形式自由,能夠利用豐富的庫函數(shù)避開繁雜的子程序編程,壓縮了一切不必要的編程工作。由于庫函數(shù)都由本領(lǐng)域的專家編寫,用戶不必擔心函數(shù)的可靠性。 ?
          運算符豐富。由于MATLAB是用C語言編寫的,MATLAB提供了和C語言幾乎一樣多的運算符,靈活使用MATLAB的運算符將使程序變得極為簡短。 ?
          流程控制功能強大。MATLAB既具有結(jié)構(gòu)化的控制語句(如for循環(huán),while循環(huán),break語句和if語句),又有面向?qū)ο缶幊痰奶匦浴??
          程序限制不嚴格,程序設(shè)計自由度大。例如,在MATLAB里,用戶無需對矩陣預先定義就可使用。 ?
          程序的可移植性很好。寫好的MATLAB代碼基本上不做修改就可以在各種型號的計算機和操作系統(tǒng)上運行。 ?
          圖形功能強大。在FORTRAN和C語言里,繪圖都很不容易,但在MATLAB里,數(shù)據(jù)的可視化非常簡單。MATLAB還具有較強的編輯圖形界面的能力。 ?
          源程序的開放性。開放性也許是MATLAB最受人們歡迎的特點。除內(nèi)部函數(shù)以外,所有MATLAB的核心文件和工具箱文件都是可讀可改的源文件,用戶可通過對源文件的修改以及加入自己的文件構(gòu)成新的工具箱。 ?
          
          1.3 建模與仿真集成環(huán)境SIMULINK ?
          SIMULINK是MATLAB最重要的組件之一,它為用戶提供了一個動態(tài)系統(tǒng)建模、仿真和綜合分析的集成環(huán)境。 在該環(huán)境中,無需大量書寫程序,而只需要通過簡單直觀的鼠標操作,就可構(gòu)造出復雜的系統(tǒng)。SIMULINK具有適應面廣、結(jié)構(gòu)和流程清晰及仿真精細、貼近實際、效率高、靈活等優(yōu)點,因此 SIMULINK已被廣泛應用于控制理論和數(shù)字信號處理的復雜仿真和設(shè)計。同時有大量的第三方軟件和硬件可應用于或被要求應用于SIMULINK。 ?
          
          2 自定義模塊設(shè)計在SIMULINK?建模中的重要意義
          
          前文中已經(jīng)詳細介紹了MATLAB/SIMULINK具有的強大功能和廣泛應用,在本節(jié)我們將討論使用SIMULINK建模時自定義模塊設(shè)計的重要性。事實上任何功能強大的軟件包或者軟件開發(fā)工具,在設(shè)計的時候都不可能面面俱到,考慮到所有實際應用中的需求。即使軟件設(shè)計的時候已經(jīng)考慮到并實現(xiàn)了所有已知的應用要求,隨著時間的推移,在應用中也可能產(chǎn)生新的要求。因此,當現(xiàn)有的SIMULINK模塊無法滿足用戶的仿真建模要求時,自定義模塊設(shè)計就顯得尤其重要。自定義模塊設(shè)計的實現(xiàn)意味著用戶可以根據(jù)其實際要求創(chuàng)建最適用的仿真用模塊,從而大大提高建模的效率與仿真的準確性。 ?
          其次,在實現(xiàn)一些特殊功能模塊時,即使在SIMULINK本身自帶模塊可以滿足設(shè)計要求的情況下,使用自定義模塊設(shè)計也會更加高效。SIMULINK的自帶模塊一般具有很高的通用性和基本性,用戶可以用組合的方式將多個基本模塊搭建成所需的復雜模塊,然而這種搭建方式可能是繁瑣甚至困難的,使用自定義模塊設(shè)計則會相當簡捷方便。 ?
          最后,使用自定義模塊設(shè)計對系統(tǒng)修改的靈活性大有裨益。在系統(tǒng)建模仿真的過程中,不可避免的要對搭建的模型進行修改;如果某些常常需要改動的模塊是用普通SIMULINK自帶模塊搭建而成的,那么每次修改模型時都需要重新搭建這些模塊,這是很費時費力的一件事情。如果使用自定義模塊來實現(xiàn)這些需要更改的部分,那么改動模型可能僅僅只需要重新寫幾行代碼。 ?
          下面我們通過一個實際例子來說明自定義模塊設(shè)計的作用。比如,一個用狀態(tài)方程表示的線性系統(tǒng),在SIMULINK中可以簡單的用一個狀態(tài)空間模塊來實現(xiàn),如圖1所示。 ?
          
          圖1 狀態(tài)空間模塊
          
          但是,如果我們需要建模的系統(tǒng)的狀態(tài)方程具有非線性項時,如,這時SIMULINK自帶的狀態(tài)空間模塊就不能滿足要求了。所以我們就需要設(shè)計一個自定義模塊,既能實現(xiàn)基本的狀態(tài)空間模塊的功能,又能具有我們要求的非線性特點。 ?
          
          3 使用S-FUNCTION實現(xiàn)自定義系統(tǒng)模塊 ?
          
          鑒于自定義模塊設(shè)計的重要性,MATLAB為用戶提供了S-FUNCTION來實現(xiàn)自定義的功能。 S-FUNCTION即System Function的縮寫,是一種自定義模塊編寫的規(guī)范以及相關(guān)工具。按照這種規(guī)范編寫的代碼能夠被MATLAB識別并編譯生成自定義模塊文件。一旦編譯完成,這個自定義模塊文件和SIMULINK自帶的模塊在功能上完全相同,可以隨意的復制,拷貝,移動和連接,并且在運行時不需要再次編譯。 ?
          從實現(xiàn)方式來說,在MATLAB中使用S-FUNCTION生成自定義模塊有以下兩種方式:使用S-FUNCTION Builder生成或者直接編寫.m文件生成。前者勝在方便易學,需要用戶輸入的代碼量少;而后一種方式則比較靈活,生成的代碼執(zhí)行效率較高。下面筆者將對兩種方式分別介紹。 ?
          
          3.1 使用S-FUNCTION Builder 生成自定義模塊 ?
          MATLAB在SIMULINK工具箱的“User-Defined Functions”庫中提供了S-FUNCTION Builder模塊。S-FUNCTION Builder實際上可以看作一個代碼生成器,用戶只需在模塊中設(shè)置生成自定義模塊所需的參數(shù)和代碼,點擊S-FUNCTION Builder中的Build按鈕就可以編譯生成自定義模塊的代碼。 ?
          
          圖2 S-FUNCTION Builder模塊
          
          圖3 S-FUNCTION Builder主設(shè)置頁
          
          雙擊S-FUNCTION Builder圖標,可以打開主設(shè)置頁,如圖3所示。 ?
          以下是如何對S-FUNCTION Builder進行詳細設(shè)置的解釋: ?
          在S-function name文本框中可以輸入用戶對自定義模塊的命名。 ?
          在Initialization屬性頁中,可以定義系統(tǒng)連續(xù)或者離散的狀態(tài)數(shù)量和初狀態(tài),取樣方式和取樣間隔。 ?
          在Data Property屬性頁中,可以定義系統(tǒng)的輸入輸出變量以及一些中間參數(shù)。這些數(shù)據(jù)可以是一維或者二維的實數(shù)或者復數(shù)。 ?
          在Libraries屬性頁中,可以將在本模塊里用到的函數(shù)庫加入庫列表,缺省為引用math.h庫。 ?
          編寫狀態(tài)迭代部分的代碼時,如果該模塊是一個連續(xù)系統(tǒng),則應該使用Continuous Derivatives屬性頁輸入描述狀態(tài)迭代部分的代碼。S-FUNCTION Builder中定義連續(xù)系統(tǒng)的狀態(tài)為xC[0],xC[1],xC[2]……,相應的狀態(tài)的導數(shù)為dx[0],dx[1],dx[2]等。如果該模塊為離散系統(tǒng),編寫步驟和連續(xù)系統(tǒng)類似,不同的是需要使用Discrete Update選項頁,而且系統(tǒng)狀態(tài)定義為xD[0],xD[1],xD[2]等。 ?
          在Outputs屬性頁可以定義系統(tǒng)的輸出方程。 ?
          在Build Info屬性頁中可以設(shè)置一些編譯選項,如Show compile steps,Generate wrapper TLC,Create a debuggable MEX-file等。 ?
          當所有設(shè)置項和代碼都設(shè)置完成后,點擊Build按鈕編譯生成自定義模塊。 ?
          
          3.2 直接編寫.m文件生成自定義模塊 ?
          除了使用S-FUNCTION Builder生成自定義模塊,我們還可以根據(jù)S-FUNCTION的標準直接編寫自定義模塊對應的.m文件。MATLAB提供了sfuntmpl.m模板程序供用戶參考,用戶可以在這一模板程序的基礎(chǔ)上添加自己的代碼,以實現(xiàn)設(shè)計要求。以下筆者將針對模板的源碼做進一步討論。 ?
          首先是函數(shù)定義function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)。其中,函數(shù)名為sfuntmpl;t為當前時間,x為當前狀態(tài),u為當前輸入,flag是用于切換執(zhí)行代碼的開關(guān),不同的flag值對應不同功能的代碼段;sys為返回的系統(tǒng)模型,x0為輸出狀態(tài),str為狀態(tài)排序指針,ts為取樣時間。以下是使用不同flag值調(diào)用sfuntmpl函數(shù)時執(zhí)行的功能: ?
          flag=0,調(diào)用初始化函數(shù)mdlInitializeSizes對系統(tǒng)進行初始化; ?
          flag=1,調(diào)用函數(shù)mdlDerivatives更新連續(xù)系統(tǒng)的狀態(tài); ?
          flag=2,調(diào)用函數(shù)mdlUpdates更新連續(xù)系統(tǒng)的狀態(tài); ?
          flag=3,調(diào)用函數(shù)mdlOutputs對輸出變量y賦值; ?
          flag=4,調(diào)用函數(shù)GetTimeOfNextVarHit,返回下一個取樣時間點(僅用于變步長取樣)到變量TNEXT ?
          flag=5,系統(tǒng)保留選項,暫不使用 ?
          flag=9,終止程序并刪除系統(tǒng) ?
          接下來用戶需要對這些模塊執(zhí)行過程中的子函數(shù)按照需求進行編碼。mdlInitializeSizes函數(shù):function [sys,x0,str,ts]=mdlInitializeSizes ?
          首先需要在size結(jié)構(gòu)體中分別定義連續(xù)或離散狀態(tài)的個數(shù),輸入輸出變量的個數(shù),系統(tǒng)的輸入是否影響輸出,取樣時間的個數(shù),再調(diào)用內(nèi)部函數(shù)simsize為生成的系統(tǒng)分配內(nèi)存空間,并給出系統(tǒng)狀態(tài)和取樣時間的初始值。此函數(shù)無輸入。 ?
          mdlDerivatives函數(shù):function sys=mdlDerivatives(t,x,u) ?
          實現(xiàn)基于t,x,u的狀態(tài)方程,定義連續(xù)系統(tǒng)的狀態(tài)更新規(guī)則 ?
          mdlUpdates函數(shù):function sys=mdlUpdate(t,x,u) ?
          實現(xiàn)基于t,x,u的狀態(tài)方程,定義離散系統(tǒng)的狀態(tài)更新規(guī)則 ?
          mdlOutputs函數(shù):function sys=mdlOutputs(t,x,u) ?
          實現(xiàn)基于t,x,u的輸出方程,定義輸出變量 ?
          mdlGetTimeOfNextVarHit函數(shù):function sys=mdlGetTimeOfNextVarHit(t,x,u) ?
          定義下一個取樣時間點,缺省為當前時間加上1個取樣時間 ?
          mdlTerminate函數(shù):function sys=mdlTerminate(t,x,u) ?
          定義退出模塊時的操作,一般用于釋放分配的內(nèi)存空間 ?
          
          4 應用實例?
          
          在本節(jié)中,將結(jié)合前面給出的基于S-FUNCTION的方法實現(xiàn)一個自定義模塊的設(shè)計。以前面提到的一個非線性系統(tǒng)為例,首先我們需要分析該系統(tǒng)的構(gòu)成情況――這一簡單系統(tǒng)為連續(xù)系統(tǒng),其輸入、輸出以及狀態(tài)均為一維變量。 ?
          以下將討論使用兩種方法實現(xiàn)的具體步驟。 ?
          
          4.1使用S-FUNCTION Builder?
          首先新建一個S-FUNCTION Builder模塊,在S-function name文本框中輸入用戶對自定義模塊的命名,如testsys;在Initialization屬性頁中,將Number of continuous states定義為1,Continuous states IC定義為系統(tǒng)初態(tài),如0,Sample mode選為Continuous;Data Property屬性頁和Libraries屬性頁,使用缺省的系統(tǒng)設(shè)置即可(缺省輸入定義為u0,缺省輸出定義為y0); 在Continuous Derivatives屬性頁給出狀態(tài)方程:dx[0]=xC[0]*xC[0]+u0[0];在Outpus屬性頁給出輸出方程:y0[0]=xC[0]+u0[0];編譯后即可產(chǎn)生自定義模塊testsys。 ?
          
          4.2 直接編寫.m文件 ?
          首先聲明模塊為function [sys,x0,str,ts] = testsys(t,x,u,flag) ?
          接著編寫mdlInitializeSizes函數(shù)?
          function [sys,x0,str,ts]=mdlInitializeSizes ?
          sizes = simsizes; %生成一個空的size結(jié)構(gòu)體?
          sizes.NumContStates=1;%定義輸入、輸出、狀態(tài)個數(shù)?
          sizes.NumDiscStates=0; ?
          sizes.NumOutputs=1; ?
          sizes.Numinputs=1; ?
          sizes.DirFeedthrough=1; ?
          sizes.NumSampleTimes=1; ?
          sys=simsizes(sizes); %分配空間?
          x0=0;%初態(tài)和取樣時間?
          ts=0;?
          end mdlInitializeSizes?
          然后是mdlDerivatives函數(shù)?
          function sys=mdlDerivatives(t,x,u)?
          sys = x*x+u;?
          end mdlDerivatives?
          最后是mdlOutputs函數(shù)?
          function sys=mdlOutputs(t,x,u)?
          sys=x+u;?
          end mdlOutputs?
          至此自定義模塊的代碼編寫完成。?
          本文在MATLAB的S-FUNCTION框架下探討了兩種實現(xiàn)自定義模塊設(shè)計的方法以及詳細的設(shè)計實例。鑒于MATLAB的主導性地位,相信隨著其功能的進一步完善,MATLAB/SIMULINK將會在科學研究與工程科技各領(lǐng)域扮演更重要的角色,而自定義模塊設(shè)計則會是用戶在進行SIMULINK建模時強有力的武器。 ?
          
          參考文獻 ?
          [1] The Matheworks. Using Simulink. Version 4. Natick: The Matheworks, 2000. ?
          [2] The Matheworks. Writing S-Functions. Version 4. Natick: The Matheworks, 2000.

        相關(guān)熱詞搜索:自定義 模塊 MATLAB MATLAB中基于S-FUNCTION的SIMULINK自定義模塊實現(xiàn) matlab中simulink模塊 simulink仿真實例詳解

        版權(quán)所有 蒲公英文摘 www.zuancaijixie.com
        91啦在线播放,特级一级全黄毛片免费,国产中文一区,亚洲国产一成人久久精品