Сгенерируйте исходный код компонента для экспорта во внешнюю основу кода

Если у вас есть Embedded Coder® программное обеспечение, можно сгенерировать исходный код функции из компонентов моделирования для использования во внешней основе кода. Сгенерированный код не включает в себя поддерживающий код планирования (для примера, функцию шага). Управление логикой вне Simulink® окружение вызывает сгенерированный код функции.

Опции моделирования

Можно сгенерировать код функции для экспорта этих компонентов моделирования:

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

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

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

Для моделей, разработанных в более ранних релизах, генератор кода может экспортировать функции из триггируемых подсистем. Требования, установленные для подсистем экспортной функции, также применяются к экспорту функций из триггируемых подсистем, за следующими исключениями:

  • Инкапсулируйте триггируемые подсистемы, из которых вы собираетесь экспортировать функции в виртуальную подсистему верхнего уровня.

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

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

Требования

  • Решатель модели должен быть дискретным решателем с фиксированным шагом.

  • Необходимо сконфигурировать каждый блок Inport корневого уровня, который запускает подсистему вызова функций, чтобы вывести триггер вызова функции. Эти блоки Inport не могут соединиться с блоком Asynchronous Task Specification.

  • Модель или подсистема, должны содержать только следующие блоки на корневом уровне:

    • Блоки Function-Call (такие как Подсистемы вызова функций, Simulink Function, S-Functions и Function-Call Model, блокируются на корневом уровне, если для параметра конфигурации модели решателя Tasking and sample time options > Periodic sample time constraint задано значение Ensure sample time independent)

    • Блоки Inport и Outport (порты)

    • Постоянные блоки (включая блоки, которые разрешаются до констант, такие как Add)

    • Блоки со шаг расчета Inf

    • Слияние и хранение данных блоков памяти

    • Блоки виртуальных соединений (такие как, Function-Call Split, Mux, Demux, Bus Creator, Bus Selector, Signal Specification и виртуальные подсистемы, которые содержат эти блоки)

    • Блоки Signal-Viewer, такие как блоки Scope (только подсистемы экспорт функций)

  • Когда на верхнем уровне модели или подсистемы появляется блок константы, необходимо задать параметр конфигурации модели Optimization > Default parameter behavior для модели или содержащей модель равным Inlined.

  • Блоки внутри модели или подсистемы должны поддерживать генерацию кода.

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

  • Сигналы данных, которые пересекают контур экспортируемой системы, не могут быть виртуальной шиной и не могут быть реализованы как соединение Goto-From. Сигналы данных, которые пересекают контур экспорта, должны быть скалярными, мультиплексированными или невиртуальной шиной.

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

Для подсистем экспорта функций применяются следующие дополнительные требования:

  • Триггерный сигнал, который пересекает контур подсистемы экспорта функций, должен быть скалярным. Входные и выходные данные сигналы, которые не действуют как триггеры, не должны быть скаляром.

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

Экспорты функций, которые используют абсолютное или истекшее время

Если вы хотите экспорта функций код для компонента моделирования с блоками, которые используют абсолютное или истекшее время, эти блоки должны быть внутри подсистемы вызова функций, которая:

  • Вы конфигурируете для периодического выполнения

  • Вы конфигурируете блок Inport корневого уровня с дискретным шагом расчета

Чтобы сконфигурировать подсистему вызова функций для периодического выполнения:

  1. В подсистеме вызова функций щелкните правой кнопкой мыши блок Trigger и выберите Block Parameters из контекстного меню.

  2. Установите Sample time type параметра равным periodic.

  3. Установите Sample time на ту же гранулярность, заданную (непосредственно или по наследованию) в инициаторе вызова функции.

  4. Щелкните OK или Apply.

Для получения дополнительной информации см. «Абсолютные» и «Истекшие временные расчеты».

Ограничения для подсистем экспорт функций

  • Параметры блока Subsystem не управляют именами файлов, содержащих сгенерированный код. Имена файлов начинаются с имени экспортированной подсистемы.

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

  • Экспортировать системы вызова функции для упаковки интерфейса кода класса C++ можно только в том случае, если для спецификации функции задано Default step method. См. раздел Интерактивная настройка интерфейса C++. Экспортированная функция совместима с однопоточным выполнением. Чтобы избежать потенциальных условий гонки данных для общих сигналов, активируйте все представители для класса из одного и того же потока выполнения.

  • Генератор кода поддерживает блок SIL или PIL в режиме Accelerator, только если его инициатор вызова функции не включен в режим Accelerator. Примеры неинлинфицированных инициаторов включают Stateflow® чарты.

  • Блок Level-2 инициатора S-функции, такой как диаграмма Stateflow или встроенный блок Function-Call Generator, должен управлять блоком SIL.

  • Можно экспортировать асинхронную систему вызова функции (sample-time), но программное обеспечение не поддерживает блок SIL или PIL для асинхронной системы.

  • Использование функции TLC LibIsFirstInit был удален для подсистем экспорт функций.

