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

조회 수: 4 (최근 30일)
A.T
A.T 2023년 4월 21일
댓글: A.T 2023년 4월 24일
以下のようなヘッダーとデータレコードを持つようなバイナリ形式の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ブロックとをつなげて
実現可能であればご教授頂きたいです。

채택된 답변

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

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 プログラムによるモデル編集에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!