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

О модели в качестве примера

Этот пример использует модель slvnvdemo_powerwindow, чтобы показать, как проверить компонент в контексте модели, которая содержит тот компонент. Когда вы работаете через этот пример, вы используете функции верификации компонента Simulink® Design Verifier™, чтобы создать тесты и покрытие меры для модели, на которую ссылаются. Кроме того, можно выполнить модель, на которую ссылаются, и в режиме симуляции и в программном обеспечении в режиме Loop (SIL) с помощью API Верификации генерации кода (CGV).

Примечание

У вас должны быть следующие лицензии на продукты, чтобы запустить этот пример:

  • Stateflow®

  • Embedded Coder®

  • Simulink Coder™

Компонент, который вы проверяете, является блоком Model под названием control. Этот компонент находится в подсистеме power_window_control_system в верхнем уровне модели slvnvdemo_powerwindow. Подсистему power_window_control_system показывают ниже.

Блок Model control ссылается на модель 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);

    Модель 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. Укажите, что анализ генерирует тесты, чтобы записать решение, условие и измененное условие/Decision Coverage:

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

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

    opts.CoverageDataFile = 'existingCovFromLoggedSignal.cvt';
  6. Укажите, что анализ не отображает невыполнимые цели в Диагностическом Средстве просмотра:

    opts.DisplayUnsatisfiableObjectives = 'off';

    В данном примере особое внимание находится на удовлетворении как можно большего количества целей.

  7. Укажите, что анализ создает длинные тесты, которые удовлетворяют несколько целей:

    opts.TestSuiteOptimization = 'LongTestcases';

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

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

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

    Модель тестовой обвязки, в которой вы создали из регистрируемых сигналов, Готовится, Компонент для Верификации использует блок Model, который ссылается на модель slvnvdemo_powerwindow_controller. Модель тестовой обвязки, которую создает анализ, должна также использовать блок Model, это ссылается на slvnvdemo_powerwindow_controller. Можно добавить данные о тесте к первой модели тестовой обвязки, создав один тестовый набор.

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

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

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

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

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

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

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

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

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

  • Регистрируемый сигналы к блоку модели управления, что ссылки модель 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);

    Модель slvnvdemo_powerwindow_controller теперь достигает:

    • Decision Coverage: 100%

    • Покрытие условия: 80%

    • Покрытие MCDC: 60%

Выполните компонент в режиме симуляции

Чтобы проверить, что сгенерированный код для модели приводит к тем же результатам как симуляция модели, используйте методы API Верификации генерации кода (CGV).

Примечание

Чтобы выполнить модель в различных режимах выполнения, используйте API CGV, чтобы проверить числовую эквивалентность результатов. Для получения дополнительной информации о API CGV, смотрите Программируемую Верификацию Генерации кода (Embedded Coder).

Когда вы выполняете эту процедуру, симуляция компилирует и выполняет типовой код с помощью обоих тестов.

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

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

    runcgvopts.cgvConn = 'sim';
  3. Выполните модель slvnv_powerwindow_controller с помощью этих двух тестов и объекта runcgvopts:

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

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

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

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

Выполните компонент в программном обеспечении в цикле (SIL) режим

Когда вы выполняете модель в программном обеспечении в режиме Loop (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, чтобы сравнить результаты этих двух симуляций:

    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).