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

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

Answers (2)

Atsushi Ueno
Atsushi Ueno on 26 May 2021
>BusSelectorのフィルタ結果を返すコマンドはありますか
質問文にあるget_paramの引数を’OutputSignals'にすれば、フィルタをかけた結果が得られます。
get_param('untitled/BusSelector','OutputSignals');
InputSignals:バス内信号 (行列 — {'{}'})
OutputSignals:選択した要素 (文字ベクトル — 'signal1,signal2' 形式)
  3 Comments
Atsushi Ueno
Atsushi Ueno on 26 May 2021
やった事①: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を使う
類似の質問を探したりもしましたが、トップコントリビュータは「プログラムで変数名を扱うべきではない」とコメントしており、なかなか目的にあう回答が見つかりません。しかし私は目的を理解しており、もっと良い方法があると思っているので、引き続き良い方法をさがして別回答にて回答するつもりです。

Sign in to comment.


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

Community Treasure Hunt

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

Start Hunting!