Подавите диагностические сообщения программно

Следующие примеры показывают, как управлять диагностическими подавлениями программно.

Подавите диагностические сообщения программно

Этот пример показывает, как получить доступ к метаданным симуляции, чтобы управлять диагностическими подавлениями и восстановить диагностические сообщения программно.

Создайте новую папку и скопируйте соответствующие файлы

  1. Создайте локальную рабочую папку, например, c:\diagnostic_suppressor_demo.

  2. Изменитесь на папку docroot\toolbox\simulink\examples. В командной строке MATLAB®, введите:

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

  3. Скопируйте getDiagnosticObjects.m, suppressor_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, чтобы подавить диагностику насыщения на блоке преобразования типа данных только. Моделируйте модель.

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');

Подавите несколько объектов диагностики на источнике

Можно подавить несколько предупреждений на одном источнике путем создания массива ячеек идентификаторов сообщений. Подавите потерю точности и предупреждения потери значимости параметра блока 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');

Подавите диагностику на многих блоках

Можно подавить одну или несколько диагностики на многих блоках. Например, используйте функцию find_system, чтобы создать массив ячеек всех блоков Конвертера Типа данных в системе и подавить все предупреждения насыщения на заданных блоках.

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. Ссылки модели RefModel еще одна модель, RefModel_Low. RefModel_Low содержит два блока Усиления, что каждый производит перенос на предупреждении переполнения во время симуляции. Подавите один из четырех экземпляров этого предупреждения в модели путем доступа к объекту MSLDiagnostic, сопоставленному с переносом на предупреждении переполнения, произведенном одним из блоков Усиления в модели RefModel_Low только, когда на это сошлется Ref_block1.

Откройте топ-модель. Моделируйте модель и сохраните вывод в переменной, 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

Подавите один из переноса на предупреждениях переполнения от RefModel_Low только, когда это будет моделироваться от TopModel/Ref_block1 путем доступа к определенной диагностике. Моделируйте модель.

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

Доступ к метаданным симуляции. Эта симуляция произвела только три предупреждения.

diag = getDiagnosticObjects(out)
diag = 

  1×3 MSLDiagnostic array with properties:

    identifier
    message
    paths
    cause
    stack

Восстановите диагностику к модели.

Simulink.restoreDiagnostic(diag(1));

Смотрите также

| | | | |