Continuando con los FB que componen un FB PID, hoy toca la derivada.
FUNCTION_BLOCK FT_DERIV
VAR_INPUT
in : REAL;
K : REAL := 1;
run : BOOL := 1;
END_VAR
VAR_OUTPUT
out : REAL;
END_VAR
VAR
old: REAL;
tx: DWORD;
last: DWORD;
init: BOOL;
MaxValue : REAL;
END_VAR
(* lee system time *)
tx := T_PLC_US();
(* init para inicializar *)
IF NOT init THEN
init := TRUE;
last := tx;
old := in;
ELSIF run AND tx – last > 0 THEN
out := (in – old) / DWORD_TO_REAL(tx – last) * 1000000.0 * K;
last := tx;
old := in;
ELSE
out := 0;
END_IF;
Init se utiliza para hacer una configuración inicial del FB. En programación leader, probablemente utilizariamos un flanco ascendente.
Realmente, este Fb nos recuerda bastante al Fb Integral, con la diferencia de que ahora no sumamos al valor anterior. En esencia lo que hace es calcular un valor proporcional a la desviación entre dos lecturas consecutivas. Cada ciclo de scan se lee el valor PV (por ejemplo la temperatura actual) y la compara con el valor en el anterior ciclo de scan. Pero esto tiene un gran inconveniente y me explico. Si leemos una temperatura, normalmente tendremos un decimal. A efectos prácticos, esto se traduce en que la temperatura parecerá estable hasta el instante en que aumente una décima y será en ese instante en el que la derivada nos de un valor > 0. En realidad esto no es cierto y sabemos que la temperatura está aumentando porque en el trancurso de un tiempo, varios minutos, sí se puede observar un incremento más o menos paulativo.
Como podemos ver en el grafico, la evolución de la temperatura en el tiempo. La temperatura es la Serie1 en ºC x 10 que suele ser la medida en un entrada analógica de 12 bit. Supongamos que el eje x son los sucesivos ciclos de scan. La linea azul muestra la evolución real de la temperatura.
La derivada esta definida como la variación de temperatura (Y1 – Y0) partido la duración del ciclo de scan T.
(Y1 – Y0) / T.
Analizando las derivadas en cada ciclo de scan con un tiempo de ciclo de 200ms.
1º Ciclo de scan. Se guardan los datos pero no se calcula. Momento actual y valor actual. last y old.
2ºCiclo de scan (100 – 100) / 200 = 0.
3ºCiclo de scan (100-100)/200 = 0.
4ºCiclo de scan (100 – 100) / 200 = 0.
5ºCiclo de scan (101 -100) / 200 = 0,005.
6º y sucesivos ciclos de scan (101- 101)/200 = 0.
Como vemos, la derivada, sólo nos devolverá un valor en el momento del cambio. Pero realmente el cambio se produce continuamente, aunque la resolución de la entrada analógica hace que este cambio se realice en escalones. Si nuestra entrada de temperatura tiene algo de ruido, el resultado en la derivada será totalmente erróneo. Por estos motivos la derivada se suele poner Tv = 0, para este tipo de procesos.
La derivada devuelve un valor proporcional a la aceleración en PV.
Con el símil de un coche. La aceleración es la derivada de la velocidad = (V- V0)/t.




