Примеры интегрированию внешнего кода

В этом разделе показаны различные сценарии интегрирования внешнего кода.

Интеграция внешнего кода С++ с моделью с помощью S-функций

В этом примере показано, как интегрировать код С++ в модель с помощью S-функций.

Откройте модель примера

Откройте пример модели rtwdemo_cpp.

open_system('rtwdemo_cpp');

Сконфигурируйте компилятор C++

1. В Командном Окне MATLAB введите эту команду:

mex -setup

2. Когда появится запрос, выберите компилятор C++, который установлен на вашем компьютере разработчика.

Интеграция кода С++

Можно интегрировать код С++ в модель с помощью S-функций.

1. Подготовьте источник S-функции.

2. Откройте приложение Simulink Coder или Embedded Coder.

3. Сконфигурируйте исходные файлы и папки S-функций. Откройте диалоговое окно Параметра конфигурации модели, перейдите к панели Генерации кода > Пользовательский Код и добавьте исходные файлы S-функции и include папки.

4. Встроите S-функцию, чтобы исключить накладные расходы на S-функции в сгенерированном коде.

Откройте sfun_cppcount_cpp.tlc

Сконфигурируйте модель для генерации кода С++

Установите параметр конфигурации модели Language на C++.

Сгенерируйте и проверьте код.

Сгенерируйте и измените код С++.

Похожие темы

Вставьте внешние C и Код С++ в диаграммы Stateflow для генерации кода

В этом примере показано, как использовать Stateflow ® для интеграции внешнего кода в модель.

Откройте модель

model='rtwdemo_sfcustom';
open_system(model);

Интеграция кода

1. Пример включает пользовательский файл заголовка my_header.c и пользовательский исходный файл my_function.c.

%Open files my_header.h and my_function.c
eval('edit my_header.h')
eval('edit my_function.c')

2. В диалоговом окне Model Параметры Конфигурации панели Simulation Target введите пользовательский исходный файл и файл заголовка. Также введите дополнительные директории и исходные файлы.

В этом примере пользовательский файл заголовка my_header.c и исходный файл my_function.c вводятся на панели Цель симуляции (Simulation Target).

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);

3. Чтобы сгенерировать код, в диалоговом окне Model Configuration Parameters, Генерация кода > Панель Пользовательский код, введите тот же пользовательский исходный файл и файл заголовка. Также введите те же дополнительные директории и исходные файлы.

В этом примере пользовательский файл заголовка my_header.c и исходный файл my_function.c вводятся на панели «Генерация кода» > «Пользовательский код».

Откройте панель Генерация Кода > Custom Code диалогового окна Model Configuration Parameters.

configSet = getActiveConfigSet(model);
openDialog(configSet);

Сгенерируйте код

slbuild('rtwdemo_sfcustom')
### Starting build procedure for: rtwdemo_sfcustom
### Successful completion of build procedure for: rtwdemo_sfcustom

Build Summary

Top model targets built:

Model             Action                       Rebuild Reason                                    
=================================================================================================
rtwdemo_sfcustom  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.8965s

Вызов кода С из Stateflow

Чтобы вызвать пользовательские функции кода С из Stateflow, используйте тот же синтаксис, что и вызовы графических функций: result = my_custom_function(in_args);

Чтобы вызвать переменные типа структуры, используйте запись через точку: result = my_var.my_field;

См. также

Закройте модель

rtwdemoclean;
close_system('rtwdemo_sfcustom',0);

Интеграция внешнего кода С с сгенерированным кодом при помощи пользовательских блоков кода и параметров конфигурации модели

В этом примере показано, как поместить внешний код в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.

1. Откройте модель rtwdemo_slcustcode.

open_system('rtwdemo_slcustcode')

2. Откройте приложение Simulink Coder или Embedded Coder.

3. Откройте диалоговое окно Model Параметры Конфигурации и перейдите к панели Custom Code.

4. Исследуйте настройки параметров конфигурации модели Исходный файл и функцию Initialize.

  • Исходный файл задает комментарий и устанавливает переменную GLOBAL_INT2 по -1.

  • Функция Initialize инициализирует переменную GLOBAL_INT2 по 1.

5. Закройте диалоговое окно.

6. Дважды кликните Исходный блок модели. Параметры блоков Top of Model Source задают, что генератор кода объявляет переменную GLOBAL_INT1 и установите его равным 0 в верхней части сгенерированного файла rtwdemo_slcustcode.c.

7. Откройте триггируемую подсистему Amplifier. Подсистема включает блок System Outputs. Генератор кода помещает код, который вы задаете в этом блоке, в сгенерированный код для ближайшей родительской атомарной подсистемы. В этом случае генератор кода помещает внешний код в сгенерированный код для Amplifier подсистема. Внешний код:

  • Объявляет переменную указателя *intPtr и инициализирует его со значением переменной GLOBAL_INT1.

  • Устанавливает переменную указателя на -1 во время выполнения.

  • Устанавливает значение переменной указателя 0 перед выходом.

