《控制系統(tǒng)數(shù)字仿真與cad》第9章Simulink的擴(kuò)展工具S-函數(shù)_第1頁
《控制系統(tǒng)數(shù)字仿真與cad》第9章Simulink的擴(kuò)展工具S-函數(shù)_第2頁
《控制系統(tǒng)數(shù)字仿真與cad》第9章Simulink的擴(kuò)展工具S-函數(shù)_第3頁
《控制系統(tǒng)數(shù)字仿真與cad》第9章Simulink的擴(kuò)展工具S-函數(shù)_第4頁
《控制系統(tǒng)數(shù)字仿真與cad》第9章Simulink的擴(kuò)展工具S-函數(shù)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本章內(nèi)容(1)S-函數(shù)的基本概念和工作原理;(2)掌握m-文件S-函數(shù)的建立及其使用;(3)了解CMEXS-函數(shù)的組成;(4)S-函數(shù)模塊化的方法,利用S-function模塊可形成用戶自行定義的S-函數(shù)模塊;(5)利用S-函數(shù)編譯器建立CMEXS-函數(shù)的方法及CMEXS-函數(shù)的使用。

第9章Simulink的擴(kuò)展工具

S-函數(shù)1

9.1S-函數(shù)簡(jiǎn)介1.S-函數(shù)的基本概念

S-函數(shù)是系統(tǒng)函數(shù)(SystemFunction)的簡(jiǎn)稱,是指采用非圖形化的方式(即計(jì)算機(jī)語言,區(qū)別于Simulink的系統(tǒng)模塊)描述的一個(gè)功能塊。用戶可以采用MATLAB、C、C++、FORTRAN或Ada等語言編寫S-函數(shù)。S-函數(shù)由一種特定的語法構(gòu)成,用來描述并實(shí)現(xiàn)連續(xù)系統(tǒng)、離散系統(tǒng)以及復(fù)合系統(tǒng)等動(dòng)態(tài)系統(tǒng),S-函數(shù)能夠接收來自Simulink求解器的相關(guān)信息,并對(duì)求解器發(fā)出的命令做出適當(dāng)?shù)捻憫?yīng),這種交互作用非常類似于Simulink系統(tǒng)模塊與求解器的交互作用。一個(gè)結(jié)構(gòu)體系完整的S-函數(shù)包含了描述動(dòng)態(tài)系統(tǒng)所需的全部能力,所有其他的使用情況都是這個(gè)結(jié)構(gòu)體系的特例。往往S-函數(shù)模塊是整個(gè)Simulink動(dòng)態(tài)系統(tǒng)的核心。22.S-函數(shù)的工作原理

(1)動(dòng)態(tài)系統(tǒng)的描述Simulink中的大部分模塊都具有一個(gè)輸入向量u、一個(gè)輸出向量y和一個(gè)狀態(tài)向量x,如圖9-1所示。狀態(tài)向量可能包括連續(xù)狀態(tài)、離散狀態(tài)或連續(xù)狀態(tài)與離散狀態(tài)的組合。輸入、輸出和狀態(tài)之間的數(shù)學(xué)關(guān)系可以用以下關(guān)系表示:輸出方程:y=f0(t,x,u)

連續(xù)狀態(tài)方程:dx=fd(t,x,u)

離散狀態(tài)方程:xk+1=fu(t,x,u)其中x=[dxxk+1]3

(2)仿真過程

