MATLAB-Simulink 整合與程式化模擬速查表
MATLAB-Simulink 整合與程式化模擬速查表
當你需要自動化修改 Simulink 裡的模塊參數(例如 Gain 的數值、Transfer Function 的係數),並且讓它自動執行時,請使用這套「程式化模擬 (Programmatic Simulation)」語法。
1. 載入、開啟與關閉模型
在用程式控制之前,通常需要先將模型載入到電腦記憶體中。
model_name = 'my_model'; % 你的 Simulink 檔名 (不要加 .slx)
% 1. 載入模型 (只放在記憶體,畫面不會跳出來,跑迴圈時最快!)
load_system(model_name);
% 2. 開啟模型 (如果需要讓畫面跳出來給你看)
open_system(model_name);
% ... 中間執行修改參數與模擬 ...
% 3. 關閉模型
close_system(model_name, 0); % 第二個參數 0 代表「不儲存變更直接關閉」,1 代表「儲存變更」
2. 讀取與修改模型內的模塊參數 (超重要 ⚠️)
這是大家最常卡關的地方!要修改 Simulink 裡的模塊,你必須知道它的**「路徑」**。
路徑格式為:模型名稱/模塊名稱 (例如:my_model/Controller/Kp_Gain)。
⚠️ 核心陷阱:在 Simulink 裡用程式設定參數時,數值通常必須是「字串 (String/Char)」,不能直接丟數字!
語法:get_param (獲取參數) 與 set_param (設定參數)
block_path = 'my_model/Gain_Block'; % 假設模型裡有一個 Gain 模塊叫做 Gain_Block
% 【讀取】目前的 Gain 數值
current_gain = get_param(block_path, 'Gain');
disp(['目前的 Gain 是:', current_gain]);
% 【修改】將 Gain 的數值改成 10.5
% 注意!不能寫 10.5,必須用 num2str(10.5) 或直接寫 '10.5' 轉成字串!
set_param(block_path, 'Gain', '10.5');
% 【修改求解器步長】(這就是為什麼前面教的 MaxStep 可以這樣設)
set_param(model_name, 'MaxStep', '0.01');
3. 現代官方強推寫法:Simulink.SimulationInput (R2019a 之後適用)
過去大家都在迴圈裡狂用 set_param,但這有個致命缺點:它會真的改動你的模型檔案,如果你忘記改回來,下次打開模型參數就全亂了。
現代 MATLAB 提供了一個超強物件 SimulationInput,它可以**「只在這次模擬中暫時替換參數,模擬結束後模型毫髮無傷」**。強烈推薦用這個寫法!
% 1. 建立一個針對該模型的 SimulationInput 物件
simIn = Simulink.SimulationInput('my_model');
% 2. 暫時修改模塊參數 (不會存入 .slx 檔案)
simIn = simIn.setBlockParameter('my_model/Gain_Block', 'Gain', '15.2');
simIn = simIn.setBlockParameter('my_model/Step_Input', 'Time', '2');
% 3. 暫時修改模型整體設定 (例如 StopTime 或步長)
simIn = simIn.setModelParameter('StopTime', '20');
simIn = simIn.setModelParameter('MaxStep', '0.01');
% 4. 執行模擬 (把剛剛包裝好的 simIn 丟進 sim 函數)
out = sim(simIn);
% 5. 抓取資料來畫圖
plot(out.tout, out.sim_result);
4. 實戰終極範例:將自訂變數傳入 Simulink (Base Workspace 連結)
有時候你要改的參數太多,用 setBlockParameter 一個一個設太慢了。
最專業的做法是:在 Simulink 的模塊裡,不要填數字,直接填入變數名稱(例如在 Gain 模塊裡面填 my_Kp)。
接著,透過 MATLAB 腳本設定 my_Kp 的值,並使用 setVariable 把它塞給 Simulink 模擬:
% 假設 Simulink 模型中的 Gain 模塊設定為 my_Kp,積分模塊設定為 my_Ki
% 1. 建立 SimulationInput 物件
simIn = Simulink.SimulationInput('my_model');
% 2. 將 MATLAB 工作區的變數值,指派給 Simulink 內部使用
simIn = simIn.setVariable('my_Kp', 2.5); % 這裡可以直接丟數字!
simIn = simIn.setVariable('my_Ki', 0.1);
% 3. 執行模擬
out = sim(simIn);
這招在配合 for 迴圈做參數掃描(Parameter Sweep)或是做 PID 參數自動調校時,是最乾淨、最不容易出錯的做法!