Объедините код, сгенерированный для многоуровневых моделей

Методы

Методы, которые можно использовать, чтобы объединить код, который генератор кода производит для многоуровневых моделей или нескольких экземпляров модели, в одну исполняемую программу включают:

Системная цель S-функции (rtwsfcn.tlc) не поддерживает объединяющийся код, сгенерированный для многоуровневых моделей.

Рассмотрите использование ссылки модели, чтобы объединить модели для симуляции и генерации кода. Ссылка модели помогает с:

  • Непротиворечивость именования символа

  • Необходимое планирование полного алгоритма

  • Непротиворечивость настройки модели

Если вы комбинируете код, сгенерированный для различных моделей (то есть, не используя модели, на которые ссылаются), рассматриваете:

  • Данные являются глобальной переменной. Символ (имя) столкновения может закончиться.

  • Настройки параметра конфигурации для моделей должны соответствовать, включая настройки, такие как аппаратные размеры слова.

  • Повторное использование и совместное использование кода могут быть субоптимальными (например, дублирующий код для разделяемых служебных функций, планирования и решателей).

  • Планирование может быть более комплексным (например, модели могут иметь периодические шаги расчета, которые не являются множителями друг друга, делая планирующий от общего прерывания по таймеру более сложный),

  • Для моделей объекта управления, которые используют непрерывное время и состояние, непрерывные соединительные модели сигналов времени не обработаны одним решателем как непрерывные сигналы времени в модели. Это может привести к тонким числовым различиям.

Управляйте владением данных

Если у вас есть программное обеспечение Embedded Coder, можно задать owner для отдельных элементов данных, таких как сигналы, параметры и состояния. Владелец элемента данных генерирует определение (выделение памяти и инициализация) для элемента данных. Например, если вы применяете пользовательский класс памяти к Simulink.Signal возразите так, чтобы это появилось как глобальная переменная в сгенерированном коде, задайте одну из объединенных моделей как владелец объекта. Код, сгенерированный для той модели, задает переменную.

Если вы используете ссылку модели, можно построить сгенерированный код из модулей и установить ясное владение данных, когда вы работаете в команде.

Если вы не используете ссылку модели, можно предотвратить генерацию дублирующихся определений для элемента данных. Например, предположите, что вы храните Simulink.Parameter объект в базовом рабочем пространстве и применяет класс памяти ExportedGlobal. Если вы генерируете код из двух отдельных моделей, которые используют объект, каждая модель генерирует определение для соответствующей глобальной переменной. Вместо этого можно задать владельца для объекта так, чтобы только владелец сгенерировал определение.

Задавать владельца для элемента данных:

  1. Примените пользовательский класс памяти к элементу данных. Смотрите Применяют Встроенные и Индивидуально настраиваемые Классы памяти к Элементам данных.

  2. Сконфигурируйте владельца элемента данных путем определения значения для свойства Owner.

  3. Выберите параметр конфигурации модели Use owner from data object for data definition placement.

Для получения дополнительной информации об управлении владением и размещением файла определений данных и объявлений, смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах.

Объедините код, сгенерированный для многоуровневых моделей или нескольких экземпляров модели

Для каждой модели, для которой вы комбинируете код, сгенерируйте код.

  1. Установите системный конечный файл на GRT - или основанный на ERT системный конечный файл. Системный конечный файл для моделей, которые вы комбинируете, должно быть то же самое.

  2. Если вы намереваетесь иметь несколько экземпляров той модели в приложении, установите параметр конфигурации модели Code interface packaging на Reusable function. Если вы задали основанный на ERT системный конечный файл, опционально, можно установить параметр конфигурации модели Use dynamic memory allocation for model initialization, в зависимости от того, хотите ли вы статически или динамически выделить память для каждого экземпляра модели.

  3. Сгенерируйте исходный код. Генератор кода включает функцию выделения в сгенерированный файл modelC. Функция выделения динамически выделяет данные модели для каждого экземпляра модели.

После генерации исходного кода для каждой модели:

  1. Скомпилируйте код для каждой модели, которую вы комбинируете.

  2. Объедините make-файлы, сгенерированные для моделей в один make-файл.

  3. Создайте объединенный механизм симуляции путем изменения основной программы, такой как rt_malloc_main.c. Основная программа инициализирует и вызывает код, сгенерированный для каждой модели.

  4. Запустите make-файл. Make-файл соединяет объектные файлы и основную программу в исполняемую программу.

Осуществляйте обмен данными через модели

Используйте однонаправленные связи сигнала между моделями. Это влияет на порядок, в котором называются модели. Например, если вы используете выходной сигнал modelA как введено к modelB, modelA выходной расчет должен быть назван сначала.

Синхронизация проблем

При объединении кода, сгенерированного для многоуровневых моделей или нескольких экземпляров модели:

  • Сконфигурируйте модели с тем же режимом решателя (однозадачность или многозадачность).

  • Если модели используют непрерывные состояния, конфигурируют модели с тем же решателем.

Если базовые ставки для моделей отличаются, основная программа (такая как rt_malloc_main.c) должен настроить прерывание по таймеру, чтобы произойти на уровне наибольшего общего делителя моделей. Основная программа вызывает каждую модель во временном интервале.

Регистрация данных и поддержка режима external mode

Программа многоуровневой модели может данные логов, чтобы разделить MAT-файлы для каждой модели.

Только одна из моделей в программе многоуровневой модели может использовать режим external mode.