
By using when, we can express conditions we are interested in
reacting to and what we wish to do in response to them. In this
section, we’ll review the key ideas behind when statements. A
when statement has the following general form:
when expr then
// Statements
end when;
if vs. when¶In our discussion on Hysteresis, we briefly discussed the
difference between an if statement and a when statement. The
statements in a when statement become active only for an instant
when the triggering conditional expression becomes true. At all other
times, the when statement has no effect. An if statement or
if expression remains active as long as the conditional expression
is true. If the if statement or if expression includes an
else clause then some branch will always be active.
Most of the time, the expression expr is going to be a conditional
expression and usually it will involve relational operators. Typical
examples of expressions frequently used with a when statement
would be time>=2.0, x>=y+2, phi<=prev_phi and so on.
Recall from our discussion of the Interval Measurement speed
estimation algorithm that you should almost always put the pre
operator around any variables in expr that also appear inside the
when statement.
In the Bouncing Ball example, we saw a case where expr was
not a (scalar) conditional expression, but rather a vector of
conditional expressions. Recall from that discussion that the
when statement becomes active if any of the conditions in the
vector of expressions becomes true.
A when statement is used to define new values for some variables.
These new values can be assigned in one of two ways. The first is by
introducing an equation of the form:
var = expr;
In this case, the variable var will be given the value of
expr. Within expr, the pre operator should be used when
referring to the pre-event value for a variable. Any variable
assigned in this way is a discrete variable. This means that its
value only changes during events. In other words, it will be a
piecewise constant function. Note, a variable assigned in this way
cannot be continuous over any interval in the simulation.
If you want to explicitly mark a variable as discrete, you can prefix
it with the discrete qualifier (as we saw in the
Sample and Hold example earlier in this chapter) although this
is not strictly necessary. By adding the discrete qualifier you
ensure that the variable’s value must be determined within a when
statement.
The other way a variable can be given a value within a when
statement, as demonstrated in the Bouncing Ball example, is by
using the reinit operator. In that case, the statement within the
when statement will take the form:
reinit(var, expr);
When using the reinit operator, the variable, var, must be a
state. In other words, its solution must arise from solving a
differential equation. The use of reinit on such a variable has
the effect of stopping the integration process, changing the value of
the state (and any other states that have the reinit operator
applied to them within the same when statement) and then resuming
integration using what are effectively a new set of initial
conditions. The values of all other states not re-initialized with the
reinit operator remain unchanged.
algorithm Sections¶One final note about when statements is how they interact with the
“single assignment” rule in Modelica. This rule, from the
specification, states that there must be exactly one equation used to
determine the value of each variable. As we saw in the sections on
Speed Measurement and Hysteresis, it is sometimes
necessary (or at least clearer) to express behavior in terms of multiple
assignments. In those cases, if all the assignments are included
within a single algorithm section, they are effectively combined
into a single equation. However, doing so will limit the compiler’s
ability to perform symbolic manipulation and, therefore, may impact
simulation performance and/or reusability of the models.
It is also worth noting that if the semantics of an algorithm
section are needed during initialization, Modelica includes an
initial algorithm section that is analogous to the initial
equation section discussed in the previous discussion on
Initialization. The initial algorithm section will be
applied only during the initialization phase to determine initial
conditions, just like an initial equation section, but the
initial algorithm section will allow multiple assignments to the
same variable. The same caveats apply with respect to symbolic
manipulation.