В зависимости от реализации вашей модели и чего вы хотите, чтобы ваша собственная проверка достигла, важно, чтобы вы задали соответствующую опцию компиляции, чтобы гарантировать, что правильная информация оценена вашей собственной проверкой.
Вы используете свойство ModelAdvisor.Check.CallbackContext
задать опцию компиляции:
None
указывает, что Model Advisor не должен компилировать вашу модель перед анализом вашей собственной проверкой.
PostCompile
указывает, что Model Advisor должен скомпилировать модель, чтобы обновить диаграмму модели и затем моделировать модель, чтобы выполнить вашу собственную проверку.
PostCompileForCodegen
указывает, что Model Advisor должен скомпилировать и обновить диаграмму модели специально для генерации кода, но не моделирует модель. Используйте эту опцию для проверок Model Advisor, которые анализируют готовность генерации кода модели.
Для собственных проверок, которые не требуют, чтобы Model Advisor скомпилировал модель перед выполнением проверки в определении проверки, вы задаете свойство ModelAdvisor.Check.CallbackContext
как:
rec.CallbackContext = 'None';
По умолчанию Model Advisor не компилирует модель для собственных проверок. Вы не должны включать свойство ModelAdvisor.Check.CallbackContext
в определение проверки.
Этот пример показывает определение проверки, которое не требует, чтобы модель была скомпилирована.
function defineModelAdvisorChecks mdladvRoot = ModelAdvisor.Root; % ----------------------------- % Sample Check: Check whose model does not need to be compiled % ----------------------------- rec = ModelAdvisor.Check('exampleCheck2'); rec.Title = 'Non-compile check example'; rec.TitleID = 'custom.dtcCheck.NonCompile1'; rec.TitleTips = 'A custom check for a model that does not need to be compiled '; rec.setCallbackFcn(@CheckNoCompile,'None','StyleOne'); rec.CallbackContext = 'None'; % Not compiled mdladvRoot.publish(rec, 'Demo');
Для собственных проверок, которые требуют, чтобы образцовая компиляция и симуляция правильно проверяли реализацию модели в определении проверки, вы задаете свойство ModelAdvisor.Check.CallbackContext
как:
rec.CallbackContext = 'PostCompile';
В этой ситуации Model Advisor обновляет диаграмму модели и моделирует модель. Model Advisor не отмечает проблемы моделирования, которые перестали работать во время генерации кода, потому что эти проблемы не влияют на моделируемую модель.
Этот пример показывает определение проверки, которое требует, чтобы модель была скомпилирована и моделирована.
function defineModelAdvisorChecks mdladvRoot = ModelAdvisor.Root; % ----------------------------- % Sample Check: Check whose model must be compiled and simulated. % ----------------------------- rec = ModelAdvisor.Check('exampleCheck3'); rec.Title = 'PostCompile check example'; rec.TitleID = 'custom.dtcCheck.Compile1'; rec.TitleTips = 'A custom check for a model that is compiled and simulated'; rec.setCallbackFcn(@CheckCompileSimulate,'None','StyleOne'); rec.CallbackContext = 'PostCompile'; % Compiled and simulated mdladvRoot.publish(rec, 'Demo');
Для собственных проверок, которые оценивают готовность генерации кода, необходимо разработать модель, чтобы сгенерировать код. В определении проверки вы задаете свойство ModelAdvisor.Check.CallbackContext
как:
rec.CallbackContext = 'PostCompileForCodegen';
В этой ситуации Model Advisor компилирует модель и обновляет диаграмму модели специально для генерации кода. Model Advisor не принимает, что модель моделируется.
Можно создать пользовательские проверки Model Advisor, которые идентифицируют проблемы настройки генерации кода в модели в более ранней стадии, избегая неожиданных ошибок во время генерации кода. Например, в этой модели, перечисление Red
в BasicColors
и OtherColors
хорошо для использования в моделируемой модели. В сгенерированном коде, однако, эти перечисления Red
приводят к столкновению перечисления. При помощи опции 'PostCompileForCodegen'
ваша пользовательская проверка Model Advisor может идентифицировать этот тип проблемы настройки генерации кода.
Опция 'PostCompileForCodegen'
компилирует модель для всех вариантов. Эта компиляция позволяет вам анализировать возможные проблемы, существующие в сгенерированном коде для активных и неактивных различных путей в модели. В примере обеспечивают, Создают Собственную проверку, чтобы Оценить Активные и Неактивные Различные Пути из Модели.
Этот пример показывает определение проверки, которое требует, чтобы модель была скомпилирована для генерации кода
function defineModelAdvisorChecks mdladvRoot = ModelAdvisor.Root; % ----------------------------- % Sample Check: Check whose model is compiled for generated code. % Model is not simulated. % ----------------------------- rec = ModelAdvisor.Check('exampleCheck1'); rec.Title = 'PostCompileForCodegen check example'; rec.TitleID = 'custom.dtcCheck.CompileForCodegen1'; rec.TitleTips = 'A custom check for evaluating the generated code'; rec.setCallbackFcn(@CheckSingleToBoolConversion,'None','StyleOne'); rec.CallbackContext = 'PostCompileForCodegen'; % Compile for generated code mdladvRoot.publish(rec, 'Demo');
Этот пример показывает создание пользовательской проверки Model Advisor, которая оценивает активные и неактивные различные пути из модели вариантной системы. Пример обеспечивает результаты Model Advisor, которые демонстрируют, почему вы используете PostCompileForCodegen
по сравнению с PostCompile
как значение для свойства ModelAdvisor.Check.CallbackContext
, когда генерация кода из модели является вашей итоговой целью. Смотрите Задают Опцию Компиляции для Собственных проверок.
Модель обновления, чтобы анализировать все варианты
Для Model Advisor, чтобы оценить активные и неактивные пути в вариантной системе, необходимо включить Анализирование всего выбора во время обновления, схематически изображают и генерируют условную опцию препроцессора для различных блоков (Различный Приемник, Различный Источник, и Различная Подсистема, Различная Модель).
Примечание: Выбор этой опции может влиять на время выполнения, таким образом, увеличивая время, которое требуется для Model Advisor, чтобы оценить модель.
Откройте модель ex_check_compile_code_gen
в качестве примера.
Для каждого Различного Исходного блока откройте параметры блоков и выберите Analyze, весь выбор во время обновления схематически изображает и генерирует условную опцию препроцессора.
Сохраните модель в свою локальную рабочую папку.
Обновите файл sl_customization.m
В вашей рабочей папке обновите файл sl_customization.m
. Сохраните свои изменения. Если вас спрашивают, нормально ли перезаписывать файл, нажимать ОК.
function sl_customization(cm) % --- register custom checks cm.addModelAdvisorCheckFcn(@defineModelAdvisorChecks); end % --- defineModelAdvisorChecks function function defineModelAdvisorChecks mdladvRoot = ModelAdvisor.Root; rec = ModelAdvisor.Check('exampleCheck1'); rec.Title = 'Check to identify SINGLE to BOOL conversions'; rec.TitleID = 'custom.dtcCheck.CompileForCodegen1'; rec.TitleTips = 'Custom check to identify SINGLE to BOOL conversions'; rec.setCallbackFcn(@CheckSingleToBoolConversion,'None','StyleOne'); rec.CallbackContext = 'PostCompileForCodegen'; % Compile for Code Generation mdladvRoot.publish(rec, 'Demo'); end % --- creates SimpleCallback function function result = CheckSingleToBoolConversion(system) mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); result={}; dtcBlks = find_system(system, 'BlockType', 'DataTypeConversion'); for ii = numel(dtcBlks):-1:1 dtcBlk = dtcBlks{ii}; compDataTypes = get_param(dtcBlk, 'CompiledPortDataTypes'); if isempty(compDataTypes) dtcBlks(ii) = []; continue; end if ~(strcmp(compDataTypes.Inport, 'single') && strcmp(compDataTypes.Outport, 'boolean')) dtcBlks(ii) = []; continue; end end ft = ModelAdvisor.FormatTemplate('ListTemplate'); ft.setInformation(['This check looks for data type conversion blocks that'... ' convert single data to boolean data']); if ~isempty(dtcBlks) ft.setSubResultStatusText(['Check has failed. The following '... 'data type conversion blocks convert single data to boolean:']); ft.setListObj(dtcBlks); ft.setSubResultStatus('warn'); ft.setRecAction('Modify the model to avoid converting data type from single to boolean'); mdladvObj.setCheckResultStatus(false); else ft.setSubResultStatusText(['Check has passed. No data type conversion blocks '... 'that convert single data to boolean were found.']); ft.setSubResultStatus('pass'); mdladvObj.setCheckResultStatus(true); end ft.setSubBar(0); result{end+1} = ft; end function result = dummy(~) result={}; end
Откройте Model Advisor и выполните собственную проверку
До открытия Model Advisor и осуществления собственной проверки, необходимо обновить кэш информации о проверке Model Advisor. В Окне Команды MATLAB, введите:
Advisor.Manager.refresh_customizations
Открыть Model Advisor и выполнить собственную проверку:
Откройте свою сохраненную модель.
От окна модели выберите Analysis> Model Advisor> Model Advisor.
Диалоговое окно System Selector — Model Advisor открывается. Нажать ОК. Окно Model Advisor открывается.
На левой панели выберите By Product> Demo> Check, чтобы идентифицировать ОДИН к преобразованию BOOL. Если Папкой продукта не отображен в окне Model Advisor, выберите Settings> Preferences> Show By Product Folder.
Щелкните правой кнопкой по проверке и выберите Run This Check. Model Advisor компилирует модель и выполняет проверку. Model Advisor обновляет диаграмму модели с неактивными различными путями, появляющимися, как потускнел.
Рассмотрите результаты Model Advisor
Рассмотрите результаты контрольного анализа в Model Advisor. Кликните по пути к гиперссылке, чтобы открыть блок нарушения в редакторе моделей.
В этом примере, потому что вы задали опцию компиляции в файле sl_customization.m
как
rec.CallbackContext = 'PostCompileForCodegen';
Model Advisor генерирует предупреждения для блоков Преобразования типа данных в активных путях и неактивных путях Вариантной системы.
Если вы задали опцию компиляции в файле sl_customization.m
как
rec.CallbackContext = 'PostCompile';
результаты включают только блоки Преобразования типа данных в активный путь.
ModelAdvisor.Check
| ModelAdvisor.Check.CallbackContext