目次
はじめに
Simulinkモデルを作り込んでいくと、ブロックパラメーターの変数名を後からまとめて変更したくなることがよくある。 例えば、接頭辞(prefix)を付けたり、接尾辞(suffix)を変えたり…。 手作業でやるとミスが出やすいのと、数が多いと人力ではやってられないので、MATLABスクリプトで一括変換してしまおう。
処理の流れ
大雑把な流れは
- すべてのダイアログ・パラメーターを取得
- ダイアログ・パラメーター名の一覧を抽出
- 各パラメーターの現在の値 (変数名)を取得
- 文字列置換で新しい変数名に置き換え
である。
下の例では、正規表現を使って新しい変数名をもとの変数名から生成している。
注意点
パラメーター値が数値や構造体の場合は文字列置換できないので、条件で除外しておく必要がある。
注意: このスクリプトはモデル内の全ブロックに対して置換を実行する。 実行前に必ずモデルを保存しておこう。 正規表現のパターンによっては、意図しない変数名まで置換される可能性がある。
コード例
%%
%%
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の操作をいくつか覚えておくと仕事の効率が向上する。