Declaration Functions

You can use declaration functions to compute derived parameter values or initialize variables, instead of doing this inside the setup function.

Note

Starting in R2019a, using setup is not recommended. Other constructs available in Simscape™ language let you achieve the same results without compromising run-time capabilities. For more information, see setup is not recommended.

Declaration function is a MATLAB® function used inside a member declaration section in a Simscape file. A declaration function can be any MATLAB function (even if it is not supported in the Simscape language equations section), including user-defined functions on the MATLAB path. For example:

component A
  parameters
    p1 = 1;
    p2 = 0;
  end
  parameters(Access = private)
    pDerived = gamma(p1) + p2;
  end
  variables(Access = private)
    vDerived = {value = {my_fcn(p1,p2) + 1, 'm'}, priority = priority.high };
  end
  equations
    ...
  end
end

Use the Access=private attribute for member declaration unless all the arguments of the declaration function are constants.

Exercise caution when using persistent variables inside a declaration function, because this may lead to inconsistent results for multiple simulation runs.

Multiple Return Values

Declaration functions can return multiple values. They follow the general MATLAB function conventions for multiple return values. For example, if my_fcn() is a declaration function that returns three values:

[id1, ~, id3] = my_fcn();  % omit the second return value
[id1] = my_fcn();  % rules of single assignment apply, nonrequested return values ignored

The following restrictions apply:

  • You can use multiple value assignments on the left-hand side only for parameters and variables with the Access=private attribute.

  • When omitting return values using the placeholder attribute (~), at least one value must be assigned. Empty declarations produce an error in Simscape language.

Restriction on Values with Units

Inputs and outputs of a declaration function must be unitless, that is, have a unit of '1'. Therefore, you cannot directly pass parameter values, with units, as declaration function inputs.

For example, parameter p has the units of 'm'. To use it as an input for the myfcn function, use the value function to get the unitless value of the parameter.

parameters
      p = {1,'m'}
end
parameters(Access = private)
      pd = my_fcn(value(p,'m'));   % extract unitless value from p
end

In the previous example, pd is a unitless parameter. To declare it as a value with unit, use the {value,'unit'} syntax, for example:

      pd = {my_fcn(value(p,'m')),'m/s'};

For multiple input and return values with units, use this syntax:

      [y_value,z_value] = my_fcn(value(a,'V'),value(b,'V'));
      y = {y_value,'V'};
      z = {z_value,'V'};

For more information, see Declaring a Member as a Value with Unit.

Run-Time Compatibility

Member declarations for parameters and variables can include calls to MATLAB functions that generate code.

By default, the declaration function will be evaluated at run time if a run-time parameter appears in its input parameters. Otherwise, it will be evaluated at compile time.

In this example, my_fcn is a MATLAB function that supports code generation:

component A
  parameters
    p1 = 1;
    p2 = 0;
  end
  parameters(Access = private)
    pDerived = my_fcn(p1,p2);
  end
  equations
    ...
  end
end

If p1 or p2 is designated as Run-time in the block dialog, then my_fcn is evaluated at run time, and you can tune these parameter values without regenerating code.

If my_fcn does not support code generation, you can set the member attributeMATLABEvaluation=compiletime, to prevent the block user from accidentally designating any of the function input parameters as Run-time in the block dialog:

component A
  parameters
    p1 = 1;
    p2 = 0;
  end
  parameters(Access = private,MATLABEvaluation = compiletime)
    pDerived = my_fcn(p1,p2);
  end
  equations
    ...
  end
end

If you set this attribute, the declaration function will be evaluated only at compile time, and the block parameters p1 and p2 will be marked as Compile-time only.

To work with run-time parameters:

  • The declaration function must be in an unprotected MATLAB file

  • All MATLAB code called must be MATLAB Coder™ compatible

  • Subfunctions can be in protected MATLAB files, but to use them with run-time parameters:

    • Use coder.allowpcode('plain')

    • Turn on lint: %#codegen

For more information, see Run-Time Parameters.