| 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;
|
|---|