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