Можно вызвать и интегрировать внешний код С в модели 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.
InputOutput
— Задайте символ как оба ввода и вывода с блоком C Function.
Используйте InputOutput
определите объем, чтобы сопоставить вход, переданный указателем в вашем коде С. Порты создали использование InputOutput
осциллограф имеет то же имя для портов ввода и вывода. InputOutput
осциллограф включает повторное использование буфера для портов ввода и вывода. Многократное использование буфера может оптимизировать использование памяти и улучшить симуляцию кода и КПД генерации кода, в зависимости от размера сигнала и блочного расположения. Ограничения включают:
InputOutput
символ не может использоваться в Start
и Terminate
код.
InputOutput
порт не поддерживает void*
тип данных.
InputOutput
порт не поддерживает size()
выражения.
Persistent
— Задайте символ как персистентные данные.
Можно задать пустой указатель с помощью Persistent
определите объем в блоке C Function. Пустой указатель является указателем, который может сохранить любой тип данных, которые вы создали или выделили.
Constant
— Задайте символ как постоянный размер значения использования или числовые выражения.
Parameter
— Задайте символ как параметр. Название параметра задано Label символа.
Метка Метка символа. Для символов с их набором осциллографа к Input
или Output
, эта метка появляется как имя порта на блоке. Для символов с их набором осциллографа к Parameter
, эта метка является меткой, которая появляется на маске параметров блоков. Вы не можете задать метку для Persistent
символы. Если осциллографом является Constant
, метка является константным выражением.
Ввод Тип данных символа. Выберите тип данных из выпадающего списка или задайте пользовательский тип данных.
Использовать пользовательский тип, такой как Simulink.Bus
, Перечисление Simulink или Simulink.AliasType
это не имеет внешнего определения заголовка сопоставленным с блоком C Function, установите тип правильно на таблице Symbol.
Размер Размер данных о символе. Блок C Function поддерживает только скаляры, и векторы поддерживаются. Матрицы и массивы более высокой размерности не поддерживаются. Можно использовать выражение размера, чтобы задать размер выхода. Используйте -1
наследовать размер.
Порт Для символов ввода и вывода, Port
указывает на индекс порта на блоке данных о символе. Для символов параметра, Port
указывает на порядок, что символ появляется в маске параметров блоков.
Закройте диалоговое окно параметров блоков. После заполнения данных в таблице блок C Function теперь имеет один входной порт и два выходных порта с метками, заданными в таблице.
Добавьте блок Constant в холст Simulink, который будет входом с блоком C Function. В блоке Constant создайте случайный массив строк с 100 элементами. Чтобы отобразить результаты, присоедините блоки отображения к выходным параметрам блока C Function.
Можно вызвать это подмножество Математических Библиотечных функций C от блока C Function:
abs | acos | asin | atan | atan2 | ceil |
cos | cosh | exp | fabs | floor | fmod |
labs | ldexp | log | log10 | pow | sin |
sinh | sqrt | tan | tanh |
Когда вы вызываете эти функции, двойная точность применяется, если все входные параметры не являются явным образом одинарной точностью. Когда несоответствие типов происходит, бросок входных параметров к ожидаемому типу заменяет исходные аргументы. Например, если вы вызываете sin
функция с целочисленным аргументом, броском входного параметра к числу с плавающей запятой типа double
заменяет исходный аргумент.
Если вы хотите вызвать другие библиотечные функции C, которые не упоминаются выше, создают внешнюю функцию обертки, которая вызывает библиотечную функцию C.
abs
, fabs
, и labs
ФункцияИнтерпретация abs
, fabs
, и labs
функции в блоке C Function идут вне стандарта C версия, чтобы включать целочисленные и аргументы с плавающей точкой:
Если x
целое число, стандарт C функция применяется к x
, или abs(x)
.
Если x
двойное, стандарт C функциональный labs
применяется к x
, или labs(x)
.
Если x
сингл, стандарт C функциональный fabs
применяется к x
, или fabs(x)
.
Вызов функции должен вызвать правильный CRL на основе типа данных, переданных в функцию. Если никакой CRL не задан, вызов функции должен вызвать к специфичной для типа библиотеке. CRL для C99 генерирует специфичную для типа функцию. Например:
Введите передал в | Вызов генерации кода |
---|---|
sin(doubleIn) | sin(doubleIn) |
sin(floatIn) | sinf(floatIn) |
Можно задать различный выходной код для симуляции и генерацию кода для блока C Function путем определения MATLAB_MEX_FILE
. Например, чтобы задать код, который только запускается во время симуляции модели, вы используете следующее.
#ifdef MATLAB_MEX_FILE /* Enter Sim Code */ #else /* Enter code generation code */ #endif