Рабочий процесс

Чтобы сгенерировать код для экспортированной функции, выполните итерацию с помощью задач, перечисленных в этой таблице.

ЗадачаДействиеДополнительная информация
1Проверьте оценку характеристик внешнего кода и требований к интегрированию.Выберите рабочий процесс интегрирования внешнего кода
2Проверьте, что модель или подсистема, которую вы экспортируете, удовлетворяет требованиям экспорта функций.Требования
3Устраните требования к интерфейсам данных путем изменения модели или подсистемы. Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом
4При необходимости сконфигурируйте прототип функции.Сконфигурируйте функциональные интерфейсы точки входа для блоков Simulink Function и Function Caller и, для моделей, основанных на фиксированной скорости, сконфигурируйте генерацию кода C для функций Model Entry-Point или интерактивно сконфигурируйте интерфейс C++
5При необходимости обновите модель, чтобы поместить код конкретного внешнего приложения в сгенерированные системные функции. Поместите внешний код C/C + + в сгенерированный код
6Проверьте, что функции ведут себя и выполняются должным образом во время симуляции, создав и используя тестовую обвязку модель. Тестовая обвязка планирует выполнение функций во время симуляции.Сконфигурируйте модель, сгенерируйте код и симулируйте, и, если у вас есть программное обеспечение Simulink Test™, создайте тест (тест Simulink)
7Сконфигурируйте модель или подсистему для генерации кода.Сгенерируйте код с помощью Embedded Coder ®, Сгенерируйте код, который соответствует внешнему виду внешнего кода и строению модели
8Сгенерируйте код и отчет генерации кода.Генерация кода
9Проверьте сгенерированный интерфейс кода и статические метрики кода.Анализируйте сгенерированный интерфейс кода и статические метрики кода
10Создайте исполняемую программу, которая включает в себя код экспортированной функции.Создайте интегрированный код вне окружения Simulink
11Проверьте, что исполняемая программа ведет себя и работает должным образом. 

Выбор Интегрирования подхода

Для генерации кода функции для экспорта во внешнюю среду разработки доступно несколько подходов. В следующей таблице сравниваются подходы. Выберите подход, который наилучшим образом соответствует вашим требованиям к интегрированию. Для получения дополнительной информации о том, как создать модели экспорта функций, смотрите Обзор моделей экспорта функций. Для получения дополнительной информации о генерации кода для подсистем вызова функции, смотрите Сгенерировать исходный код компонента для экспорта во внешнюю основу кода.

Условие или требованиеИспользоватьДополнительная информация
  • Трассируемость между элементами моделирования и сгенерированным кодом

  • Локальные входы (блок Inport) и выходы (блок Outport)

Подсистема вызова функций
  • Управление сгенерированным прототипом функции

  • Формальные входные параметры (блоки Argument Inport) и выходные аргументы (блоки Argument Outport)

  • Локальные входы (блок Inport) и выходы (блок Outport)

Функциональный блок Simulink
Код реагирует на событие инициализацииИнициализируйте блок Function
Код реагирует на событие сбросаСброс Функционального блока
Код включает функции точки входа, выходящие за рамки того, что производит генератор кода по умолчанию (model_initialize, model_step, и model_terminate)S-функцияS-функции и генерация кода
Среда выполнения с одной моделью для использования в качестве тестовой обвязки и для экспорта кода, сгенерированного для фрагментов моделиПодсистема экспорт функций

Сгенерируйте код функции C для модели экспорта функций

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

Чтобы сгенерировать код функции для экспорта:

  1. Создайте модель, которая содержит функции для экспорта.

  2. Создайте модель тестовой обвязки, которая планирует выполнение функций во время симуляции.

  3. Симулируйте модель, которая содержит функции, используя модель тестовой обвязки.

  4. Сгенерируйте код для модели, которая содержит функции.

Создайте модель, которая содержит функции для экспорта

Модель с функциями для экспорта должна удовлетворять архитектурным ограничениям на уровне корня модели. На корневом уровне допустимыми блоками являются:

  • Inport

  • Вспомогательный порт

  • Подсистема вызова функций

  • Функция Simulink

  • Goto

  • От

  • Слияние

