Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

C++ からの Simulink シミュレーションの実行

シミュレーションを実行する MATLAB コマンド

C++ 用の MATLAB® エンジン API を使用して Simulink® シミュレーションを実行することができます。プログラムによりシミュレーションを実行するための基本的な手順は以下のとおりです。

  • MATLAB セッションを開始します。

  • MATLAB 関数 load_system (Simulink) を使用して、Simulink モデルを MATLAB に読み込みます。

  • MATLAB 関数 sim (Simulink) を使用して、特定のシミュレーション パラメーターを設定してシミュレーションを実行します。

  • 返された Simulink.SimulationOuput (Simulink) オブジェクトのメソッドを使用して、シミュレーションの結果にアクセスします。

MATLAB からプログラムによりシミュレーションを実行する方法の詳細については、個々のシミュレーションの実行 (Simulink)を参照してください。

C++ からの Simulink vdp モデル

Simulink の vdp ブロック線図は、2 階微分方程式であるファン デル ポールの方程式をシミュレートします。Simulink は、モデルによって定義された初期条件と構成パラメーターを使用して方程式を解きます。

シミュレーションを実行するための MATLAB コード

次の MATLAB コードは、シミュレーションをプログラムによって実行するためのコマンドを示しています。Simulink.SimulationOuput オブジェクトの get メソッドは、結果と時間ベクトルを返します。

load_system('vdp');
parameterStruct.SaveOutput = 'on';
parameterStruct.OutputSaveName = 'yOut';
parameterStruct.SaveTime = 'on';
parameterStruct.TimeSaveName = 'tOut';
simOut = sim('vdp',parameterStruct);
y = simOut.get('yOut');
t = simOut.get('tOut');

次の MATLAB コードはシミュレーション出力のグラフを作成し、そのグラフを JPEG イメージ ファイルにエクスポートします。

plot(t,y)
print('vdpSimulation','-djpeg')

シミュレーションを実行するための C++ コード

このサンプル コードは、vdp モデルを使用して Simulink シミュレーションを実行します。コードは次の操作を実行します。

  • Simulink がインストールされた名前付き MATLAB セッションに接続する。

  • matlab::data::ArrayFactory を作成し、シミュレーション パラメーターが含まれた StructArray をビルドする。

  • シミュレーション パラメーター構造体を MATLAB ワークスペースに渡す。

  • MATLABEngine::evalAsync への非同期呼び出しを使用して、vdp Simulink モデルを読み込む。MATLAB がモデルを読み込むまで、実行が待機されます。

  • MATLABEngine::evalAsync への別の非同期呼び出しを使用してシミュレーションを実行する。シミュレーションが終了するまで、実行が待機されます。

  • シミュレーション データを Simulink.SimulationOutput オブジェクトから MATLAB ワークスペースに抽出する。

  • MATLAB コマンドを実行する MATLABEngine::eval を使用して、データをグラフ化して JPEG イメージを MATLAB の現在のフォルダーにエクスポートする。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
#include <chrono>
#include <iostream>

void runSimulation() {

    using namespace matlab::engine;
    
    // Connect to named shared MATLAB session started as:
    // matlab -r "matlab.engine.shareEngine('myMatlabEngine')"
    String session(u"myMatlabEngine");
    std::unique_ptr<MATLABEngine> matlabPtr = connectMATLAB(session);

    // Create MATLAB data array factory
    matlab::data::ArrayFactory factory;
    
    // Create struct for simulation parameters
    matlab::data::StructArray parameterStruct = factory.createStructArray({ 1,4 }, {
        "SaveOutput",
        "OutputSaveName",
        "SaveTime",
        "TimeSaveName" });
    parameterStruct[0]["SaveOutput"] = factory.createCharArray("on");
    parameterStruct[0]["OutputSaveName"] = factory.createCharArray("yOut");
    parameterStruct[0]["SaveTime"] = factory.createCharArray("on");
    parameterStruct[0]["TimeSaveName"] = factory.createCharArray("tOut");

    // Put simulation parameter struct in MATLAB
    matlabPtr->setVariable(u"parameterStruct", parameterStruct);

    // Load vdp Simulink model
    FutureResult<void> loadFuture = matlabPtr->evalAsync(u"load_system('vdp')");
    std::cout << "Loading Simulink model... " << std::endl;
    std::future_status loadStatus;
    do {
        loadStatus = loadFuture.wait_for(std::chrono::seconds(1));
    } while (loadStatus != std::future_status::ready);
    std::cout << "vdp model loaded\n";

    // Run simulation
    FutureResult<void> simFuture = matlabPtr->evalAsync(u"simOut = sim('vdp',parameterStruct);");
    std::cout << "Running simulation... " << std::endl;
    std::future_status simStatus;
    do {
        simStatus = loadFuture.wait_for(std::chrono::seconds(1));
    } while (simStatus != std::future_status::ready);
    std::cout << "vdp simulation complete\n";

    // Get simulation data and create a graph
    matlabPtr->eval(u"y = simOut.get('yOut');");
    matlabPtr->eval(u"t = simOut.get('tOut');");
    matlabPtr->eval(u"plot(t,y)");
    matlabPtr->eval(u"pause(10)");
    matlabPtr->eval(u"print('vdpSimulation','-djpeg')");
}

C++ エンジン プログラムを設定およびビルドする方法の詳細については、C++ エンジン プログラムのビルドを参照してください。

参考

| |

関連するトピック