Если Simulink ® Coverage™ установлен, можно собрать метрики покрытия кода во время симуляции «цикл» (SIL) или «цикл» (PIL) - см. «Сбор данных покрытия кода» (Simulink Coverage). В этом примере можно собрать метрики покрытия кода с помощью сторонней программы, то есть BullseyeCoverage или LDRA Testbed. Необходимо установить стороннюю программу - см. Покрытие кода Инструмента Support.
Этот снимок экрана показывает отчет о покрытии кода, полученный при выполнении SIL симуляции с включенным инструментом покрытия кода. Аннотации зависят от заданного инструмента покрытия кода.
В этом примере вы измеряете покрытие модели во время симуляции режима normal mode и повторяете ту же симуляцию в режиме SIL, чтобы измерить покрытие кода. При помощи гиперссылок в отчетах о покрытии модели и покрытии кода можно сравнить результаты покрытия модели и покрытия кода.
Для примеров симуляции SIL и PIL смотрите Тестирование Сгенерированного кода с SIL и PIL симуляциями.
Убедитесь, что модель вновь открыта.
model='rtwdemo_sil_topmodel';
close_system(model,0)
open_system(model)
Удалите существующие папки сборки.
buildFolder=RTW.getBuildDir(model); if exist(buildFolder.BuildDirectory,'dir') rmdir(buildFolder.BuildDirectory,'s'); end
Сконфигурируйте генерацию отчета о покрытии модели.
set_param(model, 'RecordCoverage','on') clear covCumulativeData
Настройте данные стимула.
T=0.1; % sample time [ticks_to_count, reset, counter_mode, count_enable, ... counter_mode_values_run1, counter_mode_values_run2, ... count_enable_values_run1, count_enable_values_run2] = ... rtwdemo_sil_topmodel_data(T);
Модель сконфигурирована, чтобы собрать метрики покрытия модели. Когда симуляция завершена, откроется отчет о покрытии модели. Используйте окно отображения покрытия для перехода от блоков в модели к соответствующим разделам отчета о покрытии.
counter_mode.signals.values = counter_mode_values_run1; count_enable.signals.values = count_enable_values_run1; set_param(model,'SimulationMode','normal');
Настройте Данные Моделирования Inspector для интерактивного просмотра и сравнения результатов симуляции.
Simulink.sdi.view; Simulink.sdi.clear;
Запустите симуляцию.
simout_normal_run1 = sim(model, 'ReturnWorkspaceOutputs', 'on');
Запечатлите результаты.
Simulink.sdi.createRun('Run 1 (normal mode)', 'namevalue',... {'simout_normal_run1'}, {simout_normal_run1});
Для первой симуляции отчет показывает, что достигнутое покрытие составляет менее 100%. Запустите вторую симуляцию с различными входными сигналами, которые увеличивают уровень покрытия MC/DC до 100%. Обратите внимание, что отчет о покрытии модели сконфигурирован, чтобы показать совокупное покрытие в обоих запусках симуляции.
counter_mode.signals.values = counter_mode_values_run2; count_enable.signals.values = count_enable_values_run2; set_param(model,'SimulationMode','normal'); simout_normal_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on'); Simulink.sdi.createRun('Run 2 (normal mode)', 'namevalue',... {'simout_normal_run2'}, {simout_normal_run2});
Перед запуском SIL симуляции проверьте доступность сторонних программ и сконфигурируйте модель, чтобы собрать метрики покрытия кода. Если сторонняя программа недоступна, модель использует Simulink ® Verification и Validation™.
covToolPath = ''; ldraPath = coder.coverage.LDRA.getPath; bullseyePath = coder.coverage.BullseyeCoverage.getPath; coverageSettings = get_param(model,'CodeCoverageSettings'); coverageSettings.TopModelCoverage='on'; if ~isempty(ldraPath) coverageSettings.CoverageTool='LDRA Testbed'; elseif ~isempty(bullseyePath) coverageSettings.CoverageTool='BullseyeCoverage'; else coverageSettings.CoverageTool='None'; end set_param(model,'CodeCoverageSettings',coverageSettings);
Симуляции режима normal mode генерируют метрики покрытия для модели. С помощью SIL симуляции можно применить те же входные сигналы стимула к сгенерированному коду и измерить покрытие кода.
Запустите первую симуляцию в режиме SIL.
counter_mode.signals.values = counter_mode_values_run1; count_enable.signals.values = count_enable_values_run1; set_param(model,'SimulationMode','software-in-the-loop'); set_param(model,'CodeExecutionProfiling','off'); set_param(model,'CodeProfilingInstrumentation','off'); simout_sil_run1 = sim(model, 'ReturnWorkspaceOutputs', 'on'); Simulink.sdi.createRun('Run 1 (SIL mode)', 'namevalue',... {'simout_sil_run1'}, {simout_sil_run1});
### Starting build procedure for: rtwdemo_sil_topmodel ### Successful completion of build procedure for: rtwdemo_sil_topmodel Build Summary Top model targets built: Model Action Rebuild Reason ===================================================================================================== rtwdemo_sil_topmodel 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 44.156s ### Preparing to start SIL simulation ... Building with 'MinGW64 Compiler (C)'. MEX completed successfully. ### Updating code generation report with SIL files ... ### Starting SIL simulation for component: rtwdemo_sil_topmodel ### Stopping SIL simulation for component: rtwdemo_sil_topmodel ### Completed code coverage analysis
Запустите вторую симуляцию в режиме SIL.
counter_mode.signals.values = counter_mode_values_run2; count_enable.signals.values = count_enable_values_run2; set_param(model,'SimulationMode','software-in-the-loop'); set_param(model,'CodeExecutionProfiling','off'); set_param(model,'CodeProfilingInstrumentation','off'); simout_sil_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on'); Simulink.sdi.createRun('Run 2 (SIL mode)', 'namevalue',... {'simout_sil_run2'}, {simout_sil_run2});
### Starting build procedure for: rtwdemo_sil_topmodel ### Generated code for 'rtwdemo_sil_topmodel' is up to date because no structural, parameter or code replacement library changes were found. ### Successful completion of build procedure for: rtwdemo_sil_topmodel Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================== rtwdemo_sil_topmodel Code compiled Compilation artifacts were out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 3.656s ### Preparing to start SIL simulation ... ### Starting SIL simulation for component: rtwdemo_sil_topmodel ### Stopping SIL simulation for component: rtwdemo_sil_topmodel ### Completed code coverage analysis
Когда симуляция будет завершена, щелкните ссылку в Командном окне, чтобы открыть отчет о покрытии кода и просмотреть совокупные результаты покрытия кода. Ссылка доступна только в том случае, если установлена сторонняя программа.
Используйте гиперссылки в отчете о покрытии кода, чтобы перейти в соответствующие местоположения на блоке. Затем при помощи окна отображения покрытия можно открыть соответствующие разделы отчета о покрытии модели. Сравните результаты покрытия модели и покрытия кода.
Автоматически откроются Данные моделирования Inspector, позволяющий интерактивно просматривать и анализировать результаты. Используйте панели Compare и Inspect, чтобы подтвердить, что сигналы SIL и зарегистрированные в режиме normal mode идентичны для обоих запусков.
В этом примере вы:
Собрали метрики покрытия модели во время симуляции режима normal mode.
Собрали метрики покрытия кода во время SIL симуляции.
Перемещался между покрытием кода и отчетами о покрытии модели.
Перекрестные метрики из обоих отчетов.