2.1 Simulink模塊的組成要素
用戶構建系統模型時無需直接面對成千上萬行的代碼,而是通過模塊化圖形界面以模塊化的方式構建,能夠使理解變得容易,讓大腦減負。通過層次化模塊分布將系統功能模塊化,而將每個功能的細節隱藏在模塊內部。
模塊的構成元素
- 輸入/輸出端口:作為模塊之間傳遞數據的紐帶,連接輸入信號和輸出信號。
- 模塊外觀:通常為矩形或圓形,上面帶有說明文字或圖像並顯示有輸出/輸出端口名。
- 模塊對話框:雙擊模塊外觀后彈出的參數GUI,可以在參數控件上進行參數設置。
Ctrl+R順時針旋轉90°
模塊的屬性及參數
- gcb:獲取當前被選中的模塊
- gcbh:獲取當前被選中的模塊的句柄
- get(handle):獲取模塊的屬性信息
- inspect(handle):通過屬性觀察器方式羅列模塊的屬性信息
- get_param(block,prop_string):獲取block模塊的prop_string屬性值
- set_param(block,prop_string,prop_value):將block模塊的prop_string屬性的值設為prop_value。prop_string,prop_value可以多對出現
>> new_system('mymodel') >> open_system('mymodel') >> gcb ans = 'mymodel/Constant' >> get(gcbh) Path: 'mymodel' Name: 'Constant' Tag: '' Description: '' Type: 'block' Parent: 'mymodel' Handle: 1.8170e+03 HiliteAncestors: 'none' RequirementInfo: '' FontName: 'auto' FontSize: -1 FontWeight: 'auto' FontAngle: 'auto' Selected: 'on' MaskType: ''
......
常用屬性列表
屬性名 | 作用說明 |
Path | 模塊在模型中的路徑 |
Name | 模塊的名字 |
ShowName | 模塊的名字是否顯示出來 |
BlockType | 模塊的類型名 |
Handle | 模塊的句柄,double數據表示 |
Position | 模塊的邊框在當前模型中的位置 |
ForegroundColor | 模塊的前景色 |
BackgroundColor | 模塊的背景色 |
Sample Time | 模塊的采樣時間 |
FontAngle | 字體斜度 |
FontName | 字體名 |
FontSize | 字體大小 |
FontWeight | 字體粗度 |
...... |
>> set_param(gcbh,'BackgroundColor','yellow') >> set_param(gcbh,'ForegroundColor','red')
set_param/get_param的第二個參數使用的不是提示標簽,而是參數的變量名。
提示標簽 | 參數的變量名 |
Constant value | Value |
Interpret vector parameters as 1-D |
VectorParams1D |
Sampling mode | SamplingMode |
Sample time | SampleTime |
常數模塊、加減乘除四則運算和增益模塊及輸入輸出端口都擁有Signal Attributes屬性配置界面。
Output minimum和Output maximum中默認為空,不對數據輸出進行任何檢測。一旦設置了數值,模塊就會對輸出值進行檢查,當數值小於Output minimum或者大於Output maximum時就會報錯來提醒用戶。
Output data type對輸出數據的類型提供了一些選項。
模塊的注解
右擊模塊選擇Properties選項(以Integrator為例),雙擊以%<>標示的變量,可以將其轉入右邊的編輯框中,從而以懸浮文字的方式顯示到模型中去。
合理使用模塊注解功能能夠增強模塊的可讀性,使得所建立的模型更容易被理解。
2.2 Simulink常用模塊庫
這些模塊不僅存在於Commonly Used Blocks子庫中,也分別存在於各自所屬的類別庫中,它們被集中在Commonly Used Blocks子庫中是為了方便用戶使用,建模時可以免去從各個分類庫繁多的模塊中搜尋這些常用模塊的繁瑣。
2.2.1 輸入/輸出模塊
In
當它存在於子系統模型中時,將為子系統模型增加一個輸入端口,是連接上層模型與當前層次模型的接口,將父層模型的信號傳遞到當前層次模型中來。
當子系統中存在In模塊時,子系統模塊框圖將按照In模塊的編號生成端口。
當將Workspace的數據導入模型時,對沒有對應數據點的采樣時刻進行線性插值的開關選項。
數據導入需要In模塊結合Configuration Parameter版面中提供的數Data Import/Export功能共同實現。
注意t是表示時間的列向量。
>> t=[1:0.1:5]'; >> u=sin(3*t);
Out
當它存在於子系統模型中時,為子系統增加一個輸出端口,是連接上層模型與當前層次模型的橋梁,將當前層次模型的信號傳遞到父層模型中去。
2.2.2 常數模塊
常數模塊在仿真過程中通常輸出恆定的數值。
常數模塊不僅支持scalar數據作為參數輸入,也支持向量、矩陣等多維數據。
2.2.3 波形顯示模塊
Scope是模型中的示波器,能夠顯示模型中的信號波形。
可以連接任何類型的實數信號線,不支持復數。
輸入端口數,默認值為1,表示僅有一個輸入端口,當輸入其他正整數N時可以產生對應個數的輸入端口。
Structure With Time將Scope獲取到的采樣信號存儲在結構體中,這個結構體包括:
- 存儲時間序列的time
- 存儲對應采樣時間點的采樣數據以及相關信息的結構體signals
- 存儲模塊全路徑及名字的變量blockName
signals本身也是一個結構體,訪問采樣數據的方式是ScopeData.signals.values,采樣數據按列排布。
plot(ScopeData.time,ScopeData.signals.values)

