exponenta event banner

Тест сгенерированного кода с моделированием SIL и PIL

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

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

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

Конфигурация целевого подключения для PIL

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

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

  • Загрузите, запустите и остановите приложение на конечном объекте.

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

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

Для поддерживаемого оборудования можно использовать целевые пакеты поддержки. Дополнительные сведения см. в разделе Аппаратное обеспечение, поддерживаемое встроенным кодером.

Моделирование 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')

Выполните моделирование в обычном режиме.

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 с блоком модели

Проверьте созданный код модели с помощью модели тестового кабеля, которая запускает блок модели в режиме SIL. При таком подходе:

  • Можно протестировать код, созданный из модели верхнего уровня или ссылочной модели. Код из модели верхнего уровня использует автономный интерфейс кода. Код из ссылочной модели использует интерфейс ссылочного кода модели. Дополнительные сведения см. в разделе Кодовые интерфейсы для SIL и PIL.

  • Модель тестового электрического жгута или модель системы используется для ввода тестового вектора или стимула.

  • Блок модели можно легко переключить между режимами моделирования нормали, SIL и PIL.

Откройте пример модели с двумя блоками модели, которые ссылаются на одну и ту же модель. При моделировании один блок модели запускается в режиме SIL, а другой блок модели - в обычном режиме.

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');

Тест кода верхней модели

Для блока «Модель» в режиме 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 выполняется как отдельный процесс на компьютере. В рабочей папке можно увидеть, что автономный код создается для ссылочной модели, если не существует созданный код из предыдущей сборки.

Сравните поведение блоков модели в обычном режиме и режиме 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');

Сравните протоколированные состояния блоков модели из нормального моделирования и моделирования в режиме 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');

Эталонный код тестовой модели

Для блока «Модель» в режиме 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 выполняется как отдельный процесс на компьютере. В рабочей папке код ссылки на модель создается, если не существует код из предыдущей сборки.

Сравните поведение блоков модели в обычном режиме и режиме 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');

Сравните протоколированные состояния блоков модели из нормального моделирования и моделирования в режиме 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)

Запуск моделирования в обычном режиме

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 включите переносимые размеры слов. Дополнительные сведения см. в разделе Настройка параметров реализации оборудования.

Связанные темы