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

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

Компонент, который вы проверяете, является блоком Model под названием control, который является частью подсистемы power_window_control_system в модели slvnvdemo_powerwindow.

Блок Model ссылается на модель slvnvdemo_powerwindow_controller.

Модель, на которую ссылаются, реализует логику контроллера с графиком Stateflow®.

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

Начните путем создания модели тестовой обвязки, содержащей входные сигналы, которые моделируют контроллер в модели объекта управления:

1. Откройте модель slvnvdemo_powerwindow в качестве примера и загрузите модель, на которую ссылаются.

   addpath(fullfile(matlabroot,'toolbox','slcoverage','slcovdemos'));
   open_system(fullfile(matlabroot,'toolbox','slcoverage','slcovdemos',...
       'slvnvdemo_powerwindow.slx'))
   load_system('slvnvdemo_powerwindow_controller');

2. Моделируйте блок Model и регистрируйте входные сигналы к блоку Model:

   modelController = 'slvnvdemo_powerwindow/power_window_control_system/control';
   evalc('loggedSignalsPlant = slvnvlogsignals(modelController)');

slvnvlogsignals хранит регистрируемые сигналы в переменной loggedSignalsPlant.

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

   harnessModelFilePath = slvnvmakeharness('slvnvdemo_powerwindow_controller');

slvnvmakeharness создает модель тестовой обвязки под названием slvnvdemo_powerwindow_controller_harness. Модель тестовой обвязки включает:

  • Протестируйте Модуль - блок Model, который ссылается на модель slvnvdemo_powerwindow_controller.

  • Входные параметры - блок Signal Builder, который содержит один тест. Тот тест задает значения входных сигналов, регистрируемых, когда модель slvnvdemo_powerwindow моделировалась.

  • Блок Test Case Explanation - A DocBlock, который описывает тест.

  • Тип размера - блок Subsystem, который передает сигналы от блока Inputs до блока Test Unit. Выходные сигналы этого блока совпадают с входными сигналами для блока Model, который вы проверяете.

  • moveUp и moveDown - Два выходных порта, которые совпадают с выходными портами от блока Model.

4. Получите имя модели тестовой обвязки:

   [~,harnessModel] = fileparts(harnessModelFilePath);

5. Оставьте все модели открытыми для следующих шагов.

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

Создайте и регистрируйте тесты

Добавьте тест для своего компонента, чтобы помочь вам стать ближе к 100%-му покрытию.

Добавьте тест в блок Signal Builder в модели тестовой обвязки с помощью функции signalbuilder. Тест задает входные сигналы к компоненту.

1. Загрузите файл, содержащий данные о тесте в рабочее пространство MATLAB:

   load('slvnvdemo_powerwindow_controller_newtestcase.mat');

Переменные newTestData и newTestTime рабочей области содержат данные о тесте.

2. Добавьте тест в блок Signal Builder в модели тестовой обвязки.

   signalBuilderBlock = slvnvdemo_signalbuilder_block(harnessModel);
   signalbuilder(signalBuilderBlock,'Append',...
       newTestTime, newTestData,...
       {'endstop','obstacle','driver(1)','driver(2)','driver(3)',...
       'passenger(1)','passenger(2)','passenger(3)'},'New Test Case');

3. Моделируйте модель тестовой обвязки с обоими тестами, затем регистрируйте сигналы к модели, на которую ссылаются, и сохраните результаты:

   loggedSignalsHarness = slvnvlogsignals(harnessModel);

Затем, запишите покрытие для модели slvnv_powerwindow_controller.

Объедините данные о тесте

У вас есть два набора данных о тесте:

  • loggedSignalsPlant - Регистрируемые сигналы к управлению блоком Model

  • loggedSignalsHarness - Регистрируемые сигналы к тестам вы добавили к пустой обвязке

Чтобы моделировать все тестовые данные одновременно, объедините эти два файла данных в один файл:

1. Объедините данные о тесте:

   mergedTestCases = slvnvmergedata(loggedSignalsPlant, loggedSignalsHarness);

2. Просмотрите объединенные данные:

   disp(mergedTestCases);

Затем, моделируйте модель, на которую ссылаются, с объединенными данными и получите покрытие для модели, на которую ссылаются, slvnv_powerwindow_controller.

Покрытие записи для компонента

Покрытие записи для модели slvnv_powerwindow_controller.

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

   runopts = slvnvruntestopts;

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

   runopts.coverageEnabled = true;

3. Моделируйте модель с помощью регистрируемых входных сигналов:

   [~, covdata] = slvnvruntest('slvnvdemo_powerwindow_controller',...
       mergedTestCases,runopts);

4. Отобразите отчет покрытия HTML:

   cvhtml('Coverage with Test Cases from Harness', covdata);

Модель slvnv_powerwindow_controller достигла:

  • Decision Coverage: 44%

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

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

Для получения дополнительной информации о Decision Coverage, покрытие условия и покрытие MCDC, видят Типы Покрытия модели.

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

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

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

   runcgvopts = slvnvruntestopts('cgv');

2. Задайте, чтобы выполнить модель в режиме симуляции:

   runcgvopts.cgvConn = 'sim';

3. Выполните модель slvnv_powerwindow_controller с помощью этих двух тестов и объекта runopts:

   slmodel = 'slvnvdemo_powerwindow_controller';
   evalc('cgvSim=slvnvruncgvtest(slmodel, mergedTestCases, runcgvopts)');

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

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

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

Выполните компонент в режиме SIL

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

Чтобы выполнить модель в режиме SIL, у вас должна быть лицензия Embedded Coder™.

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

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

   runcgvopts.cgvConn = 'sil';

2. Выполните модель slvnv_powerwindow_controller с помощью объединенных тестов и объекта runopts:

   evalc('cgvSil = slvnvruncgvtest(slmodel, mergedTestCases, runcgvopts)');

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

3. Отобразите сравнение результатов в cgvSil к результатам в cgvSim (результаты выполнения режима симуляции). Используйте метод cgv.CGV.compare, чтобы сравнить результаты этих двух симуляций:

   for i=1:length(loggedSignalsHarness.TestCases)
       simout = cgvSim.getOutputData(i);
       silout = cgvSil.getOutputData(i);
       [matchNames, ~, mismatchNames, ~ ] = ...
           cgv.CGV.compare(simout, silout);
   fprintf('\nTest Case(%d): %d Signals match, %d Signals mismatch', ...
           i, length(matchNames), length(mismatchNames));
   end

Для получения дополнительной информации о программном обеспечении в цикле (SIL) симуляции, смотрите то, Что SIL и PIL симуляции?