Этот пример демонстрирует, как создать два простых типа проверки: проверку прохождения/непрохождения без действия исправления и информационную проверку. Обычная проверка прохода/непрохождения находит и сообщает, что проверяется проверка и проходит ли проверка или не проходит. Информационная проверка находит и отображает описание проверки и ссылки на применимые стандарты.
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
В этом разделе вы создаете функцию определения проверки, которая проверяет, является ли значение блока Constant числом или буквой. Если значение является числом, проверка выдает предупреждение. Если значение является буквой, проверка проходит.
Эта проверка использует 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);
В этом разделе вы создаете функцию определения проверки для информационной проверки, которая находит и отображает информацию о строении модели и контрольной сумме.
Для информационной проверки в Model Advisor отображается общий статус проверки, но статус не в результате. В сложение информационная проверка не включает в результаты следующие элементы:
Описание статуса.
Рекомендуемое действие, которое необходимо предпринять, когда проверка не пройдет.
Результаты подмножества.
Эта функция определения проверки использует StyleOne
тип функции обратного вызова, поэтому для форматирования результатов, отображаемых в Model Advisor, необходимо использовать API-интерфейсы форматирования 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 диалоговое окно. Нажмите OK.
На левой панели выберите By Product > Demo > Identify model configuration and checksum information.
Нажмите Run This Check.
Проверка проходит и отображает информацию.
На левой панели выберите By Product > Demo > Check Constant block usage.
Нажмите Run This Check.
Проверка выдает предупреждение, поскольку несколько блоков содержат значения, которые являются числами. Результаты содержат ссылки на эти блоки. Результат показывает Recommended Action.
Следуйте Recommended Action, чтобы исправить блоки Constant.
ModelAdvisor.Check
| ModelAdvisor.Check.CallbackContext
| ModelAdvisor.FormatTemplate
| ModelAdvisor.FormatTemplate