Aplicaciones practicas c

9

Click here to load reader

Transcript of Aplicaciones practicas c

Page 1: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 1

Aplicaciones en C++ Orientadas al Control y Automatización

1. Respuesta Escalón de un Sistema Dinámico en LA .

Este programa permite entender como podría implementarse (simular) comportamientos dinámicos de plantas a partir del modelo matemático.

2. Control PID de un Sistema DinámicoEn este programa implementaremos un controlador PI para controlar el sistema

dinámico anterior.

3. Adquisición de datos con la Tarjeta PCI6024ESe implementa un programa para realizar la medición de señales de voltaje a través de

una tarjeta de adquisición de datos. También se adiciona un programa que envía

señales analógicas desde la computadora hacia la tarjeta.

4. Control de una Planta modelo de Presión o FlujoSe implementara n controlador de PI para la planta de presión o Flujo el cual será

controlado desde la PC mediante una interface usuario adecuada

Trabajo correspondiente a C (Presentación 4 de Julio)

5. Estimación de señales : Introducción a Redes Neuronales

Prueba de un algoritmo recursivo que estima o aproxima una señal en base a las muestras obtenidas. Para este caso se da un archivo scrip *.m. El trabajo consiste en hacer algo equivalente pero en lenguaje C.

6. Algoritmo de control Difuso:

Se pretende implementar un controlador difuso en Lenguaje C. EL modelo matemático esta dado en ecuación de estado. Para este caso se da un archivo scrip *.m . El trabajo consiste en hacer algo equivalente pero en lenguaje C.

Neizer
Resaltado
Page 2: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 2

1. Respuesta de un sistema en Lazo Abierto.

Tenemos el modelo matemático de una planta; dicho modelo debe estar representado en Transformada Z, para luego llevarla a Ecuaciones en Diferencias y poder implementarlo mediante un programa en C.

21

21

66070532711

3393046730−−−−−−−−

−−−−−−−−

++++−−−−

−−−−====

z.z.

