Настройте Метрическую Инструментальную панель при помощи образцового метрического интерфейса программирования. Настройка инструментальной панели расширяет вашу способность использовать образцовые метрики, чтобы оценить ту вашу модель, и код выполняют размер, сложность и требования удобочитаемости. Можно выполнить эти Метрические индивидуальные настройки Инструментальной панели:
Сконфигурируйте метрики соответствия, чтобы получить соответствие, и выпускает метрические данные по вашей настройке 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