Simlinkで構造体を使用したい

67 views (last 30 days)
Kento SHIRAKATA
Kento SHIRAKATA on 19 Jul 2019
Commented: Toshinobu Shintai on 21 Jul 2019
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に渡したいです.

Accepted Answer

Toshinobu Shintai
Toshinobu Shintai on 21 Jul 2019
承知しました。
おそらくすでにご理解いただいていると思いますが、
現状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 Comments
Kento SHIRAKATA
Kento SHIRAKATA on 21 Jul 2019
ご丁寧に説明してくださり,ありがとうございます.
調べながらトライしてみます.
Toshinobu Shintai
Toshinobu Shintai on 21 Jul 2019
今更ですが、文字列を無くした数値のみの構造体にした時点で
ワークスペースのdataをMATLAB Functionに読み込むことができていますので
その設定を各MATLAB Functionですればよいだけでした。
回りくどい提案をしてしまい、すみませんでした。

Sign in to comment.

More Answers (1)

Toshinobu Shintai
Toshinobu Shintai on 19 Jul 2019
ワークスペースに構造体が定義されているのであれば、
以下の画像のように「Constant」や「String Constant」に直接入力することで使用することができます。
この方法で問題ありませんでしょうか。
img.png
  1 Comment
Kento SHIRAKATA
Kento SHIRAKATA on 20 Jul 2019
Shintani様
ありがとうございます.しかし,ワークスペース上の「data」のすべてを,異なるmatlab functionに渡したいと考えています.
すると,膨大な数のConstant, String Constantが必要です.
また,構造体にあらたなfieldを加えたいときに,いちいちブロックをつけたし,矢印を結合させるのは,かなり手間かと...
ですので,dataのみをブロックで表して,変数の受け渡しをする方法を探しております.

Sign in to comment.

Categories

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

Community Treasure Hunt

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

Start Hunting!