В этом примере показано, как связать подсистемы в модели с именами функции и файлами.
Узнать, как:
Задайте функцию и имена файла в сгенерированном коде.
Идентифицируйте части сгенерированного кода, необходимые для интегрирования.
Сгенерируйте код для атомарных подсистем.
Идентифицируйте данные, которые требуются для выполнения сгенерированной функции.
Для получения информации о модели примера и других примерах в этой серии, смотрите Подготовьте модель алгоритма управления для генерации кода C.
Модели в примере Prepare a Алгоритм Управления Model for Генерация Кода C и Configure Data Interface в Сгенерированном коде используют виртуальные подсистемы. Виртуальные подсистемы визуально организуют блоки, но не влияют на функциональность модели. Атомарные подсистемы оценивают блоки, включенные в модель, как модуль. С помощью атомарных подсистем можно задать дополнительную информацию о разбиении функций. В модели атомарные подсистемы появляются с жирной границей.
Откройте пример модели rtwdemo_PCG_Eval_P3.
Сохраните копию модели в папку с возможностью записи.
В этом примере показано, как заменить виртуальные подсистемы подсистемами вызова функций. Подсистемы вызова функций:
Являются атомарными подсистемами
Позволяет вам управлять порядком выполнения подсистемы
Выполняется, когда запускается сигнал вызова функции
Путем управления порядком выполнения подсистем можно сопоставить модель с существующей системой, которая имеет определенный порядок выполнения.
Рисунок идентифицирует подсистемы вызова функции (1) PI_ctrl_1
, PI_ctrl_2
, и Pos_Command_Arbitration
.
Эта версия модели содержит новую подсистему Execution_Order_Control
(2), которая содержит график Stateflow ®, которая моделирует вызывающую функциональность планировщика. Подсистема управляет порядком выполнения подсистем вызова функции через сигналы вызова функции (3). Позже в этом примере вы исследуете, как изменение порядка выполнения может изменить результаты симуляции.
Эта версия модели содержит новые блоки Преобразования Сигналов (4) на выходах ПИ-контроллеров. С помощью этих дополнительных блоков генератор кода может сгенерировать одну входящую функцию для ПИ-контроллеров.
В Подготовке Модели Алгоритма Управления для Генерации Кода C и Конфигурировании Интерфейса Данных в Сгенерированном Коде генератор кода создает одну model
_step
функция, которая содержит код алгоритма управления. Однако многие приложения требуют большего уровня контроля за размещением функций в файлах. Изменяя параметры атомарных подсистем, можно задать несколько функций в одной модели.
Рисунок показывает параметры подсистемы для PI_ctrl_1
.
Обработайте как атомарный модуль
Включает другое подменю. Для атомарных подсистем этот параметр автоматически выбирается и отключается.
Шаг расчета
Задает шаг расчета для выполнения. Недоступно для подсистем вызова функций.
Опции упаковки функций
Auto
-- Определяет, как подсистема появится в сгенерированном коде. Это значение является значением по умолчанию.
Inline
- Помещает код подсистемы в строку с остальной частью кода модели.
Function
-- Генерирует код для подсистемы как функции.
Reusable function
-- Генерирует переиспользуемую (повторно входящую) функцию из подсистемы. Функция передает все входные и выходные данные через формальные параметры. Функция не имеет прямого доступа к глобальным переменным.
Опции имени функции
Выбор Function
или Reusable function
для Function packaging включает опции имени функции.
Auto
-- Определяет функцию.
Use subsystem name
-- Основывает функцию на имени подсистемы.
User specified
- Применяет указанное имя файла.
Опции имени файла
Выбор Function
или Reusable function
для Function packaging включает опции имени файла.
Auto
-- Помещает определение функции в модуль, сгенерированный для родительской системы, или, если корень модели является родительским элементом, в model.c
.
Use subsystem name
- Генерирует отдельный файл. Имя файла - это имя подсистемы или библиотечного блока.
Use function name
- Генерирует отдельный файл. Имя файла задается с помощью Имени функции опций.
User specified
-- Применяет указанное уникальное имя файла.
Функция с отдельными данными
Включено, когда для Function packaging задано значение Function
. При выборе генератор кода отделяет внутренние данные подсистемы (для примера, сигналы) от данных родительской модели. Подсистема владеет этими отдельными данными.
Embedded Coder ® поддерживает входящий код. Повторный код является переиспользуемой стандартной программой программирования, которую одновременно могут использовать несколько программ. Повторный код используется в операционных системах и другом системном программном обеспечении, которое использует многопоточность для обработки параллельных событий. Повторный код не поддерживает данные о состоянии, поэтому в функции нет постоянных переменных. Вызывающие программы поддерживают переменные состояния и должны передать данные о состоянии в функцию. Многие пользователи или процессов могут совместно использовать одну копию входящей функции.
Чтобы сгенерировать повторный код, необходимо сначала задать подсистему как переиспользуемую путем конфигурирования параметра подсистемы Function packaging.
В некоторых случаях строение модели препятствует переиспользуемому коду. В таблице перечислены общие вопросы.
Cause Solution
Subsystem output feeds global signal Add a Signal Conversion block between the data subsystem and the global signal.
Generated function receives data Select Configuration Parameters > (formal parameters) through pointers Model Referencing > Pass fixed-size scalar root inputs by value for code generation.
Subsystem uses global signal data Use a port to pass the global data in and out in internal algorithm of the subsystem.
Чтобы задать алгоритмические данные параметра (такие как коэффициент усиления или коэффициент) вне возможностей действия переиспользуемого библиотечного блока или подсистемы, можно применить маску к блоку или подсистеме и создать параметр маски. Затем можно задать другое значение параметров для каждого образца блока или подсистемы. Каждый параметр маски появляется в сгенерированном коде как формальный параметр входящей функции.
В этой версии модели подсистемы PI_ctrl_1
и PI_ctrl_2
маскированы. В каждой маске значения P
и I
коэффициент усиления задается такими объектами данных, как I_Gain_2
и P_Gain_2
.
В разделе «Подготовка модели алгоритма управления для генерации кода C и конфигурирование интерфейса данных в Сгенерированном коде» вы генерируете код на корневом уровне модели. Также можно создать определенную подсистему.
Чтобы инициировать сборку подсистемы, используйте контекстное меню. Вы можете выбрать из следующих опций:
Сборка Эта Подсистема: Обрабатывает подсистему как отдельный режим и создает полный набор исходных файлов C и заголовочных файлов. Эта опция не поддерживает подсистем вызова функций.
Сгенерируйте S-функцию: Генерирует код C для подсистемы и создает оболочку S-функции. Затем можно симулировать код в исходной модели. Эта опция не поддерживает подсистем вызова функций.
Экспорты функций: Генерирует Код С без кода планирования, который поставляется с опцией Build This Subsystem. Используйте эту опцию для создания подсистем, которые используют триггеры, такие как подсистемы вызова функций.
Также откройте приложение Embedded Coder, выберите подсистему и на вкладке Код С нажмите Build.
Этот пример сравнивает файлы, которые генерируются для полной системной сборки, с файлами, которые генерируются для экспортированных функций. Вы также исследуете, как маскированные данные появляются в коде.
Запустите скрипт сборки для трёх опций. Затем исследуйте сгенерированные файлы, щелкнув гиперссылки.
rtwdemo_PCG_Eval_P3.c
Полная сборка: Да, функция шага
PI_ctrl_1: Нет
Pos_Command_Arbitration: Нет
PI_ctrl_1.c
Полная сборка: Нет
PI_ctrl_1: Да, функция триггера
Pos_Command_Arbitration: Нет
Pos_Command_Arbitration.c
Полная сборка: Нет
PI_ctrl_1: Нет
Pos_Command_Arbitration: Да, Init и функция
PI_Ctrl_Reusable.c
ert_main.c
eval_data.c
(1) eval_data.c
имеет разное содержимое в полных и экспортных сборках функций. Полная сборка включает все параметры, которые использует модель. Экспорт функций содержит только те переменные, которые использует подсистема.
Маскированные данные в сгенерированном коде
В файл rtwdemo_PCG_Eval_P3.c
сайты вызовов входящей функции используют объекты данных P_Gain
, I_Gain
, P_Gain_2
, и I_Gain_2
как аргументы.
По умолчанию Simulink ® выполняет подсистемы в следующем порядке:
PI_ctrl_1
PI_ctrl_2
Pos_Command_Arbitration
В данном примере можно задать один из двух альтернативных порядков выполнения. Затем можно использовать тестовую обвязку, чтобы наблюдать эффект порядка выполнения на результаты симуляции. Подсистема Execution_Order_Control
имеет два строений, которые управляют порядком выполнения. Чтобы выбрать строение, используйте контекстное меню подсистемы.
Измените порядок выполнения и наблюдайте за результатами.
Результаты симуляции (положение дросселя с течением времени) незначительно варьируются в зависимости от порядка выполнения. Вы можете увидеть различие наиболее четко, когда изменяется запрос дросселя.
Для следующего примера в этой серии смотрите Вызов внешнего кода С из модели и Сгенерированный код.