В этом примере показано, как создать настраиваемую проверку прохождения/отказа Model Advisor с действием исправления. Если модель не содержит нарушения проверки, результаты содержат описание проверки и статус результата. Если модель содержит нарушение проверки, результаты содержат описание проверки, статус результата и рекомендуемое действие для устранения проблемы. В этом примере настраиваемая проверка добавляется в подпапку Model Advisor By Product > Demo.
В этом примере пользовательская проверка определяет блоки, имена которых не отображаются под блоками. Действие исправления заключается в том, чтобы имена блоков отображались под блоками.
В этом примере также показано, как собирать результаты в группы, нарушающие проверку (то есть подробные коллекции результатов), такие как блоки в подсистеме. В помощнике по модели можно просмотреть результаты, выбрав:
Просмотр по > Рекомендуемое действие ─ при нарушении проверки в этом представлении отображается список элементов модели, нарушающих проверку. Если нарушения нет, то в этом представлении приводится краткое описание того, что проверка не была нарушена.
View By > Subsystem ─ Это представление показывает таблицу элементов модели, которые нарушают проверку, организованную по модели или подсистеме (если применимо).
Просмотр по > Блок ─ Этот вид предоставляет список нарушений проверки для каждого блока.
Если проверка не пройдена, результаты включают гиперссылку на каждый элемент модели, который нарушает проверку. Эти гиперссылки позволяют легко находить области в модели или подсистеме. Код для этого примера состоит из 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;
Функция определения проверки определяет действия проверки и исправления, выполняемые менеджером модели при выполнении проверки. В этом примере файл функции определения завершенной проверки 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 и определите уникальный идентификатор проверки. Для этой проверки идентификатор: 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 и путь к модели или системе, анализируемой менеджером модели.
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.');
Отключить поле Действие.
mdladvObj.setActionEnable(false);
Сохранить sl_customization.m и defineDetailStyleCheck.m файлы.
В окне команд MATLAB введите:
Advisor.Manager.refresh_customizations
В окне MATLAB откройте sldemo_fuelsys модель.
В верхней модели щелкните правой кнопкой мыши значок Engine Speed и выберите «Повернуть и развернуть» > «Развернуть имя блока».
Откройте окно fuel_rate_control подсистема. Щелкните правой кнопкой мыши validate_sample_time и выберите «Повернуть и развернуть» > «Развернуть имя блока».
Вернуться к верхней модели и сохранить как example_sldemo_fuelsys.
На вкладке Моделирование (Modeling) выберите Помощник по модели (Model Advisor). Откроется диалоговое окно Выбор системы (System Selector) ― Помощник по модели (Model Advisor). Нажмите кнопку OK. Откроется окно Model Advisor.
На левой панели выберите По продукту > Демонстрация > Проверить, отображаются ли имена блоков под блоками.
Примечание
Если папка По продукту (By Product) не отображается в окне Мастер модели (Model Advisor), выберите Настройки (Settings) > Настройки (Preferences) > Показать по папке продукта (Show By Product Folder).
Выберите Выполнить эту проверку. Проверка измененных блоков в Model Advisor завершается неуспешно.
Просмотрите результаты, выбрав один из параметров Вид по (View by).
Отчет содержит рекомендуемые действия для каждой проверки. Можно щелкнуть путь гиперссылки, чтобы открыть нарушающий блок в редакторе модели. Например:
Выполните рекомендуемое действие для фиксации нарушающих блоков одним из следующих способов:
Обновите каждое нарушение по отдельности, дважды щелкнув гиперссылку, чтобы открыть блок. Щелкните правой кнопкой мыши блок и выберите «Повернуть и развернуть» > «Развернуть имя блока».
Нажмите кнопку «Создать имена блоков, отображаемые под блоками». Помощник по модели автоматически устраняет проблемы в модели. Обратите внимание, что кнопка затемняется после устранения нарушений.
Сохраните модель и снова запустите проверку помощника по модели. Чек проходит.

ModelAdvisor.Check | ModelAdvisor.Check.CallbackContext | ModelAdvisor.FormatTemplate | ModelAdvisor.FormatTemplate