Structure存儲類型少了time這個時間序列的存儲,其他成員相同。
Array為列向量方式存儲。
右擊圖形界面,選擇style,可以設置顯示風格
右擊圖形界面,選擇Print Display to Figure,可以將波形輸出到圖窗顯示
2.2.4 四則運算模塊
Sum
推薦用法:當Sum模塊的輸入都是同一個時刻的輸入時,采用矩形圖標;當輸入有來自輸出的延時反饋時,采用圓形圖標。
Product
Multiplication提供兩種乘法,Element-wise表示點乘,Matrix表示矩陣乘法。
Divide
Gain
支持標量、向量或矩陣形式的增益。
2.2.5 延時模塊
Delay
Delay length和Initial condition分別表示延時的采樣點數和輸出的初始值。
模塊總的延時時間由延時的采樣點數和模塊采樣時間間隔共同決定。
例如,Delay length為3,Sample time設置為0.6,則模塊的輸出將在1.8s時開始更新,在0~1.8s之間,模塊的輸出值由Initial condition中指定的初始值決定。
Source中Dialog表示參數在對話框里輸入,Input port表示增加一個輸入端口,通過信號線傳遞參數。
External reset選擇None以外的選項時為Delay增加一個輸入端口,通過此端口的輸入信號達到某種條件而將Delay模塊的輸出值復位,所謂復位即Delay模塊的狀態值恢復初始狀態值。
Level hold表示當前采樣時刻的值非零時即復位。Level則包含了Level hold的情況,另外還包括信號從非零跳變到零的采樣點。
Input processing包括Element as channels(基於采樣)和Columns as channels(基於幀)以及Inherited3個選項,基於采樣和基於幀的采樣方式區別在於采樣數據的組織方式。
勾選Use circular buffer for state選項時,將使用環形緩存存儲仿真或代碼生成時使用的狀態變量,當Delay length值比較大時,勾選此選項有助於提高執行效率。
Unit Delay
是Delay模塊的一個特例,即只延時一個采樣時間,其參數對話框比較簡單,不需要設置Delay length,不需要考慮緩存區使用環形或線性區域,沒有復位功能。
設計示例:十進制累加計數器
2.2.6 關系操作模塊
9種關系操作符
啟用過零檢測功能
2.2.7邏輯運算模塊
7種邏輯操作
與(AND)、或(OR)、非(NAND)、或非(NOR)、異或(XOR)、異或非(NXOR)、非(NOT)
Icon shape用於選擇模塊圖標的形狀。選擇rectangular時,模塊形狀不變,只是在框圖中央顯示當前所選擇的邏輯操作。
選擇distinctive時,模塊會以IEEE圖像符號標准所規定的形式展現出來。
有了邏輯運算模塊,Simulink就可以進行數字門電路的邏輯仿真。
2.2.8 Switch模塊
Switch模塊是一個選擇開關模塊,可根據判斷條件選擇多個輸入端口中的某個進行輸出。
若由第2個端口決定的判斷條件為真,則輸出口輸出第1個端口的信號;否則輸出第3個端口的信號。
多路選擇:
2.2.9 積分模塊
Integrator
External reset:增加一個輸入端口,通過外部輸入信號的電平或脈沖上下沿進行狀態變量的復位。
Initial condition source:初始值的獲取方式選擇。
Initial condition:模塊的初始值。
Limit output:勾選時對輸出值的上下限進行限定。
Show saturation port:使能飽和輸出端口。1表示輸出值超出上限但被上限飽和值限制住,0表示上下限均未達到,-1表示超出下限但被下限飽和值限制住。
Show state port:使能狀態輸出端口。用於消除代數環。
示例:
示例:求解微分方程
y''(t)+5y'(t)+6y(t)=2x'(t)+8x(t)
x(t)=exp(-t)×u(t)
y(0-)=5,y'(0-)=-4
Discrete-Time Integrator
離散積分模塊
Integrator method提供了3中算法和2種工作模式。
- Integration模式下Ts表示采樣時間間隔
- Accumulation模式下Ts被固定為1
- Forward Euler:y(n)=t(n-1)+K×Ts×u(n-1),並非直接饋入,輸入輸出信號之間存在延時
- Backward Euler:y(n)=t(n-1)+K×Ts×u(n),直接饋入
- Trapezoidal:y(n)=t(n-1)+K×Ts×[u(n-1)+u(n)]/2,直接饋入
2.2.10 限幅模塊
示例:半波整流
2.2.11 接地模塊
此模塊沒有參數,用於避免仿真時某些模塊出現輸入端口未連接的警告。
2.2.12 終止模塊
用來接收未使用的輸出信號。
2.2.13 信號合並與分解模塊
Mux模塊是一個虛擬模塊,雖然視覺上將多個信號合並為一個信號,但是實際上並沒有改變其內部數據結構,只是視覺上看起來簡潔並且可以同一管理。
在仿真模型中,往往可以使用Mux模塊將多個信號匯聚之后顯示到同一個scope的同一個坐標系中,這樣scope就不需要提供多個輸入輸出端口了。
Demux模塊能將多維信號分解為單維或維數較少的多維信號。
2.2.14 總線創建與總線選擇模塊
Bus creator模塊將輸入的一系列信號合並為一個總線。
當Output data type選擇為Bus:<object name>,勾選Output as nunvirtual bus時,表示輸出信號是非虛擬信號,在C代碼生成時將輸出總線信號定義為結構體。
a=Simulink.Bus; a.DataScope='Exported'; a1=Simulink.BusElement; a2=Simulink.BusElement; a1.Name='a1'; a2.Name='a2'; a.Elements=[a1,a2];
#ifndef RTW_HEADER_a_h_ #define RTW_HEADER_a_h_ #include "rtwtypes.h" typedef struct { real_T a1; real_T a2; } a; #endif /* RTW_HEADER_a_h_ */
Bus Selector可從總線中選擇出一個或一組成員,這個總線信號可來自於Bus Creator、Bus Selector或其他輸出Bus object的模塊。
2.2.15 向量連接模塊
有兩種模式:向量和矩陣
向量模式下,使用方式類似於Mux模塊,使用時需注意不同朝向下模塊輸入端口的排列順序是從左到右、從上到下。
矩陣模式下則多出一個參數,Concatenate dimension設置矩陣合並所用的維數。
1表示輸入矩陣列數相同,按照豎直方向合並;2表示矩陣行數相同,按照水平方向合並。
2.2.16 數據類型轉換模塊
Simulink支持多種數據類型,包括浮點數、固定點數及枚舉型數據等,當前一個模塊的輸出信號與后面的模塊的輸入端口支持的數據類型不一致時,Simulink將會報錯。這時使用數據類型轉換模塊Data Type Conversion進行數據轉換以使模型能夠順利通過仿真並生成代碼。
fixdt是MATLAB提供的函數,能夠返回simulink.NumericType類型的變量,通過這個變量來描述一種固定數據類型。使用固定點數據類型配置的模型生成的代碼相對於浮點數據類型占用較少的內存空間,並能夠以更快的速度運行。
固定點數據類型:
- 符號:首位1或0表示有符號或無符號
- 字長:存儲單元由多少位二進制構成
- 表示小數的數據位,字長范圍內的一部分或全部數據用來表示數的小數部分,這部分數據位於數據的最右端
例如:將數字-2.75表示為一個有符號,字長為8,小數部分使用3位的數據,這個數據類型就可以描述為fixdt(1,8,3)。
Input and output to have equal參數是Data Type Conversion模塊獨有的參數,表示當輸入數據是固定點數據類型時模塊處理的方式選擇。
Real World Value和Stored Integer分別表示實際值與存儲值。RWV會按照所選擇的數值進行等值轉換,SI直接在8為二進制前補8個1以保證數據達到16位。
2.2.17 子系統模塊
子系統就是將一些基本模塊及其信號連線組合成一個大的模塊,屏蔽其內部結構,僅僅將輸入輸出個數表現在外的層次性划分。利用子系統有如下優點:
- 可以減少模型窗口中顯示的模塊數目,使模型外觀結構更清晰,增強了模型的可讀性。
- 在簡化模型外觀結構圖的基礎上,保持了各模塊之間的函數關系,使得特定功能 的模塊可以擁有一些獨立的屬性。
- 可以建立層次方框圖。
這是一個虛擬模塊。
用戶可以通過修改In和Out模塊的名字達到修改子系統端口名的目的。
2.3 Commonly Used Blocks以外的常用模塊
2.3.1 信號源模塊
Step
Step time:信號產生階躍變化的時刻。
Initial value:信號階躍時刻之前的值。
Final value:信號階躍時刻之后的值。
Step模塊雖然只有一個輸出口,勾選Interpret vector as 1-D之后卻可以輸出多維信號。
此時上面3個參數按照向量方式填寫。
周期信號模塊
僅有一個輸出端口,並將仿真波形顯示在模塊圖標上。
Time values:輸入時間序列的采樣點,Simulink以此輸入作為單元進行周期性延伸賦值。
Output Values:輸入對應於Time values時間采樣序列的值序列。
Time values里設置的時間序列的跨度(末值減首值)即為波形的周期T。
除了直接輸入數值外,在參數對話框里直接輸入M代碼,即可方便的產生波形信號。
Clock
輸出仿真時間
也可以作為一些函數的輸入以產生不同的信號源。
正弦信號發生模塊
From Workspace
Simin的數據類型可以有:
- 時間序列Timeseries對象。
- 二維矩陣,第一列為仿真采樣時間,其余每列為對應采樣時刻的信號值。
- 結構體類型,可以包含仿真采樣時間序列作為其成員變量,也可以不包含。
>> ts=timeseries(sin([0:0.1:10]),[0:0.1:10]) timeseries 常見屬性: Name: 'unnamed' Time: [101x1 double] TimeInfo: [1x1 tsdata.timemetadata] Data: [1x1x101 double] DataInfo: [1x1 tsdata.datametadata]
matrx=zeros(size(repmat([0:0.1:10]',[1 3]))); matrx(:,1)=[0:0.1:10]'; matrx(:,2)=cos([0:0.1:10])'; matrx(:,3)=sin([0:0.1:10])';
struc=struct('time',[0:0.1:10]','signals', ... struct('values',sin([0:0.1:10]'),'dimension',length([0:0.1:10])));
Interpolate data:當某些信號在一些采樣時刻點沒有對應的采樣數據時,是否根據線性插值計算出這個時刻的信號值。當勾選此選項時進行線性插值,否則延用前一個采樣時刻的信號值。
From output after final data value by:當模型仿真時間超出From workspace提供的數據的時間范圍時,如何對提供的采樣時間范圍外的信號進行插值預測或默認值輸出。
- Extrapolation:外部插值
- Setting to zero:保持0輸出
- Holding final value:輸出最后一個值
- Cylic repetition:周期循環輸出
From file
要求mat文件是MATLAB timeseries object或者矩陣2中數據格式中的一種。
matrx=matrx';
save matrx.mat matrx
2.3.2 信號接收模塊
Display
Decimation:表示模塊數值更新的頻率,所填數字表示每隔幾個采樣點更新一次模塊的數值顯示。
Floating display:勾選則將此模塊作為浮動顯示模塊,它將顯示被鼠標選中的信號線的值。使用時需要先選中某信號線,再進行仿真。
To workspace
能夠在仿真結束時將仿真數據直接存儲到MATLAB工作空間中。
輸出數據有時間序列、矩陣或結構體類型。
Limit data points to last:設置保存的采樣點數,默認值inf表示仿真的數據全部保存。
Decimation:每隔多少個仿真采樣點保存一個點到simout中,默認為1即全部保存。
Log fixed-point data as a fi object:勾選以將固定點數據類型作為一個fi對象保存,不勾選將作為double型保存。
To file
Stop Simulation
該模塊沒有參數,只有一個輸入端口,一旦接收非零信號就停止仿真。
示例:檢測5個方波上升沿之后停止仿真
檢測方波的策略是當前時刻的值為1,上一個采樣時刻的值為0,可認為上升沿到來,通過Sum與Delay模塊構成的計數器計數。
計數器值與5比較,相等邏輯輸出線連接到Stop Simulation模塊。通過示波器觀察方波、計數器輸出和Stop3路信號。
2.3.3 查表模塊
所謂查表,就是說目標位一個填滿數據的向量或矩陣表格,根據對應維數的輸入能夠在表中定位一個對應的輸出。
1-D Lookup Table
Number of table dimensions:設置查找表維數,可以通過下拉框選擇1~4的維數,或者輸入1~30的維數。
Table data:查找把表的數值。
Breakpoints 1:查找表第一維輸入向量,必須按照從下到大嚴格單調遞增。
Edit table and breakpoints:按下次按鈕可以在表格里編輯查找表輸入及內容。
Interpolat:
- Flat:使用輸入值和相鄰兩個breakpoint中較小的一個。
- Linear:線性插值法。
- Cubic spline:三次樣條插值方法。
Extrapolation:
- Clip:使用breakpoint端點值。
- Linear:線性插值法。
- Cubic spline:三次樣條插值方法。
示例:256長度正弦查找表
n-D Lookup Table
2.3.4 其他常用模塊
數學函數模塊
下拉列表框選項 | 功能 |
exp | 指數計算 |
log | 自然對數計算 |
10^u | 底數為10的指數計算 |
log10 | 底數為10的對數計算 |
magnitude^2 | 賦值/絕對值的平方 |
square | 平方計算 |
pow | u的v此方(2個輸入端口) |
conj | 復數共軛計算 |
reciprocal | 倒數計算 |
hypot | 直角三角形邊長計算,sqrt(u^2+v^2) |
rem | 求余數計算 |
mod | 求模 |
transpose | 矩陣轉置計算 |
hermitian | 復數共軛轉置計算 |
matlab的rem()和mod()函數
rem(x,y):求整除x/y的余數
mod(x,y):求模
rem(x,y)=x-y.*fix(x./y); (fix()向0取整)
mod(x,y)=x-y.*floor(x./y); (floor()向左取整,以數抽為准,朝負無窮方向取整)
如果x和y的符號相同(同為‘+’,同為‘-’),那么rem(x,y)=mod(x,y)
當正數與負數取余時,當得到的余數結果的符號希望跟除數(x)一樣,用rem()函數;當得到的余數結果的符號希望跟被除數(y)一樣,用mod()函數
隨機數模塊
隨機數模塊是一個信號源模塊,可以產生正態分布的隨機信號
Mean:產生隨機數序列的均值。
Variance:產生隨機數序列的方差。
Seed:用於產生隨機數序列的種子,可以是0或正整數,根據種子可以產生周期性的偽隨機數。保持參數不變,可以在多次仿真中保持同樣的輸出結果。
示例:對帶有噪聲的正弦信號進行濾波
傳遞函數模塊
傳遞函數是描述線性系統動態特性的基本數學工具之一,經典控制理論的主要研究方法——頻率相應法和根軌跡法都是建立在傳遞函數的基礎之上。
Numerator coefficients:傳遞函數的分子向量。
Denomibator coefficients:傳遞函數的分母向量。
2.3.5 用戶自定義模塊
用戶可以使用M語言或C語言根據Simulink運行原理編寫擁有自定義功能的模塊。
Fcn
可輸入abs、acso、asin、atan、atan2、ceil、cos、cosh、exp、fabs、floor、hypot、ln、log、log10、pow、power、rem、sgn、sin、sinh、sqrt、tan、tanh組合的函數表達式,輸入信號用u表示。當輸入信號為多維時,從上到下輸入信號的每個維的元素一次用u(1)、u(2)、…表示。
MATLAB Function
雙擊該模塊,可以打開一個M代碼編輯窗,它支持的MATLAB內建函數比Fun要廣泛很多。
根據Simulink運行機制,每個采樣點會調用一次MATLAB Function的函數,兩次調用之間,同一個變量的兩次計算的終值如何傳遞到當前計算周期是一個問題。
使用persistent變量可以處理這一問題。
function y = fcn(u) persistent sum_val; if isempty(sum_val) sum_val=0; end sum_val=sum_val+u; y=sum_val;
persistent變量時定義在某個函數內的變量類型,可在函數調用的不同次數間保持上一次退出該函數的值。它同global全局變量的類似之處在於MATLAB為他們創建永久數據區域,不同之處在於它只能被聲明它的函數內部識別,目的是免除 此類變量被其他函數或命令修改值而造成用戶無法確保其值得困擾。
聲明persistent變量時它剛被創建,其內容為空值[ ]。
使用persistent變量需要注意:
- persistent變量不能作為函數的輸入輸出參數,否則會報錯。
- persistent變量不能同當前工作空間中已經存在的變量同名,否則會報錯。
- persistent變量不能聲明在Command Window中,只能在函數中聲明。
示例:自定義3-D繪圖函數
function scope_3d(u) % #codegen eml.extrinsic('plot3','scatter3','close','delete'); len=length(u); persistent data; if isempty(data) data=zeros(3,100000); end persistent n; if isempty(n) n=1; else n=n+1; end data(:,n)=u; persistent h; if isempty(h) h=plot3(data(1,1:n),data(2,1:n),data(3,1:n),'o'); else delete(h); h=plot3(data(1,1:n),data(2,1:n),data(3,1:n),'o'); end