Следующие примеры показывают, как управлять подавлениями диагностики программно.
В этом примере показано, как получить доступ к метаданным симуляции для управления подавлениями диагностики и программного восстановления диагностических сообщений.
Создайте новую папку и скопируйте соответствующие файлы
Создайте локальную рабочую папку, например c:\diagnostic_suppressor_demo
.
Измените на docroot\toolbox\simulink\examples
папка. В MATLAB® в командной строке введите:
cd(fullfile(docroot, 'toolbox', 'simulink', 'examples'))
Скопируйте getDiagnosticObjects.m
, suppressor_script.m
, и Suppressor_CLI_Demo.slx
файлы в локальную рабочую папку.
The getDiagnosticObjects.m
функция запрашивает метаданные симуляции для доступа к диагностике, которая была выдана во время симуляции. The 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)
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
функция для создания массива ячеек из всех блоков Data Type Conversion в системе и подавления всех предупреждений о насыщении в заданных блоках.
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
содержит два блока Gain, каждый из которых выдает перенос о предупреждении переполнения во время симуляции. Подавить один из четырёх образцов этого предупреждения в модели путем доступа к MSLDiagnostic
объект, сопоставленный с переносом на предупреждение о переполнении, созданное одним из блоков Gain в 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));
restore
| Simulink.getSuppressedDiagnostics
| Simulink.restoreDiagnostic
| Simulink.SimulationMetadata
| Simulink.suppressDiagnostic
| Simulink.SuppressedDiagnostic