121 lines
6.8 KiB
Plaintext
121 lines
6.8 KiB
Plaintext
package EmbeddedControl
|
|
extends Modelica.Icons.Package;
|
|
|
|
package Boundary
|
|
model ADC
|
|
extends Modelica.Blocks.Icons.DiscreteBlock;
|
|
parameter Real stepSize = 0.1;
|
|
parameter Real scale = 1;
|
|
Modelica.Blocks.Interfaces.RealInput u annotation(
|
|
Placement(transformation(origin = {-122, 2}, extent = {{-20, -20}, {20, 20}}), iconTransformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}})));
|
|
Modelica.Blocks.Interfaces.IntegerOutput y annotation(
|
|
Placement(transformation(origin = {86, -34}, extent = {{-10, -10}, {10, 10}}), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}})));
|
|
protected
|
|
discrete Integer yInt(start=0, fixed=true);
|
|
|
|
algorithm
|
|
yInt := integer(floor((scale*u)/stepSize+ 0.5));
|
|
|
|
equation
|
|
y = yInt;
|
|
|
|
annotation(
|
|
Documentation(info = "<html>
|
|
<p>Integer analog-to-digital conversion block.</p>
|
|
<p>The real-valued input <code>u</code> is quantized to an integer code using:</p>
|
|
<p><code>y = floor((scale*u)/stepSize + 0.5)</code></p>
|
|
<p>This produces a rounded integer representation of the scaled input, intended for embedded-style control chains that operate on integer counts.</p>
|
|
<p>Parameters:</p>
|
|
<ul>
|
|
<li><code>stepSize</code>: physical value represented by one integer step</li>
|
|
<li><code>scale</code>: additional scaling applied before quantization</li>
|
|
</ul>
|
|
</html>"),
|
|
Icon(graphics = {Line(origin = {5, 10}, points = {{-61, -68}, {-35, -68}, {-35, -22}, {-21, -22}, {-21, 38}, {7, 38}, {7, 68}, {41, 68}, {41, 24}, {61, 24}, {61, 24}}, color = {255, 85, 0}, thickness = 1.25), Text(origin = {49, -50}, extent = {{-51, 50}, {51, -50}}, textString = "AD")}));
|
|
end ADC;
|
|
|
|
model DAC
|
|
extends Modelica.Blocks.Icons.DiscreteBlock;
|
|
parameter Real stepSize = 0.1;
|
|
parameter Real scale = 1;
|
|
Modelica.Blocks.Interfaces.IntegerInput u annotation(
|
|
Placement(transformation(origin = {-136, -2}, extent = {{-20, -20}, {20, 20}}), iconTransformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}})));
|
|
Modelica.Blocks.Interfaces.RealOutput y annotation(
|
|
Placement(transformation(origin = {126, 10}, extent = {{-10, -10}, {10, 10}}), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}})));
|
|
equation
|
|
// Convert integer DAC code back to physical Real value.
|
|
y = (stepSize * scale) * u;
|
|
|
|
annotation(
|
|
Documentation(info = "<html>
|
|
<p>Integer digital-to-analog conversion block.</p>
|
|
<p>The integer input <code>u</code> is mapped back to a real-valued physical signal using:</p>
|
|
<p><code>y = (stepSize*scale)*u</code></p>
|
|
<p>When used with matching parameter values, this block acts as the inverse conversion of the ADC block.</p>
|
|
<p>Parameters:</p>
|
|
<ul>
|
|
<li><code>stepSize</code>: physical value represented by one integer step</li>
|
|
<li><code>scale</code>: output scaling factor</li>
|
|
</ul>
|
|
</html>"),
|
|
Diagram(graphics),
|
|
Icon(graphics = {Line(origin = {5, 10}, points = {{-61, -68}, {-35, -68}, {-35, -22}, {-21, -22}, {-21, 38}, {7, 38}, {7, 68}, {41, 68}, {41, 24}, {61, 24}, {61, 24}}, color = {0, 0, 127}, thickness = 1.25, smooth = Smooth.Bezier), Text(origin = {49, -50}, extent = {{-51, 50}, {51, -50}}, textString = "DA")}));
|
|
end DAC;
|
|
extends Modelica.Icons.Package;
|
|
annotation(
|
|
Icon(graphics = {Line(origin = {-48.92, -4.33}, points = {{-35.0829, -47.6744}, {-17.0829, 18.3256}, {-3.08288, -9.6744}, {10.9171, 48.3256}, {34.9171, 14.3256}, {34.9171, 14.3256}}, color = {0, 0, 127}, thickness = 1.5, smooth = Smooth.Bezier), Line( points = {{0, 81}, {0, -81}}, pattern = LinePattern.Dash, thickness = 2.75), Line(origin = {54, -10}, points = {{-36, -42}, {-36, -20}, {-30, -20}, {-30, -10}, {-20, -10}, {-20, 10}, {-6, 10}, {-6, 4}, {6, 4}, {6, 42}, {28, 42}, {28, 18}, {36, 18}, {36, 6}, {36, 6}}, color = {255, 85, 0}, thickness = 1.5)}));
|
|
end Boundary;
|
|
|
|
package Math
|
|
extends Modelica.Icons.Package;
|
|
|
|
model DDifference
|
|
extends EmbeddedControl.icons.discreteIntegerSISO;
|
|
|
|
discrete Integer x(start=0, fixed=true) "Initial or guess value of state";
|
|
protected
|
|
discrete Integer y_internal(start=0, fixed=true);
|
|
algorithm
|
|
x := u;
|
|
if x <> pre(x) then
|
|
y_internal := x - pre(x);
|
|
else
|
|
y_internal := pre(y_internal);
|
|
end if;
|
|
equation
|
|
y = y_internal;
|
|
|
|
annotation(
|
|
Documentation(info = "<html>
|
|
<p>Discrete integer difference block.</p>
|
|
<p>Whenever the integer input changes, the block outputs the increment between the current and previous sample:</p>
|
|
<p><code>y = u[k] - u[k-1]</code></p>
|
|
<p>This is a raw discrete difference, not a time-scaled derivative. If a discrete-time derivative is required, include the factor <code>1/Ts</code> in a downstream gain or in the controller gain.</p>
|
|
<p>The output updates only when <code>u</code> changes.</p>
|
|
</html>"),
|
|
Diagram(graphics),
|
|
Icon(graphics = {Text(textColor = {156, 156, 156}, extent = {{-30, 14}, {86, 60}}, textString = "DT1"), Line(points = {{-90, -80}, {82, -80}}, color = {156, 156, 156}), Line(points = {{-80, 78}, {-80, -90}}, color = {156, 156, 156}), Polygon(lineColor = {156, 156, 156}, fillColor = {156, 156, 156}, fillPattern = FillPattern.Solid, points = {{-80, 90}, {-88, 68}, {-72, 68}, {-80, 90}}), Polygon(lineColor = {156, 156, 156}, fillColor = {156, 156, 156}, fillPattern = FillPattern.Solid, points = {{90, -80}, {68, -72}, {68, -88}, {90, -80}}), Line(origin = {-9, -4}, points = {{-63, 66}, {-63, 40}, {-53, 40}, {-53, -20}, {-39, -20}, {-39, -54}, {3, -54}, {3, -66}, {63, -66}, {63, -66}}, color = {255, 85, 0}, thickness = 0.5)}));
|
|
end DDifference;
|
|
annotation(
|
|
Icon(graphics = {Line(origin = {-0.95, 0.62}, points = {{-75.0496, -68.6246}, {-61.0496, 1.37545}, {-29.0496, 69.3754}, {-5.04956, 1.37545}, {20.9504, -64.6246}, {50.9504, -2.62455}, {74.9504, 65.3754}, {74.9504, 65.3754}}, color = {255, 85, 0}, thickness = 2, smooth = Smooth.Bezier)}));
|
|
end Math;
|
|
|
|
model icons
|
|
extends Modelica.Icons.IconsPackage;
|
|
|
|
model discreteIntegerSISO
|
|
extends Modelica.Blocks.Icons.DiscreteBlock;
|
|
Modelica.Blocks.Interfaces.IntegerInput u annotation(
|
|
Placement(transformation(origin = {-194, 2}, extent = {{-20, -20}, {20, 20}}), iconTransformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}})));
|
|
Modelica.Blocks.Interfaces.IntegerOutput y annotation(
|
|
Placement(transformation(origin = {128, 0}, extent = {{-10, -10}, {10, 10}}), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}})));
|
|
equation
|
|
|
|
end discreteIntegerSISO;
|
|
equation
|
|
|
|
end icons;
|
|
annotation(
|
|
Icon(graphics = {Text(origin = {1, 1}, textColor = {255, 170, 0}, extent = {{-99, 99}, {99, -99}}, textString = "EC", textStyle = {TextStyle.Bold})}),
|
|
uses(Modelica(version = "4.1.0")));
|
|
end EmbeddedControl; |