Simulinkのシミュレーション結果を確認する方法は、主に次の3つだと思います。
- 信号線に接続されたScopeブロックを開く
- ScopeブロックやTo Workspaceブロックで、信号の履歴をMATLABのワークスペースに保存し、plotコマンドでグラフを描く
- To Fileブロックで、信号の履歴をMATファイルに保存し、後にMATLABでそのMATファイルを読み込んで、plotコマンドでグラフを描く
しかし、これらの方法は、確認したい変数の数や比較したい条件の数が少ない場合には良いのですが、変数や条件の数が増えてくると、非常に煩雑になってきます。
まず、1の方法では、確認したい変数が増えてくるとScopeの数が増え、どのScopeが何の変数を出力しているのか分かりにくくなります。また、ある変数と別の変数を重ねて比較したい場合には、両者の信号が同じScopeに入るようにSimulinkの配線を繋ぎ直してシミュレーションを再実行しなければなりません。さらに、シミュレーションを実行する度にScopeが上書きされるので、条件違いのシミュレーション結果を比較することができません。
2や3の方法は、1の方法よりも柔軟に変数同士の比較などができますが、確認したい変数や比較したい条件が多くなると、グラフ作成用のコードがだんだん煩雑になっていきます。また、別の変数同士を比較したいなど、グラフの変更または追加が必要な場合にはその度に一々コードを書き直さなければなりません。
このように、Simulinkのシミュレーション結果の確認は、変数や条件の数が増えてくるとすぐに煩雑になり、苦労されている方も多いのではないかと思います。そこで、この記事では、Simulinkのシミュレーション結果を、QuickPlotというツールを利用して素早く確認、比較する方法を提案します。
QuickPlotは、スカイ技術研究所が開発し、フリーで公開しているScilabモジュールです。詳しくは下記の記事で紹介しています。
尚、以下で紹介するSimulinkモデルおよびMATLABコードは、MATLAB R2017bで動作を確認したものです。
Simulinkモデルのセットアップ
例として、以下のような質量・バネ・ダンパで構成される1次元自由振動系のSimulinkモデル(MassSpringDamper.slx)を考えます。
上のSimulinkモデルは、次のパラメータ設定スクリプトを読み込んだ上で実行します。
% MassSpringDamper_Parameters.m dt = 0.1; %[s] sampling time m = 1; %[kg] mass k = 1; %[N/m] spring constant c = 1; %[Ns/m] damping coefficient x0 = 1; %[m] initial position v0 = 0; %[m/s] initial velocity
さて、シミュレーション結果をQuickPlotで確認するためには、変数の時系列データをCSV(カンマ区切り値)ファイルで保存する必要があります。以下、その方法を説明します。
まず、Simulinkモデル中の確認したい変数の信号線に、To Workspaceブロックを接続します。上のSimulinkモデルでは、時間をt、変位をx、速度をvというワークスペース変数に保存します。To Workspaceブロックのパラメータは、保存形式を「配列」にし、サンプル時間はすべてのTo Workspaceブロックで共通の値を設定します。上のSimulinkモデルでは、サンプル時間をdtとし、dtの値はパラメータ設定スクリプトで定義するようにしています。
ポスト処理スクリプト
シミュレーション実行後にTo Workspaceブロックでワークスペースに保存した変数の時系列データをCSVファイルに書き出すポスト処理スクリプトを以下のように作成します。
% MassSpringDamper_PostProcess.m variables = { t, 'time'; x, 'position'; v, 'velocity'; }; writeDataToFile('result.csv', variables, ',');
ここで、variablesはセル配列で、1列目に変数、2列目にラベル文字列を設定します。ラベルはCSVファイルの1行目に書き込まれます。ラベルは任意の文字列ですが、CSVファイルに書き込まれるためカンマを含まないようにします。
また、writeDataToFile()はデータをファイルに書き込む関数で、以下のように定義されます。
% writeDataToFile.m function writeDataToFile(filename, variables, delimiter) data = [variables{:,1}]; labels = {(variables{:,2})}; fid = fopen(filename, 'w'); fprintf(fid, '%s\n', strjoin(labels, delimiter)); fclose(fid); dlmwrite(filename, data, '-append', 'delimiter', delimiter); end
このポスト処理スクリプトを実行すると、variablesで指定された変数は以下のようなCSV形式でresult.csvに書き込まれ、保存されます。
ポスト処理スクリプトの自動実行
Simulinkモデルのメニューから、ファイル > モデル プロパティ > モデル プロパティを選択すると、「モデル プロパティ」ダイアログボックスが開きます。下図のように、「コールバック」タブにおいてStopFcnを選択し、シミュレーション ストップ関数に前項で作成したポスト処理スクリプトの名前を書き込み、OKボタンを押します。これで、シミュレーション終了後に自動的にポスト処理スクリプトが実行され、シミュレーション結果がCSVファイル「result.csv」に書き出されるようになります。
シミュレーションのバッチ実行
以下の関連ファイルが同じフォルダーに置いてあるとします。
- MassSpringDampler.slx(Simulinkモデルファイル)
- MassSpringDamper_Parameters.m(パラメータ設定スクリプト)
- MassSpringDamper_PostProcess.m(ポスト処理スクリプト)
- writeDataToFile.m(関数定義ファイル)
同フォルダーに次のようなスクリプトを作成すれば、バッチでシミュレーションを実行することができます。
% run_MassSpringDamper.m clear; % Simulation #1 MassSpringDamper_Parameters; sim('MassSpringDamper'); copyfile('result.csv', 'result_default.csv'); % Simulation #2 MassSpringDamper_Parameters; m = 2*m; sim('MassSpringDamper'); copyfile('result.csv', 'result_m_double.csv'); % Simulation #3 MassSpringDamper_Parameters; m = 0.5*m; sim('MassSpringDamper'); copyfile('result.csv', 'result_m_half.csv');
上のスクリプトでは、質量「m」の値をデフォルト、倍、半分と変えて、3回のシミュレーションを実行します。各シミュレーション後に書き出される結果ファイル「result.csv」は、それぞれ名前を変えて保存します。このスクリプトを実行すると、以下の3つの結果ファイルが生成されます。
- result_default.csv
- result_m_double.csv
- result_m_half.csv
QuickPlotでシミュレーション結果を確認
QuickPlotで上の3つの結果ファイルを読み込みます。
結果ファイル名と変数名を選択し、Add Curvesボタンを押せば、瞬時に下図のようなプロットが描画され、結果を素早く確認・比較できます。
以上のように、Simulinkのシミュレーション結果をCSVファイルで書き出す仕組みを作っておけば、変数の数や条件の数が多くなっても、QuickPlotを利用して簡単に素早くシミュレーション結果を確認、比較できます。
まとめ
この記事では、QuickPlotを利用してSimulinkのシミュレーション結果を確認する方法を提案しました。この方法を用いれば、Scopeやplotコマンドを用いるよりも、簡単に素早くシミュレーション結果を確認、比較できます。是非試してみてください。
コメント