Моделями экспорта функций является Simulink® модели, которые генерируют код для независимых функций, которые могут быть интегрированы с внешней средой и планировщиком. Функции заданы с помощью Function-Call Subsystem, вызов функции Model, Simulink Function и блоки S-Function.
Следующая модель экспорта функций содержит две функции, определяемых с блоками Function-Call Subsystem. Для постепенной процедуры, чтобы создать эту модель, смотрите, Создают Модель Экспорта функций.
Код, сгенерированный из этой модели, имеет две независимых функции, один для функции задержки и другого для квадратной функции.
/* * File: export_function_model.c * Code generated for Simulink model 'export_function_model'. */ void function_call_100ms(void) /* Sample time: [0.1s, 0.0s] */ { export_function_model_Y.output_100ms = export_function_model_DW.UnitDelay_DSTATE; export_function_model_DW.UnitDelay_DSTATE = export_function_model_Y.output_100ms + 1.0; } void function_call_10ms(void) /* Sample time: [0.01s, 0.0s] */ { export_function_model_Y.output_10ms = export_function_model_U.input_10ms * export_function_model_U.input_10ms; }
Четыре общих процесса для создания моделей экспорта функций отличаются по тому, как вы симулируете и тестируете свою модель прежде, чем сгенерировать код для функций.
Когда секвенирование вызова функции достаточно просто быть заданным как вход модели, симуляция с помощью входной матрицы является предпочтительным методом для тестирования модели экспорта функций. Смотрите, что Тестовая Симуляция модели Экспорта функций Использует Входную Матрицу.
Когда секвенирование вызова функции будет слишком сложным, чтобы задать с входной матрицей, создайте тестовую модель (обвязка), чтобы подражать поведению целевого окружения. Используйте эту тестовую модель, чтобы предоставить входные параметры вызова функции модели экспорта функций. Смотрите, что Тестовая Симуляция модели Экспорта функций Использует Генераторы Вызова функции, Тестовую Симуляцию модели Экспорта функций Используя Симуляцию модели Экспорта функций Редактора и Теста Расписания Используя диаграмму Stateflow.
На верхнем уровне модель экспорта функций ограничивается виртуальными блоками, блоками с постоянным (inf
) шаг расчета и следующие блоки:
Inport
Outport
Bus Creator
Bus Selector
In Bus Element
Out Bus Element
Function-Call Subsystem
Model с входными портами вызова функции
Simulink Function
Initialize Function
Reset Function
Terminate Function
Data Store Memory
Merge
S-Function с входным портом вызова функции
Function-Call Split
Display
Scope
Смотрите невиртуальные и виртуальные блоки.
Для модели экспорта функций, чтобы успешно сгенерировать функциональный код, должны быть удовлетворены следующие требования.
Параметры конфигурации модели:
Решатель набор Type к Fixed-step
.
Набор Solver к auto
или discrete
.
Генерация кода набор System target file к ert.tlc
. Выбор ert.tlc
требует Embedded Coder® лицензия.
Для блоков Model вызова функции, Periodic sample time constraint для набора модели, на который ссылаются, к Ensure sample time independent
.
Вызов функции корневого уровня блоки Inport:
Флажок Output function call устанавливается.
Не может получить сигнал от блока Asynchronous Task Specification.
Данные корневого уровня Inport и блоки Outport не могут соединиться с виртуальными сигналами данных о шине.
Блоки Подсистемы вызова функций корневого уровня и блоки Model вызова функции:
Все внутренние блоки в блоке должны поддержать генерацию кода.
Блок If the Trigger Sample time type установлен в:
triggered
, внутренним блокам нужно было установить Sample time на -1
.
periodic
, блоку Inport вызова функции корневого уровня нужно было установить его Sample time на заданное дискретное время, и всем внутренним блокам нужно было установить Sample time на -1
или заданное дискретное время.
В модели экспорта функций можно задать шаг расчета для вызова функции корневого уровня блоки Inport и блок Trigger в блоке Function-Call Subsystem корневого уровня или блоке Model вызова функции. Следующая таблица показывает, как задать эти шаги расчета.
Блок Trigger Sample time type | Блок Trigger Sample time | Блок Inport Sample time | Уровень вызова функции в процессе моделирования |
| Не заданный, параметр неактивен. | - 1 (наследованный) | Для симуляции инициатор вызова функции, соединенный с блоком Inport, устанавливает скорость моделирования. |
Заданное дискретное время | У инициатора вызова функции, в тестовой модели, соединенной с блоком Inport, должен быть шаг расчета, равный заданному дискретному времени для блока Inport. Для симуляции компонент выполняется на заданном дискретном уровне. Если источник вызова функции использует различную выборку, Simulink отображает сообщение об ошибке. | ||
Периодические проверки на этапе выполнения вызова функции применяются, если на модель экспорта функций ссылаются от блока Model. | - 1 (наследованный) или заданное дискретное время для блока Inport. | - 1 (наследованный) | Эта настройка не позволена. Simulink отображает сообщение об ошибке. |
Заданное дискретное время. | Для симуляции компонент выполняется в заданном дискретном шаге расчета. Если источник вызова функции использует различный шаг расчета, Simulink отображает сообщение об ошибке. |
Путем определения шага расчета и приоритета для вызова функции блоки Inport можно управлять порядком выполнения подсистем вызова функций и моделей вызова функции в процессе моделирования. В качестве альтернативы можно использовать Редактор Расписания или Stateflow® стройте диаграмму, чтобы протестировать планирование. Смотрите, что Тестовая Симуляция модели Экспорта функций Использует Симуляцию модели Экспорта функций Редактора и Теста Расписания Используя диаграмму Stateflow.
Задайте шаг расчета для выполнения симуляции. Щелкните правой кнопкой по блоку Inport вызова функции, затем выберите Block parameters.
Выберите вкладку Signal Attributes. В поле Sample time введите дискретное время.
Задайте приоритет блока для симуляции. Щелкните правой кнопкой по блоку Inport вызова функции, затем выберите Properties.
В поле Priority введите приоритетное значение.
Отобразите порядок выполнения блока для симуляции. На вкладке Debug select Information Overlays , затем от выпадающего диалогового окна, выбирают Execution Order. Это отображение не оказывает влияния на сгенерированный код.
В следующей модели экспорта функций, Function-Call Subsystem 2 с Sample time для набора блока 2 Inport к 0.01
запуски (на 10 мс) перед Function-Call Subsystem 1 с Sample time для набора блока 1 Inport к 0.1
(100 мс).
Simulink сравнивает свойства блока Inport вызова функции определить их относительный порядок выполнения, использующий следующие правила:
Приоритет – более высокий приоритет (меньшее число) выполняется сначала
Шаг расчета – меньший шаг расчета выполняется сначала
Номер порта – меньший номер порта выполняется сначала
Если OrderFunctionsByDependency
параметр для модели устанавливается на 'on'
, блоки, которые имеют те же шаги расчета, далее сортируются на основе относительной зависимости по данным функций, с которыми соединяются блоки.
Видеть эффект OrderFunctionsByDependency
параметр, рассмотрите следующую модель.
Блок 1 Inport выполняется в последний раз, потому что он имеет более длинный шаг расчета, чем блоки 2 и 3 Inport, которые имеют тот же шаг расчета. Если OrderFunctionsByDependency
установлен в 'off'
, блок 2 Inport выполняется перед блоком 3 Inport на основе их номеров портов. Порядок выполнения равняется 2, 3, 1.
OrderFunctionsByDependency
параметр устанавливается на 'off'
по умолчанию. Чтобы включить его, используйте эту команду.
set_param(ModelName,'OrderFunctionsByDependency','on')
OrderFunctionsByDependency
установите на 'on'
, блок 3 Inport выполняется перед блоком 2 Inport из-за зависимости по данным между подсистемами вызова функций 2 и 3. Порядок выполнения равняется 3, 2, 1.Обратите внимание на то, что OrderFunctionsByDependency
параметр влияет только на модель, для которой он установлен. Параметр не распространяет в модели, на которые ссылаются.
Когда два блока имеют различные значения для параметра Priority, блок с более высоким приоритетом выполняется сначала. Если параметр Priority равен, блок с более быстрым уровнем (меньший шаг расчета) выполняется сначала. Если Priority и шаг расчета являются тем же самым для обоих из блоков, блок с номером нижнего порта выполняется сначала. Исключение - когда зависимость по данным существует между блоками и OrderFunctionsByDependency
установлен в 'on'
, в этом случае зависимый блок выполняется после блока, от которого он зависит.
Примечание
Когда режим симуляции топ-модели является акселератором или быстрым акселератором, Simulink не выполняет проверки симуляции во время выполнения для порядка выполнения вызова функции корневого уровня блоки Inport в моделях экспорта функций, на которые ссылаются.
Предположим, что модель экспорта функций имеет пять вызовов функции корневого уровня блоки Inport, к E, со свойствами блока как показано в таблице. Блоки не имеют никаких зависимостей по данным или OrderFunctionsByDependency
установлен в 'off'
. Чтобы определить их относительный порядок выполнения, Simulink сравнивает их параметры Priority, шаги расчета (если отличный и ненаследованный), и номера портов.
Блок Inport вызова функции корневого уровня | A | B | C | D | E |
---|---|---|---|---|---|
Приоритет | 10 | 30 | 40 | 40 | 30 |
Размер шага | –1 | 0.2 | 0.1 | 0.1 | –1 |
Номер порта | 5 | 4 | 3 | 2 | 1 |
Блок A имеет самый высокий приоритет пяти блоков. Выполнение сначала.
B и E выполняются после A, но прежде C и D. Поскольку B и E имеют тот же приоритет, Simulink сравнивает их шаги расчета, чтобы определить порядок выполнения. E имеет шаг расчета -1
(наследованный), который меньше, чем 0.2
, шаг расчета B. E выполняется прежде B.
C и D имеют тот же приоритет и те же отличные, ненаследованные шаги расчета. Номер порта для D (2) меньше, чем C (3), таким образом, D выполняется прежде C.
Относительный порядок выполнения для них вызов функции, который блокирует Inport, является A, E, B, D, C.
Можно фиксировать входные данные для блоков Inport в блоках Function-Call Subsystem, чтобы гарантировать целостность данных. Чтобы фиксировать входные данные, в параметрах блоков Inport, выбирают Latch input for feedback signals of function-call subsystem outputs.
В следующей модели, входных данных для блока Inport в подсистеме вызова функций ReadDSAndCal1
фиксируется (обозначенный <Li>
) и не может измениться во время выполнения подсистемы. Data Store Read и блоки Data Store Write называются в каждой подсистеме вызова функций. Первые и вторые вызовы функции записывают данные, и последний вызов функции считывает данные в блок Data Store Memory.
Примечание
Блок Inport данных корневого уровня, соединенный с внутренним блоком Inport, также фиксируют, если все блоки, соединенные с блоком корневого уровня, фиксируют. Для получения дополнительной информации смотрите вход Latch для сигналов обратной связи подсистемы вызова функций выходные параметры.
Примечание
Сигналы передачи данных незащищены в сгенерированном коде по умолчанию. Используйте пользовательские классы памяти, чтобы предотвратить повреждение данных в этих сигналах из-за вытеснения текущей задачи в целевом окружении.
Вложенные модели экспорта функций обеспечивают дополнительный слой организации. Следующая модель имеет две модели экспорта функций, на которые ссылаются, на которые ссылаются от блока Model.
Примечание
Модель экспорта функций не может содержать модель, на которую ссылаются, с асинхронными входными параметрами вызова функции, но может содержать модели вызова функции и подсистемы вызова функций. Модель с асинхронными входными параметрами вызова функции может содержать модель экспорта функций, подсистему вызова функций или модель вызова функции.
Можно использовать блоки Function-Call Subsystem или вызов функции блоки Model в модели экспорта функций. Если вы используете блок Model вызова функции, можно также создать несколько экземпляров модели.
Задайте свой алгоритм с моделью, которая содержит блок Trigger. Установите Trigger type на function-call
.
Сошлитесь на модель от блока Model . Результатом является модель вызова функции.
Соедините блок Inport вызова функции и установите флажок Output function call. Добавьте Inport сигнала и блоки Outport. Обновите модель (Ctrl-D). Результатом является модель экспорта функций с моделью вызова функции.
Скопируйте блоки модели, на которые ссылаются, и блокировки порта, чтобы создать второй экземпляр модели. Эти два экземпляра вызваны различным вызовом функции корневого уровня блоками Inport в различных задачах.
Поддержка модели экспорта функций доступна для моделей с асинхронными входными портами вызова функции. Вы используете эти модели, в основном, в окружении Simulink, где планировщик Simulink вызывает функции.
Характеристика сравнения | Модели экспорта функций | Модели с асинхронными входными параметрами вызова функции |
---|---|---|
Определение | Эти модели имеют вызов функции корневого уровня блоки Inport, которые не соединяются с блоком Asynchronous Task Specification. Эти Inport блокирует триггерные подсистемы вызова функций или модели вызова функции (блок Model с блоком Trigger). | Эти модели имеют вызов функции корневого уровня блоки Inport, соединенные с блоками Asynchronous Task Specification. Эти Inport блокирует триггерные подсистемы вызова функций или модели вызова функции. |
Блоки корневого уровня | Только блоки, выполняющиеся в контексте вызова функции, позволены на корневом уровне. | Блоки, выполняющиеся в контексте невызова функции, также позволены. |
Передача данных | Используйте индикаторы передачи данных, чтобы интерпретировать результаты симуляции. Передача данных в моделях экспорта функций не защищена по умолчанию в сгенерированном коде. Для получения дополнительной информации смотрите, Фиксировал Входные данные для Подсистем вызова функций. | Используйте блоки Rate Transition, чтобы защитить данные, переданные между подсистемами вызова функций, запускающимися на различных уровнях. Для получения дополнительной информации смотрите Переход Уровня. |
Поддержка симуляции | Эти модели поддерживают автономную симуляцию и симуляцию тестовой модели во всех режимах симуляции. | Эти модели поддерживают симуляцию тестовой модели во всех режимах симуляции и автономную симуляцию в Нормальном, Акселераторе и Быстрых Режимах Accelerator. |
Поддержка генерации кода | Топ-модель и автономная генерация кода поддерживаются. | Топ-модель и автономная генерация кода поддерживаются. |