Buildings.Controls.OBC.CDL.Reals

Package with blocks for continuous variables

Information

Package with blocks for elementary mathematical functions for continuous variables.

Package Content

Name Description
Buildings.Controls.OBC.CDL.Reals.Abs Abs Output the absolute value of the input
Buildings.Controls.OBC.CDL.Reals.Acos Acos Output the arc cosine of the input
Buildings.Controls.OBC.CDL.Reals.Add Add Output the sum of the two inputs
Buildings.Controls.OBC.CDL.Reals.AddParameter AddParameter Output the sum of an input plus a parameter
Buildings.Controls.OBC.CDL.Reals.Asin Asin Output the arc sine of the input
Buildings.Controls.OBC.CDL.Reals.Atan Atan Output the arc tangent of the input
Buildings.Controls.OBC.CDL.Reals.Atan2 Atan2 Output atan(u1/u2) of the inputs u1 and u2
Buildings.Controls.OBC.CDL.Reals.Average Average Output the average of its two inputs
Buildings.Controls.OBC.CDL.Reals.Cos Cos Output the cosine of the input
Buildings.Controls.OBC.CDL.Reals.Derivative Derivative Block that approximates the derivative of the input
Buildings.Controls.OBC.CDL.Reals.Divide Divide Output first input divided by second input
Buildings.Controls.OBC.CDL.Reals.Exp Exp Output the exponential (base e) of the input
Buildings.Controls.OBC.CDL.Reals.Greater Greater Output y is true, if input u1 is greater than input u2 with hysteresis
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold GreaterThreshold Output y is true, if input u is greater than threshold with hysteresis
Buildings.Controls.OBC.CDL.Reals.Hysteresis Hysteresis Transform Real to Boolean signal with Hysteresis
Buildings.Controls.OBC.CDL.Reals.IntegratorWithReset IntegratorWithReset Output the integral of the input signal
Buildings.Controls.OBC.CDL.Reals.Less Less Output y is true, if input u1 is less than input u2
Buildings.Controls.OBC.CDL.Reals.LessThreshold LessThreshold Output y is true, if input u is less than threshold with hysteresis
Buildings.Controls.OBC.CDL.Reals.LimitSlewRate LimitSlewRate Limit the increase or decrease rate of input
Buildings.Controls.OBC.CDL.Reals.Limiter Limiter Limit the range of a signal
Buildings.Controls.OBC.CDL.Reals.Line Line Output the value of the input x along a line specified by two points
Buildings.Controls.OBC.CDL.Reals.Log Log Output the natural (base e) logarithm of the input (input > 0 required)
Buildings.Controls.OBC.CDL.Reals.Log10 Log10 Output the base 10 logarithm of the input (input > 0 required)
Buildings.Controls.OBC.CDL.Reals.MatrixGain MatrixGain Output the product of a gain matrix with the input signal vector
Buildings.Controls.OBC.CDL.Reals.MatrixMax MatrixMax Output vector of row- or column-wise maximum of the input matrix
Buildings.Controls.OBC.CDL.Reals.MatrixMin MatrixMin Output vector of row- or column-wise minimum values
Buildings.Controls.OBC.CDL.Reals.Max Max Pass through the largest signal
Buildings.Controls.OBC.CDL.Reals.Min Min Pass through the smallest signal
Buildings.Controls.OBC.CDL.Reals.Modulo Modulo Output the remainder of first input divided by second input (~=0)
Buildings.Controls.OBC.CDL.Reals.MovingAverage MovingAverage Block to output moving average
Buildings.Controls.OBC.CDL.Reals.MultiMax MultiMax Output the maximum element of the input vector
Buildings.Controls.OBC.CDL.Reals.MultiMin MultiMin Output the minimum element of the input vector
Buildings.Controls.OBC.CDL.Reals.MultiSum MultiSum Sum of Reals, y = k[1]*u[1] + k[2]*u[2] + ... + k[n]*u[n]
Buildings.Controls.OBC.CDL.Reals.Multiply Multiply Output product of the two inputs
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter MultiplyByParameter Output the product of a gain value with the input signal
Buildings.Controls.OBC.CDL.Reals.PID PID P, PI, PD, and PID controller
Buildings.Controls.OBC.CDL.Reals.PIDWithReset PIDWithReset P, PI, PD, and PID controller with output reset
Buildings.Controls.OBC.CDL.Reals.Ramp Ramp Limit the changing rate of the input
Buildings.Controls.OBC.CDL.Reals.Round Round Round real number to given digits
Buildings.Controls.OBC.CDL.Reals.Sin Sin Output the sine of the input
Buildings.Controls.OBC.CDL.Reals.Sort Sort Sort elements of input vector in ascending or descending order
Buildings.Controls.OBC.CDL.Reals.Sqrt Sqrt Output the square root of the input (input >= 0 required)
Buildings.Controls.OBC.CDL.Reals.Subtract Subtract Output the difference of the two inputs
Buildings.Controls.OBC.CDL.Reals.Switch Switch Switch between two Real signals
Buildings.Controls.OBC.CDL.Reals.Tan Tan Output the tangent of the input
Buildings.Controls.OBC.CDL.Reals.Sources Sources Package with blocks that generate source signals
Buildings.Controls.OBC.CDL.Reals.Validation Validation Collection of models that validate the continuous blocks of the CDL

Buildings.Controls.OBC.CDL.Reals.Abs Buildings.Controls.OBC.CDL.Reals.Abs

Output the absolute value of the input

Buildings.Controls.OBC.CDL.Reals.Abs

Information

Block that outputs y = abs(u), where u is an input.

Connectors

TypeNameDescription
input RealInputuInput for absolute function
output RealOutputyAbsolute value of the input

Modelica definition

block Abs "Output the absolute value of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for absolute function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Absolute value of the input"; equation y=abs(u); end Abs;

Buildings.Controls.OBC.CDL.Reals.Acos Buildings.Controls.OBC.CDL.Reals.Acos

Output the arc cosine of the input

Buildings.Controls.OBC.CDL.Reals.Acos

Information

Block that outputs y = acos(u), where u is an input.

acos.png

Connectors

TypeNameDescription
input RealInputuInput for arc cosine function
output RealOutputyArc cosine of the input [rad]

Modelica definition

block Acos "Output the arc cosine of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for arc cosine function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y( final unit="rad", displayUnit="deg") "Arc cosine of the input"; equation y = Modelica.Math.acos(u); end Acos;

Buildings.Controls.OBC.CDL.Reals.Add Buildings.Controls.OBC.CDL.Reals.Add

Output the sum of the two inputs

Buildings.Controls.OBC.CDL.Reals.Add

Information

Block that outputs y as the sum of the two input signals u1 and u2,

    y = u1 + u2.

Connectors

TypeNameDescription
input RealInputu1Input to be added
input RealInputu2Input to be added
output RealOutputySum of the inputs

Modelica definition

block Add "Output the sum of the two inputs" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input to be added"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input to be added"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Sum of the inputs"; equation y=u1+u2; end Add;

Buildings.Controls.OBC.CDL.Reals.AddParameter Buildings.Controls.OBC.CDL.Reals.AddParameter

Output the sum of an input plus a parameter

Buildings.Controls.OBC.CDL.Reals.AddParameter

Information

Block that outputs y = u + p, where p is parameter and u is an input.

Parameters

TypeNameDefaultDescription
Realp Parameter to be added to the input

Connectors

TypeNameDescription
input RealInputuInput to be added to the parameter
output RealOutputySum of the parameter and the input

Modelica definition

block AddParameter "Output the sum of an input plus a parameter" parameter Real p "Parameter to be added to the input"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be added to the parameter"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Sum of the parameter and the input"; equation y=u+p; end AddParameter;

Buildings.Controls.OBC.CDL.Reals.Asin Buildings.Controls.OBC.CDL.Reals.Asin

Output the arc sine of the input

Buildings.Controls.OBC.CDL.Reals.Asin

Information

Block that outputs y = asin(u), where u is an input.

asin.png

Connectors

TypeNameDescription
input RealInputuInput for the arc sine function
output RealOutputyArc sin of the input [rad]

Modelica definition

block Asin "Output the arc sine of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for the arc sine function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y( final unit="rad", displayUnit="deg") "Arc sin of the input"; equation y = Modelica.Math.asin(u); end Asin;

Buildings.Controls.OBC.CDL.Reals.Atan Buildings.Controls.OBC.CDL.Reals.Atan

Output the arc tangent of the input

Buildings.Controls.OBC.CDL.Reals.Atan

Information

Block that outputs y = atan(u), where u is an input.

atan.png

Connectors

TypeNameDescription
input RealInputuInput for the arc tangent function
output RealOutputyArc tangent of the input [rad]

Modelica definition

block Atan "Output the arc tangent of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for the arc tangent function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y( final unit="rad", displayUnit="deg") "Arc tangent of the input"; equation y=Modelica.Math.atan(u); end Atan;

Buildings.Controls.OBC.CDL.Reals.Atan2 Buildings.Controls.OBC.CDL.Reals.Atan2

Output atan(u1/u2) of the inputs u1 and u2

Buildings.Controls.OBC.CDL.Reals.Atan2

Information

Block that outputs the tangent-inverse y = atan2(u1, u2) of the input u1 divided by the input u2.

u1 and u2 shall not be zero at the same time instant. Atan2 uses the sign of u1 and u2 in order to construct the solution in the range -π ≤ y ≤ π, whereas Buildings.Controls.OBC.CDL.Reals.Atan gives a solution in the range -π/2 ≤ y ≤ π/2.

atan2.png

Connectors

TypeNameDescription
input RealInputu1Input u1 for the atan2(u1/u2) function
input RealInputu2Input u2 for the atan2(u1/u2) function
output RealOutputyOutput with atan2(u1/u2) [rad]

Modelica definition

