Sunteți pe pagina 1din 210

APLICACIN DEL LENGUAJE UNIFICADO DE MODELADO (UML) AL DISEO DE CONTROLES .

NET PARA DISPOSITIVOS CON TECNOLOGA 1-WIRE

UNIVERSIDAD DE CARABOBO REA DE ESTUDIOS DE POSTGRADO FACULTAD DE INGENIERA MAESTRA EN INGENIERA ELCTRICA PROGRAMA GENERAL

APLICACIN DEL LENGUAJE UNIFICADO DE MODELADO (UML) AL DISEO DE CONTROLES .NET PARA DISPOSITIVOS CON TECNOLOGA 1-WIRE

AUTOR: Venus T. Prada R. TUTOR: Ing. M.Sc. Carlos J. Pea

Valencia, Octubre 2008

UNIVERSIDAD DE CARABOBO REA DE ESTUDIOS DE POSTGRADO FACULTAD DE INGENIERA MAESTRA EN INGENIERA ELCTRICA PROGRAMA GENERAL

APLICACIN DEL LENGUAJE UNIFICADO DE MODELADO (UML) AL DISEO DE CONTROLES .NET PARA DISPOSITIVOS CON TECNOLOGA 1-WIRE

AUTOR: Venus T. Prada R.

Trabajo presentado ante el Area de Estudios de Postgrado de la Universidad de Carabobo para Optar al Ttulo de Magster en Ingeniera Elctrica

Valencia, Octubre 2008

iv

UNIVERSIDAD DE CARABOBO REA DE ESTUDIOS DE POSTGRADO MAESTRA EN INGENIERA ELCTRICA PROGRAMA GENERAL

VEREDICTO

Nosotros, Miembros del Jurado designado para la evaluacin del Trabajo de Grado titulado: APLICACIN DEL LENGUAJE UNIFICADO DE

MODELADO (UML) AL DISEO DE CONTROLES .NET PARA DISPOSITIVOS CON TECNOLOGA 1-WIRE, presentado por: Ing. Venus Teresa Prada Rodrguez para optar al Ttulo de Magster en Ingeniera Elctrica estimamos que el mismo rene los requisitos para ser considerado como: APROBADO.

__________________________________________ Presidente del Jurado. Demetrio Rey, C.I. 7.127.552

__________________________________________ Miembro del Jurado. Carlos Jimnez, C.I. 7.523.966

__________________________________________ Miembro del Jurado. Hctor Simosa, C.I. 2.901.889

Valencia, Octubre 2008

DEDICATORIA

A mis cuatro amores: Mi hija Isabel Cristina, mis padres Teresa y Oln, y mi esposo Jos

vi

NDICE GENERAL

DEDICATORIA... NDICE DE FIGURAS NDICE DE CUADROS. RESUMEN... INTRODUCCIN.... CAPITULO I EL PROBLEMA 1.1. Planteamiento del Problema...... 1.2. Objetivos de la investigacin 1.2.1. Objetivo General. 1.2.2. Objetivos Especficos.. 1.3. Justificacin de la investigacin... 1.4. Alcance y delimitacin.. CAPTULO II MARCO TERICO 2.1. Antecedentes. 2.2. Bases Tericas... 2.2.1. Qu es el lenguaje Unificado de Modelado (UML)?............ 2.2.2. Porqu utilizar UML... 2.2.3. Programacin orientada a objetos... 2.2.4. Fundamentos de la programacin orientada a objetos 2.2.4.1. Definicin de un objeto.. 2.2.4.2. Definicin de una clase.. 2.2.5. Plataforma Microsoft .NET. 2.2.6. Caractersticas de la Plataforma Microsoft .NET... 2.2.7. Ventajas del .NET... 2.2.8. .NET Framework 2.2.9. Common Language Runtime (CLR).. 2.2.10. Common Language Specification (CLS).. 2.2.11. Herramientas de desarrollo .NET.. 2.2.12. Definicin de un control .NET.. 2.2.13. El concepto de 1-Wire.... 2.2.14. Elementos que componen una red 1-Wire. 2.2.15. Funcionamiento de la red 1-Wire.. 2.2.16. Protocolo de comunicaciones 1-Wire... 2.2.17. API de programacin 1-Wire 2.2.18. iButton Hygrochron... 2.3. Definicin de trminos..

vi ix xi xii 1

5 8 8 8 9 12

14 15 15 17 18 19 22 23 23 25 27 29 30 31 33 34 34 35 37 39 43 45 47

vii

CAPITULO III MARCO METODOLGICO 3.1. 3.2. 3.3. 3.4. Tipo y diseo de la investigacin.. Tcnicas de recoleccin de datos.. Tcnicas de anlisis de datos Procedimiento metodolgico 51 52 53 53

CAPITULO IV CONSTRUCCIN DEL CONTROL .NET APLICANDO UML 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. Requerimientos del control.. Casos de uso. Casos de uso del control Hygrochron.. Clases y diagramas de clases.... Clases 1-Wire API .NET utilizadas... Diagramas de interaccin.. 4.6.1. Diagramas de colaboraciones.. 4.6.2. Diagramas de secuencias 4.7. Construccin del Control .NET 4.8. Descripcin del control .NET... 4.8.1. Descripcin de las propiedades del control .NET.. 4.8.2. Descripcin de los mtodos del control .NET 4.9. Cdigo fuente del control .NET CAPITULO V VALIDACIN DEL CONTROL .NET 5.1. Uso del control .NET 5.2. Descripcin de la aplicacin Hygrochron-Logger que valida al control . NET 5.3. Propiedades de la Misin...... 5.4. Resultados de la Misin 5.5. Histograma de Frecuencias... 5.6. Grficas de Temperatura y Humedad... 5.7. Ejemplo de programacin y descarga de datos de una misin.. 5.8. Dundas Chart for . NET... CONCLUSIONES.. RECOMENDACIONES REFERENCIAS BIBLIOGRAFICAS. ANEXOS. 131 138 143 145 149 150 151 154 155 157 158 160 57 59 61 74 75 83 83 88 93 96 97 101 105

viii

NDICE DE FIGURAS CAPITULO II Figura 2.1. Figura 2.2. Figura 2.3. Figura 2.4. Figura 2.5. Figura 2.6. Figura 2.7. Figura 2.8. Figura 2.9. CAPITULO IV Figura 4.1. Figura 4.2. Figura 4.3. Figura 4.4. Figura 4.5 Figura 4.6. Figura 4.7. Figura 4.8. Figura 4.9. Figura 4.10. Figura 4.11. Figura 4.12. Figura 4.13. Figura 4.14. Figura 4.15. Figura 4.16. Figura 4.17. Figura 4.18. Figura 4.19. Figura 4.20. Representacin de un caso de uso.. Caso de uso Iniciar Misin... Caso de uso Detener Misin. Caso de uso Leer Datos de la Misin... Diagrama de casos de uso inicial. Diagrama de casos de uso de la segunda iteracin... Diagrama de casos de uso del control HYGROCHRON. Diagrama de clases del control HYGROCHRON... Diagrama de colaboraciones del caso de uso Iniciar Misin por Defecto... Diagrama de colaboraciones del caso de uso Iniciar Nueva Misin .. Diagrama de colaboraciones del caso de uso Detener Misin. Diagrama de colaboraciones del caso de uso Leer Datos de la Misin... Diagrama de secuencias del caso de uso Iniciar Misin por Defecto......... Diagrama de secuencias del caso de uso Iniciar Nueva Misin .. Diagrama de secuencias del caso de uso Detener Misin Diagrama de secuencias del caso de uso Leer Datos de la Misin... Pantalla inicial para crear el control .NET... Ventana para seleccionar la creacin de un control .NET Ventana con el control .NET creado Ventana con la imagen y el nombre del control .NET creado.. 59 61 61 62 62 63 65 82 84 85 86 87 89 90 91 92 93 94 95 95 Representacin de una clase..... Ilustracin de una red 1-Wire Diferentes tipos de adaptadores de red 1-Wire. (A) Modelo DS9097U, (B) Modelo DS9490R, (C) Modelo iLink12i. Flujo Tpico de una comunicacin 1-Wire Representacin grfica de un pulso de reset y presencia. Transmisin de bits bajo el protocolo 1-Wire. Lectura de un (0) y un (1) desde el maestro... Transmisin de bits bajo el protocolo 1-Wire. Escritura de un (0) y un (1) desde el maestro... Libreras API requeridas para cada tipo de aplicacin. iButton Hygrochron.. Pg. 23 35 36 38 40 42 42 44 46

ix

Figura 4.21. Figura 4.22. Figura 4.23. Figura 4.24. CAPITULO V Figura 5.1. Figura 5.2. Figura 5.3. Figura 5.4. Figura 5.5 Figura 5.6. Figura 5.7. Figura 5.8. Figura 5.9. Figura 5.10 Figura 5.11 Figura 5.12 Figura 5.13 Figura 5.14 Figura 5.15 Figura 5.16 Figura 5.17 Figura 5.18 Figura 5.19 Figura 5.20 Figura 5.21 Figura 5.22 Figura 5.23 Figura 5.24 Figura 5.25 Figura 5.26

Imagen del control .NET creado.. Clase HYGROCHRON con todas sus propiedades. Clase HYGROCHRON con todos sus mtodos... Clase HYGROCHRON con todos sus eventos

96 104 105 105

Vista de la aplicacin al hacer click derecho sobre el Toolbox......................... Vista de la ventana Choose Toolbox tems.. Vista del control agregado en el Toolbox. Vista de un formulario con el control agregado... Lista de propiedades y mtodos del control Hygrochron1... (a) Vista del formulario del Ejemplo terminado. (b) Vista de la aplicacin al presionar el botn Abrir el puerto... Listado de instrucciones para correr el Ejemplo.. Pantalla inicial de la aplicacin Hygrochron-Logger... Pantalla que aparece al correr la aplicacin y no detectar dispositivos conectados a la red 1-Wire Men Archivo... Men Opciones. Men Ayuda. Mensaje que muestra el Acerca de... (a) Icono del RollOver habilitado. (b) Icono del RollOver deshabilitado. Vista de la pantalla Propiedades de la Misin.. Vista de la pantalla Resultados de la Misin con el nuevo men Opciones. Opcin Histograma de Temperatura con su submen.. Opcin Histograma de Humedad con su submen... Opcin Grfica de Temperatura con su submen Opcin Grfica de Humedad con su submen. Vista de la pantalla Histograma de Frecuencias... Vista de la pantalla Grficas de Temperatura y Humedad... Parmetros utilizados para grabar una misin.. Lectura de los datos de la misin. Histogramas de Frecuencias. Grficas de Temperatura y Humedad...

132 133 133 134 135 136 137 138 140 141 142 142 142 144 145 147 147 148 148 148 149 150 151 152 153 153

NDICE DE CUADROS CAPITULO IV Cuadro 4.1. Cuadro 4.2. Cuadro 4.3. Cuadro 4.4. Cuadro 4.5 Cuadro 4.6. Cuadro 4.7. Cuadro 4.8. Cuadro 4.9. Cuadro 4.10. Cuadro 4.11. Cuadro 4.12. Cuadro 4.13. Cuadro 4.14. Cuadro 4.15. Caso de uso Iniciar Misin por Defecto... Caso de uso Iniciar Nueva Misin.... Caso de uso Detener Misin. Caso de uso Leer Datos de la Misin... Caso de uso Abrir Puerto.. Caso de uso Auto Buscar Puerto.. Caso de uso Buscar Dispositivo... Caso de uso Verificar Estatus de Misin y Finalizarla. Caso de uso Programar Dispositivos con Valores Predefinidos en el Sistema Caso de uso Programar Dispositivos con Valores Predefinidos por el Usuario Caso de uso Descargar Datos de la Misin.. Caso de uso Actualizar Datos de Inicio de Misin... Caso de uso Leer Muestras de la Misin.. Caso de uso Leer Muestras de Temperatura..... Caso de uso Leer Muestras de Humedad..... 66 66 67 67 68 68 69 69 70 71 71 72 73 73 74

xi

APLICACIN DEL LENGUAJE UNIFICADO DE MODELADO (UML) AL DISEO DE CONTROLES .NET PARA DISPOSITIVOS CON TECNOLOGA 1-WIRE

Autor: Venus T. Prada R. Tutor: Carlos J. Pea Fecha: Octubre 2008

RESUMEN

El presente trabajo permiti desarrollar un control .NET para un dispositivo iButton Hygrochron con tecnologa1-Wire, el cual, es un microcircuito autnomo embebido en un empaque de acero inoxidable de 16 mm de dimetro, fabricado con alta tecnologa que integra un sensor de temperatura y uno de humedad en un mismo empaque, estando en capacidad de leer en tiempo real y de almacenar los datos tanto de la temperatura como de humedad, en una memoria no voltil de alta capacidad. El control antes mencionado se construy aplicando el Lenguaje Unificado de Modelado (UML) y utilizando la nueva plataforma de Microsoft .NET. Para ello, se procedi a determinar los requerimientos, los cuales, permitieron establecer un modelo del control deseado a travs de los diferentes diagramas del UML. Para su construccin, se emplearon una serie de contenedores API (Application Program Interface), los cuales, poseen libreras o paquetes de desarrollo que permiten acceder a los recursos de un hardware, en este caso particular a los del iButton Hygrochron. Una vez elaborados los diagramas de UML necesarios, se procedi a desarrollar el cdigo fuente del control .NET en el lenguaje de programacinVisual Basic .NET. La validacin del mismo, se logr a travs de una aplicacin demostrativa desarrollada tambin en Visual Basic, donde se emplea dicho control, logrando as demostrar el funcionamiento y las bondades que ofrece el mismo, es importante resaltar que la aplicacin del UML en el desarrollo de sistemas, es de gran ayuda debido a que es fcil de entender por las personas relacionadas con el sistema, adems de facilitar el desarrollo de softwares.

xii

INTRODUCCIN

INTRODUCCIN

En los ltimos aos los sistemas computacionales y de informacin han tenido un gran desarrollo, tanto as, que actualmente se han vuelto indispensables en todos los niveles, especialmente en el sector industrial, donde cumplen un papel primordial y forman parte de sistemas de medicin y/o control en los procesos industriales. Algunas de las variables de gran importancia en muchos procesos industriales, especialmente en los del sector alimenticio y farmacutico son la temperatura y la humedad. Se requiere por tanto, que la medicin de dichas variables sea lo ms confiable posible, ya que de su correcta medicin, dependern importantes factores asociados a la calidad, control y certificacin del producto.

De all pues que los fabricantes de dispositivos de medicin y sistemas digitales ofrecen da a da, circuitos integrados de mayores prestaciones, confiables y de bajo costo. Al respecto, la tecnologa 1-Wire se encuentra conformada por una familia de pequeos componentes de circuitos integrados de suficiente robustez y costos muy atractivos, un ejemplo dentro de su amplia variedad de circuitos integrados es el iButton Hygrochron, el cual, es un microcircuito autnomo que se caracteriza por ser robusto, compacto, resistente a impactos contenido en un empaque no txico de acero inoxidable de apenas 16 mm de dimetro, 3,3 gramos de peso y autosuficiente. Este dispositivo integra la ms alta tecnologa en un slo empaque, adems de tener un sensor de temperatura aade un sensor de humedad, estando en capacidad de leer en tiempo

real y de almacenar los datos tanto de temperatura como de humedad del medio ambiente donde se encuentre, en una memoria no voltil de alta capacidad.

En este trabajo de investigacin, se logr construir un control .NET para un iButton Hygrochron, cuyo desarrollo se realiz con la ayuda del Lenguaje Unificado de Modelado (UML), y con las herramientas disponibles por la Empresa Dallas Semiconductor como las 1-Wire API.NET, las cuales, son un conjunto completo de funciones independientes del lenguaje (DLL), para ser utilizadas con la nueva plataforma de Microsoft .NET que facilitan la comunicacin con los dispositivos de tecnologa 1-Wire.

Por otra parte, cualquier usuario estar en la capacidad de construir una aplicacin utilizando el control aqu construido, sin necesidad de conocer cmo accesar a los registros internos del iButton Hygrochron, ya que el control se encarga de realizar toda la comunicacin necesaria entre el PC y el dispositivo, tanto para programarlo como para extraer la informacin almacenada en el, entregando al usuario el producto final. En este sentido, el usuario tiene la gran ventaja de que con slo conocer un poco de programacin bsica y sin ser un experto en sistemas digitales puede construir una aplicacin acorde a sus necesidades.

El presente trabajo de investigacin se encuentra constituido en cinco captulos. En el Captulo I se describe el problema abordado, se definen los objetivos de la investigacin y se presenta el alcance de la misma. En el Captulo II, se describen los fundamentos tericos de la investigacin comenzando por una

revisin de antecedentes, se describen los conceptos fundamentales del Lenguaje Unificado de Modelado (UML), as como su importancia. Igualmente se explica detalladamente la tecnologa 1-Wire, a la cual pertenece el dispositivo iButton Hygrochron utilizado. Tambin se explica la plataforma .NET, que permiti el desarrollo del control .NET llamado HYGROCHRON, el cual es el objetivo principal de la presente investigacin.

En el captulo III, se hace referencia al tipo y diseo de la investigacin, las tcnicas de recoleccin y anlisis de datos, as como el procedimiento metodolgico utilizado en cada una de las diferentes fases realizadas durante el desarrollo de la investigacin. El captulo IV explica cmo construir un control .NET para un dispositivo con tecnologa 1-Wire aplicando el Lenguaje Unificado de Modelado (UML), se muestran los diagramas de especificaciones bajo ste concepto, necesarios para el desarrollo del software del control. Finalmente, en el captulo V se describe el control .NET construido, as como el uso del mismo y la aplicacin Hygrochron-Logger, la cual, sirvi para validar el funcionamiento y operatividad del control construido.

CAPITULO I EL PROBLEMA

CAPITULO I EL PROBLEMA

En el presente captulo se explica todo lo relacionado al planteamiento del problema, los objetivos que se persiguen, as como la justificacin y el alcance de la presente investigacin.

1.1 Planteamiento del Problema

En una gran cantidad de procesos industriales la medicin y el anlisis de variables fsicas como la temperatura y la humedad son primordiales. De su correcta medicin, dependern importantes factores asociados a la calidad, control y certificacin del producto. De acuerdo a la aplicacin, es necesario conocer las limitaciones que tienen los equipos destinados a realizar tales mediciones, las cuales, se deben a la exactitud, precisin, velocidad de la captacin de la variable, la distancia entre el elemento de medida y el aparato receptor, el tamao fsico y la tecnologa utilizada.

Para realizar una correcta determinacin de estas variables, es necesario seleccionar el instrumento de medicin, traduccin y procesamiento ms idneo al tipo de aplicacin, por ejemplo: en el transporte y preservacin de alimentos no perecederos y/o productos farmacuticos, reactivos qumicos, insumos mdicos y materiales de laboratorio, entre otros, la medicin y el control de la temperatura son un factor determinante para la aceptacin del producto.

Cabe sealar, que en el pas existen Normas para establecer los principios bsicos y las prcticas dirigidas a eliminar, prevenir o reducir los peligros para la inocuidad y salubridad que ocurren durante la elaboracin, envasado, almacenamiento y transporte de alimentos para el consumo humano, (Gaceta Oficial N 36081. 1996), las cuales, deben ser cumplidas por los fabricantes y transportistas.

Innumerables fabricantes de equipos ofrecen sus productos para cubrir una gama muy extensa de aplicaciones donde se requiere la medicin de temperatura y humedad, dependiendo de las caractersticas propias del proceso, diferentes tecnologas se encuentran disponibles, sin embargo, ciertas aplicaciones como las relacionadas con las buenas prcticas de almacenamiento y transporte de productos para el consumo humano, no contaban, con el equipo ms idneo; que fuese robusto, compacto, exacto, preciso, econmico, reutilizable, no

contaminante y auto-contenido (autosuficiente) todo ello en un solo equipo.

A principios del ao 2004, la Empresa Dallas Semiconductor introduce al mercado un dispositivo para la medicin y el registro de las variables temperatura y humedad con una tecnologa innovadora, el cul, est considerado como el microcircuito autnomo de registro de temperatura y humedad ms pequeo y completo hasta ahora fabricado y que brinda las siguientes ventajas: Robusto, compacto, resistente a impactos contenido en un empaque no txico de acero inoxidable de apenas 16 mm de dimetro, 3,3 gramos de peso y autosuficiente. De

gran durabilidad, exactitud y precisin. Este producto denominado iButton Hygrochron integra la ms alta tecnologa en un slo empaque, adems de tener un sensor de temperatura aade un sensor de humedad, estando en capacidad de leer en tiempo real y de almacenar los datos tanto de la temperatura como de humedad, en una memoria no voltil de alta capacidad. Su pequeo tamao, hace posible que el iButton Hygrochron pueda ser adherido directamente al objeto de estudio dentro del proceso.

El iButton Hygrochron es auto-contenido, es decir, no necesita de alimentacin externa para su funcionamiento y toda la informacin de la lectura de las variables temperatura y humedad se almacenan en su memoria interna no voltil. Para poder extraer la informacin del sensor, es necesaria la utilizacin de un interfaz (Hardware) y un programa (Software) que permita grabar y leer la informacin de los registros internos del equipo.

En este sentido el fabricante del iButton Hygrochron, dispone de una pequea aplicacin (software) denominado HygroChron Viewer, un archivo ejecutable escrito en lenguaje JAVA muy bsico, adicionalmente es poltica de la empresa, dejar el desarrollo de los programas y aplicaciones ms formales de sus productos a sus socios comerciales Solution Partners, quienes entre otras responsabilidades, tienen la misin de desarrollar aplicaciones ms completas y comerciales del producto.

Debe sealarse, que son pocos los registros de aplicaciones encontradas en el mercado para el producto iButton Hygrochron, incluso, las aplicaciones

registradas ofrecen soluciones totalmente comerciales, de propia tecnologa no estandarizada, cerradas y poco configurables. Es por ello que surge la necesidad de disear una aplicacin abierta, con tecnologa estndar basada en la creacin de un control .NET para dispositivos con tecnologa 1-Wire, como el iButton Hygrochron, bajo la aplicacin de los estndares ofrecidos por el Lenguaje Unificado de Modelado (UML), el cual, permitir utilizar y explotar al mximo las bondades de ste tipo de dispositivo esencial para muchas aplicaciones en el rea industrial y que adicionalmente, permita su utilizacin en forma eficaz no importando el tipo de lenguaje de programacin utilizado.

1.2 Objetivos de la investigacin

1.2.1 Objetivo General

Aplicar el Lenguaje Unificado de Modelado (UML) al diseo de controles .NET para dispositivos con tecnologa 1-Wire.

1.2.2 Objetivos Especficos

Analizar las diferentes, especificaciones y procedimientos para la aplicacin del UML al desarrollo de sistemas.

Construir un modelo para representar a una clase, que permita la comunicacin con un dispositivo iButton Hygrochron, aplicando el Lenguaje Unificado de Modelado (UML).

Elaborar el cdigo fuente del control .NET aplicado al iButton Hygrochron, utilizando los diagramas de especificaciones UML y las clases contenidas en las 1-Wire API.NET.

Elaborar una aplicacin que permita la utilizacin del control .NET construido, para su validacin.

1.3 Justificacin de la investigacin

El presente trabajo representa un aporte para todos aquellos procesos industriales donde la medicin de la temperatura y humedad sean factores de suma importancia, y que adicionalmente se requiera registrar de forma continua todas las mediciones efectuadas en un lapso de tiempo dado para su posterior anlisis, el cual, permitir aplicar las medidas de control necesarias cuando las variables excedan los lmites establecidos para el buen funcionamiento de un determinado proceso. Para muchas empresas, especialmente las del sector alimenticio y servicios, esto se traducira en mejor calidad del producto y menos costos de operacin.

En muchos de los alimentos destinados al consumo humano es indispensable el control de la temperatura y la humedad relativa para la correcta preservacin de los mismos, ya que estas variables son factores externos que influyen en el desarrollo de microorganismos especialmente en frutas y vegetales. Las frutas

son una importante fuente de nutrientes para los seres humanos y su principal causa de deterioro se debe a los microorganismos, los cuales, le producen daos irreversibles que pueden detectarse por el cambio en sus caractersticas sensoriales

10

tales como: aroma, color, sabor, apariencia y textura (Universidad Nacional de Colombia, 2005).

Otro grupo de alimentos donde los microorganismos se desarrollan con facilidad cuando es sometido a una temperatura inadecuada son todos los

productos lcteos. Unas condiciones no ptimas de temperatura y humedad durante el almacenamiento de frutas, vegetales y productos lcteos se traduce en una menor durabilidad de los mismos, descomponindose ms rpidamente.

En este orden de ideas, otro factor importante a controlar en los alimentos es el desarrollo de las micotoxinas, producidas por hongos txico genticos (Aspergillus, Penicillium, Fusarium) que se desarrollan en los productos agrcolas, por lo que se encuentran presentes en gran parte de los alimentos, representando una amenaza tanto para la salud del hombre como de los animales, en vista de que se incrementa la susceptibilidad a las enfermedades infecciosas. Durante el desarrollo de la cosecha como en el almacenamiento se deben tomar en cuenta las variables temperatura y humedad, ya que son factores que influencian el desarrollo de las micotoxinas entre otros.

Segn investigacin realizada por el

Dr. M.V. Ral Gonzlez Salas

Profesor Asistente de la Facultad de Medicina Veterinaria. Universidad de Granma. Cuba, dice que en la etapa de almacenamiento es necesario monitorear continuamente que los productos almacenados no estn expuestos a condiciones ambientales tales como la humedad. Por lo tanto es indispensable implementar labores de monitoreo y prueba. Bajo este esquema de control de micotoxinas, si

11

los niveles diagnosticados sobrepasan los lmites permitidos, es necesario poner en prctica procedimientos que conduzcan a la descontaminacin y detoxificacin del producto.

De igual modo en el rea de transporte de alimentos y productos farmacuticos, es necesario conocer el rango de temperatura al que fue sometido el producto durante su transporte de un lugar a otro. En el caso de los alimentos por las causas expuestas anteriormente, y en el caso de los productos farmacuticos porque la mayora de ellos son altamente sensibles, al punto que inclusive unos pocos grados en exceso del mximo permitido hacen que se pierda la seguridad y efectividad del producto, representando un riesgo para la comunidad que consuma un medicamento en estas condiciones. (Revolutionary iButton Digital Temperature and Humidity Data Loggers)

Centrados en este enfoque, ahora se puede contar con el equipo ms idneo para el transporte y almacenamiento de productos refrigerados que necesiten mantener la temperatura y la humedad dentro de unos lmites establecidos. Con el empleo del iButton Hygrochron la persona encargada de recibir un producto refrigerado estar en capacidad de aceptarlo o rechazarlo en funcin de los registros contenidos en el iButton.

De all la importancia que tiene la creacin de un control .NET para el iButton Hygrochron, que permitir su utilizacin tanto por la Universidad de Carabobo como por otros institutos u organismos. Igualmente esta investigacin servir como base referencial para la creacin de diferentes controles aplicados al

12

rea de la instrumentacin industrial, virtual y control - automatizacin de procesos, ejemplos: medidores y registradores de temperatura, grficos, loggers y otras variables fsicas.

1.4 Alcance y delimitacin

En el presente Trabajo de Grado se aplic el Lenguaje Unificado de Modelado (UML) al diseo de un control .NET para dispositivos con tecnologa 1-Wire, para ello se analizaron las diferentes normas, y procedimientos del estndar UML, a fin de aplicarlo al diseo del control .NET. Como siguiente paso se describi la red de comunicacin 1-Wire utilizada por el iButton Hygrochron, as como las clases contenidas en las 1-Wire API.NET, proporcionadas por el fabricante. Se construy un modelo para representar y describir a una clase que permita la comunicacin con un dispositivo iButton Hygrochron, en base a las especificaciones del UML. Se desarroll el cdigo fuente del control .NET y por ltimo se construy una aplicacin donde se utiliza y se demuestra el funcionamiento del control .NET construido.

CAPITULO II MARCO TEORICO

CAPITULO II MARCO TERICO

En el presente captulo se abordan tanto los antecedentes como las bases tericas necesarias para el desarrollo de la presente investigacin.

2.1 Antecedentes

Antes del ao 1997 no exista un lenguaje de modelado estndar que permitiera el desarrollo sistemtico de la programacin orientada a objetos, sin embargo, ya para el ao 1994 los creadores del actual UML Grady Booch, James Rumbaugh, e Ivar Jacobson, comenzaban a trabajar en una metodologa propia para el anlisis y diseo de sistemas orientado a objetos, estos trabajos fueron agrupados y se conform un consorcio organizacin denominada UML con la participacin de grandes empresas como DEC, Hewlett-Packard, Intellicorp, Microsoft, Oracle, Texas Instruments y Rational Software Corporation. En ese mismo ao 1997 aparece la versin 1.0 del UML, el cual, se puso a la consideracin del grupo de administrador de objetos (OMG) como una propuesta para la estandarizacin que finalmente se denomin Lenguaje Unificado de Modelado (UML), hoy en da el UML es considerado como el estndar de facto en la industria del software. (Schmuller, 2003).

