В зависимости от реализации вашей модели и чего вы хотите, чтобы ваша собственная проверка достигла, важно, чтобы вы задали соответствующую опцию компиляции, таким образом, намеченная информация оценена вашей собственной проверкой.
Вы используете 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 и выполнить собственную проверку:
Откройте свою сохраненную модель.
Во вкладке Modeling выберите Model Advisor. Системный Селектор ― диалоговое окно 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