Вызывающие абоненты функции Simulink: блок Function Caller, блок MATLAB Function, диаграмма Stateflow

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, чтобы отправить данные через входной параметр в блок Simulink Function и получить данные назад от функции через выходной аргумент.

  1. Добавьте блок Function Caller к модели.

  2. Откройте диалоговое окно Function Caller. В Function prototype поле введите y = timestwo(x). Этот прототип функции создает вход порт x и выходной порт y на блоке Function Caller.

    Примечание

    При вводе в пустое текстовое поле отображается список ранее созданных прототипов функций, соответствующих вводимому тексту.

  3. Добавьте и установите блок Simulink Function, как описано в Создании функции Simulink, используя Блок Функции Simulink.

    Примечание

    Функция и имена аргумента для блока Simulink Function и Function prototype для блока Function Caller должны точно совпадать.

Протестируйте вызов функции

  1. Добавьте блок Sine Wave, чтобы предоставить тестовые данные для входа и блок Scope, чтобы просмотреть результаты из выхода.

  2. Запустите симуляцию. Значение входа синусоиды с амплитудой 2 увеличивается в два раза.

Используйте блок MATLAB Function, чтобы вызвать блок Simulink Function

Настройте блок MATLAB Function, чтобы отправить данные через входной параметр в блок Simulink Function и получить данные назад от функции через выходной аргумент.

  1. Добавьте блок MATLAB Function к модели.

  2. Дважды кликните блок, который открывает MATLAB® редактора. Введите вызов функции y1 = timestwo(x1).

    Примечание

    Имена аргумента для функции, которую вы задаете в блоке MATLAB Function, не должны совпадать с именами аргумента для функции, которую вы задаете с блоком Simulink Function. Для блока Function Caller, который вызывает блок Simulink Function, имена аргумента должны совпадать.

    Примечание

    Блоки MATLAB Function поддерживают только дискретные и минорные шаги расчета.

  3. Добавьте и установите блок Simulink Function, как описано в Создании функции Simulink, используя Блок Функции Simulink.

Протестируйте вызов функции

  1. Добавьте блок Sine Wave, чтобы предоставить тестовые данные для входа и блок Scope, чтобы просмотреть результаты из выхода.

  2. Для блока Sine Wave установите Sample time равным 0.01. Для модели откройте диалоговое окно Параметры конфигурации (Configuration Parameters) на панели решателя. Установите Type значение Fixed-step и Fixed-step size к 0.01.

  3. Запустите симуляцию.

Используйте диаграмму Stateflow, чтобы вызвать блок Simulink Function

Настройте диаграмму Stateflow, чтобы отправить данные через входной параметр в блок Simulink Function и получить данные назад от функции через выходной аргумент.

  1. Добавьте диаграмму Stateflow к модели Simulink. Дважды кликните по Диаграмме Simulink. В поле поиска введите chartи затем из результатов поиска выберите Chart.

  2. Дважды кликните график, чтобы открыть его.

  3. На левой панели инструментов щелкните значок перехода по умолчанию и перетащите его на график.

  4. Добавьте порт входа к графику. Откройте Model Explorer. На левой панели выберите Chart. В меню выберите Add > Data. Установите Name значение x1 и Scope к Input.

    Примечание

    Имена аргумента для функции, заданные в диаграмме Stateflow, не должны совпадать с именами аргумента для функции, которую вы задаете с Simulink Function блоком. Для блока Function Caller, который вызывает блок Simulink Function, имена аргумента должны совпадать.

  5. Добавьте порт выхода к графику. В меню выберите Add > Data. Установите Name значение y1 и Scope к Output.

  6. Добавьте блок Sine Wave и соедините выход сигнала с входным портом графика. Добавьте блок Scope и соедините вход с выходным портом графика.

  7. Измените код перехода, чтобы вызвать функцию. Для примера, чтобы вызвать Simulink Function блок, введите:

    {y1=timestwo_sf(x1);}

    Примечание

    Входные сигналы на диаграмму Stateflow могут быть непрерывными или дискретными.

  8. Добавьте и установите блок Simulink Function, как описано в Создании функции Simulink, используя Блок Функции Simulink.

Протестируйте вызов функции

  1. Добавьте блок Sine Wave, чтобы предоставить тестовые данные для входа и блок Scope, чтобы просмотреть результаты из выхода.

  2. Для блока Sine Wave установите Sample time равным 0.01. Для модели откройте диалоговое окно Параметры конфигурации (Configuration Parameters) на панели решателя. Установите Type значение Fixed-step и Fixed-step size к 0.01.

  3. Запустите симуляцию.

Вызовите блок Simulink Function из нескольких сайтов

Если вы вызываете блок 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.

См. также

Блоки

Похожие темы