Actualmente existen gran cantidad de artculos escritos sobre diferentes usos del UML, sin embargo, no se encontr ninguno donde se aplique el modelo UML en el diseo de controles .NET, ni tampoco sobre el uso de este modelo para

15

desarrollo de sistemas con tecnologa 1-Wire. En Febrero del 2005 la Empresa Process and Technology Solutions, Inc., como desarrollador iButton autorizado, lanz al mercado su versin 2.4 del DS1921 OCX, una excelente herramienta para el uso del iButton Thermochron DS1921 (medidor de temperatura), el cual, es un interfaz de alto nivel para los lenguajes de programacin populares tales como Visual Basic. Este ActiveX OCX es esencialmente una envoltura, integrando todas las funciones de nivel inferior necesarias del TMEX SDK en caractersticas y mtodos fciles de utilizar. Esta herramienta facilita el desarrollo de aplicaciones para el iButton Thermochron, y la misma sirvi de referencia en la construccin del control .NET para el iButton Hygrochron DS1923.

2.2 Bases Tericas

2.2.1 Qu es el Lenguaje Unificado de Modelado (UML)?

Es una herramienta de lenguaje visual para modelacin de sistemas (comprendiendo hardware y software) que permite generar diagramas organizados que capten todas las ideas de un proceso, siendo su principal finalidad que sea fcil de comprender para todas las personas involucradas en el desarrollo del sistema. Esto tiene la ventaja que al realizar un plan de diseo organizado a travs de un cuidadoso anlisis de las necesidades del cliente, se puede contar con un diseo slido, el cul, puede ser modificado sin mayores problemas. Por consiguiente el objetivo del Proceso Unificado es guiar a los desarrolladores en la implementacin y distribucin eficiente de sistemas que se ajusten a las necesidades de los clientes.

16

UML es una abreviacin para Lenguaje Unificado de Modelado, cada una de estas palabras habla sobre un aspecto importante del UML (Sinan, 2003):

Lenguaje: Un lenguaje nos permite comunicarnos acerca de un sujeto. En el desarrollo de un sistema, el sujeto incluye los requerimientos y el sistema. Sin un lenguaje, es difcil para los miembros de un equipo comunicarse y colaborar satisfactoriamente en el desarrollo del sistema.

Modelo: Un modelo es la representacin de un sujeto. Un modelo captura un conjunto de ideas conocidas como abstracciones acerca de este sujeto. Sin un modelo, es muy difcil para los miembros de un equipo tener un entendimiento comn de los requerimientos y del sistema, y para ellos considerar el impacto de cambios que ocurre mientras el sistema est siendo desarrollado. Es importante destacar que un modelo UML describe lo que supuestamente har un sistema, pero no dice como implementar dicho sistema.

Unificado: El trmino unificado se refiere al hecho de que el Object Management Group (OMG), una organizacin de estandarizacin reconocida por la industria, y Rational Software Corporation crearon el UML para traer juntos los sistemas de informacin y las mejores prcticas de ingeniera en la industria y tecnologa. Estas prcticas involucran tcnicas de aplicacin que nos permite desarrollar sistemas ms exitosos.

17

Las metas del OMG fueron hacer el UML: Fcil de usar, Expresivo, Simple, Preciso, Extensible, Independiente de la implementacin, Independiente del proceso.

2.2.2 Porqu utilizar UML

Antes del advenimiento del UML, los programadores desarrollaban cdigos de sistemas de acuerdo a los requerimientos planteados por un cliente, sin importar si el cliente y/o los usuarios lo entendan no, y en muchas ocasiones el producto final no era exactamente lo que el cliente necesitaba. Cabe sealar que los dos bloques de construccin bsicos de un sistema de informacin son las operaciones realizadas por ese sistema de informacin y los datos con los cuales se realizan las operaciones. El paradigma tradicional ignora los datos a favor de las operaciones. Por el contrario el paradigma orientado a objetos presta igual atencin a las operaciones que a los datos. (Schach, 2005).

En un estudio realizado por la empresa de investigacin Standish Group, sobre 280.000 proyectos desarrollados durante el ao 2000 se obtuvieron los siguientes resultados: Slo el 28% de los proyectos se complet con buenos resultados, mientras que el 23% se cancelaron antes de implementarlos o nunca se implementaron. El 49% restante de los proyectos se complet e instal en la computadora del cliente. Sin embargo, aquellos proyectos estaban por debajo del presupuesto, estaban retrasados o tenan menos caractersticas y funcionalidad que la especificada inicialmente (Schach, 2005). Estos resultados indican que para el ao 2000 slo uno de cada cuatro proyectos de desarrollo era exitoso.

18

Hoy en da, es necesario contar con un plan de desarrollo bien estructurado y organizado, donde todas las personas involucradas tales como desarrolladores (quienes realizan el cdigo de un sistema), usuarios (quienes utilizan el producto final) y clientes (quienes pagan por el desarrollo) entiendan lo que har el sistema que se va a desarrollar. En este sentido, un sistema elaborado bajo el concepto UML debe ser exacto, consistente, fcil de comunicar a otros, fcil de cambiar y entendible.

Por lo anterior expuesto, la importancia y la ventaja de utilizar UML radica en que an cuando los usuarios y clientes no conozcan de programacin, sern capaces de entender los diagramas de especificaciones elaborados bajo este concepto que sern entregados a los desarrolladores. Este modelo sirve para impulsar el desarrollo del software del sistema. Si bien es cierto que el UML es un lenguaje entendible por todas las personas involucradas, entonces tanto clientes como usuarios podrn hacer modificaciones a las especificaciones presentadas hasta lograr que stas cumplan con todas sus necesidades. Otra ventaja del UML es que el modelo describe lo que supuestamente har un sistema, pero no dice como implementar dicho sistema, es decir, es independiente del lenguaje de programacin utilizado.

2.2.3 Programacin orientada a objetos

A principios de la dcada de 1980 comenz a surgir el llamado paradigma de Orientacin a Objetos, que propona una forma novedosa de comprender y modelar el mundo que nos rodea. Mientras ms atributos y acciones se tomen en

19

cuenta mayor ser la similitud entre el modelo planteado y la realidad. Hoy, luego de varias dcadas, este paradigma es sin duda uno de los principales y ms importantes para el desarrollo del software, siendo el propsito de la orientacin a objetos desarrollar software que modele un esquema del mundo (Microsoft Corporation, 2005).

La Programacin Orientada a objetos desde el punto de vista computacional es un mtodo de implementacin, en el cul, los programas son organizados como grupos cooperativos de objetos, cada uno de los cuales representa una instancia de alguna clase, y estas clases, todas son miembros de una jerarqua de clases unidas mediante relaciones de herencia. Este tipo de programacin como su nombre lo indica, se basa en el concepto de objeto, el cul, es una abstraccin de la realidad que tiene un significado concreto y claro para el problema que se est modelando (Microsoft Corporation, 2005).

2.2.4 Fundamentos de la programacin orientada a objetos

En este tipo de programacin la estructura y comportamiento de objetos similares estn definidos en una misma clase. Una clase es un conjunto de objetos que comparten una estructura y comportamiento comn. La diferencia entre un objeto y una clase es que un objeto es una entidad concreta que existe en tiempo y espacio, mientras que una clase representa una abstraccin, la "esencia" de un objeto, tal como es.

20

Cuando se desea crear un programa bajo el paradigma orientado a objetos, se deben tener en cuenta una serie de principios fundamentales que son los pilares de la orientacin a objetos como lo son: la abstraccin, el encapsulamiento, la herencia, las relaciones y el polimorfismo.

Abstraccin: la abstraccin es de suma importancia en el proceso de anlisis y diseo orientado a objetos, ya que mediante ella se puede llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar. Mediante la abstraccin la mente humana modela la realidad en forma de objetos, ya que los humanos entienden la realidad como objetos con comportamientos bien definidos. No necesitan conocer los detalles de porqu, ni cmo funcionan las cosas; simplemente solicitan determinadas acciones en espera de una respuesta. El proceso de abstraccin permite seleccionar las caractersticas relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real.

Encapsulamiento: otro de los pilares de la orientacin a objetos es el encapsulamiento, cuya esencia es que cuando un objeto trae consigo su funcionalidad, esta ltima se oculta de otros objetos y del mundo exterior. Por ejemplo la mayora de la gente que ve televisin no sabe ni se preocupa de la complejidad electrnica del aparato, ni de las operaciones que tienen que ocurrir para mostrar una imagen en la pantalla. La televisin hace su proceso sin

mostrarlo a la persona que la mira (Schmuller, 2003) Con el encapsulado de los datos se consigue que las personas que utilicen un objeto slo tengan que

21

comprender su interfaz, olvidndose de cmo est implementada, y en definitiva, reduciendo la complejidad de utilizacin.

Herencia: el propsito principal de la herencia es el de organizar mejor las clases que componen una determinada realidad, y poder agruparlas en funcin de atributos y comportamientos comunes, a la vez que cada una se especializa segn sus particularidades. Como un objeto es una instancia de una clase, ste tiene todas las caractersticas de la clase de la cual proviene. Cabe sealar que un objeto no slo hereda de una clase, sino que una clase tambin puede heredar de otra clase. (Schmuller, 2003)

Relaciones: mediante las relaciones los objetos colaboran entre si unos con otros, ya que en un sistema los objetos trabajan en conjunto. Existen dos tipos de relaciones que son: asociacin y agregacin, la primera es una conexin entre dos clases que representan una comunicacin, esta puede ser tanto uni como bidireccional y la segunda es una forma especial de asociacin donde un todo se relaciona con sus partes por ejemplo: Una Puerta es una parte de un Vehculo. El Vehculo es azul, la Puerta es Azul. Mover el Vehculo implica mover la Puerta.

Polimorfismo: Es la propiedad que tienen los objetos de permitir invocar genricamente un comportamiento (mtodo) cuya implementacin ser delegada al objeto correspondiente recin en tiempo de ejecucin, es decir, en el polimorfismo una operacin puede tener el mismo nombre en diversas clases y

22

funcionar distinto en cada una, por ejemplo se puede abrir una llave de paso, una puerta, una ventana, un regalo, etc., y en cada caso se realizar una operacin diferente. (Schmuller, 2003)

2.2.4.1 Definicin de un objeto

Un objeto es una instancia de una clase, cada objeto tiene un conjunto de caractersticas y un comportamiento definido (propiedades, mtodos y eventos) que lo diferencian de otros tipos de objeto.

Propiedades: las propiedades son el conjunto de datos que describen las caractersticas de un objeto, es decir, sus atributos. Por ejemplo para un formulario algunas propiedades son: color de fondo, altura, nombre, etc.

Mtodos: cada mtodo es un bloque de cdigo perteneciente a la clase de donde se instancia un objeto, que le permite al mismo ejecutar una accin o tarea. Por ejemplo, para un formulario tenemos el mtodo Hide que har que el formulario se oculte; o el mtodo Show que har que el formulario se vuelva a mostrar.

Eventos: los eventos son acciones reconocidas por el objeto. Un evento ocurre (se dispara) como resultado de la interaccin del usuario con el objeto. Tambin puede dispararse debido a la ejecucin de cdigo (sentencias) como resultado de la interaccin de otro objeto con el objeto poseedor del evento. Por ejemplo el evento Click para un botn de comando, se dispara cuando se hace clic sobre el botn. (Matta Danny).

23

2.2.4.2 Definicin de una clase

Una clase es una categora o grupo de cosas que tienen atributos y acciones similares, dicho de otra forma una clase es una plantilla para crear objetos, y adems es el bloque de construccin primario en el ambiente de orientacin a objetos. Se representa mediante un rectngulo, el cual, se encuentra dividido en tres reas. El rea superior contiene el nombre de la clase, el del centro contiene los atributos y el rea inferior las acciones. Por ejemplo un Carro tiene atributos como por ejemplo: la marca, el modelo, el color, etc., y entre las acciones tenemos desplazarse, aumentar velocidad, se puede representar a un clase Carro como se muestra en figura 2.1.

Figura 2.1: Representacin de una clase Fuente: Prada. V (2008)

2.2.5 Plataforma Microsoft .NET

Microsoft .NET es una plataforma de desarrollo y ejecucin de aplicaciones. Esto quiere decir que no slo nos brinda todas las herramientas y servicios que se necesitan para desarrollar modernas aplicaciones empresariales y

24

de misin crtica, sino que tambin nos provee de mecanismos robustos, seguros y eficientes para asegurar que la ejecucin de las mismas sea ptima (Microsoft, 2005). Los componentes principales de la plataforma .NET son: Un entorno de ejecucin de aplicaciones, tambin llamado Runtime, que es un componente de software cuya funcin es la de ejecutar las aplicaciones .NET e interactuar con el sistema operativo ofreciendo sus servicios y recursos. Un conjunto de bibliotecas de funcionalidades y controles reutilizables, con una enorme cantidad de componentes ya programados listos para ser consumidos por otras aplicaciones. Un conjunto de lenguajes de programacin de alto nivel, junto con sus compiladores y linkers (enlaces), que permitirn el desarrollo de aplicaciones sobre la plataforma .NET. Un conjunto de utilitarios y herramientas de desarrollo para simplificar las tareas ms comunes del proceso de desarrollo de aplicaciones. Documentacin y guas de arquitectura, que describen las mejores prcticas de diseo, organizacin, desarrollo, prueba e instalacin de aplicaciones .NET.

Por otra parte, .NET representa la evolucin COM (Component Object Model), la plataforma de desarrollo de Microsoft anterior a .NET y sobre la cual se basaba el desarrollo de aplicaciones Visual Basic 6 (entre otros tantos lenguajes y versiones).

25

2.2.6 Caractersticas de la plataforma Microsoft.NET

A continuacin se describirn algunas de las caractersticas principales de la plataforma Microsoft .NET, segn Microsoft:

Se dice que es una plataforma de ejecucin intermedia, ya que las aplicaciones .NET no son ejecutadas directamente por el sistema operativo, como ocurre en el modelo tradicional de desarrollo. En su lugar, las aplicaciones .NET estn diseadas para ser ejecutadas contra un componente de software llamado Entorno de Ejecucin (muchas veces tambin conocido como Runtime, o, Mquina Virtual). Este componente es el encargado de manejar el ciclo de vida de cualquier aplicacin .NET, inicindola, detenindola, interactuando con el Sistema Operativo y proveyndole servicios y recursos en tiempo de ejecucin.

La plataforma Microsoft .NET est completamente basada en el paradigma de Orientacin a Objetos.

La plataforma Microsoft.NET es multi-lenguaje, esto quiere decir que para poder codificar aplicaciones sobre esta plataforma no necesitamos aprender un nico lenguaje especfico de programacin de alto nivel, sino que se puede elegir de una amplia lista de opciones.

.NET es una plataforma que permite el desarrollo de aplicaciones empresariales de misin crtica, entendindose por esto que permite la creacin y ejecucin de aplicaciones de porte corporativo que sean crticas

26

para la operacin de tipos variados de organizaciones. Si bien tambin es muy atrayente para desarrolladores no profesionales, estudiantes y entusiastas, su verdadero poder radica en su capacidad para soportar las aplicaciones ms grandes y complejas.

.Net fue diseado de manera tal de poder proveer un nico modelo de programacin, uniforme y consistente, para todo tipo de aplicaciones (ya sean de formularios Windows, de consola, aplicaciones Web, aplicaciones mviles, etc.) y para cualquier dispositivo de hardware (PCs, Pocket PCs, Telfonos Celulares Inteligentes, tambin llamados SmartPhones, Tablet PCs, etc.). Esto representa un gran cambio con respecto a las plataformas anteriores a .NET, las cuales tenan modelos de programacin, bibliotecas, lenguajes y herramientas distintas segn el tipo de aplicacin y el dispositivo de hardware.

Uno de los objetivos de diseo de .NET fue que tuviese la posibilidad de interactuar e integrarse fcilmente con aplicaciones desarrolladas en plataformas anteriores, particularmente en COM, ya que an hoy existen una gran cantidad de aplicaciones desarrolladas sobre esa base.

.NET no slo se integra fcilmente con aplicaciones desarrolladas en otras plataformas Microsoft, sino tambin con aquellas desarrolladas en otras plataformas de software, sistemas operativos o lenguajes de programacin.

27

2.2.7 Ventajas del .NET

Unifica los modelos de programacin: Una de las principales ventajas de .NET es que unifica los modelos de programacin, bibliotecas de funcionalidad y entornos de ejecucin que existan anteriormente para distintos tipos de aplicaciones y distintos dispositivos. Anteriormente a .NET existan lenguajes, bibliotecas, entornos de ejecucin y herramientas de desarrollo distintas y especficas para cada tipo de aplicacin y dispositivo (Visual Basic, Visual C++, ASP/VBScript, Embedded Visual C++, etc.), .NET unifica todos esos modelos de programacin ofreciendo una nica API, un nico entorno de ejecucin, un nico conjunto de bibliotecas y una nica herramienta de desarrollo para cualquier tipo de aplicacin.

Simplifica an ms el desarrollo: la plataforma .NET ofrece un modelo de desarrollo simplificado, basado en objetos que utilizan un sistema unificado de tipos de datos y se empaquetan en componentes reutilizables y auto descriptivos (los assemblies).

Provee un Entorno de Ejecucin robusto y seguro: otra de las ventajas con las que cuenta la plataforma .NET es su robusto entorno de ejecucin el Common Language Runtime (CLR), que provee servicios a las aplicaciones en ejecucin y maneja su ciclo de vida reforzando la seguridad y abstrayendo a los programadores de optimizaciones y manejos de memoria de bajo nivel.

28

Es independiente del lenguaje de programacin: otro de los grandes beneficios de .NET es su soporte a mltiples lenguajes de programacin, lo cual acelera la curva de aprendizaje de los desarrolladores permitiendo que cada uno elija en base a sus gustos personales. Adems, la posibilidad de utilizar las mismas herramientas de programacin y tener las mismas capacidades de acceso a la plataforma independientemente del lenguaje le proporcionan una flexibilidad sin precedentes.

Interoperabilidad con cdigo existente: La plataforma .NET provee un altsimo grado de interoperabilidad con otras aplicaciones: Interoperabilidad entre aplicaciones .NET escritas en distintos lenguajes. Interoperabilidad entre aplicaciones .NET y aplicaciones COM, mediante un mdulo del CLR (Common Language Runtime) llamado COM-Interop. Esto permite reutilizar y aprovechar aplicaciones o componentes existentes desarrollados sobre la plataforma COM (por ejemplo Visual Basic 6). Interoperabilidad entre aplicaciones .NET y mltiples tipos de aplicaciones desarrolladas sobre otras plataformas de software o hardware, incluso plataformas no Microsoft, mediante la tecnologa de Servicios Web XML.

Simplifica la instalacin y administracin de las aplicaciones: .NET tambin simplifica, gracias al uso de assemblies auto-descriptivos, la instalacin y administracin de aplicaciones resolviendo gran parte de los problemas existentes

29

en COM en lo que respecta al registro de componentes, manejo de mltiples versiones en paralelo y compatibilidad de aplicaciones.

Es Extensible: Todas las clases incluidas en el .NET Framework son extensibles mediante los mecanismos de herencia propios de la orientacin a objetos. Esto posibilita que funcionalidades o controles grficos que no cumplan exactamente con una determinada necesidad pueden ser extendidos para agregarle o modificarle comportamiento sin tener que escribir todo el cdigo nuevamente.

2.2.8 .NET Framework

.NET Framework constituye la plataforma y elemento principal sobre el que se asienta Microsoft .NET. Esta plataforma permite el desarrollo de aplicaciones a travs del uso de un conjunto de herramientas y servicios que proporciona, y que pueden agruparse en tres bloques principales: el Entorno de Ejecucin Comn Common Language Runtime (CLR); la jerarqua de clases bsicas de la plataforma .NET Framework Base Classes; y el motor de generacin de interfaz de usuario, que permite crear interfaces para la web o para el tradicional entorno Windows, as como servicios para ambos entornos operativos.

En la base del entorno de ejecucin, se encuentra el CLR, que constituye el ncleo de .NET Framework, encargndose de la gestin del cdigo en cuanto a su carga, ejecucin, manipulacin de memoria, seguridad, etc. En el nivel intermedio, se sita la jerarqua de clases bsicas del entorno de ejecucin que constituyen un slido API de servicios a disposicin del programador, para

30

multitud de tareas como, gestin del sistema de ficheros, acceso a datos, etc. Finalmente, en el nivel superior, se encuentran las clases que permiten el diseo del interfaz de usuario de nuestras aplicaciones. Si es necesario desarrollar aplicaciones para Internet, utilizaremos ASP.NET, que provee todo lo necesario para crear aplicaciones para la Red: web forms, web services, etc. (Blanco, 2002)

2.2.9 Common Language Runtime (CLR)

El Entorno de Ejecucin Comn de Lenguajes Common Language Runtime (CLR), representa el alma del .NET Framework y es el encargado de la ejecucin del cdigo de las aplicaciones. A continuacin se enumeran algunas de las caractersticas de este componente de la plataforma:

Compilacin Just In Time (o Justo A Tiempo): el CLR se encarga de compilar las aplicaciones .NET a cdigo de mquina nativo para el sistema operativo y la plataforma de hardware en la que se est ejecutando. Esto lo hace sin intervencin alguna del desarrollador o el usuario, y solamente a medida que se necesita.

Gestin Automtica de Memoria: el CLR abstrae a los desarrolladores de tener que pedir y liberar memoria explcitamente. Para esto, uno de sus componentes llamado Garbage Collector (Recolector de Basura) se encarga de liberar peridicamente la memoria que ya no est siendo usada por ninguna aplicacin. Por otra parte, el CLR tambin abstrae a los desarrolladores del uso de punteros y del acceso a memoria de bajo nivel. Si bien estas caractersticas pueden ser

31

consideradas poderosas, suelen hacer el desarrollo y mantenimiento de aplicaciones ms propenso a errores y menos productivo.

Gestin de Errores Consistente: como las aplicaciones .NET no se ejecutan directamente contra el Sistema Operativo, cualquier error no manejado que ocurra en tiempo de ejecucin ser atrapado por el CLR en ltima instancia, no afectando a ninguna otra aplicacin que se est ejecutando ni teniendo efecto alguno sobre su estabilidad.

Ejecucin Basada en Componentes: todas las aplicaciones .NET son empaquetadas en componentes reutilizables denominados genricamente

Assemblies, que el CLR se encarga de cargar en memoria y ejecutar.

Gestin de Seguridad: el CLR provee una barrera ms de contencin a la hora de ejecutar aplicaciones manejadas, ya que permite establecer polticas de seguridad muy detalladas que las aplicaciones .NET que se ejecuten en una determinada computadora debern cumplir.

Multithreading: el CLR provee un entorno de ejecucin multi-hilos por sobre las capacidades del Sistema Operativo, as como tambin mecanismos para asegurar su sincronizacin y acceso concurrente a recursos compartidos.

2.2.10 Common Language Specification (CLS)

La Especificacin de Lenguaje Comn Common Language Specification (CLS), consiste en un conjunto de caractersticas comunes, que deben cumplir

32

todos los lenguajes de la plataforma para poder integrarse entre s. Uno de los objetivos de diseo de la plataforma .NET fue el ser independiente del lenguaje de programacin elegido para el desarrollo de aplicaciones. Para lograr esto se cre la Especificacin de Lenguaje Comn (CLS), que define y estandariza un subconjunto de todas las caractersticas soportadas por el CLR (Common Language Runtime) y que son necesarias en la mayora de las aplicaciones. Todos los componentes desarrollados y compilados de acuerdo con la especificacin CLS pueden interactuar entre si, independientemente del lenguaje de programacin de alto nivel en el que fueron escritos. Esto tiene varias finalidades, que describimos a continuacin:

Independencia del lenguaje: en muchas ocasiones el programador se ve obligado a escribir el cdigo en un lenguaje que no es de su agrado; la causa de ello es que dicho lenguaje le provee de funcionalidades de las cuales carece su lenguaje preferido. Con .NET, esto no ocurre, puesto que es la propia plataforma la que proporciona la funcionalidad de modo independiente al lenguaje, por lo que podemos escribir nuestras aplicaciones utilizando el lenguaje con el que nos sintamos ms cmodos, ya que el resultado ser el mismo.

Integracin entre lenguajes: es posible escribir, por ejemplo, una librera de clases en un lenguaje, y utilizarla desde otro lenguaje distinto (siempre que ambos lenguajes cumplan con las normas del CLS). Este concepto no es nuevo, hasta ahora tambin podamos escribir una librera en C++ y utilizarla desde VB, pero gracias al CLS, se extiende y se potencia este modo de trabajo, ya que al basarse

33

los lenguajes en un conjunto de reglas comunes, el acceso en el caso antes mencionado, a una librera de clases, se facilita enormemente desde cualquier otro lenguaje creado en base al CLS.

Apertura a nuevos lenguajes. Finalmente, al ser esta, una especificacin abierta, es posible incorporar a .NET Framework nuevos lenguajes, aparte de los actualmente disponibles, y no slo creados por Microsoft, sino por cualquier otro fabricante. Mediante el CLS, un fabricante de software sabe qu requisitos debe observar un nuevo lenguaje que l desarrolle, para poder integrase en el entorno de .NET Framework. Terceros fabricantes ya han anunciado en este sentido, su intencin de proporcionar nuevos lenguajes para .NET; de esta forma aparecern progresivamente versiones para esta plataforma de Cobol, Perl, Smalltalk, etc., en una lista en la que actualmente figuran ms de veinte lenguajes candidatos.

2.2.11 Herramientas de desarrollo .NET

