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

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

Функции в коде C or 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).

Похожие темы