Протестируйте числовую эквивалентность между компонентами модели и производственным кодом, который вы генерируете от компонентов при помощи программного обеспечения в цикле (SIL) и процессор в цикле (PIL) симуляции.
С SIL симуляцией вы тестируете исходный код на своем компьютере разработчика. С PIL симуляцией вы тестируете скомпилированный объектный код, который вы намереваетесь развернуть в производстве путем выполнения объектного кода на действительном целевом компьютере или симуляторе процессора. Чтобы определить, эквивалентны ли компоненты модели и сгенерированный код численно, сравните SIL и результаты PIL против результатов режима normal mode.
Существует три способа запустить SIL и PIL симуляции. Можно использовать топ-модель, блоки Model, или SIL и блоки PIL, которые вы создаете из подсистемы. Смотрите Выбирают SIL или PIL Approach.
Прежде чем можно будет запустить PIL симуляции, необходимо сконфигурировать целевую возможность соединения. Целевая настройка возможности соединения включает PIL симуляцию к:
Создайте целевое приложение.
Загрузите, запустите и остановите приложение на цели.
Поддержите связь между Simulink и целью.
Чтобы произвести целевую настройку возможности соединения, можно использовать предоставленный целевой API возможности соединения. Для получения дополнительной информации смотрите, Создают Целевую Настройку Возможности соединения PIL для Simulink.
Для поддерживаемого оборудования можно использовать целевые пакеты поддержки. Для получения дополнительной информации смотрите Embedded Coder Поддерживаемые аппаратные средства.
Протестируйте сгенерированный типовой кодекс путем выполнения SIL симуляции топ-модели или PIL симуляции. С этим подходом:
Вы, которых тестовый код сгенерировал от топ-модели, которая использует автономный интерфейс кода.
Вы конфигурируете модель к векторам нагрузочного теста или входным параметрам стимула от рабочего пространства MATLAB.
Можно легко переключить топ-модель между нормальным, SIL и режимами PIL симуляции.
Откройте простую модель рабочей поверхности.
model='rtwdemo_sil_topmodel';
close_system(model,0)
open_system(model)
Чтобы фокусироваться на числовом эквивалентном тестировании, выключите:
Покрытие модели
Покрытие кода
Время выполнения профилируя
set_param(gcs, 'RecordCoverage','off'); coverageSettings = get_param(model, 'CodeCoverageSettings'); coverageSettings.CoverageTool='None'; set_param(model, 'CodeCoverageSettings',coverageSettings); set_param(model, 'CodeExecutionProfiling','off');
Сконфигурируйте входные данные о стимуле.
[ticks_to_count, reset, counter_mode, count_enable] = ...
rtwdemo_sil_topmodel_data(T);
Сконфигурируйте опции логгирования в модели.
set_param(model, 'LoadExternalInput','on'); set_param(model, 'ExternalInput','ticks_to_count, reset, counter_mode, count_enable'); set_param(model, 'SignalLogging', 'on'); set_param(model, 'SignalLoggingName', 'logsOut'); set_param(model, 'SaveOutput','on')
Запустите симуляцию режима normal mode.
set_param(model,'SimulationMode','normal') sim_output = sim(model,10); yout_normal = [sim_output.yout.signals(1).values sim_output.yout.signals(2).values];
Запустите SIL симуляцию топ-модели.
set_param(model,'SimulationMode','Software-in-the-Loop (SIL)') sim_output = sim(model,10); yout_sil = [sim_output.yout.signals(1).values sim_output.yout.signals(2).values];
### 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 9.4055s ### 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 ### Application stopped ### Stopping SIL simulation for component: rtwdemo_sil_topmodel
Если актуальный код для этой модели не существует, новый код сгенерирован и скомпилирован. Сгенерированный код запускается как отдельный процесс на вашем компьютере.
Постройте и сравните результаты нормальных и SIL симуляций. Заметьте, что результаты соответствуют.
fig1 = figure; subplot(3,1,1), plot(yout_normal), title('Counter Output for Normal Simulation') subplot(3,1,2), plot(yout_sil), title('Counter Output for SIL Simulation') subplot(3,1,3), plot(yout_normal-yout_sil), ... title('Difference Between Normal and SIL');
Очистка.
close_system(model,0); if ishandle(fig1), close(fig1), end clear fig1 simResults = {'yout_sil','yout_normal','model','T',... 'ticks_to_count','reset'}; save([model '_results'],simResults{:}); clear(simResults{:},'simResults')
Протестируйте сгенерированный типовой кодекс при помощи модели тестовой обвязки, которая запускает блок Model в режиме SIL. С этим подходом:
Вы можете тестовый код, который сгенерирован от топ-модели или модели, на которую ссылаются. Код от топ-модели использует автономный интерфейс кода. Код из модели, на которую ссылаются, использует интерфейс модели - ссылки кода. Для получения дополнительной информации смотрите Интерфейсы Кода для SIL и PIL.
Вы используете модель тестовой обвязки или системную модель, чтобы обеспечить входные параметры стимула или тестовый вектор.
Можно легко переключить блок Model между нормальным, SIL и режимами PIL симуляции.
Откройте модель в качестве примера, которая имеет два блока Model, которые ссылаются на ту же модель. В симуляции вы запускаете один блок Model в режиме SIL и другой блок Model в режиме normal mode.
model='rtwdemo_sil_modelblock';
open_system(model);
Выключите:
Покрытие кода
Время выполнения профилируя
coverageSettings = get_param(model, 'CodeCoverageSettings'); coverageSettings.CoverageTool='None'; set_param(model, 'CodeCoverageSettings',coverageSettings); open_system('rtwdemo_sil_modelblock') set_param('rtwdemo_sil_modelblock', 'CodeExecutionProfiling','off'); open_system('rtwdemo_sil_counter') set_param('rtwdemo_sil_counter', 'CodeExecutionProfiling','off'); currentFolder=pwd; save_system('rtwdemo_sil_counter', fullfile(currentFolder,'rtwdemo_sil_counter.slx'))
Сконфигурируйте логгирование состояния для моделей.
set_param('rtwdemo_sil_counter', 'SaveFormat','Dataset'); save_system('rtwdemo_sil_counter', fullfile(currentFolder,'rtwdemo_sil_counter.slx')) set_param(model, 'SaveFormat','Dataset'); set_param(model, 'SaveState','on'); set_param(model, 'StateSaveName', 'xout');
Протестируйте код топ-модели
Для блока Model в режиме SIL задайте генерацию кода топ-модели, который использует автономный интерфейс кода.
set_param([model '/CounterA'], 'CodeInterface', 'Top model');
Запустите симуляцию модели тестовой обвязки.
out = sim(model,20);
### Starting build procedure for: rtwdemo_sil_counter ### Successful completion of build procedure for: rtwdemo_sil_counter Build Summary Top model targets built: Model Action Rebuild Reason ==================================================================================================== rtwdemo_sil_counter 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 8.0559s ### 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_counter ### Application stopped ### Stopping SIL simulation for component: rtwdemo_sil_counter
Блок модели в режиме SIL запускается как отдельный процесс на вашем компьютере. В рабочей папке вы видите, что автономный код сгенерирован для модели, на которую ссылаются, если сгенерированный код от предыдущей сборки не существует.
Сравните поведение блоков Model в режимах SIL и нормальном. Соответствие результатов.
yout = out.logsOut; yout_sil = yout.get('counterA').Values.Data; yout_normal = yout.get('counterB').Values.Data; fig1 = figure; subplot(3,1,1), plot(yout_normal), title('Counter Output for Normal Simulation') subplot(3,1,2), ... plot(yout_sil), title('Counter Output for Model Block SIL (Top-Model) Simulation') subplot(3,1,3), plot(yout_normal-yout_sil), ... title('Difference Between Normal and SIL');
Сравните регистрируемые состояния блоков Model от нормального и симуляций режима SIL.
xout = out.xout; xout_sil = xout{1}.Values.Data; xout_normal = xout{2}.Values.Data; fig1 = figure; subplot(3,1,1), plot(xout_sil), title('State Logging for Normal Simulation') subplot(3,1,2), ... plot(xout_normal), title('State Logging for Model Block SIL (Top-Model) Simulation') subplot(3,1,3), plot(xout_normal-xout_sil), ... title('Difference Between Normal and SIL');
Код ссылки тестовой модели
Для блока Model в режиме SIL задайте генерацию типового кодекса, на который ссылаются, который использует интерфейс модели - ссылки кода.
set_param([model '/CounterA'], 'CodeInterface', 'Model reference');
Запустите симуляцию модели тестовой обвязки.
out2 = sim(model,20);
### Starting serial model reference code generation build ### Starting build procedure for: rtwdemo_sil_counter ### Successful completion of build procedure for: rtwdemo_sil_counter Build Summary Code generation targets built: Model Action Rebuild Reason ========================================================================================= rtwdemo_sil_counter Code generated and compiled rtwdemo_sil_counter.c does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.3004s ### 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_counter ### Application stopped ### Stopping SIL simulation for component: rtwdemo_sil_counter
Блок модели в режиме SIL запускается как отдельный процесс на вашем компьютере. В рабочей папке вы видите, что код модели - ссылки сгенерирован, если код от предыдущей сборки не существует.
Сравните поведение блоков Model в режимах SIL и нормальном. Соответствие результатов.
yout2 = out2.logsOut; yout2_sil = yout2.get('counterA').Values.Data; yout2_normal = yout2.get('counterB').Values.Data; fig1 = figure; subplot(3,1,1), plot(yout2_normal), title('Counter Output for Normal Simulation') subplot(3,1,2), ... plot(yout2_sil), title('Counter Output for Model Block SIL (Model Reference) Simulation') subplot(3,1,3), plot(yout2_normal-yout2_sil), ... title('Difference Between Normal and SIL');
Сравните регистрируемые состояния блоков Model от нормального и симуляций режима SIL.
xout2 = out.xout; xout2_sil = xout2{1}.Values.Data; xout2_normal = xout2{2}.Values.Data; fig1 = figure; subplot(3,1,1), plot(xout2_sil), title('State Logging for Normal Simulation') subplot(3,1,2), ... plot(xout2_normal), title('State Logging for Model Block SIL (Model Reference) Simulation') subplot(3,1,3), plot(xout2_normal-xout2_sil), ... title('Difference Between Normal and SIL');
Очистка.
close_system(model,0); if ishandle(fig1), close(fig1), end, clear fig1 simResults={'out','yout','yout_sil','yout_normal', ... 'out2','yout2','yout2_sil','yout2_normal', ... 'SilCounterBus','T','reset','ticks_to_count','Increment'}; save([model '_results'],simResults{:}); clear(simResults{:},'simResults')
Протестируйте сгенерированный код подсистемы при помощи блока SIL или PIL в симуляции. С этим подходом:
Вы, которых тестовый код сгенерировал от подсистем, который использует автономный интерфейс кода.
Вы обеспечиваете тестовую обвязку или системную модель, чтобы предоставить входные параметры стимула или тестовый вектор.
Вы заменяете свою исходную подсистему на сгенерированный блок SIL или PIL.
Откройте простую модель, которая состоит из алгоритма управления и модели объекта управления в замкнутом цикле. Алгоритм управления регулирует выход от объекта.
model='rtwdemo_sil_block';
close_system(model,0)
open_system(model)
Запустите симуляцию режима normal mode
out = sim(model,10);
yout_normal = out.yout;
clear out
Сконфигурируйте процесс сборки, чтобы создать блок SIL для тестирования.
set_param(model,'CreateSILPILBlock','SIL');
Чтобы протестировать поведение на производственном оборудовании, задайте блок PIL.
Чтобы создать блок SIL, сгенерируйте код для подсистемы алгоритма управления. Вы видите блок SIL в конце процесса сборки. Его порты ввода и вывода совпадают с теми из подсистемы алгоритма управления.
close_system('untitled',0); slbuild([model '/Controller'])
### Starting build procedure for: Controller ### Successful completion of build procedure for: Controller ### Creating SIL block ... Building with 'gcc'. MEX completed successfully. Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================== 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 14.992s
В качестве альтернативы можно щелкнуть правой кнопкой по подсистеме и выбрать C/C ++ Code> Build This Subsystem. В диалоговом окне, которое открывается, нажмите Build.
Чтобы выполнить SIL симуляцию контроллера и модели объекта управления в замкнутом цикле, замените исходный алгоритм управления на новый блок SIL. Чтобы постараться не терять вашу исходную подсистему, не сохраняйте свою модель в этом состоянии.
controllerBlock = [model '/Controller']; blockPosition = get_param(controllerBlock,'Position'); delete_block(controllerBlock); add_block('untitled/Controller',[controllerBlock '(SIL)'],... 'Position', blockPosition); close_system('untitled',0); clear controllerBlock blockPosition
Запустите SIL симуляцию.
out = sim(model,10);
### Preparing to start SIL block simulation: <a href="matlab: targets_hyperlink_manager('run',1);">rtwdemo_sil_block/Controller(SIL)</a> ... ### Starting SIL simulation for component: rtwdemo_sil_block ### Application stopped ### Stopping SIL simulation for component: rtwdemo_sil_block
Использование алгоритма управления арифметика с плавающей точкой, с одинарной точностью. Можно ожидать, что порядок величины для различий между SIL и нормальными симуляциями будет близко к точности машины для данных с одинарной точностью.
Задайте ошибочный допуск к результатам SIL симуляции, который основан на точности машины для нормальных результатов симуляции с одинарной точностью.
machine_precision = eps(single(yout_normal)); tolerance = 4 * machine_precision;
Сравните результаты нормальной и SIL симуляции. В третьем графике различия между симуляциями заключаются хорошо в заданном ошибочном допуске.
yout_sil = out.yout; tout = out.tout; fig1 = figure; subplot(3,1,1), plot(yout_normal), title('Controller Output for Normal Simulation') subplot(3,1,2), plot(yout_sil), title('Controller Output for SIL Simulation') subplot(3,1,3), plot(tout,abs(yout_normal-yout_sil),'g-', tout,tolerance,'r-'), ... title('Normal and SIL Difference and Error Tolerance');
Очистка.
close_system(model,0); if ishandle(fig1), close(fig1), end clear fig1 simResults={'out','yout_sil','yout_normal','tout','machine_precision'}; save([model '_results'],simResults{:}); clear(simResults{:},'simResults')
Когда вы запускаете SIL симуляцию, необходимо сконфигурировать настройки аппаратной реализации (характеристики, такие как нативные размеры слова), чтобы позволить компиляцию для компьютера разработчика. Эти настройки могут отличаться от настроек аппаратной реализации, которые вы используете при создавании модели для производственного оборудования. Чтобы избежать потребности изменить настройки аппаратной реализации между SIL симуляциями и PIL симуляциями, включите портативные размеры слова. Для получения дополнительной информации смотрите, Конфигурируют Настройки Аппаратной реализации.