Можно вызвать и интегрировать внешний код С в модели Simulink® с помощью блоков C Function. блоки C Function позволяют вам вызывать внешний код С и настраивать интегрирование вашего кода с помощью Output Code, Start Code и панелей Terminate Code в диалоговом окне параметров блоков. Используйте блок C Function для:
Вызовите функции от внешнего кода С и настройте код для своих моделей Simulink.
Предварительно обработайте данные, чтобы вызвать функцию C и постобработать данные после вызывания функции.
Задайте различный код для симуляции и генерации кода.
Вызовите несколько функций.
Инициализируйте и работайте с персистентными данными, кэшируемыми в блоке.
Выделите и освободите память.
Используйте блок C Function, чтобы вызвать внешние алгоритмы C в Simulink, который вы хотите изменить. Чтобы вызвать одну функцию C из модели Simulink, используйте блок C Caller. Чтобы интегрировать динамические системы, которые имеют непрерывные состояния или изменения состояния, используйте блок S-Function.
Следующие примеры используют блоки C Function, чтобы вычислить сумму и среднее значение входных параметров.
Начните путем создания внешних исходных файлов.
Создайте заголовочный файл под названием data_array.h
.
/* Define a struct called DataArray */ typedef struct DataArray_tag { /* Define a pointer called pData */ double* pData; /* Define the variable length */ int length; } DataArray; /* Function declaration */ double data_sum(DataArray data);
В той же папке создайте новый файл, data_array.c
. В этом файле запишите функцию C, которая вычисляет сумму входных чисел.
#include "data_array.h" /* Define a function that takes in a struct */ double data_sum(DataArray data) { /* Define 2 local variables to use in the function */ double sum = 0.0; int i; /* Calculate the sum of values */ for (i = 0; i < data.length; i++) { sum = sum + data.pData[i]; } /* Return the result to the block */ return sum; }
В новой, пустой модели добавьте блок C Function. Блок C Function находится в библиотеке User-Defined Functions Браузера Библиотеки.
Дважды кликните блок C Function, чтобы открыть диалоговое окно блока. Щелкните, чтобы открыть диалоговое окно Configuration Parameters. В панели Simulation Target задайте свой заголовочный файл под Insert custom C code in generated:> Header file.
Задайте исходный файл под Additional build information> Source files.
Нажмите OK, чтобы закрыть Параметры конфигурации.
В панели Output Code диалогового окна параметров блоков C Function запишите код, который блок выполняет в процессе моделирования. В этом примере внешняя функция C вычисляет сумму. В панели Output Code запишите код, который вызывает data_array.c
функция, чтобы вычислить сумму, затем вычисляет среднее значение.
/* declare the struct dataArr */ DataArray dataArr; /* store the length and data coming in from the input port */ dataArr.pData = &data; dataArr.length = length; /* call the function from the external code to calculate sum */ sum = data_sum(dataArr); /* calculate the mean */ mean = sum / length;
Можно задать код, который запускается в начале симуляции и в конце симуляции в панелях Terminate Code и Start Code.
Используйте таблицу Symbols, чтобы задать символы, используемые во внешнем коде С. Добавьте или удалите символ с помощью кнопок Add и Delete. Задайте все символы, используемые в Output Code, Start Code и панелях Terminate Code, чтобы гарантировать тот, порты отображаются правильно.
В таблице Symbols задайте следующее.
Имя Имя символа в исходном коде.
Осциллограф Осциллограф символов и порядка, в котором они появляются. Можно изменить осциллограф символа в любое время.
Input
— Вводимый символ с блоком C Function.
Output
— Выведите символ с блоком C Function.
Persistent
— Задайте символ как персистентные данные.
Можно задать пустой указатель с помощью Persistent
определите объем в блоке C Function. Пустой указатель является указателем, который может сохранить любой тип данных, которые вы создали или выделили.
Constant
— Задайте символ как постоянный размер значения использования или числовые выражения.
Parameter
— Задайте символ как параметр. Название параметра задано Label символа.
Метка Метка символа. Для символов с их набором осциллографа к Input
или Output
, эта метка появляется как имя порта на блоке. Для символов с их набором осциллографа к Parameter
, эта метка является меткой, которая появляется на маске параметров блоков. Вы не можете задать метку для Persistent
символы. Если осциллографом является Constant
, метка является константным выражением.
Ввод Тип данных символа. Выберите тип данных из выпадающего списка или задайте Simulink.AliasType
объект.
Размер Размер данных о символе. Блок C Function поддерживает только скаляры, и векторы поддерживаются. Матрицы и массивы более высокой размерности не поддержаны. Можно использовать выражение размера, чтобы задать размер выхода. Используйте -1
наследовать размер.
Порт Для символов ввода и вывода, Port
указывает на индекс порта на блоке данных о символе. Для символов параметра, Port
указывает на порядок, что символ появляется в маске параметров блоков.
Закройте диалоговое окно параметров блоков. После заполнения данных в таблице блок C Function теперь имеет один входной порт и два выходных порта с метками, заданными в таблице.
Добавьте блок Constant в холст Simulink, который будет входом с блоком C Function. В блоке Constant создайте случайный массив строк с 100 элементами. Чтобы отобразить результаты, присоедините блоки отображения к выходным параметрам блока C Function.
Можно задать различный выходной код для симуляции и генерацию кода для блока C Function путем определения MATLAB_MEX_FILE
. Например, чтобы задать код, который только запускается во время симуляции модели, вы используете следующее.
#ifdef MATLAB_MEX_FILE /* Enter Sim Code */ #else /* Enter code generation code */ #endif