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

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

Этот пример использует 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 подсистему показывают ниже.

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

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

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

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

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

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

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