Настройте метрическое размещение инструментальной панели и функциональность

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

  • Сконфигурируйте метрики соответствия, чтобы получить соответствие, и выпускает метрические данные по вашей настройке Model Advisor.

  • Настройте размещение инструментальной панели путем добавления пользовательских метрик, удаления виджетов и конфигурирования существующих виджетов.

  • Категоризируйте метрические данные как совместимые, предупреждение, и несовместимый путем определения метрических пороговых значений.

Сконфигурируйте метрики соответствия

Используйте Метрическую Инструментальную панель и метрические API, чтобы получить соответствие, и выпускает метрические данные по вашей настройке Model Advisor или по существующей группе проверки, такой как проверки MISRA. Чтобы настроить вашу собственную настройку Model Advisor, смотрите, Организуют Проверки и Папки Используя Model Advisor Configuration Editor. После того, как вы настроили свою настройку Model Advisor, выполните эти шаги, чтобы задать группы проверки, для которых вы хотите получить соответствие, и выпускает метрические данные:

  1. Чтобы открыть модель, в подсказке команды MATLAB, вводят эту команду:

    sf_car

  2. Откройте настройку по умолчанию (то есть, тот, который поставляется с Метрической Инструментальной панелью). Добавьте соответствующий объект slmetric.config.Configuration в базовое рабочее пространство.

    metricconfig=slmetric.config.Configuration.openDefaultConfiguration();
  3. Создайте массив ячеек, состоящий из идентификаторов 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.

  4. Чтобы установить настройку, передайте массив ячеек values в метод setMetricFamilyParameterValues. Строка 'ModelAdvisorStandard' является стандартной строкой, которую необходимо предоставить к методу setMetricFamilyParameterValues.

    setMetricFamilyParameterValues(metricconfig,'ModelAdvisorStandard', values);
  5. Откройте настройку по умолчанию для Метрического размещения Инструментальной панели (то есть, тот, который поставляется с Метрической Инструментальной панелью).

    dashboardconfig = slmetric.dashboard.Configuration.openDefaultConfiguration();
  6. Получите объект slmetric.dashboard.Layout из объекта slmetric.dashboard.Configuration.

    layout = getDashboardLayout(dashboardconfig);
  7. Получите объекты виджета, которые находятся в объекте размещения.

    layoutWidget = getWidgets(layout);
  8. Объект 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);

  9. Группа соответствия руководства по моделированию содержит два контейнера. Главный контейнер содержит 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)); 
    
  10. Создайте пользовательский виджет для визуализации метрик проблем проверки 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);
  11. Виджет столбчатой диаграммы визуализирует Высокую Целостность и группы проверки MAAB. Укажите этот виджет на MISRA и группы проверки MAAB.

    setMetricIDs(complianceContainerWidgets(3),...
    ({'mathworks.metrics.ModelAdvisorCheckIssues._SYSTEM_By Task_misra_c',...
    'mathworks.metrics.ModelAdvisorCheckIssues.maab'}));
    complianceContainerWidgets(3).Labels = {'MISRA', 'MAAB'};
  12. Сохраните объекты настройки. Эти команды сериализируют информацию API к XML-файлам.

    save(metricconfig,'FileName','MetricConfig.xml');
    save(dashboardconfig,'Filename','DashboardConfig.xml');
  13. Установите активные настройки.

    slmetric.config.setActiveConfiguration(fullfile(pwd,'MetricConfig.xml'));
    slmetric.dashboard.setActiveConfiguration(fullfile(pwd,'DashboardConfig.xml'));
  14. Для вашей модели откройте Метрическую Инструментальную панель.

    metricsdashboard sf_car
  15. Нажмите кнопку All Metrics и запустите все метрики. Метрическая Инструментальная панель отображает результаты для проверок MISRA вместо Высоких Проверок целостности.

  16. Закройте метрическую инструментальную панель.

Добавьте пользовательскую метрику в инструментальную панель

