В этом примере показано, как использовать функции Simulink ® Design Verifier™ для регистрации входных сигналов, создания модели кабельных трасс, создания тестовых примеров для отсутствующего покрытия, объединения моделей кабельных трасс и выполнения тестовых примеров.
Пример начинается с регистрации входных сигналов в компоненте, который реализует контроллер в родительской модели, и создания модели кабельных трасс для контроллера на основе записанных данных. Вы используете Simulink Design Verifier, чтобы найти новый тестовый случай, который достигает недостающего покрытия. Затем первую модель электрического жгута объединяют с моделью электрического жгута, созданной после анализа Simulink Design Verifier. Наконец, вы захватываете все тестовые примеры и выполняете контроллер с этими тестовыми примерами в режиме моделирования и в режиме программного обеспечения в цикле (SIL), а также сравниваете результаты с помощью API CGV.
В этом примере требуется действительная лицензия Stateflow ®. Для демонстрации выполнения теста в режиме SIL также требуются действительные лицензии 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 является блоком модели, который ссылается на модель slvnvdemo_powerwindow_controller, который реализует контроллер с диаграммой Stateflow ®.
Чтобы создать модель электрического жгута для контроллера с сигналами, моделирующими контроллер в модели завода, сначала зарегистрируйте входные сигналы, а затем вызовите генерацию электрического жгута с записанными данными.
open_system('slvnvdemo_powerwindow'); load_system('slvnvdemo_powerwindow_controller'); loggedSignalsPlant = ... sldvlogsignals('slvnvdemo_powerwindow/power_window_control_system/control'); harnessModelFilePath = ... sldvmakeharness('slvnvdemo_powerwindow_controller',loggedSignalsPlant); [~,harnessModel] = fileparts(harnessModelFilePath);
### Starting serial model reference simulation build ### Successfully updated the model reference simulation target for: slvnvdemo_powerwindow_controller Build Summary Simulation targets built: Model Action Rebuild Reason ============================================================================================================================ slvnvdemo_powerwindow_controller Code generated and compiled slvnvdemo_powerwindow_controller_msf.mexa64 does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 20.595s ### Starting serial model reference simulation build ### Model reference simulation target for slvnvdemo_powerwindow_controller is up to date. Build Summary 0 of 1 models built (1 models already up to date) Build duration: 0h 0m 0.55742s ### Starting serial model reference simulation build ### Successfully updated the model reference simulation target for: slvnvdemo_powerwindow_controller Build Summary Simulation targets built: Model Action Rebuild Reason =============================================================================== slvnvdemo_powerwindow_controller Code generated and compiled 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 11.29s




Используйте cvtest и cvsim функции для измерения охвата модели, достигнутого для модели контроллера slvnvdemo_powerwindow_controller с записанными сигналами, которые фиксируются в модели кабельных трасс.
cvhtml функция создает отчет, который указывает, что 40% решения, 35% условия и 10% покрытия MCDC достигается путем моделирования тестовых случаев, полученных из модели с замкнутым контуром.
test = cvtest(harnessModel); test.modelRefSettings.enable = 'On'; test.modelRefSettings.excludeTopModel = 1; covDataFromLoggedSignals = cvsim(test); cvhtml('Coverage with Logged Test Cases',covDataFromLoggedSignals);

Перед использованием существующих данных покрытия во время генерации теста данные должны быть сохранены в файле данных покрытия (.cvt). Существующие данные о покрытии можно использовать путем указания пути к данным о покрытии в параметре файла данных о покрытии и установки для параметра Игнорировать цели, удовлетворяющие существующим данным о покрытии, значения on на панели Test Generation конфигурационных параметров Simulink Design Verifier.
Как видно из отчета, Simulink Design Verifier ограничивает создание тестов целями покрытия, которые не охвачены существующим файлом покрытия. Обратите внимание на то, что 8 целей покрытия в диаграмме Stateflow control доказано, что они являются неудовлетворительными. Это указывает на ненужную избыточную логику, которая не может быть протестирована.
cvsave('existingCovFromLoggedSignals',covDataFromLoggedSignals); opts = sldvoptions; opts.IgnoreCovSatisfied = 'on'; opts.CoverageDataFile = 'existingCovFromLoggedSignals.cvt'; opts.ModelCoverageObjectives = 'MCDC'; opts.TestSuiteOptimization = 'LongTestcases'; opts.SaveHarnessModel = 'on'; opts.ModelReferenceHarness = 'on'; opts.MaxProcessTime = 500; [status, fileNames] = sldvrun('slvnvdemo_powerwindow_controller',opts,true); [~, newHarnessModel] = fileparts(fileNames.HarnessModel); open_system(newHarnessModel);



Теперь используйте sldvmergeharness для объединения сгенерированных тестовых случаев с зарегистрированным тестовым случаем. Команда принимает список моделей кабельных трасс в качестве аргументов.
sldvmergeharness(harnessModel, newHarnessModel);

Для программного выполнения модели slvnvdemo_powerwindow_controller с тестовыми примерами, захваченными в объединенной модели кабельных трасс, сначала используйте sldvlogsignals для получения входных значений всех тестовых примеров в необходимом формате данных.
loggedSignalsMergedHarness = sldvlogsignals(harnessModel); disp(loggedSignalsMergedHarness);
LoggedTestUnitInfo: [1x1 struct]
TestCases: [1x2 struct]


Используйте sldvruncgvtest для выполнения модели slvnvdemo_powerwindow_controller в режиме моделирования с тестовыми примерами, полученными из модели кабельных трасс.
runopts = sldvruntestopts('cgv'); disp(runopts); runopts.cgvConn = 'sim'; cgvSim = sldvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsMergedHarness,runopts);
testIdx: []
allowCopyModel: 0
cgvCompType: 'topmodel'
cgvConn: 'sim'
Starting execution:
ComponentType: topmodel
Connectivity: sim
InputData:
/tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1.mat
End CGV execution: status completed.
Starting execution:
ComponentType: topmodel
Connectivity: sim
InputData:
/tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2.mat
End CGV execution: status completed.
Теперь используйте sldvruncgvtest для выполнения модели 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 = sldvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsMergedHarness,runopts);
Starting execution: ComponentType: topmodel Connectivity: sil InputData: /tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1_1.mat ### Starting build procedure for: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for: slvnvdemo_powerwindow_controller Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================================= slvnvdemo_powerwindow_controller Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.243s ### Preparing to start SIL simulation ... Building with 'gcc'. 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: /tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2_1.mat ### Starting build procedure for: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for: slvnvdemo_powerwindow_controller Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================ slvnvdemo_powerwindow_controller Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.9951s ### Preparing to start SIL simulation ... Building with 'gcc'. MEX completed successfully. ### Starting SIL simulation for component: slvnvdemo_powerwindow_controller ### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller End CGV execution: status completed.
sldvruncgvtest возвращает cgv.CGV объект после выполнения тестов. Используйте API CGV, чтобы сравнить результаты выполнения в режимах моделирования и SIL для каждого тестового случая, разработанного в модели кабельных трасс, и показать, что они равны.
for i=1:length(loggedSignalsMergedHarness.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
Чтобы завершить пример, закройте все модели.
close_system(harnessModel,0); close_system(newHarnessModel,0); close_system('slvnvdemo_powerwindow',0); close_system('slvnvdemo_powerwindow_controller',0);