Сконфигурируйте и запуститесь нормальный, программное обеспечение в цикле (SIL) и процессор в цикле (PIL) симуляции, и сравните результаты.
Примечание: Simulink Test является отдельным продуктом, который предусматривает дополнительные возможности для SIL и Тестирования с процессором в контуре обратной связи, например, тестового управления строительством последовательности и управления тестированием.
Модель rtwdemo_cgv
использует шины, скаляры и векторизованные данные, плюс ошибочная инжекция, чтобы создать различия между выполнением теста.
Примечание: Прежде, чем выполнить код в этом примере, изменитесь на перезаписываемую папку. Если вы не работаете в перезаписываемой папке, ошибки генерации кода происходят.
Чтобы открыть rtwdemo_cgv, в Командном окне MATLAB®, вводят следующие команды.
baseVars = who; % For future cleanup. cgvModel = 'rtwdemo_cgv'; close_system(cgvModel,0); open_system( cgvModel);
Модель содержит иерархическую шину с тремя вложенными шинами. Это расположение шин производит комплексные иерархические данные в первом регистрируемом выходном порту. Во втором выходном порту модель вводит ошибки в сигнале в фиксированные интервалы. Эти ошибки приводят к различным результатам между двумя выполнениями. Сигнал в третьем выходном порту является вектором четырех значений на выборку, чтобы помочь показать поддержку сравнения.
CGV обеспечивает класс, cgv. Сконфигурируйтесь, чтобы проверять, имеют ли модели настройку, которая совместима с выполнением в SIL или среде PIL с помощью цели ert. Эта модель была уже изменена с помощью cgv. Сконфигурируйте класс.
Запуститесь в нормальных и режимах SIL
Модель выполняется в трех режимах под CGV: нормальный, SIL и PIL. В каждом случае объект CGV получает выходные данные и пишет его в файл. Для получения дополнительной информации смотрите CGV Documentation
. Выполнить модель в режимах нормальной и SIL симуляции, введите:
cgvSim = cgv.CGV( cgvModel, 'Connectivity', 'Normal'); cgvSim.addInputData(1, [cgvModel '_data']); % This next CGV function, addPostLoadFiles(), allows you to specify MATLAB(R) % programs to execute, or mat-files to load, before execution of the model. cgvSim.addPostLoadFiles({[cgvModel '_init.m']}); cgvSim.setOutputDir('cgv_output'); cgvSim.activateConfigSet( 'CS1_default'); result1 = cgvSim.run(); % CGV provides methods to simplify numerical equivalence checking. % The copySetup method creates an exact duplicate of an existing CGV object without % results data. You can change the SimulationMode using setMode() and then % execute again. cgvSil = cgvSim.copySetup(); cgvSil.setMode( 'SIL'); % You can provide a baseline file to CGV for comparing the simulation % output. In this example, the comparison results set the status to % 'failed', because the ErrorsInjected signal differs between simulations. cgvSil.addBaseline( 1, 'rtwdemo_cgv_results'); result2 = cgvSil.run(); % To see the name(s) of the signal(s) that did match, use getMismatches. % Mismatched signal names are only available if a baseline was added and % the comparison failed. if strcmp( cgvSil.getStatus( 1), 'failed') disp( 'Mismatched Signal Names:'); [signalNames, plotFiles] = cgvSil.getMismatches( 1); fprintf( 1, 'Signal Names: %s\n', signalNames{:} ); fprintf( 1, 'Path to plot files: %s\n', plotFiles{:}); assert(numel(signalNames)==1,'Expected exactly one mismatch'); end
Applying Configuration Set: CS1_default Applying PostLoad file: /mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_cgv_init.m Starting execution: ComponentType: topmodel Connectivity: normal InputData: /mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_cgv_data.mat End CGV execution: status completed. Applying PostLoad file: /mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_cgv_init.m Starting execution: ComponentType: topmodel Connectivity: sil InputData: /mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_cgv_data.mat ### Starting build procedure for model: rtwdemo_cgv ### Successful completion of build procedure for model: rtwdemo_cgv ### Preparing to start SIL simulation ... Building with 'gcc'. MEX completed successfully. ### Updating code generation report with SIL files ... ### Starting SIL simulation for component: rtwdemo_cgv ### Stopping SIL simulation for component: rtwdemo_cgv End CGV execution: status failed. Mismatched Signal Names: Signal Names: simout.getElement(3).Values.Data Path to plot files: /tmp/BR2019ad_1035872_198992/publish_examples6/tpec7cde1e/ex96023632/cgv_output/input_1_figure_1.png
Запуститесь в режиме PIL
Затем, модель запускает PIL симуляцию, с помощью встраиваемого процессора. Универсальный встраиваемый процессор не существует. Поэтому поддержка PIL оказывается при помощи хоста - компьютера, куда MATLAB® запускается. Главный процессор обработан как целевой процессор.
Файл настройки выполняется, который сопоставляет выполнение этой модели PIL на инфраструктуру SIL. После того, как файл настройки выполняется, выполнение CGV отображает сообщения PIL для режима. Сообщения SIL отображают цель возможности соединения.
Конфигурация модели для модели уже сконфигурирована с: Аппаратная реализация> Тестовое оборудование> Тестовое оборудование эквивалентно, производственное оборудование проверяется. Генерация кода> Верификация> Включает портативные размеры слова, проверяется. Эти настройки работают в SIL и в PIL, когда PIL сопоставлен на цель возможности соединения SIL.
copyfile( which( 'rtwdemo_cgv_sl_customization.m'),... fullfile( pwd, 'sl_customization.m'),'f'); sl_refresh_customizations(); cgvPil = cgvSim.copySetup(); cgvPil.setMode( 'PIL'); result3 = cgvPil.run();
Applying PostLoad file: /mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_cgv_init.m Starting execution: ComponentType: topmodel Connectivity: pil InputData: /mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_cgv_data.mat ### Starting build procedure for model: rtwdemo_cgv ### Successful completion of build procedure for model: rtwdemo_cgv ### Preparing to start PIL simulation ... Building with 'gcc'. MEX completed successfully. ### Connectivity configuration for "/tmp/BR2019ad_1035872_198992/publish_examples6/tpec7cde1e/ex96023632/rtwdemo_cgv_ert_rtw": CS1_default ### ### Updating code generation report with PIL files ... ### Starting application: 'rtwdemo_cgv_ert_rtw/pil/rtwdemo_cgv' End CGV execution: status completed.
Чтобы предотвратить проблемы с другими моделями, сразу удалите индивидуальную настройку, используемую, чтобы показать режим PIL.
delete( 'sl_customization.m');
sl_refresh_customizations();
Проверяйте, что выполнение не останавливалось с ошибкой
Выполнение () функция возвращает булево значение, которое верно, если выполнение завершается без образцовой ошибки компиляции или симуляции. Прежде, чем получить доступ к данным, проверяйте результат, возвращенный в каждое выполнение.
if ~result1 || ~result2 || ~result3 disp('Execution of model failed.'); end simData = cgvSim.getOutputData(1); silData = cgvSil.getOutputData(1); pilData = cgvPil.getOutputData(1);
Выполнение теперь завершено. Сравнение результатов. Код сравнения поддерживает график с фильтрами. Графики отображают и данные и различие.
Функции CGV отображают имена сигналов (как используется в командном окне) и создают файл, коррелирующий информацию о допуске с именами сигнала.
Покажите имена сигнала от нормальной симуляции
Отобразите список имен сигнала от сохраненных данных.
Примечание: cgv. CGV.compare игнорирует сигналы, которые появляются только в одном наборе данных. Например, сравнить функция игнорирует регистрируемый внутренний сигнал hi0, который появляется в выводе нормальной симуляции, но не появляется в выводе SIL симуляции.
cgv.CGV.getSavedSignals( simData);
simData.getElement(1).Values.Data(:,1) simData.getElement(1).Values.Data(:,2) simData.getElement(2).Values.Data(:,1) simData.getElement(2).Values.Data(:,2) simData.getElement(2).Values.Data(:,3) simData.getElement(2).Values.Data(:,4) simData.getElement(3).Values.hi0.Data(:,1) simData.getElement(3).Values.hi0.Data(:,2) simData.getElement(3).Values.hi1.mid0.lo0.Data(1,1,:) simData.getElement(3).Values.hi1.mid0.lo0.Data(2,1,:) simData.getElement(3).Values.hi1.mid0.lo0.Data(1,2,:) simData.getElement(3).Values.hi1.mid0.lo0.Data(2,2,:) simData.getElement(3).Values.hi1.mid0.lo1.Data simData.getElement(3).Values.hi1.mid0.lo2.Data simData.getElement(3).Values.hi1.mid1.Data(:,1) simData.getElement(3).Values.hi1.mid1.Data(:,2) simData.getElement(4).Values.Data
Создайте файл допуска
Функция CGV createToleranceFile создает файл, коррелирующий информацию о допуске с именами сигнала. Для опций, доступных, чтобы сконфигурировать допуски, см. cgv. CGV.createToleranceFile. По умолчанию допуски являются нулем. Поэтому сигналы должны соответствовать точно. Этот пример позволяет дельту 0,5 на сигнале ErrorsInjected.
signalList = {'simData.ErrorsInjected.Data' }; toleranceList = { { 'absolute', 0.5}}; cgv.CGV.createToleranceFile( 'localtol', signalList, toleranceList );
Сравните сигналы
По умолчанию, cgv. Функция CGV.compare смотрит на сигналы, которые имеют общее название между обоими выполнением. В следующем коде, simData.hi0. Сигналы данных не сравнены, потому что сигналы не появляются в silData.
Вторые и четвертые возвращаемые параметры сравнить функции для совпадающих фигур и фигур, которым не соответствуют. Тильды (~) представляют эти параметры, потому что этот пример не использует возвращаемые значения.
График следует из несоответствия на сигнале simData. ErrorsInjected. Данные.
[matchNames, ~, mismatchNames, ~] = ... cgv.CGV.compare( simData, silData, 'Plot', 'mismatch', ... 'Tolerancefile', 'localtol'); fprintf( '%d Signals match, %d Signals mismatch\n', ... length(matchNames), length(mismatchNames)); assert(length(mismatchNames) == 1,'Expected exactly one mismatch'); assert(length(matchNames) == 14, 'Expected exactly 14 matches'); disp( 'Mismatched Signal Names:'); disp(mismatchNames');
14 Signals match, 1 Signals mismatch Mismatched Signal Names: 'simData.getElement(4).Values.Data'
Сравните отдельные сигналы
cgv. Функция CGV.compare также сравнивает только заданные сигналы. В этом примере функция сравнивает только три сигнала.
[matchNames, ~, mismatchNames, ~ ] = ... cgv.CGV.compare( simData, silData, 'Plot', 'mismatch', ... 'Signals', {'simData.getElement(3).Values.hi1.mid0.lo1.Data',... 'simData.getElement(3).Values.hi1.mid0.lo2.Data', ... 'simData.getElement(2).Values.Data(:,3)'}); fprintf( '%d Signals match, %d Signals mismatch\n', ... length(matchNames), length(mismatchNames)); assert(isempty(mismatchNames),'Expected no mismatches'); if ~isempty(mismatchNames) disp( 'Mismatched Signal Names:'); disp(mismatchNames'); end % Since a mismatch does not occur for these signals, a plot is not generated.
3 Signals match, 0 Signals mismatch
Чтобы создать график списка сигналов, вызовите cgv. CGV.plot. Например,
[signalNames, signalFigures] = cgv.CGV.plot( simData, ... 'Signals', {'simData.getElement(2).Values.Data(:,1)'});
Просмотрите данные сигнала в инспекторе данных моделирования инструмент
Чтобы открыть инструмент Simulation Data Inspector, в командной строке MATLAB®, вводят Simulink.sdi.view. Чтобы импортировать данные сигнала, в инструменте Simulation Data Inspector, выбирают File> Import Data, который открывает инструмент Data Import. Выберите Import из> Базовое рабочее пространство, чтобы просмотреть и выбрать сигналы, сохраненные в simData и silData.
Очистите переменные из рабочей области:
newBaseVars = who; addedVars = setdiff( newBaseVars, baseVars); clearCmd = ['clear ' sprintf( '%s ', addedVars{:})]; eval( clearCmd); clear newBaseVars addedVars clearCmd rtwdemoclean;