exponenta event banner

Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом

Независимо от того, импортируется ли внешний код в модель Simulink ® (например, с помощью инструмента Legacy Code Tool) или экспортируется сгенерированный код во внешнюю среду, модель или сгенерированный код обычно обмениваются данными (сигналами, состояниями и параметрами) с кодом.

Функции в коде C или C++, включая внешние функции, могут обмениваться данными с вызывающим абонентом или вызываемой функцией посредством:

  • Аргументы (формальные параметры) функций. Когда функция обменивается данными через аргументы, приложение может вызывать функцию несколько раз. Каждый экземпляр вызываемой функции может манипулировать своим собственным независимым набором данных, чтобы экземпляры не мешали друг другу.

  • Прямой доступ к глобальным переменным. Глобальные переменные могут:

    • Включите различные алгоритмы (функции) и экземпляры одного алгоритма для совместного использования данных, таких как параметры калибровки и состояние ошибок.

    • Активизируйте различные скорости (функции) многозадачной системы для обмена данными.

    • Включить различные алгоритмы для асинхронного обмена данными.

В Simulink можно организовать и настроить данные таким образом, чтобы модель использовала эти механизмы обмена для предоставления, извлечения и совместного использования данных с кодом.

Перед попыткой сопоставления интерфейсов данных выберите общий подход к интеграции в разделе Выбор потока операций интеграции внешнего кода.

Импорт внешнего кода в модель

Для обмена данными между моделью и внешней функцией выберите механизм обмена на основе метода, выбранного для интеграции функции.

  • Для обмена данными через аргументы внешней функции создайте и настройте модель для создания и упаковки данных в соответствии с типами данных аргументов. Затем выполняется подключение и настройка блока, который вызывает или представляет функцию, для принятия, создания или обращения к данным из модели.

    Например, если для создания блока S-Function, вызывающего функцию, используется инструмент Legacy Code Tool, порты и параметры блока соответствуют аргументам функции. Выходные сигналы восходящих блоков подключаются к входным портам и задаются в маске блока. Затем можно создать сигнальные линии из выходных портов блока и соединить эти сигналы с нисходящими блоками.

  • Для обмена данными через глобальные переменные, которые уже определены внешним кодом, рекомендуется использовать диаграмму Stateflow ® для вызова функции и доступа к переменным. Алгоритмический код C записывается на диаграмму так, чтобы во время моделирования или выполнения сгенерированного кода модель считывала и записывала в переменные.

    Чтобы использовать такую глобальную переменную в качестве элемента данных параметров (а не данных сигналов или состояний) в другом месте модели, можно создать числовую переменную MATLAB ® илиSimulink.Parameter объект, представляющий переменную. При изменении значения переменной C-кода между запусками моделирования необходимо вручную синхронизировать значение переменной или объекта Simulink. Если алгоритмический код (функция) изменяет значение переменной C-кода во время моделирования, соответствующая переменная или объект Simulink не изменяется.

    При создании представления Simulink переменной C-кода можно настроить представление Simulink так, чтобы созданный код считывал и записывал в переменную, но не дублировал определение переменной. Примените класс хранения к представлению Simulink.

Методика интеграции внешней функцииМеханизм обмена данными с модельюПримеры и дополнительная информация
S-функциональный блок

Аргументы функции

Чтобы вызвать функцию через S-функцию, созданную с помощью инструмента «Унаследованный код» (Legacy Code Tool), см. раздел Интеграция функций C в модели Simulink с инструментом «Унаследованный код» (Legacy Code Tool).

Диаграмма статофлоу

Аргументы функции и прямой доступ к глобальным переменным

Чтобы вызвать функцию и получить доступ к глобальным переменным в диаграмме Stateflow, см. раздел Доступ к переменным пользовательского кода и функциям в диаграммах Stateflow (Stateflow). Сведения о создании элементов данных в диаграмме (которые можно передать в функцию в качестве аргументов) см. в разделе Добавление данных Stateflow (Stateflow).

