Declare Component Variables
Through and Across Component Variables
When you declare Through and Across variables in a component, you are essentially creating instances of domain Through and Across variables. You declare a component variable as a value with unit by specifying an initial value and units commensurate with units of the domain variable.
The following example initializes the Through variable t
(torque)
as 0 N*m:
variables t = {0,'N*m'}; end
Note
After you declare component Through and Across variables, you have to specify their relationship with component nodes, and therefore with the domain Through and Across variables. For more information, see Define Relationship Between Component Variables and Nodes.
Internal Component Variables
You can also declare an internal component variable as a value with unit. You can use such
internal variables throughout the component file, for example, in the
equations
section or in the intermediate term
declarations. Component variables are also used in the model initialization process, as
described in Variable Priority for Model Initialization.
The following example declares and initializes three variables:
variables f = {0,'N'}; % Force v = {0,'m/s'}; % Velocity x = {0,'m'}; % Spring deformation end
Force and velocity are the component Through and Across variables, later to be connected to
the domain Through and Across variables using the
branches
section. Spring deformation is an internal
component variable, to be used for model initialization.
You can declare internal component variables of type integer
or real as event variables by setting the Event=true
attribute.
For more information, see Event Variables.
Variable Priority for Model Initialization
When you generate a custom Simscape™ block from a component file, the Initial Targets section of the block dialog box will list all the public variables specified in the underlying component file, along with the initialization priority, target initial value, and unit of each variable. The block user can change the variable priority and target, prior to simulation, to affect the model initialization. For more information, see Variable Initialization.
The default values for variable priority, target value, and unit come from the variable declaration in the component file. Specifying an optional comment lets you control the variable name in the block dialog box. For more information, see Specify Meaningful Names for the Block Parameters and Variables.
Note
For variables with temperature units, there is an additional consideration of whether
to apply linear or affine conversion when the block user changes the unit in the
Initial Targets section of the block dialog box. Use the
Conversion
attribute in the same way as for the block parameters. For
details, see Parameter Units.
In most cases, it is sufficient to declare a variable just as a value with unit, omitting its
priority, which is equivalent to priority = priority.none
. The block user
can set the variable priority, as needed, in the Initial Targets
section of the block dialog box prior to simulation.
In some cases, however, setting a variable to a certain priority by default is essential to
the correct operation of the component. To specify a high or low default priority for a
component variable, declare the variable as a field array. For example, the following
declaration initializes variable x
(spring deformation) as 0 mm, with
high priority:
variables x = {value = {0,'m'},priority = priority.high}; % Spring deformation end
In this case, the Spring deformation variable will appear in the
Initial Targets section of the block dialog box with the default
priority High
and the default target value and unit 0
mm
, but the block user can change the variable priority and target as
usual.
If you want a variable to always have high initialization priority, without letting the block user to change it, declare the variable as private:
variables(Access=private) x = {value = {0,'m'},priority = priority.high}; end
In this case, the block user does not have control over the variable priority or initialization target, because private variables do not appear in the Initial Targets section of the block dialog box.
If you want the variable to always have a certain initialization priority, such as
High
, but let the block user specify the target value, declare the
variable as private and tie it to an initialization parameter:
parameters p = {0,'m'}; % Initial deformation end variables(Access=private) x = {value = p,priority = priority.high}; end
In this case, the value of the Initial deformation parameter,
specified by the block user, is assigned as the initial target to
variable x
, with high initialization priority.
Depending on the results of the solve, this target may or may not
be satisfied when the solver computes the initial conditions for simulation.
For more information, see Initial Conditions Computation.
For composite components, member components are declared as hidden and therefore their variables do not appear in the Initial Targets section of the block dialog box. However, you can use a top-level parameter to let the block user specify the initial target value of a member component variable. For more information, see Specifying Initial Target Values for Member Variables.
Variable Initialization Range
When declaring a variable, you can specify the minimum and maximum acceptable values for its initialization, for example:
variables x = {value={0,'deg'},priority=priority.high,imin={0,'deg'},imax={360,'deg'}}; end
When multiple initialization solutions exist, this syntax lets you guide the solver towards the preferred solution. For more information, see Block-Level Variable Initialization. If the specified range cannot be satisfied during initialization, the solver issues an error.
The solver tries to satisfy the initialization range for a variable regardless of
whether its initialization priority is high, low, or none. It is recommended that you use
the priority
attribute sparingly. The default priority value,
priority.none
(which is equivalent to leaving out the
priority
attribute entirely), is suitable in most cases. Differential
variables, in general, need high priority, but it is important to avoid over-specificaton.
For more information, see Initialize Variables for a Mass-Spring-Damper System.
The block user can modify the variable priority value, as needed, in the Initial Targets section of the block dialog box prior to simulation. However, the block user does not have control over the variable initialization range. Only the block author can specify the acceptable minimum and maximum values for variable initialization in the component file, both for continuous and for event variables.
The default initialization range is (-inf,inf)
. Therefore, you do not
have to specify both values to define the range, it is sufficient to specify only
imin
or imax
. For example, use this syntax to limit
the temperature to positive values:
variables T = {value={293.15,'K'},imin={0,'K'}}; end
When you specify imin
or imax
, these values define
an open range.
For model initialization using an operating point, the solver tries to satisfy initialization ranges only for variables that do not have a target in the operating point data tree. For more information, see Using Operating Point Data for Model Initialization.
Nominal Value and Unit for a Variable
Nominal values provide a way to specify the expected magnitude of a variable in a model, similar to specifying a transformer rating, or setting a range on a voltmeter. For more information, see System Scaling by Nominal Values.
Each model has an underlying table of nominal value-unit pairs. In general, all variables in a model are scaled based on the nominal value corresponding to their physical unit. You can override this scaling for an individual variable in a component file by providing a nominal value and unit as a variable declaration attribute.
variables x = {value = {value,'unit'},nominal = {value,'unit'}}; end
When you generate a custom Simscape block from a component file, nominal value and unit form the
nominal
declaration attribute translate into default values for block
parameters
and
x
_nominal
(where
x
_nominal_unitx
is the variable name).
For example, this variable declaration:
variables i = {value = {0,'A'},nominal = {1,'mA'}}; % Current end
produces the following default values for block parameters:
i_nominal_value
, with a value of'1'
i_nominal_unit
, with a value of'mA'
and looks like this in the block dialog box.
Note
It is recommended that you use the nominal
attribute sparingly. The
default nominal values, which come from the model value-unit table, are suitable in most
cases. The block user can also modify the nominal values and units for individual blocks
by using either the block dialog box or set_param
and
get_param
functions, if needed. For more information, see Modify Nominal Values for a Block Variable.
Related Examples
- Declare a Spring Component
- Declare Through and Across Variables for a Domain
- Declare Component Parameters
- Declaring Domain Parameters
- Declare Component Nodes
- Declare Component Inputs and Outputs