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

Методы

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

Системная цель 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 Generation> Interface> Code interface packaging к Reusable function. Если вы задали основанный на ERT системный конечный файл, опционально, можно установить образцовый параметр конфигурации Use dynamic memory allocation for model initialization, в зависимости от того, хотите ли вы статически или динамически выделить память для каждого экземпляра модели.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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