exponenta event banner

Подавление диагностических сообщений программным способом

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

Подавление диагностических сообщений программным способом

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

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

  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

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

Подавление множественной диагностики в источнике

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

Добавление комментариев и информации о пользователе к подавлению

A 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 объекты. Затем используйте 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

Диагностику и ее причины можно просмотреть в программе Diagnostic Viewer или в командной строке.

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

См. также

| | | | |