前の記事で、Simulinkのシミュレーション結果をQuickplotで確認する方法について書きました。
この記事はそのScilab/Xcos版です。
Xcosのシミュレーション結果を確認する方法は、主に次の2つだと思います。
- 信号線にScopeブロック(CSCOPEなど)を接続する
- To Workspaceブロック(TOWS_c)で、信号の履歴をScilabのワークスペースに保存し、plotコマンドでグラフを描く
しかし、これらの方法は、確認したい変数の数や比較したい条件の数が少ない場合には良いのですが、変数や条件の数が増えてくると、非常に煩雑になってきます。
まず、1の方法では、確認したい変数の数が増えてくるとScopeの数が増え、どのScopeが何の変数を出力しているのか分かりにくくなります。また、ある変数と別の変数を重ねて比較したい場合には、両者の信号が同じScopeに入るようにXcosの配線を繋ぎ直してシミュレーションを再実行しなければなりません。さらに、シミュレーションを実行する度にScopeが上書きされるので、条件違いのシミュレーション結果を比較することができません。
2の方法は、1の方法よりも柔軟に変数同士の比較などができますが、確認したい変数や比較したい条件が多くなると、グラフ作成用のコードがだんだん煩雑になっていきます。また、別の変数同士を比較したいなど、グラフの変更または追加が必要な場合にはその度に一々コードを書き直さなければなりません。
このように、Xcosのシミュレーション結果の確認は、変数や条件の数が増えてくるとすぐに煩雑になり、苦労されている方も多いのではないかと思います。そこで、この記事では、Xcosのシミュレーション結果を、QuickPlotというツールを利用して素早く確認、比較する方法を提案します。
QuickPlotは、スカイ技術研究所が開発し、フリーで公開しているScilabモジュールです。詳しくは下記の記事で紹介しています。
尚、以下で紹介するXcosモデルおよびScilabコードはScilab 6.1で動作を確認したものです。
Xcosモデルのセットアップ
例として、以下のような質量・バネ・ダンパで構成される1次元自由振動系のXcosモデル(MassSpringDamper.zcos)を考えます。
上のXcosモデルのコンテキストは次のように設定されています。
さて、シミュレーション結果をQuickPlotで確認するためには、変数の時系列データをCSV(カンマ区切り値)ファイルで保存する必要があります。以下、その方法を説明します。
まず、Xcosモデル中の確認したい変数の信号線に、To Workspaceブロックを接続します。上のXcosモデルでは、時間をtime、位置をpos、速度をvelというワークスペース変数に保存します。
ポスト処理スクリプト
シミュレーション実行後にTo Workspaceブロックでワークスペースに保存した変数の時系列データをCSVファイルに書き出すポスト処理スクリプトを以下のように作成します。
// MassSpringDamper_PostProcess.sce exec('writeDataToFile.sci'); variables = { time.values, 'time'; pos.values, 'position'; vel.values, 'velocity'; }; writeDataToFile('result.csv', variables, ',');
ここで、variablesはセル配列で、1列目に変数、2列目にラベル文字列を設定します。ラベルはCSVファイルの1行目に書き込まれます。ラベルは任意の文字列ですが、CSVファイルに書き込まれるためカンマを含まないようにします。
また、writeDataToFile()はデータをファイルに書き込む関数で、以下のように定義されます。
// writeDataToFile.sci function writeDataToFile(filename, variables, delimiter) data = []; labels = ''; n_var = size(variables, 1) for i = 1:n_var data(:,i) = variables{i,1}; labels = labels + variables{i,2}; if i ~= n_var labels = labels + delimiter; end end csvWrite(data, filename, delimiter, '.', [], labels); endfunction
このポスト処理スクリプトを実行すると、variablesで指定された変数の時系列データは以下のようなCSV形式でresult.csvに書き込まれ、保存されます
シミュレーションのバッチ実行
以下の関連ファイルが同じフォルダーに置いてあるとします。
- MassSpringDamper.zcos(Xcosモデルファイル)
- MassSpringDamper_PostProcess.sce(ポスト処理スクリプト)
- writeDataToFile.sci(関数定義ファイル)
同フォルダーに次のようなスクリプトを作成すれば、バッチでシミュレーションを実行することができます。
// run_MassSpringDamper.sce clear; importXcosDiagram('MassSpringDamper.zcos'); function post_xcos_simulate(%cpr, scs_m, needcompile) exec('MassSpringDamper_PostProcess.sce'); endfunction default_context = scs_m.props.context; // Simulation #1 xcos_simulate(scs_m, 4); copyfile('result.csv', 'result_default.csv'); // Simulation #2 scs_m.props.context = [default_context; 'm = 2*m']; xcos_simulate(scs_m, 4); copyfile('result.csv', 'result_m_double.csv'); // Simulation #2 scs_m.props.context = [default_context; 'm = 0.5*m']; xcos_simulate(scs_m, 4); copyfile('result.csv', 'result_m_half.csv');
上のスクリプトでは、質量「m」の値をデフォルト、倍、半分と変えて、3回のシミュレーションを実行します。post_xcos_simulate()はシミュレーションの後に自動実行される関数で、この中で前項で作成したポスト処理スクリプトを実行するように設定しておきます。各シミュレーション後に書き出される結果ファイル「result.csv」は、それぞれ名前を変えて保存します。このスクリプトを実行すると、以下の3つの結果ファイルが生成されます。
- result_default.csv
- result_m_double.csv
- result_m_half.csv
QuickPlotでシミュレーション結果を確認
QuickPlotで上の3つの結果ファイルを読み込みます。
結果ファイル名と変数名を選択し、Add Curvesボタンを押せば、瞬時に下図のようなプロットが描画され、結果を素早く確認・比較できます。
以上のように、Xcosのシミュレーション結果をCSVファイルで書き出す仕組みを作っておけば、変数の数や条件の数が多くなっても、QuickPlotを利用して簡単に素早くシミュレーション結果を確認、比較できます。
まとめ
この記事では、QuickPlotを利用してXcosのシミュレーション結果を確認する方法を提案しました。この方法を用いれば、Scopeやplotコマンドを用いるよりも、簡単に素早くシミュレーション結果を確認、比較できます。是非試してみてください。
コメント