Simulinkでシミュレーションする際、Scopeブロックなどにつないで動きを見ることができますが、シミュレーションした結果を時系列データとしてcsvなどに保存するとエクセルや他の時系列データ解析ソフトなどで使用することができるので何かと便利です。
ここではシミュレーション結果をCSVファイルに変換する具体的な方法を解説したいと思います。
Scopeブロックの設定
まず最初に、シミュレーションした結果をデータとして残すためにはScopeブロックの設定を行う必要があり、以下のように”ワークスペースにデータのログを作成”にチェックを入れておく必要があります。
これを行うことでシミュレーション結果が”変数名”に設定した名前でワークスペースに保存されるようになります。
また保存形式ですが、特に理由が無ければ時間付き構造体のままで良いかと思います。
この設定を行ったところでシミュレーションを実施してみます。
そうすると、ワークスペースにoutという名前のオブジェクトが生成されます。
これをダブルクリックするとoutが保持しているプロパティ一覧が表示され、その中にScopeブロックのプロパティで設定した変数名の構造体が現れます。
旧バージョンのMATLABではScopeブロックの変数名に指定した名前の変数がoutのメンバーとしてではなく、そのままワークスペースに保存されるはずです。
シミュレーションした結果(時間、信号名、値)はこの中に格納されています。
スクリプト例
シミュレーション結果が保存される場所が分かったところで、ここからデータを上手く抜き出してCSVやエクエルとして保存するスクリプトを考えます。
今回は以下のように最上位の行にはヘッダーとして各信号の名前が表示され、以降の行に各信号のデータが表示されるようなフォーマットとしたいと思います。
そして、以下が作成したスクリプトです。
function sim2csv(dataList)
% 時間を取得
timeArray = dataList.time;
% データが格納されている構造体
sigNameList = arrayfun(@(x) x.label, dataList.signals, 'UniformOutput', false);
% 結果を保存するセル配列
retCell = cell(size(timeArray, 1) + 1, size(sigNameList, 2) + 1);
% ヘッダーを作成
% 1列目は時間を表す文字列(好きなものでOK)
retCell{1, 1} = 'time';
% 2列目以降には取得した信号名を格納
retCell(1, 2 : end) = sigNameList;
% 1列目の2行目以降に時間データを格納
retCell(2 : end, 1) = num2cell(timeArray);
% 2列目、2行目以降にそれぞれ信号線のデータを格納
for icnt = 1 : size(sigNameList, 2)
retCell(2 : end, icnt + 1) = num2cell(dataList.signals(icnt).values);
end
% 作成したセル配列をcsv形式で保存
fid = fopen('ret.csv', 'w');
for icnt = 1 : size(retCell, 1)
for jcnt = 1 : size(retCell, 2)
if icnt == 1 % 1行目は文字列
formatStr = '%s';
else % 2行目以降は数値
formatStr = '%f';
end
if jcnt ~= size(retCell, 2) % 最終列ではない場合はコンマ区切り
fprintf(fid, [formatStr, ','], retCell{icnt, jcnt});
else % 最終列の場合は改行
fprintf(fid, [formatStr, '\n'], retCell{icnt, jcnt});
end
end
end
% ファイルを閉じる
fclose(fid);
Scopeブロックに設定した変数名を引数として指定できるようにしています。
使い方
sim2csv.mというファイル名を新規作成し、このスクリプトを張り付けて保存します。
実際に使用するときは以下のようにコマンドを入力してください。
※昔のMATLABなら”out.”を除いてください
そうするとret.csvという名前のファイルが作成されます。
中身は以下のように時系列データとなっているはずです。
終わりに
ここで紹介したスクリプトですがMATLAB2019で動きは確認したのですが、新しいバージョンではなくても使えるはずです。
そのまま使ってもらっても良いですし、改造して使ってもらってももちろん問題ありません。自由に使ってください。
また処理に関して質問などあればお気軽にコメントしてください。
コメント