Чтобы объединить код, который генератор кода производит для многоуровневых моделей или нескольких экземпляров модели в одну исполняемую программу, используют эти методы:
Иерархия модели - ссылки. Смотрите Основы Модели - ссылки и Сгенерируйте Код для Иерархии Модели - ссылки.
Если вы имеете программное обеспечение Embedded Coder®, соединяете интерфейсом с кодом для многоуровневых моделей к общей программе обвязки. Из программы обвязки вызовите функции точки входа, сгенерированные для каждой модели. ert.tlc
системный конечный файл имеет ограничения, связанные со встроенной обработкой, которая может быть несовместимой с вашим приложением.
Сгенерируйте допускающий повторное использование, код мультиэкземпляра, который повторно используем. См. Код Объединения, Сгенерированный для Многоуровневых моделей или Нескольких Экземпляров Модели.
Примечание
Системная цель S-функции (rtwsfcn.tlc
) не поддерживает объединяющийся код, сгенерированный для многоуровневых моделей.
Чтобы объединить модели для симуляции и генерации кода, рассмотрите использование ссылки модели. Ссылка модели помогает с:
Непротиворечивость именования символа
Необходимое планирование полного алгоритма
Непротиворечивость настройки модели
Если вы комбинируете код, сгенерированный для различных моделей то есть, не используя модели, на которые ссылаются, рассматриваете следующее:
Данные являются глобальной переменной. Символ (имя) столкновения может закончиться.
Настройки параметра конфигурации для моделей должны соответствовать, включая настройки, такие как аппаратные размеры слова.
Повторное использование и совместное использование кода могут быть субоптимальными (например, дублирующий код для разделяемых служебных функций, планирования и решателей).
Планирование может быть более комплексным (например, модели могут иметь периодические шаги расчета, которые не являются множителями друг друга, делая планирующий от общего прерывания по таймеру более сложный),
Для моделей объекта управления, которые используют непрерывное время и состояние, непрерывные соединительные модели сигналов времени не обработаны одним решателем как непрерывные сигналы времени в модели, которая может привести к тонким, числовым различиям.
Используйте однонаправленные связи сигнала между моделями. Эти связи влияют на порядок, в котором называются модели. Например, если вы используете выходной сигнал modelA
как введено к modelB
, modelA
выходной расчет называется сначала.
При объединении кода, сгенерированного для многоуровневых моделей или нескольких экземпляров модели:
Сконфигурируйте модели при помощи того же режима решателя (однозадачность или многозадачность).
Если модели используют непрерывные состояния, конфигурируют модели при помощи того же решателя.
Если базовые ставки для моделей отличаются, основная программа (такая как rt_malloc_main.c
) должен настроить прерывание по таймеру, чтобы произойти на уровне наибольшего общего делителя моделей. Основная программа вызывает каждую модель во временном интервале.
Программа многоуровневой модели может данные логов, чтобы разделить MAT-файлы для каждой модели.
Только одна из моделей в программе многоуровневой модели может использовать режим external mode.
Если у вас есть программное обеспечение Embedded Coder, можно задать владельца для отдельных элементов данных, таких как сигналы, параметры и состояния. Владелец элемента данных генерирует определение, выделение памяти и инициализацию, для элемента данных. Например, если вы применяете класс памяти к Simulink.Signal
возразите так, чтобы это появилось как глобальная переменная в сгенерированном коде, задайте одну из объединенных моделей как владелец объекта. Код, сгенерированный для той модели, задает переменную.
Если вы используете ссылку модели, можно построить сгенерированный код из модулей и установить ясное владение данных, когда вы работаете в команде.
Если вы не используете ссылку модели, можно предотвратить генерацию дублирующихся определений для элемента данных. Например, предположите, что вы храните Simulink.Parameter
объект в базовом рабочем пространстве и применяет класс памяти ExportedGlobal
. Если вы генерируете код из двух отдельных моделей, которые используют объект, каждая модель генерирует определение для соответствующей глобальной переменной. Вместо этого можно задать владельца для объекта так, чтобы только владелец сгенерировал определение.
Задавать владельца для элемента данных:
Примените класс памяти к элементу данных. Смотрите Организуют Данные о Параметре в Структуру при помощи Класса памяти Struct (Embedded Coder).
Сконфигурируйте владельца элемента данных путем определения значения для свойства Owner.
Выберите параметр конфигурации модели Use owner from data object for data definition placement.
Для получения дополнительной информации об управлении владением и размещением файла определений данных и объявлений, смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах (Embedded Coder).
Для каждой модели, для которой вы комбинируете код, сгенерируйте код.
Установите системный конечный файл на GRT - или основанный на ERT системный конечный файл. Системный конечный файл для моделей, которые вы комбинируете, должен быть тем же самым.
Если вы намереваетесь иметь несколько экземпляров той модели в приложении, установите параметр конфигурации модели Code interface packaging на Reusable function
. Если вы задали основанный на ERT системный конечный файл, опционально, можно установить параметр конфигурации модели Use dynamic memory allocation for model initialization, в зависимости от того, хотите ли вы статически или динамически выделить память для каждого экземпляра модели.
Сгенерируйте исходный код. Генератор кода включает функцию выделения в сгенерированный файл
. Функция выделения динамически выделяет данные модели для каждого экземпляра модели.model
C
После генерации исходного кода для каждой модели:
Скомпилируйте код для каждой модели, которую вы комбинируете.
Объедините make-файлы, сгенерированные для моделей в один make-файл.
Создайте объединенный механизм симуляции путем изменения основной программы, такой как rt_malloc_main.c
. Основная программа инициализирует и вызывает код, сгенерированный для каждой модели.
Запустите make-файл. Make-файл соединяет объектные файлы и основную программу к исполняемой программе.