Simulink的仿真過程包含兩個(gè)主要階段,第一個(gè)階段是初始化,初始化所有的模塊,這時(shí)模塊的所有參數(shù)都已確定下來。初始化過后,進(jìn)入仿真的第二個(gè)階段——運(yùn)行階段,仿真開始運(yùn)行。仿真過程是由求解器和系統(tǒng)(Simulink引擎)交互控制的。4S-函數(shù)的仿真過程,可以概括為:1)初始化:在仿真開始前,Simulink在這個(gè)階段初始化S-函數(shù)。初始化結(jié)構(gòu)體SimStruct,它包含了S-函數(shù)的所有信息;設(shè)置輸入輸出端口數(shù);設(shè)置采樣時(shí)間;分配存儲(chǔ)空間。52)數(shù)值積分:用于連續(xù)狀態(tài)的求解和非采樣過零點(diǎn)。如果S-函數(shù)存在連續(xù)狀態(tài),Simulink就在minorsteptime內(nèi)調(diào)用mdlDdrivatives和mdlOutput兩個(gè)S-函數(shù)子函數(shù)。如果存在非采樣過零點(diǎn),Simulink將調(diào)用mdlOutput和mdlZeroCrossings子函數(shù)(過零點(diǎn)檢測(cè)子函數(shù)),以定位過零點(diǎn)。63)更新離散狀態(tài):此子函數(shù)在每個(gè)步長(zhǎng)處都要執(zhí)行一次,可以在這個(gè)子函數(shù)中添加每一個(gè)仿真步都需要更新的內(nèi)容,例如離散狀態(tài)的更新。4)計(jì)算輸出:計(jì)算所有輸出端口的輸出值。5)計(jì)算下一個(gè)采樣時(shí)間點(diǎn):只有在使用變步長(zhǎng)求解器進(jìn)行仿真時(shí),才需要計(jì)算下一個(gè)采樣時(shí)間點(diǎn),即計(jì)算下一步的仿真步長(zhǎng)。6)仿真結(jié)束:在仿真結(jié)束時(shí)調(diào)用,可以在此完成結(jié)束仿真所需的必要工作。73.S-函數(shù)的工作方式引入S-函數(shù)的目的是為了使Simulink有能力構(gòu)作一般仿真框圖,去處理如下各種系統(tǒng)的仿真:連續(xù)系統(tǒng)、離散系統(tǒng)、離散--連續(xù)混和系統(tǒng)、多頻采樣系統(tǒng)、嵌套系統(tǒng)等。通常S-函數(shù)的調(diào)用格式為

sys=model(t,x,u,flag)其中model為系統(tǒng)的模型文件名,t,x,u分別為當(dāng)前的時(shí)刻、狀態(tài)向量和輸入向量,而變量flag的值控制返回變量sys的信息,如表9-1所示。8在flag=0時(shí),調(diào)用S-函數(shù)的格式為

[sys,x0]=model(t,x,u,flag)這時(shí)返回參數(shù)x0表示狀態(tài)向量的初始值,而返回參數(shù)sys各分量的含義如下sys(1)―連續(xù)狀態(tài)變量數(shù)sys(2)―離散狀態(tài)變量數(shù)sys(3)―輸出變量數(shù)sys(4)―輸入變量數(shù)sys(5)―系統(tǒng)中不連續(xù)根的數(shù)量sys(6)―系統(tǒng)中有無代數(shù)循環(huán)的標(biāo)志(有置1)sys(7)―采樣時(shí)間數(shù)99.2S-函數(shù)的建立

S-函數(shù)從本質(zhì)上講是具有特殊調(diào)用格式的MATLAB函數(shù),它表征系統(tǒng)動(dòng)態(tài)特性,用戶在建立起Simulink系統(tǒng)模型框圖時(shí),Simulink

就會(huì)利用該框圖中的信息,生成一個(gè)S-函數(shù)(即mdl文件),S-函數(shù)是Simulink如何運(yùn)作的核心所在,每個(gè)框圖都有一個(gè)與之同名的S-函數(shù),而該S-函數(shù)正是Simulink在仿真和分析中交互作用的載體,簡(jiǎn)單地說S-函數(shù)代表Simulink模型,S-函數(shù)模塊是整個(gè)Simulink動(dòng)態(tài)系統(tǒng)的核心。10考慮著名的范德坡方程(vendelpol

Epuation)。寫成狀態(tài)方程的形式為于是可構(gòu)造Simulink方框圖如圖9-2所示。11圖9-212在方框圖形成的同時(shí),與之相應(yīng)的S-函數(shù)(即mdl文件)也隨之產(chǎn)生,當(dāng)生成的框圖被保存后,相應(yīng)的S-函數(shù)就被記錄在磁盤上,這個(gè)mdl文件包含了該方框圖所有的圖形及數(shù)學(xué)關(guān)系信息。然而,當(dāng)在框圖視窗中進(jìn)行仿真時(shí),MATLAB并非去解釋運(yùn)行該mdl文件,而是運(yùn)行保存于Simulink內(nèi)存中的S-函數(shù)映象文件。當(dāng)此方框圖以vdps.mdl文件存盤后,就可以在MATLAB中訪問該系統(tǒng),并通過設(shè)置flag的值得到系統(tǒng)的動(dòng)態(tài)信息。13例9-1