block Atan2 "Output atan(u1/u2) of the inputs u1 and u2" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1 for the atan2(u1/u2) function"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2 for the atan2(u1/u2) function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y( final unit="rad", displayUnit="deg") "Output with atan2(u1/u2)"; equation y=Modelica.Math.atan2(u1, u2); end Atan2;

Buildings.Controls.OBC.CDL.Reals.Average Buildings.Controls.OBC.CDL.Reals.Average

Output the average of its two inputs

Buildings.Controls.OBC.CDL.Reals.Average

Information

Block that outputs y = (u1 + u2) / 2, where u1 and u2 are inputs.

Connectors

TypeNameDescription
input RealInputu1Input for average function
input RealInputu2Input for average function
output RealOutputyOutput with the average of the two inputs

Modelica definition

block Average "Output the average of its two inputs" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input for average function"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input for average function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Output with the average of the two inputs"; equation y=0.5*(u1+u2); end Average;

Buildings.Controls.OBC.CDL.Reals.Cos Buildings.Controls.OBC.CDL.Reals.Cos

Output the cosine of the input

Buildings.Controls.OBC.CDL.Reals.Cos

Information

Block that outputs y = cos(u), where u is an input.

cos.png

Connectors

TypeNameDescription
input RealInputuInput for the cosine function [rad]
output RealOutputyCosine of the input

Modelica definition

block Cos "Output the cosine of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u( final unit="rad", displayUnit="deg") "Input for the cosine function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Cosine of the input"; equation y=Modelica.Math.cos(u); end Cos;

Buildings.Controls.OBC.CDL.Reals.Derivative Buildings.Controls.OBC.CDL.Reals.Derivative

Block that approximates the derivative of the input

Buildings.Controls.OBC.CDL.Reals.Derivative

Information

This blocks defines the transfer function between the input u and the output y as approximated derivative:

                s
  y = k * ------------ * u
            T * s + 1

If k=0, the block reduces to y=0.

Parameters

TypeNameDefaultDescription
Initialization
Realy_start0Initial value of output (= state)

Connectors

TypeNameDescription
input RealInputkInput for the gain
input RealInputTInput for the time constant (T>0 required; T=0 is ideal derivative block) [s]
input RealInputuInput to be differentiated
output RealOutputyApproximation of derivative du/dt

Modelica definition

block Derivative "Block that approximates the derivative of the input" parameter Real y_start=0 "Initial value of output (= state)"; Buildings.Controls.OBC.CDL.Interfaces.RealInput k "Input for the gain"; Buildings.Controls.OBC.CDL.Interfaces.RealInput T( final quantity="Time", final unit="s", min=100*Buildings.Controls.OBC.CDL.Constants.eps) "Input for the time constant (T>0 required; T=0 is ideal derivative block)"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be differentiated"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Approximation of derivative du/dt"; protected Real T_nonZero(final unit="s") "Non-zero value for T"; output Real x "State of block"; initial equation x= if abs(k) < Buildings.Controls.OBC.CDL.Constants.eps then u else u - T*y_start/k; equation T_nonZero = max(T, 100*Buildings.Controls.OBC.CDL.Constants.eps); der(x) = (u-x)/T_nonZero; y = (k/T_nonZero)*(u-x); end Derivative;

Buildings.Controls.OBC.CDL.Reals.Divide Buildings.Controls.OBC.CDL.Reals.Divide

Output first input divided by second input

Buildings.Controls.OBC.CDL.Reals.Divide

Information

Block that outputs y = u1 / u2, where u1 and u2 are inputs.

Connectors

TypeNameDescription
input RealInputu1Input for dividend
input RealInputu2Input for divisor
output RealOutputyOutput with the quotient

Modelica definition

block Divide "Output first input divided by second input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input for dividend"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input for divisor"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Output with the quotient"; equation y=u1/u2; end Divide;

Buildings.Controls.OBC.CDL.Reals.Exp Buildings.Controls.OBC.CDL.Reals.Exp

Output the exponential (base e) of the input

Buildings.Controls.OBC.CDL.Reals.Exp

Information

Block that outputs y = exp(u), where u is an input and exp() is the base-e exponential function.

exp.png

Connectors

TypeNameDescription
input RealInputuInput for the base e exponential function
output RealOutputyBase e exponential value of the input

Modelica definition

block Exp "Output the exponential (base e) of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for the base e exponential function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Base e exponential value of the input"; equation y=Modelica.Math.exp(u); end Exp;

Buildings.Controls.OBC.CDL.Reals.Greater Buildings.Controls.OBC.CDL.Reals.Greater

Output y is true, if input u1 is greater than input u2 with hysteresis

Buildings.Controls.OBC.CDL.Reals.Greater

Information

Block that outputs true if the Real input u1 is greater than the Real input u2, optionally within a hysteresis h.

The parameter h ≥ 0 is used to specify a hysteresis. For any h ≥ 0, the output switches to true if u1 > u2, and it switches to false if u1 ≤ u2 - h. Note that in the special case of h = 0, this produces the output y=u1 > u2.

To disable hysteresis, set h=0.

Usage

Enabling hysteresis can avoid frequent switching.
In simulation, adding hysteresis is recommended to guard against numerical noise. Otherwise, numerical noise from a nonlinear solver or from an implicit time integration algorithm may cause the simulation to stall. Numerical noise can be present if an input depends on a state variable or a quantity that requires an iterative solution, such as a temperature or a mass flow rate of an HVAC system.
In real controllers, adding hysteresis is recommended to guard against measurement noise. Otherwise, measurement noise may cause the output to change frequently.

Parameters

TypeNameDefaultDescription
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputu1First input u1
input RealInputu2Second input u2
output BooleanOutputyOutput true if u1 is greater than u2 with hysteresis

Modelica definition

block Greater "Output y is true, if input u1 is greater than input u2 with hysteresis" parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "First input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Second input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output true if u1 is greater than u2 with hysteresis"; protected final parameter Boolean have_hysteresis=h >= 1E-10 "True if the block has no hysteresis"; GreaterWithHysteresis greHys( final h=h, final pre_y_start=pre_y_start) if have_hysteresis "Block with hysteresis"; GreaterNoHysteresis greNoHys if not have_hysteresis "Block without hysteresis"; block GreaterNoHysteresis "Greater block without hysteresis" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u1 > u2; end GreaterNoHysteresis; block GreaterWithHysteresis "Greater block without hysteresis" parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert( h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u1 > u2 or pre(y) and u1 > u2-h); end GreaterWithHysteresis; equation connect(u1,greHys.u1); connect(u2,greHys.u2); connect(greHys.y,y); connect(u1,greNoHys.u1); connect(u2,greNoHys.u2); connect(greNoHys.y,y); end Greater;

Buildings.Controls.OBC.CDL.Reals.GreaterThreshold Buildings.Controls.OBC.CDL.Reals.GreaterThreshold

Output y is true, if input u is greater than threshold with hysteresis

Buildings.Controls.OBC.CDL.Reals.GreaterThreshold

Information

Block that outputs true if the Real input u is greater than a threshold t, optionally within a hysteresis h.

The parameter h ≥ 0 is used to specify a hysteresis. For any h ≥ 0, the output switches to true if u > t, where t is the threshold, and it switches to false if u ≤ t - h. Note that in the special case of h = 0, this produces the output y=u > t.

To disable hysteresis, set h=0.

Usage

Enabling hysteresis can avoid frequent switching.
In simulation, adding hysteresis is recommended to guard against numerical noise. Otherwise, numerical noise from a nonlinear solver or from an implicit time integration algorithm may cause the simulation to stall. Numerical noise can be present if an input depends on a state variable or a quantity that requires an iterative solution, such as a temperature or a mass flow rate of an HVAC system.
In real controllers, adding hysteresis is recommended to guard against measurement noise. Otherwise, measurement noise may cause the output to change frequently.

Parameters

TypeNameDefaultDescription
Realt0Threshold for comparison
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputuInput to be compared against the threshold
output BooleanOutputyOutputs true if u is greater than the threshold with hysteresis

Modelica definition

block GreaterThreshold "Output y is true, if input u is greater than threshold with hysteresis" parameter Real t=0 "Threshold for comparison"; parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be compared against the threshold"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Outputs true if u is greater than the threshold with hysteresis"; protected final parameter Boolean have_hysteresis=h >= 1E-10 "True if the block has no hysteresis"; GreaterWithHysteresis greHys( final h=h, final t=t, final pre_y_start=pre_y_start) if have_hysteresis "Block with hysteresis"; GreaterNoHysteresis greNoHys( final t=t) if not have_hysteresis "Block without hysteresis"; block GreaterNoHysteresis "Greater block without hysteresis" parameter Real t=0 "Threshold for comparison"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u > t; end GreaterNoHysteresis; block GreaterWithHysteresis "Greater block without hysteresis" parameter Real t=0 "Threshold for comparison"; parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert( h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u > t or pre(y) and u > t-h); end GreaterWithHysteresis; equation connect(u,greHys.u); connect(greHys.y,y); connect(u,greNoHys.u); connect(greNoHys.y,y); end GreaterThreshold;

Buildings.Controls.OBC.CDL.Reals.Hysteresis Buildings.Controls.OBC.CDL.Reals.Hysteresis

Transform Real to Boolean signal with Hysteresis

Buildings.Controls.OBC.CDL.Reals.Hysteresis

Information

Block that transforms a Real input signal into a Boolean output signal:

The start value of the output is defined via parameter pre_y_start (= value of pre(y) at initial time). The default value of this parameter is false.

Hysteresis.png

Parameters

TypeNameDefaultDescription
RealuLow if y=true and u<uLow, switch to y=false
RealuHigh if y=false and u>uHigh, switch to y=true
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputuInput to be compared against hysteresis values
output BooleanOutputyOutput value of comparison

Modelica definition

