desarollo dorantes

18
Planteamiento Inicial MODELADO Y GENERACION DE SEÑALES DE CONTROL PARA UNA LINEA DE PRODUCCION MEDIANTE REDES DE PETRI Seminario de Investigación Profesor: Ángel Dorantes Salazar Alumnos: Martin Medellín Uriegas Edgar Omar García Sandoval Carlos Basaldúa Perla Isamar Torres Martínez Diego Enrique Juarez Hernandez

Upload: angel-garcia

Post on 06-Aug-2015

48 views

Category:

Documents


0 download

TRANSCRIPT

MODELADO Y GENERACION DE SEÑALES DE CONTROL PARA UNA LINEA DE PRODUCCION

MEDIANTE REDES DE PETRI

Profesor: Ángel Dorantes Salazar

Alumnos: Martin Medellín Uriegas Edgar Omar García Sandoval Carlos Basaldúa Perla Isamar Torres Martínez Diego Enrique Juarez Hernandez Miguel Angel Garcia Wha Ana Maria Hernandez

MODELADO Y GENERACION DE SEÑALES DE CONTROL PARA UNA LINEA DE PRODUCCION MEDIANTE REDES DE PETRI

Ejercicio:

-Objetivo General (Uno que englobe todo)-Objetivos Especificos (varios)-Variables (Que utilizaran para medir aspectos de tu investigacion)-Justificacion

Porque (Que se busca)Para que

-Alcance (Que se lograra y hasta donde se llegará)//Beneficios a la humanidad, educacion, salud, etc

-Limitacion (Restricciones de diseño, de procedimientos, recolección de datos, etc, que son obstaculos para la investigación, factores no ligados al investigador)

Tarea:

-Antecedentes de la investigación//Trabajos realizados previamente por otros autores, relacionados con el tema, opiniones, conclusiones, recomendaciones de otros autores.

OBJETIVO GENERALGenerar una propuesta de algoritmo y/o métodos de detección de fallas en una línea de producción mediante el modelado de estas líneas utilizando redes de Petri.

OBJETIVOS ESPECIFICOS-Determinar las implicaciones de modelar una línea de producción mediante el uso de redes de Petri.-Identificar las ventajas y las desventajas de los métodos existentes de detección y prevención de errores en líneas de producción.-Proponer nuevos algoritmos o soluciones para resolver el error de minimizado de errores en línea de producción.

VARIABLES

Variables que miden los aspectos de nuestra investigación son:

-El tiempo: es una variable importante al medir el alcance el cual toma un dicha duración de cómo se puede plantear cada uno de los algoritmos propuestos para analisarlos en el modelado de la línea de producción.

-Procesos: es otra variable que se toma en cuenta al momento de la fluides de la información recabada en cada uno de los controladores de la linea de producion, procesando las decisiones que cada uno de los puestos de control utilizando redes de petri.

-Costos: es otra variable ya que entre más cara sea la demanda de fallas en la línea de producción los costos van a ser mayores y entre mas sea el numero elevado de la producción mucho más barato será.

-Redes De Petri: el analisis de las redes de petri debe de ser exacto para la deteccion de erreres en la linea de producción.

JUSTIFICACIONLa generación de un algoritmo o método de detección de fallas en líneas de producción mediante el modelado de las mismas a través de las Redes de Petri, brindará una oportunidad de conocer el comportamiento de la línea de producción formada por diversos componentes, tanto los pasos del proceso, tiempos de proceso y transición entre etapas de la línea así como las fallas que pudieran presentarse a futuro.

Otro aspecto que mejorará es el caso en que se quiera actualizar la línea de producción, se podrá conocer el desempeño de la misma antes de realizarse el ensamblado de la actualización, ya que en la actualidad este proceso suele incluir el cambio de componentes completos e incluso es necesario cambiar la línea de producción en su totalidad, ya que en ocasiones el simple cambio en el diseño del producto que se produce obliga a ello. Todo esto derivando en grandes gastos para la empresa productora.

