Проверьте компонент для генерации кода

Об модели примера

Этот пример использует 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, создайте модель тестовой обвязки, которая содержит входные сигналы, которые моделируют контроллер в модели объекта управления:

  1. Откройте slvnvdemo_powerwindow пример модели и модели-ссылки:

    open_system('slvnvdemo_powerwindow');
    open_system('slvnvdemo_powerwindow_controller');
    
  2. Откройте power_window_control_system подсистема в модели примера.

    Блок Model с именем control в power_window_control_system подсистема ссылается на компонент, который вы проверяете в этом примере, slvnvdemo_powerwindow_controller.

  3. Симулируйте Model блок, который ссылается на slvnvdemo_powerwindow_controller моделируйте и логгируйте входные сигналы в блок Model:

    loggedSignalsPlant = sldvlogsignals( ...
    	'slvnvdemo_powerwindow/power_window_control_system/control');

    sldvlogsignals сохраняет записанные сигналы в loggedSignalsPlant.

  4. Сгенерируйте модель тестовой обвязки с записанными сигналами:

    harnessModelFilePath = sldvmakeharness( ...
    	'slvnvdemo_powerwindow_controller', loggedSignalsPlant);
    

    sldvmakeharness создает и открывает модель тестовой обвязки с именем slvnvdemo_powerwindow_controller_harness. Блок Signal Builder содержит один тест, содержащий записанные сигналы.

    Для получения дополнительной информации о моделях тестовой обвязки см. Simulink Design Verifier Моделей тестовой обвязки.

  5. Для использования позже в этом примере сохраните имя модели тестовой обвязки:

    [~, harnessModel] = fileparts(harnessModelFilePath);
  6. Оставьте все окна открытыми для следующей части этого примера.

Далее вы запишете покрытие для slvnvdemo_powerwindow_controller модель.

Запись покрытия для компонента

Покрытие модели является мерой того, насколько тщательно тест проверяет модель, и процент путей, которые тест упражняет. Запись покрытия для slvnvdemo_powerwindow_controller модель:

  1. Создайте объект опций по умолчанию, требуемый sldvruntest функция:

    runOpts = sldvruntestopts;
  2. Задайте, чтобы симулировать модель и записать покрытие:

    runOpts.coverageEnabled = true;
  3. Симулируйте модель-ссылку и записывайте покрытие:

    [~, covDataFromLoggedSignals] = sldvruntest( ...
    	'slvnvdemo_powerwindow_controller', loggedSignalsPlant, runOpts);
  4. Отображение отчета о покрытии 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 для записи дополнительного покрытия

Можно использовать Simulink Design Verifier, чтобы анализировать slvnvdemo_powerwindow_controller моделировать и собирать покрытие. Можно задать, что анализ игнорирует любые ранее удовлетворенные цели и регистрирует дополнительное покрытие.

Чтобы записать дополнительное покрытие для модели:

  1. Сохраните данные о покрытии, которые вы записали для записанных сигналов в файле:

    cvsave('existingCovFromLoggedSignal', covDataFromLoggedSignals);
  2. Создайте объект опций по умолчанию для анализа:

    opts = sldvoptions;
  3. Укажите, что анализ генерирует тесты для записи решения, условия и измененного покрытия состояния/решения:

    opts.ModelCoverageObjectives = 'MCDC';
  4. Укажите, что анализ игнорирует цели, которые вы выполнили, когда вы записали сигналы в блок Model:

    opts.IgnoreCovSatisfied = 'on';
  5. Укажите имя файла, содержащего удовлетворенные данные о целях:

    opts.CoverageDataFile = 'existingCovFromLoggedSignal.cvt';
  6. Укажите, что анализ создает длинные тесты, которые удовлетворяют нескольким целям:

    opts.TestSuiteOptimization = 'LongTestcases';

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

  7. Задайте, чтобы создать модель тестовой обвязки, которая ссылается на компонент с помощью блока Model:

    opts.saveHarnessModel = 'on';
    opts.ModelReferenceHarness = 'on';

    Модель тестовой обвязки, которую вы создали из записанных сигналов в Prepare the Component for Verification, использует блок Model, который ссылается на slvnvdemo_powerwindow_controller модель. Модель тестовой обвязки, которую создает анализ, должна также использовать Model блок, который ссылается slvnvdemo_powerwindow_controller. Можно добавить данные теста к первой модели тестовой обвязки, создав один тестовый набор.

  8. Анализируйте модель с помощью Simulink Design Verifier:

    [status, fileNames] = sldvrun('slvnvdemo_powerwindow_controller', ...
    	opts, true);

    Анализ создает и открывает модель тестовой обвязки slvnvdemo_powerwindow_controller_harness. Блок Signal Builder содержит один длинный тест, который удовлетворяет 74 целям тестирования.

    Можно объединить этот тест с тестом, созданной в разделе Подготовка компонента к Верификации, для записи дополнительного покрытия для slvnvdemo_powerwindow_controller модель.

  9. Сохраните имя новой модели тестовой обвязки и откройте его:

    [~, newHarnessModel] = fileparts(fileNames.HarnessModel);
    open_system(newHarnessModel); 