Visual Studio es la herramienta de desarrollo por excelencia de la plataforma .NET, siendo una herramienta nica que permite desarrollar cualquier tipo de aplicacin (Web, Windows, de Consola, para dispositivos Mviles, para Microsoft Office, de Bases de Datos y ms) en cualquiera de los lenguajes .NET provistos por Microsoft (C#, VB.NET, C++.NET y J#). La familia de Visual Studio 2005 tiene un producto a la medida de las necesidades y posibilidades de cada tipo de desarrollador, partiendo de la lnea gratuita de versiones Express a una suite completa de productos destinada a grandes equipos de desarrollo denominada Visual Studio Team System.

34

2.2.12 Definicin de un control .NET

Un control .NET es un objeto que se inserta dentro de un formulario, y que permite al mismo interactuar con el usuario. Gracias a la programacin orientada a objetos, los controles son componentes reusables, con los cuales se pueden construir programas. Estos controles poseen propiedades que el usuario puede cambiar y que determinan como lucirn, adicionalmente poseen mtodos que le permiten al usuario ejecutar acciones con ellos (Himpe, 2007).

2.2.13 El concepto de 1-Wire 1-Wire es una tecnologa desarrollada por la Empresa Dallas-MaximTM, la cul, consiste en un bus de bajo costo basado en un PC o un microcontrolador que permite la implementacin de una comunicacin serial asincrnica entre un maestro y uno o varios dispositivos esclavos, utilizando un solo conductor ms su retorno para efectuar las comunicaciones y la transmisin de energa. Entre los dispositivos que se pueden comunicar por la red 1-Wire existen contadores, memorias RAM, EEPROM, conversores A/D, sensores de temperatura, termostatos, etc.

En este tipo de red, el dispositivo maestro y los esclavos comparten una lnea de data comn como puede observarse en la figura 2.2. Un aspecto importante de esta tecnologa 1-Wire es que cada dispositivo esclavo tiene una direccin digital nica e irrepetible (nmero de serial de fbrica) que lo identifica y que adems garantiza un direccionamiento estricto de los mismos. Debido a que

35

uno, dos o incluso docenas de dispositivos pueden compartir la red 1-Wire, se utiliza un algoritmo de bsqueda binario para encontrar a cada dispositivo presente en la red.

Figura 2.2: Ilustracin de una red 1-Wire Fuente: http://www.maxim-ic.com/1-Wire.cfm (2007)

2.2.14 Elementos que componen una red 1-Wire

La red 1-Wire utiliza una topologa maestro-esclavo, en la cual, existe un nico dispositivo maestro y uno o ms esclavos. Segn la nota de aplicacin 1796 de la empresa Maxim (Dallas-Maxim, 2002), esta red se compone de tres elementos principales: (1) un maestro de bus con un software de control como el visor de dispositivos TMEX iButton, (2) el cableado y los conectores asociados, y (3) los dispositivos 1-Wire. Por otra parte, la red 1-Wire, brinda un estricto control sobre la comunicacin debido a que ningn nodo de interconexin est autorizado a transmitir informacin a menos que se lo indique el dispositivo maestro, adems, no est permitida la comunicacin directa entre los esclavos.

La implementacin del maestro 1-Wire puede hacerse a travs de diferentes medios, siendo los ms utilizados un computador, un microcontrolador o un circuito integrado de aplicacin especfica ASIC5. En cada caso, se requiere

36

de determinados recursos hardware. Para la implementacin basada en un computador, se necesita un adaptador de puerto de comunicaciones, denominado Host Adapter. Este dispositivo permite establecer la conexin fsica entre el puerto de computador y la red 1-Wire. Existen adaptadores de red para los puertos paralelo, serial RS-232C y USB, siendo estos dos ltimos los ms utilizados. La figura 2.3, muestra los adaptadores de Dallas

Semiconductor/Maxim para puerto serial (A) y USB (B), modelos DS9097U y DS9490R, respectivamente. Tambin se muestra un adaptador para puerto serial modelo iLink-12i de la empresa iButtonLink (http://www.ibuttonlink.com). Adicionalmente, Dallas Semiconductor fabrica circuitos integrados que permiten la implementacin de interfaces de comunicacin de diseo propio, tanto para puerto serial como para puertos USB. (Rodrguez, 2007).

Figura 2.3: Diferentes tipos de adaptadores de red 1-Wire. (A) Modelo DS9097U, (B) Modelo DS9490R, (C) Modelo iLink12i Fuente: Rodrguez. J (2007)

37

2.2.15 Funcionamiento de la red 1-Wire

Una red de dispositivos 1-Wire est conformada por un maestro y uno o ms esclavos que poseen un nico terminal de datos de tipo open drain, al que se conecta una resistencia de pull-up alimentada por + 5 V nominales. Un algoritmo de bsqueda binario es utilizado para encontrar a cada dispositivo por medio de su direccin digital, la cul, como ya se mencion es nica para cada dispositivo. La red 1-Wire, brinda un estricto control sobre la comunicacin debido a que ningn nodo de interconexin est autorizado a transmitir informacin a menos que se lo indique el dispositivo maestro, adems, no est permitida la comunicacin directa entre los esclavos.

El primer paso de cualquier comunicacin involucra que el bus master emita un reset, el cual, sincroniza el bus completo, seguidamente un dispositivo esclavo es seleccionado para siguientes comunicaciones. Una vez que un dispositivo ha sido seleccionado, todos los otros dispositivos que se encuentran conectados al bus se colocan en drop out ignorando las siguientes comunicaciones hasta que el prximo reset sea emitido. Una vez que un dispositivo ha sido aislado por el bus de comunicacin el master puede emitirle comandos y enviar o leer data de l. An cuando cada tipo de dispositivo tiene diferentes protocolos y ventajas, todos ellos tienen el mismo proceso de seleccin y flujo como se muestra en la figura 2.4.

38

Resetear el bus 1-Wire

Seleccionar el dispositivo 1-Wire

Funcionamiento de un dispositivo para una operacin especfica

Figura 2.4: Flujo Tpico de una comunicacin 1-Wire Fuente: Application Note 155. 1-Wire Software Resource Guide.

Algunas de las caractersticas de la red 1-Wire, segn (Rodrguez y Villegas,ao) son: Utiliza niveles de alimentacin compatibles con las tecnologas CMOS/TTL en un rango de operacin desde 2.8 Vdc hasta 6Vdc. El dispositivo maestro y los dispositivos esclavos transmiten informacin en forma bi-direccional, pero, slo en una direccin a la vez. De sta manera la comunicacin ser realiza en forma duplex. Toda la informacin transmitida a travs del bus, es leda o escrita comenzando por el bit menos significativo (LSB). No se requiere del uso de una seal de reloj para realizar la sincronizacin, ya que, cada componente 1-Wire posee un oscilador interno que se sincroniza con el del maestro cada vez que en la lnea de datos aparece un flanco de bajada transicin beta (de nivel lgico alto a nivel lgico bajo). La alimentacin de los esclavos se realiza utilizando el voltaje propio del bus. Para ello, cada circuito esclavo posee un rectificador de media onda y un capacitor. Durante los perodos en los cuales no se efecta half

39

comunicacin, la lnea de datos se encuentra en estado alto debido a una resistencia de PullUp; en esa condicin, un diodo entra en conduccin y carga a un capacitor. Cuando el voltaje de la red cae por debajo de la tensin del capacitor, el diodo se polariza en inverso evitando que el capacitor se descargue. La carga que queda almacenada en el capacitor es la que finalmente alimenta al circuito integrado conectado como esclavo. La red de dispositivos 1-Wire, en general, tiene capacidad para manejar hasta 100 dispositivos esclavos distribuidos a lo largo de una distancia de 200 metros. Todas las tensiones presentes en el bus mayores a 2.2 Vdc, son consideradas un (1) lgico mientras que como un (0) lgico se interpreta cualquier voltaje menor de 0,8 Vdc. La transferencia de informacin se realiza a una velocidad de 16.3 Kbps en modo Estndar y hasta a 142 Kbps en modo Overdrive.

2.2.16 Protocolo de comunicaciones 1-Wire

Se puede describir al protocolo de comunicaciones 1-Wire como una secuencia de transacciones de informacin, la cual, se desarrolla segn los siguientes pasos: (1) Inicializacin, (2) Comandos y funciones de ROM, (3) Comandos y funciones de control y memoria, (4) Transferencia de bytes o datos (Parallax, 2004). A continuacin se describe cada paso.

40

Inicializacin: Todas las comunicaciones en el bus 1-Wire comienzan con una secuencia de un pulso de reset y presencia. El pulso de reset provee una forma conveniente de iniciar las comunicaciones, ya que, con l se sincronizan todos los dispositivos esclavos presentes en el bus. Un reset es un pulso que genera el maestro al colocar la lnea de datos en estado lgico bajo por aproximadamente 480 s. Una vez liberado, el bus retorna al nivel alto y luego de un tiempo comprendido entre 15 a 60 s, los dispositivos esclavos transmitirn un pulso de presencia. Este consiste en forzar la lnea de datos a nivel bajo durante un tiempo entre 60 a 240 s. El maestro, esperar por los pulsos de presencia con el bus en estado alto, a travs de la resistencia de PullUp, por un tiempo de al menos 240 s. Cuando se trabaja al bus en su velocidad estndar, los pulsos de reset y presencia tendrn las caractersticas como las mostradas en la figura 2.5.

La lnea espera respuesta del esclavo Lnea de datos red 1-Wire +5V Inactivo 0V 480s 60-240s Pulso de Reset Pulso de Presencia 15-60s

Figura 2.5: Representacin grfica de un pulso de reset y presencia. Fuente: Rodrguez. J (2006)

41

Comandos y funciones de ROM: Una vez que el dispositivo maestro recibe el pulso de presencia de los dispositivos esclavos, puede enviar un comando de ROM. Los comandos de ROM son comunes a todos los dispositivos 1-Wire y se relacionan con la bsqueda, lectura y utilizacin de la direccin de 64 bits que identifica a esclavos.

Comandos y funciones de control y memoria: Son funciones propias de cada dispositivo 1-Wire. Incluyen comandos para leer/escribir en localidades de memoria, leer memorias scratchpad, controlar el inicio de la conversin de un ADC, iniciar la medicin de una temperatura o manipular el estado de un bit de salida, entre otros. Cada dispositivo define un conjunto de comandos propios a su funcionalidad. Transferencia de datos: La lectura y escritura de datos en el bus 1-Wire se hace por medio de Slot la generacin de stos es responsabilidad del dispositivo maestro. Cuando el maestro lee informacin del bus, debe forzar la lnea de datos a un estado bajo durante al menos 4 s y esperar adicionalmente 15 s para leer el estado presente en la lnea. El estado lgico de la lnea en ese momento, estar determinado por el dispositivo esclavo. La figura 2.6, muestra el proceso de lectura de un bit (slot de lectura), mientras que la figura 2.7, muestra el proceso de escritura de un bit (slot de escritura).

42

Figura 2.6: Transmisin de bits bajo el protocolo 1-Wire Lectura de un (0) y un (1) desde el Maestro. Fuente: Modificado de (Parallax, 2004)

Figura 2.7: Transmisin de bits bajo el protocolo 1-Wire Escritura de un (0) y un (1) desde el Maestro. Fuente: Modificado de (Parallax, 2004)

43

2.2.17 API de programacin 1-Wire

Un API Application Program Interface o interfaz de programa de aplicacin, es la plataforma que proporciona el fabricante para acceder a los dispositivos y la red 1-Wire desde un computador. Bsicamente se definen como un conjunto de subprogramas o funciones de bajo nivel programadas en un entorno que depende tanto del lenguaje de programacin como del sistema operativo utilizado, tal como se muestra en la figura 2.8.

Actualmente el fabricante de dispositivos 1-Wire, dispone de cinco diferentes API, las cuales, se describen a continuacin:

1-Wire Public Domain (PD): Conjunto completo de cdigos y funciones abiertas en lenguaje C, las cuales, soportan la conexin con un PC a travs de un adaptador tipo serial denominado DS9097U equivalente.

1-Wire API for JAVA (OWAPI): Conjunto completo de cdigos y funciones abiertas en lenguaje JAVA, los cuales, soportan la conexin con un PC a travs de un adaptador tipo serial denominado DS9097U equivalente y casi la totalidad de los dispositivos 1-Wire.

1-Wire COM (OWCOM): Modelo de componentes objetos (COM) que implementa un interfaz en base a cdigos y funciones escritas y utilizadas por el API de JAVA (OWAPI), el cual, es accesible a travs de lenguajes de programacin como el Java y el Visual Basic Script.

44

Figura 2.8: Libreras API requeridas para cada tipo de aplicacin. Fuente: Dallas Semiconductor/Maxim (2005)

45

1-Wire TMEX API: Conjunto completo de funciones independientes del lenguaje (DLLs), proveen soporte a todos los dispositivos y adaptadores de red 1-Wire que trabajen bajo la plataforma Windows de 32 Bits, son al mismo tiempo, las funciones que se utilizarn para acceder a los diferentes dispositivos en la red 1-Wire. El API TMEX, est diseado para trabajar en aplicaciones multiprocesos - multitareas y es soportado por todos los sistemas operativos Windows 32 bits.

1-Wire API.NET: Conjunto completo de funciones independientes del lenguaje (DLL), para ser utilizada con la nueva plataforma de Microsoft .NET. En realidad el API.NET resulta de la compilacin del API for Java realizado con la versin de J# de Microsoft.

Este ltimo 1-Wire API.NET, fue el seleccionado para el desarrollo de la presente investigacin, debido a que posee una gran cantidad de clases con propiedades y mtodos que permiten trabajar con todos los dispositivos 1-Wire utilizando la plataforma .NET., que fue la plataforma seleccionada para la elaboracin del control, ya que sta es la plataforma impuesta por Microsoft que se maneja en la actualidad.

2.2.18 iButton Hygrochron

Es un microcircuito autnomo con una direccin nica de fbrica embebido en un empaque de acero inoxidable de 16 mm de dimetro, este sensor de la familia iButton llamado DS1923 integra dos chips en un solo empaque, adems

46

de tener un sensor de temperatura aade uno de humedad, teniendo la capacidad de leer en tiempo real y de almacenar la data tanto de temperatura como de humedad, con una alta capacidad de memoria, exactitud y resolucin. Este nuevo producto posee una pequea abertura en la parte superior que emplea un filtro especial para permitir el paso de vapor de agua a travs del empaque para que pueda llegar hasta el sensor de humedad interno, pero repele el agua en fase lquida.

Este dispositivo graba las lecturas de temperatura y humedad en una seccin de memoria protegida, y puede almacenar un total de 8192 lecturas de 8 bits o 4096 de 16 bits tomadas en intervalos equidistantes de 1 segundo a 273 horas. Adicionalmente hay 512 bytes de SRAM para almacenar informacin de una aplicacin especfica y 64 bytes para calibracin de la data. Una misin para recolectar la data puede ser programada para empezar inmediatamente despus de un retardo definido por el usuario.

Figura: 2.9 iButton Hygrochron Fuente: Dallas Semiconductor/Maxim (2006)

47

2.3 Definicin de trminos .NET: Nueva plataforma de programacin y modelo de objetos de Microsoft TM.

ADC: Siglas para denominar a la conversin analgica a digital.

1-Wire: Circuitos integrados con capacidad de comunicacin en red que utilizan un slo conductor ms alimentacin para la propagacin de informacin digital.

API: Iniciales de Application Program Interface, normalmente es un conjunto de libreras o paquetes de desarrollo que le permiten al programador acceder a los recursos de un hardware.

Assembly: Un Assembly es la menor unidad de ejecucin y distribucin de una aplicacin .NET.

Autosuficiente: Propiedad que poseen los iButton que no necesitan alimentacin externa, una vez que el mismo ha sido programado.

Bit: Unidad de informacin digital bsica, slo puede ser un cero (0) o un uno (1).

CRC: Iniciales de Comprobacin de Redundancia Cclica, es un algoritmo que permite detectar errores en datos digitales con una confiabilidad superior al 99 por ciento.

Dallas-Maxim - Semiconductors: Empresa Norteamericana actualmente reconocida como lder mundial en la fabricacin de semiconductores.

48

Formulario: Es una ventana estndar, para comunicarse con el usuario, sobre la cual se aaden controles y se puede modificar su aspecto inicial.

Full-duplex: Es un tipo de transmisin de datos, en la cual, ambas estaciones punto a punto pueden simultneamente enviar y recibir datos, es decir, pueden transmitir las dos a la vez.

Half-duplex: Es un tipo de transmisin de datos, en la cual, slo una de las dos estaciones punto a punto puede transmitir cada vez.

iButton: Dispositivo 1-Wire embebido en un contenedor de acero inoxidable.

Interfaz: Es en general, la manera que tiene un cliente de conversar con una clase.

KBps: Trmino que define la velocidad de transmisin de informacin a kilo bit por segundo.

Open Drain: Etapa de salida a transistor con el colector abierto sin conexin.

Overdrive: Modo de alta velocidad de operacin de la red 1-Wire.

PullUp: Resistencia colocada generalmente entre la alimentacin dc y un transistor open drain.

Pulso de presencia: Respuesta emitida por los dispositivos esclavos de la red 1-Wire que permite al maestro detectar la existencia de los mismos.

49

Pulso de reset: Pulso de duracin estricta y definida utilizado para re-inicializar por medio del software la actividad realizada por los dispositivos esclavos en una red 1-Wire.

Rollover: Propiedad de sobre-escritura que poseen los iButton Hygrochron, si la misma se encuentra activada, cuando el dispositivo alcanza el total de muestras que puede almacenar durante una misin, comienza a almacenar las nuevas lecturas sobre las ya existentes.

Scratchpad:

Memoria

de

trabajo

intermedia

disponible

en

algunos

semiconductores.

Sistema: En el presente trabajo se considerar a un sistema como una combinacin de software y hardware que da una solucin a un problema.

Slots: Ranuras de tiempo sincronizadas y espaciadas correctamente en la red 1-Wire.

UML: Abreviacin de Lenguaje Unificado de Modelado.

CAPITULO III MARCO METODOLGICO

CAPITULO III

MARCO METODOLGICO

En el presente captulo se habla sobre el tipo de investigacin, las tcnicas de recoleccin y anlisis de datos, finalizando con la metodologa a utilizar para el cumplimiento de los objetivos planteados en el Captulo I.

3.1. Tipo y diseo de la investigacin

El presente Trabajo Especial de Grado, titulado Aplicacin del Lenguaje Unificado de Modelado (UML) al diseo de controles .NET para dispositivos con tecnologa 1-Wire, se enmarca dentro de una investigacin de campo, tipo proyecto factible, ya que se desarroll un modelo operativo para solucionar una necesidad instrumental utilizando alta tecnologa.

Segn el Manual de Trabajos de Grado de Especializacin, Maestra y Tesis Doctorales de la Universidad Pedaggica Experimental Libertador (1998), pg.,7:

Un proyecto factible consiste en la investigacin, elaboracin y desarrollo de una propuesta de un modelo operativo viable para solucionar, requerimientos o necesidades de organizaciones o grupos sociales; puede referirse a la formulacin de polticas, programas, tecnologas, mtodos o procesos. El proyecto debe tener el apoyo en una investigacin de tipo documental, de campo o un diseo que cumpla con ambas modalidades.

52

3.2. Tcnicas de recoleccin de datos

Los datos necesarios para cumplir con los objetivos planteados en la presente investigacin fueron recolectados en dos etapas. Primero se realiz un arqueo de informacin a travs de artculos referentes al tema extrados de Internet, libros y datos del fabricante. Este arqueo de informacin se bas en cuatro tpicos, los cuales son: Aplicaciones y uso del UML, Lenguajes de programacin orientada a objetos, tecnologa 1-Wire y las herramientas disponibles por la empresa Dallas Semiconductor para trabajar con sus dispositivos.

En segundo lugar los datos necesarios para la elaboracin de este proyecto fueron recolectados en campo, los cuales, estn relacionados a las propiedades y caractersticas del dispositivo, tales como:

Serial e identificacin del dispositivo Intervalo de tiempo entre diferentes mediciones. Informacin sobre la hora y fecha de inicio de una misin. Resolucin aplicada a la medicin de la temperatura y la humedad relativa.

Mediciones de temperatura y humedad relativa. Puntos de alarmas para alta y baja temperaturas. Puntos de alarmas para alta y baja humedad relativa. Total de muestras almacenadas en el dispositivo.

53

3.3. Tcnicas de anlisis de datos

Se realiz un anlisis de fuentes secundarias mediante la lectura de textos y artculos relacionados con el tema de investigacin y aspectos tcnicos importantes para el desarrollo del presente trabajo.

Los datos recolectados de campo sirvieron para la generacin de registros que permitieron la construccin de tablas, grficas de tendencia histrica e histogramas de frecuencias, los cuales, se utilizan para realizar una futura interpretacin de los datos y tomar medidas correctivas de ser necesario. Para efectos de la graficacin se utiliz el Dundas Chart for .NET, el cual es una herramienta que ofrece soluciones grficas en aplicaciones.

3.4 Procedimiento metodolgico

Para llevar a cabo el presente Trabajo de Grado, se realizaron una serie de actividades, las cuales la autora las agrupa en tres fases:

Fase N 1: Revisin documental.

En esta primera fase se realiz una revisin bibliogrfica de diversas fuentes, como ya se mencion anteriormente, esta fase contempl la siguientes actividades: Estudiar el Lenguaje Unificado de Modelado en el desarrollo de sistemas, especificaciones, simbologa y construccin de diagramas.

54

Anlisis del protocolo de comunicaciones 1-Wire y especificaciones del iButton Hygrochron.

Realizar un arqueo de informacin sobre las clases contenidas en las API de programacin 1-Wire API .NET, con el fin de necesarias para la construccin del control .NET. seleccionar las

Estudiar el lenguaje de programacin orientada a objetos Visual Basic .NET.

Fase N 2: Construccin del control .NET

En esta segunda fase se construy el control .NET aplicando el Lenguaje Unificado de Modelado UML, para lograr el desarrollo de esta fase se realizaron las siguientes actividades: Identificacin de los requerimientos del control. Construccin de los diagramas de casos de uso. Descripcin de las clases 1-Wire API.NET seleccionadas para la comunicacin con el iButton Hygrochron. Seleccionar de los mtodos contenidos en las clases, aquellos que permitan crear los mtodos del control a travs de la herencia, para as cumplir con los requerimientos del mismo. Construccin del diagrama de clases. Construccin de los diagramas de colaboraciones. Construccin de los diagramas de secuencias.

55

Elaboracin del cdigo fuente, con la ayuda de los diagramas de especificaciones UML y de los mtodos contenidos en las clases de las 1-Wire API.NET seleccionadas.

Fase N 3: Validacin del control .NET

En esta ltima fase se elabor una aplicacin para validar el control .NET construido, demostrando as su correcto funcionamiento, en esta fase se realizaron las siguientes actividades: Explicacin del uso del control .NET a travs de un ejemplo. Elaboracin del cdigo fuente de la aplicacin. Descripcin detallada del uso y manejo de la aplicacin. Realizar un ejemplo de programacin y descarga de datos de una misin

CAPITULO IV CONSTRUCCIN DEL CONTROL .NET APLICANDO UML

CAPITULO IV

CONSTRUCCIN DEL CONTROL .NET APLICANDO UML

Siguiendo lo planteado en la metodologa descrita en el captulo tres, se desarrollan las diversas fases para la realizacin de la propuesta de ingeniera Aplicacin del Lenguaje Unificado de Modelado (UML) al diseo de controles .NET para dispositivos con tecnologa 1-Wire. En la fase de documentacin se recopil la informacin necesaria para fijar las bases de la propuesta planteada, en este aspecto se revisaron libros de UML as como el documento sobre las especificaciones del UML versin 2.0, desarrollado por el Object Management Group (OMG), disponible en internet en la pgina web

http://www.omg.org/spec/UML/2.0/Infrastructure/PDF. Seguidamente se realiz un estudio del leguaje de programacin Visual Basic .NET para desarrollar el cdigo fuente, una vez elaboradas las especificaciones necesarias en UML.

4.1 Requerimientos del control

El primer paso para el desarrollo de cualquier sistema bajo el concepto de UML es determinar los requerimientos del cliente y de los futuros usuarios, y a partir de all efectuar la elaboracin de los diferentes diagramas que conforman al UML, los cuales, permiten examinar al sistema desde diferentes puntos de vista. Los requerimientos son una descripcin de las necesidades o deseos de un producto. La meta es identificar y documentar lo que en realidad se necesita, en

58

una forma clara que pueda ser comunicado al cliente, al usuario y a los miembros del equipo de desarrollo. Una vez construidos los diagramas de especificaciones UML en base a los requerimientos, se selecciona el lenguaje de programacin a utilizar y se definen las propiedades, mtodos y eventos que tendr el control.

Se construy un control .NET para el manejo del iButton Hygrochron, que permite programarle una misin, detenerla y descargar la data almacenada durante el tiempo que estuvo activa la misin. Una misin consiste en grabar en los registros internos del dispositivo una serie de parmetros para que ste comience a leer y almacenar en su memoria no voltil la temperatura y la humedad del medio ambiente donde se encuentra, a una fecha y hora especfica, establecer el tiempo entre muestras, activar o desactivar la funcin de rollover que posee el iButton, establecer los valores de las alarmas alta y baja de cualquiera de las magnitudes que mide, activar o desactivar alarma de alta y baja temperatura, activar o desactivar alarma de alta y baja humedad, e indicar si la misin se encuentra activa o inactiva. Para lograr la comunicacin con el iButton Hygrochron es necesario utilizar un adaptador de puerto de comunicaciones, el cul fue el DS9490B (ver anexo B) fabricada por Dallas Semiconductor y el control construido en el presente trabajo.

El control tambin debe determinar el nmero total de muestras tomadas durante la misin y detectar cuando ocurra un error. Una vez grabada la misin se retira al iButton del adaptador y se coloca en el lugar de estudio. En el momento requerido, el usuario retira el dispositivo del lugar de estudio, lo coloca

59

nuevamente en el adaptador y utilizando el control aqu construido detiene la misin y descarga toda la data almacenada en el dispositivo desde el momento en que se inici la misin hasta el momento en que se detuvo.

4.2 Casos de uso

Un caso de uso es una estructura para describir la forma en que un sistema lucir para los usuarios potenciales. Es una coleccin de escenarios iniciados por una entidad llamada actor (una persona, un componente de hardware u otro sistema) y el resultado debe ser algo utilizable ya sea por el actor que la inici o por otro actor. Adems ayuda a comprender la forma en que un sistema deber comportarse sin preocuparse por la forma en que el mismo ser implementado (Schmuller, 2003). Dicho de otro modo, es un documento narrativo con una secuencia de eventos para completar un proceso que muestra la interaccin entre un sistema de informacin y los usuarios de ste (actores). Por otra parte, es importante destacar que el proceso unificado se maneja mediante casos de uso. En la figura 4.1 se muestra la representacin de un caso de uso, la silueta representa a un actor, la elipse representa un caso de uso, el cuadro representa el sistema y la lnea que une al actor con la elipse representa la comunicacin.

Figura 4.1: Representacin de un caso de uso Fuente: Prada. V (2008)

60

Cabe sealar, que existen cuatro tipos de relaciones en los casos de uso que son: inclusin, extensin, generalizacin y agrupamiento.

Inclusin: consiste en utilizar los pasos comunes de un caso de uso dentro de otro, es decir, un caso de uso forma parte de otro caso de uso y en consecuencia no interaccionan con un actor. La forma de representar una inclusin es mediante una lnea discontinua que parte de un caso de uso y termina con una punta de flecha que apunta a la inclusin y sobre la lnea discontinua se coloca la palabra incluye dentro de dos parntesis angulares.

Extensin: permite crear un nuevo caso de uso a partir de uno existente mediante la adicin de nuevos pasos. La forma de representar una extensin es mediante una lnea discontinua que parte del nuevo caso de uso y termina con una punta de flecha que apunta al caso de uso original y sobre la lnea discontinua se coloca la palabra extender dentro de dos parntesis angulares.

Generalizacin: este tipo de relacin est basada en la herencia, un caso de uso puede heredar las acciones de otro caso de uso y agregar las propias. La generalizacin se representa mediante una lnea continua que conecta al caso de uso principal con el secundario, colocando una punta de flecha en forma de tringulo que apunte al caso de uso principal, es decir, del caso del cual se hereda. La generalizacin tambin puede establecerse entre actores.

Agrupamiento: consiste en agrupar en paquetes a los casos de uso que se relacionan.

61

4.3 Casos de uso del control Hygrochron

Para el control construido en la presente investigacin, en un principio se analizaron tres casos uso que son: Iniciar Misin, Detener Misin y Leer Datos de la Misin, los cuales, pueden apreciarse en las figuras 4.2, 4.3 y 4.4 respectivamente. Estos tres casos de uso se agrupan para formar un diagrama de casos de uso inicial del control HYGROCHRON como puede observarse en la figura 4.5. Un diagrama de casos de uso muestra a los casos de uso de un sistema y sus relaciones, estos diagramas son los primeros a presentar en un sistema modelado con UML, en vista de que ellos muestran un panorama general de lo que har el sistema.

Figura 4.2: Caso de uso Iniciar Misin Fuente: Prada.V (2008)

Figura 4.3: Caso de uso Detener Misin Fuente: Prada. V (2008)

62

Figura 4.4: Caso de uso Leer Datos de la Misin Fuente: Prada. V (2008)

Figura 4.5: Diagrama de casos de uso inicial Fuente: Prada. V (2008)

Una vez construido el diagrama de casos de uso inicial se comienza a realizar iteraciones, hasta lograr representar en un diagrama de casos de uso genrico el comportamiento del sistema terminado, as como las interacciones con los usuarios del mundo exterior. Ahora al realizar la segunda iteracin es necesario representar el caso de uso Iniciar Misin en dos casos de uso separados: Iniciar Misin por Defecto e Iniciar Nueva Misin, debido a que puede

63

presentarse cualquiera de estas dos opciones, transformndose el diagrama de casos de uso de la figura 4.5 en el diagrama de la figura 4.6. En este sentido, se puede observar que en el diagrama de casos de uso de la figura 4.6 existe un usuario, el cual, en este sistema es una persona, quien inicia una misin bien sea por defecto (el dispositivo toma los valores de la misin anterior) o una nueva donde el usuario establece los valores de los parmetros requeridos por l.

Figura 4.6: Diagrama de casos de uso de la segunda iteracin Fuente: Prada. V (2008)

El usuario puede detener la misin en el momento que lo desee, sin embargo, no obtiene ningn beneficio al realizar sta accin, el beneficio se obtiene en el momento en que el usuario descarga los datos de la misin, para

64

poder leerlos y analizarlos. Una tercera iteracin arroja el diagrama de casos de uso del control HYGROCHRON que se observa en la figura 4.7, adicionalmente a ste diagrama se le anexan las descripciones de los diferentes casos de uso para darle una mayor compresin al mismo, los cuales van desde el cuadro 4.1 al 4.15. El siguiente paso una vez construido el diagrama de casos de uso, es construir el diagrama de clases que conforman al control .NET, y a partir de ambos se obtendrn los diagramas de interaccin, los cuales, constituyen el tercer paso del proceso unificado.

Figura 4.7: Diagrama de casos de uso del control HYGROCHRON Fuente: Prada. V (2008)

66

Caso de Uso: Iniciar Misin por Defecto Breve Descripcin: El caso de uso Iniciar Misin por Defecto, le permite al usuario comenzar una misin sin necesidad de asignar previamente los valores a los parmetros requeridos para la toma de datos durante la misin, ya que el control toma los valores por defecto que proporciona el dispositivo Hygrochron. Descripcin por pasos: 1.- Se debe abrir el puerto utilizando el caso de uso Abrir Puerto. 2.- Si se desea que el control busque el puerto en forma automtica se utiliza el caso de uso Auto Buscar Puerto. 3.- Se inicia la bsqueda del dispositivo utilizando el caso de uso Buscar Dispositivo. 4.- Se debe verificar el estatus de la misin utilizando el caso de uso Verificar Estatus de Misin y Finalizarla. 5.- Se programa la misin en el dispositivo Hygrochron utilizando el caso de uso Programar Dispositivo con Valores Predefinidos en el Sistema.
Cuadro 4.1: Caso de uso Iniciar Misin por Defecto Fuente: Prada. V (2008)

Caso de Uso: Iniciar Nueva Misin Breve Descripcin: El caso de uso Iniciar Nueva Misin, le permite al usuario comenzar una misin asignando previamente los valores a los parmetros requeridos por el para la toma de datos durante la misin. Descripcin por pasos: 1.- Se debe abrir el puerto utilizando el caso de uso Abrir Puerto. 2.- Si se desea que el control busque el puerto en forma automtica se utiliza el caso de uso Auto Buscar Puerto. 3.- Se inicia la bsqueda del dispositivo utilizando el caso de uso Buscar Dispositivo. 4.- Se debe verificar el estatus de la misin utilizando el caso de uso Verificar Estatus de Misin y Finalizarla. 5.- Se programa la misin en el dispositivo Hygrochron utilizando el caso de uso Programar Dispositivo con Valores Predefinidos por el Usuario.
Cuadro 4.2: Caso de uso Iniciar Nueva Misin Fuente: Prada. V (2008)

67

Caso de Uso: Detener Misin Breve Descripcin: El caso de uso Detener Misin le permite al usuario dar fin a una misin que est corriendo. Descripcin por pasos: 1.- Se debe abrir el puerto utilizando el caso de uso Abrir Puerto. 2.- Si se desea que el control busque el puerto en forma automtica se utiliza el caso de uso Auto Buscar Puerto. 3.- Se busca el dispositivo utilizando el caso de uso Buscar Dispositivo. 4.- Se debe verificar el estatus de la misin utilizando el caso de uso Verificar Estatus de Misin y Finalizarla.
Cuadro 4.3: Caso de uso Detener Misin Fuente: Prada. V (2008)

Caso de Uso: Leer Datos de la Misin Breve Descripcin: El caso de uso Leer Datos de la Misin, le permite al usuario conocer tanto los datos de programacin del Hygrochron, como las muestras de temperatura y humedad registradas durante una misin. Descripcin por pasos: 1.- Se debe abrir el puerto utilizando el caso de uso Abrir Puerto. 2.- Si se desea que el control busque el puerto en forma automtica se utiliza el caso de uso Auto Buscar Puerto. 3.- Se inicia la bsqueda del dispositivo utilizando el caso de uso Buscar Dispositivo. 4.- Se debe verificar el estatus de la misin utilizando el caso de uso Verificar Estatus de Misin y Finalizarla. 5.- Para conocer los datos asignados a los parmetros al inicio de la misin, as como tambin, los valores de las muestras de temperatura y humedad registradas durante una misin, se utiliza el caso de uso Descargar datos de la Misin.
Cuadro 4.4: Caso de uso Leer Datos de la Misin Fuente: Prada. V (2008)

68

Caso de Uso: Abrir Puerto Breve Descripcin: El caso de uso Abrir Puerto solicita al PC el inicio del enlace de comunicacin, entre el software y el hardware (puerto de comunicacin definido por el usuario), que el PC dispone para realizar un intercambio de datos. Descripcin por pasos: 1.- Se solicita el inicio de enlace de comunicacin entre el software, el adaptador 1-Wire y el puerto seleccionado por el usuario. 2.- Se debe hacer uso exclusivo del puerto seleccionado por el usuario. 3.- Se establece que la comunicacin 1-Wire sea realizada a una velocidad estndar. 4.- Se verifica la existencia de errores durante la solicitud de apertura del puerto y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.5: Caso de uso Abrir Puerto Fuente: Prada. V (2008)

Caso de Uso: Auto Buscar Puerto Breve Descripcin: El caso de uso Auto Buscar Puerto, es una extensin del caso de uso Abrir Puerto. ste caso de uso permite identificar automticamente el puerto disponible para establecer una comunicacin 1-Wire, sin que el usuario tenga la necesidad de definirlo previamente. Descripcin por pasos: 1.- Para encontrar el puerto, se recorre uno a uno los puertos de comunicacin del PC, intercalando entre los distintos tipos de adaptadores, con la finalidad de verificar si existe una red 1-Wire disponible para establecer comunicacin. 2.- Se solicita el inicio de enlace de comunicacin entre el software, el adaptador 1-Wire y puerto encontrado en el paso 1. 3.- Se debe hacer uso exclusivo del puerto seleccionado. 4.- Se establece que la comunicacin 1-Wire sea realizada a una velocidad estndar. 5.- Se verifica la existencia de errores durante la solicitud de apertura del puerto y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.6: Caso de uso Auto Buscar Puerto Fuente: Prada. V (2008)

69

Caso de Uso: Buscar Dispositivo Breve Descripcin: El caso de uso Buscar Dispositivo permite explorar la red 1-Wire, identificando en ella el nmero de dispositivos Hygrochron, conectados a la misma y preparados para establecer comunicacin. Descripcin por pasos: 1.- Se verifica el estatus de apertura del puerto. 2.- Se solicita el uso exclusivo del puerto seleccionado. 3.- Se buscan todos los dispositivos conectados a la red 1-Wire. 4.- Se seleccionan nicamente entre los dispositivos encontrados, aquellos que pertenecen a la familia Hygrochron. 5.- Se solicita el contenedor de datos de cada uno de los dispositivos Hygrochron encontrados en la red, almacenando ste contenedor en un enumerador. 6.- Se recorre el enumerador elemento por elemento y se comprueba que cada elemento contenedor corresponde efectivamente a la familia Hygrochron. 7.- Se almacena cada uno de los seriales de los dispositivos encontrados. 8.- Si se encuentra al menos un dispositivo Hygrochron durante la bsqueda, se almacena el contenedor en una variable, para su posterior uso. 9.- Se verifica la existencia de errores durante la bsqueda del dispositivo y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.7: Caso de uso Buscar Dispositivo Fuente: Prada. V (2008)

Caso de Uso: Verificar Estatus de Misin y Finalizarla Breve Descripcin: El caso de uso Verificar Estatus de Misin y Finalizarla, se encarga de identificar si la misin est o no corriendo, y en caso de que la misma est corriendo dar fin a dicha misin. Descripcin por pasos: 1.- Cargar el contenedor de los datos de misin del dispositivo. 2.- Verificar si la misin est corriendo. 3.- Se verifica la existencia de errores durante la verificacin del estatus de misin y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error. 4.- Se detiene la misin. 5.- Se verifica la existencia de errores durante la finalizacin de la misin y en caso tal

70

de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.8: Caso de uso Verificar Estatus de Misin y Finalizarla Fuente: Prada. V (2008)

Caso de Uso: Programar Dispositivo con Valores Predefinidos en el Sistema Breve Descripcin: El caso de uso Programar Dispositivo con Valores Predefinidos en el Sistema, se utiliza para dar inicio a una misin sin necesidad de definir previamente los valores a los parmetros requeridos para la toma de datos durante la misin. Descripcin por pasos: 1.- Se establecen los valores por defecto contenidos en el iButton Hygrochron de los siguientes parmetros: Resolucin de Temperatura. Resolucin de Humedad. Habilitar alarmas de alta y baja temperatura. Habilitar alarmas de alta y baja humedad. Establecer el valor de alarma de alta temperatura. Establecer el valor de alarma de baja temperatura. Establecer el valor de alarma de alta humedad. Establecer el valor de alarma de baja humedad. Establecer el tiempo entre muestras. Establecer estatus del rollover. Establecer el tiempo de inicio de la misin. 2.- Se limpia la memoria del dispositivo Hygrochron. 3.- Se ejecuta el comando de iniciar misin por defecto. 4.- Se verifica la existencia de errores durante el inicio de la misin y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.9: Caso de uso Programar Dispositivo con Valores Predefinidos en el Sistema Fuente: Prada. V (2008)

71

Caso de Uso: Programar Dispositivo con Valores Predefinidos por el Usuario Breve Descripcin: El caso de uso Programar Dispositivo con Valores Predefinidos por el Usuario, se utiliza para dar inicio a una misin definiendo previamente parmetro por parmetro, los valores necesarios para la toma de datos durante la misin. Descripcin por pasos: 1.- Se establecen los valores deseados por el usuario de los siguientes parmetros: Resolucin de Temperatura. Resolucin de Humedad. Habilitar alarmas de alta y baja temperatura. Habilitar alarmas de alta y baja humedad. Establecer el valor de alarma de alta temperatura. Establecer el valor de alarma de baja temperatura. Establecer el valor de alarma de alta humedad. Establecer el valor de alarma de baja humedad. Establecer el tiempo entre muestras. Establecer estatus del rollover. Establecer el tiempo y la fecha de inicio de la misin. 2.- Se limpia la memoria del dispositivo Hygrochron. 3.- Se ejecuta el comando de iniciar nueva misin. 4.- Se verifica la existencia de errores durante el inicio de la misin y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.10: Caso de uso Programar Dispositivo con Valores Predefinidos por el Usuario Fuente: Prada. V (2008)

Caso de Uso: Descargar Datos de la Misin Breve Descripcin: El caso de uso Descargar Datos de la Misin, se utiliza para que el usuario pueda conocer los datos asignados a los parmetros al iniciar la misin, as como tambin, conocer los valores de las muestras de temperatura y humedad tomadas durante una misin. Descripcin por pasos: 1.- Para conocer los datos asignados a los parmetros al iniciar la misin, se emplea el caso de uso Actualizar Datos de Inicio de Misin.

72

2.- Para conocer los valores de las muestras de temperatura y humedad tomadas durante la misin, se emplea el caso de uso Leer Muestras de la Misin.
Cuadro 4.11: Caso de uso Descargar Datos de la Misin Fuente: Prada. V (2008)

Caso de Uso: Actualizar Datos de Inicio de Misin Breve Descripcin: El caso de uso Actualizar Datos de Inicio de Misin, se utiliza para cargar los datos de los parmetros definidos al inicio de la misin. Descripcin por pasos: 1.- Cargar el contenedor de datos de la misin. 2.- Leer parmetro por parmetro los datos definidos al iniciar la misin en el dispositivo Hygrochron. Valor de resolucin de Temperatura. Valor de resolucin de Humedad. Obtener habilitacin de alarmas de alta y baja temperatura. Obtener habilitacin de alarmas de alta y baja humedad. Valor de alarma de alta temperatura. Valor de alarma de baja temperatura. Valor de alarma de alta humedad. Valor de alarma de baja humedad. Tiempo entre muestras. Estatus del rollover. Tiempo desde que se inici la misin en milisegundos. Fecha de inicio de la misin. 3.- Se verifica la existencia de errores durante la actualizacin de los datos y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.12: Caso de uso Actualizar Datos de Inicio de Misin Fuente: Prada. V (2008)

73

Caso de Uso: Leer Muestras de la Misin Breve Descripcin: El caso de uso Leer Muestras de la Misin, se utiliza para que el usuario pueda conocer los valores de las muestras de temperatura y humedad tomadas durante la misin. Descripcin por pasos: 1.- Para leer las muestras de temperatura tomadas durante la misin, se utiliza el caso de uso Leer Muestras de Temperatura. 2.- Para leer las muestras de humedad tomadas durante la misin, se utiliza el caso de uso Leer Muestras de Humedad.
Cuadro 4.13: Caso de uso Leer Muestras de la Misin Fuente: Prada. V (2008)

Caso de Uso: Leer Muestras de Temperatura Breve Descripcin: El caso de uso Leer Muestras de Temperatura, se utiliza para descargar los valores de temperatura almacenados durante el tiempo en estuvo la misin activa. Descripcin por pasos: 1.- Cargar el contenedor de datos de la misin. 2.- Leer el nmero de muestras de temperatura tomadas en la misin. 3.- Se verifica la existencia de errores durante la lectura de las muestras de temperatura y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.14: Caso de uso Leer Muestras de Temperatura Fuente: Prada. V (2008)

74

Caso de Uso: Leer Muestras de Humedad Breve Descripcin: El caso de uso Leer Muestras de Humedad, se utiliza para descargar los valores de humedad almacenados durante el tiempo en estuvo la misin activa. Descripcin por pasos: 1.- Cargar el contenedor de datos de la misin. 2.- Leer el nmero de muestras de humedad tomadas en la misin. 3.- Se verifica la existencia de errores durante la lectura de las muestras de humedad y en caso tal de que exista alguno, se desencadena un evento que indica que ocurri un error.
Cuadro 4.15: Caso de uso Leer Muestras de Humedad Fuente: Prada. V (2008)

4.4 Clases y diagramas de clases

Recordando que una clase es una categora o grupo de cosas que tienen atributos y acciones similares, un diagrama de clases muestra las clases que conforman a un sistema y sus interrelaciones, estos diagramas sirven para modelar una vista esttica del sistema. Es importante resaltar que no es obligatorio colocar en una clase todos sus atributos y funciones, se pueden representar slo las ms resaltantes y colocar tres puntos suspensivos () para indicar que existen ms atributos y funciones, o simplemente no colocar ninguno. Cabe considerar, que tambin existen clases abstractas que son aquellas que no proporcionan ninguna instancia de la clase, es decir, no proveen objetos y se distinguen de las dems por tener su nombre en letra cursiva. Sin embargo, a pesar de no generar objetos las clases abstractas funcionan como clases principales para clases secundarias importantes.

75

Por otra parte, la herencia de la cual se habl en el captulo II se representa mediante una lnea que conecta a la clase principal con la(s) secundaria(s), colocando un tringulo que apunte a la clase principal, es decir, a la clase de la cual se hereda. El propsito principal de la herencia es el de organizar mejor las clases que componen una determinada realidad, y poder agruparlas en funcin de atributos y comportamientos comunes a la vez que cada una se especializa segn sus particularidades. Una clase base puede compartir su estructura y comportamiento definido en otra clase, es decir, que cada clase que hereda de otra posee los atributos de la clase base adems de los propios y soporta todos o algunos de los mtodos de la clase base. Por lo anteriormente expuesto, se evidencia la importancia de la herencia, siendo su mejor ventaja que a travs de ella se pueden rehusar los atributos y mtodos ya creados en nuevas clases, ahorrando una gran cantidad de tiempo, puesto que slo debern aadirse a la clase que hereda los atributos y mtodos particulares.

4.5 Clases 1-Wire API.NET utilizadas

Para desarrollar un control .NET de cualquier dispositivo 1-Wire, es necesario revisar cuidadosamente las clases contenidas en las 1-Wire API.NET, ya que las mismas se deben seleccionar de acuerdo al tipo de dispositivo 1-Wire que se va a utilizar y a los requerimientos del sistema. Bajo esta misma perspectiva, se seleccionaron las clases necesarias para la comunicacin con el iButton Hygrochron. Igualmente se revisaron los mtodos contenidos en las clases, y se seleccionaron aquellos que permitiesen construir los mtodos del

76

control HYGROCHRON a travs de la herencia para cumplir con todos los requisitos planteados. Las clases utilizadas as como los mtodos seleccionados se detallan a continuacin:

OneWireException: esta clase es la encargada de generar las excepciones (parmetros de errores), generales que suceden durante la comunicacin con una red 1-Wire y por tanto con los dispositivos iButton. Esta permite la construccin de excepciones en el software de aplicacin, con un mensaje especfico que identifica el error que ha ocurrido.

OneWireAccessProvider: esta clase permite obtener una instancia del adaptador conectado. El adaptador estar listo para usarse siempre y cuando no existan excepciones que impidan su funcionamiento. A travs de un mtodo disponible por esta clase, todos los adaptadores disponibles pueden ser accesados, esto permite a la aplicacin ser independiente del adaptador. El mtodo utilizado de esta clase fue:

getAdapter: encuentra, abre y verifica el adaptador en el puerto indicado, y si no consigue alguno de ellos genera una excepcin.

DSPortAdapter: Esta es una clase base de comunicacin, la misma es de carcter abstracto. En ella se contienen todas las funciones que permiten el enlace virtual entre el software que interacta con ella y el hardware de comunicacin del PC (Puerto y Adaptador). Los mtodos utilizados de esta clase fueron:

77

beginExclusive: obtiene el uso exclusivo de la comunicacin 1-Wire con cualquier dispositivo 1-Wire.

endExclusive: abandona el uso exclusivo de la comunicacin 1-Wire.

freePort: libera al puerto seleccionado.

getAllDeviceContainers: retorna una enumeracin de los objetos correspondiente a todos los dispositivos 1-Wire encontrados en la red 1-Wire.

getDeviceContainer: construye un objeto tipo 1-Wire container, cuya fuente de datos es un dispositivo que se encuentra en la red 1-Wire.

getFirstDeviceContainer: retorna un objeto correspondiente a el primer iButton o dispositivo 1-Wire encontrado en la red 1-Wire.

setSearchAllDevices: activa la bsqueda dentro de la red 1-Wire de todos los dispositivos 1-Wire, cuya condicin sea con alarma o sin alarma.

setSpeed: coloca una nueva velocidad a la transferencia de datos de la red 1-Wire.

targetFamily: Toma un entero a una bsqueda selectiva para el tipo de familia deseada.

OneWireContainer: esta clase encapsula a la clase DSPortAdapter, la direccin de la red 1-Wire y los mtodos para manipular dispositivos 1-Wire. Esta es una clase general que contiene los mtodos con las funciones bsicas de

78

comunicacin, la cual slo debe ser utilizada si algn dispositivo especfico no tiene una subclase disponible. Dicho de otro modo, existen 34 subclases que heredan de la clase OneWireContainer y cada una de ellas maneja funciones para determinadas familias de dispositivos 1-Wire, y dependiendo del tipo de dispositivo se selecciona la subclase especfica para ese dispositivo. En caso de no tener una subclase disponible para el dispositivo entonces si se recurre a utilizar la clase general OneWireContainer. El mtodo utilizado de esta clase fue:

getAddressAsString: obtiene la direccin (serial) del dispositivo 1-Wire que est siendo utilizado como una cadena de caracteres.

OneWireContainer41: Esta clase es una subclase de la clase OneWireContainer y la misma encapsula todas las funcionalidades de la familia 1-Wire del tipo 22, familia dentro de la cual entra el dispositivo iButtonHygrochron

DS1923. Algunas de las funciones de esta subclase son: programar alarmas de alta y baja temperatura, programar alarmas de alta y baja humedad, almacenar hasta 8192 medidas consecutivas de temperatura y humedad en una memoria de slo lectura no voltil, generador de CRC de 16 bits para verificar las operaciones de lectura, etc. Los mtodos utilizados de esta clase fueron:

clearMemory: borra la memoria del dispositivo.

doHumidityConvert: ejecuta la conversin de humedad

getDeviceSampleCount: lee el dispositivo y regresa el nmero total de muestras que ha registrado el dispositivo desde su primera activacin.

79

getHumidity: obtiene la humedad expresada en valor porcentual.

getMissionAlarm: regresa el valor del punto inicial en el cual se especific el disparo del tipo de alarma en un canal especfico.

getMissionAlarmEnable: regresa verdadero si la alarma del tipo especificada ha sido habilitada en un canal especfico.

getMissionChannelEnable: regresa verdadero si el canal de misin especificado est habilitado, indicando que las lecturas del canal pueden ser grabadas en la misin.

getMissionSample: regresa las muestras en grados centgrados si el canal de temperatura se ha especificado o como porcentaje de humedad relativa si el canal ha sido especificado.

getMissionSampleCount: regresa el nmero de muestras disponibles en el canal especificado durante la misin actual.

getMissionSampleRate: regresa el tiempo en segundos entre muestras tomadas durante la misin en curso.

getMissionSampleTimeStamp: regresa el tiempo en milisegundos en que cada muestra fue tomada durante la misin en curso.

getMissionTimeStamp: regresa el tiempo en milisegundos, en que comenz la misin.

80

getNumberMissionChannels: obtiene el nmero del canal soportado por el dispositivo.

hasHumidityAlarms: chequea si las medidas de humedad del dispositivo tiene disparo de alarmas alta y/o baja.

hasMissionRolloverOccurred: regresa verdadero si en la misin ha ocurrido rollover.

hasTemperatureAlarms: chequea si las medidas de temperatura del dispositivo tiene disparo de alarmas alta y/o baja.

isMissionRolloverEnable: regresa verdadero si el rollover est habilitado.

isMissionRunning: regresa verdadero si la misin est corriendo.

loadMissionResults: carga los resultados de la misin que est corriendo.

readDevice: recupera el estado del sensor del dispositivo 1-Wire.

setMissionAlarm: se establece el punto de ajuste donde se disparar el tipo de alarma especificada para canal indicado.

setMissionAlarmEnable: habilita o deshabilita la alarma especificada para el canal especfico.

setMissionResolution: Coloca la resolucin seleccionada para el canal especfico.

81

startNewMission: comienza una nueva misin en el dispositivo.

stopMission: detiene la misin que est corriendo en el dispositivo.

Adicionalmente se utilizaron las siguientes interfaces tambin contenidas en las 1-WireAPI.NET.

ClockContainer: esta interfaz es para ser implementada por aquellos dispositivos 1-Wire que poseen reloj de tiempo real. La misma soporta habilitar y colocar punto de ajuste en la alarma de reloj de los dispositivos, as como tambin habilitar y deshabilitar el reloj de los dispositivos. El mtodo utilizado de esta clase fue: getClock: Extrae el valor en tiempo real del reloj en milisegundos.

OneWireSensor: esta interfaz es la que permite identificar el estado en que se encuentra el dispositivo, facilitando de esta manera las funciones de lectura y escritura. Con ella se optimizan los recursos de llamada a direcciones de memoria necesarias para ejecutar una funcin especfica que requiera de esto en el dispositivo. Los mtodos utilizados de esta clase fueron:

readDevice: devuelve el estado del dispositivo 1-Wire.

writeDevice: escribe el estado del dispositivo 1-Wire, que haya sido cambiado por cualquier mtodo set.

A continuacin en la figura 4.8 se presenta un diagrama de clases del Control .NET, donde pueden observarse todas las clases e interfaces que fueron

82

utilizadas en el desarrollo del mismo. Cabe sealar, que la clase que representa al control .NET se llama HYGROCHRON.

Figura 4.8: Diagrama de Clases del control HYGROCHRON Fuente: Prada. V (2008)

83

4.6 Diagramas de interaccin Los diagramas de interaccin son aquellos que proporcionan una vista dinmica del sistema, stos son tiles para el programador en la fase de diseo, ya que le permiten visualizar las caractersticas dinmicas del software. Los diagramas de interaccin explican grficamente cmo los objetos interactan a travs de mensajes para realizar las tareas, y son el tercer paso del modelado con UML. Los diagramas de interaccin pueden ser de dos tipos: diagramas de colaboracin y diagramas de secuencias, ambos diagramas contienen exactamente la misma informacin pero representada de diferentes maneras, los primeros se organizan de acuerdo al espacio mientras que los segundos se organizan de acuerdo al tiempo.

4.6.1 Diagramas de colaboraciones

Los diagramas de colaboraciones permiten modelar a los objetos (instancias de las clases) de un sistema, as como la comunicacin y/o interaccin que realizan entre ellos, con la finalidad de satisfacer los requerimientos del sistema y as cumplir con los objetivos del mismo, en estos diagramas es importante conocer las responsabilidades de cada participante. A continuacin se representan los diagramas de colaboraciones correspondientes a cada uno de los casos de uso del control HYGROCHRON, los cuales van desde la figura 4.9 hasta la 4.12.

84

4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto 7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron 21: Cierra el puerto Interfaz Enumeration 6: Devolver identificador de estatus 1: Iniciar Misin por Defecto DSPortAdapter 10: Enviar datos del contenedor 3: Enviar datos del acceso al puerto y al adaptador :OneWireAccessProvider 2: Solicitar acceso al adaptador y al puerto seleccionado 19: Indica que se inici la Misin por Defecto 14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene 16: Establecer los valores por defecto en los parmetros del control 17: Limpiar la memoria del dispositivo 18: Inicia la misin
:OneWireContainer41

20: Cerrar el puerto

11: Enviar datos del contenedor en un enumerador

12: Obtener direccin del dispositivo

:HYGROCHRON

:OneWireContainer

13: Enviar datos del contenedor del primer Hygrochron encontrado

Figura 4.9: Diagrama de colaboraciones del caso de uso Iniciar Misin por Defecto Fuente: Prada. V (2008)

85

4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto 7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron 21: Cierra el puerto Interfaz Enumeration 6: Devolver identificador de estatus 1: Iniciar Nueva Misin 20: Cerrar el puerto DSPortAdapter 10: Enviar datos del contenedor 3: Enviar datos del acceso al puerto y al adaptador :OneWireAccessProvider 2: Solicitar acceso al adaptador y al puerto seleccionado 19: Indica que se inici la Nueva Misin 14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene 16: Establecer los valores deseados por el usuario en los parmetros del control 17: Limpiar la memoria del dispositivo 18: Inicia la misin
:OneWireContainer41

11: Enviar datos del contenedor en un enumerador

12: Obtener direccin del dispositivo

:HYGROCHRON

:OneWireContainer

13: Enviar datos del contenedor del primer Hygrochron encontrado

Figura 4.10: Diagrama de colaboraciones del caso de uso Iniciar Nueva Misin Fuente: Prada. V (2008)

86

4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto 7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron 18: Cierra el puerto Interfaz Enumeration 6: Devolver identificador de estatus DSPortAdapter 10: Enviar datos del contenedor 3: Enviar datos del acceso al puerto y al adaptador :OneWireAccessProvider 2: Solicitar acceso al adaptador y al puerto seleccionado 12: Obtener direccin del dispositivo

1: Detener Misin

17: Cerrar el puerto

11: Enviar datos del contenedor en un enumerador

:HYGROCHRON

:OneWireContainer

16: Indica que se detuvo la Misin

14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene

13: Enviar datos del contenedor del primer Hygrochron encontrado

:OneWireContainer41

Figura 4.11: Diagrama de colaboraciones del caso de uso Detener Misin Fuente: Prada. V (2008)

87

4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto 7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron 25: Cierra el puerto Interfaz Enumeration 6: Devolver identificador de estatus 1: Leer Datos de la Misin 24: Cerrar el puerto 2: Solicitar acceso al adaptador y al puerto seleccionado :HYGROCHRON 20: Enviar el tiempo en horas, minutos y segundos y la fecha de inicio de la misin DSPortAdapter 10: Enviar datos del contenedor 11: Enviar datos del contenedor en un enumerador 12: Obtener direccin del dispositivo

3: Enviar datos del acceso al puerto y al adaptador

:OneWireAccessProvider

:OneWireContainer

19: Convertir los milisegundos a horas, minutos, segundos, da, mes y ao

23: Enviar los valores de los parmetros y las muestras ledas

14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene 16: Cargar el contenedor de datos de la Misin 17: Leer parmetro por parmetro 21: Leer muestras de temperatura 22: Leer muestras de humedad

13: Enviar datos del contenedor del primer Hygrochron encontrado

:Date 18: Enviar el tiempo en milisegundos desde que se Inici la Misin

:OneWireContainer41

Figura 4.12: Diagrama de colaboraciones del caso de uso Leer Datos de la Misin Fuente: Prada. V (2008)

88

4.6.2 Diagramas de secuencias

Los diagramas de secuencia muestran la mecnica de la interaccin con base de tiempos, en ellos interesa conocer la secuencialidad de las acciones. Los diagramas de secuencia representan en el eje horizontal a los objetos individuales y en el eje vertical el tiempo. Seguidos a los diagramas de colaboraciones, se presentan los diagramas de secuencias de cada uno de los casos de uso del control HYGROCHRON, los cuales van desde la figura 4.13 hasta la 4.16.

1: Iniciar Misin por Defecto

2: Solicitar acceso al adaptador y al puerto seleccionado

3: Enviar datos del acceso al puerto y al adaptador

4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto

6: Devolver identificador del estatus

7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo los dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron

10: Enviar datos del contenedor

11: Enviar datos del contenedor en un enumerador

12: Obtener direccin del dispositivo 13: Enviar datos del contenedor del primer Hygrochron encontrado

19: Indica que se inici la Misin por Defecto

14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene 16: Establecer los valores por defecto en los parmetros del control 17: Limpiar la memoria del dispositivo 18: Inicia la misin

20: Cerrar el puerto 21: Cierra el puerto

Figura 4.13: Diagrama de secuencias del caso de uso Iniciar Misin por Defecto Fuente: Prada. V (2008)

1: Iniciar Nueva Misin 2: Solicitar acceso al adaptador y al puerto seleccionado 3: Enviar datos del acceso al puerto y al adaptador 4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto

6: Devolver identificador del estatus

7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo los dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron

10: Enviar datos del contenedor

11: Enviar datos del contenedor en un enumerador

12: Obtener direccin del dispositivo 13: Enviar datos del contenedor del primer Hygrochron encontrado

19: Indica que se inici la Nueva Misin

14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene 16: Establecer los valores por defecto en los parmetros del control 17: Limpiar la memoria del dispositivo 18: Inicia la misin

20: Cerrar el puerto 21: Cierra el puerto

Figura 4.14: Diagrama de secuencias del caso de uso Iniciar Nueva Misin Fuente: Prada. V (2008)

1: Detener Misin 2: Solicitar acceso al adaptador y al puerto seleccionado 3: Enviar datos del acceso al puerto y al adaptador

4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto

6: Devolver identificador del estatus 7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo los dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron

10: Enviar datos del contenedor 11: Enviar datos del contenedor en un enumerador

12: Obtener direccin del dispositivo

13: Enviar datos del contenedor del primer Hygrochron encontrado 16: Indica que se detuvo Misin

14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene

17: Cerrar el puerto 18: Cierra el puerto

Figura 4.15: Diagrama de secuencias del caso de uso Detener Misin Fuente: Prada. V (2008)

1: Leer Datos de la Misin

2: Solicitar acceso al adaptador y al puerto seleccionado

3: Enviar datos del acceso al puerto y al adaptador

4: Comenzar uso exclusivo del puerto 5: Ajustar la velocidad del puerto

6: Devolver identificador del estatus

7: Buscar todos los dispositivos 1-Wire presentes en la red 8: Seleccionar slo los dispositivos Hygrochron 9: Obtener todos los contenedores de los dispositivos Hygrochron

10: Enviar datos del contenedor

11: Enviar datos del contenedor en un enumerador

12: Obtener direccin del dispositivo 13: Enviar datos del contenedor del primer Hygrochron encontrado 14: Verificar el estatus de la misin 15: Si la misin est corriendo la detiene 16: Cargar el contenedor de datos de la misin 17: Leer parmetro por parmetro 18: Enviar el tiempo en ms desde que se inici la misin 21: Leer muestras de Temperatura 22: Leer muestras de Humedad 19: Convertir los milisegundos a horas, minutos, segundos, da, mes y ao

20: Enviar el tiempo en horas, minutos y segundos y la fecha de inicio de la misin

23: Enviar los valores de los parmetros y las muestras ledas

24: Cerrar el puerto

25: Cierra el puerto

Figura 4.16: Diagrama de secuencias del caso de uso Leer Datos de la Misin Fuente: Prada. V (2008)

93

4.7 Construccin del Control .NET Una vez elaborados los diagramas de UML, stos se tomaron como base para construir el control .NET, cumpliendo el mismo con todos los requerimientos planteados en un principio. La construccin de un control personalizado, como lo es el desarrollado en la presente investigacin, se deriva directamente del

System.Windows.Forms.Control. El primer paso para crearlo es abrir el Visual Studio 2005, seleccionar File (Archivo) y seguidamente New Project (Nuevo proyecto), tal y como se observa en la figura 4.17., seguidamente aparecer la ventana de la figura 4.18 y se selecciona la opcin WindowsControlLibrary (Libreras de controles).

Figura 4.17: Pantalla inicial para crear el control .NET Fuente: Prada. V (2008)

94

Figura 4.18: Ventana para seleccionar la creacin de un control .NET Fuente: Prada. V (2008)

Al seleccionar esta opcin, se crea el control en el cual se desarrolla el cdigo fuente, y la ventana se ve como se muestra en la figura 4.19. El rectngulo gris ubicado en la esquina superior izquierda es el control creado, para agregarle una imagen al mismo se debe utilizar la propiedad BackgroundImage que se observa en la esquina inferior derecha y seleccionar la imagen

deseada. Igualmente para colocarle el nombre deseado al control se ubica en la esquina superior derecha, donde se encuentra UserControl1.vb y se le cambia el nombre. La imagen seleccionada para el control fue una fotografa del dispositivo iButton Hygrochron, al seleccionar esta imagen la figura 4.19 se transforma en la figura 4.20. Igualmente se observa que el nombre que se le coloc al control fue HYGROCHRON y en la figura 4.21 se observa una imagen ampliada del control creado.

95

Figura 4.19: Ventana con el control .NET creado Fuente: Prada. V (2008)

Figura 4.20: Ventana con la imagen y el nombre del control .NET creado Fuente: Prada. V (2008)

96

Figura 4.21: Imagen del control .NET creado Fuente: Prada. V (2008)

Una vez realizados estos pasos, se hace doble click sobre la imagen del control y aparece la pantalla de programacin donde se escribi el cdigo fuente del control .NET. Para el desarrollo del cdigo fuente se utilizaron los diagramas de especificaciones UML, junto con las clases e interfaces seleccionadas de las 1-Wire API.NET y las especificaciones del dispositivo iButton Hygrochron.

4.8 Descripcin del control .NET

El Control .NET construido en esta investigacin se encuentra dividido en siete partes, las cuales, se mencionan a continuacin:

Definicin de variables: se encuentra formado por el conjunto de variables necesarias para la construccin del Control .NET.

Definicin de constantes: en esta seccin se definen las constantes que tienen un valor de resolucin dado por el fabricante.

97

Definicin de contenedores: se encuentra formado por el conjunto de clases de las 1-Wire API.NET y algunas libreras de Java, que se definen como variables y son indispensables para la construccin del Control .NET.

Definicin de eventos: se encuentran definidos tres eventos, los cuales son: inicio de misin, fin de misin y ocurri un error.

Propiedades del Control: como su nombre lo indica son todas las propiedades que posee el control. Estas pueden ser de slo lectura (R), de lectura y escritura (R/W)

Mtodos del Control: son todas las funciones que puede realizar el control.

Otros: representado por cualquier otra funcin ligada al control, diferentes a las contenidas en mtodos del control, que para este caso en particular es slo la funcin resize, con un ancho y alto preestablecido, no permitiendo al usuario cambiar el tamao del control.

4.8.1 Descripcin de las propiedades del control .NET

Puerto (R/W): esta propiedad permite establecer que tipo de puerto se va a utilizar: COM, USB o paralelo, y el nmero de puerto a travs del cual se va a establecer la comunicacin entre el PC y la red 1-Wire.

98

Adaptador (R/W): esta propiedad permite establecer el tipo de adaptador a utilizar para comunicarse con la red 1-Wire, estos pueden ser DS9097U, DS9490 DS1410.

Seriales: es un arreglo de mximo 10 seriales de hasta 10 dispositivos hygrochron encontrados en la red 1-Wire.

Resolucin de Temperatura (R/W): indica el valor de la resolucin de temperatura los cuales son: 0,5 C para la baja y 0,0625 C para la alta.

Resolucin de Humedad (R/W): indica el valor de la resolucin de humedad los cuales son: 0,6 %RH para la baja y 0,04 %RH para la alta.

Tiempo entre muestras (R/W): indica el tiempo que existe entre cada muestra durante la misin.

Nmero total de muestras (R): indica el nmero total de muestras que ha tomado el dispositivo desde que se activ por primera vez.

Serial (R): regresa el serial del primer dispositivo hygrochron que se encuentran en la red 1-Wire.

Muestras en misin (R): indica el nmero total de muestras tomadas durante una misin.

Tipo de error (R): indica el error que ha sucedido bien sea de comunicacin con la red 1-Wire o de referencia por parte del usuario.

99

Corriendo misin (R/W): indica el estatus de la misin, es decir, si est activa o inactiva.

Estado del rollover (sobreescritura) (R/W): indica si el mismo est activo inactivo. Si est activo, una vez que llegue al nmero total de muestras que puede almacenar el hygrochron comenzar a almacenar las nuevas muestras sobre las ya existentes, mientras que si se encuentra inactivo al llegar al nmero total de muestras que puede almacenar el hygrochron no contina almacenando ms muestras aunque la misin contine corriendo.

Rollover accionado (R): indica si ha ocurrido rollover durante la misin.

Alarma de humedad accionada (R): indica si ha ocurrido una alarma de humedad.

Alarma de temperatura accionada (R): indica si ha ocurrido una alarma de temperatura.

Activar la alarma de temperatura alta (R/W): permite activar una alarma para un valor alto de temperatura determinado por el usuario.

Activar la alarma de temperatura baja (R/W): permite activar una alarma para un valor bajo de temperatura determinado por el usuario.

Activar la alarma de humedad alta (R/W): permite activar una alarma para un valor alto de humedad determinado por el usuario.

100

Activar la alarma de humedad baja (R/W): permite activar una alarma para un valor bajo de humedad determinado por el usuario.

Alarma alta de Temperatura (R/W): indica el valor de la alarma alta de temperatura.

Alarma baja de Temperatura (R/W): indica el valor de la alarma baja de temperatura.

Alarma alta de Humedad (R/W): indica el valor de la alarma alta de humedad.

Alarma baja de Humedad (R/W): indica el valor de la alarma baja de humedad.

Temperatura actual (R): indica el valor de la temperatura del dispositivo mientras no se encuentre corriendo una misin.

Humedad actual (R): indica el valor de la humedad del dispositivo mientras no se encuentre corriendo una misin.

Segundos del RTC (Real Time Clock) (R/W): indica el valor de los segundos que contiene el Reloj de tiempo real que posee el dispositivo.

Minutos del RTC (Real Time Clock) (R/W): indica el valor de los minutos que contiene el Reloj de tiempo real que posee el dispositivo.

101

Hora del RTC (Real Time Clock) (R/W): indica el valor de la hora que contiene el Reloj de tiempo real que posee el dispositivo.

Fecha del RTC (Real Time Clock) (R/W): indica la fecha que contiene el Reloj de tiempo real que posee el dispositivo.

Mes del RTC (Real Time Clock) (R/W): indica el mes que contiene el Reloj de tiempo real que posee el dispositivo.

Ao del RTC (Real Time Clock) (R/W): indica el ao que contiene el Reloj de tiempo real que posee el dispositivo.

4.8.2 Descripcin de los mtodos del control .NET

Abrir Puerto: este mtodo solicita al PC el inicio del enlace de comunicacin entre el software y el hardware.

Cerrar Puerto: est mtodo libera el uso exclusivo del puerto una vez que el mismo ya no est siendo utilizado.

Buscar dispositivos: este mtodo devuelve el nmero de dispositivos hygrochron que encuentran en la red 1-Wire y almacena los seriales de cada uno de ellos en la propiedad seriales.

Auto Buscar Puerto: por medio de ste mtodo se recorre cada uno de los puertos, verifica si hay error y si lo hay desecha el puerto, hasta conseguir un puerto disponible para establecer la comunicacin 1-Wire.

102

Actualizar: este mtodo se encarga de actualizar las propiedades del dispositivo hygrochron seleccionado.

Detener Misin: este mtodo se encarga de detener la misin que se encuentra corriendo en el dispositivo hygrochron seleccionado.

Iniciar Misin con Valores por Defecto: este mtodo se encarga de iniciar una misin con valores definidos por defecto en el dispositivo hygrochron seleccionado, tomando como valores por defecto los que tena predefinidos el dispositivo en la misin anterior.

Iniciar Nueva Misin: a diferencia del mtodo anterior los parmetros necesarios para crear una nueva misin deben ser asignados por el usuario junto con el llamado de la funcin y no corresponden a los valores definidos por defecto.

Cargar Misin: este mtodo se encarga de leer todos los datos obtenidos durante la misin.

Leer Temperatura: este mtodo se encarga de leer la temperatura en tiempo real del hygrochron seleccionado, pero slo devuelve valor si la misin no est corriendo.

Leer Humedad: este mtodo se encarga de leer la humedad en tiempo real del hygrochron seleccionado, pero slo devuelve valor si la misin no est corriendo.

103

Leer el Reloj del Dispositivo: este mtodo se encarga de leer el estado del reloj de tiempo real que posee internamente el dispositivo hygrochron seleccionado.

Sincronizar Reloj del Dispositivo: se encarga de escribir el valor deseado al reloj de tiempo real del dispositivo hygrochron seleccionado.

Leer muestra de Temperatura: este mtodo se encarga de leer el valor de una muestra de temperatura siempre y cuando la misin est detenida para el dispositivo hygrochron seleccionado.

Leer muestra de Humedad: este mtodo se encarga de leer el valor de una muestra de humedad siempre y cuando la misin est detenida para el dispositivo hygrochron seleccionado.

Leer Hora de Muestras: este mtodo permite leer la hora en que fue tomada cada muestra de la misin.

Finalmente, el control construido es una clase con sus propiedades, mtodos y eventos, los cuales se muestran en las figuras 4.22, 4.23 y 4.24 respectivamente.

104

Figura 4.22: Clase HYGROCHRON con todas sus propiedades Fuente: Prada. V (2008)

105

Figura 4.23: Clase HYGROCHRON con todos sus mtodos Fuente: Prada. V (2008)

Figura 4.24: Clase HYGROCHRON con sus eventos Fuente: Prada. V (2008)

4.9 Cdigo fuente del control .NET


#Region "DEFINICION DE VARIABLES" Private Private Private Private Public Private Private Private PUERTO_SELECCIONADO As String Puerto_Encontrado_Auto As String TIPO_ADAPTADOR As String ADAPTADOR_Encontrado_Auto As String SERIALES(10) As String TIPO_ERROR As String Estatus_de_mision As Boolean estatus_de_rollover As Boolean

106

Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private

Estatus_de_alarma_alta_temp As Boolean Estatus_de_alarma_Baja_temp As Boolean Estatus_de_alarma_alta_humedad As Boolean Estatus_de_alarma_baja_humedad As Boolean TIEMPO_ENTRE_MUESTRAS As Integer MUESTRAS_EN_MISION As Integer Resoluc_Temperatura As Double Resoluc_Humedad As Double Numero_Total_de_Muestras As Double Puerto_Abierto As String ALARMATEMPALTA As Double ALARMATEMPBAJA As Double ALARMAHUMALTA As Double ALARMAHUMBAJA As Double Tiempo_De_Inicio As Integer Sincronizar_rtc As Boolean canal_de_temperatura As Boolean canal_de_humedad As Boolean

Private Estadotemp() As SByte Public Temperaturaanterior As String Private humedadanterior As Double Private estado() As SByte Private Rollover_Accionado As Boolean Private Alarma_Humedad_Accionada As Boolean Private Alarma_Temperatura_Accionada As Boolean Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private VARSEG As Long VARSEGUNDOS As Integer VARMINUTOS As Integer VARHORA As Integer VARFECHA As Integer VARMESES As Integer VARAOS As Integer state(32) As System.SByte milmis As Long VARSEGUNDOSMIS As Integer VARMINUTOSMIS As Integer VARHORAMIS As Integer VARFECHAMIS As Integer VARMESESMIS As Integer VARAOSMIS As Integer

Private miltemp As Long Private tiempo_muestra_temperatura As String Private milhum As Long Private tiempo_muestra_humedad As String Private CONTADOR As Byte Dim PUERTO_CONTADOR As String Public prueba_memoria(512) As SByte

107

#End Region

#Region "Constantes" Public Const Resolucion_Baja_Temperatura As Double = 0.5 Public Const Resolucion_Baja_Humedad As Double = 0.6 Public Const Resolucion_Alta_Temperatura As Double = 0.0625 Public Const Resolucion_Alta_Humedad As Double = 0.04 #End Region #Region "DEFINICION DE CONTENEDORES" Public adapter As com.dalsemi.onewire.adapter.DSPortAdapter Private owd_enum As java.util.Enumeration Private util As java.util.Date Private owd As com.dalsemi.onewire.container.OneWireContainer Private ows As com.dalsemi.onewire.container.OneWireSensor Private c41 As com.dalsemi.onewire.container.OneWireContainer41 Private cc As com.dalsemi.onewire.container.ClockContainer Private dt As java.util.Date Private dtmis As java.util.Date Private dttemp As java.util.Date Private dthum As java.util.Date Private dtold As java.util.Date Private dtnew As java.util.Date #End Region #Region "DEFINICION DE EVENTOS" Public Event Inicio_Mision() Public Event Fin_Mision() Public Event Ocurrio_Error() #End Region #Region "PROPIEDADES DEL CONTROL" #Region "Puerto" <System.ComponentModel.Category("Comunicacin"), System.ComponentModel.Description("Indica el Nmero del Puerto a Utilizar para la comunicacin 1-wire")> Public Property Puerto() As String Get Return PUERTO_SELECCIONADO End Get Set(ByVal value As String) If TIPO_ADAPTADOR = ("{DS9097U}") Or TIPO_ADAPTADOR = Nothing Then PUERTO_SELECCIONADO = "COM" + value ElseIf TIPO_ADAPTADOR = ("{DS9490}") Then PUERTO_SELECCIONADO = "USB" + value ElseIf TIPO_ADAPTADOR = ("{DS1410E}") Then PUERTO_SELECCIONADO = "LPT" + value End If End Set End Property #End Region

108

#Region "Puerto Encontrado" <System.ComponentModel.Description("Indica el Nmero del Puerto Encontrado por la Funcin Auto Buscar Puerto")> Public ReadOnly Property Puerto_Encontrado() As String Get Return Puerto_Encontrado_Auto End Get End Property #End Region #Region "Adaptador Encontrado" <System.ComponentModel.Description("Indica el adaptador Encontrado por la Funcin Auto Buscar Puerto ")> Public ReadOnly Property Adaptador_Encontrado() As String Get Return ADAPTADOR_Encontrado_Auto End Get End Property #End Region #Region "Adaptador" <System.ComponentModel.Category("Comunicacion"), System.ComponentModel.Description("Indica el tipo de adaptador a utilizar para comunicarse con la red 1-Wire")> Public Property Adaptador() As String Get Return TIPO_ADAPTADOR End Get Set(ByVal value As String) If UCase(value) = ("SERIAL") Then TIPO_ADAPTADOR = "{DS9097U}" ElseIf UCase(value) = ("USB") Then TIPO_ADAPTADOR = "{DS9490}" ElseIf UCase(value) = ("PARALELO") Then TIPO_ADAPTADOR = "{DS1410E}" End If End Set End Property #End Region #Region "Resolucin de Temperatura" <System.ComponentModel.Category("Comunicacin"), System.ComponentModel.Description("Indica la resolucin de temperatura a utilizar")> Public Property Resolucion_Temperatura() As Double Get Return Resoluc_Temperatura End Get Set(ByVal value As Double) Resoluc_Temperatura = value

109

End Set End Property #End Region #Region "Resolucion de Humedad" <System.ComponentModel.Category("Comunicacin"), System.ComponentModel.Description("Indica la resolucin de Humedad a utilizar")> Public Property Resolucion_Humedad() As Double Get Return Resoluc_Humedad End Get Set(ByVal value As Double) Resoluc_Humedad = value End Set End Property #End Region #Region "Tiempo entre Muestras" <System.ComponentModel.Description("Indica el Tiempo entre cada Muestra en la Misin")> Public Property Sample_Rate() As Integer Get Return TIEMPO_ENTRE_MUESTRAS End Get Set(ByVal value As Integer) TIEMPO_ENTRE_MUESTRAS = value End Set End Property #End Region #Region "Activar Canal de Temperatura " <System.ComponentModel.Description("Activa el Muestreo de temperatura")> Public Property Canal_de_Temperatura_activo() As Boolean Get Return canal_de_temperatura End Get Set(ByVal value As Boolean) canal_de_temperatura = value End Set End Property #End Region #Region "Activar Canal de Humedad" <System.ComponentModel.Description("Activa el Muestreo de Humedad")> Public Property Canal_de_Humedad_activo() As Boolean Get Return canal_de_humedad End Get Set(ByVal value As Boolean) canal_de_humedad = value End Set End Property #End Region #Region "Numero Total de Muestras"

110

<System.ComponentModel.Description("Indica cantidad total de muestras tomadas durante la vida del dispositivo")> Public ReadOnly Property Numero_Muestras_total() As Integer Get Return Numero_Total_de_Muestras End Get End Property #End Region #Region "Serial" <System.ComponentModel.Description("Indica el serial del dispositivo 1-Wire")> Public Property Direccion() As String Get Return SERIALES(0) End Get Set(ByVal value As String) SERIALES(0) = value End Set End Property #End Region #Region "Muestras en Misin" <System.ComponentModel.Description("Indica la cantidad de muestras tomadas durante la misin")> Public ReadOnly Property Numero_Muestras_Mision() As Integer Get Return MUESTRAS_EN_MISION End Get End Property #End Region #Region "Tipo de Error" <System.ComponentModel.Description("Indica el error que ha sucedido durante la comunicacin")> Public ReadOnly Property Errores() As String Get Return TIPO_ERROR End Get End Property #End Region #Region "Corriendo Misin" Public ReadOnly Property Corriendo_Mision() As Boolean Get Return Estatus_de_mision End Get End Property #End Region #Region "Estatus de Rollover" Public ReadOnly Property Rollover_Activo() As Boolean Get Return estatus_de_rollover End Get End Property #End Region

111

#Region "Rollover Accionado" Public Property Ha_Ocurrido_Rollover() As Boolean Get Return Rollover_Accionado End Get Set(ByVal value As Boolean) Rollover_Accionado = value End Set End Property #End Region #Region "Alarma de Humedad Accionada" Public Property Ha_Ocurrido_Alarma_Humedad() As Boolean Get Return Alarma_Humedad_Accionada End Get Set(ByVal value As Boolean) Alarma_Humedad_Accionada = value End Set End Property #End Region #Region "Alarma de Temperatura Accionada" Public Property Ha_Ocurrido_Alarma_Temperatura() As Boolean Get Return Alarma_Temperatura_Accionada End Get Set(ByVal value As Boolean) Alarma_Temperatura_Accionada = value End Set End Property #End Region #Region "Activar Alarma alta de temperatura" Public Property Alarma_Alta_Temperatura_Ativa() As Boolean Get Return Estatus_de_alarma_alta_temp End Get Set(ByVal value As Boolean) Estatus_de_alarma_alta_temp = value End Set End Property #End Region #Region "Activar Alarma baja de temperatura" Public Property Alarma_Baja_Temperatura_Ativa() As Boolean Get Return Estatus_de_alarma_Baja_temp End Get Set(ByVal value As Boolean) Estatus_de_alarma_Baja_temp = value End Set End Property #End Region #Region "Activar Alarma alta de Humedad"

112

Public Property Alarma_Alta_Humedad_Ativa() As Boolean Get Return Estatus_de_alarma_alta_humedad End Get Set(ByVal value As Boolean) Estatus_de_alarma_alta_humedad = value End Set End Property #End Region #Region "Activar Alarma baja de Humedad" Public Property Alarma_Baja_Humedad_Ativa() As Boolean Get Return Estatus_de_alarma_baja_humedad End Get Set(ByVal value As Boolean) Estatus_de_alarma_baja_humedad = value End Set End Property #End Region #Region "Alarma Alta de Temperatura" Public Property Alarma_Alta_Temperatura() As Double Get Return ALARMATEMPALTA End Get Set(ByVal value As Double) ALARMATEMPALTA = value End Set End Property #End Region #Region "Alarma Baja de Temperatura" Public Property Alarma_Baja_Temperatura() As Double Get Return ALARMATEMPBAJA End Get Set(ByVal value As Double) ALARMATEMPBAJA = value End Set End Property #End Region #Region "Alarma Alta de Humedad" Public Property Alarma_Alta_Humedad() As Double Get Return ALARMAHUMALTA End Get Set(ByVal value As Double) ALARMAHUMALTA = value End Set End Property #End Region #Region "Alarma Baja de Humedad" Public Property Alarma_Baja_Humedad() As Double

113

Get Return ALARMAHUMBAJA End Get Set(ByVal value As Double) ALARMAHUMBAJA = value End Set End Property #End Region #Region "Temperatura Actual" Public ReadOnly Property Temperatura_Actual() As Double Get Return temperaturaanterior End Get End Property #End Region #Region "Humedad Actual" Public ReadOnly Property Humedad_Actual() As Double Get Return humedadanterior End Get End Property #End Region #Region "Segundos del RTC" <System.ComponentModel.Description("Indica Los segundos del RTC del Dispostivo")> Public Property Segundos() As Integer Get Return VARSEGUNDOS End Get Set(ByVal value As Integer) VARSEGUNDOS = value End Set End Property #End Region #Region "Minutos del RTC" <System.ComponentModel.Description("Indica Los Minutos del RTC del Dispostivo")> Public Property Minutos() As Integer Get Return VARMINUTOS End Get Set(ByVal value As Integer) VARMINUTOS = value End Set End Property #End Region #Region "Hora del RTC" <System.ComponentModel.Description("Indica La hora del RTC del Dispostivo")> Public Property Hora() As Integer Get Return VARHORA End Get Set(ByVal value As Integer)

114

VARHORA = value End Set End Property #End Region #Region "Fecha del RTC" <System.ComponentModel.Description("Indica La fecha del RTC del Dispostivo")> Public Property Fecha() As Integer Get Return VARFECHA End Get Set(ByVal value As Integer) VARFECHA = value End Set End Property #End Region #Region "Mes del RTC" <System.ComponentModel.Description("Indica El Mes del RTC del Dispostivo")> Public Property Mes() As Integer Get Return VARMESES End Get Set(ByVal value As Integer) VARMESES = value End Set End Property #End Region #Region "Ao del RTC" <System.ComponentModel.Description("Indica El ao del RTC del Dispostivo")> Public Property Ao() As Integer Get Return VARAOS End Get Set(ByVal value As Integer) VARAOS = value End Set End Property #End Region #Region "Segundos desde Inicio de Mision" <System.ComponentModel.Description("Indica Los segundos en que se Inici la Misin")> Public Property Segundos_Inicio_Mision() As Integer Get Return VARSEGUNDOSMIS End Get Set(ByVal value As Integer) VARSEGUNDOSMIS = value End Set End Property #End Region #Region "Minutos desde Inicio de Misin"

115

<System.ComponentModel.Description("Indica Los Minutos en que se Inici la Misin")> Public Property Minutos_Inicio_Mision() As Integer Get Return VARMINUTOSMIS End Get Set(ByVal value As Integer) VARMINUTOSMIS = value End Set End Property #End Region #Region "Hora desde Inicio de Misin" <System.ComponentModel.Description("Indica La hora en que se Inici la Misin")> Public Property Hora_Inicio_Mision() As Integer Get Return VARHORAMIS End Get Set(ByVal value As Integer) VARHORAMIS = value End Set End Property #End Region #Region "Fecha en que se Inici la Misin" <System.ComponentModel.Description("Indica La fecha en que se Inici la Misin")> Public Property Fecha_Inicio_Mision() As Integer Get Return VARFECHAMIS End Get Set(ByVal value As Integer) VARFECHAMIS = value End Set End Property #End Region #Region "Mes en que se Inici la Misin" <System.ComponentModel.Description("Indica El Mes en que se Inici la Misin")> Public Property Mes_Inicio_Mision() As Integer Get Return VARMESESMIS End Get Set(ByVal value As Integer) VARMESESMIS = value End Set End Property #End Region #Region "Ao en que se Inici la Misin" <System.ComponentModel.Description("Indica El ao en que se Inici la Misin")> Public Property Ao_Inicio_Mision() As Integer Get Return VARAOSMIS End Get

116

Set(ByVal value As Integer) VARAOSMIS = value End Set End Property #End Region #End Region #Region "METODOS DEL CONTROL" #Region "Abrir Puerto" Function Abrir_Puerto() As Boolean Try adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter(TIPO_ADAPTADO R, PUERTO_SELECCIONADO) adapter.beginExclusive(True) adapter.setSpeed(com.dalsemi.onewire.adapter.DSPortAdapter.SPEED_R EGULAR) Abrir_Puerto = True Puerto_Abierto = "Puerto Abierto" Catch ex As com.dalsemi.onewire.OneWireException Abrir_Puerto = False If TIPO_ADAPTADOR = Nothing Or PUERTO_SELECCIONADO = Nothing Then TIPO_ERROR = "Error: Debe indicar el Tipo de adaptador y puerto a utilizar" Else TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End If End Try End Function #End Region #Region "Cerrar Puerto" Function Cerrar_Puerto() As Boolean Try If Puerto_Abierto <> Nothing Then adapter.endExclusive() adapter.freePort() Cerrar_Puerto = True End If Catch ex As com.dalsemi.onewire.OneWireException Cerrar_Puerto = False TIPO_ERROR = "Error: " & ex.ToString End Try End Function #End Region #Region "Buscar Dispositivos" Public Function Buscar_Dispositivos() As Integer Dim contador As Integer Try If Puerto_Abierto <> Nothing Then

117

adapter.beginExclusive(True) adapter.setSearchAllDevices() 'Elimina cualquier selectividad dentro de la busqueda de las familias 1-wire adapter.targetFamily(&H41) 'Ajusta la velocidad de comunicacion de la red 1wire 'Agrega todos los contenedores .net de los dispositivos encontrados en la red owd_enum = adapter.getAllDeviceContainers 'Enumera todos los dispositivos 1-Wire encontrados (con el estilo de enumeracion de Java) contador = 0 While owd_enum.hasMoreElements() owd = owd_enum.nextElement() If TypeOf owd Is com.dalsemi.onewire.container.HumidityContainer Then SERIALES(contador) = owd.getAddressAsString contador = contador + 1 End If End While If contador > 0 Then owd = adapter.getFirstDeviceContainer c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) humedad = CType(owd, com.dalsemi.onewire.container.HumidityContainer) End If Buscar_Dispositivos = contador End If Catch ex As com.dalsemi.onewire.OneWireException If TIPO_ADAPTADOR = Nothing Or PUERTO_SELECCIONADO = Nothing Then TIPO_ERROR = "Error: Debe indicar el Tipo de adaptador y puerto a utilizar" Else TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End If End Try End Function #End Region #Region "Auto_Buscar_Puertos" Function Auto_Buscar_Puertos() As Boolean Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "COM" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9097U}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9097U}" Puerto_Encontrado_Auto = CONTADOR

118

ADAPTADOR_Encontrado_Auto = "SERIAL" Exit Function Catch ex As Exception Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "COM" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9097U}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9097U}" Puerto_Encontrado_Auto = CONTADOR ADAPTADOR_Encontrado_Auto = "SERIAL" Exit Function Catch ex2 As Exception Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "COM" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9097U}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9097U}" Puerto_Encontrado_Auto = CONTADOR ADAPTADOR_Encontrado_Auto = "SERIAL" Exit Function Catch ex3 As Exception Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "COM" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9097U}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9097U}" Puerto_Encontrado_Auto = CONTADOR ADAPTADOR_Encontrado_Auto = "SERIAL" Exit Function Catch ex4 As Exception Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "COM" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9097U}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9097U}" Puerto_Encontrado_Auto = CONTADOR ADAPTADOR_Encontrado_Auto = "SERIAL" Exit Function Catch ex5 As Exception Auto_Buscar_Puertos = False

