# MATLAB-Simulink 整合與程式化模擬速查表

# MATLAB-Simulink 整合與程式化模擬速查表

當你需要自動化修改 Simulink 裡的模塊參數（例如 Gain 的數值、Transfer Function 的係數），並且讓它自動執行時，請使用這套「程式化模擬 (Programmatic Simulation)」語法。

---

## 1. 載入、開啟與關閉模型

在用程式控制之前，通常需要先將模型載入到電腦記憶體中。

```matlab
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` (設定參數)

```matlab
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`，它可以**「只在這次模擬中暫時替換參數，模擬結束後模型毫髮無傷」**。強烈推薦用這個寫法！

```matlab
% 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 模擬：

```matlab
% 假設 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 參數自動調校時，是最乾淨、最不容易出錯的做法！