Следующие примеры показывают, как управлять диагностическими подавлениями программно.
Этот пример показывает, как получить доступ к метаданным симуляции, чтобы управлять диагностическими подавлениями и восстановить диагностические сообщения программно.
Создайте новую папку и скопируйте соответствующие файлы
Создайте локальную рабочую папку, например, c:\diagnostic_suppressor_demo
.
Изменитесь на папку docroot\toolbox\simulink\examples
. В командной строке MATLAB®, введите:
cd(fullfile(docroot, 'toolbox', 'simulink', 'examples'))
Скопируйте 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 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));
Simulink.SimulationMetadata
| Simulink.SuppressedDiagnostic
| Simulink.SuppressedDiagnostic.restore
| Simulink.getSuppressedDiagnostics
| Simulink.restoreDiagnostic
| Simulink.suppressDiagnostic