Создайте пользовательскую метрику, которая считает невиртуальные блоки. Чтобы отобразить эту метрику на Метрической Инструментальной панели, задайте виджет. Добавьте его в группу размера.

  1. Создайте пользовательский метрический класс.

    className = 'nonvirtualblockcount';
    slmetric.metric.createNewMetricClass(className);
    

  2. Создайте невиртуальную метрику количества блока путем добавления этого кода в файл 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

  3. Укажите новую метрику в метрическом репозитории.

    [id_metric,err_msg] = slmetric.metric.registerMetric(className);
    
  4. Удалите виджет, который представляет метрику количества блока Simulink. Этот виджет является первым в группе размера. Группа размера является второй в массиве layoutWidget.

    sizeGroup = layoutWidget(2); 
    sizeGroupWidgets = sizeGroup.getWidgets(); 
    sizeGroup.removeWidget(sizeGroupWidgets(1));
  5. Добавьте виджет, который отображается, невиртуальный блок считают метрику. Для пользовательских виджетов тип визуализации по умолчанию является одним значением. Если вы хотите использовать различный тип визуализации, задайте различное значение для свойства VisualizationType.

    newWidget = sizeGroup.addWidget('Custom', 1);
    newWidget.Title=('Nonvirtual Block Count'); 
    newWidget.setMetricIDs('nonvirtualblockcount');
    newWidget.setWidths(slmetric.dashboard.Width.Medium);
    newWidget.setHeight(70);
    
  6. Задайте, существуют ли строки, разделяющие пользовательский виджет от других виджетов в группе. Эти команды указывают, что существует строка справа от виджета.

    s.top = false;
    s.bottom = false;
    s.left= false;
    s.right= true;
    newWidget.setSeparators([s, s, s, s]);

  7. Сохраните объекты настройки. Эти команды сериализируют информацию API к XML-файлам.

    save(metricconfig,'FileName','MetricConfig.xml');
    save(dashboardconfig,'Filename','DashboardConfig.xml');
  8. Установите активные настройки.

    slmetric.config.setActiveConfiguration(fullfile(pwd, 'MetricConfig.xml'));
    slmetric.dashboard.setActiveConfiguration(fullfile(pwd, 'DashboardConfig.xml'));
  9. Для вашей модели откройте Метрическую Инструментальную панель.

    metricsdashboard sf_car
  10. Нажмите кнопку All Metrics и запустите все метрики. Метрические результаты отображений Инструментальной панели для невиртуального блока рассчитывают, метрика вместо блока Simulink считают метрику.

  11. Закройте метрическую инструментальную панель.

Добавьте метрические пороги

Для невиртуального количества блока и метрик MISRA, задайте метрические пороговые значения. Определение этих значений позволяет вам получить доступ к качеству своей модели путем категоризации метрических данных можно следующим образом:

  • Совместимый — Метрические данные, которые находятся в допустимом диапазоне.

  • Предупреждение — Метрические данные, которые требуют анализа.

  • Несовместимый — Метрические данные, которые требуют, чтобы вы изменили свою модель.

  1. Доступ к объекту slmetric.config.ThresholdConfiguration в объекте slmetric.config.Configuration metricconfig. Создайте соответствующий объект slmetric.config.ThresholdConfiguration (TC) в базовом рабочем пространстве.

    TC=getThresholdConfigurations(metricconfig);
  2. Добавьте два объекта 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;
    

  3. Для каждого объекта 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;
    Эти команды указывают, что, если проверки MISRA имеют проблемы, состояние модели предупреждает. Если нет никаких проблем, состояние модели совместимо.

  4. Добавьте третий объект 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.

  5. Сохраните объекты настройки. Эти команды сериализируют информацию API к XML-файлам.

    save(metricconfig,'FileName','MetricConfig.xml');
    save(dashboardconfig,'Filename','DashboardConfig.xml');
  6. Установите активные настройки.

    slmetric.config.setActiveConfiguration(fullfile(pwd, 'MetricConfig.xml'));
    slmetric.dashboard.setActiveConfiguration(fullfile(pwd, 'DashboardConfig.xml'));
  7. Для вашей модели откройте Метрическую Инструментальную панель.

    metricsdashboard sf_car

    Поскольку MISRA проверяют проблемы соответствия, прибор является желтым, потому что 76% проверок передают. Любой процент меньше чем 100% является предупреждением. Столбчатая диаграмма также отображает желтый, потому что модель содержит три проблемы проверки MISRA. Любой номер, больше, чем нуль, является предупреждением.

    Виджет Nonvirtual Block Count находится в совместимой области значений, потому что существует 15 невиртуальных блоков.

  8. Чтобы сбросить настройку и не указать метрику, выполните эти команды:

    slmetric.metric.unregisterMetric(className); 
    slmetric.dashboard.setActiveConfiguration(''); 
    slmetric.config.setActiveConfiguration('');

Смотрите также

|

Похожие темы