В этом примере показано, как программно фильтровать объекты и результаты из результатов покрытия.
Сначала загрузите модель в память.
modelName = 'slvnvdemo_covfilt';
load_system(modelName);
Конфигурирование параметров покрытия для модели с помощью Simulink.SimulationInput объект.
simIn = Simulink.SimulationInput(modelName); simIn = simIn.setModelParameter('CovEnable','on'); simIn = simIn.setModelParameter('CovMetricStructuralLevel','MCDC'); simIn = simIn.setModelParameter('StopTime','20'); simIn = simIn.setModelParameter('CovSaveSingleToWorkspaceVar','on'); simIn = simIn.setModelParameter('CovSaveName','covData');
Список параметров покрытия см. в разделе Параметры покрытия.
Моделирование модели с помощью SimulationInput объект в качестве входных данных.
simOut = sim(simIn);
Просмотр результатов покрытия перед применением фильтра. Получить доступ к результатам покрытия решений можно с помощью decisioninfo.
saturationInitial = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationCov = 100 * saturationInitial(1)/saturationInitial(2)
percentSaturationCov =
50
Блок «Насыщение» имеет 50% покрытия принятия решений. Если вы не хотите, чтобы этот блок был удовлетворен, вы можете отфильтровать отсутствующий целевой результат, чтобы он больше не считался отсутствующим покрытием. Во-первых, вам нужен селектор для неудовлетворенного объективного результата, который вы хотите отфильтровать.
Можно непосредственно создать селектор с помощью соответствующего конструктора. В этом случае вы будете использовать slcoverage.MetricSelector.
Поскольку оправдываемая цель является результатом решения, первым вводом в конструктор выбора метрики является slcoverage.MetricSelectorType.DecisionOutcome. Второй вход является дескриптором блока. Последние два показателя представляют собой индекс цели, подлежащей обоснованию, и индекс результатов этой цели, соответственно. Потому что input > lower limit цель принятия решения является первой целью для блока Насыщения, ее целевой индекс - 1. Потому что false результат этой цели является первым результатом, его индекс результата также 1.
metricSel = slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome,... 'slvnvdemo_covfilt/Saturation',1,1)
metricSel =
MetricSelector with properties:
ObjectiveIndex: 1
OutcomeIndex: 1
Description: 'N/A'
Type: DecisionOutcome
Id: 'slvnvdemo_covfilt:5'
ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome, 'slvnvdemo_covfilt:5', 1, 1)'
Также можно использовать slcoverage.Selector.allSelectors для просмотра доступных селекторов для блока «Насыщенность».
saturationAllSels = slcoverage.Selector.allSelectors('slvnvdemo_covfilt/Saturation')
saturationAllSels =
1x6 heterogeneous Selector (BlockSelector, MetricSelector) array with properties:
Description
Type
Id
ConstructorCode
Можно также просмотреть показатели цели и результата с помощью allSelectors способ. Используйте Description пара имя-значение для поиска F.
falseSelectors = slcoverage.Selector.allSelectors('slvnvdemo_covfilt/Saturation',... 'Description','F')
falseSelectors =
1x2 MetricSelector array with properties:
ObjectiveIndex
OutcomeIndex
Description
Type
Id
ConstructorCode
В блоке «Насыщенность» имеется два селектора ложного регистра. Первый селектор - F outcome of input > lower limit.
falseSel = falseSelectors(1)
falseSel =
MetricSelector with properties:
ObjectiveIndex: 1
OutcomeIndex: 1
Description: 'F outcome of input > lower limit in Saturate block "Saturation"'
Type: DecisionOutcome
Id: 'slvnvdemo_covfilt:5'
ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome, 'slvnvdemo_covfilt:5', 1, 1)'
falseSel селектор тот же, что был создан вручную с помощью slcoverage.MetricSelector. Показатели цели и результата являются свойствами результирующего селекторного объекта.
Создание объекта фильтра с помощью slcoverage.Filter. Можно задать имя файла фильтра и описание фильтра с помощью методов setFilterName и setFilterDescriptionсоответственно.
filt = slcoverage.Filter; setFilterName(filt,'slcoverage_filter'); setFilterDescription(filt,'Example Filter');
Создание правила фильтрации с помощью slcoverage.FilterRule. Первый вход в FilterRule - селектор для блока или результата, который требуется отфильтровать. Это может быть созданный селектор или селектор, который вы извлекаете из allSelectors.
Второй ввод является обоснованием для фильтрации результата или блока. Указывается как символьный массив.
Третьим входным сигналом является режим фильтра, который требуется использовать. Два режима фильтра покрытия - выравнивание и исключение. Используйте режим выравнивания для фильтрации результатов отдельных целей покрытия, таких как F outcome of input > lower limit. Режим исключения используется для фильтрации целых элементов или блоков модели, что означает, что блок и его потомки, если применимо, игнорируются. В этом примере используйте режим выравнивания, чтобы указать, что требуется фильтровать определенный результат.
rule = slcoverage.FilterRule(metricSel,'rate > 0',slcoverage.FilterMode.Justify);
Добавить правило в фильтр с помощью addRule.
filt.addRule(rule);
Сохраните фильтр в файл фильтра с помощью save способ. Затем примените файл фильтра к cvdata путем назначения filter в новый файл фильтра.
filt.save('covfilter'); covData.filter = 'covfilter';
Повторно сгенерировать результаты покрытия для блока насыщения с помощью отфильтрованного cvdata объект.
filteredSaturation = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationFilt = 100 * filteredSaturation(1)/filteredSaturation(2)
percentSaturationFilt =
75
Покрытие принятия решений для блока Насыщения теперь составляет 75%.
Можно применить тот же рабочий процесс для выравнивания определенного действия потока состояний. В этом примере мы хотим оправдать tick Цель MCDC, которая является частью after(4, tick) переход.
Сначала получите корневой объект Stateflow с помощью sfroot (Stateflow).
chartID = sfroot;
Получить 'after(4, tick)' идентификатор перехода с помощью find (Stateflow) метод. Вы можете использовать find для поиска переходов с помощью '-isa' флаг с 'Stateflow.Transition'. Кроме того, можно указать точный переход с помощью поиска строки метки с помощью дополнительных входных данных.
transID = chartID.find('-isa','Stateflow.Transition','LabelString','after(4, tick)');
Получение идентификатора Simulink диаграммы с помощью Simulink.ID.getSID.
transSID = Simulink.ID.getSID(transID);
Получите селектор для результата цели MCDC, который мы хотим отфильтровать с помощью allSelectors. Передайте идентификатор Simulink перехода Stateflow в качестве первого входа. Потому что мы хотим оправдать tick результат, поиск "tick" в описании.
sfSelectors = slcoverage.Selector.allSelectors(transSID,'Description','"tick"')
sfSelectors =
1x3 MetricSelector array with properties:
ObjectiveIndex
OutcomeIndex
Description
Type
Id
ConstructorCode
allSelectors возвращает три возможных селектора. Переход, который мы хотим отфильтровать, является третьим возвращенным селектором.
sfSel = sfSelectors(3)
sfSel =
MetricSelector with properties:
ObjectiveIndex: 1
OutcomeIndex: 1
Description: 'Condition 1, "tick" outcome of Transition trigger expression in Transition "after(4, tick)" from "Clipped" to "Full"'
Type: MCDCOutcome
Id: 'slvnvdemo_covfilt:6:5'
ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.MCDCOutcome, 'slvnvdemo_covfilt:6:5', 1, 1)'
Создайте правило, добавьте его в фильтр и сохраните. Файл фильтра уже применен к cvdata объект.
rule2 = slcoverage.FilterRule(sfSel,'tick never false'); filt.addRule(rule2); filt.save('covfilter');
Дополнительные сведения о программном API stateflow см. в разделе Обзор API Stateflow (Stateflow).
Фильтровать блок можно с помощью slcoverage.BlockSelector. В этом случае мы хотим исключить подсистему конфигурации Switchable, поэтому мы используем SubsystemAllContent тип селектора и slcoverage.FilterMode.Exclude режим фильтрации.
subsysSel = slcoverage.BlockSelector(... slcoverage.BlockSelectorType.SubsystemAllContent,... 'slvnvdemo_covfilt/Switchable config');
Создайте правило фильтрации, передав в качестве входных данных селектор, обоснование и режим фильтра исключения.
rule3 = slcoverage.FilterRule(subsysSel,... 'Unused configuration',... slcoverage.FilterMode.Exclude);
Добавьте правило к фильтру и сохраните его.
filt.addRule(rule3);
filt.save('covfilter');
Наконец, отчет о покрытии можно просмотреть с помощью cvhtml. В разделе Объекты, отфильтрованные из анализа покрытия (Objects Filtered From Coverage Analysis) показана сводка отфильтрованных объектов модели и обоснования. 'sRT=0' может использоваться для создания отчета о покрытии, но не для автоматического открытия отчета.
cvhtml('filteredCovReport',covData,'-sRT=0');

allSelectors | Свойства cvdata | cvhtml | decisioninfo | slcoverage.BlockSelector | slcoverage.FilterRule | slcoverage.MetricSelector | slcoverage.Selector