block Hysteresis "Transform Real to Boolean signal with Hysteresis" parameter Real uLow "if y=true and u<uLow, switch to y=false"; parameter Real uHigh "if y=false and u>uHigh, switch to y=true"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be compared against hysteresis values"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output value of comparison"; initial equation assert(uHigh > uLow, "Hysteresis limits wrong. uHigh must be larger than uLow"); pre(y)=pre_y_start; equation y=not pre(y) and u > uHigh or pre(y) and u >= uLow; end Hysteresis;

Buildings.Controls.OBC.CDL.Reals.IntegratorWithReset Buildings.Controls.OBC.CDL.Reals.IntegratorWithReset

Output the integral of the input signal

Buildings.Controls.OBC.CDL.Reals.IntegratorWithReset

Information

Block that outputs

y(t) = ystart + ∫t0t u(s) ds.

Whenever the input signal trigger changes from false to true, the integrator is reset by setting ystart to the value of the input signal y_reset_in.

Parameters

TypeNameDefaultDescription
Realk1Integrator gain
Initialization
Realy_start0Initial or guess value of output (= state)

Connectors

TypeNameDescription
input RealInputuInput to be integrated
input RealInputy_reset_inInput signal for state to which integrator is reset
input BooleanInputtriggerInput that resets the integrator output when it becomes true
output RealOutputyValue of the integrator

Modelica definition

block IntegratorWithReset "Output the integral of the input signal" parameter Real k=1 "Integrator gain"; parameter Real y_start=0 "Initial or guess value of output (= state)"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be integrated"; Buildings.Controls.OBC.CDL.Interfaces.RealInput y_reset_in "Input signal for state to which integrator is reset"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput trigger "Input that resets the integrator output when it becomes true"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Value of the integrator"; initial equation y=y_start; equation der(y)=k*u; when trigger then reinit(y, y_reset_in); end when; end IntegratorWithReset;

Buildings.Controls.OBC.CDL.Reals.Less Buildings.Controls.OBC.CDL.Reals.Less

Output y is true, if input u1 is less than input u2

Buildings.Controls.OBC.CDL.Reals.Less

Information

Block that outputs true if the Real input u1 is less than the Real input u2, optionally within a hysteresis h.

The parameter h ≥ 0 is used to specify a hysteresis. For any h ≥ 0, the output switches to true if u1 < u2, and it switches to false if u1 ≥ u2 + h. Note that in the special case of h = 0, this produces the output y=u1 < u2.

To disable hysteresis, set h=0.

Usage

Enabling hysteresis can avoid frequent switching.
In simulation, adding hysteresis is recommended to guard against numerical noise. Otherwise, numerical noise from a nonlinear solver or from an implicit time integration algorithm may cause the simulation to stall. Numerical noise can be present if an input depends on a state variable or a quantity that requires an iterative solution, such as a temperature or a mass flow rate of an HVAC system.
In real controllers, adding hysteresis is recommended to guard against measurement noise. Otherwise, measurement noise may cause the output to change frequently.

Parameters

TypeNameDefaultDescription
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputu1First input u1
input RealInputu2Second input u2
output BooleanOutputyOutputs true if u1 is less than u2

Modelica definition

