Simulinkにおけるバイナリ形式datファイルの参照方法に関して
5 views (last 30 days)
Show older comments
以下のようなヘッダーとデータレコードを持つようなバイナリ形式のdatファイルをsimulinkのMatlabFunctionブロック上で
読み込んで計算に用いる処理を行いたいです。
datファイル仕様サンプル――――――――――――――――――――――――――――――――――――――――――――――
ヘッダ1.1 4バイト(開始日時)
ヘッダ1.2 4バイト(データレコードNの個数)
データレコード1.1 4バイト→日時1日
データレコード1.2 4バイト→降水量200mm/h
データレコード2.1 4バイト→日時2日
データレコード2.2 4バイト→降水量300mm/h
データレコード3.1 4バイト→日時3日
データレコード3.2 4バイト→降水量0mm/h
・
・
・
データレコードN.1 4バイト→日時N日
データレコードN.2 4バイト→降水量XXXmm/h
datファイル仕様サンプル――――――――――――――――――――――――――――――――――――――――――――――
上記は例として示しており、ヘッダがファイルの先頭にあり、以降日付と降水量のデータレコードがN個並んでいるようなdatファイルの構造です。
なお、例として文字を用いていますが、中身はすべて整数です。
.mファイルであればfopen()でdatファイルを開いたのちfread()でレコードごとに読み込むことで
各日時における降水量を取得して計算に使うことができるのですが、MatlabFunctionで同様のプログラムを実行すると
ヘッダ等を読み込んだ際のサイズが[:?×1]となってしまい、「スカラー値が必要です。この式はサイズ [:? x 1] をもっています。」
とエラーが出てしまいます。
調べたところ、matファイルやスプレッドシートであれば、From Spreadsheetブロック等を使ってできそうではあるのですが、可能であればバイナリ形式のファイルから
直接読み出してSimulinkのMatlabFunctionで使えるようにしたいです。
MatlabFunctionブロック上で直接読めなくても、何かしらのブロックとMatlabFunctionブロックとをつなげて
実現可能であればご教授頂きたいです。
0 Comments
Accepted Answer
Toshinobu Shintai
on 21 Apr 2023
一番簡単なのは、MATLAB Function ブロックで"coder.extrinsic"を使う方法です。このコマンドで指定した関数をコード生成から除外するため、fopenなど、Simulinkで対応していない関数を使うことができます。
MATLABのスクリプトで以下のように関数を定義し、
function data = my_func()
%%
file_ID = fopen("data.dat");
data = fread(file_ID);
end
data.datを以下のように作成しました。
MATLAB Functionブロックで以下のように記述すると、
データを取り出すことができます。
3 Comments
Toshinobu Shintai
on 24 Apr 2023
①について
上限サイズが分かれば、以下のリンク先で紹介されています可変サイズ信号を使って定義することはできます。
しかし、信号の上限サイズも不明である場合は、Simulinkでは可変サイズの信号を扱うことができません。Simulinkの性質上、メモリ動的割り当てをむやみに使わないように、制限を課しています。
②について
FMUエクスポートの制限事項については、以下のリンク先に記載があります。
おそらく方式によると思いますが、ツールカップリング方式であればできそうです。
他の環境でも実行できるようにするということであれば、S-Function BuilderなどでC言語でファイル操作を記述する方が、より汎用なモデルになるかと思います。
More Answers (0)
See Also
Categories
Find more on プログラムによるモデル編集 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!