首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Simulink 與 VC++ 6.0 混合程式設計:MATLAB Engine 介面完整指南

     編輯:關於VC++

前言

Simulink 仿真需依賴 MATLAB 環境,透過 MATLAB Engine 介面可在 VC++ 應用程式中啟動 MATLAB 為後台計算引擎,實現參數傳遞、命令執行、結果取回。本文詳細說明 Engine API、VC++ 專案設定、Simulink 命令列仿真指令、資料類型轉換、Solver 選擇等實戰技巧。

一、MATLAB Engine API 核心函數

標頭檔:#include "engine.h"

二、VC++ 6.0 專案設定步驟

  1. 建立專案:Win32 Console / MFC AppWizard / Win32 Application
  2. 設定包含目錄:Tools → Options → Directories → Include Files 加入:
    • MATLAB_ROOT\extern\include
    • MATLAB_ROOT\extern\include\cpp
  3. 設定程式庫目錄:Library Files 加入:
    • MATLAB_ROOT\extern\lib\win32\microsoft\msvc60
  4. 加入連結庫:Project → Settings → Link → Object/Library modules: libeng.lib libmx.lib libmat.lib
  5. 原始檔包含標頭:#include "engine.h"

三、Simulink 命令列仿真指令

基本語法

[t, x, y] = sim('modelname')                           // 使用對話框參數
[t, x, y] = sim('modelname', timespan, options, ut)     // 指定參數
[t, x, y1...yn] = sim('modelname', timespan, options, ut) // 多輸出

參數說明

  • modelname:模型名稱 (不含 .mdl),需在 MATLAB 搜尋路徑
  • timespan:仿真時間區間
    • [] - 使用模型設定
    • Tfinal - 純量,終止時間
    • [Tstart, Tfinal] - 區間
    • 向量 - 指定輸出時間點
  • options:simset 建立的結構體,優先權最高,可覆蓋模型設定
  • ut:輸入資料矩陣 [t, u1, u2...],優先權最高

四、實戰關鍵技巧

4.1 Solver 選擇對仿真效能的影響

函數功能語法
engOpen啟動 MATLAB EngineEngine* engOpen(const char* startcmd) (Windows 傳 NULL)
engClose關閉 Engineint engClose(Engine* ep)
engEvalString執行 MATLAB 命令字串int engEvalString(Engine* ep, const char* cmd)
engGetArray從工作區取得變數mxArray* engGetArray(Engine* ep, const char* name)
engPutArray將變數放入工作區int engPutArray(Engine* ep, const mxArray* mp)
engOutputBuffer設定輸出緩衝區int engOutputBuffer(Engine* ep, char* buf, int len)
Solver類型適用場景
ode45Non-stiff, RK4/5 階通用連續系統,預設
ode23Non-stiff, RK2/3 階精度要求較低、速度優先
ode113Non-stiff, Adams PECE高精度、平滑系統
ode15sStiff, NDF 變階**剛性系統** (含斷路器/開關模型)
ode23sStiff, Rosenbrock 2階剛性、低精度需求
ode23tStiff, 梯形法則剛性 + DAE 三角系統
ode23tbStiff, TR-BDF2剛性、低階

關鍵經驗:可控整流電路故障模型屬剛性系統 (短路器模擬開路),必須選擇剛性 Solver (如 ode15s)。VC 中透過 engEvalString 設定 Solver 僅影響本次仿真,模型預設不變。雖 Simulink 仍可能警告,但實際仿真耗時可驗證 Solver 生效。

4.2 VC 資料類型 ↔ MATLAB mxArray 轉換

核心函數:mxCreateDoubleMatrix、mxGetPr、memcpy

// VC double[] → MATLAB mxArray (設定仿真時間)
double timespan[2] = { m_fStartTime, m_fStopTime };
mxArray* T = mxCreateDoubleMatrix(1, 2, mxREAL);
memcpy((char*)mxGetPr(T), (char*)timespan, 2 * sizeof(double));
engPutVariable(ep, "T", T); // 放入工作區

// MATLAB mxArray → VC double[] (讀取結果)
mxArray* Y = engGetArray(ep, "yout");
double result[100];
memcpy((char*)result, (char*)mxGetPr(Y), 100 * sizeof(double));

注意:mxGetPr 回傳 double* 指向資料區,memcpy 為最高效轉換方式。

五、完整流程範例

Engine* ep = engOpen(NULL);
if (!ep) return FALSE;

// 1. 載入模型
engEvalString(ep, "model = 'rectifier_fault';");
engEvalString(ep, "load_system(model);");

// 2. 設定參數 (Solver, 仿真時間)
engEvalString(ep, "set_param(model, 'Solver', 'ode15s', 'StopTime', '0.1');");

// 3. 傳遞輸入資料 (若有)
engPutVariable(ep, "T", T);
engPutVariable(ep, "U", U);

// 4. 執行仿真
engEvalString(ep, "[t, x, y] = sim(model, T, options, U);");

// 5. 取回結果
mxArray* Y = engGetArray(ep, "y");
// memcpy 取出資料...

// 6. 關閉
engEvalString(ep, "close_system(model, 0);");
engClose(ep);

六、常見問題與對策

  • Engine 啟動失敗:檢查 MATLAB 安裝路徑、版本相容性 (VC6 對應 MATLAB 6.5/7.x)、系統 PATH 包含 MATLAB_ROOT\bin\win32
  • 記憶體洩漏:mxArray* 取得後需 mxDestroyArray 釋放
  • 資料維度錯誤:Simulink 輸出常為 column-major,VC 為 row-major,注意轉置
  • 效能瓶頸:頻繁 engEvalString 開銷大,批次組合命令字串

結語

MATLAB Engine 為 VC++ 提供了強大的數學計算後台,配合 Simulink 命令列仿真,可構建「VC 前台介面 + MATLAB 後台計算」架構。掌握 Engine API、mxArray 轉換、Solver 選擇三大核心,即可高效完成混合程式開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved