В этом примере показано, как к программно объектам фильтра и результатам от результатов покрытия.
Во-первых, загрузите модель в память.
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);
Просмотрите результаты покрытия прежде, чем применить фильтр. Можно получить доступ к результатам Decision Coverage с помощью decisioninfo
.
saturationInitial = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationCov = 100 * saturationInitial(1)/saturationInitial(2)
percentSaturationCov = 50
Блок Saturation имеет 50% Decision Coverage. Если вы не намереваетесь для этого блока быть удовлетворенными, можно отфильтровать недостающий объективный результат так, чтобы о нем больше не сообщали как недостающее покрытие. Во-первых, вам нужен селектор для неудовлетворенного объективного результата, который вы хотите отфильтровать.
Можно непосредственно создать селектор с помощью соответствующего конструктора. В этом случае вы использовали бы slcoverage.MetricSelector
.
Поскольку выравниваемая по ширине цель является результатом решения, первым входом метрическому селекторному конструктору является slcoverage.MetricSelectorType.DecisionOutcome
. Второй вход является указателем блока. Последние два являются индексом цели выровнять по ширине и индекс результата той цели, соответственно. Поскольку input > lower limit
цель решения является первой целью для блока Saturation, его объективным индексом является 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
видеть доступные селекторы для блока Saturation.
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
В блоке Saturation существует два ложных селектора случая. Первым селектором является 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';
Регенерируйте результаты покрытия для блока Saturation с помощью отфильтрованного cvdata
объект.
filteredSaturation = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationFilt = 100 * filteredSaturation(1)/filteredSaturation(2)
percentSaturationFilt = 75
Decision Coverage для блока Saturation - теперь 75%.
Можно применить тот же рабочий процесс, чтобы выровнять по ширине определенное действие Stateflow. В этом примере мы хотим выровнять по ширине tick
Цель MCDC, которая является частью after(4, tick)
переход.
Во-первых, получите корневой объект Stateflow при помощи sfroot
(Stateflow).
chartID = sfroot;
Получите 'after(4, tick)'
ID перехода при помощи find
(Stateflow) метод. Можно использовать find
искать переходы при помощи '-isa'
отметьте с помощью 'Stateflow.Transition'
. Можно далее задать точный переход при помощи поиска строки метки с помощью дополнительных входных параметров.
transID = chartID.find('-isa','Stateflow.Transition','LabelString','after(4, tick)');
Получите ID Simulink графика при помощи Simulink.ID.getSID
.
transSID = Simulink.ID.getSID(transID);
Получите селектор для объективного результата MCDC, который мы хотим отфильтровать при помощи allSelectors
. Передайте ID 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');
Для получения дополнительной информации о stateflow программируемом API, см. Обзор API Stateflow (Stateflow).
Можно отфильтровать блок с помощью slcoverage.BlockSelector
. В этом случае мы хотим исключить Переключаемую подсистему config, таким образом, мы используем 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');
slcoverage.BlockSelector
| slcoverage.FilterRule
| slcoverage.MetricSelector
| slcoverage.Selector
| allSelectors
| cvhtml
| decisioninfo
| cvdata