最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

プログラムによる診断メッセージの非表示

以下の例では、診断の非表示をプログラムによって管理する方法を示します。

プログラムによる診断メッセージの非表示

この例では、診断の非表示を管理したり、診断メッセージをプログラムによって復元するために、シミュレーション メタデータにアクセスする方法を示します。

新規フォルダーの作成と関連ファイルのコピー

  1. ローカルの作業フォルダー (例: c:\diagnostic_suppressor_demo) を作成します。

  2. docroot\toolbox\simulink\examples フォルダーに変更します。MATLAB® コマンド ラインで以下のように入力します。

    cd(fullfile(docroot, 'toolbox', 'simulink', 'examples')) 

  3. getDiagnosticObjects.msuppressor_script.m、および Suppressor_CLI_Demo.slx のファイルを、ローカルの作業フォルダーにコピーします。

    関数 getDiagnosticObjects.m は、シミュレーション メタデータを照会して、シミュレーション中にスローされた診断にアクセスします。suppressor_script.m スクリプトには、Suppressor_CLI_Demo モデルに対する診断を非表示または元に戻すためのコマンドが含まれます。

     getDiagnosticObjects.m

モデルを開いてシミュレート

モデルを開きます。Simulink.SimulationMetadata にアクセスするには、ReturnWorkspaceOutputs パラメーター値を 'on' に設定します。モデルのシミュレーションを実行します。

model = 'Suppressor_CLI_Demo';
open_system(model);
set_param(model,'ReturnWorkspaceOutputs','on');
out = sim(model);

シミュレーション メタデータからのメッセージ識別子の取得

MSLDiagnostic オブジェクトに格納されているシミュレーション メタデータを使用して、診断メッセージ識別子の名前を検索します。

if (exist('out', 'var'))
    diag_objects = getDiagnosticObjects(out);
end

シミュレーション中は、Data Type Converter ブロックの飽和を含む複数の警告が生成されます。変数 diag_objects を照会して、識別子に関する情報をさらに取得します。

diag_objects(5)
ans = 

  MSLDiagnostic with properties:

    identifier: 'SimulinkFixedPoint:util:Saturationoccurred'
       message: 'Saturation occurred. This originated from 'Suppressor_CLI_Demo/Con…'
         paths: {'Suppressor_CLI_Demo/Convert/FixPt To FixPt3'}
         cause: {}
         stack: [0×1 struct]

ブロックでの飽和に関する診断を非表示

関数 Simulink.suppressDiagnostic を使用して、Data Type Conversion ブロックでの飽和診断のみを非表示にします。モデルのシミュレーションを実行します。

Simulink.suppressDiagnostic('Suppressor_CLI_Demo/Convert/FixPt To FixPt3', ...
'SimulinkFixedPoint:util:Saturationoccurred');
set_param(model,'SimulationCommand','start');

飽和診断の復元

関数 Simulink.restoreDiagnostic を使用して、同じブロックの飽和診断を復元します。

Simulink.restoreDiagnostic('Suppressor_CLI_Demo/Convert/FixPt To FixPt3',...
 'SimulinkFixedPoint:util:Saturationoccurred');
set_param(model,'SimulationCommand','start');

1 つのソースでの複数の診断を非表示

メッセージ識別子の cell 配列を作成して、1 つのソースの複数の警告を非表示にできます。モデル内の Constant ブロック one の桁落ちおよびパラメーターのアンダーフローの警告を非表示にします。

diags = {'SimulinkFixedPoint:util:fxpParameterPrecisionLoss',...
 'SimulinkFixedPoint:util:fxpParameterUnderflow'};
Simulink.suppressDiagnostic('Suppressor_CLI_Demo/one',diags);
set_param(model,'SimulationCommand','start');

ブロックのすべての診断の復元

関数 Simulink.restoreDiagnostic を使用して、特定のブロックでのすべての診断を復元します。

Simulink.restoreDiagnostic('Suppressor_CLI_Demo/one');
set_param(model,'SimulationCommand','start');

複数ブロックの診断の非表示

複数のブロック上の 1 つ以上の診断を非表示にできます。たとえば、関数 find_system を使用して、システム内のすべての Data Type Converter ブロックの cell 配列を作成して、指定されたブロックのすべての飽和に関する警告を非表示にします。

dtc_blocks = find_system('Suppressor_CLI_Demo/Convert',...
 'BlockType', 'DataTypeConversion');
Simulink.suppressDiagnostic(dtc_blocks, 'SimulinkFixedPoint:util:Saturationoccurred');
set_param(model,'SimulationCommand','start');

