Simulinkにお​けるバイナリ形式da​tファイルの参照方法​に関して

5 views (last 30 days)
A.T
A.T on 21 Apr 2023
Commented: A.T on 24 Apr 2023
以下のようなヘッダーとデータレコードを持つようなバイナリ形式のdatファイルをsimulinkMatlabFunctionブロック上で
読み込んで計算に用いる処理を行いたいです。
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ブロック等を使ってできそうではあるのですが、可能であればバイナリ形式のファイルから
直接読み出してSimulinkMatlabFunctionで使えるようにしたいです。
MatlabFunctionブロック上で直接読めなくても、何かしらのブロックとMatlabFunctionブロックとをつなげて
実現可能であればご教授頂きたいです。

Accepted Answer

Toshinobu Shintai
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
Toshinobu Shintai on 24 Apr 2023
①について
上限サイズが分かれば、以下のリンク先で紹介されています可変サイズ信号を使って定義することはできます。
しかし、信号の上限サイズも不明である場合は、Simulinkでは可変サイズの信号を扱うことができません。Simulinkの性質上、メモリ動的割り当てをむやみに使わないように、制限を課しています。
②について
FMUエクスポートの制限事項については、以下のリンク先に記載があります。
おそらく方式によると思いますが、ツールカップリング方式であればできそうです。
他の環境でも実行できるようにするということであれば、S-Function BuilderなどでC言語でファイル操作を記述する方が、より汎用なモデルになるかと思います。
A.T
A.T on 24 Apr 2023
返信、誠にありがとうございます。
頂いた内容から、S-Function Builderを用いる方法等も検討してみようと思います。

Sign in to comment.

More Answers (0)

Categories

Find more on プログラムによるモデル編集 in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!