block Less "Output y is true, if input u1 is less than input u2" parameter Real h(final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "First input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Second input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Outputs true if u1 is less than u2"; protected final parameter Boolean have_hysteresis=h >= 1E-10 "True if the block has no hysteresis"; LessWithHysteresis lesHys( final h=h, final pre_y_start=pre_y_start) if have_hysteresis "Block with hysteresis"; LessNoHysteresis lesNoHys if not have_hysteresis "Block without hysteresis"; block LessNoHysteresis "Less block without hysteresis" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u1 < u2; end LessNoHysteresis; block LessWithHysteresis "Less block without hysteresis" parameter Real h(final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert(h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u1 < u2 or pre(y) and u1 < u2+h); end LessWithHysteresis; equation connect(u1,lesHys.u1); connect(u2,lesHys.u2); connect(lesHys.y,y); connect(u1,lesNoHys.u1); connect(u2,lesNoHys.u2); connect(lesNoHys.y,y); end Less;

Buildings.Controls.OBC.CDL.Reals.LessThreshold Buildings.Controls.OBC.CDL.Reals.LessThreshold

Output y is true, if input u is less than threshold with hysteresis

Buildings.Controls.OBC.CDL.Reals.LessThreshold

Information

Block that outputs true if the Real input u is less than a threshold t, optionally within a hysteresis h.

The parameter h ≥ 0 is used to specify a hysteresis. For any h ≥ 0, the output switches to true if u < t, where t is the threshold, and it switches to false if u ≥ t + h. Note that in the special case of h = 0, this produces the output y=u < t.

Usage

Enabling hysteresis can avoid frequent switching. Adding hysteresis is recommended in real controllers to guard against sensor noise, and in simulation to guard against numerical noise. Numerical noise can be present if an input depends on a state variable or a quantity that requires an iterative solution, such as a temperature or a mass flow rate of an HVAC system. To disable hysteresis, set h=0.

Parameters

TypeNameDefaultDescription
Realt0Threshold for comparison
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputuInput to be compared against the threshold
output BooleanOutputyOutputs true if u is less than the threshold with hysteresis

Modelica definition

block LessThreshold "Output y is true, if input u is less than threshold with hysteresis" parameter Real t=0 "Threshold for comparison"; parameter Real h(final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be compared against the threshold"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Outputs true if u is less than the threshold with hysteresis"; protected final parameter Boolean have_hysteresis=h >= 1E-10 "True if the block has no hysteresis"; LessWithHysteresis lesHys( final h=h, final t=t, final pre_y_start=pre_y_start) if have_hysteresis "Block with hysteresis"; LessNoHysteresis lesNoHys( final t=t) if not have_hysteresis "Block without hysteresis"; block LessNoHysteresis "Less block without hysteresis" parameter Real t=0 "Threshold for comparison"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u < t; end LessNoHysteresis; block LessWithHysteresis "Less block without hysteresis" parameter Real t=0 "Threshold for comparison"; parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert(h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u < t or pre(y) and u < t+h); end LessWithHysteresis; equation connect(u,lesHys.u); connect(lesHys.y,y); connect(u,lesNoHys.u); connect(lesNoHys.y,y); end LessThreshold;

Buildings.Controls.OBC.CDL.Reals.LimitSlewRate Buildings.Controls.OBC.CDL.Reals.LimitSlewRate

Limit the increase or decrease rate of input

Buildings.Controls.OBC.CDL.Reals.LimitSlewRate

Information

The block limits the rate of change of the input by a ramp.

This block computes a threshold for the rate of change of the output y as thr = (u-y)/Td, where Td > 0 is parameter. The output y is computed as follows:

Implementation

For the block to work with arbitrary inputs and in order to produce a differentiable output, the input is numerically differentiated with derivative time constant Td. Smaller time constant Td means nearer ideal derivative.

Parameters

TypeNameDefaultDescription
RealraisingSlewRate Speed with which to increase the output [1/s]
RealfallingSlewRate-raisingSlewRateSpeed with which to decrease the output [1/s]
RealTdraisingSlewRate*10Derivative time constant [s]
BooleanenabletrueSet to false to disable rate limiter

Connectors

TypeNameDescription
input RealInputuInput signal to be rate of change limited
output RealOutputyRate of change limited output signal

Modelica definition

block LimitSlewRate "Limit the increase or decrease rate of input" parameter Real raisingSlewRate( min=Constants.small, unit="1/s") "Speed with which to increase the output"; parameter Real fallingSlewRate( max=-Constants.small, unit="1/s")=-raisingSlewRate "Speed with which to decrease the output"; parameter Real Td( final quantity="Time", final unit="s", min=Constants.eps)=raisingSlewRate*10 "Derivative time constant"; parameter Boolean enable=true "Set to false to disable rate limiter"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input signal to be rate of change limited"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Rate of change limited output signal"; protected Real thr=(u-y)/Td "Approximation to derivative between input and output"; initial equation assert(raisingSlewRate > 0, "raisingSlewRate must be larger than zero."); assert(fallingSlewRate < 0, "fallingSlewRate must be less than zero."); y=u; equation if enable then der(y)=smooth( 1, noEvent( if thr < fallingSlewRate then fallingSlewRate else if thr > raisingSlewRate then raisingSlewRate else thr)); else y=u; end if; end LimitSlewRate;

Buildings.Controls.OBC.CDL.Reals.Limiter Buildings.Controls.OBC.CDL.Reals.Limiter

Limit the range of a signal

Buildings.Controls.OBC.CDL.Reals.Limiter

Information

Block that outputs y = min(uMax, max(uMin, u)), where u is an input and uMax and uMin are parameters.

If uMax < uMin, an error occurs.

Parameters

TypeNameDefaultDescription
RealuMax Upper limit of input signal
RealuMin Lower limit of input signal

Connectors

TypeNameDescription
input RealInputuInput to be limited
output RealOutputyLimited value of input signal

Modelica definition

block Limiter "Limit the range of a signal" parameter Real uMax "Upper limit of input signal"; parameter Real uMin "Lower limit of input signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be limited"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Limited value of input signal"; initial equation assert(uMin < uMax, "uMin must be smaller than uMax. Check parameters."); equation y=homotopy( actual=smooth(0,noEvent( if u > uMax then uMax else if u < uMin then uMin else u)), simplified=u); end Limiter;

Buildings.Controls.OBC.CDL.Reals.Line Buildings.Controls.OBC.CDL.Reals.Line

Output the value of the input x along a line specified by two points

Buildings.Controls.OBC.CDL.Reals.Line

Information

Block that outputs y = a + b u, where u is an input and the coefficients a and b are determined so that the line intercepts the two input points specified by the two points x1 and f1, and x2 and f2.

The parameters limitBelow and limitAbove determine whether x1 and x2 are also used to limit the input u.

If the limits are used, then this block requires x1 < x2.

Parameters

TypeNameDefaultDescription
BooleanlimitBelowtrueIf true, limit input u to be no smaller than x1
BooleanlimitAbovetrueIf true, limit input u to be no larger than x2

Connectors

TypeNameDescription
input RealInputx1Input for support point x1, with x1 < x2
input RealInputf1Input for support point f(x1)
input RealInputx2Input for support point x2, with x2 > x1
input RealInputf2Input for support point f(x2)
input RealInputuInput for independent variable
output RealOutputyOutput with f(x) along the line specified by (x1, f1) and (x2, f2)

Modelica definition

block Line "Output the value of the input x along a line specified by two points" parameter Boolean limitBelow=true "If true, limit input u to be no smaller than x1"; parameter Boolean limitAbove=true "If true, limit input u to be no larger than x2"; Buildings.Controls.OBC.CDL.Interfaces.RealInput x1 "Input for support point x1, with x1 < x2"; Buildings.Controls.OBC.CDL.Interfaces.RealInput f1 "Input for support point f(x1)"; Buildings.Controls.OBC.CDL.Interfaces.RealInput x2 "Input for support point x2, with x2 > x1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput f2 "Input for support point f(x2)"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for independent variable"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Output with f(x) along the line specified by (x1, f1) and (x2, f2)"; protected Real a "Intercept"; Real b "Slope"; Real xLim "Input value after applying the limits"; equation if limitBelow or limitAbove then assert(x2 > x1, "x2 must be bigger than x1 in " + getInstanceName(), AssertionLevel.warning); end if; b=(f2-f1)/(x2-x1); a=f2-b*x2; if limitBelow and limitAbove then xLim=min(x2, max(x1, u)); elseif limitBelow then xLim=max(x1, u); elseif limitAbove then xLim=min(x2, u); else xLim=u; end if; y = a + b * xLim; end Line;

Buildings.Controls.OBC.CDL.Reals.Log Buildings.Controls.OBC.CDL.Reals.Log

Output the natural (base e) logarithm of the input (input > 0 required)

Buildings.Controls.OBC.CDL.Reals.Log

Information

Block that outputs y = log(u), where u is an input and log() is the natural logarithm (base-e) function.

An error occurs if the input u is zero or negative.

log.png

Connectors

TypeNameDescription
input RealInputuInput for base e logarithm
output RealOutputyBase e logarithm of the input

Modelica definition

block Log "Output the natural (base e) logarithm of the input (input > 0 required)" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for base e logarithm"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Base e logarithm of the input"; equation y=Modelica.Math.log(u); end Log;

Buildings.Controls.OBC.CDL.Reals.Log10 Buildings.Controls.OBC.CDL.Reals.Log10

Output the base 10 logarithm of the input (input > 0 required)

Buildings.Controls.OBC.CDL.Reals.Log10

Information

Block that outputs y = log10(u), where u is an input and log10() is the logarithm (base-10) function.

An error occurs if the input u is zero or negative.

log10.png

Connectors

TypeNameDescription
input RealInputuInput for base 10 logarithm
output RealOutputyBase 10 logarithm of the input

Modelica definition

block Log10 "Output the base 10 logarithm of the input (input > 0 required)" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input for base 10 logarithm"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Base 10 logarithm of the input"; equation y=Modelica.Math.log10(u); end Log10;

Buildings.Controls.OBC.CDL.Reals.MatrixGain Buildings.Controls.OBC.CDL.Reals.MatrixGain

Output the product of a gain matrix with the input signal vector

Buildings.Controls.OBC.CDL.Reals.MatrixGain

Information

This blocks computes output vector y as the product of the gain matrix K with the input signal vector u as y = K u. For example,

   parameter Real K[:,:] = [0.12, 2; 3, 1.5];

results in

     | y[1] |     | 0.12,  2.00 |   | u[1] |
     |      |  =  |            | * |      |
     | y[2] |     | 3.00,  1.50 |   | u[2] |

Parameters

TypeNameDefaultDescription
RealK[:, :][1, 0; 0, 1]Gain matrix which is multiplied with the input

Connectors

TypeNameDescription
input RealInputu[nin]Input to be multiplied with the gain matrix
output RealOutputy[nout]Product of gain matrix times the input

Modelica definition

block MatrixGain "Output the product of a gain matrix with the input signal vector" parameter Real K[:,:]=[1, 0; 0, 1] "Gain matrix which is multiplied with the input"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nin] "Input to be multiplied with the gain matrix"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y[nout] "Product of gain matrix times the input"; protected parameter Integer nin=size(K, 2) "Number of inputs"; parameter Integer nout=size(K, 1) "Number of outputs"; equation y=K*u; end MatrixGain;

Buildings.Controls.OBC.CDL.Reals.MatrixMax Buildings.Controls.OBC.CDL.Reals.MatrixMax

Output vector of row- or column-wise maximum of the input matrix

Buildings.Controls.OBC.CDL.Reals.MatrixMax

Information

If rowMax = true, this block outputs the row-wise maximum of the input matrix u, otherwise it outputs the column-wise maximum of the input matrix u.

Parameters

TypeNameDefaultDescription
BooleanrowMaxtrueIf true, outputs row-wise maximum, otherwise column-wise
IntegernRow Number of rows in input matrix
IntegernCol Number of columns in input matrix

Connectors

TypeNameDescription
input RealInputu[nRow, nCol]Input for the matrix max function
output RealOutputy[if rowMax then size(u, 1) else size(u, 2)]Output with vector of row- or colum-wise maximum of the input matrix

Modelica definition

block MatrixMax "Output vector of row- or column-wise maximum of the input matrix" parameter Boolean rowMax=true "If true, outputs row-wise maximum, otherwise column-wise"; parameter Integer nRow(final min=1) "Number of rows in input matrix"; parameter Integer nCol(final min=1) "Number of columns in input matrix"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nRow, nCol] "Input for the matrix max function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y[ if rowMax then size(u, 1) else size(u, 2)] "Output with vector of row- or colum-wise maximum of the input matrix"; equation if rowMax then y={max(u[i,:]) for i in 1:size(u,1)}; else y={max(u[:,i]) for i in 1:size(u,2)}; end if; end MatrixMax;

Buildings.Controls.OBC.CDL.Reals.MatrixMin Buildings.Controls.OBC.CDL.Reals.MatrixMin

Output vector of row- or column-wise minimum values

Buildings.Controls.OBC.CDL.Reals.MatrixMin

Information

If rowMin = true, this block outputs the row-wise minimum of the input matrix u, otherwise it outputs the column-wise minimum of the input matrix u.

Parameters

TypeNameDefaultDescription
BooleanrowMintrueIf true, outputs row-wise minimum, otherwise column-wise
IntegernRow Number of rows in input matrix
IntegernCol Number of columns in input matrix

Connectors

TypeNameDescription
input RealInputu[nRow, nCol]Input for the matrix min function
output RealOutputy[if rowMin then size(u, 1) else size(u, 2)]Output with vector of row- or colum-wise minimum of the input matrix

Modelica definition

block MatrixMin "Output vector of row- or column-wise minimum values" parameter Boolean rowMin=true "If true, outputs row-wise minimum, otherwise column-wise"; parameter Integer nRow(final min=1) "Number of rows in input matrix"; parameter Integer nCol(final min=1) "Number of columns in input matrix"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nRow, nCol] "Input for the matrix min function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y[ if rowMin then size(u, 1) else size(u, 2)] "Output with vector of row- or colum-wise minimum of the input matrix"; equation if rowMin then y={min(u[i,:]) for i in 1:size(u,1)}; else y={min(u[:,i]) for i in 1:size(u,2)}; end if; end MatrixMin;

Buildings.Controls.OBC.CDL.Reals.Max Buildings.Controls.OBC.CDL.Reals.Max

Pass through the largest signal

Buildings.Controls.OBC.CDL.Reals.Max

Information

Block that outputs y = max(u1, u2), where u1 and u2 are inputs.

Connectors

TypeNameDescription
input RealInputu1Input to the max function
input RealInputu2Input to the max function
output RealOutputyMaximum of the inputs

Modelica definition

block Max "Pass through the largest signal" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input to the max function"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input to the max function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Maximum of the inputs"; equation y=max(u1, u2); end Max;

Buildings.Controls.OBC.CDL.Reals.Min Buildings.Controls.OBC.CDL.Reals.Min

Pass through the smallest signal

Buildings.Controls.OBC.CDL.Reals.Min

Information

Block that outputs y = min(u1, u2), where u1 and u2 are inputs.

Connectors

TypeNameDescription
input RealInputu1Input to the min function
input RealInputu2Input to the min function
output RealOutputyMinimum of the inputs

Modelica definition

block Min "Pass through the smallest signal" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input to the min function"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input to the min function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Minimum of the inputs"; equation y=min(u1, u2); end Min;

Buildings.Controls.OBC.CDL.Reals.Modulo Buildings.Controls.OBC.CDL.Reals.Modulo

Output the remainder of first input divided by second input (~=0)

Buildings.Controls.OBC.CDL.Reals.Modulo

Information

Block that outputs y = mod(u1/u2), where u1 and u2 are inputs.

Connectors

TypeNameDescription
input RealInputu1Dividend of the modulus function
input RealInputu2Divisor of the modulus function
output RealOutputyModulus u1 mod u2

Modelica definition

block Modulo "Output the remainder of first input divided by second input (~=0)" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Dividend of the modulus function"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Divisor of the modulus function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Modulus u1 mod u2"; equation y=mod(u1, u2); end Modulo;

Buildings.Controls.OBC.CDL.Reals.MovingAverage Buildings.Controls.OBC.CDL.Reals.MovingAverage

Block to output moving average

Buildings.Controls.OBC.CDL.Reals.MovingAverage

Information

This block outputs the mean value of its input signal as

      1  t
y =   -  ∫   u(s) ds
      δ  t-δ

where δ is a parameter that determines the time window over which the input is averaged. For t < δ seconds, it outputs

           1      t
y =   --------    ∫   u(s) ds
      t-t0+10-10   t0

where t0 is the initial time.

This block can for example be used to output the moving average of a noisy measurement signal.