119

TIPO_ERROR = "Error: " & ex5.ToString RaiseEvent Ocurrio_Error() End Try End Try End Try End Try End Try CONTADOR = 0 Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "USB" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9490}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9490}" Puerto_Encontrado_Auto = CONTADOR ADAPTADOR_Encontrado_Auto = "USB" Exit Function Catch ex As Exception Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "USB" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9490}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9490}" Puerto_Encontrado_Auto = CONTADOR ADAPTADOR_Encontrado_Auto = "USB" Exit Function Catch ex2 As Exception Try CONTADOR = CONTADOR + 1 PUERTO_CONTADOR = "USB" & CONTADOR adapter = com.dalsemi.onewire.OneWireAccessProvider.getAdapter("{DS9490}", PUERTO_CONTADOR) Auto_Buscar_Puertos = True PUERTO_SELECCIONADO = PUERTO_CONTADOR TIPO_ADAPTADOR = "{DS9490}" Puerto_Encontrado_Auto = CONTADOR ADAPTADOR_Encontrado_Auto = "USB" Exit Function Catch ex3 As Exception Auto_Buscar_Puertos = False TIPO_ERROR = "Error: " & ex3.ToString RaiseEvent Ocurrio_Error() End Try End Try End Try End Function #End Region

120

#Region "Actualizar" Function Actualizar() Try If Puerto_Abierto <> Nothing Then adapter.beginExclusive(True) owd = adapter.getDeviceContainer(SERIALES(0)) humedad = CType(owd, com.dalsemi.onewire.container.HumidityContainer) c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) Estatus_de_mision = c41.isMissionRunning() c41.loadMissionResults() Estatus_de_alarma_alta_temp = c41.getMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.TEMPERATURE_CHANNEL, 1) Estatus_de_alarma_Baja_temp = c41.getMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.TEMPERATURE_CHANNEL, 0) Estatus_de_alarma_alta_humedad = c41.getMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.DATA_CHANNEL, 1) Estatus_de_alarma_baja_humedad = c41.getMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.DATA_CHANNEL, 0) ALARMATEMPALTA = c41.getMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.TEMPERATURE_CHANNEL, 1) ALARMATEMPBAJA = c41.getMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.TEMPERATURE_CHANNEL, 0) ALARMAHUMALTA = c41.getMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.DATA_CHANNEL, 1) ALARMAHUMBAJA = c41.getMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.DATA_CHANNEL, 0) TIEMPO_ENTRE_MUESTRAS = c41.getMissionSampleRate(c41.getNumberMissionChannels() - 1) MUESTRAS_EN_MISION = c41.getMissionSampleCount(c41.getNumberMissionChannels() - 1) Numero_Total_de_Muestras = CType(c41.getDeviceSampleCount(), Double) estatus_de_rollover = c41.isMissionRolloverEnabled() Rollover_Accionado = c41.hasMissionRolloverOccurred Alarma_Humedad_Accionada = c41.hasHumidityAlarms Alarma_Temperatura_Accionada = c41.hasTemperatureAlarms 'Procedimiento para leer fecha de inicio de mision milmis = c41.getMissionTimeStamp(0)

