Program a MATLAB Function in a Chart

A MATLAB® function in a Stateflow® chart is a graphical element that you use to write algorithms that are easier to
implement by calling built-in MATLAB functions. This type of function is useful for coding algorithms that are more
easily expressed by using MATLAB instead of the graphical Stateflow constructs. For more information, see Reuse MATLAB Code by Defining MATLAB Functions.

Inside a MATLAB function, you can call these types of functions:

Local functions defined in the body of the MATLAB function.

Graphical, Simulink®, truth table, and other MATLAB functions in the chart.

Built-in MATLAB functions that support code generation. These functions generate C code
for building targets that conform to the memory and data type requirements of embedded
environments.

This example shows how to create a model with a Stateflow chart that calls two MATLAB functions, meanstats and stdevstats:

meanstats calculates the mean of the values in
vals.

stdevstats calculates a standard deviation for the values in
vals.

Build Model

Follow these steps:

Create a new model with the following blocks:

Save the model as call_stats_function_stateflow.

In the model, double-click the Chart block.

Drag two MATLAB functions into the empty chart using this icon from the toolbar:

A text field with a flashing cursor appears in the middle of each MATLAB function.

Label each function as shown:

You must label a MATLAB function with its signature. Use the following syntax:

[return_val1, return_val2,...] = function_name(arg1, arg2,...)

You can specify multiple return values and multiple input arguments, as shown in the
syntax. Each return value and input argument can be a scalar, vector, or matrix of
values.

Note

For MATLAB functions with only one return value, you can omit the brackets in the
signature label.

In the chart, draw a default transition into a terminating junction with this
condition action:

{
mean = meanstats(invals);
stdev = stdevstats(invals);
}

The chart should look something like this:

Tip

If the formal arguments of a function signature are scalars, verify that inputs
and outputs of function calls follow the rules of scalar expansion. For more
information, see Assign Values to All Elements of a Matrix.

In the chart, double-click the function meanstats to edit its
function body in the editor.

In the function editor, select Tools > Model Explorer to open the Model Explorer.

The function meanstats is highlighted in the Model
Hierarchy pane. The Contents pane displays the input
argument vals and output argument meanout. Both
are scalars of type double by default.

Double-click the vals row under the Size column to set the size of vals to
4.

Back in the chart, double-click the function stdevstats and
repeat the previous two steps.

Back in the Model Hierarchy pane of the Model Explorer, select
Chart and add the following data:

Name

Scope

Size

invals

Input

4

mean

Output

Scalar (no change)

stdev

Output

Scalar (no change)

You should now see the following data in the Model Explorer.

After you add the data invals, mean, and
stdev to the chart, the corresponding input and output ports appear
on the Stateflow block in the model.

Connect the Constant and Display blocks to the ports of the Chart block and save the
model.

Program MATLAB Functions

To program the functions meanstats and stdevstats,
follow these steps:

Open the chart in the model
call_stats_function_stateflow.

In the chart, open the function
meanstats.

The function editor appears with the header:

function meanout = meanstats(vals)

This header is taken from the function label in the chart. You can edit the header
directly in the editor, and your changes appear in the chart after you close the
editor.

The function length is an example of a built-in
MATLAB function that is supported for code generation. You can call this function
directly to return the vector length of its argument vals. When you
build a simulation target, the function length is implemented with generated C code.
Functions supported for code generation appear in Functions and Objects Supported for C/C++ Code Generation (MATLAB Coder).

The variable len is an example of implicitly declared local data.
It has the same size and type as the value assigned to it — the value returned by
the function length, a scalar double. To learn
more about declaring variables, see Data Definition Basics (MATLAB Coder).

The MATLAB function treats implicitly declared local data as temporary data, which
exists only when the function is called and disappears when the function exits. You can
declare local data for a MATLAB function in a chart to be persistent by using the persistent construct.

Enter this line to calculate the value of
meanout:

meanout = avg(vals,len);

The function meanstats stores the mean of vals
in the Stateflow data meanout. Because these data are defined for the
parent Stateflow chart, you can use them directly in the MATLAB function.

Two-dimensional arrays with a single row or column of elements are treated as
vectors or matrices in MATLAB functions. For example, in meanstats, the argument
vals is a four-element vector. You can access the fourth element of
this vector with the matrix notation vals(4,1) or the vector notation
vals(4).

The MATLAB function uses the functions avg and
sum to compute the value of mean.
sum is a function supported for code generation.
avg is a local function that you define later. When resolving
function names, MATLAB functions in your chart look for local functions first, followed by
functions supported for code generation.

Note

If you call a function that the MATLAB function cannot resolve as a local function or a function for code
generation, you must declare the function to be extrinsic.

Now enter this statement:

coder.extrinsic('plot');

Enter this line to plot the input values in
vals against their vector index.

plot(vals,'-+');

Recall that you declared plot to be an extrinsic function because
it is not supported for code generation. When the MATLAB function encounters an extrinsic function, it sends the call to the
MATLAB workspace for execution during simulation.

Now, define the local function avg, as
follows:

function mean = avg(array,size)
mean = sum(array)/size;

The header for avg defines two arguments,
array and size, and a single return value,
mean. The local function avg calculates the
average of the elements in array by dividing their sum by the value
of argument size.

This website uses cookies to improve your user experience, personalize content and ads, and analyze website traffic. By continuing to use this website, you consent to our use of cookies. Please see our Privacy Policy to learn more about cookies and how to change your settings.