Протестируйте сгенерированный код с SIL и PIL симуляциями

Протестируйте числовую эквивалентность между компонентами модели и производственным кодом, который вы генерируете от компонентов при помощи программного обеспечения в цикле (SIL) и процессоре в цикле (PIL) симуляции.

С SIL симуляцией вы тестируете исходный код на своем компьютере разработчика. С PIL симуляцией вы тестируете скомпилированный объектный код, который вы намереваетесь развернуть в производстве путем выполнения объектного кода на действительном целевом компьютере или симуляторе процессора. Чтобы определить, эквивалентны ли компоненты модели и сгенерированный код численно, сравните SIL и результаты PIL против результатов режима normal mode.

Существует три способа запустить SIL и PIL симуляции. Можно использовать топ-модель, блоки Model, или SIL и блоки PIL, которые вы создаете из подсистемы. Смотрите Выбирают SIL или PIL Approach.

Целевая настройка возможности соединения для PIL

Прежде чем можно будет запустить PIL симуляции, необходимо сконфигурировать целевую возможность соединения. Целевая настройка возможности соединения включает PIL симуляцию к:

  • Создайте целевое приложение.

  • Загрузите, запустите и остановите приложение на цели.

  • Поддержите связь между Simulink и целью.

Чтобы произвести целевую настройку возможности соединения, можно использовать предоставленный целевой API возможности соединения. Для получения дополнительной информации смотрите, Создают Целевую Настройку Возможности соединения PIL для Simulink.

Для поддерживаемого оборудования можно использовать целевые пакеты поддержки. Для получения дополнительной информации смотрите Embedded Coder Поддерживаемые аппаратные средства.

SIL или PIL симуляция с топ-моделью

Протестируйте сгенерированный типовой кодекс путем выполнения топ-модели 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 7.7618s
### 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

Если актуальный код для этой модели не существует, новый код сгенерирован и скомпилирован. Сгенерированный код запускается как отдельный процесс на вашем компьютере.

Постройте и сравните результаты нормальных и 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')

SIL или PIL симуляция с блоком Model

Протестируйте сгенерированный типовой кодекс при помощи модели тестовой обвязки, которая запускает блок 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 6.8073s
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Updating code generation report with SIL files ...
The top model "rtwdemo_sil_modelblock" is configured to load initial state and / or save states (see Data Import/Export configuration parameters). However, the SIL or PIL component "rtwdemo_sil_modelblock/CounterA" does not expose any states to Simulink and therefore cannot participate in state initialization or logging.
### Starting SIL simulation for component: rtwdemo_sil_counter
### 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 5.7616s
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Updating code generation report with SIL files ...
The top model "rtwdemo_sil_modelblock" is configured to load initial state and / or save states (see Data Import/Export configuration parameters). However, the SIL or PIL component "rtwdemo_sil_modelblock/CounterA" does not expose any states to Simulink and therefore cannot participate in state initialization or logging.
### Starting SIL simulation for component: rtwdemo_sil_counter
### 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 в симуляции. С этим подходом:

  • Вы, которых тестовый код сгенерировал от подсистем, который использует автономный интерфейс кода.

  • Вы обеспечиваете тестовую обвязку или системную модель, чтобы предоставить входные параметры стимула или тестовый вектор.

  • Вы заменяете свою исходную подсистему на сгенерированный блок 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 12.063s

В качестве альтернативы можно щелкнуть правой кнопкой по подсистеме и выбрать 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: rtwdemo_sil_block/Controller(SIL) ...
### Starting SIL simulation for component: rtwdemo_sil_block
### 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 симуляциями, включите портативные размеры слова. Для получения дополнительной информации смотрите, Конфигурируют Настройки Аппаратной реализации.

Похожие темы