ALCANCELa finalidad de dicha automatización es lograr niveles de producción elevados y la reducción de los costos por pérdidas que a su vez, se convierten en ganancias para las empresas que los poseen.

LIMITACIONESUna de las limitaciones que pueden surgir al momento de querer actualizar la línea de producción es el tiempo total que se toma al momento de cambiar el diseño de toda la línea de producción.Otra limitación más importante es al momento de programar los PLC’S con las redes de petri los algoritmos propuestos no contengan un tipo de error lógico que afecten no solo al diseño también a casi todo lo relacionado con lo de la línea de producción.

DESARROLLO

En la parte de desarrollo del sistema a implementar con las redes de petri primero que nada se realizo una pequeña prueba basándose en el programa c++ usando imágenes en una tarjeta madre con base para poder así detectar algunos puntos en una imagen y poder ver cómo se comporta la imagen checando cada uno de sus puntos detectando cada uno de sus bordes como su forma normal y la partes que esta imagen de la tarjeta madre contiene la cuestión en porque utilizamos y realizamos pruebas en dicha imagen es por el motivo que la banda transportadora debe de detectar a través de sensores un producto u objeto que cada vez que pasa encima de la banda el sensor se activara y al hacerlo así podrá detectar dicho objeto capturando su imagen a través de la programación en este caso fue el código que se implementara a continuación parte por parte y como vayamos avanzando en el desarrollo de dicho programa se alcanzara a contemplar cada parte del código que aparte de ser utilizado para que funciona y como se lleva paso a paso hasta alcanzar a detectar completamente la imagen en la banda la verdad se realizaron pruebas a través del código considerando puntos muy importantes como fallas en el que realizo esto con unos ciclos anidados que son ciclos for los cuales tienen el propósito de detectar pixeles y bordes de dicha imagen que son muy importantes en el código como muchas otras partes que se verán enseguida de tal forma que llevara un seguimiento correcto y un buen manejo de muchas variables que se ocuparan para el desarrollo de la aplicación de escritorio para después ser implementada en un modelado las piezas de la tarjeta madre fueron seleccionadas de tal forma que la imagen pueda ser visualizada de diferentes maneras y al final poder ser detectada con los ciclos anidados que se comentaran más adelante para finalizar en esta breve y general descripción del sistema de la banda transportadora cabe mencionar que el desarrollo fue hecho y probado por todos muchos antecedentes sobre este método o uso de las variables o inclusive la detección de las imágenes en una tarjeta madre para detectar pixeles, bordes etc. ya se han hecho con anterioridad por personas muy capaces y pues con el paso del tiempo ha ido evolucionando esto de las detección de imágenes a través de diferentes programas y con diferentes códigos pero tomando el mismo rumbo o camino hacia el objetivo que es detectar la imagen.

Aquí se muestra la 1 imagen a utilizar que fue la “MotherBoard” que es la imagen original en la cual se le detectara los bordes pixeles se le agregara lo necesario para poder detectarla dentro del sensor.

Aquí se muestra la 2 imagen la “MotherBoard” es aquí donde se detectan cada uno de los componentes que contiene esta tarjeta madre al igual que se puede apreciar su base pues solo se pretende con la imagen identificar para el dado caso que no se entienda como funciona la imagen o alguna otra causa que luego pueda surgir a futuro en el desarrollo.

Aquí se muestra la 3 imagen final la “MotherBoard” donde la imagen original la número 1 paso a ser una imagen con los puntos de cada borden con pixeles y con los colores ya agregados y pues este es el resultado de la imagen que fue detectada por los puntos de los bordes de la imagen.

PRIMERA PARTE DEL CODIGO:

Función que recibe el nombre de CSensorDlg::OnBnClickedButton1 que recibe operaciones y parámetros para poder ser ejecutada.

