C Function
Использование C-кода в моделях
Описание
Блок C Function позволяет в моделях Engee использовать код на языке C и разделяемые библиотеки, имеющие C API.
При подключении динамической библиотеки, использующей внутренние статические переменные, стоит убедиться в том, что она предоставляет API для инициализации/деинициализации этих переменных. Соответствующие функции необходимо вызывать во вкладках StartCode и TerminateCode редактора исходного кода. В противном случае, статические переменные будут сохранять свои последние значения между симуляциями, что может приводить к неправильным результатам при повторных запусках модели. |
Использование
Для интеграции исходного C кода в модель Engee необходимо:
-
Добавить в модель блок C Function из раздела Базовые/Пользовательские функции библиотеки блоков;
-
Нажать на кнопку Редактировать исходный код, после чего будет открыт редактор исходного кода.
Редактор исходного кода
Рабочая область редактора исходного кода состоит из трех вкладок:
-
Output code — содержит код, выполняющийся на каждом шаге расчета модели.
-
Start code — содержит код, выполняющийся один раз при инициализации модели.
-
Terminate code — содержит код, выполняющийся один раз при остановке модели.
В каждой из секций выполняется подсветка синтаксиса языка C.
В секции Output code расположен блок специальных комментариев, имеющих значение для симулятора и генератора кода.
Комментарии позволяют связать переменные в исходном коде с сигналами (входами и выходами) блока C Function, а также указать дополнительную информацию, необходимую для сборки кода и его использования в модели.
Особенности генерации С кода из блока C Function
Блок C Function поддерживает генерацию C кода.
При генерации кода блок C Function превращается в функции, оборачивающие содержимое секций Output code
, Start code
и Terminate code
.
В данный момент генератор C-кода не выдает дополнительную информацию для системы сборки, которая бы основывалась на директивах блока C Function. Директивы указываются в разделе Build options настроек блока:
Параметры
Sample time (-1 for inherited) — интервал между шагами расчета
−1 (по умолчанию)
Укажите интервал между шагами расчета как неотрицательное число. Чтобы наследовать шаг расчета, установите для этого параметра значение −1
.
Порты
Основные
Number of input ports — количество входных портов
1 (по умолчанию)
Определяет количество входных портов блока. Значение параметра Number of input ports будет соответствовать количеству входных портов.
Number of output ports — количество выходных портов
1 (по умолчанию)
Определяет количество выходных портов блока. Значение параметра Number of output ports будет соответствовать количеству выходных портов.
Вход
Label — имя (текстовая метка) входного порта
нет (по умолчанию)
Имя (текстовая метка) входного порта. По умолчанию ячейка имени не заполнена (имя не задано).
Variable name — имя переменной входного порта в исходном С-коде
input1 (по умолчанию)
Имя переменной входного порта в коде:
+
/* Этот код вызывается на каждом шаге расчета модели */
output1 = input1 * param1;
где input1
— имя переменной входного порта; output1
— имя переменной выходного порта; param1
— имя переменной параметра.
Type — тип данных переменной входного порта в исходном C-коде
double (по умолчанию)
| float
| uint8_t
| int16_t
| uint16_t
| int32_t
| uint32_t
| int64_t
| uint64_t
Тип данных переменной входного порта в исходном C-коде. Тип данных переменной должен совпадать с типом данных сигнала.
Поддерживаются базовые типы данных языка Си.
Size — размерность входного сигнала
1 (по умолчанию)
Размерность входного сигнала.
Выход
Label — имя (текстовая метка) выходного порта
нет (по умолчанию)
Имя (текстовая метка) выходного порта. По умолчанию ячейка имени не заполнена (имя не задано).
Variable name — имя переменной выходного порта в исходном С-коде
output1 (по умолчанию)
Имя переменной выходного порта в коде:
+
/* Этот код вызывается на каждом шаге расчета модели */
output1 = input1 * param1;
где input1
— имя переменной входного порта; output1
— имя переменной выходного порта; param1
— имя переменной параметра.
Type — тип данных выходной переменной в исходном C-коде
double (по умолчанию)
| float
| uint8_t
| int16_t
| uint16_t
| int32_t
| uint32_t
| int64_t
| uint64_t
Тип данных выходной переменной в исходном C-коде. Тип данных переменной должен совпадать с типом данных сигнала.
Поддерживаются базовые типы данных языка Си.
Size — размерность выходного сигнала
1 (по умолчанию)
Размерность выходного сигнала.
Настройка параметров
Number of parameters — укажите число параметров
1 (по умолчанию)
Число параметров, используемых в блоке.
Parameter — определяет параметр как переменную
1 (по умолчанию)
Определяет параметр как переменную для использования в исходном коде:
-
Name
— имя параметра, по умолчаниюparam1
. Может быть изменено. Имена новых Parameter называютсяparam2
и далее по возрастанию. -
Value
— значение параметра, по умолчанию1
. Может быть изменено. Значение новых Parameter равно нулю.
Для работы параметров необходимо зайти в редактор кода блока С Function (Редактировать исходный код) во вкладку OutputCode и внести имя нужного параметра. По умолчанию:
/* Этот код вызывается на каждом шаге расчета модели */
output1 = input1 * param1;
где input1
— переменная входного сигнала; output1
— переменная выходного сигнала.
Возможности построения
Source files — подключение файлов исходного кода
нет (по умолчанию)
Используется для подключения дополнительных файлов исходного кода. Должен включать путь и имя файла вместе с расширением.
Например:
/user/project/src/example.c
Include directories — определение пути к каталогу заголовочных файлов
нет (по умолчанию)
Используется для определения пути к каталогу, содержащему заголовочные файлы.
Например:
/user/project/include
Library directories — определение пути к каталогу библиотек
нет (по умолчанию)
Используется для определения пути к каталогу, содержащему разделяемые библиотеки.
Например:
/user/project/third_party
Headers — подключение заголовочных файлов
stdint.h math.h (по умолчанию)
Используется для подключения заголовочных файлов. Должен включать имя заголовочного файла вместе с расширением.
Например:
example.h
Defines — определение дополнительных директив #define
нет (по умолчанию)
Используется для определения дополнительных директив #define.
Например:
defines LOWER=0 UPPER=300 STEP=20
Libraries — подключение библиотек
нет (по умолчанию)
Используется для подключения библиотек. Должен включать имя библиотеки вместе с расширением.
Например:
libexample.so
Фактический тип данных, как и поддержка возможных типов данных, зависит от пользовательского кода внутри блока. |