Main Content

Detect change in data from specified value

`tf = hasChangedFrom(`

returns 1 (`data_name`

,`value`

)`true`

) if the value of `data_name`

was
equal to the specified `value`

at the beginning of the previous
time step and is a different value at the beginning of the current time step.
Otherwise, the operator returns 0 (`false`

).

The argument `data_name`

can be:

A scalar variable.

A matrix or an element of a matrix.

If

`data_name`

is a matrix, the operator returns`true`

when it detects a change in any element of`data_name`

and the previous value of`data_name`

was equal to`value`

.Index elements of a matrix by using numbers or expressions that evaluate to a constant integer. See Supported Operations for Vectors and Matrices.

A structure or a field in a structure.

If

`data_name`

is a structure, the change detection operator returns`true`

when it detects a change in any element of`data_name`

and the previous value of`data_name`

was equal to`value`

.Index fields in a structure by using dot notation. See Index and Assign Values to Stateflow Structures.

Any valid combination of structure fields or matrix elements.

The argument `data_name`

cannot be a nontrivial expression or a custom
code variable.

**Note**

Standalone charts in MATLAB^{®} do not support change detection on an element of a matrix or a
field in a structure.

The argument `value`

can be any expression that resolves to a
value that is comparable with `data_name`

:

If

`data_name`

is a scalar, then`value`

must resolve to a scalar value.If

`data_name`

is a matrix, then`value`

must resolve to a matrix value with the same dimensions as`data_name`

.Alternatively, in a chart that uses C as the action language,

`value`

can resolve to a scalar value. The chart uses scalar expansion to compare`data_name`

to a matrix whose elements are all equal to the value specified by`value`

. See Assign Values to All Elements of a Matrix.If

`data_name`

is a structure, then`value`

must resolve to a structure value whose field specification matches`data_name`

exactly.

If multiple input events occur in the same time step, the

`hasChangedFrom`

operator can detect changes in data value between input events.If the chart writes to the data object but does not change the data value, the

`hasChangedFrom`

operator returns`false`

.The type of Stateflow

^{®}chart determines the scope of the data supported by the change detection operators:Standalone Stateflow charts in MATLAB:

`Local`

onlyIn Simulink

^{®}models, charts that use MATLAB as the action language:`Input`

onlyIn Simulink models, charts that use C as the action language:

`Input`

,`Output`

,`Local`

, or`Data Store Memory`

In a standalone chart in MATLAB, a change detection operator can detect changes in data specified in a call to the

`step`

function because these changes occur before the start of the current time step. For example, if`x`

is equal to zero, the expression`hasChangedFrom(x,0)`

returns`true`

when you execute the chart`ch`

with the command:In contrast, a change detection operator cannot detect changes in data caused by assignments in state or transition actions in the same time step. Instead, the operator detects the change in value at the start of the next time step.`step(ch,'x',1);`

In a chart in a Simulink model, if you enable the chart option

**Initialize Outputs Every Time Chart Wakes Up**, using an output as the argument of the`hasChanged`

operator always returns`false`

. For more information, see Initialize outputs every time chart wakes up.When row-major array layout is enabled in charts that use

`hasChangedFrom`

, code generation produces an error. Before generating code in charts that use`hasChangedFrom`

, enable column-major array layout. See Select Array Layout for Matrices in Generated Code.