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

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

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

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

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

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

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

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

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

Прежде чем вы попытаетесь соответствовать интерфейсам данных, чтобы выбрать общий подход к интегрированию, смотрите Выберите внешний код Интегрирования Рабочий процесс.

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

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

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

    Например, если вы используете 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.

Диаграмма Stateflow

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

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

coder.ceval в MATLAB Function блоке

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

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

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

Для экспорта сгенерированного кода во внешний код смотрите Данные обмена между Кодом внешнего вызова и Сгенерированный код.

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

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

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

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

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

typedef float mySinglePrec_T;

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

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

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

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

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

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

Массив

int myArray[6];

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

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

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

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

Для моделирования интерполяционных таблиц смотрите Simulink.LookupTable.

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

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

Задайте перечисление 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 объекты.

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

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

Для примеров, которые показывают, как экспортировать сгенерированный код во внешний код, смотрите Обменные структурированные и перечисленные данные между сгенерированным и внешним кодом (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 и volatile

Битовое поле

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

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

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

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

Для получения информации о SIL и PIL смотрите Выбор SIL или PIL-подхода (Embedded Coder). Для получения информации о симуляции режима external mode смотрите Симуляции Режима external mode для Настройки параметра и Контроля сигналов.

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

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

Похожие темы