Функция 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
строка в соответствии со столбцом Размера, чтобы установить размер vals
к 4
.
В панели Model Hierarchy Model Explorer выберите функциональный stdevstats
и повторите предыдущий шаг.
В панели Model Hierarchy Model Explorer выберите Chart
и добавьте следующие данные:
Имя | Осциллограф | Размер |
---|---|---|
|
| 4 |
|
| Скаляр (никакое изменение) |
|
| Скаляр (никакое изменение) |
Необходимо теперь видеть следующие данные в Model Explorer.
После того, как вы добавляете данные invals
среднее значение
, и 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
сумма
функция, поддерживаемая для генерации кода. 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;
Сохраните модель снова.