Функция Simulink® является вычислительным модулем, который вычисляет набор выходных параметров, когда предоставлено набор входных параметров. Функциональный заголовок использует обозначение, похожее на языки программирования, такие как MATLAB® и C++. Можно задать и реализовать функцию Simulink несколькими способами:
Функциональный блок Simulink — Функция, определяемая с помощью блоков Simulink в блоке Simulink Function.
Экспортируемая графическая функция Stateflow® — Функция, определяемая с изменениями состояния в диаграмме Stateflow, и затем экспортируемый в модель Simulink.
Экспортируемая функция MATLAB Stateflow — Функция, определяемая с операторами языка MATLAB в диаграмме Stateflow, и затем экспортируемый в модель Simulink.
S-функция — Функция, определяемая с помощью блока S-function. Для примера с S-функцией откройте sfcndemo_simulinkfunction_getset
.
Вызывающая сторона функции Simulink вызывает выполнение функции Simulink отовсюду в иерархии модели или графика.
Функциональный блок Caller — Вызов функция, определяемая в Simulink или экспортируемый из Stateflow. Смотрите ссылку блока Function Caller.
Переход диаграммы Stateflow — В диаграмме Stateflow, вызовите функцию, определяемую в Simulink или экспортируемый из Stateflow.
Блок MATLAB function — Вызывает функцию из скрипта языка MATLAB.
Блок s-function — Вызов функция с помощью системных методов. Смотрите ssDeclareFunctionCaller
и ssCallSimulinkFunction
.
Блок MATLAB System — Вызов функция с помощью Системного объекта и языка MATLAB.
В дополнение к Argument Inport и блокам Argument Outport , блок Simulink Function может взаимодействовать через интерфейс к сигналам в окружении блока через блоков Outport или Inport. Эти сигналы скрыты от вызывающей стороны. Можно использовать блокировки порта, чтобы соединиться и связаться между двумя блоками Simulink Function или подключением к корневому Inport и блоками Outport, которые представляют внешний ввод-вывод.
Можно также соединить блоки Outport, чтобы снизить блоки, которые включают логгирование (To File, To Workspace) и просмотр (Scope, Display) блоки. Однако эти блоки выполняются в последний раз после всех других блоков.
Блок Simulink Function может вывести событие вызова функции с блоком Outport.
Используйте функции, когда вам будет нужна допускающая повторное использование логика через иерархию модели. Рассмотрите пример, где Функция Simulink с допускающей повторное использование логикой задана в диаграмме Stateflow.
Можно переместить допускающую повторное использование логику из диаграммы Stateflow к Функциональному блоку Simulink. Логика является затем допускающей повторное использование функциональными вызывающими сторонами в Подсистемах Simulink (Подсистема и блоки Model) и в диаграммах Stateflow на любом уровне в иерархии модели.
Результатом является добавленная гибкость для структурирования вашей модели для повторного использования.
Примечание
Имена аргумента ввода и вывода (x2
, y2
) для того, чтобы вызвать функцию от диаграммы Stateflow не должны совпадать с именами аргумента в прототипе функции (u
Y
) из Функционального блока Simulink.
Прототип функции для блока 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 использования как общий интерфейс между несколькими компьютерами и одной диаграммой 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, но Функциональные блоки Simulink имеют другие преимущества.
Устраните маршрутизацию сигнальных линий. Блок Function Caller позволяет вам выполнять функции, определяемые с Функциональным блоком Simulink без соединяющейся сигнальной линии. Кроме того, функции и их вызывающие стороны могут находиться в различных моделях или подсистемах. Этот подход устраняет проблемы маршрутизации сигнала через иерархическую структуру модели и позволяет большее повторное использование компонентов модели.
Используйте несколько вызывающих сторон для той же функции. Несколько Функциональная Вызывающая сторона блокируется, или диаграммы Stateflow могут вызвать ту же функцию. Если функция содержит состояние (e.g., блок Unit Delay), состояние совместно используется различными вызывающими сторонами.
Интерфейс отдельной функции из функционального определения. Функции разделяют свой интерфейс (аргументы ввода и вывода) от их реализации. Поэтому можно задать функцию с помощью Функционального блока Simulink, экспортируемой графической функции из Stateflow или экспортируемой функции MATLAB из Stateflow. Вызывающая сторона не должна знать, как или где функция была реализована.
Фактор для использования блока Simulink Function или блока Subsystem имеет отношение к общему состоянию между вызовами функции. Блок Simulink Function имеет общее состояние, в то время как блок Subsystem, даже если заданный как допускающая повторное использование функция, не делает.
Для блока Simulink Function, когда один блок имеет несколько вызывающих сторон, код всегда генерируется для одной функции. Если Функциональный блок Simulink содержит блоки с состоянием (например, Задержка или Память), состояние является персистентным и разделяемым между функциональными вызывающими сторонами. В этом случае порядок вызовов является важным соображением.
Для блока Subsystem, когда блок имеет несколько экземпляров и сконфигурирован как допускающая повторное использование функция, код обычно генерируется для одной функции как оптимизация. Если блок Subsystem содержит блоки с состоянием, код все еще сгенерирован для одной функции, но различная переменная состояния передается функции. Состояние не совместно используется экземплярами.
Функциональные блоки Simulink позволяют вам реализовывать функции графически, но иногда использование Функционального блока Simulink не является лучшим решением.
Например, при моделировании ПИД-регулятора или цифровой фильтр и вы должны смоделировать уравнения, задающие динамическую систему. Используйте S-функцию, Подсистему или блок Model, чтобы реализовать системы уравнений, но не используйте Функциональный блок Simulink, потому что эти условия могут произойти:
Персистентность состояния между вызовами функции. Если Функциональный блок Simulink содержит какие-либо блоки с состоянием (например, Unit Delay или Память), то их значения состояния являются персистентными между вызовами функции. Если существуют множественные вызовы этой функции, значения состояния являются также персистентными между вызовами, происходящими от различных вызывающих сторон.
Наследование времени непрерывной выборки. Функциональный блок Simulink не может наследовать время непрерывной выборки. Поэтому не используйте этот блок в системах, которые используют времена непрерывной выборки, чтобы смоделировать непрерывные системные уравнения.
Визуально отобразите связи между функцией Simulink и их вызывающими сторонами с линиями, которые соединяют вызывающие стороны с функциями:
При превращении линий трассировки включения - выключения — На вкладке Debug, выберите Information Overlays . От выпадающего поля выберите Function Connectors .
Направление трассировки линий — Линии, соединенные в нижней части блока, от функциональной вызывающей стороны. Линии, соединенные наверху блока, к функции Simulink или подсистеме, содержащей функцию.
Навигация к функциям — функциональная вызывающая сторона может быть в подсистеме.
Перейдите от вызывающей стороны в подсистеме к функции путем открытия сначала подсистемы, и затем щелчка по ссылке к функции.
Если функция на корневом уровне модели, функция открывается. Если функция в подсистеме, подсистема, содержащая функцию, открывается.
После выбора Function Connectors, модели slexPrinterExample
показывает отношения между вызывающими сторонами и функциями.
В этом примере, Функциональной Вызывающей стороне в блоке Simulink Function addPrintJob
, вызывает экспортируемую функцию Stateflow queuePrintJob
. Субдиаграмма Busy
вызывает Функциональный блок Simulink printerInk
. Прослеживающие линии вовлечены и из диаграммы Stateflow.
Используйте анимацию, чтобы подсветить вызовы функции.
Этот пример показывает тихий из анимированного вызова функции Simulink.
К анимации доступа, в панели инструментов, на вкладке Debug, в разделе Event Animation, устанавливает скорость анимации на Slow
Средняя
, или Fast
.
Event Animation отображается, когда у вас есть блоки события в вашей модели, такие как блоки из сообщений & библиотеки Events, диаграмм Stateflow, блоков Function-Call Subsystem, функций Simulink или блоков SimEvents®.