4.1 Simulink子系統詳解
4.1.1 子系統概述
Simulink根據仿真特性將模塊的屬性分為兩種:虛擬模塊和非虛擬模塊。
非虛擬模塊在仿真過程中起到實際的作用,對其進行編輯或者增加刪除操作會影響到模型運行和改變模型的結果。
虛擬模塊在仿真過程中不起實際作用,主要是為了從圖框上進行程序的層次性划分以保持模型的圖形界面的整潔性。
4.1.2 Simulink模型的運行順序
Simulink模型的計算順序是基於時間采樣和信號流向的,即按照時間的順序執行。 每一個采樣點時間,模型中所有模塊的狀態和輸入/輸出值都要計算並更新一下,每個模塊的輸出值都通過信號線連接並傳遞給下一個模塊的輸入。系統采樣時間由解算器類型和步長共同決定,並且作為Simulink模型仿真的最小粒度。當系統采樣時刻到來時,每個模塊再根據自身所設定的采樣時間方式決定是否在當前這個采樣時刻進行計算。
允許用戶設定采樣時間的模塊在其參數對話框中都提供Sample Time這個屬性。對於模塊的Sample Time,常用的值有:
- -1:繼承輸入信號采樣時間,若沒有輸入信號,則繼承父層模型采樣時間,如果模塊無輸入並且本身處於頂層模型中,則繼承系統解算器的步長。
- 0:連續采樣時間。
- 非零正數:離散采樣時間。
- Inf:無窮大采樣時間,即不采樣。
- [Sampletime,offset]:Sampletime為上述一種,offset為相對於這個采樣時刻的時間偏移量。如[0.2,0.01]表示在0.01s、0.21s、0.41s等時刻進行計算。
Display→Blocks→Sorted Executed Order可以顯示模塊的執行順序。
標注格式為紅色的m:n,m表示模塊在模型中執行的優先度,n表示 在同一個采樣時刻,模塊所處的執行次序號。
4.1.3 各種子系統的特點與功能
1. 虛擬子系統
在執行仿真之前就展開子系統,實際上如同沒有建立子系統一樣。
2. 非虛擬/原子子系統
非虛擬原子子系統內的模塊作為一個單元執行,右擊虛擬子系統,在Block Parameter中勾選Treat as atomic unit,即可創建原子子系統。
(1)條件子系統
①使能子系統
在驅動子系統使能端口的輸入信號大於零時執行使能子系統。
用戶可以通過在虛擬子系統內放置Enable模塊的方式來創建使能子系統,並通過Enable模塊中的States when enabling參數配置子系統內的模塊狀態。
此外,如果子系統內部存在Out模塊,利用Out輸出模塊的Output when disabled參數可以把使能子系統的輸出端口配置成保持最后一個有效采樣時刻的輸出或復位為初始值。
②觸發子系統
觸發子系統只有在驅動子系統觸發端口的信號上升沿或下降沿到來時才會執行,觸發信號沿方向由Trigger端口模塊中的Trigger type參數決定。
③觸發使能子系統
同時放置Trigger和enable。
(2)動作子系統
Action子系統必須由If模塊或Switch Case模塊執行,與這些子系統模塊連接的所有Action子系統必須具有相同的采樣時間。
用戶可以通過在子系統內部放置Action Port模塊的方式來創建Action子系統。
(3)選擇子系統
①可變子系統:內部包括多個子系統,當某條件成立時執行與之相應的子系統。每個子系統匹配一個變量的值,每次仿真時根據這個變量的值決定內部哪一個子系統處於激活狀態。
②可配置子系統:用來代表用戶自定義庫中的任意模塊,只能在用戶自定義庫中使用,動態表示自定義庫中的某一模塊。
4.2 Simulink子系統示例
4.2.1 虛擬和非虛擬子系統
右擊子系統,選擇Block parameters,勾選Treat as atomic unit,子系統即成為原子子系統,子系統圖標黑色外框加寬,此時子系統可以整體設置采樣時間。
4.2.2 使能子系統
僅在使能信號使能時執行一次。
simin=[0:10;[0 1 1 0 1 1 1 1 1 1 0]]';
4.2.3 函數調用子系統(條件子系統)
這種子系統只能被函數調用信號所觸發。
函數調用子系統的執行不是由Simulink引擎直接控制的,而是由調用它的S函數通過mdlOutputs/mdlUpdates子方法來決定的。
S函數構成的模塊具有兩個函數調用類型的輸出,根據輸入信號的奇偶值分別調用兩個函數調用子系統,兩個函數調用子系統的執行時間不重合,被Merge模塊合並到一個輸出,輸出為當前仿真時刻處於激活狀態的子系統輸出。
函數調用子系統1的內部為常數輸出,函數調用子系統2的內部為正弦波輸出。
4.2.4 While子系統(動作子系統)
(1)do-while
在這個模式下,While Iterator只有一個輸入,即while條件輸入,它必須在while子系統內。
在每個采樣時間內,While Iterator模塊會執行一次子系統內的所有模塊,然后檢查while條件輸入是否為真,如果輸入為真,則While Iterator模塊再執行一次子系統內的所有模塊,只要while條件輸入為真,而且循環次數小於或等於While Iterator模塊對話框中的Maximum number of iterations參數值時,這個循環過程會一直執行。
(2)while
在這個循環模式下,while Iterator模塊有2個輸入:while條件輸入和初始條件輸入(IC),初始條件信號必須在while子系統外提供。
在仿真開始時,如果IC輸入為真,While Iterator模塊會執行一次子系統內的所有模塊,然后檢查while條件輸入是否為真,如果輸入為真,則While Iterator模塊再執行一次子系統內的所有模塊,只要while條件輸入為真,而且循環次數小於或等於While Iterator模塊對話框中的Maximum number of iterations參數值時,這個循環過程會一直執行。如果在仿真時間開始時IC輸入為假,那么在該采樣時間內While Iterator模塊不執行子系統中的內容。
注意:當把While Iterator模塊放置到子系統中時,在給定條件為真的情況下,While子系統中所有模塊會在當前采樣時間反復執行子系統中的內容,即把多個迭代在一個采樣步長內進行處理。如果子系統不是原子子系統,那么把While Iterator模塊放置到子系統中會使該子系統自動成為原子子系統。
上面模型的效果等價於以下代碼:
max_sum=100; max_iterations=1000; sum=0; iteration_number=0; cond=(max_sum>0); while(cond~=0) iteration_number=iteration_number+1; sum=sum+iteration_number; if(sum>max_sum || iteration_number>max_iterations) cond=0; end end
也等於以下簡化的代碼:
for i=1:1000 sum_i=sum(1:i); if(sum_i>100) break; end end
4.2.5 可變子系統(選擇子系統)
可變子系統內裝了多個child子系統,其輸入/輸出端口不需要連線,每個child子系統都有一個對應的變量或表達式,某個child子系統的變量或表達式值為真時此子系統就被激活。Simulink的采樣時刻到來時最多只有一個child子系統被激活,可以通過變量方便地控制其中某一個child子系統的執行。
右擊子系統,選擇Block parameters(subsystem)。
左側排列5個按鈕,第一個用來在可變子系統內建立child子系統,第二個用來在可變子系統內建立模型選擇框,第三個用來編輯激活child子系統的條件,第四個用來打開選中的child子系統,第五個用來更新信息列表。
右側是一個列表框,第二列Variant control表示Condition的Simulink.Variant對象,其內部包含一個判斷條件condition,即是第三列參數,由用戶指定一個邏輯表達式,當條件滿足時,此條件所對應的child子系統會被激活。
在工作區輸入sel=2;則第二個child子系統被激活。第一個子系統設置增益2,第二個子系統設置增益3,仿真結果如下。
4.2.6 可配置子系統(選擇子系統)
可配置子系統只能在用戶自定義的模塊庫中使用,可配置子系統的優點在於設計者可以任意切換子系統的內部模塊,快速比較出那種組合會滿足系統設計需求。