BusSelecto​rの入力信号のフィル​タ結果をMファイルか​らアクセスする

29 ビュー (過去 30 日間)
Mamoru Mabuchi
Mamoru Mabuchi 2021 年 5 月 26 日
回答済み: Mamoru Mabuchi 2021 年 5 月 30 日
下図のように、BusSelectorに入力した信号にフィルタをかけた結果を、Mファイルで取得したいです。
階層構造ではないバスならば、get_param(’untitled/BusSelector’,'InputSignals')で取得した後に検索すれば良いと思うのですが、
階層構造が複雑になってしまうと、どう処理して良いかわかりません。
BusSelectorのフィルタ結果を返すコマンドはありますか
もしくは、階層構造となったCell文字列から、要素を検索する方法はありますか。
アドバイスお願いいたします。

回答 (2 件)

Atsushi Ueno
Atsushi Ueno 2021 年 5 月 26 日
>BusSelectorのフィルタ結果を返すコマンドはありますか
質問文にあるget_paramの引数を’OutputSignals'にすれば、フィルタをかけた結果が得られます。
get_param('untitled/BusSelector','OutputSignals');
InputSignals:バス内信号 (行列 — {'{}'})
OutputSignals:選択した要素 (文字ベクトル — 'signal1,signal2' 形式)
  3 件のコメント
Atsushi Ueno
Atsushi Ueno 2021 年 5 月 26 日
やった事①:BusSelector等で用いる「フィルタ」機能をコマンドで使う方法を探す
分かった事①:当該方法が見つからない
やった事②:バスの階層を構造体として取得する
バス情報の表示 - MATLAB & Simulink - MathWorks 日本「バスの階層と仮想性のプログラムによる取得」
ph = get_param('untitled/BusSelector','PortHandles'); %バス情報を必要とする端子のハンドルを取得
sh = get_param(ph.Inport, 'SignalHierarchy'); %端子での信号の階層を取得
わかった事②:必要なのは信号名だけで、「階層構造となったCell文字列」と型が違うだけ
やった事③:「階層構造となったCell文字列」から文字列を検索する
myclstr = get_param(untitled/BusSelector,'InputSignals');
unpackcell('bus1', myclstr, 'd'); %「階層構造となったCell文字列」から文字列を検索する
function unpackcell(name, mycell, fword)
for i=1:size(mycell)
if iscell(mycell{i}) % セルなら同じ関数を再帰コール
unpackcell([name '.' mycell{i}{1}], mycell{i}{2}, fword);
elseif contains(mycell{i}, fword) % フィールドが検索文字列を含んでいたら表示
disp([name '.' mycell{i}]);
end
end
end
わかった事③:トップ階層のバス名を取りこぼす(文字列として与えた)。文字表示だけでフィルタ機能としてバス構造を出力していない。cellfunを適用できない。
次にやる事③:②で出力した構造体のフィールドを検索結果として出力できるようにする。また処理にはcellfunを使う
類似の質問を探したりもしましたが、トップコントリビュータは「プログラムで変数名を扱うべきではない」とコメントしており、なかなか目的にあう回答が見つかりません。しかし私は目的を理解しており、もっと良い方法があると思っているので、引き続き良い方法をさがして別回答にて回答するつもりです。

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


Mamoru Mabuchi
Mamoru Mabuchi 2021 年 5 月 30 日
ご丁寧な回答、ありがとうございました。
アドバイスいただいたunpackcellを、cellを分解した文字配列として取り込んだ後、contains関数を用いて候補を絞るように改造することで、やりたいことが解決いたしました。

カテゴリ

Find more on Model Compatibility 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!