【MATLAB/Simulink】ブロックのプロパティを一括変更する

Simulinkブロックの色などを変更する際、ブロックを右クリックしてメニューから変更することが多いと思います。

しかし大量のブロック、例えば1000個のブロックプロパティを変更しなければいけない場合、ひたすらブロックを右クリックしてプロパティ変更していくことは現実的ではありません。

そんな時にMATLABスクリプトでのブロックプロパティの変更方法を知っていると作業効率が飛躍的に向上します。

ここではSimulinkブロックのプロパティを一括で変更するスクリプトを紹介します。

スポンサーリンク

ブロックプロパティをスクリプトで変更

Simulinkブロックのプロパティ変更にはset_param関数を使用します

第1引数には変更したいブロックのパス、第2引数には変更したいブロックのプロパティ名、第3引数には変更後のプロパティを指定します。

まずは実際にset_param関数でプロパティを変更してみましょう。

例としてInportブロックのポート番号を1から2に変更します。

図のようにInportブロックを選択した状態で以下のコマンドを実行します。

set_param(gcb, 'Port', '2');

実行後のモデルは以下のようになりました。

確かに選択していたInportブロックのポート番号が変化しています。

例としてポート番号を変更してみましたが、名前や色など、変更できるプロパティはほぼ全て同じように変更することができます。

ブロックプロパティをまとめて変更

set_param関数を使用してブロックのプロパティを一気に変更する具体例です。モデル内のすべてのInportブロックの背景色を赤色に変更してみます。

% 全てのInportブロックのパスを取得
blockList = find_system(gcs, 'BlockType', 'Inport');

% 背景色を赤色に設定
for icnt = 1 : length(blockList)
    set_param(blockList{icnt}, 'BackGroundColor', 'Red');
end

実行後のモデルは以下の通りです。

全てのInportブロックが確かに赤色に変化しました。このようにブロックのプロパティを何個でもまとめて変えてしまうことができるため使用すると作業効率が大幅にアップします。

スクリプトの注意点

スクリプトを書く際の注意点として以下のことが挙げられます。

  1. find_system関数で戻ってくる配列は文字列が入ったセル配列なので配列番号の指定には通常の”()”ではなく”{}”を使用する
  2. get_param関数と異なりfind_system関数の戻り値をそのまま使用するとエラーになる

1についてですが、セル配列の中身を取り出したい場合は”{}”を使用します。セル配列の配列番号を”()”で指定するとサイズ1のセル配列が返ってきます。

見出し

配列の要素指定ですが、慣れてくるとセル配列に対しても”()”を使用する場面は結構でてきます。しかし最初のうちはセル配列には”{}”、普通の配列には”()”を使うと覚えておけばOKです。

2についてですが、get_param関数でブロックプロパティをまとめて取得する場合には以下のようにfind_system関数で戻ってきた、ブロックパスが格納されたセル配列を直接get_param関数に指定することができました。

blockList = find_system(gcs, 'BlockType', 'Inport');
bgColorList = get_param(blockList, 'BackGroundColor')

これはget_param関数がセル配列を受け入れてくれるという性質があるので行えました。しかしset_param関数が受け入れてくれるものは文字列だけです。そのため

blockList = find_system(gcs, 'BlockType', 'Inport');
set_param(blockList, 'BackGroundColor', 'Red');

このようにfind_system関数で戻ってきたセル配列を指定するとエラーとなってしまいます。

set_param関数には文字列を指定しなければいけないためセル配列の中身のブロックパス文字列を指定しなければいけないためfor文でループし、1つずつ文字列を取り出しながらset_param関数を実行しています。

set_param関数はセル配列を受け付けないと書きましたが、 cellfun関数を使用することでセル配列を指定することができます。

cellfun(@(x) set_param(x, 'BackGroundColor', 'Red', blockList);

cellfun関数を使用すればset_param関数に限らずどんな処理に対してもセル配列を使用できるので、大抵の場合forループが不要にり、1行で書くことができます。

ループ処理を使わないことのメリットとして、わざわざスクリプトファイルを作らなくてもコマンドウインドウにコマンドを打つだけで処理を実行できることがあげられます。

プロパティ名を調べる方法

変更したいプロパティのプロパティ名が分からないという場合ですが、ブロックを選択した状態で

get(gcbh)

と入力するとブロックのプロパティ一覧が表示されるので、それらしいプロパティを見つけることができます。

Simulinkブロックプロパティ変更まとめ

ブロックプロパティの変更はfind_system関数とset_param関数を使用することで効率的に行うことができます。

ぜひ使用してみてください。

コメント

タイトルとURLをコピーしました