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

15 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
的外れな回答で申し訳ありません。
Bus Selectorのフィルタ結果ではなく、フィルタ処理自体が必要なのですね。このフィルタ処理は「Bus Selector」のみならず「信号階層ビューア」や「バス要素の値の表示」でも使える機能ですね。詳細は別回答とさせて頂きます。
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関数を用いて候補を絞るように改造することで、やりたいことが解決いたしました。

Categories

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

Products

Community Treasure Hunt

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

Start Hunting!