設(shè)置flag=0,查詢圖9-2系統(tǒng)vdps.mdl的維數(shù)和初始條件。解在MATLAB指令方式下,運(yùn)行以下命令>>[sys,x0]=vdps([],[],[],0)結(jié)果顯示

sys=2000002

x0=0.25000.250014返回變量sys的各分量表明,該系統(tǒng)有兩個(gè)連續(xù)狀態(tài),沒有離散狀態(tài),沒有輸入和輸出,狀態(tài)是連續(xù)的,沒有代數(shù)循環(huán),變量x0給出兩個(gè)狀態(tài)的初始值。由方框圖創(chuàng)建的S-函數(shù)的映象文件,即mdl文件比較繁瑣,因這一函數(shù)除了用來對(duì)原始模型進(jìn)行描述外,還可以繪制出系統(tǒng)的框圖結(jié)構(gòu)。若用戶只想對(duì)系統(tǒng)進(jìn)行仿真分析,而不想得到系統(tǒng)的結(jié)構(gòu)圖,則用戶可利用標(biāo)準(zhǔn)的m文件、C、C++、FORTRAN以及Ada等語言編寫S-函數(shù),即按照規(guī)則建立某種簡(jiǎn)單的描述方法,S-函數(shù)不管用什么方式創(chuàng)建,一旦建立,它既可以在框圖中使用,也可以在指令中使用。15由上可知,

S-函數(shù)是由一些仿真功能模塊(函數(shù))組成的。這些函數(shù)就是S-函數(shù)所有的語法構(gòu)成,用戶的任務(wù)就是編寫這些函數(shù),供Simulink及求解器調(diào)用。創(chuàng)建S-函數(shù)源文件有多種方法,當(dāng)然可以按照S-函數(shù)的語法格式自行書寫每一行代碼,但是這樣做容易出錯(cuò)且麻煩。Simulink為用戶提供了大量的S-函數(shù)模板和例子,用戶可以根據(jù)自己的需要修改相應(yīng)的模板或例子即可。限于篇幅,下面僅對(duì)最常用的m文件S-函數(shù)和CMEXS-函數(shù)做一介紹。169.2.1用m文件創(chuàng)建S-函數(shù)1.m文件S-函數(shù)的模板在MATLAB6p1/toolbox/simulink/blocks目錄下保存有大量的用m文件編寫的S-函數(shù)。其中包含一個(gè)用m文件編寫的S-函數(shù)的模板文件sfuntmpl.m。表9-2列出了這些用m文件編寫的S-函數(shù)及其簡(jiǎn)要說明。17文件名說明sfuntmpl.m模板文件csfunc.m以狀態(tài)空間形式定義一個(gè)連續(xù)系統(tǒng)dsfunc.m以狀態(tài)空間形式定義一個(gè)離散系統(tǒng)limintm.m實(shí)現(xiàn)連續(xù)限定積分器,其輸出被限制在上下邊界內(nèi),初值也限定mixedm.m實(shí)現(xiàn)有一個(gè)連續(xù)積分器和一個(gè)單位延遲串聯(lián)的混合系統(tǒng)simom.m一個(gè)具有A,B,C,D內(nèi)部矩陣的狀態(tài)空間m文件S-函數(shù)simom2.m一個(gè)具有A,B,C,D外部矩陣的狀態(tài)空間m文件S-函數(shù)sfun_varargm.m顯示如何使用MATLABvararg靈活性的m文件S函數(shù)例子vdpm.m實(shí)現(xiàn)VandelPol等式vsfunc.m實(shí)現(xiàn)一個(gè)變步長(zhǎng)延時(shí),第一個(gè)輸入延時(shí)有第二個(gè)輸入確定的時(shí)間vlimintm.m連續(xù)限定積分器,示范如何使用大小輸入為-1來建立一個(gè)提供動(dòng)態(tài)輸入/狀態(tài)寬度的S函數(shù)vdlmintm.m一個(gè)離散限定積分器,與vlimintm.m一樣,但積分器是離散的表9-2m文件S-函數(shù)例子