Генератор кода производит код функции для блоков Подсистема Вызова Функций, Simulink Function, Initialize Function и Reset Function. Для блока Подсистема Вызова Функций вы соединяете входные порты блоков с корневыми блоками Inport, которые утверждают сигналы function-call. Подсистема выполняется на основе сигнала вызова функции, который она получает. Блок Simulink Function выполняется в ответ на выполнение соответствующего блока Function Caller или диаграммы Stateflow. Блок Initialize Function выполняется с событием инициализации модели, и блок Reset Function выполняется с пользовательским событием сброса.

Для экспорта функций моделируйте rtwdemo_functions содержит две подсистемы вызова функций (f1_alg и f2_alg) и блок Simulink Function (f3) для экспорта функций. Модель также содержит блок Initialize Function (Initialize Function) и блок Reset Function (Reset Function). Чтобы вычислить начальные условия для блоков с состоянием в других частях модели, блоки Средство Записи используются внутри блоков Initialize Function и Reset Function.

open_system('rtwdemo_functions')

Создайте модель, которая содержит блок Function Caller

Используйте блок Function Caller, чтобы вызвать блок Simulink Function. Блок Function Caller может быть в той же модели или в другой модели, как блок Simulink Function.

Несколько блоков Function Caller могут вызвать блок Simulink Function. Можно поместить блок Function Caller в подсистему вызова функций. Во время генерации кода генератор кода экспортирует функцию из подсистемы вызова функций.

Модель rtwdemo_caller экспортирует подсистему вызова функций, содержащую блок Function Caller.

open_system('rtwdemo_caller')

Создайте Тестовую обвязку модель для симуляции

При экспортах функций сгенерированный код не включает планировщик. Создайте модель тестовой обвязки для обработки планирования во время симуляции. Не используйте модель тестовой обвязки, чтобы сгенерировать код, который вы развертываете.

Модель rtwdemo_export_functions является тестовая обвязка. Модель:

  • Планирует блок Simulink Function с блоком Function Caller в rtwdemo_caller.

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

open_system('rtwdemo_export_functions')

Симулируйте модель Тестовой обвязки

Проверьте, что модель, содержащая функции, которые вы хотите экспортировать, выполняется так, как вы ожидаете, моделируя модель тестовой обвязки. Для примера моделируйте rtwdemo_export_functions.

sim('rtwdemo_export_functions')

Сгенерируйте код функции

Откройте приложение Embedded Coder. Затем сгенерируйте код для функций, которые вы хотите экспортировать. Для примера сгенерируйте код для rtwdemo_functions.

slbuild('rtwdemo_functions')
### Starting build procedure for: rtwdemo_functions
### Successful completion of code generation for: rtwdemo_functions

Build Summary

Top model targets built:

Model              Action          Rebuild Reason                                    
=====================================================================================
rtwdemo_functions  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 10.463s

Просмотр сгенерированного кода

Проверьте сгенерированный код.

  • ert_main.c является примером основной программы (среды выполнения) для модели. Этот код показывает, как вызвать экспортированные функции. Код также показывает, как инициализировать и выполнить сгенерированный код.

  • rtwdemo_functions.c вызывает функцию инициализации, включая Initialize Function, и экспортированные функции для компонентов модели f1_alg, f2_alg, и f3.

  • rtwdemo_functions.h объявляет данные модели структуры и открытый интерфейс экспортированным функциям точки входа и структурам данных.

  • f3.h является общим файлом, который объявляет интерфейс вызова для функции Simulink f3.

  • rtwtypes.h определяет типы данных, структуры и макросы, которые требуются сгенерированному коду.

Запись кода интерфейса

Откройте и проверьте отчет по интерфейсам кода. Чтобы написать код интерфейса для среды выполнения, используйте информацию в этом отчете.

  1. Включите сгенерированные заголовочные файлы путем добавления директивы #include rtwdemo_functions.h, #include f3.h, и #include rtwtypes.h.

  2. Запишите входные данные в сгенерированный код для блоков Inport модели.

  3. Вызовите сгенерированные функции точки входа.

  4. Считайте данные из сгенерированного кода для блоков Outport модели.

Входные порты:

  • rtU.U1 типа real_T с размерностью 1

  • rtU.U2 типа real_T с размерностью 1

Функции точки входа:

  • Инициализируйте функцию точки входа, void rtwdemo_functions_initialize(void). При запуске вызовите эту функцию один раз.

  • Сбросьте функцию точки входа, void rtwdemo_functions_reset(void). При необходимости вызовите эту функцию.

  • Экспортированная функция, void f1(void). При необходимости вызовите эту функцию.

  • Экспортированная функция, void f2(void). При необходимости вызовите эту функцию.

  • Функция Simulink, void f3(real_T rtu_u, real_T *rty_y). При необходимости вызовите эту функцию.

