В этом примере показано, как создать пользовательскую проверку pass/fail 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
и задайте уникальный идентификатор проверки. Для этой проверки идентификатор 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
метод для вызова функции обратного вызова. The 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. The 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