Можно интегрировать новый или существующий код С в Simulink® использование блока C Caller. Чтобы создать пользовательские блоки в ваших моделях Simulink, блок C Caller позволяет вам вызывать внешние функции C, заданные во внешнем исходном коде и библиотеках. Преимущества блока the C Caller:
Автоматизированное интегрирование простых функций C
Интеграция с Simulink Coverage™, Simulink Test™ и Simulink Design Verifier™
Интеграция с Simulink Coder™
Блок C Caller и блок C Function позволяют вам приносить алгоритмы C в Simulink. Чтобы смоделировать динамические системы, используйте S-Function Builder вместо этого. Следующие шаги описывают рабочий процесс, чтобы интегрировать код С в Simulink с помощью блока C Caller.
Примечание
C99 является стандартной версией языка C, поддержанного для пользовательского интегрирования кода С в Simulink.
Задайте свой внешний файл исходного кода, который содержит ваши функции C.
От панели инструментов Simulink откройте Configuration Parameters.
На левой панели выберите Simulation Target.
Чтобы включить парсинг кода блоком C Caller, гарантируйте, что поле Import custom code выбрано.
Директории и пути к файлам могут быть путями к абсолютному и файлу прямого доступа к каталогам модели или к текущей рабочей директории. Смотрите Задают Относительные пути к Вашему Пользовательскому коду (Stateflow).
Выберите Header file и введите имя своего заголовочного файла с #include
тег.
Совет
После того, как вы ввели информацию для Source files на следующем шаге, можно нажать Auto-fill from Source files, чтобы заполнить имя заголовочного файла автоматически, с помощью информации, содержавшейся в исходных файлах.
Под Additional build information выберите Source files и введите путь и имя исходного файла. Если модель и исходные файлы находятся в различных директориях, введите директорию, которая содержит исходный файл перед именем файла.
Выберите Include directories и введите папки, где дополнительная информация о сборке, такая как заголовочные файлы, хранится.
Чтобы проверить, что ваш пользовательский код может быть проанализирован и создан успешно, нажмите Validate.
Примечание
Если ваш заголовочный файл объявляет функцию, но ваши исходные файлы не задают функцию, по умолчанию функция не отображается в диалоговом окне блока C Caller. Можно установить Неопределенный параметр обработки функции в Параметрах конфигурации, чтобы задать другие поведения в этой ситуации, включая бросок ошибки, генерацию интерфейсной функции или игнорирование условия.
Примечание
Чтобы использовать блок C Caller в Для Каждой подсистемы или со временем непрерывной выборки или оптимизировать использование блока в условном входном выполнении ветви, функция пользовательского кода, вызванная блоком, должна быть детерминирована, то есть, всегда производя те же выходные параметры для тех же входных параметров. Идентифицируйте, какие функции пользовательского кода детерминированы при помощи Deterministic functions и параметров Specify by function в панели Simulation target. Для условного входного примера выполнения ветви смотрите Использование C Блок Вызывающей стороны с Условным Выполнением.
Simulink может передать данные массива N-D функциям пользовательского кода в блоках C Caller и получить данные из таких блоков. Когда вы делаете так, необходимо задать правильное размещение массивов, чтобы достигнуть намеченных результатов. Смотрите функциональное размещение массивов По умолчанию и Исключение функцией. Для примеров использования данных массива с блоками C Caller смотрите, Приносят Алгоритмы Фильтра Пользовательского изображения как Допускающие повторное использование Блоки в Simulink и Вызове блок Legacy Lookup Table Function Using C Caller.
Можно задать порядок того, как матричные данные обрабатываются в функциях C. Матричные данные передали, и от вашего C функции преобразованы при необходимости в размещение массивов, которое вы задаете. Если размещение массивов не задано, матричные данные передаются через функцию C в том же порядке ваших данных Simulink, и вычислительные ошибки могут произойти из-за упорядоченного по столбцам строкой разногласия. Убедитесь, что вы следуете за тем же функциональным размещением массивов по умолчанию для всех данных Simulink.
Упорядоченный по столбцам — данные о входном массиве указателей на функцию C в порядке развертывания по столбцам. Предположим, что у вас есть 3х3 матрица. В функции C к этой матрице получают доступ в этой последовательности: первый столбец, второй столбец и третий столбец.
Упорядоченный по строкам — данные о входном массиве указателей на функцию C в упорядоченном по строкам порядке. Предположим, что у вас есть 3х3 матрица. В функции C к этой матрице получают доступ в этой последовательности: первая строка, вторая строка и третья строка.
Любой — функция C равнодушен к размещению данных о входном массиве. Это имело бы место, если, например, функция выполняет только поэлементные операции на данных.
Не заданный — функция C не делает предположения о размещении данных о входном массиве. По сравнению с установкой Any можно сгенерировать код только в упорядоченной по столбцам установке. Попытка сгенерировать код в упорядоченной по строкам установке производит ошибку. Смотрите размещение Массивов (Simulink Coder). Выберите эту опцию только если необходимый для совместимости с более старыми моделями.
Чтобы узнать больше об упорядоченных по строкам и упорядоченных по столбцам размещениях массивов в Simulink, смотрите функциональное размещение массивов По умолчанию.
Выберите параметр макета массивов под Default function array layout.
Если необходимо применить определенное размещение массивов к некоторым функциям в коде, нажмите Exception by function, чтобы выбрать эти функции.
Нажмите Apply, чтобы принять ваши изменения.
Если ваши функции C принимают только скалярные и/или векторные входные параметры, установка Default function array layout не оказывает влияния.
Можно запустить пользовательское интегрирование кода С в Simulink путем ввода C Caller
в холсте Simulink. В качестве альтернативы перетащите блок C Caller из библиотеки User-Defined Functions на холст. Дважды кликните блок, чтобы открыть диалоговое окно Block Parameters, чтобы видеть имена ваших функций и технических требований порта.
Нажмите на Кнопку Обновить, чтобы импортировать ваш исходный код и его зависимости.
Ваши функции C отображены под Function Name. Если вы не видите свой полный список функций, нажмите, чтобы повторно импортировать ваш исходный код.
Чтобы просмотреть функциональные определения в исходном файле, щелкните. Исходный код для выбранной функции отображен в MATLAB® Редактор. Если исходный код не доступен, объявление функции в заголовочном файле отображено.
Чтобы изменить исходные файлы и их зависимости, или задать и выбрать функциональные размещения массивов, нажимают кнопку настроек пользовательского кода, чтобы открыть панель Simulation Target в Параметрах конфигурации Модели.
Можно сопоставить аргументы функции C от исходного кода до портов Simulink с помощью таблицы Port specification в блоке C Caller и путем создания FunctionPortSpecification
объект через командную строку. В вашем исходном коде заголовочный файл включает аргументы функции 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.
Имя Задает имя аргументов ввода и вывода. Name является аргументом функции или названием параметра, как задано в ваших функциях C из исходного кода. Этот столбец в ссылочных целях только.
Осциллограф Задает, как аргументы функции C сопоставляют с Осциллографом Simulink. Ваши аргументы имеют осциллографы по умолчанию в зависимости от функционального определения, и можно изменить осциллографы, зависящие функциональное определение в исходном коде.
Осциллограф Simulink | Определите объем, чтобы блокировать отображение |
---|---|
Input | Блокируйте входной порт |
Output | Блокируйте выходной порт |
InputOutput | Блокируйте порт ввода и вывода |
Global | Глобальная переменная используется блоком |
Parameter | Блокируйте настраиваемый параметр |
Constant | Постоянное значение |
Для аргумента, переданного указателем, когда у вас есть постоянное определение спецификатора, такое как const double *u
, аргумент может только быть входом или параметром. Когда нет никакого постоянного спецификатора, аргументом является InputOutput
по умолчанию, и можно изменить его в Input
вывод
, или Parameter
осциллограф. В случае Input
или Parameter
определите объем, гарантируйте, что функция C не изменяет память, указанную указателем. Если аргумент имеет Output
определите объем, каждый элемент, на который указывает этот указатель, должен быть повторно присвоен в каждом призыве к функции.
C аргумент | Осциллограф Simulink |
---|---|
Функциональный возврат |
|
| Input , Parameter , Constant |
| InputOutput (значение по умолчанию), Output входной параметр , Parameter |
|
|
Используйте InputOutput
порт, чтобы сопоставить вход, переданный указателем в ваших функциях C. Порты создали использование InputOutput
порт имеет то же имя для портов ввода и вывода. InputOutput
порты включают повторное использование буфера для портов ввода и вывода. Это может оптимизировать использование памяти в зависимости от размера сигнала и блочного расположения.
К аргументам функции карты C к InputOutput
порт, задайте переменную как указатель в ваших функциональных определениях.
extern void mean_filter(unsigned char* src, unsigned int width, unsigned int height, unsigned int filterSize);
Затем выберите спецификацию порта к InputOutput
определите объем в таблице Port Specification и присвойте получившийся функциональный выход входной переменной в пользовательской функции.
Можно использовать глобальные переменные в пользовательском коде, сопоставляя их с соответствующим Осциллографом Simulink. Чтобы включить использование глобальных переменных в вашей модели, выберите глобальные переменные Enable, когда функция взаимодействует через интерфейс от Model Settings> Configuration Parameters> Simulation Target. Можно сопоставить глобальные переменные с Input
вывод
, InputOutput
или Global
определите объем на блоке C Caller. Доступность этих осциллографов зависит от использования глобальной переменной в вашем пользовательском коде.
Global
осциллограф позволяет вам передать данные между пользовательским кодом и блоком C Caller и позволяет вам использовать глобальную переменную во время вычислений на блоке. Значения, переданные с помощью Global
осциллограф не отображается в интерфейсе блока. Эта таблица показывает отрывки примера кода и их и доступные порты по умолчанию.
Пример кода | Осциллограф Simulink |
---|---|
double data; void foo(void) { int temp = data; } | Данные о глобальной переменной только читают переменную
|
double data; void bar(void) { data = 0; } | Данные записаны в глобальную переменную. Доступные осциллографы:
|
double data; void foo2(void) { data = data + 1; } | Данные и считаны и записаны на глобальной переменной. Доступные осциллографы:
|
Метка — Указывает на метку для соответствующего аргумента в блоке Simulink. По умолчанию ваша марка аргумента совпадает с именем аргумента, если вы не изменяете его.
Осциллограф Simulink | Метка порта Simulink |
---|---|
| Имя порта |
inputoutput | Имя порта в обоих портах ввода и вывода |
Global | Имя порта и имя глобальной переменной |
| 'ParameterName' |
| Выражение для постоянного значения. выражения размера с помощью имен входного параметра, например |
Введите — Демонстрирует соответствие между типом данных Simulink и типом данных аргумента функции C.
C тип данных аргумента | Тип данных Simulink |
---|---|
символ со знаком | int8 |
char без знака | uint8 |
'char' | int8 или uint8, в зависимости от компилятора |
int* | int32 |
int без знака* | uint32 |
короткий * | int16 |
долго * | int32 или fixdt (1,64,0), в зависимости от операционной системы |
float | единственный |
'double' | 'double' |
int8_t* | int8 |
uint8_t* | uint8 |
int16_t* | int16 |
uint16_t* | uint16 |
int32_t* | int32 |
uint32_t* | uint32 |
struct определения типа {…} AStruct** | Шина: AStruct |
перечисление определения типа {..} AnEnum** | Перечисление: AnEnum |
*, Если C Caller берет целочисленный тип, например, int16_t, можно изменить его к фиксированной точке с соответствием с базовым типом, например, к fixdt (1, 16, 3). ** Кнопка синхронизации C Caller предлагает вам импортировать struct или перечислимые типы, используемые функцией C в качестве шины Simulink и перечисляемых типов. |
Размер — Задает размерности данных в аргументе.
C размерности аргумента | Размерности порта Simulink |
---|---|
| скаляр (1) |
| наследованный (-1) (значение по умолчанию) Если аргумент для выходного порта, размер должен быть задан. Размер выходного порта не может быть наследован. |
| наследованный (-1) (значение по умолчанию) Если аргумент для Для глобальных переменных размер скалярный (1). |
| Размер [2, 3]. |
FunctionPortSpecification
Объект и редактирование свойства блока C CallerЧтобы изменить свойства таблиц Port Specification программно, можно создать FunctionPortSpecification
возразите и измените его свойства. Создать FunctionPortSpecification
объект для выбранного блока C Caller в модели, введите в командной строке:
myCCallerConfigObj = get_param(gcb, 'FunctionPortSpecification')
myCCallerConfigObj = FunctionPortSpecification with properties: CPrototype: 'real_T add(real_T u1, real_T u2);' InputArguments: [1×2 Simulink.CustomCode.FunctionArgument] ReturnArgument: [1×1 Simulink.CustomCode.FunctionArgument] GlobalArguments: [1×0 Simulink.CustomCode.FunctionArgument]
CPrototype
свойство только для чтения, и показывает объявление переменных входного параметра функции C. InputArgument
и ReturnArgument
свойства создают FunctionArgument
возразите, что можно далее отредактировать его свойства согласно правилам, заданным для приведенной выше таблицы Port Specification. Вы видите FunctionPortSpecification
узнавать больше.Чтобы изменить глобальные аргументы в блоке C Caller, создайте указатель на GlobalArguments
объектное использование getGlobalArg
и измените его свойства.
Рекомендуется создать модель библиотеки, чтобы сгруппировать ваши блоки C Caller и сохранить ваши модели организованными. Можно также соединить словарь данных с библиотекой, чтобы содержать пользовательские типы, заданные в коде. Используя библиотеку модель особенно полезно, когда у вас есть многоуровневые модели или иерархия модели - ссылки, которая использует пользовательский код С.
Откройте новую модель библиотеки. На вкладке Simulation выберите New> Library.
На вкладке Modeling, под Design, нажимают Simulation Custom Code.
Выберите C
или C++
в опции Language, в зависимости от вашего кода, и гарантируют, что поле Import custom code выбрано.
Следуйте инструкциям в, Задают Исходный код и Зависимости, чтобы добавить ваши исходные файлы и их зависимости.
Создайте блоки C Caller, чтобы вызвать функции C.
Чтобы вставить блок от вашей модели библиотеки до модели Simulink, просто перетащите блок в свою модель.
Можно также создать библиотеку блоков C Caller из пользовательского кода с помощью Средства импорта Simulink Кода. Смотрите Импорт Пользовательский Код C/C++ Используя Средство импорта Simulink Кода.
Чтобы присоединить внешний отладчик к процессу MATLAB и отладить внешний код С, убеждаются, что Параметр конфигурации Модели, Simulate custom code in a separate process очищен, затем генерируют использование отладочных символов:
clear mex Simulink.CustomCode.debugSymbols('on')
MATLAB.exe
. Установите точки останова в своем внешнем коде С с помощью внешнего отладчика, и когда вы симулируете свою модель, это должно остановиться в точках останова.Поверните это выделение использования:
Simulink.CustomCode.debugSymbols('off')
C Caller поддерживает генерацию кода. В коде, сгенерированном из вашей модели, каждое выполнение блока C Caller соответствует вызову внешней функции C, сопоставленной с блоком. Для того, чтобы создать сгенерированный код, панель Code Generation > Custom Code Параметров конфигурации Модели должна быть заполнена с правильной информацией относительно пользовательского кода. Смотрите Параметры конфигурации Модели: Пользовательский код Генерации кода (Simulink Coder).
При симуляции модели, содержащей пользовательский код C or C++, у вас есть опция, чтобы запустить пользовательский код в отдельном процессе за пределами MATLAB. Эта опция может быть полезной при отладке пользовательского кода. Путем выполнения в отдельном процессе проблемы с пользовательским кодом не заставляют MATLAB отказывать, и можно более легко отладить и разрешить такие проблемы. Проблемы могли возникнуть из-за непредвиденных исключительных ситуаций в пользовательском коде или ошибок в интерфейсе между Simulink и пользовательском коде.
Чтобы включить эту опцию, в параметрах конфигурации модели, в Целевой панели Симуляции, выбирают пользовательский код Simulate в отдельном процессе. Опция применяется к пользовательскому коду C/C++, интегрированному в вашу модель с помощью любого из этих блоков:
C вызывающая сторона
C функция
Функция MATLAB
Matlab.system
График Stateflow®
Например, эта модель содержит блок C Caller, который вызывает функциональный adder()
, который получает доступ к объекту под названием adderObj
. Прежде, чем вызвать функцию, объект должен быть создан, который может быть сделан путем вызова initAdder()
от Инициализировать функции Целевой панели Симуляции параметров конфигурации модели.
Если initAdder()
не называется перед adder()
, затем adder()
попытки получить доступ к неинициализированному указателю, который вызывает исключение на этапе выполнения. Если Симулировать пользовательский код в отдельном параметре процесса не выбран, это исключение могло бы заставить MATLAB отказывать, когда вы симулируете модель. Однако, если параметр выбран, симулирование модели производит сообщение об ошибке в Simulink.
Можно затем нажать Open, чтобы запустить внешний отладчик и решить вопрос, который вызвал ошибку.
После запусков отладчика это перезапустит симуляцию и остановку в точках останова пользовательских функциональных записей автоматически.
Если ваш пользовательский код полностью отлажен, можно очиститься, Симулируют пользовательский код в отдельном процессе для более быстрого времени симуляции.
Глобальные переменные — Глобальные переменные как входной параметр функции выходные параметры не поддерживают многомерные массивы.
Инициализация/Завершение Настроек Пользовательского кода — Если необходимо выделить и освободить память для пользовательского кода, вставить, выделяет и освобождает в полях Initialize function и Terminate function настроек пользовательского кода или использует блок C Function.
Блок Complex Data Support — The C Caller не поддерживает сложные типы данных в Simulink.
Аргументы переменной — Аргументы переменной в C не поддерживаются, например, int sprintf(char *str, const char *format, ...)
.
Блок Syntax — The C Caller C++ не поддерживает нативный синтаксис C++ непосредственно. Необходимо записать обертку функции C, чтобы взаимодействовать через интерфейс с Кодом С++.
К тестовым моделям, которые включают блоки C Caller, смотрите Тест Интегрированный код С (Simulink Test).
Примечание
Если модель имеет пользовательский код, после того, как модель будет обновлена или запуск, slprj
папка может быть заблокирована из-за загруженного исполняемого файла симуляции пользовательского кода. Папка не может быть удалена, когда она заблокирована. Разгрузить исполняемый файл и разблокировать slprj
папка, используйте clear mex
команда. Смотрите clear
.