StateFlow UserGuide
StateFlow UserGuide
User's Guide
R2017a
How to Contact MathWorks
Phone: 508-647-7000
Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-10
v
States . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-7
What Is a State? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-7
State Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-7
State Decomposition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-9
State Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-10
Transitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-19
What Is a Transition? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-19
Transition Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-20
Transition Label Notation . . . . . . . . . . . . . . . . . . . . . . . . . . 2-21
Valid Transitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-23
vi Contents
History Junctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-46
What Is a History Junction? . . . . . . . . . . . . . . . . . . . . . . . . 2-46
History Junctions and Inner Transitions . . . . . . . . . . . . . . . 2-47
Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-48
What Is a Box? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-48
Example of Using a Box . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-48
vii
How Events Drive Chart Execution . . . . . . . . . . . . . . . . . . . 3-43
How Stateflow Charts Respond to Events . . . . . . . . . . . . . . 3-43
Sources for Stateflow Events . . . . . . . . . . . . . . . . . . . . . . . . 3-43
How Charts Process Events . . . . . . . . . . . . . . . . . . . . . . . . 3-44
viii Contents
Example of Early Return Logic . . . . . . . . . . . . . . . . . . . . . . 3-86
ix
Select and Deselect Graphical Objects . . . . . . . . . . . . . . . . . 4-38
Cut and Paste Graphical Objects . . . . . . . . . . . . . . . . . . . . 4-38
Copy Graphical Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-39
Comment Out Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-39
Format Chart Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-39
Generate a Model Report . . . . . . . . . . . . . . . . . . . . . . . . . . 4-54
x Contents
Build Mealy and Moore Charts
6
Overview of Mealy and Moore Machines . . . . . . . . . . . . . . . . 6-2
Semantics of Mealy and Moore Machines . . . . . . . . . . . . . . . 6-2
Model with Mealy and Moore Machines . . . . . . . . . . . . . . . . 6-3
Default State Machine Type . . . . . . . . . . . . . . . . . . . . . . . . . 6-3
Availability of Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-3
Advantages of Mealy and Moore Charts . . . . . . . . . . . . . . . . 6-3
xi
Create a History Junction . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-2
Change History Junction Size . . . . . . . . . . . . . . . . . . . . . . . . 7-3
Change History Junction Properties . . . . . . . . . . . . . . . . . . . 7-3
xii Contents
Export Chart-Level Functions . . . . . . . . . . . . . . . . . . . . . . . 7-35
Define Data
8
Add Stateflow Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-2
Add Data from the Stateflow Editor . . . . . . . . . . . . . . . . . . . 8-2
Add Data Through the Model Explorer . . . . . . . . . . . . . . . . . 8-3
xiii
Initialize Data from the MATLAB Base Workspace . . . . . . . 8-25
Save Data to the MATLAB Workspace . . . . . . . . . . . . . . . . 8-26
How Charts Work with Local and Global Data Stores . . . . 8-28
xiv Contents
Examples of Valid Data Size Expressions . . . . . . . . . . . . . . 8-47
Name Conflict Resolution for Variables in Size Expressions . 8-47
Best Practices for Sizing Stateflow Data . . . . . . . . . . . . . . . 8-47
Define Events
9
How Events Work in Stateflow Charts . . . . . . . . . . . . . . . . . . 9-2
What Is an Event? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-2
xv
When to Use Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-2
Types of Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-3
Where You Can Use Events . . . . . . . . . . . . . . . . . . . . . . . . . 9-3
Diagnostic for Detecting Unused Events . . . . . . . . . . . . . . . . 9-3
xvi Contents
Best Practices for Using Events in Stateflow Charts . . . . . 9-40
Messages
10
How Messages Work in Stateflow Charts . . . . . . . . . . . . . . . 10-2
xvii
Use Actions in Charts
11
State Action Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-2
Entry Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-4
Exit Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-4
During Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-4
Bind Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-5
On Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-6
xviii Contents
Time Symbol, t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-29
xix
How Sample Time Affects Chart Execution . . . . . . . . . . . . 11-70
Best Practices for Absolute-Time Temporal Logic . . . . . . . 11-71
xx Contents
Differences Between MATLAB and C as Action Language
Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-7
xxi
State Transition Table Operations . . . . . . . . . . . . . . . . . . . 13-16
Insert Rows and Columns . . . . . . . . . . . . . . . . . . . . . . . . . 13-16
Move Rows and Cells . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-17
Copy Rows and Transition Cells . . . . . . . . . . . . . . . . . . . . 13-17
Set Default State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-17
Add History Junction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-17
Print State Transition Tables . . . . . . . . . . . . . . . . . . . . . . 13-17
Select and Clear Table Elements . . . . . . . . . . . . . . . . . . . . 13-18
Undo and Redo Edit Operations . . . . . . . . . . . . . . . . . . . . 13-18
Zoom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-18
xxii Contents
Benefits of Using Atomic Subcharts . . . . . . . . . . . . . . . . . . . 14-5
Comparison of Modeling Methods . . . . . . . . . . . . . . . . . . . . 14-5
Comparison of Simulation Methods . . . . . . . . . . . . . . . . . . . 14-6
Comparison of Editing Methods . . . . . . . . . . . . . . . . . . . . . 14-7
Comparison of Code Generation Methods . . . . . . . . . . . . . . 14-7
xxiii
Reduce the Compilation Time of a Chart . . . . . . . . . . . . . . 14-48
Goal of the Tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-48
Edit a Model to Use Atomic Subcharts . . . . . . . . . . . . . . . 14-49
xxiv Contents
Modify SimState Values for Two Actuator Failures . . . . . . 15-31
Test the SimState for Two Failures . . . . . . . . . . . . . . . . . . 15-32
xxv
Operations For Vectors and Matrices in C Charts . . . . . . . 16-11
Binary Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16-11
Unary Operations and Actions . . . . . . . . . . . . . . . . . . . . . 16-11
Assignment Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . 16-12
xxvi Contents
Enumerated Data in Charts
18
What Is Enumerated Data? . . . . . . . . . . . . . . . . . . . . . . . . . . . 18-2
xxvii
Continuous-Time Systems in Stateflow Charts
19
Continuous-Time Modeling in Stateflow . . . . . . . . . . . . . . . 19-2
What Is Continuous-Time Modeling? . . . . . . . . . . . . . . . . . . 19-2
When to Use Stateflow Charts for Continuous-Time
Modeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19-3
Model Continuous-Time with Zero-Crossing Detection . . . . . 19-3
When to Disable Zero-Crossing Detection . . . . . . . . . . . . . . 19-4
xxviii Contents
How Fixed-Point Data Works in Stateflow Charts . . . . . . . 20-5
How Stateflow Software Defines Fixed-Point Data . . . . . . . 20-5
Specify Fixed-Point Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 20-6
Rules for Specifying Fixed-Point Word Length . . . . . . . . . . 20-7
Fixed-Point Context-Sensitive Constants . . . . . . . . . . . . . . . 20-7
Tips for Using Fixed-Point Data . . . . . . . . . . . . . . . . . . . . . 20-8
Detect Overflow for Fixed-Point Types . . . . . . . . . . . . . . . 20-10
Share Fixed-Point Data with Simulink Models . . . . . . . . . 20-10
xxix
Complex Data Operations for Charts That Support C
Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21-7
Binary Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21-7
Unary Operations and Actions . . . . . . . . . . . . . . . . . . . . . . 21-7
Assignment Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21-8
xxx Contents
Define a Sampled Stateflow Block . . . . . . . . . . . . . . . . . . . 22-15
Define an Inherited Stateflow Block . . . . . . . . . . . . . . . . . 22-15
Define a Continuous Stateflow Block . . . . . . . . . . . . . . . . . 22-16
Define Function-Call Output Events . . . . . . . . . . . . . . . . . 22-16
Define Edge-Triggered Output Events . . . . . . . . . . . . . . . . 22-17
xxxi
Limitations for Active State Data . . . . . . . . . . . . . . . . . . . . 22-36
xxxii Contents
Integrate Custom Structures in Stateflow Charts . . . . . . . 23-22
xxxiii
Design for Isolation and Recovery in a Chart . . . . . . . . . . 24-32
Mode Logic for the Elevator Actuators . . . . . . . . . . . . . . . 24-32
States for Failure and Isolation . . . . . . . . . . . . . . . . . . . . . 24-33
Transitions for Recovery . . . . . . . . . . . . . . . . . . . . . . . . . . 24-34
xxxiv Contents
How Stateflow Generates Content for Truth Tables . . . . . 25-69
Types of Generated Content . . . . . . . . . . . . . . . . . . . . . . . 25-69
View Generated Content . . . . . . . . . . . . . . . . . . . . . . . . . . 25-69
How Stateflow Software Generates Graphical Functions for
Truth Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25-69
How Stateflow Software Generates MATLAB Code for Truth
Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25-73
xxxv
Debug a MATLAB Function in a Chart . . . . . . . . . . . . . . . . 26-20
Check MATLAB Functions for Syntax Errors . . . . . . . . . . 26-20
Run-Time Debugging for MATLAB Functions in Charts . . 26-21
Check for Data Range Violations . . . . . . . . . . . . . . . . . . . . 26-23
xxxvi Contents
Task 3: Configure the Function Inputs . . . . . . . . . . . . . . . 27-16
Build Targets
28
Code Generation for Stateflow Blocks . . . . . . . . . . . . . . . . . 28-2
Code Generation for Rapid Prototyping and Production Code
Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28-2
xxxvii
Start Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28-13
xxxviii Contents
Call Extrinsic Functions in a Stateflow Chart . . . . . . . . . . 28-38
xxxix
Guidelines for Avoiding Unwanted Recursion in a Chart . 29-33
xl Contents
Override Logging Properties in Atomic Subcharts . . . . . . . 29-62
xli
Use the Search Button and View Area . . . . . . . . . . . . . . . 30-20
Specify the Replacement Text . . . . . . . . . . . . . . . . . . . . . . 30-23
Use Replace Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30-24
Search and Replace Messages . . . . . . . . . . . . . . . . . . . . . . 30-24
Semantic Examples
B
Categories of Semantic Examples . . . . . . . . . . . . . . . . . . . . . . B-2
xlii Contents
Default Transition to a Junction . . . . . . . . . . . . . . . . . . . . . B-18
Default Transition and a History Junction . . . . . . . . . . . . . B-19
Labeled Default Transitions . . . . . . . . . . . . . . . . . . . . . . . . B-20
Glossary
xliii
1
For example, you can use a state machine to represent the automatic transmission of a
car. The transmission has these operating states: park, reverse, neutral, drive, and low.
As the driver shifts from one position to another, the system makes a transition from one
state to another, for example, from park to reverse.
1-2
Finite State Machine Concepts
transitions form the basic building blocks of a sequential logic system. Another way to
represent sequential logic is a state transition table, which allows you to enter the state
logic in tabular form. You can also represent combinatorial logic in a chart with flow
charts and truth tables.
You can include Stateflow charts as blocks in a Simulink model. The collection of these
blocks in a Simulink model is the Stateflow machine.
A Stateflow chart enables the representation of hierarchy, parallelism, and history. You
can organize complex systems by defining a parent and offspring object structure [1].
For example, you can organize states within other higher-level states. A system with
parallelism can have two or more orthogonal states active at the same time. You can also
specify the destination state of a transition based on historical information.
Notation
Notation defines a set of objects and the rules that govern the relationships between
those objects. Stateflow chart notation provides a way to communicate the design
information in a Stateflow chart.
Semantics
Semantics describe how to interpret chart notation. A typical Stateflow chart contains
actions associated with transitions and states. The semantics describe the sequence of
these actions during chart execution.
1-3
1 Stateflow Chart Concepts
A Simulink model can consist of combinations of Simulink blocks, toolbox blocks, and
Stateflow blocks (charts). A chart consists of graphical objects (states, boxes, functions,
notes, transitions, connective junctions, and history junctions) and nongraphical objects
(events, messages, and data).
There is a one-to-one correspondence between the Simulink model and the Stateflow
machine. Each Stateflow block in the Simulink model appears as a single Stateflow
chart. Each Stateflow machine has its own object hierarchy. The Stateflow machine is
the highest level in the Stateflow hierarchy. The object hierarchy beneath the Stateflow
machine consists of combinations of graphical and nongraphical objects. See Stateflow
Hierarchy of Objects on page 1-8.
Stateflow charts are event-driven. Events can be local to the Stateflow block or can
propagate to and from the Simulink model. Data can be local to the Stateflow block or
can pass to and from the Simulink model and external code sources.
Defining the interface for a Stateflow block can involve some or all these tasks:
1-4
Stateflow Charts and Simulink Models
In the following example, the Simulink model consists of a Sine Wave block, a Scope
block, and a single Stateflow block, titled On_off.
1-5
1 Stateflow Chart Concepts
1-6
Stateflow Chart Objects
To learn how these objects interact, see How Chart Constructs Interact During
Execution on page 3-8.
1-7
1 Stateflow Chart Concepts
The highest object in Stateflow hierarchy is the Stateflow machine. This object contains
all other Stateflow objects in a Simulink model. The Stateflow machine contains all the
charts in a model. In addition, the Stateflow machine for a model can contain its own
data.
1-8
Stateflow Hierarchy of Objects
Similarly, charts can contain state, box, function, data, event, message, transition,
junction, and note objects. Continuing with the Stateflow hierarchy, states can contain
all these objects as well, including other states. You can represent state hierarchy with
superstates and substates.
A transition out of a superstate implies transitions out of any of its active substates.
Transitions can cross superstate boundaries to specify a substate destination. If a
substate becomes active, its parent superstate also becomes active.
1-9
1 Stateflow Chart Concepts
Bibliography
[1] Hatley, D. J. and I. A. Pirbhai. Strategies for Real-Time System Specification. New
York, NY: Dorset House Publishing, 1988.
1-10
2
In this section...
Graphical Objects on page 2-2
Nongraphical Objects on page 2-3
Graphical Objects
The following table lists each type of graphical object you can draw in a chart and the
toolbar icon to use for drawing the object.
Default transition
Connective junction
Graphical function
MATLAB function
Box
Simulink function
2-2
Overview of Stateflow Objects
Nongraphical Objects
You can define data, event, and message objects that do not appear graphically in the
Stateflow Editor. However, you can see them in the Symbols window and the Model
Explorer. See Use the Model Explorer with Stateflow Objects on page 30-10.
Data Objects
A Stateflow chart stores and retrieves data that it uses to control its execution. Stateflow
data resides in its own workspace, but you can also access data that resides externally in
the Simulink model or application that embeds the Stateflow machine. You must define
any internal or external data that you use in a Stateflow chart.
Event Objects
An event is a Stateflow object that can trigger a whole Stateflow chart or individual
actions in a chart. Because Stateflow charts execute by reacting to events, you specify
and program events into your charts to control their execution. You can broadcast events
to every object in the scope of the object sending the event, or you can send an event to a
specific object. You can define explicit events that you specify directly, or you can define
implicit events to take place when certain actions are performed, such as entering a
state.
Message Objects
Stateflow message objects are queued objects that can carry data. You can send a
message from one Stateflow chart to another to communicate between charts. You can
also send local messages within a chart. You define the type of message data. You can
view the lifeline of a message in the Message Viewer block. For more information, see
How Messages Work in Stateflow Charts on page 10-2.
2-3
2 Stateflow Chart Notation
hasChangedTo
Complex data complex Define Complex Data Using
imag Operators on page 21-9
real
2-4
Rules for Naming Stateflow Objects
int8
int16
int32
single
uint8
uint16
uint32
Data type operations cast Type Cast Operations on page
fixdt 11-24
type
Explicit events send Broadcast Events to
Synchronize States on page
11-52
Implicit events change Control Chart Execution
chg Using Implicit Events on page
9-33
tick
wakeup
Messages send Stateflow Message Syntax in
forward Charts on page 10-11
discard
isvalid
length
receive
Literal symbols inf Supported Symbols in Actions
t (C charts only) on page 11-27
2-5
2 Stateflow Chart Notation
during
en
entry
ex
exit
on
State activity in Check State Activity on page
11-86
Temporal logic after Control Chart Execution
at Using Temporal Logic on page
11-56
before
every
sec
msec
usec
temporalCount
elapsed
t
duration
2-6
States
States
In this section...
What Is a State? on page 2-7
State Hierarchy on page 2-7
State Decomposition on page 2-9
State Labels on page 2-10
What Is a State?
A state describes an operating mode of a reactive system. In a Stateflow chart, states are
used for sequential design to create state transition diagrams.
States can be active or inactive. The activity or inactivity of a state can change depending
on events and conditions. The occurrence of an event drives the execution of the state
transition diagram by making states become active or inactive. At any point during
execution, active and inactive states exist.
State Hierarchy
To manage multilevel state complexity, use hierarchy in your Stateflow chart. With
hierarchy, you can represent multiple levels of subcomponents in a system.
In the following example, three levels of hierarchy appear in the chart. Drawing one state
within the boundaries of another state indicates that the inner state is a substate (or
child) of the outer state (or superstate). The outer state is the parent of the inner state.
2-7
2 Stateflow Chart Notation
In this example, the chart is the parent of the state Car_done. The state Car_done is
the parent state of the Car_made and Car_shipped states. The state Car_made is also
the parent of the Parts_assembled and Painted states. You can also say that the
states Parts_assembled and Painted are children of the Car_made state.
To represent the Stateflow hierarchy textually, use a slash character (/) to represent
the chart and use a period (.) to separate each level in the hierarchy of states. The
following list is a textual representation of the hierarchy of objects in the preceding
example:
/Car_done
/Car_done.Car_made
/Car_done.Car_shipped
/Car_done.Car_made.Parts_assembled
/Car_done.Car_made.Painted
States can contain all other Stateflow objects. Stateflow chart notation supports the
representation of graphical object hierarchy in Stateflow charts with containment. A
state is a superstate if it contains other states. A state is a substate if it is contained by
another state. A state that is neither a superstate nor a substate of another state is a
state whose parent is the Stateflow chart itself.
2-8
States
States can also contain nongraphical data, event, and message objects. The hierarchy of
this containment appears in the Model Explorer. You define data, event, and message
containment by specifying the parent object.
State Decomposition
Every state (or chart) has a decomposition that dictates what type of substates the state
(or chart) can contain. All substates of a superstate must be of the same type as the
superstate decomposition. State decomposition can be exclusive (OR) or parallel (AND).
Substates with solid borders indicate exclusive (OR) state decomposition. Use this
decomposition to describe operating modes that are mutually exclusive. When a state has
exclusive (OR) decomposition, only one substate can be active at a time.
In the following example, either state A or state B can be active. If state A is active, either
state A1 or state A2 can be active at a given time.
Substates with dashed borders indicate parallel (AND) decomposition. Use this
decomposition to describe concurrent operating modes. When a state has parallel (AND)
decomposition, all substates are active at the same time.
In the following example, when state A is active, A1 and A2 are both active at the same
time.
2-9
2 Stateflow Chart Notation
In the following example, when state A becomes active, both states B and C become active
at the same time. When state C becomes active, either state C1 or state C2 can be active.
State Labels
The label for a state appears on the top left corner of the state rectangle with the
following general format:
name/
entry:entry actions
during:during actions
2-10
States
exit:exit actions
on event_name:on event_name actions
on message_name:on message_name actions
bind:events
Each action in the state label appears in the subtopics that follow. For more information
on state actions, see:
Process for Entering, Executing, and Exiting States on page 3-74 Describes
how and when entry, during, exit, and on event_name actions occur.
State Action Types on page 11-2 Gives more detailed descriptions of each
type of state action.
State Name
A state label starts with the name of the state followed by an optional / character. In
the preceding example, the state names are On and Off. Valid state names consist
of alphanumeric characters and can include the underscore (_) character. For more
information, see Rules for Naming Stateflow Objects on page 2-4.
2-11
2 Stateflow Chart Notation
Hierarchy provides some flexibility in naming states. The name that you enter on the
state label must be unique when preceded by ancestor states. The name in the Stateflow
hierarchy is the text you enter as the label on the state, preceded by the names of parent
states separated by periods. Each state can have the same name appear in the label, as
long as their full names within the hierarchy are unique. Otherwise, the parser indicates
an error.
Each of these states has a unique name because of its location in the chart. The full
names for the states in FAN1 and FAN2 are:
PowerOn.FAN1.On
2-12
States
PowerOn.FAN1.Off
PowerOn.FAN2.On
PowerOn.FAN2.Off
State Actions
After the name, you enter optional action statements for the state with a keyword label
that identifies the type of action. You can specify none, some, or all of them. The colon
after each keyword is required. The slash following the state name is optional as long as
it is followed by a carriage return.
For each type of action, you can enter more than one action by separating each action
with a carriage return, semicolon, or a comma. You can specify actions for more than one
event or message by adding additional on event_name or on message_name lines.
If you enter the name and slash followed directly by actions, the actions are interpreted
as entry action(s). This shorthand is useful if you are specifying only entry actions.
Entry Action
Preceded by the prefix entry or en for short. In the preceding example, state On
has entry action on_count=0. This means that the value of on_count is reset to 0
whenever state On becomes active (entered).
During Action
Preceded by the prefix during or du for short. In the preceding label example, state On
has two during actions, light_on() and on_count++. These actions are executed
whenever state On is already active and any event occurs.
Exit Action
Preceded by the prefix exit or ex for short. In the preceding label example, state Off
has the exit action light_off(). If the state Off is active, but becomes inactive
(exited), this action is executed.
On Action
2-13
2 Stateflow Chart Notation
Bind Action
Preceded by the prefix bind. Events bound to a state can only be broadcast by that state
or its children.
2-14
State Hierarchy
State Hierarchy
In this section...
State Hierarchy Example on page 2-15
Objects That a State Can Contain on page 2-16
To manage multilevel state complexity, use hierarchy in your Stateflow chart. With
hierarchy, you can represent multiple levels of subcomponents in a system.
In this example, the chart is the parent of the state Car_done. The state Car_done is
the parent state of the Car_made and Car_shipped states. The state Car_made is also
the parent of the Parts_assembled and Painted states. You can also say that the
states Parts_assembled and Painted are children of the Car_made state.
To represent the Stateflow hierarchy textually, use a slash character (/) to represent
the chart and use a period (.) to separate each level in the hierarchy of states. The
2-15
2 Stateflow Chart Notation
/Car_done
/Car_done.Car_made
/Car_done.Car_shipped
/Car_done.Car_made.Parts_assembled
/Car_done.Car_made.Painted
States can also contain nongraphical data, event, and message objects. The hierarchy of
this containment appears in the Model Explorer. You define data, event, and message
containment by specifying the parent object.
2-16
State Decomposition
State Decomposition
In this section...
Exclusive (OR) State Decomposition on page 2-17
Parallel (AND) State Decomposition on page 2-17
Every state (or chart) has a decomposition that dictates what type of substates the state
(or chart) can contain. All substates of a superstate must be of the same type as the
superstate decomposition. State decomposition can be exclusive (OR) or parallel (AND).
In the following example, either state A or state B can be active. If state A is active, either
state A1 or state A2 can be active at a given time.
2-17
2 Stateflow Chart Notation
In the following example, when state A is active, A1 and A2 are both active at the same
time.
In the following example, when state A becomes active, both states B and C become active
at the same time. When state C becomes active, either state C1 or state C2 can be active.
2-18
Transitions
Transitions
In this section...
What Is a Transition? on page 2-19
Transition Hierarchy on page 2-20
Transition Label Notation on page 2-21
Valid Transitions on page 2-23
What Is a Transition?
A transition is a line with an arrowhead that links one graphical object to another. In
most cases, a transition represents the passage of the system from one mode (state)
object to another. A transition typically connects a source and a destination object.
The source object is where the transition begins and the destination object is where
the transition ends. The following chart shows a transition from a source state, B, to a
destination state, A.
Junctions divide a transition into transition segments. In this case, a full transition
consists of the segments taken from the origin to the destination state. Each segment is
evaluated in the process of determining the validity of a full transition.
The following example has two segmented transitions: one from state On to state Off,
and the other from state On to itself:
2-19
2 Stateflow Chart Notation
A default transition is a special type of transition that has no source object. See Default
Transitions on page 2-35 for details.
Transition Hierarchy
Transitions cannot contain other objects the way that states can. However, transitions
are contained by states. A transition's hierarchy is described in terms of the transition's
parent, source, and destination. The parent is the lowest level that contains the source
and destination of the transition. Consider the parents for the transitions in the following
example:
2-20
Transitions
The following table resolves the parentage of each transition in the preceding example.
The / character represents the chart. Each level in the hierarchy of states is separated
by the period (.) character.
event_or_message[condition]{condition_action}/transition_action
2-21
2 Stateflow Chart Notation
Event Trigger
Specifies an event that causes the transition to be taken, provided the condition, if
specified, is true. Specifying an event is optional. The absence of an event or message
indicates that the transition is taken upon the occurrence of any event. Specify multiple
events using the OR logical operator (|).
In the preceding example, the broadcast of event E triggers the transition from On to Off
as long as the condition [off_count==0] is true.
Condition
Specifies a Boolean expression that, when true, validates a transition to be taken for the
specified event or message trigger. Enclose the condition in square brackets ([]). See
Conditions on page 11-10 for information on the condition notation.
In the preceding example, the condition [off_count==0] must evaluate as true for the
condition action to be executed and for the transition from the source to the destination
to be valid.
Condition Action
Follows the condition for a transition and is enclosed in curly braces ({}). It is executed
as soon as the condition is evaluated as true and before the transition destination has
been determined to be valid. If no condition is specified, an implied condition evaluates to
true and the condition action is executed.
In the preceding example, if the condition [off_count==0] is true, the condition action
off_count = off_count + 1; is immediately executed.
2-22
Transitions
Transition Action
Executes after the transition destination has been determined to be valid provided
the condition, if specified, is true. If the transition consists of multiple segments, the
transition action is only executed when the entire transition path to the final destination
is determined to be valid. Precede the transition action with a /.
In the preceding example, if the condition [off_count==0] is true, and the destination
state Off is valid, the transition action Light_off is executed.
Valid Transitions
In most cases, a transition is valid when the source state of the transition is active and
the transition label is valid. Default transitions are different because there is no source
state. Validity of a default transition to a substate is evaluated when there is a transition
to its superstate, assuming the superstate is active. This labeling criterion applies to
both default transitions and general case transitions. The following table lists possible
combinations of valid transition labels.
2-23
2 Stateflow Chart Notation
Transition Connections
In this section...
Transitions to and from Exclusive (OR) States on page 2-24
Transitions to and from Junctions on page 2-24
Transitions to and from Exclusive (OR) Superstates on page 2-25
Transitions to and from Substates on page 2-26
See Transition to and from Exclusive (OR) States on page B-4 for more
information on the semantics of this notation.
2-24
Transition Connections
The chart uses temporal logic to determine when the input u equals 1.
For more information about temporal logic, see Control Chart Execution Using
Temporal Logic on page 11-56. For more information on the semantics of this
notation, see Transition from a Common Source to Multiple Destinations on page
B-36.
2-25
2 Stateflow Chart Notation
The chart has two states at the highest level in the hierarchy, Power_off and
Power_on. By default, Power_off is active. The event Switch toggles the system
between the Power_off and Power_on states. Power_on has three substates: First,
Second, and Third. By default, when Power_on becomes active, First also becomes
active. When Shift equals 1, the system transitions from First to Second, Second to
Third, Third to First, for each occurrence of the event Switch, and then the pattern
repeats.
For more information on the semantics of this notation, see Control Chart Execution
Using Default Transitions on page B-17.
2-26
Transition Connections
For details on how this chart works, see Key Behaviors of Debouncer Chart on page
24-3. For information on the semantics of this notation, see Transition from a
Substate to a Substate with Events on page B-8.
2-27
2 Stateflow Chart Notation
Self-Loop Transitions
A transition that originates from and terminates on the same state is a self-loop
transition. The following chart contains four self-loop transitions:
See these sections for more information about the semantics of this notation:
2-28
Self-Loop Transitions
2-29
2 Stateflow Chart Notation
Inner Transitions
An inner transition is a transition that does not exit the source state. Inner transitions
are powerful when defined for superstates with exclusive (OR) decomposition. Use
of inner transitions can greatly simplify a Stateflow chart, as shown by the following
examples:
2-30
Inner Transitions
Any event occurs and awakens the Stateflow chart. The default transition to the
connective junction is valid. The destination of the transition is determined by [c1 > 0]
2-31
2 Stateflow Chart Notation
and [c2 > 0]. If [c1 > 0] is true, the transition to A1 is true. If [c2 > 0] is true, the
transition to A2 is valid. If neither [c1 > 0] nor [c2 > 0] is true, the transition to A3
is valid. The transitions among A1, A2, and A3 are determined by E, [c1 > 0], and [c2
> 0].
An event occurs and awakens the chart. The default transition to the connective junction
is valid. The destination of the transitions is determined by [c1 > 0] and [c2 > 0].
You can simplify the chart by using an inner transition in place of the transitions among
all the states in the original example. If state A is already active, the inner transition is
used to reevaluate which of the substates of state A is to be active. When event E occurs,
the inner transition is potentially valid. If [c1 > 0] is true, the transition to A1 is valid.
If [c2 > 0] is true, the transition to A2 is valid. If neither [c1 > 0] nor [c2 > 0] is
true, the transition to A3 is valid. This chart design is simpler than the previous one.
Note: When you use an inner transition to a connective junction, an active substate can
exit and reenter when the transition condition for that substate is valid. For example, if
substate A1 is active and [c1 > 0] is true, the transition to A1 is valid. In this case:
2-32
Inner Transitions
See Process the First Event with an Inner Transition to a Connective Junction on page
B-26 for more information on the semantics of this notation.
State Power_on.High is initially active. When event Reset occurs, the inner transition
to the history junction is valid. Because the inner transition is valid, the currently active
state, Power_on.High, is exited. When the inner transition to the history junction
is processed, the last active state, Power_on.High, becomes active (is reentered). If
Power_on.Low was active under the same circumstances, Power_on.Low would be
exited and reentered as a result. The inner transition in this example is equivalent to
drawing an outer self-loop transition on both Power_on.Low and Power_on.High.
2-33
2 Stateflow Chart Notation
See Use of History Junctions Example on page 2-46 for another example using a
history junction.
See Inner Transition to a History Junction on page B-28 for more information on
the semantics of this notation.
2-34
Default Transitions
Default Transitions
In this section...
What Is a Default Transition? on page 2-35
Drawing Default Transitions on page 2-35
Label Default Transitions on page 2-35
Default Transition Examples on page 2-36
2-35
2 Stateflow Chart Notation
Tip: When labeling default transitions, ensure that there is at least one valid default
transition. Otherwise, a chart can transition into an inconsistent state.
2-36
Default Transitions
Without the default transition to state PowerOff, when the Stateflow chart wakes up,
none of the states becomes active. A state inconsistency error is reported at run time.
See Control Chart Execution Using Default Transitions on page B-17 for
information on the semantics of this notation.
2-37
2 Stateflow Chart Notation
The default transition to the connective junction defines that upon entering the chart, the
destination depends on the condition of each transition segment.
See Default Transition to a Junction on page B-18 for information on the semantics
of this notation.
2-38
Default Transitions
When the chart wakes up, the data p and v initialize to 10 and 15, respectively.
See Labeled Default Transitions on page B-20 for more information on the
semantics of this notation.
2-39
2 Stateflow Chart Notation
Connective Junctions
In this section...
What Is a Connective Junction? on page 2-40
Flow Chart Notation with Connective Junctions on page 2-40
See Use Connective Junctions to Represent Multiple Paths on page B-30 for a
summary of the semantics of connective junctions.
2-40
Connective Junctions
Flow chart notation, states, and state-to-state transitions coexist in the same Stateflow
chart. The key to representing flow chart notation is in the labeling of transitions, as
shown in the following examples.
2-41
2 Stateflow Chart Notation
For more information about this chart, see Phases of Chart Execution on page 3-13.
For more information on the semantics of this notation, see If-Then-Else Decision
Construct on page B-31.
The chart uses temporal logic to determine when the input u equals 1.
For more information about temporal logic, see Control Chart Execution Using
Temporal Logic on page 11-56. For more information on the semantics of this
notation, see If-Then-Else Decision Construct on page B-31.
This example shows a combination of flow chart notation and state transition notation.
Self-loop transitions to connective junctions can represent for loop constructs. The
2-42
Connective Junctions
chart uses implicit ordering of outgoing transitions (see Implicit Ordering of Outgoing
Transitions on page 3-64).
See For-Loop Construct on page B-33 for information on the semantics of this
notation.
This example shows the use of flow chart notation. The chart uses implicit ordering of
outgoing transitions (see Implicit Ordering of Outgoing Transitions on page 3-64).
2-43
2 Stateflow Chart Notation
See Flow Chart Notation on page B-35 for information on the semantics of this
notation.
This example shows transition segments from a common source to multiple conditional
destinations using a connective junction. The chart uses implicit ordering of outgoing
transitions (see Implicit Ordering of Outgoing Transitions on page 3-64).
2-44
Connective Junctions
See Transition from a Common Source to Multiple Destinations on page B-36 for
information on the semantics of this notation.
This example shows transition segments from multiple sources to a single destination
based on the same event using a connective junction.
2-45
2 Stateflow Chart Notation
History Junctions
In this section...
What Is a History Junction? on page 2-46
History Junctions and Inner Transitions on page 2-47
Superstate Power_on has a history junction and contains two substates. If state
Power_off is active and event switch_on occurs, the system can enter Power_on.Low
or Power_on.High. The first time superstate Power_on is entered, substate
Power_on.Low is entered because it has a default transition. At some point afterward,
if state Power_on.High is active and event switch_off occurs, superstate Power_on
2-46
History Junctions
is exited and state Power_off becomes active. Then event switch_on occurs. Because
Power_on.High was the last active substate, it becomes active again. After the first
time Power_on becomes active, the history junction determines whether to enter
Power_on.Low or Power_on.High.
See Default Transition and a History Junction on page B-19 for more information
on the semantics of this notation.
See Using an Inner Transition to a History Junction on page 2-33 for an example of this
notation.
See Inner Transition to a History Junction on page B-28 for more information on
the semantics of this notation.
2-47
2 Stateflow Chart Notation
Boxes
In this section...
What Is a Box? on page 2-48
Example of Using a Box on page 2-48
What Is a Box?
A box is a graphical object that organizes other objects in your chart, such as functions
and states.
For rules of using boxes and other examples, see Group Chart Objects Using Boxes on
page 7-41.
2-48
When to Use Reusable Functions in Charts
Flow chart Encapsulate flow charts containing if-then-else, switch-case, for, while,
or do-while patterns.
MATLAB Write matrix-oriented algorithms; call MATLAB functions for data
analysis and visualization.
Simulink Call Simulink function-call subsystems directly to streamline design and
improve readability.
Truth table Represent combinational logic for decision-making applications such as
fault detection and mode switching.
Use the function format that is most natural for the type of calculation required in the
state action or transition condition.
If the four standard types of Stateflow functions do not work, you can write your own
C or C++ code for integration with your chart. For more information about custom code
integration, see Share Data Using Custom C Code on page 28-25.
2-49
3
Graphical Constructs
Graphical constructs consist of objects that appear graphically in a chart. You use the
object palette in the Stateflow Editor to build graphical constructs (see Stateflow Editor
Operations on page 4-26).
3-2
What Do Semantics Mean for Stateflow Charts?
Nongraphical Constructs
Nongraphical constructs appear textually in a chart and often refer to data, events, and
messages. See Add Stateflow Data on page 8-2 ,Define Events on page 9-5,
and Define Messages in a Stateflow Chart on page 10-25 for details. Examples of
nongraphical constructs include:
3-3
3 Stateflow Chart Semantics
3-4
What Do Semantics Mean for Stateflow Charts?
3-5
3 Stateflow Chart Semantics
For details on how these graphical and nongraphical constructs interact during chart
execution, see How Chart Constructs Interact During Execution on page 3-8.
3-6
What Do Semantics Mean for Stateflow Charts?
Topic Reference
How do events affect chart execution? How Events Drive Chart Execution on page
3-43
How does a chart switch between being active Types of Chart Execution on page 3-46
and inactive?
In what order do flow charts execute? Process for Grouping and Executing
Transitions on page 3-57
In what order do outgoing transitions from a Evaluation Order for Outgoing Transitions on
single source execute? page 3-60
What happens when you enter, execute, or exit a Process for Entering, Executing, and Exiting
state? States on page 3-74
How do parallel (AND) states work? Execution Order for Parallel States on page
3-78
How does early return logic affect chart Early Return Logic for Event Broadcasts on
execution? page 3-85
3-7
3 Stateflow Chart Semantics
In this section...
Overview of the Example Model on page 3-8
Model of the Check-In Process for a Hotel on page 3-8
How the Chart Interacts with Simulink Blocks on page 3-12
Phases of Chart Execution on page 3-13
For details of the chart semantics, see Phases of Chart Execution on page 3-13.
The model consists of four Manual Switch blocks, one Mux block, one Multiport Switch
block, a Hotel chart, and a Display block.
3-8
How Chart Constructs Interact During Execution
Checking in to a hotel
Calling room service
Triggering a fire alarm
Sending an all-clear signal after a
fire alarm
3-9
3 Stateflow Chart Semantics
The Hotel chart contains graphical constructs, such as states and history junctions, and
nongraphical constructs, such as conditions and condition actions.
3-10
How Chart Constructs Interact During Execution
For a mapping of constructs to their locations in the chart, see Common Graphical and
Nongraphical Constructs on page 3-3.
3-11
3 Stateflow Chart Semantics
When simulation starts, the chart wakes up and executes its default transitions because
the Execute (enter) Chart At Initialization option is on (see Execution of a Chart at
Initialization on page 3-55). Then the chart goes to sleep.
Note: If this option is off, the chart does not wake up until you toggle one of the Manual
Switch blocks. You can verify the setting for this option in the Chart properties dialog
box. Right-click inside the top level of the chart and select Properties from the context
menu.
The chart wakes up again only when an edge-triggered input event occurs: check_in,
room_service, fire_alarm, or all_clear. When you toggle a Manual Switch block
for an input event during simulation, the chart detects a rising or falling edge and wakes
up. While the chart is awake:
The Multiport Switch block provides a value for the chart input data room_type.
The Display block shows any change in value for the chart output data fee.
Chart Inactivity
After completing all possible phases of execution, the chart goes back to sleep.
3-12
How Chart Constructs Interact During Execution
This section describes what happens in the Front_desk state just after the chart wakes
up.
3-13
3 Stateflow Chart Semantics
3-14
How Chart Constructs Interact During Execution
3-15
3 Stateflow Chart Semantics
This section describes what happens after exiting the Front_desk state: the evaluation
of a group of outgoing transitions from a single junction.
3-16
How Chart Constructs Interact During Execution
3-17
3 Stateflow Chart Semantics
Because the Multiport Switch block outputs only 1, 2, or 3, room_type cannot have any
other values. However, if room_type has a value other than 1, 2, or 3, the chart stays in
the Front_desk state. This behavior applies because no transition path out of that state
is valid.
3-18
How Chart Constructs Interact During Execution
This section describes what happens after you enter the Checked_in state, regardless of
which substate becomes active.
3-19
3 Stateflow Chart Semantics
3-20
How Chart Constructs Interact During Execution
This part of the chart describes how you can perform function calls while a state is active.
3-21
3 Stateflow Chart Semantics
3-22
How Chart Constructs Interact During Execution
if (room_type == 1)
y = 1500 + (x*50);
else
if (room_type == 2)
y = 1000 + (x*25);
else
y = 500 + (x*5);
end
end
Modeling Guidelines for Function Calls. The following guidelines apply to function
calls.
This part of the chart shows how a state with exclusive (OR) decomposition executes.
3-23
3 Stateflow Chart Semantics
3-24
How Chart Constructs Interact During Execution
3-25
3 Stateflow Chart Semantics
This part of the chart shows how a state with parallel (AND) decomposition executes.
3-26
How Chart Constructs Interact During Execution
3-27
3 Stateflow Chart Semantics
This part of the chart describes how events can guard transitions between exclusive (OR)
states.
3-28
How Chart Constructs Interact During Execution
3-29
3 Stateflow Chart Semantics
a Dining_area
b Executive_suite
c Checked_in
d Check_in
2 Waiting_area becomes active.
2 If an all-clear signal When the chart receives an event broadcast for all_clear, a
occurs, you can leave the transition from Waiting_area to the previously active substate
waiting area and return of Check_in occurs.
to your previous location
inside the hotel. The history junction at each level of hierarchy in Check_in
enables the chart to remember which substate was previously
active before the transition to Waiting_area occurred.
a Check_in
b Checked_in (The default transition does not apply.)
c Executive_suite
d Dining_area (The default transition does not apply.)
3-30
How Chart Constructs Interact During Execution
3-31
3 Stateflow Chart Semantics
When you use multiple input events to trigger a chart, verify that all input signals use
the same data type. Otherwise, simulation stops and an error message appears. For more
information, see Data Types Allowed for Input Events on page 9-11.
Use a default transition to mark the first state to become active among exclusive (OR) states
Condition actions execute as soon as the condition evaluates to true. Transition actions
do not execute until after the transition path is complete, to a terminating junction or a
state.
Use explicit ordering to control the testing order of a group of outgoing transitions
You can specify explicit or implicit ordering of transitions. By default, a chart uses
explicit ordering. If you switch to implicit ordering, the transition testing order can
change when graphical objects move.
Use a superstate to enclose substates that share the same state actions
When you have multiple exclusive (OR) states that perform the same state actions, group
these states in a superstate and define state actions at that level.
This guideline enables reuse of state actions that apply to multiple substates. You write
the state actions only once, instead of writing them separately in each substate.
3-32
Modeling Guidelines for Stateflow Charts
Note: You cannot use boxes for this purpose because boxes do not support state actions.
If reentry to a state with exclusive (OR) decomposition depends on the previously active
substate, use a history junction. This type of junction records the active substate when
the chart exits the state. If you do not record the previously active substate, the default
transition occurs and the wrong substate can become active upon state reentry.
This guideline prevents parsing errors. Since all parallel states at a level of hierarchy are
active at the same time, history junctions have no meaning.
Use explicit ordering to control the execution order of parallel (AND) states
You can specify explicit or implicit ordering of parallel states. By default, a chart uses
explicit ordering. If you switch to implicit ordering, the execution order can change when
parallel states move.
3-33
3 Stateflow Chart Semantics
In this section...
Object contains a syntax error on page 3-35
Dangling transitions on page 3-35
Unreachable state on page 3-36
Transition shadowing on page 3-36
Invalid default transition path on page 3-37
Default transition is missing on page 3-38
Unexpected backtracking on page 3-38
Transition loops outside natural parent on page 3-39
Transition action precedes a condition action along this path on page 3-40
Invalid transitions crossing into graphical function on page 3-41
Invalid transitions crossing out of graphical function on page 3-41
The Stateflow editor displays potential errors and warnings by highlighting objects in
red or orange. By fixing these issues when you design your charts, you avoid potential
compile or run-time warnings and errors. To see details and possible fixes, hover your
cursor over the object and click the badge.
To turn off the edit-time checking, clear Display > Error & Warnings. When you
change the diagnostic level of a corresponding configuration parameter, the edit-time
diagnostic level also changes. For example, if you set the Unreachable execution path
configuration parameter on the Diagnostics > Stateflow pane in the Configuration
Parameters dialog box to none, then Stateflow does not highlight transition shadowing
in the editor. Not all edit-time checks have corresponding configuration parameters.
3-34
Modeling Rules That Stateflow Detects During Edit Time
Note: Subcharts with syntax errors appear red in the parent chart with a badge
indicating a syntax issue. In the subchart editor, the object is highlighted in red, however
there is no badge indicating the issue.
Dangling transitions
A dangling transition is not connected to a destination object. Transitions must have a
valid source state or junction and a valid destination state or junction. See Transitions
on page 2-19.
Control the level of diagnostic action by setting the Diagnostics > Stateflow >
Unreachable execution path parameter in the Model Configuration Parameters dialog
box.
3-35
3 Stateflow Chart Semantics
Unreachable state
If there is not a valid execution path leading to a state, it is unreachable. Make this state
a reachable destination by connecting the state with a transition from a reachable state
or junction.
Control the level of diagnostic action by setting the Diagnostics > Stateflow >
Unreachable execution path parameter in the Model Configuration Parameters dialog
box.
Transition shadowing
Transition shadowing occurs when a chart contains an unconditional transition
originating from a source that prevents other transitions from the same source from
executing.
To avoid transition shadowing, create no more than one unconditional transition for each
group of outgoing transitions from a state or junction. Explicitly specify an unconditional
3-36
Modeling Rules That Stateflow Detects During Edit Time
transition as a lower evaluation order than any transitions with conditions. See
Evaluation Order for Outgoing Transitions on page 3-60.
Control the level of diagnostic action by setting the Diagnostics > Stateflow >
Unreachable execution path parameter in the Model Configuration Parameters dialog
box.
When possible, click Fix for Stateflow to switch the execution orders for the transitions.
You can undo the applied fix from the Edit menu.
3-37
3 Stateflow Chart Semantics
When you click Fix, Stateflow adds a default transition to the upper-left state or
junction.
Unexpected backtracking
Unintended backtracking of control flow can occur at a junction under these conditions:
The junction does not have an unconditional transition path to a state or terminating
junction.
Multiple transition paths lead to that junction.
Control the level of diagnostic action by setting the Diagnostics > Stateflow >
Unexpected backtracking parameter in the Model Configuration Parameters dialog
box.
3-38
Modeling Rules That Stateflow Detects During Edit Time
When you click Fix, Stateflow adds a transition from the backtracking junction to a
terminating junction. You can undo the applied fix from the Edit menu.
To have execution move from state B to state C without exiting and reentering state A,
move the transition so that it is contained within state A.
3-39
3 Stateflow Chart Semantics
Control the level of diagnostic action by setting the Diagnostics > Stateflow >
Transition outside natural parent parameter in the Model Configuration Parameters
dialog box.
3-40
Modeling Rules That Stateflow Detects During Edit Time
Execution order:
1 Evaluate ConditionA.
2 If true, evaluate ConditionB.
3 If true, execute ConditionAction2.
4 Exit state A.
5 Execute TranstionAction1.
6 Enter state B.
To improve clarity, place the transition action after the last condition action on the path.
Control the level of diagnostic action by setting the Diagnostics > Stateflow >
Transition action specified before condition action parameter in the Model
Configuration Parameters dialog box.
More About
What Do Semantics Mean for Stateflow Charts? on page 3-2
3-41
3 Stateflow Chart Semantics
3-42
How Events Drive Chart Execution
Because a chart runs on a single thread, actions that take place based on an event
are atomic to that event. All activity caused by the event in the chart finishes before
execution returns to the activity that was taking place before receiving the event. Once
an event initiates an action, the action completes unless interrupted by an early return.
3-43
3 Stateflow Chart Semantics
States on page 11-52. For examples using event broadcasting and directed event
broadcasting, see:
Events have hierarchy (a parent) and scope. The parent and scope together define a
range of access to events. The parent of an event usually determines who can trigger
on the event (has receive rights). See the Name and Parent fields for an event in Set
Properties for an Event on page 9-7 for more information.
All events, except for the output edge trigger to a Simulink block (see the following note),
have the following execution in a chart:
1 If the receiver of the event is active, then it executes (see Execution of an Active
Chart on page 3-47 and Steps for Executing an Active State on page 3-75).
(The event receiver is the parent of the event unless a directed event broadcast
occurs using the send() function.)
2 If the receiver of the event is not active, nothing happens.
3 After broadcasting the event, the broadcaster performs early return logic based on
the type of action statement that caused the event.
To learn about early return logic, see Early Return Logic for Event Broadcasts on
page 3-85.
3-44
How Events Drive Chart Execution
3-45
3 Stateflow Chart Semantics
Stage Description
Inactive Chart has no active states
Active Chart has active states
Sleeping Chart has active states, but no events to
process
When a Simulink model first triggers a Stateflow chart, the chart is inactive and has no
active states. After the chart executes and completely processes its initial trigger event
from the Simulink model, it transfers control back to the model and goes to sleep. At the
next Simulink trigger event, the chart changes from the sleeping to active stage.
If executing the default flow paths does not cause state entry, a state inconsistency error
occurs.
3-46
Types of Chart Execution
By default, Stateflow charts execute once for each active input event. If no input events
exist, the charts execute once every time step. If you are modeling a system that must
react quickly to inputs, you can enable super step semantics, a Stateflow chart property
(see Enable Super Step Semantics on page 3-48).
When you enable super step semantics, a Stateflow chart executes multiple times for
every active input event or for every time step when the chart has no input events. The
chart takes valid transitions until either of these conditions occurs:
No more valid transitions exist, that is, the chart is in a stable active state
configuration.
The number of transitions taken exceeds a user-specified maximum number of
iterations.
In a super step, your chart responds faster to inputs but performs more computations in
each time step. Therefore, when generating code for an embedded target, make sure that
the chart can finish the computation in a single time step. To achieve this behavior, fine-
tune super step parameters by setting an upper limit on the number of transitions that
the chart takes per time step (see What Is Maximum Number of Iterations? on page
3-47).
For simulation targets, specify whether the chart goes to the next time step or generates
an error if it reaches the maximum number of transitions prematurely. However, in
generated code for embedded targets, the chart always goes to the next time step after
taking the maximum number of transitions.
In a super step, your chart always takes at least one transition. Therefore, when you
set a maximum number of iterations in each super step, the chart takes that number of
3-47
3 Stateflow Chart Semantics
transitions plus 1. For example, if you specify 10 as the maximum number of iterations,
your chart takes 11 transitions in each super step. To set maximum number of iterations
in each super step, see Enable Super Step Semantics on page 3-48.
1 Right-click inside the top level of a chart and select Properties from the context
menu.
2 In the Chart properties dialog box, select the Enable Super Step Semantics check
box.
3-48
Types of Chart Execution
The chart always takes one transition during a super step, so the value N that you
specify represents the maximum number of additional transitions (for a total of N
+1). Try to choose a number that allows the chart to reach a stable state within the
3-49
3 Stateflow Chart Semantics
time step, based on the mode logic of your chart. For more information, see What Is
Maximum Number of Iterations? on page 3-47
4 Select an action from the drop-down menu in the field Behavior after too many
iterations.
Your selection determines how the chart behaves during simulation if it exceeds the
maximum number of iterations in the super step before reaching a stable state.
Behavior Description
Proceed The chart goes back to sleep with the last active state
configuration, that is, after updating local data at the last
valid transition in the super step.
Throw Error Simulation stops and the chart generates an error,
indicating that too many iterations occurred while trying to
reach a stable state.
Note: This option is relevant only for simulation targets. For embedded targets, code
generation goes to the next time step rather than generating an error.
The following model shows how super step semantics differs from default semantics:
3-50
Types of Chart Execution
By default, the chart takes only one transition in each simulation step, incrementing y
each time.
When you enable super step semantics, the chart takes all valid transitions in each time
step, stopping at state C with y = 3.
3-51
3 Stateflow Chart Semantics
When you enable super step semantics for a chart with multiple active input events, the
chart takes all valid transitions for the first active event before it begins processing the
next active event. For example, consider the following model:
3-52
Types of Chart Execution
In this model, the Sum block produces a 2-by-1 vector signal that goes from [0,0] to [1,1]
at time t = 1. As a result, when the model wakes up the chart, events E1 and E2 are both
active:
If you enable super step semantics, the chart takes all valid transitions for event E1. The
chart takes transitions from state A to B and then from state B to C in a single super step.
The scope shows that y = 3 at the end of the super step:
3-53
3 Stateflow Chart Semantics
In a super step, this chart never transitions to state D because there is no path from state
C to state D.
If your chart contains transition cycles, taking multiple transitions in a single time step
can cause infinite loops. Consider the following example:
3-54
Types of Chart Execution
In this example, the transitions between states A and B cycle and produce an infinite
loop because the value of x remains constant at 1. One way to detect infinite loops is to
configure your chart to generate an error if it reaches a maximum number of iterations in
a super step. See Enable Super Step Semantics on page 3-48.
By default, the first time a chart wakes up, it executes the default transition paths. At
this time, the chart can access inputs, write to outputs, and broadcast events. If you want
your chart to begin executing from a known configuration, you can enable the option
to execute at initialization. When you turn on this option, the state configuration of a
chart initializes at time 0 instead of the first occurrence of an input event. The default
transition paths of the chart execute during the model initialization phase at time 0,
corresponding to the mdlInitializeConditions() (Simulink) phase for S-functions.
You select the Execute (enter) Chart At Initialization check box in the Chart
properties dialog box, as described in Specify Chart Properties on page 22-3.
Note: If an output of this chart connects to a SimEvents block, do not select this check
box. To learn more about using Stateflow charts and SimEvents blocks together in a
model, see the SimEvents documentation.
3-55
3 Stateflow Chart Semantics
Due to the transient nature of the initialization phase, do not perform certain actions in
the default transition paths of the chart and associated state entry actions which
execute at initialization. Follow these guidelines:
Do not access chart input data, because blocks connected to chart input ports might
not have initialized their outputs yet.
Do not call exported graphical functions from other charts, because those charts might
not have initialized yet.
Do not broadcast function-call output events, because the triggered subsystems might
not have initialized yet.
You can control the level of diagnostic action for invalid access to chart input data in
the Diagnostics > Stateflow pane of the Configuration Parameters dialog box. For
more information, see the documentation for the Invalid input data access in chart
initialization (Simulink) diagnostic.
3-56
Process for Grouping and Executing Transitions
Default flow charts are all default transition segments that start with the same
parent.
Inner flow charts are all transition segments that originate on a state and reside
entirely within that state.
Outer flow charts are all transition segments that originate on the respective state
but reside at least partially outside that state.
Each set of flow charts includes other transition segments connected to a qualifying
transition segment through junctions and transitions. Consider the following example:
In this example, state A has both an inner and a default transition that connect to a
junction with outgoing transitions to states A.A1 and A.A2. If state A is active, its set of
inner flow charts includes:
3-57
3 Stateflow Chart Semantics
In this case, the two outgoing transition segments from the junction are members of more
than one flow chart type.
An active state can have several possible outgoing transitions. The chart orders
these transitions before checking them for validity. See Evaluation Order for
Outgoing Transitions on page 3-60.
2 Select the next transition segment in the set of ordered transitions.
3 Test the transition segment for validity.
4 If the segment is invalid, go to step 2.
5 If the destination of the transition segment is a state, do the following:
3-58
Process for Grouping and Executing Transitions
a Backtrack the incoming transition segment that brought you to the junction.
b Continue at step 2, starting with the next transition segment after the backup
segment.
The set of flow charts completes execution when all starting transitions have been
tested.
3-59
3 Stateflow Chart Semantics
Explicit ordering
Override explicit ordering in C charts by letting Stateflow use internal rules to order
transitions (see Implicit Ordering of Outgoing Transitions on page 3-64).
Note: You can order transitions only within their type (inner, outer, or default). For more
information, see Transition Flow Chart Types on page 3-57.
Outgoing transitions are assigned priority numbers based on order of evaluation. The
lower the number, the higher the priority. The priority number appears on each outgoing
transition.
Because evaluation order is a chart property, all outgoing transitions in the chart inherit
the property setting. You cannot mix explicit and implicit ordering in the same Stateflow
chart. However, you can mix charts with different ordering in the same Simulink model.
3-60
Evaluation Order for Outgoing Transitions
You can control the behavior of the Stateflow diagnostic that detects transition
shadowing. On the Diagnostics > Stateflow pane of the Configuration Parameters
dialog box, set Unreachable execution path to none, warning, or error. For
information about other diagnostics, see Model Configuration Parameters: Stateflow
Diagnostics (Simulink).
When you open a new Stateflow chart, all outgoing transitions from a source are
automatically numbered in the order you create them, starting with the next available
number for the source.
You can change the order of outgoing transitions by explicitly renumbering them. When
you change a transition number, the Stateflow chart automatically renumbers the other
outgoing transitions for the source by preserving their relative order. This behavior is
consistent with the renumbering rules for Simulink ports.
For example, if you have a source with five outgoing transitions, changing transition 4 to
2 results in the automatic renumbering shown.
3-61
3 Stateflow Chart Semantics
1 Right-click inside the top level of a chart and select Properties from the context
menu.
3-62
Evaluation Order for Outgoing Transitions
3 Click OK.
3-63
3 Stateflow Chart Semantics
Note: If you select Execution Order while the chart is in implicit ordering mode,
the only option available is Enable user-specified execution order for this
chart. This option opens the Chart properties dialog box where you can switch
to explicit ordering mode, as described in Order Transitions Explicitly on page
3-62.
A context menu of available transition numbers appears, with a check mark next to
the current number for this transition.
2 Select the new transition number.
The chart automatically renumbers the other transitions for the source by preserving
the relative transition order.
3 Repeat this procedure to renumber other transitions as needed.
Another way to access the transition order number is through the properties dialog box.
Note: If explicit ordering mode is enabled, the chart assigns the new number to
the current transition and automatically renumbers the other transitions. If the
chart is in implicit ordering mode, an error dialog box appears and the old number is
retained.
For C charts in implicit ordering mode, a Stateflow chart evaluates a group of outgoing
transitions from a single source based on these factors (in descending order of priority):
3-64
Evaluation Order for Outgoing Transitions
Note: Implicit ordering creates a dependency between design layout and evaluation
priority. When you rearrange transitions in your chart, you can accidentally change order
of evaluation and affect simulation results. For more control over your designs, use the
default explicit ordering mode to set evaluation priorities.
Order by Hierarchy
3-65
3 Stateflow Chart Semantics
Because the chart is at a higher level in the hierarchy than state A, the transition from
state A1 to state B takes precedence over the transition from state A1 to state A2.
Order by Label
A chart evaluates a group of outgoing transitions with equal hierarchical priority based
on the labels, in the following order of precedence:
A chart evaluates a group of outgoing transitions with equal hierarchical and label
priority based on angular position on the surface of the source object. The transition with
the smallest clock position has the highest priority. For example, a transition with a
2 o'clock source position has a higher priority than a transition with a 4 o'clock source
position. A transition with a 12 o'clock source position has the lowest priority.
Note: These evaluations proceed in a clockwise direction around the source object.
3-66
Evaluation Order for Outgoing Transitions
For each outgoing transition from state A, the parent is the chart and the label
contains a condition. Therefore, the outgoing transitions have equal hierarchical and
label priority.
The conditions [C_one == 1] and [C_two == 2] are false, and the condition [C_three
== 3] is true.
The chart evaluates the outgoing transitions from state A in this order.
3-67
3 Stateflow Chart Semantics
For each outgoing transition from the junction, the parent is the chart and the label
contains a condition. Therefore, the outgoing transitions have equal hierarchical and
label priority.
The conditions [C_one == 1] and [C_two == 2] are false, and the conditions [C_three
== 3] and [C_four == 4] are true.
The junction source point for the transition to state E is exactly 12 o'clock.
The chart evaluates the outgoing transitions from the junction in this order.
Since the transition to state D occurs, the chart does not evaluate the transition to state
E.
3-68
Evaluation Order for Outgoing Transitions
1 Right-click inside the top level of the chart and select Properties from the context
menu.
2 In the Chart properties dialog box, clear the User specified state/transition
execution order check box.
3 Click OK.
What Happens When You Switch Between Explicit and Implicit Ordering
If you switch to implicit ordering mode in a C chart after explicitly ordering transitions,
the transition order resets to follow the implicit rules. Similarly, if you switch back to
explicit ordering mode, without changing the chart, you can restore the previous explicit
transition order. All existing transitions in a chart retain their current order numbers
until you explicitly change them.
Note: If you change back to explicit ordering after modifying the chart, you might not be
able to restore the previous explicit transition order.
By default, charts use explicit ordering for transitions. In this mode, you have explicit
control over the testing priority, as described in Explicit Ordering of Outgoing
Transitions on page 3-61.
If you use implicit ordering for transitions, the following testing order applies. For each
group of transitions that originate from the same state, tiebreaking criteria apply in this
order: hierarchy, label, and angular position.
3-69
3 Stateflow Chart Semantics
The following chart shows the behavior of multilevel transition testing. Assume that the
Super1.Sub1.Subsub1 state is active.
3-70
Evaluation Order for Outgoing Transitions
Because the chart uses implicit ordering, the following transition testing order applies:
3-71
3 Stateflow Chart Semantics
Suppose that you open the sf_debouncer model and reach the point in the simulation
where the Debounce.On state is active.
Because the chart uses implicit ordering, the following transition testing order applies:
3-72
Evaluation Order for Outgoing Transitions
Because the chart uses implicit ordering, the following transition testing order applies:
For more information on how this model works, see Key Behaviors of Debouncer Chart
on page 24-3.
3-73
3 Stateflow Chart Semantics
A state performs its entry action (if specified) when it becomes active. The state becomes
active before its entry action executes and completes.
1 If the parent of the state is not active, perform steps 1 through 4 for the parent first.
2 If the state is a parallel state, check if a sibling parallel state previous in entry order
is active. If so, start at step 1 for this parallel state.
Parallel (AND) states are ordered for entry based on whether you use explicit
ordering (default) or implicit ordering. For details, see Explicit Ordering of Parallel
States on page 3-79 and Implicit Ordering of Parallel States on page 3-80.
3 Mark the state active.
4 Perform any entry actions.
5 Enter children, if needed:
a If the state contains a history junction and there is an active child of this state at
some point after the most recent chart initialization, perform the entry actions
for that child. Otherwise, execute the default flow paths for the state.
b If this state has children that are parallel states (parallel decomposition),
perform entry steps 1 through 5 for each state according to its entry order.
3-74
Process for Entering, Executing, and Exiting States
c If this state has only one child substate, the substate becomes active when the
parent becomes active, regardless of whether a default transition is present.
Entering the parent state automatically makes the substate active. The presence
of any inner transition has no effect on determining the active substate.
6 If the state is a parallel state, perform all entry steps for the sibling state next in
entry order.
7 If the transition path parent is not the same as the parent of the current state,
perform entry steps 6 and 7 for the immediate parent of this state.
8 The chart goes to sleep.
1 Execute the set of outer flow charts (see Order of Execution for a Set of Flow
Charts on page 3-58).
Note: Stateflow charts process these actions based on their order of appearance in
state labels.
3 Execute the set of inner flow charts.
If this action does not cause a state transition, the active children execute, starting
at step 1. Parallel states execute in the same order that they become active.
3-75
3 Stateflow Chart Semantics
1 Sibling parallel states exit starting with the last-entered and progress in reverse
order to the first-entered. See step 2 of Steps for Entering a State on page 3-74.
2 If a state has active children, performs the exit actions of the child states in the
reverse order from when they became active.
3 Perform any exit actions.
4 Mark the state as inactive.
3-76
Process for Entering, Executing, and Exiting States
3-77
3 Stateflow Chart Semantics
Unlike exclusive (OR) states, parallel states do not typically use transitions. Instead,
order of execution depends on:
Explicit ordering
Specify explicitly the execution order of parallel states on a state-by-state basis (see
Explicit Ordering of Parallel States on page 3-79).
Implicit ordering
Override explicit ordering by letting a Stateflow chart use internal rules to order
parallel states (see Implicit Ordering of Parallel States on page 3-80).
Parallel states are assigned priority numbers based on order of execution. The lower the
number, the higher the priority. The priority number of each state appears in the upper
right corner.
Because execution order is a chart property, all parallel states in the chart inherit the
property setting. You cannot mix explicit and implicit ordering in the same Stateflow
3-78
Execution Order for Parallel States
chart. However, you can mix charts with different ordering modes in the same Simulink
model.
When you open a new Stateflow chart or one that does not yet contain any parallel
states the chart automatically assigns priority numbers to parallel states in the order
you create them. Numbering starts with the next available number within the parent
container.
When you enable explicit ordering in a chart that contains implicitly ordered parallel
states, the implicit priorities are preserved for the existing parallel states. When you add
new parallel states, execution order is assigned in the same way as for new Stateflow
charts in order of creation.
You can reset execution order assignments at any time on a state-by-state basis, as
described in Set Execution Order for Parallel States Individually on page 3-80.
When you change execution order for a parallel state, the Stateflow chart automatically
renumbers the other parallel states to preserve their relative execution order. For details,
see Order Maintenance for Parallel States on page 3-81.
1 Right-click inside the top level of the chart and select Properties from the context
menu.
3-79
3 Stateflow Chart Semantics
If your chart already contains parallel states that have been ordered implicitly, the
existing priorities are preserved until you explicitly change them. When you add new
parallel states in explicit mode, your chart automatically assigns priorities based on
order of creation (see How Explicit Ordering Works on page 3-79). However you
can now explicitly change execution order on a state-by-state basis, as described in
Set Execution Order for Parallel States Individually on page 3-80.
In explicit ordering mode, you can change the execution order of individual parallel
states. Right-click the parallel state of interest and select a new priority from the
Execution Order menu.
In implicit ordering mode, a Stateflow chart orders parallel states implicitly based on
location. Priority goes from top to bottom and then left to right, based on these rules:
The higher the vertical position of a parallel state in the chart, the higher the
execution priority for that state.
Among parallel states with the same vertical position, the leftmost state receives
highest priority.
The following example shows how these rules apply to top-level parallel states and
parallel substates.
3-80
Execution Order for Parallel States
Note: Implicit ordering creates a dependency between design layout and execution
priority. When you rearrange parallel states in your chart, you can accidentally change
order of execution and affect simulation results. For more control over your designs, use
the default explicit ordering mode to set execution priorities.
1 Right-click inside the top level of the chart and select Properties from the context
menu.
2 In the Chart properties dialog box, clear the User specified state/transition
execution order check box.
3 Click OK.
3-81
3 Stateflow Chart Semantics
For explicit ordering, a chart preserves the user-specified priorities. Consider this
example of explicit ordering:
Because of explicit ordering, the priority of each state and substate matches the order of
creation in the chart. The chart reprioritizes the parallel states and substates when you
perform these actions:
3-82
Execution Order for Parallel States
The chart preserves the priority set explicitly for top-level state b, but renumbers all
other parallel states to preserve their prior relative order.
For implicit ordering, a chart preserves the intended relative priority based on geometry.
Consider this example of implicit ordering:
If you remove top-level state b and substate e, the chart automatically reprioritizes the
remaining parallel states and substates to preserve implicit geometric order:
However, in explicit ordering mode, a chart cannot always reinstate the original
execution priority to a restored state. It depends on how you restore the state.
If you remove a state by... And restore the state by... What is the priority?
Deleting, cutting, dragging Using the undo command The original priority is
outside the boundaries restored.
of the parent state, or
dragging so its boundaries
overlap the parent state
3-83
3 Stateflow Chart Semantics
If you remove a state by... And restore the state by... What is the priority?
Dragging outside the Dragging it back into the The original priority is lost.
boundaries of the parent parent state The Stateflow chart treats
state or so its boundaries the restored state as the last
overlap the parent state and created and assigns it the
releasing the mouse button lowest execution priority.
Dragging outside the Dragging it back into the The original priority is
boundaries of the parent parent state restored.
state or so its boundaries
overlap the parent state
without releasing the mouse
button
Dragging so its boundaries Dragging it to a location The original priority is
overlap one or more sibling with no overlapping restored.
states boundaries inside the same
parent state
Cutting Pasting The original priority is lost.
The Stateflow chart treats
the restored state as the last
created and assigns it the
lowest execution priority.
When you convert a state with parallel decomposition into a subchart, its substates
retain their relative execution order based on the prevailing explicit or implicit rules.
3-84
Early Return Logic for Event Broadcasts
3-85
3 Stateflow Chart Semantics
In this example, assume that state A is initially active. Event E occurs, causing the
following behavior:
1 The chart root checks to see if there is a valid transition out of the active state A as a
result of event E.
2 A valid transition to state B exists.
3 The condition action of the valid transition executes and broadcasts event F.
3-86
Early Return Logic for Event Broadcasts
State C is now the only active child of its chart. The Stateflow chart cannot return to the
transition from state A to state B and continue after the condition action that broadcast
event F (step 3). First, its source, state A, is no longer active. Second, if the chart allowed
the transition, state B would become the second active child of the chart. This behavior
violates the guideline that a state (or chart) with exclusive (OR) decomposition can never
have more than one active child. Therefore, the chart uses early return logic and halts
the transition from state A to state B.
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
3-87
4
If your system has no operating modes, the system is stateless. If your system has
operating modes, the system is modal.
Classic The default machine type. Provides the full set of semantics for MATLAB
charts and C charts.
4-2
Basic Approach for Modeling Event-Driven Systems
For more information , see How Chart Constructs Interact During Execution on
page 3-8, Differences Between MATLAB and C as Action Language Syntax on page
12-7, and Overview of Mealy and Moore Machines on page 6-2.
1 For each state, what are the actions you want to perform?
2 What are the rules for transitioning between your states? If your chart has no states,
what are the rules for transitioning between branches of your flow logic?
Using your answers to those questions, specify state actions and transition conditions:
1 Draw states to represent your operating modes, if any. See Represent Operating
Modes Using States on page 4-5.
2 Implement the state actions by adding state labels that use the appropriate syntax.
See State Action Types on page 11-2.
3 Draw transitions to represent the direction of flow logic, between states or between
branches of your flow chart. See Transition Between Operating Modes on page
4-18.
4 Implement the transition conditions by adding transition labels that use the
appropriate syntax. See Transition Action Types on page 11-8.
1 Add local data to the appropriate level of the chart hierarchy. See Add Stateflow
Data on page 8-2.
You can also use the Symbol Wizard to add data to your chart. See Define Chart
Symbols with the Symbol Wizard on page 28-33.
2 Specify the type, size, complexity, and other data properties. See Set Data
Properties on page 8-6.
4-3
4 Create Stateflow Charts
Flow chart Encapsulate flow charts containing if-then-else, switch-case, for, while,
or do-while patterns.
MATLAB Write matrix-oriented algorithms; call MATLAB functions for data
analysis and visualization.
Simulink Call Simulink function-call subsystems directly to streamline design and
improve readability.
Truth table Represent combinational logic for decision-making applications such as
fault detection and mode switching.
Use the function format that is most natural for the type of calculation in the state action
or transition condition. For more information on the four types of functions, see:
If the four types of Stateflow functions do not work, you can write your own C or C
++ code for integration with your chart. For more information about custom code
integration, see Share Data Using Custom C Code on page 28-25.
To create a new chart, repeat all the steps in this basic workflow.
To add hierarchy, repeat the previous three steps on lower levels of the current
chart.
4-4
Represent Operating Modes Using States
Create a State
You create states by drawing them in the editor for a particular chart (block). Follow
these steps:
In the drawing area, the pointer becomes state-shaped (rectangular with oval
corners).
3 Click in a particular location to create a state.
The created state appears with a question mark (?) label in its upper left-hand
corner.
4 Click the question mark.
The label for a state specifies its required name and optional actions. See Label States
on page 4-15 for more detail.
4-5
4 Create Stateflow Charts
When your pointer is over a corner, it appears as a double-ended arrow (PC only;
pointer appearance varies with other platforms).
2 Click and drag the state's corner to resize the state and release the left mouse
button.
Note: A parent state must be graphically large enough to accommodate all its substates.
You might need to resize a parent state before dragging a new substate into it. You
can bypass the need for a state of large graphical size by declaring a superstate to be a
subchart. See Encapsulate Modal Logic Using Subcharts on page 7-5 for details.
Group States
When to Group a State
Group a state to move all graphical objects inside a state together. When you group a
state, the chart treats the state and its contents as a single graphical unit. This behavior
simplifies editing of a chart. For example, moving a grouped state moves all substates
and functions inside that state.
4-6
Represent Operating Modes Using States
You can group a state by right-clicking it and then selecting Group & Subchart >
Group in the context menu. The state appears shaded in gray to indicate that it is now
grouped.
If you try to move objects such as states and graphical functions into a grouped
state, you see an invalid intersection error message. Also, the objects with an invalid
intersection have a red border.
You can ungroup a state by right-clicking it and then clearing Group & Subchart >
Group in the context menu. The background of the state no longer appears gray.
4-7
4 Create Stateflow Charts
To alter a state's decomposition, select the state, right-click to display the state's
Decomposition context menu, and select OR (Exclusive) or AND (Parallel) from the
menu.
You can also specify the state decomposition of a chart. In this case, the Stateflow
chart treats its top-level states as substates. The chart creates states with exclusive
decomposition. To specify a chart's decomposition, deselect any selected objects, right-
click to display the chart's Decomposition context menu, and select OR (Exclusive) or
AND (Parallel) from the menu.
4-8
Represent Operating Modes Using States
By default, when you create a new Stateflow chart, explicit ordering applies. In this
case, you specify the activation order on a state-by-state basis.
You can also override explicit ordering by letting the chart order parallel states based
on location. This mode is known as implicit ordering.
For more information, see Explicit Ordering of Parallel States on page 3-79 and
Implicit Ordering of Parallel States on page 3-80.
Note: The activation order of a parallel state appears in its upper right corner.
The State properties dialog box appears. For descriptions of properties, see
Properties You Can Set in the General Pane on page 4-9 and Properties You
Can Set in the Logging Pane on page 4-11.
2 Modify property settings and then click one of these buttons:
Apply to save the changes and keep the State dialog box open
Cancel to return to the previous settings
OK to save the changes and close the dialog box
Help to display the documentation in an HTML browser window
The General pane of the State properties dialog box appears as shown.
4-9
4 Create Stateflow Charts
Property Description
Name Stateflow chart name; read-only; click this hypertext link to
bring the state to the foreground.
Execution order Set the execution order of a parallel (AND) state. This
property does not appear for exclusive (OR) states. See
Execution Order for Parallel States on page 3-78.
4-10
Represent Operating Modes Using States
Property Description
Create data for Select this option to create state activity data. See About
monitoring Active State Data on page 22-30.
Function Inline Select one of these options to control the inlining of state
Option functions in generated code:
Auto
The Logging pane of the State properties dialog box appears as shown.
4-11
4 Create Stateflow Charts
Property Description
Log self activity Saves the self activity value to the MATLAB workspace
during simulation.
Test point Designates the state as a test point that can be monitored
with a floating scope during model simulation. You can also
4-12
Represent Operating Modes Using States
Property Description
log test point values into MATLAB workspace objects. See
Monitor Test Points in Stateflow Charts on page 29-44.
Logging name Specifies the name associated with the logged self activity.
Simulink software uses the signal name as its logging name
by default. To specify a custom logging name, select Custom
from the list box and enter the new name in the adjacent edit
field.
Limit data points to Limits the self activity logged to the most recent samples.
last
Decimation Limits self activity logged by skipping samples. For example,
a decimation factor of 2 saves every other sample.
The Documentation pane of the State properties dialog box appears as shown.
4-13
4 Create Stateflow Charts
Property Description
Description Textual description or comment.
Document link Enter a URL address or a general MATLAB
command. Examples are www.mathworks.com,
mailto:email_address, and edit /spec/data/
speed.txt.
4-14
Represent Operating Modes Using States
Label States
The label for a state specifies its required name for the state and the optional actions
executed when the state is entered, exited, or receives an event while it is active.
name/
entry:entry actions
during:during actions
exit:exit actions
bind:data and events
on event_or_message_name:on event_or_message_name actions
and and
4-15
4 Create Stateflow Charts
Initially, a state's label is empty. The Stateflow chart indicates this by displaying a ? in
the state's label position (upper left corner). Begin labeling the state by entering a name
for the state with the following steps:
The state turns to its highlight color and a question mark character appears in the
upper left-hand corner of the state.
2 Click the ? to edit the label.
Enter the state's name in the first line of the state's label. Names are case sensitive.
To avoid naming conflicts, do not assign the same name to sibling states. However,
you can assign the same name to states that do not share the same parent.
After labeling the state, click outside it. Otherwise, continue entering actions. To
reedit the label, click the label text near the character position you want to edit.
Enter Actions
After entering the name of the state in the label, you can enter actions for any of the
following action types:
Entry Actions begin on a new line with the keyword entry or en, followed by a
colon, followed by one or more action statements on one or more lines. To separate
multiple actions on the same line, use a comma or a semicolon.
You can begin entry actions on the same line as the state's name. In this case, begin
the entry action with a forward slash (/) instead of the entry keyword.
Exit Actions begin on a new line with the keyword exit or ex, followed by a
colon, followed by one or more action statements on one or more lines. To separate
multiple actions on the same line, use a comma or a semicolon.
4-16
Represent Operating Modes Using States
During Actions begin on a new line with the keyword during or du, followed by
a colon, followed by one or more action statements on one or more lines. To separate
multiple actions on the same line, use a comma or a semicolon.
Bind Actions begin on a new line with the keyword bind followed by a colon,
followed by one or more data or events on one or more lines. To separate multiple
actions on the same line, use a comma or a semicolon.
On Actions begin with the keyword on, followed by a space and the name of an
event or message, followed by a colon, followed by one or more action statements on
one or more lines, for example
on ev1: exit();
To separate multiple actions on the same line, use a comma or a semicolon. If you
want different events to trigger different actions, enter multiple on blocks in the state
label. Each block specifies the action for a specific event or message, for example:
on ev1: action1(); on ev2: action2();
The execution of the actions you enter for a state is dependent only on their action type,
and not the order in which you enter actions in the label. If you do not specify the action
type explicitly for a statement, the chart treats that statement as an entry action.
Tip: You can also edit the label in the properties dialog box for the state. See Change
State Properties on page 4-9.
4-17
4 Create Stateflow Charts
Create a Transition
Follow these steps to create transitions between states and junctions:
Transitions do not attach to the corners of states. Corners are used exclusively for
resizing.
Transitions exit a source and enter a destination at angles perpendicular to the source
or destination surface.
All transitions have smart behavior.
To delete a transition, click it and select Edit > Cut, or press the Delete key.
See the following sections for help with creating self-loop and default transitions:
4-18
Transition Between Operating Modes
Label Transitions
Transition labels contain syntax that accompanies the execution of a transition. The
following topics discuss creating and editing transition labels:
For more information on transition concepts, see Transition Label Notation on page
2-21.
For more information on transition label contents, see Transition Action Types on page
11-8.
The transition changes to its highlight color and a question mark (?) appears on the
transition. The ? character is the default empty label for transitions.
2 Left-click the ? to edit the label.
To apply and exit the edit, deselect the object. To reedit the label, simply left-click the
label text near the character position you want to edit.
4-19
4 Create Stateflow Charts
Transitions do not need labels. You can specify some, all, or none of the parts of the label.
Rules for writing valid transition labels include:
Can have any alphanumeric and special character combination, with the exception of
embedded spaces
Cannot begin with a numeric character
Can have any length
Can have carriage returns in most cases
Must have an ellipsis (...) to continue on the next line
Move Transitions
You can move transition lines with a combination of several individual movements.
These movements are described in the following topics:
In addition, transitions move along with the movements of states and junctions.
You can move or "bow" transition lines with the following procedure:
1 Place your pointer on the transition at any point along the transition except the
arrow or attach points.
2 Click and drag your pointer to move the transition point to another location.
Only the transition line moves. The arrow and attachment points do not move.
3 Release the mouse button to specify the transition point location.
4-20
Transition Between Operating Modes
The result is a bowed transition line. Repeat the preceding steps to move the transition
back into its original shape or into another shape.
You can move the source or end points of a transition to place them in exact locations as
follows:
1 Place your pointer over an attach point until it changes to a small circle.
2 Click and drag your pointer to move the attach point to another location.
3 Release the mouse button to specify the new attach point.
The appearance of the transition changes from a solid to a dashed line when you detach
and release a destination attach point. Once you attach the transition to a destination,
the dashed line changes to a solid line.
The appearance of the transition changes to a default transition when you detach and
release a source attach point. Once you attach the transition to a source, the appearance
returns to normal.
You can move transition labels to make the Stateflow chart more readable. To move a
transition label, do the following:
If you mistakenly click and then immediately release the left mouse button on the label,
you will be in edit mode for the label. Press the Esc key to deselect the label and try
again. You can also click the mouse on an empty location in the chart to deselect the
label.
4-21
4 Create Stateflow Charts
1 Create the transition by clicking and dragging from the source state or junction.
2 Press the S key or right-click your mouse to enable a curved transition.
3 Continue dragging the transition tip back to a location on the source state or
junction.
Click the Default Transition button in the toolbar and click a location in the
drawing area close to the state or junction you want to be the destination for the default
transition. Drag your pointer to the destination object to attach the default transition.
The size of the endpoint of the default transition is proportional to the arrowhead size.
See Change Transition Arrowhead Size on page 4-21.
Default transitions can be labeled just like other transitions. See Label Default
Transitions on page 2-35 for an example.
4-22
Transition Between Operating Modes
4-23
4 Create Stateflow Charts
4-24
Transition Between Operating Modes
Field Description
Source Source of the transition; read-only; click the hypertext
link to bring the transition source to the foreground.
Destination Destination of the transition; read-only; click the
hypertext link to bring the transition destination to
the foreground.
Parent Parent of this state; read-only; click the hypertext link
to bring the parent to the foreground.
Execution order The order in which the chart executes the transition.
Label The transition's label. See Transition Label Notation
on page 2-21 for more information on valid label
formats.
Description Textual description or comment.
Document link Enter a Web URL address or a general MATLAB
command. Examples are www.mathworks.com,
mailto:email_address, and edit/spec/data/
speed.txt.
2 After making changes, click one of these buttons:
Apply to save the changes and keep the Transition dialog box open.
Cancel to return to the previous settings for the dialog box.
OK to save the changes and close the dialog box.
Help to display Stateflow online help in an HTML browser window.
4-25
4 Create Stateflow Charts
Stateflow Editor
Use the Stateflow Editor to draw, zoom, modify, print, and save a chart shown in the
window.
Command Result
sfnew Creates an chart with the default action
language. For more information, see
sfnew.
sfnew -matlab Creates an empty chart with MATLAB as
the action language.
sfnew -C Creates an empty C chart.
4-26
Stateflow Editor Operations
Command Result
stateflow Creates an empty chart with the default
action language and displays the
Stateflow block library.
Title bar
4-27
4 Create Stateflow Charts
The full chart name appears here in model name/chart name* format. The *
character appears on the end of the chart name for a newly created chart or for an
existing chart that has been edited but not saved yet.
Menu bar and toolbar
Most editor commands are available from the menu bar. The toolbar contains buttons
for cut, copy, paste, and other commonly used editor commands. You can identify each
tool of the toolbar by placing your pointer over it until an identifying tool tip appears.
The toolbar also contains buttons for navigating a chart's subchart hierarchy (see
Navigate Subcharts on page 7-9).
Object palette
4-28
Stateflow Editor Operations
Displays a set of tools for drawing states, transitions, and other chart objects. To add
an object, you can use the palette to:
Click the icon for the object and move the cursor to the spot in the drawing area
where you want to place the object.
Drag the icon for the object into the drawing area.
Double-click the icon and then click multiple times in the drawing area to make
copies of the object.
Explorer bar
4-29
4 Create Stateflow Charts
The breadcrumb shows the systems that you have open in the editor. Click a system
in the breadcrumb to display that system.
Model Browser
Click the double arrows in the bottom left corner to open or close a tree-
structured view of the model in the editor.
Drawing area This area displays an editable copy of a chart.
Context menus (shortcut menus) These menus pop up from the drawing area
when you right-click an object. They display commands that apply only to that object.
If you right-click an empty area of the chart, the shortcut menu applies to the chart
object.
Status information Near the top of the editor, you can see (and reset) the
simulation time and the simulation mode. The bottom status bar displays the status
of the Stateflow processing, tool tips, the zoom factor, and the solver.
4-30
Stateflow Editor Operations
You can undo and redo many operations you complete on Stateflow objects in the
Symbols or Property Inspector windows.
You can undo or redo all editor operations, with the following exceptions:
You cannot undo the operation of turning subcharting off for a state previously
subcharted.
Note: When you perform one of the preceding operations, the undo and redo buttons
are disabled from undoing and redoing any prior operations.
4-31
4 Create Stateflow Charts
The Colors & Fonts dialog box helps you specify a color scheme for the chart as a whole,
or colors and label fonts for different types of objects in a chart.
To display the Colors & Fonts dialog box, in the Stateflow Editor, select File > Stateflow
Preferences > Style.
The drawing area of the dialog box displays examples of the types of objects whose colors
and font labels you can specify. The examples use the colors and label fonts specified by
4-32
Stateflow Editor Operations
the current color scheme for the chart. To choose another color scheme, select the scheme
from the dialog box's Schemes menu. The dialog box displays the selected color scheme.
Click Apply to apply the selected scheme to the chart or OK to apply the scheme and
dismiss the dialog box.
To make the selected scheme the default scheme for all charts, select Make this the
"Default" scheme from the dialog box's Options menu.
To modify the current scheme, position your pointer over the example of the type of object
whose color or label font you want to change. Then left-click to change the object's color or
right-click to change the object's font. If you left-click, a color chooser dialog box appears.
Use the dialog box to select a new color for the selected object type.
If the selected object is a label and you right-click, a font selection dialog box appears.
4-33
4 Create Stateflow Charts
Use the font selector to choose a new font for the selected label.
To save changes to the default color scheme, select Save defaults to disk from the
Colors & Fonts dialog box's Options menu.
Note: Choosing Save defaults to disk has no effect if the modified scheme is not the
default scheme.
4-34
Stateflow Editor Operations
For example, the Temporal Logic chart uses content preview. The chart Without
Temporal Logic does not.
To turn on content preview for Stateflow charts and subcharts, right-click the chart and
select Format > Content Preview. For Simulink functions, right-click the function
and select Content Preview. For details on content preview in Simulink, see Preview
Content of Hierarchical Items (Simulink).
Note: In order to see the content preview, you may need to enlarge the Stateflow chart or
object.
4-35
4 Create Stateflow Charts
options for keywords, data, event, messages, and function names, without having to
navigate the Model Explorer. In a Stateflow chart, to complete entries:
1 Type the first few characters of the word that you want.
2 Press Tab to see the list of possible matches.
3 Use the arrow keys to select a word.
4 Press Tab to make the selection.
Close the list without selecting anything by pressing the Esc key.
Type additional characters onto your original term to narrow the list of possible
matches.
If you press Tab and no words are listed, then the current word is the only possible
match.
Keyword
Comment
Event
Message
Function
String
Number
The following chart illustrates the default highlighting for language elements.
4-36
Stateflow Editor Operations
If the parser cannot resolve a syntax element, the chart displays the element in the
default text color.
To modify color assignments, see Edit Syntax Highlighting on page 4-37. To disable
syntax highlighting, see Enable and Disable Syntax Highlighting on page 4-37.
1 In the Stateflow Editor, select File > Stateflow Preferences > Syntax
Highlighting.
1 In the Stateflow Editor, select File > Stateflow Preferences > Syntax
Highlighting.
4-37
4 Create Stateflow Charts
This step adds objects to the list of already selected objects unless an object was
already selected, in which case, the object is deselected. This type of multiple object
selection is useful for selecting objects within a state without selecting the state itself.
To deselect all selected objects, click in the drawing area, but not on an object.
When an object is selected, it appears highlighted in the color set as the selection color
(blue by default; see Specify Colors and Fonts in a Chart on page 4-31 for more
information).
To cut an object, right-click the object and select Cut from the context menu.
To paste the most recently cut selection of objects, right-click in the chart and select
Paste from the context menu.
4-38
Stateflow Editor Operations
Note: If you copy and paste a state in the chart, these rules apply:
If the original state uses the default ? label, then the new state retains that label.
If the original state does not use the default ? label, then a unique name is generated
for the new state.
Alternatively, to copy from one chart to another, select Copy and then Paste from the
right-click context menu.
Alignment
Distribution
Resizing
States
Functions
Boxes
4-39
4 Create Stateflow Charts
Junctions
The basic steps to align, distribute, or resize chart objects are similar.
1 If the chart includes parallel states or outgoing transitions from a single source,
make sure that the chart uses explicit ordering.
To set explicit ordering, in the Chart properties dialog box, select User specified
state/transition execution order.
Note: If a chart uses implicit ordering to determine execution order of parallel states
or evaluation order of outgoing transitions, the order can change after you align,
distribute, or resize chart objects. Using explicit ordering prevents this change from
occurring. For more information, see Execution Order for Parallel States on page
3-78 and Evaluation Order for Outgoing Transitions on page 3-60.
2 Select the chart objects that you want to align, distribute, or resize.
You can select objects in any order, one-by-one or by drawing a box around them.
3 Decide which object to use as the anchor for aligning, distributing, or resizing other
chart objects. This object is the reference object.
To set an object as the reference, right-click the object. Brackets appear around the
reference object. In the following example, the Door and Motion states are selected,
and the Door state is the reference.
4-40
Stateflow Editor Operations
Note: If you select objects one-by-one, the last object that you select acts as the
reference.
4 Select an option from the Chart > Arrange menu to align, distribute, or resize your
chosen objects.
For more information about chart object distribution options, see Options for
Distributing Chart Objects on page 4-41
4-41
4 Create Stateflow Charts
Suppose that you open the sf_pool model and see a chart with multiple MATLAB
functions.
4-42
Stateflow Editor Operations
1 Type sf_pool at the MATLAB command prompt to open the model. Double-click the
Pool block to open the chart.
4-43
4 Create Stateflow Charts
This object is the reference (or anchor) for aligning the three functions. Brackets
appear around the function.
This step aligns the right edges of the three functions based on the right edge of
getBallInteraction.
4-44
Stateflow Editor Operations
Suppose that you open the sf_frame_sync_controller model and see a chart with
three states.
4-45
4 Create Stateflow Charts
Tip: Double-click the Frame Sync Controller block to open the chart.
2 Select the three states in any order.
4-46
Stateflow Editor Operations
4-47
4 Create Stateflow Charts
Note: When you select the three states in any order, your reference object might
differ from the one shown. This difference does not affect distribution of vertical
white space.
3 Select Chart > Arrange > Even Vertical Gaps.
This step ensures that the vertical white space between any two states is the same.
Suppose that you open the sf_clutch model and see a chart with graphical functions of
different sizes.
To resize the graphical functions so that they all match the size of detectSlip:
4-48
Stateflow Editor Operations
This step ensures that the three functions are the same size.
4-49
4 Create Stateflow Charts
a To align the functions, select Chart > Arrange > Align Left.
4-50
Stateflow Editor Operations
b To distribute the functions evenly in terms of vertical spacing, select Chart >
Arrange > Even Vertical Gaps.
4-51
4 Create Stateflow Charts
4-52
Stateflow Editor Operations
Straightens transitions.
Repositions horizontal transition labels to the midpoint.
To format your chart, select Chart > Arrange > Arrange Automatically.
4-53
4 Create Stateflow Charts
4-54
Stateflow Editor Operations
3 Enter the destination directory of the report file and select options to specify what
objects appear in the report.
For details on setting the fields in the File locations/naming options section, see
Print Model Reports (Simulink). For details on the report you receive, see System
Report Options on page 4-56 and Report Format on page 4-56.
4 Click Print.
The Print Details dialog box appears and tracks the report generation. See Print Model
Reports (Simulink) for more details on this window.
Tip: If you have the Simulink Report Generator installed, you can generate a detailed
report about a system. To do so, in the Simulink Editor, select File > Reports >
System Design Description. For more information, see System Design Description
(Simulink Report Generator).
4-55
4 Create Stateflow Charts
Reports for the current Stateflow chart vary with your choice of one of the System
reporting options fields:
Current Reports on the chart or subchart in the current editor window and its
immediate parent Simulink system.
Current and above This option is grayed out and unavailable for printing chart
details.
Current and below Reports on the chart or subchart in the current editor window
and all contents at lower levels of the hierarchy, along with the immediate Simulink
system.
Entire model Reports on the entire model including all charts and all Simulink
systems.
If you select this option, you can modify the report as follows:
Look under mask dialog Includes the contents of masked subsystems in the
report.
Expand unique library links Includes the contents of library blocks that are
subsystems in the report.
The report includes a library subsystem only once even if it occurs in more than
one place in the model.
Report Format
The report shows the title of the system in the Simulink model containing the chart or
subchart in current view.
A representation of Simulink hierarchy for the containing system and its subsystems
follows. Each subsystem in the hierarchy links to the report of its Stateflow charts.
The report section for the Stateflow charts of each system or subsystem begins with a
small report on the system or subsystem, followed by a report of each contained chart.
Each chart report includes a reproduction of its chart with links for subcharted states
that have reports of their own.
An appendix tabulates the covered Stateflow and Simulink objects in the report.
4-56
5
5-2
Difference Between Flow Charts and State Transition Diagrams
By contrast, a state transition diagram is used for sequential design. It stores its current
state in memory to preserve local data and activity between updates. As a result, state
diagrams can begin executing where they left off in the previous time step, making them
suitable for modeling reactive or supervisory systems that depend on history. In these
kinds of systems, the current result depends on a previous result.
Related Examples
Create Flow Charts with the Pattern Wizard on page 5-5
More About
States on page 2-7
Transitions on page 2-19
5-3
5 Model Logic Patterns and Iterative Loops Using Flow Charts
5-4
Create Flow Charts with the Pattern Wizard
In this section...
Why Use the Pattern Wizard? on page 5-5
How to Create Reusable Flow Charts on page 5-5
Insert a Logic Pattern Using the Pattern Wizard on page 5-7
Save and Reuse Flow Chart Patterns on page 5-10
MAAB-Compliant Patterns from the Pattern Wizard on page 5-12
Create and Reuse a Custom Pattern with the Pattern Wizard on page 5-21
Note: The Pattern Wizard is only used for flow charts, and cannot be used to save states
and subcharts. Atomic subcharts can be used to reuse states and subcharts.
1 Open a chart.
5-5
5 Model Logic Patterns and Iterative Loops Using Flow Charts
You can also add or change conditions and actions directly in the chart.
5 Click OK.
The pattern appears in your chart. The geometry and layout comply with MAAB
guidelines.
6 Customize the pattern as desired.
For example, you may want to add or change flow charts, conditions, or actions. See
Create and Reuse a Custom Pattern with the Pattern Wizard on page 5-21.
7 Save the pattern to a central location as described in Save and Reuse Flow Chart
Patterns on page 5-10.
You can now retrieve your pattern directly from the editor to reuse in graphical functions
and charts. See How to Add Flow Chart Patterns in Graphical Functions on page
5-11 and How to Add Flow Chart Patterns in Charts on page 5-11.
5-6
Create Flow Charts with the Pattern Wizard
If your selection is not eligible, when you select Chart > Insert Pattern on Selection,
you see a message instead of pattern options.
Message Issue
Select a vertical transition You have not selected a vertical transition.
Selected transition must be exactly vertical You selected a transition, but it is not
vertical.
Select only one vertical transition You have selected more than one
transition.
Editor must contain only transitions and There are other objects, such as states,
junctions functions or truth tables in the editor.
Insert a Pattern
1 Open a chart.
2 Select Chart > Add Pattern in Chart > Loop > While.
5-7
5 Model Logic Patterns and Iterative Loops Using Flow Charts
You can also add or change conditions and actions directly in the chart.
5 Click OK.
5-8
Create Flow Charts with the Pattern Wizard
5-9
5 Model Logic Patterns and Iterative Loops Using Flow Charts
The Pattern Wizard uses a single, flat folder for saving and retrieving flow chart
patterns. Follow these guidelines when creating your pattern folder:
Store all flow charts at the top level of the pattern folder; do not create subfolders.
Make sure all flow chart files have a .mdl or .slx extension.
1 Create a folder for storing your patterns according to Guidelines for Creating a
Pattern Folder on page 5-10.
2 In your chart, select flow charts with the patterns you want to save.
3 Select Chart > Save Pattern.
The Pattern Wizard displays a message that prompts you to choose a folder for
storing custom patterns.
The Pattern Wizard stores your flow charts in the pattern folder as a model file.
The patterns that you save in this folder appear in a drop-down list when you select
Chart > Add Pattern in Chart > Custom, as described in How to Add Flow Chart
Patterns in Graphical Functions on page 5-11 and How to Add Flow Chart
Patterns in Charts on page 5-11.
4 Click OK to dismiss the message.
The Pattern Wizard saves your pattern as a model file in the designated folder.
5-10
Create Flow Charts with the Pattern Wizard
The Select a Custom Pattern dialog box appears, displaying all of your saved
patterns.
You have not saved any patterns for the Pattern Wizard to retrieve. See Save and
Reuse Flow Chart Patterns on page 5-10.
5 Select a pattern from the list in the dialog box and click OK.
The pattern appears in the graphical function, which expands to fit the flow chart.
6 Define all necessary inputs, outputs, and local data in the graphical function and the
chart that calls it.
1 In the menu bar, select Chart > Add Pattern in Chart > Custom.
5-11
5 Model Logic Patterns and Iterative Loops Using Flow Charts
The Select a Custom Pattern dialog box appears, displaying all of your saved
patterns.
2 Select a pattern from the list in the dialog box and click OK.
The Pattern Wizard generates the following MAAB-compliant decision logic patterns:
if
5-12
Create Flow Charts with the Pattern Wizard
if-else
if-elseif
5-13
5 Model Logic Patterns and Iterative Loops Using Flow Charts
if-elseif-else
5-14
Create Flow Charts with the Pattern Wizard
if-elseif-elseif-else
5-15
5 Model Logic Patterns and Iterative Loops Using Flow Charts
Nested if
The Pattern Wizard generates the following MAAB-compliant iterative loop patterns:
for
5-16
Create Flow Charts with the Pattern Wizard
while
do-while
5-17
5 Model Logic Patterns and Iterative Loops Using Flow Charts
5-18
Create Flow Charts with the Pattern Wizard
5-19
5 Model Logic Patterns and Iterative Loops Using Flow Charts
5-20
Create Flow Charts with the Pattern Wizard
Do not specify an action yet. You will add another loop for iterating the second
dimension of the matrix.
4 Click OK.
The Pattern Wizard generates the first iterative loop in your chart.
5-21
5 Model Logic Patterns and Iterative Loops Using Flow Charts
This pattern:
Conforms to all best practices for creating flow charts, as described in Best
Practices for Creating Flow Charts on page 5-31.
Provides the correct syntax for conditions and condition actions.
5 Add the second loop:
a Expand the editor window so the chart can accommodate a second pattern.
b Select the vertical transition labelled {action1}.
c Select Chart > Insert Pattern on Selection > Loop > For.
d Enter the initializer, loop test, and counting expressions for the second iterator
j, and a placeholder for an action to retrieve each element in the upper triangle
as follows:
5-22
Create Flow Charts with the Pattern Wizard
e Click OK. The Pattern Wizard adds the second loop to the first loop.
5-23
5 Model Logic Patterns and Iterative Loops Using Flow Charts
Save your pattern to a central location for reuse (see Save the Upper Triangle Iterator
Pattern for Reuse on page 5-24).
1 Create a folder for storing flow chart patterns, as described in Guidelines for
Creating a Pattern Folder on page 5-10.
2 Open the chart that contains the custom pattern.
3 In the chart, select the flow chart with the pattern that you want to save.
4 In the editor, select Chart > Save Pattern and take one of these actions.
5-24
Create Flow Charts with the Pattern Wizard
The Pattern Wizard automatically saves your pattern as a model file under the name
that you specify.
Input Description
u 2-D matrix
numrow Number of rows in the matrix
numcol Number of columns in the matrix
4 Right-click inside the function and select Group & Subchart > Subchart.
5-25
5 Model Logic Patterns and Iterative Loops Using Flow Charts
5 Double-click to open the subcharted function and select Chart > Add Pattern in
Function > Custom.
The Select a Custom Pattern dialog box opens, listing all the patterns that you have
saved in your pattern folder.
5-26
Create Flow Charts with the Pattern Wizard
The Pattern Wizard adds your custom pattern to the graphical function.
5-27
5 Model Logic Patterns and Iterative Loops Using Flow Charts
Before calling this function from a chart, be sure to modify data names, types, and sizes
as necessary and substitute an appropriate action.
5-28
Draw and Customize Flow Charts By Hand
1 Open a chart.
2 From the editor toolbar, drag one or more connective junctions into the chart using
the Connective Junction tool:
5-29
5 Model Logic Patterns and Iterative Loops Using Flow Charts
1 Right-click a connective junction and select Properties from the drop-down menu.
Field Description
Parent Parent of the connective junction (read-only). Click the
hypertext link to bring the parent to the foreground.
Description Textual description or comment.
Document link Link to other information. Enter a URL address
or a general MATLAB command. Examples are
www.mathworks.com, mailto:email_address, and
edit/spec/data/speed.txt.
3 Click Apply to save changes.
5-30
Best Practices for Creating Flow Charts
This guideline ensures that execution of a flow chart always reaches the termination
point.
Provide an unconditional transition from every junction except the terminating junction
This guideline ensures that unintended backtracking behavior does not occur in a flow
chart. If unintended backtracking occurs during simulation, a warning message appears.
You can control the level of diagnostic action for unintended backtracking in the
Diagnostics > Stateflow pane of the Model Configuration Parameters dialog box. For
more information, see the documentation for the Unexpected backtracking (Simulink)
diagnostic.
The junction does not have an unconditional transition path to a state or terminating
junction.
Multiple transition paths lead to that junction.
Flow charts test transitions, but do not execute them (and, therefore, never execute
transition actions).
5-31
5 Model Logic Patterns and Iterative Loops Using Flow Charts
5-32
6
X (n + 1) = f ( X (n),u)
In this equation:
State is a combination of local data and chart activity. Therefore, computing state means
updating local data and making transitions from a currently active state to a new state.
State persists from one time step to another.
In this context, Mealy and Moore machines each have well-defined semantics.
6-2
Overview of Mealy and Moore Machines
You can create charts that implement pure Mealy or Moore semantics as a subset of
Stateflow chart semantics (see Create Mealy and Moore Charts on page 6-5).
Mealy and Moore charts can be used in simulation and code generation with Embedded
Coder, Simulink Coder, and HDL Coder software, which are available separately.
Availability of Output
Mealy machines compute output on transitions, while Moore machines compute outputs
in states. Therefore, Mealy charts can compute output earlier than Moore charts
that is, at the time the chart's default path executes. If you enable the chart property
Execute (enter) Chart At Initialization for a Mealy chart, this computation occurs
at t = 0 (first time step); otherwise, it occurs at t = 1 (next time step). By contrast, Moore
machines can compute outputs only after the default path executes. Until then, outputs
take the default values.
6-3
6 Build Mealy and Moore Charts
You can verify the Mealy and Moore charts you create to ensure that they conform to
their formal definitions and semantic rules. Error messages appear at compile time
(not at design time).
Moore charts provide a more efficient implementation than Classic charts, both for C/
C++and HDL targets.
You can use a Moore chart to model a feedback loop. In Moore charts, inputs do not
have direct feedthrough. Therefore, you can design a loop with feedback from the
output port to the input port without introducing an algebraic loop. Mealy and Classic
charts have direct feedthrough and error with an algebraic loop.
More About
Design Considerations for Mealy Charts on page 6-8
Design Considerations for Moore Charts on page 6-11
6-4
Create Mealy and Moore Charts
1 Add a new Chart block to a Simulink model; then double-click the block to open the
Stateflow Editor.
2 Right-click in an empty area of the chart and select Properties.
Mealy Moore
5 Design your chart according to the guidelines for the chart type (see Design
Considerations for Mealy Charts on page 6-8 and Design Considerations for
Moore Charts on page 6-11.
6-5
6 Build Mealy and Moore Charts
6-6
Model a Vending Machine Using Mealy Semantics
behaves like a Mealy machine because its output soda depends on both the input coin
and current state, as follows:
When initial state got_0 is active. No coin has been received or no coins are left.
If a nickel is received (coin == 1), output soda remains 0, but state got_nickel
becomes active.
If a dime is received (coin == 2), output soda remains 0, but state got_dime
becomes active.
If input coin is not a dime or a nickel, state got_0 stays active and no soda is
released (output soda = 0).
If another nickel is received (coin == 1), state got_dime becomes active, but no can
is released (soda remains at 0).
If a dime is received (coin == 2), a can is released (soda = 1), the coins are banked,
and the active state becomes got_0 because no coins are left.
If input coin is not a dime or a nickel, state got_nickel stays active and no can is
released (output soda = 0).
If a nickel is received (coin == 1), a can is released (soda = 1), the coins are banked,
and the active state becomes got_0 because no coins are left.
If a dime is received (coin == 2), a can is released (soda = 1), 15 cents is banked, and
the active state becomes got_nickel because a nickel (change) is left.
If input coin is not a dime or a nickel, state got_dime stays active and no can is
released (output soda = 0).
6-7
6 Build Mealy and Moore Charts
Mealy Semantics
To ensure that output is a function of input and state, Mealy state machines enforce the
following semantics:
Note: A chart provides one time base for input and clock (see Calculate Output and
State Using One Time Base on page 6-10).
Chart must compute outputs whenever there is a change on the input port.
Chart must compute outputs only in transitions, not in states.
You can compute outputs only in the condition actions of outer and inner transitions. A
common modeling style for Mealy machines is to test inputs in conditions and compute
outputs in the associated action.
6-8
Design Considerations for Mealy Charts
You cannot use state actions or transition actions in Mealy charts. This restriction
enforces Mealy semantics by:
Preventing you from computing output without considering changes on the input port
Ensuring that output depends on current state and not next state
You can define inputs, outputs, local data, parameters, and constants in Mealy charts,
but other data restrictions apply:
Machine-parented data is data that you define for a Stateflow machine, which is the
collection of all Stateflow blocks in a Simulink model. The Stateflow machine is the
highest level of the Stateflow hierarchy. When you define data at this level, every chart
in the machine can read and modify the data. To ensure that Mealy charts do not access
data that can be modified unpredictably outside the chart, do not use machine-parented
data.
You cannot define data store memory (DSM) in Mealy charts because DSM objects can
be modified by objects external to the chart. A Stateflow chart uses data store memory
to share data with a Simulink model. Data store memory acts as global data that can be
modified by other blocks and models in the Simulink hierarchy that contains the chart.
Mealy charts should not access data that can change unpredictably.
Do: Do Not:
Use input events to trigger the chart Broadcast any type of event
6-9
6 Build Mealy and Moore Charts
Do: Do Not:
Use event-based temporal logic to guard Use local events to guard transitions
transitions
You cannot use local events in Mealy charts
You can use event-based temporal logic because they are not deterministic. These
in Mealy charts because it behaves events can occur while the chart computes
synchronously (see Operators for Event- outputs and, therefore, violate Mealy
Based Temporal Logic on page 11-57). semantics that require charts to compute
Think of the change in value of a temporal outputs whenever input changes.
logic condition as an event that the chart
schedules internally. Therefore, at each Use implicit events such as
time step, the chart retains its notion of chg(data_name), en(state_name), or
state because it knows how many ticks ex(state_name).
remain before the temporal event executes.
You can use one time base for clock and input, as determined by the Simulink solver (see
Solvers (Simulink)). The Simulink solver sets the clock rate to be fast enough to capture
input changes. As a result, a Mealy chart commonly computes outputs and changes
states in the same time step.
6-10
Design Considerations for Moore Charts
Moore Semantics
In Moore charts, output is a function of current state only. At every time step, a Moore
chart wakes up, computes its outputs, and then evaluates its inputs to reconfigure itself
for the next time step. For example, after evaluating its inputs, the Moore chart might
take transitions to a new configuration of active states, also called next state. However,
the Moore chart must always compute its outputs before changing state.
To ensure that output is a function only of state, Moore state machines enforce the
following semantics:
6-11
6 Build Mealy and Moore Charts
To ensure that outputs depend solely on current state, you must compute outputs in state
actions, subject to the following restrictions:
You cannot define actions on transitions because transitions almost always depend on
inputs. For example, if you compute outputs in a condition action on a transition, the
chart updates outputs whenever there is a change on the input, which is a violation of
Moore semantics.
Combine Actions
For Classic charts, you can define different types of actions in states (see State Action
Types on page 11-2). In Moore charts, you can include only one action per state. The
action for a state can consist of multiple command statements. Stateflow evaluates states
in Moore charts from the top level down. Active states in Moore charts execute the state
action before evaluating the transitions. Therefore, outputs are computed at each time
step whether an outer transition is valid or not.
Do Not Label State Actions
Do not label state actions in Moore charts with any keywords, such as en,du, or ex.
6-12
Design Considerations for Moore Charts
Machine-parented data is data that you define for a Stateflow machine. The Stateflow
machine is the highest level of the Stateflow hierarchy. When you define data at this
level, every chart in the machine can read and modify the data. To ensure that Moore
charts do not access data that can be modified unpredictably outside the chart, do not use
machine-parented data.
Do Not Define Data Store Memory
You cannot define data store memory (DSM) in Moore charts because objects external to
the chart modify DSM objects. A Stateflow chart uses data store memory to share data
with a Simulink model. Data store memory acts as global data. Other blocks and models
in the Simulink hierarchy that contains the chart can modify DSM. Moore charts must
not access data that can change unpredictably.
6-13
6 Build Mealy and Moore Charts
Here, each transition tests input u in a condition, but modifies output y in a condition
action, based on the value of the input. This construct violates Moore semantics and
triggers an error. Similarly, you cannot use transition actions in Moore charts.
Because Moore charts cannot have condition or transition actions, use states to produce
actions.
You cannot use Simulink functions in Moore charts. This restriction prevents violations
of Moore semantics during chart execution.
6-14
Design Considerations for Moore Charts
In Moore charts, you cannot set the update method to Continuous. For modeling
systems with continuous-time in Stateflow, use Classic or Mealy charts.
6-15
6 Build Mealy and Moore Charts
This chart uses temporal logic to regulate state transitions. The after operator
implements a countdown timer, which initializes when the source state is entered. By
default, the timer provides a longer green light in the East-West direction than in the
North-South direction because the volume of traffic is greater on the East-West road.
6-16
Model a Traffic Light Using Moore Semantics
The green light in the East-West direction stays on for at least 20 clock ticks, but it can
remain green as long as no traffic arrives in the North-South direction. A sensor detects
whether cars are waiting at the red light in the North-South direction. If so, the light
turns green in the North-South direction to keep traffic moving.
The Light_Controller chart behaves like a Moore machine because it updates its outputs
based on current state before transitioning to a new state, as follows:
When initial state Stop is active. Traffic light is red for North-South, green for
East-West.
In active state StopForTraffic. Traffic light has been red for North-South, green for
East-West for at least 20 clock ticks.
In active state StopToGo. Traffic light must reverse traffic flow in response to
sensor.
In active state Go. Traffic light has been red for North-South, yellow for East-West
for 3 clock ticks.
In active state GoToStop. Traffic light has been green for North-South, red for East-
West for 10 clock ticks.
6-17
6 Build Mealy and Moore Charts
6-18
Effects of Changing the Chart Type
Here is a summary of what happens when you change chart types mid-design.
From To Result
Mealy Classic Mealy charts retain their semantics when changed to Classic type.
Classic Mealy If the Classic chart confirms to Mealy semantic rules, the Mealy
chart exhibits equivalent behavior, provided that output is defined at
every time step.
Moore Classic State actions in the Moore chart behave as entry actions because
they are not labeled. Therefore, the Classic chart will not exhibit
behavior that is equivalent to the original Moore chart. Requires
redesign.
Classic Moore Actions that are unlabeled in the Classic chart ( entry actions by
default) behave as during and exit actions. Therefore, the Moore
chart will not exhibit behavior that is equivalent to the original
Classic chart. Requires redesign.
Mealy Moore Converting between these two types does not produce equivalent
Moore Mealy behavior because Mealy and Moore rules about placement of actions
are mutually exclusive. Requires redesign.
6-19
6 Build Mealy and Moore Charts
For example, recall the Mealy vending machine chart described in Model a Vending
Machine Using Mealy Semantics on page 6-6.
If you change the chart type to Moore and rebuild, you get the following diagnostic
message:
6-20
Debug Mealy and Moore Charts
This message indicates that you cannot define actions on transitions. Without actions,
you cannot compute outputs on transitions in Moore charts (see Do Not Use Actions on
Transitions on page 6-13). According to Moore semantics, you must instead compute
outputs in state actions (see Design Rules for Moore Charts on page 6-11).
In the Mealy chart, each condition action computes output (whether or not soda is
released) based on input (the coin received). Each state represents one of the three
possible coin inputs: nickel, dime, or no coin. The Mealy chart computes the output as it
transitions to the next state. When you move this logic out of transitions and into state
actions in the Moore chart, you need more states. The reason is that in the Moore chart,
each state must represent not only coins received, but also the soda release condition.
The Moore chart must compute output according to the active state before considering
input. As a result, there will be a delay in releasing soda, even if the machine receives
enough money to cover the cost.
6-21
6 Build Mealy and Moore Charts
6-22
Debug Mealy and Moore Charts
For this vending machine, Mealy is a better modeling paradigm because there is no
delay in releasing soda once sufficient coins are received. By contrast, the Moore vending
machine requires an extra time step to pass before producing soda. Since the Moore
vending machine accepts a nickel, a dime, or no coin in a given time step, it is possible
that the soda will be produced in a time step in which a coin is accepted toward the next
purchase. In this situation, the delivery of a soda may appear to be in response to this
coin, but actually occurs because the vending machine received the purchase price in
previous time steps.
6-23
7
In this section...
What Is a History Junction? on page 7-2
Create a History Junction on page 7-2
Change History Junction Size on page 7-3
Change History Junction Properties on page 7-3
To move a history junction to a new location, click and drag it to the new position.
7-2
Record State Activity Using History Junctions
7-3
7 Techniques for Streamlining Chart Design
Field Description
Parent Parent of this history junction; read-only; click the
hypertext link to bring the parent to the foreground.
Description Textual description/comment.
Document Link Enter a URL address or a general MATLAB
command. Examples are www.mathworks.com,
mailto:email_address, and edit/spec/data/
speed.txt.
3 When finished editing, click one of the following buttons:
7-4
Encapsulate Modal Logic Using Subcharts
What Is a Subchart?
A subchart is a graphical object that can contain anything a top-level chart can, including
other subcharts. A subchart, or a subcharted state, is a superstate of the states that it
contains. You can nest subcharts to any level in your chart design.
Using subcharts, you can reduce a complex chart to a set of simpler, hierarchically
organized units. This design makes the chart easier to understand and maintain, without
changing the chart behavior. Subchart boundaries do not apply during simulation and
code generation.
The subchart appears as a block with its name in the block center. However, you can
define actions and default transitions for subcharts just as you can for superstates. You
can also create transitions to and from subcharts just as you can create transitions to and
from superstates. You can create transitions between states residing outside a subchart
and any state within a subchart. The term supertransition refers to a transition that
crosses subchart boundaries in this way. See Move Between Levels of Hierarchy Using
Supertransitions on page 7-10 for more information.
Some subcharts can become atomic units if they meet certain modeling requirements.
For more information, see Restrictions for Converting to Atomic Subcharts on page
14-11.
7-5
7 Techniques for Streamlining Chart Design
Create a Subchart
You create a subchart by converting an existing state, box, or graphical function into the
subchart. The object to convert can be one that you create for making a subchart or an
existing object whose contents you want to turn into a subchart.
1 Right-click the object and select Group & Subchart > Subchart.
2 Confirm that the object now appears as a subchart.
To convert the subchart back to its original form, right-click the subchart. In the context
menu, select Group & Subchart > Subchart.
You cannot undo the operation of converting a subchart back to its original form. When
you perform this operation, the undo and redo buttons are disabled from undoing and
redoing any prior operations.
7-6
Encapsulate Modal Logic Using Subcharts
1 To convert the On state to a subchart, right-click the state and select Group &
Subchart > Subchart.
2 Confirm that the On state now appears as a subchart.
7-7
7 Techniques for Streamlining Chart Design
Open a Subchart
Opening a subchart allows you to view and change its contents. To open a subchart, do
one of the following:
7-8
Encapsulate Modal Logic Using Subcharts
Select the box representing the subchart and press the Enter key.
Edit a Subchart
After you open a subchart (see Open a Subchart on page 7-8), you can perform
any editing operation on its contents that you can perform on a top-level chart. This
means that you can create, copy, paste, cut, relabel, and resize the states, transitions,
and subcharts in a subchart. You can also group states, boxes, and graphical functions
inside subcharts.
You can also cut and paste objects between different levels in your chart. For example,
to copy objects from a top-level chart to one of its subcharts, first open the top-level chart
and copy the objects. Then open the subchart and paste the objects into the subchart.
Transitions from outside subcharts to states or junctions inside subcharts are called
supertransitions. You create supertransitions differently than you do ordinary
transitions. See Move Between Levels of Hierarchy Using Supertransitions on page
7-10 for information on creating supertransitions.
Navigate Subcharts
The Stateflow Editor toolbar contains a set of buttons for navigating the subchart
hierarchy of a chart.
Tool Description
If the Stateflow Editor is displaying a subchart, clicking this button
replaces the subchart with the subchart's parent in the Stateflow Editor.
If the Stateflow Editor is displaying a top-level chart, clicking this button
replaces the chart with the Simulink model window containing that chart.
Clicking this button shows the chart that you visited before the current
chart, so that you can navigate up the hierarchy.
Clicking this button shows the chart that you visited after visiting the
current chart, so that you can navigate down the hierarchy.
Note: You can also use the Escape key to navigate up to the parent object for a
subcharted state, box, or function.
7-9
7 Techniques for Streamlining Chart Design
In this section...
What Is a Supertransition? on page 7-10
Draw a Supertransition Into a Subchart on page 7-12
Draw a Supertransition Out of a Subchart on page 7-17
Label Supertransitions on page 7-21
What Is a Supertransition?
A supertransition is a transition between different levels in a chart, for example,
between a state in a top-level chart and a state in one of its subcharts, or between states
residing in different subcharts at the same or different levels in a chart. You can create
supertransitions that span any number of levels in your chart, for example, from a state
at the top level to a state that resides in a subchart several layers deep in the chart.
The point where a supertransition enters or exits a subchart is called a slit. Slits divide
a supertransition into graphical segments. For example, the following chart shows a
supertransition leaving the On subchart:
7-10
Move Between Levels of Hierarchy Using Supertransitions
7-11
7 Techniques for Streamlining Chart Design
7-12
Move Between Levels of Hierarchy Using Supertransitions
Note: You cannot undo the operation of drawing a supertransition. When you perform
this operation, the undo and redo buttons are disabled from undoing and redoing any
prior operations.
A supertransition appears, extending from the source state into the subchart with its
arrowhead penetrating a slit in the subchart.
7-13
7 Techniques for Streamlining Chart Design
If you are not happy with the initial position of the slit, you can continue to drag the
slit around the inside edge of the subchart to the desired location.
3 Double-click the subchart to open it.
The tip of the arrowhead of the supertransition appears highlighted in red, entering
the subchart.
7-14
Move Between Levels of Hierarchy Using Supertransitions
7-15
7 Techniques for Streamlining Chart Design
7-16
Move Between Levels of Hierarchy Using Supertransitions
1 Draw an inner transition segment from the source object anywhere just outside the
border of the subchart
7-17
7 Techniques for Streamlining Chart Design
2 Navigate up to the parent object by selecting View > Navigate > Up to Parent.
The tip of the arrowhead of the supertransition appears highlighted in red, exiting
the subchart.
7-18
Move Between Levels of Hierarchy Using Supertransitions
7-19
7 Techniques for Streamlining Chart Design
7-20
Move Between Levels of Hierarchy Using Supertransitions
Note: If the parent chart is itself a subchart and the terminating object resides at a
higher level in the subchart hierarchy, repeat these steps until you reach the desired
parent. In this way, you can connect objects separated by any number of layers in the
subchart hierarchy.
Label Supertransitions
A supertransition is displayed with multiple resulting transition segments for each layer
of containment traversed. For example, if you create a transition between a state outside
7-21
7 Techniques for Streamlining Chart Design
a subchart and a state inside a subchart of that subchart, you create a supertransition
with three segments, each displayed at a different containment level.
You can label any one of the transition segments constituting a supertransition using the
same procedure used to label a regular transition (see Label Transitions on page 4-19).
The resulting label appears on all the segments that constitute the supertransition. Also,
if you change the label on any one of the segments, the change appears on all segments.
7-22
Define a Graphical Function
2 Move your pointer to the location for the new graphical function in your chart and
click to insert the function box.
3 Enter the function signature.
The function signature specifies a name for your function and the formal names for
its arguments and return values. A signature has this syntax:
where func is the name of your function, a1, a2, ..., an are formal names for its
arguments, and r1, r2, ..., rn are formal names for its return values.
Note: You can define arguments and return values as scalars, vectors, or 2-D
matrices of any data type.
4 Click outside of the function box.
The following signature is for a graphical function that has the name f1, which takes
three arguments (a, b, and c) and returns three values (x, y, and z).
7-23
7 Techniques for Streamlining Chart Design
Note: In the chart, you can change the signature of your graphical function at any time.
After you edit the signature, the Model Explorer updates to reflect the changes.
2 Move your pointer inside the function box in your chart and click to insert the
default transition and its terminating junction.
3 Enter transition conditions and actions for your graphical function. If necessary, add
connective junctions and transitions to your function.
Note: Connective junctions and transitions are the only graphical elements you can
use in a graphical function. Because a graphical function must execute completely
when you call it, you cannot use states.
This function box shows a flow chart that returns different products of its arguments.
7-24
Define a Graphical Function
The Scope column in the Model Explorer indicates the role of each argument or
return value. Arguments have the scope Input, and return values have the scope
Output.
3 For each function argument and return value, right-click the data row in the Model
Explorer and select Properties from the context menu.
4 In the Data properties dialog box for each argument and return value, specify the
data properties.
Your function can access its own data or data belonging to parent states or the chart.
The data items that you create for the function itself can have one of these scopes:
Local
Local data persists from one function call to the next. Valid for C charts only.
Temporary
Temporary data initializes at the start of every function call. Valid for C charts
only. In charts that use MATLAB as the action language, you do not need to
7-25
7 Techniques for Streamlining Chart Design
define temporary function data in the Model Explorer. If a variable is used and
not previously defined, then it is automatically created. The variable is available
to the rest of the function.
Constant
Constant data retains its initial value through all function calls.
Note: You can initialize your function data (other than arguments and return
values) from the MATLAB workspace. However, you can save only local items to this
workspace.
7-26
Manage Large Graphical Functions
However, if your function grows too large, you can hide its contents by right-clicking
inside the function box and selecting Group & Subchart > Subchart from the context
menu. This option makes your graphical function opaque.
7-27
7 Techniques for Streamlining Chart Design
7-28
Call Graphical Functions in States and Transitions
Syntax
Syntax for a function call is the same as that of a function signature, with actual
arguments replacing the formal ones specified in a signature. If the data types of the
actual and formal argument differ, a function casts the actual argument to the type of
the formal argument. See Create a Graphical Function on page 7-23 for information
about syntax for a function signature.
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
How Scalar Expansion Works for Functions on page 16-6.
Example
In this example, a state entry action calls a graphical function that returns three
products.
7-29
7 Techniques for Streamlining Chart Design
The fields in the General tab of the properties dialog box are:
Field Description
Name Click this read-only function name to bring your function to the
foreground in its native chart.
7-30
Specify Graphical Function Properties
Field Description
Function Inline Select one of these options to control the inlining of your
Option function in generated code:
Auto
Decides whether or not to inline your function based on an
internal calculation.
Inline
Inlines your function as long as you do not export it to other
charts, and it is not part of a recursion. (A recursion exists
if your function calls itself directly or indirectly through
another function call.)
Function
Does not inline your function.
Label Specify the signature label for your function in this field.
See Create a Graphical Function on page 7-23 for more
information.
The fields in the Documentation tab of the properties dialog box are:
Field Description
Description Enter a textual description or comment.
Document link Enter a URL address or a general MATLAB
command. Examples are www.mathworks.com,
mailto:email_address, and edit/spec/data/speed.txt.
7-31
7 Techniques for Streamlining Chart Design
Create modular, reusable logic that you can call anywhere in your chart.
Track simulation behavior visually during chart animation.
If you want to call the function only within one state or subchart and its substates,
put your graphical function in that state or subchart. That function overrides any
other functions of the same name in the parents and ancestors of that state or
subchart.
If you want to call the function anywhere in that chart, put your graphical function at
the chart level.
If you want to call the function from any chart in your model, put your graphical
function at the chart level and enable exporting of chart-level graphical functions. For
instructions, see Export Stateflow Functions for Reuse on page 7-34.
7-32
Reuse Logic Patterns Using Graphical Functions
7-33
7 Techniques for Streamlining Chart Design
In this section...
Why Export Chart-Level Functions? on page 7-34
How to Export Chart-Level Functions on page 7-34
Rules for Exporting Chart-Level Functions on page 7-35
Export Chart-Level Functions on page 7-35
Graphical
Truth table
MATLAB
When you select Export Chart Level Functions, you can call exported functions by
using Simulink Caller blocks with dot notation, chartName.functionName. To call the
exported functions throughout the model from any Stateflow or Simulink Caller block,
select Treat Exported Functions as Globally Visible. Do not use dot notation to call
these functions. You cannot export functions with the same name.
Simulink functions can also be defined directly in the Simulink canvas. For more
information, see Simulink Function.
7-34
Export Stateflow Functions for Reuse
You must perform this step to export functions from library charts. Otherwise, a
simulation error occurs.
You cannot export a chart-level function when inputs or outputs have any of the
following properties:
If you try to export Simulink functions, an error appears when you simulate your model.
To avoid this behavior, clear the Export Chart Level Functions check box in the Chart
properties dialog box.
You cannot export functions from a referenced model and call the functions from a parent
model.
7-35
7 Techniques for Streamlining Chart Design
In the Model Explorer, for each of the function inputs and outputs, a, b, and c, set
these properties:.
Size to 1
Complexity to Off
7-36
Export Stateflow Functions for Reuse
Type to double
3 For modChart, add a graphical function and a default transition with a lib1_func
action.
a In the Model Explorer, for each of the function inputs and outputs, a, b, and c,
set:
Size to 1
Complexity to Off
Type to double
b Open the Chart properties dialog box.
c In the Chart properties dialog box, select Export Chart Level Functions.
d Click OK.
5 Drag lib1Chart and lib2Chart into main_model from lib1 and lib2,
respectively. Your main model should look something like this:
Each chart now defines a graphical function that any chart in main_model can call.
7-37
7 Techniques for Streamlining Chart Design
This step ensures that input and output data are defined globally to support
exported graphical functions.
9 Open the Model Configuration Parameters dialog box.
10 In the Model Configuration Parameters dialog box, go to the Solver pane.
11 In the Solver options section, make these changes:
This step ensures that when you simulate your model, a discrete solver is used. For
more information, see Solvers (Simulink).
When you simulate the model, these actions take place during each time step.
7-38
Export Stateflow Functions for Reuse
To view the simulation results, add a scope to your model. Follow these steps:
{x = lib1_func(x,y); z = x;}
7 In the model, connect the outport from modChart to the inport of the Scope block.
7-39
7 Techniques for Streamlining Chart Design
7-40
Group Chart Objects Using Boxes
Boxes add a level of hierarchy to Stateflow charts. This property affects visibility of
functions and states inside a box to objects that reside outside of the box. If you refer to
a box-parented function or state from a location outside of the box, you must include the
box name in the path. See Group Functions Using a Box on page 7-44.
Boxes affect the implicit activation order of parallel states in a chart. If your chart uses
implicit ordering, parallel states within a box wake up before other parallel states that
are lower or to the right in that chart. Within a box, parallel states wake up in top-down,
left-right order. See Group States Using a Box on page 7-45.
7-41
7 Techniques for Streamlining Chart Design
Include the box name in the path when you use dot notation to refer to a box-parented
function or state from a location outside of the box.
You can move or draw graphical objects inside a box, such as functions and states.
You can add data to a box so that all the elements in the box can share the same data.
You can group a box and its contents into a single graphical element. See Group
States on page 4-6.
You can subchart a box to hide its elements. See Encapsulate Modal Logic Using
Subcharts on page 7-5.
You cannot define action statements for a box, such as entry, during, and exit
actions.
You cannot define a transition to or from a box. However, you can define a transition
to or from a state within a box.
You create boxes in your chart by using the box tool shown below.
7-42
Group Chart Objects Using Boxes
The new box appears with a question mark (?) name in its upper left corner.
4 Click the question mark label.
7-43
7 Techniques for Streamlining Chart Design
5 Enter a name for the box and then click outside of the box.
Delete a Box
This chart shows a box named Status that groups together MATLAB functions.
Note: Because the MATLAB function resides inside a box, the path of the function
call must include the box name Status. If you omit this prefix, an error message
appears.
3 If the value of the input data temp exceeds 80, a transition to the state Warm occurs.
4 Upon entry, the state Warm invokes the function Status.msgWarm.
7-44
Group Chart Objects Using Boxes
Note: Because the MATLAB function resides inside a box, the path of the function
call must include the box name Status. If you omit this prefix, an error message
appears.
5 If the value of the input data temp drops below 60, a transition to the state Cold
occurs.
6 Steps 2 through 5 repeat until the simulation ends.
This chart shows a box named Status that groups together related states. The chart
uses implicit ordering for parallel states, instead of the default explicit mode. (For
details, see Implicit Ordering of Parallel States on page 3-80.)
7-45
7 Techniques for Streamlining Chart Design
The state Temp wakes up first, followed by the state Wind_Chill. Then, the state
Monitor wakes up.
Note: This implicit activation order occurs because Temp and Wind_Chill reside in a
box. If you remove the box, the implicit activation order changes, as shown, to: Temp,
Monitor, Wind_Chill.
Based on the input data temp, transitions between substates occur in the parallel
states Status.Temp and Status.Wind_Chill.
When the transition from Status.Temp.Cold to Status.Temp.Warm occurs, the
transition condition in(Status.Temp.Warm) becomes true.
When the transition from Status.Temp.Warm to Status.Temp.Cold occurs, the
transition condition in(Status.Temp.Cold) becomes true.
7-46
Group Chart Objects Using Boxes
7-47
7 Techniques for Streamlining Chart Design
You can reuse an atomic box across multiple charts and models.
An atomic box cannot contain states, only functions (graphical, truth table, MATLAB,
and Simulink).
Use an atomic box to reuse functions in the same way that you use an atomic subchart
to reuse states. For more information about atomic subcharts, see What Is an Atomic
Subchart? on page 14-2.
Models that use these functions can appear as referenced blocks in a top model. However,
when the functions are exported functions of a Stateflow chart, you can use only one
instance of that referenced block per top model. For a complete list of model referencing
limitations, see Limitations on All Model Referencing (Simulink).
With atomic boxes, you can avoid the limitation due to exported functions. You can reuse
models with these functions multiple times as referenced blocks in a top model.
7-48
Reuse Functions with an Atomic Box
1 Create a library model with an atomic box that contains the function you want to
reuse.
2 Create a separate model with multiple charts.
a In each chart that calls the function, add a linked atomic box.
b Write each call to the function using the full path:
linked_box_name.function_name
Using the full path for the function call has the following advantages:
Makes clear the dependency on the function in the linked atomic box
Avoids pollution of the global namespace
Does not affect efficiency of the generated code
3 Reuse that model multiple times as referenced blocks in a top model.
Because there are no exported functions in the charts, you can use more than one
instance of that referenced block in the top model.
Note: For charts that use MATLAB as the action language, use the function
getSimulationTime().
7-49
7 Techniques for Streamlining Chart Design
The function GetTime returns one output tout that corresponds to simulation
time t. For more information about literal symbols you can use in your chart,
see Supported Symbols in Actions on page 11-27.
d Save libTimerUtils.
2 Develop a separate model with multiple charts that use the timer function.
7-50
Reuse Functions with an Atomic Box
To add the linked atomic box, copy the TimerUtils library chart and paste it
below state A. Name the linked atomic box as Time.
When you copy and paste a library chart that contains only functions and no
states, you get a linked atomic box. If the library chart contains any states, you
get a linked atomic subchart.
d In Chart1, add the following state action and transition condition:
Upon entry to state A, the call to GetTime returns the simulation time. The
transition from state A to B occurs when more than 5 seconds of simulation time
passes.
e In Chart2, add the following state action and transition condition:
7-51
7 Techniques for Streamlining Chart Design
Upon entry to state A, the call to GetTime returns the simulation time. The
transition from state A to B occurs when more than 7 seconds of simulation time
passes.
f In each chart, add local data with the following properties:
Property Value
Name t0
Scope Local
Type double
g In each chart, open the State properties dialog box for B and select Create data
for monitoring:. Click OK.
This step adds an output data named B that is Boolean. The value is 1 when
state B is active and 0 otherwise. For more information, see About Active State
Data on page 22-30.
h In your model, add two Outport blocks, Out1 and Out2. Then connect each block
to the corresponding output of each chart.
i Save ex_timer_function_calls.
3 Reuse the timer function in multiple referenced blocks of a top model.
7-52
Reuse Functions with an Atomic Box
d Save ex_modelref_utility_functions.
7-53
7 Techniques for Streamlining Chart Design
Create Notes
You can enter comments or notes in any location on the chart.
1 Double-click in the desired location of the chart and start typing your comments.
2 Press the Return key to start a new line.
3 After you finish typing, click outside the note text.
Borders
Text alignment and word wrap
Text color and background color
Margins between the text and the borders of the note
7-54
Add Descriptive Comments in a Chart
TeX Instructions
In your notes, you can embed a subset of TeX commands to produce special characters.
For example, you can embed Greek letters and mathematical symbols.
\it{\omega_N = e^{(-2\pii)/N}}
4 Click outside the note.
7-55
8
Define Data
Add data when you want to store values that are visible at a specific level of the
Stateflow hierarchy.
You can store and retrieve data that resides internally in the Stateflow workspace and
externally in the Simulink model or application that embeds the chart. Actions in your
chart can refer to internal and external data.
You can use data defined in a Stateflow chart by multiple Stateflow objects in the chart.
These objects can be states, transition, MATLAB functions, and truth tables. Stateflow
data is not available to Simulink functions within Stateflow.
To open the Symbols window, select View > Symbols. To add data in the Symbols
window:
1
Click the Create Data icon .
2 In the row for the new data, under TYPE, click the icon and choose:
Input Data
Local Data
Output Data
Constant
Data Store Memory
Parameter
Temporary
3 Edit the name of the data.
8-2
Add Stateflow Data
4 For input and output data, click the PORT field and choose a port number.
You can edit properties for data in the Property Inspector or Data properties dialog box.
The object you select becomes the parent of the new data.
3 In the Model Explorer, select Add > Data.
The Model Explorer adds a default definition for the data in the hierarchy. The data
definition appears in a new row in the Model Explorer.
4 Change the properties of the data.
More About
Set Data Properties on page 8-6
8-3
8 Define Data
Machine-parented data
Inputs and outputs of MATLAB functions
Data of parameter scope in a chart that contains atomic subcharts
More About
Trace Data, Events, and Messages with the Symbols Window on page 30-7
Unused data, events, messages, and functions (Simulink)
8-4
Detect Unused Data in the Symbols Window
8-5
8 Define Data
In this section...
Stateflow Data Properties on page 8-6
Set Properties in the Logging Section on page 8-19
Set Properties in the Description Pane on page 8-20
Enter Expressions and Parameters for Data Properties on page 8-20
You can specify data properties in either the Property Inspector or the Data properties
dialog box in the Model Explorer.
Property Inspector
Properties vary according to the scope and type of the data object. For many data
properties, you can enter expressions or parameter values. Using parameters to set
properties for many data objects simplifies maintenance of your model because you can
update multiple properties by changing a single parameter.
Name of the data object. For more information, see Rules for Naming Stateflow Objects
on page 2-4.
8-6
Set Data Properties
Scope
Location where data resides in memory, relative to its parent. You can set scope to one of
these values.
8-7
8 Define Data
Port
Index of the port associated with the data object. This property applies only to input and
output data. See Share Output Data with Simulink on page 8-23.
Option that specifies that output or local data explicitly inherits properties from
Simulink.Signal objects of the same name in the MATLAB base workspace or the
Simulink model workspace. The data can inherit these properties:
Size
Complexity
Type
Unit
Minimum value
Maximum value
Initial value
Storage class
Sampling mode (for Truth Table block output data)
For more information, see Resolve Data Properties from Simulink Signal Objects on
page 8-59.
This option appears only if you set the model configuration parameter Signal
resolution to a value other than None.
Size
Size of the data object. The size can be a scalar value or a MATLAB vector of values. To
specify a scalar, set the Size property to 1 or leave it blank. To specify a MATLAB vector
8-8
Set Data Properties
use a multidimensional array. The number of dimensions equals the length of the vector
and the size of each dimension corresponds to the value of each vector element.
The scope of the data object determines what sizes you can specify. Stateflow data store
memory inherits all its properties, including its size, from the Simulink data store
to which it is bound. For all other scopes, size can be scalar, vector, or a matrix of n-
dimensions.
Variable size
Option that specifies whether the data object changes dimensions during simulation.
When you enable the chart property Support variable-size arrays, this option is
available only for input and output data. For more information, see Variable-Size Data.
Complexity
Option that specifies whether the data object accepts complex values. You can choose one
of these settings.
For more information, see How Complex Data Works in C Charts on page 21-2.
Type
Assistant, click the Show data type assistant button . The Data Type
Assistant is available only in the Data properties dialog box. It is not available in the
Symbols window.
8-9
8 Define Data
Note: If you enter an expression for a fixed-point data type, you must specify
scaling explicitly. For example, you cannot enter an incomplete specification such
as fixdt(1,16) in the Type field. If you do not specify scaling explicitly, an error
appears when you try to simulate your model.
To ensure that a data type definition is valid for fixed-point data, use one of the two
options.
Prevents replacement of the current fixed-point type with a type that the Fixed-Point
Tool (Fixed-Point Designer) or Fixed-Point Advisor (Fixed-Point Designer) chooses.
For methods on autoscaling fixed-point data, see Choosing a Range Collection Method
(Fixed-Point Designer).
For input and output data, you can specify physical units. See Units in Stateflow on
page 22-43.
Initial value
Initial value of the data object. If you do not specify a value, the default is 0.0. The
options for initializing values depend on the scope of the data object.
8-10
Set Data Properties
For more information, see Initialize Data from the MATLAB Base Workspace on page
8-25 and Share Simulink Parameters with Charts on page 8-24.
Range of acceptable values for this data object. Stateflow software uses this range
to validate the data object during simulation. To establish the range, specify these
properties:
Minimum The smallest value allowed for the data item during simulation. You
can enter an expression or parameter that evaluates to a numeric scalar value.
Maximum The largest value allowed for the data item during simulation. You can
enter an expression or parameter that evaluates to a numeric scalar value.
The smallest value you can set for Minimum is -inf. The largest value you can set for
Maximum is inf.
Note: A Simulink model uses the Limit range properties to calculate best-precision
scaling for fixed-point data types. Specify a minimum or maximum value before you
select Calculate Best-Precision Scaling in the General pane. For more information,
see Calculate Best-Precision Scaling on page 8-14.
For more information on entering values for Limit range properties, see Enter
Expressions and Parameters for Data Properties on page 8-20.
Option for watching the data values in the Stateflow Breakpoints and Watch window (see
Watch Stateflow Data Values on page 29-35).
Properties that apply to fixed-point data. These fixed-point properties are available only
in the Data properties dialog box.
8-11
8 Define Data
When the Data Type Assistant Mode is Fixed point the Data Type Assistant displays
fields for specifying additional information about your fixed-point data.
If the Scaling is Slope and bias rather than Binary point, the Data Type Assistant
displays a Slope field and a Bias field rather than a Fraction length field.
8-12
Set Data Properties
You can use the Data Type Assistant to set these fixed-point properties:
Signedness
Specify whether you want the fixed-point data to be Signed or Unsigned. Signed data
can represent positive and negative values, but unsigned data represents positive values
only. The default setting is Signed.
Word length
Specify the bit size of the word that holds the quantized integer. Large word sizes
represent large values with greater precision than small word sizes. The default bit size
is 16.
For chart-level data of the following scopes, word length can be any integer from 0
through 128.
Input
Output
Parameter
Data Store Memory
For other Stateflow data, word length can be any integer from 0 through 32.
Scaling
Specify the method for scaling your fixed-point data to avoid overflow conditions and
minimize quantization errors. The default method is Binary point scaling. You can
select one of two scaling modes.
8-13
8 Define Data
Slope can be any positive real number. The default slope is 1.0. Bias
can be any real number. The default bias is 0.0. You can enter slope and
bias as expressions that contain parameters you define in the MATLAB
workspace.
For more information about fixed-point scaling, see Scaling (Fixed-Point Designer).
Specify whether to inherit the data type override setting of the Fixed-Point Tool that
applies to this model. If the data does not inherit the model-wide setting, the specified
data type applies. For more information about the Fixed-Point Tool, see fxptdlg.
Calculate best-precision values for Binary point and Slope and bias scaling,
based on the Limit range properties that you specify in the General tab of the Data
properties dialog box.
8-14
Set Data Properties
Simulink software calculates the scaling values and displays them in the Fraction
length field or the Slope and Bias fields. For more information, see Constant Scaling
for Best Precision (Fixed-Point Designer).
Note: The Limit range properties do not apply to Constant and Parameter scopes. For
Constant, Simulink software calculates the scaling values based on the Initial value
setting. The software cannot calculate best-precision scaling for data of Parameter
scope.
Option in the Data properties dialog box when you specify a fixed-point data type. To see
information about the fixed-point data type that is defined in the Data Type Assistant,
use the Fixed-point details section. Click the expander next to Fixed-point details in
the Data Type Assistant.
8-15
8 Define Data
8-16
Set Data Properties
The rows labeled Minimum and Maximum show the same values that appear in the
corresponding Minimum and Maximum fields in the Limit range section. See Signal
Ranges (Simulink) and Specify Minimum and Maximum Values for Block Parameters
(Simulink).
The values displayed by the Fixed-point details subpane do not automatically update
if you click Calculate Best-Precision Scaling, or change the range limits, the values
that define the fixed-point data type, or anything elsewhere in the model. To update the
values shown in the Fixed-point details subpane, click Refresh Details. The Data
Type Assistant then updates or recalculates all values and displays the results.
Clicking Refresh Details does not change anything in the model; it changes only the
display. Click OK or Apply to put the displayed values into effect. If the value of a
field cannot be known without first compiling the model, the Fixed-point details
subpane shows the value as Unknown. If errors occur when you click Refresh Details,
the subpane shows an error flag on the left of the applicable row and a description of the
error on the right. For example, the next figure shows two errors.
8-17
8 Define Data
The row labeled Minimum shows the error Cannot evaluate because evaluating the
expression MySymbol, specified in the Minimum field of the Limit range section,
cannot return a numeric value. When an expression does not evaluate successfully,
the Fixed-point details subpane shows the unevaluated expression (truncating to 10
characters as needed) in place of the unavailable value.
8-18
Set Data Properties
To correct this error, define MySymbol in the base workspace to provide a numeric value.
If you click Refresh Details, the value of MySymbol appears in place of the unevaluated
text. The error indicator and description are deleted.
To correct the overflow error for Maximum, change the fixed-point data type so that it can
represent the maximum value you specify.
Decrease the value in the Maximum field of the Limit range section.
Increase Word length.
Decrease Fraction length.
Test point
Designates the data as a test point. A test point is a signal that you can observe in a
Floating Scope block in a model (see Test Points (Simulink)). Data objects can be test
points if:
Scope is Local.
Parent is not a Stateflow machine.
Data type is not ml.
Logging name
Specifies the name associated with logged signal data. Simulink software uses the signal
name as its logging name by default. To specify a custom logging name, select Custom
from the list box and enter the new name in the adjacent edit field.
Decimation
Limits the amount of data logged by skipping samples. For example, a decimation factor
of 2 saves every other sample.
8-19
8 Define Data
Option that assigns the value of the data item to a variable of the same name in the base
workspace at the end of simulation (see Model Workspaces (Simulink)).
First index
Index of the first element of the data array. The default value is 0.
Units
Units of measurement that you want to associate with the data object. The unit in this
field resides with the data object in the Stateflow hierarchy.
Description
Document link
Link to online documentation for the data object. You can enter a web URL address or a
MATLAB command that displays documentation in a suitable online format, such as an
HTML file or text in the MATLAB Command Window. When you click the Document
link hyperlink at the bottom of the properties dialog box, Stateflow software evaluates
the link and displays the documentation.
8-20
Set Data Properties
Expressions can contain a mix of parameters, constants, arithmetic operators, and calls
to MATLAB functions.
When you leave an expression or parameter field blank, Stateflow software assumes a
default value.
Field Default
Initial value 0.0
Maximum inf
Minimum inf
Word length 16
Slope 1.0
Bias 0.0
Binary point 0
First index 0
Size -1 (inherited), for inputs, parameters, and function outputs
1 (scalar), for other data objects
You can include parameters in expressions. A parameter is a constant that you can:
Define in the MATLAB workspace (see Initialize Data from the MATLAB Base
Workspace on page 8-25)
Derive from a Simulink block parameter that you define and initialize in the parent
masked subsystem (see Share Simulink Parameters with Charts on page 8-24)
For expressions in the Data properties dialog box, you can use numeric constants of the
appropriate type and size. Do not use Stateflow constants in these expressions.
8-21
8 Define Data
In the Data properties dialog box, you can use these arithmetic operators in expressions.
+
*
/
In fields that accept expressions, you can call functions that return property values of
other variables defined in the Stateflow hierarchy, MATLAB workspace, or Simulink
masked subsystem. For example, these functions can return appropriate values for
specified fields in the Data properties dialog box.
More About
Type Stateflow Data on page 8-36
Size Stateflow Data on page 8-44
Identify Data Using Dot Notation on page 8-54
Best Practices for Using Data in Charts on page 8-63
8-22
Share Data with Simulink and MATLAB Workspace
1 Add a data object to the chart, as described in Add Data from the Stateflow Editor
on page 8-2.
Note: Add the data to the chart itself, not to any other object in the chart.
2 In the Symbols window, set the TYPE to Input Data.
You can change port assignments by editing the value in the PORT field.
3 Set the data type of the input data, as described in Type Stateflow Data on page
8-36.
4 Set the size of the input data, as described in Size Stateflow Data on page 8-44.
Note: You cannot type or size Stateflow input data to accept frame-based data from
Simulink.
8-23
8 Define Data
1 Add a data object to the chart, as described in Add Data from the Stateflow Editor
on page 8-2.
Note: Add data to the chart itself, not to any other object in the chart.
2 In the Symbols window, set the TYPE property to Output Data.
You assign outputs to ports in the order in which you add the data. For example, you
assign the third output to output port 3. You can change port assignments by editing
the value in the PORT field.
3 Set the type of the output data, as described in Type Stateflow Data on page
8-36.
4 Set the size of the output data, as described in Size Stateflow Data on page
8-44.
Share Simulink parameters with charts to maintain consistency with your Simulink
model. By using parameters, you can also avoid hard-coding data sizes and types.
You can use parameters defined in a Stateflow chart in multiple Stateflow objects in the
chart, such as states, MATLAB functions and truth tables.
To share Simulink parameters for a masked subsystem with a chart, follow these steps:
1 In the Simulink mask editor for the parent subsystem, define and initialize a
Simulink parameter.
2 In the Stateflow hierarchy, define a data object with the same name as the
parameter (see Add Stateflow Data on page 8-2).
3 Set the scope of the data object to Parameter.
8-24
Share Data with Simulink and MATLAB Workspace
When simulation starts, Simulink tries to resolve the Stateflow data object to a
parameter at the lowest level masked subsystem. If unsuccessful, Simulink moves up
the model hierarchy to resolve the data object to a parameter at higher level masked
subsystems.
When simulation starts, data resolution occurs. During this process, the Stateflow data
object gets its initial value from the associated MATLAB variable. For example, if the
variable is an array, each element of the Stateflow array initializes to the same value as
the corresponding element of the MATLAB array.
One-dimensional Stateflow arrays are compatible with MATLAB row and column vectors
of the same size. For example, a Stateflow vector of size 5 is compatible with a MATLAB
row vector of size [1,5] or column vector of size [5,1].
Time of Initialization
Data parent and scope control initialization time for Stateflow data objects.
8-25
8 Define Data
In the Description pane of the Data properties dialog box, select Save final value
to base workspace.
In the Contents pane of the Model Explorer, follow these steps:
8-26
About Data Stores
You can use data stores with buses, but not with arrays of buses. For more information
about using data stores with buses, see "Using Data Stores with Buses and Arrays of
Buses" (Simulink).
8-27
8 Define Data
Global data stores have a broader scope, which crosses model reference boundaries. To
interact with global data stores, a chart must reside either in the top model where
the global data store is defined or in any model that the top model references. You
implement global data stores as Simulink signal objects.
8-28
Access Data Store Memory from a Chart
Note: You cannot edit properties that the data object inherits from the data store.
1 Select Chart > Add Other Elements > Data Store Memory.
The properties dialog box for the new data object appears with scope property set to
Data Store Memory.
2 In the Name field of the Data properties dialog box, enter the name of the Simulink
data store to which you want to bind.
3 Click OK.
8-29
8 Define Data
The following chart reads from and writes to a data store memory block called myglobal.
8-30
Access Data Store Memory from a Chart
8-31
8 Define Data
Note: These diagnostics are available only for data store memory blocks used within a
single Simulink model, not for data stores created from Simulink signal objects. In other
words, these diagnostics do not work for global data stores that cross model reference
boundaries.
1 Double-click the data store memory block in your Simulink model to open its Block
Parameters dialog box.
8-32
Diagnostics for Sharing Data Between Charts and Simulink Blocks
8-33
8 Define Data
1 Define data store memory objects that reside in each chart that shares the data.
a Use the Model Explorer to add a data object to each chart, as described in Add
Data Through the Model Explorer on page 8-3.
b Give each data object the same name.
c Set the scope of each data object to Data Store Memory.
2 Verify that your models do not contain any Data Store Memory blocks.
However, you can include Data Store Read and Data Store Write blocks.
3 Create a Simulink.Signal object in the MATLAB base workspace.
a In the Model Explorer, navigate to Simulink Root > Base Workspace in the
Model Hierarchy pane.
b Select Add > Simulink Signal.
c Give the object the same name as the data store memory objects in your charts.
4 Verify that these settings apply to the Simulink.Signal object:
8-34
Best Practices for Using Data Stores in Charts
For instructions on how to set block execution order, see Control and Display the
Sorted Order (Simulink).
8-35
8 Define Data
In this section...
What Is Data Type? on page 8-36
Specify Data Type with the Property Inspector on page 8-36
Specify Data Type with the Data Type Assistant on page 8-36
Built-In Data Types on page 8-39
Inherit Data Types from Simulink Objects on page 8-40
Derive Data Types from Previously Defined Data on page 8-40
Type Data by Using an Alias on page 8-41
Strong Data Typing with Simulink I/O on page 8-42
1 Open the Symbols and Property Inspector windows from the View menu.
2 Select the data object row in the Symbols window.
3 In the Property Inspector, enter the data type directly in the Type field, or select it
from the Type drop-down list.
8-36
Type Stateflow Data
3 Choose a Mode in the Data Type Assistant section of the dialog box.
For charts that use MATLAB as the action language, if scope is Local, you
infer the data type from the context of the MATLAB code in the chart.
If scope is Input, you inherit the data type from the Simulink input signal on
the designated input port (see Share Output Data with Simulink on page
8-23).
If scope is Output, you inherit the data type from the Simulink output signal
on the designated output port (see Share Output Data with Simulink on
page 8-23).
Note: Avoid inheriting data types from output signals. See Avoid inheriting
output data properties from Simulink blocks on page 8-63.
8-37
8 Define Data
For information on how to specify these fixed-point data properties, see Fixed-
Point Data Properties on page 8-11.
Enumerated Specify the class name for the enumerated data type. For more information, see
Define Enumerated Data in a Chart on page 18-8.
Expression Enter an expression that evaluates to a data type in the Type field. You can use
these expressions:
For more information on how to build expressions in the Data properties dialog
box, see Enter Expressions and Parameters for Data Properties on page 8-20.
8-38
Type Stateflow Data
Note: You can also inherit bus object properties from Simulink signals.
5 Click Apply to save the data type settings.
Note: The Data Type Assistant is available only with the Data properties dialog box. It is
not available with the Symbols window.
8-39
8 Define Data
Note: Avoid inheriting data types from output signals. See Avoid
inheriting output data properties from Simulink blocks on page
8-63.
Parameter Corresponding MATLAB workspace variable or Simulink
parameter in a masked subsystem
Data Store Memory Corresponding Simulink data store
To configure these objects to inherit data types, create the corresponding objects in the
Simulink model, and then select Inherit: Same as Simulink from the Type drop-
down list in the Data properties dialog box. For more information, see Specify Data Type
with the Data Type Assistant on page 8-36.
To determine the data types that the objects inherit, build the Simulink model and look
at the Compiled Type column for each Stateflow data object in the Model Explorer.
8-40
Type Stateflow Data
After you build your model, the Compiled Type column of the Model Explorer shows the
type of each data object in the compiled simulation application. For more information, see
type Operator on page 11-25.
MyFloat = Simulink.AliasType;
MyFloat.BaseType = 'single';
In the following example, the data y has the same type as MyFloat.
8-41
8 Define Data
After you build your model, the Compiled Type column of the Model Explorer shows the
type used in the compiled simulation application.
By default, inputs to and outputs from charts are of type double. Input signals from
Simulink models convert to the type of the corresponding input data objects in charts.
Likewise, the data output objects convert to double before they are exported as output
signals to Simulink models.
To interface directly with signals of data types other than double without the need for
conversion, select Use Strong Data Typing with Simulink I/O in the chart properties.
The chart accepts input signals of any data type that Simulink supports, as long as the
data type of the input signal matches the type of the corresponding Stateflow data object.
Otherwise, you receive a type mismatch error.
Note: For fixed-point data, select Use Strong Data Typing with Simulink I/O to flag
mismatches between input or output fixed-point data in charts and their counterparts in
Simulink models.
8-42
Type Stateflow Data
More About
Specify Chart Properties on page 22-3
About Data Types in Simulink (Simulink)
8-43
8 Define Data
Stateflow data store memory inherits all data properties, including size, from the
Simulink data store to which it resolves. You cannot specify any properties explicitly for
data store memory.
8-44
Size Stateflow Data
The equivalent API command for specifying an inherited data size is:
data_handle.Props.Array.Size = '-1';
Chart actions that store values in the specified output infer the inherited size of output
data. If the expected size in the Simulink signal matches the inferred size, inheritance is
successful. Otherwise, a mismatch occurs during build time.
Note: Charts cannot inherit frame-based data sizes from Simulink signals.
8-45
8 Define Data
One-dimensional Stateflow vectors are compatible with Simulink row or column vectors
of the same size. For example, Stateflow input or output data of size 3 is compatible with
a Simulink row vector of size [1 3] or column vector of size [3 1].
8-46
Size Stateflow Data
1 Mask parameters
2 Model workspace
3 MATLAB base workspace
4 Stateflow data
For example, if a variable named off exists in the MATLAB base workspace and as local
chart data, do not use off in the Size field of the data properties.
8-47
8 Define Data
More About
Stateflow Data Properties on page 8-6
8-48
Handle Integer Overflow for Chart Data
In this section...
When Integer Overflow Can Occur on page 8-49
Support for Handling Integer Overflow in Charts on page 8-49
Effect of Integer Promotion Rules on Saturation on page 8-51
Impact of Saturation on Error Checks on page 8-52
For more information about saturation and wrapping for integer overflow, see
Saturation and Wrapping (Fixed-Point Designer).
8-49
8 Define Data
Check Box When to Use This Setting Overflow Handling Example of the Result
Selected Overflow is possible Overflows saturate to An overflow associated
for data in your chart either the minimum or with a signed 8-bit integer
and you want explicit maximum value that the saturates to 128 or +127
saturation protection in data type can represent. in the generated code.
the generated code.
Cleared You want to optimize The handling of overflows The number 130 does not
efficiency of the generated depends on the C fit in a signed 8-bit integer
code. compiler that you use for and wraps to 126 in the
generating code. generated code.
Arithmetic operations for which you can enable saturation protection are:
Unary minus: a
8-50
Handle Integer Overflow for Chart Data
Binary operations: a + b, a b, a * b, a / b, a ^ b
Assignment operations: a += b, a =b, a *= b, a /= b
In C charts, increment and decrement operations: ++, --
Keep the following considerations in mind when you select Saturate on integer
overflow:
Saturation applies to all intermediate operations, not just the output or final result.
The code generator can detect cases when overflow is not possible. In these cases, the
generated code does not include saturation protection.
All arithmetic operations use a data type that has the same word length as the target
word size. Therefore, the intermediate data type in a chained arithmetic operation
can be different from the data type of the operands or the final result.
For operands with integer types smaller than the target word size, promotion to a
larger type of the same word length as the target size occurs. This implicit cast occurs
before any arithmetic operations take place.
For example, when the target word size is 32 bits, an implicit cast to int32 occurs
for operands with a type of uint8, uint16, int8, or int16 before any arithmetic
operations occur.
Suppose that you have the following expression, where y, u1, u2, and u3 are of uint8
type:
y = (u1 + u2) - u3;
For each calculation, the following data types and saturation limits apply.
8-51
8 Define Data
Suppose that u1, u2, and u3 are equal to 200. Because the saturation limits depend on
the intermediate data types and not the operand types, you get the following values:
tmp is 400.
result is 200.
y is 200.
8-52
Define Temporary Data
You can define temporary data in graphical, truth table, and MATLAB functions in your
chart. For example, you can designate a loop counter to have Temporary scope if the
counter value does not need to persist after the function completes.
The Model Explorer adds a default definition for the data in the Stateflow hierarchy,
with a scope set to Temporary by default.
4 Change other properties of the data if necessary, as described in Set Data
Properties on page 8-6.
8-53
8 Define Data
For example, you can specify qualified data names in state actions and transitions by
using dot notation.
In this chart, data resides in the state aa. The qualified data names in state actions and
transitions use dot notation to refer to this data.
In state a, the entry action contains the qualified data name aa.data.
In state b, the entry action contains the qualified data name a.aa.data.
In the default transition, the action contains the qualified data name a.aa.data.
8-54
Identify Data Using Dot Notation
Display an
error
message.
8-55
8 Define Data
Stage Action
1 The search begins at the level of the hierarchy where the qualified data name
appears.
If a unique match exists, the statement containing the qualified data name
executes.
If no matches or multiple matches exist, an error message appears.
8-56
Identify Data Using Dot Notation
Suppose that state aa contains data. In state b, the entry action contains aa.data, a
qualified data name that the chart cannot resolve. The following search process occurs:
The search ends, and an error message appears because no match exists for aa.data.
To avoid this error, use a specific path for the qualified data name in the entry action of
state b:
en: a.aa.data+=1;
8-57
8 Define Data
Suppose that both states named aa contain a data object named data. In state a, the
entry action contains two instances of aa.data that the chart cannot resolve. The
following search process occurs:
The search ends, and an error message appears because multiple matches exist for
aa.data.
8-58
Resolve Data Properties from Simulink Signal Objects
In this section...
About Explicit Signal Resolution on page 8-59
Inherited Properties on page 8-59
Enable Signal Resolution on page 8-60
A Simple Example on page 8-60
For information about Simulink signal resolution, see Symbol Resolution (Simulink)
and Symbol Resolution Process (Simulink) in the Simulink documentation.
Inherited Properties
When Stateflow local or output data resolve to Simulink signal objects, they inherit these
properties:
Size
Complexity
Type
Minimum value
Maximum value
Initial value
Storage class
Storage class controls the appearance of chart data in the generated code. See
Control Data Representation by Applying Custom Storage Classes (Embedded
Coder).
8-59
8 Define Data
1 Set Configuration Parameters > Diagnostics > Data Validity > Signal
resolution to a value other than None. For more information about the other
options, see Signal resolution (Simulink).
2 In the model workspace, base workspace, or data dictionary, define a
Simulink.Signal object with the properties you want your Stateflow data to
inherit.
After you select this check box, the dialog box removes or grays out the properties
that your data inherits from the signal. For a list of properties that your data can
inherit during signal resolution, see Inherited Properties on page 8-59.
A Simple Example
The following model shows how a chart resolves local and output data to
Simulink.Signal objects.
8-60
Resolve Data Properties from Simulink Signal Objects
In the base workspace, there are three Simulink.Signal objects with these properties:
The chart contains three data objects two outputs and a local variable that will
resolve to a signal with the same name, as follows:
When you build the model, each data object inherits the properties of the identically
named signal:
8-61
8 Define Data
The generated code declares the data based on the storage class that the data inherits
from the associated Simulink signal. For example, the header file below declares local
to be an exported global variable:
/*
* Exported States
*
* Note: Exported states are block states with an exported
* global storage class designation.
*
*/
extern real32_T local; /* '<Root>/Chart' */
8-62
Best Practices for Using Data in Charts
Enumerated data
Simulink functions
Chart SimState
Implicit change events
Detection of unused data
Model referencing (see Limitations on All Model Referencing (Simulink))
Analysis by Simulink Design Verifier software
Code generation by Simulink PLC Coder software
Parameters binding to a Simulink.Parameter object in the base workspace
To make Stateflow data accessible to other charts and blocks in a model, use data store
memory. For details, see Access Data Store Memory from a Chart on page 8-29.
More About
Simulink Functions in Stateflow on page 27-2
What Is Enumerated Data? on page 18-2
8-63
8 Define Data
8-64
Transfer Data Across Models
1 In the Contents pane of the Model Explorer, rightclick the data object you want to
copy and select Copy from the context menu.
2 In the Model Hierarchy pane, right-click the destination Stateflow machine and
select Paste from the context menu.
8-65
9
Define Events
What Is an Event?
An event is a Stateflow object that can trigger actions in one of these objects:
Activate a Simulink triggered subsystem (see Activate a Simulink Block Using Edge
Triggers on page 9-20)
Activate a Simulink function-call subsystem (see Activate a Simulink Block Using
Function Calls on page 9-28)
Trigger actions in parallel states of a Stateflow chart (see Broadcast Events to
Synchronize States on page 11-52)
Although Stateflow software does not limit the number of events you can use in a
chart, the underlying C compiler enforces a theoretical limit of (2^31)-1 events for the
generated code.
9-2
How Events Work in Stateflow Charts
For more information about using conditions on transitions, see Transition Action
Types on page 11-8.
Types of Events
An explicit event is an event that you define and can have one of the following scopes.
Scope Description
Local Event that can occur anywhere in a Stateflow machine but is
visible only in the parent object (and descendants of the parent).
See Directed Event Broadcasting on page 11-52.
Input from Simulink Event that occurs in a Simulink block but is broadcast to a
Stateflow chart. See Activate a Stateflow Chart Using Input
Events on page 9-9.
Output to Simulink Event that occurs in a Stateflow chart but is broadcast to a
Simulink block. See Activate a Simulink Block Using Output
Events on page 9-20.
An implicit event is a built-in event that broadcasts automatically during chart execution
(see Control Chart Execution Using Implicit Events on page 9-33).
9-3
9 Define Events
simulation, you can reduce the size of your model. This diagnostic checks for usage of
Stateflow events, except for the following types:
After you select an event for removal, a dialog box confirms your choice. In this dialog
box, you can specify that other deletions occur without confirmation. If you prevent the
confirmation dialog box from appearing, you can reenable it at any time by typing at the
command prompt:
sfpref('showDeleteUnusedConfGui', 1)
You can control the level of diagnostic action for unused events in the Diagnostics
> Stateflow pane of the Model Configuration Parameters dialog box. For more
information, see the documentation for the Unused data, events, messages, and
functions (Simulink) diagnostic.
9-4
Define Events
Define Events
In this section...
Add Events with the Stateflow Editor on page 9-5
Add Events with the Model Explorer on page 9-5
To open the Symbols window, select View > Symbols. To add events in the Symbols
window:
1
Click the Create Event icon .
2 In the row for the new event, under TYPE, click the icon and choose:
Input Event
Local Event
Output Event
3 Edit the name of the event.
4 For input and output event, click the PORT field and choose a port number.
Specify properties for the new event as described in Set Properties for an Event on page
9-7.
9-5
9 Define Events
2 In the Model Explorer, on the Model Hierarchy pane, select the object in the
Stateflow hierarchy where you want the new event to be visible.
The Model Explorer adds a default definition for the new event in the hierarchy and
displays an entry row for the new event in the Contents pane.
4 Change the properties of the event that you add in one of these ways:
Right-click the event row and select Properties to open the Event properties
dialog box.
To set specific properties such as Name, Scope, and Port, click individual cells
in the entry row.
More About
Set Properties for an Event on page 9-7
How Events Work in Stateflow Charts on page 9-2
9-6
Set Properties for an Event
Property Inspector
Property Fields
Name
Name of the event. Actions reference events by their names. Names must begin with an
alphabetic character, cannot include spaces, and cannot be shared by sibling events.
Scope
Scope of the event. The scope specifies where the event occurs relative to the parent
object. For information about types of scope, see Types of Events on page 9-3.
Port
For input events, port is the index of the input signal that triggers the event.
9-7
9 Define Events
For output events, port is the index of the signal that outputs this event.
You assign input and output events to ports in the order in which you add the events. For
example, you assign the first input event to input port 1 and the third output event to
output port 3.
You can change port assignments in the Model Explorer or the Event properties dialog
box. When you change the number of one port, the numbers of other ports adjust
automatically to preserve the relative order. See Association of Input Events with
Control Signals on page 9-11 and Association of Output Events with Output Ports
on page 9-31.
Trigger
Type of signal that triggers an input or output event. See Activate a Stateflow Chart
Using Input Events on page 9-9 or Activate a Simulink Block Using Output
Events on page 9-20.
Debugger Breakpoints
Option for setting debugger breakpoints at the start or end of an event broadcast.
Available breakpoints depend on the scope of the event.
Description
Description of this event. You can enter brief descriptions of events in the hierarchy.
Document Link
9-8
Activate a Stateflow Chart Using Input Events
You can activate a Stateflow chart via a change in control signal (an edge-triggered input
event) or a function call from a Simulink block (a function-call input event). The sections
that follow describe when and how to use each type of input event.
Note: You cannot mix edge-triggered and function-call input events in a Stateflow chart.
If you try to mix these input events, an error message appears during simulation.
Use an edge-triggered input event to activate a chart when your model requires chart
execution at regular (or periodic) intervals.
1 Add an event to the Stateflow chart, as described in Define Events on page 9-5.
9-9
9 Define Events
Note: You must add an input event to the chart and not to one of its objects.
2 Set the Scope property for the event to Input from Simulink.
A single trigger port appears at the top of the Stateflow block in the Simulink model.
3 Set the Trigger property to one of these edge triggers.
In all cases, the signal must cross 0 to be a valid edge trigger. For example, a signal
that changes from -1 to 1 is a valid rising edge, but a signal that changes from 1to2
is not valid.
Note: When you use this type of input event, you must also define a function-call output
event for the block that calls the Stateflow chart.
Use a function-call input event to activate a chart when your model requires access to
output data from the chart in the same time step as the function call.
9-10
Activate a Stateflow Chart Using Input Events
1 Add an event to the Stateflow chart, as described in Define Events on page 9-5.
Note: You must add an input event to the chart and not to one of its objects.
2 Set the Scope property for the event to Input from Simulink.
A single trigger port appears at the top of the Stateflow block in the Simulink model.
3 Set the Trigger property to Function call.
The number of the port that you assign to the input event acts as an index into the
control signal vector. For example, the first element of the signal vector triggers the
input event assigned to input port 1, the fourth element triggers the input event assigned
to input port 4, and so on. You assign port numbers in the order in which you add the
events. However, you can change these assignments by setting the Port property of an
event to the index of the signal that you use to trigger the event.
For multiple input events to a trigger port, the data types of all signals must be identical.
If you use signals of different data types as input events, an error message appears when
you try to simulate your model.
For example, you can mux two input signals of type double to use as input events to a
chart.
9-11
9 Define Events
However, you cannot mux two input signals of different data types, such as boolean and
double.
At any given time step, input events are checked in ascending order based on their port
numbers. The chart awakens once per valid event. For edge-triggered input events,
multiple edges can occur in the same time step, which wake the chart more than once in
that time step. In this situation, events occur (and wake the chart) in an ascending order
based on their port numbers.
For function-call input events, only one trigger event exists. The caller of the event
explicitly calls and executes the chart. Only one function call can be valid in a single time
step.
9-12
Control States When Function-Call Inputs Reenable Charts
In this section...
Set Behavior for a Reenabled Chart on page 9-13
Behavior When the Parent Is the Model Root on page 9-13
Behavior When the Chart Is Inside a Model Block on page 9-17
9-13
9 Define Events
In the following model, the Caller chart uses the event E to wake up and execute the
Callee chart.
Each time the Callee chart executes, the output data y increments by one.
9-14
Control States When Function-Call Inputs Reenable Charts
In the Chart properties dialog box for Callee, States When Enabling is Inherit.
Because the parent of this chart is the model root, the chart maintains the most recent
values of all states when reenabled.
During simulation, Callee maintains the most recent value of its state when the
function-call input event reenables the chart at t = 20 and 40.
9-15
9 Define Events
Suppose that the States When Enabling property is Reset for Callee. During
simulation, Callee reverts to the initial value of its state when the function-call input
event reenables the chart at t = 20 and 40.
9-16
Control States When Function-Call Inputs Reenable Charts
The following model contains a Model block and a scope. (For more information about
using Model blocks, see For more information, see Model Reference (Simulink)..)
The Model block contains the Caller and Callee charts from Behavior When the
Parent Is the Model Root on page 9-13.
In the Chart properties dialog box for Callee, States When Enabling is Inherit.
Because this chart is inside a Model block, the chart reverts to the initial values of all
states when reenabled.
9-17
9 Define Events
During simulation, Callee reverts to the initial value of its state when the function-call
input event reenables the chart at t = 20 and 40.
9-18
Control States When Function-Call Inputs Reenable Charts
Suppose that the States When Enabling property is Held for Callee. During
simulation, Callee maintains the most recent value of its state when the function-call
input event reenables the chart at t = 20 and 40.
9-19
9 Define Events
You use output events to activate other blocks in the same model. You can define
multiple output events in a chart, where each output event maps to an output port (see
Port on page 9-7).
Use an edge-triggered output event to activate a Simulink subsystem when your model
requires subsystem execution at regular (or periodic) intervals.
1 Add an event to the Stateflow chart, as described in Define Events on page 9-5.
9-20
Activate a Simulink Block Using Output Events
For each output event you define, an output port appears on the Stateflow block.
3 Set the Trigger property of the output event to Either Edge.
Note: Unlike edge-triggered input events, you cannot specify a Rising or Falling
edge trigger.
The following model shows how to use an edge-triggered output event to activate
triggered subsystems at regular intervals.
The chart contains the edge-triggered output event e1 and the local data a, which
switches between 0 and 1 during simulation.
9-21
9 Define Events
When you simulate the model, the scope shows these results.
If a chart tries to broadcast the same edge-triggered output event multiple times in a
single time step, the chart dispatches only one of these broadcasts in the present time
step. However, the chart queues up any pending broadcasts for dispatch that is, one at
9-22
Activate a Simulink Block Using Output Events
a time in successive time steps. Each time the chart wakes up in successive time steps,
if any pending broadcasts exist for the output event, the chart signals the edge-triggered
subsystem for execution. Based on the block sorted order of the Simulink model, the
edge-triggered subsystem executes. (For details, see Control and Display the Sorted
Order (Simulink).)
Note: For information on what happens for function-call output events, see Interleaving
Behavior for Broadcasting a Function-Call Output Event Multiple Times on page
9-29.
In this model, the chart Caller uses the edge-triggered output event output_cmd to
activate the chart Callee.
The chart Caller tries to broadcast the same edge-triggered output event four times in a
single time step, as shown.
9-23
9 Define Events
Each time the chart Callee is activated, the output data y increments by one.
When you simulate the model, you see this output in the scope.
At t = 1, the chart Caller dispatches only one of the four output events. Therefore, the
chart Callee executes once during that time step. However, the chart Caller queues up
the other three event broadcasts for future dispatch that is, one at a time for t = 2,
3, and 4. Each time Caller wakes up in successive time steps, it activates Callee for
execution. Therefore, the action y++ occurs once per time step at t = 1, 2, 3, and 4. During
simulation, Callee executes based on the block sorted order of the Simulink model.
When you cannot use a function-call output event, such as for HDL code generation, you
can approximate a function call by using:
9-24
Activate a Simulink Block Using Output Events
Note: While you can approximate a function call, a subtle difference in execution
behavior exists. Execution of a function-call subsystem occurs during execution of the
chart action that provides the trigger. However, execution of an enabled subsystem
occurs after execution of that chart action is complete.
In the following model, the chart Caller uses the edge-triggered output event
output_cmd to activate the enabled subsystem. The scope shows the value of the output
event during simulation.
The chart Caller broadcasts the edge-triggered output event using a send action.
9-25
9 Define Events
When you simulate the model, you see the following output in the scope. The simulation
runs for 40 seconds.
When simulation starts, the value of output_cmd is 0. At t = 20, the chart dispatches
output_cmd. Because this value changes to 1, the enabled subsystem becomes active
and executes during that time step. Because no other event broadcasts occur, the enabled
9-26
Activate a Simulink Block Using Output Events
subsystem continues to execute at every time step until simulation ends. Therefore, the
Display block shows a final value of 40.
To approximate a function call, add a second event broadcast in the same action.
When you simulate the model, you see the following output in the scope. The simulation
runs for 40 seconds.
9-27
9 Define Events
When simulation starts, the value of output_cmd is 0. At t = 20, the chart dispatches
output_cmd. Because this value changes to 1, the enabled subsystem becomes active
and executes during that time step. The chart also queues up the second event for
dispatch at the next time step. At t = 21, the chart dispatches the second output event,
which changes the value of output_cmd to 0. Therefore, the enabled subsystem stops
executing and the Display block shows a final value of 20.
Use a function-call output event to activate a Simulink block when your model requires
access to output data from the block in the same time step as the function call.
For each output event you define, an output port appears on the Stateflow block.
3 Set the Scope property of the output event to Function call.
The model sf_loop_scheduler shows how to use a function-call output event to activate a
Simulink block. For information on running this model and how it works, see Schedule
One Subsystem in a Single Step on page 24-14.
9-28
Activate a Simulink Block Using Output Events
If a chart tries to broadcast the same function-call output event multiple times in a
single time step, the chart dispatches all the broadcasts in that time step. Execution of
function-call subsystems is interleaved with the execution of the function-call initiator so
that output from the function-call subsystem is available right away in the function-call
initiator. (For details, see Function-Call Subsystems (Simulink).)
9-29
9 Define Events
Note: For information on what happens for edge-triggered output events, see Queuing
Behavior for Broadcasting an Edge-Triggered Output Event Multiple Times on page
9-22.
In this model, the chart Caller uses the function-call output event output_cmd to
activate the chart Callee.
The chart Caller tries to broadcast the same function-call output event four times in a
single time step, as shown.
Each time the chart Callee is activated, the output data y increments by one.
When you simulate the model, you see this output in the scope.
9-30
Activate a Simulink Block Using Output Events
At t = 1, the chart Caller dispatches all four output events. Therefore, the chart Callee
executes four times during that time step. Therefore, the action y++ also occurs four
times in that time step. During simulation, execution of Callee is interleaved with
execution of Caller so that output from Callee is available right away.
All output ports appear sequentially from top to bottom. Output data ports appear
sequentially above output event ports on the right side of a chart block. As you add
output events, their default Port properties appear sequentially at the end of the current
port list.
You can change the default port assignment of an event by resetting its Port property.
When you change the Port property for an output event, the ports for the remaining
output events automatically renumber, preserving the original order. For example,
9-31
9 Define Events
assume you have three output events, OE1, OE2, and OE3, which associate with the
output ports 4, 5, and 6, respectively. If you change the Port property for OE2 to 6, the
ports for OE1 and OE3 renumber to 4 and 5, respectively.
1 In your chart, right-click the state or transition that contains the event of interest
and select Explore.
2 Select the desired event.
9-32
Control Chart Execution Using Implicit Events
Chart waking up
Entry into a state
Exit from a state
Value assigned to an internal data object
These events are implicit because you do not define or trigger them explicitly. Implicit
events are children of the chart in which they occur and are visible only in the parent
chart.
event(object)
where event is the name of the implicit event and object is the state or data in which
the event occurs.
Each keyword below generates implicit events in the action language notation for states
and transitions.
9-33
9 Define Events
If more than one object has the same name, use the dot operator to qualify the name of
the object with the name of its parent. These examples are valid references to implicit
events:
enter(switch_on)
en(switch_on)
change(engine.rpm)
Note: The tick (or wakeup) event refers to the chart containing the action being
evaluated. The event cannot refer to a different chart by argument.
9-34
Control Chart Execution Using Implicit Events
Fan and Heater are parallel (AND) superstates. The first time that an event awakens
the Stateflow chart, the states Fan.Off and Heater.Off become active.
Assume that you are running a discrete-time simulation. Each time that the chart
awakens, a tick event broadcast occurs. After four broadcasts, the transition from
Fan.Off to Fan.On occurs. Similarly, after three broadcasts, the transition from
Heater.Off to Heater.On occurs.
For information about the after operator, see Control Chart Execution Using Temporal
Logic on page 11-56.
9-35
9 Define Events
In multiple parallel states, the same implicit event is used to guard a transition from
one substate to another.
When multiple transitions are valid in the same time step, the transitions execute based
on the order in which they were created in the chart. This order does not necessarily
match the activation order of the parallel states that contain the transitions. For
example, consider the following chart:
When the transition from IV.HERE to IV.THERE occurs, the condition ex(IV.HERE)
is valid for the transitions from A to B for the parallel states I, II, and III. The three
transitions from A to B execute in the order in which they were created: in state I, then
II, and finally III. This order does not match the activation order of those states.
To ensure that valid transitions execute in the same order that the parallel states become
active, use the in operator instead of implicit enter or exit events:
9-36
Control Chart Execution Using Implicit Events
With this modification, the transitions from A to B occur in the same order as activation
of the parallel states. For more information about the in operator, see Check State
Activity on page 11-86.
9-37
9 Define Events
Count Events
In this section...
When to Count Events on page 9-38
How to Count Events on page 9-38
Collect and Store Input Data in a Vector on page 9-38
9-38
Count Events
The chart awakens and remains in the Observe state, until the input data u is positive.
Then, the transition to the state Collect_Data occurs.
After the state Collect_Data becomes active, the value of the input data u is assigned
to the first element of the vector y. While this state is active, each subsequent value of u
is assigned to successive elements of y using the temporalCount operator.
After 10 ticks, the data collection process ends, and the transition to the state Observe
occurs. Just before the state Collect_Data becomes inactive, a function call to status
displays the vector data at the MATLAB prompt.
For more information about ticks in a Stateflow chart, see Control Chart Execution
Using Implicit Events on page 9-33.
9-39
9 Define Events
In state actions (entry, during, exit, and on event_name) and condition actions,
use the send command to broadcast explicit events. Using this command enhances
readability of a chart and ensures that explicit events are not mistaken for data. See
Directed Event Broadcasting on page 11-52 for details.
Do not mix edge-triggered input events and function-call input events in a chart
If you mix input events that use edge triggers and function calls, the chart detects this
violation during parsing, or simulation. An error message appears and chart execution
stops.
Use the in operator instead of the enter implicit event to check state activity. See
Check State Activity on page 11-86 for details.
9-40
10
Messages
The first time a chart transition or action evaluates a message, the chart determines if
the message is present in the queue. If the message is present in the queue, then the
chart removes it from the queue. This message is valid until it is forwarded, or until the
end of the time step. While the message is valid, other transitions or actions can access
the message data. While the message is valid, another transition or action that evaluates
the message will not remove another message from the queue. The chart destroys all
valid messages at the end of the current time step. You access message data by reading it
or writing to it.
When a chart receives a message, it does not trigger the chart to wake up. Events trigger
a chart to wake up. If the receiver chart cannot immediately respond to the event, then
the event is lost. Messages are queued at the message input port until the chart wakes
up. When the chart wakes up, it can respond to the messages in the input queue.
Message lines connect input and output ports in Simulink. You can create local
messages. A local message has its own queue with the same queue properties as the
message input port.
To visualize the interchange of messages during simulation, view the Message Viewer
block.
Related Examples
View Differences Between Stateflow Messages, Events, and Data on page
10-3
Work with Message Viewer on page 10-30
More About
Lifetime of a Stateflow Message on page 10-23
Stateflow Message Syntax in Charts on page 10-11
10-2
View Differences Between Stateflow Messages, Events, and Data
Sender Charts
This model has three sender charts, DataSender, EventSender, and MessageSender.
Each sender chart has one state, A. In the entry action of state A, each chart assigns an
output data value to 1, sends a function-call event, or sends a message.
10-3
10 Messages
Receiver Charts
For each of the sender charts, there is a corresponding receiving chart. Each receiver
chart has a state diagram with states A0, A1, A2, and A3. Each receiver chart has
a transition from A0 to A1 after 3 seconds. The data, event, or message from the
corresponding sender chart guards the transitions between A1, A2, and A3.
10-4
View Differences Between Stateflow Messages, Events, and Data
Scope Output
Each receiver chart has active state output enabled, with the output port connected to
a scope. On the scope output, you see which states are active for each time step. This
output highlights the difference in behavior between output data, event, and message.
10-5
10 Messages
10-6
View Differences Between Stateflow Messages, Events, and Data
Behavior of Data
In the entry action of chart DataSender, the output data M is assigned a value of 1. M
connects as input to the chart DataReceiver. M holds this assigned value throughout
the simulation. Because there is no input event, the chart DataReceiver executes once
every time step. In chart DataReceiver, initially state A0 is active. At t=3, the chart
takes the transition to A1. On the scope, you see the state change from A0 to A1. In the
next time step, t=4, the transition tests if M equals 1. This condition is true, so the chart
takes the transition to A2. At t=5, M still equals 1. The chart transitions from A2 to A3.
After data is assigned a value, it remains valid. Therefore, each time a transition
evaluates M, you see DataReceiver transition to a new state.
10-7
10 Messages
Behavior of Event
The chart EventSender uses the syntax send(M) to send an event as an entry action in
state A. This function-call event is an input event to wake up the chart EventReceiver.
The chart EventReceiver executes only when the input event M wakes the chart up.
When event M wakes up chart EventReceiver, state A0 is active. The chart checks for a
valid transition from state A0. The transition from A0 is based on absolute-time temporal
logic, and is not valid at t=0. A0 remains as the active state, and the chart goes back to
sleep. The chart EventReceiver does not wake up again, because chart EventSender
only sends event M once. On the scope, you see that EventReceiver never transitions
out of A0.
Because events do not remain valid across time steps, the chart has only one chance to
respond to the event. When EventSender sent the event, EventReceiver was not in
a state to respond to it. The ability for EventReceiver to transition in response to the
event is lost.
10-8
View Differences Between Stateflow Messages, Events, and Data
Behavior of Message
The chart MessageSender uses the syntax send(M) to send one message through the
message output port. The message goes in the message input receiving queue for the
chart, MessageReceiver. The message waits until MessageReceiver evaluates it.
Because there is no input event, the chart MessageReceiver executes once every time
step. In MessageReceiver, initially, state A0 is active. The chart transitions to state
A1 at t=3. In the next time step, t=4, the transition determines if M is present. The
chart removes M from the receiver input queue. Because M is valid, the chart takes the
transition to A2. The chart destroys M at the end of the time step t=4. At t=5, another
message is not present in the queue, so the chart does not transition to A3. A2 remains
the active state.
10-9
10 Messages
Unlike events, messages are queued. The receiving chart can choose to respond to a
message anytime after it was sent. Unlike data, the message does not remain valid
across time steps. If the number of messages the chart receives overflows the input
queue, then a message overflow error occurs.
More About
How Messages Work in Stateflow Charts on page 10-2
Queuing Behavior of Stateflow Messages on page 10-21
Stateflow Message Syntax in Charts on page 10-11
10-10
Stateflow Message Syntax in Charts
M.data
Do not access message data for messages that are still in the queue. See Lifetime of a
Stateflow Message on page 10-23.
Send a Message
To send a message, use this syntax:
send(message_name)
If the message scope is Output, then the chart sends the message through the output
port to the input message queue of the receiving chart. If the message is local, then the
message goes in the local message queue.
In this example, M is a message with scope Output. On entry to state A, the chart sends a
message from message output port M, with a data value of 3.
10-11
10 Messages
In a single time step, you can send multiple messages through an output port or to a local
queue. If you send a message without assigning a value to the message data, Stateflow
initializes the message data to 0.
10-12
Stateflow Message Syntax in Charts
time step. While the message is valid, another transition or action that evaluates the
message does not remove another message from the queue. While the message is valid,
other transitions or actions can access the message data.
In this example, the transition checks the message queue M. If there is a message present
in the queue, the chart removes it from the queue. If the data value of the valid message
is equal to 3, then the chart takes the transition from state A to state B. If there was no
message present, or if the data value is not equal to 3, then the chart does not take the
transition.
Note: The message is removed from the queue whether the transition is taken or not.
In this example, when the chart executes state A, the chart checks the message queue
M. If there is a message present, the chart removes it from the queue. If the message
data value is equal to 3, then the chart executes the if statement action. If there is no
message present, the chart does not execute the if statement.
10-13
10 Messages
Receive a Message
To receive a message, use this syntax:
receive(message_name)
In this example, when the chart executes state A, the chart checks the message queue
M. If there is a message present, the chart removes it from the queue. If the message
data value is equal to 3, then the chart executes the if statement action. If there is no
message present, the chart does not execute the if statement.
10-14
Stateflow Message Syntax in Charts
Discard a Message
To discard a message, use this syntax:
discard(message_name)
To discard a message, it must be valid. After you discard a message, you can remove the
next message from the queue within the same time step.
In this example, when the chart executes state A, on entry the chart checks the message
queue M. If there is a message present, the chart removes it from the queue. The chart
then checks if a message was received. If receive(M) returns true, the chart then
checks if the message data value is equal to 3. If the message data value is equal to 3, the
message is discarded.
10-15
10 Messages
Forward a Message
Forward an Input Message
You can forward a message from an input message queue to an output port. A message
line connects the output port to a receiving chart input port in Simulink.
10-16
Stateflow Message Syntax in Charts
After a chart forwards a message, if there is another reference to the same message
queue, then the chart looks for another message on the queue.
You can forward messages to and from local message queues. In this example, if a
message is present at input port M_in, then in state A, Stateflow forwards the message to
the local message queue, M_local. After a 0.3 sec delay, on the transition from state
A to B, the chart determines if a message is present on M_local. The chart removes the
message from the M_local message queue and forwards it to the output port M_out.
10-17
10 Messages
isvalid(message_name)
A message is valid if the chart had removed it from the queue, but it has not been
forwarded or discarded. Use isvalid(M) to check if a message is valid in a Simulink
model that contains more than one Stateflow chart.
In this example, the chart first executes state A. When the chart executes state B, it first
checks to see if message M is valid using isvalid(M). If message M is valid, then the
10-18
Stateflow Message Syntax in Charts
chart executes the if statement action. If message M is not valid, the chart does not
execute the if statement.
length(message_name)
Use length(M) to determine the number of messages in the queue associated with M.
In this example, the chart first executes state A. The queue associated with message
M has been set to a number larger than 75. Once the length of the message queue
associated with M becomes equal to 75, an action within the second if statement is taken.
10-19
10 Messages
Related Examples
Define Messages in a Stateflow Chart on page 10-25
Set Message Properties on page 10-27
10-20
Queuing Behavior of Stateflow Messages
Messages of scope Input and Local have a queue capacity. If the number of incoming
messages exceeds the queue capacity, then a message overflow occurs. Set the diagnostic
action by setting the message queue property Queue overflow diagnostic.
Error (default)
Warning
None
Set the queue capacity high enough so that incoming messages do not overflow the
queue. To check the length of the queue, use length.
To add messages to the Stateflow Breakpoints and Watch window, select Add to Watch
Window while viewing the message in the Property Inspector. When the simulation
pauses, you can view message queues and message data values. To visualize the
interchange of messages, use a Message Viewer block in your model.
Related Examples
Work with Message Viewer on page 10-30
10-21
10 Messages
10-22
Lifetime of a Stateflow Message
While a message is valid, other transitions and actions can guard conditions with the
message and access the message data. When you forward a message, the message
continues its lifetime in the receiving queue.
At the end of a time step, a chart destroys any remaining valid messages. You can
destroy a message during a time step by using discard. To check if a message is valid,
use isvalid.
If the receiving queue is full, a message overflow occurs. Set the diagnostic action by
setting the message queue property Queue overflow diagnostic.
To view the interchange of messages during simulation, add a Message Viewer block. In
this block, you see when messages for a model are:
Sent
Received
Forwarded
Dropped
Destroyed
Discarded
Related Examples
Work with Message Viewer on page 10-30
Stateflow Message Syntax in Charts on page 10-11
10-23
10 Messages
Moore charts
Atomic subcharts
Breakpoint condition expressions
Model reference inputs and outputs
More About
Stateflow Message Syntax in Charts on page 10-11
How Messages Work in Stateflow Charts on page 10-2
10-24
Define Messages in a Stateflow Chart
Scope Description
Input from Simulink Message that is received from another Stateflow chart through
Simulink. Each input message has a receiving queue.
Output to Simulink Message that is sent from a Stateflow through an output port in
Simulink to another chart.
Local Message that is local to the Stateflow chart. A local message has
a receiving queue with the same properties as a message input.
When you send a local message, a transition or action in the
same chart can evaluate the local message. You cannot send a
local message outside the chart.
1
Click the Create Message icon .
2 In the row for the new message, under TYPE, click the icon and choose:
Input Message
Local Message
Output Message
10-25
10 Messages
Connect message input and output ports in Simulink with a message line.
More About
Set Message Properties on page 10-27
How Messages Work in Stateflow Charts on page 10-2
10-26
Set Message Properties
10-27
10 Messages
Error (default)
Warning
None
Queue type For messages of scope Input and Local.
10-28
Set Message Properties
More About
Rules for Naming Stateflow Objects on page 2-4
Watch Stateflow Data Values on page 29-35
Size Stateflow Data on page 8-44
Type Stateflow Data on page 8-36
10-29
10 Messages
To see the interchange of messages between Stateflow charts during simulation, add a
Message Viewer block to the model. You can visualize the movement of entities between
blocks when simulating SimEvents models. The Message Viewer block also displays
function calls and calls from MATLAB Function blocks. For more information on function
calls, see Function Calls in Message Viewer on page 10-39.
The Message Viewer block uses a Message Viewer window that acts like a sequence
diagram showing how blocks interact using messages.
The Message Viewer enables you to view event data related to Stateflow chart execution
and the exchange of messages between Stateflow charts. The Message Viewer shows
where messages are created and sent, forwarded, received, and destroyed at different
times during model execution. You can also view the movement of entities between
SimEvents blocks. All SimEvents blocks that can store entities appear as lifelines on the
Message Viewer. Entities moving between these blocks appear as lines with arrows. The
Message Viewer also enables you to view calls to Simulink Function blocks and Stateflow
MATLAB functions.
This topic uses the Stateflow example sf_msg_traffic_light to show you how to use
the Message Viewer.
You can add one or more Message Viewer blocks to the top level of a model or any
subsystem. If you place a Message Viewer block in a subsystem that does not have
messages, the Message Viewer informs you that no messages are available to display. A
viewer can be inactive if, for example, it is in a subsystem that has been commented out.
In such a case, the Message Viewer displays that it is inactive.
10-30
Work with Message Viewer
Visualize Messages
Consider this subsystem, Traffic Light1:
10-31
10 Messages
Controller
Ped Button Sensor
The charts in this subsystems use messages to exchange data. As messages pass through
the system, you can view them in a Message Viewer.
Add a Message Viewer block from the Stateflow library to a subsystem or model whose
messages you want to see. When you open a Message Viewer block and simulate the
model:
10-32
Work with Message Viewer
The header (top) pane of a Message Viewer shows the lifeline headers. In this
example, the lifelines are the two Traffic Light blocks and the GUI. Lifeline headers
show the name of the corresponding blocks in the model that generate or act on
messages. The top of the lifeline is a header, which corresponds to a block in the
model. Gray headers with straight edges correspond to subsystems. Yellow headers
with rounded edges correspond to Stateflow charts. In the header pane, the lifeline
hierarchy corresponds to the model hierarchy. When the model is paused or stopped,
you can expand and close lifelines.
In the message pane, a thick gray lifeline indicates that you can expand the lifeline
to see the children in the lifeline. Clicking a lifeline name opens the corresponding
block in the model. Messages between lifelines display in the message pane. Message
lines are arrows from the sender to the receiver. For more information on navigation
in the message page, see Navigation in Message Viewers on page 10-38.
2 To show the children of a lifeline, click the expander under a parent lifeline .
10-33
10 Messages
.
4 Make a lifeline the root of focus for the viewer. Hover over the bottom left corner of
the lifeline header and click the arrow. Alternatively, use the navigation toolbar at
the top of a Message Viewer. A Message Viewer displays the current root lifeline
path and shows its child lifelines.
10-34
Work with Message Viewer
Any external sending and receiving events display in the diagram gutter . To
highlight the associated block in the model, click the gutter.
You can use the navigation toolbar to move the current root up and down the lifeline
hierarchy. To move up the current root one level, hit the Esc key.
This graphic also illustrates how the Message Viewer displays masked subsystems.
The Traffic Lamp 1, Ped Lamp 1, Traffic Lamp 2, and PED Lamp 2 are masked
subsystems. The Message Viewer displays masked subsystems as white blocks.
10-35
10 Messages
5 To show the children of a masked subsystem, hover over the bottom left corner of the
masked and subsystem and click the arrow.
6 Activations that correspond to executions of the lifeline are at the start and end of
each message line.
If a message line is not completely shown, hover over the line. You can also, hover
over a truncated message label to see it in its entirety. In this example, the send
time of the commIn message line is not visible. To see it, hover over the message
line.
If you hover over an activation that represents a function call, the function prototype
is displayed in the tool tip.
If you hover over partially shown activation symbols, the times for any truncated
activations also appear.
10-36
Work with Message Viewer
7 A Message Viewer shows the interactions (hops) that a message or function call
goes through in its lifetime. It also shows message and function call payloads. To
highlight the hops for a message and display its payload, click the corresponding
message line. See the result in the payload inspector to the right. Use Search Up
and Down buttons to move through the hops.
toolbar. Saving the model saves the state information across sessions. Use to load the
saved settings.
The time ruler shows linear simulation time. To show messages in that simulation time
range, use the scroll wheel or drag the time slider up and down the time ruler.
10-37
10 Messages
Time Grid
Time Strip
Time Ruler
Time Slider
To navigate to the beginning and end of the simulation, click the Go to first event
and Go to last event buttons.
To zoom the ruler, hold the space bar and use the mouse wheel. This action increases
and decreases the amount of time ruler space the slider occupies.
The time ruler covers the whole simulation time. To see the entire simulation
duration on the time ruler, click the Fit to view button .
To reset the zoom to 100%, hold Ctrl + 0.
To pan in the message pane, move the mouse while holding down either the middle
mouse button or space bar. This action moves both panes.
10-38
Work with Message Viewer
The Message Viewer block does not display these function calls:
See Also
Message Viewer | Message Viewer | Message Viewer
10-39
10 Messages
More About
How Messages Work in Stateflow Charts on page 10-2
10-40
11
name/
entry:entry actions
during:during actions
exit:exit actions
bind:data_name, event_name
on event_name:on event_name actions
on message_name:on message_name actions
For example, different state action types appear in the following chart.
After you enter the name in the state label, enter a carriage return and specify the
actions for the state. The order you use to enter action types in the label does not matter.
11-2
State Action Types
If you do not specify the action type explicitly for a statement, the chart treats that
statement as an entry action.
For a full description of entry, exit, during, bind, and on actions, see the sections
that follow. For more information about the after, before, at, and every temporal
logic operators, see Control Chart Execution Using Temporal Logic on page 11-56.
11-3
11 Use Actions in Charts
In the preceding table, the temporal logic operators use the syntax of event-based
temporal logic. For absolute-time temporal logic, the operators use a different syntax. For
details, see Operators for Absolute-Time Temporal Logic on page 11-63.
Entry Actions
Entry actions are preceded by the prefix entry or en for short, followed by a required
colon (:), followed by one or more actions. Separate multiple actions with a carriage
return, semicolon (;), or a comma (,). If you enter the name and slash followed directly
by actions, the actions are interpreted as entry action(s). This shorthand is useful if you
are specifying entry actions only.
Entry actions for a state execute when the state is entered (becomes active). In the
preceding example in State Action Types on page 11-2, the entry action id = x+y
executes when the state A is entered by the default transition.
For a detailed description of the semantics of entering a state, see Steps for Entering a
State on page 3-74 and State Execution Example on page 3-76.
Exit Actions
Exit actions are preceded by the prefix exit or ex for short, followed by a required colon
(:), followed by one or more actions. Separate multiple actions with a carriage return,
semicolon (;), or a comma (,).
Exit actions for a state execute when the state is active and a transition out of the state
occurs.
For a detailed description of the semantics of exiting a state, see Steps for Exiting an
Active State on page 3-75 and State Execution Example on page 3-76.
During Actions
During actions are preceded by the prefix during or du for short, followed by a required
colon (:), followed by one or more actions. Separate multiple actions with a carriage
return, semicolon (;), or a comma (,).
During actions for a state execute when the state is active and an event occurs and no
valid transition to another state is available.
11-4
State Action Types
For a detailed description of the semantics of executing an active state, see Steps for
Executing an Active State on page 3-75 and State Execution Example on page 3-76.
Bind Actions
Bind actions are preceded by the prefix bind, followed by a required colon (:), followed
by one or more events or data. Separate multiple data/events with a carriage return,
semicolon (;), or a comma (,).
Bind actions bind the specified data and events to a state. Data bound to a state can be
changed by the actions of that state or its children. Other states and their children are
free to read the bound data, but they cannot change it. Events bound to a state can be
broadcast only by that state or its children. Other states and their children are free to
listen for the bound event, but they cannot send it.
Bind actions apply to a chart whether the binding state is active or not. In the preceding
example in State Action Types on page 11-2, the bind action bind: id,
time_out for state A binds the data id and the event time_out to state A. This binding
prevents any other state (or its children) in the chart from changing id or broadcasting
event time_out.
If another state includes actions that change data or broadcast events that bind to
another state, a parsing error occurs. The following example shows a few of these error
conditions:
11-5
11 Use Actions in Charts
Binding a function-call event to a state also binds the function-call subsystem that it
calls. In this case, the function-call subsystem is enabled when the binding state is
entered and disabled when the binding state is exited. For more information about this
behavior, see Control Function-Call Subsystems Using Bind Actions on page 11-95.
On Actions
On actions are preceded by the prefix on, followed by a unique event, event_name, or
message, message_name, followed by one or more actions. Separate multiple actions
with a carriage return, semicolon (;), or a comma (,). You can specify actions for more
than one event or message by adding additional on lines for different events or messages.
11-6
State Action Types
For example, if you want different events to trigger different actions, enter multiple
on event_name action statements in the state's label, each specifying the action for a
particular event or set of events:
on ev1: action1();
on ev2: action2();
On actions execute when the state is active and the event event_name or message
message_name is received by the state. This action coincides with execution of during
actions for the state.
For a detailed description of the semantics of executing an active state, see Steps for
Executing an Active State on page 3-75.
Related Examples
Combine State Actions to Eliminate Redundant Code on page 11-16
11-7
11 Use Actions in Charts
event_or_message trigger[condition]{condition_action}/{transition_action}
11-8
Transition Action Types
11-9
11 Use Actions in Charts
Event triggers specify an event that causes the transition to be taken, provided the
condition, if specified, is true. Specifying an event is optional. Message triggers specify
the transition to be taken if the message is present in the message queue. The absence
of an event or message indicates that the transition is taken upon the occurrence of any
event. Multiple events or messages are specified using the OR logical operator (|).
Conditions
In transition label syntax, conditions are Boolean expressions enclosed in square
brackets ([]). In the example in Transition Action Types on page 11-8, the transition
from state A to state C has the condition temp > 50.
A condition is a Boolean expression to specify that a transition occurs given that the
specified expression is true. Follow these guidelines for defining and using conditions:
The condition expression must be a Boolean expression that evaluates to true (1) or
false (0).
The condition expression can consist of any of the following:
Boolean operators that make comparisons between data and numeric values
A function that returns a Boolean value
An in(state_name) condition that evaluates to true when the state specified as
the argument is active (see Check State Activity on page 11-86)
Note: A chart cannot use the in condition to trigger actions based on the activity
of states in other charts.
Temporal logic conditions (see Control Chart Execution Using Temporal Logic on
page 11-56)
The condition expression can call a graphical function, truth table function, or
MATLAB function that returns a numeric value.
Note: If the condition expression calls a function with multiple return values, only the
first value applies. The other return values are not used.
The condition expression should not call a function that causes the chart to change
state or modify any variables.
11-10
Transition Action Types
Boolean expressions can be grouped using & for expressions with AND relationships
and | for expressions with OR relationships.
Assignment statements are not valid condition expressions.
Unary increment and decrement actions are not valid condition expressions.
Condition Actions
In transition label syntax, condition actions follow the transition condition and are
enclosed in curly braces ({}). In the example in Transition Action Types on page 11-8,
the transition from state A to state C has the condition action func1(), a function call.
Condition actions are executed as soon as the condition is evaluated as true, but before
the transition destination has been determined to be valid. If no condition is specified, an
implied condition evaluates to true and the condition action is executed.
Transition Actions
In transition label syntax, transition actions are preceded with a forward slash (/) and
are enclosed in curly braces ({}). In the example in Transition Action Types on page
11-8, the transition from state A to state B has the transition action data1 = 5. In C
charts, transition actions are not required to be enclosed in curly braces. In charts that
use MATLAB as the action language, the syntax is auto corrected if the curly braces
are missing from the transition action. See Action Language Auto Correction on page
12-6.
Transition actions execute only after the complete transition path is taken. They execute
after the transition destination has been determined to be valid, and the condition, if
specified, is true. If the transition consists of multiple segments, the transition action
executes only after the entire transition path to the final destination is determined to be
valid.
11-11
11 Use Actions in Charts
When you simulate the model, you get the following results:
11-12
Execution of Actions in States and Transitions
11-13
11 Use Actions in Charts
11-14
Execution of Actions in States and Transitions
More About
State Action Types on page 11-2
Transition Action Types on page 11-8
11-15
11 Use Actions in Charts
Combining state actions this way produces the same chart execution behavior
(semantics) and generates the same code as the equivalent separate actions.
11-16
Combine State Actions to Eliminate Redundant Code
Valid Combinations
You can use any combination of the three actions. For example, the following
combinations are valid:
en, du:
en, ex:
du, ex:
en, du, ex:
You can combine actions in any order in the comma-separated list. For example, en,
du: gives the same result as du, en:.
Invalid Combinations
You cannot combine two or more actions of the same type. For example, the following
combinations are invalid:
en, en:
ex, en, ex:
du, du, ex:
If you combine multiple actions of the same type, you receive a warning that the chart
executes the action only once.
1 Entry actions first, from top to bottom in the order they appear in the state
2 During actions second, from top to bottom
3 Exit actions last, from top to bottom
The order in which you combine actions does not affect state execution behavior. For
example:
11-17
11 Use Actions in Charts
1 en: y=y+1;
2 en: y = 0;
3 du: y=y+1;
1 en: y=y+1;
2 en: y = 0;
3 du: y=y+1;
1 en: y=y+1;
2 en: y = 10;
3 du: y=y+1;
4 ex: y = 10;
More About
State Action Types on page 11-2
11-18
Supported Operations on Chart Data
For more predictable results, it is good coding practice to split expressions that depend on
the order of evaluation into multiple statements.
You can specify that the binary operators &, ^, |, &&, and || are interpreted as bitwise
operators in Stateflow generated C code for a chart or for all the charts in a model. See
these individual operators in the table below for specific binary or bitwise operator
interpretations.
11-19
11 Use Actions in Charts
11-20
Supported Operations on Chart Data
11-21
11 Use Actions in Charts
Unary Operations
The following unary operators are supported in C charts. Unary operators have higher
precedence than the binary operators, except for the power operator a ^ b. The power
operator has the highest level of precedence. The operators are evaluated right to left
(right associative).
Example Description
~a Logical NOT of a
Unary Actions
The following unary actions are supported in C charts.
Example Description
a++ Increment a
a-- Decrement a
Assignment Operations
The following assignment operations are supported in C charts.
Example Description
a = expression Simple assignment
a := expression Used primarily with fixed-point numbers. See Assignment
(=, :=) Operations on page 20-30 for a detailed description.
a += expression Equivalent to a = a + expression
a -= expression Equivalent to a = a - expression
a *= expression Equivalent to a = a * expression
a /= expression Equivalent to a = a / expression
11-22
Supported Operations on Chart Data
The following assignment operations are supported in C charts when Enable C-bit
operations is selected in the properties dialog box for the chart. See Specify Chart
Properties on page 22-3.
Example Description
a |= expression Equivalent to a = a | expression (bit operation). See
operation a | b in Binary and Bitwise Operations on page
11-19.
a &= expression Equivalent to a = a & expression (bit operation). See
operation a & b in Binary and Bitwise Operations on page
11-19.
a ^= expression Equivalent to a = a ^ expression (bit operation). See
operation a ^ b in Binary and Bitwise Operations on page
11-19.
Note: The parser uses a relaxed set of restrictions and does not catch syntax errors until
compile time.
The following examples show syntax that is valid for both Stateflow and custom code
variables. The prefix cc_ shows the places where you can use only custom code variables,
and the prefix sfcc_ shows the places where you can use either Stateflow or custom code
variables.
cc_varPtr = &sfcc_var;
cc_ptr = &sfcc_varArray[<expression>];
cc_function(&sfcc_varA, &sfcc_varB, &sfcc_varC);
cc_function(&sfcc_sf.varArray[<expression>]);
The following examples show syntax that is valid only for custom code variables.
varStruct.field = <expression>;
(*varPtr) = <expression>;
11-23
11 Use Actions in Charts
varPtr->field = <expression>;
myVar = varPtr->field;
varPtrArray[index]->field = <expression>;
varPtrArray[expression]->field = <expression>;
myVar = varPtrArray[expression]->field;
For example, you might have a custom code function that requires integer RGB values
for a graphic plot. You might have these values in Stateflow data, but only in data of type
double. To call this function, you must type cast the original data and assign the result
to integers, which you use as arguments to the function.
Stateflow type cast operations have two forms: the MATLAB type cast form and the
explicit form using the cast operator. These operators and the special type operator,
which works with the explicit cast operator, are described in the topics that follow.
<type_op> is a conversion type operator that can be double, single, int32, int16,
int8, uint32, uint16, uint8, or boolean. <expression> is the expression to be
converted. For example, you can cast the expression x+3 to a 16-bit unsigned integer and
assign its value to the data y as follows:
y = uint16(x+3)
You can also type cast with the explicit cast operator, which has the following general
form:
11-24
Supported Operations on Chart Data
cast(<expression>,<type>)
y = cast(x+3,'uint16')
will cast the expression x+3 to a 16-bit unsigned integer and assign it to y, which can be
of any type.
type Operator
To make type casting more convenient, you can use a type operator that works with the
explicit type cast operator cast to let you assign types to data based on the types of other
data.
The type operator returns the type of an existing Stateflow data according to the general
form
type(<data>)
The return value from a type operation can be used only in an explicit cast operation.
For example, if you want to convert the data y to the same type as that of data z, use the
following statement:
cast(y,type(z))
In this case, the data z can have any acceptable Stateflow type.
Operator entries of the code replacement library can specify integral or fixed-point
operand and result patterns. Operator entries can be used for the following built-in
operators:
+
11-25
11 Use Actions in Charts
-
*
/
C chart semantics might limit operator entry matching because the chart uses the target
integer size as its intermediate type in arithmetic expressions. For example, suppose a
Stateflow action contains this arithmetic expression:
y = (u1 + u2) % 3
This expression computes the intermediate addition into a target integer. If the target
integer size is 32 bits, you cannot replace this expression with an addition operator from
the code replacement library to produce a signed 16-bit result, without a loss of precision.
For more information about replacing code, using code replacement libraries that
MathWorks provides, see What Is Code Replacement? (Simulink Coder) and Code
Replacement Libraries (Simulink Coder). For information about developing custom
code replacement libraries, see What Is Code Replacement Customization? (Embedded
Coder) and Code You Can Replace From Simulink Models (Embedded Coder).
11-26
Supported Symbols in Actions
In this section...
Boolean Symbols, true and false on page 11-27
Comment Symbols, %, //, /* on page 11-28
Hexadecimal Notation Symbols, 0xFF on page 11-28
Infinity Symbol, inf on page 11-28
Line Continuation Symbol, ... on page 11-29
Literal Code Symbol, $ on page 11-29
MATLAB Display Symbol, ; on page 11-29
Single-Precision Floating-Point Number Symbol, F on page 11-29
Time Symbol, t on page 11-29
cooling_fan = true;
heating_fan = false;
Tip: These symbols are case-sensitive. Therefore, TRUE and FALSE are not Boolean
symbols.
Do not use true and false in the following cases. Otherwise, error messages appear.
true++;
false += 3;
[true, false] = my_function(x);
Argument of the change implicit event (see Control Chart Execution Using Implicit
Events on page 9-33)
11-27
11 Use Actions in Charts
change(true);
chg(false);
Indexing into a vector or matrix (see Assign and Access Vector and Matrix Values on
page 16-8)
x = true[1];
y = false[1][1];
Note: If you define true and false as Stateflow data objects, your custom definitions of
true and false override the built-in Boolean constants.
You can also include comments in generated code for an embedded target (see Model
Configuration Parameters: Code Generation Comments (Simulink Coder). C chart
comments in generated code use multibyte character code. Therefore, you can have code
comments with characters for non-English alphabets, such as Japanese Kanji characters.
Note: If you define inf as a Stateflow data object, your custom definition of inf
overrides the built-in value.
11-28
Supported Symbols in Actions
$
ptr -> field = 1.0;
$
Time Symbol, t
For C charts, use the letter t to represent absolute time that the chart inherits from a
Simulink signal in simulation targets. For example, the condition [t - On_time >
Duration] specifies that the condition is true if the difference between the simulation
time t and On_time is greater than the value of Duration.
11-29
11 Use Actions in Charts
The letter t has no meaning for nonsimulation targets, since t depends on the specific
application and target hardware.
Note: If you define t as a Stateflow data object, your custom definition of t overrides the
built-in value.
For charts that use MATLAB as the action language the letter t is not a reserved
symbol. To get the simulation time, use the function getSimulationTime().
11-30
Call C Functions in C Charts
* ** ** ** ** ** **
abs acos asin atan atan2 ceil
** ** ** fabs ** **
cos cosh exp floor fmod
labs ** ** ** ** rand
ldexp log log10 pow
sin
**
sinh
**
sqrt
**
tan
**
tanh
**
*
The Stateflow abs function goes beyond that of its standard C counterpart with its own
built-in functionality. See Call the abs Function on page 11-32.
**
You can also replace calls to the C Math Library with application-specific
implementations for this subset of functions. For more information, see Replacement of
Math Library Functions with Application Implementations on page 11-33.
When you call these math functions, double precision applies unless all the input
arguments are explicitly single precision. When a type mismatch occurs, a cast of the
input arguments to the expected type replace the original arguments. For example, if
you call the sin function with an integer argument, a cast of the input argument to a
floating-point number of type double replaces the original argument.
If you call other C library functions not listed above, include the appropriate
#include... statement in the Simulation Target pane of the Configuration
Parameters.
11-31
11 Use Actions in Charts
If you want to use the abs function in the strict sense of standard C, cast its argument or
return values to integer types. See Type Cast Operations on page 11-24.
Note: If you declare x in custom code, the standard C abs function applies in all cases.
For instructions on inserting custom code into charts, see Share Data Using Custom C
Code on page 28-25.
To allow compatibility with user graphical functions named min() or max(), generated
code uses a mangled name of the following form: <prefix>_min. However, if you export
min() or max() graphical functions to other charts in your model, the name of these
functions can no longer be emitted with mangled names in generated code and conflict
occurs. To avoid this conflict, rename the min() and max() graphical functions.
11-32
Call C Functions in C Charts
For more information about replacing code, using code replacement libraries that
MathWorks provides, see What Is Code Replacement? (Simulink Coder) and Code
Replacement Libraries (Simulink Coder) in the Simulink Coder documentation. For
information about developing custom code replacement libraries, see What Is Code
Replacement Customization? (Embedded Coder) and Code You Can Replace From
Simulink Models (Embedded Coder) in the Embedded Coder documentation.
11-33
11 Use Actions in Charts
For example, your custom function can include a for-loop that uses sizeof as follows:
For example, you can use input_length as the second input to a sum function as
follows:
Your sum function can include a for-loop that iterates over all elements of the input
vector:
11-34
Call C Functions in C Charts
Example formats of function calls using transition action notation appear in the following
chart.
A function call to fcn1 occurs with arg1, arg2, and arg3 if the following are true:
S1 is active.
Event e occurs.
Condition c is true.
The transition destination S2 is valid.
The transition action in the transition from S2 to S3 shows a function call nested within
another function call.
Example formats of function calls using state action notation appear in the following
chart.
11-35
11 Use Actions in Charts
f(&x);
If x is the name of a data item defined in the Stateflow hierarchy, the following rules
apply:
Do not use pointers to pass data items input from a Simulink model.
If you need to pass an input item by reference, for example, an array, assign the item
to a local data item and pass the local item by reference.
11-36
Call C Functions in C Charts
If x is a Simulink output data item having a data type other than double, the chart
property Use Strong Data Typing with Simulink I/O must be on (see Specify
Chart Properties on page 22-3).
If the data type of x is boolean, you must turn off the coder option Use bitsets for
storing state configuration.
If x is an array with its first index property set to 0 (see Set Data Properties on page
8-6), then you must call the function as follows.
f(&(x[0]));
f(&(x[1]));
11-37
11 Use Actions in Charts
For charts that use MATLAB as the action language, you can call MATLAB functions
supported for code generation directly.
Caution Because MATLAB functions are not available in a target environment, do not
use the ml namespace operator and the ml function if you plan to build a code generation
target.
ml Namespace Operator
For C charts, the ml namespace operator uses standard dot (.) notation to reference
MATLAB variables and functions. For example, the statement a = ml.x returns the
value of the MATLAB workspace variable x to the Stateflow data a.
11-38
Access Built-In MATLAB Functions and Workspace Data
If the MATLAB function you call does not require arguments, you must still include the
parentheses. If you omit the parentheses, Stateflow software interprets the function
name as a workspace variable, which, when not found, generates a run-time error during
simulation.
Examples
In these examples, x, y, and z are workspace variables and d1 and d2 are Stateflow data:
a = ml.sin(ml.x)
In this example, the MATLAB function sin evaluates the sine of x, which is then
assigned to Stateflow data variable a. However, because x is a workspace variable,
you must use the namespace operator to access it. Hence, ml.x is used instead of just
x.
a = ml.sin(d1)
In this example, the MATLAB function sin evaluates the sine of d1, which is
assigned to Stateflow data variable a. Because d1 is Stateflow data, you can access it
directly.
ml.x = d1*d2/ml.y
The result of the expression is assigned to x. If x does not exist prior to simulation, it
is automatically created in the MATLAB workspace.
ml.v[5][6][7] = ml.matfunc(ml.x[1][3], ml.y[3], d1, d2, 'string')
The workspace variables x and y are arrays. x[1][3] is the (1,3) element of the
two-dimensional array variable x. y[3] is the third element of the one-dimensional
array variable y. The last argument, 'string', is a character vector.
The return from the call to matfunc is assigned to element (5,6,7) of the workspace
array, v. If v does not exist prior to simulation, it is automatically created in the
MATLAB workspace.
ml Function
For C charts, you can use the ml function to specify calls to MATLAB functions. The
format for the ml function call uses this notation:
11-39
11 Use Actions in Charts
The format specifiers used in ml functions are the same as those used in the C functions
printf and sprintf. The ml function call is equivalent to calling the MATLAB eval
function with the ml namespace operator if the arguments arg1, arg2,... are
restricted to scalars or literals in the following command:
ml.eval(ml.sprintf(evalString, arg1, arg2,...))
Stateflow software assumes scalar return values from ml namespace operator and ml
function calls when they are used as arguments in this context. See How Charts Infer
the Return Size for ml Expressions on page 11-45.
Examples
In these examples, x is a MATLAB workspace variable, and d1 and d2 are Stateflow
data:
a = ml('sin(x)')
In this example, the ml function calls the MATLAB function sin to evaluate the sine
of x in the MATLAB workspace. The result is then assigned to Stateflow data variable
a. Because x is a workspace variable, and sin(x) is evaluated in the MATLAB
workspace, you enter it directly in the evalString argument ('sin(x)').
a = ml('sin(%f)', d1)
In this example, the MATLAB function sin evaluates the sine of d1 in the MATLAB
workspace and assigns the result to Stateflow data variable a. Because d1 is
Stateflow data, its value is inserted in the evalString argument ('sin(%f)') using
the format expression %f. This means that if d1 = 1.5, the expression evaluated in the
MATLAB workspace is sin(1.5).
a = ml('matfunc(%g, ''abcdefg'', x, %f)', d1, d2)
11-40
Access Built-In MATLAB Functions and Workspace Data
sfmat_44 = ml('rand(4)')
ml Expressions
For C charts, you can mix ml namespace operator and ml function expressions along
with Stateflow data in larger expressions. The following example squares the sine and
cosine of an angle in workspace variable X and adds them:
ml.power(ml.sin(ml.X),2) + ml('power(cos(X),2)')
The first operand uses the ml namespace operator to call the sin function. Its argument
is ml.X, since X is in the MATLAB workspace. The second operand uses the ml function.
Because X is in the workspace, it appears in the evalString expression as X. The
squaring of each operand is performed with the MATLAB power function, which takes
two arguments: the value to square, and the power value, 2.
Expressions using the ml namespace operator and the ml function can be used as
arguments for ml namespace operator and ml function expressions. The following
example nests ml expressions at three different levels:
a = ml.power(ml.sin(ml.X + ml('cos(Y)')),2)
In composing your ml expressions, follow the levels of precedence set out in Binary and
Bitwise Operations on page 11-19. Use parentheses around power expressions with the
^ operator when you use them in conjunction with other arithmetic operators.
Stateflow software checks expressions for data size mismatches in your actions during
parsing of charts and during run time. Because the return values for ml expressions are
not known until run time, Stateflow software must infer the size of their return values.
See How Charts Infer the Return Size for ml Expressions on page 11-45.
11-41
11 Use Actions in Charts
The for loop creates four new matrix variables in the MATLAB workspace. The
default transition initializes the Stateflow counter i to 0, while the transition
segment between the top two junctions increments it by 1. If i is less than 5, the
transition segment back to the top junction evaluates the ml function call ml('A%d =
rand(%d)',i,i) for the current value of i. When i is greater than or equal to 5, the
transition segment between the bottom two junctions occurs and execution stops.
The transition executes the following MATLAB commands, which create a workspace
scalar (A1) and three matrices (A2, A3, A4):
A1 = rand(1)
A2 = rand(2)
A3 = rand(3)
A4 = rand(4)
Use the ml function with full MATLAB notation.
You cannot use full MATLAB notation with the ml namespace operator, as the
following example shows:
ml.A = ml.magic(4)
B = ml('A + A''')
This example sets the workspace variable A to a magic 4-by-4 matrix using the ml
namespace operator. Stateflow data B is then set to the addition of A and its transpose
11-42
Access Built-In MATLAB Functions and Workspace Data
matrix, A', which produces a symmetric matrix. Because the ml namespace operator
cannot evaluate the expression A', the ml function is used instead. However, you
can call the MATLAB function transpose with the ml namespace operator in the
following equivalent expression:
B = ml.A + ml.transpose(ml.A)
As another example, you cannot use arguments with cell arrays or subscript
expressions involving colons with the ml namespace operator. However, these can be
included in an ml function call.
ml Data Type
Stateflow data of type ml is typed internally with the MATLAB type mxArray for C
charts. You can assign (store) any type of data available in the Stateflow hierarchy to a
data of type ml. These types include any data type defined in the Stateflow hierarchy or
returned from the MATLAB workspace with the ml namespace operator or ml function.
You can initialize ml data from the MATLAB workspace just like other data in the
Stateflow hierarchy (see Initialize Data from the MATLAB Base Workspace on page
8-25).
Any numerical scalar or array of ml data in the Stateflow hierarchy can participate in
any kind of unary operation and any kind of binary operation with any other data in
the hierarchy.
If ml data participates in any numerical operation with other data, the size of the ml
data must be inferred from the context in which it is used, just as return data from
the ml namespace operator and ml function are. See How Charts Infer the Return
Size for ml Expressions on page 11-45.
Note: The preceding rule does not apply to ml data storing MATLAB 64-bit integers.
You can use ml data to store 64-bit MATLAB integers but you cannot use 64-bit
integers in C charts.
You cannot define ml data with the scope Constant.
11-43
11 Use Actions in Charts
This option is disabled in the Data properties dialog box and in the Model Explorer for
Stateflow data of type ml.
You can use ml data to build a simulation target but not to build an embeddable code
generation target.
If data of type ml contains an array, you can access the elements of the array via
indexing with these rules:
In other words, you can access only one-dimensional arrays by a single index
value. You cannot access a multidimensional array with a single index value.
c The first index value for each dimension of an array is 1, and not 0, as in C
language arrays.
In the examples that follow, mldata is a Stateflow data of type ml, ws_num_array is
a 2-by-2 MATLAB workspace array with numerical values, and ws_str_array is a 2-
by-2 MATLAB workspace array with character vector values.
mldata = ml.ws_num_array; /* OK */
n21 = mldata[2][1]; /* OK for numerical data of type ml */
n21 = mldata[3]; /* NOT OK for 2-by-2 array data */
mldata = ml.ws_str_array; /* OK */
s21 = mldata[2][1]; /* NOT OK for character vector data of type ml*/
ml data cannot have a scope outside a C chart; that is, you cannot define the scope of
ml data as Input to Simulink or Output to Simulink.
Both the ml namespace operator and the ml function can access data directly in the
MATLAB workspace and return it to a C chart. However, maintaining data in the
MATLAB workspace can present Stateflow users with conflicts with other data already
resident in the workspace. Consequently, with the ml data type, you can maintain ml
data in a chart and use it for MATLAB computations in C charts.
As an example, in the following statements, mldata1 and mldata2 are Stateflow data of
type ml:
mldata1 = ml.rand(3);
mldata2 = ml.transpose(mldata1);
11-44
Access Built-In MATLAB Functions and Workspace Data
In the first line of this example, mldata1 receives the return value of the MATLAB
function rand, which, in this case, returns a 3-by-3 array of random numbers. Note that
mldata1 is not specified as an array or sized in any way. It can receive any MATLAB
workspace data or the return of any MATLAB function because it is defined as a
Stateflow data of type ml.
In the second line of the example, mldata2, also of Stateflow data type ml, receives
the transpose matrix of the matrix in mldata1. It is assigned the return value of the
MATLAB function transpose in which mldata1 is the argument.
Note the differences in notation if the preceding example were to use MATLAB
workspace data (wsdata1 and wsdata2) instead of Stateflow ml data to hold the
generated matrices:
ml.wsdata1 = ml.rand(3);
ml.wsdata2 = ml.transpose(ml.wsdata1);
In this case, each workspace data must be accessed through the ml namespace operator.
For example, the size of the return values from the expressions ml.var, ml.func(),
or ml(evalString, arg1, arg2,...), where var is a MATLAB workspace
variable and func is a MATLAB function, cannot be known until run-time.
Stateflow data of type ml
Graphical functions that return Stateflow data of type ml
When these expressions appear in actions, Stateflow code generation creates temporary
data to hold intermediate returns for evaluation of the full expression of which they are
a part. Because the size of these return values is unknown until run time, Stateflow
software must employ context rules to infer the sizes for creation of the temporary data.
During run time, if the actual returned value from one of these commands differs from
the inferred size of the temporary variable that stores it, a size mismatch error appears.
11-45
11 Use Actions in Charts
To prevent run-time errors, use the following guidelines to write actions with MATLAB
commands or ml data:
Guideline Example
Return sizes of MATLAB commands or data in an In the expression ml.func() * (x
expression must match return sizes of peer expressions. + ml.y), if x is a 3-by-2 matrix, then
ml.func() and ml.y are also assumed
to evaluate to 3-by-2 matrices. If either
returns a value of different size (other
than a scalar), an error results during
run-time.
Expressions that return a scalar never produce an In the expression ml.x + y, if y is a 3-
error. by-2 matrix and ml.x returns a scalar,
the resulting value is the result of adding
You can combine matrices and scalars in larger the scalar value of ml.x to every member
expressions because MATLAB commands use scalar of y to produce a matrix with the size of
expansion. y, that is, a 3-by-2 matrix.
11-46
Access Built-In MATLAB Functions and Workspace Data
Guideline Example
The return size for an indexed array element access The expression x[1][1], where x is a 3-
must be a scalar. by-2 array, must evaluate to a scalar.
MATLAB command or data elements used in an In the function call ml.func(x +
expression for the input argument of a MATLAB ml.y), if x is a 3-by-2 array, ml.y must
function called through the ml namespace operator are return a 3-by-2 array or a scalar.
resolved for size. This resolution uses the rule for peer
expressions (preceding rule 1) for the expression itself,
because no size definition prototype is available.
MATLAB command or data elements used for the input If the graphical function gfunc has the
argument for a graphical function in an expression are prototype gfunc(arg1), where arg1 is
resolved for size by the function prototype. a 2-by-3 Stateflow data array, the calling
expression, gfunc(ml.y + x), requires
that both ml.y and x evaluate to 2-by-3
arrays (or scalars) during run-time.
ml function calls can take only scalar or character In the expression a = ml('sin(x)'),
vector literal arguments. Any MATLAB command or the ml function calls the MATLAB
data that specifies an argument for the ml function function sin to evaluate the sine of x in
must return a scalar value. the MATLAB workspace. Stateflow data
variable a stores that result.
In an assignment, the size of the right-hand expression In the expression s = ml.func(x),
must match the size of the left-hand expression, with where x is a 3-by-2 matrix and s is
one exception. If the left-hand expression is a single scalar Stateflow data, ml.func(x)
MATLAB variable, such as ml.x, or Stateflow data of must return a scalar to match the left-
type ml, the right-hand expression determines the sizes hand expression, s. However, in the
of both expressions. expression ml.y = x + s, where x
is a 3-by-2 data array and s is scalar,
the left-hand expression, workspace
variable y, is assigned the size of a 3-by-2
array to match the size of the right-hand
expression, x+s, a 3-by-2 array.
11-47
11 Use Actions in Charts
Guideline Example
In an assignment, Stateflow column vectors on the left- In the expression s = ml.func(),
hand side are compatible with MATLAB row or column where ml.func() returns a 1-by-3
vectors of the same size on the right-hand side. matrix, if s is a vector of size 3, the
assignment is valid.
A matrix you define with a row dimension of 1 is
considered a row vector. A matrix you define with
one dimension or with a column dimension of 1 is
considered a column vector.
If you cannot resolve the return size of MATLAB In the expression ml.x = ml.y + ml.z,
command or data elements in a larger expression by none of the preceding rules can be used
any of the preceding rules, they are assumed to return to infer a common size among ml.x,
scalar values. ml.y, and ml.z. In this case, both ml.y
and ml.z are assumed to return scalar
values. Even if ml.y and ml.z return
matching sizes at run-time, if they return
nonscalar values, a size mismatch error
results.
The preceding rules for resolving the size of member The expression x + ml.str, where
MATLAB commands or Stateflow data of type ml in a ml.str is a character vector workspace
larger expression apply only to cases in which numeric variable, produces a run-time error
values are expected for that member. For nonnumeric stating that ml.str is not a numeric
returns, a run-time error results. type.
Special cases exist, in which no size checking occurs to resolve the size of MATLAB
command or data expressions that are part of larger expressions. Use of the following
expressions does not require enforcement of size checking at run-time:
ml.var
ml.func()
ml(evalString, arg1, arg2,...)
Stateflow data of type ml
11-48
Access Built-In MATLAB Functions and Workspace Data
For example, in the expression ml.x = ml.y, ml.y is a MATLAB workspace variable
of any size and type (structure, cell array, character vector, and so on).
An assignment in which the left-hand side is a data of type ml
For example, in the expression m_x = ml.func(), m_x is a Stateflow data of type
ml.
Input arguments of a MATLAB function
Note: If you replace the inputs in the preceding cases with non-MATLAB numeric
Stateflow data, conversion to an ml type occurs.
11-49
11 Use Actions in Charts
In this section...
Array Notation on page 11-50
Arrays and Custom Code on page 11-50
Array Notation
A Stateflow action in a C chart uses C style syntax and zero-based indexing by default
to access array elements. This syntax differs from MATLAB notation, which uses one-
based indexing. For example, suppose you define a Stateflow input A of size [3 4]. To
access the element in the first row, second column, use the expression A[0][1]. Other
examples of zero-based indexing in C charts include:
local_array[1][8][0] = 10;
local_array[i][j][k] = 77;
var = local_array[i][j][k];
Note: Use the same notation for accessing arrays in C charts, from Simulink models, and
from custom code.
local_array = 10;
Scalar expansion is available for performing general operations. This statement is valid if
the arrays array_1, array_2, and array_3 have the same value for the Sizes property.
11-50
Use Arrays in Actions
Note: Any array variable that is referred to in a C chart but is not defined in the
Stateflow hierarchy is identified as a custom code variable.
11-51
11 Use Actions in Charts
Using a directed local event broadcast provides the following benefits over an undirected
broadcast:
For information about avoiding unwanted recursion, see Guidelines for Avoiding
Unwanted Recursion in a Chart on page 29-33.
where event_name is broadcast to state_name and any offspring of that state in the
hierarchy. The event you send must be visible to both the sending state and the receiving
state (state_name).
The state_name argument can include a full hierarchy path to the state. For example,
if the state A contains the state A1, send an event e to state A1 with the following
broadcast:
send(e, A.A1)
11-52
Broadcast Events to Synchronize States
Tip: Do not include the chart name in the full hierarchy path to a state.
In this example, event E_one belongs to the chart and is visible to both A and B. See
Directed Event Broadcast Using Send on page B-52 for more information on the
semantics of this notation.
send(state_name.event_name)
11-53
11 Use Actions in Charts
where event_name is broadcast to its owning state (state_name) and any offspring
of that state in the hierarchy. The event you send is visible only to the receiving state
(state_name).
The state_name argument can also include a full hierarchy path to the receiving state.
Do not use the chart name in the full path name of the state.
The following example shows the use of a qualified event name in a directed local event
broadcast.
In this example, event E_one belongs to state B and is visible only to that state. See
Directed Event Broadcast Using Qualified Event Name on page B-53 for more
information on the semantics of this notation.
11-54
Broadcast Events to Synchronize States
You can control the level of diagnostic action for undirected local event broadcasts in the
Diagnostics > Stateflow pane of the Model Configuration Parameters dialog box. Set
the Undirected event broadcasts diagnostic to none, warning, or error. For more
information, see the documentation for the Undirected event broadcasts (Simulink)
diagnostic.
11-55
11 Use Actions in Charts
You can use any explicit or implicit event as a base event for a temporal operator. A
base event is a recurring event on which a temporal operator operates.
For a chart with no input events, you can use the tick or wakeup event to denote the
implicit event of a chart waking up.
Temporal logic operators can appear only in:
11-56
Control Chart Execution Using Temporal Logic
State actions
Transitions that originate from states
Transition segments that originate from junctions when the full transition path
connects two states
Note: This restriction means that you cannot use temporal logic operators in default
transitions or flow chart transitions.
Every temporal logic operator has an associated state: the state in which the action
appears or from which the transition originates.
You must use event notation (see Notations for Event-Based Temporal Logic on
page 11-61) to express event-based temporal logic in state actions.
11-57
11 Use Actions in Charts
11-58
Control Chart Execution Using Temporal Logic
11-59
11 Use Actions in Charts
11-60
Control Chart Execution Using Temporal Logic
Event Notation
Use event notation to define a state action or a transition condition that depends only on
a base event.
where
Conditional Notation
Use conditional notation to define a transition condition that depends on base and
nonbase events.
11-61
11 Use Actions in Charts
where
Note: You must use event notation in state actions, because the syntax of state actions
does not support the use of conditional notation.
11-62
Control Chart Execution Using Temporal Logic
11-63
11 Use Actions in Charts
The following continuous-time chart defines two absolute time delays in transitions.
11-64
Control Chart Execution Using Temporal Logic
In the following model, the Step block provides a unit step input to the chart.
11-65
11 Use Actions in Charts
Use absolute-time temporal logic instead of the implicit tick event for these reasons:
Delay expressions that use absolute-time temporal logic are independent of the
sample time of the model. However, the tick event is dependent on sample time.
Absolute-time temporal logic works in charts that have function-call input events. The
tick event does not work in charts with function-call inputs.
Absolute-time temporal logic supports seconds (sec), milliseconds (msec) and
microseconds (usec) syntax for the before and after operators.
11-66
Control Chart Execution Using Temporal Logic
Suppose that your model has an enabled subsystem that contains a chart with the after
operator. In the subsystem, the States when enabling parameter is set to held.
11-67
11 Use Actions in Charts
The Signal Builder block provides the following input signal to the subsystem.
State A is enabled
11-68
Control Chart Execution Using Temporal Logic
At t = 12, time
elapsed in
state B totals
3 seconds
At t = 9, time
elapsed in
state A totals
5 seconds
Subsystem
is disabled Time elapsed
freezes when
state A is
disabled
When the input signal enables the subsystem at time t = 0, the state A becomes active,
or enabled. While the state is active, the time elapsed increases. However, when the
subsystem is disabled at t = 2, the chart goes to sleep and state A becomes inactive.
For 2 < t < 6, the time elapsed in an enabled state stays frozen at 2 seconds because
neither state is active. When the chart wakes up at t = 6, state A becomes active again
and time elapsed starts to increase. The transition from state A to state B depends on the
time elapsed while state A is enabled, not on the simulation time. Therefore, state A stays
active until t = 9, so that the time elapsed in that state totals 5 seconds.
When the transition from A to B occurs at t = 9, the output value y changes from 0 to 1.
11-69
11 Use Actions in Charts
This model behavior applies only to subsystems where you set the Enable block
parameter States when enabling to held. If you set the parameter to reset, the
chart reinitializes completely when the subsystem is reenabled. In other words, default
transitions execute and any temporal logic counters reset to 0.
Suppose you have a chart with a discrete sample time of 0.1 seconds:
11-70
Control Chart Execution Using Temporal Logic
State A becomes active at time t = 0, and the transition to state B occurs at t = 2.2
seconds. This behavior applies because the Simulink solver does not wake the chart at
exactly t = 2.15 seconds. Instead, the solver wakes the chart at integer multiples of 0.1
seconds, such as t = 2.1 and 2.2 seconds.
If you use the at operator with absolute-time temporal logic, an error message appears
when you try to simulate your model. Use the after operator instead.
Suppose that you want to define a time delay using the transition at(5.33, sec).
11-71
11 Use Actions in Charts
Use an Outer Self-Loop Transition with the after Operator to Replace the every Operator
If you use the every operator with absolute-time temporal logic, an error message
appears when you try to simulate your model. Use an outer self-loop transition with the
after operator instead.
Suppose that you want to print a status message for an active state every 2.5 seconds
during chart execution, as shown in the state action of Check_status.
Replace the state action with an outer self-loop transition, as shown below.
11-72
Control Chart Execution Using Temporal Logic
You must also add a history junction in the state so that the chart remembers the state
settings prior to each self-loop transition. (See Record State Activity Using History
Junctions on page 7-2.)
Use Charts with Discrete Sample Times for More Efficient Code Generation
The code generated for discrete charts that are not inside a triggered or enabled
subsystem uses integer counters to track time instead of Simulink provided time. This
allows for more efficient code generation in terms of overhead and memory, as well as
enabling this code for use in Software-in-the-Loop(SIL) and Processor-in-the-Loop(PIL)
simulation modes. For more information, see SIL and PIL Simulations (Embedded
Coder).
11-73
11 Use Actions in Charts
In this section...
Types of Data Value Changes That You Can Detect on page 11-74
Run a Model That Uses Change Detection on page 11-75
How Change Detection Works on page 11-76
Change Detection Operators on page 11-79
Chart with Change Detection on page 11-84
For each of these types of data, you can use operators that detect the following changes.
Change detection operators return 1 if the data value changes or 0 if there is no change.
See Change Detection Operators on page 11-79.
11-74
Detect Changes in Data Values
TetrisLogic contains a subchart called Moving that calls the operator hasChanged to
determine when users press any of the Tetris control keys, and then moves the shape
accordingly. Here is a look inside the subchart:
11-75
11 Use Actions in Charts
11-76
Detect Changes in Data Values
Note: Double-buffering occurs once per time step except if multiple input events occur
in the same time step. Then, double-buffering occurs once per input event (see Handle
Changes When Multiple Input Events Occur on page 11-79).
When you invoke change detection operations in an action, Stateflow software performs
the following operations:
1 Double-buffers data values after a Simulink event triggers the chart, but before the
chart begins execution.
2 Compares values in _prev and _start buffers. If the values match, the change
detection operator returns 0 (no change); otherwise, it returns 1 (change).
The following diagram places these tasks in the context of the chart life cycle:
11-77
11 Use Actions in Charts
event_n
event_2 ... KEY:
X prev
Value of data
Simulink at beginning of
event triggers last time step
Stateflow
chart X start
Value of data
Stateflow software at beginning of
double-buffers data current time step
No
Make
chart
active
Initialize chart
by executing
default
transition
paths
Chart
executes hasChanged (x)
active children compares
hierarchically X prev and X start
in top-down
order
Chart goes
to sleep
until next
11-78 event
Detect Changes in Data Values
The fact that buffering occurs before chart execution has implications for change
detection in the following scenarios:
Stateflow software attempts to filter out transient changes in local chart variables by
evaluating their values only at time boundaries (see How Change Detection Works
on page 11-76). This behavior means that the software evaluates the specified local
variable only once at the end of the execution step and, therefore, returns a consistent
result. That is, the return value remains constant even if the value of the local variable
fluctuates within a given time step.
For example, suppose that in the current time step a local variable temp changes from
its value at the previous time step, but then reverts to the original value. In this case, the
operator hasChanged(temp) returns 0 for the next time step, indicating that no change
occurred. For more information, see Change Detection Operators on page 11-79.
When multiple input events occur in the same time step, Stateflow software updates the
_prev and _start buffers once per event. In this way, a chart detects changes between
input events, even if the changes occur more than once in a given time step.
You can invoke change detection operators wherever you call built-in functions in a chart
in state actions, transition actions, condition actions, and conditions. There are three
change detection operators:
11-79
11 Use Actions in Charts
hasChanged Operator
The hasChanged operator detects any change in Stateflow data since the last time step,
using the following heuristic:
1 if xprev xstart
hasChanged( x) =
0 otherwise,
where xstart represents the value at the beginning of the current time step and xprev
represents the value at the beginning of the previous time step.
Syntax
hasChanged ( u )
Note: If you enable the chart option Initialize Outputs Every Time Chart Wakes
Up, do not use an output as the argument of the hasChanged operator. With this
option enabled, the hasChanged operator always returns 0 (or false), so there is no
reason to use change detection.
Stateflow data in a C chart that is bound to Simulink data store memory
11-80
Detect Changes in Data Values
All forms of hasChanged return zero if a chart writes to the data, but does not change its
value.
hasChangedFrom Operator
The hasChangedFrom operator detects when Stateflow data changes from a specified
value since the last time step, using the following heuristic:
where xstart represents the value at the beginning of the current time step and xprev
represents the value at the beginning of the previous time step.
Syntax
hasChangedFrom ( u , v )
hasChangedFrom ( m [ expr ], v )
hasChangedFrom ( s [ expr ], v )
Note: If you enable the chart option Initialize Outputs Every Time Chart Wakes
Up, do not use an output as the argument of the hasChanged operator. With this
option enabled, the hasChanged operator always returns 0 (or false), so there is no
reason to use change detection.
Stateflow data in a C chart that is bound to Simulink data store memory
11-81
11 Use Actions in Charts
Note: The first arguments u, m, and s cannot be expressions or custom code variables.
The second argument v can be an expression. However, if the first argument is a
matrix variable, then v must resolve to a scalar value or a matrix value with the same
dimensions as the first argument.
Description
hasChangedTo Operator
The hasChangedTo operator detects when Stateflow data changes to a specified value
since the last time step, using the following heuristic:
where xstart represents the value at the beginning of the current time step and xprev
represents the value at the beginning of the previous time step.
Syntax
hasChangedTo ( u , v )
hasChangedTo ( m [ expr ], v )
hasChangedTo ( s [ expr ], v )
11-82
Detect Changes in Data Values
Note: Charts that use MATLAB as the action language can only use scalar variables.
Note: If you enable the chart option Initialize Outputs Every Time Chart Wakes
Up, do not use an output as the argument of the hasChanged operator. With this
option enabled, the hasChanged operator always returns 0 (or false), so there is no
reason to use change detection.
Stateflow data in a C chart that is bound to Simulink data store memory
Note: The first arguments u, m, and s cannot be expressions or custom code variables.
The second argument v can be an expression. However, if the first argument is a matrix
variable, then v must resolve to either a scalar value or a matrix value with the same
dimensions as the first argument.
Description
11-83
11 Use Actions in Charts
The model uses a fixed-step solver with a step size of 1. The signal increments by 1 at
each time step. The chart analyzes the input signal for the following changes at each
time step:
To check the signal, the chart calls three change detection operators in a transition
action, and outputs the return values as y1, y2, and y3, as follows:
During simulation, the outputs y1, y2, and y3 are shown in this scope.
11-84
Detect Changes in Data Values
The ramp input signal u is represented in green, and the y1, y2, and y3 values are
represented as yellow, blue, and red respectively. y1 transitions at T1, and stays at a
value of 1 because u continues to increase each time step. y3 transitions at T3 when the
value of u has reached 3, but then transitions back to 0 at T4 when u increases from 3 to
4. y2 transitions to 1 at T4 when u changes from 3 to 4, and then transitions back to 0 at
T5 when u increases from 4 to 5.
11-85
11 Use Actions in Charts
The in Operator
Purpose
Syntax
in(S)
Description
The in operator is true and returns a value of 1 whenever state S is active; otherwise, it
returns a value of 0.
11-86
Check State Activity
Example
In this chart, using the in operator to check state activity synchronizes substates in the
parallel states Place and Tracker. For example, when the input position u becomes
positive, the state transition from Place.L to Place.R occurs. This transition makes
the condition [in(Place.R)] true, and the transition from Tracker.Moved_Left to
Tracker.Moved_Right occurs.
The in operator does not perform an exhaustive search for all states in a chart that
can match the argument. It performs a localized search and stops.
The in operator does not stop searching after it finds one match. It continues to
search until it reaches the chart level.
11-87
11 Use Actions in Charts
Display an
error
message.
11-88
Check State Activity
When you use the in operator to check state activity, these actions take place:
1 The search begins in the state where you use the in operator.
If you use the in operator in a state action, then that state is the starting point.
If you use the in operator in a transition label, then the parent of the source state
is the starting point.
2 The in operator searches at that level of the hierarchy for a path to a state that
matches the desired state. If the operator finds a match, it adds that state to the list
of possible matches.
3 The operator moves up to the next highest level of the hierarchy. At that level, the
operator searches for a path to a state that matches the desired state. If the operator
finds a match, it adds that state to the list of possible matches.
4 The in operator repeats the previous step until it reaches the chart level.
5 At the chart level, the operator searches for a path to a state that matches the
desired state. If the operator finds a match, it adds that state to the list of possible
matches. Then, the search ends.
6 After the search ends, one of the following occurs:
If a unique search result is found, the in operator checks if that state is active
and returns a value of 0 or 1.
If the operator finds no matches or multiple matches for the desired state, an
error message appears.
This example shows how the in operator works in a chart with identically named
substates.
11-89
11 Use Actions in Charts
For the transition condition of A.A2, the in operator performs these search actions:
The search ends, with the single state A.A1.Y found. The in operator checks if that state
is active and returns a value of 0 or 1.
11-90
Check State Activity
Localizing the scope of the in operator produces a unique search result. For example,
the in operator of A.A2 does not detect the state B.A1.Y, because the search algorithm
localizes the scope of the operator. Similarly, the in operator of B.A2 detects only the
state B.A1.Y and does not detect the state A.A1.Y.
Be specific when defining the path of the state whose activity you want to check. See the
examples that follow for details.
Example of No States Matching the Argument of the in Operator
In the state A.B, the during action invokes the in operator. Assume that you want to
check the activity of the state A.B.Other.C.D. The in operator performs these search
actions:
11-91
11 Use Actions in Charts
To eliminate the error, use a more specific path to check state activity: in(Other.C.D).
Example of the Wrong State Matching the Argument of the in Operator
In the state A.B, the during action invokes the in operator. Assume that you want to
check the activity of the state A.B.Other.Q.R. The in operator performs these search
actions:
The search ends, with the single state Q.R found. The in operator checks if that state is
active and returns a value of 0 or 1.
In this example, the in operator checks the status of the wrong state. To prevent this
error, use a more specific path to check state activity: in(Other.Q.R).
11-92
Check State Activity
In the state A.B, the during action invokes the in operator. Assume that you want
to check the activity of the state A.B.P.Q.R. The in operator performs these search
actions:
The search ends, and an error appears because multiple matches exist.
Adding an enclosure prevents the in operator of state A.B from detecting that outer
state.
11-93
11 Use Actions in Charts
11-94
Control Function-Call Subsystems Using Bind Actions
Bind actions can bind function-call output events to a state. When you create this type of
binding, the function-call subsystem that is called by the event is also bound to the state.
In this situation, the function-call subsystem is enabled when the state is entered and
disabled when the state is exited.
When you bind a function-call subsystem to a state, you can fine-tune the behavior of the
subsystem when it is enabled and disabled, as described in the following sections:
11-95
11 Use Actions in Charts
Although function-call subsystems do not execute while disabled, their output signals are
available to other blocks in the model. If a function-call subsystem is bound to a state,
you can hold its outputs at their values from the previous time step or reset the outputs
to their initial values when the subsystem is disabled. Follow these steps:
1 Double-click the outport block of the subsystem to open the Block Parameters dialog
box.
11-96
Control Function-Call Subsystems Using Bind Actions
11-97
11 Use Actions in Charts
Select: To:
held Maintain most recent output value
reset Reset output to its initial value
3 Click OK to record the settings.
Note: Setting Output when disabled is meaningful only when the function-call
subsystem is bound to a state, as described in Bind a Function-Call Subsystem to a
State on page 11-95.
If a function-call subsystem is bound to a state, you can hold the subsystem state
variables at their values from the previous time step or reset the state variables to their
initial conditions when the subsystem executes. In this way, the binding state gains full
control of state variables for the function-call subsystem. Follow these steps:
1 Double-click the trigger port of the subsystem to open the Block Parameters dialog
box.
11-98
Control Function-Call Subsystems Using Bind Actions
Select: To:
held Maintain most recent values of the states of the subsystem
that contains the trigger port
11-99
11 Use Actions in Charts
Select: To:
reset Revert to the initial conditions of the states of the subsystem
that contains this trigger port
inherit Inherit this setting from the function-call initiator's parent
subsystem. If the parent of the initiator is the model root, the
inherited setting is held. If the trigger has multiple initiators,
the parents of all initiators must have the same setting: either
all held or all reset.
3 Click OK to record the settings.
Note: Setting States when enabling is meaningful only when the function-call
subsystem is bound to a state, as described in Bind a Function-Call Subsystem to a
State on page 11-95.
This model specifies a fixed-step solver with a fixed-step size of 1 in the Solver pane of
the Model Configuration Parameters dialog box.
The chart contains two states, A and B, and connecting transitions, along with some
actions:
11-100
Control Function-Call Subsystems Using Bind Actions
Event E binds to state A with the action bind:E. Event E is defined for the chart with a
scope of Output to Simulink and a trigger type of function-call.
The function-call subsystem contains a trigger port block, an input port, an output port,
and a simple block diagram. The block diagram increments a counter by 1 at each time
step, using a Unit Delay block:
The Block Parameters dialog box for the trigger port appears as follows.
11-101
11 Use Actions in Charts
The States when enabling parameter uses the setting reset. This setting resets the
state values for the function-call subsystem to zero when it is enabled.
The Sample time type parameter uses the setting triggered. This setting sets the
function-call subsystem to execute only when it is triggered by a calling event while it is
enabled.
11-102
Control Function-Call Subsystems Using Bind Actions
Setting Sample time type to periodic enables the Sample time field below it, which
defaults to 1. These settings force the function-call subsystem to execute for each time
step specified in the Sample time field while it is enabled. To accomplish this, the state
that binds the calling event for the function-call subsystem must send an event for the
time step coinciding with the specified sampling rate in the Sample time field. States
can send events with entry or during actions at the simulation sample rate.
For fixed-step sampling, the Sample time value must be an integer multiple of the
fixed-step size.
For variable-step sampling, the Sample time value has no limitations.
11-103
11 Use Actions in Charts
State A also executes its entry action, en:E, which sends an event E to trigger
the function-call subsystem and execute its block diagram. The block diagram
increments a count by 1 each time using a Unit Delay block. Because the previous
11-104
Control Function-Call Subsystems Using Bind Actions
content of the Unit Delay block is 0 after the reset, the initial output is 0 and the
current value of 1 is held for the next call to the subsystem.
3 The next update event from the model tests state A for an outgoing transition.
11-105
11 Use Actions in Charts
The subsystem also adds 1 to the held value to produce the value 2, which the Unit
Delay block holds for the next triggered execution.
4 The next eight update events increment the subsystem output by 1 at each time step.
11-106
Control Function-Call Subsystems Using Bind Actions
5 On the 11th update event, the transition to state B occurs and state B becomes active.
11-107
11 Use Actions in Charts
6 When the next sampling event occurs, the transition from state B to state A occurs.
Again, the binding action, bind: E, enables the function-call subsystem and resets
its output to 0.
11-108
Control Function-Call Subsystems Using Bind Actions
11-109
11 Use Actions in Charts
11-110
Control Function-Call Subsystems Using Bind Actions
This control does not work when you allow other events to trigger the function-call
subsystem through a mux. For example, the following model defines two function-call
events to trigger a function-call subsystem using a Mux block:
In the chart, E1 binds to state A, but E2 does not. State B sends the triggering event E2 in
its entry action:
When you simulate this model, you get the following output:
11-111
11 Use Actions in Charts
Note: Binding is not recommended when you provide multiple trigger events to a
function-call subsystem through a mux. Muxed trigger events can interfere with event
binding and cause undefined behavior.
11-112
Simplify Stateflow Chart Using the duration Operator
When modeling the gear changes of this system, it is important to control the oscillation
that occur. The original sf_car model uses parallel state debouncer logic that controls
which gear state is active. For more information about how debouncers work in
Stateflow, see Debounce Signals on page 24-2.
You can simplify the debouncer logic with the duration operator. You can see this
simplification in the model sf_car_using_duration. The duration operator
evaluates a condition expression and outputs the length of time that the expression
has been true. When that length of time crosses a known time threshold, the state
transitions to a higher or lower gear.
By removing the parallel state logic and using the duration operator, you can control
oscillations with simpler Stateflow logic.
The Stateflow chart shift_logic controls which gear the car is in, given the speed
of the car and how much throttle is being applied. Within shift_logic there are
two parallel states: gear_state and selection_state. gear_state contains
four exclusive states for each gear. selection_state determines whether the car is
downshifting, upshifting, or remaining in its current gear.
11-113
11 Use Actions in Charts
In this Stateflow chart, for the car to move from first gear to second gear, the event
UP must be sent from selection_state to gear_state. The event is sent when the
speed crosses the threshold and remains higher than the threshold for the length of time
determined by TWAIT. When the event UP is sent, gear_state transitions from first to
second.
Within Gear_Logic there are four exclusive states for each gear. The local variables up
and down guard the transitions between each state.
11-114
Simplify Stateflow Chart Using the duration Operator
In this Stateflow chart, for the car to move from first gear to second gear, the condition
up must be true. The condition up is defined as true if the length of time that the
speed is greater than or equal to the threshold is greater than the length of time that
is specified by TWAIT. The condition down is defined as true if the length of time that
the speed is less than or equal to the threshold is greater than the length of time that is
specified by TWAIT. The operator duration keeps track of the length of time that the
speed has been above or below the threshold. When the up condition is met, the active
state transitions from first to second.
By replacing the parallel state debouncer logic with the duration operator, you can
create a simpler Stateflow chart to model the gear shifting.
Related Examples
Debounce Signals on page 24-2
Control Chart Execution Using Temporal Logic on page 11-56
11-115
12
Charts can also use C as the action language syntax. These charts have a C icon in the
lower-left corner.
You can change the action language of a chart in the Action Language box of the Chart
properties dialog box.
For more information, see Differences Between MATLAB and C as Action Language
Syntax on page 12-7.
12-2
Modify the Action Language for a Chart
Zero-based indexing
Binary and bit-wise operations
C style comments
Explicit casting for constant assignments
If the chart contains C constructs that cannot be converted to MATLAB, Stateflow shows
a message in a dialog box. Click on the warnings link to display the warnings in the
Diagnostic Viewer. Choose whether or not to continue with the conversion of supported
syntax. C constructs not converted to MATLAB include:
Using the same name for data at different levels of the chart hierarchy causes a compile-
time error.
Using the same name for functions at different levels of the chart hierarchy causes a
compile-time error.
12-3
12 MATLAB Syntax Support for States and Transitions
Use % to specify comments in states and transitions for consistency with MATLAB. For
example, the following comment is valid:
% This is a valid comment in the style of MATLAB
Do not use control flow logic in condition actions and transition actions
If you try to use control flow logic in condition actions or transition actions, you get an
error. Use of an if, switch, for, or while statement does not work.
12-4
Modify the Action Language for a Chart
The keywords global and persistent are not supported in state actions.
To generate code from your model, use MATLAB language features supported for code
generation
When using MATLAB as the action language, data read without an initial value causes
an error.
12-5
12 MATLAB Syntax Support for States and Transitions
Increment and decrement operations, such as a++ and a--. For example, a++ is
changed to a=a+1.
Assignment operations, such as a+=expr, a=expr, a*=expr, and a/=expr. For
example, a+=b is changed to a=a+b.
Evaluation operations, such as a!=expr and !a. For example, a!=b is changed to
a~=b.
Inserts explicit casts for any literal constant assignment. For example, if y is
defined as type single, then y=1 is changed to y=single(1).
Adds the type entry: to state actions that do not have a specified type.
12-6
Differences Between MATLAB and C as Action Language Syntax
Assignment operator :=
Context-sensitive
constants, such as 3C
Use of custom code Not supported Supported
variables in states and
transitions
12-7
12 MATLAB Syntax Support for States and Transitions
12-8
Differences Between MATLAB and C as Action Language Syntax
12-9
12 MATLAB Syntax Support for States and Transitions
This tutorial uses the first approach that is, start by identifying the operating modes of
the system to program the chart.
Design Requirements
This example shows how to build a Stateflow chart using MATLAB as the action
language. The model represents a machine on an assembly line that feeds raw material
to other parts of the line. This feeder behaves as follows:
At system initialization, check that the three sensor values are normal.
12-10
Model Event-Driven System
A positive value means the sensor is working correctly. A zero means that the sensor
is not working.
If all sensor values are normal, transition from "system initialization" to "on".
If the feeder does not leave initialization mode after 5 seconds, force the feeder into
the failure state.
After the system turns on, it starts counting the number of parts fed.
At each time step, if any sensor reading is 2 or greater, the part has moved to the next
station.
If the alarm signal sounds, force the system into the failure state.
An alarm signal can occur when an operator opens one of the safety doors on the
feeder or a downstream problem occurs on the assembly line, which causes all
upstream feeders to stop.
If the all-clear signal sounds, resume normal operation and reset the number of parts
fed to zero.
The feeder LED changes color to match the system operating mode orange for
"system initialization", green for "on", and red for "failure state".
Attribute Characteristic
Operating modes System initialization, to perform system checks before
turning on the machine
On, for normal operation
System failure, for a recoverable machine failure flagged
by an alarm
Transitions System initialization to On
System initialization to Failure state
On to Failure state
Failure state to System initialization
Parallel Modes No operating modes run in parallel. Only one mode can be
active at any time.
12-11
12 MATLAB Syntax Support for States and Transitions
Attribute Characteristic
Default Mode System initialization
Inputs Three sensor readings to detect if a part has moved to a
downstream assembly station
An alarm signal that can take one of two values: 1 for on
and 0 for off
Outputs Number of parts that have been detected as fed to a
downstream assembly station
Color of the LED on the feeder
Follow the exercises below to implement the model yourself. Otherwise, to open the
supplied model, at the MATLAB command prompt enter:
addpath(fullfile(docroot,'toolbox','stateflow','examples'))
ex_feeder
addpath(fullfile(docroot,'toolbox','stateflow','examples'))
ex_feeder_exercise
2 Save the model in your working folder.
12-12
Model Event-Driven System
3 Double-click the SensorSignals block to see the three sensor signals represented
by pulse generator blocks.
The sensors signal indicates when the assembly part is ready to move to the next
station.
4 Double-click the AlarmSignal block to see the step blocks that represent the alarm
signal.
12-13
12 MATLAB Syntax Support for States and Transitions
The upper axis shows the sensor signals. Only two sensor signals appear because two
of the sensors have the same signal. The lower axis shows the alarm signal which
turns the feeder off between the simulation time of 45 to 80 seconds.
12-14
Model Event-Driven System
6 Open the Stateflow Library by executing sflib at the MATLAB command prompt.
7 Select Chart and drag it into your model.
Tip: To create a new model with an empty Stateflow chart which uses MATLAB as
the action language, use the command,sfnew.
8 Delete the connections from the SensorSignals subsystem to the scope and from the
AlarmSignal subsystem to the scope.
9 Rename the label Chart located under the Stateflow chart to Feeder. The model
should now look like this:
System initialization
On
Failure state
Note: The MATLAB icon in the lower left corner of the chart indicates that you are
using a Stateflow chart with MATLAB syntax.
12-15
12 MATLAB Syntax Support for States and Transitions
2 Click the State Tool icon to bring a state into the chart.
3 Click the upper left corner of the state and type the name, InitializeSystem.
4 Repeat steps 2 and 3 to add two more states named On and FailState.
States perform actions at different phases of their execution cycle from the time they
become active to the time they become inactive. Three basic state actions are:
For example, you can use entry actions to initialize data, during actions to update
data, and exit actions to configure data for the next transition. For more information
about other types of state actions, see Syntax for States and Transitions.)
1 Press return after the InitializeSystem state name and add this text to define
the state entry action:
entry:
12-16
Model Event-Driven System
Light = ORANGE;
An orange LED indicates entry into the InitializeSystem state.
entry:
Light = RED;
entry:
Light = GREEN;
partsFed = 0;
A green LED indicates entry in the On state. The number of parts fed is initialized to
0 each time we enter the On state
4 Add the following code to the On state after the entry action to check if there is a
strong sensor signal and increment the parts fed to the next station:
during:
if(any(sensors >= 2))
partsFed = partsFed + 1;
end
The On state checks the sensor signal to determine if a part is ready to be fed to the
next assembly station. If the sensor signal is strong (the number of sensors that are
on is greater than or equal to 2), then the chart counts the part as having moved on
to the next station.
Based on the description of feeder behavior, specify the rules for transitions between
states:
12-18
Model Event-Driven System
a Move the mouse over the lower edge of the InitializeSystem state until the
pointer shape changes to crosshairs.
b Click and drag the mouse to the upper edge of the On state. You then see a
transition from the InitializeSystem state to the On state.
c Double-click the transition to add this condition:
[all(sensors>0)]
This transition condition verifies if all of the sensors have values greater than zero.
3 Repeat these steps to create these remaining transition conditions.
Transition Condition
On to FailState [Alarm == 1]
FailState to InitializeSystem [Alarm == 0]
4 Draw another transition from InitializeSystem to FailState. On this
transition, type the following to create the transition event:
after(5,sec)
If the sensors have not turned on after 5 seconds, this syntax specifies a transition
from InitializeSystem to FailState.
Note: The syntax on this transition is an event rather than a transition condition.
For details, refer toControl Chart Execution Using Temporal Logic on page 11-56.
12-19
12 MATLAB Syntax Support for States and Transitions
Note: The outgoing transitions from InitializeSystem have a small label 1 and 2 to
indicate the order in which transition segments are evaluated. If the numbers from the
figure do not match your model, right click the transition and then change it by clicking
on Execution Order. See Evaluation Order for Outgoing Transitions on page 3-60 for
details.
12-20
Model Event-Driven System
Start the simulation of your model. Errors about unresolved symbols appear, along with
the Symbol Wizard.
The Symbol Wizard does not automatically add any data to your chart. It identifies the
unresolved data and infers the class and scope of that data using the inference rules of
MATLAB expressions in Stateflow actions. In the chart:
Data that is read from but not written to is inferred as input data. However, if the
name of the data is in all uppercase letters, the Symbol Wizard infers the data as a
parameter
Data that is written to but not read from is inferred as output data.
12-21
12 MATLAB Syntax Support for States and Transitions
The Symbol Wizard infers the scope of the input data in your chart. However, you must
fix the data scope for the partsFed Output. Follow these steps:
1 For the partsFed data: in the Data Scope column, select Output from the list
2 To add the data that the Symbol Wizard suggests, click OK.
3 Add initial values for the parameters. At the MATLAB command prompt, enter:
RED = 0;
4 Similarly, at the MATLAB command prompt, add the following initial values for the
remaining parameters:
12-22
Model Event-Driven System
Parameter Value
RED 0
ORANGE 1
GREEN 2
5 Return to the model and connect the inputs and outputs to their respective ports.
Double-click the Scope block to verify that the model captures the expected feeder
behavior.
12-23
12 MATLAB Syntax Support for States and Transitions
The upper axis shows the LED signal which varies between orange (1), green (2), and red
(0) to indicate the current operating mode. The lower axis shows the number of parts fed
to the next assembly station, which increases incrementally until the alarm signal turns
the machine off and then resets.
12-24
Model Event-Driven System
In the previous example, when you use input data to represent an event, the chart wakes
up periodically and verifies whether the conditions on transitions are valid. In this case,
if ALARM == 1, then the transition to the failure state happens at the next time step.
However, creating a Stateflow chart which reacts to input events allows you to react to
the alarm signal when the event is triggered.
For details on when to use an event-based chart, see How Events Work in Stateflow
Charts on page 9-2.
In the event-based approach, the system attributes to consider first are the events,
inputs, and outputs.
In the following table, consider the characteristics of the event-driven Feeder Model that
are different from the system based on transition conditions.
Attributes Characteristics
Events Two asynchronous events: an alarm signal and an all-clear
signal
Inputs Three sensor readings to detect if a part has moved to a
downstream assembly station
addpath(fullfile(docroot,'toolbox','stateflow','examples'))
ex_feeder_triggered
12-25
12 MATLAB Syntax Support for States and Transitions
The chart now has only one input port on the left and an event triggered input on the
top. For more information on how to create a Stateflow chart activated by events, see
Activate a Stateflow Chart Using Input Events on page 9-9
When the ALARM signal triggers the chart, the chart responds to the trigger in that
time step. If the current state is On when the alarm is triggered, then the current state
transitions to FailState.
12-26
Model Event-Driven System
The scope output for the Event-triggered chart is in the following figure.
12-27
12 MATLAB Syntax Support for States and Transitions
The upper axis shows the LED signal which varies between red (0), orange (1), and green
(2) to indicate the current operating mode. The lower axis shows the number of parts fed
to the next assembly station, which increases incrementally until the alarm signal turns
the machine off and then resets. However, the event-based simulation feeds more parts
to the next assembly station due to clock and solver differences.
12-28
13
Ease of modeling train-like state machines, where the modal logic involves transitions
from one state to its neighbor
Concise, compact format for a state machine
Reduced maintenance of graphical objects
When you add or remove states from a chart, you have to rearrange states,
transitions, and junctions. When you add or remove states from a state transition
table, you do not have to rearrange any graphical objects.
State transition tables support MATLAB action language. For more information about
this action language, see Rules for Using MATLAB as the Action Language on page
12-3.
The following state transition table contains the modal logic for maintaining the
temperature of a boiler between two set points:
13-2
What Is a State Transition Table?
If you create a Stateflow chart to represent the same modal logic, the chart looks
something like this:
13-3
13 Tabular Expression of Modal Logic
13-4
Differences Between State Transition Tables and Charts
Supertransitions
Parallel (AND) decomposition
Local events
Flow charts
Use of chart-level functions (graphical, truth table, MATLAB, and Simulink)
13-5
13 Tabular Expression of Modal Logic
Condition
Condition action
13-6
Anatomy of a State Transition Table
Destination state
13-7
13 Tabular Expression of Modal Logic
In this section...
How to Create a New State Transition Table on page 13-8
Properties for State Transition Tables on page 13-8
sfnew('-STT')
13-8
Create State Transition Table and Specify Properties
These properties are the same as for MATLAB charts. For a description of each property,
see Specify Chart Properties on page 22-3.
13-9
13 Tabular Expression of Modal Logic
13-10
View State Reactions with State Transition Matrix
In this section...
What is a State Transition Matrix? on page 13-11
Create a State Transition Matrix on page 13-11
Filter by State Name on page 13-12
Traceability To State Transition Table on page 13-13
Each row represents a state in the state transition table. Each column represents a
condition or event. Scan across the cells in a state row to see the reaction of that state to
each event or condition. Scan down the cells of a column to see how all states respond to
that event or condition.
addpath (fullfile(docroot,'toolbox','stateflow','examples'))
ex_stt_boiler
2 Select Chart > View State Transition Matrix.
13-11
13 Tabular Expression of Modal Logic
The order of the state rows is the same as the state transition table. The order of the
columns is based on the number of states that respond to the condition or event. The
leftmost column is the condition or event that impacts the highest number of state cells.
The rightmost column is the condition or event that impacts the fewest number of states.
The execution order appears in the upper-right corner of each transition cell. The
execution order is red if it is out of order relative to the event columns. For example, in
the state Warmup, the doneWarmup condition is tested before after(10, sec). Because
the after(10, sec) column is before the doneWarmup column, the execution order for
each corresponding cell is shown in red.
If you change the state transition table, you must regenerate the state transition matrix.
13-12
View State Reactions with State Transition Matrix
If you have too many events and conditions to view at once, you can scroll through the
window horizontally. When you scroll to the right, you continue to see the state names as
an overlay on each row.
For more information about traceability and generated C/C++ code, see Trace Code
to Model Objects by Using Hyperlinks (Embedded Coder) and Trace Model Objects
to Generated Code (Embedded Coder). For more information about traceability and
generated HDL code, see Traceability Report (HDL Coder).
Related Examples
Create State Transition Table and Specify Properties on page 13-8
Model Bang-Bang Controller with State Transition Table on page 13-21
More About
What Is a State Transition Table? on page 13-2
13-13
13 Tabular Expression of Modal Logic
The highlighting persists across MATLAB sessions and appears in the autogenerated
state transition diagram as well as the state transition table.
1 In the transition table editor, right-click the transition cell and select Mark as
primary transition.
For example:
13-14
Highlight Flow of Logic
3 To view the flow in the autogenerated state diagram, select Chart > View auto-
generated diagram.
The transitions that represent the flow appear highlighted in the diagram.
13-15
13 Tabular Expression of Modal Logic
Option Description
State Row Inserts a state at the same level of
hierarchy.
Child State Row Inserts a state as a child of the selected
state.
Default Transition Path Row Inserts a row for specifying conditional
default transition paths.
Inner Transition Path Row Inserts a row for specifying inner
transitions from the selected parent state
to its child states.
To insert a column:
1 Select Chart > Append Transition Column. A new else-if column appears to
the right of the last column.
13-16
State Transition Table Operations
To move a transition cell, click anywhere in the cell and drag the condition, action, and
destination cells as a unit to a new location. The transition cell you displace moves one
cell to the right, creating a new column if one doesnt exist. The state transition table
prevents you from moving cells to an invalid destination and alerts you to the problem.
1 Right-click the state in the row you want to copy and select Copy.
2 Right-click the state in the destination row and select Paste.
The new content overwrites the existing content at the destination. The state
transition table prevents you from copying content to an invalid destination.
13-17
13 Tabular Expression of Modal Logic
To undo the effects of the previous operation, select Edit+Redo or press Ctrl+Y
(Command+Y).
Zoom
To zoom in and out of your State Transition Table, select View > Zoom. You can add
new rows to your State Transition Table at the zoom level that is consistent with your
chart. When you save your model, the zoom level is saved.
13-18
Rules for Using State Transition Tables
For more information, see Differences Between MATLAB and C as Action Language
Syntax on page 12-7.
If you specify an action in a transition cell, it must be a condition action.
State transition tables must have at least one state row and one transition column.
13-19
13 Tabular Expression of Modal Logic
The diagnostics tool statically parses the table to find errors such as:
Each error is reported with a hyperlink to the corresponding object causing the error.
These checks are also performed during simulation.
See for an example on using the diagnostics tool for state transition tables.
13-20
Model Bang-Bang Controller with State Transition Table
In this section...
Why Use State Transition Tables? on page 13-21
Design Requirements on page 13-22
Identify System Attributes on page 13-22
Build the Controller or Use the Supplied Model on page 13-23
Create a New State Transition Table on page 13-23
Add States and Hierarchy on page 13-25
Specify State Actions on page 13-26
Specify Transition Conditions and Actions on page 13-29
Define Data on page 13-31
Connect the Transition Table and Run the Model on page 13-33
View the Graphical Representation on page 13-35
Ease of modeling train-like state machines, where the modal logic involves transitions
from one state to its neighbor
Concise, compact format for a state machine
Reduced maintenance of graphical objects
When you add or remove states from a chart, you have to rearrange states,
transitions, and junctions. When you add or remove states from a state transition
table, you do not have to rearrange any graphical objects.
13-21
13 Tabular Expression of Modal Logic
Design Requirements
This example shows how to model a bang-bang controller for temperature regulation of
a boiler, using a state transition table. The controller must turn the boiler on and off to
meet the following design requirements:
Operating Modes
Data Requirements
13-22
Model Bang-Bang Controller with State Transition Table
addpath (fullfile(docroot,'toolbox','stateflow','examples'))
ex_stt_boiler
1 Open the partially built boiler plant model by entering these commands:
addpath (fullfile(docroot,'toolbox','stateflow','examples'))
ex_stt_boiler_exercise
This model contains all required Simulink blocks, except for the bang-bang
controller.
13-23
13 Tabular Expression of Modal Logic
2 Delete the five output ports and the single input port.
3 Open the Library Browser by selecting View > Library Browser.
4 In the left pane of the Library Browser, select the Stateflow library, then drag a
State Transition Table block from the right pane into your boiler model.
Now you are ready to add states and hierarchy to the state transition table.
13-24
Model Bang-Bang Controller with State Transition Table
a Right-click the Normal state, select Insert Row > Child State Row, and name
the new state Off.
b Repeat step a two more times to create the child states Warmup and On, in that
order.
By default, when there is ambiguity, the top exclusive (OR) state at every level of
hierarchy becomes active first. For this reason, the Normal and Off states appear
with default transitions. This configuration meets the design requirements for this
model.
13-25
13 Tabular Expression of Modal Logic
13-26
Model Bang-Bang Controller with State Transition Table
alarm states, using the variables boiler_cmd and doneWarmup (described in Data
Requirements on page 13-22).
1 In the following states, click after the state name, press Enter, and type the
specified entry actions.
13-27
13 Tabular Expression of Modal Logic
Now you are ready to specify the conditions and actions for transitioning from one state
to another state.
13-28
Model Bang-Bang Controller with State Transition Table
if
[ALARM]
Alarm
During simulation:
if
[temp <=
reference_low]
Warmup
During simulation, when the current temperature of the boiler drops below 23
degrees Celsius, the boiler starts to warm up.
3 In the Warmup state row, enter:
if else-if
[doneWarmup] [after(10, sec)]
{doneWarmup =
true;}
13-29
13 Tabular Expression of Modal Logic
if else-if
On On
During simulation, the boiler warms up for 10 seconds and then transitions to the On
state.
4 In the On state row, enter:
if
[temp >=
reference_high]
Off
During simulation, when the current temperature of the boiler rises above 25
degrees Celsius, the boiler shuts off.
5 In the Alarm state row, enter:
if
[CLEAR]
Normal
During simulation, when the all-clear condition is true, the boiler returns to normal
mode.
6 Save the state transition table.
13-30
Model Bang-Bang Controller with State Transition Table
Now you are ready to add data definitions using the Symbol Wizard.
Define Data
State transition tables use MATLAB syntax and honor the language requirements for
C/C++ code generation. One of these requirements is that you define the size, type,
and complexity of all MATLAB variables so that their properties can be determined at
compile time. Even though you have not yet explicitly defined the data in your state
13-31
13 Tabular Expression of Modal Logic
transition table, you can use the Symbol Wizard. During simulation, the Symbol Wizard
alerts you to unresolved symbols, infers their properties, and adds the missing data to
your table.
The Diagnostic Viewer indicates that you have unresolved symbols in the state
transition table.
The Symbol Wizard attempts to resolve the missing data. The wizard correctly
infers the scope of all data except for the inputs ALARM and CLEAR.
2 In the Symbol Wizard, correct the scopes of ALARM and CLEAR by selecting Input
from their Scope drop-down lists.
13-32
Model Bang-Bang Controller with State Transition Table
3 When the Model Explorer opens, verify that the Symbol Wizard added all required
data definitions correctly.
Assign: To Port:
reference_low2
1
reference_high
temp 5
ALARM 3
CLEAR 4
5 Save the state transition table.
6 Close the Diagnostic Viewer and the Model Explorer.
In the Simulink model, the inputs and outputs that you just defined appear in the State
Transition Table block. Now you are ready to connect these inputs and outputs to the
Simulink signals and run the model.
13-33
13 Tabular Expression of Modal Logic
As the simulation runs, you can watch the animation in the state transition table
activate different states.
13-34
Model Bang-Bang Controller with State Transition Table
If you need to perform interactive debugging, you can set breakpoints on different states
and view the data values at different points in the simulation. For more information
about debugging, see Basic Approach to Debugging Charts on page 29-2.
1 In the state transition table, select Chart > View auto-generated diagram.
13-35
13 Tabular Expression of Modal Logic
13-36
Debug Run-Time Errors in a State Transition Table
13-37
13 Tabular Expression of Modal Logic
The table has two states at the highest level in the hierarchy, Power_off and
Power_on. By default, Power_off is active. The event SWITCH toggles the system
between the Power_off and Power_on states. Power_on has three substates:
First, Second, and Third. By default, when Power_on becomes active, First
also becomes active. When Shift equals 1, the system transitions from First to
13-38
Debug Run-Time Errors in a State Transition Table
Second, Second to Third, and Third to First, for each occurrence of the event
SWITCH. Then the pattern repeats.
3 Add two inputs on page 8-2 from Simulink:
An event called SWITCH with a scope of Input from Simulink and a Rising
edge trigger.
A data called Shift with a scope of Input from Simulink.
4 In the model view, connect a Sine Wave block as the SWITCH event and a Step block
as the Shift data for your State Transition Table.
In the model, there is an event input and a data input. A Sine Wave block generates
a repeating input event that corresponds with the Stateflow event SWITCH. The Step
block generates a repeating pattern of 1 and 0 that corresponds with the Stateflow
data object Shift. Ideally, the SWITCH event occurs at a frequency that allows at
least one cycle through First, Second, and Third.
1 Right-click the Power_off state, and select Set Breakpoint > On State Entry.
2 Start the simulation.
13-39
13 Tabular Expression of Modal Logic
3
Move to the next step by clicking the Step In button, .
4 Hover your cursor over the different table cells to see the data used and the current
values.
Continue clicking the Step In button and watching the animating states. After each
step, watch the chart animation to see the sequence of execution. Use the tooltips to
see the data values.
Single-stepping shows that the loop from First to Second to Third inside the state
Power_on does not occur. The transition from Power_on to Power_off takes priority.
13-40
Debug Run-Time Errors in a State Transition Table
Now the transition from Power_on to Power_off does not occur until 20 seconds
have passed.
3 Begin simulation.
4 Click the Step In button repeatedly to observe the fixed behavior.
13-41
13 Tabular Expression of Modal Logic
Related Examples
Debug Run-Time Errors in a Chart on page 29-21
Debug a Truth Table on page 25-44
13-42
14
Ease of team development for people working on different parts of the same chart
Faster simulation after making small changes to a chart with many states or levels of
hierarchy
Manual inspection of generated code for a specific state or subchart in a chart
Ability to animate and debug multiple charts side by side
States, subcharts, and atomic subcharts have these key similarities and differences:
Atomic subcharts and atomic subsystems (see Atomic Subsystem in the Simulink
documentation) have these key similarities and differences:
14-2
What Is an Atomic Subchart?
The following examples show how to use atomic subcharts for modeling typical
applications:
Example Application
sf_atomic_sensor_pair A redundant sensor pair
sf_elevator An elevator system with two identical lifts
14-3
14 Make States Reusable with Atomic Subcharts
14-4
Benefits of Using Atomic Subcharts
In this chart, the only differences between the two states are the names of variables.
You create a single state and convert it to an atomic subchart, which you store in a new
library. From that library, you can copy and paste the atomic subchart for use in any
chart. Then update the mapping of inputs, outputs, local data, or parameters as needed.
14-5
14 Make States Reusable with Atomic Subcharts
This modeling method minimizes maintenance of similar states. When you modify the
atomic subchart in the library, your changes propagate automatically to the links in all
charts and models.
For more information, see Reuse a State Multiple Times in a Chart on page 14-39.
You make a small change to one part of a chart that contains many states or several
levels of hierarchy. When you start simulation to test that change, recompilation occurs
for the entire chart.
Because recompiling the entire chart takes a long time, you make several changes before
testing. However, if you find an error, you must step through all your changes to identify
what causes the error.
You make a small change to an atomic subchart in a chart that contains many states or
several levels of hierarchy. When you start simulation to test that change, recompilation
occurs only for the atomic subchart.
Incremental builds for simulation decrease the time required to recompile the chart. This
reduction enables you to test each change, one by one, instead of waiting to test multiple
changes. By testing each change individually, you can quickly identify a change that
causes an error.
14-6
Benefits of Using Atomic Subcharts
For more information, see Reduce the Compilation Time of a Chart on page 14-48.
You edit one part of a chart, while someone else edits another part of the same chart. At
submission time, you merge your changes.
You store one part of a chart as an atomic subchart in a library. You edit that subchart
separately, while someone else edits the main chart. At submission time, no merge is
necessary because the changes exist in separate models.
For more information, see Divide a Chart into Separate Units on page 14-50.
You generate code for the entire model in one file and look through that entire file to find
code for a specific part of the chart.
14-7
14 Make States Reusable with Atomic Subcharts
You specify code generation parameters so that code for an atomic subchart appears in
a separate file. This method of code generation enables unit testing for a specific part of
a chart. You can avoid searching through unrelated code and focus only on the part that
interests you.
14-8
Benefits of Using Atomic Subcharts
Note: Unreachable Stateflow states are optimized out and are not included in the
generated code.
14-9
14 Make States Reusable with Atomic Subcharts
For more information, see Generate Reusable Code for Unit Testing on page 14-53.
14-10
Restrictions for Converting to Atomic Subcharts
Chart-level data
Chart-level graphical functions
Input events
If the state or subchart accesses a chart-level graphical function, the chart must export
that function. For more information, see Export Stateflow Functions for Reuse on page
7-34.
Do not export graphical functions from an atomic subchart that maps variables to
variables at the main chart level with a different scope.
14-11
14 Make States Reusable with Atomic Subcharts
Local events that are outside the scope of that state or subchart
Output events
However, the state or subchart you want to convert can refer to input events.
Imported or exported
Is 2-D or higher, or uses a fixed-point type
Machine-parented data with these properties prevent reuse of generated code and other
code optimizations.
Use of Supertransitions
The state or subchart that you want to convert to an atomic subchart cannot have any
supertransitions crossing the boundary.
14-12
Convert to and from Atomic Subcharts
In this section...
Convert a State or Subchart to an Atomic Subchart on page 14-13
Convert an Atomic Subchart to a State or Subchart on page 14-16
Restrictions for Converting an Atomic Subchart to a State or Subchart on page
14-16
After you convert a state or subchart to an atomic subchart, local data appears as data
store memory in the atomic subchart.
An atomic subchart looks opaque like a regular subchart but includes the label (Atomic)
in the upper-left corner. If you use a linked atomic subchart from a library, the label
(Link) appears in the upper-left corner.
For example, the following model contains a chart, Air Controller, that uses an atomic
subchart:
14-13
14 Make States Reusable with Atomic Subcharts
In the Air Controller chart, PowerOn is an atomic subchart, but PowerOff is a regular
subchart:
14-14
Convert to and from Atomic Subcharts
14-15
14 Make States Reusable with Atomic Subcharts
1 Right-click the atomic subchart and select Library Link > Disable Link.
2 Follow the steps in When an Atomic Subchart Is Not a Library Link on page
14-16.
Your atomic subchart uses a MATLAB function and does not map a variable to a
variable of the same name in the chart.
A parameter in the atomic subchart maps to something other than a single variable.
For example, the following mappings for a parameter named data1 prevent
conversion of an atomic subchart to a state or subchart:
14-16
Convert to and from Atomic Subcharts
data2 + 3
data2.3
data2(3)
3
For more information, see Map Variables for Atomic Subcharts on page 14-18.
14-17
14 Make States Reusable with Atomic Subcharts
You can map a variable in the atomic subchart to a variable in the main chart with the
same or different scope. These mappings are supported.
You can map a variable in an atomic subchart to an element of a bus in the main chart.
When you map a data store memory in an atomic subchart to a chart-level local data of
enumerated type, you have two options for specifying the initial value of the data store
memory:
Set the Initial value field for the chart-level local data in the Data properties dialog
box.
Leave the Initial value field empty so that the default value of the enumerated type
applies.
14-18
Map Variables for Atomic Subcharts
Your chart contains two linked atomic subcharts from the same library.
14-19
14 Make States Reusable with Atomic Subcharts
Because atomic subchart B uses u1 and y1 instead of u2 and y2, you must edit the
mapping:
14-20
Map Variables for Atomic Subcharts
14-21
14 Make States Reusable with Atomic Subcharts
3 Under Input Mapping, specify the main chart symbol for u1 to be u2.
4 Under Output Mapping, specify the main chart symbol for y1 to be y2.
5 Click OK.
When you run the model again, you get the following results.
14-22
Map Variables for Atomic Subcharts
If you simulate the model, you get an error because the data store memory, dsm, does not
map to any variable in the main chart. To fix the mapping for dsm:
14-23
14 Make States Reusable with Atomic Subcharts
14-24
Map Variables for Atomic Subcharts
3 Under Data Store Memory Mapping, specify the main chart symbol for dsm to be
local_for_atomic_subchart. You can specify either data store memory or chart-
level local data from the main chart. For chart-level local data, the First index
property must be zero.
4 Click OK.
When you run the model now, you get the following results.
14-25
14 Make States Reusable with Atomic Subcharts
If you simulate the model, you get an error because the parameter T is undefined. To
fix this error, specify an expression for T to evaluate in the mask workspace of the main
chart:
14-26
Map Variables for Atomic Subcharts
14-27
14 Make States Reusable with Atomic Subcharts
14-28
Map Variables for Atomic Subcharts
When you run the model now, you get the following results.
14-29
14 Make States Reusable with Atomic Subcharts
The chart contains two superstates: Active and Inactive. The Active state uses input
events to guard transitions between different substates.
14-30
Map Variables for Atomic Subcharts
1 Right-click the Active state and select Group & Subchart > Atomic Subchart.
2 Specify the mapping of input events for the atomic subchart.
14-31
14 Make States Reusable with Atomic Subcharts
14-32
Map Variables for Atomic Subcharts
c Under Input Event Mapping, note that each atomic subchart symbol maps to
the correct input event in the main chart.
The default mappings also follow the rules of using input events in atomic
subcharts. For more information, see Rules for Using Atomic Subcharts on
page 14-36
d Click OK.
14-33
14 Make States Reusable with Atomic Subcharts
14-34
Generate Reusable Code for Atomic Subcharts
When you generate code for your model, a separate file stores the code for linked atomic
subcharts from the same library.
When you generate code for your model, a separate file stores the code for the atomic
subchart. For more information, see Generate Reusable Code for Unit Testing on page
14-53.
14-35
14 Make States Reusable with Atomic Subcharts
Be sure to define data that appears in an atomic subchart explicitly in the main chart.
For instructions on how to define data in a chart, see Add Data Through the Model
Explorer on page 8-3.
When you use linked atomic subcharts, map the variables so that data in the subchart
correspond to the correct data in the main chart. For more information, see Map
Variables for Atomic Subcharts on page 14-18.
Verify that the size, type, and complexity of variables in a subchart match the settings of
the corresponding variables in the main chart. For more information, see Map Variables
for Atomic Subcharts on page 14-18.
If your atomic subchart contains a function call to a chart-level function, export that
function by selecting Export Chart Level Functions. Do not export graphical functions
from an atomic subchart that maps variables to variables at the main chart level with
a different scope. For more information, see Export Stateflow Functions for Reuse on
page 7-34.
Do not mix edge-triggered and function-call input events in the same atomic subchart
Input events in an atomic subchart must all use edge-triggered type, or they must all use
function-call type. This restriction is consistent with the behavior for the container chart.
For more information, see Best Practices for Using Events in Stateflow Charts on page
9-40.
Do not map multiple input events in an atomic subchart to the same input event in the container
chart
Each input event in an atomic subchart must map to a unique input event in the
container chart. You can verify unique mappings of input events by opening the
properties dialog box for the atomic subchart and checking the Input Event Mapping
section of the Mappings tab.
14-36
Rules for Using Atomic Subcharts
Do not log signals from atomic subcharts that map variables with different scopes
If an atomic subchart maps variables to variables at the main chart level with a different
scope, you cannot log signals for the chart.
Each input event in an atomic subchart must map to an input event of the same trigger
type in the container chart.
Moore charts do not have the same simulation behavior as Classic Stateflow charts with
the same constructs.
Do not use outgoing transitions when an atomic subchart uses top-level local events
You cannot use outgoing transitions from an atomic subchart that uses local events at
the top level of the subchart. Using this configuration causes a simulation error.
If an entry action inside the atomic subchart requires access to a chart input or data
store memory, you might get inaccurate results. To avoid this warning, you can disable
Execute (enter) Chart At Initialization or redirect the default transition path away
from the atomic subchart.
14-37
14 Make States Reusable with Atomic Subcharts
other parameter mapping in the Mappings tab of the properties dialog box causes an
error. You can, however, change the parameter value at the MATLAB prompt so that all
instances of that parameter have the same value.
If your chart contains atomic subcharts, do not use machine-parented data with the
following properties:
Imported or exported
Is 2-D or higher, or uses fixed-point type
Machine-parented data with these properties prevent reuse of generated code and other
code optimizations.
When a data store memory in an atomic subchart maps to chart-level local data, the
First index property of the local data must remain zero. If you change First index to a
nonzero value, an error occurs when you try to update the diagram.
When you use linked atomic subcharts, verify that your settings for super-step semantics
match the settings in the main chart. For more information, see Execution of a Chart
with Super Step Semantics on page 3-47.
14-38
Reuse a State Multiple Times in a Chart
In this section...
Goal of the Tutorial on page 14-39
Edit a Model to Use Atomic Subcharts on page 14-41
Run the New Model on page 14-46
Propagate a Change in the Library Chart on page 14-46
The top Sine Wave block uses a frequency of 1 radian per second, and the bottom Sine
Wave block uses a frequency of 2 radians per second. The blocks use the same amplitude
(1) and phase shift (0).
In the chart, each state uses saturator logic to convert the input sine wave to an output
square wave of the same frequency. The states perform the same actions and differ only
in the names of input and output data:
14-39
14 Make States Reusable with Atomic Subcharts
When you run the model, you get the following results:
14-40
Reuse a State Multiple Times in a Chart
Suppose that you want to reuse the contents of state A in the chart. You can convert that
state to an atomic subchart and then use multiple linked instances of that subchart in
your chart.
14-41
14 Make States Reusable with Atomic Subcharts
To convert state A to an atomic subchart, right-click the state and select Group &
Subchart > Atomic Subchart. State A changes to an atomic subchart:
To enable reuse of the atomic subchart you created in Convert a State to an Atomic
Subchart on page 14-42, store the atomic subchart in a library:
The atomic subchart appears as a standalone chart with an input and an output.
This standalone property enables you to reuse the contents of the atomic subchart.
14-42
Reuse a State Multiple Times in a Chart
Each linked atomic subchart appears opaque and contains the label Link in the
upper-left corner.
14-43
14 Make States Reusable with Atomic Subcharts
You also see warnings about unused data. These warnings appear because atomic
subchart B uses u1 and y1 instead of u2 and y2. To fix these warnings, you must edit the
mapping of input and output variables:
14-44
Reuse a State Multiple Times in a Chart
14-45
14 Make States Reusable with Atomic Subcharts
The input variable in your atomic subchart now maps to the correct input variable in
the main chart.
4 Under Output Mapping, select y2 from the drop-down list.
The output variable in your atomic subchart now maps to the correct output variable
in the main chart.
5 Click OK.
14-46
Reuse a State Multiple Times in a Chart
This change propagates to all linked atomic subcharts in your main chart. You do not
have to update each state individually.
14-47
14 Make States Reusable with Atomic Subcharts
14-48
Reduce the Compilation Time of a Chart
Suppose that you want to reduce the compilation time of the chart for simulation. You
can convert state A to an atomic subchart. Then you can make changes, one by one, to
state A and see how each change affects simulation results. Making one change requires
recompilation of only the atomic subchart and not the entire chart.
Side-by-side animation for the main chart and the atomic subchart occurs.
4 In the atomic subchart, change the state action for Pos to y1 = 2.
5 Restart simulation.
Recompilation occurs only for the atomic subchart and not the entire chart.
14-49
14 Make States Reusable with Atomic Subcharts
14-50
Divide a Chart into Separate Units
Suppose that you want to edit state A separately, while someone else is editing state
B. You can convert state A to an atomic subchart for storage in a library model. After
replacing state A with a linked atomic subchart, you can make changes separately in
the library. These changes propagate automatically to the chart that contains the linked
atomic subchart.
14-51
14 Make States Reusable with Atomic Subcharts
You can now edit state A separately from state B without any merge issues.
14-52
Generate Reusable Code for Unit Testing
In this section...
Goal of the Tutorial on page 14-53
Convert a State to an Atomic Subchart on page 14-54
Specify Code Generation Parameters on page 14-55
Generate Code for Only the Atomic Subchart on page 14-56
14-53
14 Make States Reusable with Atomic Subcharts
Suppose that you want to generate reusable code so that you can perform unit testing on
state A. You can convert that part of the chart to an atomic subchart and then specify a
separate file to store the generated code.
14-54
Generate Reusable Code for Unit Testing
14-55
14 Make States Reusable with Atomic Subcharts
1 In the Model Configuration Parameters dialog box, go to the Code Generation >
Symbols pane.
2 Set Subsystem methods to the format scheme $R$N$M$F, where:
To inspect the code for saturator.c, click the hyperlink in the report to see the
following code:
14-56
Generate Reusable Code for Unit Testing
Line 28 shows that the during function generated for the atomic subchart has the
name ex_reuse_states_A_during. This name follows the format scheme $R$N$M$F
specified for Subsystem methods:
14-57
14 Make States Reusable with Atomic Subcharts
Note: The line numbers shown can differ from the numbers that appear in your code
generation report.
14-58
15
What Is a SimState?
A SimState is the snapshot of the state of a model at a specific time during simulation.
For a Stateflow chart, a SimState includes the following information:
Graphical objects grouped by type (box, function, or state) and in alphabetical order
within each group
Chart data grouped by scope (block output or local) and in alphabetical order within
each group
For example, the following SimState illustrates the hierarchical structure of chart
objects.
c =
Contains:
The tree structure maps graphical and nongraphical objects to their respective locations
in the chart hierarchy. If name conflicts exist, one or more underscores appear at the end
of a name so that all objects have unique identifiers in the SimState hierarchy.
Note: Stateless flow charts have an empty SimState, because they do not contain states
or persistent data.
15-2
What Is a SimState?
For information about using a SimState for other blocks in a Simulink model, see Save
and Restore Simulation State as SimState (Simulink).
15-3
15 Save and Restore Simulations with SimState
For directions, see Divide a Long Simulation into Segments on page 15-5.
15-4
Divide a Long Simulation into Segments
This model simulates for 1400 seconds, but the output that interests you occurs sometime
between t = 400 and 600. You can simulate the model, save the SimState at time t = 400,
and then load that SimState for simulation between t = 400 and 600.
15-5
15 Save and Restore Simulations with SimState
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Select the Final states check box.
c Enter a name, such as sf_boiler_ctx01.
d Select the Save complete SimState in final state check box.
e Click Apply.
Programmatic equivalent
set_param('sf_boiler','SaveFinalState','on', ...
'FinalStateName', ['sf_boiler_ctx01'], ...
'SaveCompleteFinalSimState','on');
Programmatic equivalent
set_param('sf_boiler','StartTime','0', ...
'StopTime','400');
4 Start simulation.
15-6
Divide a Long Simulation into Segments
When you simulate the model, you save the complete simulation state at t = 400 in
the variable sf_boiler_ctx01 in the MATLAB base workspace.
5 Disable saving of a SimState.
This step prevents you from overwriting the SimState you saved in the previous
step.
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Clear the Save complete SimState in final state check box.
c Clear the Final states check box.
d Click OK.
Programmatic equivalent
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Select the Initial state check box.
c Enter the variable that contains the SimState of your chart: sf_boiler_ctx01.
d Click Apply.
Programmatic equivalent
15-7
15 Save and Restore Simulations with SimState
You do not need to enter a new start time because the simulation continues from
where it left off.
Programmatic equivalent
set_param('sf_boiler','StopTime','600');
15-8
Divide a Long Simulation into Segments
15-9
15 Save and Restore Simulations with SimState
This model simulates for 30 seconds, but you want to see what happens when the value
of gear changes at t = 10. You can simulate the model, save the SimState at t = 10, load
and modify the SimState, and then simulate again between t = 10 and 20.
15-10
Test a Unique Chart Configuration
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Select the Final states check box.
c Enter a name, such as old_sf_car_ctx01.
d Select the Save complete SimState in final state check box.
e Click Apply.
Programmatic equivalent
set_param('old_sf_car','SaveFinalState','on', ...
'FinalStateName', ['old_sf_car_ctx01'], ...
'SaveCompleteFinalSimState','on');
15-11
15 Save and Restore Simulations with SimState
Programmatic equivalent
set_param('old_sf_car','StartTime','0', ...
'StopTime','10');
4 Start simulation.
When you simulate the model, you save the complete simulation state at t = 10 in
the variable old_sf_car_ctx01 in the MATLAB base workspace.
15-12
Test a Unique Chart Configuration
15-13
15 Save and Restore Simulations with SimState
This step prevents you from overwriting the SimState you saved in the previous
step.
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Clear the Save complete SimState in final state check box.
c Clear the Final states check box.
d Click OK.
Programmatic equivalent
set_param('old_sf_car','SaveCompleteFinalSimState','off', ...
'SaveFinalState','off');
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Select the Initial state check box.
c Enter the variable that contains the SimState of your chart:
old_sf_car_ctx01.
d Click OK.
Programmatic equivalent
set_param('old_sf_car','LoadInitialState','on', ...
'InitialState', ['old_sf_car_ctx01']);
2 Define an object handle for the SimState values of the shift_logic chart.
blockpath = 'old_sf_car/shift_logic';
15-14
Test a Unique Chart Configuration
c = old_sf_car_ctx01.getBlockSimState(blockpath);
Tip: If the chart appears highlighted in the model window, you can specify the block
path using gcb:
c = old_sf_car_ctx01.getBlockSimState(gcb);
Makes a copy of the SimState of your chart, which is stored in the final state data
of the model.
Provides a root-level handle or reference to the copy of the SimState, which is a
hierarchical tree of graphical and nongraphical chart objects.
Each node in this tree is also a handle to a state, data, or other chart object.
Note: Because the entire tree consists of object handles, the following assignment
statements do not work:
stateCopy = c.state
dataCopy = c.data
simstateCopy = c
These assignments create copies of the object handles, not SimState values. The only
way to copy SimState values is to use the clone method. For details, see Methods
for Interacting with the SimState of a Chart on page 15-34 and Rules for Using
the SimState of a Chart on page 15-37.
3 Look at the contents of the SimState.
c =
Contains:
15-15
15 Save and Restore Simulations with SimState
The SimState of your chart contains a list of states and data in hierarchical order.
4 Highlight the states that are active in your chart at t = 10.
c.highlightActiveStates;
Tip: To check if a single state is active, you can use the isActive method. For
example, type:
c.gear_state.fourth.isActive
15-16
Test a Unique Chart Configuration
This command returns true (1) when a state is active and false (0) otherwise. For
information on other methods, see Methods for Interacting with the SimState of a
Chart on page 15-34.
5 Change the active substate of selection_state to downshifting.
When you type c.gear at the command prompt, you see a list of data properties
similar to this:
>> c.gear
ans =
15-17
15 Save and Restore Simulations with SimState
DataType: 'double'
Size: '[1, 1]'
Range: [1x1 struct]
InitialValue: [1x0 double]
Value: 4
c.gear.Value = 1;
However, you cannot change the data type or size of gear. Also, you cannot specify
a new value that falls outside the range set by the Minimum and Maximum
parameters. For details, see Rules for Modifying Data Values on page 15-37 .
7 Save the modified SimState.
You do not need to enter a new start time because the simulation continues from
where it left off.
Programmatic equivalent
set_param('old_sf_car','StopTime','20');
2 Start simulation.
15-18
Test a Unique Chart Configuration
15-19
15 Save and Restore Simulations with SimState
In this section...
Goal of the Tutorial on page 15-20
Define the SimState on page 15-23
Modify SimState Values for One Actuator Failure on page 15-24
Test the SimState for One Failure on page 15-28
Modify SimState Values for Two Actuator Failures on page 15-31
Test the SimState for Two Failures on page 15-32
The Mode Logic chart monitors the status of actuators for two elevators. Each elevator
has an outer (primary) actuator and an inner (secondary) actuator. In normal operation,
the outer actuators are active and the inner actuators are on standby.
15-20
Test a Chart with Fault Detection and Redundant Logic
When the four actuators are working correctly, the left and right elevators reach steady-
state positions in 3 seconds.
15-21
15 Save and Restore Simulations with SimState
Suppose that you want to see what happens at t = 3 when at least one actuator fails. You
can simulate the model, save the SimState at t = 3, load and modify the SimState, and
then simulate again between t = 3 and 10.
15-22
Test a Chart with Fault Detection and Redundant Logic
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Select the Final states check box.
c Enter a name, such as xFinal.
d Select the Save complete SimState in final state check box.
e Click Apply.
Programmatic equivalent
set_param('sf_aircraft','SaveFinalState','on', ...
'FinalStateName', ['xFinal'], ...
'SaveCompleteFinalSimState','on');
15-23
15 Save and Restore Simulations with SimState
c Click OK.
Programmatic equivalent
set_param('sf_aircraft','StopTime','3');
4 Start simulation.
When you simulate the model, you save the complete simulation state at t = 3 in the
variable xFinal in the MATLAB base workspace.
5 Disable saving of a SimState.
This step prevents you from overwriting the SimState you saved in the previous
step.
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Clear the Save complete SimState in final state check box.
c Clear the Final states check box.
d Click OK.
Programmatic equivalent
set_param('sf_aircraft','SaveCompleteFinalSimState','off', ...
'SaveFinalState','off');
a Open the Model Configuration Parameters dialog box and go to the Data
Import/Export pane.
b Select the Initial state check box.
c Enter the variable that contains the SimState of your chart: xFinal.
d Click OK.
15-24
Test a Chart with Fault Detection and Redundant Logic
Programmatic equivalent
set_param('sf_aircraft','LoadInitialState','on', ...
'InitialState', ['xFinal']);
2 Define an object handle for the SimState values of the Mode Logic chart.
Tip: If the chart appears highlighted in the model window, you can specify the block
path using gcb:
c = xFinal.getBlockSimState(gcb);
Makes a copy of the SimState of your chart, which is stored in the final state data
of the model.
Provides a root-level handle or reference to the copy of the SimState, which is a
hierarchical tree of graphical and nongraphical chart objects.
Each node in this tree is also a handle to a state, data, or other chart object.
Note: Because the entire tree consists of object handles, the following assignment
statements do not work:
stateCopy = c.state
dataCopy = c.data
simstateCopy = c
These assignments create copies of the object handles, not SimState values. The only
way to copy SimState values is to use the clone method. For details, see Methods
15-25
15 Save and Restore Simulations with SimState
for Interacting with the SimState of a Chart on page 15-34 and Rules for Using
the SimState of a Chart on page 15-37.
3 Look at the contents of the SimState.
c =
Contains:
The SimState of your chart contains a list of states, functions, and data in
hierarchical order.
4 Highlight the states that are active in your chart at t = 3.
c.highlightActiveStates;
Active states appear highlighted. By default, the two outer actuators are active and
the two inner actuators are on standby.
15-26
Test a Chart with Fault Detection and Redundant Logic
Tip: To check if a single state is active, you can use the isActive method. For
example, type:
c.Actuators.LI.L1.Standby.isActive
This command returns true (1) when a state is active and false (0) otherwise. For
information on other methods, see Methods for Interacting with the SimState of a
Chart on page 15-34.
5 Change the state activity in the chart to reflect one actuator failure.
Assume that the left outer (LO) actuator fails. To change the state, use this
command:
c.Actuators.LO.Isolated.setActive;
15-27
15 Save and Restore Simulations with SimState
The setActive method ensures that the chart exits and enters the appropriate
states to maintain state consistency. However, the method does not perform entry
actions for the newly active substate. Similarly, the method does not perform exit
actions for the previously active substate.
6 Save the modified SimState by using this command:
15-28
Test a Chart with Fault Detection and Redundant Logic
You do not need to enter a new start time because the simulation continues from
where it left off.
Programmatic equivalent
set_param('sf_aircraft','StopTime','10');
2 Start simulation.
Chart animation shows that the other three actuators react appropriately to the
failure of the left outer (LO) actuator.
15-29
15 Save and Restore Simulations with SimState
15-30
Test a Chart with Fault Detection and Redundant Logic
Assume that the left inner (LI) actuator also fails. To change the state, use this
command:
15-31
15 Save and Restore Simulations with SimState
c.Actuators.LI.Isolated.setActive;
2 Save the modified SimState by using this command:
Because of failures in both actuators, the left elevator stops working. The right
elevator maintains a steady-state position.
15-32
Test a Chart with Fault Detection and Redundant Logic
If you modify the SimState of your chart to test the response of the right elevator to
actuator failures, you get similar results.
15-33
15 Save and Restore Simulations with SimState
For nongraphical
objects,
highlights the
object in the
Model Explorer.
Note: For
persistent data
in MATLAB
functions, this
method opens the
function editor
and highlights
the persistent
data at the exact
line in the script.
Chart checkStateConsistency Verifies that all ch.checkStateConsistency
states in a chart
are consistent.
If a state is
inactive, no
substates are
active.
15-34
Methods for Interacting with the SimState of a Chart
15-35
15 Save and Restore Simulations with SimState
15-36
Rules for Using the SimState of a Chart
Machine-parented data
Persistent data in custom C code
Persistent data in external MATLAB code
You cannot change the data type or size. Scalar data must remain scalar. Vector
and matrix data must keep the same dimensions. The only exception to this rule is
Stateflow data of ml type (see ml Data Type on page 11-43 for details).
For enumerated data types, you can choose only enumerated values from the type
definition. For other data types, new values must fall within the range that you
specify in the Minimum and Maximum parameters.
Use one-based indexing to define rows and columns of a matrix.
Suppose that you want to change the value of an element in a 21-by-12 matrix. To
modify the element in the first row and second column, type:
c.state_name.data_name.Value(1,2) = newValue;
15-37
15 Save and Restore Simulations with SimState
If you want these state actions to occur, you must execute them separately. For
example, if your state actions assign values to data, you must assign the values
explicitly.
The setActive method tries to maintain state consistency by:
15-38
Rules for Using the SimState of a Chart
Suppose that you obtain a handle to the SimState of your chart using these commands:
blockpath = 'model/chart';
c = xFinal.getBlockSimState(blockpath);
15-39
15 Save and Restore Simulations with SimState
save('sf_car_ctx01.mat', 'sf_car_ctx01')
For example, to reuse the commands in Divide a Long Simulation into Segments on
page 15-5, you can store them in a script named sf_boiler_simstate_commands.m:
% Specify the start and stop times for the simulation segment.
set_param('sf_boiler','StartTime','0','StopTime','400');
15-40
Best Practices for Using the SimState of a Chart
'SaveFinalState','off');
15-41
16
For examples, see Find Pattern in Data Transmission Using Vectors on page 16-17
and Calculate Motion Using Matrices on page 16-19.
Charts
Subcharts
States
Functions
Input data
Output data
Local data
Function inputs
Function outputs
State actions
16-2
How Vectors and Matrices Work in C Charts
Transition actions
MATLAB functions
Truth table functions
Graphical functions
Simulink functions
Change detection operators
For more information, see Operations For Vectors and Matrices in C Charts on page
16-11 and Rules for Vectors and Matrices in C Charts on page 16-13.
16-3
16 Vectors and Matrices in C Charts
Define a Vector
Define a vector in a C chart as follows:
1 Add data to your chart as described in Add Stateflow Data on page 8-2.
2 In the General pane of the Data properties dialog box, enter the dimensions of the
vector in the Size field.
Note: Vectors cannot have the base type ml. See Rules for Vectors and Matrices in C
Charts on page 16-13.
4 Set initial values for the vector.
If initial values of all elements are the same, enter a real number in the Initial
value field. This value applies to all elements of a vector of any size.
If initial values differ, enter real numbers in the Initial value field. For example,
you can enter:
[1; 3; 5; 7]
Tip: If you want to initialize all elements of a vector to 0, do nothing. When no values
are explicitly defined, all elements initialize to 0.
5 Click Apply.
Define a Matrix
Define a matrix in a C chart as follows:
16-4
Define Vectors and Matrices
1 Add data to your chart as described in Add Stateflow Data on page 8-2.
2 In the General pane of the Data properties dialog box, enter the dimensions of the
matrix in the Size field.
Note: Matrices cannot have the base type ml. See Rules for Vectors and Matrices in
C Charts on page 16-13.
4 Set initial values for the matrix.
If initial values of all elements are the same, enter a real number in the Initial
value field. This value applies to all elements of a matrix of any size.
If initial values differ, enter real numbers in the Initial value field. For example,
you can enter:
[1 2 3; 4 5 6; 7 8 9]
16-5
16 Vectors and Matrices in C Charts
For functions with multiple outputs, the same rules apply except for the case where the
outputs and inputs of the function call are all vectors or matrices. In this case, scalar
expansion does not occur, and an error message alerts you to a size mismatch.
The rules of scalar expansion apply to all functions that you use in C charts:
MATLAB functions
16-6
Scalar Expansion for Converting Scalars to Nonscalars
Graphical functions
Simulink functions
Truth table functions
16-7
16 Vectors and Matrices in C Charts
16-8
Assign and Access Vector and Matrix Values
The following examples show how to access the value of an element in a vector in a C
chart.
The following examples show how to access the value of an element in a matrix in a C
chart.
test_vector = 10;
test_matrix = 20;
16-9
16 Vectors and Matrices in C Charts
Note: You cannot use scalar expansion on a vector or matrix in the MATLAB base
workspace. If you try to use scalar expansion, the vector or matrix in the base workspace
converts to a scalar.
16-10
Operations For Vectors and Matrices in C Charts
Binary Operations
You can perform element-wise binary operations on vector and matrix operands of equal
dimensions in the following order of precedence (1 = highest, 3 = lowest). For operations
with equal precedence, they evaluate in order from left to right.
Example Description
~a Unary minus
!a Logical NOT
a++ Increments all elements of the vector or matrix by 1
16-11
16 Vectors and Matrices in C Charts
Example Description
a-- Decrements all elements of the vector or matrix by 1
Assignment Operations
You can perform element-wise assignment operations on vector and matrix operands.
Example Description
a = expression Simple assignment
a += expression Equivalent to a = a + expression
a -= expression Equivalent to a = a - expression
a *= expression Equivalent to a = a * expression
a /= expression Equivalent to a = a / expression
16-12
Rules for Vectors and Matrices in C Charts
If you define a vector or matrix with ml base type, an error message appears when you
try to simulate your model. This base type supports only scalar data.
For more information about this type, see ml Data Type on page 11-43.
Use only real numbers to set initial values of vectors and matrices
When you set the initial value for an element of a vector or matrix, use a real number.
If you use a complex number, an error message appears when you try to simulate your
model.
Note: You can set values of vectors and matrices to complex numbers after initialization.
You cannot use a vector or matrix as an argument for temporal logic operators, because
time is a scalar quantity.
16-13
16 Vectors and Matrices in C Charts
For example, suppose that you want to perform standard matrix operations on two
square matrices during simulation. Follow these steps:
16-14
Best Practices for Vectors and Matrices in C Charts
For example, suppose that you want to collect input data in a buffer during simulation.
Follow these steps:
The state Collect_Data stores data in the vector y, which is of size 10. The entry
action assigns the value of input data u to the first element of y. The during action
assigns the next nine values of input data to successive elements of the vector y until
you store ten elements.
2 Add the input data u to the chart.
a In the Stateflow Editor, select Chart > Add Inputs & Outputs > Data Input
From Simulink.
b In the Data properties dialog box, enter u in the Name field.
c Click OK.
3 Add the output data y to the chart.
a In the Stateflow Editor, select Chart > Add Inputs & Outputs > Data Output
To Simulink.
16-15
16 Vectors and Matrices in C Charts
Note: You do not need to set initial values for this output vector. By default, all
elements initialize to 0.
For information about the temporalCount operator, see Control Chart Execution Using
Temporal Logic on page 11-56.
16-16
Find Pattern in Data Transmission Using Vectors
For details of how the chart works, see Detect Valid Transmission Data Using Frame
Synchronization on page 21-19.
16-17
16 Vectors and Matrices in C Charts
16-18
Calculate Motion Using Matrices
16-19
16 Vectors and Matrices in C Charts
16-20
Calculate Motion Using Matrices
16-21
16 Vectors and Matrices in C Charts
16-22
Calculate Motion Using Matrices
4 Click a different spot to specify the initial velocity of the cue ball.
16-23
16 Vectors and Matrices in C Charts
16-24
17
17-2
How Charts Implement Variable-Size Data
You pass variable-size data to these functions as chart-level inputs and outputs from
state actions and transition logic. However, you must perform all computations with
variable-size data inside the functions, not directly in states or transitions.
For more information about the functions that interact with variable-size, chart-level
inputs and outputs, see:
17-3
17 Variable-Size Data in Stateflow Charts
After enabling support at the chart level, declare your variable-size inputs and outputs.
17-4
Declare Variable-Size Inputs and Outputs
For example:
17-5
17 Variable-Size Data in Stateflow Charts
17-6
Compute Output Based on Size of Input Signal
In this section...
About the Model on page 17-7
Chart: VarSizeSignalSource on page 17-8
Chart: size_based_processing on page 17-11
Simulate the Model on page 17-15
17-7
17 Variable-Size Data in Stateflow Charts
Chart: VarSizeSignalSource
The VarSizeSignalSource chart works like a source block. It has no input and one
variable-size output y:
17-8
Compute Output Based on Size of Input Signal
For variable-size outputs, you must explicitly specify the size and upper bound for each
dimension. In this case, y is a vector where the first dimension is assumed to be fixed at
size 1 and the second dimension is variable with an upper bound of 16.
This chart uses temporal logic to transition between three states, each generating a
different size output:
17-9
17 Variable-Size Data in Stateflow Charts
No states or transitions can read from or write to variable-size data. Therefore, y does
not appear in any state actions or transition logic. All computations involving variable-
size data must occur in MATLAB functions in the chart.
MATLAB functions access variable-size, chart-level data directly. You do not pass the
data as inputs or outputs to the functions. In this chart, the generateOutput function
adds a different number of elements to the variable-size output y, based on how the
active state calls it. The function constructs the variable-size vector from a number
sequence, then outputs the transpose of the result:
function generateOutput(len)
%#codegen
assert(len<=16);
y = (1:len)';
MATLAB functions must be able to determine the upper bounds of variable-size data
at compile time. In this case, however, the upper bound is len, an input for which the
17-10
Compute Output Based on Size of Input Signal
model computes the value at run time. To provide this information, the assert function
specifies an explicit upper bound for len, one that matches the upper bound for chart
output y.
If you do not include the assert statement, you get a compilation error:
Chart: size_based_processing
The size_based_processing chart computes a variable-size output based on the value
of a variable-size input:
17-11
17 Variable-Size Data in Stateflow Charts
17-12
Compute Output Based on Size of Input Signal
The chart uses three MATLAB functions to evaluate the size of input u and generate
an associated output y:
17-13
17 Variable-Size Data in Stateflow Charts
This function tests whether chart input u, the signal generated by chart
VarSizeSignalSource, is a scalar or vector value:
function isScalar = is_scalar_input
%#codegen
isScalar = length(u)==1;
If input u is a vector, this function outputs the sine of each of its values:
function compute_output
%#codegen
y = sin(u);
17-14
Compute Output Based on Size of Input Signal
The display blocks periodically show 1, 8, and 16 values from the variable-size
vector.
17-15
17 Variable-Size Data in Stateflow Charts
You can pass the data as inputs and outputs to MATLAB and Simulink functions in
your chart from state actions and transition logic. MATLAB functions can also access
the chart-level, variable-size data directly (see Compute Output Based on Size of
Input Signal on page 17-7).
17-16
18
For example, the following MATLAB file restricts an integer-based enumerated data type
named BasicColors to three enumerated values.
For information on defining an enumerated data type, see Define Enumerated Data in a
Chart on page 18-8.
For information on using enumerated data in other blocks of a Simulink model, see Use
Enumerated Data in Simulink Models (Simulink).
18-2
Benefits of Using Enumerated Data in a Chart
For example, this chart uses enumerated data to refer to a set of colors.
The chart models a system with two discrete states: Slow and Fast.
The enumerated data output is restricted to a finite set of values: 0, 1, and 2.
You can refer to these values by their enumerated names: Red, Yellow, and Green.
For example, you can group related values into separate data types.
18-3
18 Enumerated Data in Charts
Chart
Subchart
State
State actions
Condition and transition actions
Vector and matrix indexing
MATLAB functions
Graphical functions
Simulink functions
Truth Table blocks and truth table functions
You can use enumerated data for simulation and Simulink Coder code generation.
More About
MATLAB Functions in a Chart on page 26-2
Reuse Logic Patterns Using Graphical Functions on page 7-32
Simulink Functions in Stateflow on page 27-2
What Is a Truth Table? on page 25-2
Rules for Using Enumerated Data in a Chart on page 18-15
18-4
Elements of an Enumerated Data Type Definition
18-5
18 Enumerated Data in Charts
18-6
Elements of an Enumerated Data Type Definition
In the example, the methods section of code customizes the data type as follows:
Specifies that the default enumerated value is the last one in the list of allowed values
Includes a short description of the data type for Simulink Coder generated code
Imports the definition of the data type from a custom header file to prevent Simulink
Coder from generating the definition.
Adds the name of the data type as a prefix to each enumeration member name in
Simulink Coder generated code
18-7
18 Enumerated Data in Charts
Note: For each enumerated type, you must create a new file.
2 Add data of the enumerated type to a chart.
In the MATLAB Command Window, select Home > New > Class.
2 Define enumerated values in an enumeration section.
classdef EnumTypeName < Simulink.IntEnumType
enumeration
EnumName(N)
...
end
end
EnumTypeName is must be unique among data type names and workspace variable
names. An enumerated type can define any number of values. Each enumerated
value consists of a name EnumName and an integer N. Each EnumName must be
unique within its type, but can also appear in other enumerated types.
For example, you can enter the following lines in the MATLAB Editor:
classdef BasicColors < Simulink.IntEnumType
enumeration
18-8
Define Enumerated Data in a Chart
Red(0)
Yellow(1)
Green(2)
end
end
The classdef section defines an integer-based enumerated data type with the name
BasicColors and derives it from the built-in type Simulink.IntEnumType. The
enumeration section is the set of values that this data type allows. The default
value is the first one in the list, unless you specify otherwise in the next step.
3 (Optional) Customize the data type using a methods section.
For details, see Elements of an Enumerated Data Type Definition on page 18-5 or
Customize Simulink Enumeration (Simulink) in the Simulink documentation.
4 Save this file on the MATLAB path.
The name of your file must match exactly the name of your data type. For example,
the data type BasicColors must reside in a file named BasicColors.m.
Tip: To add a folder to the MATLAB search path, type addpath pathname at the
command prompt.
For example, you can enter Enum: BasicColors in the Type field.
3 (Optional) Enter an initial value for the enumerated data.
More About
Define an Enumerated Data Type in a File on page 18-8
18-9
18 Enumerated Data in Charts
18-10
Ensure That Changes in Data Type Definition Take Effect
18-11
18 Enumerated Data in Charts
If your chart uses data types that contain identical enumerated names (such as
Colors.Red and Temp.Red), consider using prefixed notation to prevent name conflicts
among identifiers.
The enumerated data type definition must be in a file on the MATLAB search path.
Enumerated data of this type exists in the chart.
Suppose that you have an identifier with nonprefixed notation: Red. The enumerated
name Red belongs to the data type TrafficColors.
18-12
Notation for Enumerated Values in Charts
Suppose that you have three data types (Colors, Temp, and Code) that contain the
enumerated name Red. By using prefixed notation, you can distinguish Colors.Red
from Temp.Red and Code.Red.
The only requirement for using prefixed notation is that the enumerated data type
definition is in a file on the MATLAB search path.
Suppose that you have an identifier with prefixed notation: TrafficColors.Red. The
enumerated name Red belongs to the data type TrafficColors.
You can meet the requirement for prefixed notation by defining TrafficColors as an
enumerated data type in a file on the MATLAB search path.
More About
Prefixed Notation for Enumerated Values on page 18-12
Define Enumerated Data in a Chart on page 18-8
18-13
18 Enumerated Data in Charts
Example Description
a = exp Assignment of exp, which must evaluate to an enumerated value
a == b Comparison, equality
a != b Comparison, inequality
18-14
Rules for Using Enumerated Data in a Chart
Use the name of the enumerated data type as the name of the MATLAB file that contains the
type definition
This rule enables resolution of enumerated data types for Simulink models.
The name of an enumerated data type cannot match the name of another data type or a
variable in the MATLAB base workspace. Otherwise, a name conflict occurs.
Do not use enumerated data for inputs and outputs of exported functions
This rule applies to graphical functions, truth table functions, and Simulink functions.
Because enumerated values are constants, assigning these values to constant data is
redundant and unnecessary. If you try to assign enumerated values to constant data, an
error appears.
y = BasicColors(3)
y = BasicColors.Red
18-15
18 Enumerated Data in Charts
If you choose to set an initial value for enumerated data, you must use a
prefixed identifier in the Initial value field of the Data properties. For example,
BasicColors.Red is a valid identifier, but not Red. This rule applies because the initial
value must evaluate to a valid MATLAB expression.
For information about prefixed notation, see Prefixed Notation for Enumerated Values
on page 18-12.
Do not use the ml namespace operator to access enumerated data from the MATLAB base
workspace
How the Minimum and Maximum fields appear in the Data properties depends on
which option you use to define enumerated data.
Leave the Minimum and Maximum fields empty for enumerated data. The chart
ignores any values that you enter in these fields.
Include custom header information for enumerated types in the Model Configuration
Parameters dialog box
If data in your chart uses an enumerated type with a custom header file, include
the header information in the Simulation Target pane of the Model Configuration
Parameters dialog box. In the Header file section, add the following statement:
#include "<custom_header_file_for_enum>.h"
Suppose that you have three enumerated types in your model that use custom
header files: imported_enum_type1.h, imported_enum_type2.h, and
imported_enum_type3.h. If you use the three enumerated types for different data in
your chart, you can include the header information by using one of these methods:
18-16
Rules for Using Enumerated Data in a Chart
Add the following statements in the Header file section of the Simulation Target
pane in the Model Configuration Parameters dialog box:
#include "imported_enum_type1.h"
#include "imported_enum_type2.h"
#include "imported_enum_type3.h"
Create a separate header file, such as required_types.h, that consolidates the list
of custom header files:
#include "imported_enum_type1.h"
#include "imported_enum_type2.h"
#include "imported_enum_type3.h"
Then, add the following statement in the Header file section of the Simulation
Target pane in the Model Configuration Parameters dialog box:
#include "required_types.h"
18-17
18 Enumerated Data in Charts
If you add prefixes to enumerated names in the generated code, you enhance readability
and avoid name conflicts with global symbols. For details, see Use Enumerated Data in
Generated Code (Simulink Coder) in the Simulink Coder documentation.
This guideline prevents name conflicts with other objects in a chart. If an enumerated
value uses the same identifier as a data object in a state or a bus field in a chart, the
chart does not resolve the identifier as an enumerated value.
For example, the following diagram shows the stages in which a chart tries to resolve the
identifier Colors.Red.
18-18
Best Practices for Using Enumerated Data in a Chart
Given an
identifier
Colors.Red
Is there a state
named Colors Yes
with a data
object named
Red?
No
No
Is there an
enumerated Yes
type named
Colors with the
value Red?
No
Error message
appears in the
Diagnostic
Viewer
18-19
18 Enumerated Data in Charts
In this section...
Overview of CD Player Model on page 18-20
Benefits of Using Enumerated Types in This Model on page 18-22
Run the CD Player Model on page 18-22
How the UserRequest Chart Works on page 18-25
How the CdPlayerModeManager Chart Works on page 18-25
How the CdPlayerBehaviorModel Chart Works on page 18-29
18-20
Model CD Player Using Enumerated Data
18-21
18 Enumerated Data in Charts
By grouping related values into separate data types, you get these benefits:
18-22
Model CD Player Using Enumerated Data
The Display blocks in the model show the default settings of the CD player.
18-23
18 Enumerated Data in Charts
The Display blocks for enumerated data RR and CurrentRadioMode change from
OFF to CD.
4 In the CD Player Helper GUI, click Insert Disc.
The Display block for enumerated data CdStatus changes from EMPTY to
DISCINSERT to STOP.
5 In the CD Player Helper GUI, click PLAY in the CD Request section.
The Display blocks for enumerated data CR, MechCmd, and CdStatus change from
STOP to PLAY.
18-24
Model CD Player Using Enumerated Data
Note: To see other changes in the Display blocks, you can select other operating modes
for the CD player, such as FM or AM radio.
Enumerated data
ml namespace operator (see ml Namespace Operator on page 11-38)
This chart reads user inputs from the CD Player Helper GUI and stores the information
as output data.
18-25
18 Enumerated Data in Charts
Enumerated data
Subcharts (see Encapsulate Modal Logic Using Subcharts on page 7-5)
Change detection (see Detect Changes in Data Values on page 11-74)
18-26
Model CD Player Using Enumerated Data
18-27
18 Enumerated Data in Charts
3 If the Boolean data DiscEject is 1 (or true), a transition to the Eject state occurs,
followed by a transition back to the ModeManager state.
4 Steps 2 and 3 repeat until the chart goes to sleep.
In the ON substate, three subcharts represent the operating modes of a CD player: CD,
AM radio, and FM radio. Each subchart corresponds to a different value of enumerated
data RadioReq.
The hasChanged operator detects changes in the value of RadioReq with an inner
transition.
18-28
Model CD Player Using Enumerated Data
Enumerated data
Temporal logic (see Control Chart Execution Using Temporal Logic on page 11-56)
18-29
18 Enumerated Data in Charts
18-30
Model CD Player Using Enumerated Data
Whenever a state transition occurs, the enumerated data CdStatus changes value to
reflect the behavior of the CD player.
18-31
18 Enumerated Data in Charts
1 Type sfnew at the command prompt to create a new model with a chart inside.
2 In the chart, add states A and B to the chart.
18-32
Assign Enumerated Values in a Chart
Note: You will define the data color and y in the sections that follow.
3 Add transitions between states A and B.
18-33
18 Enumerated Data in Charts
In the MATLAB Command Window, select Home > New > Class.
2 Enter these lines in the MATLAB Editor:
classdef TrafficColors < Simulink.IntEnumType
enumeration
RED(0)
GREEN(10)
end
end
The name of your file must match exactly the name of your data type. Therefore, you
must use TrafficColors.m as the name of your file.
Tip: To add a folder to the MATLAB search path, type addpath pathname at the
command prompt.
18-34
Assign Enumerated Values in a Chart
1 In the Stateflow Editor, select Chart > Add Inputs & Outputs > Data Output To
Simulink.
1 In the Stateflow Editor, select Chart > Add Inputs & Outputs > Data Output To
Simulink.
18-35
18 Enumerated Data in Charts
You can set a discrete sample time for simulation using a fixed-step solver. (For details,
see Solvers (Simulink) in the Simulink documentation.)
Open the Scope blocks. When you simulate the model, you get the following results:
18-36
Assign Enumerated Values in a Chart
18-37
18 Enumerated Data in Charts
18-38
Assign Enumerated Values in a Chart
18-39
19
When you configure Stateflow charts for continuous-time simulation, they interact with
the Simulink solver as follows:
Stateflow charts do not update mode in minor time steps. The outputs computed in a
minor time step are based on the state of the chart during the last major time step.
Compute the state of the chart at each time step and expose the state derivative to
the Simulink solver.
You can define local continuous variables to hold state information. Stateflow charts
provide programmatic access to the derivatives of state variables. Continuous solvers
in Simulink models use this data to compute the continuous states at the current
time step in the chart, based on values from the previous time steps and the state
derivatives. For more information on how solvers work, see Solvers (Simulink).
Register zero crossings on state transitions.
19-2
Continuous-Time Modeling in Stateflow
of mode, it searches forward from the previous major time step to detect when the
zero crossing or state transition occurred. For more information about how a Simulink
model uses zero-crossing detection to simulate discontinuities in continuous states,
see Zero-Crossing Detection (Simulink).
In Stateflow charts, you can represent mode logic succinctly and intuitively as a series
of states, transitions, and flow charts. You can also easily represent state information
as continuous local variables with automatic access to time derivatives, as described in
Purpose of Continuous-Time Variables on page 19-9.
If your continuous or hybrid system does not contain mode logic, consider using a
Simulink model (see Model a Continuous System (Simulink)).
Model Description
sf_abs Rectifier takes a single (scalar) input
and converts it to its absolute value.
Shows how Stateflow charts register zero-
crossing variables with Simulink models
for accurate detection of mode changes.
sf_bounce Shows how to model the dynamics of a
bouncing ball by defining continuous-time
state variables and their derivatives in a
Stateflow chart.
19-3
19 Continuous-Time Systems in Stateflow Charts
Model Description
sf_newtons_cradle Shows how to model elastic collisions
between balls in Newton's Cradle, a device
that conserves momentum and energy.
Uses vector assignment to continuous-time
state variables.
sf_clutch Implements the Simulink clutch example
model purely in a Stateflow chart.
Represents the modal nature of the
clutch by using two states: Locked and
Slipping.
sf_pool Shows how to model continuous systems
that have many discontinuous events,
which rapidly (and unpredictably) change
the dynamics.
More About
Model a Bouncing Ball in Continuous Time on page 19-11
Design Considerations for Continuous-Time Modeling in Stateflow Charts on page
19-22
Preventing Excessive Zero Crossings (Simulink)
19-4
Model Hybrid Systems with Model Logic
19-5
19 Continuous-Time Systems in Stateflow Charts
1 Right-click inside a chart and select Properties from the context menu.
2 In the Chart Properties dialog box, set the Update method to Continuous.
19-6
Configure a Stateflow Chart to Update in Continuous Time
19-7
19 Continuous-Time Systems in Stateflow Charts
19-8
Define Continuous-Time Variables
Note: Do not explicitly define variables with the suffix _dot in a chart.
19-9
19 Continuous-Time Systems in Stateflow Charts
19-10
Model a Bouncing Ball in Continuous Time
You can specify how the ball falls freely under gravity with the following second-order
differential equation:
&&
p = -g
p describes the position of the ball as a function of time and g = 9.81 m / s2 , which is the
acceleration due to gravity.
A Stateflow chart requires that you specify system dynamics as first-order differential
equations. You can describe the dynamics of the free-falling ball in terms of position p
and velocity v with the following first-order differential equations.
Equation Description
p& = v Derivative of position is velocity
The bounce occurs after the ball hits the ground at position p <= 0. Now, you can model
the bounce by updating position and velocity as follows:
Reset position to 0.
Reset velocity to the negative of its value just before the ball hit the ground.
Multiply the new velocity by a coefficient of distribution (-0.8) that reduces the speed
just after the bounce.
19-11
19 Continuous-Time Systems in Stateflow Charts
1 Create an empty Stateflow chart and open its properties dialog box.
2 Set the update method to Continuous.
Task 2: Decide Whether to Enable Zero-Crossing Detection for the Bouncing Ball
For this example, enable zero-crossing detection (the default) so that the Simulink model
can determine exactly when the ball hits the ground at p <= 0. Otherwise, the Simulink
model might not be able to simulate the physics accurately. For example, the ball might
appear to descend below ground.
1 Define two continuous-time variables, p for position and v for velocity. For each
variable, follow these steps:
a In the Stateflow Editor, select Chart > Add Other Elements > Local Data.
b Enter the name for the local data.
c Set the update method to Continuous.
d Leave all other properties at their default values and click OK.
2 For each continuous local variable that you define, the chart implicitly creates its
time derivative as a variable of the same name with the suffix _dot. In this example,
the chart defines p_dot as the derivative of position p and v_dot as the derivative
of velocity v.
3 Define two outputs, p_out and v_out for exposing continuous state to the Simulink
model. For each variable, follow these steps:
a In the Stateflow Editor, select Chart > Add Inputs & Outputs > Data Output
To Simulink.
b Enter the name for the output data.
c Leave all other properties at their default values and click OK.
Your chart contains the following data, as viewed in the Model Explorer.
19-12
Model a Bouncing Ball in Continuous Time
For this example, you can use ode45 (Dormand-Prince), the default variable-step
solver used by Simulink models with continuous states.
1 Add a state named Falling with a default transition. In the default transition, set
initial position to 10 meters and initial velocity to 15 meters/second.
19-13
19 Continuous-Time Systems in Stateflow Charts
2 Add a during action to the Falling state that defines the derivatives of position
and velocity.
The derivative of position is velocity and the derivative of velocity is acceleration due
to gravity (-g).
19-14
Model a Bouncing Ball in Continuous Time
In the during action, assign position to the output p_out and assign velocity to the
output v_out.
19-15
19 Continuous-Time Systems in Stateflow Charts
19-16
Model a Bouncing Ball in Continuous Time
The ball appears to fall below the ground (below position p = 0) because the chart
does not yet include a check for the bounce.
19-17
19 Continuous-Time Systems in Stateflow Charts
The chart uses a self-loop transition so it can model the bounce as an instantaneous
mode change where the ball suddenly reverses direction rather than as a finite
time collision.
2 Add a condition on the transition that indicates when the ball hits the ground.
The condition must check for position p <= 0 and velocity v < 0.
19-18
Model a Bouncing Ball in Continuous Time
Physically, the ball hits the ground when position p is exactly zero. By relaxing
the condition, you increase the tolerance within which the Simulink model can
detect when the continuous variable changes sign (see How Blocks Work with Zero-
Crossing Detection (Simulink)).
The second check helps maintain the efficiency of the Simulink solver by minimizing
the frequency of zero crossings. Without the second check, the condition becomes
true immediately following the state transition, resulting in two successive zero
crossings.
3 When the ball hits the ground, reset position and velocity in a condition action.
19-19
19 Continuous-Time Systems in Stateflow Charts
4 Simulate the chart again. This time, the scope shows the expected bounce pattern.
19-20
Model a Bouncing Ball in Continuous Time
19-21
19 Continuous-Time Systems in Stateflow Charts
Simulink solver's guess for the number of minor intervals in a major time step
Number of iterations required to stabilize the integration loop or zero crossings loop
By minimizing side effects, a Stateflow chart can maintain its state at minor time steps
and, therefore, update state only during major time steps when mode changes occur.
Using this heuristic, a Stateflow chart can always compute outputs based on a constant
state for continuous time.
To help you correct semantic violations, a Stateflow chart generates informative errors.
In Stateflow charts, physical events cause state transitions. Therefore, write to local data
only in actions that execute during transitions:
State exit actions, which execute before leaving the state at the beginning of the
transition
19-22
Design Considerations for Continuous-Time Modeling in Stateflow Charts
In this example, the action {n++} executes even when conditions c2 and c3 are false.
In this case, n gets updated in a minor time step because there is no state transition.
Do not write to local continuous data in during actions because these actions execute in
minor time steps.
This rule applies to continuous-time charts because you cannot call functions during
minor time steps. You can call Simulink functions in state entry or exit actions and
transition actions. If you try to call Simulink functions in state during actions or
transition conditions, an error message appears when you simulate your model.
A Simulink model reads continuous-time derivatives during minor time steps. The only
part of a Stateflow chart that executes during minor time steps is the during action.
Therefore, compute derivatives in during actions to give your Simulink model the most
current calculation.
19-23
19 Continuous-Time Systems in Stateflow Charts
Do not read outputs and derivatives in state during actions or transition conditions
This restriction provides smooth outputs in a major time step by preventing a chart from
using values that might no longer be valid in the current minor time step. Instead, a
chart computes outputs from local discrete data, local continuous data, and chart inputs.
This restriction prevents mode changes from occurring between major time steps. When
placed in during actions, conditions that affect control flow must be governed by discrete
variables because they do not change between major time steps.
The presence of input events makes a chart behave like a triggered subsystem and
therefore unable to simulate in continuous time. For example, the following model
generates an error if the chart uses a continuous update method.
To model the equivalent of an input event, pass the input signal through a Hit Crossing
block as an input to the continuous chart, as in this example.
When a mode change occurs during continuous-time simulation, the entry action of
the destination state indicates to the Simulink model that a state transition occurred. If
inner transitions are taken, the entry action is never executed.
19-24
Design Considerations for Continuous-Time Modeling in Stateflow Charts
Do not use event-based temporal logic. Use only absolute-time temporal logic for
continuous-time simulation. See Operators for Absolute-Time Temporal Logic on page
11-63.
Event-based temporal logic has no meaning because there is no concept of a tick during a
continuous-time simulation.
To implement change detection, Stateflow software buffers variables in a way that affects
the behavior of charts between a minor time step and the next major time step.
If you load the SimState for a continuous-time chart, you cannot modify the activity
of states or any values of chart local or output data. Modifying the SimState of a
continuous-time chart is not supported. For more information, see Rules for Using the
SimState of a Chart on page 15-37.
More About
Model a Bouncing Ball in Continuous Time on page 19-11
Continuous-Time Modeling in Stateflow on page 19-2
19-25
20
Fixed-Point Numbers
Fixed-point numbers use integers and integer arithmetic to represent real numbers and
arithmetic with the following encoding scheme:
~
V = V = SQ + B
where
Q is the actual stored integer value used in representing the fixed-point number. If
a fixed-point number changes, its quantized integer, Q, changes but S and B remain
unchanged.
S is a coefficient of Q, or the slope.
B is an additive correction, or the bias.
20-2
What Is Fixed-Point Data?
Fixed-point numbers encode real quantities (for example, 15.375) using the stored
integer Q. You set the value of Q by solving the equation
~
V = SQ + B
For example, suppose you want to represent the number 15.375 in a fixed-point type with
the slope S = 0.5 and the bias B = 0.1. This means that
Q = round((15.375 0.1)/0.5) = 30
However, because Q is rounded to an integer, you lose some precision in representing the
number 15.375. If you calculate the number that Q actually represents, you now get a
slightly different answer.
~
V = V = SQ + B = 0 .5 30 + 0.1 = 15 .1
Using fixed-point numbers to represent real numbers with integers involves the loss of
some precision. However, if you choose S and B correctly, you can minimize this loss to
acceptable levels.
Fixed-Point Operations
~
Now that you can express fixed-point numbers as V = SQ + B, you can define operations
between two fixed-point numbers.
where a, b, and c are all fixed-point numbers, and <op> refers to a binary operation:
addition, subtraction, multiplication, or division.
The general form for a fixed-point number x is SxQx + Bx (see Fixed-Point Numbers
on page 20-2). Substituting this form for the result and operands in the preceding
equation yields this expression:
(ScQc + Bc) = (SaQa + Ba) <op> (SbQb + Bb)
20-3
20 Fixed-Point Data in Stateflow Charts
The values for Sc and Bc are chosen by Stateflow software for each operation (see
Promotion Rules for Fixed-Point Operations on page 20-25) and are based on the
values for Sa, Sb, Ba and Bb that you enter for each fixed-point data (see Specify Fixed-
Point Data on page 20-6).
Note: You can be more precise in choosing the values for Sc and Bc when you use the :=
assignment operator (that is, c := a <op> b). See Assignment (=, :=) Operations on
page 20-30.
Using the values for Sa, Sb, Sc, Ba, Bb, and Bc, you can solve the preceding equation for Qc
for each binary operation as follows:
The fixed-point approximations of the real number result of the operation c = a <op>
b are given by the preceding solutions for the value Qc. In this way, all fixed-point
operations are performed using only the stored integer Q for each fixed-point number and
integer operation.
20-4
How Fixed-Point Data Works in Stateflow Charts
Stateflow software defines a fixed-point data type from values that you specify.
You specify values for S, B, and the base integer type for Q. The available base types
for Q are the unsigned integer types uint8, uint16, and uint32, and the signed
integer types int8, int16, and int32. For specific instructions on how to enter fixed-
point data, see Specify Fixed-Point Data on page 20-6.
This is the only part of a fixed-point number that varies in value. The quantities S
and B are constant and appear only as literal numbers or expressions in generated
code.
The slope, S, is factored into an integer power of two, E, and a coefficient, F, such that
S = F 2E and 1 F < 2.
The powers of 2 are implemented as bit shifts, which are more efficient than multiply
instructions. Setting F = 1 avoids the computationally expensive multiply instructions
20-5
20 Fixed-Point Data in Stateflow Charts
for values of F > 1. This binary-point-only scaling is implemented with bit shifts only
and is recommended.
Operations for fixed-point types are implemented with solutions for the quantized
integer as described in Fixed-Point Operations on page 20-3.
To generate efficient code, the fixed-point promotion rules choose values for Sc and
Bc that conveniently cancel out difficult terms in the solutions. See Addition (+) and
Subtraction (-) on page 20-28 and Multiplication (*) and Division (/) on page
20-28.
You can use a special assignment operator (:=) and context-sensitive constants
to maintain as much precision as possible in your fixed-point operations. See
Assignment (=, :=) Operations on page 20-30 and Fixed-Point Context-Sensitive
Constants on page 20-7.
Any remaining numbers, such as the fractional slope, F, that cannot be expressed as a
pure integer or a power of 2, are converted into fixed-point numbers.
1 Add data to your chart, as described in Add Data from the Stateflow Editor on page
8-2.
Doing so adds a default definition of the new data object to the Stateflow hierarchy,
and the Data properties dialog box appears.
2
Click the Show data type assistant button to display the Data Type
Assistant.
3 In the Mode field of the Data Type Assistant, select Fixed point.
4 Specify the fixed-point data properties as described in Fixed-Point Data Properties
on page 8-11.
20-6
How Fixed-Point Data Works in Stateflow Charts
5 Specify the name, size, and other properties for the new data object as described in
Set Data Properties on page 8-6.
Note: You can also specify a fixed-point constant indirectly in action statements by using
a fixed-point context-sensitive constant. See Fixed-Point Context-Sensitive Constants
on page 20-7.
Input
Output
Parameter
Data Store Memory
For other Stateflow data, word length can be any integer between 0 and 32.
You can explicitly pass chart-level data with word lengths up to 128 bits as inputs and
outputs of the following functions:
MATLAB functions
Simulink functions
Truth table functions that use MATLAB action language
If any type in the context is a double, then the context-sensitive constant is cast to
type double.
20-7
20 Fixed-Point Data in Stateflow Charts
While you can use fixed-point context-sensitive constants in context with any types (for
example, int32 or double), their main use is with fixed-point numbers. The algorithm
that computes the type to assign to a fixed-point context-sensitive constant depends on
these factors:
The operator
The data types in the context
The value of the constant
The algorithm computes a type that provides maximum accuracy without overflow.
Using double- or single-precision floating-point numbers does not limit the range
or precision of your computations. You need this while you are building your
application.
2 Once your application works well, start substituting fixed-point data for double-
precision data during the simulation phase, as follows:
a Set the integer word size for the simulation environment to the integer size of
the intended target environment.
20-8
How Fixed-Point Data Works in Stateflow Charts
Stateflow generated code uses this integer size to select result types for your
fixed-point operations. See Set the Integer Word Size for a Target on page
20-26.
b Add the suffix C to literal numeric constants.
This suffix casts a literal numeric constant in the type of its context. For
example, if x is fixed-point data, the expression y = x/3.2C first converts
the numerical constant 3.2 to the fixed-point type of x and then performs the
division with a fixed-point result. See Fixed-Point Context-Sensitive Constants
on page 20-7 for more information.
See Detect Overflow for Fixed-Point Types on page 20-10 for instructions on
how to set overflow detection in simulation.
4 If you encounter overflow errors in fixed-point data, you can do one of the following
to add range to your data.
For example, change the base type for Q from int16 to int32.
Increase the range of your fixed-point data by increasing the power of 2 value, E.
For example, you can increase E from 2 to 1. This action decreases the
available precision in your fixed-point data.
5 If you encounter problems with model behavior stemming from inadequate precision
in your fixed-point data, you can do one of the following to add precision to your data:
Increase the precision of your fixed-point data by decreasing the value of the
power of 2 binary point E.
For example, you can decrease E from 2 to 3. This action decreases the
available range in your fixed-point data.
If you decrease the value of E, you can prevent overflow by increasing the number
of bits in the base data type for Q.
20-9
20 Fixed-Point Data in Stateflow Charts
For example, you can change the base type for Q from int16 to int32.
6 If you cannot avoid overflow for lack of precision, try using the := assignment
operator in place of the = operator for assigning the results of multiplication and
division operations.
You can use the := operator to increase the range and precision of the result of
fixed-point multiplication and division operations at the expense of computational
efficiency. See Assignment Operator := on page 20-31.
Define identically in both Stateflow charts and Simulink models the data that you
input from or output to Simulink blocks.
The values that you enter for the Stored Integer and Scaling fields in the shared
data's properties dialog box in a Stateflow chart (see Specify Fixed-Point Data on
page 20-6) must match similar fields that you enter for fixed-point data in a
Simulink model. See Use Fixed-Point Chart Inputs on page 20-12 for an example
of this method of sharing input data from a Simulink model using a Gateway In block.
For some Simulink blocks, you can specify the type of input or output data directly.
For example, you can set fixed-point output data directly in the block dialog box of the
Constant block by using the Output data type parameter.
Define the data as Input or Output in the Data properties dialog box in the
Stateflow chart and instruct the sending or receiving block in the Simulink model to
inherit its type from the chart data.
Many blocks allow you to set their data types and scaling through inheritance from
the driving block, or through back propagation from the next block. You can set the
20-10
How Fixed-Point Data Works in Stateflow Charts
data type of a Simulink block to match the data type of the Stateflow port to which it
connects.
For example, you can set the Constant block to inherit its type from the Stateflow
Input to Simulink port that it supplies. To do so, select Inherit via back
propagation for the Output data type parameter in the block dialog box.
20-11
20 Fixed-Point Data in Stateflow Charts
In this section...
Run the Fixed-Point "Bang-Bang Control" Model on page 20-12
Explore the Fixed-Point "Bang-Bang Control" Model on page 20-13
20-12
Use Fixed-Point Chart Inputs
20-13
20 Fixed-Point Data in Stateflow Charts
The Boiler Plant model subsystem simulates the temperature reaction of the boiler
to periods of heating or cooling dictated by the Stateflow block. Depending on the
Boolean value coming from the Controller, a temperature increment (+1 for heating,
0.1 for cooling) is added to the previous boiler temperature. The resulting boiler
temperature is sent to the digital thermometer subsystem block.
2 In the Boiler Plant model subsystem, double-click the digital thermometer
subsystem block.
sensor Block
The sensor block converts input boiler temperature (T) to an intermediate analog voltage
output V with a first-order polynomial that gives this output:
V = 0.05 T + 0.75
ADC Block
20-14
Use Fixed-Point Chart Inputs
The ADC subsystem digitizes the analog voltage from the sensor block by multiplying the
analog voltage by 256/5, rounding it to its integer floor, and limiting it to a maximum of
255 (the largest unsigned 8-bit integer value). Using the value for the output V from the
sensor block, the new digital coded temperature output by the ADC block, Tdigital, is given
by this equation:
Tdigital = (256/5) V = (256 0.05/5) T + (256/5) 0.75
The Linear fixed point conversion block informs the rest of the model that Tdigital is a
fixed-point number with a slope value of 5/256/0.05 and an intercept value of 0.75/0.05.
The Stateflow block Bang-Bang Controller receives this output and interprets it as a
fixed-point number through the Stateflow data temp, which is scoped as Input from
Simulink and set as an unsigned 8-bit fixed-point data with the same values for S and B
set in the Linear fixed point conversion block.
The values for S and B are determined from the general expression for a fixed-point
number:
V = SQ + B
Therefore,
Q = (V B)/S = (1/S) V + (1/S) B
Since Tdigital is now a fixed-point number, it is now the quantized integer Q of a fixed-
point type. This means that Tdigital = Q of its fixed-point type, which gives this relation:
(1/S) V + (1/S) B = (256 0.05/5) T + (256/5) 0.75
Since T is the real-world value for the environment temperature, the above equation
implies these relations:
V=T
and
1/S = (256 0.05)/5
S = 5/(256 0.05) = 0.390625
and
20-15
20 Fixed-Point Data in Stateflow Charts
By setting Tdigital to be a fixed-point data as the output of the Linear fixed point
conversion block and the input of the Stateflow block Bang-Bang Controller, the
Stateflow chart interprets and processes this data automatically in an 8-bit environment
with no need for any explicit conversions.
20-16
Use Fixed-Point Parameters and Local Data
In this section...
Goal of the Tutorial on page 20-17
Build the Fixed-Point Butterworth Filter on page 20-17
Define the Model Callback Function on page 20-18
Add Other Blocks to the Model on page 20-19
Set Model Configuration Parameters on page 20-21
Run the Model on page 20-21
1 At the MATLAB prompt, type sfnew to create a new model with an empty chart.
2 In your chart, add a flow chart with a single branch:
20-17
20 Fixed-Point Data in Stateflow Charts
The values b0, b1, and a1 are the coefficients of the low-pass Butterworth filter.
For more information about the filter coefficients, see Define the Model Callback
Function on page 20-18.
3 Add the following data to your chart:
Data Name Scope Type
x Input Inherit:Same as
Simulink
y Output fixdt(1,16,10)
x_n1 Local fixdt(1,16,12)
y_n1 Local fixdt(1,16,10)
b0 Parameter fixdt(1,16,15)
b1 Parameter fixdt(1,16,15)
a1 Parameter fixdt(1,16,15)
4 Save your model.
1 Open the Model Properties dialog box by selecting File > Model Properties >
Model Properties in the model window.
2 In the Callbacks tab, select PreLoadFcn.
3 Enter the following MATLAB code for the preload function:
Fs = 1000;
20-18
Use Fixed-Point Parameters and Local Data
Fc = 50;
[B,A] = butter(1,2*pi*Fc/(Fs/2));
b0 = B(1);
b1 = B(2);
a1 = A(2);
In the code:
Parameter Setting
Sine type Time based
Time Use simulation time
Amplitude 1
Bias 0
Frequency 2*pi*Fc
Phase 0
Sample time 1/Fs
Interpret vector parameters as 1-D On
20-19
20 Fixed-Point Data in Stateflow Charts
The Sine Wave block provides the signal that you want to filter using the Stateflow
chart. This block outputs a floating-point signal.
3 From the Simulink/Signal Attributes library, add a Data Type Conversion block with
the following parameter settings to the model:
Parameter Setting
Output minimum []
Output maximum []
Output data type fixdt(1,16,14)
Lock output data type setting Off
against changes by the fixed-point
tools
Input and output to have equal Real World Value (RWV)
Integer rounding mode Floor
Saturate on integer overflow Off
Sample time -1
The Data Type Conversion block converts the floating-point signal from the Sine
Wave block to a fixed-point signal. By converting the signal to a fixed-point type, the
model can simulate using less memory.
4 From the Simulink/Sinks library, add a Scope block to the model.
5 Connect and label the blocks as follows:
20-20
Use Fixed-Point Parameters and Local Data
Parameter Setting
Stop time 0.1
Type Fixed-step
Solver discrete (no continuous states)
Fixed-step size (fundamental sample 1/Fs
time)
Because none of the blocks in your model have a continuous sample time, a discrete
solver is appropriate. For more information, see Solver Pane (Simulink).
3 Click OK to close the dialog box.
4 Save and close your model.
20-21
20 Fixed-Point Data in Stateflow Charts
The top signal shows the fixed-point version of the sine wave input to the chart. The
bottom signal corresponds to the filtered output from the chart. The filter removes high-
frequency values from the signal but allows low-frequency values to pass through the
chart unchanged.
20-22
Operations with Fixed-Point Data
These binary operations work with fixed-point operands in the following order of
precedence (0 = highest, 8 = lowest). For operations with equal precedence, they evaluate
in order from left to right:
20-23
20 Fixed-Point Data in Stateflow Charts
Bitwise AND
Bitwise OR
Example Description
~a Unary minus
!a Logical NOT
a++ Increment
a-- Decrement
20-24
Operations with Fixed-Point Data
Assignment Operations
Example Description
a = expression Simple assignment
a := expression See Assignment Operator := on page 20-31.
a += expression Equivalent to a = a + expression
a -= expression Equivalent to a = a - expression
a *= expression Equivalent to a = a * expression
a /= expression Equivalent to a = a / expression
a |= expression Equivalent to a = a | expression (bit operation).
See operation a | b in Binary Operations on page
20-23.
a &= expression Equivalent to a = a & expression (bit operation).
See operation a & b in Binary Operations on page
20-23.
The rules for selecting the numeric types used to hold the results of operations with a
fixed-point number are called fixed-point promotion rules. The goal of these rules is to
maintain computational efficiency and usability.
Note: You can use the := assignment operator to override the fixed-point promotion rules
and obtain greater accuracy. However, in this case, greater accuracy can require more
computational steps. See Assignment Operator := on page 20-31.
The following topics describe the process of selecting an intermediate result type for
binary operations with at least one fixed-point operand.
20-25
20 Fixed-Point Data in Stateflow Charts
The type int is the integer word size for C on a given platform. Result word size is
increased to the integer word size because processors can perform operations at this size
efficiently.
To maintain consistency with the C language, this default rule applies to assigning the
number of bits for the result type of an operation with fixed-point numbers:
When both operands are fixed-point numbers, the number of bits in the result type is the
maximum number of bits in the input types or the number of bits in the integer word size
for the target machine, whichever is larger.
Note: The preceding rule is a default rule for selecting the bit size of the result for
operations with fixed-point numbers. This rule is overruled for specific operations as
described in the sections that follow.
The preceding default rule for selecting the bit size of the result for operations with fixed-
point numbers relies on the definition of the integer word size for your target. You can set
the integer word size for the targets that you build in Simulink models with these steps:
The right panel displays configuration parameters for production hardware and test
hardware.
3 To set integer word size for production hardware, follow these steps:
In the drop-down menu for the Device type field, select Custom.
In the int field, enter a word size in bits.
4 To set integer word size for test hardware, follow these steps:
20-26
Operations with Fixed-Point Data
In the drop-down menu for the Device type field, select Custom.
In the int field, enter a word size in bits.
5 Click OK to accept the changes.
When you build any target after making this change, the generated code uses this integer
size to select result types for your fixed-point operations.
Note: Set all available integer sizes because they affect code generation. The integer sizes
do not affect the implementation of the fixed-point promotion rules in generated code.
Unary Promotions
Only the unary minus (-) operation requires a promotion of its result type. The word size
of the result is given by the default procedure for selecting the bit size of the result type
for an operation involving fixed-point data. See Default Selection of the Number of Bits
of the Result Type on page 20-26. The bias, B, of the result type is the negative of the
bias of the operand.
Integers as operands in binary operations with fixed-point numbers are treated as fixed-
point numbers of the same word size with slope, S, equal to 1, and a bias, B, equal to 0.
The operation now becomes a binary operation between two fixed-point operands. See
Binary Operation Promotion for Two Fixed-Point Operands on page 20-28.
When one operand is of type double in a binary operation with a fixed-point type, the
result type is double. In this case, the fixed-point operand is cast to type double, and
the operation is performed.
When one operand is of type single in a binary operation with a fixed-point type, the
result type is single. In this case, the fixed-point operand is cast to type single, and
the operation is performed.
20-27
20 Fixed-Point Data in Stateflow Charts
The output type for addition and subtraction is chosen so that the maximum positive
range of either input can be represented in the output while preserving maximum
precision. The base word type of the output follows the rule in Default Selection of
the Number of Bits of the Result Type on page 20-26. To simplify calculations and
yield efficient code, the biases of the two inputs are added for an addition operation and
subtracted for a subtraction operation.
Note: Mixing signed and unsigned operands can yield unexpected results and is not
recommended.
The output type for multiplication and division is chosen to yield the most efficient
code implementation. You cannot use nonzero biases for multiplication and division in
Stateflow charts (see note).
The slope for the result type of the product of the multiplication of two fixed-point
numbers is the product of the slopes of the operands. Similarly, the slope of the result
type of the quotient of the division of two fixed-point numbers is the quotient of the
slopes. The base word type is chosen to conform to the rule in Default Selection of the
Number of Bits of the Result Type on page 20-26.
Note: Because nonzero biases are computationally very expensive, those biases are not
supported for multiplication and division.
20-28
Operations with Fixed-Point Data
Relational Operations (>, <, >=, <=, ==, -=, !=, <>)
You can use the following relational (comparison) operations on all fixed-point types:
>, <, >=, <=, ==, -=, !=, <>. See Supported Operations with Fixed-Point Operands on
page 20-23 for an example and description of these operations. Both operands in a
comparison must have equal biases (see note).
Comparing fixed-point values of different types can yield unexpected results because
each operand must convert to a common type for comparison. Because of rounding or
overflow errors during the conversion, values that do not appear equal might be equal
and values that appear to be equal might not be equal.
For example, compare these two unsigned 8-bit fixed-point numbers, a and b, in an 8-bit
target environment:
By rule, the result type for comparison is 8-bit. Converting b, the least precise operand,
to the type of a, the most precise operand, could result in overflow. Consequently,
a is converted to the type of b. Because the bias values for both operands are 0, the
conversion occurs as follows:
Sb (newQa) = SaQa
newQa = (SaSb) Qa = (24/22) 701 = 701/4 = 175
Although they represent different values, a and b are considered equal as fixed-point
numbers.
Logical Operations (&, |, &&, ||)
20-29
20 Fixed-Point Data in Stateflow Charts
(a != 0.0C) && b
The preceding operation is not a check to see whether the quantized integer for a, Qa, is
not 0. If the real-world value for a fixed-point number a is 0, this implies that Va = SaQa +
Ba = 0.0. Therefore, the expression a != 0, for fixed-point number a, is equivalent to this
expression:
Qa ! = Ba / Sa
For example, if a fixed-point number, a, has a slope of 22, and a bias of 5, the test a !=
0 is equivalent to the test if Qa ! = 20.
Assignment Operator =
An assignment statement of the type LHS = RHS is equivalent to casting the right-hand
side to the type of the left-hand side. You can use any assignment between fixed-point
types and therefore, implicitly, any cast.
A cast converts the stored integer Q from its original fixed-point type while preserving its
value as accurately as possible using the online conversions (see Fixed-Point Conversion
20-30
Operations with Fixed-Point Data
Operations on page 20-37). Assignments are most efficient when both types have the
same bias, and slopes that are equal or both powers of 2.
Assignment Operator :=
Ordinarily, the fixed-point promotion rules determine the result type for an operation.
Using the := assignment operator overrides this behavior by using the type of the LHS as
the result type of the RHS operation.
Use the := assignment operator instead of the = assignment operator in these cases:
Caution Using the := assignment operator to produce a more accurate result can generate
code that is less efficient than the code you generate using the normal fixed-point
promotion rules.
This model contains a Stateflow chart with two inputs and eight outputs.
20-31
20 Fixed-Point Data in Stateflow Charts
The chart contains a graphical function that compares the use of the = and := assignment
operators.
If you generate code for this model, you see code similar to this.
20-32
Operations with Fixed-Point Data
...
The inputs x1 and x2 are signed 16-bit integers with 3 fraction bits. For addition and
subtraction, the outputs are signed 32-bit integers with 3 fraction bits.
Assume that the integer word size for production targets is 16 bits. To learn how to
change the integer word size for a target, see Set the Integer Word Size for a Target on
page 20-26.
Because the target int size is 16 bits, you can avoid overflow by using the := operator
instead of the = operator. For example, assume that the inputs have these values:
x1 = 215 1
x2 = 1
20-33
20 Fixed-Point Data in Stateflow Charts
Similarly, you can avoid overflow for subtraction if you use the := operator instead of the
= operator.
The following example contrasts the := and = assignment operators for multiplication.
You can use the := operator to avoid overflow in the multiplication c = a * b, where a
and b are two fixed-point operands. The operands and result for this operation are 16-bit
unsigned integers with these assignments:
where S is the slope, B is the bias, V is the real-world value, and Q is the quantized
integer.
c = a*b
In this case, first calculate an intermediate result for a*b in the fixed-point type given by
the rules in the section Fixed-Point Operations on page 20-3. Then cast that result to
the type for c.
20-34
Operations with Fixed-Point Data
Because the maximum value of a 16-bit unsigned integer is 216 1 = 65535, the preceding
result overflows its word size. An operation that overflows its type produces an undefined
result.
You can capture overflow errors like the preceding example during simulation. See
Detect Overflow for Fixed-Point Types on page 20-10.
c := a*b
In this case, calculate a*b directly in the type of c. Use the solution for Qc given in
Fixed-Point Operations on page 20-3 with the requirement of zero bias, which occurs as
follows:
No overflow occurs in this case, and the approximate real-world value is as follows:
~
V c = ScQc = 2-5 9892 = 9892 / 32 = 309.125
The following example contrasts the := and = assignment operators for division. You
can use the := operator to obtain a more precise result for the division of two fixed-point
operands, a and b, in the statement c := a/b.
This example uses the following fixed-point numbers, where S is the slope, B is the bias,
V is the real-world value, and Q is the quantized integer:
20-35
20 Fixed-Point Data in Stateflow Charts
c = a/b
In this case, first calculate an intermediate result for a/b in the fixed-point type given by
the rules in the section Fixed-Point Operations on page 20-3. Then cast that result to
the type for c.
Qiv = Qa / Qb = 32 / 24 = 1
The intermediate value is then cast to the result type for c as follows:
ScQc = SivQiv
Qc = (Siv / Sc) Qiv
The calculation for slope of the intermediate value for a division operation occurs as
follows:
Siv = Sa / Sb = 2 -4 / 2 -3 = 2-1
Substitution of this value into the preceding result yields the final result.
Qc = 2-1 / 2 -6 = 25 = 32
~
In this case, the approximate real-world value is V c = 32 / 64 = 0 .5 , which is not a very
good approximation of the actual result of 2/3.
c := a/b
In this case, calculate a/b directly in the type of c. Use the solution for Qc given in
Fixed-Point Operations on page 20-3 with the simplification of zero bias, which is as
follows:
Qc = ( Sa Qa ) / ( Sc ( SbQb )) = ( Sa / ( Sb Sc )) ( Qa / Qb ) = (2 -4 / (2 -3 2 -6 )) ( 32 / 24 ) = 42
~
V c = 42 / 64 = 0 .6563
20-36
Operations with Fixed-Point Data
In a := assignment operation, the type of the left-hand side (LHS) determines part of the
context used for inferring the type of a right-hand side (RHS) context-sensitive constant.
These rules apply to RHS context-sensitive constants in assignments with the := operator:
If the LHS is a floating-point data (type double or single) , the RHS context-sensitive
constant becomes a floating-point constant.
For addition and subtraction, the type of the LHS determines the type of the context-
sensitive constant on the RHS.
For multiplication and division, the type of the context-sensitive constant is chosen
independently of the LHS.
Offline conversions are performed during code generation and are designed to maximize
accuracy. These conversions round the resulting quantized integer to its nearest integer
value. If the conversion overflows, the result saturates the value for Q.
Online conversions are performed for casting operations that take place during execution
of the application. Designed to maximize computational efficiency, they are faster and
more efficient than offline conversions, but less precise. Instead of rounding Q to its
nearest integer, online conversions round to the floor (with the exception of division,
20-37
20 Fixed-Point Data in Stateflow Charts
which can round to 0, depending on the C compiler you have). If the conversion overflows
the type to which you convert, the result is undefined.
The following examples show the difference in the results of offline and online
conversions of real numbers to a fixed-point type defined by a 16-bit word size, a slope (S)
equal to 24, and a bias (B) equal to 0:
20-38
21
Note: Continuous-time variables of complex type are not supported. For more
information, see Define Continuous-Time Variables on page 19-9.
Charts
21-2
How Complex Data Works in C Charts
Subcharts
States
Functions
Complex vectors
Complex matrices
State actions
Transition actions
MATLAB functions (see MATLAB Functions in a Chart on page 26-2)
Truth table functions (see What Is a Truth Table? on page 25-2)
Graphical functions (see Reuse Logic Patterns Using Graphical Functions on page
7-32)
Change detection operators (see Detect Changes in Data Values on page 11-74)
For more information, see Complex Data Operations for Charts That Support C
Expressions on page 21-7 and Rules for Using Complex Data in C Charts on page
21-12.
21-3
21 Complex Data in C Charts
Chart > Add Inputs & Outputs > Data Input From Simulink
Chart > Add Inputs & Outputs > Data Output To Simulink
Chart > Add Other Elements > Local Data
A default definition of the new data object appears in the Stateflow hierarchy, and
the Data properties dialog box appears.
21-4
Define Complex Data Using the Editor
21-5
21 Complex Data in C Charts
3 Specify the name, size, base type, and other properties for the new data object as
described in Set Data Properties on page 8-6.
Note: Complex data does not support the base types ml, struct, and boolean. See
Built-In Data Types on page 8-39 for more information.
4 Click OK.
21-6
Complex Data Operations for Charts That Support C Expressions
Binary Operations
These binary operations work with complex operands in the following order of precedence
(1 = highest, 3 = lowest). For operations with equal precedence, they evaluate in order
from left to right.
C charts do not support division of complex operands because this operation requires a
numerically stable implementation, especially when the base type of the complex data is
fixed-point.
Example Description
~a Unary minus
!a Logical NOT
21-7
21 Complex Data in C Charts
Example Description
a++ Increment
a-- Decrement
Assignment Operations
These assignment operations work with complex operands.
Example Description
a = expression Simple assignment
a += expression Equivalent to a = a + expression
a -= expression Equivalent to a = a - expression
a *= expression Equivalent to a = a * expression
21-8
Define Complex Data Using Operators
complex Operator
Syntax
complex(realExp, imagExp)
where realExp and imagExp are arguments that define the real and imaginary parts of
a complex number, respectively. The two arguments must be real values or expressions
that evaluate to real values, where the numeric types of both arguments are identical.
Description
The complex operator returns a complex number based on the input arguments.
Example
complex(3.24*pi, -9.99)
21-9
21 Complex Data in C Charts
real Operator
Syntax
real(compExp)
The real operator returns the value of the real part of a complex number.
Note: If the input argument is a purely imaginary number, the real operator returns a
value of 0.
Example
real(frame(200))
If the expression frame(200) evaluates to the complex number 8.23 + 4.56i, the
real operator returns a value of 8.2300.
imag Operator
Syntax
imag(compExp)
The imag operator returns the value of the imaginary part of a complex number.
Note: If the input argument is a real number, the imag operator returns a value of 0.
Example
imag(frame(200))
If the expression frame(200) evaluates to the complex number 8.23 + 4.56i, the
imag operator returns a value of 4.5600.
21-10
Define Complex Data Using Operators
21-11
21 Complex Data in C Charts
C charts do not support complex number notation (a + bi), where a and b are real
numbers. Therefore, you cannot use complex number notation in state actions, transition
conditions and actions, or any statements in C charts.
To define a complex number, use the complex operator described in Define Complex
Data Using Operators on page 21-9.
Math operations such as sin, cos, min, max, and abs do not work with complex data in
C charts. However, you can use MATLAB functions for these operations.
For more information, see Perform Math Function Operations with a MATLAB
Function on page 21-15.
Mix complex and real operands only for addition, subtraction, and multiplication
If you mix operands for any other math operations in C charts, an error appears when
you try to simulate your model.
To mix complex and real operands for division, you can use a MATLAB function as
described in Perform Complex Division with a MATLAB Function on page 21-16.
Tip: Another way to mix operands for division is to use the complex, real, and imag
operators in C charts.
Suppose that you want to calculate y = x1/x2, where x1 is complex and x2 is real. You
can rewrite this calculation as:
y = complex(real(x1)/x2, imag(x1)/x2)
For more information, see Define Complex Data Using Operators on page 21-9.
21-12
Rules for Using Complex Data in C Charts
If you define complex data with Constant scope, an error appears when you try to
simulate your model.
Do not define complex data with ml, struct, or boolean base type
If you define complex data with ml, struct, or boolean base type, an error appears
when you try to simulate your model.
When you define the initial value for data that is complex, use only a real value. See Set
Properties in the Description Pane on page 8-20 for instructions on setting an initial
value in the Data properties dialog box.
In the Data properties dialog box, do not enter any values in the Minimum or
Maximum field when you define complex data. If you enter a value in either field, an
error message appears when you try to simulate your model.
If you assign complex values to real data types, an error appears when you try to
simulate your model.
Note: You can assign both real and complex values to complex data types.
Graphical functions
Truth table functions
MATLAB functions
Simulink functions
If your C chart passes real values to function inputs of complex type, an error appears
when you try to simulate your model.
21-13
21 Complex Data in C Charts
You cannot use complex data as an argument for temporal logic operators, because you
cannot define time as a complex number.
21-14
Best Practices for Using Complex Data in C Charts
A Simple Example
In the following chart, a MATLAB function calculates the absolute value of a complex
number:
The value of comp_num is 1+2i. Calculating the absolute value gives an answer of
2.2361.
Suppose that you want to find the absolute value of a complex number. Follow these
steps:
21-15
21 Complex Data in C Charts
y = myabs(u)
2 Double-click the function box to open the editor.
3 In the editor, enter the code below:
function y = myabs(u)
%#codegen
y = abs(u);
The function myabs takes a complex input u and returns the absolute value as an
output y.
4 Configure the input argument u to accept complex values.
You cannot pass real values to function inputs of complex type. For details, see Rules for
Using Complex Data in C Charts on page 21-12.
A Simple Example
In the following chart, a MATLAB function performs division on two complex operands:
21-16
Best Practices for Using Complex Data in C Charts
The values of comp_num and comp_den are 1+2i and 3+4i, respectively. Dividing these
values gives an answer of 0.44+0.08i.
The function mydiv takes two complex inputs, u1 and u2, and returns the complex
quotient of the two numbers as an output y.
4 Configure the input and output arguments to accept complex values.
i In the Contents pane of the Model Explorer, right-click the argument and
select Properties from the context menu.
21-17
21 Complex Data in C Charts
ii In the Data properties dialog box, select On in the Complexity field and
click OK.
You cannot pass real values to function inputs of complex type. For details, see Rules for
Using Complex Data in C Charts on page 21-12.
21-18
Detect Valid Transmission Data Using Frame Synchronization
Model Structure
The C chart contains the following states, transitions, and MATLAB functions.
21-19
21 Complex Data in C Charts
21-20
Detect Valid Transmission Data Using Frame Synchronization
The chart accepts a complex input signal I/Q. After synchronizing the data frame, the
chart stores the valid data in a complex output signal frame.
Complex multiplication
The output signal frame is a vector of complex products between each valid data
point and the phase angle of the carrier wave.
Indexing into a complex vector
The chart uses the temporalCount operator to index into the complex vector frame.
MATLAB functions with complex arguments
Simulation Results
The chart calculates the correlation between the input signal I/Q and the fixed data
pattern trainSig. You define trainSig by writing and running a MATLAB script
before you simulate the model.
If the correlation exceeds 50 percent, frame synchronization occurs. The chart stores
220 valid data points in the complex vector frame.
If the correlation stays below 50 percent after the chart has evaluated 300 data
points, the frame synchronization algorithm resets.
21-21
21 Complex Data in C Charts
21-22
Measure Frequency Response Using a Spectrum Analyzer
A spectrum analyzer is a tool that measures the frequency response (magnitude and
phase angle) of a physical system over a range of frequencies.
Model Structure
21-23
21 Complex Data in C Charts
Simulation Results
21-24
Measure Frequency Response Using a Spectrum Analyzer
To adjust the scope display, right-click inside the grid and select Autoscale from the
context menu.
In the magnitude plot, the sharp peak is the response of the Plant block to a resonant
frequency.
In the phase plot, the angle changes from 0 to radians (180 degrees). Each
complex pole in the Plant block adds /2 radians to the phase angle.
21-25
21 Complex Data in C Charts
This block is a masked chart that uses MATLAB as the action language. To access the
chart, right-click the Sinusoid Generator block and select Mask > Look Under Mask.
21-26
Measure Frequency Response Using a Spectrum Analyzer
21-27
21 Complex Data in C Charts
This chart unwraps the phase angle output of the Analyzer chart. Unwrapping means
preventing the phase angle from jumping more than radians or dropping more than
radians.
21-28
Measure Frequency Response Using a Spectrum Analyzer
If the phase angle jumps more than radians, the chart subtracts 2 radians from
the angle.
If the phase angle drops more than radians, the chart adds 2 radians to the
angle.
21-29
22
Events can be local to the Stateflow block or can be propagated to and from the Simulink
model and sources external to it. Data can be local to the Stateflow block or can be shared
with and passed to the Simulink model and to sources external to the Simulink model.
Messages can be local to the Stateflow block or can be passed through the Simulink to
other Stateflow blocks.
See Export Stateflow Functions for Reuse on page 7-34 for more details.
The MATLAB workspace
See Access Built-In MATLAB Functions and Workspace Data on page 11-38 for
more details.
Definitions in external code sources
22-2
Specify Chart Properties
Field Description
Name Stateflow chart name (read-only).
Machine Simulink subsystem name (read-only).
22-3
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Field Description
Mealy and Moore charts use a subset of Stateflow chart
semantics.
22-4
Specify Chart Properties
Field Description
User specified state/ To use explicit ordering of parallel states and transitions
transition execution (default), select this check box. In this mode, you have
order complete control of the order in which parallel states are
executed and transitions originating from a source are
tested for execution. For more information, see Execution
Order for Parallel States on page 3-78 and Transition
Testing Order in Multilevel State Hierarchy on page
3-69.
22-5
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Field Description
Use Strong Data Typing If selected, the chart accepts input signals of any data
with Simulink I/O type supported by Simulink software, provided that
the type of the input signal matches the type of the
corresponding chart input data item. If the types do not
match, an error occurs.
22-6
Specify Chart Properties
Field Description
Initialize Outputs Every Interprets the initial value of outputs every time a chart
Time Chart Wakes Up wakes up, not only at time 0. When you set an initial
value for an output data object, the output will be reset to
that value.
22-7
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Field Description
Behavior after too many If you enable super step semantics, specify how the
iterations chart behaves after reaching the maximum number of
transitions before taking all valid transitions. Options
include:
22-8
Specify Chart Properties
Field Description
States When Enabling If your chart uses function-call input events, specify
how states behave when the event reenables the chart.
Options include:
22-9
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Field Description
Description Textual description/comment.
1 In the Chart properties dialog box for a particular chart, select the Machine link at
the top of the dialog box.
Field Description
Simulink Model Name of the Simulink model that defines this
Stateflow machine (read-only). You change the model
name in the Simulink window when you save the
model under a chosen file name.
Creation Date Date on which this machine was created, which is
read-only.
Creator Name of the person who created this Stateflow
machine.
Modified Time of the most recent modification of this Stateflow
machine.
Version Version number of this Stateflow machine.
22-10
Specify Chart Properties
Field Description
Use C-like bit operations For C charts only. Select this check box for all new C
in new charts charts to interpret the following operators ( ~, &, |,
and ^) as C bitwise operators, not logical operators, in
action statements.
22-11
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Inherited
This method is the default update method. It causes input from the Simulink model to
determine when the chart wakes up during a simulation.
If you define input events for the chart, the Stateflow block is explicitly triggered
by a signal on its trigger port originating from a connected Simulink block. You can
set this trigger input event in the Model Explorer to occur in response to a Simulink
signal. The Simulink signal can be Rising, Falling, or Either (rising and falling), or
in response to a Function Call.
If you do not define input events, the Stateflow block implicitly inherits triggers from
the Simulink model. These implicit events are the discrete or continuous sample times
of the Simulink signals providing inputs to the chart. If you define data inputs, the
chart awakens at the rate of the fastest data input. If you do not define any data
input for the chart, the chart wakes up as defined by its parent subsystem's execution
behavior.
Discrete
The Simulink model awakens (samples) the Stateflow block at the rate that you
specify as the block's Sample Time property. An implicit event is generated at
regular time intervals corresponding to the specified rate. The sample time is in the
same units as the Simulink simulation time. Other blocks in the Simulink model can
have different sample times.
Continuous
The Stateflow chart updates its state during major time steps only, though it
computes outputs and local continuous variables during major and minor time steps.
The chart can register zero crossings, which allows Simulink models to sample
Stateflow charts whenever state changes occur. The Stateflow chart is also able to
compute derivatives for your local continuous variables.
22-12
Set Stateflow Block Update Method
More About
Activate a Stateflow Chart Using Input Events on page 9-9
Share Output Data with Simulink on page 8-23
Design Considerations for Continuous-Time Modeling in Stateflow Charts on page
19-22
22-13
22 Define Interfaces to Simulink Models and the MATLAB Workspace
The chart Update method (set in the Chart properties dialog box) is Discrete or
Inherited. (See Specify Chart Properties on page 22-3.)
The chart has an Input from Simulink event defined and an edge-trigger type
specified. (See Activate a Stateflow Chart Using Input Events on page 9-9.)
The Input from Simulink event has an Either edge-trigger type. If you define more
than one Input from Simulink event, the Simulink model determines the sample times
22-14
Implement Interfaces to Simulink Models
to be consistent with various rates of all the incoming signals. The outputs of a triggered
Stateflow block are held after the execution of the block.
Set the chart Update method (in the Chart properties dialog box) to Discrete and
enter a Sample Time value. (See Specify Chart Properties on page 22-3.)
Alternatively, add and define input data either in the Stateflow Editor by selecting
Chart > Add Inputs & Outputs > Data Input from Simulink or in the Model
Explorer. (See Share Output Data with Simulink on page 8-23.)
Simulink determines the chart sample time to be consistent with the rate of the incoming
data signal.
The Sample Time you set in the Chart properties dialog box takes precedence over the
sample time of any input data.
You specify a discrete sample rate to have Simulink trigger a Stateflow block that does
use an explicit trigger port. You can specify a sample time for the chart in the Chart
properties dialog box. Simulink then calls the Stateflow block at a defined, regular
sample time.
The outputs of a sampled Stateflow block are held after the execution of the block.
22-15
22 Define Interfaces to Simulink Models and the MATLAB Workspace
The chart Update method (set in the Chart properties dialog box) is Discrete or
Inherited. (See Specify Chart Properties on page 22-3)
The chart has an Input from Simulink data object defined using the Stateflow
Editor Add menu or the Model Explorer. (See Share Output Data with Simulink on
page 8-23.) Simulink determines the chart sample time to be consistent with the rate
of the incoming data signal.
Simulink can trigger a Stateflow block that does not use an explicit trigger port or a
specified discrete sample time. In this case, the Simulink calls the Stateflow block at a
sample time determined by the model.
In this example, the chart contains two Input from Simulink data objects. Simulink
determines the sample times to be consistent with the rates of both incoming signals.
The outputs of an inherited trigger Stateflow block are held after the execution of the
block.
22-16
Implement Interfaces to Simulink Models
1 In your chart, select Chart > Add Inputs & Outputs > Event Output To
Simulink.
The Event properties dialog box appears with a default name of event and a Scope
of Output to Simulink.
2 Set Trigger to Function Call.
3 Name the event appropriately and click OK to close the dialog box.
An output port with the name of the event you add appears on the right side of the
Stateflow block.
4 Connect the output port on the Stateflow block for the function-call output event to
the input trigger port of the subsystem.
Avoid placing any other blocks in the connection lines between the Stateflow block
and the function-call subsystem.
Note: You cannot connect a function-call output event from a chart to a Demux block
to trigger multiple subsystems.
5 To execute the function-call subsystem, include an event broadcast of the function-
call output event in the actions of the chart.
For examples of using function-call output events, see Activate a Simulink Block Using
Function Calls on page 9-28.
The chart has an Output to Simulink event with the trigger type set to Either. See
Activate a Simulink Block Using Output Events on page 9-20.
The Simulink block connected to the edge-triggered Output to Simulink event has
its own trigger type set to the equivalent edge trigger.
For examples of using edge-triggered output events, see Activate a Simulink Block
Using Edge Triggers on page 9-20.
22-17
22 Define Interfaces to Simulink Models and the MATLAB Workspace
As with other Simulink block libraries, you can specialize each instance of chart library
blocks in your model to use different data types, sample times, and other properties.
Library instances that inherit the same properties can reuse generated code.
For more information about Simulink block libraries, see Libraries (Simulink).
22-18
Create Specialized Chart Libraries for Large-Scale Modeling
Polymorphic logic is logic that can process data with different properties, such as
type, size, and complexity.
2 Configure the charts to inherit the properties you want to specialize.
For a list, see Properties You Can Specialize Across Instances of Library Blocks on
page 22-20.
3 Optionally, customize your charts using masking.
4 Simulate and debug your charts.
5 In Simulink, create a library model by selecting File > New > Library.
6 Copy or drag the charts into a library model.
For an example using MATLAB Function blocks, see Create Custom Block Libraries
(Simulink).
22-19
22 Define Interfaces to Simulink Models and the MATLAB Workspace
22-20
Limitations of Library Charts
22-21
22 Define Interfaces to Simulink Models and the MATLAB Workspace
To delete all the existing variables from the workspace, enter clear all at the
MATLAB command line. See the MATLAB documentation for more information.
You can access MATLAB data or MATLAB functions using the ml namespace
operator or the ml function.
See Access Built-In MATLAB Functions and Workspace Data on page 11-38 for
more information.
You can use the MATLAB workspace to initialize chart data at the beginning of a
simulation.
See Enter Expressions and Parameters for Data Properties on page 8-20.
You can save chart data to the workspace at the end of a simulation.
See Save Data to the MATLAB Workspace on page 8-26 for more information.
22-22
About Masks
About Masks
Creating a mask for Stateflow charts, state transition tables, and truth tables simplifies
using and sharing blocks. The mask encapsulates the block by hiding the underlying
logic and creates a user interface for the block. You can customize the block by:
You decide which parameters can be changed through the mask user interface. You can
provide meaningful descriptions of these parameters.
You cannot mask atomic subcharts, states, or any other objects within a chart. You can
only create masks on Stateflow object blocks you can access from the Simulink library:
charts, state transition tables, and truth tables. Masking a Stateflow block is the same as
masking other Simulink blocks.
More About
Block Masks (Simulink)
22-23
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Mask Parameters
When you create a mask for a Stateflow block, you can define a custom interface for block
parameters.
You provide access to the block parameters by defining corresponding parameters with
the same name in the Mask Editor. A user interface to these parameters is then provided
through a Mask Parameters dialog box.
The mask parameters appear as editable fields in the Mask Parameters dialog box.
Stateflow applies these values to the corresponding block parameters during simulation.
For example, in the sf_car model, double-click the shift_logic Stateflow block to see
the Mask Parameters dialog box.
This dialog box contains a parameter description Delay before gear change(tick)
and a box to edit the value. This value is tied to the parameter TWAIT inside the mask.
When you edit the value in this box, Stateflow assigns the new value to TWAIT during
simulation.
Before simulation begins, Simulink searches the mask workspace to find values for the
parameters. If parameters for the model are not defined in the mask, Simulink continues
searching the workspace hierarchy for the definitions and values.
22-24
Mask Parameters
You can create other types of user interfaces for the mask parameters, such as check
boxes, context menus, and option buttons.
More About
Mask Editor Overview (Simulink)
22-25
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Stateflow charts provide badges for looking inside a mask. The badge looks like a
downward facing arrow in the lower-left corner of the chart.
This badge does not appear on state transition tables and truth tables.
22-26
Mask a Stateflow Block
You can create masks for Stateflow charts in models. To see a chart already masked, look
at shift_logic in the sf_car model that ships with Stateflow.
Create Mask
To create a mask for the Stateflow chart in the model old_sf_car:
1 On the Icon & Ports pane, in the edit box under Icon Drawing commands type:
image('shift_logic.svg')
2 Click Apply.
The Mask Editor loads the image file shift_logic.svg to use as the masked block
icon. For more information, see Draw Mask Icon (Simulink).
Add a Parameter
The chart shift_logic has a parameter TWAIT that is already defined. To add TWAIT
as a parameter to the mask:
22-27
22 Define Interfaces to Simulink Models and the MATLAB Workspace
This text is the prompt for the new mask parameter in the Mask Parameters dialog
box.
4 Under Name, type "TWAIT".
This name defines the parameter in the mask. The name ties it to the underlying
block parameter with the same name, TWAIT.
5 Click Apply.
6 Click OK.
22-28
Mask a Stateflow Block
If you double-click the icon, the Mask Parameters dialog box opens. This dialog box
has the prompt for the parameter TWAIT. The value in the edit box is assigned to the
parameter TWAIT during simulation.
To see the logic in the shift_logic chart, click the Look inside mask badge on the
chart.
More About
Mask Editor Overview (Simulink)
22-29
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Stateflow can provide active state data through an output port to Simulink or as local
data to your chart. You can enable active state data for a Stateflow chart, state, state
transition table, or atomic subchart.
Enable active state data by selecting the Create output for monitoring check box in
the Properties dialog box of the Stateflow object. The enumerated data is created as scope
output by default. You can change the scope to local in the Model Explorer. For more
information, see Set Active State Data as Local on page 22-35.
22-30
About Active State Data
For self-activity of a chart or state, the data value is 1 when active and 0 when
inactive. For child and leaf state activity, the data is an enumerated type. Stateflow
can automatically define the enumeration or you can create the definition. For more
information about the enumeration type, see Define State Activity Enum Name and
Type on page 22-41.
For active state data of scope output, Stateflow creates an output port on the block in
Simulink.
In this example, leaf state activity is enabled for the chart. The leaf states are A1, A2,
and B. State B is treated as a leaf state because it has parallel decomposition. The
substates B1 and B2 are active at the same time.
22-31
22 Define Interfaces to Simulink Models and the MATLAB Workspace
22-32
About Active State Data
The active state output data connected to a scope shows the enumerated values for the
leaf states A1, A2, and B.
Related Examples
Use Active State Output Data on page 22-37
22-33
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Using active state data output can simplify the design in some Stateflow charts. You do
not have to update data used to track state activity.
Related Examples
Use Active State Output Data on page 22-37
22-34
Set Active State Data as Local
1 In the Properties dialog box, select the check box Create output for monitoring.
2 Type the name in the Data Name field.
3 In the Symbols window, select the type of the data.
4 Change the scope to Local.
You can specify information for code generation by binding the local active state data to a
Simulink.Signal object. Modify the properties in CoderInfo.
See Also
Simulink.Signal (Simulink) | Simulink.CoderInfo (Simulink)
More About
About Active State Data on page 22-30
Define State Activity Enum Name and Type on page 22-41
Resolve Data Properties from Simulink Signal Objects on page 8-59
22-35
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Do not enable child output for states that have no children. Doing so results in an error
at compilation and run time.
Note: Do not set the chart property Initialize Outputs Every Time Chart Wakes Up
on charts that use output. The behavior is unpredictable.
More About
About Active State Data on page 22-30
Use Active State Output Data on page 22-37
22-36
Use Active State Output Data
Here is a version of the gear_state state in the Stateflow chart shift_logic that does
not use active state data.
The output variable gear has an assignment in each state. The assignment tracks which
state, first, second, third, or fourth is active in gear_state.
The following steps show how to enable and use active state output data to simplify the
design:
1 Delete the entry: assignments to the output data variable gear for each state in
gear_state.
2 In the Symbols window, right-click the output variable gear and select Delete.
3 Right-click inside the state gear_state, and view the Property Inspector.
4 Select the check box for Create output for monitoring.
5 Type the name gear next to Data name.
6 Type the name gearType next to Enum name.
Stateflow now automatically creates the output port, gear, on the shift_logic chart.
The output of gear is an enumerated type automatically managed by Stateflow. You can
view the output of gear on a scope. The names of the enumerated type match the names
of the states in gear_state, with the addition of None to indicate no active child.
22-37
22 Define Interfaces to Simulink Models and the MATLAB Workspace
Explicitly assigning the value of gear is no longer necessary, therefore simplifying the
design of gear_state.
To see the model sf_car with output enabled for gear_state, at the MATLAB
command prompt, type sf_car .
22-38
Use Active State Output Data
More About
About Active State Data on page 22-30
Limitations for Active State Data on page 22-36
Manage Stateflow Data, Events, and Messages in the Symbols Window on page
30-2
22-39
22 Define Interfaces to Simulink Models and the MATLAB Workspace
More About
Define State Activity Enum Name and Type on page 22-41
Limitations for Active State Data on page 22-36
About Active State Data on page 22-30
22-40
Define State Activity Enum Name and Type
In the enumeration definition, there must be one literal for each state name plus an
extra literal to indicate no active child.
enumeration
None(0),
first(1),
second(2),
third(3),
fourth(4)
end
You can customize the name and definition for the enumeration output in the Properties
window. To customize the name, type the new name in the edit box next to Enum name.
Stateflow automatically creates this enumeration, or you can tell Stateflow to use an
existing definition by selecting Define enumerated type manually.
If you select Define enumerated type manually, but no definition exists, then
Stateflow provides a link to automatically create a MATLAB definition. Selecting,
Create enum definition from template, generates an enumeration definition in a
MATLAB file. You can then customize this definition.
In the example, sf_car, the data is named gear, and the enumeration type is
gearType.
22-41
22 Define Interfaces to Simulink Models and the MATLAB Workspace
The base storage type for an automatically created enumeration defaults to Native
Integer. You can choose the storage type in Base storage type for automatically
created enumerations: under the Optimization > Stateflow pane of the
Configuration Parameters dialog box. If you need a smaller memory footprint, use this
option.
More About
About Active State Data on page 22-30
Limitations for Active State Data on page 22-36
22-42
Units in Stateflow
Units in Stateflow
In this section...
Units for Input and Output Data on page 22-43
Consistency Checking on page 22-43
Units for Stateflow Limitations on page 22-43
To display the units on the Simulink lines in the model, select Display > Signals and
Ports > Port Units.
Consistency Checking
Stateflow checks the consistency of the signal line unit from Simulink with the unit
setting for the corresponding input or output data in the Stateflow block. If the units do
not match, Stateflow displays a warning during model update.
More About
Unit Specification in Simulink Models (Simulink)
22-43
23
Inputs and outputs for accessing Simulink bus signals from Stateflow charts, Truth
Table blocks, and MATLAB Function blocks (see Define Structure Inputs and
Outputs on page 23-9)
Local structure data in Stateflow charts, truth tables, graphical functions, MATLAB
functions, and boxes (see Define Local Structures on page 23-12)
Temporary structure data in Stateflow graphical functions, truth tables, and
MATLAB functions (see Define Temporary Structures on page 23-14)
See Also
Simulink.Bus class (Simulink)
23-2
Connect Structures in Charts to External Bus Signals
In this model, the Stateflow chart receives a bus input signal using the structure inbus
at input port 1 and outputs a bus signal from the structure outbus at output port 1.
23-3
23 Structures and Bus Signals in Stateflow Charts
The input signal comes from the Simulink Bus Creator block COUNTERBUSCreator,
which bundles signals from two other Bus Creator blocks: SIGNALBUSCreator and
LIMITBUSCreator. The structure outbus connects to a Simulink Bus Selector block
BUSSelector. The Stateflow chart also contains a local structure counterbus_struct
and a graphical function get_input_signal that contains an input structure u and
output structure y.
Note: The local structure counterbus_struct is defined using the type operator in an
expression, as described in Define Structure Types with Expressions on page 23-15.
23-4
Connect Structures in Charts to External Bus Signals
23-5
23 Structures and Bus Signals in Stateflow Charts
You can find the bus object that defines a Stateflow structure by looking in the Data
Type and Compiled Type columns in the Contents pane of the Model Explorer. For
example, the structures inbus, outbus, and counterbus_struct are all defined in
sfbus_demo by the same Simulink bus object, COUNTERBUS.
Based on these definitions, inbus, outbus, and counterbus_struct have the same
properties as COUNTERBUS. For example, these Stateflow structures in sfbus_demo
reference their fields by the same names as the elements in COUNTERBUS, as follows:
To learn how to define structures in Stateflow charts using Simulink.Bus objects, see
Define Stateflow Structures on page 23-9.
If you define a custom structure in C for your Stateflow chart, you must make sure that
the structure's typedef declaration in your header file matches the properties of the
23-6
Connect Structures in Charts to External Bus Signals
23-7
23 Structures and Bus Signals in Stateflow Charts
You must define each structure as a Simulink.Bus object in the base workspace.
You cannot define structures for Stateflow machines.
Note: The Stateflow machine is the object that contains all other Stateflow objects in
a Simulink model (see Stateflow Hierarchy of Objects on page 1-8).
Structures cannot have a constant scope.
Structures of parameter scope must be tunable.
Data array objects cannot contain structures.
More About
Structure Operations on page 23-17
Define Stateflow Structures on page 23-9
23-8
Define Stateflow Structures
You can drive Stateflow structure inputs by using any Simulink bus signal that has
matching properties. Similarly, Stateflow charts can output structures to Simulink
blocks that accept bus signals.
1 Create a Simulink bus object in the base workspace to define the structure type for
your Stateflow chart.
For information about how to create Simulink bus objects, see Create Bus Objects
with the Bus Editor (Simulink) in the Simulink documentation.
2 Open the Model Explorer.
3 In the Model Explorer, add a data object as described in Add Data Through the
Model Explorer on page 8-3.
The Model Explorer adds a data object and opens a Properties dialog box in its right-
hand Dialog pane.
4 In the Name field of the Properties dialog box, enter the name of the structure data.
5 In the Scope field, select either Input or Output.
6 In the Type field, select Inherit: Same as Simulink, Bus: <object name>, or
<data type expression> according to these guidelines:
23-9
23 Structures and Bus Signals in Stateflow Charts
The Simulink bus signal must be a nonvirtual bus (see Virtual and
Nonvirtual Buses on page 23-11).
If your input signal comes from a Bus Creator block, you must
specify an appropriate bus object for Output data type in the
Bus Creator dialog box. When you specify the bus object, Simulink
verifies that the properties of the Simulink.Bus object in the base
workspace match the properties of the Simulink bus signal.
23-10
Define Stateflow Structures
Note: You are not required to specify a bus signal in your Simulink
model that connects to the Stateflow structure input or output.
However, if you do specify a bus signal, its properties must match
the Simulink.Bus object that defines the Stateflow structure input
or output.
<date type Input or Replace <data type expression> in the Type field with an
expression> Output expression that evaluates to a data type.
For structure inputs, you can use the Stateflow type operator
to assign the type of your structure based on the type of another
structure defined in the Stateflow chart, as described in Define
Structure Types with Expressions on page 23-15.
Note: You cannot use the type operator for structure outputs
(structures of scope Output).
For structure inputs or outputs, you can enter the name of the
Simulink.Bus object in the base workspace that defines the
Stateflow structure.
7 Click Apply.
Stateflow charts support nonvirtual buses only. For Stateflow structure inputs, incoming
virtual bus signals are converted to nonvirtual buses. Stateflow outputs only nonvirtual
buses.
23-11
23 Structures and Bus Signals in Stateflow Charts
Even though this conversion process allows Stateflow charts to accept virtual and
nonvirtual buses as input, Stateflow structures cannot inherit properties from virtual bus
input signals. If the input to a chart is a virtual bus, you must set the data type mode of
the Stateflow bus input to Bus Object.
1 Create a Simulink bus object in the base workspace to define the structure type for
your Stateflow chart.
For information about how to create Simulink bus objects, see Create Bus Objects
with the Bus Editor (Simulink) in the Simulink documentation.
2 Open the Model Explorer.
3 In the Model Explorer, add a data object as described in Add Data Through the
Model Explorer on page 8-3.
The Model Explorer adds a data object and opens a Properties dialog box in its right-
hand Dialog pane.
4 In the Name field of the Properties dialog box, enter the name of the structure data.
5 In the Scope field, select Local.
6 In the Type field, select either Bus: <object name>, or <data type
expression>, and then specify the expression as follows:
Use the Stateflow type operator to assign the type of your structure based on
the type of another structure defined in the Stateflow chart, as described in
Define Structure Types with Expressions on page 23-15
23-12
Define Stateflow Structures
1 Create a Simulink bus object in the base workspace to define the structure type for
your chart.
For information about how to create Simulink bus objects, see Create Bus Objects
with the Bus Editor (Simulink) in the Simulink documentation.
2 Open the Model Explorer.
3 In the Model Explorer, add a data object as described in Add Data Through the
Model Explorer on page 8-3.
The Model Explorer adds a data object and opens a Properties dialog box in its right-
hand Dialog pane.
4 In the Name field of the Properties dialog box, enter the name of the structure data.
5 In the Scope field, select Parameter.
6 In the Type field, select either Bus: <object name>, or <data type
expression>, and then specify the expression as follows:
Use the Stateflow type operator to assign the type of your structure based on
the type of another structure defined in the Stateflow chart, as described in
Define Structure Types with Expressions on page 23-15
23-13
23 Structures and Bus Signals in Stateflow Charts
1 Create a Simulink bus object in the base workspace to define the structure type for
your chart.
For information about how to create Simulink bus objects, see Create Bus Objects
with the Bus Editor (Simulink) in the Simulink documentation.
2 Open the Model Explorer.
3 In the Model Explorer, add a data object to your function as described in Add Data
Through the Model Explorer on page 8-3.
The Model Explorer adds a data object and opens a Properties dialog box in its right-
hand Dialog pane.
4 In the Name field of the Properties dialog box, enter the name of the structure data.
5 In the Scope field, select Temporary.
6 In the Type field, select either Bus: <object name>, or <data type
expression>, and then specify the expression as follows:
23-14
Define Stateflow Structures
In this case, the structure counterbus_struct derives its type from structure inbus,
which is defined by the Simulink.Bus object COUNTERBUS. Therefore, the structure
counterbus_struct is also defined by the bus object COUNTERBUS.
To learn how to use the Stateflow type operator, see Derive Data Types from Previously
Defined Data on page 8-40.
23-15
23 Structures and Bus Signals in Stateflow Charts
Related Examples
Connect Structures in Charts to External Bus Signals on page 23-3
More About
Rules for Defining Structure Data Types in Charts on page 23-8
23-16
Structure Operations
Structure Operations
In this section...
Index Sub-Structures and Fields on page 23-17
Guidelines for Assignment of Values on page 23-19
Get Addresses on page 23-20
In this example, the SubBus and BusObject blocks to the left of the chart are Bus
Creator blocks. The BusObject block to the right of the chart is a Bus Selector block.
23-17
23 Structures and Bus Signals in Stateflow Charts
The Simulink.Bus objects that define these structures have the following elements:
By default, Stateflow structures in and out have the same fields sb, a, b, and c
as the elements of Simulink.Bus object BusObject. Similarly, the Stateflow structure
subbus has the same field ele as the element of Simulink.Bus object SubBus. Based
on these specifications, the following table shows how the Stateflow chart resolves
symbols in dot notation for indexing fields of the structures in this example:
23-18
Structure Operations
Operation Conditions
Assign one structure to another structure You must define both structures with the
same Simulink.Bus object in the base
workspace.
Assign one structure to a substructure of a You must define the structure with the
different structure and vice versa same Simulink.Bus object in the base
workspace as the substructure.
Assign a field of one structure to a field of The fields must have the same type and
another structure size.
For example, the following table presents valid and invalid structure assignments based
on specifications for the sfbus_demo model, as described in Connect Structures in Charts
to External Bus Signals on page 23-3:
23-19
23 Structures and Bus Signals in Stateflow Charts
Get Addresses
When you write custom functions that take structure pointers as arguments, you must
pass the structures by address. To get addresses of Stateflow structures and structure
fields, use the & operator, as in the following examples:
23-20
Structure Operations
To call this function, you must pass addresses to two structures defined by the
Simulink.Bus object COUNTERBUS, as in this example:
See Connect Structures in Charts to External Bus Signals on page 23-3 for a
description of the structures defined in sfbus_demo.
23-21
23 Structures and Bus Signals in Stateflow Charts
The header file must contain the typedef statements for your structures. For
example, the model sfbus_demo uses custom structures, defined in a custom header
file as follows:
...
typedef struct {
int input;
} SIGNALBUS;
typedef struct {
int upper_saturation_limit;
int lower_saturation_limit;
} LIMITBUS;
typedef struct {
SIGNALBUS inputsignal;
LIMITBUS limits;
} COUNTERBUS;
...
2 Define a Simulink.Bus object in the base workspace that matches each custom
structure typedef.
For example, the model sfbus_demo defines the following Simulink.Bus objects to
match each typedef in the custom header file:
23-22
Integrate Custom Structures in Stateflow Charts
3 Open the Bus Editor and for each bus object in the base workspace defined in custom
code, add the name of the header file that contains the matching typedef.
For example, the model sfbus_demo specifies the custom header file counterbus.h
for the bus object COUNTERBUS:
23-23
23 Structures and Bus Signals in Stateflow Charts
23-24
Integrate Custom Structures in Stateflow Charts
23-25
23 Structures and Bus Signals in Stateflow Charts
Debug Structures
You debug structures as you would other Stateflow chart data, as described in Watch
Stateflow Data Values on page 29-35. Using the Stateflow Breakpoints and Watch
window, you can examine the values of structure fields during simulation. To view
the values of structure fields at the command line, use dot notation to index into the
structure, as described in Index Sub-Structures and Fields on page 23-17.
23-26
24
Debounce Signals
In this section...
Why Debounce Signals on page 24-2
The Debouncer Model on page 24-2
Key Behaviors of Debouncer Chart on page 24-3
Run the Debouncer on page 24-5
For example, if you model a controller in a Stateflow chart, you do not want your switch
logic to overwork the controller by turning it on and off in response to every transient
signal it receives. Instead, you can design a Stateflow debouncer that uses temporal logic
to determine whether the switch is really on or off.
24-2
Debounce Signals
In addition to the states On and Off, the Debouncer chart contains an intermediate state
called Debounce. The Debounce state isolates transient inputs by checking whether the
signals retain their positive or negative values, or fluctuate between zero crossings over a
prescribed period of time. The logic works as follows.
If the input signal... Then this state... Transitions to... And the...
Retains positive value Debounce.On On Switch turns on
for 0.1 second
24-3
24 Stateflow Design Patterns
If the input signal... Then this state... Transitions to... And the...
Retains negative value Debounce.Off Off Switch turns off
for 0.1 second
Fluctuates between Debounce Off.Fault Chart isolates the input
zero crossings for 0.3 as a transient signal
second and gives it time to
Note: The Debounce recover
to Off.Fault transition
comes from a higher
level in the chart
hierarchy and overrides
the transitions from
the Debounce.Off and
Debounce.On substates.
The debouncer design uses the after(n, sec) operator to implement absolute-time
temporal logic (see Operators for Absolute-Time Temporal Logic on page 11-63). The
keyword sec defines simulation time that has elapsed since activation of a state.
The Error Generator block in the sf_debouncer model generates a pulse signal every
0.001 second. Therefore, to convert the absolute-time temporal logic specified in the
Debouncer chart to event-based logic, multiply the n argument by 1000, as follows.
24-4
Debounce Signals
The scope shows how the debouncer isolates transient signals from the noisy input
signal.
24-5
24 Stateflow Design Patterns
24-6
Debounce Signals
Note: To debounce the signals using event-based logic, change the Debouncer chart
as described in Use Event-Based Temporal Logic on page 24-4 and simulate
the chart again. You should get the same results.
24-7
24 Stateflow Design Patterns
Related Examples
More About
Control Chart Execution Using Temporal Logic on page 11-56
24-8
Schedule Execution of Simulink Subsystems
Types of Schedulers
You can implement the following types of schedulers using Stateflow charts.
24-9
24 Stateflow Design Patterns
24-10
Schedule Multiple Subsystems in a Single Step
In a given time step, the Stateflow chart broadcasts a series of function-call output
events to trigger the execution of three function-call subsystems A1, A2, and A3 in
the Simulink model in an order determined by the ladder logic scheduler. Here is the
sequence of activities during each time step:
1 The Simulink model activates the Stateflow chart Edge to Function at a rising edge
of the 1-millisecond pulse generator.
2 The Edge to Function chart broadcasts the function-call output event call to
activate the Stateflow chart Ladder Logic Scheduler.
24-11
24 Stateflow Design Patterns
3 The Ladder Logic Scheduler chart broadcasts function-call output events to trigger
the function-call subsystems A1, A2, and A3, based on the values of inputs u1 and u2
(see Flow Chart Determines Order of Execution on page 24-12).
The Ladder Logic Scheduler chart uses Stateflow flow charting capabilities to implement
the logic that schedules the execution of the Simulink function-call subsystems. The
chart contains a Stateflow flow chart that resembles a ladder diagram. Each rung in
the ladder represents a rule or condition that determines whether to execute one of the
Simulink function-call subsystems. The flow logic evaluates each condition sequentially,
which has the effect of scheduling the execution of multiple subsystems within the same
time step. The chart executes each subsystem by using the send action to broadcast a
function-call output event (see Directed Local Event Broadcast Using send on page
11-52).
Here is the sequence of activities that occurs in the Ladder Logic Scheduler chart in each
time step:
The subsystem connected to A2 executes. This subsystem outputs its input value
unchanged. Control returns to the next condition in the Ladder Logic Scheduler.
4 If u1 and u2 are positive, send function-call output event A3 to the Simulink model.
24-12
Schedule Multiple Subsystems in a Single Step
The scope shows how output y changes, depending on which subsystems the Ladder
Logic Scheduler chart calls during each time step.
Tip: If you keep the chart closed, the simulation runs much faster. For other tips, see
Speed Up Simulation on page 28-14.
24-13
24 Stateflow Design Patterns
24-14
Schedule One Subsystem in a Single Step
In a given time step, the Stateflow chart broadcasts a function-call output event to
trigger the execution of the function-call subsystem A1 multiple times in the Simulink
model. Here is the sequence of activities during each time step:
1 The Simulink model activates the Stateflow chart Edge to Function at a rising edge
of the 1-millisecond pulse generator.
2 The Edge to Function chart broadcasts the function-call output event call to
activate the Stateflow chart Looping Scheduler.
3 The Looping Scheduler chart broadcasts a function-call output event from a for
loop to trigger the function-call subsystem A1 multiple times (see Flow Chart
Implements For Loop on page 24-15).
The Looping Scheduler chart uses Stateflow flow charting capabilities to implement
a for loop for broadcasting an event multiple times in a single time step. The chart
contains a Stateflow flow chart that uses a local data variable i to control the loop. At
each iteration, the chart updates output y and issues the send action to broadcast a
function-call output event that executes subsystem A1. Subsystem A1 uses the value of y
to recompute its output and send the value back to the Looping Scheduler chart.
24-15
24 Stateflow Design Patterns
In this example, the Looping Scheduler chart executes the for loop 10 times in each time
step. During each iteration:
24-16
Schedule Subsystems to Execute at Specific Times
24-17
24 Stateflow Design Patterns
In the FastScheduler state, the every operator schedules function calls as follows:
Sends A1 every time the function-call output event call wakes up the chart
Sends A2 at half the base rate
Sends A3 at one-quarter the base rate
The SlowScheduler state schedules function calls less frequently at 8, 16, and 32 times
slower than the base rate. The chart switches between fast and slow executions after
every 100 invocations of the call event.
24-18
Schedule Subsystems to Execute at Specific Times
24-19
24 Stateflow Design Patterns
In this section...
When to Implement Test Vectors on page 24-20
A Dynamic Test Vector Chart on page 24-22
Key Behaviors of the Chart and Model on page 24-24
Run the Model with Stateflow Test Vectors on page 24-26
For example, suppose you want to test an automatic car transmission controller in the
situation where a car is coasting. To achieve a coasting state, a driver accelerates until
the transmission shifts into the highest gear, then eases up on the gas pedal. To test this
scenario, you could generate a signal that represents this behavior, as in the following
Signal Builder block.
24-20
Implement Dynamic Test Vectors
However, this approach has limitations. The signal changes value based on time, but
cannot respond dynamically to changes in the system that are not governed by time
alone. For example, how does the signal know when the transmission shifts into the
highest gear? In this case, the signal assumes that the shift always occurs at time 5
because it cannot test for other deterministic conditions such as the speed of the vehicle.
Moreover, you cannot change the signal based on outputs from the model.
By contrast, you can use Stateflow charts to develop test vectors that use conditional
logic to evaluate and respond to changes in system state as they occur. For example, to
24-21
24 Stateflow Design Patterns
test the coasting scenario, the chart can evaluate an output that represents the gear
range and reduce speed only after the transmission shifts to the highest gear. That is, the
car slows down as a direct result of the gear shift and not at a predetermined time. For a
detailed look at this type of chart, see A Dynamic Test Vector Chart on page 24-22.
The chart models the dynamic relationship between the brake and throttle to test four
driving scenarios. Each scenario is represented by a state.
24-22
Implement Dynamic Test Vectors
24-23
24 Stateflow Design Patterns
In some of these scenarios, the throttle changes in response to time; in other cases, it
responds to gear selection, an output of the Stateflow chart Shift_logic. The Shift_logic
chart determines the gear value based on the speed of the vehicle.
The Dynamic Test Vectors chart represents each test case as an exclusive (OR) state.
Each state manipulates brake and throttle values in a unique way, based on the time and
gear inputs to the chart.
The chart determines which test to execute from the value of a constant signal case,
output from the Signal Builder block. Each test case corresponds to a unique signal
value.
The Dynamic Test Vectors chart uses conditions on transitions to test time and gear
level, and then adjusts brake and throttle accordingly for each driving scenario. Stateflow
charts provide many constructs for testing system state and responding to changes,
including:
Conditional logic (see State Action Types on page 11-2 and Transition Action
Types on page 11-8)
Temporal logic (see Control Chart Execution Using Temporal Logic on page 11-56)
Change detection operators (see Detect Changes in Data Values on page 11-74)
MATLAB functions (see Access Built-In MATLAB Functions and Workspace Data
on page 11-38)
The model uses a Signal Builder block to provide an interface for selecting test scenarios
to simulate.
24-24
Implement Dynamic Test Vectors
To Test: Do This:
One case Click the tab that corresponds to the
driving scenario you want to test and click
the Start simulation button:
24-25
24 Stateflow Design Patterns
To Test: Do This:
All cases and produce a model coverage Click the Run all and produce coverage
report (requires a Simulink Verification button:
and Validation software license)
The Signal Builder block sends to the Dynamic Test Vectors chart one or more constant
signal values that correspond to the driving scenarios you select. The chart uses these
values to activate the appropriate test cases.
The scope shows the interaction between speed and throttle for the selected scenario.
24-26
Implement Dynamic Test Vectors
24-27
24 Stateflow Design Patterns
24-28
Map Fault Conditions to Actions in Truth Tables
This example shows how the model sf_aircraft maps the fault conditions and actions
using a truth table. For details on this model, see .
The fault detection system for the aircraft elevator control system has these
requirements.
Condition Action
Hydraulic pressure 1 failure While there are no other failures, turn off
the left outer actuator.
Hydraulic pressure 2 failure While there are no other failures, turn off
the left inner actuator and the right inner
actuator.
Hydraulic pressure 3 failure While there are no other failures, turn off
the right outer actuator.
Actuator position failure While there are no other failures, isolate
that specific actuator.
Hydraulic pressure 1 and left outer While there are no other failures, turn off
actuator failures the left outer actuator
Hydraulic pressure 2 and left inner While there are no other failures, turn off
actuator failures the left inner actuator.
Hydraulic pressure 3 and right outer While there are no other failures, turn off
actuator failures the right outer actuator
Multiple failures on left hydraulics and Isolate the left outer actuator and the left
actuators inner actuator.
Multiple failures on right hydraulics and Isolate the right outer actuator and the
actuators right inner actuator.
Intermittent actuator failures If an actuator has been switched on and
off five times during operation, isolate that
specific actuator.
24-29
24 Stateflow Design Patterns
Logic to satisfy these requirements is constructed using two truth tables in the chart
Mode Logic; one for the right elevator (R_switch), and one for the left elevator
(L_switch). This truth table is for the left elevator.
24-30
Map Fault Conditions to Actions in Truth Tables
The first requirement indicates that if a failure is only detected in the hydraulic pressure
1 system, turn off the left outer actuator. This requirement is represented in the
decision D1 in the truth table. If there is low pressure in the hydraulic system 1, then D1
specifies that action 2 is performed. Action 2 sends an event go_off to the left actuator,
Actuators.LO.
Similarly, the other requirements are mapped to the appropriate actions in the truth
table. For example, if the left outer actuator fails, D3 causes action 3. Action 3 sends the
event go_isolated to Actuators.LO to isolate the left actuator.
The truth tables are called at entry(en) and during(du) actions for the chart so that fault
checks execute at each time step.
24-31
24 Stateflow Design Patterns
In this section...
Mode Logic for the Elevator Actuators on page 24-32
States for Failure and Isolation on page 24-33
Transitions for Recovery on page 24-34
There are two elevators in the system, each with an outer and inner actuator. The
Actuators state has a corresponding substate for each of the four actuators. An actuator
has five modes: Passive, Active, Standby, Off, and Isolated. By default, the outer
actuators are on, and the inner actuators are on standby. If a fault is detected in the
outer actuators, the system responds to maintain stability by turning the outer actuators
off and activating the inner actuators.
24-32
Design for Isolation and Recovery in a Chart
24-33
24 Stateflow Design Patterns
The go_off event instructs the failing actuator to transition to the Off state until the
condition is resolved. The event go_isolated causes the failing actuator to transition
to Isolated. Transitions to the Isolated state are from the superstate L1, which
contains all the other operating modes. This state has no outgoing transitions, so that
once an actuator has entered Isolated it remains there. Intermittent failures that
cause an actuator to fail 5 or more times, also cause a transition to Isolated. The
variable fails logs the number of failures for an actuator by incrementing each time a
transition occurs out of Off.
For example, one requirement of the system is if one outer actuator fails, then the other
outer actuator must move to standby and the inner actuators take over. Consequently,
there is a transition from each Active state to Standby, and vice versa.
24-34
Design for Isolation and Recovery in a Chart
For the inner left actuator (LI ), the transition to Active inside the L1 superstate is
conditionally based on [!LO_act()|RI_act()]. This causes the left inner actuator to
turn on if the outer actuator (LO) has failed, or the right inner actuator (RI) has turned
on.
24-35
24 Stateflow Design Patterns
Another consequence if LO fails and moves out of Active is a transition that occurs in
the right outer actuator (RO). The RO state transitions inside the L1 superstate from
Active to Standby. This satisfies the requirement of the outer actuators and inner
actuators to work in symmetry.
24-36
25
Stateflow truth tables contain conditions, decisions, and actions arranged as follows:
Each of the conditions entered in the Condition column must evaluate to true (nonzero
value) or false (zero value). Outcomes for each condition are specified as T (true), F
(false), or - (true or false). Each of the decision columns combines an outcome for each
condition with a logical AND into a compound condition, that is referred to as a decision.
You evaluate a truth table one decision at a time, starting with Decision 1. If one of
the decisions is true, you perform its action and truth table execution is complete. For
example, if conditions 1 and 2 are false and condition 3 is true, Decision 3 is true and the
variable t is set equal to 3. The remaining decisions are not tested and evaluation of the
truth table is finished.
The last decision in the preceding example, Default Decision, covers all possible
remaining decisions. If Decisions 1, 2, and 3 are false, then the Default Decision is
automatically true and its action (t = 4) is executed. You can see this behavior when you
examine the following equivalent pseudocode for the evaluation of the preceding truth
table example:
Description Pseudocode
Decision 1 if ((x == 1) & !(y == 1) & !(z == 1))
t = 1;
Decision 1 Action
25-2
What Is a Truth Table?
Description Pseudocode
Decision 2 elseif (!(x == 1) & (y == 1) & !(z == 1))
t = 2;
Decision 2 Action
Decision 3 elseif (!(x == 1) & !(y == 1) & (z == 1))
t = 3;
Decision 3 Action
Default Decision else
t = 4;
Default Decision Action endif
If you want to call the function only within one state or subchart and its substates,
put your truth table function in that state or subchart. That function overrides
any other functions of the same name in the parents and ancestors of that state or
subchart.
If you want to call the function anywhere in that chart, put your truth table function
at the chart level.
More About
Build Model with Stateflow Truth Table on page 25-7
Represent Combinatorial Logic Using Truth Tables on page 25-6
25-3
25 Truth Table Functions for Decision-Making Logic
C Truth Tables
Using C truth tables, you can specify conditions and actions with C as the action
language. C truth tables support basic C constructs and provide access to MATLAB
functions by using the ml namespace operator or ml function. To use C as the action
language for your truth table, it must be inside a Stateflow C action language chart.
MATLAB as the action language provides a richer syntax for specifying control flow
logic in truth table actions. It provides for loops, while loops, nested if statements,
and switch statements.
You can call MATLAB functions directly in truth table actions. Also, you can call
library functions (for example, MATLAB sin and fft functions) and generate code
for these functions by using Simulink Codersoftware.
You can create temporary or persistent variables during simulation or in code directly
without having to define them in the Model Explorer.
You have access to better debugging tools. You can set breakpoints on lines of code,
step through code, and watch data values tool tips.
You can use persistent variables in truth table actions. You can define data that
persists across multiple calls to the truth table function during simulation.
25-4
Language Options for Stateflow Truth Tables
Note: If you do not have the option to change the action language, your truth table is a
MATLAB truth table.
You can check for syntax errors in the Truth Table Editor by selecting Settings > Run
Diagnostics, as described in Check Truth Tables for Errors on page 25-44.
25-5
25 Truth Table Functions for Decision-Making Logic
25-6
Build Model with Stateflow Truth Table
Once you build a model, finish it by programming the truth table with its behavior as
described in Program a Truth Table on page 25-19.
To execute a truth table, you first need a Simulink model that calls a Stateflow block.
Later, you create a Stateflow chart for the Stateflow block that calls a truth table
function. Here, you create a Simulink model that calls a Stateflow block.
2 Click and drag the Stateflow block to the center of the model window.
3 In the model window, select View > Library Browser.
The Simulink Library Browser window opens with the Simulink node expanded.
4 Under the Simulink node, select the Sources library.
The right pane of the Simulink Library Browser window displays the blocks of the
Sources library.
5 From the right pane of the Simulink Library Browser, click and drag the Constant
block to the left of the Chart block in the model.
6 Add two more Constant blocks to the left of the Chart block, and add a Display block
(from the Sinks library) to the right of the Chart block.
25-7
25 Truth Table Functions for Decision-Making Logic
Type to Fixed-step
Solver to discrete (no continuous states)
Fixed-step size to 1
15 Click OK to accept these values and close the Model Configuration Parameters
dialog box.
16 Save the model as ex_first_truth_table.
You created a Simulink model in Create a Simulink Model on page 25-7 that
contains a Stateflow block. Now open the chart for the block and specify a truth table for
it:
25-8
Build Model with Stateflow Truth Table
3 Move your pointer into the empty chart and notice that it appears in the shape of a
box.
4 Click to place a new truth table.
The signature label of the truth table function follows this syntax:
[return_val1, return_val2,...] = function_name(arg1, arg2,...)
You can specify multiple return values and multiple input arguments. Each return
value and input argument can be a scalar, vector, or matrix of values.
Note: For functions with only one return value, you can omit the brackets in the
signature label.
After you add a truth table function to a chart, you can specify its properties by following
these steps:
1 Right-click the truth table function box and select Properties from the context
menu.
The Truth Table properties dialog box for the truth table function appears. It
contains a General tab and a Documentation tab.
25-9
25 Truth Table Functions for Decision-Making Logic
The fields in the Truth Table properties dialog box under the General tab are as
follows:
Field Description
Name Function name; read-only; click this hypertext link to bring
the truth table function to the foreground in its native
Stateflow chart.
25-10
Build Model with Stateflow Truth Table
Field Description
Function Inline This option controls the inlining of the truth table function
Option in generated code through the following selections:
Auto
Decides whether or not to inline the truth table function
based on an internal calculation.
Inline
Inlines the truth table function as long as it is not
exported to other charts and is not part of a recursion. A
recursion exists if the function calls itself either directly
or indirectly through another called function.
Function
Does not inline the function.
Label You can specify the signature label for the function through
this field. See Create a Stateflow Truth Table on page
25-8 for more information.
25-11
25 Truth Table Functions for Decision-Making Logic
The fields in the Truth Table properties dialog box under the Documentation tab
are as follows:
Field Description
Description Textual description/comment.
Document link Enter a URL address or a general MATLAB
command. Examples are www.mathworks.com,
mailto:email_address, and edit/spec/data/
speed.txt.
2 Click OK to close the dialog box.
In Create a Stateflow Truth Table on page 25-8, you created the truth table
function ttable with the signature:
25-12
Build Model with Stateflow Truth Table
t = ttable(x,y,z)
Now you need to specify a call to the truth table function in the chart. Later, when the
chart executes during simulation, it calls the truth table.
You can call truth table functions from the actions of any state or transition. You can
also call truth tables from other functions, including graphical functions and other truth
tables. Also, if you export a truth table, you can call it from any chart in the model.
To call the ttable function from the default transition of its own chart, follow these
steps:
2 Move your pointer to a location left of the truth table function and notice that it
appears in the shape of a downward-pointing arrow.
3 Click to place a default transition into a terminating junction.
4 Click the question mark character (?) that appears on the default transition.
A blinking cursor in a text field appears for entering the label of the default
transition.
5 Enter the text
{d = ttable(a,b,c);}
You might want to adjust the label's position by clicking and dragging it to a new
location. The finished chart should look something like this:
25-13
25 Truth Table Functions for Decision-Making Logic
The label on the default transition provides a condition action that calls the truth
table with arguments and a return value. When the Simulink model triggers the
Stateflow block during simulation, the default transition executes and a call to the
truth table ttable occurs.
The function call to the truth table must match the truth table signature. The type of
the return value d must match the type of the signature return value t, and the type
of the arguments a, b, and c must match the type of the signature arguments x, y,
and z. You ensure this with a later step in this section when you create the data that
you use in the chart.
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 How Scalar Expansion Works for Functions on page 16-6.
6 Save the model.
When you create a truth table with its own signature, you specify data for it in the form
of a return value (t) and argument values (x, y, z). When you specify a call to a truth
table, as you did in Call a Truth Table in a Stateflow Action on page 25-12, you
specify data that you pass to the return and argument values of the truth table (d, a, b,
and c). Now you must define this data for the chart as follows:
1 Double-click the truth table function to open the Truth Table Editor.
2 In the Truth Table Editor, select Add > Edit Data/Ports.
25-14
Build Model with Stateflow Truth Table
In the Model Hierarchy pane, the node for the function ttable appears
highlighted, and the Contents pane displays the output (t) and inputs (x, y, z) for
ttable. By default, these data are scalars of type double. If you want to redefine
these data with a different size and type, you do it in the Model Explorer. However,
no changes are necessary for this example.
Notice also in the Model Hierarchy pane that the node above the function ttable
is Chart, the name of the chart that contains the truth table ttable.
To enable or disable the third pane in the Model Explorer, select View > Show
Dialog Pane.
3 In the Model Hierarchy pane, select Chart.
Notice that Chart contains no input or output data in the Contents pane. You must
add the return and argument data for calling ttable.
4 Select Add > Data.
25-15
25 Truth Table Functions for Decision-Making Logic
A scalar data is added to the chart in the Contents pane of the Model Explorer with
the default name data. This data matches argument x in type and size.
To verify that the properties match, right-click data in the Contents pane and
select Properties. The property sheet shows that the type is double and the size is
scalar (the default when there is no entry in the Size field).
5 In the Contents pane, double-click the entry data in the Name column.
The scope Input means that the Simulink model provides the value for this data,
which passes to the chart through an input port on the Stateflow block.
You should now see the new data input a in the Contents pane.
9 Repeat steps 4 through 8 to add the data b and c with the scope Input, and data d
with the scope Output.
The scope Output means that the chart provides this data, which passes to the
Simulink model through an output port on the Stateflow block.
You should now see the input and output data in the Model Explorer.
25-16
Build Model with Stateflow Truth Table
The data a, b, c, and d match their counterparts x, y, z, and t in the truth table
signature in size (scalar) and type (double), but have sources outside the Stateflow
block. Notice that input ports for a, b, and c, and an output port for d appear on the
Stateflow block in the model.
25-17
25 Truth Table Functions for Decision-Making Logic
25-18
Program a Truth Table
In this section...
Open a Truth Table for Editing on page 25-19
Select an Action Language on page 25-21
Enter Truth Table Conditions on page 25-21
Enter Truth Table Decisions on page 25-23
Enter Truth Table Actions on page 25-26
Assign Truth Table Actions to Decisions on page 25-36
Add Initial and Final Actions on page 25-41
25-19
25 Truth Table Functions for Decision-Making Logic
25-20
Program a Truth Table
By default, a truth table contains a Condition Table and an Action Table, each with
one row. The Condition Table contains a single decision column, D1, and a single
action row.
You enter conditions in the Condition column of the Condition Table. For each
condition that you enter, you can enter an optional description in the Description
column. To enter conditions for the truth table ttable:
The editor appends two rows to the bottom of the Condition Table.
3 Click and drag the bar that separates the Condition Table and the Action Table
panes down to enlarge the Condition Table pane.
4 In the Condition Table, click the top cell of the Description column.
x is equal to 1
Condition descriptions are optional, but appear as comments in the generated code
for the truth table.
6 To select the next cell on the right in the Condition column, press the Tab key.
25-21
25 Truth Table Functions for Decision-Making Logic
XEQ1:
This text is an optional label that you can include with the condition. Each label
must begin with an alphabetic character ([a-z][A-Z]) followed by any number of
alphanumeric characters ([a-z][A-Z][0-9]) or an underscore (_).
8 Press Enter and this text:
x == 1
This text is the actual condition. Each condition that you enter must evaluate to zero
(false) or nonzero (true). You can use optional brackets in the condition (for example,
[x == 1]).
In truth table conditions, you can use data that passes to the truth table function
through its arguments. The preceding condition tests whether the argument x
is equal to 1. You can also use data defined for parent objects of the truth table,
including the chart.
9 Repeat the preceding steps to enter the other two conditions.
25-22
Program a Truth Table
25-23
25 Truth Table Functions for Decision-Making Logic
decision are T (true), F (false), and - (true or false). In Enter Truth Table Conditions on
page 25-21 you entered conditions for the truth table ttable. Continue by entering
values in the decision columns:
Pressing the space bar toggles through the possible values of F, -, and T. You can
also enter these characters directly. The editor rejects all other entries.
5 Press the down arrow key to advance to the next cell down in the D1 column.
In the decision columns, you can use the arrow keys to advance to another cell in any
direction. You can also use Tab and Shift+Tab to advance left or right in these cells.
6 Enter the remaining values for the decision columns:
25-24
Program a Truth Table
During execution of the truth table, decision testing occurs in left-to-right order. The
order of testing for individual condition outcomes within a decision is undefined. Truth
tables evaluate the conditions for each decision in top-down order (first condition 1, then
condition 2, and so on). Because this implementation is subject to change in the future,
do not rely on a specific evaluation order.
25-25
25 Truth Table Functions for Decision-Making Logic
The last decision column in ttable, D4, is the default decision for this truth table. The
default decision covers any decisions not tested for in preceding decision columns to the
left. You enter a default decision as the last decision column on the right with an entry of
- for all conditions in the decision. This entry represents any outcome for the condition, T
or F.
In the preceding example, the default decision column, D4, specifies these decisions:
Tip: The default decision column must be the last column on the right in the Condition
Table.
In Enter Truth Table Decisions on page 25-23, you entered decisions in the Truth
Table Editor. The next step is to enter actions you want to occur for each decision in the
Action Table. Later, you assign these actions to their decisions in the Actions row of
the Condition Table.
This section describes how to program truth table actions with these topics:
Set Up the Action Table on page 25-27 Shows you how to set up the Action
Table in truth table ttable.
Program Actions Using C Expressions on page 25-29 Provides sample code to
program actions in ttable. Follow this section if you selected C as the language for
this truth table.
25-26
Program a Truth Table
25-27
25 Truth Table Functions for Decision-Making Logic
3 Program the actions using the language you selected for the truth table.
25-28
Program a Truth Table
Follow this procedure to program your actions using C as the action language:
1 Click the top cell in the Description column of the Action Table.
Action descriptions are optional, but appear as comments in the generated code for
the truth table.
3 Press Tab to select the next cell on the right, in the Action column.
4 Enter the following text:
A1:
You begin an action with an optional label followed by a colon (:). Later, you enter
these labels in the Actions row of the Condition Table to specify an action for each
decision column. Like condition labels, action labels must begin with an alphabetic
character ([a-z][A-Z]) followed by any number of alphanumeric characters ([a-z]
[A-Z][0-9]) or an underscore (_).
5 Press Enter and enter the following text:
t=1;
In truth table actions, you can use data that passes to the truth table function
through its arguments and return value. The preceding action, t=1, sets the value of
the return value t. You can also specify actions with data defined for a parent object
of the truth table, including the chart. Truth table actions can also broadcast or send
events that are defined for the truth table, or for a parent, such as the chart itself.
Tip: If you omit the semicolon at the end of an action, the result of the action echoes
to the MATLAB Command Window when the action executes during simulation. Use
this echoing option as a debugging tool.
25-29
25 Truth Table Functions for Decision-Making Logic
25-30
Program a Truth Table
25-31
25 Truth Table Functions for Decision-Making Logic
Now you are ready to assign actions to decisions, as described in Assign Truth Table
Actions to Decisions on page 25-36.
If you selected MATLAB as the action language, you can write MATLAB code to program
your actions. Using this code, you can add control flow logic and call MATLAB functions
directly. In the following procedure, you program an action in the truth table ttable,
using the following features of MATLAB syntax:
Persistent variables
if ... else ... end control flows
for loop
1 Click the top cell in the Description column of the Action Table.
Action descriptions are optional, but appear as comments in the generated code for
the truth table.
3 Press Tab to select the next cell on the right, in the Action column.
4 Enter the following text:
A1:
You begin an action with an optional label followed by a colon (:). Later, you enter
these labels in the Actions row of the Condition Table to specify an action for each
decision column. Like condition labels, action labels must begin with an alphabetic
character ([a-z][A-Z]) followed by any number of alphanumeric characters ([a-z]
[A-Z][0-9]) or an underscore (_).
5 Press Enter and enter the following text:
25-32
Program a Truth Table
coder.extrinsic('plot');
if isempty(counter)
% Initialize counter to be zero
counter = 0;
else
% Otherwise, increment counter
counter = counter + 1;
end
if isempty(values)
% Values is a vector of 1 to cycle
values = zeros(1, cycle);
for i = 1:cycle
values(i) = i;
end
In truth table actions, you can use data that passes to the truth table function
through its arguments and return value. The preceding action sets the return value
t equal to the next value of the vector values. You can also specify actions with
data defined for a parent object of the truth table, including the chart. Truth table
actions can also broadcast or send events that are defined for the truth table, or for a
parent, such as the chart itself.
Note: If you omit the semicolon at the end of an action, the result of the action
echoes to the MATLAB Command Window when the action executes during
simulation. Use this echoing option as a debugging tool.
6 Enter the remaining actions in the Action Table, as shown:
25-33
25 Truth Table Functions for Decision-Making Logic
25-34
Program a Truth Table
Now you are ready to assign actions to decisions, as described in Assign Truth Table
Actions to Decisions on page 25-36.
25-35
25 Truth Table Functions for Decision-Making Logic
The following rules apply when you assign actions to decisions in a truth table:
You specify actions for decisions by entering a row number or a label in the Actions
row cell of a decision column.
If you use a label specifier, the label must appear with the action in the Action
Table.
You must specify at least one action for each decision.
Actions for decisions are not optional. Each decision must have at least one action
specifier that points to an action in the Action Table. If you want to specify no action
for a decision, specify a row that contains no action statements.
You can specify multiple actions for a decision with multiple specifiers separated by a
comma, semicolon, or space.
For example, for the decision column D1, you can specify A1,A2,A3 or 1;2;3 to
execute the first three actions when decision D1 is true.
You can mix row number and label action specifiers interchangeably in any order.
The following example uses both row and label action specifiers.
25-36
Program a Truth Table
25-37
25 Truth Table Functions for Decision-Making Logic
You can specify the same action for more than one decision, as shown:
Row number action specifiers in the Actions row of the Condition Table
automatically adjust to changes in the row order of the Action Table.
25-38
Program a Truth Table
This section describes how to assign actions to decisions in the truth table ttable. In
this example, the Actions row cell for each decision column contains a label specified for
each action in the Action Table. Follow these steps:
1 Click the bottom cell in decision column D1, the first cell of the Actions row of the
Condition Table.
2 Enter the action specifier A1 for decision column D1.
25-39
25 Truth Table Functions for Decision-Making Logic
25-40
Program a Truth Table
Now you are ready to perform the final step in programming a truth table, Add Initial
and Final Actions on page 25-41.
Use this procedure to add initial and final actions that display diagnostic messages in the
MATLAB Command Window before and after execution of the truth table ttable:
1 In the Truth Table Editor, right-click row 1 of the Action Table and select Insert
Row.
25-41
25 Truth Table Functions for Decision-Making Logic
25-42
Program a Truth Table
Although the initial and final actions for the preceding truth table example appear in
the first and last rows of the Action Table, you can enter these actions in any row. You
can also assign initial and final actions to decisions by using the action specifier INIT or
FINAL in the Actions row of the Condition Table.
25-43
25 Truth Table Functions for Decision-Making Logic
In this section...
Check Truth Tables for Errors on page 25-44
Debug a Truth Table During Simulation on page 25-44
For example, if you change the action for decision column D4 to an action that does
not exist, you get an error message in the Diagnostic Viewer.
Truth table diagnostics run automatically when you start simulation of the model with a
new or modified truth table. If no errors exist, the diagnostic window does not appear and
simulation starts immediately.
25-44
Debug a Truth Table
When you use Stateflow debugging tools to debug truth tables, you must perform these
tasks:
Before you debug the truth table during simulation, you must set a breakpoint for the
truth table. This breakpoint pauses execution during simulation so that you can debug
each execution step of a truth table.
1 In the chart, right-click the function box for the truth table.
2 Select Set Breakpoint During Function Call.
A breakpoint occurs when the chart calls this truth table function during simulation.
After setting a breakpoint for the truth table function call, you can step through
conditions and actions:
25-45
25 Truth Table Functions for Decision-Making Logic
25-46
Debug a Truth Table
5 Click Step In to execute the INIT action and advance truth table execution to the
first condition.
25-47
25 Truth Table Functions for Decision-Making Logic
25-48
Debug a Truth Table
6 Click Step In to evaluate the first condition and advance truth table execution to the
second condition.
25-49
25 Truth Table Functions for Decision-Making Logic
25-50
Debug a Truth Table
7 Click Step In to evaluate the second condition and advance truth table execution to
the third condition.
25-51
25 Truth Table Functions for Decision-Making Logic
25-52
Debug a Truth Table
8 Click Step In to evaluate the third condition and advance truth table execution to the
first decision.
25-53
25 Truth Table Functions for Decision-Making Logic
25-54
Debug a Truth Table
Because the first decision is true, truth table execution advances to its action A1.
25-55
25 Truth Table Functions for Decision-Making Logic
25-56
Debug a Truth Table
10 Click Step In four times to execute action A1 and advance to the FINAL action.
25-57
25 Truth Table Functions for Decision-Making Logic
25-58
Debug a Truth Table
This step executes the final action and exits the truth table. The Display block in the
model displays the number 1.
MATLAB truth tables generate content as MATLAB code, a format that offers
advantages for debugging. You can set breakpoints on any line of generated code
(whereas you cannot set breakpoints directly on a truth table). You can debug code that
MATLAB truth tables generate the same way you debug a MATLAB function.
For more information about how to generate content for truth tables, see How Stateflow
Generates Content for Truth Tables on page 25-69.
25-59
25 Truth Table Functions for Decision-Making Logic
In this section...
Example of an Overspecified Truth Table on page 25-60
Example of an Underspecified Truth Table on page 25-64
25-60
Correct Overspecified and Underspecified Truth Tables
25-61
25 Truth Table Functions for Decision-Making Logic
The decision in column D3 (-TT) specifies the decisions FTT and TTT. These decisions
are duplicates of decisions D1 (FTT) and D2 (TTT and TFT). Therefore, column D3 is an
overspecification.
The following example shows the Condition Table of a truth table that appears to be
overspecified, but is not.
25-62
Correct Overspecified and Underspecified Truth Tables
25-63
25 Truth Table Functions for Decision-Making Logic
In this case, the decision D4 specifies two decisions (TTT and FTT). FTT also appears
in decision D1, but TTT is not a duplicate. Therefore, this Condition Table is not
overspecified.
25-64
Correct Overspecified and Underspecified Truth Tables
25-65
25 Truth Table Functions for Decision-Making Logic
Complete coverage of the conditions in the preceding truth table requires a Condition
Table with every possible decision:
A possible workaround is to specify an action for all other possible decisions through a
default decision, named DA:
25-66
Correct Overspecified and Underspecified Truth Tables
25-67
25 Truth Table Functions for Decision-Making Logic
The last decision column is the default decision for the truth table. The default decision
covers any remaining decisions not tested in the preceding decision columns. See The
Default Decision Column on page 25-26 for an example and more complete description of
the default decision column for a Condition Table.
25-68
How Stateflow Generates Content for Truth Tables
In the following example, a C truth table has three conditions, four decisions and actions,
and initial and final actions.
25-69
25 Truth Table Functions for Decision-Making Logic
25-70
How Stateflow Generates Content for Truth Tables
Stateflow software generates a graphical function for the preceding truth table. The top
half of the flow chart looks like this:
The temporary data for storing conditions is based on the labels that you enter for the
conditions. If you do not specify the labels, temporary data variables appear.
25-71
25 Truth Table Functions for Decision-Making Logic
In the bottom half of the flow chart, the stored values for conditions determine which
decision is true and what action to perform. Each decision appears as a fork from a
connective junction with one of two possible paths:
The action appears as a condition action that leads to the FINAL action and
termination of the flow chart.
25-72
How Stateflow Generates Content for Truth Tables
A transition segment that flows to the next fork for an evaluation of the next decision
This implementation continues from the first decision through the remaining decisions
in left-to-right column order. When a decision match occurs, the action for that decision
executes as a condition action of its transition segment. After the action executes, the
flow chart performs the final action for the truth table and terminates. Therefore, only
one action results from a call to a truth table graphical function. This behavior also
means that no data dependencies are possible between different decisions.
Nested functions are independent of one another. Variables are local to each function
and not subject to naming conflicts.
Nested functions can access all data from the main truth table function.
The generated content appears in the function editor, which provides tools for simulation
and debugging.
Here is the generated content for the MATLAB truth table described in Program Actions
Using MATLAB Expressions on page 25-32:
function t = ttable(x,y,z)
25-73
25 Truth Table Functions for Decision-Making Logic
% y is equal to 1
YEQ1 = logical(y == 1);
function A1()
% Action #1, "A1"
% Maintain a counter and a circular vector of length 6.
% Every time this action is called,
% output t takes the next value of the vector.
if isempty(counter)
% Initialize counter to be zero
counter = 0;
else
% Otherwise, increment counter
counter = counter + 1;
end
if isempty(values)
% Values is a vector of 1 to cycle
values = zeros(1, cycle);
for i = 1:cycle
values(i) = i;
end
25-74
How Stateflow Generates Content for Truth Tables
plot(values);
end
function A2()
% Action #2, "A2"
% set t to 2
t=2;
%==================================
function A3()
% Action #3, "A3"
% set t to 3
t=3;
%==================================
function A4()
% Action #4, "A4"
% set t to 4
t=4;
25-75
25 Truth Table Functions for Decision-Making Logic
25-76
Truth Table Editor Operations
You can also click the row or column header to select the entire row or column and
press the Delete key.
Run Diagnostics checks the truth table for syntax errors. See Debug a
Truth Table on page 25-44.
View Generated Content displays the code generated for the truth table.
C truth tables generate graphical functions. MATLAB truth tables generate
MATLAB code. For details, see How Stateflow Generates Content for Truth
Tables on page 25-69.
Edit Tables
Both the default Condition Table and the default Action Table have one empty
row. Click a cell to edit its text contents. Use Tab and Shift+Tab to move horizontally
between cells. To add rows and columns to either table, see Append Rows and Columns
on page 25-76.
You set the Truth Table Editor to display only one of the two tables by double-clicking
the header of the table to display. To revert to the display of both tables, double-click the
header of the displayed table.
25-77
25 Truth Table Functions for Decision-Making Logic
Cells for the numbered rows in decision columns like D1 can take values of T, F, or -.
After you select one of these cells, you can use the spacebar to step through the T, F, and
- values. In these cells you can use the left, right, up, and down arrow keys to advance to
another cell in any direction.
1 Right-click any cell in the existing decision column (including the column header).
2 From the context menu, select Insert Column.
Print Tables
Print makes a printed copy or an online viewable copy (HTML file) of the
truth table.
25-78
Truth Table Editor Operations
25-79
26
Matrix-oriented calculations
Data analysis and visualization
26-2
Why Use a MATLAB Function in a Chart?
26-3
26 MATLAB Functions in Stateflow Charts
If you want to call the function only within one state or subchart and its substates,
put your MATLAB function in that state or subchart. That function overrides any
other functions of the same name in the parents and ancestors of that state or
subchart.
If you want to call the function anywhere in that chart, put your MATLAB function at
the chart level.
26-4
MATLAB Functions in a Stateflow Chart
len = length(vals);
mean = avg(vals, len);
stdev = sqrt(sum(((vals-avg(vals,len)).^2))/len);
coder.extrinsic('plot');
plot(vals,'-+');
Note in this example that the MATLAB function can call any of these types of functions:
Local functions
26-5
26 MATLAB Functions in Stateflow Charts
Local functions are defined in the body of the MATLAB function. In this example, avg
is a local function.
Stateflow functions
Graphical, truth table, and other MATLAB functions can be called from a MATLAB
function in a chart.
MATLAB toolbox functions that support code generation
Toolbox functions for code generation are a subset of the functions that you can call
in the MATLAB workspace. These functions generate C code for building targets
that conform to the memory and data type requirements of embedded environments.
In this example, length, sqrt, and sum are examples of toolbox functions for code
generation.
MATLAB toolbox functions that do not support code generation
You can also call extrinsic functions on the MATLAB path that do not generate code.
These functions execute only in the MATLAB workspace during simulation of the
model.
Simulink Design Verifier functions
Simulink Design Verifier software provides MATLAB functions for property proving
and test generation.
sldv.prove
sldv.assume
sldv.test
sldv.condition
26-6
Build Model with MATLAB Function in a Chart
A text field with a flashing cursor appears in the middle of each MATLAB function.
5 Label each function as shown:
26-7
26 MATLAB Functions in Stateflow Charts
You must label a MATLAB function with its signature. Use the following syntax:
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.
6 In the chart, draw a default transition into a terminating junction with this
condition action:
{
mean = meanstats(invals);
stdev = stdevstats(invals);
}
26-8
Build Model with MATLAB Function in a Chart
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 How Scalar Expansion Works for Functions on page 16-6.
7 In the chart, double-click the function meanstats to edit its function body in the
editor.
8 In the function editor, select Tools > Model Explorer to open the Model Explorer.
26-9
26 MATLAB Functions in Stateflow Charts
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.
26-10
Build Model with MATLAB Function in a Chart
12 Connect the Constant and Display blocks to the ports of the Chart block and save the
model.
26-11
26 MATLAB Functions in Stateflow Charts
In the dialog box that appears, there are tabs for both General and Documentation
Properties.
26-12
Specify MATLAB Function Properties in a Chart
26-13
26 MATLAB Functions in Stateflow Charts
26-14
Specify MATLAB Function Properties in a Chart
Field Description
Name MATLAB function read only name. Click the link to
open the function contents in the MATLAB editor.
Function Inline Option Determine whether the function is inlined in the
generated code by choosing one of the following
options:
26-15
26 MATLAB Functions in Stateflow Charts
Field Description
MATLAB Function Setting defines the fimath properties for the
fimath MATLAB function. The fimath properties specified
here are associated with all fi and fimath objects
constructed in the MATLAB function. Choose one of
the following options:
26-16
Program a MATLAB Function in a Chart
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.
3 On the line after the function header, enter:
%#codegen
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
26-17
26 MATLAB Functions in Stateflow Charts
can declare local data for a MATLAB function in a chart to be persistent by using the
persistent construct.
6 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.
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.
7 Now enter this statement:
coder.extrinsic('plot');
8 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.
9 Now, define the local function avg, as follows:
26-18
Program a MATLAB Function in a Chart
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.
The complete code for the function meanstats looks like this:
len = length(vals);
meanout = avg(vals,len);
coder.extrinsic('plot');
plot(vals,'-+');
len = length(vals);
stdevout = sqrt(sum(((vals-avg(vals,len)).^2))/len);
26-19
26 MATLAB Functions in Stateflow Charts
The editor automatically checks your function code for errors and recommends
corrections.
2 In the Stateflow Editor, select Code > C/C++ Code > Build Model.
If there are no errors or warnings, the Builder window appears and reports success.
Otherwise, it lists errors. For example, if you change the name of local function avg
to a nonexistent local function aug in meanstats, errors appear in the Diagnostic
Viewer.
3 The diagnostic message provides details of the type of error and a link to the
code where the error occurred. The diagnostic message also contains a link to a
diagnostic report that provides links to your MATLAB functions and compile-time
type information for the variables and expressions in these functions. If your model
fails to build, this information simplifies finding sources of error messages and aids
understanding of type propagation rules. For more information about this report, see
MATLAB Function Reports (Simulink).
4 In the diagnostic message, click the link after the function name meanstats to
display the offending line of code.
26-20
Debug a MATLAB Function in a Chart
Follow these steps to simulate and debug the meanstats function during run-time
conditions:
1 In the function editor, click the dash (-) character in the left margin of this line:
len = length(vals);
A small red ball appears in the margin of this line, indicating that you have set a
breakpoint.
2 Start simulation for the model.
If you get any errors or warnings, make corrections before you try to simulate again.
Otherwise, simulation pauses when execution reaches the breakpoint you set. A
small green arrow in the left margin indicates this pause.
3 To advance execution to the next line, select Step.
Notice that this line calls the local function avg. If you select Step here, execution
advances past the execution of the local function avg. To track execution of the lines
in the local function avg, select Step In instead.
4 To advance execution to the first line of the called local function avg, select Step In.
Once you are in the local function, you can advance through one line at a time with
the Step tool. If the local function calls another local function, use the Step In tool
to step into it. To continue through the remaining lines of the local function and go
back to the line after the local function call, select Step Out.
5 Select Step to execute the only line in avg.
When avg finishes its execution, you see a green arrow pointing down under its last
line.
6 Select Step to return to the function meanstats.
26-21
26 MATLAB Functions in Stateflow Charts
7 To display the value of the variable len, place your pointer over the text len in the
function editor for at least a second.
You can display the value for any data in the MATLAB function in this way, no
matter where it appears in the function. For example, you can display the values
for the vector vals by placing your pointer over it as an argument to the function
length, or as an argument in the function header.
You can also report the values for MATLAB function data in the MATLAB Command
Window during simulation. When you reach a breakpoint, the debug>> command
prompt appears in the MATLAB Command Window (you might have to press Enter
to see it). At this prompt, you can inspect data defined for the function by entering
the name of the data, as shown in this example:
debug>> len
len =
4
debug>>
As another debugging alternative, you can display the execution result of a function
line by omitting the terminating semicolon. If you do, execution results appear in the
MATLAB Command Window during simulation.
8 To leave the function until it is called again and the breakpoint is reached, select
Continue.
At any point in a function, you can advance through the execution of the remaining
lines of the function with the Continue tool. If you are at the end of the function,
selecting Step does the same thing.
9 Click the breakpoint to remove it and select Quit Debugging to complete the
simulation.
In the model, the computed values of mean and stdev now appear in the Display
blocks.
26-22
Debug a MATLAB Function in a Chart
Specify a Range
To specify a range for input and output data, follow these steps:
1 In the Model Explorer, select the MATLAB function input or output of interest.
The Data properties dialog box opens in the Dialog pane of the Model Explorer.
2 In the Data properties dialog box, click the General tab and enter a limit range, as
described in Limit range properties on page 8-11.
26-23
26 MATLAB Functions in Stateflow Charts
In this section...
About Structures in MATLAB Functions on page 26-24
Define Structures in MATLAB Functions on page 26-24
You can also create structures as local and persistent variables in top-level functions and
local functions of MATLAB functions.
Follow these rules when defining structures for MATLAB functions in Stateflow charts:
For each structure input or output in a MATLAB function, you must define a
Simulink.Bus object in the base workspace to specify its type to the Simulink signal.
MATLAB structures cannot inherit their type from Simulink signals.
MATLAB functions support nonvirtual buses only (see Virtual and Nonvirtual
Buses (Simulink)).
Structures cannot have scopes defined as Constant.
26-24
Connect Structures in MATLAB Functions to Bus Signals in Simulink
When you create structure inputs in MATLAB functions, the function determines
the type, size, and complexity of the structure from the Simulink input signal. When
you create structure outputs, you must define their type, size, and complexity in the
MATLAB function.
You can connect MATLAB structure inputs and outputs to any Simulink bus signal,
including:
Simulink blocks that output bus signals such as Bus Creator blocks
Simulink blocks that accept bus signals as input such as Bus Selector and Gain
blocks
S-Function blocks
Other MATLAB functions
To define structure inputs and outputs for MATLAB functions in Stateflow charts, follow
these steps:
1 Create a Simulink bus object in the base workspace to specify the properties of the
structure you will create in the MATLAB function.
For information about how to create Simulink bus objects, see Create Bus Objects
with the Bus Editor (Simulink).
2 Open the Model Explorer and follow these steps:
a In the Model Hierarchy pane, select the MATLAB function in your chart.
b Add a data object, as described in Add Data Through the Model Explorer on
page 8-3.
The Model Explorer adds a data object and opens a Properties dialog box in its
right-hand Dialog pane.
c In the Properties dialog box, enter the following information in the General tab
fields:
26-25
26 MATLAB Functions in Stateflow Charts
You can define structures as local or persistent variables inside MATLAB functions. For
details, see Structures (MATLAB Coder).
26-26
Define Enumerated Data in MATLAB Functions
To learn how to define and use enumerated data in Stateflow charts, see Define
Enumerated Data in a Chart on page 18-8.
26-27
26 MATLAB Functions in Stateflow Charts
To learn how to declare variable-size data at the chart level, see Declare Variable-Size
Inputs and Outputs on page 17-5.
26-28
Enhance Readability of Generated Code for MATLAB Functions
26-29
27
In this section...
What Is a Simulink Function? on page 27-2
Where to Define a Simulink Function in a Chart on page 27-2
Rules for Using Simulink Functions in Stateflow Charts on page 27-3
Defining a function that requires Simulink blocks, such as lookup tables (see About
Lookup Table Blocks (Simulink))
Scheduling execution of multiple controllers
You can call Simulink functions defined inside of a Stateflow chart from the same chart.
You can also call functions defined by a Simulink Function block in the model.
If you want to call the function within only one state or subchart and its substates,
put your Simulink function in that state or subchart. That function overrides any
other functions of the same name in the parents and ancestors of that state or
subchart.
If you want to call the function anywhere in that chart, put your Simulink function at
the chart level.
27-2
Simulink Functions in Stateflow
This rule applies to continuous-time charts because you cannot call functions during
minor time steps. You can call Simulink functions in state entry or exit actions and
transition actions. However, if you try to call Simulink functions in state during actions
or transition conditions, an error message appears when you simulate your model.
For more information, see Model Hybrid Systems with Model Logic on page 19-5.
Do not call Simulink functions in default transitions if you enable execute-at-initialization mode
If you select Execute (enter) Chart At Initialization in the Chart properties dialog
box, you cannot call Simulink functions in default transitions that execute the first time
that the chart awakens. Otherwise, an error message appears when you simulate your
model.
Use only alphanumeric characters or underscores when naming input and output ports for a
Simulink function
This rule ensures that the names of input and output ports are compatible with identifier
naming rules of Stateflow charts.
For Simulink functions inside a Stateflow chart, the output ports do not support
discontiguous signals. If your function contains a block that outputs a discontiguous
signal, insert a Signal Conversion block between the discontiguous output and the output
port. This action ensures that the output signal is contiguous.
Blocks that can output a discontiguous signal include the Bus Creator block and the Mux
block. For the Bus Creator block, the output is discontiguous only if you clear the Output
as nonvirtual bus check box that is, if the Bus Creator block outputs a virtual bus. If
you select Output as nonvirtual bus, the output signal is contiguous and no conversion
is necessary.
27-3
27 Simulink Functions in Stateflow Charts
For more information, see Bus Creator (Simulink), Mux (Simulink), and Signal
Conversion (Simulink).
If you try to export Simulink functions, an error appears when you simulate your model.
To avoid this behavior, clear the Export Chart Level Functions check box in the Chart
properties dialog box.
If you try to use the Model Explorer to rename a Simulink function, the change does not
appear in the chart. Edit the name in the Symbols pane or click the function box in the
Stateflow Editor to rename the function.
This restriction prevents violations of Moore semantics during chart execution. See
Design Rules for Moore Charts on page 6-11 for more information.
If you try to generate HDL code for charts that contain Simulink functions, an error
message appears when you simulate your model. HDL code generation does not support
Simulink functions.
The input ports of Simulink functions cannot inherit their sizes and data types. The
output ports of a Simulink Function block in Simulink cannot inherit their sizes and data
types. Therefore, you must set sizes and types explicitly when the inputs and outputs are
not scalar data of type double.
The output ports of a Simulink function defined inside a chart can inherit sizes and data
types based on connections inside the subsystem. Therefore, you can specify sizes and
types of these outputs as inherited.
Tip: To minimize updates required for changes in input port properties, you can specify
sizes and data types as parameters.
27-4
Simulink Functions in Stateflow
Verify that function-call expressions have inputs and outputs of correct size
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
How Scalar Expansion Works for Functions on page 16-6.
See Also
Simulink Function
More About
Export Stateflow Functions for Reuse on page 7-34
Create Simulink Functions in a Simulink Model (Simulink)
Simulink Functions (Simulink)
Share Functions Across Simulink and Stateflow on page 27-6
27-5
27 Simulink Functions in Stateflow Charts
This example shows a model calling functions across Simulink and Stateflow. The
slexPrinterExample model has three computer clients sharing a printer. Each computer
creates print jobs by calling the Simulink function addPrintJob.
In this example, the Stateflow chart communicates with the model by:
open_system('slexPrinterExample');
Each computer client invokes the printer server with a call to the Simulink function,
addPrintJob. The addPrintJob function calls the Stateflow graphical function
queuePrintJob to add the print job to the work load. The chart processes the work and
calls the Simulink function printerInk to model usage of printer ink.
27-6
Share Functions Across Simulink and Stateflow
The function printerInk is defined in a Simulink Function block at the top level of
the model. The function interface printerInk(work) defines one input argument. The
Simulink Function, printerInk, also interacts with the model with signal lines through
the inport ink and outport ink'. The state Busy matches the function signature for
printerInk(work) by passing one input argument.
In the chart Queuing and Processing Incoming Jobs, the properties Export Chart
Level Functions and Treat Exported Functions as Globally Visible are selected.
These properties allow the Simulink function addPrintJob to call the chart graphical
function, queuePrintJob.
See Also
Simulink Function
More About
Export Stateflow Functions for Reuse on page 7-34
Simulink Functions (Simulink)
Basic Approach to Defining Simulink Functions in Stateflow Charts on page
27-15
27-7
27 Simulink Functions in Stateflow Charts
In this section...
Advantages of Using Simulink Functions in a Stateflow Chart on page 27-8
Benefits of Using a Simulink Function to Access Simulink Blocks on page 27-8
Benefits of Using a Simulink Function to Schedule Execution of Multiple Controllers
on page 27-11
27-8
Why Use a Simulink Function in a Stateflow Chart?
You place one or more Simulink blocks in a Simulink function of a Stateflow chart. Use a
function call to execute the blocks in that function, as shown.
27-9
27 Simulink Functions in Stateflow Charts
27-10
Why Use a Simulink Function in a Stateflow Chart?
For more information, see Define a Function That Uses Simulink Blocks on page
27-27.
You define each controller as a function-call subsystem block and use output events in a
Stateflow chart to schedule execution of the subsystems, as shown.
27-11
27 Simulink Functions in Stateflow Charts
You define each controller as a Simulink function in a Stateflow chart and use function
calls to schedule execution of the subsystems, as shown.
27-12
Why Use a Simulink Function in a Stateflow Chart?
27-13
27 Simulink Functions in Stateflow Charts
More About
Benefits of Using a Simulink Function to Access Simulink Blocks on page
27-8
Benefits of Using a Simulink Function to Schedule Execution of Multiple
Controllers on page 27-11
Schedule Execution of Multiple Controllers on page 27-36
27-14
Basic Approach to Defining Simulink Functions in Stateflow Charts
2 Move your pointer to the location for the new Simulink function in your chart and
click to insert the function box.
Tip: You can also drag the function from the toolbar.
3 Enter the function signature.
The function signature specifies a name for your function and the formal names for
the arguments and return values. A signature has this syntax:
where simfcn is the name of your function, a_1, a_2, ..., a_n are formal names for
the arguments, and r_1, r_2, ..., r_n are formal names for the return values.
Note: This syntax is the same as what you use for graphical functions, truth tables,
and MATLAB functions. You can define arguments and return values as scalars,
vectors, or matrices of any data type.
4 Click outside the function box.
The following example shows a Simulink function that has the name sim_fcn, which
takes three arguments (a, b, and c) and returns two values (x and y).
27-15
27 Simulink Functions in Stateflow Charts
Note: You can also create and edit a Simulink function by using API methods.
The contents of the subsystem appear: input and output ports that match the
function signature and a single function-call trigger port.
2 Add Simulink blocks to the subsystem.
3 Connect the input and output ports to each block.
The following example shows the subsystem elements for a Simulink function.
27-16
Basic Approach to Defining Simulink Functions in Stateflow Charts
For example, you can specify a size of [2 3] for a 2-by-3 matrix and a data type
of uint8.
2 Click OK.
Note: An input port of a Simulink function cannot inherit size or data type. Therefore,
you define the size and data type of an input that is not scalar data of type double.
However, an output port can inherit size and data type.
More About
Simulink Functions in Stateflow on page 27-2
Why Use a Simulink Function in a Stateflow Chart? on page 27-8
Share Functions Across Simulink and Stateflow on page 27-6
27-17
27 Simulink Functions in Stateflow Charts
In this section...
Bind Behavior of a Simulink Function on page 27-18
Control Subsystem Variables When the Simulink Function Is Disabled on page
27-20
Example of Binding a Simulink Function to a State on page 27-20
Function calls can occur only in state actions and on transitions within the state and
its substates.
When the state is entered, the function is enabled.
When the state is exited, the function is disabled.
For example, the following Stateflow chart shows a Simulink function that binds to a
state.
27-18
How a Simulink Function Binds to a State
Because the function queue resides in state A1, the function binds to that state.
State A1 and its substates A2 and A3 can call queue, but state B1 cannot.
When state A1 is entered, queue is enabled.
When state A1 is exited, queue is disabled.
27-19
27 Simulink Functions in Stateflow Charts
1 In the Simulink function, double-click the trigger port to open the Block Parameters
dialog box.
2 Select an option for States when enabling.
The function queue contains a block diagram that increments a counter by 1 each time
the function executes.
27-20
How a Simulink Function Binds to a State
The Block Parameters dialog box for the trigger port appears as follows.
27-21
27 Simulink Functions in Stateflow Charts
27-22
How a Simulink Function Binds to a State
In the dialog box, setting Sample time type to periodic enables the Sample time
field, which defaults to 1. These settings tell the function to execute for each time step
specified in the Sample time field while the function is enabled.
Note: If you use a fixed-step solver, the value in the Sample time field must be an
integer multiple of the fixed-step size. This restriction does not apply to variable-step
solvers. (For more information, see Solvers (Simulink).)
1 The default transition to state A1 occurs, which includes setting local data u1 to 1.
2 When A1 is entered, the function queue is enabled.
3 Function calls to queue occur until the condition after(5, sec) is true.
4 The transition from state A1 to B1 occurs.
5 When A1 is exited, the function queue is disabled.
6 After two more seconds pass, the transition from B1 to A1 occurs.
7 Steps 2 through 6 repeat until the simulation ends.
27-23
27 Simulink Functions in Stateflow Charts
When state A1 becomes inactive at t = 5, the Simulink function holds the counter value.
When A1 is active again at t = 7, the counter has the same value as it did at t = 5.
Therefore, the output y1 continues to increment over time.
27-24
How a Simulink Function Binds to a State
When state A1 becomes inactive at t = 5, the Simulink function does not hold the counter
value. When A1 is active again at t = 7, the counter resets to zero. Therefore, the output
y1 resets too.
More About
Simulink Functions in Stateflow on page 27-2
Why Use a Simulink Function in a Stateflow Chart? on page 27-8
27-25
27 Simulink Functions in Stateflow Charts
The function f contains a block diagram that increments a counter by 1 each time the
function executes.
At each time step, the function f is called twice, which causes the counter to increment
by 2. Because all call sites share the value of this counter, the data y and y1 increment
by 2 at each time step.
More About
Simulink Functions in Stateflow on page 27-2
27-26
Define a Function That Uses Simulink Blocks
The chart broadcasts the output event CALC_TH to trigger the function-call
subsystem.
The subsystem uses lookup tables to interpolate two values for the shift_logic chart.
27-27
27 Simulink Functions in Stateflow Charts
The subsystem outputs (up_th and down_th) feed directly into the chart as inputs.
You can replace a function-call subsystem with a Simulink function in a chart when:
Note: To skip the conversion steps and access the new model directly, type sf_car at the
MATLAB command prompt.
Type old_sf_car at the MATLAB command prompt. If you simulate the model, you see
these results in the two scopes.
27-28
Define a Function That Uses Simulink Blocks
27-29
27 Simulink Functions in Stateflow Charts
1 In the Simulink model, right-click the Threshold Calculation block in the lower left
corner and select Cut from the context menu.
27-30
Define a Function That Uses Simulink Blocks
27-31
27 Simulink Functions in Stateflow Charts
Tip: To change the font size of a function, right-click the function box and select a
new size from the Font Size menu.
5 Expand the border of selection_state to include the new function.
27-32
Define a Function That Uses Simulink Blocks
Note: The function resides in this state instead of the chart level because no other
state in the chart requires the function outputs up_th and down_th. See How a
Simulink Function Binds to a State on page 27-18.
6 Rename the Simulink function from Threshold_Calculation to
calc_threshold by entering [down_th, up_th] = calc_threshold(gear,
throttle) in the function box.
In the Model Explorer, change the scope of chart-level data up_th and down_th to
Local because calculations for those data now occur inside the chart.
27-33
27 Simulink Functions in Stateflow Charts
In the Stateflow Editor, change the during action in selection_state to call the
Simulink function calc_threshold.
Because the function calc_threshold takes throttle as an input, you must define
that data as a chart input. (For details, see Add Stateflow Data on page 8-2.)
Using port 1 prevents signal lines from overlapping in the Simulink model.
2 In the Simulink model, add a signal line for throttle between the inport of the
Engine block and the inport of the shift_logic chart.
27-34
Define a Function That Uses Simulink Blocks
1 In the Model Explorer, delete the function-call output event CALC_TH because the
Threshold Calculation block no longer exists.
2 Delete any dashed signal lines from your model.
If you simulate the new model, the results match those of the original design.
More About
Simulink Functions in Stateflow on page 27-2
Basic Approach to Defining Simulink Functions in Stateflow Charts on page 27-15
27-35
27 Simulink Functions in Stateflow Charts
27-36
Schedule Execution of Multiple Controllers
The chart broadcasts the output events A1, A2, and A3 to trigger the function-call
subsystems.
The subsystems A1, A2, and A3 execute at different rates defined by the chart.
The subsystem outputs feed directly into the chart.
You can replace function-call subsystems with Simulink functions inside a chart when:
Note: To skip the conversion steps and access the new model directly, type
sf_temporal_logic_scheduler_with_sl_fcns at the MATLAB command prompt.
27-37
27 Simulink Functions in Stateflow Charts
For more information, see Schedule Subsystems to Execute at Specific Times on page
24-17.
Follow these steps to add Simulink functions to the Temporal Logic Scheduler chart.
27-38
Schedule Execution of Multiple Controllers
1 In the Simulink model, right-click the A1 block in the lower right corner and select
Cut from the context menu.
27-39
27 Simulink Functions in Stateflow Charts
Tip: To change the font size of a function, right-click the function box and select a
new size from the Font Size menu.
5 Rename the Simulink function from A1 to f1 by entering y = f1(u) in the function
box.
6 Repeat steps 1 through 5 for these cases:
27-40
Schedule Execution of Multiple Controllers
Note: The new functions reside at the chart level because both states
FastScheduler and SlowScheduler require access to the function outputs.
In the Model Explorer, change the scope of chart-level data y to Local because the
calculation for that data now occurs inside the chart.
27-41
27 Simulink Functions in Stateflow Charts
In the Stateflow Editor, you can replace event broadcasts in state actions with function
calls.
1 Edit the state actions in FastScheduler and SlowScheduler to call the Simulink
functions f1, f2, and f3.
du: y = u1-y2;
27-42
Schedule Execution of Multiple Controllers
For the on every state actions of FastScheduler and SlowScheduler, define three
data. (For details, see Add Stateflow Data on page 8-2.)
Tip: To flip the Scope block, right-click and select Rotate & Flip > Flip Block from
the context menu.
1 In the Model Explorer, delete output events A1, A2, and A3 and input data u2
because the function-call subsystems no longer exist.
2 Delete any dashed signal lines from your model.
27-43
27 Simulink Functions in Stateflow Charts
If you simulate the new model, the results match those of the original design.
More About
Simulink Functions in Stateflow on page 27-2
Basic Approach to Defining Simulink Functions in Stateflow Charts on page 27-15
27-44
28
Build Targets
Related Examples
Choose a Procedure to Simulate a Model on page 28-3
Generate C/C++ Code for Rapid Prototyping or Production Deployment on page
28-16
28-2
Choose a Procedure to Simulate a Model
In this section...
Guidelines for Simulation on page 28-3
Choose the Right Procedure for Simulation on page 28-3
28-3
28 Build Targets
See Yes
Speeding Up Speed up
Simulation. simulation?
No
Yes
See
C++ Integrating
C or C++? Custom C++
Code for
Simulation.
No
See Integrating
No Custom C Code
Any library for Nonlibrary
charts? Charts for
Simulation.
Yes
More About
Speed Up Simulation on page 28-14
Set Up Your Own Target Compiler
28-4
Integrate Custom C/C++ Code for Simulation
1 Add a C function wrapper to your custom code. This wrapper function executes the C
++ code that you are including.
28-5
28 Build Targets
The value _cplusplus exists if your compiler supports C++ code. The extern "C"
wrapper specifies C linkage with no name mangling.
Task 2: Include Custom C++ Source and Header Files for Simulation
To include custom C++ code for simulation, you must configure your simulation target
and select C++ as the custom code language:
You can change the default compiler by calling the mex setup command, and following
the instructions. For a list of supported compilers, see www.mathworks.com/support/
compilers/current_release/.
Specify custom code options in the simulation target for your model:
28-6
Integrate Custom C/C++ Code for Simulation
Follow the guidelines in Specify Relative Paths for Custom Code on page 28-23.
Source file Enter code lines to include at the top of a generated source code
file. These code lines appear at the top of the generated model.c source file,
outside of any function.
For example, you can include extern int declarations for global variables.
Header file Enter code lines to include at the top of the generated model.h
header file that declares custom functions and data in the generated code. These
code lines appear at the top of all generated source code files and are visible to all
generated code.
28-7
28 Build Targets
Note: When you include a custom header file, you must enclose the file name
in double quotes. For example, #include ''sample_header.h'' is a valid
declaration for a custom header file.
Since the code you specify in this option appears in multiple source files that link
into a single binary, limitations exist on what you can include. For example, do
not include a global variable definition such as int x; or a function body such as
void myfun(void)
{
...
}
These code lines cause linking errors because their symbol definitions appear
multiple times in the source files of the generated code. You can, however, include
extern declarations of variables or functions such as extern int x; or extern
void myfun(void);.
Initialize function Enter code statements that execute once at the start of
simulation. Use this code to invoke functions that allocate memory or perform
other initializations of your custom code.
Terminate function Enter code statements that execute at the end of
simulation. Use this code to invoke functions that free memory allocated by the
custom code or perform other cleanup tasks.
Include directories Enter a space-separated list of the folder paths that
contain custom header files that you include either directly (see Header file
option) or indirectly in the compiled target.
Source files Enter a list of source files to compile and link into the target. You
can separate source files with a comma, a space, or a new line.
Libraries Enter a space-separated list of static libraries that contain custom
object code to link into the target.
4 Click OK.
Tip: If you want to rebuild the target to include custom code changes, select Code > C/C+
+ Code > Build Model in the Stateflow Editor.
28-8
Integrate Custom C/C++ Code for Simulation
Specify custom code options in the simulation target for each library model that
contributes a chart to the main model:
1 In the Stateflow Editor, select Simulation > Debug > Simulation Target For
MATLAB & Stateflow.
28-9
28 Build Targets
2 In the All Parameters tab, select Use local custom code settings (do not
inherit from main model).
This step ensures that each library model retains its own custom code settings
during simulation.
3 Specify your custom code in the subpanes.
Follow the guidelines in Specify Relative Paths for Custom Code on page 28-23.
28-10
Integrate Custom C/C++ Code for Simulation
Note: See Task 1: Include Custom C Code in the Simulation Target on page
28-6 for descriptions of the custom code options.
4 Click OK.
Task 1: Include Custom C Code in the Simulation Target for the Main Model
Specify custom code options in the simulation target for your main model:
28-11
28 Build Targets
Follow the guidelines in Specify Relative Paths for Custom Code on page 28-23.
Note: See Task 1: Include Custom C Code in the Simulation Target on page
28-6 for descriptions of the custom code options.
4 Click OK.
By default, settings in the Simulation Target pane for the main model apply to all
charts contributed by library models.
Tip: If you want to rebuild the target to include custom code changes, select Code > C/C+
+ Code > Build Model in the Stateflow Editor.
28-12
Integrate Custom C/C++ Code for Simulation
Task 2: Ensure That Custom C Code for the Main Model Applies to Library Charts
Configure the simulation target for each library model that contributes a chart to your
main model:
1 In the Stateflow Editor, select Simulation > Debug > Simulation Target For
MATLAB & Stateflow.
2 In the All Parameters tab, clear the Use local custom code settings (do not
inherit from main model) check box.
This step ensures that library charts inherit the custom code settings of your main
model.
3 Click OK.
Start Simulation
Simulate your model by clicking the play button in the toolbar of the editor.
For information on setting simulation options using the command-line API, see
Command-Line API to Set Simulation and Code Generation Parameters on page
28-18.
Note: You cannot simulate only the Stateflow blocks in a library model. You must first
create a link to the library block in your main model and then simulate the main model.
28-13
28 Build Targets
Speed Up Simulation
In this section...
Performance of Model Update on page 28-14
Disable Simulation Target Options That Impact Execution Speed on page 28-14
Keep Charts Closed to Speed Up Simulation on page 28-15
Keep Scope Blocks Closed to Speed Up Simulation on page 28-15
Use Library Charts in Your Model on page 28-15
Some charts do not qualify for JIT mode, such as charts with:
For charts that do not qualify for JIT mode, Stateflow generates C code with debugging
support. The C code is built into an executable file that is used during simulation.
To gain optimal performance for charts that do not qualify for JIT mode, turn off
debugging using this command.
After you run this command, these charts do not have debugging, animation, or run-time
error checking.
28-14
Speed Up Simulation
Echo expressions without semicolons Clear this check box to disable run-time
output in the MATLAB Command Window, such as actions that do not terminate
with a semicolon.
Ensure responsiveness Clear this check box to disable ability to break out of
long-running execution using Ctrl+C.
Click OK.
For more information about using library charts, see Create Specialized Chart Libraries
for Large-Scale Modeling on page 22-19.
28-15
28 Build Targets
28-16
Optimize Generated Code
For more information, see Design Tips for Optimizing Generated Code for Stateflow
Objects (Simulink Coder) and Reduce Memory Usage for Boolean and State
Configuration Variables (Simulink Coder).
28-17
28 Build Targets
In this section...
How to Set Parameters at the Command Line on page 28-18
Simulation Parameters for Nonlibrary Models on page 28-19
Simulation Parameters for Library Models on page 28-21
object_name = getActiveConfigSet(gcs)
This command returns an object handle to the model settings in the Model
Configuration Parameters dialog box for the current model.
2 To set a parameter for that dialog box, type:
object_name.set_param('parameter_name', value)
This command sets a configuration parameter to the value that you specify.
For example, you can set the Reserved names parameter for simulation by typing:
cp = getActiveConfigSet(gcs)
cp.set_param('SimReservedNameArray', {'abc','xyz'})
Note: You can also get the current value of a configuration parameter by typing:
object_name.get_param('parameter_name')
For more information about using get_param and set_param, see the Simulink
documentation.
28-18
Command-Line API to Set Simulation and Code Generation Parameters
28-19
28 Build Targets
28-20
Command-Line API to Set Simulation and Code Generation Parameters
28-21
28 Build Targets
More About
Recommended Settings Summary for Model Configuration Parameters (Simulink
Coder)
28-22
Specify Relative Paths for Custom Code
You can use the forward slash (/) or backward slash (\) as a file separator, regardless
of whether you are on a UNIX or PC platform. The makefile generator returns the
path names with the correct platform-specific file separators.
You can use tokens that evaluate in the MATLAB workspace, if you enclose them
with dollar signs ($...$). For example, consider this path:
$mydir1$\dir1
In this example, mydir1 is a variable that you define in the MATLAB workspace
as 'd:\work\source\module1'. In the generated code, this custom include path
appears as:
28-23
28 Build Targets
d:\work\source\module1\dir1
You must enclose paths in double quotes if they contain spaces or other nonstandard
path characters, such as hyphens (-).
28-24
Share Data Using Custom C Code
28-25
28 Build Targets
The chart contains two states A and B, along with a Simulink input named
input_data, which you can set to 0 or 1 by toggling the Manual Switch in the model
during simulation.
2 Open the Model Configuration Parameters dialog box.
3 In the Model Configuration Parameters dialog box, select the Simulation Target
pane.
4 Select the Header file subpane.
28-26
Share Data Using Custom C Code
In this example, you define two constants named TRUE and FALSE to move between
states in your chart, instead of using the values 1 and 0. These custom definitions
improve the readability of your chart actions. Note that TRUE and FALSE are not
Stateflow data objects.
Because the two custom definitions appear at the top of your generated machine header
file ex_custom_code_global_constants_sfun.h, you can use TRUE and FALSE in all
charts that belong to this model.
28-27
28 Build Targets
The chart contains two states A and B, along with three data objects: input_data,
local_data, and out_data. The chart accesses a custom variable named
myglobal and calls a custom function named my_function.
2 Open the Model Configuration Parameters dialog box.
3 In the Model Configuration Parameters dialog box, select the Simulation Target
pane.
4 Select the Header file subpane.
28-28
Share Data Using Custom C Code
Note: When you include a custom header file, you must enclose the file name in
double quotes.
#define TRUE 1
#define FALSE 0
#define MAYBE 2
This header file also contains declarations for the variable myglobal and the
function my_function:
28-29
28 Build Targets
The single period (.) indicates that all your custom code files reside in the same
folder as ex_custom_code_global_constants_vars_fcns.
Tip: To direct your makefile to look for header or source files in a subfolder relative
to the model folder, use this relative path name:
.\subfolder_name
6 Select the Source files subpane.
Tip: To include a source file that resides in a subfolder relative to the model folder,
use this relative path name:
.\subfolder_name\source_file.c
In this example, you define three constants, a variable, and a function via custom code
options. Because the custom definitions appear at the top of your generated machine
header file ex_custom_code_global_constants_vars_fcns_sfun.h, you can access
them in all charts that belong to this model.
Note: Do not share fixed-point data between your custom code and your Stateflow chart.
Stateflow expects data returned from custom code to be of type double.
28-30
Parse Stateflow Charts
If parsing is unsuccessful, the chart automatically appears with the highlighted object
that causes the first parse error. You can select the error in the diagnostic window to
bring its source chart to the front with the source object highlighted. Any unresolved data
or events in the chart are flagged in the Symbol Wizard.
28-31
28 Build Targets
In this section...
Search for Undefined Symbols on page 28-32
Resolve Undefined Data in the Symbols Window on page 28-33
Define Chart Symbols with the Symbol Wizard on page 28-33
Rules for Inferring the Scope of Unresolved Symbols on page 28-34
Inference of Size, Type, and Complexity on page 28-35
View the Symbols window and look for a red error icon . When you hover your
cursor over the icon, you see Undefined symbol.
Parse a chart by selecting Chart > Parse Chart.
Start simulation by selecting Simulation > Run in the model window.
Update the model diagram by selecting Simulation > Update Diagram in the model
window.
The parser behaves differently depending on how you set Parse custom code symbols
in the Model Configuration Parameters dialog box, on the Simulation Target pane.
For C charts, if you select the Parse custom code symbols check box, the parser
tries to find unresolved chart symbols in the custom code. If the custom code does not
define these symbols, they are flagged in the Symbol Wizard. The Symbol Wizard
suggests scopes for unresolved data and event symbols. This option is not available for
charts that use MATLAB as the action language.
If you do not select the Parse custom code symbols check box, the parser considers
unresolved data symbols in the chart to be defined in the custom code. If the custom
code does not define these symbols, an error does not appear until make time.
Note: When you parse a chart, Stateflow has access to all required information for
detecting unresolved symbols, such as enumerated data types and exported graphical
28-32
Resolve Undefined Symbols in Your Chart
functions from other charts. However, there can be false alarms from data types
inherited from Simulink.
For information about Simulink symbol resolution, see Symbol Resolution (Simulink)
and Symbol Resolution Process (Simulink).
button,
If the inferred scope is incorrect for any events or data, you can change the scope in the
Symbol Wizard. You can also change the class of a symbol between data and event.
28-33
28 Build Targets
To accept, reject, or change the scope of a recommended item, perform one of these steps:
After you edit the symbol definitions, click OK to add the symbols to the Stateflow
hierarchy.
28-34
Resolve Undefined Symbols in Your Chart
Stateflow follows these rules for inferring the scope of unresolved event symbols.
Size is 1 (inherited).
Type is Inherit: Same as Simulink or Inherit: From definition in
chart (for local data, and function inputs and outputs).
Complexity is Inherited.
More About
Add Stateflow Data on page 8-2
Set Data Properties on page 8-6
Type Stateflow Data on page 8-36
Size Stateflow Data on page 8-44
Detect Unused Data in the Symbols Window on page 8-4
Trace Data, Events, and Messages with the Symbols Window on page 30-7
28-35
28 Build Targets
28-36
Traceability of Stateflow Objects in Generated Code
Verify generated code. You can identify which Stateflow object corresponds to a line of
code and keep track of code from different objects that you have or have not reviewed.
Include comments in code generated for large-scale models. You can identify objects in
generated code and avoid manually entering comments or descriptions.
To enable traceability comments, you must have Embedded Coder or HDL Coder
software. For C/C++ code generation, comments appear in the generated code for
embedded real-time (ert) based targets only.
For more information about traceability and generated C/C++ code, see Trace Code
to Model Objects by Using Hyperlinks (Embedded Coder) and Trace Model Objects
to Generated Code (Embedded Coder). For more information about traceability and
generated HDL code, see Traceability Report (HDL Coder).
28-37
28 Build Targets
For charts that include atomic subcharts, you must separately declare functions that
are not supported for code generation individually with coder.extrinsic within the
atomic subchart.
To create a call for the extrinsic function heaviside, the following model uses
coder.extrinsic.
The chart contains two parallel states, A and B, and one graphical function block, foo.
State A declares the function heaviside, which is not supported for code generation,
using coder.extrinsic. State B and the graphical function block also use heaviside
without coder.extrinsic.
The input for state A is u1, a sine wave, and the input for state B is u2, a cosine wave.
The graphical function out outputs the heaviside of any input in.
28-38
Call Extrinsic Functions in a Stateflow Chart
You only need to declare heaviside once in your chart using coder.extrinsic.
After this you can use the heaviside function anywhere within your chart without
coder.extrinsic. When generating code the functions that you declare using
coder.extrinsic will have a call to the extrinsic function, and that function will not
appear in the generated code.
28-39
28 Build Targets
See Also
coder.extrinsic | heaviside
More About
Generate Code for Global Data (MATLAB Coder)
28-40
Call Extrinsic Functions in a Stateflow Chart
Functions and Objects Supported for C/C++ Code Generation Alphabetical List
(Simulink)
28-41
29
29-2
Animate Stateflow Charts
Lightning Fast
Fast
Medium
Slow
None
Lightning Fast animation provides the fastest simulation speed by buffering the
highlights. During Lightning Fast animation, the more recently highlighted objects are
in a bolder, lighter blue. These highlights fade away as simulation time progresses.
The default animation speed, Fast, shows the active highlights at each time step. To add
a delay with each time step, set the animation speed to Medium or Slow.
Maintain Highlighting
To maintain highlighting of active states in the chart after simulation ends, select
Simulation > Stateflow Animation > Maintain Highlighting.
Disable Animation
Animation is enabled by default in Stateflow charts. To turn off animation for a chart, in
the Stateflow editor, select Simulation > Stateflow Animation > None.
29-3
29 Debug and Test Stateflow Charts
For more information, see What You Can Do with a Host/Target Communication
Channel (Simulink Coder) and Animate Stateflow Charts in External Mode (Simulink
Coder).
29-4
Set Breakpoints to Debug Charts
In this section...
Types of Breakpoints on page 29-5
Set a Breakpoint for a Stateflow Object on page 29-7
Visual Indication of Execution at Breakpoints on page 29-8
Types of Breakpoints
You enable debugging for a chart when you set a breakpoint. A breakpoint indicates a
point at which Stateflow halts execution of a chart that you are simulating. You can then
view Stateflow data and the MATLAB workspace to examine the status of the chart.
29-5
29 Debug and Test Stateflow Charts
You can set both types of breakpoints for local events, but only Start
of Broadcast for input events.
Breakpoints appear as a circular badge in the associated object. For example, the
following chart contains breakpoints on state On and the transition from On to Off.
The badge can represent one or more breakpoints on an object. Hover your cursor
over the badge to see which breakpoints are set. For example, the badge on state On
represents two breakpoints: On State Entry and During State.
29-6
Set Breakpoints to Debug Charts
29-7
29 Debug and Test Stateflow Charts
Clicking the breakpoint badge opens the Breakpoints dialog box. You can add or clear
breakpoints by selecting the check box next to the breakpoint type.
Selecting Manage breakpoints opens the Stateflow Breakpoints and Watch window.
In this window, you can manage conditions for all breakpoints. For each breakpoint, you
can:
Set conditions
Enable the breakpoint
Disable the breakpoint
Clear the breakpoint
View the hit count, or number of times a breakpoint has been encountered during
simulation.
For more information, see Manage Stateflow Breakpoints and Watch Data on page
29-12.
29-8
Set Breakpoints to Debug Charts
29-9
29 Debug and Test Stateflow Charts
The currently executing HIGH substate appears highlighted in green, along with an
execution status badge , indicating execution stopped at state entry.
29-10
Set Breakpoints to Debug Charts
When you hover the cursor over the badge, a tooltip is displayed, indicating:
29-11
29 Debug and Test Stateflow Charts
In this section...
Set Conditions on Breakpoints on page 29-12
Disable and Enable Breakpoints on page 29-15
View Breakpoint Hits on page 29-16
Clear Breakpoints and Watch Data on page 29-16
Format Watch Display on page 29-17
Save and Restore Breakpoints and Watch Data on page 29-18
This example shows setting a conditional breakpoint in the model sf_car. It shows how
you can see speed increasing leading up to the car upshifting. First, set a breakpoint
on the transition from steady_state to upshifting of type When Transition is
Tested.
29-12
Manage Stateflow Breakpoints and Watch Data
Without a condition on this breakpoint, simulation pauses every time the transition
is tested, even when the value of speed is far below up_th. To inspect the chart just
before the transition is taken, you want the software to pause simulation only when the
value of speed is approaching the value of up_th. When you set the condition speed
> up_th-2 on the breakpoint, then simulation pauses only when the value of speed
reaches within 2 of the value of up_th.
29-13
29 Debug and Test Stateflow Charts
When simulation pauses, you can view the values for the variables speed and up_th in
the Watch tab. To add each variable to the Watch tab:
For more information, see Watch Stateflow Data Values on page 29-35.
29-14
Manage Stateflow Breakpoints and Watch Data
29-15
29 Debug and Test Stateflow Charts
If all the breakpoints for a graphical object are disabled, its badge changes from red to
gray.
If there is at least one breakpoint enabled for an object, then the breakpoint badge
remains red.
To enable the breakpoint, select the box next to the breakpoint name.
To disable and enable all Stateflow breakpoints, clear or check the box at the top of the
check box column.
the name of the breakpoint or watch data. Click the icon that appears to the right of
the name.
29-16
Manage Stateflow Breakpoints and Watch Data
To add breakpoints and watch data, see Set Breakpoints to Debug Charts on page 29-5
and Watch Stateflow Data Values on page 29-35.
You can change the format of watch data. Select the gear icon, . From the drop-down
list, choose the desired MATLAB format for each data type.
29-17
29 Debug and Test Stateflow Charts
For more information on the floating point and integer formats, see format (MATLAB).
For more information on fixed-point formats, see storedInteger (Fixed-Point Designer)
and double (Fixed-Point Designer).
You can save a snapshot of the breakpoints and watch data list, and then reload it at any
point in the current or subsequent MATLAB session. To save a snapshot, click the save
icon, , and name the snapshot file. To restore a snapshot, click the restore icon, ,
and choose the snapshot file.
29-18
Control Chart Execution from the Stateflow Editor
Badge Description
Execution stopped in a states during action, graphical function, or
truth table function.
Execution stopped before entering a chart or state.
Options for controlling chart execution appear in the editor tool bar and the
Simulation menu.
A tooltip indicates:
29-19
29 Debug and Test Stateflow Charts
Set conditions and enable/disable breakpoints in the Stateflow Breakpoints and Watch
window. For more information, see Manage Stateflow Breakpoints and Watch Data on
page 29-12.
29-20
Debug Run-Time Errors in a Chart
In this section...
Create the Model and the Stateflow Chart on page 29-21
Debug the Stateflow Chart on page 29-23
Correct the Run-Time Error on page 29-23
29-21
29 Debug and Test Stateflow Charts
3 In your chart, add an event Switch with a scope of Input from Simulink and a
Rising edge trigger.
4 Add a data Shift with a scope of Input from Simulink.
The chart has two states at the highest level in the hierarchy, Power_off and
Power_on. By default, Power_off is active. The event Switch toggles the system
between the Power_off and Power_on states. Power_on has three substates: First,
Second, and Third. By default, when Power_on becomes active, First also becomes
active. When Shift equals 1, the system transitions from First to Second, Second to
Third, Third to First, for each occurrence of the event Switch, and then the pattern
repeats.
29-22
Debug Run-Time Errors in a Chart
In the model, there is an event input and a data input. A Sine Wave block generates a
repeating input event that corresponds with the Stateflow event Switch. The Step block
generates a repeating pattern of 1 and 0 that corresponds with the Stateflow data object
Shift. Ideally, the Switch event occurs at a frequency that allows at least one cycle
through First, Second, and Third.
Because you specified a breakpoint on chart entry, execution stops at that point.
3
Click the Step In button, .
After each step, watch the chart animation to see the sequence of execution.
Single-stepping shows that the chart does not exhibit the desired behavior. The
transitions from First to Second to Third inside the state Power_on are not occurring
because the transition from Power_on to Power_off takes priority. The output display
of code coverage also confirms this observation.
29-23
29 Debug and Test Stateflow Charts
Now the transition from Power_on to Power_off does not occur until simulation
time is greater than 20.0.
3 Begin simulation again.
4 Click the Step In button repeatedly to observe the new behavior.
29-24
Common Modeling Errors Stateflow Can Detect
States in a Stateflow chart are inconsistent if they violate any of these rules:
An active state (consisting of at least one substate) with exclusive (OR) decomposition
has exactly one active substate.
All substates of an active state with parallel (AND) decomposition are active.
All substates of an inactive state with either exclusive (OR) or parallel (AND)
decomposition are inactive.
An error occurs at compile time when the following conditions are all true:
A transition leads to a state that has exclusive (OR) decomposition and multiple
substates. There are no default paths that lead to the entry of any substate. This
condition results in a state inconsistency error. (However, if all transitions into that
state are supertransitions leading directly to the substates, there is no error.)
The state with multiple substates does not contain a history junction.
You can control the level of diagnostic action that occurs due to omission of a default
transition in the Diagnostics > Stateflow pane of the Model Configuration Parameters
dialog box. For more information, see the documentation for the No unconditional
default transitions (Simulink) diagnostic.
29-25
29 Debug and Test Stateflow Charts
In the absence of a default transition indicating which substate is to become active, the
chart has a state inconsistency error.
Adding a default transition to one of the substates resolves the state inconsistency.
Conflicting transitions are two equally valid paths from the same source in a Stateflow
chart during simulation. In the case of a conflict, Stateflow software evaluates equally
valid transitions based on ordering mode in the chart: explicit or implicit.
For explicit ordering (the default mode), evaluation of conflicting transitions occurs
based on the order you specify for each transition. For details, see Explicit Ordering
of Outgoing Transitions on page 3-61.
29-26
Common Modeling Errors Stateflow Can Detect
The default transition to state A assigns data a equal to 1 and data b equal to 10. The
during action of state A increments a and decrements b during each time step. The
transition from state A to state B is valid if the condition [a > 4] is true. The transition
from state A to state C is valid if the condition [b < 7] is true. During simulation,
there is a time step where state A is active and both conditions are true. This issue is a
transition conflict.
Conflict Resolution for Explicit Ordering
For explicit ordering, the chart resolves the conflict by evaluating outgoing transitions in
the order that you specify explicitly. For example, if you right-click the transition from
state A to state C and select Execution Order > 1 from the context menu, the chart
evaluates that transition first. In this case, the transition from state A to state C occurs.
Conflict Resolution for Implicit Ordering
For implicit ordering, the chart evaluates multiple outgoing transitions with equal label
priority in a clockwise progression starting from the twelve o'clock position on the state.
In this case, the transition from state A to state B occurs.
29-27
29 Debug and Test Stateflow Charts
When a data object equals a value outside the range of the values set in the Initial
value, Minimum, and Maximum fields specified in the Data properties dialog box
See Set Data Properties on page 8-6 for a description of the Initial value,
Minimum, and Maximum fields in the Data properties dialog box.
When the result of a fixed-point operation overflows its bit size
See Detect Overflow for Fixed-Point Types on page 20-10 for a description of the
overflow condition in fixed-point numbers.
When you select Saturate on integer overflow for your chart, Stateflow does not flag
any cases of integer overflow during simulation. However, Stateflow continues to flag
out-of-range data violations based on minimum-and-maximum range checks. For more
information, see Impact of Saturation on Error Checks on page 8-52.
To enable data range violation checking, set Simulation range checking in the
Diagnostics: Data Validity pane of the Configuration Parameters dialog box to error.
Assume that the data a has an Initial value and Minimum value of 0 and a Maximum
value of 2. Each time an event awakens this chart and state A is active, a increments.
The value of a quickly becomes a data range violation.
29-28
Common Modeling Errors Stateflow Can Detect
To turn off cyclic behavior checking, uncheck Simulation > Debug > MATLAB &
Stateflow Error Checking Options > Detect Cycles.
This chart shows how an event broadcast can cause infinite recursive cycles.
29-29
29 Debug and Test Stateflow Charts
When the state C during action executes, event E1 is broadcast. The transition from
state A.A1 to state A.A2 becomes valid when event E1 is broadcast. Event E2 is
broadcast as a condition action of that transition. The transition from state B.B1 to state
B.B2 becomes valid when event E2 is broadcast. Event E1 is broadcast as a condition
action of the transition from state B.B1 to state B.B2. Because these event broadcasts of
E1 and E2 are in condition actions, a recursive event broadcast situation occurs. Neither
transition can complete.
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
This chart shows an example of cyclic behavior in a flow chart that Stateflow cannot
detect.
The data object i is set to 0 in the condition action of the default transition. i increments
in the next transition segment condition action. The transition to the third connective
29-30
Common Modeling Errors Stateflow Can Detect
junction is valid only when the condition [i < 0] is true. This condition is never true in
this flow chart, resulting in a cycle.
Stateflow cannot detect this cycle because it does not involve recursion due to event
broadcasts. Although Stateflow cannot detect cycles that depend on data values, a
separate diagnostic error does appear during simulation, for example:
Junction is part of a cycle and does not have an
unconditional path leading to termination.
For information on fixing cyclic behavior in flow charts, type the following at the
MATLAB command prompt:
sfhelp('cycle_error');
This chart shows an example of noncyclic behavior that Stateflow flags as being cyclic.
State A becomes active and i is initialized to 0. When the transition is tested, the
condition [i < 5] is true. The condition actions that increment i and broadcast the
event E are executed. The broadcast of E when state A is active causes a repetitive testing
(and incrementing of i) until the condition is no longer true. Stateflow flags this behavior
as a cycle, but the so-called cycle breaks when i becomes greater than 5.
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
29-31
29 Debug and Test Stateflow Charts
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
29-32
Guidelines for Avoiding Unwanted Recursion in a Chart
However, unwanted recursion can also occur during chart execution. To avoid unwanted
recursion, follow these guidelines:
Suppose that you have functions named f, g, and h in a chart. These functions can be
any combination of graphical functions, truth table functions, MATLAB functions, or
Simulink functions.
Use directed local event broadcasts with the syntax send(event,state). The event
is a local event in the chart and the state is the destination state that you want to
wake up using the event broadcast.
If the source of the local event broadcast is a state action, ensure that the destination
state is not an ancestor of the source state in the chart hierarchy.
If the source of the local event broadcast is a transition, ensure that the destination
state is not an ancestor of the transition in the chart hierarchy.
Also, ensure that the transition does not connect to the destination state.
If you have undirected local event broadcasts in state actions or condition actions in your
chart, a warning appears by default during simulation. Examples of state actions with
undirected local event broadcasts include:
29-33
29 Debug and Test Stateflow Charts
You can control the level of diagnostic action for undirected local event broadcasts in
the Diagnostics > Stateflow pane of the Configuration Parameters dialog box. Set the
Undirected event broadcasts diagnostic to none, warning, or error.
29-34
Watch Stateflow Data Values
To add active state data and truth table data to the watch list, from the Model Explorer,
open the Data Properties dialog box. Select Add to Watch Window.
You can choose the display format for each data type. For more information, see Format
Watch Display on page 29-17.
29-35
29 Debug and Test Stateflow Charts
For example, the following chart stops execution before entering the Debounce state.
Hovering over the transition from the Normal state to the On state shows that the value
of sw is 3.6333.
Because the value of sw is greater than zero, the chart takes the transition from Normal
to enter the Debounce state.
29-36
Watch Stateflow Data Values
len = length(vals);
mean = avg(vals, len);
stdev = sqrt(sum(((vals-avg(vals,len)).^2))/len);
coder.extrinsic('plot');
plot(vals,'-+'); % Breakpoint set at this line
When simulation reaches the breakpoint, you can display Stateflow data in the MATLAB
Command Window.
Command Description
dbstep Advance to next executable line of code.
29-37
29 Debug and Test Stateflow Charts
Command Description
dbstep [in/ When debugging MATLAB functions in a chart:
out]
dbstep [in] advances to the next executable line of code. If
that line contains a call to another function, execution continues
to the first executable line of the function.
dbstep [out] executes the rest of the function and stops just
after leaving the function.
dbcont Continue execution to next breakpoint.
dbquit (ctrl-c) Stop simulation of the model. Press Enter after this command to
return to the command prompt.
help Display help for command-line debugging.
print var Display the value of the variable var.
...or...
var
var (i) Display the value of the ith element of the vector or matrix var.
var (i:j) Display the value of a submatrix of the vector or matrix var.
save Saves all variables to the specified file. Follows the syntax of the
MATLAB save command. To retrieve variables in the MATLAB
base workspace, use the load command after simulation has ended.
whos Display the size and class (type) of all variables in the scope of the
halted MATLAB function in your chart.
You can issue any other MATLAB command at the debug>> prompt but the results are
executed in the Stateflow workspace. For example, you can issue the MATLAB command
plot(var) to plot the values of the variable var.
To issue a command in the MATLAB base workspace at the debug>> prompt, use the
evalin command with the first argument 'base' followed by the second argument
command, for example, evalin('base','whos').
Note: To return to the MATLAB base workspace, use the dbquit command.
29-38
Change Data Values During Simulation
data_name = new_value
For a list of data that you cannot change, see Data That Is Read-Only During
Simulation on page 29-42. You cannot change message data values at the command
line.
Suppose that, after the debug>> prompt appears, you enter whos at the prompt and see
the following data:
29-39
29 Debug and Test Stateflow Charts
If you try to enter airflow = 2, you get an error message because MATLAB interprets
that expression as the assignment of a double value to data of uint8 type. For
reference, see Cases When Casting Is Necessary on page 29-43.
Multidimensional Example
Suppose that, after the debug>> prompt appears, you enter whos at the prompt and see
the following data:
One-based indexing applies when you change values of Stateflow data while the chart is
in debug mode.
Variable-Size Example
Suppose that, after the debug>> prompt appears, you enter whos at the prompt and see
the following data:
29-40
Change Data Values During Simulation
Changing the dimensions of variable-size data works only when the new size does not
exceed the dimension bounds.
Fixed-Point Example
Suppose that, after the debug>> prompt appears, you enter whos at the prompt and see
the following data:
Both y_n1 and x_n1 have signed fixed-point types, with a word length of 16. y_n1 has a
fraction length of 10 and x_n1 has a fraction length of 12.
For more information about using fi objects, see the Fixed-Point Designer
documentation.
Enumerated Example
Suppose that, after the debug>> prompt appears, you enter whos at the prompt and see
the following data:
29-41
29 Debug and Test Stateflow Charts
You must include the enumerated type explicitly in the assignment. Otherwise, an error
appears at the debug>> prompt.
You cannot change data of the following scopes while the chart is in debug mode:
Constant
Input
Data type
Size
However, for variable-size data, you can change the dimensions of the data as long as the
size falls within the dimension bounds. For example, varsizedData = ones(5,7); is
a valid assignment for a variable-size 10-by-10 array.
Do not assign a value that falls outside the range of values that the fixed-point type
can represent. Avoid selecting a value that causes overflow.
Sign, word length, fraction length, slope, and bias cannot change.
29-42
Change Data Values During Simulation
When you change a data value, you must explicitly cast values for data of the following
built-in types:
single
int8
uint8
int16
uint16
int32
uint32
my_data1 = uint8(2)
my_data2 = single(5.3)
Casting is not necessary when you change the value of data that is of type double.
29-43
29 Debug and Test Stateflow Charts
Any state
Local data with the following characteristics:
You can specify individual data or states as test points by setting their TestPoint
property via the Stateflow API or in the Model Explorer (see Set Test Points for
Stateflow States and Data with the Model Explorer on page 29-44).
You can monitor individual Stateflow test points with a floating scope during model
simulation. You can also log test point values into MATLAB workspace objects.
You can also use active state output to view or log state activity data in Simulink. For
more information, see About Active State Data on page 22-30.
Set Test Points for Stateflow States and Data with the Model Explorer
You can explicitly set individual states, local data, and output data as test points in the
Model Explorer. The following procedure shows how to set individual test points for
Stateflow states and data.
29-44
Monitor Test Points in Stateflow Charts
The model consists of a Sine Wave block that triggers a Stateflow chart using the
input trigger event tic.
2 Add the following states and transitions to your chart:
The state A and its substate X are entered on the first tic event. State A and
substate X stay active until 10 tic events have occurred, and then state B is entered.
On the next event, state A and substate X are entered and the cycle continues.
The data x belongs to substate X. The entry and during actions for substate
X increment x while X is active for 10 tic events. When state B is entered, x
reinitializes to zero, and then the cycle repeats.
3 Save the model with the name myModel.
4 Open the Model Configuration Parameters dialog box.
29-45
29 Debug and Test Stateflow Charts
You can also log these test points. See Log Multiple Signals At Once on page 29-54
for instructions on using the Signal Logging dialog box. See Log Chart Signals Using
the Command-Line API on page 29-55 for instructions on logging signals at the
MATLAB command line.
Monitor Data Values and State Self Activity Using a Floating Scope
In this section, you configure a Floating Scope block to monitor a data value and the self
activity of a state.
29-46
Monitor Test Points in Stateflow Charts
The chart starts by adding an increment of 0.02 for 10 samples to the data x1. For
the next 10 samples, x1 increments by 0.2, and then the cycle repeats.
3 Save the model.
4 Open the Model Configuration Parameters dialog box.
5 In the Solver pane, specify solver options:
29-47
29 Debug and Test Stateflow Charts
The Signal Selector dialog box appears with a hierarchy of Simulink blocks for the
model.
11 In the Model hierarchy pane, select the chart whose signals you want to monitor
and in the List contents pane, select the signals.
29-48
Monitor Test Points in Stateflow Charts
When state A is active, the signal value is 1. When that state is inactive, the signal
value is 0. Because this value can be very low or high compared to other data, you
might want to add a second Floating Scope block to compare the activity signal with
other data.
29-49
29 Debug and Test Stateflow Charts
When you log a state, its value is 1 when active and 0 when inactive.
Logging Stateflow data and state self activity follows the same general guidelines as for
logging signals in Simulink models.
See Also
Export Signal Data Using Signal Logging (Simulink).
About Active State Data on page 22-30
29-50
Basic Approach to Logging States and Data
1 Enable signal logging for the chart and choose a logging format.
You can also use active state output to view or log state activity data in Simulink. For
more information, see About Active State Data on page 22-30.
29-51
29 Debug and Test Stateflow Charts
Signal logging is enabled by default for models and charts. To disable logging, clear
the check box.
4 Optionally, specify a custom name for the signal logging object.
The default name is logsout. Using this object, you can access the logging data in a
MATLAB workspace variable.
5 Click OK.
29-52
Configure States and Data for Logging
Property Description
Log signal data Saves the signal or states value to the MATLAB workspace during
(for data) or simulation.
Log self data
(for states)
Logging name Name of the logged signal. Defaults to the original name of the state
or data. To rename the logged signal, select Custom and enter a new
name. For guidance on when to use a different name for a logged
signal, see Specify Signal-Level Logging Name (Simulink).
Limit data Limits the amount of data logged to the most recent samples.
points to last
Decimation Limits the amount of data logged by skipping samples. For example, a
value decimation factor of 2 saves every other sample.
29-53
29 Debug and Test Stateflow Charts
For: Do This:
States Right-click the state and select Properties.
Local or Right-click the state or transition that uses the data and select
output data Explore > (data) variable_name.
2 In the properties dialog box, click the Logging tab.
3 Modify properties as needed.
1 Open the properties dialog box for the service local data and select the Log signal
data check box.
2 Open the properties dialog box for the Dining_area state, select the Log self
activity check box, and change the logging name to Dining_Room.
1 In the chart, select Simulation > Output > Log Chart Signals.
29-54
Configure States and Data for Logging
The Stateflow Signal Logging dialog box opens, showing all states, local, and output
data. These chart objects are the signals you can log.
2 Select the check box next to each signal you want to log.
The Log signal data check box is selected automatically for each signal you log.
For example, in the Hotel chart of the sf_semantics_hotel_checkin model, log the
Check_in.Checked_in.Executive_suite.Dining_area state and local variable
service:
3 For each signal you select, modify the properties of what gets captured in the log.
29-55
29 Debug and Test Stateflow Charts
For example, open the sf_semantics_hotel_checkin model, which has a chart called
Hotel.
2 Get the states whose activity you want to log.
For example, get the service local data in the Hotel chart:
svc_data = rt.find('-isa','Stateflow.Data','Name','service');
For example, enable logging for the Dining_area state and the service data:
da_state.LoggingInfo.DataLogging = 1;
svc_data.LoggingInfo.DataLogging = 1;
Related Examples
Configure a Signal for Logging (Simulink)
More About
Logging and Accessibility Options (Simulink)
29-56
Access Signal Logging Data
See Also
Enable Signal Logging on page 29-52 to learn how to change the name of the signal
logging object
Simulink.SimulationData.Dataset reference page
For example:
29-57
29 Debug and Test Stateflow Charts
e Enter:
logsout
Result:
Simulink.SimulationData.Dataset
Package: Simulink.SimulationData
Characteristics:
Name: 'logsout'
Total Elements: 2
Elements:
1: 'Dining_Room'
2: 'service'
For example:
By: Enter:
Index logsout.getElement(1)
Name logsout.getElement('Dining_Room')
Block path a logsout.getElement(1).BlockPath
Returns:
29-58
Access Signal Logging Data
By: Enter:
d logsout.getElement(bp)
Stateflow.SimulationData.State
Package: Stateflow.SimulationData
Properties:
Name: 'Dining_Room'
BlockPath: [1x1 Simulink.SimulationData.BlockPath]
Values: [1x1 timeseries]
To access logged activity for the service local data:
By: Enter:
Index logsout.getElement(2)
Name logsout.getElement('service')
Block path a logsout.getElement(2).BlockPath
Returns:
Stateflow.SimulationData.Data
Package: Stateflow.SimulationData
Properties:
Name: 'service'
BlockPath: [1x1 Simulink.SimulationData.BlockPath]
Values: [1x1 timeseries]
29-59
29 Debug and Test Stateflow Charts
For example:
For: Enter:
Data logsout.getElement(1).Values.Data;
Time logsout.getElement(1).Values.Time;
4 View the logged data.
29-60
View Logged Data
You can also view logged data in a spreadsheet. For example, pass a numeric, cell, or
logical array of logged values to the xlswrite function.
A = [logsout.getElement('Dining_Room').Values.Time ...
logsout.getElement('Dining_Room').Values.Data];
2 Export the data to an Excel file named dining_log.xls:
xlswrite('dining_log.xls',A);
3 Open dining_log.xls in Excel.
29-61
29 Debug and Test Stateflow Charts
29-62
Log Data in Library Charts
Each instance inherits logging properties from the library chart. For example:
The selector clears all DataLogging check boxes for the model.
29-63
29 Debug and Test Stateflow Charts
c Enable logging only for the Fail and FailOnce states in Sensor1:
Select DataLogging for these two signals. Leave DataLogging cleared for the
OK signal.
d Append the text Sensor1 to the logging names for Fail and FailOnce:
Double-click the logging names for signals Fail and FailOnce, and rename
them LogFailSensor1 and LogFailOnceSensor1, respectively.
3 Open the model that contains instances of the library chart by typing
sf_atomic_sensor_pair at the MATLAB command prompt.
4 Create a ModelLoggingInfo object for the model.
This object contains a vector Signals that stores all logged signals.
mi = Simulink.SimulationData.ModelLoggingInfo. ...
createFromModel('sf_atomic_sensor_pair')
29-64
Log Data in Library Charts
mi =
Simulink.SimulationData.ModelLoggingInfo
Package: Simulink.SimulationData
Properties:
Model: 'sf_atomic_sensor_pair'
LoggingMode: 'OverrideSignals'
LogAsSpecifiedByModels: {}
Signals: [1x6 Simulink.SimulationData.SignalLoggingInfo]
The Signals vector contains the signals marked for logging in the library chart:
To create block paths for the signals Fail, FailOnce, and OK in the atomic subchart
Sensor1 in the RedundantSensors chart:
To get the index for the signals Fail, FailOnce, and OK:
failidx = mi.findSignal(failPath);
failOnceidx = mi.findSignal(failOncePath);
OKidx = mi.findSignal(OKPath);
29-65
29 Debug and Test Stateflow Charts
b Append the text Sensor1 to the logging names for Fail and FailOnce:
See Also
Simulink.SimulationData.ModelLoggingInfo
Simulink.SimulationData.BlockPath
29-66
How Stateflow Logs Multidimensional Data
Update Is Logged As
A = 1; A single change, even though the statement implies
all A[i] = 1
A[1][1] = 1; Two different changes
A[1][2] = 1;
29-67
29 Debug and Test Stateflow Charts
29-68
Commenting Stateflow Objects in a Chart
Simulation
Logging
Code generation
Animation
Debugging
Active state output
When you explicitly comment out a Stateflow object with Comment Out, the object
appears gray with a badge . The software implicitly comments out some associated
objects. Implicitly commented objects also appear gray, but do not have a badge. For
example, if you explicitly comment out a state or junction, all incoming and outgoing
transitions are implicitly commented out. In the image of sf_car below, steady_state
29-69
29 Debug and Test Stateflow Charts
29-70
Commenting Stateflow Objects in a Chart
To uncomment an object, right-click the commented object and select Uncomment. All
implicitly commented objects are restored as well. Implicitly commented objects cannot
be uncommented directly.
Add a note to the commented object by clicking the badge . Hover your cursor over
a badge to see the associated comments. You cannot add notes to implicitly commented
objects.
29-71
30
Manage Stateflow Data, Events, and Messages in the Symbols Window on page
30-2
Add and Modify Data, Events, and Messages in the Symbols Window on page
30-5
Trace Data, Events, and Messages with the Symbols Window on page 30-7
Use the Model Explorer with Stateflow Objects on page 30-10
Use the Search & Replace Tool on page 30-15
30 Explore and Modify Charts
30-2
Manage Stateflow Data, Events, and Messages in the Symbols Window
The rows in the Symbols window display object hierarchy. Expand an object in the
window to see data, events, and messages parented by that object. By default, all the
nongraphical objects in a chart are listed in the window. To view only the objects that
are used at the current level of hierarchy and below, select the icon. To search for
specific symbols, type in the Filter search box .
More About
Add and Modify Data, Events, and Messages in the Symbols Window on page
30-5
Trace Data, Events, and Messages with the Symbols Window on page 30-7
Detect Unused Data in the Symbols Window on page 8-4
Set Data Properties on page 8-6
Resolve Undefined Symbols in Your Chart on page 28-32
30-3
30 Explore and Modify Charts
30-4
Add and Modify Data, Events, and Messages in the Symbols Window
Object Icon
Data
Event
Message
2 In the row for the new object, under TYPE, choose the object type.
3 Edit the name of the object.
4 For input and output objects, under PORT, choose a port number.
5 To view the object in the Property Inspector, right-click the object and select
Inspect.
6 In the Property Inspector, modify the object properties.
After you add objects through the Symbols window, the objects appear as unused until
you reference them in your Stateflow design.
In the Symbols window, you can modify the name, type, and port number of Stateflow
objects. Edit the name of objects in the Symbols window in the NAME field. When
you rename an object, select Shift+Enter to rename all instances of the object
throughout the state machine. To change the type or port number of an object, click the
corresponding field and select from the available options. To delete an object from the
state machine, right-click and select Delete. To undo and redo these changes, use the
Edit menu.
30-5
30 Explore and Modify Charts
Additional limitations
When you modify the code in a MATLAB function, the changes are not updated in the
Symbols window until after you save the MATLAB function.
You cannot undo and redo changes to input and output for MATLAB functions.
You cannot undo deleted data, events, or messages from a state transition table.
You cannot undo scope changes to data parented by graphical functions, MATLAB
functions, and truth tables.
More About
Manage Stateflow Data, Events, and Messages in the Symbols Window on page
30-2
Trace Data, Events, and Messages with the Symbols Window on page 30-7
Configure Data Properties by Using a Table (Simulink)
Model Editing Environment (Simulink)
30-6
Trace Data, Events, and Messages with the Symbols Window
icon .
To see the uses of the constant ARENA_HEIGHT inside, open the function freeze.
30-7
30 Explore and Modify Charts
You can also select a graphical object such a state, transition, or function in the chart and
view the symbols that the object uses. For example, in the chart TetrisLogic, expand
the symbol MainArea in the Symbols window. If you select the state FreezeShape in
the chart, then the local data shape and the function freeze() are highlighted in the
Symbols window. This highlighting indicates that those objects are used inside the state
FreezeShape.
30-8
Trace Data, Events, and Messages with the Symbols Window
More About
Detect Unused Data in the Symbols Window on page 8-4
Manage Stateflow Data, Events, and Messages in the Symbols Window on page
30-2
Add and Modify Data, Events, and Messages in the Symbols Window on page 30-5
Resolve Undefined Symbols in Your Chart on page 28-32
30-9
30 Explore and Modify Charts
30-10
Use the Model Explorer with Stateflow Objects
The main window has two panes: a Model Hierarchy pane on the left and a Contents
pane on the right. When you open the Model Explorer, the Stateflow object you are
editing appears highlighted in the Model Hierarchy pane and its objects appear in the
Contents pane. This example shows how the Model Explorer appears when opened from
the chart.
The Model Hierarchy pane displays the elements of all loaded Simulink models, which
includes Stateflow charts. A preceding plus (+) character for an object indicates that
you can expand the display of its child objects by double-clicking the entry or by clicking
the plus (+). A preceding minus (-) character for an object indicates that it has no child
objects.
Clicking an entry in the Model Hierarchy pane selects that entry and displays its child
objects in the Contents pane. A hypertext link to the currently selected object in the
Model Hierarchy pane appears after the Contents of: label at the top of the Contents
pane. Click this link to display that object in its native editor. In the preceding example,
clicking the link sfbus_demo/Chart displays the contents of the chart in its editor.
Each type of object, whether in the Model Hierarchy or Contents pane, appears with
an adjacent icon. Subcharted objects (states, boxes, or graphical functions) appear altered
with shading.
The display of child objects in the Contents pane includes properties for each object,
most of which are directly editable. You can also access the properties dialog box for
an object from the Model Explorer. See Set Properties for Chart Objects in the Model
Explorer on page 30-12 for more details.
30-11
30 Explore and Modify Charts
1 Right-click the object row in the Contents pane of the Model Explorer and select
Rename.
For text properties, such as the Name property, a text editing field with the
current text value overlays the displayed value. Edit the field and press the
Return key or click anywhere outside the edit field to apply the changes.
For properties with enumerated entries, such as the Scope, Trigger, or Type
properties, select from a drop-down combo box that overlays the displayed value.
For Boolean properties (properties that are set on or off), select or clear the box
that appears in place of the displayed value.
To set all the properties for an object displayed in the Model Hierarchy or Contents
pane of the Model Explorer:
To display the properties dialog box dynamically for the selected object in the Model
Hierarchy or Contents pane of the Model Explorer:
30-12
Use the Model Explorer with Stateflow Objects
The properties dialog box for the selected object appears in the far right pane of the
Model Explorer.
Note: If you move an object to a level in the hierarchy that does not support the Scope
property for that object, the Scope automatically changes to Local.
1 Select the data or event to move in the Contents pane of the Model Explorer.
You can select a contiguous block of items by highlighting the first (or last) item in
the block and then using Shift + click for highlighting the last (or first) item.
2 Click and drag the highlighted objects from the Contents pane to a new location in
the Model Hierarchy pane to change its parent.
A shadow copy of the selected objects accompanies the mouse cursor during
dragging. If no parent is chosen or the parent chosen is the current parent, the
mouse cursor changes to an X enclosed in a circle, indicating an invalid choice.
1 Select the event or data to cut or copy in the Contents pane of the Model Explorer.
2 In the Model Explorer, select Edit > Cut or Edit > Copy.
If you select Cut, the selected items are deleted and then copied to the clipboard for
copying elsewhere. If you select Copy, the selected items are left unchanged.
You can also right-click a single selection and select Cut or Copy from the context
menu. The Model Explorer also uses the keyboard equivalents of Ctrl+X (Cut) and
Ctrl+C (Copy) on a computer running the UNIX or Windows operating system.
3 Select a new parent object in the Model Hierarchy pane of the Model Explorer.
4 Select Edit > Paste. The cut items appear in the Contents pane of the Model
Explorer.
You can also paste the cut items by right-clicking an empty part of the Contents
pane and selecting Paste from the context menu. The Model Explorer also uses the
30-13
30 Explore and Modify Charts
Change the Port Order of Input and Output Data and Events
Input data, output data, input events, and output events each have numerical sequences
of port index numbers. You can change the order of indexing for event or data objects
with a scope of Input to Simulink or Output to Simulink in the Contents pane of the
Model Explorer as follows:
The remaining objects in the affected sequence are automatically assigned a new
value for their Port property.
You can also select Edit > Cut or Ctrl+X from the keyboard to delete an object.
30-14
Use the Search & Replace Tool
In this section...
Open the Search & Replace Tool on page 30-15
Refine Searches on page 30-17
Specify the Search Scope on page 30-19
Use the Search Button and View Area on page 30-20
Specify the Replacement Text on page 30-23
Use Replace Buttons on page 30-24
Search and Replace Messages on page 30-24
1 Open a chart.
2 Select Edit > Find & Replace in Chart.
30-15
30 Explore and Modify Charts
The Search & Replace dialog box contains the following fields:
Search for
Enter search pattern text in the Search for text box. You can select the
interpretation of the search pattern with the Match case check box and the Match
options field (unlabeled and just to the right of the Search in field).
Match case
If you select this check box, the search is case sensitive and the Search & Replace tool
finds only text matching the search pattern exactly.
Replace with
Specify the text to replace the text found when you select any of the Replace buttons
(Replace, Replace all, Replace all in this object). See Use Replace Buttons on
page 30-24.
30-16
Use the Search & Replace Tool
Preserve case
This option modifies replacement text. For an understanding of this option, see
Replacing with Case Preservation on page 30-23.
Search in
By default, the Search & Replace tool searches for and replaces text only within the
current Stateflow chart that you are editing in the Stateflow Editor. You can select to
search the machine owning the current Stateflow chart or any other loaded machine
or chart by accessing this selection box.
Match options
This field is unlabeled and just to the right of the Search in field. You can modify
the meaning of your search text by entering one of the selectable search options. See
Refine Searches on page 30-17.
Object types and Field types
Under the Search in field are the selection boxes for Object types and Field types.
These selections further refine your search and are described below.
Search and Replace buttons
These are described in Use the Search Button and View Area on page 30-20 and
Use Replace Buttons on page 30-24.
View Area
The bottom half of the Search & Replace dialog box displays the result of a search.
This area is described in A Breakdown of the View Area on page 30-21.
Refine Searches
Enter search pattern text in the Search for text box. You can use one of the following
settings to further refine the meaning of the text entered.
Match case
By selecting the Match case option, you enable case-sensitive searching. In this case,
the Search & Replace tool finds only text matching the search pattern exactly.
By clearing the Match case option, you enable case-insensitive searching. In this
case, search pattern characters entered in lower- or uppercase find matching text with
30-17
30 Explore and Modify Charts
the same sequence of base characters in lower- or uppercase. For example, the search
entry"AnDrEw" finds the matching text "andrew" or "Andrew" or "ANDREW".
Preserve case
This option modifies replacement text and not search text. For details, see Replacing
with Case Preservation on page 30-23.
Contains word
Select this option to specify that the search pattern text is a whole word expression used
in a Stateflow chart with no specific beginning and end delimiters. In other words, find
the specified text in any setting.
Suppose that you have a state with this label and entry action:
throt_fail
entry: fail_state[THROT] = 1;
Searching for the text fail with the Contains word option finds two occurrences of
fail.
Select this option to specify that the search pattern in the Search for field is a whole
word expression used in a Stateflow chart with beginning and end delimiters consisting
of a blank space or a character that is not alphanumeric and not an underscore character
(_).
Regular expression
Set the Match options field to Regular expression to search for text that varies from
character to character within defined limits.
A regular expression is text composed of letters, numbers, and special symbols that
defines one or more candidates. Some characters have special meaning when used in
a regular expression, while other characters are interpreted as themselves. Any other
character appearing in a regular expression is ordinary, unless a back slash (\) character
precedes it.
30-18
Use the Search & Replace Tool
If the Match options field is set to Regular expression in the previous example of a
state named throt_fail, searching for "fail_" matches the "fail_" text that is part
of the second line, character for character. Searching with the regular expression "\w*_"
also finds the text "fail_". This search uses the regular expression shorthand "\w"
that represents any part-of-word character, an asterisk (*) that represents any number of
any characters, and an underscore (_) that represents itself.
For a list of regular expression meta characters, see Regular Expressions (MATLAB).
Search in
You can select a whole machine or individual chart for searching in the Search in field.
By default, the current chart in which you opened the Search & Replace tool is selected.
A list of the currently loaded machines appears with the current machine expanded
to reveal its Stateflow charts.
2 Select a machine.
This list contains the previously selected machine expanded to reveal its Stateflow
charts.
2 Select a chart from the expanded machine.
Object Types
Note: You cannot search in state transition tables with this tool.
30-19
30 Explore and Modify Charts
Field Types
Machines, charts, data, and events have valid Name fields. States have a Name defined
as the top line of their labels. You can search and replace text belonging to the Name
field of a state in this sense. However, if the Search & Replace tool finds matching text in
a state's Name field, the rest of the label is subject to later searches for the specified text
whether or not the label is chosen as a search target.
Note: The Name field of machines and charts is an invalid target for the Search &
Replace tool. Use the Simulink model window to change the names of machines and
charts.
Labels
Click Search to initiate a single-search operation. If an object match is made, its text
fields appear in the Viewer pane in the middle of the Search & Replace dialog box. If
the object is graphical (state, transition, junction, chart), the matching object appears
highlighted in a Portal pane below the Viewer pane.
30-20
Use the Search & Replace Tool
The view area of the Search & Replace dialog box displays matching text and its
containing object, if viewable. In the previous example, taken from the sf_pool
model, a search for the word "friction" finds the Description field for the state
TotalDynamics. The resulting view area consists of these parts:
30-21
30 Explore and Modify Charts
Icon
Displays an icon appropriate to the object containing the matching text. These icons are
identical to the icons in the Model Explorer that represent Stateflow objects displayed in
View Stateflow Objects in the Model Explorer on page 30-10.
Full Path Name of Containing Object
This area displays the full path name for the object that contains the matching text:
This area displays the matching text as a highlighted part of all search-qualified
text fields for the owner object. If other occurrences exist in these fields, they too are
highlighted, but in lighter shades.
To invoke the properties dialog box for the owner object, double-click anywhere in the
Viewer pane.
Portal
This area contains a graphic display of the object that contains the matching text. That
object appears highlighted.
To display the highlighted object in the Stateflow Editor, double-click anywhere in the
Portal pane.
If you specify an entire machine as your search scope in the Search in field, the Search
& Replace tool starts searching at the beginning of the first chart of the model, regardless
of the Stateflow chart that appears in the Stateflow Editor when you begin your search.
After searching the first chart, the Search & Replace tool continues searching each chart
in model order until all charts for the model have been searched.
If you specify a Stateflow chart as your search scope, the Search & Replace tool begins
searching at the beginning of the chart. The Search & Replace tool continues searching
the chart until all the chart objects have been searched.
30-22
Use the Search & Replace Tool
The search order when searching an individual chart for matching text is equivalent to
a depth-first search of the Model Explorer. Starting at the highest level of the chart, the
Model Explorer hierarchy is traversed downward from parent to child until an object
with no child is encountered. At this point, the hierarchy is traversed upward through
objects already searched until an unsearched sibling is found and the process repeats.
If you choose the Preserve case option, matching text is replaced based on one of these
conditions:
Whisper
Matching text has only lowercase characters. Matching text is replaced entirely
with the lowercase equivalent of all replacement characters. For example, if the
replacement text is "ANDREW", the matching text "bill" is replaced by "andrew".
Shout
Matching text has only uppercase characters. Matching text is replaced entirely
with the uppercase equivalent of all replacement characters. For example, if the
replacement text is "Andrew", the matching text "BILL" is replaced by "ANDREW".
Proper
Matching text has uppercase characters in the first character position of each
word. Matching text is replaced entirely with the case equivalent of all replacement
characters. For example, if the replacement text is "andrew johnson", the matching
text "Bill Monroe" is replaced by "Andrew Johnson".
Sentence
Matching text has an uppercase character in the first character position of a sentence
with all other sentence characters in lowercase. Matching text is replaced in like
manner, with the first character of the sentence given an uppercase equivalent and
all other sentence characters set to lowercase. For example, if the replacement text is
"andrew is tall.", the matching text "Bill is tall." is replaced by "Andrew
is tall.".
30-23
30 Explore and Modify Charts
If the matching text does not follow any of these patterns, then the text and case
replacement match the user input.
Replace
When you select the Replace button, the current instance of text matching the text in
the Search for field is replaced by the text you entered in the Replace with field. The
Search & Replace tool then searches for the next occurrence of the Search for text.
Replace all
When you select the Replace all button, all instances of text matching the Search for
field are replaced by the text entered in the Replace with field. Replacement starts
at the point of invocation to the end of the current Stateflow chart. If you initially skip
through some search matches with the Search button, these matches are also skipped
when you select the Replace all button.
When you select the Replace all in this object button, all instances of text matching
the Search for field are replaced by text you entered in the Replace with field
everywhere in the current Stateflow object regardless of previous searches.
Informational Messages
Warnings
30-24
Use the Search & Replace Tool
No Matches Found
Search Completed
The object types and field types that you selected are incompatible.
The matching object is not editable by replacement due to one of these problems.
Problem Solution
A simulation is running. Stop the simulation.
You are editing a locked library block. Unlock the library.
The current object or its parent has been Unlock the object or its parent.
manually locked.
The following warnings appear if the Search & Replace tool must find the object again
and its matching text field. If the original matching object is deleted or changed before an
ensuing search or replacement, the Search & Replace tool cannot continue.
If you search for text, find it, and then delete the containing object, this warning appears
if you continue to search.
If you search for text, find it, and then delete the containing object, this warning appears
if you perform a replacement.
30-25
30 Explore and Modify Charts
If you search for text, find it, and then change the object containing the text, this warning
appears if you perform a replacement.
If you search for text, find it, and then change the Search For field, this warning
appears if you perform a replacement.
30-26
A
Enter a Chart
The set of default flow paths execute (see Execute a Set of Flow Charts on page
A-4). If this action does not cause a state entry and the chart has parallel
decomposition, then each parallel state becomes active (see Enter a State on page
A-2).
If executing the default flow paths does not cause state entry, a state inconsistency error
occurs.
Enter a State
1 If the parent of the state is not active, perform steps 1 through 4 for the parent.
2 If this state is a parallel state, check that all siblings with a higher (that is, earlier)
entry order are active. If not, perform steps 1 through 5 for these states first.
Parallel (AND) states are ordered for entry based on whether you use explicit
ordering (default) or implicit ordering. For details, see Explicit Ordering of Parallel
States on page 3-79 and Implicit Ordering of Parallel States on page 3-80.
A-2
Summary of Chart Semantic Rules
a If the state contains a history junction and there was an active child of this
state at some point after the most recent chart initialization, perform the entry
actions for that child. Otherwise, execute the default flow paths for the state.
b If this state has children that are parallel states (parallel decomposition),
perform entry steps 1 through 5 for each state according to its entry order.
c If this state has only one child substate, the substate becomes active when the
parent becomes active, regardless of whether a default transition is present.
Entering the parent state automatically makes the substate active. The presence
of any inner transition has no effect on determining the active substate.
6 If this state is a parallel state, perform all entry steps for the sibling state next in
entry order if one exists.
7 If the transition path parent is not the same as the parent of the current state,
perform entry steps 6 and 7 for the immediate parent of this state.
A-3
A Summary of Chart Semantic Rules
States
Step 1 is repeated with the set of outgoing segments from the junction.
3 After testing all outgoing transition segments at a junction, backtrack the incoming
transition segment that brought you to the junction and continue at step 2, starting
with the next transition segment after the backtrack segment. The set of flow charts
finishes execution when testing of all starting transitions is complete.
A-4
Summary of Chart Semantic Rules
1 If the receiver of the event is active, then it executes (see Execute an Active Chart
on page A-2 and Execute an Active State on page A-3). (The event
receiver is the parent of the event unless a direct event broadcast occurs using the
send() function.)
A-5
B
Semantic Examples
B Categories of Semantic Examples
B-2
Categories of Semantic Examples
B-3
B Transition to and from Exclusive (OR) States
1 When an event occurs, state S1 checks for an outgoing transition with a matching
event specified.
2 If a transition with a matching event is found, the condition for that transition
([condition]) is evaluated.
3 If the condition is true, condition_action is executed.
4 If there is a valid transition to the destination state, the transition is taken.
5 State S1 is exited.
6 The transition_action is executed when the transition is taken.
7 State S2 is entered.
B-4
Transition to and from Exclusive (OR) States
Initially, the chart is asleep. State On and state Off are OR states. State On is active.
Event E_one occurs and awakens the chart, which processes the event from the root
down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. A valid
transition from state On to state Off is detected.
2 State On exit actions (exitOn()) execute and complete.
3 State On is marked inactive.
4 The event E_one is broadcast as the transition action.
This second event E_one is processed, but because neither state is active, it has
no effect. If the second broadcast of E_one resulted in a valid transition, it would
preempt the processing of the first broadcast of E_one. See Early Return Logic for
Event Broadcasts on page 3-85.
5 State Off is marked active.
6 State Off entry actions (entOff()) execute and complete.
B-5
B Transition to and from Exclusive (OR) States
This sequence completes the execution of the Stateflow chart associated with event
E_one when state On is initially active.
Using the same example, what happens when the next event, E_one, occurs while state
Off is active?
Initially, the chart is asleep. State Off is active. Event E_one occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one.
This sequence completes the execution of the Stateflow chart associated with the second
event E_one when state Off is initially active.
B-6
Transition to and from Exclusive (OR) States
Using the same example, what happens when a third event, E_two, occurs?
Notice that the event E_two is not used explicitly in this example. However, its
occurrence (or the occurrence of any event) does result in behavior. Initially, the chart is
asleep and state On is active.
Event E_two is processed from the root of the chart down through the hierarchy of
the chart.
2 The chart root checks to see if there is a valid transition as a result of E_two. There
is none.
3 State On during actions (durOn()) execute and complete.
4 The chart goes back to sleep.
This sequence completes the execution of the Stateflow chart associated with event
E_two when state On is initially active.
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
B-7
B Transition to and from Exclusive (OR) States
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
Initially, the chart is asleep. State A.A1 is active. Condition C_one is true. Event E_one
occurs and awakens the chart, which processes the event from the root down through the
hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. There
is a valid transition from state A.A1 to state B.B1. (Condition C_one is true.)
2 State A during actions (durA()) execute and complete.
3 State A.A1 exit actions (exitA1()) execute and complete.
4 State A.A1 is marked inactive.
5 State A exit actions (exitA()) execute and complete.
6 State A is marked inactive.
7 The transition action, A, is executed and completed.
8 State B is marked active.
9 State B entry actions (entB()) execute and complete.
10 State B.B1 is marked active.
B-8
Transition to and from Exclusive (OR) States
This sequence completes the execution of this Stateflow chart associated with event
E_one.
B-9
B Control Chart Execution Using Condition Actions
Initially, the chart is asleep. State A is active. Conditions C_one and C_two are false.
Event E_one occurs and awakens the chart, which processes the event from the root
down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. A valid
transition segment from state A to a connective junction is detected. The condition
action A_one is detected on the valid transition segment and is immediately
executed and completed. State A is still active.
B-10
Control Chart Execution Using Condition Actions
2 Because the conditions on the transition segments to possible destinations are false,
none of the complete transitions is valid.
3 State A during actions (durA()) execute and complete.
This sequence completes the execution of this Stateflow chart associated with event
E_one when state A is initially active.
Initially, the chart is asleep. State A is active. Condition C_one is true. Event E_one
occurs and awakens the chart, which processes the event from the root down through the
hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. A
valid transition from state A to state B is detected. The condition C_one is true.
The condition action A_one is detected on the valid transition and is immediately
executed and completed. State A is still active.
2 State A exit actions (ExitA()) execute and complete.
3 State A is marked inactive.
B-11
B Control Chart Execution Using Condition Actions
This sequence completes the execution of this Stateflow chart associated with event
E_one when state A is initially active.
B-12
Control Chart Execution Using Condition Actions
See For-Loop Construct on page B-33 to see the behavior of this example.
B-13
B Control Chart Execution Using Condition Actions
See Broadcast Condition Action Event in Parallel State on page B-48 to see the
behavior of this example.
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
B-14
Control Chart Execution Using Condition Actions
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
Initially, the chart is asleep. State On is active. Event E_one occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one.
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
B-15
B Control Chart Execution Using Condition Actions
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
B-16
Control Chart Execution Using Default Transitions
In this section...
Default Transition in Exclusive (OR) Decomposition on page B-17
Default Transition to a Junction on page B-18
Default Transition and a History Junction on page B-19
Labeled Default Transitions on page B-20
Initially, the chart is asleep. State A is active. Event E_one occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. There
is a valid transition from state A to superstate B.
2 State A exit actions (exitA()) execute and complete.
3 State A is marked inactive.
4 The transition action, A, is executed and completed.
B-17
B Control Chart Execution Using Default Transitions
This sequence completes the execution of this Stateflow chart associated with event
E_one when state A is initially active.
For this example, initially, the chart is asleep. State B.B1 is active. Condition [C_two]
is true. An event occurs and awakens the chart, which processes the event from the root
down through the hierarchy:
1 State B checks to see if there is a valid transition as a result of any event. There is
none.
2 State B during actions (durB()) execute and complete.
B-18
Control Chart Execution Using Default Transitions
3 State B1 checks to see if there is a valid transition as a result of any event. There is
none.
4 State B1 during actions (durB1()) execute and complete.
This sequence completes the execution of this Stateflow chart associated with the
occurrence of any event.
Initially, the chart is asleep. State A is active. A history junction records the fact that
state B4 is the previously active substate of superstate B. Event E_one occurs and
awakens the chart, which processes the event from the root down through the hierarchy:
B-19
B Control Chart Execution Using Default Transitions
1 The chart root checks to see if there is a valid transition as a result of E_one.
The history junction indicates that substate B.B4 was the last active substate, which
becomes the destination of the transition.
7 State B.B4 is marked active.
8 State B.B4 entry actions (entB4()) execute and complete.
9 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one.
B-20
Control Chart Execution Using Default Transitions
Initially, the chart is asleep. State A is active. Event E_one occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one.
B-21
B Control Chart Execution Using Default Transitions
This sequence completes the execution of this Stateflow chart associated with event
E_one when state A is initially active.
B-22
Process Events Using Inner Transitions
This example shows the behavior of an inner transition. The chart uses implicit ordering
of outgoing transitions (see Implicit Ordering of Outgoing Transitions on page 3-64).
Initially, the chart is asleep. State A is active. Condition [C_one] is false. Event E_one
occurs and awakens the chart, which processes the event from the root down through the
hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one.
A potentially valid transition from state A to state B is detected. However, the
transition is not valid, because [C_one] is false.
B-23
B Process Events Using Inner Transitions
This sequence completes the execution of this Stateflow chart associated with event
E_one.
Initially, the chart is asleep. State A is still active. Condition [C_one] is true. Event
E_one occurs and awakens the chart, which processes the event from the root down
through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one.
The transition from state A to state B is now valid because [C_one] is true.
2 State A exit actions (exitA()) execute and complete.
3 State A is marked inactive.
4 The transition action A_one is executed and completed.
B-24
Process Events Using Inner Transitions
This sequence completes the execution of this Stateflow chart associated with event
E_one.
Using the previous example, this example shows what happens when a third event,
E_two, occurs. The chart uses implicit ordering of outgoing transitions (see Implicit
Ordering of Outgoing Transitions on page 3-64).
Initially, the chart is asleep. State B is now active. Condition [C_two] is false. Event
E_two occurs and awakens the chart, which processes the event from the root down
through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_two.
B-25
B Process Events Using Inner Transitions
This sequence completes the execution of this Stateflow chart associated with event
E_two. This example shows the difference in behavior between inner and self-loop
transitions.
This example shows the behavior of an inner transition to a connective junction for
the first event. The chart uses implicit ordering of outgoing transitions (see Implicit
Ordering of Outgoing Transitions on page 3-64).
Initially, the chart is asleep. State A1 is active. Condition [C_two] is true. Event E_one
occurs and awakens the chart, which processes the event from the root down through the
hierarchy:
1 The chart root checks to see if there is a valid transition at the root level as a result
of E_one. There is no valid transition.
B-26
Process Events Using Inner Transitions
The conditions are evaluated to determine whether one of the transitions is valid.
Because implicit ordering applies, the segments labeled with a condition are
evaluated before the unlabeled segment. The evaluation starts from a 12 o'clock
position on the junction and progresses in a clockwise manner. Because [C_two] is
true, the inner transition to the junction and then to state A.A2 is valid.
4 State A.A1 exit actions (exitA1()) execute and complete.
5 State A.A1 is marked inactive.
6 State A.A2 is marked active.
7 State A.A2 entry actions (entA2()) execute and complete.
8 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one when state A1 is active and condition [C_two] is true.
Continuing the previous example, this example shows the behavior of an inner transition
to a junction when a second event E_one occurs. The chart uses implicit ordering of
outgoing transitions (see Implicit Ordering of Outgoing Transitions on page 3-64).
B-27
B Process Events Using Inner Transitions
Initially, the chart is asleep. State A2 is active. Condition [C_two] is true. Event E_one
occurs and awakens the chart, which processes the event from the root down through the
hierarchy:
1 The chart root checks to see if there is a valid transition at the root level as a result
of E_one. There is no valid transition.
2 State A during actions (durA()) execute and complete.
3 State A checks itself for valid transitions and detects a valid inner transition to a
connective junction.
The conditions are evaluated to determine whether one of the transitions is valid.
Because implicit ordering applies, the segments labeled with a condition are
evaluated before the unlabeled segment. The evaluation starts from a 12 o'clock
position on the junction and progresses in a clockwise manner. Because [C_two] is
true, the inner transition to the junction and then to state A.A2 is valid.
4 State A.A2 exit actions (exitA2()) execute and complete.
5 State A.A2 is marked inactive.
6 State A.A2 is marked active.
7 State A.A2 entry actions (entA2()) execute and complete.
8 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one when state A2 is active and condition [C_two] is true. For a state with a valid
inner transition, an active substate can be exited and reentered immediately.
B-28
Process Events Using Inner Transitions
Initially, the chart is asleep. State A.A1 is active. History information exists because
superstate A is active. Event E_one occurs and awakens the chart, which processes the
event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. There
is no valid transition.
2 State A during actions execute and complete.
3 State A checks itself for valid transitions and detects that there is a valid inner
transition to a history junction. Based on the history information, the last active
state, A.A1, is the destination state.
4 State A.A1 exit actions execute and complete.
5 State A.A1 is marked inactive.
6 State A.A1 is marked active.
7 State A.A1 entry actions execute and complete.
8 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one when there is an inner transition to a history junction and state A.A1 is active.
For a state with a valid inner transition, an active substate can be exited and reentered
immediately.
B-29
B Use Connective Junctions to Represent Multiple Paths
B-30
Use Connective Junctions to Represent Multiple Paths
Initially, the chart is asleep. State A is active. Condition [C_two] is true. Event E_one
occurs and awakens the chart, which processes the event from the root down through the
hierarchy:
B-31
B Use Connective Junctions to Represent Multiple Paths
1 The chart root checks to see if there is a valid transition as a result of E_one.
A valid transition segment from state A to the connective junction exists. Because
implicit ordering applies, the transition segments beginning from a 12 o'clock
position on the connective junction are evaluated for validity. The first transition
segment, labeled with condition [C_one], is not valid. The next transition segment,
labeled with the condition [C_two], is valid. The complete transition from state A to
state C is valid.
2 State A exit actions (exitA()) execute and complete.
3 State A is marked inactive.
4 State C is marked active.
5 State C entry actions (entC()) execute and complete.
6 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one.
Self-Loop Transition
This example shows the behavior of a self-loop transition using a connective junction.
The chart uses implicit ordering of outgoing transitions (see Implicit Ordering of
Outgoing Transitions on page 3-64).
B-32
Use Connective Junctions to Represent Multiple Paths
Initially, the chart is asleep. State A is active. Condition [C_one] is false. Event E_one
occurs and awakens the chart, which processes the event from the root down through the
hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. A valid
transition segment from state A to the connective junction exists. Because implicit
ordering applies, the transition segment labeled with a condition is evaluated for
validity. Because the condition [C_one] is not valid, the complete transition from
state A to state B is not valid. The transition segment from the connective junction
back to state A is valid.
2 State A exit actions (exitA()) execute and complete.
3 State A is marked inactive.
4 The transition action A_two is executed and completed.
5 State A is marked active.
6 State A entry actions (entA()) execute and complete.
7 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one.
For-Loop Construct
This example shows the behavior of a for loop using a connective junction. The chart
uses implicit ordering of outgoing transitions (see Implicit Ordering of Outgoing
Transitions on page 3-64).
B-33
B Use Connective Junctions to Represent Multiple Paths
Initially, the chart is asleep. State A is active. Event E_one occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. There
is a valid transition segment from state A to the connective junction. The transition
segment condition action, i = 0, executes and completes. Of the two transition
segments leaving the connective junction, the transition segment that is a self-loop
back to the connective junction evaluates next for validity. That segment takes
priority in evaluation because it has a condition, whereas the other segment is
unlabeled. This evaluation behavior reflects implicit ordering of outgoing transitions
in the chart.
2 The condition [i < 10] evaluates as true. The condition actions i++ and a call to
func1 execute and complete until the condition becomes false. Because a connective
junction is not a final destination, the transition destination is still unknown.
3 The unconditional segment to state B is now valid. The complete transition from
state A to state B is valid.
4 State A exit actions (exitA()) execute and complete.
5 State A is marked inactive.
6 State B is marked active.
B-34
Use Connective Junctions to Represent Multiple Paths
This sequence completes the execution of this chart associated with event E_one.
Initially, the chart is asleep. State A.A1 is active. The condition [C_one()] is initially
true. Event E_one occurs and awakens the chart, which processes the event from the
root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. There
is no valid transition.
2 State A checks itself for valid transitions and detects a valid inner transition to a
connective junction.
B-35
B Use Connective Junctions to Represent Multiple Paths
3 The next possible segments of the transition are evaluated. Only one outgoing
transition exists, and it has a condition action defined. The condition action executes
and completes.
4 The next possible segments are evaluated. Two outgoing transitions exist: a
conditional self-loop transition and an unconditional transition segment. Because
implicit ordering applies, the conditional transition segment takes precedence.
Since the condition [C_one()] is true, the self-loop transition is taken. Since a
final transition destination has not been reached, this self-loop continues until
[C_one()] is false.
This sequence completes the execution of this Stateflow chart associated with event
E_one.
B-36
Use Connective Junctions to Represent Multiple Paths
Initially, the chart is asleep. State A is active. Event E_two occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_two. A valid
transition segment exists from state A to the connective junction. Because implicit
ordering applies, evaluation of segments with equivalent label priority begins from
a 12 o'clock position on the connective junction and progresses clockwise. The first
transition segment, labeled with event E_one, is not valid. The next transition
segment, labeled with event E_two, is valid. The complete transition from state A to
state C is valid.
2 State A exit actions (exitA()) execute and complete.
3 State A is marked inactive.
4 State C is marked active.
5 State C entry actions (entC()) execute and complete.
6 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_two.
B-37
B Use Connective Junctions to Represent Multiple Paths
Initially, the chart is asleep. State A is active. Event E_one occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. A
valid transition segment exists from state A to the connective junction and from the
junction to state C.
2 State A exit actions (exitA()) execute and complete.
3 State A is marked inactive.
4 State C is marked active.
5 State C entry actions (entC()) execute and complete.
6 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one.
B-38
Use Connective Junctions to Represent Multiple Paths
Initially, the chart is asleep. State B is active. Event E_one occurs and awakens the
chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. A
valid transition segment exists from state B to the connective junction and from the
junction to state C.
2 State B exit actions (exitB()) execute and complete.
3 State B is marked inactive.
4 State C is marked active.
5 State C entry actions (entC()) execute and complete.
6 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one.
B-39
B Use Connective Junctions to Represent Multiple Paths
Initially, state A is active and conditions c1, c2, and c3 are true:
1 The chart root checks to see if there is a valid transition from state A.
There is a valid transition segment marked with the condition c1 from state A to a
connective junction.
2 Condition c1 is true and action a1 executes.
3 Condition c3 is true and action a3 executes.
4 Condition c4 is not true and control flow backtracks to state A.
5 The chart root checks to see if there is another valid transition from state A.
There is a valid transition segment marked with the condition c2 from state A to a
connective junction.
6 Condition c2 is true and action a2 executes.
7 Condition c3 is true and action a3 executes.
8 Condition c4 is not true and control flow backtracks to state A.
9 The chart goes to sleep.
The preceding example shows the unexpected behavior of executing both actions a1
and a2. Another unexpected behavior is the execution of action a3 twice. To resolve this
problem, consider adding unconditional transitions to terminating junctions.
The terminating junctions allow flow to end if either c3 or c4 is not true. This design
leaves state A active without executing unnecessary actions.
B-40
Control Chart Execution Using Event Actions in a Superstate
Initially, the chart is asleep. State A.A1 is active. Event E_three occurs and awakens
the chart, which processes the event from the root down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_three. No
valid transition exists.
2 State A during actions (durA()) execute and complete.
3 State A executes and completes the on event E_three action (A_one).
4 State A checks its children for valid transitions. No valid transitions exist.
5 State A1 during actions (durA1()) execute and complete.
6 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_three.
B-41
B Broadcast Events in Parallel (AND) States
In this section...
Broadcast Events in Parallel States on page B-42
Broadcast Events in a Transition Action with a Nested Event Broadcast on page
B-45
Broadcast Condition Action Event in Parallel State on page B-48
B-42
Broadcast Events in Parallel (AND) States
Initially, the chart is asleep. Parallel substates A.A1.A1a and A.A2.A2a are active.
Event E_one occurs and awakens the chart, which processes the event from the root
down through the hierarchy:
1 The chart root checks to see if there is a valid transition at the root level as a result
of E_one. No valid transition exists.
2 State A during actions (durA()) execute and complete.
3 The children of state A are parallel (AND) states. Because implicit ordering applies,
the states are evaluated and executed from left to right and top to bottom. State
A.A1 is evaluated first. State A.A1 during actions (durA1()) execute and complete.
State A.A1 executes and completes the on E_one action and broadcasts event
E_two. The during and on event_name actions are processed based on their order
of appearance in the state label:
B-43
B Broadcast Events in Parallel (AND) States
a The broadcast of event E_two awakens the chart a second time. The chart
root checks to see if there is a valid transition as a result of E_two. No valid
transition exists.
b State A during actions (durA()) execute and complete.
c State A checks its children for valid transitions. No valid transitions exist.
d State A's children are evaluated starting with state A.A1. State A.A1 during
actions (durA1()) execute and complete. State A.A1 is evaluated for valid
transitions. There are no valid transitions as a result of E_two within state A1.
e State A1a's during actions (durA1a()) execute.
f State A.A2 is evaluated. State A.A2 during actions (durA2()) execute and
complete. State A.A2 checks for valid transitions. State A.A2 has a valid
transition as a result of E_two from state A.A2.A2a to state A.A2.A2b.
g State A.A2.A2a exit actions (exitA2a()) execute and complete.
h State A.A2.A2a is marked inactive.
i State A.A2.A2b is marked active.
j State A.A2.A2b entry actions (entA2b()) execute and complete.
4 The processing of E_one continues once the on event broadcast of E_two has been
processed. State A.A1 checks for any valid transitions as a result of event E_one. A
valid transition exists from state A.A1.A1a to state A.A1.A1b.
5 State A.A1.A1a executes and completes exit actions (exitA1a).
6 State A.A1.A1a is marked inactive.
7 State A.A1.A1b is marked active.
8 State A.A1.A1b entry actions (entA1b()) execute and complete.
9 Parallel state A.A2 is evaluated next. State A.A2 during actions (durA2()) execute
and complete. There are no valid transitions as a result of E_one.
10 State A.A2.A2b during actions (durA2b()) execute and complete.
State A.A2.A2b is now active as a result of the processing of the on event broadcast
of E_two.
11 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one and the on event broadcast to a parallel state of event E_two. The final chart
activity is that parallel substates A.A1.A1b and A.A2.A2b are active.
B-44
Broadcast Events in Parallel (AND) States
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
B-45
B Broadcast Events in Parallel (AND) States
Initially, the chart is asleep. Parallel substates A.A1.A1a and A.A2.A2a are active.
Event E_one occurs and awakens the chart, which processes the event from the root
down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. There
is no valid transition.
2 State A during actions (durA()) execute and complete.
3 State A's children are parallel (AND) states. Because implicit ordering applies, the
states are evaluated and executed from left to right and top to bottom. State A.A1 is
evaluated first. State A.A1during actions (durA1()) execute and complete.
B-46
Broadcast Events in Parallel (AND) States
4 State A.A1 checks for any valid transitions as a result of event E_one. There is a
valid transition from state A.A1.A1a to state A.A1.A1b.
5 State A.A1.A1a executes and completes exit actions (exitA1a).
6 State A.A1.A1a is marked inactive.
1 The transition action that broadcasts event E_two executes and completes:
a The broadcast of event E_two now preempts the transition from state A1a to
state A1b that event E_one triggers.
b The broadcast of event E_two awakens the chart a second time. The chart
root checks to see if there is a valid transition as a result of E_two. No valid
transition exists.
c State A during actions (durA()) execute and complete.
d State A's children are evaluated starting with state A.A1. State A.A1during
actions (durA1()) execute and complete. State A.A1 is evaluated for valid
transitions. There are no valid transitions as a result of E_two within state A1.
e State A.A2 is evaluated. State A.A2 during actions (durA2()) execute and
complete. State A.A2 checks for valid transitions. State A.A2 has a valid
transition as a result of E_two from state A.A2.A2a to state A.A2.A2b.
f State A.A2.A2a exit actions (exitA2a()) execute and complete.
g State A.A2.A2a is marked inactive.
h State A.A2.A2b is marked active.
i State A.A2.A2b entry actions (entA2b()) execute and complete.
State A.A2.A2b is now active as a result of the processing of event broadcast E_two.
5 The chart goes back to sleep.
B-47
B Broadcast Events in Parallel (AND) States
This sequence completes the execution of this Stateflow chart associated with event
E_one and the event broadcast on a transition action to a parallel state of event E_two.
The final chart activity is that parallel substates A.A1.A1b and A.A2.A2b are active.
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
B-48
Broadcast Events in Parallel (AND) States
Initially, the chart is asleep. Parallel substates A.A1.A1a and A.A2.A2a are active.
Event E_one occurs and awakens the chart, which processes the event from the root
down through the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of E_one. No
valid transition exists.
2 State A during actions (durA()) execute and complete.
3 State A's children are parallel (AND) states. Because implicit ordering applies, the
states are evaluated and executed from top to bottom, and from left to right. State
A.A1 is evaluated first. State A.A1 during actions (durA1()) execute and complete.
4 State A.A1 checks for any valid transitions as a result of event E_one. A valid
transition from state A.A1.A1a to state A.A1.A1b exists. A valid condition action
B-49
B Broadcast Events in Parallel (AND) States
also exists. The condition action event broadcast of E_two executes and completes.
State A.A1.A1a is still active:
a The broadcast of event E_two awakens the Stateflow chart a second time. The
chart root checks to see if there is a valid transition as a result of E_two. There
is no valid transition.
b State A during actions (durA()) execute and complete.
c State A's children are evaluated starting with state A.A1. State A.A1 during
actions (durA1()) execute and complete. State A.A1 is evaluated for valid
transitions. There are no valid transitions as a result of E_two within state A1.
d State A1a during actions (durA1a()) execute.
e State A.A2 is evaluated. State A.A2 during actions (durA2()) execute and
complete. State A.A2 checks for valid transitions. State A.A2 has a valid
transition as a result of E_two from state A.A2.A2a to state A.A2.A2b.
f State A.A2.A2a exit actions (exitA2a()) execute and complete.
g State A.A2.A2a is marked inactive.
h State A.A2.A2b is marked active.
i State A.A2.A2b entry actions (entA2b()) execute and complete.
5 State A.A1.A1a executes and completes exit actions (exitA1a).
6 State A.A1.A1a is marked inactive.
7 State A.A1.A1b is marked active.
8 State A.A1.A1b entry actions (entA1b()) execute and complete.
9 Parallel state A.A2 is evaluated next. State A.A2 during actions (durA2()) execute
and complete. There are no valid transitions as a result of E_one.
10 State A.A2.A2b during actions (durA2b()) execute and complete.
State A.A2.A2b is now active as a result of the processing of the condition action
event broadcast of E_two.
11 The chart goes back to sleep.
This sequence completes the execution of this Stateflow chart associated with event
E_one and the event broadcast on a condition action to a parallel state of event E_two.
The final chart activity is that parallel substates A.A1.A1b and A.A2.A2b are active.
B-50
Broadcast Events in Parallel (AND) States
Tip: Avoid using undirected local event broadcasts, which can cause unwanted recursive
behavior in your chart. Use the send operator for directed local event broadcasts. For
more information, see Broadcast Events to Synchronize States on page 11-52.
You can set the diagnostic level for detecting undirected local event broadcasts. In the
Model Configuration Parameters dialog box, go to the Diagnostics > Stateflow pane
and set the Undirected event broadcasts diagnostic to none, warning, or error. The
default setting is warning.
B-51
B Directly Broadcast Events
In this section...
Directed Event Broadcast Using Send on page B-52
Directed Event Broadcast Using Qualified Event Name on page B-53
B-52
Directly Broadcast Events
Initially, the chart is asleep. Parallel substates A.A1 and B.B1 are active, which implies
that parallel (AND) superstates A and B are also active. The condition [data1==1] is
true. The event E_one belongs to the chart and is visible to both A and B.
After waking up, the chart checks for valid transitions at every level of the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of the event.
There is no valid transition.
2 State A checks for any valid transitions as a result of the event. Because the
condition [data1==1] is true, there is a valid transition from state A.A1 to state
A.A2.
3 The action send(E_one,B) executes:
a The broadcast of event E_one reaches state B. Because state B is active, that
state receives the event broadcast and checks to see if there is a valid transition.
There is a valid transition from B.B1 to B.B2.
b State B.B1 exit actions (exitB1()) execute and complete.
c State B.B1 becomes inactive.
d State B.B2 becomes active.
e State B.B2 entry actions (entB2()) execute and complete.
4 State A.A1 exit actions (exitA1()) execute and complete.
5 State A.A1 becomes inactive.
6 State A.A2 becomes active.
7 State A.A2 entry actions (entA2()) execute and complete.
This sequence completes execution of a chart with a directed event broadcast to a parallel
state.
B-53
B Directly Broadcast Events
The only differences from the chart in Directed Event Broadcast Using Send on page
B-52 are:
The event E_one belongs to state B and is visible only to that state.
The action send(E_one,B) is now send(B.E_one).
Using a qualified event name is necessary because E_one is not visible to state A.
After waking up, the chart checks for valid transitions at every level of the hierarchy:
1 The chart root checks to see if there is a valid transition as a result of the event.
There is no valid transition.
2 State A checks for any valid transitions as a result of the event. Because the
condition [data1==1] is true, there is a valid transition from state A.A1 to state
A.A2.
3 The action send(B.E_one) executes and completes:
B-54
Directly Broadcast Events
a The broadcast of event E_one reaches state B. Because state B is active, that
state receives the event broadcast and checks to see if there is a valid transition.
There is a valid transition from B.B1 to B.B2.
b State B.B1 exit actions (exitB1()) execute and complete.
c State B.B1 becomes inactive.
d State B.B2 becomes active.
e State B.B2 entry actions (entB2()) execute and complete.
4 State A.A1 exit actions (exitA1()) execute and complete.
5 State A.A1 becomes inactive.
6 State A.A2 becomes active.
7 State A.A2 entry actions (entA2()) execute and complete.
This sequence completes execution of a chart with a directed event broadcast using a
qualified event name to a parallel state.
B-55
Glossary
API (application Format you can use to access and communicate with
programming interface) an application program from a programming or script
environment.
atomic subchart Graphical object that enables you to reuse states and
subcharts across multiple charts. For more information,
see When to Use Atomic Subcharts on page 14-4.
Glossary-1
Glossary
Glossary-2
Glossary
finite state machine (FSM) Representation of an event-driven system. FSMs are also
used to describe reactive systems. In an event-driven or
reactive system, the system transitions from one mode or
state to another prescribed mode or state, provided that
the condition defining the change is true.
flow chart Set of decision flow paths that start from a transition
segment that, in turn, starts from a state or a default
transition segment.
flow subgraph Set of decision flow paths that start on the same
transition segment.
Glossary-3
Glossary
inner transitions Transition that does not exit the source state. Inner
transitions are useful when defined for superstates with
exclusive (OR) decomposition. Use of inner transitions can
greatly simplify chart layout.
Glossary-4
Glossary
MATLAB function A chart function that works with a subset of the MATLAB
programming language.
Model Explorer Use to add, remove, and modify data, event, and target
objects in the Stateflow hierarchy. See Use the Model
Explorer with Stateflow Objects on page 30-10 for more
information.
notation Defines a set of objects and the rules that govern the
relationships between those objects. Stateflow chart
notation provides a way to communicate the design
information in a Stateflow chart.
Glossary-5
Glossary
Simulink function A chart function that you fill with Simulink blocks
and call in the actions of states and transitions. This
function provides an efficient model design and improves
readability by minimizing the graphical and nongraphical
objects required in a model. In a Stateflow chart, this
function acts like a function-call subsystem block of a
Simulink model.
Glossary-6
Glossary
Stateflow Finder Use to display a list of objects based on search criteria you
specify. You can directly access the properties dialog box
of any object in the search output display by clicking that
object.
Glossary-7
Glossary
truth table function A chart function that specifies logical behavior with
conditions, decisions, and actions. Truth tables are easier
to program and maintain than graphical functions.
Glossary-8