1 | model Test
|
---|
2 | Modelica.Blocks.Interfaces.RealInput SP annotation(Placement(visible = true, transformation(extent = {{-100, -20}, {-60, 20}}, rotation = 0), iconTransformation(extent = {{-100, -20}, {-60, 20}}, rotation = 0)));
|
---|
3 | Modelica.Blocks.Interfaces.RealInput PVvec[size(num, 1)] "PV(k)...PV(k-#num) at step ns*qs" annotation(Placement(visible = true, transformation(extent = {{-90, -84}, {-50, -44}}, rotation = 0), iconTransformation(extent = {{-100, -20}, {-60, 20}}, rotation = 0)));
|
---|
4 | Modelica.Blocks.Interfaces.RealOutput CS annotation(Placement(transformation(extent = {{60, -20}, {80, 0}}), iconTransformation(extent = {{60, -20}, {100, 20}})));
|
---|
5 | Modelica.Blocks.Interfaces.BooleanInput Etrig annotation(Placement(visible = true, transformation(origin = {-76, 58}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-80, 60}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
|
---|
6 | parameter Real num[:] = {0.5} "num in desc. powers of z, len must match npast+1 in sapmpler";
|
---|
7 | parameter Real den[:] = {1, -0.5} "nen in descending powers of z";
|
---|
8 | parameter Real qs = 0.1 "must match qs in sampler";
|
---|
9 | parameter Integer ns = 10 "must match qs in sampler";
|
---|
10 | parameter Real CSmax = 1;
|
---|
11 | parameter Real CSmin = -1;
|
---|
12 | parameter Real CSstart = 0;
|
---|
13 | //protected
|
---|
14 | parameter Real Ts = ns * qs;
|
---|
15 | parameter Real nnum[:] = num / den[1];
|
---|
16 | // normalise num and den by making the latter monic
|
---|
17 | parameter Real nden[:] = den / den[1];
|
---|
18 | parameter Real rden[:] = Functions.ArraySubset(den, 2, size(den, 1));
|
---|
19 | parameter Integer nPV = size(num, 1);
|
---|
20 | // No. of PVs to compute CS(k), from k to k-#num
|
---|
21 | parameter Integer nSP = nPV;
|
---|
22 | // need same number of SPs to compute the errors
|
---|
23 | parameter Integer nCS = size(den, 1) - 1;
|
---|
24 | // No. of CSs to compute CS(k), from k-1 to k-#den
|
---|
25 | discrete Real vCS[nCS](each start = CSstart);
|
---|
26 | // vector for the past CSs to compute CS(k)
|
---|
27 | discrete Real vSP[nSP](each start = 0);
|
---|
28 | // vector for the past SPs to compute CS(k)
|
---|
29 | // recorded CSs at events and their times: nCS*qs*ns/qs=nCS*ns is the max No. of events that
|
---|
30 | // may have occurred in the time span fron now back to nCS*Ts
|
---|
31 | discrete Real recCS[nCS * ns](each start = CSstart);
|
---|
32 | // recorded CSs
|
---|
33 | discrete Real trecCS[nCS * ns](each start = 0);
|
---|
34 | // corresponding times
|
---|
35 | // recorded SPs at events: same reasoning nut with nSP
|
---|
36 | discrete Real recSP[nSP * ns](each start = 0);
|
---|
37 | // recorded SPs
|
---|
38 | discrete Real trecSP[nSP * ns](each start = 0);
|
---|
39 | // times (redundant for readability)
|
---|
40 | discrete Real tCS, tSP;
|
---|
41 | discrete Integer dex;
|
---|
42 | discrete Real u;
|
---|
43 | equation
|
---|
44 | CS = u;
|
---|
45 | algorithm
|
---|
46 | when change(Etrig) then
|
---|
47 | for i in 1:nCS loop
|
---|
48 | tCS := time - i * Ts;
|
---|
49 | dex := 1;
|
---|
50 | while dex < nCS * ns and tCS < trecCS[dex] loop
|
---|
51 | dex := dex + 1;
|
---|
52 | end while;
|
---|
53 | vCS[i] := recCS[dex];
|
---|
54 | end for;
|
---|
55 | for i in 0:nCS * ns - 2 loop
|
---|
56 | recCS[nCS * ns - i] := recCS[nCS * ns - i - 1];
|
---|
57 | trecCS[nCS * ns - i] := trecCS[nCS * ns - i - 1];
|
---|
58 | end for;
|
---|
59 | trecCS[1] := time;
|
---|
60 | for i in 0:nSP * ns - 2 loop
|
---|
61 | recSP[nSP * ns - i] := recSP[nSP * ns - i - 1];
|
---|
62 | trecSP[nSP * ns - i] := trecSP[nSP * ns - i - 1];
|
---|
63 | end for;
|
---|
64 | trecSP[1] := time;
|
---|
65 | recSP[1] := SP;
|
---|
66 | for i in 1:nSP loop
|
---|
67 | tSP := time - (i - 1) * Ts;
|
---|
68 | dex := 1;
|
---|
69 | while dex < nSP * ns and tSP < trecSP[dex] loop
|
---|
70 | dex := dex + 1;
|
---|
71 | end while;
|
---|
72 | vSP[i] := recSP[dex];
|
---|
73 | end for;
|
---|
74 | u := rden * vCS + nnum * (vSP - PVvec);
|
---|
75 | u := max(CSmin, min(CSmax, u));
|
---|
76 | recCS[1] := u;
|
---|
77 | end when;
|
---|
78 | annotation(Diagram(coordinateSystem(preserveAspectRatio = false, extent = {{-100, -100}, {100, 100}}), graphics), Icon(coordinateSystem(preserveAspectRatio = false, initialScale = 0.1), graphics = {Rectangle(origin = {18, 124}, fillColor = {200, 180, 180}, fillPattern = FillPattern.Solid, extent = {{6, -24}, {82, -94}}), Text(origin = {0, -14}, extent = {{-40, 52}, {40, -52}}, textString = "R(z)
|
---|
79 | 3TS
|
---|
80 | oldUin", fontName = "DejaVu Sans Mono")}), uses(Modelica(version = "3.2.1")));
|
---|
81 | end Test;
|
---|