仕様
- 0
- 0
- 0
Excelファイルの形式
- 0
- 0
- 0
- 0
- 0
- 0
0000
変数名 | データタイプ | データ型(Inportのみ) | データ型の表示(Inportのみ) |
DataStoreRead_Block01 | Read | ||
DataStoreWrite_Block01 | Write | ||
Goto_Block01 | Goto | ||
From_Block01 | From | ||
Inport_Block01 | Inport | uint8 | true ※記載なしの場合falseとなる |
Outport_Block | Outport |
MATLABスクリプト
MATLABのホームウィンドウから、「新規スクリプト」を作成し、下記のコードをコピペ
- ConditionsCheck.m
- CheckList.json
function ConditionsCheck(modelName)
% モデルを開く
load_system(modelName);
% サブシステムをすべて取得(階層すべて)
subsystems = find_system(modelName, 'BlockType', 'SubSystem');
% JSONファイルからチェックIDと保存先を読み込み
jsonData = jsondecode(fileread('CheckList.json'));
checkIDs = jsonData.checkIDs;
% % 保存パスの取得(なければポップアップで指定)
% if isfield(jsonData, 'savePath') && isfolder(jsonData.savePath)
% saveDir = jsonData.savePath;
% else
% saveDir = uigetdir(pwd, '保存先フォルダを選択してください');
% end
% モデル本体 + サブシステム対象をまとめる
allTargets = [{modelName}; subsystems];
% 結果表示
disp('【規約チェック 実行一覧】');
disp(allTargets);
WarnNum = 0; %最終的に表示する合計警告付き件数
ScssNum = 0; %最終的に表示する合計成功件数
ngFlg = 0;
%すべてまとめて規約チェック実行
Results = ModelAdvisor.run(allTargets, checkIDs);
%結果を表示する。
for i = 1:length(allTargets) %lengthの中はResultsがいい
ngFlg = 0;
ModelName = char(allTargets(i)); %ModelNameがcell配列であるためchar変換
%レポートで警告が発生した回数を記録する。
if Results{i}.numWarn > 0
WarnNum = WarnNum + 1;
else
ScssNum = ScssNum + 1;
end
%レポートで失敗or実行なしが発生した場合、表示を追加する。
if Results{i}.numFail > 0 || Results{i}.numNotRun > 0
ngFlg = 1;
end
%レポート結果を表示する。
disp(convertCharsToStrings('------------------------------'));
if ngFlg == 1
disp(convertCharsToStrings('!!NG!!NG!!NG!!NG!!NG!!NG!!NG!!'));
end
disp(convertCharsToStrings(['対象機能:',ModelName]));
disp(convertCharsToStrings([' 成功: ',num2str(Results{i}.numPass)]));
disp(convertCharsToStrings([' 警告: ',num2str(Results{i}.numWarn)]));
disp(convertCharsToStrings([' 失敗: ',num2str(Results{i}.numFail)]));
disp(convertCharsToStrings(['実行なし: ',num2str(Results{i}.numNotRun)]));
if ngFlg == 1
disp(convertCharsToStrings('!!NG!!NG!!NG!!NG!!NG!!NG!!NG!!'));
end
end
disp(convertCharsToStrings('------------------------------'));
disp(['警告なし件数:',num2str(ScssNum)]);
disp(['警告付き件数:',num2str(WarnNum)]);
disp(convertCharsToStrings('------------------------------'));
% 保存先の指定(ポップアップでフォルダ選択)
saveDir = uigetdir(pwd, 'レポートの保存先フォルダを選択してください');
if isequal(saveDir,0)
warning('保存先が指定されませんでした。レポートのコピーは行いません。');
else
% モデルファイルのフルパスとベース名を取得
modelFullPath = get_param(modelName, 'FileName');
[modelFileDir, modelBaseName, ~] = fileparts(modelFullPath);
% プロジェクトルート(Model_work)ディレクトリを取得
pathParts = strsplit(modelFileDir, filesep);
idx = find(strcmpi(pathParts, 'Model_work'), 1);
if ~isempty(idx)
projectRoot = fullfile(pathParts{1:idx});
else
projectRoot = modelFileDir;
end
% プロジェクトルート配下の work/slprj/modeladvisor フォルダを指定
reportSrcDir = fullfile(projectRoot, 'work', 'slprj', 'modeladvisor', modelBaseName);
reportDestDir = fullfile(saveDir, [modelBaseName '_advisor_report']);
if isfolder(reportSrcDir)
copyfile(reportSrcDir, reportDestDir, 'f');
fprintf('モデルアドバイザーレポートを以下にコピーしました:\n%s\n', reportDestDir);
else
warning('レポートフォルダが見つかりませんでした:%s', reportSrcDir);
end
end
end
{
"checkIDs": [
"mathworks.maab.jc_0011",
"mathworks.maab.jc_0021",
"MR_2101:Configuration Parameters",
"mathworks.maab.ar_0001",
"mathworks.maab.ar_0002",
"mathworks.maab.jc_0201",
"mathworks.maab.jc_0211",
"mathworks.maab.jc_0221",
"mathworks.maab.jc_0231",
"MR_3104:Block Name Length",
"MR_3104:Signal Line Name Length",
"MR_6102:Simulink Display Option",
"MR_6102:Simulink Drop Shadow and Port Labels",
"MR_6102:Simulink Block Color",
"mathworks.maab.db_0043",
"mathworks.maab.db_0081",
"mathworks.maab.db_0146",
"mathworks.maab.db_0081",
"mathworks.maab.na_0005",
"MR_6301:PermittedBlock",
"MR_6303:InputSameDataType",
"MR_6304:Add Sum Subtract",
"MR_6305:Product Divide Gain",
"mathworks.maab.jc_0131",
"MR_6307:Logical Operator",
"MR_6308:Switch_MultiportSwitch_SameDT",
"mathworks.maab.jc_0141",
"MR_6308:Switch_MultiportSwitch_InPortNum",
"MR_6308:Switch_MultiportSwitch_InPortDT",
"MR_6308:Switch_MultiportSwitch_DefaultCase",
"mathworks.maab.na_0011",
"MR_6314:Lookup Table",
"MR_6317:HCL2116",
"MR_6501:SampleTime"
],
"savePath": "C:/Users/YourName/Documents/SimulinkReports"
}
使用方法
スクリプトを保存
- 上記のコードを
という名前で保存しますgenerate_simulink_blocks
.m - 保存先は、MATLABの作業ディレクトリにしてください
※それ以外でも問題ないが、わかりにくくなるため
Simulinkモデルを準備
- モデルを作成または既存モデルを準備します
- 例:
my_model.slx
として保存
※良きせぬバグを防ぐため、新規モデルを作成し、そこに生成されたブロックをコピペで使用すること!
Excelファイルを準備
- 仕様どおりにExcelファイル(例:
)を作成し、データストア名とブロックタイプを記載しますgenerate_simulink_blocks
.xlsx
スクリプトを実行
- MATLABコマンドウィンドウで以下を入力します
※'
‘とgenerate_simulink_blocks
.xlsx'generate_models
‘は適宜変更してください
generate_simulink_blocks('generate_simulink_blocks.xlsx', 'generate_models');
全て同一ディレクトリ内に保存してください!
結果を確認
- コマンドウィンドウに生成されたデータの総数が表示され、エラーがないか確認
- 指定したSimulinkモデルを開き、ブロックが生成されていることを確認
スクリプトの説明
- Excelデータの読み込み
readtable
を使用してExcelファイルを読み込み、データストア名とブロックタイプを取得- 値の入力は、3行目から!!(1行目はヘッダー、2行目は空白)
- 座標計算
- 各ブロックの
Position
を基準に、yOffset
を加算して縦方向に並べる - ブロックの種類ごとに分けて生成
- 各ブロックの
- ブロックの生成
- ブロックタイプに応じて
add_block
を使用し、適切なブロックを追加
- ブロックタイプに応じて
- エラー処理
- 不明なブロックタイプは警告を表示
注意点
- モデルの保存前にバックアップを取ることをお勧めします
- Excelの列やシート名が異なる場合はコードを調整してください
your_model_name
を実際のモデル名に置き換えてください
6. よくある質問(FAQ)
Q1. 実行してもブロックが追加されません
- Excelのシート名が
Sheet1
になっているか確認してください。 - Simulinkモデルが保存されているか確認してください。
- コマンドを実行する際に、ExcelファイルとSimulinkモデルが同じフォルダにあるか確認してください。
Q2. 既存のブロックが削除されてしまうの?
- いいえ、このスクリプトは 既存のブロックには影響を与えず、新規ブロックを追加 します。
ただ、場合によっては不具合が発生する可能性があるので、空のモデルファイルを作って生成することを推奨します。
Q3. Inportの型が設定されていません
- Excelの C列 に適切なデータ型を記入してください。(例:
double
,int8
,uint16
) - 空欄の場合は
double
になります。
Q4. 追加のブロックタイプを増やしたい
- スクリプトの
BLOCK_SIZES
やpositions
に新しいブロックタイプを追加してください。
動作確認済 バージョン
- MATLAB Simulink 2018b(9.5.0.1586782)64-bit