Обменивайтесь Данными Между Внешним Кодом C/C++ и Типовым кодексом Simulink или Сгенерированным кодом

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

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

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

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

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

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

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

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

Прежде чем вы попытаетесь совпадать с интерфейсами данных, выбрать полный подход интегрирования, смотрите, Выбирают External Code Integration Workflow.

Импортируйте внешний код в модель

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

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

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

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

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

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

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

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

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

Диаграмма Stateflow

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

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

coder.ceval в блоке MATLAB function

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

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

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

Чтобы экспортировать сгенерированный код в ваш внешний код, смотрите, обмениваются Данными Между Внешним Кодом Вызова и Сгенерированным кодом.

Представления Simulink типов данных C и построений

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

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

Тип данных C или построениеКод С в качестве примераЭквивалентный SimulinkБольше информации

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

typedef float mySinglePrec_T;

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

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

  • Сконфигурируйте замены типа данных для генерации кода.

Генерация кода, который использует тип данных псевдонима, требует Embedded Coder®.

Для получения информации об определении пользовательских типов данных для вашей модели смотрите Simulink.AliasType и Имена типов данных Управления в Сгенерированном коде (Embedded Coder).

Для примера, который показывает, как экспортировать сгенерированный код в ваш внешний код, смотрите Замену и Переименуйте Типы данных, чтобы Соответствовать Кодированию Стандартов (Embedded Coder).

Массив

int myArray[6];

Задайте сигнал и размерности параметра, как описано в Размерностях Сигнала (Simulink).

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

Для получения информации о том, как сгенерированный код хранит нескалярные данные (включая ограничения), смотрите Генерацию кода Матриц и Массивов.

Для примера, который показывает, как экспортировать сгенерированный код в ваш внешний код, смотрите Данные о Параметре Повторного использования из Внешнего Кода в Сгенерированном коде (Embedded Coder).

К образцовым интерполяционным таблицам смотрите Simulink.LookupTable.

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

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

Задайте перечисление Simulink, которое соответствует вашему определению перечисления. Используйте перечисление Simulink, чтобы установить типы данных в модели.

Чтобы использовать перечисленные данные в модели Simulink, смотрите Использование Перечислимые Данные в Моделях Simulink (Simulink).

Для примера, который показывает, как сгенерировать перечислимые данные о параметре, смотрите Перечисление (Embedded Coder).

Для примера, который показывает, как экспортировать сгенерированный код в ваш внешний код путем обмена перечисленными данными, смотрите, обмениваются Структурированными и Перечислимыми Данными Между Сгенерированным и Внешним Кодом (Embedded Coder).

Структура

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

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

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

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

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

Для получения информации о сигналах шины смотрите Начало работы с Шинами (Simulink). Для получения информации о структурах параметров смотрите, Организуют Связанные Определения Параметров блоков в Структурах (Simulink).

Для примера, который показывает, как импортировать ваш внешний код в модель при помощи Legacy Code Tool, смотрите, Интегрируют Функцию C, Аргументы Которой Являются Указателями на Структуры (Simulink).

Для примеров, которые показывают, как экспортировать сгенерированный код в ваш внешний код, смотрите, обмениваются Структурированными и Перечислимыми Данными Между Сгенерированным и Внешним Кодом (Embedded Coder) и доступом к Структурированным данным Через Указатель, Который Внешний Код Задает (Embedded Coder).

К данным об интерполяционной таблице пакета в структуру, Simulink.LookupTable.

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

Дополнительные шаблоны моделирования для генерации кода (Embedded Coder)

Тип данных C или построениеКод С в качестве примераЭквивалентный SimulinkБольше информации

Макрос

#define myParam 9.8

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

Этот метод требует Embedded Coder.

Макроопределения (#define) (Embedded Coder)

Спецификаторы типа хранения, такие как const и volatile
const myParam = 9.8;

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

Защитите Глобальные данные с const Ключевых слов и энергозависимый

Битовое поле

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

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

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

Эти методы требуют Embedded Coder.

Битовые поля (Embedded Coder)

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

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

Внешний код:

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

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

algorithmInput = get_inSig();

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

Этот метод требует Embedded Coder.

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

Факторы для других целей моделирования

ЦельФакторы и больше информации
Используйте Simulink, чтобы запуститься и взаимодействовать со сгенерированным кодом

Можно использовать СИЛА, PIL и симуляции режима external mode, чтобы соединить модель с соответствующим сгенерированным приложением для симуляции. Когда вы импортируете данные о параметре из своего внешнего кода:

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

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

Для получения информации о SIL и PIL, смотрите, Выбирают SIL или PIL Approach (Embedded Coder). Для получения информации о симуляции режима external mode смотрите Целевую Хостом Связь с Симуляцией Режима external mode.

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

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

Похожие темы