Функция MATLAB ® в диаграмме Stateflow ® является графическим элементом, который используется для написания алгоритмов, которые легче реализовать путем вызова встроенных функций MATLAB. Этот тип функций полезен для алгоритмов кодирования, которые легче выразить с помощью MATLAB вместо графических конструкций Stateflow. Дополнительные сведения см. в разделе Повторное использование кода MATLAB путем определения функций MATLAB.
Внутри функции MATLAB можно вызвать следующие типы функций:
Локальные функции, определенные в теле функции MATLAB.
Графическая, Simulink ®, таблица истинности и другие функции MATLAB на диаграмме.
Встроенные функции MATLAB, поддерживающие генерацию кода. Эти функции генерируют код C для построения целей, соответствующих требованиям к памяти и типу данных встроенных сред.
Внешние функции MATLAB, не поддерживающие генерацию кода. Эти функции выполняются только в рабочей области MATLAB во время моделирования модели. Дополнительные сведения см. в разделе Вызов внешних функций MATLAB в диаграммах потока состояний.
Simulink Design Verifier™ функции для проверки свойств и создания тестов. К этим функциям относятся:
sldv.prove (Simulink Design Verifier)
sldv.assume (Simulink Design Verifier)
sldv.test (Simulink Design Verifier)
sldv.condition (Simulink Design Verifier)
В этом примере показано, как создать модель с диаграммой Stateflow, которая вызывает две функции MATLAB. meanstats и stdevstats:
meanstats вычисляет среднее значение значений в vals.
stdevstats вычисляет стандартное отклонение для значений в vals.
Выполните следующие действия.
Создайте новую модель со следующими блоками:

Сохранить модель как call_stats_function_stateflow.
В модели дважды щелкните блок «Диаграмма».
Перетащите две функции MATLAB в пустую диаграмму, используя этот значок на панели инструментов:
![]()
В середине каждой функции MATLAB появляется текстовое поле с мигающим курсором.
Пометьте каждую функцию, как показано на рисунке:

Необходимо пометить функцию MATLAB своей подписью. Используйте следующий синтаксис:
[return_val1, return_val2,...] = function_name(arg1, arg2,...)
Можно указать несколько возвращаемых значений и несколько входных аргументов, как показано в синтаксисе. Каждое возвращаемое значение и входной аргумент могут быть скаляром, вектором или матрицей значений.
Совет
Для функций MATLAB, имеющих только одно возвращаемое значение, можно опустить скобки в метке подписи.
На диаграмме нарисуйте переход по умолчанию в конечное соединение со следующим действием условия:
{
mean = meanstats(invals);
stdev = stdevstats(invals);
}
Диаграмма должна выглядеть примерно так:

Совет
Если формальными аргументами сигнатуры функции являются скаляры, убедитесь, что входы и выходы вызовов функции соответствуют правилам скалярного расширения. Дополнительные сведения см. в разделе Назначение значений всем элементам матрицы.
На вкладке Моделирование (Modeling) в разделе Данные конструкции (Design Data) выберите Обозреватель моделей (Model Explorer).
На панели Иерархия модели (Model Hierarchy) Проводника моделей (Model Explorer) выберите функцию. meanstats.

На панели «Содержимое» отображается входной аргумент vals и выходной аргумент meanout. Оба являются скалярами типа double по умолчанию.
Дважды щелкните значок vals строка в столбце Размер (Size) для установки размера vals кому 4.
На панели Иерархия модели (Model Hierarchy) Проводника моделей (Model Explorer) выберите функцию. stdevstats и повторите предыдущий шаг.
На панели Иерархия модели (Model Hierarchy) Обозревателя моделей (Model Explorer) выберите Chart и добавьте следующие данные:
Имя | Объем | Размер |
|---|---|---|
|
| 4 |
|
| Скаляр (без изменений) |
|
| Скаляр (без изменений) |
Теперь в обозревателе моделей должны отображаться следующие данные.

После добавления данных invals, mean, и stdev на диаграмме соответствующие входной и выходной порты отображаются в блоке Stateflow модели.

Подключите блоки константы и отображения к портам блока диаграммы и сохраните модель.

