Импортируете ли вы свой внешний код в модель 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. |
Диаграмма 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]; | Задайте сигнал, и размерности параметра как описано в Определяют Размерности Сигнала. Сгенерированный код задает и многомерные данные доступов, включая матрицы, как упорядоченные по столбцам сериализированные векторы. Если ваш внешний код использует другой формат, рассмотрите использование альтернативных методов, чтобы интегрировать сгенерированный код. Смотрите Генерацию кода Матриц и Массивов. |
Для получения информации о том, как сгенерированный код хранит нескалярные данные (включая ограничения), смотрите Генерацию кода Матриц и Массивов. Для примера, который показывает, как экспортировать сгенерированный код в ваш внешний код, смотрите Данные о Параметре Повторного использования из Внешнего Кода в Сгенерированном коде. К интерполяционным таблицам модели смотрите |
Перечисление |
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 Ключевых слов и энергозависимый |
Битовое поле |
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, чтобы запуститься и взаимодействовать со сгенерированным кодом | Можно использовать СИЛА, PIL и симуляции режима external mode, чтобы соединить модель с соответствующим сгенерированным приложением для симуляции. Когда вы импортируете данные о параметре из своего внешнего кода:
Для получения информации о SIL и PIL, смотрите, Выбирают SIL или PIL Approach. Для получения информации о симуляции режима external mode смотрите Симуляции Режима external mode для Настройки Параметра и Контроля сигналов. |
Сгенерируйте комментарии к коду, которые описывают атрибуты экспортированных данных включая физические единицы измерения, реальное начальное значение и тип данных | Генерация этих комментариев может помочь вам совпадать с интерфейсами данных в то время как код интеграции почерка. Смотрите Добавляют Пользовательские Комментарии для Переменных в Сгенерированном коде. |