coder.ceval в функциональном блоке MATLAB

Аргументы функции

Вызов функции в функциональном блоке MATLAB с помощью coder.cevalсм. раздел Интеграция кода C с использованием функционального блока MATLAB. Для получения информации о создании элементов данных в функциональном блоке MATLAB (который можно передать функции в качестве аргументов) см. раздел Порты и диспетчер данных.

Экспорт созданного кода во внешнюю среду

Чтобы экспортировать сгенерированный код во внешний код, см. раздел Обмен данными между внешним кодом вызывающего абонента и сгенерированным кодом.

Симуляционные представления типов данных и конструкций C

Моделирование и повторное использование пользовательских данных C, таких как структуры, перечисления и typedef используйте информацию в этих таблицах.

Моделирование шаблонов для сопоставления данных во внешнем коде C

Тип данных или конструкция CКод примера CЭквивалент SimulinkДополнительные сведения

Псевдоним примитивного типа (typedef)

typedef float mySinglePrec_T;

Создать Simulink.AliasType объект. Используйте объект для:

  • Задание типов данных сигналов и параметров блоков в модели.

  • Настройте замены типов данных для создания кода.

Для создания кода, использующего тип данных псевдонима, требуется Embedded Coder ®.

Сведения об определении пользовательских типов данных для модели см. в разделе Simulink.AliasType и управляющие имена типов данных в сгенерированном коде (встроенном кодере).

Пример экспорта созданного кода во внешний код см. в разделе Замена и переименование типов данных в соответствии со стандартами кодирования (Embedded Coder).

Множество

int myArray[6];

Задайте размеры сигнала и параметра, как описано в разделе Определение размеров сигнала.

Сгенерированный код определяет многомерные данные, включая матрицы, и обращается к ним как к основным сериализованным векторам столбцов. Если внешний код использует другой формат, попробуйте использовать альтернативные методы для интеграции созданного кода. См. раздел Создание кода матриц и массивов.

Сведения о том, как созданный код хранит нескалярные данные (включая ограничения), см. в разделе Создание кода матриц и массивов.

Пример экспорта созданного кода во внешний код см. в разделе Повторное использование данных параметров из внешнего кода в созданном коде (встроенном кодере).

О том, как моделировать таблицы поиска, см. раздел Simulink.LookupTable.

Перечисление

typedef enum myColorsType {
  Red = 0,
  Yellow,
  Blue
} myColorsType;

Определите перечисление Simulink, соответствующее определению перечисления. Для задания типов данных в модели используется перечисление Simulink.

Сведения об использовании перечисляемых данных в модели Simulink см. в разделе Использование перечисляемых данных в моделях Simulink.

Пример создания данных перечисляемых параметров см. в разделе Перечисление (встроенный кодер).

Пример экспорта созданного кода во внешний код путем обмена перечисленными данными см. в разделе Обмен структурированными и перечисленными данными между сгенерированным и внешним кодом (встроенный кодер).

Структура

typedef struct myStructType {
    int count;
    double coeff;
} myStructType;

Создать Simulink.Bus объект, соответствующий типу структуры.

Чтобы создать структурированные данные о сигнале или состоянии, упаковывайте несколько сигнальных линий в модели в один невоиртуальный сигнал шины.

Чтобы создать структурированные данные параметра, создайте объект параметра (например, Simulink.Parameter), в котором хранится структура MATLAB. Используйте объект шины в качестве типа данных объекта параметра.

Чтобы упаковать данные таблицы поиска в структуру, используйте Simulink.LookupTable и, необязательно, Simulink.Breakpoint объекты.

Для получения информации о сигналах шины см. раздел Группирование сигнальных линий в виртуальные шины. Сведения о структурах параметров см. в разделе Организация связанных определений параметров блоков в структурах.

Пример импорта внешнего кода в модель с помощью инструмента Legacy Code Tool см. в разделе Интеграция функции C, аргументы которой являются указателями на структуры.

