Simulink® функция является вычислительным модулем, который вычисляет набор выходов, когда обеспечен набором входов. Заголовок функции использует обозначение, подобную языкам программирования, таким как MATLAB® и C++. Можно задать и реализовать функцию Simulink несколькими способами:
Блок Simulink Function - Функция, заданная с использованием блоков Simulink в Simulink Function блоке.
Экспортированный Stateflow® графическая функция - Функция, заданная с переходами состояний в диаграмме Stateflow, и затем экспортированная в модель Simulink.
Экспортированная функция Stateflow MATLAB - Функция, заданная с помощью Языка MATLAB выражений в диаграмме Stateflow, и затем экспортированная в модель Simulink.
S-функция - Функция, заданная с использованием блока S-function. Для примера с S-функцией откройте sfcndemo_simulinkfunction_getset
.
Вызывающий функцию Simulink вызывает выполнение функции Simulink из любого места в иерархии модели или графика.
Function Caller block - Вызов функции, заданной в Simulink или экспортированной из Stateflow. См. Function Caller блок ссылки.
Переход диаграммы Stateflow - на диаграмме Stateflow вызовите функцию, заданную в Simulink или экспортированную из Stateflow.
Блок MATLAB function - Вызов функции из языкового скрипта MATLAB.
Блок S-Function - Вызов функции с помощью системных методов. Посмотрите ssDeclareFunctionCaller
и ssCallSimulinkFunction
.
Системный блок MATLAB - Вызов функции с использованием Системного объекта и языка MATLAB.
В дополнение к Argument Inport и Argument Outport блокам Simulink Function блок может взаимодействовать с сигналами в локальном окружении блока через Inport или Outport блоки. Эти сигналы скрыты от вызывающего абонента. Можно использовать блоки портов для соединения и связи между двумя блоками Simulink Function или соединения с корневыми Inport и блоками Outport, которые представляют внешние вводы-выводы .
Можно также соединить блоки Outport с блоками-приемниками, которые включают логгирования (To File, To Workspace) и просмотра (Scope, Display). Однако эти блоки выполняются последним после всех других блоков.
Блок Simulink Function может выводить событие вызова функции в блок Outport.
Используйте функции, когда вам нужна переиспользуемая логика между иерархией модели. Рассмотрим пример, где Функция Simulink с переиспользуемой логикой задана на диаграмме Stateflow.
Можно переместить переиспользуемую логику из диаграммы Stateflow в блок Simulink Function. Затем логика переиспользуется вызывающими функциями в подсистемах Simulink (подсистема и Блоки Model) и в диаграммах Stateflow на любом уровне иерархии модели.
Результатом является добавленная гибкость для структурирования вашей модели для повторного использования.
Примечание
Входы и выходных аргументов (x2
, y2
) для вызова функции из диаграммы Stateflow не должны совпадать с именами аргумента в прототипе функции (u
, y
) блока Simulink Function.
Прототип функции для блока Simulink Function может иметь одинаковые входные и выходные аргументы. Для примера функция, которая фильтрует шум, может ввести сигнал, а затем вернуть сигнал после фильтрации.
mySignal = filter(mySignal)
Можно вызвать функцию с Function Caller блоком и добавить шум к тестовому сигналу, чтобы проверить алгоритм функции.
При генерации кода для этой модели входной параметр для блока Simulink Function передает указатель на сигнал, а не копию значения сигналов.
void filter(real_T *rtuy_mySignal) { . . .
*rtuy_mySignal = model_P.DiscreteFilter_NumCoef * DiscreteFilter_tmp; }
Используйте функции, когда вы моделируете общий ресурс, такой как принтер. Модель slexPrinterExample
использует блоки Simulink Function как общий интерфейс между несколькими компьютерами и одной диаграммой Stateflow, которая моделирует процесс принтера.
Функциональный интерфейс использует синтаксис MATLAB, чтобы задать имя функции и ее входные и выходные аргументы. Иерархия модели может содержать только одно определение функции с идентифицированным именем функции. Simulink проверяет, что:
Аргументы в параметре Function prototype для блока Function Caller совпадают с аргументами, заданными в функции. Например, функция с двумя входными параметрами и одним выходным аргументом появляется как:
y = MyFunction(u1, u2)
Тип данных, размерность и сложность аргументов должны совпадать. Для блока Function Caller можно задать параметры Input argument specifications и Output argument specifications, но обычно вам не нужно задавать эти параметры вручную. Simulink выводит спецификацию из функции.
Единственный случай, когда вы должны задать параметры аргумента, это когда блок Function Caller не может найти функцию в модели или в любой дочерней модели, на которую он ссылается. Эта ситуация может произойти, когда блок Function Caller и вызываемая функция находятся в отдельных моделях, на которые ссылается общая родительская модель. Смотрите Функциональные блоки Simulink в ссылочных моделях и Спецификацию аргументов для Функциональных блоков Simulink.
Подсистемы вызова функций с прямыми сигнальными соединениями для запуска обеспечивают лучшую трассируемость сигнала, чем блоки Simulink Function, но блоки Simulink Function имеют другие преимущества.
Исключить маршрутизацию сигнальных линий. Блок Function Caller позволяет вам выполнять функции, заданные блоком Simulink Function без соединительной сигнальной линии. В сложении функции и их вызывающие абоненты могут находиться в различных моделях или подсистемах. Этот подход устраняет проблемы маршрутизации сигналов через иерархическую структуру модели и позволяет больше повторно использовать компоненты модели.
Используйте несколько вызывающих абонентов для одной и той же функции. Несколько блоков Function Caller или диаграммы Stateflow могут вызвать одну и ту же функцию. Если функция содержит состояние (например, блок Unit Delay), то это состояние совместно используется различными вызывающими абонентами.
Отделите интерфейс функции от определения функции. Функции отделяют их интерфейс (входные и выходные аргументы) от их реализации. Поэтому можно задать функцию с помощью блока Simulink Function, экспортированной графической функции из Stateflow или экспортированной функции MATLAB из Stateflow. Вызывающий абонент не должен знать, как или где была реализована функция.
Фактор использования блока Simulink Function или блока Subsystem связан с общим состоянием между вызовами функций. Блок Simulink Function имеет общее состояние, а блок Subsystem, даже если он задан как переиспользуемая функция, - нет.
Для блока Simulink Function, когда один блок имеет несколько вызывающих абонентов, код всегда генерируется для одной функции. Если блок Simulink Function содержит блоки с состоянием (для примера, Delay или Памяти), состояние является постоянным и общим между вызывающими функциями. В этом случае порядок вызовов является важным фактором.
Для блока Subsystem, когда блок имеет несколько образцы и сконфигурирован как переиспользуемая функция, код обычно генерируется для одной функции как оптимизация. Если блок Subsystem содержит блоки с состоянием, код все еще генерируется для одной функции, но в функцию передается другая переменная состояния. Состояние не разделяется между образцами.
Блоки Simulink Function позволяют реализовать функции графически, но иногда использование блока Simulink Function является не лучшим решением.
Для примера при моделировании ПИД-регулятора или цифрового фильтра и вы должны смоделировать уравнения, определяющие динамическую систему. Используйте S-Функцию, Подсистему или Блок Model для реализации систем уравнений, но не используйте блок Simulink Function, потому что могут возникнуть эти условия:
Постоянство состояния между вызовами функций. Если блок Simulink Function содержит любые блоки с состоянием (для примера, Unit Delay или Памяти), то их значения состояний являются постоянными между вызовами функции. При наличии нескольких вызовов этой функции значения состояния также являются постоянными между вызовами, исходящими от различных вызывающих абонентов.
Наследование непрерывного шага расчета. Блок Simulink Function не может наследовать непрерывный шаг расчета. Поэтому не используйте этот блок в системах, которые используют непрерывные шаги расчета для моделирования непрерывных системных уравнений.
Визуальное отображение соединений между функцией Simulink и их вызывающими абонентами с помощью линий, соединяющих вызывающих абонентов с функциями:
Включение/выключение линий трассировки - На вкладке Debug выберите Information Overlays. В раскрывающемся списке выберите Function Connectors.
Направление линий трассировки - Линии, соединенные в нижней части блока, поступают от вызывающего абонента функции. Линии, соединенные в верхней части блока, являются функцией Simulink или подсистемой, содержащей функцию.
Переход к функциям - Вызывающий абонент функции может находиться в подсистеме.
Для перехода от вызывающего абонента в подсистеме к функции сначала откройте подсистему, а затем щелкните ссылку на функцию.
Если функция находится на корневом уровне модели, функция открывается. Если функция находится в подсистеме, откроется подсистема, содержащая функцию.
После выбора Function Connectors модель slexPrinterExample
показаны отношения между вызывающими и функциями.
В этом примере Function Caller в блоке Simulink Function addPrintJob
, вызывает экспортированную функцию Stateflow queuePrintJob
. Область субдиаграммы Busy
вызывает блок Simulink Function printerInk
. Линии трассировки рисуются в и вне диаграммы Stateflow.
Используйте анимацию для подсветки вызовов функций.
В этом примере показан еще один анимированный вызов функции Simulink.
Для доступа к анимации на панели инструментов, на вкладке Debug, в разделе Event Animation, установите скорость анимации равной Slow
, Medium
, или Fast
.
Event Animation видим, когда у вас в модели есть блоки событий, такие как блоки из библиотеки Messages & Events, диаграммы Stateflow, блоки Function-Call Subsystem, функции Simulink или SimEvents® блоки.