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

以下のようなヘッダーとデータレコードを持つようなバイナリ形式の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

A.T
A.T on 23 Apr 2023
回答ありがとうございます。
以下、申し訳ないのですが2点追加で質問よろしいでしょうか。
coder.extrinsic に関して調べたところ、以下のURLの記載のように変数 y を「初期化」して、配列の大きさを関数実行前に決める必要があります。
記載して頂いた内容の「y=zeros(16,1,’int32’)」の16が関数を呼ばないと不明な場合はこの方法は使えますでしょうか。
(元々のdatファイルの例だと、Ndatファイルを開かないと分からないため、返値の大きさは関数実行前だと分からない状態です)
coder.extrinsic を用いる方法はスタンドアロンFMU化した場合においても用いることはできるのでしょうか。
コード生成対象外という記載があるので、.fmuファイルとしたさい使えなくなるのではないかと危惧しております。
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

Products

Asked:

A.T
on 21 Apr 2023

Commented:

A.T
on 24 Apr 2023

Community Treasure Hunt

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

Start Hunting!