Derivative

block Derivative "Approximated derivative block"
    import Modelica.Blocks.Types.Init;

    parameter Real k(unit = "1") = 1 "Gains";
    parameter SI.Time T(min = Modelica.Constants.small) = 0.01 "Time constants (T>0 required; T=0 is ideal derivative block)";
    parameter Init initType = Init.NoInit "Type of initialization (1: no init, 2: steady state, 3: initial state, 4: initial output)"
        annotation (
            Evaluate = true,
            Dialog(group = "Initialization"));
    parameter Real x_start = 0 "Initial or guess value of state"
        annotation (Dialog(group = "Initialization"));
    parameter Real y_start = 0 "Initial value of output (= state)"
        annotation (Dialog(
            enable = initType == Init.InitialOutput,
            group = "Initialization"));

    extends Interfaces.SISO;

    output Real x(start = x_start) "State of block";
protected
    parameter Boolean zeroGain = abs(k) < Modelica.Constants.eps;
initial equation
    if initType == Init.SteadyState then 
        der(x) = 0;
    elseif initType == Init.InitialState then 
        x = x_start;
    elseif initType == Init.InitialOutput then 
        if zeroGain then 
            x = u;
        else 
            y = y_start;
        end if;
    end if;
equation
    y = if zeroGain then 0 else k / T * (u - x);
    der(x) = if zeroGain then 0 else (u - x) / T;

    annotation (
        Documentation(info = "<html>\n<p>\nThis blocks defines the transfer function between the\ninput u and the output y\nas <em>approximated derivative</em>:\n</p>\n<blockquote><pre>\n        k * s\ny = ------------ * u\n       T * s + 1\n</pre></blockquote>\n<p>\nIf you would like to be able to change easily between different\ntransfer functions (FirstOrder, SecondOrder, ... ) by changing\nparameters, use the general block <strong>TransferFunction</strong> instead\nand model a derivative block with parameters<br>\nb = {k,0}, a = {T, 1}.\n</p>\n\n<p>\nIf k=0, the block reduces to y=0.\n</p>\n</html>"),
        Icon(
            coordinateSystem(
                preserveAspectRatio = true,
                extent = {
                    {-100, -100}, 
                    {100, 100}}),
            graphics = {
                Line(
                    points = {
                        {-80, 78}, 
                        {-80, -90}},
                    color = {192, 192, 192}), 
                Polygon(
                    lineColor = {192, 192, 192},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid,
                    points = {
                        {-80, 90}, 
                        {-88, 68}, 
                        {-72, 68}, 
                        {-80, 90}}), 
                Line(
                    points = {
                        {-90, -80}, 
                        {82, -80}},
                    color = {192, 192, 192}), 
                Polygon(
                    lineColor = {192, 192, 192},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid,
                    points = {
                        {90, -80}, 
                        {68, -72}, 
                        {68, -88}, 
                        {90, -80}}), 
                Line(
                    origin = {-24.667, -27.333},
                    points = {
                        {-55.333, 87.333}, 
                        {-19.333, -40.667}, 
                        {86.667, -52.667}},
                    color = {0, 0, 127},
                    smooth = Smooth.Bezier), 
                Text(
                    textColor = {192, 192, 192},
                    extent = {
                        {-30, 14}, 
                        {86, 60}},
                    textString = "DT1"), 
                Text(
                    extent = {
                        {-150, -150}, 
                        {150, -110}},
                    textString = "k=%k")}));
end Derivative;