В этом примере показано, как создать индивидуально настраиваемую передачу/сбой Model Advisor, сверяются с действием фиксации. Когда модель не содержит нарушение проверки, результаты содержат описание проверки и состояние результата. Когда модель содержит нарушение проверки, результаты содержат описание проверки, состояние результата и рекомендуемое действие, чтобы устранить проблему. Этот пример добавляет собственную проверку в подпапку Model Advisor By Product > Demo.
В данном примере собственная проверка идентифицирует блоки, имена которых не появляются ниже блоков. Действие фиксации должно заставить имена блока появиться ниже блоков.
Этот пример также показывает вам, как собрать результаты в группы, которые нарушают проверку (то есть, подробные наборы результата), такие как блоки в подсистеме. В Model Advisor можно рассмотреть результаты путем выбора:
View By> Recommended Action ─, Когда проверка нарушена, это представление, показывает список элементов модели, которые нарушают проверку. Когда нет никакого нарушения, это представление предоставляет краткое описание, утверждая, что проверка не была нарушена.
View By> Subsystem ─ Это представление показывает таблицу элементов модели, которые нарушают проверку, организованную моделью или подсистемой (когда применимый).
View By> Block ─ Это представление предоставляет список нарушений проверки для каждого блока.
Когда проверка не передает, результаты включают гиперссылку на каждый элемент модели, который нарушает проверку. Используйте эти гиперссылки, чтобы легко определить местоположение областей в вашей модели или подсистеме. Код для этого примера состоит из sl_customization.m
файл и defineDetailStyleCheck.m
файл.
sl_customization
ФайлВ вашей рабочей папке создайте sl_customization.m
файл.
Чтобы указать собственные проверки, создайте sl_customization(cm)
функционируйте как показано здесь. Эта функция принимает один аргумент, менеджер по индивидуальной настройке объект. Менеджер по индивидуальной настройке объект включает addModelAdvisorCheckFcn
метод для регистрации собственной проверки. Вход к этому методу является указателем на функцию определения проверки.
function sl_customization(cm) % SL_CUSTOMIZATION - Model Advisor customization demonstration. % Copyright 2019 The MathWorks, Inc. % register custom checks cm.addModelAdvisorCheckFcn(@defineDetailStyleCheck); % ----------------------------- % defines Model Advisor Checks % ----------------------------- function defineDetailStyleCheck;
Функция определения проверки задает проверку, и зафиксируйте меры, которые принимает Model Advisor, когда вы осуществляете проверку. В данном примере завершенным файлом функции определения проверки является defineDetailStyleCheck.m
, и это содержит этот код:
function defineDetailStyleCheck mdladvRoot = ModelAdvisor.Root; % Create ModelAdvisor.Check object and set properties. rec = ModelAdvisor.Check('com.mathworks.sample.detailStyle'); rec.Title = 'Check whether block names appear below blocks'; rec.TitleTips = 'Check position of block names'; rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle'); % Create ModelAdvisor.Action object for setting fix operation. myAction = ModelAdvisor.Action; myAction.Name='Make block names appear below blocks'; myAction.Description='Click the button to place block names below blocks'; rec.setAction(myAction); myAction.setCallbackFcn(@ActionCB); mdladvRoot.publish(rec, 'Demo'); % publish check into Demo group. end % ----------------------------- % This callback function uses the DetailStyle CallbackStyle type. % ----------------------------- function DetailStyleCallback(system, CheckObj) mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % get object % Find all blocks whose name does not appear below blocks violationBlks = find_system(system, 'Type','block',... 'NamePlacement','alternate',... 'ShowName', 'on'); if isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail; ElementResults.IsInformer = true; ElementResults.Description = 'Identify blocks where the name is not displayed below the block.'; ElementResults.Status = 'All blocks have names displayed below the block.'; mdladvObj.setCheckResultStatus(true); else ElementResults(1,numel(violationBlks))=ModelAdvisor.ResultDetail; for i=1:numel(ElementResults) ElementResults(i).setData(violationBlks{i}); ElementResults(i).Description = 'Identify blocks where the name is not displayed below the block.'; ElementResults(i).Status = 'The following blocks have names that do not display below the blocks:'; ElementResults(i).RecAction = 'Change the location such that the block name is below the block.'; end mdladvObj.setCheckResultStatus(false); mdladvObj.setActionEnable(true); end CheckObj.setResultDetails(ElementResults); end % ----------------------------- % This action callback function changes the location of block names. % ----------------------------- function result = ActionCB(taskobj) mdladvObj = taskobj.MAObj; checkObj = taskobj.Check; resultDetailObjs = checkObj.ResultDetails; for i=1:numel(resultDetailObjs) % take some action for each of them block=Simulink.ID.getHandle(resultDetailObjs(i).Data); set_param(block,'NamePlacement','normal'); end result = ModelAdvisor.Text('Changed the location such that the block name is below the block.'); mdladvObj.setActionEnable(false); end
Следующие шаги объясняют, как создать завершенный defineDetailStyleCheck.m
файл.
Создайте ModelAdvisor.Root
объект.
mdladvRoot = ModelAdvisor.Root;
Создайте ModelAdvisor.Check
возразите и задайте уникальный ID проверки. Для этой проверки ID является com.mathworks.sample.detailStyle
.
rec = ModelAdvisor.Check('com.mathworks.sample.detailStyle');
Задайте ModelAdvisor.Check.Title
и ModelAdvisor.Check.TitleTips
свойства.
rec.Title = 'Check whether block names appear below blocks'; rec.TitleTips = 'Check position of block names';
Используйте setCallbackFcn
метод, чтобы вызвать функцию обратного вызова. setCallbackFcn
аргументы метода являются указателем на функцию обратного вызова и ModelAdvisor.Check.CallbackStyle
значение свойства. В данном примере CallbackStyle
значением свойства является DetailStyle
. Этот стиль позволяет вам просматривать результаты блоком, подсистемой или рекомендуемым действием. Применение этого стиля производит форматирование по умолчанию, так, чтобы вы не использовали ModelAdvisor.FormatTemplate
класс или другие API форматирования Model Advisor, чтобы отформатировать результаты, которые появляются в Model Advisor.
rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle');
Чтобы установить операцию фиксации, создайте ModelAdvisor.Action
возразите и задайте его свойства.
myAction = ModelAdvisor.Action; myAction.setCallbackFcn(@ActionCB); myAction.Name='Make block names appear below blocks'; myAction.Description='Click the button to place block names below blocks';
Используйте setCallback
метод, чтобы вызвать функцию обратного вызова действия. Вход к этому методу является указателем на функцию обратного вызова действия.
myAction.setCallbackFcn(@ActionCB);
Используйте setAction
метод, чтобы установить действие для проверки.
rec.setAction(myAction);
Используйте publish
метод, чтобы опубликовать проверку к папке в папке By Product. В данном примере именем папки является Demo.
mdladvRoot.publish(rec, 'Demo'); % publish check into Demo group.
В defineDetailStyleCheck.m
файл, создайте функцию обратного вызова проверки. В этом примере именем функции является DetailStyleCallback
. Входными параметрами к этой функции является ModelAdvisor.CheckObject
и путь к модели или системе, которую анализирует Model Advisor.
function DetailStyleCallback(system, CheckObj)
Создать Simulink.ModelAdvisor
объект, используйте Simulink.ModelAdvisor.getModelAdvisor
метод.
mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % get object
Чтобы идентифицировать блоки, которые нарушают проверку, используйте find_system
функция. Для каждого элемента модели эта функция создает ModelAdvisor.ResultDetail
объект.
violationBlks = find_system(system, 'Type','block',... 'NamePlacement','alternate',... 'ShowName', 'on');
Запишите код для случая когда find_system
функция не идентифицирует блоки, имена которых не появляются ниже блока. В этом случае, ElementResults
один экземпляр ModelAdvisor.ResultDetail
возразите и обеспечивает информационное содержимое только. Метод указывает, что нет никакого нарушения проверки и не отображает Passed в Model Advisor.
if isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail; ElementResults.IsInformer = true; ElementResults.Description = 'Identify blocks where the name is not displayed below the block.'; ElementResults.Status = 'All blocks have names displayed below the block.'; mdladvObj.setCheckResultStatus(true);
Запишите код для случая когда find_system
функция возвращает список блоков, имена которых не появляются ниже блока (violationBlks
). ElementResults
включает каждый ModelAdvisor.ResultDetail
объект, который нарушает проверку и предоставляет рекомендуемое сообщение действия для фиксации нарушения проверки.
Для этого случая, setCheckResultStatus
метод задает нарушение проверки и отображает Warning или Failed в Model Advisor. Simulink.ModelAdvisor.setActionEnable(true)
метод включает способности устранить проблему нарушения проверки от Model Advisor.
else ElementResults(1,numel(violationBlks))=ModelAdvisor.ResultDetail; for i=1:numel(ElementResults) ElementResults(i).setData(violationBlks{i}); ElementResults(i).Description = 'Identify blocks where the name is not displayed below the block.'; ElementResults(i).Status = 'The following blocks have names that do not display below the blocks:'; ElementResults(i).RecAction = 'Change the location such that the block name is below the block.'; end mdladvObj.setCheckResultStatus(false); mdladvObj.setActionEnable(true); end
Чтобы сопоставить результаты с объектом проверки, используйте setResultDetails
метод.
CheckObj.setResultDetails(ElementResults);
end
В defineDetailStyleCheck.m
файл, создайте функцию обратного вызова действия. В этом примере именем функции является sampleActionCB
. Входом к этой функции является ModelAdvisor.Task
объект.
function result = ActionCB(taskobj)
Создайте указатели на Simulink.ModelAdvisor
и ModelAdvisor.Check
объекты.
mdladvObj = taskobj.MAObj; checkObj = taskobj.Check;
Создайте массив ModelAdvisor.ResultDetail
объекты для того, чтобы хранить информацию для блоков, которые нарушают проверку.
resultDetailObjs = checkObj.ResultDetails;
Запишите код, который изменяет местоположение имени блока к ниже блока.
for i=1:numel(resultDetailObjs) % take some action for each of them block=Simulink.ID.getHandle(resultDetailObjs(i).Data); set_param(block,'NamePlacement','normal'); end result = ModelAdvisor.Text('Changed the location such that the block name is below the block.');
Отключите поле Action.
mdladvObj.setActionEnable(false);
Сохраните sl_customization.m
и defineDetailStyleCheck.m
файлы.
В окне команды MATLAB, введите:
Advisor.Manager.refresh_customizations
Из окна MATLAB откройте sldemo_fuelsys
модель.
В топ-модели щелкните правой кнопкой по Engine Speed
блокируйте и выберите Rotate & Flip> Flip Block Name.
Откройте fuel_rate_control
подсистема. Щелкните правой кнопкой по validate_sample_time
блокируйте и выберите Rotate & Flip> Flip Block Name.
Возвратитесь к топ-модели и сохраните как example_sldemo_fuelsys
.
Во вкладке Modeling выберите Model Advisor. Диалоговое окно System Selector ― Model Advisor открывается. Нажмите OK. Model Advisor открывается.
На левой панели выберите By Product > Demo > Check whether block names appear below blocks.
Примечание
Если папка By Product не отображена в окне Model Advisor, выберите Settings> Preferences> Show By Product Folder
Выберите Run This Check. Проверка Model Advisor перестала работать для блоков, которые вы изменили.
Рассмотрите результаты путем выбора одной из опций View by.
Отчет обеспечивает рекомендуемое действие для каждой проверки. Можно кликнуть по пути к гиперссылке, чтобы открыть блок нарушения в редакторе моделей. Например:
Следуйте за рекомендуемым действием для фиксации блоков нарушения при помощи одного из этих методов:
Обновите каждое нарушение индивидуально путем двойного клика по гиперссылке, чтобы открыть блок. Щелкните правой кнопкой по блоку и выберите Rotate & Flip> Flip Block Name.
Нажмите кнопку Make block names appear below blocks. Model Advisor автоматически фиксирует проблемы в модели. Заметьте, что кнопка недоступна после того, как нарушения фиксируются.
Сохраните модель и повторно выполните проверку Model Advisor. Передачи проверки.
ModelAdvisor.Check
| ModelAdvisor.Check.CallbackContext
| ModelAdvisor.FormatTemplate
| ModelAdvisor.FormatTemplate