Simulink 环境基础知识(五)--编程建模基础知识
目錄
加載模型
創建模型并指定參數設置
打開模型時通過編程方式加載變量
以編程方式添加和連接模塊
通過編程方式命名信號
自動排列模型布局
在多個窗口中打開同一個模型
獲取?Simulink?標識符
使用?Simulink?標識符定位模塊圖組件
突出顯示模塊
突出顯示注釋
突出顯示?Stateflow?對象
以編程方式指定顏色
????????在 MATLAB命令提示符下,通過編程方式執行大多數基本的 Simulink?建模操作。交互式模型編輯中的“函數”部分列出了與基本建模操作(例如,創建模型、向模型中添加模塊、設置參數等)對應的命令。以下例子說明其中的一些命令及其用法。
加載模型
????????加載模型會將模型導入到內存中,但不在 Simulink Editor 中打開模型進行編輯。加載模型之后,可以通過編程方式來處理模型。只有在您打開模型之后,才能使用 Simulink Editor 來編輯模型。
????????要加載系統,使用load_system?命令。例如,要加載 system模型,在 MATLAB 命令提示符下輸入:
load_system('system')創建模型并指定參數設置
????????編寫一個函數,以創建模型并使用偏好的設置。例如,下面的函數將創建帶有綠色背景并使用 ode3 求解器的模型:
function new_model(modelname) % NEW_MODEL Create a new, empty Simulink model % NEW_MODEL('MODELNAME') creates a new model with % the name 'MODELNAME'. Without the 'MODELNAME' % argument, the new model is named 'my_untitled'.if nargin == 0 modelname = 'my_untitled'; end % create and open the model open_system(new_system(modelname));% set default screen color set_param(modelname,'ScreenColor','green');% set default solver set_param(modelname,'Solver','ode3');% save the model save_system(modelname);打開模型時通過編程方式加載變量
????????如果指定變量作為模塊參數值,則必須在模型中定義該變量的值。可以參考在打開模型時加載變量內容??梢詫?PreloadFcn 回調與set_param 函數結合使用,通過編程方式定義變量。此函數的格式如下所示:
set_param('mymodel','PreloadFcn','expression')????????expression 是 MATLAB 搜索路徑中的 MATLAB 命令或 MATLAB 腳本。此命令將模型的 PreloadFcn 回調設置為指定的值。保存模型,以保存該設置。
????????例如,在 MATLAB 腳本 loadvar.m 中為模型 modelname.slx 定義變量時,請使用以下命令:
set_param('modelname','PreloadFcn','loadvar')????????要為變量 K 指定值 15,需要使用以下命令:
set_param('modelname','PreloadFcn','K=15')????????保存模型后,當下一次打開模型時,將執行 PreloadFcn 回調。
以編程方式添加和連接模塊
????????例子說明如何使用函數以編程方式添加和連接模塊。將模塊添加到模型中之后,可通過三種不同的方式將它們連接起來:信號線、端口句柄和端口 ID。通過信號線,可以指定所有連接線段端點的精確 (x,y) 坐標。通過端口句柄和端口 ID,可將信號線連接到模塊端口而不需要知道端口的位置坐標。
????????創建并打開名為?mymodel?的空模型。添加模塊,包括一個子系統模塊。在?set_param?函數中使用?position?數組設置模塊的大小和位置。使用 (x,y) 坐標設置模塊的左上角和右下角。
add_block('simulink/Sources/Sine Wave','mymodel/Sine1'); set_param('mymodel/Sine1','position',[140,80,180,120]); add_block('simulink/Sources/Pulse Generator','mymodel/Pulse1'); set_param('mymodel/Pulse1','position',[140,200,180,240]); add_block('simulink/Ports & Subsystems/Subsystem','mymodel/Subsystem1'); set_param('mymodel/Subsystem1','position',[315,120,395,200]); add_block('simulink/Sinks/Scope','mymodel/Scope1'); set_param('mymodel/Scope1','position',[535,140,575,180]);????????在 Subsystem1 內,刪除 In1 和 Out1 之間的默認連接。通過從模塊庫中復制并重命名 In1,添加第二個輸入端口。
delete_line('mymodel/Subsystem1','In1/1','Out1/1'); add_block('simulink/Sources/In1','mymodel/Subsystem1/In2');????????重新定位 Subsystem1 中的內部輸入和輸出端口模塊。
set_param('mymodel/Subsystem1/In1','position',[50,50,90,70]); set_param('mymodel/Subsystem1/In2','position',[50,130,90,150]); set_param('mymodel/Subsystem1/Out1','position',[500,80,540,100]);????????在 Subsystem1 內插入一個 Add 模塊并調整其位置。
add_block('simulink/Math Operations/Add','mymodel/Subsystem1/Add1'); set_param('mymodel/Subsystem1/Add1','position',[250,80,290,120]);????????然后添加信號線,將模型中的所有模塊連接起來。首先使用信號線將 Sine1 和 Pulse1 模塊連接起來。找到 Sine1 輸出端口的 (x,y) 坐標。
Sine1_Port = get_param('mymodel/Sine1','PortConnectivity')Sine1_Port = struct with fields:Type: '1'Position: [185 100]SrcBlock: []SrcPort: []DstBlock: [1×0 double]DstPort: [1×0 double]????????get_param 顯示端口的 Position 為 [185 100]。找到 Pulse1 輸出端口的 (x,y) 坐標。
Pulse1_Port = get_param('mymodel/Pulse1','PortConnectivity')Pulse1_Port = struct with fields:Type: '1'Position: [185 220]SrcBlock: []SrcPort: []DstBlock: [1×0 double]DstPort: [1×0 double]????????get_param?顯示端口的 Position 為 [185 220]。
????????使用三個信號線段,將?Sine1?的輸出連接到?Subsystem1?的第一個輸入。
add_line('mymodel', [185 100; 275 100]); add_line('mymodel', [275 100; 275 140]); add_line('mymodel', [275 140; 310 140]);????????使用三個信號線段,將 Pulse1 的輸出連接到 Subsystem1 的第二個輸入。
add_line('mymodel', [185 220; 275 220]); add_line('mymodel', [275 220; 275 180]); add_line('mymodel', [275 180; 310 180]);????????使用 get_param 獲取連接的模塊的端口句柄。然后使用模塊端口句柄將 Subsystem1 的輸出連接到 Scope1 的輸入。
SubsysPortHandles = get_param('mymodel/Subsystem1','PortHandles'); ScopePortHandles = get_param('mymodel/Scope1','PortHandles'); add_line('mymodel',SubsysPortHandles.Outport(1),... ScopePortHandles.Inport(1));????????使用端口名稱和 ID 將 Subsystem1 內的 Add1 模塊連接到子系統的輸入和輸出。Simulink 使用最直接的路徑來連接端口。
add_line('mymodel/Subsystem1','In1/1','Add1/1'); add_line('mymodel/Subsystem1','In2/1','Add1/2'); add_line('mymodel/Subsystem1','Add1/1','Out1/1');通過編程方式命名信號
(1)選擇信號線的源模塊。
(2)使用 get_param 將當前所選模塊的端口句柄指定給變量 p。使用 get_param 將來自該端口的信號線的名稱指定給變量 l。然后,將信號線的名稱設置為 's9'。
p = get_param(gcb,'PortHandles') l = get_param(p.Outport,'Line') set_param(l,'Name','s9')自動排列模型布局
????????可以使用Simulink.BlockDiagram.arrangeSystem命令對模型布局。該命令將分別對齊左側的輸入模塊、右側的輸出模塊和輸入與輸出之間各列的模型元素。該命令一次只影響一個層。
????????可以使用Simulink.BlockDiagram.routeLine命令對模型的現有信號線進行布線。對現有信號線進行布線可改善信號線的分布,并避免信號線與模型中的其他信號線和障礙物發生重疊。
????????雖然對任何打開的模型使用這些命令,但它們對以編程方式構建的模型特別有用。
在多個窗口中打開同一個模型
????????當打開模型時,模型將顯示在 Simulink Editor 窗口中。例如,如果打開了一個模型,然后又打開一個模型,第二個模型將顯示在第二個窗口中。要在兩個 Simulink Editor 窗口中打開同一個模型,在 MATLAB 命令提示符下輸入 open_system 命令并使用 window 參數。例如,如果打開了 vdp 模型,要打開模型 vdp 的另一個實例,請輸入:
open_system('vdp','window')獲取?Simulink?標識符
????????模型中的每個模塊都有一個 Simulink 標識符 (SID),該標識符具有唯一性且不可修改。SID 在對象的生命周期內保持不變,并與模型保存在一起。即使對象名稱改變,SID 也保持不變。SID 的格式為model_name:number?。
使用?Simulink?標識符定位模塊圖組件
????????Simulink 標識符 (SID) 是自動分配給 Stateflow?圖中的 Simulink 模塊、模型注釋或 Stateflow 對象的唯一標識。SID 可幫助識別這些組件在模塊圖中的特定實例,尤其是在與團隊成員共享模型時。
????????要直觀地突出顯示模型中的某個組件,需要獲取該組件的 SID 并在Simulink.ID.hilite函數中使用。
????????SID 具有以下特征:
-
在 Simulink 模塊、模型注釋或 Stateflow 對象的生命周期內保持不變
-
保存在模型文件中
-
即使模塊或對象名稱改變也保持不變
-
無法修改
????????SID 的格式為:
model_name:sid_number-
model_name 是模塊、注釋或 Stateflow 對象所在的模型的名稱。
-
sid_number 是模型中具有唯一性的編號,由 Simulink 指定。
????????在某些情況下,SID 包括額外的冒號,例如在用戶庫中的模塊實例上。
突出顯示模塊
(1)要打開模型 vdp,請在 MATLAB 命令提示符下輸入 vdp。
(2)獲取 Mu 模塊的 SID。
Simulink.ID.getSID('vdp/Mu')ans =vdp:4(3)使用 SID 突出顯示模塊。
Simulink.ID.hilite('vdp:4')????????模塊將在模型中突出顯示。
????????如圖所示:? ? ? ? ? ? ??
突出顯示注釋
(1)打開模型 vdp。
(2)選擇模塊圖頂部的注釋。
(3)獲取所選注釋的注釋對象。
ann = getSelectedAnnotations('vdp')ann =Simulink.Annotation(4)獲取注釋的 SID。
ann.SIDFullStringans =vdp:13(5)使用 SID 突出顯示注釋。
Simulink.ID.hilite('vdp:13')突出顯示?Stateflow?對象
(1)打開模型 sf_resolve_signal_object。
(2)獲取 Signal Object Chart Stateflow 對象的 SID:
Simulink.ID.getSID('sf_resolve_signal_object/Signal Object Chart')ans =sf_resolve_signal_object:1(3)使用 SID 突出顯示對象。
Simulink.ID.hilite('sf_resolve_signal_object:1')以編程方式指定顏色
????????在 MATLAB 命令行或 MATLAB 程序中,可以使用 set_param 命令設置決定模塊圖背景顏色以及模塊圖元素的背景顏色和前景顏色的參數。下表匯總了控制模塊圖顏色的參數。
| ScreenColor | 模塊圖背景 |
| BackgroundColor | 模塊和注釋背景 |
| ForegroundColor | 模塊和注釋前景 |
????????可將顏色參數設置為命名顏色或 RGB 值。例如,以下命令將當前選擇的系統或子系統的背景顏色設置為淺綠色:
set_param(gcs,'ScreenColor','[0.3, 0.9, 0.5]')總結
以上是生活随笔為你收集整理的Simulink 环境基础知识(五)--编程建模基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 选择明文攻击和选择密文攻击
- 下一篇: 我们开源了一个轻量的 Web IDE U