18模板文件sfuntmpl.m定義了S-函數(shù)完整的框架結(jié)構(gòu),此文件中包含1個(gè)主函數(shù)和6個(gè)子函數(shù),在主函數(shù)內(nèi)程序根據(jù)標(biāo)志變量flag,由一個(gè)開關(guān)轉(zhuǎn)移結(jié)構(gòu)(Switch-Case)根據(jù)標(biāo)志將執(zhí)行流程轉(zhuǎn)移到相應(yīng)的子函數(shù)。flag標(biāo)志量作為主函數(shù)的參數(shù)由系統(tǒng)調(diào)用時(shí)給出。在MATLAB窗口中輸入以下命令可打開此模板文件。>>editsfuntmpl19%主函數(shù)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);otherwiseerror(['Unhandledflag=',num2str(flag)]);end20%mdlInitializeSizes%初始化子函數(shù)function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;%生成sizes數(shù)據(jù)結(jié)構(gòu)sizes.NumContStates=0;%連續(xù)狀態(tài)數(shù),默認(rèn)為0sizes.NumDiscStates=0;%離散狀態(tài)數(shù),默認(rèn)為0sizes.NumOutputs=0;%輸出量個(gè)數(shù),默認(rèn)為0sizes.NumInputs=0;%輸入量個(gè)數(shù),默認(rèn)為0sizes.DirFeedthrough=1;%是否存在代數(shù)循環(huán)(1-存在,0-不存在,默認(rèn)為1)sizes.NumSampleTimes=1;%采樣時(shí)間個(gè)數(shù),每個(gè)系統(tǒng)至少有一個(gè)sys=simsizes(sizes);%返回sizes數(shù)據(jù)結(jié)構(gòu)所包含的信息x0=[];%設(shè)置初值狀態(tài)tr=[];%保留變量置空ts=[00];%采樣時(shí)間,即[采樣周期偏移量],采樣周期為0表示是連續(xù)系統(tǒng)21%mdlDerivatives%計(jì)算導(dǎo)數(shù)子函數(shù):它根據(jù)t,x,u計(jì)算連續(xù)狀態(tài)的導(dǎo)數(shù)functionsys=mdlDerivatives(t,x,u)sys=[];%sys表示狀態(tài)導(dǎo)數(shù),即dx,用戶應(yīng)在此給出連續(xù)系統(tǒng)的狀態(tài)方程%mdlUpdate%更新離散狀態(tài)子函數(shù):它根據(jù)t,x,u計(jì)算離散系統(tǒng)下一時(shí)刻的狀態(tài)值functionsys=mdlUpdate(t,x,u)%更新離散狀態(tài)子函數(shù)sys=[];%sys表示下一個(gè)離散狀態(tài),即x(k+1),%用戶應(yīng)在此子函數(shù)中給出離散系統(tǒng)的狀態(tài)方程22%mdlOutputs%計(jì)算輸出子函數(shù):它根據(jù)t,x,u計(jì)算系統(tǒng)functionsys=mdlOutputs(t,x,u)sys=[];%sys表示輸出y,用戶應(yīng)在此子函數(shù)中給出系統(tǒng)的輸出方程%mdlGetTimeOfNextVarHit%計(jì)算下一個(gè)采樣點(diǎn)子函數(shù):此子函數(shù)僅在系統(tǒng)是變采樣時(shí)間時(shí)調(diào)用functionsys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime=1;%設(shè)置采樣時(shí)間sys=t+sampleTime;%sys表示下一個(gè)采樣時(shí)間點(diǎn)%mdlTerminate%仿真結(jié)束子函數(shù):仿真結(jié)束時(shí)調(diào)用,用戶可以在此完成結(jié)束仿真所需的必要工作functionsys=mdlTerminate(t,x,u)sys=[];232.m文件S-函數(shù)的模塊化在動(dòng)態(tài)系統(tǒng)設(shè)計(jì)、仿真與分析中,用戶可以使用Function&Tables模塊庫中的S-function模塊來調(diào)用S-函數(shù)。S-function模塊是一個(gè)單輸入單輸出的系統(tǒng)模塊,如果有多個(gè)輸入與多個(gè)輸出信號(hào),可以使用Mux模塊與Demux模塊對(duì)信號(hào)進(jìn)行組合和分離操作。在S-function模塊的參數(shù)設(shè)置對(duì)話框中包括了調(diào)用的S-函數(shù)名和用戶輸入?yún)?shù)值列表,如圖9-3所示。S-function模塊中S-函數(shù)名和參數(shù)值列表必須與用戶建立的S-函數(shù)源文件的名稱和參數(shù)列表完全一致(包括參數(shù)的順序),并且參數(shù)值列表之間必須使用逗號(hào)隔開。24圖9-325任何一種方式創(chuàng)建的S-函數(shù)文件,在經(jīng)過用S-函數(shù)模塊(S-function)處理后,將轉(zhuǎn)變?yōu)橛脩魟?chuàng)建的Simulink模塊,并且利用這種新模塊仿真不會(huì)降低效率。此外,用戶也可以使用Simulink的子系統(tǒng)封裝功能對(duì)S-函數(shù)進(jìn)行封裝,以增強(qiáng)系統(tǒng)模型的可讀性。26例9-3

