Если у вас есть Embedded Coder® программное обеспечение, можно сгенерировать исходный код функции из компонентов моделирования для использования во внешней основе кода. Сгенерированный код не включает в себя поддерживающий код планирования (для примера, функцию шага). Управление логикой вне Simulink® окружение вызывает сгенерированный код функции.
Можно сгенерировать код функции для экспорта этих компонентов моделирования:
Модели экспорта функций (модель, содержащая функциональные блоки, которые состоят исключительно из подсистем вызова функций, блоков модели вызова функции или других моделей экспорта функций, как описано в Обзоре моделей экспорта функций)
Подсистемы экспорта функций (виртуальная подсистема, содержащая подсистемы вызова функций)
Чтобы экспортировать код, который генератор кода производит для этих компонентов моделирования, компоненты моделирования должны соответствовать конкретным требованиям (Embedded Coder).
Для моделей, разработанных в более ранних релизах, генератор кода может экспортировать функции из триггируемых подсистем. Требования, установленные для подсистем экспортной функции, также применяются к экспорту функций из триггируемых подсистем, за следующими исключениями:
Инкапсулируйте триггируемые подсистемы, из которых вы собираетесь экспортировать функции в виртуальную подсистему верхнего уровня.
Триггируемые подсистемы не должны удовлетворять требованиям и ограничениям, определенным для виртуальных подсистем, которые содержат подсистему вызова функций.
Экспорты функций, которые используют абсолютное или истекшее время (Embedded Coder), не применяются к экспорту функций из триггируемых подсистем.
Решатель модели должен быть дискретным решателем с фиксированным шагом.
Необходимо сконфигурировать каждый блок 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 корневого уровня вызова функции. Смотрите Экспорты функций, которые используют абсолютное или истекшее время (Embedded Coder).
Сигналы данных, которые пересекают контур экспортируемой системы, не могут быть виртуальной шиной и не могут быть реализованы как соединение Goto-From. Сигналы данных, которые пересекают контур экспорта, должны быть скалярными, мультиплексированными или невиртуальной шиной.
В сложение для экспорта функций моделей вы не можете сгенерировать код для модели на основе скорости, которая включает в себя несколько образцы модели экспорта функций. Для примера вы не можете сгенерировать код для модели тестовой обвязки, который вы используете для планирования переиспользуемых моделей экспорта функций во время моделирования.
Для подсистем экспорта функций применяются следующие дополнительные требования:
Триггерный сигнал, который пересекает контур подсистемы экспорта функций, должен быть скалярным. Входные и выходные данные сигналы, которые не действуют как триггеры, не должны быть скаляром.
Когда постоянный сигнал управляет выход портом подсистемы экспорта функций, сигнал должен задать класс памяти.
Если вы хотите экспорта функций код для компонента моделирования с блоками, которые используют абсолютное или истекшее время, эти блоки должны быть внутри подсистемы вызова функций, которая:
Вы конфигурируете для периодического выполнения
Вы конфигурируете блок Inport корневого уровня с дискретным шагом расчета
Чтобы сконфигурировать подсистему вызова функций для периодического выполнения:
В подсистеме вызова функций щелкните правой кнопкой мыши блок Trigger и выберите Block Parameters из контекстного меню.
Установите Sample time type параметра равным periodic
.
Установите Sample time на ту же гранулярность, заданную (непосредственно или по наследованию) в инициаторе вызова функции.
Щелкните OK или Apply.
Для получения дополнительной информации см. «Абсолютные» и «Истекшие временные расчеты».
Параметры блока Subsystem не управляют именами файлов, содержащих сгенерированный код. Имена файлов начинаются с имени экспортированной подсистемы.
Параметры блоков Subsystem не управляют именами функций верхнего уровня в сгенерированном коде. Каждое имя функции отражает имя сигнала, который запускает функцию или (для неназванного сигнала) отражает блок, из которого генерируется сигнал.
Экспортировать системы вызова функции для упаковки интерфейса кода класса C++ можно только в том случае, если для спецификации функции задано Default step method. Смотрите Интерактивная настройка интерфейса C++ (Embedded Coder). Экспортированная функция совместима с однопоточным выполнением. Чтобы избежать потенциальных условий гонки данных для общих сигналов, активируйте все представители для класса из одного и того же потока выполнения.
Генератор кода поддерживает блок SIL или PIL в режиме Accelerator, только если его инициатор вызова функции не включен в режим Accelerator. Примеры неинлинфицированных инициаторов включают Stateflow® чарты.
Блок Level-2 инициатора S-функции, такой как диаграмма Stateflow или встроенный блок Function-Call Generator, должен управлять блоком SIL.
Можно экспортировать асинхронную систему вызова функции (sample-time), но программное обеспечение не поддерживает блок SIL или PIL для асинхронной системы.
Использование функции TLC LibIsFirstInit
был удален для подсистем экспорт функций.
Чтобы сгенерировать код для экспортированной функции, выполните итерацию с помощью задач, перечисленных в этой таблице.
Задача | Действие | Дополнительная информация |
---|---|---|
1 | Проверьте оценку характеристик внешнего кода и требований к интегрированию. | Выберите рабочий процесс интегрирования внешнего кода (Embedded Coder) |
2 | Проверьте, что модель или подсистема, которую вы экспортируете, удовлетворяет требованиям экспорта функций. | Требования (Embedded Coder) |
3 | Устраните требования к интерфейсам данных путем изменения модели или подсистемы. | Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом (Embedded Coder) |
4 | При необходимости сконфигурируйте прототип функции. | Сконфигурируйте интерфейсы функций точки входа для блоков Simulink Function и Function Caller (Embedded Coder) и, для моделей, основанных на фиксированной скорости, сконфигурируйте генерацию кода C для моделей функций точки входа (Embedded Coder) или интерактивно сконфигурируйте интерфейс C++ (Embedded coded code) |
5 | При необходимости обновите модель, чтобы поместить код конкретного внешнего приложения в сгенерированные системные функции. | Поместите внешний код C/C + + в сгенерированный код (Embedded Coder) |
6 | Проверьте, что функции ведут себя и выполняются должным образом во время симуляции, создав и используя тестовую обвязку модель. Тестовая обвязка планирует выполнение функций во время симуляции. | Сконфигурируйте модель, генерацию кода и симуляцию (Embedded Coder) и, если у вас есть программное обеспечение Simulink Test™, создание тестов (Simulink Test) |
7 | Сконфигурируйте модель или подсистему для генерации кода. | Сгенерируйте код с помощью Embedded Coder ® (Embedded Coder), Сгенерируйте код, который соответствует внешнему виду внешнего кода (Embedded Coder) и строению модели (Embedded Coder) |
8 | Сгенерируйте код и отчет генерации кода. | Генерация кода (Embedded Coder) |
9 | Проверьте сгенерированный интерфейс кода и статические метрики кода. | Анализируйте сгенерированный код (Embedded Coder) и статические метрики кода (Embedded Coder) |
10 | Создайте исполняемую программу, которая включает в себя код экспортированной функции. | Создайте интегрированный код вне окружения Simulink (Embedded Coder) |
11 | Проверьте, что исполняемая программа ведет себя и работает должным образом. |
Для генерации кода функции для экспорта во внешнюю среду разработки доступно несколько подходов. В следующей таблице сравниваются подходы. Выберите подход, который наилучшим образом соответствует вашим требованиям к интегрированию. Для получения дополнительной информации о том, как создать модели экспорта функций, смотрите Обзор моделей экспорта функций. Для получения дополнительной информации о генерации кода для подсистем вызова функции, смотрите Сгенерировать исходный код компонента для экспорта во внешнюю основу кода (Embedded Coder).
Условие или требование | Использовать | Дополнительная информация |
---|---|---|
| Подсистема вызова функций | |
| Функциональный блок Simulink | |
Код реагирует на событие инициализации | Инициализируйте блок Function |
|
Код реагирует на событие сброса | Сброс Функционального блока |
|
Код включает функции точки входа, выходящие за рамки того, что производит генератор кода по умолчанию ( , , и ) | S-функция | S-функции и генерация кода |
Среда выполнения с одной моделью для использования в качестве тестовой обвязки и для экспорта кода, сгенерированного для фрагментов модели | Подсистема экспорт функций |
Этот пример показывает, как сгенерировать код функции для отдельных функциональных блоков Simulink и подсистем вызова функций в модели, не генерируя код планирования.
Чтобы сгенерировать код функции для экспорта:
Создайте модель, которая содержит функции для экспорта.
Создайте модель тестовой обвязки, которая планирует выполнение функций во время симуляции.
Симулируйте модель, которая содержит функции, используя модель тестовой обвязки.
Сгенерируйте код для модели, которая содержит функции.
Создайте модель, которая содержит функции для экспорта
Модель с функциями для экспорта должна удовлетворять архитектурным ограничениям на уровне корня модели. На корневом уровне допустимыми блоками являются:
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
определяет типы данных, структуры и макросы, которые требуются сгенерированному коду.
Запись кода интерфейса
Откройте и проверьте отчет по интерфейсам кода. Чтобы написать код интерфейса для среды выполнения, используйте информацию в этом отчете.
Включите сгенерированные заголовочные файлы путем добавления директивы #include rtwdemo_functions.h
, #include f3.h
, и #include rtwtypes.h
.
Запишите входные данные в сгенерированный код для блоков Inport модели.
Вызовите сгенерированные функции точки входа.
Считайте данные из сгенерированного кода для блоков 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
Подробнее о
Сгенерируйте исходный код компонента для экспорта во внешнюю основу кода (Embedded Coder)
Развертывание сгенерированных автономных исполняемых программ на целевом компьютере (Embedded Coder)
Настройка организации и формата кода (Embedded Coder)
Сконфигурируйте генерацию кода C для функций точки входа модели (Embedded Coder)
Сгенерируйте код для функции Simulink и вызывающего абонента функции
Закройте модели примера
bdclose('rtwdemo_export_functions') bdclose('rtwdemo_functions') bdclose('rtwdemo_caller')
Этот пример показывает, как сгенерировать код функции для модели экспорта функций, которая включает подсистему вызова функций. Генератор кода производит функцию и код класса, который не включает в себя код планирования.
Чтобы сгенерировать код функции для экспорта:
Создайте модель, которая содержит функции для экспорта.
Создайте модель тестовой обвязки, которая планирует выполнение функций во время симуляции.
Симулируйте модель, которая содержит функции, используя модель тестовой обвязки.
Сгенерируйте код для модели, которая содержит функции.
Создайте модель, которая содержит функции и интерфейс класса 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
определяет типы данных, структуры и макросы, которые требуются сгенерированному коду.
Запись кода интерфейса
Откройте и проверьте отчет по интерфейсам кода. Чтобы написать код интерфейса для среды выполнения, используйте информацию в этом отчете.
Включите сгенерированные заголовочные файлы путем добавления директивы #include rtwdemo_cppclass_functions.h
и #include rtwtypes.h
.
Запишите входные данные в сгенерированный код для блоков Inport модели.
Вызовите сгенерированные функции точки входа.
Считайте данные из сгенерированного кода для блоков 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
Подробнее о
Сгенерируйте исходный код компонента для экспорта во внешнюю основу кода (Embedded Coder)
Развертывание сгенерированных автономных исполняемых программ на целевом компьютере (Embedded Coder)
Настройка организации и формата кода (Embedded Coder)
Сгенерируйте код для функции Simulink и вызывающего абонента функции
Закройте модели примера
bdclose('rtwdemo_cppclass_export_functions') bdclose('rtwdemo_cppclass_functions')
Чтобы сгенерировать код для подсистемы экспорта функций:
Проверьте, что подсистема, для которой вы генерируете код, удовлетворяет требованиям экспорта (Embedded Coder).
В диалоговом окне Параметров конфигурации:
Установите System target file параметра в системный целевой файл на основе ERT, такой как ert.tlc
.
Если вы хотите блок SIL с сгенерированным кодом, в целях верификации установите параметр конфигурации модели Create block равным SIL
.
Щелкните OK или Apply.
Щелкните правой кнопкой мыши блок подсистемы и выберите C/C++ Code > Export Functions из контекстного меню.
Операция создает новую модель,
, который содержит содержимое исходной подсистемы и создает subsystem
.slxScratchModel
который содержит блок Model. Этот блок ссылается на вновь созданную
модель.subsystem
.slx
Код сборки для подсистемы: Subsystem
откроется диалоговое окно. Это диалоговое окно не относится к подсистемам экспорта функций. Генерация кода не требует ввода информации в диалоговом окне.
Щелкните 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.
Щелкните правой кнопкой мыши блок Inport, который управляет управляющим портом подсистемы, для которой вы экспортируете код.
Выберите Properties.
На вкладке 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) { ... }
Чтобы оптимизировать код, сгенерированный для подсистемы экспорта функций, задайте отдельный класс памяти для каждого входного сигнала и выходного сигнала, который пересекает контур подсистемы.
Для каждой подсистемы вызова функций, которую вы экспортируете:
Щелкните подсистему правой кнопкой мыши.
Из контекстного меню выберите Block Parameters (Subsystem).
Выберите вкладку Code Generation.
Установите Function packaging значение Auto
.
Щелкните OK или Apply.