В этом примере показано, как собрать метрики покрытия кода во время программного обеспечения в цикле (SIL) или процессоре в цикле (PIL) симуляция с Simulink® Coverage™.
Вы используете инструмент покрытия кода, и покрытие кода сообщают, чтобы просмотреть записанное покрытие кода для SIL симуляции.
В этом примере вы измеряете покрытие модели во время симуляции в режиме normal mode, повторяете ту же симуляцию в режиме SIL и сравниваете записанные метрики от обеих симуляций.
Сравните покрытие модели и результаты покрытия кода при помощи гиперссылок в отчетах покрытия кода и покрытии модели.
Для большего количества примеров измерения SIL и PIL симуляций, смотрите.
Откройте модель.
model = 'rtwdemo_sil_topmodel';
close_system(model,0)
open_system(model)
Удалите любые существующие папки сборки.
buildFolder = RTW.getBuildDir(model); if isfolder(buildFolder.BuildDirectory) rmdir(buildFolder.BuildDirectory,'s'); end
Сконфигурируйте модель для набора покрытия.
set_param(model, 'CovEnable', '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');
Используйте Инспектора Данных моделирования, чтобы просмотреть и сравнить результаты симуляции.
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%-го покрытия MCDC. Запустите вторую симуляцию с различными входными сигналами, чтобы увеличить уровень покрытия MCDC к 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 симуляцию, сконфигурируйте модель, чтобы собрать метрики покрытия кода.
coverageSettings = get_param(model, 'CodeCoverageSettings'); coverageSettings.CoverageTool = 'Simulink Coverage'; set_param(model, 'CodeCoverageSettings', coverageSettings);
Можно использовать те же входные сигналы в SIL симуляции, которую вы использовали во время первой симуляции, запущенной в режиме normal mode.
Запустите первую симуляцию в режиме 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');
### Starting build procedure for model: rtwdemo_sil_topmodel ### Successful completion of build procedure for model: rtwdemo_sil_topmodel ### Preparing to start SIL simulation ... Building with 'gcc'. 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
Simulink.sdi.createRun('Run 1 (SIL mode)', 'namevalue',... {'simout_sil_run1'}, {simout_sil_run1});
Когда симуляция завершится, просмотрите результаты покрытия кода на модели при помощи выделения покрытия. Чтобы видеть сводные данные покрытия кода SIL для элемента модели, разместите своего клеветника по элементу модели.
Можно также просмотреть результаты покрытия кода в отчете покрытия кода HTML. Итоговый раздел показывает, что все функции были вызваны, но запущенная SIL симуляция не достигла полного охвата для решения, условия или покрытия MCDC.
Чтобы перейти к соответствующим элементам модели в блок-схеме, используйте гиперссылки в отчете покрытия кода
Используйте те же входные сигналы в SIL симуляции, которую вы использовали во второй симуляции, запущенной в режиме normal mode.
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');
### Starting build procedure for model: 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 model: rtwdemo_sil_topmodel ### Preparing to start SIL simulation ... ### Starting SIL simulation for component: rtwdemo_sil_topmodel ### Stopping SIL simulation for component: rtwdemo_sil_topmodel
Simulink.sdi.createRun('Run 2 (SIL mode)', 'namevalue',... {'simout_sil_run2'}, {simout_sil_run2});
Выделение покрытия кода показывает, что сгенерированный код из модели достиг полного охвата.
Инспектор Данных моделирования открывается автоматически после каждого запуска, который позволяет вам просматривать и анализировать результаты. Чтобы подтвердить, что регистрируемые сигналы для SIL и запусков режима normal mode идентичны, рассмотрите информацию в Сравнивании и панелях Inspect.