z.z.)z(G

El objetivo es hacer un programa en C que obtenga la respuesta del sistema frente a un

escalón.

Solución:

Para tener una idea de cual será la respuesta en el tiempo del sistema frente a un escalón,

analicémoslo desde matlab:

close all; clear all; clc;

%usando dstep

num =[0.4673 -0.3393];

den=[1 -1.5327 0.6607];

dstep(num,den,35)

%usando dlisim

U=ones(1,35);

figure

dlsim(num,den,U)

La respuesta en el tiempo es la que se muestra. De allí podemos observar que el sistema

es estable y que un tiempo de 35 unidades es suficiente para la simulación.

PLANTA VIRTUAL G(z)

(representación en forma discreta)

U(k) Y(k)

Page 3: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 3

Ahora, deberemos llevar el sistema G(z) a ecuaciones en diferencias.

Sea )z(R

)z(C)z(G ==== , entonces el sistema G(z) representado en ecuaciones en diferencias

es:

Ck=1.5327*Ck_1 - 0.6607*Ck_2 + 0.4673*Rk_1 - 0.3393*Rk_2;

La implementación de esta ecuación en lenguaje C es la siguiente:

Page 4: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 4

#include <stdlib.h>

#include <stdio.h>

#include <dos.h>

#include <math.h>

FILE *hfiletxt;

//---------------- Inicio de Programa ----------------------

void main(void)

{

int n;

float Rk; //amplitud del escalon

float respuestaLA[100]; //respuesta en el tiempo

float Rk_1=0, Rk_2=0;

float Ck=0;

float Ck_1=0,Ck_2=0;

int puntos=35;

Rk=1;

for(int t=0;t<puntos;t++){

Ck=1.5327*Ck_1 - 0.6607*Ck_2 + 0.4673*Rk_1 - 0.3393*Rk_2;

Rk_2 = Rk_1; //se actualiza el mas pasado

Rk_1 = Rk; //se actualiza el pasado

Ck_2 = Ck_1; //se actualiza el mas pasado

Ck_1 = Ck; //se actualiza el pasado

respuestaLA[t]=Ck;

}

//--------------------escribir archivo--------------------

hfiletxt= fopen((char*)("c:\\resultado.txt"),"wb+");

if(hfiletxt!=NULL)

{

for(n=0;n<puntos;n++)

fprintf(hfiletxt,"%lf ",respuestaLA[n]);

fclose(hfiletxt);

}

}

La respuesta ha sido almacenada en un array respuestaLA[100].Luego para poder observar su resultado de manera grafica, dicho buffer lo guardamos en un archivo para que posteriormente sea dibujado desde matlab .

Usamos un archivo script Matlab para plotear el resultado:

Page 5: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 5

% lee un archivo binario enviado desde C++ par verificar

% si el procesamiento en c++ se realizo bien

% -----------------------------------------

clear all;close all

fid = fopen('c:\resultado.txt','r');

%lectura directa en A se almacena en una sola columna

A = fscanf(fid,'%f');

fclose(fid);

plot(A)

grid

El ploteo se muestra en la figura, por tanto podemos confirmar que nuestra simulación en

Lenguaje C ha sido correcta.

Page 6: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 6

2. Control PID de una Planta Virtual

2.1 Implementación del algoritmo de control PID

Nuestro objetivo es implementar en lenguaje C un controlador PID o PI para la planta del

ejercicio anterior. El algoritmo de control PID en tiempo continuo es el siguiente:

dt

deKddteKieKpVo

t

tt

)(

)()( *** ++= ∫

Esta ecuación para ser implementada en una función en C debería ser discretizada y

representada en ecuaciones en diferencias:

[[[[ ]]]] [[[[ ]]]])k()k()k()k()k()k()k()k( eee*KdTe*Kiee*Kpuu 2111 2 −−−−−−−−−−−−−−−− ++++−−−−++++++++−−−−++++====

Note que hay distintas formas de discretizar un algoritmo PID. Trate de investigar una

forma diferente a la dada aquí.

Una vez que se tiene el controlador en ecuaciones en diferencias, hay que implementarlo

en lenguaje C. El algoritmo de control PI se muestra a continuación:

void algoritmo_pid(void)

{

e_act= data2-data1;

salida=salida1+kp*(e_act-e_ant)+ki*e_act*T;

e_ant=e_act;

salida1=salida;

}

Donde:

data2 : set point

data1 : valor del proceso

salida1 : señal de control anterior

salida : señal de control actual

e_act : error actual

e_ant : error anterior

CONTROLADOR PID

(representación en forma discreta)

e(k) u(k)

Page 7: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 7

2.2 Control PI de la planta

Finalmente como ya tiene una planta virtual, y además se tiene el algoritmo de control;

entonces tratemos de implementar en lenguaje C el control en lazo cerrado. El esquema

que se simular es el que se muestra en la figura:

Solución:

Para tener una idea de cual seria la respuesta en el tiempo del sistema en Lazo cerrado,

analicémoslo desde simulink:

La respuesta en el tiempo es la que se muestra. De allí podemos observar que el sistema

se logra controlar.

PLANTA VIRTUAL

(representación en forma discreta)

U(k) Y(k) CONTROLADOR PID

(discreto)

e(k)

R(t)

Page 8: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 8

a continuación implementamos el programa de control en lenguaje C:

#include <stdlib.h>

#include <stdio.h>

#include <dos.h>

#include <math.h>

FILE *hfiletxt;

float planta(float Rk);

float algoritmo_pi(float data2, float data1);

float respuestaLC[100]; //respuesta en el tiempo

float T=100; //en milisegundos

//---------------- Inicio de Programa ----------------------

void main()

{

float SP=1;

float static salida_proceso1=0,u=0;

float salida_proceso=0;

float valor_sp,sensor;

int puntos=90;

//--------------- realizacion del control PI -----------

printf("ingrese un valor de SP -->");

scanf("%f",&SP);

for(int t=0;t<puntos;t++){

valor_sp= SP; //actualiza SP

sensor = salida_proceso;

u=algoritmo_pi(valor_sp,sensor);

salida_proceso=planta(u);

respuestaLC[t]= salida_proceso;

}

//----------------- escribir archivo--------------------

hfiletxt= fopen((char*)("c:\\resultado.txt"),"wb+");

if(hfiletxt!=NULL)

{

for(int n=0;n<puntos;n++)

fprintf(hfiletxt,"%lf ",respuestaLC[n]);

fclose(hfiletxt);

}

}

//.....continua

Page 9: Aplicaciones practicas c

Pontificia Universidad Católica del Perú Escuela de Graduados

Programación C Ing. Eddie Sobrado 9

//----------------------------------------------------

float planta(float Rk)

{

static float Rk_1=0,Rk_2=0;

static float Ck_1=0,Ck_2=0;

float Ck=0;

Ck=1.5327*Ck_1 - 0.6607*Ck_2 + 0.4673*Rk_1 - 0.3393*Rk_2;

Rk_2 = Rk_1; //se actualiza el mas pasado

Rk_1 = Rk;

Ck_2 = Ck_1; //se actualiza el mas pasado

Ck_1 = Ck;

return Ck; //retorna la salida del proceso en un instante

}

//----------------------------------------------------

float algoritmo_pi(float data2, float data1)

{

static float salida_ant=0,e_ant=0;

static float Ck_1=0,Ck_2=0;

float e_act,salida,kp,ki;

kp = 0.1; //actualiza Kp

ki = 1.0; //actualiza Ki

e_act=data2-data1; //SP - Vp

salida=salida_ant + kp*(e_act-e_ant)+ki*e_act*(T/1000.0);

e_ant=e_act;

salida_ant=salida;

return salida;

}

Finalmente la salida seria la siguiente: