Этот пример показывает, как использовать функции верификации компонента Simulink® Coverage™, чтобы регистрировать входные сигналы, создать модель тестовой обвязки и выполнить тесты.
Пример запускается путем журналирования входных сигналов к компоненту, реализующему контроллер в его родительской модели и создающему модель тестовой обвязки для контроллера от этого записанные данные. Вы создаете новый тест в модели тестовой обвязки. Затем вы получаете все тесты и моделируете модели контроллеров для покрытия модели. Наконец, вы выполняете контроллер с теми тестами в режиме симуляции и режиме (SIL) программного обеспечения In the Loop, и сравниваете результаты с помощью API CGV.
Этот пример требует допустимой лицензии Stateflow®. Чтобы продемонстрировать выполнение теста в режиме (SIL) программного обеспечения In the Loop, это также требует допустимого Simulink® Coder™ и лицензий Embedded Coder™.
if ~license('test','stateflow') return; end canUseSIL = license('test','Real-Time_Workshop') && ... license('test','rtw_embedded_coder');
Модель slvnvdemo_powerwindow
содержит контроллер окна со стеклоподъемником и модель объекта управления младшего разряда. slvnvdemo_powerwindow/power_window_control_system/control
компонента является блоком Model, который ссылается на модель slvnvdemo_powerwindow_controller
, которая реализует контроллер с графиком Stateflow®.
Чтобы создать модель тестовой обвязки для контроллера с, сигналы, которые моделируют контроллер в модели объекта управления, сначала регистрируйте входные сигналы и затем вызовите генерацию обвязки с этим записанные данные.
open_system('slvnvdemo_powerwindow'); load_system('slvnvdemo_powerwindow_controller'); loggedSignalsPlant = ... slvnvlogsignals('slvnvdemo_powerwindow/power_window_control_system/control'); harnessModelFilePath = ... slvnvmakeharness('slvnvdemo_powerwindow_controller',loggedSignalsPlant); [~,harnessModel] = fileparts(harnessModelFilePath);
### Successfully updated the model reference simulation target for model: slvnvdemo_powerwindow_controller ### Successfully updated the model reference simulation target for model: slvnvdemo_powerwindow_controller
Можно изменить тестовые данные в модели тестовой обвязки путем ручного редактирования значений данных с помощью пользовательского интерфейса Signal Builder. Можно также создать новые тесты путем создания новых групп сигнала в блоке. Также можно использовать команду signalbuilder
, чтобы выполнить то же самое программно.
load('slvnvdemo_powerwindow_controller_newtestcase.mat'); 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');
По порядку, чтобы программно выполнить модель slvnvdemo_powerwindow_controller
с тестами, разработанными в модели тестовой обвязки, сначала необходимо использовать функцию slvnvlogsignals
, чтобы получить входные значения всех тестов в необходимом формате данных.
loggedSignalsHarness = slvnvlogsignals(harnessModel); disp(loggedSignalsHarness);
LoggedTestUnitInfo: [1×1 struct] TestCases: [1×2 struct]
Используйте функцию slvnvruntest
, чтобы моделировать контроллер со всеми тестами, разработанными в обвязке и измерить покрытие модели.
runopts = slvnvruntestopts; runopts.coverageEnabled = true; [~, covdata] = slvnvruntest('slvnvdemo_powerwindow_controller',... loggedSignalsHarness,runopts); cvhtml('Coverage with Test Cases from Harness', covdata);
Используйте функцию slvnvruncgvtest
, чтобы выполнить модель slvnvdemo_powerwindow_controller
в режиме симуляции с тестами, полученными от модели тестовой обвязки.
runopts = slvnvruntestopts('cgv'); disp(runopts); runopts.cgvConn = 'sim'; cgvSim = slvnvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsHarness,runopts);
testIdx: [] allowCopyModel: 0 cgvCompType: 'topmodel' cgvConn: 'sim' Starting execution: ComponentType: topmodel Connectivity: sim InputData: Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_1_2.mat End CGV execution: status completed. Starting execution: ComponentType: topmodel Connectivity: sim InputData: Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_2_2.mat End CGV execution: status completed.
Теперь используйте функцию slvnvruncgvtest
, чтобы выполнить модель slvnvdemo_powerwindow_controller
в режиме SIL с теми же тестами.
if canUseSIL runopts.cgvConn = 'sil'; else % When SIL is not possible, the example runs another simulation. runopts.cgvConn = 'sim'; end cgvSil = slvnvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsHarness,runopts);
Starting execution: ComponentType: topmodel Connectivity: sil InputData: Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_1_3.mat ### Starting build procedure for model: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for model: slvnvdemo_powerwindow_controller ### Preparing to start SIL simulation ... Building with 'Microsoft Visual C++ 2015 Professional (C)'. MEX completed successfully. ### Starting SIL simulation for component: slvnvdemo_powerwindow_controller ### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller End CGV execution: status completed. Starting execution: ComponentType: topmodel Connectivity: sil InputData: Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_2_3.mat ### Starting build procedure for model: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for model: slvnvdemo_powerwindow_controller ### Preparing to start SIL simulation ... Building with 'Microsoft Visual C++ 2015 Professional (C)'. MEX completed successfully. ### Starting SIL simulation for component: slvnvdemo_powerwindow_controller ### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller End CGV execution: status completed.
slvnvruncgvtest
возвращает объект cgv.CGV
после запущения тестов. Используйте API CGV, чтобы сравнить результаты выполнения в симуляции и режимах SIL для каждого теста, разработанного в модели тестовой обвязки и показать, что они равны.
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
Test Case(1): 4 Signals match, 0 Signals mismatch Test Case(2): 4 Signals match, 0 Signals mismatch
Наконец, вы сознательно сравниваете результаты выполнения для различных тестов, которые не должны совпадать и видеть, как API CGV может быть усилен, чтобы обнаружить и построить несоответствия в результатах.
simout = cgvSim.getOutputData(1); silout = cgvSil.getOutputData(2); [matchNames , ~, mismatchNames, ~ ] = ... cgv.CGV.compare( simout, silout, 'Plot', 'mismatch'); fprintf('\n%d Signals match, %d Signals mismatch\n', ... length(matchNames), length(mismatchNames)); disp('Mismatched Signal Names:'); disp(mismatchNames);
2 Signals match, 2 Signals mismatch Mismatched Signal Names: 'simout.get('logsout_slvnvruncgv…' 'simout.get('yout_slvnvruncgvtes…'
Используйте Инспектора Данных моделирования, чтобы построить образцовые выходные параметры и графически сравнить результаты симуляции и выполнения SIL. Вы запускаете Инспектора Данных моделирования с Симуляцией-> вывод-> Инспектор Данных моделирования... пункт меню. Можно загрузить результаты CGV с данными о пункте меню File-> Import... по интерфейсу Simulation Data Inspector. Выберите все восемь записей, связанных с этими переменными результата:
simout1 = cgvSim.getOutputData(1); silout1 = cgvSil.getOutputData(1); simout2 = cgvSim.getOutputData(2); silout2 = cgvSil.getOutputData(2);
Чтобы завершить пример, закройте все модели.
close_system(harnessModel,0); close_system('slvnvdemo_powerwindow'); close_system('slvnvdemo_powerwindow_controller');