Выходные порты:

  • rtY.Accumulator1 типа int8_T с размерностью [2]

  • rtY.Accumulator2 типа int8_T с размерностью [2]

  • rtY.TicToc10 типа int8_T с размерностью 1

Подробнее о

Закройте модели примера

bdclose('rtwdemo_export_functions')
bdclose('rtwdemo_functions')
bdclose('rtwdemo_caller')

Сгенерируйте функцию C++ и код класса для модели экспорта функций

Этот пример показывает, как сгенерировать код функции для модели экспорта функций, которая включает подсистему вызова функций. Генератор кода производит функцию и код класса, который не включает в себя код планирования.

Чтобы сгенерировать код функции для экспорта:

  1. Создайте модель, которая содержит функции для экспорта.

  2. Создайте модель тестовой обвязки, которая планирует выполнение функций во время симуляции.

  3. Симулируйте модель, которая содержит функции, используя модель тестовой обвязки.

  4. Сгенерируйте код для модели, которая содержит функции.

Создайте модель, которая содержит функции и интерфейс класса C++ для экспорта

Модель с функциями для экспорта с интерфейсом класса модели C++ должна удовлетворять архитектурным ограничениям на уровне корня модели. Для генерации классов C++ блоки, которые действительны на корневом уровне, являются:

  • Inport

  • Вспомогательный порт

  • Подсистема вызова функций

  • Goto

  • От

  • Слияние

Примечание: Экспорт Подсистема Вызова Функций с интерфейсом класса C++ не поддерживает блоки Simulink Function.

Генератор кода производит код функции для блока Подсистема Вызова Функций. Для блока Подсистема Вызова Функций вы соединяете входные порты блоков с корневыми блоками Inport, которые утверждают сигналы function-call. Подсистема выполняется на основе сигнала вызова функции, который она получает.

Модель rtwdemo_cppclass_functions содержит подсистемы вызова функций f1, f2, и f3 для экспорта функций.

open_system('rtwdemo_cppclass_functions')

Создайте Тестовую обвязку модель для симуляции

При экспортах функций сгенерированный код не включает планировщик. Создайте модель тестовой обвязки для обработки планирования во время симуляции. Не используйте модель тестовой обвязки, чтобы сгенерировать код, который вы развертываете.

Модель rtwdemo_cppclass_export_functions является тестовая обвязка. Модель предоставляет сигналы вызова функции другим моделям в этом примере, чтобы запланировать содержимое модели.

open_system('rtwdemo_cppclass_export_functions')

Симулируйте модель Тестовой обвязки

Проверьте, что модель, содержащая функции, которые вы хотите экспортировать, выполняется так, как вы ожидаете, моделируя модель тестовой обвязки. Для примера моделируйте rtwdemo_cppclass_export_functions.

sim('rtwdemo_cppclass_export_functions')

Сгенерируйте код функции и отчет

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

slbuild('rtwdemo_cppclass_functions')
### Starting build procedure for: rtwdemo_cppclass_functions
### Successful completion of build procedure for: rtwdemo_cppclass_functions

Build Summary

Top model targets built:

Model                       Action                       Rebuild Reason                                    
===========================================================================================================
rtwdemo_cppclass_functions  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 10.423s

Просмотр сгенерированного кода

Из отчета генерации кода проверьте сгенерированный код.

  • ert_main.cpp является примером основной программы (среды выполнения) для модели. Этот код показывает, как вызвать экспортированные функции. Код также показывает, как инициализировать и выполнить сгенерированный код.

  • rtwdemo_cppclass_functions.cpp вызывает функцию инициализации, включая Initialize Function, и экспортированные функции для компонентов подсистемы модели f1, f2, и f3.

  • rtwdemo_cppclass_functions.h объявляет данные модели структуры и открытый интерфейс экспортированным функциям точки входа и структурам данных.

  • rtwtypes.h определяет типы данных, структуры и макросы, которые требуются сгенерированному коду.

Запись кода интерфейса

Откройте и проверьте отчет по интерфейсам кода. Чтобы написать код интерфейса для среды выполнения, используйте информацию в этом отчете.

  1. Включите сгенерированные заголовочные файлы путем добавления директивы #include rtwdemo_cppclass_functions.h и #include rtwtypes.h.

  2. Запишите входные данные в сгенерированный код для блоков Inport модели.

  3. Вызовите сгенерированные функции точки входа.

  4. Считайте данные из сгенерированного кода для блоков Outport модели.

