При наличии программного обеспечения Embedded Coder ® можно создавать исходный код функции из компонентов моделирования для использования во внешней базе кодов. Сгенерированный код не включает в себя поддерживающий код планирования (например, пошаговую функцию). Управляющая логика вне среды Simulink ® вызывает сгенерированный код функции.
Можно создать код функции для экспорта для следующих компонентов моделирования:
Модели export-function (модели, содержащие функциональные блоки, состоящие исключительно из подсистем function-call, блоков function-call model или других моделей export-function, как описано в разделе Обзор моделей Export-Function)
Подсистемы Export-function (виртуальная подсистема, содержащая подсистемы function-call)
Для экспорта кода, создаваемого генератором кода для этих компонентов моделирования, компоненты моделирования должны соответствовать определенным требованиям.
Для моделей, разработанных в более ранних версиях, генератор кода может экспортировать функции из запускаемых подсистем. Требования, предъявляемые к подсистемам с функциями экспорта, также применяются к функциям экспорта из инициируемых подсистем, за следующими исключениями:
Инкапсулируйте инициированные подсистемы, из которых планируется экспортировать функции в виртуальную подсистему верхнего уровня.
Инициируемые подсистемы не должны отвечать требованиям и ограничениям, определенным для виртуальных подсистем, содержащих подсистему вызова функций.
Экспорт функций, использующих абсолютное или прошедшее время, не применяется к экспорту функций из запущенных подсистем.
Решатель модели должен быть дискретным решателем с фиксированным шагом.
Необходимо настроить каждый блок ввода на корневом уровне, который запускает подсистему вызова функции для вывода триггера вызова функции. Эти блоки Inport не могут подключиться к блоку спецификации асинхронных задач.
Модель или подсистема должны содержать только следующие блоки на корневом уровне:
Блоки вызова функции (такие как Function-Call Subsystem, Simulink Function, S-Functions и Function-Call Model) на корневом уровне, если параметр конфигурации модели решателя Tasking and sample time options > Периодическое ограничение времени выборки имеет значение Ensure sample time independent)
Блоки ввода и вывода (порты)
Блоки констант (включая блоки, разрешающие константы, например «Добавить»)
Блоки с временем выборки Inf
Блоки памяти для объединения и хранения данных
Виртуальные блоки соединений (такие как Function-Call Split, Mux, Demux, Bus Creator, Bus Selector, Signal Specification и виртуальные подсистемы, содержащие эти блоки)
Блоки просмотра сигналов, такие как блоки Scope (только подсистемы export-function)
При появлении постоянного блока на верхнем уровне модели или подсистемы необходимо задать для параметра конфигурации модели Оптимизация > Поведение параметра по умолчанию для модели или содержащей модели значение Inlined.
Блоки внутри модели или подсистемы должны поддерживать генерацию кода.
Блоки, использующие абсолютное или прошедшее время, должны находиться внутри подсистемы периодического вызова функций с дискретным временем выборки, указанным в соответствующем блоке ввода корневого уровня вызова функций. См. раздел Экспорт функций, использующих абсолютное или прошедшее время.
Сигналы данных, пересекающие границу экспортируемой системы, не могут быть виртуальной шиной и не могут быть реализованы как соединение перехода. Сигналы данных, пересекающие границу экспорта, должны быть скалярными, мультиплексированными или невиртуальной шиной.
Кроме того, для моделей export-function нельзя создать код для модели на основе скорости, включающей несколько экземпляров модели export-function. Например, нельзя создать код для модели тестового кабеля, который используется для планирования повторно используемых моделей экспорта-функции во время моделирования.
Для подсистем export-function применяются следующие дополнительные требования:
Триггерный сигнал, пересекающий границу подсистемы export-function, должен быть скалярным. Входные и выходные сигналы данных, которые не действуют как триггеры, не обязательно должны быть скалярными.
Когда постоянный сигнал управляет выходным портом подсистемы export-function, сигнал должен указывать класс хранения.
Если требуется экспортировать код функции для компонента моделирования с блоками, использующими абсолютное или прошедшее время, эти блоки должны находиться внутри подсистемы вызова функции, которая:
Конфигурирование для периодического выполнения
Блок ввода корневого уровня настраивается с дискретным временем выборки
Конфигурирование подсистемы вызова функций для периодического выполнения:
В подсистеме вызова функций щелкните правой кнопкой мыши блок Триггер и выберите в контекстном меню пункт Параметры блока.
Задайте для параметра Sample time type значение periodic.
Установите для параметра Sample time ту же гранулярность, которая указана (непосредственно или по наследованию) в инициаторе вызова функции.
Нажмите кнопку ОК или Применить.
Дополнительные сведения см. в разделе Расчет абсолютного и истекшего времени.
Параметры блока подсистемы не управляют именами файлов, содержащих сгенерированный код. Имена файлов начинаются с имени экспортируемой подсистемы.
Параметры блока подсистемы не управляют именами функций верхнего уровня в сгенерированном коде. Каждое имя функции отражает имя сигнала, который запускает функцию, или (для безымянного сигнала) отражает блок, из которого исходит сигнал.
Экспортировать системы вызовов функций для упаковки интерфейса кода класса C++ можно только в том случае, если для его функциональной спецификации установлен метод шага по умолчанию. См. раздел Интерактивная настройка интерфейса C++. Экспортированная функция совместима с однопоточным выполнением. Чтобы избежать потенциальных условий гонки данных для совместно используемых сигналов, вызовите все члены класса из одного потока выполнения.
Генератор кода поддерживает блок SIL или PIL в режиме ускорителя только в том случае, если его инициатор вызова функции не встроен в режим ускорителя. Примеры неинлинговых инициаторов включают диаграммы Stateflow ®.
Блок инициатора функции Level-2 S, такой как диаграмма Stateflow или встроенный блок генератора вызовов функции, должен управлять блоком SIL.
Можно экспортировать асинхронную систему вызова функций (время выборки), но программное обеспечение не поддерживает блок SIL или PIL для асинхронной системы.
Использование функции TLC LibIsFirstInit была удалена для подсистем export-function.
Чтобы создать код для экспортированной функции, выполните итерацию через задачи, перечисленные в этой таблице.
| Задача | Действие | Дополнительные сведения |
|---|---|---|
| 1 | Просмотрите оценку внешних признаков кода и требований к интеграции. | Выбор потока операций интеграции внешнего кода |
| 2 | Убедитесь, что экспортируемая модель или подсистема удовлетворяет требованиям экспорта функций. | Требования |
| 3 | Определение требований к интерфейсу данных путем изменения модели или подсистемы. | Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом |
| 4 | При необходимости сконфигурируйте прототип функции. | Конфигурирование функциональных интерфейсов точек входа для блоков функции Simulink и вызывающей функции, а для моделей с фиксированной скоростью передачи - конфигурирование генерации кода C для функций точек входа модели или интерактивная настройка интерфейса C++ |
| 5 | При необходимости обновите модель для размещения внешнего кода приложения в созданных системных функциях. | Размещение внешнего кода C/C + + в сгенерированном коде |
| 6 | Убедитесь, что функции ведут себя и работают так, как ожидалось во время моделирования, путем создания и использования тестовой модели электрического жгута. Тестовая модель электрического жгута планирует выполнение функций во время моделирования. | Настройка модели, создание кода, моделирование и, при наличии программного обеспечения Simulink Test™, разработка тестов (Simulink Test) |
| 7 | Настройте модель или подсистему для генерации кода. | Создание кода с помощью встроенного кодера ®, создание кода, соответствующего внешнему коду, и конфигурация модели |
| 8 | Создание кода и отчета о создании кода. | Создание кода |
| 9 | Просмотрите сгенерированный интерфейс кода и метрики статического кода. | Анализ сгенерированного интерфейса кода и статических метрик кода |
| 10 | Создайте исполняемую программу, включающую экспортированный код функции. | Создание интегрированного кода вне среды Simulink |
| 11 | Убедитесь, что исполняемая программа работает так, как ожидалось. |
Существует несколько подходов для создания кода функции для экспорта во внешнюю среду разработки. В следующей таблице сравниваются подходы. Выберите подход, который лучше всего соответствует требованиям интеграции. Дополнительные сведения о создании моделей export-function см. в разделе Обзор моделей Export-Function. Дополнительные сведения о создании кода для подсистем вызова функций см. в разделе Создание исходного кода компонента для экспорта во внешнюю базу кодов.
| Условие или требование | Использовать | Дополнительные сведения |
|---|---|---|
| Подсистема функционального вызова | |
| Функциональный блок Simulink | |
| Код отвечает на событие инициализации | Инициализация функционального блока | |
| Код отвечает на событие сброса | Сброс функционального блока | |
Код включает функции точки входа, выходящие за рамки того, что по умолчанию создает генератор кода (, , и ) | S-функция | S-функции и создание кода |
| Одномодельная структура выполнения для использования в качестве тестового электрического жгута и экспорта кода, созданного для частей модели | Подсистема экспорта-функции |
В этом примере показано, как создать код функции для отдельных функциональных блоков Simulink и подсистем вызова функции в модели без создания кода планирования.
Для создания кода функции для экспорта:
Создайте модель, содержащую функции для экспорта.
Создайте модель тестового кабеля, которая планирует выполнение функций во время моделирования.
Моделирование модели, содержащей функции, с помощью модели тестового электрического жгута.
Создайте код для модели, содержащей функции.
Создание модели, содержащей функции для экспорта
Модель с функциями для экспорта должна удовлетворять архитектурным ограничениям на уровне корня модели. На уровне корня допустимыми блоками являются:
Inport
Вспомогательный порт
Подсистема вызова функций
Функция симулятора
Goto
От
Слияние
Генератор кода создает код функции для блоков Function-Call Subsystem, Simulink Function, Initialize Function и Reset Function. Для блока Function-call Subsystem необходимо подключить входные порты блока к корневым блокам Inport, которые передают сигналы function-call. Подсистема выполняется на основе сигнала вызова функции, который она принимает. Блок функции Simulink выполняется в ответ на выполнение соответствующего блока вызывающей функции или диаграммы потока состояний. Блок Initialize Function выполняется для события инициализации модели, а блок Reset Function выполняется для события сброса, определенного пользователем.
Для экспорта функций модель rtwdemo_functions содержит две подсистемы вызова функций (f1_alg и f2_alg) и функциональный блок Simulink (f3) для экспорта функций. Модель также содержит блок инициализации функции (Initialize Functionи функциональный блок сброса (Reset Function). Чтобы вычислить начальные условия для блоков с состоянием в других частях модели, в блоках Initialize Function и Reset Function используются блоки записи состояний.
open_system('rtwdemo_functions')Создание модели, содержащей блок вызывающего абонента функции
Блок вызова функции используется для вызова блока функции Simulink. Блок вызова функции может находиться в той же модели или в другой модели, что и блок функции Simulink.
Несколько блоков вызова функции могут вызывать блок функции Simulink. Блок вызова функции можно поместить в подсистему вызова функции. Во время генерации кода генератор кода экспортирует функцию из подсистемы вызова функции.
Модель rtwdemo_caller экспортирует подсистему вызова функции, которая содержит блок вызывающего абонента функции.
open_system('rtwdemo_caller')Создание модели тестовых кабелей для моделирования
При экспорте функций созданный код не включает планировщик. Создайте модель тестового кабеля для обработки планирования во время моделирования. Не используйте модель тестовых кабелей для создания кода, который развертывается.
Модель rtwdemo_export_functions - тестовый жгут. Модель:
Планирование блока функции Simulink с блоком вызывающей функции в 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.
Запись входных данных в сгенерированный код для блоков ввода модели.
Вызовите сгенерированные функции точки входа.
Считывание данных из созданного кода для блоков 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')
В этом примере показано, как создать код функции для модели export-function, включающей подсистему function-call. Генератор кода создает код функции и класса, который не включает код планирования.
Для создания кода функции для экспорта:
Создайте модель, содержащую функции для экспорта.
Создайте модель тестового кабеля, которая планирует выполнение функций во время моделирования.
Моделирование модели, содержащей функции, с помощью модели тестового электрического жгута.
Создайте код для модели, содержащей функции.
Создание модели, содержащей функции и интерфейс класса C++ для экспорта
Модель с функциями для экспорта с интерфейсом класса модели C++ должна удовлетворять архитектурным ограничениям на уровне корня модели. Для генерации класса C++ допустимыми блоками на корневом уровне являются:
Inport
Вспомогательный порт
Подсистема вызова функций
Goto
От
Слияние
Примечание.Export Function-Call Subsystem с интерфейсом класса C++ не поддерживает функциональные блоки Simulink.
Генератор кода создает код функции для блока Function-Call Subsystem. Для блока Function-call Subsystem необходимо подключить входные порты блока к корневым блокам 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.
Запись входных данных в сгенерированный код для блоков ввода модели.
Вызовите сгенерированные функции точки входа.
Считывание данных из созданного кода для блоков 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')
Чтобы создать код для подсистемы export-function:
Убедитесь, что подсистема, для которой создается код, удовлетворяет требованиям экспорта.
В диалоговом окне «Параметры конфигурации»:
Задайте для параметра System target file значение системного целевого файла на основе ERT, например, ert.tlc.
Если требуется блок SIL с сгенерированным кодом, для проверки задайте для параметра конфигурации модели Create block значение SIL.
Нажмите кнопку ОК или Применить.
Щелкните правой кнопкой мыши блок подсистемы и выберите в контекстном меню «C/C + + Code > Export Functions».
Операция создает новую модель, , который содержит содержимое исходной подсистемы и создает subsystem.slxScratchModel содержит блок «Модель». Этот блок ссылается на вновь созданный модель.subsystem.slx
Код сборки для подсистемы: Subsystem откроется диалоговое окно. Это диалоговое окно не относится к подсистемам функций экспорта. Создание кода не требует ввода информации в диалоговом окне.
Нажмите кнопку «» Построить «», чтобы построить вновь созданный модель.subsystem.slx
Генератор кода создает код и помещает его в рабочую папку.
Если для параметра «Создать блок» задано значение SIL на этапе 2b Simulink открывает новое окно, которое содержит S-функциональный блок, который представляет сгенерированный код. Этот блок имеет те же размеры, форму и соединители, что и исходная подсистема.
Создание кода и дополнительных блоков завершено. Можно протестировать и использовать код и дополнительный блок так же, как для сгенерированного кода ERT и S-функционального блока. Дополнительные сведения о задачах рабочего процесса см. в разделах Указание имени пользовательской функции инициализации и Указание пользовательского описания.
Можно указать пользовательское имя для функции инициализации экспортируемой функции в качестве аргумента для slbuild команда. Команда принимает следующий вид:
blockHandle = slbuild('subsystem', 'Mode', 'ExportFunctionCalls',..
'ExportFunctionInitializeFunctionName', 'fcnname') указывает имя функции. Например, если указано имя fcnname'myinitfcn', процесс построения выдает код, подобный:
/* Model initialize function */
void myinitfcn(void){
...
}Можно ввести пользовательское описание экспортируемой функции с помощью диалогового окна «Свойства блока» блока «Ввод».
Щелкните правой кнопкой мыши блок «Inport», который управляет управляющим портом подсистемы, для которой экспортируется код.
Выберите Свойства.
На закладке Общее в поле Описание введите текст описания.
Во время экспорта функции вводимый текст выводится на сгенерированный код в заголовке блока «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)
{
...
}Для оптимизации кода, генерируемого для подсистемы export-function, укажите отдельный класс хранения для каждого входного сигнала и выходного сигнала, который пересекает границу подсистемы.
Для каждой экспортируемой подсистемы вызова функций:
Щелкните правой кнопкой мыши подсистему.
В контекстном меню выберите «Параметры блока (подсистема)».
Выберите закладку Создание кода.
Установить упаковку функций в Auto.
Нажмите кнопку ОК или Применить.