В этом примере показано, как создать два простых типа проверки: проверку прохождения/отказа без исправления и информационную проверку. Базовая проверка прохождения/неуспешного завершения находит и сообщает, что проверяет проверка и проходит ли проверка или нет. Информационная проверка находит и отображает описание проверяемых проверок и любые ссылки на применимые стандарты.
sl_customization ФункцияВ рабочей папке создайте sl_customization.m файл. Чтобы зарегистрировать пользовательские чеки, в sl_customization.m файл, создайте sl_customization(cm) функция, как показано здесь. Эта функция принимает один аргумент, объект настройки. Этот объект диспетчера настройки включает в себя addModelAdvisorCheckFcn способ регистрации пользовательских проверок. Вход в этот метод является дескриптором функции (defineModelAdvisorChecks), который содержит вызовы двух функций определения проверки. Эти функции содержат определения простой проверки прохождения/отказа и информационной проверки.
function sl_customization(cm) % SL_CUSTOMIZATION - Model Advisor customization demonstration. % Copyright 2019 The MathWorks, Inc. % register custom checks cm.addModelAdvisorCheckFcn(@defineModelAdvisorCheck); % ----------------------------- % defines Model Advisor Checks % ----------------------------- function defineModelAdvisorCheck definePassFailCheck defineInformationCheck
В этом разделе создается функция определения проверки, которая проверяет, является ли значение блока константы числом или буквой. Если значением является число, проверка выдает предупреждение. Если значение является буквой, проверка проходит.
Эта проверка использует DetailStyle тип функции обратного вызова. Этот стиль позволяет просматривать результаты по блоку, подсистеме или рекомендуемому действию. Применение этого стиля приводит к форматированию по умолчанию, так что нет необходимости использовать ModelAdvisor.FormatTemplate класс или другие API форматирования Model Advisor для форматирования результатов, отображаемых в Model Advisor. Этот стиль задается в качестве входных данных для setCallbackFcn способ.
Создайте новый файл, definePassFailCheck.mи введите функцию, показанную здесь:
function definePassFailCheck mdladvRoot = ModelAdvisor.Root; rec = ModelAdvisor.Check('simplePassFailCheck'); rec.Title = 'Check Constant block usage'; rec.TitleTips = ['Warn if Constant block value is a number; Pass if' ... ' Constant block value is a letter']; rec.setCallbackFcn(@simplePassFailCheck,'None','DetailStyle') mdladvRoot.publish(rec, 'Demo'); % --- Callback function that checks Constant blocks function simplePassFailCheck(system,CheckObj) mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); all_constant_blk=find_system(system,'LookUnderMasks','all',... 'FollowLinks','on','BlockType','Constant'); violationBlks=find_system(all_constant_blk,'RegExp','On','Value','^[0-9]'); if isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail; ElementResults.IsInformer = true; ElementResults.Description = 'Identify Constant blocks with a value that is a number.'; ElementResults.Status = 'All Constant blocks have have a value that is a letter.'; mdladvObj.setCheckResultStatus(true); else ElementResults(1,numel(violationBlks))=ModelAdvisor.ResultDetail; for i=1:numel(ElementResults) ElementResults(i).setData(violationBlks{i}); ElementResults(i).Description = 'Identify Constant blocks with a value that is a number.'; ElementResults(i).Status = 'The following Constant blocks have values that are numbers:'; ElementResults(i).RecAction = 'Change the Constant block value to a letter.'; end mdladvObj.setCheckResultStatus(false); mdladvObj.setActionEnable(true); end CheckObj.setResultDetails(ElementResults);
В этом разделе создается функция определения проверки для информационной проверки, которая находит и отображает информацию о конфигурации модели и контрольной сумме.
Для информационной проверки мастер модели отображает общий статус проверки, но этот статус отсутствует в результате. Кроме того, информационная проверка не включает в результаты следующие элементы:
Описание статуса.
Рекомендуемое действие, которое необходимо выполнить, если проверка не пройдена.
Результаты подконтроля.
Эта функция определения проверки использует StyleOne тип функции обратного вызова, поэтому необходимо использовать API форматирования Model Advisor для форматирования результатов, отображаемых в Model Advisor. Вы указываете StyleOne в качестве входных данных для setCallbackFcn способ.
Создайте новый файл, defineInformationCheck.mи введите функцию, показанную здесь:
function defineInformationCheck % Create ModelAdvisor.Check object and set properties. rec = ModelAdvisor.Check('com.mathworks.sample.infocheck'); rec.Title = 'Identify model configuration and checksum information'; rec.TitleTips = 'Display model configuration and checksum information'; rec.setCallbackFcn(@modelVersionChecksumCallbackUsingFT,'None','StyleOne'); % Publish check into Demo group. mdladvRoot = ModelAdvisor.Root; mdladvRoot.publish(rec, 'Demo'); end % ----------------------------- % This callback function uses the StyleOne CallbackStyle type. % ----------------------------- function resultDescription = modelVersionChecksumCallbackUsingFT(system) resultDescription = []; system = getfullname(system); model = bdroot(system); % Format results in a list using Model Advisor Result Template API. ft = ModelAdvisor.FormatTemplate('ListTemplate'); % Description of check in results setInformation(ft, 'Display model configuration and checksum information'); % Add See Also section for references to standards. docLinkSfunction{1} = {['IEC 61508-3, Table A.8 (5)' ... ' ''Software configuration management'' ']}; setRefLink(ft,docLinkSfunction); % If running the Model Advisor on a subsystem, add note to description. if strcmp(system, model) == false setInformation(ft,{['NOTE: The Model Advisor is reviewing a' ... ' sub-system, but these results are based on root-level settings.']}); end mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % If error is encountered, use these values. mdlver = 'Error - could not retrieve Version'; mdlauthor = 'Error - could not retrieve Author'; mdldate = 'Error - could not retrieve Date'; mdlsum = 'Error - could not retrieve CheckSum'; % Get model configuration and checksum information. try mdlver = get_param(model,'ModelVersion'); mdlauthor = get_param(model,'LastModifiedBy'); mdldate = get_param(model,'LastModifiedDate'); mdlsum = Simulink.BlockDiagram.getChecksum(model); mdlsum = [num2str(mdlsum(1)) ' ' num2str(mdlsum(2)) ' ' ... num2str(mdlsum(3)) ' ' num2str(mdlsum(4))]; mdladvObj.setCheckResultStatus(true); % init to true catch err mdladvObj.setCheckResultStatus(false); setSubResultStatusText(ft,err.message); resultDescription{end+1} = ft; return end lbStr ='<br/>'; resultStr = ['Model Version: ' mdlver lbStr 'Author: ' mdlauthor lbStr ... 'Date: ' mdldate lbStr 'Model Checksum: ' mdlsum]; % Display the results setSubResultStatusText(ft,resultStr); % The check does not have subresults and does not need a bar. setSubBar(ft,0); resultDescription{end+1} = ft; end
В окне команд введите:
Advisor.Manager.refresh_customizations
Открытие модели sldemo_fuelsys путем ввода этой команды в командной строке MATLAB:
sldemo_fuelsys
На вкладке Моделирование (Modeling) выберите Помощник по модели (Model Advisor). Откроется диалоговое окно Выбор системы (System Selector) ― Помощник по модели (Model Advisor). Нажмите кнопку ОК.
На левой панели выберите По продукту > Демонстрация > Определить конфигурацию модели и сведения о контрольной сумме.
Щелкните Выполнить эту проверку.
Проверка проходит и отображает информацию.
На левой панели выберите По продукту > Демонстрация > Проверка постоянного использования блоков.
Щелкните Выполнить эту проверку.
Проверка выдает предупреждение, поскольку несколько блоков содержат значения, которые являются числами. Результаты содержат ссылки на эти блоки. В результате отображается рекомендуемое действие.
Чтобы исправить блоки константы, выполните рекомендуемое действие.
ModelAdvisor.Check | ModelAdvisor.Check.CallbackContext | ModelAdvisor.FormatTemplate | ModelAdvisor.FormatTemplate