Simulink変数名を一括置換!MATLABスクリプトで効率アップ

はじめに

Simulinkモデルを作り込んでいくと、ブロックパラメーターの変数名を後からまとめて変更したくなることがよくある。 例えば、接頭辞(prefix)を付けたり、接尾辞(suffix)を変えたり…。 手作業でやるとミスが出やすいのと、数が多いと人力ではやってられないので、MATLABスクリプトで一括変換してしまおう。

処理の流れ

大雑把な流れは

  1. すべてのダイアログ・パラメーターを取得
  2. ダイアログ・パラメーター名の一覧を抽出
  3. 各パラメーターの現在の値 (変数名)を取得
  4. 文字列置換で新しい変数名に置き換え

である。

下の例では、正規表現を使って新しい変数名をもとの変数名から生成している。

注意点

パラメーター値が数値や構造体の場合は文字列置換できないので、条件で除外しておく必要がある。

注意: このスクリプトはモデル内の全ブロックに対して置換を実行する。 実行前に必ずモデルを保存しておこう。 正規表現のパターンによっては、意図しない変数名まで置換される可能性がある。

コード例

%%
%%
modelName = "hoge_model";
blockPaths = find_system(modelName, 'Type', 'Block');
pathNum = numel(blockPaths);

%%
orig_pattern = "orig_pattern";
new_pattern  = "new_pattern";
for ii = 1:pathNum
    blockName = blockPaths{ii};
    % すべてのダイアログ・パラメーターを取得
    dialogueParames = get_param(blockName, 'DialogParameters');
    if numel(dialogueParames)
        % ダイアログ・パラメーター名を取得
        dialogueParamNames = fieldnames(dialogueParames);
        paramNum = numel(dialogueParamNames);
        % すべてのダイアログパラメーターのパラメーター値を取得
        for jj = 1:paramNum
            dialogueParamName = dialogueParamNames{jj};
            param_val = get_param(blockName, dialogueParamName);
            % param_valがstringsでない場合にregexprepがエラーになる。
            idx = strfind(param_val, orig_pattern); % orig_patternが存在するかを検索 
             if numel(idx)
                 fprintf("%s value is %s.\n", dialogueParamName ,param_val)
                 new_string = regexprep(param_val, orig_pattern, new_pattern);
                 fprintf("%s param value %s is converted to  %s.\n", blockName, param_val, new_string)
                 set_param(blockName, dialogueParamName, new_string)
                 param_val = get_param(blockName, dialogueParamName);
                 fprintf("%s value is %s.\n", dialogueParamName ,param_val)
             end
        end
    end
end
%%

おわりに

こうしたスクリプトを使えば、大規模なモデルでも変数名整理が瞬殺できる。 同様の処理は応用が効くので、スクリプトによるSimulinkの操作をいくつか覚えておくと仕事の効率が向上する。