void CSensorDlg::OnBnClickedButton1(){

En este pedazo de código se puede abrir imagen del “Motherboard” y el tipo de formato que esta contiene en nuestro caso la imagen es formato .png es donde mandas a llamar la imagen inclusive puedes poner la ruta donde esta se encuentra.

Tambien se uso un puntero llamado img1 de tipo IplImage pasandole como parametro la funcion de cvLoadImage con la ruta de la imagen a abrir, en este caso la imagen esta en la raiz del proyecto.

IplImage *img1 = cvLoadImage("Motherboard.png");

Esto sirve para mostrar la imagen, llamando a la funcion cvShowImage que recibe como parametros el nombre de la ventana que creara y el puntero img1 anterior.

cvShowImage("Imagen de la Motherboard", img1);

Esto sirve para redimensionar la ventana que abierta 1500 de ancho, 1000 de alto

cvResizeWindow("Imagen de la Motherboard",1500,1000);

Esto sirve para esperar una tecla del teclado.

cvWaitKey(0);

Esto sirve para destruir especificamente esa ventana que se genero anteriormente

cvDestroyWindow("Imagen de la Motherboard");

Y por ultimo esto sirve para liberar la memoria asociada a el puntero img1

cvReleaseImage(&img1);

}

SEGUNDA PARTE DEL CODIGO:

2 Función que recibe el nombre de CSensorDlg::OnBnClickedButton2 que recibe operaciones y parámetros para poder ser ejecutada.

void CSensorDlg::OnBnClickedButton2(){

Los comentarios del boton anterior aplican para este boton ya que son las mismas lineas solo cambia en que se abre otra imagen.

En este pedazo de código se puede abrir imagen del “Motherboard” y el tipo de formato que esta contiene en nuestro caso la imagen es formato .png es donde mandas a llamar la imagen inclusive puedes poner la ruta donde esta se encuentra.

Tambien se uso un puntero llamado img1 de tipo IplImage pasandole como parametro la funcion de cvLoadImage con la ruta de la imagen a abrir, en este caso la imagen esta en la raiz del proyecto al igual abrir la imagen de la Motherboard comentada para ver sus partes MotherboardComent.png

IplImage *img1 = cvLoadImage("MotherboardComent.png");

Esto sirve para mostrar la imagen, llamando a la funcion cvShowImage que recibe como parametros el nombre de la ventana que creara y el puntero img1 anterior.

cvShowImage("Imagen de la Motherboard Comentada", img1);

Esto sirve para redimensionar la ventana que abierta 1500 de ancho, 1000 de alto

cvResizeWindow("Imagen de la Motherboard",1500,1000);

Esto sirve para esperar una tecla del teclado

cvWaitKey(0);

Esto sirve para destruir especificamente esa ventana que se genero anteriormente

cvDestroyWindow("Imagen de la Motherboard Comentada");

y por ultimo esto sirve para liberar la memoria asociada a el puntero img1

cvReleaseImage(&img1);

}

TERCERA PARTE DEL CODIGO:

3 Función que recibe el nombre de CSensorDlg::OnBnClickedButton2 que recibe operaciones y parámetros para poder ser ejecutada y aquí es donde se detectan los bordes de la imagen.

