Можно интегрировать новый или существующий код С в Simulink® с помощью блока C Caller. Чтобы создать авторские блоки в ваших моделях Simulink, блок C Caller позволяет вам вызывать внешние функции C, заданные во внешнем исходном коде и библиотеках. Преимущества блока C Caller:
Автоматизированное интегрирование простых функций C
Интеграция с Simulink Coverage™, Simulink Test™ и Simulink Design Verifier™
Интеграция с Simulink Coder™
Блок C Caller позволяет вам приносить алгоритмы C в Simulink. Чтобы смоделировать динамические системы, используйте Разработчика S-функции вместо этого. Следующие шаги описывают рабочий процесс, чтобы интегрировать код С в Simulink с помощью блока C Caller.
Задайте свой внешний файл исходного кода, который содержит ваши функции C.
От панели инструментов Simulink откройте Configuration Parameters.
На левой панели выберите Simulation Target.
Чтобы включить парсинг кода блоком C Caller, гарантируйте, что поле Import custom code выбрано.
Директории и пути к файлам могут быть путями к абсолютному и файлу прямого доступа к каталогам модели или к текущей рабочей директории. Смотрите Задают Относительные пути к Вашему Пользовательскому коду (Stateflow).
Выберите Header file и введите имя своего заголовочного файла с тегом #include
.
Под Additional build information выберите Include directories и введите папки, где дополнительная информация о сборке, такая как заголовочные файлы, хранится.
Выберите Source files и введите путь и имя исходного файла. Если модель и исходные файлы находятся в различных директориях, введите директорию, которая содержит исходный файл перед именем файла.
Если функция объявлена в заголовочном файле, но не реализована в исходном коде, пустая интерфейсная функция автоматически сгенерирована, чтобы моделировать и скомпилировать модель.
Можно задать порядок того, как матричные данные хранятся в Simulink. Матричные данные передали, и от вашего C функции преобразованы в функциональное размещение массивов по умолчанию, которое вы задаете. Если функциональное размещение массивов не задано, матричные данные передаются через Вызывающую сторону C в том же порядке ваших данных Simulink, и вычислительные ошибки могут произойти из-за столбца строки главная разрегулировка. Гарантируйте, что вы следуете за тем же функциональным размещением массивов по умолчанию для всех данных Simulink.
Главный столбцом — блок C Caller обрабатывает данные Simulink в порядке развертывания по столбцам. Предположим, что у вас есть 3х3 матрица. В блоке C Caller эта матрица хранится в этой последовательности: первый столбец, второй столбец и третий столбец.
Главный строкой — блок C Caller обрабатывает данные Simulink в главном строкой порядке. Предположим, что у вас есть 3х3 матрица. В блоке C Caller эта матрица хранится в этой последовательности: первая строка, вторая строка и третья строка.
Любой — Данные массива может храниться и в главном столбцом и главном строкой порядке в блоке C Caller. В результате можно сгенерировать код и в главных столбцом и главных строкой настройках.
Не заданный — Данные массива могут храниться и в главном столбцом и в главном строкой порядке. По сравнению с установкой Any можно только сгенерировать код в главной столбцом установке.
Чтобы узнать больше о размещениях главного строкой и главного массива столбца в Simulink, смотрите функциональное размещение массивов По умолчанию.
Выберите параметр макета массивов под Default Array Function Layout.
Если необходимо применить определенное размещение массивов к некоторым функциям в коде, нажмите Specify by Function, чтобы выбрать эти функции.
Нажмите Apply, чтобы принять ваши изменения.
Нажмите OK, чтобы закрыть Configuration Parameters.
Можно запустить пользовательское интегрирование кода С в Simulink путем ввода C Вызывающей стороны в холсте Simulink. Также перетащите блок C Caller от Library Browser> User-Defined Functions. Дважды кликните блок, чтобы открыть диалоговое окно Block Parameters, чтобы видеть имена ваших функций и спецификаций порта.
Нажмите на Refresh custom code, чтобы импортировать ваш исходный код и его зависимости.
Ваши функции C отображены под Function Name. Если вы не видите свой полный список функций, нажимаете, чтобы повторно импортировать ваш исходный код.
Чтобы просмотреть объявления функции или переменные ввода/вывода к вашим функциям в заголовочном файле, нажмите Go to function declaration , чтобы переместиться по исходным файлам.
Чтобы изменить исходные файлы и их зависимости, или задать и выбрать функциональные размещения массивов, нажимают Custom code settings , чтобы открыть вкладку Simulation Target в Параметрах конфигурации.
Можно сопоставить аргументы функции C от исходного кода до портов Simulink с помощью Port specification в блоке C Caller. В вашем исходном коде заголовочный файл включает аргументы функции C, которые будут соединены с портами Simulink.
extern void mean_filter(const unsigned char* src, unsigned char* dst, unsigned int width, unsigned int height, unsigned int filterSize);
Port specification показывает детали ваших аргументов и как они соединяются с вашим блоком C Caller в Simulink.
Имя аргумента — Задает имя аргументов ввода и вывода. Arg name является аргументом функции или названием параметра, как задано в ваших функциях C из исходного кода. Этот столбец в ссылочных целях только.
Осциллограф Задает, как аргументы функции C сопоставляют с Осциллографом Simulink. Ваши аргументы имеют осциллографы по умолчанию в зависимости от функционального определения, и можно изменить осциллографы, зависящие функциональное определение в исходном коде.
Осциллограф Simulink | Определите объем, чтобы блокировать отображение |
---|---|
input | Блокируйте входной порт |
output | Блокируйте выходной порт |
inputoutput | Блокируйте порт ввода и вывода |
parameter | Блокируйте настраиваемый параметр |
constant | Постоянное значение |
Когда у вас есть постоянное определение спецификатора, такое как const double *u
, аргумент может только быть входом или параметром. Когда нет никакого постоянного спецификатора, аргументом является вывод по умолчанию, и можно изменить его на input
, inputoutput
или на осциллограф parameter
. В этом случае гарантируйте, что функция C не изменяет память, указанную указателем. Если аргумент имеет тип output
, каждый элемент, указанный этим указателем, должен быть повторно присвоен в каждом призыве к этой функции.
C аргумент | Осциллограф Simulink |
---|---|
Функциональный возврат |
|
| input , parameter , constant |
|
|
| output (значение по умолчанию), inputoutput , input , parameter |
|
|
К аргументам функции карты C к порту inputoutput
задайте переменную как указатель в ваших функциональных определениях.
extern void mean_filter(unsigned char* src, unsigned int width, unsigned int height, unsigned int filterSize);
Затем выберите спецификацию порта к осциллографу inputoutput
в таблице Port Specification и присвойте получившийся функциональный вывод входной переменной в пользовательской функции.
Метка — Указывает на метку для соответствующего аргумента в блоке Simulink. По умолчанию ваша марка аргумента совпадает с именем аргумента, если вы не изменяете его.
Осциллограф Simulink | Метка порта Simulink |
---|---|
| Имя порта |
inputoutput | Имя порта в обоих портах ввода и вывода |
| 'ParameterName' |
| Выражение для постоянного значения. выражения размера с помощью имен входного параметра, например |
Введите — Демонстрирует соответствие между типом данных Simulink и типом данных аргумента функции C.
C тип данных аргумента | Тип данных Simulink |
---|---|
символ со знаком | int8 |
char без знака | uint8 |
'char' | int8 или uint8, в зависимости от компилятора |
int* | int32 |
int без знака* | uint32 |
короткий * | int16 |
долго * | int32 или fixdt (1,64,0), в зависимости от операционной системы |
плавание | единственный |
'double' | 'double' |
int8_t* | int8 |
uint8_t* | int8 |
int16_t* | int16 |
uint16_t* | uint16 |
int32_t* | int32 |
uint32_t* | uint32 |
struct определения типа {…} AStruct ** | Шина: AStruct |
перечисление определения типа {..} AnEnum ** | Перечисление: AnEnum |
*, Если Вызывающая сторона C берет целочисленный тип, например, int16_t, можно изменить его к фиксированной точке с соответствием с базовым типом, например, к fixdt (1, 16, 3). ** Кнопка синхронизации Вызывающей стороны C предлагает вам импортировать struct или перечислимые типы, используемые функцией C в качестве шины Simulink и перечисляемых типов. |
Размер — Задает размерности данных в аргументе.
C размерности аргумента | Размерности порта Simulink |
---|---|
| скаляр (1) |
| наследованный (-1) (значение по умолчанию) Если аргумент для выходного порта, размер должен быть задан. Размер выходного порта не может быть наследован. |
| наследованный (-1) (значение по умолчанию) Если аргумент для порта |
| Размер [2, 3]. |
Можно создать модель библиотеки, чтобы сгруппировать блоки Вызывающей стороны C и сохранить модели организованными.
Откройте новую модель библиотеки от File> New> Library и нажмите Blank Library.
Откройте Simulation Target от View> Library Custom Code Settings> Simulation Target
Выберите C
или C++
в опции Language, в зависимости от вашего кода, и гарантируйте, что поле Import custom code выбрано.
Следуйте инструкциям в, Задают Исходный код и Зависимости, чтобы добавить ваши исходные файлы и их зависимости.
Создайте блоки Вызывающей стороны C, чтобы вызвать функции C.
Чтобы вставить блок от вашей модели библиотеки до модели Simulink, просто перетащите блок в свою модель.
Глобальная Инициализация состояний C — Если ваше чтение функций C или запись глобальные или статические переменные, наблюдайте порядок. Например, если несколько функций C получают доступ к тому же набору глобальных переменных, порядок выполнения блоков может привести к неожиданным результатам.
Инициализация/Завершение Настроек Пользовательского кода — Если необходимо выделить и освободить память для пользовательского кода, вставить, выделяет и освобождает в полях Initialize function и Terminate function настроек пользовательского кода.
Блок Complex Data Support — The C Caller не поддерживает сложные типы данных в Simulink.
Блок Continuous Sample Time — The C Caller не поддерживает время непрерывной выборки.
Аргументы переменной — Аргументы переменной в C не поддержаны, например, int sprintf(char *str, const char *format, ...)
.
Блок Syntax — The C Caller C++ не поддерживает нативный синтаксис C++ непосредственно. Необходимо записать обертку функции C, чтобы взаимодействовать через интерфейс с Кодом С++.
Чтобы протестировать ваши модели, который включает блоки Вызывающей стороны C, смотрите Тест Интегрированный код С (Simulink Test).
Функция MATLAB | Matlab.system | S-функция | Разработчик S-функции | legacy_code