采用S-函數(shù)實(shí)現(xiàn)系統(tǒng):y=2u解(1)利用以上模板用m文件編寫的函數(shù)%timestwo.mfunction[sys,x0,str,ts]=timestwo(t,x,u,flag)switchflag,case0[sys,x0,str,ts]=mdlInitializeSizes;case3sys=mdlOutputs(t,x,u);case{1,2,4,9}sys=[];otherwiseerror(['Unhandledflag=',num2str(flag)]);end27function[sys,x0,str,ts]=mdlInitializeSizes()sizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=0;sizes.NumOutputs=-1;%dynamicallysizedsizes.NumInputs=-1;%dynamicallysizedsizes.DirFeedthrough=1;sizes.NumSampleTimes=1;sys=simsizes(sizes);str=[];x0=[];ts=[-10];%inheritedsampletimefunctionsys=mdlOutputs(t,x,u)sys=u*2;28(2)利用Functions&Tables模塊庫中的S-Functions模塊構(gòu)造圖9-4(a)所示系統(tǒng)。29(3)在S-function模塊參數(shù)對(duì)話框的S-函數(shù)名一欄中填寫以上編寫的m文件S-函數(shù)文件名,即將system改為timestwo,鼠標(biāo)單擊[OK]按鍵后圖9-4(a)變成了圖9-4(b)的形式。30(4)打開示波器,并利用鼠標(biāo)右鍵將示波器的坐標(biāo)縱軸范圍修改為[-2,2],啟動(dòng)仿真后,便可在示波器上看到輸入的正弦信號(hào)被放大為原來的兩倍,如圖9-5所示。313.連續(xù)系統(tǒng)的S-函數(shù)描述4.離散系統(tǒng)的S-函數(shù)描述5.混合系統(tǒng)的S-函數(shù)描述所謂混合系統(tǒng),就是既包含離散狀態(tài),又包含連續(xù)狀態(tài)的系統(tǒng)。32

6.含外部輸入?yún)?shù)系統(tǒng)的S-函數(shù)描述

Simulink除了傳遞t,x,u和flag參數(shù)外,還可以傳遞用戶自定義的外部參數(shù),這些參數(shù)需要在S-函數(shù)的輸入?yún)?shù)中列出。當(dāng)需要外部參數(shù)輸入時(shí),首先在編寫S-函數(shù)時(shí),要注意主函數(shù)應(yīng)做適當(dāng)?shù)男薷?,以便將用戶自定義的參數(shù)傳遞到子函數(shù)中,同時(shí)某些子函數(shù)的定義也應(yīng)當(dāng)進(jìn)行相應(yīng)的修改,以便通過輸入?yún)?shù)接收用戶的參數(shù)。另外,當(dāng)利用Function&Tables模塊庫中的S-function模塊來調(diào)用該S-函數(shù)時(shí),不要忘記在S-function模塊的參數(shù)值列表框中輸入外部參數(shù)值,多個(gè)參數(shù)值之間用逗號(hào)隔開,它們必須與用戶建立的S-函數(shù)源文件的參數(shù)列表完全一致(包括參數(shù)的順序)。33例9-7用m文件編寫一個(gè)限幅積分器的S-函數(shù),并借助通用S-函數(shù)模塊(S-function)調(diào)用此m文件。限幅積分器的數(shù)學(xué)模型為其中x為狀態(tài),u是輸入,lb和ub分別表示積分的上限和下限.解(1)根據(jù)數(shù)學(xué)模型,編寫limintm.m文件如下34%limintm.mfunction[sys,x0,str,ts]=limintm(t,x,u,flag,lb,ub,xi)switchflagcase0[sys,x0,str,ts]=mdlInitializeSizes(lb,ub,xi);case1sys=mdlDerivatives(t,x,u,lb,ub);case{2,9}sys=[];%donothingcase3sys=mdlOutputs(t,x,u);otherwiseerror(['unhandledflag=',num2str(flag)]);end35function[sys,x0,str,ts]=mdlInitializeSizes(lb,ub,xi)sizes=simsizes;sizes.NumContStates=1;sizes.NumDiscStates=0;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=0;sizes.NumSampleTimes=1;sys=simsizes(sizes);str=[];x0=xi;ts=[00];%sampletime:[period,offset]36functionsys=mdlDerivatives(t,x,u,lb,ub)if(x<=lb&u<0)|(x>=ub&u>0)sys=0;elsesys=u;endfunctionsys=mdlOutputs(t,x,u)sys=x;37(2)在MATLAB指令方式下直接運(yùn)行以下命令。