See Buildings.Controls.OBC.CDL.Reals.Validation.MovingAverage and Buildings.Controls.OBC.CDL.Reals.Validation.MovingAverage_nonZeroStart for example.

Parameters

TypeNameDefaultDescription
Realdelta Time horizon over which the input is averaged [s]

Connectors

TypeNameDescription
input RealInputuInput to be averaged
output RealOutputyMoving average of the input

Modelica definition

block MovingAverage "Block to output moving average" parameter Real delta( final quantity="Time", final unit="s", min=1E-5) "Time horizon over which the input is averaged"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be averaged"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Moving average of the input"; protected parameter Real tStart( final quantity="Time", final unit="s", fixed=false) "Start time"; Real mu "Internal integrator variable"; Real muDel "Internal integrator variable with delay"; Boolean mode( start=false, fixed=true) "Calculation mode"; initial equation tStart=time; mu=0; equation u=der(mu); muDel=delay(mu, delta); // Compute the mode so that Dymola generates // time and not state events as it would with // an if-then construct when time >= tStart+delta then mode=true; end when; if mode then y=(mu-muDel)/delta; else y=(mu-muDel)/(time-tStart+1E-3); end if; end MovingAverage;

Buildings.Controls.OBC.CDL.Reals.MultiMax Buildings.Controls.OBC.CDL.Reals.MultiMax

Output the maximum element of the input vector

Buildings.Controls.OBC.CDL.Reals.MultiMax

Information

Outputs the maximum element of the input vector.

Connectors

TypeNameDescription
input RealInputu[nin]Input to max function
output RealOutputyLargest element of the input vector

Modelica definition

block MultiMax "Output the maximum element of the input vector" parameter Integer nin(min=0)=0 "Number of input signals"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nin] "Input to max function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Largest element of the input vector"; equation y=max(u); end MultiMax;

Buildings.Controls.OBC.CDL.Reals.MultiMin Buildings.Controls.OBC.CDL.Reals.MultiMin

Output the minimum element of the input vector

Buildings.Controls.OBC.CDL.Reals.MultiMin

Information

Outputs the minimum element of the input vector.

Connectors

TypeNameDescription
input RealInputu[nin]Input to the min function
output RealOutputySmallest element of the input vector

Modelica definition

block MultiMin "Output the minimum element of the input vector" parameter Integer nin(min=0)=0 "Number of input signals"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nin] "Input to the min function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Smallest element of the input vector"; equation y=min(u); end MultiMin;

Buildings.Controls.OBC.CDL.Reals.MultiSum Buildings.Controls.OBC.CDL.Reals.MultiSum

Sum of Reals, y = k[1]*u[1] + k[2]*u[2] + ... + k[n]*u[n]

Buildings.Controls.OBC.CDL.Reals.MultiSum

Information

Block that outputs

y = ∑i=1n ki   ui,

where k is a parameter with n elements and u is an input of the same length. The dimension of u can be enlarged by drawing an additional connection line. The connection is automatically connected to this new free index.

If no connection to the input connector u is present, the output is y=0.

See Buildings.Controls.OBC.CDL.Reals.Validation.MultiSum for an example.

Parameters

TypeNameDefaultDescription
Realk[nin]fill(1, nin)Input gains

Connectors

TypeNameDescription
input RealInputu[nin]Input to multiplied by gain and then added
output RealOutputySum of inputs times gains

Modelica definition

block MultiSum "Sum of Reals, y = k[1]*u[1] + k[2]*u[2] + ... + k[n]*u[n]" parameter Integer nin(min=0)=0 "Number of input signals"; parameter Real k[nin]=fill(1, nin) "Input gains"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nin] "Input to multiplied by gain and then added"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Sum of inputs times gains"; equation if size(u, 1) > 0 then y=k*u; else y=0; end if; end MultiSum;

Buildings.Controls.OBC.CDL.Reals.Multiply Buildings.Controls.OBC.CDL.Reals.Multiply

Output product of the two inputs

Buildings.Controls.OBC.CDL.Reals.Multiply

Information

Block that outputs y = u1 * u2, where u1 and u2 are inputs.

Connectors

TypeNameDescription
input RealInputu1Input to be multiplied
input RealInputu2Input to be multiplied
output RealOutputyProduct of the inputs

Modelica definition

block Multiply "Output product of the two inputs" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input to be multiplied"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input to be multiplied"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Product of the inputs"; equation y=u1*u2; end Multiply;

Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter

Output the product of a gain value with the input signal

Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter

Information

Block that outputs y = k * u, where k is a parameter and u is an input.

Parameters

TypeNameDefaultDescription
Realk Factor to be multiplied with input signal

Connectors

TypeNameDescription
input RealInputuInput to be multiplied with gain
output RealOutputyProduct of the parameter times the input

Modelica definition

block MultiplyByParameter "Output the product of a gain value with the input signal" parameter Real k "Factor to be multiplied with input signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be multiplied with gain"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Product of the parameter times the input"; equation y=k*u; end MultiplyByParameter;

Buildings.Controls.OBC.CDL.Reals.PID Buildings.Controls.OBC.CDL.Reals.PID

P, PI, PD, and PID controller

Buildings.Controls.OBC.CDL.Reals.PID

Information

PID controller in the standard form

yu = k/r   (e(t) + 1 ⁄ Ti   ∫ e(τ) dτ + Td d⁄dt e(t)),

where yu is the control signal before output limitation, e(t) = us(t) - um(t) is the control error, with us being the set point and um being the measured quantity, k is the gain, Ti is the time constant of the integral term, Td is the time constant of the derivative term, and r is a scaling factor, with default r=1. The scaling factor should be set to the typical order of magnitude of the range of the error e. For example, you may set r=100 to r=1000 if the control input is a pressure of a heating water circulation pump in units of Pascal, or leave r=1 if the control input is a room temperature.

Note that the units of k are the inverse of the units of the control error, while the units of Ti and Td are seconds.

The actual control output is

y = min( ymax, max( ymin, y)),

where ymin and ymax are limits for the control signal.

P, PI, PD, or PID action

Through the parameter controllerType, the controller can be configured as P, PI, PD or PID controller. The default configuration is PI.

Reverse or direct action

Through the parameter reverseActing, the controller can be configured to be reverse or direct acting. The above standard form is reverse acting, which is the default configuration. For a reverse acting controller, for a constant set point, an increase in measurement signal u_m decreases the control output signal y (Montgomery and McDowall, 2008). Thus,

If reverseAction=false, then the error e above is multiplied by -1.

Anti-windup compensation

The controller anti-windup compensation is as follows: Instead of the above basic control law, the implementation is

yu = k   (e(t) ⁄ r + 1 ⁄ Ti   ∫ (-Δy + e(τ) ⁄ r) dτ + Td ⁄ r d⁄dt e(t)),

where the anti-windup compensation Δy is

Δy = (yu - y) ⁄ (k Ni),

where Ni > 0 is the time constant for the anti-windup compensation. To accelerate the anti-windup, decrease Ni.

Note that the anti-windup term (-Δy + e(τ) ⁄ r) shows that the range of the typical control error r should be set to a reasonable value so that

e(τ) ⁄ r = (us(τ) - um(τ)) ⁄ r

has order of magnitude one, and hence the anti-windup compensation should work well.

Reset of the controller output

Note that this controller implements an integrator anti-windup. Therefore, for most applications, the controller output does not need to be reset. However, if the controller is used in conjuction with equipment that is being switched on, better control performance may be achieved by resetting the controller output when the equipment is switched on. This is in particular the case in situations where the equipment control input should continuously increase as the equipment is switched on, such as a light dimmer that may slowly increase the luminance, or a variable speed drive of a motor that should continuously increase the speed. In this case, the controller Buildings.Controls.OBC.CDL.Reals.PIDWithReset that can reset the output should be used.

Approximation of the derivative term

The derivative of the control error d ⁄ dt e(t) is approximated using

d⁄dt x(t) = (e(t)-x(t)) Nd ⁄ Td,

and

d⁄dt e(t) ≈ Nd (e(t)-x(t)),

where x(t) is an internal state.

Guidance for tuning the control gains

The parameters of the controller can be manually adjusted by performing closed loop tests (= controller + plant connected together) and using the following strategy:

  1. Set very large limits, e.g., set ymax = 1000.
  2. Select a P-controller and manually enlarge the parameter k (the total gain of the controller) until the closed-loop response cannot be improved any more.
  3. Select a PI-controller and manually adjust the parameters k and Ti (the time constant of the integrator). The first value of Ti can be selected such that it is in the order of the time constant of the oscillations occurring with the P-controller. If, e.g., oscillations in the order of 100 seconds occur in the previous step, start with Ti=1/100 seconds.
  4. If you want to make the reaction of the control loop faster (but probably less robust against disturbances and measurement noise) select a PID-controller and manually adjust parameters k, Ti, Td (time constant of derivative block).
  5. Set the limits yMax and yMin according to your specification.
  6. Perform simulations such that the output of the PID controller goes in its limits. Tune Ni (Ni Ti is the time constant of the anti-windup compensation) such that the input to the limiter block (= lim.u) goes quickly enough back to its limits. If Ni is decreased, this happens faster. If Ni is very large, the anti-windup compensation is not effective and the controller works bad.

References

R. Montgomery and R. McDowall (2008). "Fundamentals of HVAC Control Systems." American Society of Heating Refrigerating and Air-Conditioning Engineers Inc. Atlanta, GA.

Parameters

TypeNameDefaultDescription
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realr1Typical range of control error, used for scaling the control error
BooleanreverseActingtrueSet to true for reverse acting, or false for direct acting control action
Control gains
Realk1Gain of controller
RealTi0.5Time constant of integrator block [s]
RealTd0.1Time constant of derivative block [s]
Limits
RealyMax1Upper limit of output
RealyMin0Lower limit of output
Advanced
Integrator anti-windup
RealNi0.9Ni*Ti is time constant of anti-windup compensation
Derivative block
RealNd10The higher Nd, the more ideal the derivative block
Initialization
Realxi_start0Initial value of integrator state
Realyd_start0Initial value of derivative output