Затем вы комбинируете две модели тестовой обвязки, чтобы создать один тестовый набор.

Объединение моделей тестовой обвязки

Вы создали две модели тестовой обвязки, когда вы:

  • Зарегистрировал сигналы в блоке Model управления, который ссылается на slvnvdemo_powerwindow_controller модель.

  • Проанализировал slvnvdemo_powerwindow_controller модель.

Если вы комбинируете тесты в обеих моделях тестовой обвязки, можно записать покрытие, которое приближает вас к достижению 100% покрытия:

  1. Объедините модели тестовой обвязки путем добавления самых последних тестов к тестам для записанных сигналов:

    sldvmergeharness(harnessModel, newHarnessModel);

    Блок Signal Builder в slvnvdemo_powerwindow_controller_harness теперь модель содержит оба тестов.

  2. Логгирование сигналов в модель тестовой обвязки:

    loggedSignalsMergedHarness = sldvlogsignals(harnessModel);
  3. Используйте комбинированные тесты для записи покрытия для slvnvdemo_powerwindow_controller_harness модель. Во-первых, сконфигурируйте объект опции для sldvruntest:

    runOpts = sldvruntestopts;
    runOpts.coverageEnabled = true;
  4. Симулируйте модель и запись и отображение данных о покрытии:

    [~, 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).

При выполнении этой процедуры симуляция компилирует и выполняет код модели, используя оба тестов.

  1. Создайте объект опций по умолчанию для sldvruncgvtest:

    runcgvopts = sldvruntestopts('cgv');
  2. Задайте, чтобы выполнить модель в режиме симуляции:

    runcgvopts.cgvConn = 'sim';
  3. Выполните slvnv_powerwindow_controller моделируйте используя два тестов и runcgvopts объект:

    cgvSim = sldvruncgvtest('slvnvdemo_powerwindow_controller', ...
    	loggedSignalsMergedHarness, runcgvopts);

    Эти шаги сохраняют результаты в переменной рабочей области cgvSim.

Затем вы выполните ту же модель с теми же тестами в режиме Software-in-the-Loop (SIL) и сравните результаты обоих симуляций.

Для получения дополнительной информации о режиме симуляции Normal, смотрите Выполнение модели (Embedded Coder).

Выполните компонент в режиме Software-in-the-Loop (SIL)

Когда вы выполняете модель в Цикл (SIL) режиме, симуляция компилирует и выполняет сгенерированный код на вашем хосте-компьютере.

В этом разделе вы выполняете slvnvdemo_powerwindow_controller моделируйте в режиме SIL и сравните результаты с предыдущим разделом, когда вы выполняли модель в режиме симуляции.

  1. Задайте, чтобы выполнить модель в режиме SIL:

    runcgvopts.cgvConn = 'sil';
  2. Выполните slvnv_powerwindow_controller моделируйте используя два тестов и runcgvopts объект:

    cgvSil = sldvruncgvtest('slvnvdemo_powerwindow_controller', ...
    	loggedSignalsMergedHarness, runcgvopts);

    Переменная рабочей области cgvSil содержит результаты выполнения режима SIL.

  3. Сравните результаты в 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
  4. Отображение результатов сравнения в MATLAB® Командное окно:

    fprintf(['\nTest Case(%d):%d Signals match, %d Signals mismatch\r'],...
    	i, length(matchNames), length(mismatchNames));
    

    Как и ожидалось, результаты двух симуляций совпадают.

Для получения дополнительной информации о симуляциях ПО в цикле (SIL), смотрите Что такое SIL и PIL симуляции? (Embedded Coder).