8. Сгенерируйте код и отчет генерации кода.

9. Исследуйте код в сгенерированном исходном файле rtwdemo_slcustcode.c. В верхней части файла, после #include операторы, вы находите следующий код объявления. Пример задает первое объявление с параметром конфигурации исходного файла и второе объявление с блоком Model Source.

int_T GLOBAL_INT2 = -1;

int_T GLOBAL_INT1 = 0;

Область Выходной функции для Amplifier подсистема включает следующий код, который показывает внешний код, интегрированный с сгенерированным кодом, который применяет коэффициент усиления. Пример задает три строки кода для переменной указателя с блоком System Outputs в Amplifier подсистема.

int_T *intPtr = &GLOBAL_INT1;

*intPtr = -1;

rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;

*intPtr = 0;

Следующее назначение появляется в модели initialize функции точки входа. Пример задает это назначение с помощью параметра конфигурации Initialize function.

GLOBAL_INT2 = 1;

Интеграция внешнего кода С с сгенерированным кодом при помощи пользовательских блоков кода и параметров конфигурации модели

В этом примере показано, как поместить внешний код в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.

1. Откройте модель rtwdemo_slcustcode.

open_system('rtwdemo_slcustcode')

2. Откройте приложение Simulink Coder или Embedded Coder.

3. Откройте диалоговое окно Model Параметры Конфигурации и перейдите к панели Custom Code.

4. Исследуйте настройки параметров конфигурации модели Исходный файл и функцию Initialize.

  • Исходный файл задает комментарий и устанавливает переменную GLOBAL_INT2 по -1.

  • Функция Initialize инициализирует переменную GLOBAL_INT2 по 1.

5. Закройте диалоговое окно.

6. Дважды кликните Исходный блок модели. Параметры блоков Top of Model Source задают, что генератор кода объявляет переменную GLOBAL_INT1 и установите его равным 0 в верхней части сгенерированного файла rtwdemo_slcustcode.c.

7. Откройте триггируемую подсистему Amplifier. Подсистема включает блок System Outputs. Генератор кода помещает код, который вы задаете в этом блоке, в сгенерированный код для ближайшей родительской атомарной подсистемы. В этом случае генератор кода помещает внешний код в сгенерированный код для Amplifier подсистема. Внешний код:

  • Объявляет переменную указателя *intPtr и инициализирует его со значением переменной GLOBAL_INT1.

  • Устанавливает переменную указателя на -1 во время выполнения.

  • Устанавливает значение переменной указателя 0 перед выходом.

8. Сгенерируйте код и отчет генерации кода.

9. Исследуйте код в сгенерированном исходном файле rtwdemo_slcustcode.c. В верхней части файла, после #include операторы, вы находите следующий код объявления. Пример задает первое объявление с параметром конфигурации исходного файла и второе объявление с блоком Model Source.

int_T GLOBAL_INT2 = -1;

int_T GLOBAL_INT1 = 0;

Область Выходной функции для Amplifier подсистема включает следующий код, который показывает внешний код, интегрированный с сгенерированным кодом, который применяет коэффициент усиления. Пример задает три строки кода для переменной указателя с блоком System Outputs в Amplifier подсистема.

int_T *intPtr = &GLOBAL_INT1;

*intPtr = -1;

rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;

*intPtr = 0;

Следующее назначение появляется в модели initialize функции точки входа. Пример задает это назначение с помощью параметра конфигурации Initialize function.

GLOBAL_INT2 = 1;

Вставка внешнего кода С++ в диаграммы Stateflow для генерации кода

В этом примере показано, как использовать Stateflow ® для интеграции внешнего кода С++ в модель.

Откройте модель

model='rtwdemo_sfcpp';
open_system(model);

Чтобы настроить компилятор C++, в командной строке введите mex -setup.

Интеграция кода С++

1. Создайте функции оболочки C-стиля или получите доступ к макросам для каждого метода, вызываемого из языка действий C.

%Open example wrapper functions.
filename=fullfile(matlabroot, 'toolbox', 'rtw', 'rtwdemos', 'custom_cpp_src', 'adder_cpp.cpp');
eval('edit(filename)');
clear filename;

filename=fullfile(matlabroot, 'toolbox', 'rtw', 'rtwdemos', 'custom_cpp_src', 'adder_cpp.h');
eval('edit(filename)');
clear filename;

2. В диалоговом окне «Параметры конфигурации» «Генерация кода» > «Пользовательский код» введите исходные файлы S-функции и включите директории.

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);

3. В диалоговом окне Параметры конфигурации Simulation Target > панель Пользовательский код введите исходные файлы S-функции и включите директории.

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);

Сгенерируйте код С++

В диалоговом окне Параметров конфигурации Генерации кода задайте значение Language C++. Чтобы сгенерировать код, выберите Build.

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);
clear model;

См. также

Закройте модель

rtwdemoclean;
close_system('rtwdemo_sfcpp',0);