Импортируете ли вы свой внешний код в 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 блоке при помощи |
Для экспорта сгенерированного кода во внешний код смотрите Данные обмена между Кодом внешнего вызова и Сгенерированный код.
Чтобы смоделировать и повторно использовать пользовательские данные C, такие как структуры, перечисления и typedef
псевдонимы, используйте информацию в этих таблицах.
Шаблоны моделирования для соответствия данных во внешнем коде С
Тип данных C или конструкция | Пример кода С | Эквивалентный Simulink | Дополнительная информация |
---|---|---|---|
Примитивный псевдоним типа ( |
typedef float mySinglePrec_T; |
Создайте
Для генерации кода, который использует тип данных псевдонима, требуется Embedded Coder®. |
Для получения информации об определении пользовательских типов данных для модели смотрите Для примера, который показывает, как экспортировать сгенерированный код во внешний код, смотрите Заменить и Переименовать Типы данных для соответствия стандартам кодирования. |
Массив |
int myArray[6]; | Задайте размерности сигнала и параметра, как описано в Determine Signal Dimensions. Сгенерированный код задает и обращается к многомерным данным, включая матрицы, как основной столбец сериализованных векторов. Если ваш внешний код использует другой формат, рассмотрите использование альтернативных методов для интеграции сгенерированного кода. Смотрите Генерацию кода матриц и массивов. |
Для получения информации о том, как сгенерированный код хранит нескалярные данные (включая ограничения), смотрите Генерацию кода матриц и массивов. Для примера, который показывает, как экспортировать сгенерированный код во внешний код, смотрите Повторно используйте данные параметра из внешнего кода в Сгенерированном коде. Для моделирования интерполяционных таблиц смотрите |
Перечисление |
typedef enum myColorsType { Red = 0, Yellow, Blue } myColorsType; |
Задайте перечисление Simulink, которое соответствует вашему определению перечисления. Используйте перечисление Simulink, чтобы задать типы данных в модели. |
Чтобы использовать перечисленные данные в модели Simulink, смотрите Использование перечисленных данных в моделях Simulink. Для примера, который показывает, как сгенерировать перечисленные данные параметра, см. Перечисление. Для примера, в котором показано, как экспортировать сгенерированный код во внешний код путем обмена перечисленными данными, смотрите Структурированные и Перечисленные данные обмена Между сгенерированным и Внешним кодом. |
Структура |
typedef struct myStructType { int count; double coeff; } myStructType; |
Создайте Чтобы создать структурированный сигнал или данные о состоянии, упакуйте несколько сигнальных линий в модели в один невиртуальный сигнал шины. Чтобы создать структурированные данные параметра, создайте объект параметра (такой как Чтобы упаковать данные интерполяционной таблицы в структуру, используйте | Для получения информации о сигналах шины см. «Групповые сигнальные линии в виртуальные шины». Для получения информации о структурах параметров смотрите «Организация определений параметров связанных блоков в структурах». Для примера, который показывает, как импортировать ваш внешний код в модель с помощью Legacy Code Tool, смотрите Интегрировать функцию C, аргументы которой являются указателями на структуры. Для примеров, которые показывают, как экспортировать сгенерированный код во внешний код, смотрите Обменные структурированные и перечисленные данные между сгенерированным и внешним кодом и Доступ к структурированным данным через указатель, который задает внешний код. Чтобы упаковать данные интерполяционной таблицы в структуру, Общие сведения о создании структур в сгенерированном коде см. в разделе Организация данных в структуры в сгенерированном коде. |
Дополнительные шаблоны моделирования для генерации кода (Embedded Coder)
Тип данных C или конструкция | Пример кода С | Эквивалентный Simulink | Дополнительная информация |
---|---|---|---|
Макрос |
#define myParam 9.8 | Применить классы памяти Этот метод требует Embedded Coder. | |
Типы хранилища, такие как const и volatile |
const myParam = 9.8; | Применить классы памяти | Защитите глобальные данные с помощью ключевых слов const и volatile |
Битовое поле |
typedef struct myBitField { unsigned short int MODE : 1; unsigned short int FAIL : 1; unsigned short int OK : 1; } myBitField |
Эти методы требуют Embedded Coder. |
Оптимизируйте сгенерированный код путем упаковки булевых данных в битовые поля |
Вызов пользовательской внешней функции, которая читает или записывает данные |
Внешний код:
/* Call this function to acquire the value of the signal. */ double get_inSig(void) { return myBigGlobalStruct.inSig; } Сгенерированный алгоритмический код:
algorithmInput = get_inSig(); | Применить класс памяти Этот метод требует Embedded Coder. |
Цель | Факторы и дополнительная информация |
---|---|
Используйте Simulink, чтобы запустить и взаимодействовать с сгенерированным кодом | Можно использовать SIL, PIL и симуляции режима external mode, чтобы подключить модель к соответствующему сгенерированному приложению для симуляции. При импорте данных о параметрах из внешнего кода:
Для получения информации о SIL и PIL смотрите Выбор подхода SIL или PIL. Для получения информации о симуляции режима external mode смотрите Симуляции Режима external mode для Настройки параметра и Контроля сигналов. |
Сгенерируйте комментарии кода, которые описывают атрибуты экспортированных данных, включая физические единицы измерения, реальное начальное значение и тип данных | Генерация этих комментариев может помочь вам сопоставить интерфейсы данных во время интеграционного кода рукописного ввода. Смотрите Добавление пользовательских комментариев для переменных в сгенерированном коде. |