121

dtmis = New java.util.Date(milmis) VARHORAMIS = dtmis.getHours.ToString VARMINUTOSMIS = dtmis.getMinutes.ToString VARSEGUNDOSMIS = dtmis.getSeconds.ToString VARAOSMIS = dtmis.getYear + 1900 VARMESESMIS = dtmis.getMonth + 1 VARFECHAMIS = dtmis.getDate.ToString canal_de_humedad = c41.getMissionChannelEnable(1) canal_de_temperatura = c41.getMissionChannelEnable(0) adapter.beginExclusive(False) End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() Finally Actualizar = Nothing End Try End Function #End Region #Region "Detener Misin" Function Detener_Mision() As Boolean Try If Puerto_Abierto <> Nothing Then owd = adapter.getDeviceContainer(SERIALES(0)) c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) c41.stopMission() If c41.isMissionRunning() = False Then RaiseEvent Fin_Mision() Detener_Mision = True Else Detener_Mision = False End If Timer1.Enabled = True End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = ex.ToString RaiseEvent Ocurrio_Error() End Try End Function #End Region #Region "Iniciar Misin Con Valores Por Defecto" Function Iniciar_Mision_Por_Defecto() As Boolean Dim channel_enabled(0) As Boolean Dim MISION_INICIADA As Boolean Try If Puerto_Abierto <> Nothing Then

