В этом примере показано, как связать подсистемы в модели с именами функций и файлами.
Узнайте, как:
Укажите имена функций и файлов в созданном коде.
Определите части созданного кода, необходимые для интеграции.
Создание кода для атомных подсистем.
Определите данные, необходимые для выполнения сгенерированной функции.
Сведения о модели примера и других примерах этой серии см. в разделе Подготовка модели алгоритма управления для генерации кода C.
В примерах моделей в разделе Подготовка модели алгоритма управления для генерации кода C и конфигурирования интерфейса данных в сгенерированном коде используются виртуальные подсистемы. Виртуальные подсистемы визуально организуют блоки, но не влияют на функциональность модели. Атомарные подсистемы оценивают блоки, включенные в модель, как единицу измерения. С помощью атомных подсистем можно указать дополнительную информацию о разбиении функций. В модели атомные подсистемы отображаются жирной границей.
Откройте пример rtwdemo_PCG_Eval_P3 модели.
Сохраните копию модели в доступной для записи папке.
В этом примере показано, как заменить виртуальные подсистемы подсистемами вызова функций. Подсистемы вызова функций:
Атомные подсистемы
Возможность управления порядком выполнения подсистемы
Выполнение при срабатывании сигнала вызова функции
Управляя порядком выполнения подсистем, можно сопоставить модель с существующей системой, которая имеет определенный порядок выполнения.
На рисунке показаны подсистемы вызова функций (1) PI_ctrl_1, PI_ctrl_2, и Pos_Command_Arbitration.
Эта версия модели содержит новую подсистему Execution_Order_Control (2), которая содержит диаграмму Stateflow ®, моделирующую функцию вызова планировщика. Подсистема управляет порядком выполнения подсистем вызова функции посредством сигналов вызова функции (3). Далее в этом примере рассматривается, как изменение порядка выполнения может изменить результаты моделирования.
Эта версия модели содержит новые блоки преобразования сигналов (4) на выходах контроллеров PI. При наличии этих дополнительных блоков генератор кода может генерировать единственную входную функцию для PI-контроллеров.
При подготовке модели алгоритма управления для генерации кода C и конфигурирования интерфейса данных в сгенерированном коде генератор кода создает один model_step функция, содержащая код алгоритма управления. Однако многие приложения требуют большего уровня контроля над размещением файлов функций. Изменяя параметры атомных подсистем, можно задать несколько функций в одной модели.
На рисунке показаны параметры подсистемы для PI_ctrl_1.

Рассматривать как атомную единицу
Включает другие подменю. Для атомных подсистем этот параметр автоматически выбирается и отключается.
Время выборки
Указывает примерное время выполнения. Недоступно для подсистем вызова функций.
Варианты упаковки функций
Auto - Определяет, как подсистема отображается в сгенерированном коде. Это значение является значением по умолчанию.
Inline - Помещает код подсистемы в линию с остальным кодом модели.
Function - Генерирует код для подсистемы как функцию.
Reusable function - Создает повторно используемую (повторно вводимую) функцию из подсистемы. Функция передает все входные и выходные данные через формальные параметры. Функция не имеет прямого доступа к глобальным переменным.
Параметры имени функции
Выбор Function или Reusable function для упаковки функций включает опции имени функции.
Auto - Определяет функцию.
Use subsystem name - Базирует функцию на имени подсистемы.
User specified -- Применяет указанное имя файла.
Параметры имени файла
Выбор Function или Reusable function для Function packaging включает параметры имени файла.
Auto -- Помещает определение функции в модуль, созданный для родительской системы, или, если корень модели является родительским, в model.c.
Use subsystem name - Создает отдельный файл. Имя файла - это имя подсистемы или блока библиотеки.
Use function name - Создает отдельный файл. Имя файла - это имя, указанное опциями Имя функции (Function name).
User specified -- Применяет указанное уникальное имя файла.
Функция с отдельными данными
Включено, если для параметра Function packaging установлено значение Function. При выборе этого параметра генератор кода отделяет внутренние данные подсистемы (например, сигналы) от данных родительской модели. Подсистема владеет этими отдельными данными.
Embedded Coder ® поддерживает повторный ввод кода. Повторный ввод кода - это многократно используемая подпрограмма программирования, которую могут использовать одновременно несколько программ. Повторный ввод кода используется в операционных системах и другом системном программном обеспечении, использующем многопоточность для обработки параллельных событий. Reentrant code не поддерживает данные о состоянии, поэтому в функции нет постоянных переменных. Вызывающие программы поддерживают переменные состояния и должны передавать данные состояния в функцию. Несколько пользователей или процессов могут совместно использовать одну копию входящей функции.
Для создания кода повторного ввода необходимо сначала указать подсистему как повторно используемую, настроив параметр подсистемы 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 и конфигурирования интерфейса данных в сгенерированном коде создается код на корневом уровне модели. Кроме того, можно создать определенную подсистему.
Чтобы инициировать построение подсистемы, используйте контекстное меню. Можно выбрать один из следующих вариантов:
Build This Subsystem: Рассматривает подсистему как отдельный режим и создает полный набор исходных C-файлов и заголовочных файлов. Эта опция не поддерживает подсистемы вызова функций.
Generate S-Function: Генерирует код C для подсистемы и создает оболочку S-Function. Затем можно смоделировать код в исходной модели. Эта опция не поддерживает подсистемы вызова функций.
Функции экспорта: создает код C без кода планирования, поставляемого с опцией «Построить эту подсистему». Эта опция используется для построения подсистем, использующих триггеры, например, подсистемы вызова функций.
Либо откройте приложение Embedded Coder, выберите подсистему и на вкладке C Code нажмите кнопку 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 имеет две конфигурации, которые управляют порядком выполнения. Для выбора конфигурации используйте контекстное меню подсистемы.
Измените порядок выполнения и просмотрите результаты.
Результаты моделирования (положение дросселя с течением времени) незначительно изменяются в зависимости от порядка выполнения. Разница наиболее отчетливо прослеживается при изменении запроса дросселя.
Следующий пример этой серии см. в разделах Вызов внешнего кода C из модели и сгенерированный код.