Hysteresis

block Hysteresis "Transform Real to Boolean signal with Hysteresis"
    extends Modelica.Blocks.Icons.PartialBooleanBlock;

    parameter Real uLow(start = 0) "if y=true and u<=uLow, switch to y=false";
    parameter Real uHigh(start = 1) "if y=false and u>=uHigh, switch to y=true";
    parameter Boolean pre_y_start = false "Value of pre(y) at initial time";
    Blocks.Interfaces.RealInput u annotation (Placement(transformation(extent = {
        {-140, -20}, 
        {-100, 20}})));
    Blocks.Interfaces.BooleanOutput y annotation (Placement(transformation(extent = {
        {100, -10}, 
        {120, 10}})));
initial equation
    pre(y) = pre_y_start;
equation
    assert(uLow < uHigh, "Hysteresis limits wrong (uHigh <= uLow)");
    y = not pre(y) and uHigh < u or pre(y) and uLow <= u;

    annotation (
        Diagram(
            coordinateSystem(
                preserveAspectRatio = true,
                extent = {
                    {-100, -100}, 
                    {100, 100}}),
            graphics = {
                Polygon(
                    points = {
                        {-65, 89}, 
                        {-73, 67}, 
                        {-57, 67}, 
                        {-65, 89}},
                    lineColor = {192, 192, 192},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Line(
                    points = {
                        {-65, 67}, 
                        {-65, -81}},
                    color = {192, 192, 192}), 
                Line(
                    points = {
                        {-90, -70}, 
                        {82, -70}},
                    color = {192, 192, 192}), 
                Polygon(
                    points = {
                        {90, -70}, 
                        {68, -62}, 
                        {68, -78}, 
                        {90, -70}},
                    lineColor = {192, 192, 192},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Text(
                    extent = {
                        {70, -80}, 
                        {94, -100}},
                    lineColor = {160, 160, 164},
                    textString = "u"), 
                Text(
                    extent = {
                        {-65, 93}, 
                        {-12, 75}},
                    lineColor = {160, 160, 164},
                    textString = "y"), 
                Line(
                    points = {
                        {-80, -70}, 
                        {30, -70}},
                    thickness = 0.5), 
                Line(
                    points = {
                        {-50, 10}, 
                        {80, 10}},
                    thickness = 0.5), 
                Line(
                    points = {
                        {-50, 10}, 
                        {-50, -70}},
                    thickness = 0.5), 
                Line(
                    points = {
                        {30, 10}, 
                        {30, -70}},
                    thickness = 0.5), 
                Line(
                    points = {
                        {-10, -65}, 
                        {0, -70}, 
                        {-10, -75}},
                    thickness = 0.5), 
                Line(
                    points = {
                        {-10, 15}, 
                        {-20, 10}, 
                        {-10, 5}},
                    thickness = 0.5), 
                Line(
                    points = {
                        {-55, -20}, 
                        {-50, -30}, 
                        {-44, -20}},
                    thickness = 0.5), 
                Line(
                    points = {
                        {25, -30}, 
                        {30, -19}, 
                        {35, -30}},
                    thickness = 0.5), 
                Text(
                    extent = {
                        {-99, 2}, 
                        {-70, 18}},
                    lineColor = {160, 160, 164},
                    textString = "true"), 
                Text(
                    extent = {
                        {-98, -87}, 
                        {-66, -73}},
                    lineColor = {160, 160, 164},
                    textString = "false"), 
                Text(
                    extent = {
                        {19, -87}, 
                        {44, -70}},
                    textString = "uHigh"), 
                Text(
                    extent = {
                        {-63, -88}, 
                        {-38, -71}},
                    textString = "uLow"), 
                Line(
                    points = {
                        {-69, 10}, 
                        {-60, 10}},
                    color = {160, 160, 164})}),
        Icon(
            coordinateSystem(
                preserveAspectRatio = true,
                extent = {
                    {-100, -100}, 
                    {100, 100}}),
            graphics = {
                Polygon(
                    points = {
                        {-80, 90}, 
                        {-88, 68}, 
                        {-72, 68}, 
                        {-80, 90}},
                    lineColor = {192, 192, 192},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Line(
                    points = {
                        {-80, 68}, 
                        {-80, -29}},
                    color = {192, 192, 192}), 
                Polygon(
                    points = {
                        {92, -29}, 
                        {70, -21}, 
                        {70, -37}, 
                        {92, -29}},
                    lineColor = {192, 192, 192},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Line(
                    points = {
                        {-79, -29}, 
                        {84, -29}},
                    color = {192, 192, 192}), 
                Line(points = {
                    {-79, -29}, 
                    {41, -29}}), 
                Line(points = {
                    {-15, -21}, 
                    {1, -29}, 
                    {-15, -36}}), 
                Line(points = {
                    {41, 51}, 
                    {41, -29}}), 
                Line(points = {
                    {33, 3}, 
                    {41, 22}, 
                    {50, 3}}), 
                Line(points = {
                    {-49, 51}, 
                    {81, 51}}), 
                Line(points = {
                    {-4, 59}, 
                    {-19, 51}, 
                    {-4, 43}}), 
                Line(points = {
                    {-59, 29}, 
                    {-49, 11}, 
                    {-39, 29}}), 
                Line(points = {
                    {-49, 51}, 
                    {-49, -29}}), 
                Text(
                    extent = {
                        {-92, -49}, 
                        {-9, -92}},
                    lineColor = {192, 192, 192},
                    textString = "%uLow"), 
                Text(
                    extent = {
                        {2, -49}, 
                        {91, -92}},
                    lineColor = {192, 192, 192},
                    textString = "%uHigh"), 
                Rectangle(
                    extent = {
                        {-91, -49}, 
                        {-8, -92}},
                    lineColor = {192, 192, 192}), 
                Line(
                    points = {
                        {-49, -29}, 
                        {-49, -49}},
                    color = {192, 192, 192}), 
                Rectangle(
                    extent = {
                        {2, -49}, 
                        {91, -92}},
                    lineColor = {192, 192, 192}), 
                Line(
                    points = {
                        {41, -29}, 
                        {41, -49}},
                    color = {192, 192, 192})}),
        Documentation(info = "<html>\n<p>\nThis block transforms a <strong>Real</strong> input signal into a <strong>Boolean</strong>\noutput signal:\n</p>\n<ul>\n<li> When the output was <strong>false</strong> and the input becomes\n     <strong>greater</strong> than parameter <strong>uHigh</strong>, the output\n     switches to <strong>true</strong>.</li>\n<li> When the output was <strong>true</strong> and the input becomes\n     <strong>less</strong> than parameter <strong>uLow</strong>, the output\n     switches to <strong>false</strong>.</li>\n</ul>\n<p>\nThe start value of the output is defined via parameter\n<strong>pre_y_start</strong> (= value of pre(y) at initial time).\nThe default value of this parameter is <strong>false</strong>.\n</p>\n</html>"));
end Hysteresis;