122

owd = adapter.getDeviceContainer(SERIALES(0)) c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) If c41.isMissionRunning = False Then c41.setMissionResolution(com.dalsemi.onewire.container.OneWireCont ainer41.TEMPERATURE_CHANNEL, Resoluc_Temperatura) c41.setMissionResolution(com.dalsemi.onewire.container.OneWireCont ainer41.DATA_CHANNEL, Resoluc_Humedad) If Alarma_Alta_Temperatura_Ativa <> Nothing Then If Alarma_Alta_Temperatura_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.TEMPERATURE_CHANNEL, 1, ALARMATEMPALTA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.TEMPERATURE_CHANNEL, 1, Alarma_Alta_Temperatura_Ativa) End If If Alarma_Baja_Temperatura_Ativa <> Nothing Then If Alarma_Baja_Temperatura_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.TEMPERATURE_CHANNEL, 0, ALARMATEMPBAJA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.TEMPERATURE_CHANNEL, 0, Alarma_Baja_Temperatura_Ativa) End If If Alarma_Alta_Humedad_Ativa <> Nothing Then If Alarma_Alta_Humedad_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.DATA_CHANNEL, 1, ALARMAHUMALTA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.DATA_CHANNEL, 1, Alarma_Alta_Humedad_Ativa) End If If Alarma_Baja_Humedad_Ativa <> Nothing Then If Alarma_Baja_Humedad_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.DATA_CHANNEL, 0, ALARMAHUMBAJA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.DATA_CHANNEL, 0, Alarma_Baja_Humedad_Ativa)

123

End If Array.Resize(channel_enabled, c41.getNumberMissionChannels()) channel_enabled(0) = canal_de_temperatura channel_enabled(1) = canal_de_humedad If TIEMPO_ENTRE_MUESTRAS = Nothing Then TIEMPO_ENTRE_MUESTRAS = 10 End If If Tiempo_De_Inicio = Nothing Then Tiempo_De_Inicio = 0 End If If estatus_de_rollover = Nothing Then estatus_de_rollover = False End If c41.clearMemory() c41.startNewMission(TIEMPO_ENTRE_MUESTRAS, Tiempo_De_Inicio, estatus_de_rollover, Sincronizar_rtc, channel_enabled) MISION_INICIADA = c41.isMissionRunning() If MISION_INICIADA = True Then Estatus_de_mision = True RaiseEvent Inicio_Mision() Iniciar_Mision_Por_Defecto = True Else Estatus_de_mision = False TIPO_ERROR = "Error al Iniciar la Misin" Iniciar_Mision_Por_Defecto = False End If End If Else TIPO_ERROR = "Esta Corriendo Una Misin" RaiseEvent Ocurrio_Error() End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = ex.ToString RaiseEvent Ocurrio_Error() End Try End Function #End Region #Region "Iniciar Nueva Misin" Function Iniciar_Nueva_Mision(ByVal Sample_Rate As Integer, ByVal Fecha_de_Inicio As Integer, ByVal Rollover_Activo As Boolean, ByVal Sincronizar_Reloj As Boolean) As Boolean Dim channel_enabled(0) As Boolean Dim MISION_INICIADA As Boolean Try owd = adapter.getDeviceContainer(SERIALES(0)) c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) c41.setMissionResolution(com.dalsemi.onewire.container.OneWireCont ainer41.TEMPERATURE_CHANNEL, Resoluc_Temperatura)

124

c41.setMissionResolution(com.dalsemi.onewire.container.OneWireCont ainer41.DATA_CHANNEL, Resoluc_Humedad) If Alarma_Alta_Temperatura_Ativa <> Nothing Then If Alarma_Alta_Temperatura_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.TEMPERATURE_CHANNEL, 1, ALARMATEMPALTA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.TEMPERATURE_CHANNEL, 1, Alarma_Alta_Temperatura_Ativa) End If If Alarma_Baja_Temperatura_Ativa <> Nothing Then If Alarma_Baja_Temperatura_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.TEMPERATURE_CHANNEL, 0, ALARMATEMPBAJA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.TEMPERATURE_CHANNEL, 0, Alarma_Baja_Temperatura_Ativa) End If If Alarma_Alta_Humedad_Ativa <> Nothing Then If Alarma_Alta_Humedad_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.DATA_CHANNEL, 1, ALARMAHUMALTA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.DATA_CHANNEL, 1, Alarma_Alta_Humedad_Ativa) End If If Alarma_Baja_Humedad_Ativa <> Nothing Then If Alarma_Baja_Humedad_Ativa = True Then c41.setMissionAlarm(com.dalsemi.onewire.container.OneWireContainer 41.DATA_CHANNEL, 0, ALARMAHUMBAJA) End If c41.setMissionAlarmEnable(com.dalsemi.onewire.container.OneWireCon tainer41.DATA_CHANNEL, 0, Alarma_Baja_Humedad_Ativa) End If c41.clearMemory() Array.Resize(channel_enabled, c41.getNumberMissionChannels()) channel_enabled(0) = True channel_enabled(1) = True If Sample_Rate <> Nothing Then c41.startNewMission(Sample_Rate, Fecha_de_Inicio, Rollover_Activo, Sincronizar_Reloj, channel_enabled) Else

125

c41.startMission() End If MISION_INICIADA = c41.isMissionRunning() If MISION_INICIADA = True Then Estatus_de_mision = True RaiseEvent Inicio_Mision() Iniciar_Nueva_Mision = True Else TIPO_ERROR = "Error al Iniciar la Misin" Iniciar_Nueva_Mision = False Estatus_de_mision = False End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = ex.ToString RaiseEvent Ocurrio_Error() End Try

End Function #End Region #Region "Cargar Misin" Function Cargar_Mision(ByVal SERIAL As String) As Boolean Try If Puerto_Abierto <> Nothing Then owd = adapter.getDeviceContainer(SERIAL) c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) If c41.isMissionRunning() = True Then Estatus_de_mision = True TIPO_ERROR = "No se pueden cargar los resultados de la mision debido a que esta corriendo" Cargar_Mision = False Else Estatus_de_mision = False c41.stopMission() c41.loadMissionResults() MUESTRAS_EN_MISION = c41.getMissionSampleCount(com.dalsemi.onewire.container.OneWireCon tainer41.TEMPERATURE_CHANNEL) Cargar_Mision = True End If End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception Cargar_Mision = False TIPO_ERROR = ex.ToString RaiseEvent Ocurrio_Error() End Try End Function #End Region

126

#Region "Leer Temperatura" Public Function Leer_Temperatura() As String Try If Puerto_Abierto <> Nothing Then owd = adapter.getDeviceContainer(SERIALES(0)) c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) Estatus_de_mision = c41.isMissionRunning() If Estatus_de_mision = False Then estadotemp = c41.readDevice() c41.doTemperatureConvert(estadotemp) estadotemp = c41.readDevice() temperaturaanterior = c41.getTemperature(estadotemp) Else temperaturaanterior = Nothing End If End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End Try Leer_Temperatura = temperaturaanterior End Function #End Region #Region "Leer Humedad" Function Leer_Humedad() As Double Try If Puerto_Abierto <> Nothing Then owd = adapter.getDeviceContainer(SERIALES(0)) c41 = CType(owd, com.dalsemi.onewire.container.OneWireContainer41) Estatus_de_mision = c41.isMissionRunning() If Estatus_de_mision = False Then estado = c41.readDevice() c41.doHumidityConvert(estado) estado = c41.readDevice() humedadanterior = c41.getHumidity(estado) Leer_Humedad = humedadanterior End If End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End Try End Function #End Region #Region "Leer Reloj del Dispositivo"

127

Function Leer_RTC() Try If Puerto_Abierto <> Nothing Then owd = adapter.getDeviceContainer(SERIALES(0)) ows = CType(owd, com.dalsemi.onewire.container.OneWireSensor) cc = CType(owd, com.dalsemi.onewire.container.ClockContainer) VARSEG = cc.getClock(ows.readDevice) dt = New java.util.Date(VARSEG) VARHORA = dt.getHours.ToString VARMINUTOS = dt.getMinutes.ToString VARSEGUNDOS = dt.getSeconds.ToString VARAOS = dt.getYear + 1900 VARMESES = dt.getMonth + 1 VARFECHA = dt.getDate.ToString End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End Try Leer_RTC = Nothing End Function #End Region #Region "Sincronizar Reloj del Dispositivo" Function SincronizarRTC() Try If Puerto_Abierto <> Nothing Then owd = adapter.getDeviceContainer(SERIALES(0)) ows = CType(owd, com.dalsemi.onewire.container.OneWireSensor) cc = CType(owd, com.dalsemi.onewire.container.ClockContainer) VARSEG = cc.getClock(ows.readDevice) dtold = New java.util.Date(VARSEG) dtnew = New java.util.Date dtnew.setHours(VARHORA) dtnew.setMinutes(VARMINUTOS) dtnew.setSeconds(VARSEGUNDOS) dtnew.setYear(VARAOS) dtnew.setMonth(VARMESES) dtnew.setDate(VARFECHA) state = ows.readDevice

128

cc.setClock(dtnew.getTime(), state) ows.writeDevice(state) End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End Try SincronizarRTC = Nothing End Function #End Region #Region "Leer Muestra de Temperatura" Function Leer_Muestra_Temperatura(ByVal Numero_de_Muestra As Integer) As Double Dim prueba_variable As Double Try If Puerto_Abierto <> Nothing Then adapter.setSpeed(com.dalsemi.onewire.adapter.DSPortAdapter.SPEED_O VERDRIVE) Estatus_de_mision = c41.isMissionRunning() If Estatus_de_mision = False Then prueba_variable = c41.getMissionSample(com.dalsemi.onewire.container.OneWireContaine r41.TEMPERATURE_CHANNEL, Numero_de_Muestra) End If End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End Try Leer_Muestra_Temperatura = prueba_variable End Function #End Region #Region "Leer Muestra de Humedad" Function Leer_Muestra_Humedad(ByVal Numero_de_Muestra As Integer) As Double Try If Puerto_Abierto <> Nothing Then adapter.setSpeed(com.dalsemi.onewire.adapter.DSPortAdapter.SPEED_O VERDRIVE) Estatus_de_mision = c41.isMissionRunning() If Estatus_de_mision = False Then Leer_Muestra_Humedad = c41.getMissionSample(com.dalsemi.onewire.container.OneWireContaine r41.DATA_CHANNEL, Numero_de_Muestra) Else Leer_Muestra_Humedad = 0 End If End If

129

Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End Try End Function #End Region #Region "Leer hora de Muestra" Function Hora_De_Muestra_Temperatura(ByVal Numero_de_Muestra As Integer) As String Try If Puerto_Abierto <> Nothing Then Estatus_de_mision = c41.isMissionRunning() If Estatus_de_mision = False Then adapter.setSpeed(com.dalsemi.onewire.adapter.DSPortAdapter.SPEED_O VERDRIVE) miltemp = c41.getMissionSampleTimeStamp(0, Numero_de_Muestra) dttemp = New java.util.Date(miltemp) tiempo_muestra_temperatura = Str(dttemp.getDate.ToString) + "/" + Str(dttemp.getMonth + 1) + "/" + Str(dttemp.getYear + 1900) + " " + dttemp.getHours.ToString + ":" + dttemp.getMinutes.ToString + ":" + dttemp.getSeconds.ToString End If End If Catch ex As System.NullReferenceException TIPO_ERROR = "Error: Serial Incorrecto o Vacio" Catch ex As Exception TIPO_ERROR = "Error: " & ex.ToString RaiseEvent Ocurrio_Error() End Try Hora_De_Muestra_Temperatura = tiempo_muestra_temperatura End Function #End Region #Region "OTROS" Private Sub HYGROCHRON_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize Me.Height = 114 Me.Width = 114 End Sub #End Region

Private Sub HYGROCHRON_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub End Class

CAPITULO V VALIDACIN DEL CONTROL .NET

CAPITULO V

VALIDACIN DEL CONTROL .NET

En el presente captulo se describe la aplicacin construida para validar al control .NET desarrollado en el captulo anterior, esta aplicacin permiti utilizar y demostrar el funcionamiento del control.

5.1 Uso del Control . NET

La construccin de un control .NET para un dispositivo con tecnologa 1-Wire facilita el trabajo con este tipo de dispositivo, ya que el usuario no requiere saber como funciona el mismo ni cmo accesar a los registros internos, sino simplemente utilizar las propiedades y mtodos que le ofrece el control para comunicarse con el. Es por ello, que con instrucciones bsicas y el control aqu construido se puede realizar una aplicacin, en vista de que ste se encarga de realizar la comunicacin con el dispositivo. A continuacin se presenta un ejemplo de cmo utilizar el control .NET para iniciar una misin.

El primer paso es abrir la aplicacin, en este caso particular en Visual Studio 2005, el segundo paso es agregar el control .NET al Toolbox (caja de herramientas) de la aplicacin, para lograrlo se debe hacer click derecho sobre cualquier punto del Toolbox y aparecer una lista de opciones, de las cuales se selecciona la opcin Choose Items, ver figura 5.1. Al seleccionar esta opcin aparecer la pantalla Choose Toolbox Items que se observa en la figura 5.2 donde se har un click sobre la pestaa .NET Framework Components para buscar el

132

control deseado, en este caso HYGROCHRON, se selecciona, se presiona el botn OK y estar agegado al Toolbox, tal como se muestra en la figura 5.3.

Figura 5.1: Vista de la aplicacin al hacer click derecho sobre el Toolbox Fuente: Prada. V (2008)

133

Figura 5.2: Vista de la ventana Choose Toolbox Items Fuente: Prada. V (2008)

Figura 5.3: Vista del control agregado en el Toolbox Fuente: Prada. V (2008)

134

Una vez que se tiene el control agregado al Toolbox se puede hacer uso de l en una aplicacin, para utilizarlo se debe agregar a un formulario arrastrndolo y soltndolo sobre l, y al hacerlo el mismo quedar como se observa en la figura 5.4.

Figura 5.4: Vista de un formulario con el control agregado Fuente: Prada. V (2008)

Cuando el control ya se encuentra agregado al formulario, se hace doble click sobre l y aparece la ventana de programacin donde se escriben las instrucciones para ejecutar una aplicacin, haciendo uso del mismo y de cualquier otro control requerido de los que se encuentran disponibles en el Toolbox. Para demostrar lo fcil que es trabajar con un dispositivo Hygrochron, si se tiene un control que realice las funciones de comunicacin con l, se realizar un ejemplo que encuentre un puerto y muestre el nmero, que lea el tipo de adaptador utilizado y muestre el tipo, que lea el serial del dispositivo y lo muestre y que inicie una misin.

135

Al iniciar una rutina de instrucciones primero se definen las variables, para este ejemplo se definieron tres variables, las cuales son: PRUEBA, PUERTO_SELECCIONADO y ADAPTADOR_SELECCIONADO. Seguidamente se selecciona la propiedad o el mtodo del control requerido, por ejemplo para que encuentre el puerto, basta con escribir Hygrochron1. y al colocar el punto inmediatamente se desplegar una lista con las propiedades y mtodos del control, de donde el usuario podr escoger la que requiera slo con seleccionarla y hacer clic sobre ella, en este caso se seleccion la propiedad Puerto_Encontrado, como puede observarse en la figura 5.5.

Figura 5.5: Lista de propiedades y mtodos del control Hygrochron1 Fuente: Prada. V (2008)

136

De esta misma forma se procede para realizar cualquier instruccin requerida por el usuario. Para mostrar en el formulario el puerto, tipo de adaptador y el serial del dispositivo se le agregaron tres etiquetas al formulario de la figura 5.4, se le cambi el nombre de Form1 por Ejemplo y aadieron dos botones para generar los eventos que hagan ejecutar las acciones antes mencionadas. Al

correr este ejemplo y hacer click en el botn Abrir el puerto de la figura 5.6 (a), aparece un mensaje que dice Puerto encontrado, se presiona el botn aceptar y aparece el serial, puerto y tipo de adaptador como puede observarse en la figura 5.6 (b).

Igualmente al hacer click en el botn Iniciar Misin, aparece un mensaje que dice Se ha iniciado la misin, se presiona el botn aceptar y se inicia una misin en el dispositivo con los valores definidos en la aplicacin. Las instrucciones que hacen correr esta aplicacin se observan detalladamente en la figura 5.7.

(a)

(b)

Figura 5.6: (a) Vista del formulario del Ejemplo terminado (b) Vista de la aplicacin al presionar el botn Abrir el puerto Fuente: Prada. V (2008)

137

Public Class Form1 Dim PRUEBA As Boolean Dim PUERTO_SELECCIONADO As String Dim ADAPTADOR_SELECCIONADO As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click PRUEBA = Hygrochron1.Auto_Buscar_Puertos() If PRUEBA Then PUERTO_SELECCIONADO = Hygrochron1.Puerto_Encontrado Label2.Text = "Puerto:" + PUERTO_SELECCIONADO ADAPTADOR_SELECCIONADO = Hygrochron1.Adaptador_Encontrado Label3.Text = "Adaptador:" + ADAPTADOR_SELECCIONADO MsgBox("Puerto encontrado", MsgBoxStyle.OkOnly, "Puerto encontrado") Hygrochron1.Abrir_Puerto() Hygrochron1.Buscar_Dispositivos() Label1.Text = "Serial:" + Hygrochron1.SERIALES(0) Hygrochron1.Detener_Mision() Else MsgBox("No se ha encontrado puerto", MsgBoxStyle.OkOnly, "Puerto no encontrado") End If End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button2.Click Hygrochron1.Iniciar_Nueva_Mision(5, 0, True, True) End Sub Private Sub Hygrochron1_Inicio_Mision() Handles Hygrochron1.Inicio_Mision MsgBox("Se ha iniciado la misin", MsgBoxStyle.OkOnly, "Inicio de misin") End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub End Class

Figura 5.7: Listado de instrucciones para correr el Ejemplo Fuente: Prada. V (2008)

138

5.2 Descripcin de la aplicacin Hygrochron-Logger que valida al control .NET

Con la finalidad de realizar las pruebas y validacin del control .NET construido para la comunicacin con el iButton Hygrochron, se elabor una aplicacin demostrativa, (Ver anexo C) donde se utiliza dicho control comprobando el correcto funcionamiento del mismo. La aplicacin se desarroll en Visual Studio 2005 utilizando el lenguaje Visual Basic .NET, insertando el control en el formulario de la misma y utilizando las funciones contenidas en el. En la figura 5.8 se muestra la pantalla inicial de la aplicacin terminada.

Figura 5.8: Pantalla inicial de la aplicacin Hygrochron-Logger Fuente: Prada. V (2008)

139

Como puede observarse, en la parte superior de la figura 5.8 aparece el serial y el modelo del Hygrochron seleccionado, seguidamente aparecen tres mens: Archivo, Opciones y Ayuda, los cuales se vern con mayor detalle ms adelante, tambin se observan cuatro pestaas correspondientes a cada una de las pantallas que posee la aplicacin. En la primera pestaa llamada Propiedades de la Misin se le programa una misin a un dispositivo Hygrochron, en la segunda pestaa llamada Resultados de la Misin se descarga y se presenta toda la informacin, tanto de programacin como de muestras almacenadas, contenida en un dispositivo Hygrochron, la tercera pestaa llamada Histograma de Frecuencias grafica los histogramas de frecuencias de temperatura y humedad de las muestras almacenadas en el dispositivo durante una misin y la ltima pestaa llamada Grficas de Temperatura y Humedad como el nombre lo indica grafica las muestras de temperatura y humedad almacenadas en el dispositivo durante una misin.

Cabe sealar, que los mens antes mencionados permiten al usuario seleccionar entre diversas opciones, estos se despliegan al hacer click sobre cualquiera de ellos. A continuacin se muestran y se describen las funciones de las opciones presentadas en los mens, en la figura 5.9 se observa el men Archivo, donde se muestran las siguientes opciones al usuario: Conectar, Cargar Misin, Guardar Misin, Imprimir Reporte, Vista previa del Reporte y Salir. La primera opcin es Conectar, la cual, se habilita si al iniciar la aplicacin no se detectan dispositivos conectados, en este caso, aparecer la pantalla de la figura

140

5.9 indicando que no hay red 1-Wire disponible. El usuario puede seleccionar la opcin sin adaptador, e iniciar la aplicacin sin adaptador cargando una misin desde el PC conectarse por un puerto especfico, con un adaptador especfico a un dispositivo de la red 1-Wire y hacer click en Conectar, esto evita tener que abrir nuevamente la aplicacin. Una vez encontrado el puerto el adaptador y el dispositivo esta opcin queda deshabilitada.

Figura 5.9: Pantalla que aparece al correr la aplicacin y no detectar dispositivos conectados a la red 1-Wire Fuente: Prada. V (2008)

La segunda opcin Cargar Misin permite traer a la aplicacin los datos de una misin cualquiera que se ha almacenado previamente en el computador, sin necesidad de que exista un dispositivo conectado, la opcin Guardar Misin le permite al usuario guardar en un archivo del PC los datos de una misin. La opcin Imprimir Reporte sirve para imprimir un reporte de una misin y Vista previa del Reporte permite ver en la pantalla la forma en que se ver el reporte impreso, cabe destacar, que stas dos opciones no se encuentran habilitadas, ya

141

que requieren de tiempo y no se encuentran contempladas dentro del alcance de la presente investigacin. La ltima opcin es para salir de la aplicacin.

Figura 5.10: Men Archivo Fuente: Prada. V (2008)

En la figura 5.11 se muestra el men Opciones, en el que se observan slo dos selecciones posibles Detener Misin, la cual detiene una misin que se encuentra corriendo y Dormir Botn, esta ltima coloca al Hygrochron en estado de hibernacin, es decir, consumiendo el mnimo de energa ya que se apaga el oscilador que contiene el dispositivo. La opcin de Dormir el Botn es recomendable utilizarla cuando no se le va a dar uso al dispositivo por cierto tiempo, con la finalidad de alargarle la vida til. Por ltimo el men Ayuda observado en la figura 5.12, tiene la opcin Acerca de.., la cual, al hacer click sobre ella muestra una breve descripcin del Hygrochron como puede observarse en la figura 5.13.

142

Figura 5.11: Men Opciones Fuente: Prada. V (2008)

Figura 5.12: Men Ayuda Fuente: Prada. V (2008)

Figura 5.13: Mensaje que muestra el Acerca de.. Fuente: Prada. V (2008)

143

5.3 Propiedades de la Misin

Esta pantalla le permite al usuario programar una misin en un dispositivo Hygrochron, estableciendo los siguientes parmetros:

Ajustes de Fecha/Hora: permite sincronizar la hora del reloj del dispositivo con la del PC, para ello se hace click en el recuadro Ajustes del PC y aparecer una tilde verde dentro del recuadro indicando que el dispositivo tomar la hora del PC.