Connectors

TypeNameDescription
input RealInputu_sSetpoint input signal
input RealInputu_mMeasurement input signal
output RealOutputyActuator output signal

Modelica definition

block PID "P, PI, PD, and PID controller" parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerType = Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"; parameter Real k( min=100*Constants.eps)=1 "Gain of controller"; parameter Real Ti( final quantity="Time", final unit="s", min=100*Constants.eps)=0.5 "Time constant of integrator block"; parameter Real Td( final quantity="Time", final unit="s", min=100*Constants.eps)=0.1 "Time constant of derivative block"; parameter Real r( min=100*Constants.eps)=1 "Typical range of control error, used for scaling the control error"; parameter Real yMax=1 "Upper limit of output"; parameter Real yMin=0 "Lower limit of output"; parameter Real Ni( min=100*Constants.eps)=0.9 "Ni*Ti is time constant of anti-windup compensation"; parameter Real Nd( min=100*Constants.eps)=10 "The higher Nd, the more ideal the derivative block"; parameter Real xi_start=0 "Initial value of integrator state"; parameter Real yd_start=0 "Initial value of derivative output"; parameter Boolean reverseActing=true "Set to true for reverse acting, or false for direct acting control action"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u_s "Setpoint input signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u_m "Measurement input signal"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Actuator output signal"; Buildings.Controls.OBC.CDL.Reals.Subtract controlError "Control error (set point - measurement)"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter P(final k=k) "Gain for proportional control action"; Buildings.Controls.OBC.CDL.Reals.IntegratorWithReset I( final k=k/Ti, final y_start=xi_start) if with_I "Integral term"; Buildings.Controls.OBC.CDL.Reals.Derivative D( final y_start=yd_start) if with_D "Derivative term"; Buildings.Controls.OBC.CDL.Reals.Subtract errP "P error"; Buildings.Controls.OBC.CDL.Reals.Subtract errD if with_D "D error"; Buildings.Controls.OBC.CDL.Reals.Subtract errI1 if with_I "I error (before anti-windup compensation)"; Buildings.Controls.OBC.CDL.Reals.Subtract errI2 if with_I "I error (after anti-windup compensation)"; Buildings.Controls.OBC.CDL.Reals.Limiter lim( final uMax=yMax, final uMin=yMin) "Limiter"; protected final parameter Real revAct= if reverseActing then 1 else -1 "Switch for sign for reverse or direct acting controller"; final parameter Boolean with_I = controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PI or controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PID "Boolean flag to enable integral action"; final parameter Boolean with_D = controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PD or controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PID "Boolean flag to enable derivative action"; Sources.Constant kDer(k=k*Td) if with_D "Gain for derivative block"; Sources.Constant TDer(k=Td/Nd) if with_D "Time constant for approximation in derivative block"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant Dzero(final k=0) if not with_D "Zero input signal"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter uS_revAct( final k=revAct/r) "Set point multiplied by reverse action sign"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter uMea_revAct( final k=revAct/r) "Set point multiplied by reverse action sign"; Buildings.Controls.OBC.CDL.Reals.Add addPD "Outputs P and D gains added"; Buildings.Controls.OBC.CDL.Reals.Add addPID "Outputs P, I and D gains added"; Buildings.Controls.OBC.CDL.Reals.Subtract antWinErr if with_I "Error for anti-windup compensation"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter antWinGai(k=1/(k*Ni)) if with_I "Gain for anti-windup compensation"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant cheYMinMax( final k=yMin < yMax) "Check for values of yMin and yMax"; Buildings.Controls.OBC.CDL.Utilities.Assert assMesYMinMax( message="LimPID: Limits must be yMin < yMax") "Assertion on yMin and yMax"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant Izero(final k=0) if not with_I "Zero input signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con(final k=0) if with_I "Constant zero"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con1(final k=false) if with_I "Constant false"; equation connect(u_s,uS_revAct.u); connect(u_m,uMea_revAct.u); connect(D.u,errD.y); connect(errI1.u1,uS_revAct.y); connect(addPID.u1,addPD.y); connect(lim.y,y); connect(antWinErr.y,antWinGai.u); connect(addPD.u2,Dzero.y); connect(D.y,addPD.u2); connect(addPID.u2,I.y); connect(antWinErr.u2,lim.y); connect(I.u,errI2.y); connect(errI1.y,errI2.u1); connect(cheYMinMax.y,assMesYMinMax.u); connect(Izero.y,addPID.u2); connect(con.y,I.y_reset_in); connect(con1.y,I.trigger); connect(uS_revAct.y,errP.u1); connect(errD.u1,uS_revAct.y); connect(addPD.u1, P.y); connect(P.u, errP.y); connect(addPID.y, lim.u); connect(addPID.y, antWinErr.u1); connect(u_s, controlError.u1); connect(u_m, controlError.u2); connect(uMea_revAct.y, errP.u2); connect(uMea_revAct.y, errD.u2); connect(uMea_revAct.y, errI1.u2); connect(antWinGai.y, errI2.u2); connect(kDer.y, D.k); connect(TDer.y, D.T); end PID;

Buildings.Controls.OBC.CDL.Reals.PIDWithReset Buildings.Controls.OBC.CDL.Reals.PIDWithReset

P, PI, PD, and PID controller with output reset

Buildings.Controls.OBC.CDL.Reals.PIDWithReset

Information

PID controller in the standard form

yu = k/r   (e(t) + 1 ⁄ Ti   ∫ e(τ) dτ + Td d⁄dt e(t)),

with output reset, where yu is the control signal before output limitation, e(t) = us(t) - um(t) is the control error, with us being the set point and um being the measured quantity, k is the gain, Ti is the time constant of the integral term, Td is the time constant of the derivative term, and r is a scaling factor, with default r=1. The scaling factor should be set to the typical order of magnitude of the range of the error e. For example, you may set r=100 to r=1000 if the control input is a pressure of a heating water circulation pump in units of Pascal, or leave r=1 if the control input is a room temperature.

Note that the units of k are the inverse of the units of the control error, while the units of Ti and Td are seconds.

The actual control output is

y = min( ymax, max( ymin, y)),

where ymin and ymax are limits for the control signal.

P, PI, PD, or PID action

Through the parameter controllerType, the controller can be configured as P, PI, PD or PID controller. The default configuration is PI.

Reverse or direct action

Through the parameter reverseActing, the controller can be configured to be reverse or direct acting. The above standard form is reverse acting, which is the default configuration. For a reverse acting controller, for a constant set point, an increase in measurement signal u_m decreases the control output signal y (Montgomery and McDowall, 2008). Thus,

If reverseAction=false, then the error e above is multiplied by -1.

Anti-windup compensation

The controller anti-windup compensation is as follows: Instead of the above basic control law, the implementation is

yu = k   (e(t) ⁄ r + 1 ⁄ Ti   ∫ (-Δy + e(τ) ⁄ r) dτ + Td ⁄ r d⁄dt e(t)),

where the anti-windup compensation Δy is

Δy = (yu - y) ⁄ (k Ni),

where Ni > 0 is the time constant for the anti-windup compensation. To accelerate the anti-windup, decrease Ni.

Note that the anti-windup term (-Δy + e(τ) ⁄ r) shows that the range of the typical control error r should be set to a reasonable value so that

e(τ) ⁄ r = (us(τ) - um(τ)) ⁄ r

has order of magnitude one, and hence the anti-windup compensation should work well.

Reset of the controller output

Whenever the value of boolean input signal trigger changes from false to true, the controller output is reset by setting y to the value of the parameter y_reset.

Approximation of the derivative term

The derivative of the control error d ⁄ dt e(t) is approximated using

d⁄dt x(t) = (e(t)-x(t)) Nd ⁄ Td,

and

d⁄dt e(t) ≈ Nd (e(t)-x(t)),

where x(t) is an internal state.

Guidance for tuning the control gains

The parameters of the controller can be manually adjusted by performing closed loop tests (= controller + plant connected together) and using the following strategy:

  1. Set very large limits, e.g., set ymax = 1000.
  2. Select a P-controller and manually enlarge the parameter k (the total gain of the controller) until the closed-loop response cannot be improved any more.
  3. Select a PI-controller and manually adjust the parameters k and Ti (the time constant of the integrator). The first value of Ti can be selected such that it is in the order of the time constant of the oscillations occurring with the P-controller. If, e.g., oscillations in the order of 100 seconds occur in the previous step, start with Ti=1/100 seconds.
  4. If you want to make the reaction of the control loop faster (but probably less robust against disturbances and measurement noise) select a PID-controller and manually adjust parameters k, Ti, Td (time constant of derivative block).
  5. Set the limits yMax and yMin according to your specification.
  6. Perform simulations such that the output of the PID controller goes in its limits. Tune Ni (Ni Ti is the time constant of the anti-windup compensation) such that the input to the limiter block (= lim.u) goes quickly enough back to its limits. If Ni is decreased, this happens faster. If Ni is very large, the anti-windup compensation is not effective and the controller works bad.

References

R. Montgomery and R. McDowall (2008). "Fundamentals of HVAC Control Systems." American Society of Heating Refrigerating and Air-Conditioning Engineers Inc. Atlanta, GA.

Parameters

TypeNameDefaultDescription
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realr1Typical range of control error, used for scaling the control error
BooleanreverseActingtrueSet to true for reverse acting, or false for direct acting control action
Control gains
Realk1Gain of controller
RealTi0.5Time constant of integrator block [s]
RealTd0.1Time constant of derivative block [s]
Limits
RealyMax1Upper limit of output
RealyMin0Lower limit of output
Integrator reset
Realy_resetxi_startValue to which the controller output is reset if the boolean trigger has a rising edge
Advanced
Integrator anti-windup
RealNi0.9Ni*Ti is time constant of anti-windup compensation
Derivative block
RealNd10The higher Nd, the more ideal the derivative block
Initialization
Realxi_start0Initial value of integrator state
Realyd_start0Initial value of derivative output

