1 | package MWE
|
---|
2 |
|
---|
3 | model TaskPool_SatInt
|
---|
4 | parameter Real k[:] = {0.01, 0.02, 0.05} "completion integrator gains";
|
---|
5 | Modelica.Blocks.Interfaces.RealInput c[N] "cores to tasks" annotation(
|
---|
6 | Placement(visible = true, transformation(origin = {-108, -2}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
7 | Modelica.Blocks.Interfaces.RealOutput compl01[N](each start = 0, each fixed = true) "completions [0,1]" annotation(
|
---|
8 | Placement(visible = true, transformation(origin = {56, -20}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, -3.55271e-15}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
9 | final parameter Integer N = size(k, 1);
|
---|
10 | equation
|
---|
11 | for i in 1:N loop
|
---|
12 | der(compl01[i]) = if compl01[i] < 0 or compl01[i] > 1 then 0 else k[i] * c[i];
|
---|
13 | end for;
|
---|
14 | annotation(
|
---|
15 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
16 | Icon(graphics = {Rectangle(fillColor = {170, 170, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-2, 0}, extent = {{-66, 74}, {66, -74}}, textString = "Tpool\nSatInt")}));
|
---|
17 | end TaskPool_SatInt;
|
---|
18 |
|
---|
19 | model CompletionSPs
|
---|
20 | parameter Real release_times[:]={10,20,30} "task release times";
|
---|
21 | parameter Real relative_deadlines[N]={100,10,50} "task deadlimes relative to release";
|
---|
22 | final parameter Integer N=size(release_times,1);
|
---|
23 | Real sps[N](each start=0.0,each fixed=true);
|
---|
24 | Modelica.Blocks.Interfaces.RealOutput SPs[N] annotation(
|
---|
25 | Placement(visible = true, transformation(origin = {84, -12}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, -3.55271e-15}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
26 | equation
|
---|
27 | SPs = sps;
|
---|
28 | for i in 1:N loop
|
---|
29 | der(sps[i])=if time>=release_times[i] and time<=release_times[i]+relative_deadlines[i]
|
---|
30 | then 1/relative_deadlines[i]
|
---|
31 | else 0;
|
---|
32 | end for;
|
---|
33 | annotation(
|
---|
34 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
35 | experiment(StartTime = 0, StopTime = 200, Tolerance = 1e-06, Interval = 0.066778),
|
---|
36 | Icon(graphics = {Rectangle(fillColor = {170, 170, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-7, 0}, extent = {{-61, 56}, {71, -62}}, textString = "Compl\nSPs")}));
|
---|
37 | end CompletionSPs;
|
---|
38 |
|
---|
39 | model Controller_eq
|
---|
40 | parameter Integer N=3;
|
---|
41 | parameter Real K=10;
|
---|
42 | Modelica.Blocks.Interfaces.RealInput SP[N] annotation(
|
---|
43 | Placement(visible = true, transformation(origin = {-180, 60}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-100, 60}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
44 | Modelica.Blocks.Interfaces.RealInput PV[N] annotation(
|
---|
45 | Placement(visible = true, transformation(origin = {-180, -30}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-100, -60}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
46 | Modelica.Blocks.Interfaces.RealOutput CS[N] annotation(
|
---|
47 | Placement(visible = true, transformation(origin = {180, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {99, -1}, extent = {{-21, -21}, {21, 21}}, rotation = 0)));
|
---|
48 | equation
|
---|
49 | CS = K * (SP - PV);
|
---|
50 | annotation(
|
---|
51 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
52 | Icon(graphics = {Rectangle(origin = {1, 0}, fillColor = {170, 255, 127}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {38, -13}, extent = {{-92, 75}, {12, -41}}, textString = "C_eq")}, coordinateSystem(initialScale = 0.1)));
|
---|
53 | end Controller_eq;
|
---|
54 |
|
---|
55 | model Controller_alg
|
---|
56 | parameter Integer N=3;
|
---|
57 | parameter Real K=10;
|
---|
58 | parameter Real Ts=0.5;
|
---|
59 | Modelica.Blocks.Interfaces.RealInput SP[N] annotation(
|
---|
60 | Placement(visible = true, transformation(origin = {-180, 60}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-100, 60}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
61 | Modelica.Blocks.Interfaces.RealInput PV[N] annotation(
|
---|
62 | Placement(visible = true, transformation(origin = {-180, -30}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-100, -60}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
63 | Modelica.Blocks.Interfaces.RealOutput CS[N] annotation(
|
---|
64 | Placement(visible = true, transformation(origin = {180, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {99, -1}, extent = {{-21, -21}, {21, 21}}, rotation = 0)));
|
---|
65 | discrete Real cs[N](each start=0.0, each fixed=true);
|
---|
66 | equation
|
---|
67 | CS = cs;
|
---|
68 | algorithm
|
---|
69 | when sample(0, Ts) then
|
---|
70 | cs := K * (SP - PV);
|
---|
71 | end when;
|
---|
72 | annotation(
|
---|
73 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
74 | Icon(graphics = {Rectangle(origin = {1, 0}, fillColor = {170, 255, 127}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {28, -7}, extent = {{-92, 75}, {24, -55}}, textString = "C_alg")}, coordinateSystem(initialScale = 0.1)));
|
---|
75 | end Controller_alg;
|
---|
76 |
|
---|
77 |
|
---|
78 | model Test_controllers
|
---|
79 | Controller_eq Ceq annotation(
|
---|
80 | Placement(visible = true, transformation(origin = {-10, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
81 | Controller_alg Calg annotation(
|
---|
82 | Placement(visible = true, transformation(origin = {-10, -10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
83 | Modelica.Blocks.Sources.RealExpression SP[3](each y=0.0) annotation(
|
---|
84 | Placement(visible = true, transformation(origin = {-110, 36}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
85 | Modelica.Blocks.Sources.Trapezoid PV[3](each falling = 2, each nperiod = 1, each period = 8, each rising = 2, each startTime = 1, each width = 2) annotation(
|
---|
86 | Placement(visible = true, transformation(origin = {-110, -16}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
87 | equation
|
---|
88 | connect(PV.y, Ceq.PV) annotation(
|
---|
89 | Line(points = {{-98, -16}, {-60, -16}, {-60, 24}, {-20, 24}, {-20, 24}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
90 | connect(PV.y, Calg.PV) annotation(
|
---|
91 | Line(points = {{-99, -16}, {-20, -16}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
92 | connect(SP.y, Calg.SP) annotation(
|
---|
93 | Line(points = {{-98, 36}, {-40, 36}, {-40, -4}, {-20, -4}, {-20, -4}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
94 | connect(SP.y, Ceq.SP) annotation(
|
---|
95 | Line(points = {{-98, 36}, {-22, 36}, {-22, 36}, {-20, 36}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
96 | annotation(
|
---|
97 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
98 | experiment(StartTime = 0, StopTime = 10, Tolerance = 1e-06, Interval = 0.00333333));
|
---|
99 | end Test_controllers;
|
---|
100 |
|
---|
101 | model Loop_eq
|
---|
102 | MWE.CompletionSPs CSP annotation(
|
---|
103 | Placement(visible = true, transformation(origin = {-70, 16}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
104 | MWE.TaskPool_SatInt Pool annotation(
|
---|
105 | Placement(visible = true, transformation(origin = {50, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
106 | MWE.Controller_eq C annotation(
|
---|
107 | Placement(visible = true, transformation(origin = {-10, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
108 | equation
|
---|
109 | connect(Pool.compl01, C.PV) annotation(
|
---|
110 | Line(points = {{60, 10}, {70, 10}, {70, -20}, {-30, -20}, {-30, 4}, {-20, 4}, {-20, 4}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
111 | connect(C.CS, Pool.c) annotation(
|
---|
112 | Line(points = {{0, 10}, {38, 10}, {38, 10}, {40, 10}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
113 | connect(CSP.SPs, C.SP) annotation(
|
---|
114 | Line(points = {{-60, 16}, {-20, 16}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
115 | annotation(
|
---|
116 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
117 | experiment(StartTime = 0, StopTime = 150, Tolerance = 1e-06, Interval = 0.05));
|
---|
118 | end Loop_eq;
|
---|
119 |
|
---|
120 | model Loop_alg
|
---|
121 | MWE.CompletionSPs CSP annotation(
|
---|
122 | Placement(visible = true, transformation(origin = {-70, 16}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
123 | MWE.TaskPool_SatInt Pool annotation(
|
---|
124 | Placement(visible = true, transformation(origin = {50, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
125 | MWE.Controller_alg C annotation(
|
---|
126 | Placement(visible = true, transformation(origin = {-10, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
127 | equation
|
---|
128 | connect(Pool.compl01, C.PV) annotation(
|
---|
129 | Line(points = {{60, 10}, {70, 10}, {70, -20}, {-30, -20}, {-30, 4}, {-20, 4}, {-20, 4}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
130 | connect(C.CS, Pool.c) annotation(
|
---|
131 | Line(points = {{0, 10}, {38, 10}, {38, 10}, {40, 10}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
132 | connect(CSP.SPs, C.SP) annotation(
|
---|
133 | Line(points = {{-60, 16}, {-20, 16}}, color = {0, 0, 127}, thickness = 0.5));
|
---|
134 | annotation(
|
---|
135 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
136 | experiment(StartTime = 0, StopTime = 150, Tolerance = 1e-06, Interval = 0.05));
|
---|
137 | end Loop_alg;
|
---|
138 |
|
---|
139 |
|
---|
140 |
|
---|
141 |
|
---|
142 |
|
---|
143 |
|
---|
144 |
|
---|
145 | annotation(
|
---|
146 | Diagram(coordinateSystem(extent = {{-200, -100}, {200, 100}})),
|
---|
147 | uses(Modelica(version = "3.2.2")));
|
---|
148 | end MWE;
|
---|