Tiempo entre Muestras: permite seleccionar el tiempo que ha de esperar el dispositivo para registrar entre una muestra y otra de temperatura y/o humedad, cuando se encuentra corriendo una misin. Para ello se hace click en Horas, Minutos, Segundos que har desplegar una lista de valores en cada uno de ellos permitiendo al usuario seleccionar el valor deseado.

Resolucin: esta opcin slo tiene dos selecciones posibles, las cuales son alta y baja, para seleccionar cualquiera de ellas se hace click en Resolucin de Temperatura, se desplegarn ambas opciones y se selecciona la deseada, de igual manera se procede con la Resolucin de Humedad.

Tiempo antes de Iniciar la Misin: permite colocar un tiempo de retardo antes de iniciar la misin, esta opcin se trabaja igual que la opcin Ajustes de Fecha/Hora.

Rollover: permite habilitar o deshabilitar la opcin de rollover (sobre escritura), para activarla se hace click en el recuadro Habilitar y aparecer una tilde verde

144

dentro del recuadro cambiando el icono rojo por uno verde como se observa en la figura 5.14 (a) indicando que la opcin est habilitada, si no se hace clic sobre el recuadro, este permanecer vaco y el rollover quedar deshabilitado, mostrando el icono de la figura 5.14 (b).

(a)

(b)

Figura 5.14: (a) Icono de RollOver habilitado (b) Icono de RollOver deshabilitado Fuente: Prada. V (2008)

Alarmas: esta opcin permite asignar los valores deseados de las alarmas alta y baja tanto de temperatura como de humedad, igualmente permite activarlas o desactivarlas haciendo click en el recuadro Habilitar y aparecer una tilde verde dentro del recuadro indicando que se habilit la alarma respectiva, si el recuadro est vaco indica que la misma est desactivada, a pesar de tener un valor en el recuadro correspondiente.

Grabar Misin: permite grabar la misin en el dispositivo Hygrochron una vez ajustados los parmetros, haciendo click en el botn Iniciar Misin.

Al iniciar una misin, la barra de progreso indica que se est grabando la misin en el dispositivo Hygrochron, cuando finaliza de grabarla aparece un

145

mensaje que dice Se inici correctamente la misin, como se observa en la figura 5.15.

Figura 5.15: Vista de la pantalla Propiedades de la Misin Fuente: Prada. V (2008)

5.4 Resultados de la Misin

Esta pantalla le permite al usuario descargar y mostrar los datos almacenados durante una misin en un dispositivo Hygrochron, al hacer click en el botn Leer datos se presentarn en la pantalla las muestras de temperatura y humedad registradas durante una misin, as como las alarmas que se generaron durante la misma, pero antes de hacerlo se debe detener la misin en la opcin Detener Misin contenida en el men Opciones, y de esta manera habilitar el botn Leer datos. Sin embargo, si se encuentra un dispositivo Hygrochron

146

conectado al PC, con la misin corriendo o detenida esta pantalla muestra los parmetros de programacin del mismo indicando si la misin esta corriendo o est finalizada. Al presionar el botn Leer datos, se muestran en los cuadros correspondientes las lecturas de temperatura y humedad almacenadas en el dispositivo, teniendo una opcin para presentar cada lectura con la fecha y hora en que fue registrada y otra opcin para presentar el nmero de muestra de cada lectura en el mismo orden en que fue tomada la lectura. Igualmente se presenta un cuadro para visualizar las muestras con alarmas altas y otro para las muestras con alarmas bajas, ocurridas durante una misin

Por otra parte, es importante mencionar que al leer los datos contenidos en el Hygrochron el men Opciones cambia tal y como se observa en la figura 5.16, se le agregan cuatro opciones al men antes mencionado que son: Histograma de Temperatura, Histograma de Humedad, Grfica de Temperatura y Grfica de Humedad y cada una de ellas posee un submen con diversas opciones tiles, aplicables a las grficas y a los histogramas de frecuencias. A continuacin se muestran cada uno de los submens, los cuales se explican por si solos.

147

Figura 5.16: Vista de la pantalla Resultados de la Misin con el nuevo men Opciones Fuente: Prada. V (2008)

Figura 5.17: Opcin Histograma de Temperatura con su submen Fuente: Prada. V (2008)

148

Figura 5.18: Opcin Histograma de Humedad con su submen Fuente: Prada. V (2008)

Figura 5.19: Opcin Grfica de Temperatura con su submen Fuente: Prada. V (2008)

Figura 5.20: Opcin Grfica de Humedad con su submen Fuente: Prada. V (2008)

149

5.5 Histograma de Frecuencias

En esta pantalla se pueden observar los histogramas de frecuencias tanto de temperatura como de humedad, los cuales, pueden ser modificados a travs de las opciones Histograma de Temperatura e Histograma de Humedad, donde el usuario puede colocar la grfica en tres dimensiones, colocar los valores de las barras sobre ellas, colocar una curva sobre el histograma y cambiar los intervalos entre muestras, una vista de esta pantalla con las barras colocadas en tres dimensiones se observa en la figura 5.21.

Figura 5.21: Vista de la pantalla Histograma de Frecuencias Fuente: Prada. V (2008)

150

5.6 Grficas de Temperatura y Humedad

En esta pantalla se pueden observar las grficas de las muestras almacenadas durante una misin, tanto de temperatura como de humedad, las cuales, pueden ser modificadas a travs de las opciones Grfica de Temperatura y Grfica de Humedad, donde el usuario puede colocar la grfica en tres dimensiones, y cambiar los intervalos entre muestras, una vista de esta pantalla se observa en la figura 5.22.

Figura 5.22: Vista de la pantalla Grficas de Temperatura y Humedad Fuente: Prada. V (2008)

151

5.7 Ejemplo de programacin y descarga de datos de una misin

A continuacin se mostrar un ejemplo de la programacin y descarga de datos de un iButton Hygrochron, el cual como puede observarse en la figura 5.23 se program para que almacenara muestras de temperatura y humedad cada minuto, se seleccion la opcin de resolucin alta para ambas variables, para que comience la misin sin retardo de tiempo, es decir, inmediatamente despus de iniciar la misma, se dej el rollover deshabilitado y se colocaron las siguientes alarmas: Temperatura Baja = 20 C, Temperatura Alta = 30C, Humedad Baja = 40%RH y Humedad Alta = 60%RH.

Figura 5.23: Parmetros utilizados para grabar una misin Fuente: Prada. V (2008)

152

Se

mantuvo

corriendo

la

misin

durante

dos

horas

media

aproximadamente, al detener la misin y leer los datos se registraron 140 muestras tanto de temperatura como de humedad durante el tiempo que estuvo activa la misin, tal y como se observa en la figura 5.24. Tambin se visualizan en esta pantalla las muestras con alarmas altas de temperatura y humedad al igual que las muestras con alarmas bajas de ambas. Una vez descargados los datos del dispositivo se presentan los Histogramas de Frecuencias como se observa en la figura 5.25 y las grficas de las muestras almacenadas se pueden ver en 3D en la figura 5.26.

Figura 5.24: Lectura de los datos de la misin Fuente: Prada. V (2008)

153

Figura 5.25: Histogramas de Frecuencias Fuente: Prada. V (2008)

Figura 5.26: Grficas de temperatura y humedad Fuente: Prada. V (2008)

154

5.8 Dundas Chart for . NET

Dundas Chart for . NET es una herramienta, que ofrece soluciones grficas disponibles en los ms avanzados paquetes grficos, permitiendo construir grficas en aplicaciones, siendo el lder de la tecnologa en construccin de grficos, posee un extenso e inigualable conjunto de ventajas en su versin 5.5. Esta herramienta fue utilizada en la aplicacin que se construy en la presente investigacin para la elaboracin de los histogramas de frecuencias y las grficas de temperatura y humedad.

155

CONCLUSIONES

En la presente investigacin se logr la construccin de un control .NET aplicando el Lenguaje Unificado de Modelado (UML), demostrando que este lenguaje visual presenta las siguientes ventajas:

- El UML constituye una herramienta de ayuda ideal en el desarrollo de sistemas y especialmente de programas con filosofa orientada a objetos.

- Los diagramas de especificaciones UML capturan los requisitos del cliente, para desarrollar un sistema, presentando el funcionamiento del mismo en una forma fcil de entender por las personas relacionadas con el sistema e incluso por aquellas que no tienen conocimientos de programacin.

- El UML permite crear nuevas clases a partir de otras ya existentes, haciendo uso de la herencia, lo que significa un ahorro sustancial de tiempo al momento de realizar la programacin, en vista de que no es necesario escribir instrucciones de cdigo para ejecutar acciones que ya se encuentren disponibles en otras clases.

El control creado bajo la plataforma .NET, es un objeto con propiedades mtodos y eventos, que puede ser utilizado en una aplicacin sin importar el lenguaje de programacin utilizado. Adicionalmente le permite al usuario trabajar con dispositivos 1-Wire, sin necesidad de saber como funcionan ni cmo accesar a los registros internos de los mismos, debido a que el control realiza el trabajo de comunicacin entre el PC y el dispositivo.

El control construido en la presente investigacin para el manejo del iButton Hygrochron, representa un aporte para aquellos usuarios que necesiten realizar mediciones de temperatura y humedad empleando un dispositivo pequeo,

156

robusto y autosufiente, adems de que permite crear aplicaciones acorde a las necesidades del cliente. Las clases contenidas en las 1-Wire API.NET simplifican y facilitan la comunicacin con los circuitos integrados con tecnologa 1-Wire, debido a que stas clases contienen mtodos con procedimientos que permiten la ejecucin de acciones en este tipo de dispositivos.

157

RECOMENDACIONES

Para futuros trabajos de investigacin, se sugiere realizar una revisin de la diversidad de los circuitos integrados disponibles por la Empresa Dallas Semiconductor, a fin de seleccionara a cual de ellos podra constrursele un control .NET, para ser utilizado en aplicaciones industriales.

Implementar el uso de controles .NET para construir aplicaciones que puedan ser utilizadas en los laboratorios de las Universidades, para uso acadmico.

Debido a que la aplicacin presenta versatilidad, sta puede ser ampliada para realizar reportes, impresin de reportes, anlisis estadsticos, entre otros.

158

REFERENCIAS BIBLIOGRFICAS

A laymans overview of 1-Wire technology and its use. (s.f.). Extrado el 03 de Octubre de 2007 de Dallas Semiconductor Maxim Engineering Journal: http://pdfserv.maxim-ic.com/en/ej/DallasEJ4.pdf Alhir, S. (2003). Learning UML. http://www.bisenter.com Blanco, L (2002). Programacin en Visual Basic .NET. Creus, A. (1985). Instrumentacin Industrial (Tercera Edicion). Espaa. Marcombo Boixareu Editores. Barcelona,

Dallas Semiconductor. (30 de Noviembre de 2006). App Note 3967: Selecting a serial bus. Extrado el 23 de Octubre de 2007 desde http://pdfserv.maximic.com/en/an/AN3967.pdf. Dallas Semiconductor. (12 de Agosto de 1997). App Note 937: Book of iButton Standards. Extrado el 15 de Octubre de 2007 desde http://pdfserv.maximic.com/en/an/appibstd.pdf. Dallas Semiconductor/Maxim. (11 de Octubre de 2005). Application Note 155: 1-Wire(R) Software Resource Guide Device Description. Extrado el 10 de Octubre de 2007 desde http://pdfserv.maxim-ic.com/en/an/AN155.pdf Dallas Semiconductor/Maxim. Revolutionary iButton Digital Temperature and Humidity Data Loggers. Extrado el 20 de Febrero de 2007 desde http://www.maxim-ic.com/products/ibutton/news/brochure.pdf.

Dallas-Maxim. (03 de Diciembre de 2002). Application Note 1796: Overview of 1-Wire Technology and Its Use. Extrado el 03 de Octubre de 2007 desde http://pdfserv.maxim-ic.com/en/an/AN1796.pdf Gaceta Oficial No. 36.081 (1996). Buenas Prcticas de Fabricacin, Almacenamiento y Transporte de Alimentos para consumo Humano. Himpe, V (2007) Visual Basic 5.0, 6.0, VBA, .NET, 2005 for Electronics Engineering Applications. Tercera Edicin. Netherlands. Rodrguez, J. (2006). Comunicacin 1-Wire. En Sistema de Desarrollo MDKB28 Valencia, Venezuela.

159

Schach, S. (2005). Anlisis y diseo orientado a objetos con UML y el proceso unificado. (Primera edicin en espaol). Mxico. McGraw-Hill. Schmuller, J. (2003). Aprendiendo UML en 24 Horas. Pearson Education. Stallings, W. (2004). Comunicaciones y Redes de Computadores (Septima Edicion). Madrid, Espaa. Pearson Education, S.A. UPEL. (1998). Manual de trabajos de grado de especializacin, maestra y tesis doctorales. Caracas, Venezuela. Willliams, S. y Kindel C. (Octubre de 1994). The Component Object Model: A Technical Overview. Documentacin de Microsoft Visual Studio 2005 . Extrado el 20 de Octubre de 2007.

ANEXOS

ANEXO A ESPECIFICACIONES DEL HYGROCHRON

ANEXO B ESPECIFICACIONES DEL ADAPTADOR

ANEXO C CDIGO FUENTE DE LA APLICACIN

