Документация Engee

C Function

Использование C-кода в моделях

c function

Описание

Блок C Function позволяет в моделях Engee использовать код на языке C и разделяемые библиотеки, имеющие C API.

При подключении динамической библиотеки, использующей внутренние статические переменные, стоит убедиться в том, что она предоставляет API для инициализации/деинициализации этих переменных. Соответствующие функции необходимо вызывать во вкладках StartCode и TerminateCode редактора исходного кода. В противном случае, статические переменные будут сохранять свои последние значения между симуляциями, что может приводить к неправильным результатам при повторных запусках модели.

Использование

Для интеграции исходного C кода в модель Engee необходимо:

  • Добавить в модель блок C Function из раздела Базовые/Пользовательские функции библиотеки блоков;

  • Нажать на кнопку Редактировать исходный код, после чего будет открыт редактор исходного кода.

c function settings

Редактор исходного кода

Рабочая область редактора исходного кода состоит из трех вкладок:

  • Output code — содержит код, выполняющийся на каждом шаге расчета модели.

  • Start code — содержит код, выполняющийся один раз при инициализации модели.

  • Terminate code — содержит код, выполняющийся один раз при остановке модели.

В каждой из секций выполняется подсветка синтаксиса языка C.

В секции Output code расположен блок специальных комментариев, имеющих значение для симулятора и генератора кода.

Комментарии позволяют связать переменные в исходном коде с сигналами (входами и выходами) блока C Function, а также указать дополнительную информацию, необходимую для сборки кода и его использования в модели.

c function code editor

Особенности генерации С кода из блока C Function

Блок C Function поддерживает генерацию C кода.

При генерации кода блок C Function превращается в функции, оборачивающие содержимое секций Output code, Start code и Terminate code.

В данный момент генератор C-кода не выдает дополнительную информацию для системы сборки, которая бы основывалась на директивах блока C Function. Директивы указываются в разделе Build options настроек блока:

build options c function

Параметры

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
Фактический тип данных, как и поддержка возможных типов данных, зависит от пользовательского кода внутри блока.

Дополнительные возможности

Генерация Си кода: Да