/*\
* Simulacije sistemov - vaja 3b
* Kaskadna regulacija nivoja posode
* $Id: sim3b.c,v 1.1 1994/05/05 07:40:44 $
\*/
#include <stdio.h>
#include <math.h>
#define KPg 4.965 /* Parametri */
#define KIg 0.239 /* glavnega */
#define KDg 28.414 /* regulatorja */
#define KPp 2.0 /* Pomo"zni reg.*/
#define TFIN 200.0 /* Kon"cni "cas */
#define DT 0.005 /* delta time */
#define NTHELEM 100 /* izpis n-tega "casa */
static float t, tc, e, ee, p, i, d, x, fiv;
static float h3ref, fi1d, fi1, h3dd, h3d, h3, itae;
static short n;
static void
initialize (void)
{
tc = 0.1 * KDg / KPg;
t = i = x = 0.0;
fi1d = fi1 = 0.0;
h3dd = h3d = h3 = 0.0;
e = p = d = itae = 0.0;
n = 100;
}
static void
output (void)
{
printf ("%5.1f %5.3f %5.3f %4.2f\n", t, h3ref, h3, itae);
}
static void
derive (void)
{
fi1d = ee * KPp / 10.0 - fi1 / 5.0;/* prvi proces */
/* drugi proces */
h3dd = (2.0 * fi1 - 20.0 * h3d - 1.0 * h3) / 100.0;
d = (e - x) / tc; /* Diferencialni del glavnega regulatorja */
}
static void
integrate (void)
{
h3ref = 1.0;
do
{
derive ();
if (n++ % NTHELEM == 0)
output ();
t += DT;
/* Glavni regulator */
e = h3ref - h3;
p = e; /* proprocionalni del */
i += e * DT; /* integralni del */
x += d * DT; /* diferencialni del */
fiv = KPg * p + KIg * i + KDg * d;
/* Pomo"zni regulator */
ee = fiv - fi1;
/* Prvi proces */
fi1 += fi1d * DT;
/* Drugi proces */
h3 += h3d * DT;
h3d += h3dd * DT;
/* ITAE integralska cenilka */
itae += t * fabs (e) * DT;
/* scanf("%*[^\n]"); */
}
while (t < TFIN);
}
int
main (int argc, char *argv[])
{
initialize ();
integrate ();
fprintf(stderr, "ITAE = %8.2f\n", itae);
return 0;
}
Iz razultatov je razvidno, da je kaskadna regulacija u"cinkovitej"sa, kar ka"ze cenilka ITAE in odzivi na sliki 6
)