Public Class Form1 Dim prueba As Integer Dim numero_de_dispositivos As Byte Dim seriales(10) As String Dim contador As Integer Public dispositivos_encontrados As Boolean Dim samplerate_hora As Integer Dim samplerate_minutos As Integer Dim samplerate_segundos As Integer Dim sample_rate As Integer Dim rollover_activo As Boolean Dim sincronizar_rtc_con_pc As Boolean Dim tiempo_antes_De_iniciar_dias As Integer Dim tiempo_antes_De_iniciar_horas As Integer Dim tiempo_antes_De_iniciar_minutos As Integer Dim tiempo_antes_De_iniciar As Integer Public muestras_en_mision As Integer Public muestras_de_temperatura(1000) As Double Public horas_muestras_de_temperatura(1000) As String Public horas_muestras_de_humedad(1000) As String Dim muestra_de_temperatura As Double Public muestras_de_humedad(1000) As Double Dim muestra_de_humedad As Double Dim temperatura_actual As Double Dim canal_de_temperatura As Boolean Dim canal_de_humedad As Boolean Dim activar_alarma_alta_temperatura As Boolean Dim activar_alarma_alta_humedad As Boolean Dim activar_alarma_baja_temperatura As Boolean Dim activar_alarma_baja_humedad As Boolean Dim dt As New DataTable Dim dt2 As New DataTable Dim dt3 As New DataTable Dim dt4 As New DataTable Dim dr As DataRow Dim dr2 As DataRow Dim dr3 As DataRow Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim SERIE1 As New Dundas.Charting.WinControl.Series SERIE2 As New Dundas.Charting.WinControl.Series SERIE3 As New Dundas.Charting.WinControl.Series SERIE4 As New Dundas.Charting.WinControl.Series SERIE5 As New Dundas.Charting.WinControl.Series SERIE6 As New Dundas.Charting.WinControl.Series I As Double j As Double bandera1 As Byte bandera2 As Byte bandera3 As Boolean vectorx(100) As Double vectory(100) As Double vectoryh(100) As Double cambio_rollover As Boolean cambio_sample_s As Boolean cambio_sample_m As Boolean cambio_sample_h As Boolean

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load TabControl1.SelectedIndex = 1 'Visibilidad de los controles opcinales de los histogramas HistogramaDeTemperaturamenu.Visible = False HistogramadeHumedadmenu.Visible = False Me.toolgraficatemperatura.Visible = False Me.toolgraficahumedad.Visible = False cambio_rollover = False cambio_sample_s = False cambio_sample_m = False cambio_sample_h = False '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Me.guardarToolStripMenuItem.Enabled = False Me.ImprimirReporteToolStripMenuItem.Enabled = False Me.ToolStripMenuItem27.Enabled = False '.Enabled = False 'OpcionesToolStripMenuItem.Enabled = False COM2.Checked = True DS9097U.Checked = True TabControl1.Visible = False Me.BackgroundImageLayout = ImageLayout.Stretch Button1.Enabled = False dt.Columns.Add(New DataColumn(" Fecha/Hora", GetType(String))) dt.Columns.Add(New DataColumn(" C ", GetType(String))) dt2.Columns.Add(New DataColumn(" Fecha/Hora", GetType(String))) dt2.Columns.Add(New DataColumn(" %RH ", GetType(String))) For contador = 0 To 7 dr = dt.NewRow() dr(" Fecha/Hora") = "" dr(" C ") = "" dt.Rows.Add(dr) dr2 = dt2.NewRow() dr2(" Fecha/Hora") = "" dr2(" %RH ") = "" dt2.Rows.Add(dr2) Next Me.DataGridView1.DataSource = dt Me.DataGridView1.Enabled = False Me.DataGridView1.Rows.Item(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter Me.DataGridView2.DataSource = dt2 Me.DataGridView2.Enabled = False RadioButton1.Checked = True Try If dispositivos_encontrados Then TabControl1.Visible = True Me.ToolStripMenuItem15.Enabled = False Me.BackgroundImageLayout = ImageLayout.Center Me.guardarToolStripMenuItem.Enabled = True

ImprimirReporteToolStripMenuItem.Enabled = True Me.ToolStripMenuItem27.Enabled = True 'OpcionesToolStripMenuItem.Enabled = True Me.Hygrochron1.Adaptador = Form2.ADAPTADOR_SELECCIONADO Me.Hygrochron1.Puerto = Form2.PUERTO_SELECCIONADO Hygrochron1.Abrir_Puerto() numero_de_dispositivos = Hygrochron1.Buscar_Dispositivos() If numero_de_dispositivos > 0 Then Call inicializar() End If Else TabControl1.Visible = False Me.ToolStripMenuItem15.Enabled = True End If Catch ex As Exception Me.Text = "Hygrochron-Logger " + ex.ToString End Try End Sub Function inicializar() seriales = Hygrochron1.SERIALES Me.Text = "Hygrochron-Logger Serial:" + seriales(0) + " DS1923" Hygrochron1.Actualizar() If Hygrochron1.Corriendo_Mision = True Then Label8.Text = "Corriendo" DetenerMisionToolStripMenuItem.Enabled = True Else Label8.Text = "Finalizada" Button1.Enabled = True DetenerMisionToolStripMenuItem.Enabled = False End If Label9.Text = Hygrochron1.Sample_Rate.ToString + " Seg" If Hygrochron1.Rollover_Activo Then Label10.Text = "Si" Else Label10.Text = "No" End If If Hygrochron1.Ha_Ocurrido_Rollover Then Label11.Text = "Si" Else Label11.Text = "No" End If Label13.Text = Hygrochron1.Numero_Muestras_Mision.ToString muestras_en_mision = Hygrochron1.Numero_Muestras_Mision Label14.Text = Hygrochron1.Numero_Muestras_total.ToString Label16.Text = Hygrochron1.Alarma_Alta_Temperatura Label17.Text = Hygrochron1.Alarma_Baja_Temperatura Label19.Text = String.Format("{1:F0}", Hygrochron1.Alarma_Alta_Humedad, Hygrochron1.Alarma_Alta_Humedad)

Label20.Text = String.Format("{1:F0}", Hygrochron1.Alarma_Baja_Humedad, Hygrochron1.Alarma_Baja_Humedad) Hygrochron1.Leer_RTC() Label18.Text = Hygrochron1.Fecha.ToString + "/" + Hygrochron1.Mes.ToString + "/" + Hygrochron1.Ao.ToString + " " + Hygrochron1.Hora.ToString + ":" + Hygrochron1.Minutos.ToString Label31.Text = Hygrochron1.Canal_de_Temperatura_activo Label30.Text = Hygrochron1.Canal_de_Humedad_activo Label12.Text = Str(Hygrochron1.Fecha_Inicio_Mision) + "/" + Str(Hygrochron1.Mes_Inicio_Mision) + "/" + Str(Hygrochron1.Ao_Inicio_Mision) + " " + Str(Hygrochron1.Hora_Inicio_Mision) + ":" + Str(Hygrochron1.Minutos_Inicio_Mision) + ":" + Str(Hygrochron1.Segundos_Inicio_Mision) If Hygrochron1.Canal_de_Temperatura_activo = True Then Label31.Text = "Activo" Else Label31.Text = "Inactivo" End If If Hygrochron1.Canal_de_Humedad_activo = True Then Label30.Text = "Activo" Else Label30.Text = "Inactivo" End If inicializar = Nothing End Function Private Sub COM2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM2.Click Hygrochron1.Puerto = COM2.Text COM1.Checked = False COM2.Checked = True COM3.Checked = False COM4.Checked = False End Sub Private Sub COM1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM1.Click Hygrochron1.Puerto = COM1.Text COM1.Checked = True COM2.Checked = False COM3.Checked = False COM4.Checked = False End Sub Private Sub COM3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM3.Click Hygrochron1.Puerto = COM3.Text COM1.Checked = False COM2.Checked = False COM3.Checked = True COM4.Checked = False End Sub

Private Sub COM4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM4.Click Hygrochron1.Puerto = COM4.Text COM1.Checked = False COM2.Checked = False COM3.Checked = False COM4.Checked = True End Sub Private Sub DS9097U_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DS9097U.Click Hygrochron1.Adaptador = "SERIAL" DS9097U.Checked = True DS9490.Checked = False End Sub Private Sub DS9490_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DS9490.Click Hygrochron1.Adaptador = "USB" DS9097U.Checked = False DS9490.Checked = True End Sub Private Sub Hygrochron1_Ocurrio_Error() MsgBox("Ha Ocurrido un Error", MsgBoxStyle.OkOnly, "Error de Comunicacion con la red 1-wire") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim prueba As Integer Dim i As Integer Dim jj As Integer Dim gg As Integer Try Hygrochron1.Actualizar() muestras_en_mision = Hygrochron1.Numero_Muestras_Mision.ToString jj = 1 gg = 1 If muestras_en_mision > 0 Then ProgressBar1.Maximum = Hygrochron1.Numero_Muestras_Mision - 1 For prueba = 0 To Hygrochron1.Numero_Muestras_Mision - 1 muestra_de_temperatura = Hygrochron1.Leer_Muestra_Temperatura(prueba) If muestra_de_temperatura > Hygrochron1.Alarma_Alta_Temperatura Then TextBox3.Text = TextBox3.Text + Str(prueba + 1) + ") " + String.Format("{1:F3}", muestra_de_temperatura, muestra_de_temperatura) + " C " If gg Mod 2 = 0 Then TextBox3.Text = TextBox3.Text + vbCrLf End If

gg = gg + 1 ElseIf muestra_de_temperatura < Hygrochron1.Alarma_Baja_Temperatura Then TextBox1.Text = TextBox1.Text + Str(prueba + 1) + ") " + String.Format("{1:F3}", muestra_de_temperatura, muestra_de_temperatura) + " C " If jj Mod 2 = 0 Then TextBox1.Text = TextBox1.Text + vbCrLf End If jj = jj + 1 End If horas_muestras_de_temperatura(prueba) = Hygrochron1.Hora_De_Muestra_Temperatura(prueba) horas_muestras_de_humedad(prueba) = Hygrochron1.Hora_De_Muestra_Humedad(prueba) muestras_de_temperatura(prueba) = muestra_de_temperatura muestra_de_humedad = Hygrochron1.Leer_Muestra_Humedad(prueba) If muestra_de_humedad > Hygrochron1.Alarma_Alta_Humedad Then TextBox3.Text = TextBox3.Text + Str(prueba + 1) + ") " + String.Format("{1:F3}", muestra_de_humedad, muestra_de_humedad) + " %RH " If gg Mod 2 = 0 Then TextBox3.Text = TextBox3.Text + vbCrLf End If gg = gg + 1 ElseIf muestra_de_humedad < Hygrochron1.Alarma_Baja_Humedad Then TextBox1.Text = TextBox1.Text + Str(prueba + 1) + ") " + String.Format("{1:F3}", muestra_de_humedad, muestra_de_humedad) + " %RH " If jj Mod 2 = 0 Then TextBox1.Text = TextBox1.Text + vbCrLf End If jj = jj + 1 End If muestras_de_humedad(prueba) = muestra_de_humedad ProgressBar1.Value = prueba Next dt3.Clear() dt4.Clear() If bandera3 = False Then dt3.Columns.Add(New DataColumn(" Fecha/Hora", GetType(String))) dt3.Columns.Add(New DataColumn(" GetType(String))) dt4.Columns.Add(New DataColumn(" GetType(String))) dt4.Columns.Add(New DataColumn(" GetType(String)))

C ", Fecha/Hora", %RH ",

bandera3 = True End If For i = 0 To muestras_en_mision - 1 dr = dt3.NewRow() dr(" Fecha/Hora") = horas_muestras_de_temperatura(i) dr(" C ") = String.Format("{1:F3}", muestras_de_temperatura(i), muestras_de_temperatura(i)) dt3.Rows.Add(dr) dr3 = dt4.NewRow() dr3(" Fecha/Hora") = horas_muestras_de_humedad(i) dr3(" %RH ") = String.Format("{1:F3}", muestras_de_humedad(i), muestras_de_humedad(i)) dt4.Rows.Add(dr3) Next Me.DataGridView1.DataSource = dt3 Me.DataGridView1.Enabled = True Me.DataGridView2.DataSource = dt4 Me.DataGridView2.Enabled = True Call graficar() Call graficar2() 'Visibilidad de los controles opcinales de los histogramas HistogramaDeTemperaturamenu.Visible = True HistogramadeHumedadmenu.Visible = True Me.toolgraficatemperatura.Visible = True Me.toolgraficahumedad.Visible = True '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ End If Catch ex As Exception End Try End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged Dim i As Integer If Me.DataGridView1.Enabled = True Or Me.DataGridView2.Enabled = True Then dt3.Columns.Item(0).ColumnName = "Muestra" dt4.Columns.Item(0).ColumnName = "Muestra" For i = 1 To muestras_en_mision dt3.Rows.Item(i - 1).Item(0) = i dt4.Rows.Item(i - 1).Item(0) = i Next End If End Sub Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged Dim i As Integer

If Me.DataGridView1.Enabled = True Or Me.DataGridView2.Enabled = True Then dt3.Columns.Item(0).ColumnName = " dt4.Columns.Item(0).ColumnName = " For i = 1 To muestras_en_mision dt3.Rows.Item(i - 1).Item(0) = horas_muestras_de_temperatura(i - 1) dt4.Rows.Item(i - 1).Item(0) = horas_muestras_de_humedad(i - 1) Next End If End Sub

Fecha/Hora" Fecha/Hora"

Private Sub CheckBox4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox4.CheckedChanged If CheckBox4.Checked = True Then sincronizar_rtc_con_pc = True Else sincronizar_rtc_con_pc = False End If End Sub Private Sub CheckBox5_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) sincronizar_rtc_con_pc = False End Sub Private Sub ComboBox5_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox5.SelectedIndexChanged cambio_sample_h = True samplerate_hora = Val(ComboBox5.SelectedItem) End Sub Private Sub ComboBox6_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox6.SelectedIndexChanged cambio_sample_m = True samplerate_minutos = Val(ComboBox6.SelectedItem) End Sub Private Sub ComboBox7_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox7.SelectedIndexChanged cambio_sample_s = True samplerate_segundos = Val(ComboBox7.SelectedItem) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUTTON2.Click samplerate_hora = Val(ComboBox5.SelectedItem) samplerate_minutos = Val(ComboBox6.SelectedItem) samplerate_segundos = Val(ComboBox7.SelectedItem)

ProgressBar2.Value = 0 ProgressBar2.Maximum = 100 Hygrochron1.Canal_de_Temperatura_activo = canal_de_temperatura ProgressBar2.Value = ProgressBar2.Value + 10 Hygrochron1.Canal_de_Humedad_activo = canal_de_humedad ProgressBar2.Value = ProgressBar2.Value + 10 Hygrochron1.Alarma_Alta_Humedad_Ativa = activar_alarma_alta_humedad ProgressBar2.Value = ProgressBar2.Value + 10 Hygrochron1.Alarma_Alta_Temperatura_Ativa = activar_alarma_alta_temperatura ProgressBar2.Value = ProgressBar2.Value + 10 Hygrochron1.Alarma_Baja_Humedad_Ativa = activar_alarma_baja_humedad ProgressBar2.Value = ProgressBar2.Value + 10 Hygrochron1.Alarma_Baja_Temperatura_Ativa = activar_alarma_baja_temperatura ProgressBar2.Value = ProgressBar2.Value + 10 If TextBox9.Text <> "" Then Hygrochron1.Alarma_Alta_Temperatura = Val(TextBox9.Text) End If ProgressBar2.Value = ProgressBar2.Value + 10 If TextBox8.Text <> "" Then Hygrochron1.Alarma_Baja_Temperatura = Val(TextBox8.Text) End If ProgressBar2.Value = ProgressBar2.Value + 10 If TextBox11.Text <> "" Then Hygrochron1.Alarma_Alta_Humedad = Val(TextBox11.Text) End If ProgressBar2.Value = ProgressBar2.Value + 10 If TextBox10.Text <> "" Then Hygrochron1.Alarma_Baja_Humedad = Val(TextBox10.Text) End If ' If ComboBox8.SelectedItem = "Resolucion Alta" Then ' Hygrochron1.Resolucion_Temperatura = hygrochron.HYGROCHRON.Resolucion_Alta_Temperatura ' Else ' Hygrochron1.Resolucion_Temperatura = 0.5 ' End If 'If ComboBox4.SelectedItem = "Resolucion Alta" Then ' Hygrochron1.Resolucion_Humedad = hygrochron.HYGROCHRON.Resolucion_Alta_Humedad ' Else ' Hygrochron1.Resolucion_Humedad = 0.5 ' End If If cambio_rollover Then rollover_activo = CheckBox2.Checked End If If cambio_sample_s = True Or cambio_sample_m = True Or cambio_sample_h = True Then

sample_rate = samplerate_hora * 3600 + samplerate_minutos * 60 + samplerate_segundos End If tiempo_antes_De_iniciar = Val(Label39.Text) Hygrochron1.Iniciar_Nueva_Mision(sample_rate, tiempo_antes_De_iniciar, rollover_activo, sincronizar_rtc_con_pc) End Sub

Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged rollover_activo = CheckBox2.Checked cambio_rollover = True If CheckBox2.Checked Then PictureBox1.Image = My.Resources.Tips Else PictureBox1.Image = My.Resources.Forbidden End If End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged tiempo_antes_De_iniciar_dias = (ComboBox1.SelectedItem) Label39.TextAlign = ContentAlignment.MiddleLeft Label39.Text = tiempo_antes_De_iniciar_dias * 24 * 60 + tiempo_antes_De_iniciar_horas * 60 + tiempo_antes_De_iniciar_minutos End Sub Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged tiempo_antes_De_iniciar_horas = (ComboBox2.SelectedItem) Label39.Text = tiempo_antes_De_iniciar_dias * 24 * 60 + tiempo_antes_De_iniciar_horas * 60 + tiempo_antes_De_iniciar_minutos End Sub Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged tiempo_antes_De_iniciar_minutos = (ComboBox3.SelectedItem) Label39.Text = tiempo_antes_De_iniciar_dias * 24 * 60 + tiempo_antes_De_iniciar_horas * 60 + tiempo_antes_De_iniciar_minutos End Sub Private Sub TabControl1_Deselected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Deselected End Sub

Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged If TabControl1.SelectedIndex = 0 Then Hygrochron1.Leer_RTC() Label47.Text = Str(Hygrochron1.Fecha) + "/" + Str(Hygrochron1.Mes) + "/" + Str(Hygrochron1.Ao) + " " + Str(Hygrochron1.Hora) + ":" + Str(Hygrochron1.Minutos) + ":" + Str(Hygrochron1.Segundos) Label48.Text = Date.Now CheckBox4.Checked = True sincronizar_rtc_con_pc = True rollover_activo = False samplerate_segundos = 1 activar_alarma_alta_humedad = False activar_alarma_baja_humedad = False activar_alarma_alta_temperatura = False activar_alarma_alta_temperatura = False Hygrochron1.Alarma_Baja_Temperatura_Ativa = activar_alarma_baja_temperatura Label39.Text = tiempo_antes_De_iniciar_dias * 24 * 60 + tiempo_antes_De_iniciar_horas * 60 + tiempo_antes_De_iniciar_minutos ElseIf TabControl1.SelectedIndex = 3 Then End If End Sub Private Sub CheckBox6_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CheckBox6.Click If CheckBox6.Checked Then CheckBox6.Checked = True activar_alarma_alta_humedad = CheckBox6.Checked Else CheckBox6.Checked = False activar_alarma_alta_humedad = CheckBox6.Checked End If End Sub Private Sub CheckBox8_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CheckBox8.Click If CheckBox8.Checked Then CheckBox8.Checked = True activar_alarma_baja_humedad = CheckBox8.Checked Else CheckBox8.Checked = False activar_alarma_baja_humedad = CheckBox8.Checked End If End Sub Private Sub Hygrochron1_Fin_Mision() MsgBox("Ha Finalizado la Mision", MsgBoxStyle.OkOnly, "Fin de Mision") End Sub Private Sub Hygrochron1_Inicio_Mision()

MsgBox("Se ha Iniciado la Mision", MsgBoxStyle.OkOnly, "Inicio de Mision") Me.ProgressBar2.Value = 0 Me.ProgressBar2.Enabled = False End Sub Private Sub DetenerMisionToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DetenerMisionToolStripMenuItem.Click Hygrochron1.Detener_Mision() Call inicializar() End Sub Function graficar() Chart2.Series.Clear() For I = -40 To 0 Step 1 vectorx(I + 40) = I Next For I = 1 To 60 vectorx(40 + I) = I Next For I = 0 To muestras_en_mision - 1 For j = 0 To 100 Step 1 If muestras_de_temperatura(I) > -40.5 + j And muestras_de_temperatura(I) < -39.5 + j Then vectory(j) = vectory(j) + 1 End If If muestras_de_humedad(I) > 0.5 + j And muestras_de_humedad(I) < 1.5 + j Then vectoryh(j) = vectoryh(j) + 1 End If Next Next For I = 0 To 100 If bandera1 = 0 Then If vectory(I) > 0 Then bandera1 = 1 SERIE1.Points.AddXY(vectorx(I), vectory(I)) SERIE3.Points.AddXY(vectorx(I), vectory(I)) End If Else SERIE1.Points.AddXY(vectorx(I), vectory(I)) SERIE3.Points.AddXY(vectorx(I), vectory(I)) End If If bandera2 = 0 Then If vectoryh(I) > 0 Then bandera2 = 1 SERIE2.Points.AddXY(vectorx(I) + 40, vectoryh(I)) SERIE4.Points.AddXY(vectorx(I) + 40, vectoryh(I)) End If Else SERIE2.Points.AddXY(vectorx(I) + 40, vectoryh(I)) SERIE4.Points.AddXY(vectorx(I) + 40, vectoryh(I)) End If

Next 'CheckBox1.Checked = False Chart2.Series.Add(SERIE1) SERIE1("PointWidth") = "0.5" SERIE1.ShowLabelAsValue = False SERIE1("BarLabelStyle") = "Center" SERIE1.Name = "Temperatura" SERIE1.BorderStyle = Dundas.Charting.WinControl.ChartDashStyle.Solid SERIE1.BorderColor = Color.Blue SERIE1.BorderWidth = 1 Chart2.ChartAreas(0).Area3DStyle.Enable3D = False Chart2.ChartAreas(0).BackGradientEndColor = Color.Aquamarine Chart2.ChartAreas(0).BackGradientType = Dundas.Charting.WinControl.GradientType.LeftRight Chart2.ChartAreas(0).AxisX.Interval = 10 SERIE2.ChartArea = "Chart Area 1" SERIE2("PointWidth") = "0.5" SERIE2.ShowLabelAsValue = False SERIE2("BarLabelStyle") = "Center" SERIE2.Name = "Humedad" Chart2.ChartAreas("Chart Area 1").AxisX.Interval = 10 Chart2.ChartAreas("Chart Area 1").BackGradientEndColor = Color.Aquamarine Chart2.ChartAreas("Chart Area 1").BackGradientType = Dundas.Charting.WinControl.GradientType.LeftRight SERIE2.BorderStyle = Dundas.Charting.WinControl.ChartDashStyle.Solid SERIE2.Color = Color.Gold Chart2.Series.Add(SERIE2) SERIE3.Type = Dundas.Charting.WinControl.SeriesChartType.Spline SERIE3.Color = Color.Red SERIE3("Point With") = "1.4" SERIE3.Name = "Curva de Temperatura" Chart2.Series.Add(SERIE3) Chart2.Series("Curva de Temperatura").Enabled = False SERIE4.Type = Dundas.Charting.WinControl.SeriesChartType.Spline SERIE4.Color = Color.DarkGreen SERIE4("Point With") = "1.4" SERIE4.Name = "Curva de Humedad" SERIE4.ChartArea = "Chart Area 1" Chart2.Series.Add(SERIE4) Chart2.Series("Curva de Humedad").Enabled = False Chart2.ChartAreas(1).AxisX.Title = "Muestras" Chart2.ChartAreas(1).AxisY.Title = "Humedad" graficar = Nothing End Function

Function graficar2() Chart1.Series.Clear() For I = 0 To Me.muestras_en_mision - 1 SERIE5.Points.AddXY(I, muestras_de_temperatura(I)) SERIE6.Points.AddXY(I, muestras_de_humedad(I)) Next SERIE5("PointWidth") = "0.5" SERIE5.ShowLabelAsValue = False SERIE5("BarLabelStyle") = "Center" SERIE5.Name = "Temperatura" SERIE5.BorderStyle = Dundas.Charting.WinControl.ChartDashStyle.Solid SERIE5.Type = Dundas.Charting.WinControl.SeriesChartType.Spline SERIE5.BorderColor = Color.Blue SERIE5.BorderWidth = 1 Chart1.Series.Add(SERIE5) Chart1.ChartAreas(0).Area3DStyle.Enable3D = False Chart1.ChartAreas(0).BackGradientEndColor = Color.Aquamarine Chart1.ChartAreas(0).BackGradientType = Dundas.Charting.WinControl.GradientType.LeftRight Chart1.ChartAreas(0).AxisX.Interval = 10 SERIE6.ChartArea = "Chart Area 1" SERIE6("PointWidth") = "0.5" SERIE6.ShowLabelAsValue = False SERIE6("BarLabelStyle") = "Center" SERIE6.Name = "Grafica de Humedad" SERIE6.Type = Dundas.Charting.WinControl.SeriesChartType.Spline Chart1.ChartAreas("Chart Area 1").AxisX.Interval = 10 Chart1.ChartAreas("Chart Area 1").BackGradientEndColor = Color.Aquamarine Chart1.ChartAreas("Chart Area 1").BackGradientType = Dundas.Charting.WinControl.GradientType.LeftRight SERIE6.BorderStyle = Dundas.Charting.WinControl.ChartDashStyle.Solid SERIE6.Color = Color.Gold Chart1.Series.Add(SERIE6) Chart1.ChartAreas(0).AxisX.Title = "Muestras" Chart1.ChartAreas(0).AxisY.Title = "Temperatura" Chart1.ChartAreas(1).AxisX.Title = "Muestras" Chart1.ChartAreas(1).AxisY.Title = "Humedad" graficar2 = Nothing End Function Private Sub TabPage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage2.Click End Sub Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

Me.Height = 600 Me.Width = 800 End Sub Private Sub CheckBox7_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox7.CheckedChanged If CheckBox7.Checked Then CheckBox7.Checked = True activar_alarma_alta_temperatura = CheckBox7.Checked Else CheckBox7.Checked = False activar_alarma_alta_temperatura = CheckBox7.Checked End If End Sub Private Sub CheckBox9_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox9.CheckedChanged If CheckBox9.Checked Then CheckBox9.Checked = True activar_alarma_baja_temperatura = CheckBox9.Checked Else CheckBox9.Checked = False activar_alarma_baja_temperatura = CheckBox9.Checked End If End Sub '++++++++++++++++++++++++temperatura+++++++++++++++++++++++++ Private Sub Grafica3Dtemperatura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Grafica3Dtemperatura.Click If Grafica3Dtemperatura.Checked Then Grafica3Dtemperatura.Checked = False Else Grafica3Dtemperatura.Checked = True End If Chart2.ChartAreas(0).Area3DStyle.Enable3D = Grafica3Dtemperatura.Checked End Sub Private Sub ValorDeLasBarrastemperatura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ValorDeLasBarrastemperatura.Click If ValorDeLasBarrastemperatura.Checked Then ValorDeLasBarrastemperatura.Checked = False Else ValorDeLasBarrastemperatura.Checked = True End If Chart2.Series("Temperatura").ShowLabelAsValue = ValorDeLasBarrastemperatura.Checked End Sub Private Sub MostrarCurvaDeTemperatura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MostrarCurvaDeTemperatura.Click

If MostrarCurvaDeTemperatura.Checked Then MostrarCurvaDeTemperatura.Checked = False Else MostrarCurvaDeTemperatura.Checked = True End If Chart2.Series("Curva de Temperatura").Enabled = MostrarCurvaDeTemperatura.Checked End Sub

'++++++++++++++++++humedad++++++++++++++++++++++++++++++++++++++++ Private Sub Mostrargrafica3dhumedad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Mostrargrafica3dhumedad.Click If Mostrargrafica3dhumedad.Checked Then Mostrargrafica3dhumedad.Checked = False Else Mostrargrafica3dhumedad.Checked = True End If Chart2.ChartAreas(1).Area3DStyle.Enable3D = Mostrargrafica3dhumedad.Checked End Sub Private Sub ValorDeLasBarrasHumedad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ValorDeLasBarrasHumedad.Click If ValorDeLasBarrasHumedad.Checked Then ValorDeLasBarrasHumedad.Checked = False Else ValorDeLasBarrasHumedad.Checked = True End If Chart2.Series("Humedad").ShowLabelAsValue = ValorDeLasBarrasHumedad.Checked End Sub Private Sub MostrarCurvaDehumedad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MostrarCurvaDehumedad.Click If MostrarCurvaDehumedad.Checked Then MostrarCurvaDehumedad.Checked = False Else MostrarCurvaDehumedad.Checked = True End If Chart2.Series("Curva de Humedad").Enabled = MostrarCurvaDehumedad.Checked End Sub Private Sub acercademenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles acercademenu.Click AboutBox1.Show()

End Sub Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click If MsgBox("Desea Salir del Programa?", MsgBoxStyle.YesNo, "Salir del Programa") = MsgBoxResult.Yes Then Me.Close() End If End Sub Private Sub toolgrafica3dtemperatura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolgrafica3dtemperatura.Click If Me.toolgrafica3dtemperatura.Checked Then toolgrafica3dtemperatura.Checked = False Else toolgrafica3dtemperatura.Checked = True End If Chart1.ChartAreas(0).Area3DStyle.Enable3D = toolgrafica3dtemperatura.Checked End Sub Private Sub toolgrafica3dhumedad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolgrafica3dhumedad.Click If Me.toolgrafica3dhumedad.Checked Then toolgrafica3dhumedad.Checked = False Else toolgrafica3dhumedad.Checked = True End If Chart1.ChartAreas(1).Area3DStyle.Enable3D = toolgrafica3dhumedad.Checked End Sub Private Sub Hygrochron1_Fin_Mision1() Handles Hygrochron1.Fin_Mision MsgBox("Se ha detenido correctamente la misin", MsgBoxStyle.OkOnly, "Fin de Mision") End Sub Private Sub Hygrochron1_Inicio_Mision1() Handles Hygrochron1.Inicio_Mision 'Call inicializar() DetenerMisionToolStripMenuItem.Enabled = True If MsgBox("Se inici correctamente la misin", MsgBoxStyle.OkOnly, "Inicio de Mision") Then Call inicializar() Me.ProgressBar2.Enabled = False Me.ProgressBar2.Value = 0 End If End Sub

Private Sub toolintervalotemperatura1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalotemperatura1.Click Chart1.ChartAreas(0).AxisX.Interval = 5 toolintervalotemperatura1.Checked = True toolintervalotemperatura2.Checked = False toolintervalotemperatura3.Checked = False toolintervalotemperatura4.Checked = False End Sub Private Sub toolintervalotemperatura2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalotemperatura2.Click Chart1.ChartAreas(0).AxisX.Interval = 10 toolintervalotemperatura1.Checked = False toolintervalotemperatura2.Checked = True toolintervalotemperatura3.Checked = False toolintervalotemperatura4.Checked = False End Sub Private Sub toolintervalotemperatura3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalotemperatura3.Click Chart1.ChartAreas(0).AxisX.Interval = 20 toolintervalotemperatura1.Checked = False toolintervalotemperatura2.Checked = False toolintervalotemperatura3.Checked = True toolintervalotemperatura4.Checked = False End Sub Private Sub toolintervalotemperatura4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalotemperatura4.Click Chart1.ChartAreas(0).AxisX.Interval = 30 toolintervalotemperatura1.Checked = False toolintervalotemperatura2.Checked = False toolintervalotemperatura3.Checked = False toolintervalotemperatura4.Checked = True End Sub Private Sub toolintervalohumedad1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalohumedad1.Click Chart1.ChartAreas(1).AxisX.Interval = 5 toolintervalohumedad1.Checked = True toolintervalohumedad2.Checked = False toolintervalohumedad3.Checked = False toolintervalohumedad4.Checked = False End Sub Private Sub toolintervalohumedad2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalohumedad2.Click Chart1.ChartAreas(1).AxisX.Interval = 10 toolintervalohumedad1.Checked = False toolintervalohumedad2.Checked = True

toolintervalohumedad3.Checked = False toolintervalohumedad4.Checked = False End Sub Private Sub toolintervalohumedad3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalohumedad3.Click Chart1.ChartAreas(1).AxisX.Interval = 20 toolintervalohumedad1.Checked = False toolintervalohumedad2.Checked = False toolintervalohumedad3.Checked = True toolintervalohumedad4.Checked = False End Sub Private Sub toolintervalohumedad4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolintervalohumedad4.Click Chart1.ChartAreas(1).AxisX.Interval = 30 toolintervalohumedad1.Checked = False toolintervalohumedad2.Checked = False toolintervalohumedad3.Checked = False toolintervalohumedad4.Checked = True End Sub Private Sub ToolStripMenuItem35_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem35.Click Chart2.ChartAreas(0).AxisX.Interval = 5 ToolStripMenuItem35.Checked = True ToolStripMenuItem36.Checked = False ToolStripMenuItem37.Checked = False ToolStripMenuItem38.Checked = False ToolStripMenuItem39.Checked = False End Sub Private Sub ToolStripMenuItem36_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem36.Click Chart2.ChartAreas(0).AxisX.Interval = 10 ToolStripMenuItem35.Checked = False ToolStripMenuItem36.Checked = True ToolStripMenuItem37.Checked = False ToolStripMenuItem38.Checked = False ToolStripMenuItem39.Checked = False End Sub Private Sub ToolStripMenuItem37_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem37.Click Chart2.ChartAreas(0).AxisX.Interval = 15 ToolStripMenuItem35.Checked = False ToolStripMenuItem36.Checked = False ToolStripMenuItem37.Checked = True ToolStripMenuItem38.Checked = False ToolStripMenuItem39.Checked = False End Sub

Private Sub ToolStripMenuItem38_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem38.Click Chart2.ChartAreas(0).AxisX.Interval = 20 ToolStripMenuItem35.Checked = False ToolStripMenuItem36.Checked = False ToolStripMenuItem37.Checked = False ToolStripMenuItem38.Checked = True ToolStripMenuItem39.Checked = False End Sub Private Sub ToolStripMenuItem39_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem39.Click Chart2.ChartAreas(0).AxisX.Interval = 30 ToolStripMenuItem35.Checked = False ToolStripMenuItem36.Checked = False ToolStripMenuItem37.Checked = False ToolStripMenuItem38.Checked = False ToolStripMenuItem39.Checked = True End Sub Private Sub ToolStripMenuItem44_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem44.Click Chart2.ChartAreas(1).AxisX.Interval = 5 ToolStripMenuItem44.Checked = True ToolStripMenuItem45.Checked = False ToolStripMenuItem46.Checked = False ToolStripMenuItem47.Checked = False ToolStripMenuItem48.Checked = False End Sub Private Sub ToolStripMenuItem45_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem45.Click Chart2.ChartAreas(1).AxisX.Interval = 10 ToolStripMenuItem44.Checked = False ToolStripMenuItem45.Checked = True ToolStripMenuItem46.Checked = False ToolStripMenuItem47.Checked = False ToolStripMenuItem48.Checked = False End Sub Private Sub ToolStripMenuItem46_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem46.Click Chart2.ChartAreas(1).AxisX.Interval = 15 ToolStripMenuItem44.Checked = False ToolStripMenuItem45.Checked = False ToolStripMenuItem46.Checked = True ToolStripMenuItem47.Checked = False ToolStripMenuItem48.Checked = False End Sub

Private Sub ToolStripMenuItem47_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem47.Click Chart2.ChartAreas(1).AxisX.Interval = 20 ToolStripMenuItem44.Checked = False ToolStripMenuItem45.Checked = False ToolStripMenuItem46.Checked = False ToolStripMenuItem47.Checked = True ToolStripMenuItem48.Checked = False End Sub Private Sub ToolStripMenuItem48_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem48.Click Chart2.ChartAreas(1).AxisX.Interval = 30 ToolStripMenuItem44.Checked = False ToolStripMenuItem45.Checked = False ToolStripMenuItem46.Checked = False ToolStripMenuItem47.Checked = False ToolStripMenuItem48.Checked = True End Sub Private Sub guardarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles guardarToolStripMenuItem.Click Dim owrite As System.IO.StreamWriter Dim DIRECCION_EN_DISCO As String Dim acumulador As Integer Me.SaveFileDialog1.Filter = "TXT files (*.Txt)|*.txt|All files (*.*)|*.*" If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then DIRECCION_EN_DISCO = SaveFileDialog1.FileName owrite = File.CreateText(DIRECCION_EN_DISCO) owrite.WriteLine(Label8.Text + Chr(13)) owrite.WriteLine(Label9.Text + Chr(13)) owrite.WriteLine(Label10.Text + Chr(13)) owrite.WriteLine(Label11.Text + Chr(13)) owrite.WriteLine(Label13.Text + Chr(13)) owrite.WriteLine(Label14.Text + Chr(13)) owrite.WriteLine(Label16.Text + Chr(13)) owrite.WriteLine(Label17.Text + Chr(13)) owrite.WriteLine(Label19.Text + Chr(13)) owrite.WriteLine(Label20.Text + Chr(13)) owrite.WriteLine(Label18.Text + Chr(13)) owrite.WriteLine(Label31.Text + Chr(13)) owrite.WriteLine(Label30.Text + Chr(13)) owrite.WriteLine(Label12.Text + Chr(13)) owrite.WriteLine(Label31.Text + Chr(13)) owrite.WriteLine(Label30.Text + Chr(13)) If muestras_en_mision > 0 Then owrite.WriteLine("Muestras en mision guardadas") For acumulador = 0 To Val(muestras_en_mision - 1) owrite.WriteLine(horas_muestras_de_temperatura(acumulador))

owrite.WriteLine(Str(muestras_de_temperatura(acumulador))) owrite.WriteLine(horas_muestras_de_humedad(acumulador)) owrite.WriteLine(Str(muestras_de_humedad(acumulador))) Next

End If owrite.Close() End If End Sub

Private Sub ToolStripMenuItem25_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem25.Click Dim oread As System.IO.StreamReader Dim DIRECCION_EN_DISCO As String Dim acumulador As Integer Dim jj As Integer Dim GG As Integer Me.OpenFileDialog1.Filter = "TXT files (*.Txt)|*.txt|All files (*.*)|*.*" If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then ToolStripMenuItem25.Enabled = False DetenerMisionToolStripMenuItem.Enabled = False BUTTON2.Enabled = False DIRECCION_EN_DISCO = OpenFileDialog1.FileName oread = File.OpenText(DIRECCION_EN_DISCO) Label8.Text = oread.ReadLine() oread.ReadLine() Label9.Text = oread.ReadLine() oread.ReadLine() Label10.Text = oread.ReadLine() oread.ReadLine() Label11.Text = oread.ReadLine() oread.ReadLine() Label13.Text = oread.ReadLine() muestras_en_mision = Val(Label13.Text) oread.ReadLine() Label14.Text = oread.ReadLine() oread.ReadLine() Label16.Text = oread.ReadLine() Hygrochron1.Alarma_Alta_Temperatura = Val(Label16.Text) oread.ReadLine() Label17.Text = oread.ReadLine() Hygrochron1.Alarma_Baja_Temperatura = Val(Label17.Text) oread.ReadLine() Label19.Text = oread.ReadLine() Hygrochron1.Alarma_Alta_Humedad = Val(Label19.Text) oread.ReadLine()

Label20.Text = oread.ReadLine() Hygrochron1.Alarma_Baja_Humedad = Val(Label20.Text) oread.ReadLine() Label18.Text = oread.ReadLine() oread.ReadLine() Label31.Text = oread.ReadLine() oread.ReadLine() Label30.Text = oread.ReadLine() oread.ReadLine() Label12.Text = oread.ReadLine() oread.ReadLine() Label31.Text = oread.ReadLine() oread.ReadLine() Label30.Text = oread.ReadLine() oread.ReadLine() dt3.Clear() dt4.Clear() GG = 1 jj = 1 If bandera3 = False Then dt3.Columns.Add(New DataColumn(" GetType(String))) dt3.Columns.Add(New DataColumn(" GetType(String))) dt4.Columns.Add(New DataColumn(" GetType(String))) dt4.Columns.Add(New DataColumn(" GetType(String))) bandera3 = True End If

Fecha/Hora", C ", Fecha/Hora", %RH ",

If oread.ReadLine = "Muestras en mision guardadas" Then For acumulador = 0 To Val(muestras_en_mision - 1) horas_muestras_de_temperatura(acumulador) = oread.ReadLine() muestras_de_temperatura(acumulador) = Val(oread.ReadLine()) horas_muestras_de_humedad(acumulador) = oread.ReadLine() muestras_de_humedad(acumulador) = Val(oread.ReadLine()) If muestras_de_temperatura(acumulador) > Hygrochron1.Alarma_Alta_Temperatura Then TextBox3.Text = TextBox3.Text + Str(acumulador + 1) + ") " + String.Format("{1:F3}", (muestras_de_temperatura(acumulador)), (muestras_de_temperatura(acumulador))) + " C " If GG Mod 2 = 0 Then TextBox3.Text = TextBox3.Text + vbCrLf End If GG = GG + 1 ElseIf muestras_de_temperatura(acumulador) < Hygrochron1.Alarma_Baja_Temperatura Then

TextBox1.Text = TextBox1.Text + Str(acumulador + 1) + ") " + String.Format("{1:F3}", (muestras_de_temperatura(acumulador)), (muestras_de_temperatura(acumulador))) + " C " If jj Mod 2 = 0 Then TextBox1.Text = TextBox1.Text + vbCrLf End If jj = jj + 1 End If If muestras_de_humedad(acumulador) > Hygrochron1.Alarma_Alta_Humedad Then TextBox3.Text = TextBox3.Text + Str(acumulador + 1) + ") " + String.Format("{1:F3}", (muestras_de_humedad(acumulador)), (muestras_de_humedad(acumulador))) + " %RH " If GG Mod 2 = 0 Then TextBox3.Text = TextBox3.Text + vbCrLf End If GG = GG + 1 ElseIf muestras_de_humedad(acumulador) < Hygrochron1.Alarma_Baja_Humedad Then TextBox1.Text = TextBox1.Text + Str(acumulador + 1) + ") " + String.Format("{1:F3}", (muestras_de_humedad(acumulador)), (muestras_de_humedad(acumulador))) + " %RH " If jj Mod 2 = 0 Then TextBox1.Text = TextBox1.Text + vbCrLf End If jj = jj + 1 End If dr = dt3.NewRow() dr(" Fecha/Hora") = horas_muestras_de_temperatura(acumulador) dr(" C ") = String.Format("{1:F3}", muestras_de_temperatura(acumulador), muestras_de_temperatura(acumulador)) dt3.Rows.Add(dr) dr3 = dt4.NewRow() dr3(" Fecha/Hora") = horas_muestras_de_humedad(acumulador) dr3(" %RH ") = String.Format("{1:F3}", muestras_de_humedad(acumulador), muestras_de_humedad(acumulador)) dt4.Rows.Add(dr3) Next Me.DataGridView1.DataSource = dt3 Me.DataGridView1.Enabled = True Me.DataGridView2.DataSource = dt4 Me.DataGridView2.Enabled = True Me.DataGridView1.ScrollBars = ScrollBars.Vertical Me.DataGridView1.AutoGenerateColumns = True Me.DataGridView2.ScrollBars = ScrollBars.Vertical Me.DataGridView2.AutoGenerateColumns = True Call graficar() Call graficar2()

'Visibilidad de los controles opcinales de los histogramas HistogramaDeTemperaturamenu.Visible = True HistogramadeHumedadmenu.Visible = True Me.toolgraficatemperatura.Visible = True Me.toolgraficahumedad.Visible = True '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ End If Me.Text = "Hygrochron-Logger Mision Cargada" TabControl1.Visible = True Me.ToolStripMenuItem15.Enabled = False Me.BackgroundImageLayout = ImageLayout.Center Me.guardarToolStripMenuItem.Enabled = True ImprimirReporteToolStripMenuItem.Enabled = True Me.ToolStripMenuItem27.Enabled = True oread.Close() End If End Sub Private Sub GroupBox6_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox6.Enter End Sub Private Sub GroupBox4_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox4.Enter End Sub Private Sub TabPage1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage1.Click End Sub End Class

S-ar putea să vă placă și