Simulink® функции имеют интерфейс с аргументами ввода и вывода, похожими на языки программирования. Вызывающие стороны функции Simulink отправляют данные через входные параметры к функциям Simulink, выполняют функцию, и затем получают данные назад от функции до выходных аргументов. Можно вызвать использование функции Simulink:
Блоки Function Caller
Блоки MATLAB Function
Stateflow® графики
Следующие разделы показывают, как вызвать функцию Simulink. Функциональный y = timestwo(x)
умножает значение (x
) от вызывающей стороны 2
, и затем отправляет расчетное значение (y
) назад вызывающей стороне. Чтобы создать функции, смотрите, Добавляет Функция Simulink к Модели.
Чтобы открыть завершенную модель с функциями 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 и вход connect к выходному порту графика.
Отредактируйте код перехода, чтобы вызвать функцию. Например, чтобы вызвать блок 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
.
Выберите (многозадачность), и затем set Multitask rate transition параметр к error
(значение по умолчанию) или warning
.