Этот пример использует slvnvdemo_powerwindow
модель, чтобы показать, как проверить компонент в контексте модели, которая содержит этот компонент. Когда вы работаете с этим примером, вы используете Simulink® Design Verifier™ функции верификации компонентов, чтобы создать тесты и измерить покрытие для ссылочной модели. В сложение можно выполнить ссылку на модель как в режиме симуляции, так и в режиме Software-in-the- Цикла (SIL) с помощью Генерации кода Верификации (CGV) API.
Примечание
Для выполнения этого примера необходимо иметь следующие лицензии продукта:
Stateflow®
Embedded Coder®
Функции Simulink Coder™
Проверяемым компонентом является Model блок с именем control
. Этот компонент находится внутри power_window_control_system
подсистема на верхнем уровне slvnvdemo_powerwindow
модель. The power_window_control_system
подсистема показана ниже.
The control
Model блок ссылается на slvnvdemo_powerwindow_controller
модель.
Ссылочная модель содержит диаграмму Stateflow control
, который реализует логику для контроллера окна со степенью.
Чтобы проверить ссылку на модель slvnvdemo_powerwindow_controller
, создайте модель тестовой обвязки, которая содержит входные сигналы, которые моделируют контроллер в модели объекта управления:
Откройте slvnvdemo_powerwindow
пример модели и модели-ссылки:
open_system('slvnvdemo_powerwindow'); open_system('slvnvdemo_powerwindow_controller');
Откройте power_window_control_system
подсистема в модели примера.
Блок Model с именем control
в power_window_control_system
подсистема ссылается на компонент, который вы проверяете в этом примере, slvnvdemo_powerwindow_controller
.
Симулируйте Model блок, который ссылается на slvnvdemo_powerwindow_controller
моделируйте и логгируйте входные сигналы в блок Model:
loggedSignalsPlant = sldvlogsignals( ... 'slvnvdemo_powerwindow/power_window_control_system/control');
sldvlogsignals
сохраняет записанные сигналы в loggedSignalsPlant
.
Сгенерируйте модель тестовой обвязки с записанными сигналами:
harnessModelFilePath = sldvmakeharness( ... 'slvnvdemo_powerwindow_controller', loggedSignalsPlant);
sldvmakeharness
создает и открывает модель тестовой обвязки с именем slvnvdemo_powerwindow_controller_harness
. Блок Signal Builder содержит один тест, содержащий записанные сигналы.
Для получения дополнительной информации о моделях тестовой обвязки см. Simulink Design Verifier Моделей тестовой обвязки.
Для использования позже в этом примере сохраните имя модели тестовой обвязки:
[~, harnessModel] = fileparts(harnessModelFilePath);
Оставьте все окна открытыми для следующей части этого примера.
Далее вы запишете покрытие для slvnvdemo_powerwindow_controller
модель.
Покрытие модели является мерой того, насколько тщательно тест проверяет модель, и процент путей, которые тест упражняет. Запись покрытия для slvnvdemo_powerwindow_controller
модель:
Создайте объект опций по умолчанию, требуемый sldvruntest
функция:
runOpts = sldvruntestopts;
Задайте, чтобы симулировать модель и записать покрытие:
runOpts.coverageEnabled = true;
Симулируйте модель-ссылку и записывайте покрытие:
[~, covDataFromLoggedSignals] = sldvruntest( ... 'slvnvdemo_powerwindow_controller', loggedSignalsPlant, runOpts);
Отображение отчета о покрытии HTML:
cvhtml('Coverage with Test Cases', covDataFromLoggedSignals);
The slvnvdemo_powerwindow_controller
достигнутая модель:
Decision Coverage: 40%
Покрытие условия: 35%
Охват MCDC: 10%
Для получения дополнительной информации о Decision Coverage, покрытии состояний и покрытии MCDC, смотрите Типы покрытия модели ( Simulink Coverage).
Потому что вы не достигли 100% покрытия для slvnvdemo_powerwindow_controller
модель, далее, вы проанализируете модель, чтобы записать дополнительное покрытие и создать дополнительные тесты.
Можно использовать Simulink Design Verifier, чтобы анализировать slvnvdemo_powerwindow_controller
моделировать и собирать покрытие. Можно задать, что анализ игнорирует любые ранее удовлетворенные цели и регистрирует дополнительное покрытие.
Чтобы записать дополнительное покрытие для модели:
Сохраните данные о покрытии, которые вы записали для записанных сигналов в файле:
cvsave('existingCovFromLoggedSignal', covDataFromLoggedSignals);
Создайте объект опций по умолчанию для анализа:
opts = sldvoptions;
Укажите, что анализ генерирует тесты для записи решения, условия и измененного покрытия состояния/решения:
opts.ModelCoverageObjectives = 'MCDC';
Укажите, что анализ игнорирует цели, которые вы выполнили, когда вы записали сигналы в блок Model:
opts.IgnoreCovSatisfied = 'on';
Укажите имя файла, содержащего удовлетворенные данные о целях:
opts.CoverageDataFile = 'existingCovFromLoggedSignal.cvt';
Укажите, что анализ создает длинные тесты, которые удовлетворяют нескольким целям:
opts.TestSuiteOptimization = 'LongTestcases';
Создание меньшего количества тестов, каждый из которых удовлетворяет нескольким целям тестирования, экономит время при выполнении сгенерированного кода в следующем разделе.
Задайте, чтобы создать модель тестовой обвязки, которая ссылается на компонент с помощью блока Model:
opts.saveHarnessModel = 'on'; opts.ModelReferenceHarness = 'on';
Модель тестовой обвязки, которую вы создали из записанных сигналов в Prepare the Component for Verification, использует блок Model, который ссылается на slvnvdemo_powerwindow_controller
модель. Модель тестовой обвязки, которую создает анализ, должна также использовать Model блок, который ссылается slvnvdemo_powerwindow_controller
. Можно добавить данные теста к первой модели тестовой обвязки, создав один тестовый набор.
Анализируйте модель с помощью Simulink Design Verifier:
[status, fileNames] = sldvrun('slvnvdemo_powerwindow_controller', ... opts, true);
Анализ создает и открывает модель тестовой обвязки slvnvdemo_powerwindow_controller_harness
. Блок Signal Builder содержит один длинный тест, который удовлетворяет 74 целям тестирования.
Можно объединить этот тест с тестом, созданной в разделе Подготовка компонента к Верификации, для записи дополнительного покрытия для slvnvdemo_powerwindow_controller
модель.
Сохраните имя новой модели тестовой обвязки и откройте его:
[~, newHarnessModel] = fileparts(fileNames.HarnessModel); open_system(newHarnessModel);
Затем вы комбинируете две модели тестовой обвязки, чтобы создать один тестовый набор.
Вы создали две модели тестовой обвязки, когда вы:
Зарегистрировал сигналы в блоке Model управления, который ссылается на slvnvdemo_powerwindow_controller
модель.
Проанализировал slvnvdemo_powerwindow_controller
модель.
Если вы комбинируете тесты в обеих моделях тестовой обвязки, можно записать покрытие, которое приближает вас к достижению 100% покрытия:
Объедините модели тестовой обвязки путем добавления самых последних тестов к тестам для записанных сигналов:
sldvmergeharness(harnessModel, newHarnessModel);
Блок Signal Builder в slvnvdemo_powerwindow_controller_harness
теперь модель содержит оба тестов.
Логгирование сигналов в модель тестовой обвязки:
loggedSignalsMergedHarness = sldvlogsignals(harnessModel);
Используйте комбинированные тесты для записи покрытия для slvnvdemo_powerwindow_controller_harness
модель. Во-первых, сконфигурируйте объект опции для sldvruntest
:
runOpts = sldvruntestopts; runOpts.coverageEnabled = true;
Симулируйте модель и запись и отображение данных о покрытии:
[~, covDataFromMergedSignals] = sldvruntest( ... 'slvnvdemo_powerwindow_controller', loggedSignalsMergedHarness, ... runOpts); cvhtml('Coverage with Merged Test Cases', covDataFromMergedSignals);
The slvnvdemo_powerwindow_controller
теперь модель достигает:
Decision Coverage: 100%
Покрытие условия: 80%
Охват MCDC: 60%
Чтобы проверить, что сгенерированный код для модели дает те же результаты, что и симуляция модели, используйте методы API верификации кода (CGV).
Примечание
Чтобы выполнить модель в различных режимах выполнения, используйте CGV API, чтобы проверить числовую эквивалентность результатов. Для получения дополнительной информации о CGV API, смотрите Programmatic Code Верификация (Embedded Coder).
При выполнении этой процедуры симуляция компилирует и выполняет код модели, используя оба тестов.
Создайте объект опций по умолчанию для sldvruncgvtest
:
runcgvopts = sldvruntestopts('cgv');
Задайте, чтобы выполнить модель в режиме симуляции:
runcgvopts.cgvConn = 'sim';
Выполните slvnv_powerwindow_controller
моделируйте используя два тестов и runcgvopts
объект:
cgvSim = sldvruncgvtest('slvnvdemo_powerwindow_controller', ... loggedSignalsMergedHarness, runcgvopts);
Эти шаги сохраняют результаты в переменной рабочей области cgvSim
.
Затем вы выполните ту же модель с теми же тестами в режиме Software-in-the-Loop (SIL) и сравните результаты обоих симуляций.
Для получения дополнительной информации о режиме симуляции Normal, смотрите Выполнение модели (Embedded Coder).
Когда вы выполняете модель в Цикл (SIL) режиме, симуляция компилирует и выполняет сгенерированный код на вашем хосте-компьютере.
В этом разделе вы выполняете slvnvdemo_powerwindow_controller
моделируйте в режиме SIL и сравните результаты с предыдущим разделом, когда вы выполняли модель в режиме симуляции.
Задайте, чтобы выполнить модель в режиме SIL:
runcgvopts.cgvConn = 'sil';
Выполните slvnv_powerwindow_controller
моделируйте используя два тестов и runcgvopts
объект:
cgvSil = sldvruncgvtest('slvnvdemo_powerwindow_controller', ... loggedSignalsMergedHarness, runcgvopts);
Переменная рабочей области cgvSil
содержит результаты выполнения режима SIL.
Сравните результаты в cgvSil
к результатам в cgvSim
, созданный из выполнения режима симуляции. Используйте
метод для сравнения результатов двух симуляций:compare
(Embedded Coder)
for i=1:length(loggedSignalsMergedHarness.TestCases) simout = cgvSim.getOutputData(i); silout = cgvSil.getOutputData(i); [matchNames, ~, mismatchNames, ~ ] = ... cgv.CGV.compare(simout, silout); end
Отображение результатов сравнения в MATLAB® Командное окно:
fprintf(['\nTest Case(%d):%d Signals match, %d Signals mismatch\r'],... i, length(matchNames), length(mismatchNames));
Как и ожидалось, результаты двух симуляций совпадают.
Для получения дополнительной информации о симуляциях ПО в цикле (SIL), смотрите Что такое SIL и PIL симуляции? (Embedded Coder).