Импортируете ли вы свой внешний код в модель 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 при помощи |
Чтобы экспортировать сгенерированный код в ваш внешний код, смотрите, обмениваются Данными Между Внешним Кодом Вызова и Сгенерированным кодом.
Чтобы смоделировать и снова использовать ваши пользовательские данные C, такие как структуры, перечисления и псевдонимы typedef
, используют информацию в этих таблицах.
Моделирование шаблонов для соответствия с данными во внешнем коде С
Тип данных C или построение | Код С в качестве примера | Эквивалентный Simulink | Больше информации |
---|---|---|---|
Псевдоним типа примитива ( |
typedef float mySinglePrec_T; |
Создайте объект
Генерация кода, который использует тип данных псевдонима, требует Embedded Coder®. |
Для получения информации об определении пользовательских типов данных для вашей модели смотрите Для примера, который показывает, как экспортировать сгенерированный код в ваш внешний код, смотрите Замену и Переименуйте Типы данных, чтобы Соответствовать Кодированию Стандартов (Embedded Coder). |
Массив |
int myArray[6]; |
Задайте сигнал и размерности параметра, как описано в Размерностях Сигнала (Simulink). Сгенерированный код задает и многомерные данные доступов, включая матрицы, как главные столбцом сериализированные векторы. Если ваш внешний код использует другой формат, рассмотрите использование альтернативных методов, чтобы интегрировать сгенерированный код. Смотрите Генерацию кода Матриц и Массивов. |
Для получения информации о том, как сгенерированный код хранит нескалярные данные (включая ограничения), смотрите Генерацию кода Матриц и Массивов. Для примера, который показывает, как экспортировать сгенерированный код в ваш внешний код, смотрите Данные о Параметре Повторного использования из Внешнего Кода в Сгенерированном коде (Embedded Coder). К образцовым интерполяционным таблицам смотрите |
Перечисление |
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). Для получения информации о структурах параметров смотрите, Организуют Связанные Определения Параметров блоков в Структурах (Simulink). Для примера, который показывает, как импортировать ваш внешний код в модель при помощи Legacy Code Tool, смотрите, Интегрируют Функцию C, Аргументы Которой Являются Указателями на Структуры (Simulink). Для примеров, которые показывают, как экспортировать сгенерированный код в ваш внешний код, смотрите, обмениваются Структурированными и Перечислимыми Данными Между Сгенерированным и Внешним Кодом (Embedded Coder) и доступом к Структурированным данным Через Указатель, Который Внешний Код Задает (Embedded Coder). К данным об интерполяционной таблице пакета в структуру, Для получения общей информации о создании структур в сгенерированном коде, смотрите, Организуют Данные в Структуры в Сгенерированном коде. |
Дополнительные шаблоны моделирования для генерации кода (Embedded Coder)
Тип данных C или построение | Код С в качестве примера | Эквивалентный Simulink | Больше информации |
---|---|---|---|
Макрос |
#define myParam 9.8 |
Примените пользовательские классы памяти Этот метод требует Embedded Coder. |
Макроопределения (#define) (Embedded Coder) |
Спецификаторы типа хранения, такие как const и volatile |
const myParam = 9.8; |
Примените пользовательские классы памяти | Защитите Глобальные данные с const Ключевых слов и энергозависимый |
Битовое поле |
typedef struct myBitField { unsigned short int MODE : 1; unsigned short int FAIL : 1; unsigned short int OK : 1; } myBitField |
Эти методы требуют 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(); |
Примените пользовательский класс памяти Этот метод требует Embedded Coder. |
Доступ к данным через функции с пользовательским классом памяти GetSet (Embedded Coder) |
Цель | Факторы и больше информации |
---|---|
Используйте Simulink, чтобы запуститься и взаимодействовать со сгенерированным кодом | Можно использовать СИЛА, PIL и симуляции режима external mode, чтобы соединить модель с соответствующим сгенерированным приложением для симуляции. Когда вы импортируете данные о параметре из своего внешнего кода:
Для получения информации о SIL и PIL, смотрите, Выбирают SIL или PIL Approach (Embedded Coder). Для получения информации о симуляции режима external mode смотрите Целевую Хостом Связь с Симуляцией Режима external mode. |
Сгенерируйте комментарии к коду, которые описывают атрибуты экспортированных данных включая физические единицы измерения, реальное начальное значение и тип данных |
Генерация этих комментариев может помочь вам совпадать с интерфейсами данных в то время как код интеграции почерка. Смотрите Добавляют Пользовательские Комментарии для Переменных в Сгенерированном коде (Embedded Coder). |