Connectors

TypeNameDescription
input RealInputu_sConnector of setpoint input signal
input RealInputu_mConnector of measurement input signal
output RealOutputyConnector of actuator output signal
input BooleanInputtriggerResets the controller output when trigger becomes true

Modelica definition

block PIDWithReset "P, PI, PD, and PID controller with output reset" parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerType = Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"; parameter Real k(min=100*Constants.eps)=1 "Gain of controller"; parameter Real Ti( final quantity="Time", final unit="s", min=100*Constants.eps)=0.5 "Time constant of integrator block"; parameter Real Td( final quantity="Time", final unit="s", min=100*Constants.eps)=0.1 "Time constant of derivative block"; parameter Real r(min=100*Constants.eps)=1 "Typical range of control error, used for scaling the control error"; parameter Real yMax=1 "Upper limit of output"; parameter Real yMin=0 "Lower limit of output"; parameter Real Ni( min=100*Constants.eps)=0.9 "Ni*Ti is time constant of anti-windup compensation"; parameter Real Nd( min=100*Constants.eps)=10 "The higher Nd, the more ideal the derivative block"; parameter Real xi_start=0 "Initial value of integrator state"; parameter Real yd_start=0 "Initial value of derivative output"; parameter Boolean reverseActing=true "Set to true for reverse acting, or false for direct acting control action"; parameter Real y_reset=xi_start "Value to which the controller output is reset if the boolean trigger has a rising edge"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u_s "Connector of setpoint input signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u_m "Connector of measurement input signal"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Connector of actuator output signal"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput trigger "Resets the controller output when trigger becomes true"; Buildings.Controls.OBC.CDL.Reals.Subtract controlError "Control error (set point - measurement)"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter P(final k=k) "Proportional action"; Buildings.Controls.OBC.CDL.Reals.IntegratorWithReset I( final k=k/Ti, final y_start=xi_start) if with_I "Integral term"; Buildings.Controls.OBC.CDL.Reals.Derivative D( final y_start=yd_start) if with_D "Derivative term"; Buildings.Controls.OBC.CDL.Reals.Subtract errP "P error"; Buildings.Controls.OBC.CDL.Reals.Subtract errD if with_D "D error"; Buildings.Controls.OBC.CDL.Reals.Subtract errI1 if with_I "I error (before anti-windup compensation)"; Buildings.Controls.OBC.CDL.Reals.Subtract errI2 if with_I "I error (after anti-windup compensation)"; Buildings.Controls.OBC.CDL.Reals.Limiter lim( final uMax=yMax, final uMin=yMin) "Limiter"; protected final parameter Real revAct= if reverseActing then 1 else -1 "Switch for sign for reverse or direct acting controller"; final parameter Boolean with_I = controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PI or controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PID "Boolean flag to enable integral action"; final parameter Boolean with_D = controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PD or controllerType == Buildings.Controls.OBC.CDL.Types.SimpleController.PID "Boolean flag to enable derivative action"; Sources.Constant kDer(k=k*Td) if with_D "Gain for derivative block"; Sources.Constant TDer(k=Td/Nd) if with_D "Time constant for approximation in derivative block"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant Dzero( final k=0) if not with_D "Zero input signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant Izero( final k=0) if not with_I "Zero input signal"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter uS_revAct( final k=revAct/r) "Set point multiplied by reverse action sign"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter uMea_revAct( final k=revAct/r) "Set point multiplied by reverse action sign"; Buildings.Controls.OBC.CDL.Reals.Add addPD "Outputs P and D gains added"; Buildings.Controls.OBC.CDL.Reals.Add addPID "Outputs P, I and D gains added"; Buildings.Controls.OBC.CDL.Reals.Subtract antWinErr if with_I "Error for anti-windup compensation"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter antWinGai( k=1/(k*Ni)) if with_I "Gain for anti-windup compensation"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant yResSig( final k=y_reset) if with_I "Signal for y_reset"; Buildings.Controls.OBC.CDL.Reals.Subtract addRes if with_I "Adder for integrator reset"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant cheYMinMax( final k=yMin < yMax) "Check for values of yMin and yMax"; Buildings.Controls.OBC.CDL.Utilities.Assert assMesYMinMax( message="LimPID: Limits must be yMin < yMax") "Assertion on yMin and yMax"; equation connect(trigger,I.trigger); connect(u_s,uS_revAct.u); connect(u_m,uMea_revAct.u); connect(errD.u2,uMea_revAct.y); connect(D.u,errD.y); connect(errI1.u1,uS_revAct.y); connect(addPID.u1,addPD.y); connect(lim.y,y); connect(antWinErr.y,antWinGai.u); connect(addPD.u2,Dzero.y); connect(D.y,addPD.u2); connect(addPID.u2,I.y); connect(addRes.y,I.y_reset_in); connect(antWinErr.u2,lim.y); connect(I.u,errI2.y); connect(errI1.y,errI2.u1); connect(controlError.u1,u_s); connect(cheYMinMax.y,assMesYMinMax.u); connect(Izero.y,addPID.u2); connect(errP.u1,uS_revAct.y); connect(errD.u1,uS_revAct.y); connect(addPD.u1, P.y); connect(P.u, errP.y); connect(addPID.y, lim.u); connect(addPID.y, antWinErr.u1); connect(addRes.u1, yResSig.y); connect(u_m, controlError.u2); connect(uMea_revAct.y, errP.u2); connect(uMea_revAct.y, errI1.u2); connect(antWinGai.y, errI2.u2); connect(addPD.y, addRes.u2); connect(kDer.y, D.k); connect(TDer.y, D.T); end PIDWithReset;

Buildings.Controls.OBC.CDL.Reals.Ramp Buildings.Controls.OBC.CDL.Reals.Ramp

Limit the changing rate of the input

Buildings.Controls.OBC.CDL.Reals.Ramp

Information

Block that limits the rate of change of the input u by a ramp if the boolean input active is true, otherwise the block outputs y = u.

This block computes a threshold for the rate of change between input u and output y as thr = (u-y)/Td, where Td > 0 is a parameter. The output y is computed as follows:

A smaller time constant Td > 0 means a higher accuracy for the derivative approximation.

Note that when the input activate switches to false, the output y can have a discontinuity.

Implementation

For the block to work with arbitrary inputs and in order to produce a differentiable output, the input is numerically differentiated with derivative time constant Td.

Parameters

TypeNameDefaultDescription
RealraisingSlewRate Maximum speed with which to increase the output [1/s]
RealfallingSlewRate-raisingSlewRateMaximum speed with which to decrease the output [1/s]
RealTdraisingSlewRate*0.001Derivative time constant [s]

Connectors

TypeNameDescription
input RealInputuInput that is being rate limited
input BooleanInputactiveSet to true to enable rate limiter
output RealOutputyRate limited output if active is true, else output is equal to input

Modelica definition

block Ramp "Limit the changing rate of the input" parameter Real raisingSlewRate( min=Constants.small, unit="1/s") "Maximum speed with which to increase the output"; parameter Real fallingSlewRate( max=-Constants.small, unit="1/s")=-raisingSlewRate "Maximum speed with which to decrease the output"; parameter Real Td( final quantity="Time", final unit="s", min=Constants.eps)=raisingSlewRate*0.001 "Derivative time constant"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input that is being rate limited"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput active "Set to true to enable rate limiter"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Rate limited output if active is true, else output is equal to input"; protected Real thr=(u-y)/Td "Approximation to derivative between input and output"; Real y_internal "Internal variable to track the slew limited value"; initial equation assert(raisingSlewRate > 0, "raisingSlewRate must be larger than zero."); assert(fallingSlewRate < 0, "fallingSlewRate must be less than zero."); y_internal = u; equation when active then reinit(y_internal, u); end when; der(y_internal)=smooth(1, noEvent( if thr < fallingSlewRate then fallingSlewRate else if thr > raisingSlewRate then raisingSlewRate else thr)); y = if active then y_internal else u; end Ramp;

Buildings.Controls.OBC.CDL.Reals.Round Buildings.Controls.OBC.CDL.Reals.Round

Round real number to given digits

Buildings.Controls.OBC.CDL.Reals.Round

Information

Block that outputs the input after rounding it to n digits.

For example,

Hence, the block outputs

    y = floor(u*(10^n) + 0.5)/(10^n)  for  u > 0,
    y = ceil(u*(10^n) - 0.5)/(10^n)   for  u < 0.

Parameters

TypeNameDefaultDescription
Integern Number of digits to be round to

Connectors

TypeNameDescription
input RealInputuInput to be rounded
output RealOutputyOutput with rounded input

Modelica definition

block Round "Round real number to given digits" parameter Integer n "Number of digits to be round to"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to be rounded"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Output with rounded input"; protected parameter Real fac=10^n "Factor used for rounding"; equation y=if (u > 0) then floor( u*fac+0.5)/fac else ceil(u*fac-0.5)/fac; end Round;

Buildings.Controls.OBC.CDL.Reals.Sin Buildings.Controls.OBC.CDL.Reals.Sin

Output the sine of the input

Buildings.Controls.OBC.CDL.Reals.Sin

Information

Block that outputs y = sin(u), where u is an input.

sin.png

Connectors

TypeNameDescription
input RealInputuInput for the sine function [rad]
output RealOutputySine of input

Modelica definition

block Sin "Output the sine of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u( final unit="rad", displayUnit="deg") "Input for the sine function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Sine of input"; equation y=Modelica.Math.sin(u); end Sin;

Buildings.Controls.OBC.CDL.Reals.Sort Buildings.Controls.OBC.CDL.Reals.Sort

Sort elements of input vector in ascending or descending order