サブシステム内部のすべての診断の復元

関数 Simulink.restoreDiagnostic を使用して、指定されたサブシステム内部のすべての診断を復元します。

Simulink.restoreDiagnostic('Suppressor_CLI_Demo/Convert',...
 'FindAll', 'On');
set_param(model,'SimulationCommand','start');

非表示へのコメントおよびユーザー情報の追加

SuppressedDiagnostic オブジェクトには、非表示のソースに関する情報および非表示にされた診断メッセージ識別子が含まれています。コメントおよび最後に非表示を修正したユーザーの名前を含めることもできます。

Object = Simulink.SuppressedDiagnostic('Suppressor_CLI_Demo/Convert/FixPt To FixPt1',...
 'SimulinkFixedPoint:util:Saturationoccurred');
Object.Comments = 'Reviewed: John Doe';
Object.LastModifiedBy = 'Joe Schmoe'
set_param(model,'SimulationCommand','start');
Object = 

  SuppressedDiagnostic with properties:

            Source: 'Suppressor_CLI_Demo/Convert/FixPt To FixPt1'
                Id: 'SimulinkFixedPoint:util:Saturationoccurred'
    LastModifiedBy: 'Joe Schmoe'
          Comments: 'Reviewed: John Doe'
      LastModified: '2016-Jun-21 18:23:01'

非表示データの取得

特定のサブシステムまたはブロックの非表示データを取得するには、関数 Simulink.getSuppressedDiagnostics を使用します。

Object = Simulink.getSuppressedDiagnostics('Suppressor_CLI_Demo/Convert/FixPt To FixPt1');
set_param(model,'SimulationCommand','start');

モデルでのすべての診断の復元

モデルで複数の診断が非表示にされている場合、そしてすべての診断をモデルに復元する場合、関数 Simulink.getSuppressedDiagnostics を使用して配列を Simulink.SuppressedDiagnostic オブジェクトに復元します。次に、Simulink.SuppressedDiagnostic.restore メソッドを使用して配列を反復します。

Objects = Simulink.getSuppressedDiagnostics('Suppressor_CLI_Demo');
for iter = 1:numel(Objects)
    restore(Objects(iter));
end
set_param(model,'SimulationCommand','start');

参照モデルの診断メッセージの非表示

この例では、診断が参照モデルから生じたものである場合にその診断を非表示にする方法を示します。警告の特定インスタンスの MSLDiagnostic オブジェクトにアクセスすると、参照モデルが指定した最上位モデルからシミュレートされた場合のインスタンスの警告のみを非表示にできます。

このモデル例には、同じ参照モデル RefModel の 2 つのインスタンスが含まれています。モデル RefModel はさらに別のモデル RefModel_Low を参照しています。RefModel_Low には 2 つの Gain ブロックが含まれており、それぞれがシミュレーション中のオーバーフロー時のラップに関する警告を生成します。モデル内にあるこの警告の 4 つのインスタンスのいずれかを非表示にするには、Ref_block1 で参照されている場合にのみ、RefModel_Low モデル内のいずれかの Gain ブロックによって生成されるオーバーフロー警告時のラップに関連付けられている MSLDiagnostic オブジェクトにアクセスします。

最上位モデルを開きます。モデルのシミュレーションを実行し、出力を変数 out に格納します。

out = sim('TopModel');

MSLDiagnostic オブジェクトに格納されているシミュレーション メタデータにアクセスします。

diag = getDiagnosticObjects(out)
diag = 

  1×4 MSLDiagnostic array with properties:

    identifier
    message
    paths
    cause
    stack

診断ビューアーまたはコマンド ラインで診断とその原因を確認できます。

for i = 1 : numel(diag)
    disp(diag(i));
    disp(diag(i).cause{1});
end

特定の診断にアクセスすることで、TopModel/Ref_block1 からシミュレートされた場合にのみ、RefModel_Low からのオーバーフロー時のラップに関する警告のいずれかを非表示にします。モデルのシミュレーションを実行します。

Simulink.suppressDiagnostic(diag(1));
out = sim('TopModel')

シミュレーション メタデータにアクセスします。このシミュレーションでは 3 つの警告のみが生成されています。

diag = getDiagnosticObjects(out)
diag = 

  1×3 MSLDiagnostic array with properties:

    identifier
    message
    paths
    cause
    stack

モデルに対する診断を元に戻します。

Simulink.restoreDiagnostic(diag(1));

参考

| | | | |