MATLAB Answers

0

Simlinkで構造体を使用したい

Kento SHIRAKATA さんによって質問されました 2019 年 7 月 19 日
最新アクティビティ Toshinobu Shintai さんによって コメントされました 2019 年 7 月 21 日
Matlabで作成したシミュレーションを,Simlinkに移行しようとしています.
膨大な量のパラメータや条件を,グローバルな構造体で複数の関数に受け渡しています.
同じようなことをSimulinkでも行いたいです.
構造体を使うのは,すべて自分で用意したmatlab function内です.
グローバルな構造体は例えば
data.A.a = 1; data.A.b = 2; data.A.cd = [0 1];
data.B.typ = 'abc', data.B.d = 123;
data.C.C.C.c = [1 2 3; 4 5 6; 7 8 9];
といった具合に,最上階層はdataのみで,それ以下の階層では階層数や配列や文字列,数値が混在しています.
また初期化として,matalbコード上で構造体を作成し,ワークスペースからSimlinkに渡したいです.

  0 件のコメント

サインイン to comment.

2 件の回答

回答者: Toshinobu Shintai 2019 年 7 月 21 日
 採用された回答

承知しました。
おそらくすでにご理解いただいていると思いますが、
現状Simulinkでは文字列を含む構造体をMATLAB Functionブロックで扱えませんので
SHIRAKATA様のおっしゃっていることは実現できません。
申し訳ありません。
代替案として、文字列を数値(uint8)に置き換えたdata構造体を用意し
Simulinkに受け渡すことで疑似的に実現させることができます。
処理の流れは以下のようになります。
  1. これまで通りグローバルのdataを定義する
  2. 定義したdataの要素の中で、文字列であるものをuint8の配列に変換する
  3. dataの構造体の型と同じ構造のSimulinkバス型を作成する
  4. Simulinkモデル内でdata_SLという信号を生成するためのMATLAB Functionをあらかじめ作成しておき、data_SLのデータ型をdataの構造を持つデータ型に指定する
  5. MATLAB Functionブロック内でdata_SLにdataを代入する
  6. 信号として各MATLAB Functionに入力することでデータを渡す
サンプルモデルを作成しましたので添付ファイルをご確認ください。
MATLABのバージョンはR2019aを使用しています。
フォルダを解凍した後、作業ディレクトリをそのフォルダへ移動し
「param.m」を実行してください。
R2019aをお持ちでない場合は「test_model.zip」のWebビューでモデルをご確認ください。
このサンプルでは、2の処理が自動化できていません。
getfield関数を用いて自動化できますが、
一般化のためには関数の再帰呼び出しをしなければならず、複雑になるので今回は省略しました。
どうしても元のMATLABと同様にコーディングしたい場合は「Level-2 MATLAB S-Function」などを用いる必要があります。
ただしこちらは量産開発の制御設計用途には推奨されませんのでご注意ください。

  2 件のコメント

Kento SHIRAKATA 2019 年 7 月 21 日
ご丁寧に説明してくださり,ありがとうございます.
調べながらトライしてみます.
Toshinobu Shintai 2019 年 7 月 21 日
今更ですが、文字列を無くした数値のみの構造体にした時点で
ワークスペースのdataをMATLAB Functionに読み込むことができていますので
その設定を各MATLAB Functionですればよいだけでした。
回りくどい提案をしてしまい、すみませんでした。

サインイン to comment.


回答者: Toshinobu Shintai 2019 年 7 月 19 日

ワークスペースに構造体が定義されているのであれば、
以下の画像のように「Constant」や「String Constant」に直接入力することで使用することができます。
この方法で問題ありませんでしょうか。
img.png

  1 件のコメント

Kento SHIRAKATA 2019 年 7 月 20 日
Shintani様
ありがとうございます.しかし,ワークスペース上の「data」のすべてを,異なるmatlab functionに渡したいと考えています.
すると,膨大な数のConstant, String Constantが必要です.
また,構造体にあらたなfieldを加えたいときに,いちいちブロックをつけたし,矢印を結合させるのは,かなり手間かと...
ですので,dataのみをブロックで表して,変数の受け渡しをする方法を探しております.

サインイン to comment.