Simulink® функции имеют интерфейс с входными и выходными аргументами, подобными языкам программирования. Вызывающие абоненты функции Simulink отправляют данные через входные параметры в функции Simulink, выполняют функцию, а затем получают данные обратно от функции через выходные аргументы. Вы можете вызвать функцию Simulink, используя:
Function Caller блоки
MATLAB Function блоки
Stateflow® чарты
В следующих разделах показано, как вызвать функцию Simulink. Функция y = timestwo(x)
умножает значение (x
) от вызывающего абонента по 2
, а затем отправляет вычисленное значение (y
) назад к вызывающему абоненту. Чтобы создать функции, смотрите функции Simulink: блок Simulink Function, экспортированные графические функции Stateflow и MATLAB.
Чтобы открыть завершенную модель с функциями Simulink и вызывающими функциями, смотрите ex_simulink_functions_and_function_callers
.
Настройте блок Function Caller, чтобы отправить данные через входной параметр в блок Simulink Function и получить данные назад от функции через выходной аргумент.
Добавьте блок Function Caller к модели.
Откройте диалоговое окно Function Caller. В Function prototype поле введите y = timestwo(x)
. Этот прототип функции создает вход порт x
и выходной порт y
на блоке Function Caller.
Примечание
При вводе в пустое текстовое поле отображается список ранее созданных прототипов функций, соответствующих вводимому тексту.
Добавьте и установите блок Simulink Function, как описано в Создании функции Simulink, используя Блок Функции Simulink.
Примечание
Функция и имена аргумента для блока Simulink Function и Function prototype для блока Function Caller должны точно совпадать.
Добавьте блок Sine Wave, чтобы предоставить тестовые данные для входа и блок Scope, чтобы просмотреть результаты из выхода.
Запустите симуляцию. Значение входа синусоиды с амплитудой 2
увеличивается в два раза.
Настройте блок MATLAB Function, чтобы отправить данные через входной параметр в блок Simulink Function и получить данные назад от функции через выходной аргумент.
Добавьте блок MATLAB Function к модели.
Дважды кликните блок, который открывает MATLAB® редактора. Введите вызов функции y1 = timestwo(x1)
.
Примечание
Имена аргумента для функции, которую вы задаете в блоке MATLAB Function, не должны совпадать с именами аргумента для функции, которую вы задаете с блоком Simulink Function. Для блока Function Caller, который вызывает блок Simulink Function, имена аргумента должны совпадать.
Примечание
Блоки MATLAB Function поддерживают только дискретные и минорные шаги расчета.
Добавьте и установите блок Simulink Function, как описано в Создании функции Simulink, используя Блок Функции Simulink.
Добавьте блок Sine Wave, чтобы предоставить тестовые данные для входа и блок Scope, чтобы просмотреть результаты из выхода.
Для блока Sine Wave установите Sample time равным 0.01
. Для модели откройте диалоговое окно Параметры конфигурации (Configuration Parameters) на панели решателя. Установите Type значение Fixed-step
и Fixed-step size к 0.01
.
Запустите симуляцию.
Настройте диаграмму Stateflow, чтобы отправить данные через входной параметр в блок Simulink Function и получить данные назад от функции через выходной аргумент.
Добавьте диаграмму Stateflow к модели Simulink. Дважды кликните по Диаграмме Simulink. В поле поиска введите chart
и затем из результатов поиска выберите Chart
.
Дважды кликните график, чтобы открыть его.
На левой панели инструментов щелкните значок перехода по умолчанию и перетащите его на график.
Добавьте порт входа к графику. Откройте Model Explorer. На левой панели выберите Chart
. В меню выберите Add > Data. Установите Name значение x1
и Scope к Input
.
Примечание
Имена аргумента для функции, заданные в диаграмме Stateflow, не должны совпадать с именами аргумента для функции, которую вы задаете с Simulink Function блоком. Для блока Function Caller, который вызывает блок Simulink Function, имена аргумента должны совпадать.
Добавьте порт выхода к графику. В меню выберите Add > Data. Установите Name значение y1
и Scope к Output
.
Добавьте блок Sine Wave и соедините выход сигнала с входным портом графика. Добавьте блок Scope и соедините вход с выходным портом графика.
Измените код перехода, чтобы вызвать функцию. Для примера, чтобы вызвать Simulink Function блок, введите:
{y1=timestwo_sf(x1);}
Примечание
Входные сигналы на диаграмму Stateflow могут быть непрерывными или дискретными.
Добавьте и установите блок Simulink Function, как описано в Создании функции Simulink, используя Блок Функции Simulink.
Добавьте блок Sine Wave, чтобы предоставить тестовые данные для входа и блок Scope, чтобы просмотреть результаты из выхода.
Для блока Sine Wave установите Sample time равным 0.01
. Для модели откройте диалоговое окно Параметры конфигурации (Configuration Parameters) на панели решателя. Установите Type значение Fixed-step
и Fixed-step size к 0.01
.
Запустите симуляцию.
Если вы вызываете блок Simulink Function из нескольких сайтов, все сайты вызовов имеют общее состояние функции. Например, предположим, что у вас есть диаграмма Stateflow с двумя вызовами и двумя блоками Function Caller с вызовами одной и той же функции.
Функция, заданная с помощью блока Simulink Function, является счетчиком, который увеличивается на 1
каждый раз, когда он вызывается с входом 1
.
Блок Unit Delay имеет состояние, потому что значение блока является постоянным между вызовами из двух блоков Function Caller и диаграммы Stateflow. Концептуально можно представить, что эта функция реализуется в коде MATLAB:
function y = counter(u) persistent state; if isempty(state) state = 0; end y = state; state = state + u;
Simulink инициализирует значение состояния Unit Delay блока в начале симуляции. После этого каждый раз, когда функция вызывается, значение состояния обновляется.
В этом примере выход, наблюдаемый в Scope1, увеличивается на 4
на каждом временном шаге. Scope2, Scope3 и Scope4 показывают подобное поведение. Единственным различием является сдвиг наблюдаемого сигнала из-за последовательности выполнения вызовов функции.
Для нескольких вызывающих абонентов, которые совместно используют функцию и имеют различные частоты шага расчета, целостность данных и согласованность кода в реальном времени могут быть проблемой. Рассмотрите контроль серьезности диагностики.
Выберите решатель Fixed-step. Установите значение Treat each discrete rate as a separate task на:
Очистить (однозадачность), а затем задать Single task rate transition параметр none
(по умолчанию), warning
, или error
.
Выберите (многозадачность), а затем установите Multitask rate transition параметр равным error
(по умолчанию) или warning
.