ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

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

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

  • MATLAB エンジン オブジェクトを作成して MATLAB セッションを開始します。

  • MATLAB に Simulink モデルを読み込みます (load_system)。

  • 特定のシミュレーション パラメーターを設定してシミュレーションを実行します (sim)。

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

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

Java からの vdp モデルの実行

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

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

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

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

データのグラフ化

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

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

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

次の Java コードは Simulink vdp モデルのシミュレーションを実行し、結果を Java に返します。この実装により、以下の処理が実行されます。

  • MATLAB エンジン オブジェクトを作成して MATLAB セッションを開始します。

  • MATLAB load_system コマンドを呼び出して Simulink を起動し、vdp モデルを非同期的に読み込みます。Future が返されるまでタスクをポーリングします。

  • MATLAB sim コマンドを呼び出してシミュレーション パラメーターを設定し、シミュレーションを実行します。Future が返されるまでタスクをポーリングします。

  • シミュレーションの結果を取得します。関数 sim の出力は MATLAB Simulink.SimulationOuput オブジェクトであり、これは MATLAB ベース ワークスペースで作成されます。

    エンジン API はこのタイプのオブジェクトをサポートしていません。そのため、この例ではオブジェクトの get メソッドを使用して MATLAB ワークスペースのシミュレーション データにアクセスしています。

  • シミュレーション データのグラフィックスを作成して、このグラフを JPEG ファイルにエクスポートします。

  • シミュレーション結果と時間ベクトルを double 配列として Java に返します。

import com.mathworks.engine.*;
import java.util.concurrent.Future;
import java.util.Arrays;

public class RunSimulation {
    public static void main(String[] args) throws Exception {
        MatlabEngine eng = MatlabEngine.startMatlab();
        Future<Void>  fLoad = eng.evalAsync("load_system('vdp')");
        while (!fLoad.isDone()){
            System.out.println("Loading Simulink model...");
            Thread.sleep(10000);
        }
        Future<Void> fSim = eng.evalAsync("simOut = sim('vdp','SaveOutput'," +
                "'on','OutputSaveName','yOut'," +
                "'SaveTime','on','TimeSaveName','tOut');");
        while (!fSim.isDone()) {
            System.out.println("Running Simulation...");
            Thread.sleep(10000);
        }
        // Get simulation data
        eng.eval("y = simOut.get('yOut');");
        eng.eval("t = simOut.get('tOut');");
        // Graph results and create image file
        eng.eval("plot(t,y)");
        eng.eval("print('vdpPlot','-djpeg')");
        // Return results to Java
        double[][] y = eng.getVariable("y");
        double[] t = eng.getVariable("t");
        // Display results
        System.out.println("Simulation result " + Arrays.deepToString(y));
        System.out.println("Time vector " + Arrays.toString(t));
        eng.close();
    }
}

関連するトピック