MATLAB® функция в Stateflow® график является графическим элементом, который вы используете для записи алгоритмов, которые легче реализовать путем вызова встроенных функций MATLAB. Этот тип функции полезен для алгоритмов кодирования, которые легче выразить при помощи MATLAB вместо графических конструкций Stateflow. Для получения дополнительной информации см. «Повторное использование кода MATLAB путем определения функций MATLAB».
Внутри функции MATLAB можно вызвать следующие типы функций:
Локальные функции, заданные в теле функции MATLAB.
Графический, Simulink®, таблицу истинности и другие функции MATLAB на графике.
Встроенные функции MATLAB, которые поддержка генерацию кода. Эти функции генерируют код С для создания целевых объектов, которые соответствуют требованиям к памяти и типам данных встраиваемых окружений.
Внешние функции MATLAB, которые не поддерживают генерацию кода. Эти функции выполняются только в рабочем пространстве MATLAB во время симуляции модели. Для получения дополнительной информации смотрите Вызов внешних функций MATLAB в диаграммах Stateflow.
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
.
В модели дважды кликните блок Chart.
Перетащите две функции 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
.
На панели Contents отображается входной параметр vals
и выходной аргумент meanout
. Оба являются скалярами типа double
по умолчанию.
Дважды кликните vals
строка под столбцом Size, чтобы задать размер vals
на 4
.
На панели Model Hierarchy Model Explorer выберите функцию stdevstats
и повторите предыдущий шаг.
На панели < reservedrangesplaceholder1 > Model Explorer выберите Chart
и добавить следующие данные:
Имя | Возможности | Размер |
---|---|---|
|
| 4 |
|
| Скаляр (без изменений) |
|
| Скаляр (без изменений) |
Теперь вы должны увидеть следующие данные в Model Explorer.
После добавления данных invals
, mean
, и stdev
на графике соответствующие входные и выходные порты появляются на блоке Stateflow в модели.
Соедините блоки Constant и Display с портами блока Chart и сохраните модель.
Для программирования функций meanstats
и stdevstats
, выполните следующие шаги:
Откройте график в модели call_stats_function_stateflow
.
На графике откройте функцию meanstats
.
Редактор функций появляется с заголовком:
function meanout = meanstats(vals)
Этот заголовок берется из метки функции на графике. Вы можете редактировать заголовок непосредственно в редакторе, и ваши изменения появляются на графике после закрытия редактора.
В линии после заголовка функции введите:
%#codegen
The %#codegen
директива компиляции помогает обнаруживать нарушения синтаксиса и семантики во время компиляции в функциях MATLAB, поддерживаемых для генерации кода.
Введите пространство линий и этот комментарий:
% Calculates the statistical mean for vals
Добавьте линию:
len = length(vals);
Функция length
является примером встроенной функции MATLAB, которая поддерживается для генерации кода. Можно вызвать эту функцию непосредственно, чтобы вернуть длину вектора ее аргумента vals
. Когда вы строите цель симуляции, длина функции реализуется с помощью сгенерированного кода C. Функции, поддерживаемые для генерации кода, появляются в функциях и объектах, поддерживаемых для генерации кода C/C + + (MATLAB Coder).
Переменная len
является примером неявно объявленных локальных данных. Он имеет тот же размер и тип, что и назначенное ему значение - значение, возвращаемое функцией length
, а скаляр double
. Дополнительные сведения об объявлении переменных см. в разделе Основы определения данных (MATLAB Coder).
Функция MATLAB обрабатывает неявно объявленные локальные данные как временные данные, которые существуют только при вызове функции и исчезают при выходе функции. Можно объявить локальные данные для функции MATLAB на графике, чтобы быть постоянными при помощи persistent
конструировать.
Введите эту линию, чтобы вычислить значение meanout
:
meanout = avg(vals,len);
Функция meanstats
сохраняет среднее значение vals
в meanout
данных Stateflow. Поскольку эти данные определены для родительской диаграммы 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;
Сохраните модель еще раз.