Buildings.Controls.OBC.CDL.Reals.Sort

Information

Block that sorts the elements of the input signal u. If the parameter ascending = true, then the output signal y satisfies yi <= yi+1 for all i ∈ {1, ..., n-1}. Otherwise, it satisfies yi >= yi+1 for all i ∈ {1, ..., n-1}. The output signal yIdx contains the indices of the sorted elements, with respect to the input vector u.

Usage

Note that this block shall only be used for input signals u that are time sampled.
Otherwise, in simulation, numerical noise from a nonlinear solver or from an implicit time integration algorithm may cause the simulation to stall. Numerical noise can be present if an input depends on a state variable or a quantity that requires an iterative solution, such as a temperature or a mass flow rate of an HVAC system.
In real controllers, measurement noise may cause the output to change frequently.

This block may for example be used in a variable air volume flow controller to access the position of the dampers that are most open.

Parameters

TypeNameDefaultDescription
BooleanascendingtrueSet to true if ascending order, otherwise order is descending

Connectors

TypeNameDescription
input RealInputu[nin]Input to be sorted
output RealOutputy[nin]Output with sorted input
output IntegerOutputyIdx[nin]Indices of the sorted vector with respect to the original vector

Modelica definition

block Sort "Sort elements of input vector in ascending or descending order" parameter Integer nin( final min=0)=0 "Number of input signals"; parameter Boolean ascending=true "Set to true if ascending order, otherwise order is descending"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nin] "Input to be sorted"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y[nin] "Output with sorted input"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yIdx[nin] "Indices of the sorted vector with respect to the original vector"; equation (y, yIdx)=Modelica.Math.Vectors.sort(u, ascending=ascending); end Sort;

Buildings.Controls.OBC.CDL.Reals.Sqrt Buildings.Controls.OBC.CDL.Reals.Sqrt

Output the square root of the input (input >= 0 required)

Buildings.Controls.OBC.CDL.Reals.Sqrt

Information

Block that outputs square root of the input y = sqrt(u), where u is an input. The input u must be non-negative.

Connectors

TypeNameDescription
input RealInputuInput to square root function
output RealOutputyOutput with square root of the input

Modelica definition

block Sqrt "Output the square root of the input (input >= 0 required)" Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input to square root function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Output with square root of the input"; equation y=sqrt(u); end Sqrt;

Buildings.Controls.OBC.CDL.Reals.Subtract Buildings.Controls.OBC.CDL.Reals.Subtract

Output the difference of the two inputs

Buildings.Controls.OBC.CDL.Reals.Subtract

Information

Block that outputs y as the difference of the two input signals u1 and u2,

    y = u1 - u2

Connectors

TypeNameDescription
input RealInputu1Input with minuend
input RealInputu2Input with subtrahend
output RealOutputyOutput with difference

Modelica definition

block Subtract "Output the difference of the two inputs" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input with minuend"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input with subtrahend"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Output with difference"; equation y=u1-u2; end Subtract;

Buildings.Controls.OBC.CDL.Reals.Switch Buildings.Controls.OBC.CDL.Reals.Switch

Switch between two Real signals

Buildings.Controls.OBC.CDL.Reals.Switch

Information

Block that outputs one of two real input signals based on a boolean input signal.

If the input signal u2 is true, the block outputs y = u1. Otherwise, it outputs y = u3.

Connectors

TypeNameDescription
input RealInputu1Input u1
input BooleanInputu2Boolean switch input signal, if true, y=u1, else y=u3
input RealInputu3Input u3
output RealOutputyOutput with u1 if u2 is true, else u3

Modelica definition

block Switch "Switch between two Real signals" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u2 "Boolean switch input signal, if true, y=u1, else y=u3"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u3 "Input u3"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Output with u1 if u2 is true, else u3"; equation y=smooth(0, if u2 then u1 else u3); end Switch;

Buildings.Controls.OBC.CDL.Reals.Tan Buildings.Controls.OBC.CDL.Reals.Tan

Output the tangent of the input

Buildings.Controls.OBC.CDL.Reals.Tan

Information

Block that outputs y = tan(u), where u is an input.

tan.png

Connectors

TypeNameDescription
input RealInputuInput for the tangent function [rad]
output RealOutputyTangent of the input

Modelica definition

block Tan "Output the tangent of the input" Buildings.Controls.OBC.CDL.Interfaces.RealInput u( final unit="rad", displayUnit="deg") "Input for the tangent function"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Tangent of the input"; equation y=Modelica.Math.tan(u); end Tan;

Buildings.Controls.OBC.CDL.Reals.Greater.GreaterWithHysteresis Buildings.Controls.OBC.CDL.Reals.Greater.GreaterWithHysteresis

Greater block without hysteresis

Buildings.Controls.OBC.CDL.Reals.Greater.GreaterWithHysteresis

Parameters

TypeNameDefaultDescription
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputu1Input u1
input RealInputu2Input u2
output BooleanOutputyOutput y

Modelica definition

block GreaterWithHysteresis "Greater block without hysteresis" parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert( h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u1 > u2 or pre(y) and u1 > u2-h); end GreaterWithHysteresis;

Buildings.Controls.OBC.CDL.Reals.Greater.GreaterNoHysteresis Buildings.Controls.OBC.CDL.Reals.Greater.GreaterNoHysteresis

Greater block without hysteresis

Buildings.Controls.OBC.CDL.Reals.Greater.GreaterNoHysteresis

Connectors

TypeNameDescription
input RealInputu1Input u1
input RealInputu2Input u2
output BooleanOutputyOutput y

Modelica definition

block GreaterNoHysteresis "Greater block without hysteresis" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u1 > u2; end GreaterNoHysteresis;

Buildings.Controls.OBC.CDL.Reals.GreaterThreshold.GreaterWithHysteresis Buildings.Controls.OBC.CDL.Reals.GreaterThreshold.GreaterWithHysteresis

Greater block without hysteresis

Buildings.Controls.OBC.CDL.Reals.GreaterThreshold.GreaterWithHysteresis

Parameters

TypeNameDefaultDescription
Realt0Threshold for comparison
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputuInput u
output BooleanOutputyOutput y

Modelica definition

block GreaterWithHysteresis "Greater block without hysteresis" parameter Real t=0 "Threshold for comparison"; parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert( h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u > t or pre(y) and u > t-h); end GreaterWithHysteresis;

Buildings.Controls.OBC.CDL.Reals.GreaterThreshold.GreaterNoHysteresis Buildings.Controls.OBC.CDL.Reals.GreaterThreshold.GreaterNoHysteresis

Greater block without hysteresis

Buildings.Controls.OBC.CDL.Reals.GreaterThreshold.GreaterNoHysteresis

Parameters

TypeNameDefaultDescription
Realt0Threshold for comparison

Connectors

TypeNameDescription
input RealInputuInput u
output BooleanOutputyOutput y

Modelica definition

block GreaterNoHysteresis "Greater block without hysteresis" parameter Real t=0 "Threshold for comparison"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u > t; end GreaterNoHysteresis;

Buildings.Controls.OBC.CDL.Reals.Less.LessWithHysteresis Buildings.Controls.OBC.CDL.Reals.Less.LessWithHysteresis

Less block without hysteresis

Buildings.Controls.OBC.CDL.Reals.Less.LessWithHysteresis

Parameters

TypeNameDefaultDescription
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputu1Input u1
input RealInputu2Input u2
output BooleanOutputyOutput y

Modelica definition

block LessWithHysteresis "Less block without hysteresis" parameter Real h(final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert(h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u1 < u2 or pre(y) and u1 < u2+h); end LessWithHysteresis;

Buildings.Controls.OBC.CDL.Reals.Less.LessNoHysteresis Buildings.Controls.OBC.CDL.Reals.Less.LessNoHysteresis

Less block without hysteresis

Buildings.Controls.OBC.CDL.Reals.Less.LessNoHysteresis

Connectors

TypeNameDescription
input RealInputu1Input u1
input RealInputu2Input u2
output BooleanOutputyOutput y

Modelica definition

block LessNoHysteresis "Less block without hysteresis" Buildings.Controls.OBC.CDL.Interfaces.RealInput u1 "Input u1"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u2 "Input u2"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u1 < u2; end LessNoHysteresis;

Buildings.Controls.OBC.CDL.Reals.LessThreshold.LessWithHysteresis Buildings.Controls.OBC.CDL.Reals.LessThreshold.LessWithHysteresis

Less block without hysteresis

Buildings.Controls.OBC.CDL.Reals.LessThreshold.LessWithHysteresis

Parameters

TypeNameDefaultDescription
Realt0Threshold for comparison
Realh0Hysteresis
Advanced
Booleanpre_y_startfalseValue of pre(y) at initial time

Connectors

TypeNameDescription
input RealInputuInput u
output BooleanOutputyOutput y

Modelica definition

block LessWithHysteresis "Less block without hysteresis" parameter Real t=0 "Threshold for comparison"; parameter Real h( final min=0)=0 "Hysteresis"; parameter Boolean pre_y_start=false "Value of pre(y) at initial time"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; initial equation assert(h >= 0, "Hysteresis must not be negative"); pre(y)=pre_y_start; equation y=(not pre(y) and u < t or pre(y) and u < t+h); end LessWithHysteresis;

Buildings.Controls.OBC.CDL.Reals.LessThreshold.LessNoHysteresis Buildings.Controls.OBC.CDL.Reals.LessThreshold.LessNoHysteresis

Less block without hysteresis

Buildings.Controls.OBC.CDL.Reals.LessThreshold.LessNoHysteresis

Parameters

TypeNameDefaultDescription
Realt0Threshold for comparison

Connectors

TypeNameDescription
input RealInputuInput u
output BooleanOutputyOutput y

Modelica definition

block LessNoHysteresis "Less block without hysteresis" parameter Real t=0 "Threshold for comparison"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u "Input u"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "Output y"; equation y=u < t; end LessNoHysteresis;