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