Входные порты:

  • rtU.U1 типа real_T с размерностью 1

  • rtU.U2 типа real_T с размерностью 1

  • rtU.U3 типа real_T с размерностью 1

Функции точки входа:

  • Инициализируйте функцию точки входа, void initialize(void). При запуске вызовите эту функцию один раз.

  • Экспортированная функция, void t_1tic_A(void). При необходимости вызовите эту функцию.

  • Экспортированная функция, void t_1tic_B(void). При необходимости вызовите эту функцию.

  • Экспортированная функция, void t_1tic_C(void). При необходимости вызовите эту функцию.

Выходные порты:

  • rtY.TicToc1 типа int8_T с размерностью [2]

  • rtY.TicToc2 типа int8_T с размерностью [2]

  • rtY.TicToc10 типа int8_T с размерностью 1

Подробнее о

Закройте модели примера

bdclose('rtwdemo_cppclass_export_functions')
bdclose('rtwdemo_cppclass_functions')

Сгенерируйте код для подсистем экспорт функций

Чтобы сгенерировать код для подсистемы экспорта функций:

  1. Проверьте, что подсистема, для которой вы генерируете код, удовлетворяет требованиям экспорта.

  2. В диалоговом окне Параметров конфигурации:

    1. Установите System target file параметра в системный целевой файл на основе ERT, такой как ert.tlc.

    2. Если вы хотите блок SIL с сгенерированным кодом, в целях верификации установите параметр конфигурации модели Create block равным SIL.

    3. Щелкните OK или Apply.

  3. Щелкните правой кнопкой мыши блок подсистемы и выберите C/C++ Code > Export Functions из контекстного меню.

    Операция создает новую модель, subsystem.slx, который содержит содержимое исходной подсистемы и создает ScratchModel который содержит блок Model. Этот блок ссылается на вновь созданную subsystem.slx модель.

    Код сборки для подсистемы: Subsystem откроется диалоговое окно. Это диалоговое окно не относится к подсистемам экспорта функций. Генерация кода не требует ввода информации в диалоговом окне.

  4. Щелкните Build, чтобы создать вновь созданную subsystem.slx модель.

    Генератор кода производит код и помещает его в рабочую папку.

    Если вы задаете Create block SIL на шаге 2b Simulink открывает новое окно, которое содержит блок s-function, который представляет сгенерированный код. Этот блок имеет тот же размер, форму и соединители, что и исходная подсистема.

Генерация кода и создание дополнительных блоков завершены. Вы можете протестировать и использовать код и дополнительный блок, как вы делаете для сгенерированного кода ERT и блока s-function. Дополнительные задачи рабочего процесса см. в разделах Задать пользовательское имя функции инициализации и Задать пользовательское описание.

Задайте пользовательское имя функции инициализации

Можно задать пользовательское имя для функции инициализации экспортированной функции в качестве аргумента в slbuild команда. Команда принимает следующую форму:

blockHandle = slbuild('subsystem', 'Mode', 'ExportFunctionCalls',..
             'ExportFunctionInitializeFunctionName', 'fcnname')

fcnname задает имя функции. Для примера, если вы задаете имя 'myinitfcn'процесс сборки излучает код, подобный:

/* Model initialize function */
void myinitfcn(void){
...
}

Задайте пользовательское описание

Вы можете ввести пользовательское описание для экспортированной функции с помощью диалогового окна «Свойств блока» блока Inport.

  1. Щелкните правой кнопкой мыши блок Inport, который управляет управляющим портом подсистемы, для которой вы экспортируете код.

  2. Выберите Properties.

  3. На вкладке General, в поле Description, введите описательный текст.

Во время экспорта функции введенный текст излучается в сгенерированный код в заголовке блока Inport. Например, если вы открываете пример программы rtwdemo_exporting_functions и введите описание в диалоговом окне Блока Свойств для порта t_1tic_AГенератор кода производит код, который похож на:

/*
 * Output and update for exported function: t_1tic_A
 *
 *  My custom description of the exported function
*/
void t_1tic_A(void)
{
...
}

Оптимизируйте код, сгенерированный для подсистем экспорт функций

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

Для каждой подсистемы вызова функций, которую вы экспортируете:

  1. Щелкните подсистему правой кнопкой мыши.

  2. Из контекстного меню выберите Block Parameters (Subsystem).

  3. Выберите вкладку Code Generation.

  4. Установите Function packaging значение Auto.

  5. Щелкните OK или Apply.

Похожие темы