Примеры экспорта созданного кода во внешний код см. в разделах Обмен структурированными и перечисленными данными между сгенерированным и внешним кодом (встроенный кодер) и Доступ к структурированным данным через указатель, определяемый внешним кодом (встроенный кодер).

Чтобы упаковать данные таблицы поиска в структуру, Simulink.LookupTable.

Общие сведения о создании структур в сгенерированном коде см. в разделе Организация данных в структуры в сгенерированном коде.

Дополнительные шаблоны моделирования для создания кода (встроенный кодер)

Тип данных или конструкция CКод примера CЭквивалент SimulinkДополнительные сведения

Макрос

#define myParam 9.8

Применение классов хранения Define и ImportedDefine к параметрам. С помощью макросов можно повторно использовать значение параметра в нескольких расположениях в алгоритме и изменять значение параметра между компиляциями кода без использования памяти для хранения значения. Как правило, макросы представляют инженерные константы, которые не предполагается изменять во время выполнения кода.

Для этого метода требуется встроенный кодер.

Определения макросов (# define) (встроенный кодер)

Квалификаторы типа склада, такие как const и volatile
const myParam = 9.8;

Применение классов хранения Const, Volatile, и ConstVolatile к элементам данных.

Защита глобальных данных с помощью ключевых слов const и volative

Битовое поле

typedef struct myBitField {
    unsigned short int MODE : 1;
    unsigned short int FAIL : 1;
    unsigned short int OK : 1;
} myBitField

  • Применить класс хранения BitField к сигналам, состояниям и параметрам, тип данных которых boolean.

  • Используйте параметр конфигурации модели для агрегирования логических данных в битовые поля.

Эти методы требуют использования встроенного кодера.

Битфилды (встроенный кодер)

Оптимизация сгенерированного кода путем упаковки логических данных в битовые поля (встроенный кодер)

Вызов пользовательской внешней функции, считывающей или записывающей данные

Внешний код:

/* Call this function
to acquire the value of
the signal. */
double get_inSig(void)
{
    return myBigGlobalStruct.inSig;
}

Сгенерированный алгоритмический код:

algorithmInput = get_inSig();

Применить класс хранения GetSet к сигналам, состояниям и параметрам. Каждый элемент данных отображается в сгенерированном коде как вызов пользовательских функций, которые считывают и записывают в целевые данные.

Для этого метода требуется встроенный кодер.

Доступ к данным через функции с помощью класса хранения GetSet (встроенный кодер)

Рекомендации по другим целям моделирования

ЦельСоображения и дополнительная информация
Использование Simulink для запуска и взаимодействия с созданным кодом

Моделирование SIL, PIL и внешнего режима можно использовать для подключения модели к соответствующему сгенерированному приложению для моделирования. При импорте данных параметров из внешнего кода:

  • Во время начала моделирования внешнего режима внешний исполняемый файл использует значение, используемое кодом для инициализации данных параметров. Однако при изменении соответствующего значения в Simulink во время моделирования (например, путем изменения Value свойство соответствующего объекта параметра), Simulink загружает новое значение в исполняемый файл.

  • Моделирование SIL и PIL не импортирует значение параметра из кода. Вместо этого в моделировании используется значение параметра Simulink. Если включить внешний код в процесс построения Simulink Coder™, то созданные описания данных могут помешать компиляции созданного кода.

Для получения информации о SIL и PIL см. Выбор подхода SIL или PIL (встроенный кодер). Сведения о моделировании внешнего режима см. в разделе Моделирование внешнего режима для настройки параметров и мониторинга сигналов.

Создание комментариев к коду, описывающих атрибуты экспортируемых данных, включая физические единицы, реальное начальное значение и тип данных

Создание этих комментариев поможет сопоставить интерфейсы данных с кодом интеграции рукописного ввода. См. раздел Добавление пользовательских комментариев к переменным в созданном коде (Embedded Coder).

Связанные темы