規約チェック自動化


仕様

  1. 0
  2. 0
  3. 0

Excelファイルの形式

  • 0
  • 0
  • 0
    • 0
    • 0
    • 0

  0000

変数名データタイプデータ型(Inportのみ)データ型の表示(Inportのみ)
  
DataStoreRead_Block01Read
DataStoreWrite_Block01Write
Goto_Block01Goto
From_Block01From
Inport_Block01Inportuint8true ※記載なしの場合falseとなる
Outport_BlockOutport

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モデルを開き、ブロックが生成されていることを確認

スクリプトの説明

  1. Excelデータの読み込み
    • readtableを使用してExcelファイルを読み込み、データストア名とブロックタイプを取得
    • 値の入力は、3行目から!!(1行目はヘッダー、2行目は空白)
  2. 座標計算
    • 各ブロックのPositionを基準に、yOffsetを加算して縦方向に並べる
    • ブロックの種類ごとに分けて生成
  3. ブロックの生成
    • ブロックタイプに応じてadd_blockを使用し、適切なブロックを追加
  4. エラー処理
    • 不明なブロックタイプは警告を表示

注意点

  • モデルの保存前にバックアップを取ることをお勧めします
  • Excelの列やシート名が異なる場合はコードを調整してください
  • your_model_nameを実際のモデル名に置き換えてください

6. よくある質問(FAQ)

Q1. 実行してもブロックが追加されません
  • Excelのシート名が Sheet1 になっているか確認してください。
  • Simulinkモデルが保存されているか確認してください。
  • コマンドを実行する際に、ExcelファイルとSimulinkモデルが同じフォルダにあるか確認してください。
Q2. 既存のブロックが削除されてしまうの?
  • いいえ、このスクリプトは 既存のブロックには影響を与えず、新規ブロックを追加 します。
    ただ、場合によっては不具合が発生する可能性があるので、空のモデルファイルを作って生成することを推奨します。
Q3. Inportの型が設定されていません
  • Excelの C列 に適切なデータ型を記入してください。(例: double, int8, uint16
  • 空欄の場合は double になります。
Q4. 追加のブロックタイプを増やしたい
  • スクリプトの BLOCK_SIZESpositions に新しいブロックタイプを追加してください。

動作確認済 バージョン

  • MATLAB Simulink 2018b(9.5.0.1586782)64-bit

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