В этом примере показано несколько методов интеграции унаследованных функций C в сгенерированный код. Эти методы создают S-функцию или вызывают внешнюю C-функцию. Дополнительные сведения о S-функциях см. в разделах S-Функции и Создание кода.
extern double add(double, double);
#include "add.h"
double add(double u1, double u2)
{
double y1;
y1 = u1 + u2;
return (y1);
}
Для создания S-функции и создания файла TLC используется инструмент «Код из предыдущих версий». Программное обеспечение генерации кода использует файл TLC для генерации кода из этой S-функции. Преимущество использования прежнего инструмента кода заключается в том, что созданный код полностью встроен и не нуждается в функциях оболочки для доступа к пользовательскому коду.
1. Создание файла заголовка C с именем add.h который содержит подпись функции:
extern double add(double, double);
2. Создание исходного файла C с именем add.c который содержит тело функции:
double add(double u1, double u2)
{
double y1;
y1 = u1 + u2;
return (y1);
}
3. Чтобы создать S-функцию для использования в моделировании и создании кода, запустите следующий сценарий или выполните каждую из этих команд в командной строке MATLAB:
%% Initialize legacy code tool data structure
def = legacy_code('initialize');
%% Specify Source File
def.SourceFiles = {'add.c'};
%% Specify Header File
def.HeaderFiles = {'add.h'};
%% Specify the Name of the generated S-function
def.SFunctionName = 'add_function';
%% Create a c-mex file for S-function
legacy_code('sfcn_cmex_generate', def);
%% Define function signature and target the Output method
def.OutputFcnSpec = ['double y1 = add(double u1, double u2)'];
%% Compile/Mex and generate a block that can be used in simulation
legacy_code('generate_for_sim', def);
%% Create a TLC file for Code Generation
legacy_code('sfcn_tlc_generate', def);
%% Create a Masked S-function Block
legacy_code('slblock_generate', def);
### Start Compiling add_function
mex('-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp5d0b1f5b/ex61094511', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp4b6f362c_d2b5_4b55_bbfb_5e5d8ab110b1', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp5d0b1f5b/ex61094511/add.c')
Building with 'gcc'.
MEX completed successfully.
mex('add_function.c', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp5d0b1f5b/ex61094511', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp4b6f362c_d2b5_4b55_bbfb_5e5d8ab110b1/add.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling add_function
### Exit

Выходные данные этого сценария:
Новая модель, содержащая S-функциональный блок.
Файл TLC с именем add_function.tlc.
Исходный файл C с именем add_function.c.
Файл библиотеки mexw32 с именем add_function.mexw32.
4. Добавьте блоки ввода и блок вывода и создайте соединения, как показано в модели.

5. Назовите и сохраните модель. В этом примере модель называется ex_function_call_lct.
6. Чтобы построить модель и создать код, нажмите клавиши Ctrl + B.
Этот код генерируется в ex_function_call_lct.c:
/* Exported block signals */
real_T u1; /* '<Root>/u1' */
real_T u2; /* '<Root>/u2' */
/* External outputs (root outports fed by signals with default storage) */
ExternalOutputs rtY;
/* Model step function */
void ex_function_call_lct_step(void)
{
/* Outport: '<Root>/y1' incorporates:
* Inport: '<Root>/u1'
* Inport: '<Root>/u2'
* S-Function (add_function): '<Root>/add_function'
*/
rtY.y1 = add(u1, u2);
}
Указанный пользователем файл заголовка add.h включен в ex_function_call_lct.h:
#include "add.h"
1. Создание файла заголовка C с именем add.h который содержит сигнатуру примерной функции. См. предыдущий пример.
2. Создание исходного файла C с именем add.c содержит тело функции. См. предыдущий пример.
3. Добавьте блоки ввода и блок вывода и создайте соединения, как показано в модели. В этом примере модель называется ex_function_call_SF.

4. Дважды щелкните диаграмму Stateflow и отредактируйте диаграмму, как показано на рисунке. Выполнить вызов add функция в пределах действия перехода.

5. Выберите панель Параметры конфигурации > Цель моделирования > Пользовательский код. В разделе Включить пользовательский код C в созданный на левой панели выберите Файл заголовка. В поле Файл заголовка введите #include заявление:
#include "add.h"
6. В разделе Дополнительные сведения о построении выберите Исходные файлы. В поле Исходные файлы введите:
add.c
7. Выберите Параметры конфигурации > Цель моделирования > Пользовательский код > Использовать те же параметры пользовательского кода, что и параметр Цель моделирования.
8. Чтобы построить модель и создать код, нажмите клавиши Ctrl + B.
ex_exfunction_call_SF.c содержит следующий код в функции шага:
/* Definition for custom storage class: Global */
real_T u1; /* '<Root>/u1' */
real_T u2; /* '<Root>/u2' */
real_T y1; /* '<Root>/Chart' */
/* Model step function */
void ex_function_call_SF_step(void)
{
/* Chart: '<Root>/Chart' incorporates:
* Inport: '<Root>/u1'
* Inport: '<Root>/u2'
*/
y1 = (real_T)add(u1, u2);
}
ex_exfunction_call_SF.h содержит оператор include для add.h:
#include "add.h"
1. Создание файла заголовка C с именем add.h который содержит сигнатуру примерной функции. См. предыдущий пример.
2. Создание исходного файла C с именем add.c содержит тело функции. См. предыдущий пример.
3. В браузере библиотеки Simulink щелкните Simulink > Пользовательские функции. Перетащите блок MATLAB Function в модель.
4. Дважды щелкните по блоку MATLAB Function. Отредактируйте функцию, чтобы включить:
function y1 = add_function(u1, u2) % Set the class and size of output y1 = u1; % Call external C function y1 = coder.ceval('add',u1,u2); end
5. Выберите панель Параметры конфигурации > Цель моделирования > Пользовательский код. В разделе Включить пользовательский код C в созданный на левой панели выберите Файл заголовка. В поле Файл заголовка введите #include заявление:
#include "add.h"
6. В разделе Дополнительные сведения о построении выберите Исходные файлы. В поле Исходные файлы введите:
add.c
7. Добавьте в модель два блока Inport и один блок Outport и подключите его к функциональному блоку MATLAB.
8. Сохранить модель как ex_function_call_ML.

9. Чтобы построить модель и создать код, нажмите клавиши Ctrl + B.
ex_exfunction_call_ML.c содержит следующий код в функции шага:
/* Definition for custom storage class: Global */
real_T u1; /* '<Root>/u1' */
real_T u2; /* '<Root>/u2' */
real_T y1; /* '<Root>/MATLAB Function' */
/* Model step function */
void ex_function_call_ML_step(void)
{
/* MATLAB Function: '<Root>/MATLAB Function' incorporates:
* Inport: '<Root>/u1'
* Inport: '<Root>/u2'
*/
y1 = add(u1, u2);
}
ex_exfunction_call_ML.h содержит оператор include для add.h:
#include "add.h"