Обзор моделей экспорта функций

Моделями экспорта функций является 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Уровень вызова функции в процессе моделирования

Triggered

Не заданный, параметр неактивен.

- 1 (наследованный)

Для симуляции инициатор вызова функции, соединенный с блоком Inport, устанавливает скорость моделирования.

Заданное дискретное время

У инициатора вызова функции, в тестовой модели, соединенной с блоком Inport, должен быть шаг расчета, равный заданному дискретному времени для блока Inport.

Для симуляции компонент выполняется на заданном дискретном уровне. Если источник вызова функции использует различную выборку, Simulink отображает сообщение об ошибке.

Periodic

Периодические проверки на этапе выполнения вызова функции применяются, если на модель экспорта функций ссылаются от блока Model.

- 1 (наследованный) или заданное дискретное время для блока Inport.

- 1 (наследованный)

Эта настройка не позволена. Simulink отображает сообщение об ошибке.

Заданное дискретное время.

Для симуляции компонент выполняется в заданном дискретном шаге расчета. Если источник вызова функции использует различный шаг расчета, Simulink отображает сообщение об ошибке.

Порядок выполнения для Inport блоков вызова функции Корневого Уровня

Путем определения шага расчета и приоритета для вызова функции блоки Inport можно управлять порядком выполнения подсистем вызова функций и моделей вызова функции в процессе моделирования. В качестве альтернативы можно использовать Редактор Расписания или Stateflow® стройте диаграмму, чтобы протестировать планирование. Смотрите, что Тестовая Симуляция модели Экспорта функций Использует Симуляцию модели Экспорта функций Редактора и Теста Расписания Используя диаграмму Stateflow.

  1. Задайте шаг расчета для выполнения симуляции. Щелкните правой кнопкой по блоку Inport вызова функции, затем выберите Block parameters.

  2. Выберите вкладку Signal Attributes. В поле Sample time введите дискретное время.

  3. Задайте приоритет блока для симуляции. Щелкните правой кнопкой по блоку Inport вызова функции, затем выберите Properties.

  4. В поле Priority введите приоритетное значение.

  5. Отобразите порядок выполнения блока для симуляции. На вкладке 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 вызова функции определить их относительный порядок выполнения, использующий следующие правила:

  1. Приоритет – более высокий приоритет (меньшее число) выполняется сначала

  2. Шаг расчета – меньший шаг расчета выполняется сначала

  3. Номер порта – меньший номер порта выполняется сначала

  4. Если OrderFunctionsByDependency параметр для модели устанавливается на 'on', блоки, которые имеют те же шаги расчета, далее сортируются на основе относительной зависимости по данным функций, с которыми соединяются блоки.

Видеть эффект OrderFunctionsByDependency параметр, рассмотрите следующую модель.

Three function-call subsystems, numbered 1, 2, and 3. Number 1 has sample time of 100 ms. Number 2 and Number 3 have sample time of 10 ms. The output of Number 3 is connnected to the input of Number 2. The Inport blocks driving Number 1, Number 2, and Number 3 are annotated with F2, F0 and F1, respectively.

Блок 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.

Three function-call subsystems, numbered 1, 2, and 3. Number 1 has sample time of 100 ms. Number 2 and Number 3 have sample time of 10 ms. The output of Number 3 is connnected to the input of Number 2. The Inport blocks driving Number 1, Number 2, and Number 3 are annotated with F2, F1 and F0, respectively.

Обратите внимание на то, что OrderFunctionsByDependency параметр влияет только на модель, для которой он установлен. Параметр не распространяет в модели, на которые ссылаются.

Когда два блока имеют различные значения для параметра Priority, блок с более высоким приоритетом выполняется сначала. Если параметр Priority равен, блок с более быстрым уровнем (меньший шаг расчета) выполняется сначала. Если Priority и шаг расчета являются тем же самым для обоих из блоков, блок с номером нижнего порта выполняется сначала. Исключение - когда зависимость по данным существует между блоками и OrderFunctionsByDependency установлен в 'on', в этом случае зависимый блок выполняется после блока, от которого он зависит.

Примечание

Когда режим симуляции топ-модели является акселератором или быстрым акселератором, Simulink не выполняет проверки симуляции во время выполнения для порядка выполнения вызова функции корневого уровня блоки Inport в моделях экспорта функций, на которые ссылаются.

Предположим, что модель экспорта функций имеет пять вызовов функции корневого уровня блоки Inport, к E, со свойствами блока как показано в таблице. Блоки не имеют никаких зависимостей по данным или OrderFunctionsByDependency установлен в 'off'. Чтобы определить их относительный порядок выполнения, Simulink сравнивает их параметры Priority, шаги расчета (если отличный и ненаследованный), и номера портов.

Блок Inport вызова функции корневого уровняABCDE
Приоритет1030404030
Размер шага–10.20.10.1–1
Номер порта54321
  • Блок 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 вызова функции, можно также создать несколько экземпляров модели.

  1. Задайте свой алгоритм с моделью, которая содержит блок Trigger. Установите Trigger type на function-call.

  2. Сошлитесь на модель от блока Model . Результатом является модель вызова функции.

  3. Соедините блок Inport вызова функции и установите флажок Output function call. Добавьте Inport сигнала и блоки Outport. Обновите модель (Ctrl-D). Результатом является модель экспорта функций с моделью вызова функции.

  4. Скопируйте блоки модели, на которые ссылаются, и блокировки порта, чтобы создать второй экземпляр модели. Эти два экземпляра вызваны различным вызовом функции корневого уровня блоками Inport в различных задачах.

Модели экспорта функций и модели с асинхронными входными параметрами вызова функции

Поддержка модели экспорта функций доступна для моделей с асинхронными входными портами вызова функции. Вы используете эти модели, в основном, в окружении Simulink, где планировщик Simulink вызывает функции.

Характеристика сравненияМодели экспорта функцийМодели с асинхронными входными параметрами вызова функции
ОпределениеЭти модели имеют вызов функции корневого уровня блоки Inport, которые не соединяются с блоком Asynchronous Task Specification. Эти Inport блокирует триггерные подсистемы вызова функций или модели вызова функции (блок Model с блоком Trigger).Эти модели имеют вызов функции корневого уровня блоки Inport, соединенные с блоками Asynchronous Task Specification. Эти Inport блокирует триггерные подсистемы вызова функций или модели вызова функции.
Блоки корневого уровняТолько блоки, выполняющиеся в контексте вызова функции, позволены на корневом уровне.Блоки, выполняющиеся в контексте невызова функции, также позволены.
Передача данныхИспользуйте индикаторы передачи данных, чтобы интерпретировать результаты симуляции. Передача данных в моделях экспорта функций не защищена по умолчанию в сгенерированном коде. Для получения дополнительной информации смотрите, Фиксировал Входные данные для Подсистем вызова функций.Используйте блоки Rate Transition, чтобы защитить данные, переданные между подсистемами вызова функций, запускающимися на различных уровнях. Для получения дополнительной информации смотрите Переход Уровня.
Поддержка симуляцииЭти модели поддерживают автономную симуляцию и симуляцию тестовой модели во всех режимах симуляции.Эти модели поддерживают симуляцию тестовой модели во всех режимах симуляции и автономную симуляцию в Нормальном, Акселераторе и Быстрых Режимах Accelerator.
Поддержка генерации кодаТоп-модель и автономная генерация кода поддерживаются.Топ-модель и автономная генерация кода поддерживаются.

Смотрите также

Блоки

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте