Настройте Метрическую Инструментальную панель при помощи образцового метрического интерфейса программирования. Настройка инструментальной панели расширяет вашу способность использовать образцовые метрики, чтобы оценить ту вашу модель, и код выполняют размер, сложность и требования удобочитаемости. Можно выполнить эти Метрические индивидуальные настройки Инструментальной панели:
Сконфигурируйте метрики соответствия, чтобы получить соответствие, и выпускает метрические данные по вашей настройке Model Advisor.
Настройте размещение инструментальной панели путем добавления пользовательских метрик, удаления виджетов и конфигурирования существующих виджетов.
Категоризируйте метрические данные как совместимые, предупреждение, и несовместимый путем определения метрических пороговых значений.
Используйте Метрическую Инструментальную панель и метрические API, чтобы получить соответствие, и выпускает метрические данные по вашей настройке Model Advisor или по существующей группе проверки, такой как проверки MISRA. Чтобы настроить вашу собственную настройку Model Advisor, смотрите, Организуют Проверки и Папки Используя Model Advisor Configuration Editor. После того, как вы настроили свою настройку Model Advisor, выполните эти шаги, чтобы задать группы проверки, для которых вы хотите получить соответствие, и выпускает метрические данные:
Чтобы открыть модель, в подсказке команды MATLAB, вводят эту команду:
sf_car
Откройте настройку по умолчанию (то есть, тот, который поставляется с Метрической Инструментальной панелью). Добавьте соответствующий объект slmetric.config.Configuration
в базовое рабочее пространство.
metricconfig=slmetric.config.Configuration.openDefaultConfiguration();
Создайте массив ячеек, состоящий из идентификаторов Check Group, которые соответствуют тем группам проверки. Получите ID Check Group путем открытия Model Advisor Configuration Editor и выбора папки, которая содержит группу проверок. Папка содержит параметр Check Group ID.
values = {'maab', 'hisl_do178', '_SYSTEM_By Task_misra_c'};
Этот массив ячеек задает MAAB, Высокую Целостность и группы проверки MISRA. Значения maab
и hisl_do178
соответствуют подмножеству MAAB и Системных проверок Высокой Целостности. Чтобы включать все проверки, задайте значение для параметра Check Group ID от Model Advisor Configuration Editor.
Чтобы установить настройку, передайте массив ячеек values
в метод setMetricFamilyParameterValues
. Строка 'ModelAdvisorStandard'
является стандартной строкой, которую необходимо предоставить к методу setMetricFamilyParameterValues
.
setMetricFamilyParameterValues(metricconfig,'ModelAdvisorStandard', values);
Откройте настройку по умолчанию для Метрического размещения Инструментальной панели (то есть, тот, который поставляется с Метрической Инструментальной панелью).
dashboardconfig = slmetric.dashboard.Configuration.openDefaultConfiguration();
Получите объект slmetric.dashboard.Layout
из объекта slmetric.dashboard.Configuration
.
layout = getDashboardLayout(dashboardconfig);
Получите объекты виджета, которые находятся в объекте размещения.
layoutWidget = getWidgets(layout);
Объект slmetric.dashboard.Layout
содержит эти объекты:
Объект slmetric.dashboard.Container
, который содержит объект slmetrics.dashboard.Widget
типа SystemInfo
. Красный номер один в схеме ниже указывает на виджет SystemInfo
.
Объект slmetric.dashboard.Group
, который имеет заголовок SIZE.
Объект slmetrics.dashboard.Group
, который имеет заголовок MODELING GUIDELINE COMPLIANCE.
Объект slmetrics.dashboard.Group
, который имеет заголовок ARCHITECTURE.
В схеме красные числа 1, 2, 3, и 4 указывают на свой порядок в массиве layoutWidget
. Получите группу соответствия из размещения.
complianceGroup = layoutWidget(3);
Группа соответствия руководства по моделированию содержит два контейнера. Главный контейнер содержит High Integrity и соответствие MAAB и виджеты проблем проверки. Красные числа 3.1.1, 3.1.2, и 3.1.3 указывают на порядок этих трех виджетов в первом контейнере. Второй контейнер содержит виджеты Diagnostic Warnings и Code Analyzer Warnings.
Удалите виджет соответствия High Integrity.
complianceContainers = getWidgets(complianceGroup); complianceContainerWidgets = getWidgets(complianceContainers(1)); complianceContainers(1).removeWidget(complianceContainerWidgets(1));
Создайте пользовательский виджет для визуализации метрик проблем проверки MISRA.
misraWidget = complianceContainers(1).addWidget('Custom', 1); misraWidget.Title=('MISRA'); misraWidget.VisualizationType = 'RadialGauge'; misraWidget.setMetricIDs... ('mathworks.metrics.ModelAdvisorCheckCompliance._SYSTEM_By Task_misra_c'); misraWidget.setWidths(slmetric.dashboard.Width.Medium);
Виджет столбчатой диаграммы визуализирует Высокую Целостность и группы проверки MAAB. Укажите этот виджет на MISRA и группы проверки MAAB.
setMetricIDs(complianceContainerWidgets(3),... ({'mathworks.metrics.ModelAdvisorCheckIssues._SYSTEM_By Task_misra_c',... 'mathworks.metrics.ModelAdvisorCheckIssues.maab'})); complianceContainerWidgets(3).Labels = {'MISRA', 'MAAB'};
Сохраните объекты настройки. Эти команды сериализируют информацию API к XML-файлам.
save(metricconfig,'FileName','MetricConfig.xml'); save(dashboardconfig,'Filename','DashboardConfig.xml');
Установите активные настройки.
slmetric.config.setActiveConfiguration(fullfile(pwd,'MetricConfig.xml')); slmetric.dashboard.setActiveConfiguration(fullfile(pwd,'DashboardConfig.xml'));
Для вашей модели откройте Метрическую Инструментальную панель.
metricsdashboard sf_car
Нажмите кнопку All Metrics и запустите все метрики. Метрическая Инструментальная панель отображает результаты для проверок MISRA вместо Высоких Проверок целостности.
Закройте метрическую инструментальную панель.
Создайте пользовательскую метрику, которая считает невиртуальные блоки. Чтобы отобразить эту метрику на Метрической Инструментальной панели, задайте виджет. Добавьте его в группу размера.
Создайте пользовательский метрический класс.
className = 'nonvirtualblockcount'; slmetric.metric.createNewMetricClass(className);
Создайте невиртуальную метрику количества блока путем добавления этого кода в файл nonvirtualblockcount.m
.
classdef nonvirtualblockcount < slmetric.metric.Metric %nonvirtualblockcount calculates number of nonvirtual blocks per level. % BusCreator, BusSelector and BusAssign are treated as nonvirtual. properties VirtualBlockTypes = {'Demux','From','Goto','Ground', ... 'GotoTagVisiblity','Mux','SignalSpecification', ... 'Terminator','Inport'}; end methods function this = nonvirtualblockcount() this.ID = 'nonvirtualblockcount'; this.Name = 'Nonvirtual Block Count'; this.Version = 1; this.CompileContext = 'None'; this.Description = 'Algorithm that counts nonvirtual blocks per level.'; this.AggregatedValueName = 'Nonvirtual Blocks (incl. Descendants)'; this.ValueName = 'Nonvirtual Blocks'; this.ComponentScope = [Advisor.component.Types.Model, ... Advisor.component.Types.SubSystem]; this.AggregationMode = slmetric.AggregationMode.Sum; this.AggregateComponentDetails = true; this.ResultChecksumCoverage = true; this.SupportsResultDetails = false; end function res = algorithm(this, component) % create a result object for this component res = slmetric.metric.Result(); % set the component and metric ID res.ComponentID = component.ID; res.MetricID = this.ID; % Practice D1=slmetric.metric.ResultDetail('identifier 1','Name 1'); D1.Value=0; D1.setGroup('Group1','Group1Name'); D2=slmetric.metric.ResultDetail('identifier 2','Name 2'); D2.Value=1; D2.setGroup('Group1','Group1Name'); % use find_system to get all blocks inside this component blocks = find_system(getPath(component), ... 'SearchDepth', 1, ... 'Type', 'Block'); isNonVirtual = true(size(blocks)); for n=1:length(blocks) blockType = get_param(blocks{n}, 'BlockType'); if any(strcmp(this.VirtualBlockTypes, blockType)) isNonVirtual(n) = false; else switch blockType case 'SubSystem' % Virtual unless the block is conditionally executed % or the Treat as atomic unit check box is selected. if strcmp(get_param(blocks{n}, 'IsSubSystemVirtual'), ... 'on') isNonVirtual(n) = false; end case 'Outport' % Outport: Virtual when the block resides within % SubSystem block (conditional or not), and % does not reside in the root (top-level) Simulink window. if component.Type ~= Advisor.component.Types.Model isNonVirtual(n) = false; end case 'Selector' % Virtual only when Number of input dimensions % specifies 1 and Index Option specifies Select % all, Index vector (dialog), or Starting index (dialog). nod = get_param(blocks{n}, 'NumberOfDimensions'); ios = get_param(blocks{n}, 'IndexOptionArray'); ios_settings = {'Assign all', 'Index vector (dialog)', ... 'Starting index (dialog)'}; if nod == 1 && any(strcmp(ios_settings, ios)) isNonVirtual(n) = false; end case 'Trigger' % Virtual when the output port is not present. if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'off') isNonVirtual(n) = false; end case 'Enable' % Virtual unless connected directly to an Outport block. isNonVirtual(n) = false; if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'on') pc = get_param(blocks{n}, 'PortConnectivity'); if ~isempty(pc.DstBlock) && ... strcmp(get_param(pc.DstBlock, 'BlockType'), ... 'Outport') isNonVirtual(n) = true; end end end end end blocks = blocks(isNonVirtual); res.Value = length(blocks); end end end
Укажите новую метрику в метрическом репозитории.
[id_metric,err_msg] = slmetric.metric.registerMetric(className);
Удалите виджет, который представляет метрику количества блока Simulink. Этот виджет является первым в группе размера. Группа размера является второй в массиве layoutWidget
.
sizeGroup = layoutWidget(2); sizeGroupWidgets = sizeGroup.getWidgets(); sizeGroup.removeWidget(sizeGroupWidgets(1));
Добавьте виджет, который отображается, невиртуальный блок считают метрику. Для пользовательских виджетов тип визуализации по умолчанию является одним значением. Если вы хотите использовать различный тип визуализации, задайте различное значение для свойства VisualizationType
.
newWidget = sizeGroup.addWidget('Custom', 1); newWidget.Title=('Nonvirtual Block Count'); newWidget.setMetricIDs('nonvirtualblockcount'); newWidget.setWidths(slmetric.dashboard.Width.Medium); newWidget.setHeight(70);
Задайте, существуют ли строки, разделяющие пользовательский виджет от других виджетов в группе. Эти команды указывают, что существует строка справа от виджета.
s.top = false; s.bottom = false; s.left= false; s.right= true; newWidget.setSeparators([s, s, s, s]);
Сохраните объекты настройки. Эти команды сериализируют информацию API к XML-файлам.
save(metricconfig,'FileName','MetricConfig.xml'); save(dashboardconfig,'Filename','DashboardConfig.xml');
Установите активные настройки.
slmetric.config.setActiveConfiguration(fullfile(pwd, 'MetricConfig.xml')); slmetric.dashboard.setActiveConfiguration(fullfile(pwd, 'DashboardConfig.xml'));
Для вашей модели откройте Метрическую Инструментальную панель.
metricsdashboard sf_car
Нажмите кнопку All Metrics и запустите все метрики. Метрические результаты отображений Инструментальной панели для невиртуального блока рассчитывают, метрика вместо блока Simulink считают метрику.
Закройте метрическую инструментальную панель.
Для невиртуального количества блока и метрик MISRA, задайте метрические пороговые значения. Определение этих значений позволяет вам получить доступ к качеству своей модели путем категоризации метрических данных можно следующим образом:
Совместимый — Метрические данные, которые находятся в допустимом диапазоне.
Предупреждение — Метрические данные, которые требуют анализа.
Несовместимый — Метрические данные, которые требуют, чтобы вы изменили свою модель.
Доступ к объекту slmetric.config.ThresholdConfiguration
в объекте slmetric.config.Configuration
metricconfig
. Создайте соответствующий объект slmetric.config.ThresholdConfiguration
(TC
) в базовом рабочем пространстве.
TC=getThresholdConfigurations(metricconfig);
Добавьте два объекта slmetric.config.Threshold
в TC
. Каждый объект slmetric.config.Threshold
содержит объект slmetric.config.Classification
по умолчанию, который совместим. Задайте совместимые метрические области значений.
T1=addThreshold(TC,'mathworks.metrics.ModelAdvisorCheckIssues._SYSTEM_By Task_misra_c',... 'AggregatedValue'); C=getClassifications(T1); C.Range.Start=-inf; C.Range.End=0; C.Range.IncludeStart=0; C.Range.IncludeEnd=1; T2=addThreshold(TC,'mathworks.metrics.ModelAdvisorCheckCompliance._SYSTEM_By Task_misra_c',... 'AggregatedValue'); C=getClassifications(T2); C.Range.Start=1; C.Range.End=inf; C.Range.IncludeStart=1; C.Range.IncludeEnd=0;
Для каждого объекта slmetric.config.Threshold
задайте Предупреждение областей значений.
C=addClassification(T1,'Warning'); C.Range.Start=0; C.Range.End=inf; C.Range.IncludeStart=0; C.Range.IncludeEnd=1; C=addClassification(T2,'Warning'); C.Range.Start=-inf; C.Range.End=1; C.Range.IncludeStart=0; C.Range.IncludeEnd=0;
Добавьте третий объект slmetric.config.Threshold
в TC
. Задайте совместимый, предупреждение и несовместимые области значений для этого объекта slmetric.config.Threshold
.
T3=addThreshold(TC,'nonvirtualblockcount', 'AggregatedValue'); C=getClassifications(T3); C.Range.Start=-inf; C.Range.End=20; C.Range.IncludeStart=1; C.Range.IncludeEnd=1; C=addClassification(T3, 'Warning'); C.Range.Start=20; C.Range.End=30; C.Range.IncludeStart=0; C.Range.IncludeEnd=1; C=addClassification(T3, 'NonCompliant'); C.Range.Start=30; C.Range.End=inf; C.Range.IncludeStart=0; C.Range.IncludeEnd=1;
Эти команды указывают, что совместимая область значений меньше чем или равна 20. Область значений предупреждения от 20 до, но не включая 30. Несовместимая область значений больше, чем 30.
Сохраните объекты настройки. Эти команды сериализируют информацию API к XML-файлам.
save(metricconfig,'FileName','MetricConfig.xml'); save(dashboardconfig,'Filename','DashboardConfig.xml');
Установите активные настройки.
slmetric.config.setActiveConfiguration(fullfile(pwd, 'MetricConfig.xml')); slmetric.dashboard.setActiveConfiguration(fullfile(pwd, 'DashboardConfig.xml'));
Для вашей модели откройте Метрическую Инструментальную панель.
metricsdashboard sf_car
Поскольку MISRA проверяют проблемы соответствия, прибор является желтым, потому что 76% проверок передают. Любой процент меньше чем 100% является предупреждением. Столбчатая диаграмма также отображает желтый, потому что модель содержит три проблемы проверки MISRA. Любой номер, больше, чем нуль, является предупреждением.
Виджет Nonvirtual Block Count находится в совместимой области значений, потому что существует 15 невиртуальных блоков.
Чтобы сбросить настройку и не указать метрику, выполните эти команды:
slmetric.metric.unregisterMetric(className); slmetric.dashboard.setActiveConfiguration(''); slmetric.config.setActiveConfiguration('');
slmetric.config.Configuration
| slmetric.dashboard.Configuration