void CSensorDlg::OnBnClickedButton3(){

En esta parte se crea un arreglo de caracteres con la imagen

char name0[]="Motherboard.png";

Enseguida se va a inicializar el puntero image en NULO

IplImage* image=NULL;

Despues cargamos la imagen del arreglo de caracteres con el puntero image

image=cvLoadImage(name0);

Aquí una variable para medir la altura de la imagen que fue cargada con el puntero image

int a = image->height; Tamien se agrego una variable para medir el ancho de la imagen que fue cargada con el puntero image

int l = image->width;

Este pedazo de código sirve para limitar el tamaño de la máscara a aplicar

int tamM = 1;

Aquí se declara la máscara 1

int mascara[9]={1,2,1,0,0,0,-1,-2,-1};

Aquí se declara la máscara 2

int mascara2[9]={1,0,-1,2,0,-2,1,0,-1};

En esta parte el puntero de tipo IplImage llamado imgBoard se usa para crear una imagen de 3 canales con los tamaños de las variables l y a anteriormente utilizadas

IplImage* imgBoard=cvCreateImage(cvSize(l,a),IPL_DEPTH_8U,3);Esta parte es la más importante ya que aquí se usan 2 ciclos for para recorrer todos los pixeles de la imagen y aplicar las mascaras y cambios de color para la detección

de los bordes en la imagen usando distintos colores para poder captar los diferentes puntos.

for (int m = 1 ; m<a-1;m++){for (int n = 1 ; n < l-1;n++){

Aquí se declaran las variables que se van a usar para los 2 ciclos for osea los colores que se mencionaron anteriormente

int red = 0; int blue = 0; int green = 0; int red2 = 0; int blue2 = 0; int green2 = 0; int indice =0;

for(int x = -tamM;x<=tamM;x++){for (int y = -tamM ; y<=tamM;y++){

Se le van aplicando en esta parte los colores a la imagen en la máscara1 y 2 y así poder pasarle al igual los canales para ir incrementando cada color

blue+=mascara[indice]*((uchar*)(image->imageData+(x+m)*image >widthStep))[(y+n)*image->nChannels + 0];

green+=mascara[indice]*((uchar*)(image->imageData+(x+m)*image->widthStep))[(y+n)*image->nChannels + 1];

red+=mascara[indice]*((uchar*)(image->imageData+(x+m)*image->widthStep))[(y+n)*image->nChannels + 2];

blue2+=mascara2[indice]*((uchar*)(image->imageData+(x+m)*image->widthStep))[(y+n)*image->nChannels + 0];

green2+=mascara2[indice]*((uchar*)(image->imageData+(x+m)*image->widthStep))[(y+n)*image->nChannels + 1];

red2+=mascara2[indice]*((uchar*)(image->imageData+(x+m)*image->widthStep))[(y+n)*image->nChannels + 2];

Al último el contador se incrementa para que lo haga el número de veces que se indico en los 2 ciclos for

indice++;

}}

Aqui en esta parte del codigo solo se puede indicar el numero minimo y máximo de colores que se pueden usar y claro que se declararon y poder castear o convertir para

poder pasarle a los colores usado mas colores con un pow y asi poder llegar a un rango de 0 a 255.

if(blue<0)blue=0;if(green<0) green=0;if(red<0) red=0;if(blue>255) blue=255;if(green>255) green=255;if(red>255) red=255;if(blue2<0) blue2=0;if(green2<0) green2=0;if(red2<0) red2=0;if(blue2>255) blue2=255;if(green2>255) green2=255;if(red2>255) red2=255;

blue = (int)((255.0/360.63)*sqrt(pow((float)blue,2)+pow((float)blue2,2)));green = (int)((255.0/360.63)*sqrt(pow((float)green,2)+pow((float)green2,2)));red = (int)((255.0/360.63)*sqrt(pow((float)red,2)+pow((float)red2,2)));

if(blue<0) blue=0;if(green<0) green=0;if(red<0) red=0;if(blue>255) blue=255;if(green>255) green=255;if(red>255) red=255;Para terminar aquí se da una asignación de los datos generados anteriormente al nuevo puntero imgBoard en sus tres canales de color rojo, verde y azul

((uchar*)(imgBoard->imageData+m*imgBoard->widthStep))[n*imgBoard->nChannels + 0]= blue;

((uchar*)(imgBoard->imageData+m*imgBoard->widthStep))[n*imgBoard->nChannels + 1]= green;

((uchar*)(imgBoard->imageData+m*imgBoard->widthStep))[n*imgBoard->nChannels + 2]= red; }}

Esta es la última parte del código generado para las imágenes al finalizar se podrá notar que lo que hace es simple ya mostrar la imagen con sus colores ya detectados y los bordes y además ya cargadas las imágenes bien como anteriormente se menciono.

Esto es para mostrar la imagen original

cvShowImage("Motherboard Original",image);

Aquí es para mostrar la imagen ya con la detección de bordes

cvShowImage("Motherboard con Bordes",imgBoard);

Esto sirve para guardar la imagen que fue generada

cvSaveImage("CopiaconBordes.png", imgBoard);

Esto sirve para esperar una tecla del teclado

cvWaitKey(0);

}