Программирование функций meanstats и stdevstatsвыполните следующие действия:
Открытие диаграммы в модели call_stats_function_stateflow.
В диаграмме откройте функцию. meanstats.
Появится редактор функций с заголовком:
function meanout = meanstats(vals)
Этот заголовок берется из метки функции на диаграмме. Заголовок можно редактировать непосредственно в редакторе, а изменения отображаются в диаграмме после закрытия редактора.
В строке после заголовка функции введите:
%#codegen
%#codegen директива компиляции помогает обнаруживать нарушения синтаксиса и семантики во время компиляции в функциях MATLAB, поддерживаемых для генерации кода.
Введите строчное пространство и следующий комментарий:
% Calculates the statistical mean for vals
Добавьте строку:
len = length(vals);
Функция length является примером встроенной функции MATLAB, которая поддерживается для генерации кода. Эту функцию можно вызвать непосредственно для возврата длины вектора аргумента vals. При построении цели моделирования длина функции реализуется с помощью сгенерированного кода C. Функции, поддерживаемые для генерации кода, отображаются в окне Функции и объекты, поддерживаемые для генерации кода C/C + + (кодер MATLAB).
Переменная len является примером неявно объявленных локальных данных. Он имеет тот же размер и тип, что и присвоенное ему значение - значение, возвращаемое функцией length, скаляр double. Дополнительные сведения об объявлении переменных см. в разделе Основы определения данных (кодер MATLAB).
Функция MATLAB обрабатывает неявно объявленные локальные данные как временные данные, которые существуют только при вызове функции и исчезают при ее выходе. Локальные данные для функции MATLAB в диаграмме можно объявить постоянными с помощью persistent конструкция.
Введите эту строку для вычисления значения meanout:
meanout = avg(vals,len);
Функция meanstats сохраняет среднее значение vals в данных Stateflow meanout. Поскольку эти данные определены для родительской диаграммы Stateflow, их можно использовать непосредственно в функции MATLAB.
Двумерные массивы с одной строкой или столбцом элементов рассматриваются как векторы или матрицы в функциях MATLAB. Например, в meanstats, аргумент vals является четырехэлементным вектором. Можно получить доступ к четвертому элементу этого вектора с помощью матричной нотации vals(4,1) или векторная нотация vals(4).
Функция MATLAB использует эти функции. avg и sum для вычисления значения mean. sum - функция, поддерживаемая для генерации кода. avg - локальная функция, которая будет определена позже. При разрешении имен функций функции MATLAB на диаграмме сначала ищут локальные функции, а затем функции, поддерживаемые для генерации кода.
Примечание
При вызове функции, которую функция MATLAB не может разрешить как локальную функцию или функцию для генерации кода, необходимо объявить функцию внешней.
Теперь введите следующую инструкцию:
coder.extrinsic('plot');Введите эту строку для печати входных значений в vals против их векторного индекса.
plot(vals,'-+');
Напомним, что вы заявили plot быть внешней функцией, поскольку она не поддерживается для генерации кода. Когда функция MATLAB обнаруживает внешнюю функцию, она отправляет вызов в рабочую область MATLAB для выполнения во время моделирования.
Теперь определите локальную функцию avg, следующим образом:
function mean = avg(array,size) mean = sum(array)/size;
Заголовок для avg определяет два аргумента, array и sizeи одно возвращаемое значение, mean. Локальная функция avg вычисляет среднее значение элементов в array делением их суммы на значение аргумента size.
Полный код функции meanstats выглядит следующим образом:
function meanout = meanstats(vals)
%#codegen
% Calculates the statistical mean for vals
len = length(vals);
meanout = avg(vals,len);
coder.extrinsic('plot');
plot(vals,'-+');
function mean = avg(array,size)
mean = sum(array)/size;
Сохраните модель.
Вернитесь на диаграмму, откройте функцию stdevstats и добавьте код для вычисления стандартного отклонения значений в vals. Полный код должен выглядеть следующим образом:
function stdevout = stdevstats(vals) %#codegen % Calculates the standard deviation for vals len = length(vals); stdevout = sqrt(sum(((vals-avg(vals,len)).^2))/len); function mean = avg(array,size) mean = sum(array)/size;
Сохраните модель еще раз.