Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

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

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

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

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

モデルを開きます。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 Conversion ブロックの飽和を含む複数の警告が生成されます。変数 diag_objects を照会して、識別子に関する情報をさらに取得します。

  diag_objects(5)

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

関数 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 Conversion ブロックの 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');

非表示データの取得

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

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

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

モデルで複数の診断が非表示にされている場合、そしてすべての診断をモデルに復元する場合、関数 Simulink.getSuppressedDiagnostics を使用して 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 オブジェクトにアクセスします。

Model with two instances of referenced model RefModel.

RefModel_Low model block

Diagnostic Viewer window displaying the wrap on overflow warnings.

最上位モデルを開きます。モデルのシミュレーションを実行し、出力を変数 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));

参考

| | | | |