>>lb=-0.5;ub=0.5;xi=0;>>[sys,x0]=limintm([],[],[],0,lb,ub,xi)結(jié)果顯示:

sys=1011001x0=038(3)利用S-函數(shù)模塊調(diào)用m文件

①創(chuàng)建如圖9-7所示的Simulink窗口,其中正弦信號(hào)模塊(SineWave)復(fù)制于信號(hào)源模塊庫(Sources),并且利用其默認(rèn)值;S-函數(shù)模塊(S-function)復(fù)制于函數(shù)與表模塊庫(Functions&Tables);39圖9-740

②用鼠標(biāo)雙擊新復(fù)制的S-函數(shù)模塊圖標(biāo),打開如圖9-8所示的對(duì)話框。圖9-841在對(duì)話框的子系統(tǒng)函數(shù)名(Subsystemfunctionname)欄中填入S-函數(shù)文件名limintm,在函數(shù)參數(shù)(Functionparameters)欄中填入要傳送的三個(gè)變量名lb,ub,xi(假若,S-函數(shù)文件除了t,u,x和flag輸入變量外沒有其他的輸入變量,那么最后一欄不用填寫),然后按[OK],這樣處理后,原通用S-函數(shù)模塊圖標(biāo)符就自動(dòng)改寫為limintm,該模塊也就成了有限積分模塊,這樣經(jīng)過S-函數(shù)對(duì)話框定義后的m文件就可以像其他標(biāo)準(zhǔn)模塊一樣直接在框圖窗口中參與運(yùn)作;42

③雙擊示波器圖標(biāo),打開示波器,然后運(yùn)行Simulation|Start命令,就開始仿真了,這時(shí)就可以從示波器上看到一個(gè)如圖9-9中所示的經(jīng)限幅積分后的截頂正弦波。同樣利用"封裝"命令,可以把上面定義的限幅積分模塊limintm封裝成一個(gè)真正的Simulink模塊(參PID模塊的封裝)。43圖9-9449.2.2用C語言創(chuàng)建S-函數(shù)盡管m文件S-函數(shù)非常容易編寫和理解,但是由于它在每個(gè)仿真步都要激活MATLAB解釋器,使得仿真的速度變慢。另外,當(dāng)需要利用RTW從Simulink框圖生成實(shí)時(shí)代碼時(shí),框圖中不能包含m文件S-函數(shù)。而CMEXS-函數(shù)不僅執(zhí)行速度快,而且可以用來生成獨(dú)立的仿真程序。另外,對(duì)一些用C語言編寫好的程序還可以方便地通過包裝程序結(jié)合到CMEXS-函數(shù)中。這樣的S-函數(shù)由于結(jié)合了C語言的優(yōu)勢(shì),可以實(shí)現(xiàn)對(duì)操作系統(tǒng)和硬件的訪問,這種特性可以用來實(shí)現(xiàn)與串口或網(wǎng)絡(luò)的通訊,以及編寫設(shè)備的驅(qū)動(dòng)等。451.CMEXS-函數(shù)的模板用C語言也可創(chuàng)建S-函數(shù)(MEX文件),在MATLAB6p1/simulink/src目錄下保存有大量的用C語言編寫的S-函數(shù)。與利用m文件編寫S-函數(shù)一樣,Simulink同樣也為用C語言編寫S-函數(shù)提供了模板文件。對(duì)于一般的應(yīng)用,通常使用模板文件sfuntmpl_basic.c,因該文件只包含了幾個(gè)常用的子程序,但它已提供了用C語言編寫S-函數(shù)的基本框架結(jié)構(gòu)。模板文件sfuntmpl_doc.c,則包含了所有的子程序,并有詳細(xì)的注釋。在MATLAB窗口中輸入以下命令可打開模板文件sfuntmpl_basic.c。>>editsfuntmpl_basic.c46每個(gè)用C語言編寫的S-函數(shù)的開頭都應(yīng)包含下列語句:

