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

9 Ansichten (letzte 30 Tage)
A.T
A.T am 21 Apr. 2023
Kommentiert: A.T am 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ブロックとをつなげて
実現可能であればご教授頂きたいです。

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte

Community Treasure Hunt

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

Start Hunting!