Simulinkでデ​ータ型の異なるCon​stantブロックを​バス配列とする方法

5 ビュー (過去 30 日間)
A.T
A.T 2023 年 4 月 11 日
コメント済み: A.T 2023 年 4 月 20 日
添付のようなSimulinkモデル(※)を作成しています。
SimulinkモデルはConstantブロックの値をそれぞれBusCreatorでバス配列にしMatlabFunctionの入力としています。
このとき、Constantブロックのデータ型が異なる場合、BusCreatorブロックを用いることは不可能なのでしょうか。
Webで調べたところ、BusCreatorブロックの出力の型をバスエディタで定義したバス型であれば、
用いることが可能なようなのですが、今後Constantブロックの数(数百)や種類(int32,double,boolen)が多くなるため、
出来るだけ簡単に定義せずにバス配列(構造体)を扱えるようにしたいです。
・バス型とせずにConstantブロック1~5をそのままMatlabFunctionの入力とするとMatlabFunctionの入力が多くなってしまうため、避けたいです。
BusCreatorブロックでなくとも他のブロックで実現可能であれば他のブロックを使いたいです。
(※)作ろうとしているSimulinkモデルの詳細な説明
InputOutputConstantブロック(Parameter)からなるようなSimulinkモデルを作成しようとしています。
また、最終的には作成したモデルを.fmuファイル(スタンドアロンFMU)にしようとしています。
このとき、ModelWorkspaceSimulinkParameterを作成し、Argumentにチェックを入れ、Constantブロックの値を
ModelWorkspaceで作成したSimulinkParameterとすることで.fmuファイルにエクスポートした際にParameterとして認識するようにしています。
このようにしている理由として、
・シミュレーション時間ごとに異なる値をInputから取得
・シミュレーション時間によらず一定値をParameterから取得
した後、InputParameterから計算した値をOutputに出力するシステムを考えているからです。
お手数ですが、ご回答宜しくお願い致します。

採用された回答

交感神経優位なあかべぇ
交感神経優位なあかべぇ 2023 年 4 月 19 日
編集済み: 交感神経優位なあかべぇ 2023 年 4 月 19 日
バス型を定義するのが面倒ということでしたら、バス型を定義するスクリプトを作成するのはいかがでしょうか?
下記は、開いているモデルのモデルワークスペースに保存しているSimulink.Parameterから、バス型の定義と、定義したパラメーターの構造体データを作成するスクリプトです。(ただし、Simulink.Parameterのデータ型定義にautoを使用している場合はエラーになりますので、全てのパラメーターにデータ型定義を行う必要があります。)
ws = get_param(bdroot, 'ModelWorkspace');
elements = Simulink.BusElement.empty;
wsdata = ws.data();% モデルワークスペース内の全データを取得
structVal = 'struct(';
for i = 1 : length(wsdata)
name = wsdata(i).Name;
val = wsdata(i).Value;
if isa(val, 'Simulink.Parameter') && ~strcmp(val.DataType, 'Bus: mybus')% Simulink.Parameterのみ選択
% Simulink.Parameterに定義した値をバスエレメントにコピーしていく
e = Simulink.BusElement;
e.Name = name;
e.DataType= val.DataType;
e.Complexity = val.Complexity;
e.Unit = val.Unit;
e.Min = val.Min;
e.Max = val.Max;
e.Description = val.Description;
if val.Dimensions == -1
e.Dimensions = 1; % データサイズの継承設定はとりあえず1に設定
else
e.Dimensions = val.Dimensions;
end
elements(end + 1, 1) = e;
structVal = [structVal, '''', name, ''',', name, ','];
end
end
structVal(end) = ')';
bus = Simulink.Bus;
bus.Elements = elements;
assignin('base', 'mybus', bus); % バス型はとりあえずベースワークスペースに保存
param = Simulink.Parameter; % 定義したバス型のデータを出力するSimulink.Parameterを作成
param.Value = slexpr(structVal);
param.DataType = 'Bus: mybus';
ws.assignin('myparam', param);% モデルワークスペースに定義
モデルワークスペース内にA,B,Cのパラメーターがあるモデルの場合、上記スクリプトを実行すると、A,B,Cの要素を持つバス型(mybus)と、そのバス型の値を出力するmyparamが定義され、下記図のように使用できます。
  1 件のコメント
A.T
A.T 2023 年 4 月 20 日
スクリプトを作成ありがとうございます。
スクリプト実行後の図も用意して頂き、分かりやすくて助かりました。
スクリプト参考に自分のものを作成しようと思います。

サインインしてコメントする。

その他の回答 (1 件)

stozaki
stozaki 2023 年 4 月 18 日
constantブロックからバス信号を生成し、MATLAB Functionに入力し、簡単な計算結果を出力するサンプルモデルを作成しました。.matファイルをロードしてから.slxを実行してください
以下のURLに詳しい説明がありますが、バスオブジェクトは作成していますか?
また、以下URLのMATLAB Functionの欄を見て頂くと、「Simulink.Bus オブジェクト データ型によって定義されている場合は入力としてのバーチャル バスをサポートします。出力バスは非バーチャルです。」と記載があります。
バスオブジェクトについては、以下URLを参考にしてください。
  1 件のコメント
A.T
A.T 2023 年 4 月 20 日
サンプルプログラムありがとうございます。
バスオブジェクトは作成していなかったので作成して対応します。
参考となるURLの提示もありがとうございます。

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeSimulink Function についてさらに検索

Community Treasure Hunt

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

Start Hunting!