#defineS_FUNCTION_NAMEyour_sfunction_name#defineS_FUNCTION_LEVEL2#include"simstruc.h"其中your_sfunction_name是用戶要編寫的S-函數(shù)的名字,也就是在S-function模塊中要輸入的S-函數(shù)名。S-函數(shù)格式隨著Simulink版本的更替而略有不同,S_FUNCTION_LEVEL就說明了該S-函數(shù)適用的Simulink版本,對(duì)于Simulink4.0版本,S_FUNCTION_LEVEL應(yīng)定義為2。頭文件simstruc.h則定義了重要數(shù)據(jù)結(jié)構(gòu)SimStrnct,它還包含有其他重要的頭文件,如tmwtypes.h,它定義了各種數(shù)據(jù)類型。另外在文件的頂部還應(yīng)包含適當(dāng)?shù)念^文件或其他的宏或者變量,就和編寫普通的C程序一樣。47函數(shù)中間是幾個(gè)子函數(shù),它們的功能與用m語言編寫的S-函數(shù)中相應(yīng)子函數(shù)的功能類似,在此不再介紹。在函數(shù)的尾部應(yīng)包含下列語句:

#ifdefMATLAB_MEX_FILE#include"simulink.c"#else#include"cg_sfun.h"#endif其中MATLAB_MEX_FILE用于告訴編譯器該S-函數(shù)正被編譯成MEX文件(Windows下為dll文件),包含頭文件simulink.c。如果正在使用RTW將整個(gè)Simulink框圖編譯成實(shí)時(shí)的獨(dú)立程序(Windows下為exe文件),包含頭文件cg_sfun.h。48對(duì)于用m文件編寫的S-函數(shù),在MATLAB環(huán)境下可以通過解釋器直接執(zhí)行,而對(duì)于用C語言或其他語言編寫的S-函數(shù),則需要首先編譯成可以在MATLAB環(huán)境下運(yùn)行的二進(jìn)制代碼,即動(dòng)態(tài)鏈接庫或靜態(tài)鏈接庫,然后才能使用,這些經(jīng)過編譯的二進(jìn)制文件就是所為的MEX文件,在Windows系統(tǒng)下MEX文件的后綴為dll。要將C語言編寫的S-函數(shù)編譯成動(dòng)態(tài)庫,需在MATLAB命令下利用MATLAB6p1/bin/win32目錄下的批處理文件mex.bat。492.CMEXS-函數(shù)的模塊化在動(dòng)態(tài)系統(tǒng)設(shè)計(jì)、仿真與分析中,同樣也可以利用Function&Tables模塊庫中的S-function模塊來調(diào)用CMEXS-函數(shù),以形成用戶自行定義的S-函數(shù)模塊。50上述三種方式所創(chuàng)件的S-函數(shù)都可以用于仿真,但運(yùn)行速度不同。CMEX文件形成的S-函數(shù)運(yùn)行速度最快;框圖的仿真表示比較直觀,容易構(gòu)造,運(yùn)行速度次之,m文件形成的S-函數(shù)編寫靈活,適用面寬,但運(yùn)行速度最慢。因此,使用何種方式應(yīng)視具體情況而定,在解決較復(fù)雜問題時(shí),常常需要多種方法交叉使用。如果存在相同的名字的m文件和CMEX文件,S-函數(shù)優(yōu)先使用C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論