Этот пример показывает, как создать модель с графиком 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); }
График должен выглядеть примерно так:
Если формальные аргументы функциональной подписи являются скалярами, проверяют, что вводы и выводы вызовов функции следуют правилам скалярного расширения. Для получения дополнительной информации смотрите Как Скалярные работы Расширения для Функций.
В графике дважды кликните функциональный meanstats
, чтобы отредактировать его тело функции в редакторе.
В функциональном редакторе выберите Tools> Model Explorer, чтобы открыть Model Explorer.
Функциональный meanstats
подсвечен в панели Model Hierarchy. Панель Contents отображает входной параметр vals
и выходной аргумент meanout
. Оба - скаляры типа double
по умолчанию.
Дважды кликните строку vals
в соответствии со столбцом Размера, чтобы установить размер vals
к 4
.
Назад в графике, дважды кликните функциональный stdevstats
и повторите предыдущие два шага.
Назад в панели Model Hierarchy Model Explorer, выберите Chart и добавьте следующие данные:
Имя | Осциллограф | Размер |
---|---|---|
|
| 4 |
|
| Скаляр (никакое изменение) |
|
| Скаляр (никакое изменение) |
Необходимо теперь видеть следующие данные в Model Explorer.
После того, как вы добавите данные invals
, mean
и stdev
к графику, соответствующие порты ввода и вывода появляются на блоке Stateflow в модели.
Соедините Постоянные блоки и блоки Отображения к портам блока Chart и сохраните модель.
Чтобы программировать функции 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 Coder).
Переменная len
является примером неявно заявленных локальных данных. Это имеет тот же размер и тип как значение, присвоенное ему — значение, возвращенное функциональным length
, скалярным double
. Чтобы узнать больше об объявлении переменных, смотрите Основы Определения данных (MATLAB Coder).
Функция 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;
Сохраните модель снова.