SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en...

345
Maestría en Ciencias área Telemática SISTEMA DE MONITOREO Y ALARMAS PROTOTIPO, PARA PLANTAS DE FUERZA AUXILIAR Y BANCOS DE BATERÍAS, UTILIZANDO UN ENLACE VÍA RADIO MÓDEM TESIS Que para obtener el grado de Maestro en Ciencias área Telemática Presenta Ing. Castro Palazuelos David Enrique Asesor M. en C. Ornelas Arciniega Gilberto Colima, Col., febrero de 2004

Transcript of SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en...

Page 1: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

Maestría en Ciencias área Telemática

SISTEMA DE MONITOREO Y ALARMAS PROTOTIPO, PARA PLANTAS DE FUERZA AUXILIAR Y BANCOS DE BATERÍAS, UTILIZANDO UN ENLACE VÍA

RADIO MÓDEM

TESIS

Que para obtener el grado de Maestro en Ciencias área Telemática

Presenta Ing. Castro Palazuelos David Enrique

Asesor M. en C. Ornelas Arciniega Gilberto

Colima, Col., febrero de 2004

Page 2: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

Gracias a mis padres y hermano (Ma. Adela Palazuelos, David E. Castro y

Ariel Fdo. Castro), ya que gracias a su apoyo y consejos e logrado uno de los

objetivos que me había trazado en mi vida.

Gracias al M.C. Gilberto Ornelas Arciniega, por su excelente guía.

Gracias a la Mtra. María Andrade Aréchiga, por su constante apoyo

durante mis estudios de maestría.

Gracias a Dios por prestarme esta vida.

Page 3: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

i

Índice

Presentación Introducción ....................................................................................... 1 Objetivo general ................................................................................ 2 Objetivos específicos.......................................................................... 2 Justificación ....................................................................................... 3 Metodología ........................................................................... 3 Capítulo 1. Microcontrolador y microprocesador............................................ 6 1.1 Microprocesador................................................................................. 7 1.2 Microcontrolador................................................................................ 7 1.3 Elección del microcontrolador más adecuado para ésta

aplicación............................................................................................ 8

1.4 Características requeridas por el microcontrolador a utilizar en esta tesis.....................................................................................................

8

Capítulo 2. Conversión Analógico-Digital.......................................................... 12 2.1 Proceso de digitalización de una señal............................................... 13 2.2 Teorema de muestreo de Nyquist....................................................... 14 2.3 Codificación y error por cuantización................................................ 14 2.4 Técnicas para la conversión A/D........................................................ 15 2.5 Sistemas de adquisición de datos........................................................ 16 2.6 Número de bits a emplear................................................................... 17 2.7 Módulo de conversión Analógico-Digital del PIC 16F874................ 18 2.8 Funcionamiento del módulo de conversión A/D del 16F874............. 23 2.9 Cálculos para el convertidor A/D....................................................... 24 Capítulo 3. Manejo del puerto serie del PIC...................................................... 29 3.1 Transmisión en paralelo...................................................................... 29 3.2 Transmisión en serie........................................................................... 30 3.3 Métodos para la sincronía................................................................... 30 3.4 Modos de intercambio de información............................................... 33 3.5 Formato de la información a transmitir............................................. 35 3.6 Módulo de comunicaciones USART del 16F874............................... 35 3.7 Elección del BAUDRATE.................................................................. 37 3.8 Funcionamiento del transmisor asíncrono.......................................... 39 3.9 Control de Errores.............................................................................. 42 3.10 Selección del método de detección de error....................................... 45 3.11 Elaboración del programa de cálculo del CRC.................................. 46 Capítulo 4. Implementación del monitoreo de las señales digitales y el

programa del microcontrolador...................................................... 50

4.1 Medición de la frecuencia................................................................... 51 4.2 Monitoreo de las señales de CFE y de Transferencia del sistema...... 59

Page 4: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

ii

4.3 Programa del µCu para la adquisición y la transmisión de los datos....................................................................................................

60

Capítulo 5. Control del puerto serie de la PC.................................................... 67 5.1 Control de la interfaz serial de la PC.................................................. 67 5.2 Elección del lenguaje de programación, mediante el cual se

implementará el control del puerto serie de la PC.............................. 72

5.3 Programa para la recepción de los datos............................................ 72 5.4 Conexión vía radio módems............................................................... 80 5.5 Elección del radio módem.................................................................. 80 Capítulo 6. Filtros ................................................................................................ 82 6.1 Especificaciones de un filtro............................................................... 85 6.2 Filtros digitales lineales e invariantes en el tiempo ........................... 86 6.3 Diseño de un filtro digital................................................................... 89 6.4 Diseño de los filtros IIR...................................................................... 93 6.5 Cálculo del filtro digital...................................................................... 101 6.6 Filtrado de las señales analógicas....................................................... 102 6.7 Diseño del filtro digital....................................................................... 104 6.8 Implementación del filtro antialias..................................................... 107 6.9 Submuestreo....................................................................................... 110 6.10 Coeficientes obtenidos del filtro digital............................................ 111 Capítulo 7. Graficación en la PC......................................................................... 113 7.1 Elección del leguaje de programación para la graficación................. 113 7.2 Sistema de graficación........................................................................ 113 7.3 Sistema de monitoreo......................................................................... 115 7.4 Visor de graficas anteriores................................................................ 121 7.5 Visor de alarmas por semana.............................................................. 124 7.6 Configuración de alarmas................................................................... 128 7.7 Pruebas de laboratorio del filtro pasa-bajas digital antialias.............. 130 Capítulo 8. Conclusiones...................................................................................... 138 8.1 Propuestas para desarrollos futuros.................................................... 139 8.2 Aportes personales.............................................................................. 140 ANEXO I........................................................................................... I-i ANEXO II.......................................................................................... II-i ANEXO III........................................................................................ III-i ANEXO IV........................................................................................ IV-i Bibliografía........................................................................................ B-1

Page 5: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

iii

Relación de figuras

Figura 1.1 Diagrama del proyecto........................................................................ 6 Figura 2.1 Gráfica que muestra las características de una señal.......................... 12 Figura 2.2 Gráfica que representa el muestreo a una frecuencia constante de

una señal analógica, cuantificada, codificada y cuantizada con 8 bits......................................................................................................

13

Figura 2.3 Proceso de digitalización de una señal............................................... 13 Figura 2.4 Sistema de adquisición de datos......................................................... 16 Figura 2.5 Proceso de conversión A/D................................................................ 24 Figura 2.6 Modelo de una entrada analógica....................................................... 25 Figura 2.7 Comportamiento de RSS en función de VDD.................................... 26 Figura 2.8 Diagrama de flujo de la conversión A/D............................................ 28 Figura 3.1 Formato de transmisión, de una señal síncrona, controlado por un

reloj..................................................................................................... 31

Figura 3.2 Formato de datos asíncronos.............................................................. 32 Figura 3.3 Representación en el tiempo de una señal asíncrona.......................... 32 Figura 3.4 Modo de operación simplex............................................................... 33 Figura 3.5 Modo de operación Half-duplex......................................................... 33 Figura 3.6 Modo de operación Full-duplex......................................................... 34 Figura 3.7 Modo de operación Full/full-duplex................................................... 34 Figura 3.8 Paquete de información (orden en que son transmitidos los datos

hacia la PC)......................................................................................... 35

Figura 3.9 Diagrama de flujo de la transmisión asíncrona.................................. 41 Figura 3.10 CRC en el transmisor........................................................................................ 46 Figura 3.11 CRC en el receptor............................................................................. 47 Figura 3.12 Lógica del cálculo del CRC................................................................ 47 Figura 4.1 Reloj de tiempo real............................................................................ 50 Figura 4.2 Comportamiento de Flag_Reloj.......................................................... 57 Figura 4.3 Diagrama de flujo de la Interrupción.................................................. 59 Figura 4.4 Estructura del paquete de información transmitido.(Orden en que

son transmitidos los datos)................................................................. 61

Figura 4.5 Diagrama de flujo del programa completo del microcontrolador...... 65 Figura 4.6 Circuito del sistema de monitoreo..................................................... 66 Figura 5.1 Configuración de módem nulo (comunicación simplex)................... 71 Figura 5.2 Diagrama de flujo general de recepción en la PC..................................... 79 Figura 5.3 Conexión vía radio módem................................................................. 80 Figura 6.1 Curva de ganancia de un filtro pasa-bajas ideal y real....................... 84 Figura 6.2 Especificaciones de un filtro real........................................................ 85 Figura 6.3 Variación monotonica......................................................................... 85

Page 6: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

iv

Figura 6.4 Variación No-monotonica.................................................................. 86 Figura 6.5 Espectro de frecuencia de una señal sin ALIAS y con

ALIAS(traslape)................................................................................. 93

Figura 6.6 Propiedades de la transformación bilineal.......................................... 96 Figura 6.7 Diagrama a bloques para el filtrado de las señales analógicas........... 103 Figura 6.8 Espectro ( )X jw de una señal real.................................................... 104

Figura 6.9 Espectro ( )jwX e ................................................................................ 105

Figura 6.10 Espectro ( )jwX e real, mf >2 xf ........................................................ 105

Figura 6.11 Efecto del alias mf <2 xf .................................................................... 106 Figura 6.12 Respuesta en frecuencia del filtro pasa-bajas antialias....................... 107 Figura 6.13 Filtro antialias analógico.................................................................... 108 Figura 6.14 Respuesta en frecuencia del filtro pasa-bajas empleado.................... 108 Figura 7.1 Diagrama de bloques ilustrativo del sistema de graficación.............. 114 Figura 7.2 Apariencia de la ventana del sistema de monitoreo........................... 116 Figura 7.3 Diagrama de flujo del timer en VB.................................................... 118 Figura 7.4 Diagrama de flujo del sistema de monitoreo...................................... 120 Figura 7.5 Apariencia de la ventana del visor de gráficas anteriores.................. 121 Figura 7.6 Apariencia de el reporte del visor de graficas anteriores.................... 122 Figura 7.7 Diagrama de flujo del visor de graficas anteriores............................. 123 Figura 7.8 Apariencia de la ventana del visor de alarmas semanales.................. 124 Figura 7.9 Apariencia de el reporte del visor de alarmas por semana................. 126 Figura 7.10 Diagrama de flujo del visor de alarmas por semana........................... 127 Figura 7.11 Apariencia de la ventana de configuración de alarmas...................... 128 Figura 7.12 Mensaje de alarmado.......................................................................... 129 Figura 7.13 Circuito de entrada empleado durante las pruebas de laboratorio..... 131 Figura 7.14 Señal de entrada digitalizada para la prueba #1................................. 133 Figura 7.15 Señal de salida digitalizada y filtrada para la prueba #1................... 133 Figura 7.16 Señal de entrada digitalizada para la prueba #2................................. 134 Figura 7.17 Señal de salida digitalizada y filtrada para la prueba #2................... 135 Figura 7.18 Señal de entrada digitalizada para la prueba #3................................. 136 Figura 7.19 Señal de salida digitalizada y filtrada para la prueba #3.................... 136

Page 7: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

v

Relación de tablas

Tabla 1.1 Tabla comparativa de algunos PICS de Microchip............................ 10 Tabla 2.1 Error de cuantización expresado en porcentaje, en función de n....... 17 Tabla 2.2 Valor absoluto del error de cuantización, para n=8, y n=10.............. 17 Tabla 2.3 Señales analógicas a monitorear......................................................... 18 Tabla 2.4 Bits que componen cada uno de los registros relacionados con el

módulo de conversión A/D del PIC 16F874...................................... 20

Tabla 2.5 Bits de control de configuración de los puertos A y E (PORTA y PORTE)..............................................................................................

22

Tabla 2.6 Distribución de los bits resultantes de la conversión A/D (Registros ADRESH y ADRESL).......................................................................

27

Tabla 3.1 Registros asociados con la USART, con sus respectivos bits............ 35 Tabla 3.2 Formulas para el cálculo del BAUDRATE........................................ 37 Tabla 4.1 Registros asociados a TMR0.............................................................. 52 Tabla 4.2 Configuración del predivisor de TMR0.............................................. 54 Tabla 4.3 Registros asociados a TMR1.............................................................. 54 Tabla 4.4 Configuración del divisor de TMR1................................................... 55 Tabla 4.5 Registros asociados a TMR2.............................................................. 56 Tabla 4.6 Tabla descriptiva de las señales de C.F.E y Transferencia del

sistema................................................................................................ 60

Tabla 5.1 Direcciones bases más usadas para el puerto serie............................. 68 Tabla 5.2 Terminales del puerto serie................................................................. 68 Tabla 5.3 Registros de la UART de la PC.......................................................... 69 Tabla 5.4 Configuración de bits de los registros internos de la UART............. 70 Tabla 5.5 Configuraciones de BAUDRATE más usados................................... 70 Tabla 5.6 Motivos que producirán un incremento en los contadores de errores

y ceros................................................................................................. 74

Tabla 6.1 Características de los filtros analógicos usados habitualmente para

diseñar filtros digitales IIR................................................................. 100

Tabla 6.2 Especificaciones y coeficientes del filtro digital antialias.................. 111 Tabla 7.1 Archivos generados por cada uno de los programas.......................... 115 Tabla 7.2 Condiciones para la generación o disparo de las alarmas.................. 129 Tabla 7.3 Filtro digital empleado durante las pruebas........................................ 130 Tabla 7.4 Parámetros empleados para las pruebas............................................. 131 Tabla 7.5 Tabla comparativa entre la señal de entrada digitalizada, y la señal

de salida digitalizada y filtrada.......................................................... 134

Tabla 7.6 Tabla comparativa entre la señal de entrada digitalizada, y la señal de salida digitalizada y filtrada.........................................................

135

Page 8: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

vi

Tabla 7.7 Tabla comparativa entre la señal de entrada digitalizada, y la señal de salida digitalizada y filtrada..........................................................

137

Page 9: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

vii

Resumen

La implementación de este sistema de monitoreo y alarmas prototipo, para plantas de

fuerza auxiliar y/o bancos de baterías, utilizando un enlace vía radio módem, permite que los

encargados de llevar acabo el mantenimiento de estos equipos, puedan observar el

comportamiento de las señales generadas por estos; desde una central remota, en una oficina.

El desarrollo de prototipo se llevó acabo utilizando un microcontrolador (PIC 16F874

de Microchip), el cual proporciona la información a una Computadora Personal (PC), a través

del puerto serie, utilizando un enlace con radio módems.

Page 10: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

viii

Abstract

The implementation of the prototype for the monitoring system and alarms for

auxiliary power plants and/or batteries bank, using a radio modem link, allows the

maintenance personnel of these equipments to observe the behavior of the generated signals

from a remote power station.

The development of the prototype was carried out using a microcontroller (PIC 16F874

of Microchip). This microcontroller provides the information to a Personal Computer (PC) by

means of the serial port using a radio modem link.

Page 11: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

1

Introducción

Desde que Alexander Graham Bell, inventó el teléfono, la necesidad de comunicarse

de manera satisfactoria y segura se ha incrementado significativamente. Hoy en día estar

comunicado, ya sea a través de un teléfono, o por una red de computadoras, ya no es un lujo

sino una necesidad. Esta necesidad a su vez, tiene como consecuencia que las compañías de

telecomunicaciones encargadas de proporcionar los servicios (telefónicos, Internet o redes),

tales como TELMEX, TELCEL, AVANTEL, PEGASO, IUSACELL, AT&T etc.., se vean

obligados primero a incrementar su infraestructura para competir en el mercado, segundo a

asegurar que el servicio de comunicación entre los usuarios sea ininterrumpido, es decir, que

la comunicación entre dos usuarios no se pierda en ningún momento.

El gran crecimiento y demanda que se tiene no sólo en nuestro país sino en todo el

mundo, por los servicios de telecomunicaciones como son: Internet, la telefonía, las redes,

entre otros han provocando que las compañías de telecomunicaciones instalen más centrales y

repetidoras telefónicas. En algunas de ellas C.F.E. no les proporciona servicio de

alimentación de energía eléctrica para sus equipos.

Para asegurar la continuidad de sus servicios, éstas dependen del suministro

ininterrumpido de energía eléctrica, por esta razón, para los casos en que la energía eléctrica

comercial falle o donde C.F.E. no proporciona el servicio, la central debe contar con equipos

de emergencia ( también conocidos como grupos electrógenos) y/o baterías, los cuales entran

en servicio durante el fallo de la alimentación principal de corriente alterna (C.F.E.),

manteniendo el servicio, hasta que se restablezcan las condiciones normales.

Por lo anterior, resulta muy importante monitorear el estado del equipo de emergencia

y/o el banco de baterías; con la finalidad de poder tomar acciones correctivas en el menor

tiempo posible en caso de que se presenten fallas.

Además se debe considerar que estos equipos por lo general se encuentran localizados

en cerros, por lo que el monitoreo remoto, se implementa mediante radios, usualmente radio

Page 12: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

2

módems, de tal forma que la información obtenida del monitoreo será enviada vía radio

módem hacia la central matriz u oficina remota, con el fin de que las personas encargadas de

estos equipos monitoreen el comportamiento de la planta y de los bancos de baterías desde

su oficina central, y desde ahí, ellos estén en posibilidad de decidir en que momentos es

necesario tomar acciones correctivas, para asegurar que el servicio sea continuo.

Es importante señalar que en el mercado ya existe equipo que realiza estas funciones,

como por ejemplo TELMEX utiliza un sistema de monitoreo y alarmas llamado S.M.A.R.T.

reporter, pero esta clase de equipos tienen costos muy elevados, ya que son de importación;

por lo que en esta tesis se pretende elaborar un sistema de monitoreo y alarmas prototipo que

realice estas funciones pero a un costo menor que los existentes. El sistema S.M.A.R.T.

reporter, en forma muy general, lleva acabo esta función simplemente indicando en el monitor

de una PC, si un determinado equipo está encendido o apagado, y en cambio el sistema de

monitoreo que se ha elaborado en esta tesis, proporciona información más detallada de los

equipos monitoreados, ya que presentará la información en el monitor de una PC a través de

graficas representativas de los parámetros de voltaje, corriente y frecuencia de la planta de

fuerza auxiliar y el banco de baterías.

Objetivo general

“ Desarrollar un sistema prototipo que monitoree las señales producidas por las plantas

de fuerza y bancos de baterías y envíe a través de radio módems la información obtenida hacia

una oficina o central remota”.

Objetivos específicos

-Elaborar el sistema de adquisición de datos para la medición de voltaje, corriente y

frecuencia producido por la planta de fuerza, y el banco de baterías.

-Elaborar el sistema de señalización de la transferencia de energía de la planta.

Page 13: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

3

-Elaborar el sistema de señalización de existencia de alimentación de energía por parte de

C.F.E.

-Elaborar el programa de transmisión y recepción de la información.

-Elaborar el programa de graficación necesario, para desplegar las señales obtenidas por el

monitoreo en la PC.

Justificación

Debido a lo crítico que es el sistema de alimentación de energía eléctrica, para que las

empresas de telecomunicaciones puedan proporcionar un servicio de comunicación

ininterrumpido para los usuarios, éstas compañías, como ya se comentó, se ven obligadas a

instalar equipos de alimentación auxiliar (bancos de baterías y plantas de fuerza), también

conocidos como “sistemas de alimentación ininterrumpida” independientes de la

proporcionada por C.F.E.

Él sistema que se desarrollará en esta tesis a diferencia del utilizado por TELMEX

proporcionará información más detallada de las señales generadas, debido a que mostrará

gráficamente en el monitor de la PC el nivel de voltaje, corriente o frecuencia que el sistema

de alimentación ininterrumpida genere. De tal forma que se pueda conocer el comportamiento

a través del tiempo del equipo.

Éste proyecto permite aplicar de manera integral los conocimientos adquiridos

durante los estudios de la maestría en ciencias área telemática, debido a que, es necesario

contar con conocimientos en las áreas de electrónica, comunicaciones digitales,

telecomunicaciones e informática.

Metodología

Es importante señalar que en esta tesis se hará referencia a los equipos electrógenos,

y/o baterías con que cuenta TELMEX en las centrales telefónicas o repetidoras de microondas,

Page 14: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

4

por lo que las características de los equipos mencionados en este trabajo serán válidas sólo

para TELMEX.

Para el desarrollo de ésta tesis se considerará que las señales producidas por la planta

de fuerza, banco de baterías, C.F.E., y sistema de transferencia de energía de la planta, ya

están acondicionadas para su adquisición.

En el proyecto se utilizarán señales generadas en el laboratorio para simular las

proporcionadas por el equipo de fuerza debido a que no se cuenta con una planta de energía

auxiliar a disposición para la elaboración de este trabajo.

Partiendo de lo anteriormente comentado el proyecto se dividirá en las siguientes

partes (ver figura 1.1):

-Adquisición de las señales a monitorear utilizando un microcontrolador.

-Transmisión y recepción de las señales mediante radio módems.

-Graficación de las señales recibidas en la pantalla de la PC.

-Pruebas finales del comportamiento del sistema.

Está tesis se encuentra organizada, en nueve capítulos. En el primer capítulo titulado

“microcontroladores y microprocesadores”, se describen cada uno de ellos, y se justifica la

elección del microcontrolador.

En el segundo capítulo, “conversión analógica-digital”, se repasan los conceptos

básicos sobre la conversión A/D y los sistemas de adquisición necesarios para comprender el

funcionamiento del módulo de conversión A/D del microcontrolador.

En el tercer capítulo, “transmisión”, se repasan los conceptos sobre la transmisión de

datos y se describe el funcionamiento de la USART del microcontrolador 16F874.

El cuarto capítulo, “implementación del monitoreo de las señales digitales y programa

del microcontrolador”, se comenta la importancia de la implementación del reloj de tiempo

Page 15: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

5

real, se explica como se realizó el monitoreo de frecuencia, C.F.E., y transferencia del

sistema, se presentan las características principales del programa del microcontrolador y la

explicación de su funcionamiento.

En el quinto capítulo, “control del puerto serie de la PC”, se repasan los conceptos

básicos para el control del puerto serie de una computadora, para finalmente elaborar el

programa de recepción de la PC.

El sexto capítulo, “filtros”, trata los conceptos necesarios sobre los filtros que se

requieren para la elaboración de este trabajo, y se diseñan dichos filtros.

El séptimo capítulo, “graficación en la PC”, se describe la lógica de funcionamiento

del programa de graficación, y se presentan los resultados de las pruebas del sistema

incluyendo los filtros digitales.

En el octavo capítulo, “radio módems”, se explica su funcionamiento y los aspectos a

considerar para su elección. Finalmente en el noveno capítulo, se presentan las conclusiones

de este trabajo.

En el Anexo I, se presenta información amplia sobre los sistemas de alimentación

ininterrumpida usados por TELMEX. En los Anexos II, III, IV, se listan los programas.

Page 16: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

6

Capítulo 1. Microcontrolador y microprocesador

La figura 1.1 muestra el diagrama general del proyecto, el cual permite observar las

diferentes partes que conforman el trabajo (adquisición, transmisión y recepción, y

graficación).

Figura 1.1 Diagrama del proyecto.

Page 17: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

7

Para la adquisición de los datos y el manejo de la transmisión se requiere de una

microcomputadora (µC). La µC se puede implementar con un microprocesador (µP) o un

microcontrolador (µCu).

A continuación se describe sus principales características con el fin de poder

compararlos y así elegir el más apropiado para este proyecto.

1.1 Microprocesador

A un µP también se le conoce como CPU (Unidad Central de Procesos). Un µP es un

circuito integrado que alberga en su interior una Unidad de Control (interprete de

instrucciones) y temporización, una sección de registros, una ALU (Unidad Aritmética -

Lógica), y buses [5].

Un µP es un sistema abierto, ya que con ellos se puede construir una µC, con los

recursos que el diseñador desee, agregándole las partes que sean necesarias (puertos de E/S, y

memoria etc...). [6].

1.2 Microcontrolador

En cambio, un µCu es una µC completa que cuenta con CPU, memoria, puertos etc..,

todo en un solo circuito integrado. Ahora los recursos de un µCu son fijos y no están

diseñados (en general), para expandir estos recursos. Por esta razón se dice que el µCu es un

sistema cerrado [18].

Si los recursos limitados de un µCu son suficientes para una tarea dada y no se

contemplan futuras expansiones entonces lo recomendable es emplear un µCu.

Page 18: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

8

1.3 Elección del microcontrolador más adecuado para esta aplicación

Para elegir el µCu deben definirse los recursos necesarios como son: el tamaño de la

palabra, la velocidad y el consumo de energía.

Además desde el punto de vista práctico hay otros aspectos que considerar como:

disponibilidad de herramientas hardware y software para el desarrollo o en su defecto el costo

de las mismas, facilidad para la adquisición de estas herramientas y los propios µCu,

familiaridad con algún µCu en particular que permita reducir el tiempo de desarrollo etc..

1.4 Características requeridas por el microcontrolador a utilizar en esta tesis

Las funciones que el µCu debe realizar se dividen como de entrada y de salida:

• Entrada

1. Requiere 4 canales de conversión A/D, para adquirir lo siguiente:

• Un canal para el voltaje de la planta de fuerza

• Un canal para la corriente generada por la planta de fuerza

• Un canal para el voltaje del banco de baterías

• Un canal para la corriente generada por el banco de baterías

2. 3 entradas digitales, para lo siguiente:

• Una para la medición de la frecuencia producida por la planta de fuerza

• Una para observar si se realiza la transferencia del sistema

• Una para monitorear si existe o no falla en la alimentación de voltaje

entregado por parte de C.F.E.

• Salida

1. Un puerto serie

2. 6 salidas digitales, para lo siguiente:

• Una para indicar la operación del reloj

Page 19: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

9

• Una para indicar que se realizó la conversión A/D

• Una para indicar que se realizó el CRC

• Una para indicar que se realizó la transmisión

• Una para indicar el estado de la transferencia

• Una para indicar el estado de C.F.E

Otras características, desde el punto de vista práctico:

• El convertidor A/D del µCu, debe de ser de al menos 8 bits, ya que con ellos se

obtienen 255 niveles para la representación de las señales ha adquirir. Lo cual

proporciona una buena resolución, de aproximadamente 8/(2 )Vref .

• El µCu debe contar con al menos 1 timer y 1 contador. Con uno de ellos se

implementará el reloj de tiempo real que llevará el control de la adquisición y la

transmisión de la información, y el otro se empleará como un contador de pulsos

externos, a través del cual se implementará el frecuencímetro.

• La frecuencia de trabajo del µCu (CLK), es suficiente con que se encuentre en el

orden de los megahertz ( 1Mhz a 4Mhz ) .

• El consumo de energía en este caso no es un parámetro critico, ya que el sistema será

alimentado por baterías que se recargan continuamente.

Candidatos:

Existen varias familias de µCu que poseen las características necesarias como por

ejemplo: los PICS de Microchip, los AVR de ATMEL, o los µC de Motorola etc.., de entre

estos se decidió usar un PIC, por las siguientes razones:

• Experiencia de trabajo previa con esta familia.

• Disponibilidad de µCu de esta familia.

• Disponibilidad de herramientas para esta familia necesarias para el desarrollo.

En la tabla 1.1 se listan las características de varios µCu PIC que satisfacen los

requerimientos.

Page 20: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

10

Se decidió emplear el 16F874, por que se tenía disponible, además de que utiliza

memoria flash, las cuales son reprogramables eléctricamente.

Tabla 1.1 Tabla comparativa de algunos PICS de Microchip.

Page 21: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

11

Esta tabla sólo es representativa, de ningún modo son todos los que existen. No se

muestran otros microcontroladores, ya que se considera que son demasiados y además

innecesarios. Para finalidades de esta aplicación es suficiente esta tabla. Para más información

acerca de otros PICS dirigirse a la página de Microchip (www.Microchip.com).

Page 22: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

12

Capítulo 2. Conversión Analógico-Digital

Las señales que representan los parámetros son de dos tipos; analógicas y digitales. Las

señales analógicas son: el voltaje de la planta de fuerza y del banco de baterías, la corriente de

la planta de fuerza y del banco de baterías. Y las digitales son: la frecuencia de la planta de

fuerza, la transferencia, y la alimentación de C.F.E.

Las señales analógicas son continuas en el tiempo y sus valores de pico (positivo o

negativo) abarcan un continuo de valores dentro de cierto rango (ver figura 2.1), por ejemplo:

el voltaje de la línea es nominalmente 120Volts y generalmente tiene variaciones del orden del

8% de 120Volts, es decir podría variar entre 110.4Volt y 129.6Volts.

Figura 2.1 Gráfica que representa una señal en tiempo continuo (señal analógica).

Las señales digitales, están definidas para intervalos discretos de tiempo, y su amplitud

toma valores discretos dentro de ciertos rangos.

A una señal definida en intervalos discretos de tiempo se le llama muestreada, y a una

señal que toma valores discretos se le llama cuantizada. Por lo tanto una señal digital es

muestreada y cuantizada.

En la práctica muchas de las señales digitales, se obtienen a partir del muestreo de una

señal analógica, la cual posteriormente se codifica como un número binario el cual está

cuantizado [3].

En la figura 2.2 se representa una señal analógica muestreada a una razón de muestreo

constante y codificada con 8 bits. Con ocho bits sólo se pueden representar 256 números y si

Page 23: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

13

suponemos que codificamos un número binario entero que puede ser positivo o negativo,

entonces una posibilidad sería obtener todos los números enteros entre –127 y +128.

Figura 2.2 Gráfica que representa el muestreo a una frecuencia constante de una señal analógica, cuantificada,

codificada y cuantizada con 8 bits.

2.1 Proceso de digitalización de una señal

El proceso de digitalización de una señal se muestra en la figura 2.3:

MUESTREO CUANTIFICACIÓNSeñalAnalógica

SeñalDigital

1010111

Figura 2.3 Proceso de digitalización de una señal.

En el proceso de digitalización la señal analógica se muestrea normalmente a una razón

constante. La señal muestreada se codifica para obtener un número binario.

La señal muestreada se mantiene constante durante el proceso de codificación ya que

este requiere de una tiempo finito que no es cero.

Al proceso de codificar la señal analógica muestreada se le llama conversión analógica

a digital (abreviado A/D) y al circuito electrónico que la realiza se le llama convertidor A/D.

Page 24: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

14

2.2 Teorema de muestreo de Nyquist

El teorema de muestreo de Nyquist establece que para que una señal continua en el

tiempo sea reproducida correctamente en el destino (receptor), cada periodo de la señal

analógica de entrada debe muestrearse por lo menos dos veces, es decir: 2s af f≥ (2.1)

En donde:

sf = Es la mínima razón de muestreo de Nyquist (Hertz)

af = Es la frecuencia más alta que contiene la señal analógica (Hertz).

En caso de no ser respetado el teorema de Nyquist, se produciría una distorsión

conocida como “aliasing”, o distorsión encimada. Esta distorsión consiste básicamente en que

toda frecuencia de la señal analógica mayor que / 2sf , parecería como si en realidad fuera

menor que / 2sf [8].

2.3 Codificación y error por cuantización

En la codificación a cada valor de la señal analógica se le asigna un número binario. Si

este número es de n bits, entonces hay 2n posibles números binarios.

El rango de la señal analógica que acepta el convertidor A/D se conoce como rango de

escala completa o FSR (por sus siglas en ingles Full Scale Rank). Usualmente los 2n números

se asignan uniformemente para todo el rango de escala completa. Entonces en términos de la

escala completa, sólo es posible representar exactamente los niveles de la señal de entrada que

son múltiplos enteros del valor.

2n

FSRQ = (2.2)

Page 25: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

15

A Q se le conoce como paso de la cuantización. Equivalentemente Q representa el

valor (en términos de FSR) de un bit, o el valor del bit menos significativo del código (por sus

siglas en ingles Least Significant Bit).

2n

FSRLSB = (2.3)

Si el nivel de la señal de entrada no es múltiplo entero de / 2nFSR , entonces se le

asignaría el valor más cercano, esto es precisamente lo que se denomina cuantización.

Entonces en la cuantización se puede incurrir en un error. Si ( )e t es el error en que se incurre

al cuantizar se tiene que:

( ) 102

e t Q≤ ≤ =2(2 )n

FSR (2.4)

Entonces el error disminuye con n. Con frecuencia al error por cuantización se le llama

resolución, por que el convertidor puede que no distinga un cambio en la señal analógica

menor que (1/ 2)Q .

2.4 Técnicas para la conversión A/D

Existen diferentes técnicas para la conversión A/D, entre las cuales se pueden

mencionar las siguientes [5], [9], [3].

• Aproximaciones sucesivas.

• Integración.

• Contador.

• Paralelo.

• Doble pendiente.

Page 26: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

16

2.5 Sistemas de adquisición de datos

Un sistema de adquisición de datos (como el desarrollado en ésta tesis), consiste de los

siguientes bloques:

• Multiplexor (llamado en ocasiones multicanalizador).

• Circuito de muestreo y retención.

• Convertidor A/D.

En la figura 2.4 se muestra un diagrama a bloques de un sistema de adquisición de

datos.

Figura 2.4 Sistema de adquisición de datos.

El multiplexor es básicamente un conmutador con múltiples interruptores, el cual

conmuta las entradas analógicas, permitiendo emplear un sólo circuito de muestreo y retención

(S & H) y un solo convertidor A/D. La conversión se realiza para cada entrada o canal en

intervalos de tiempo diferentes, en forma cíclica.

La conmutación de los canales y la correspondiente adquisición se controla en el

tiempo por medio de un reloj denominado reloj de tiempo real. Este reloj determina con

precisión los instantes de tiempo en que se realiza la adquisición de cada canal. Este reloj es

independiente de la ejecución del programa.

RELOJ DE TIEMPO REAL MULTIPLEXOR

MUESTREO Y RETENCIÓN

A0

A1

A2

A3

A4

A5

A6

A7

Señales analógicas de entrada

CONVERSIÓN ANALÓGICA -

DIGITAL

Señales digitales de

salida

Page 27: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

17

2.6 Número de bits a emplear

El número de bits (n) a emplear en una conversión A/D puede definirse con base en el

máximo error de cuantización tolerable, ya que este es inversamente proporcional a 2n .

)

( )2(2FSRe t n≤

El error puede expresarse como un porcentaje del rango de escala completa, como se

muestra a continuación:

)

100( ) %2(2FSRe t n FSR

)100( ) %

2(2e t n≤

(2.5)

De tal forma que para n=8bits, y n=10bits, se tienen los siguientes errores: n ( )e t (%) de FSR

8 0.1953125

10 0.048828125

Tabla 2.1 Error de cuantización expresado en porcentaje, en función de n.

Y el valor absoluto dependerá del valor del FSR. Para los rangos de las señales a medir

tenemos: SEÑAL 8 BITS 10 BITS

Voltaje Planta de Fuerza (147V) 0.287109375 0.07177734375

Corriente Planta de Fuerza (133 Amp) 0.259765625 0.06494140625

Voltaje Banco de Baterías (24V) 0.046875 0.01171875

Corriente Banco de Baterías (12.5 Amp) 0.0244140625 0.006103515625

Tabla 2.2 Valor absoluto del error de cuantización, para n=8, y n=10.

De las tablas 2.1 y 2.2 se puede observar que con 8 bits, es suficiente ya que el valor

absoluto del error de cuantización es pequeño de apenas 0.28, además de que emplear 8 bits

permite usar aritmética de un byte, lo cual es más sencillo que emplear aritmética de 16 bits

(2 bytes), ya que el PIC 16F874 es un µCu de 8 bits.

Page 28: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

18

Los valores de las señales analógicas reales a monitorear se muestran en la siguiente

tabla (ver tabla 2.3): SEÑAL A MONITOREAR VALOR NOMINAL TOLERANCIA RANGO DE VALORES VALORES EN

EL µCu

Voltaje Planta de Fuerza 120 Vca 23% 0-147 Volts

0- 2.5Volts de c.d.

Corriente Planta de Fuerza 110 Amp 21% 0-133 Amp

Voltaje Banco de Baterías 24 Vcd 21% 0-29 Volts

Corriente Banco de Baterías 12.5 Amp 20% 0-15 Amp

Tabla 2.3 Señales analógicas a monitorear.

Los valores de estas señales están fuera del rango del convertidor A/D del µCu, por lo

tanto es necesario acondicionar estas señales para que su rango a la entrada del PIC sea de

0Volts a 2.5Volts de c.d. La implementación del acondicionamiento de las señales, no se realiza

en esta tesis, si no que se supone que éstas ya han sido acondicionadas.

Generalmente el acondicionamiento de las señales incluye el filtrado para evitar la

distorsión por “alias”.

En todo sistema las señales son contaminadas por señales extrañas cuyo origen puede

ser externo o bien interno al propio sistema. A estas señales extrañas se les conoce con el

nombre genérico de ruido.

No es raro que el ruido contenga frecuencias altas, incluso mayores que las de las

propias señales. Por esta razón y por la ausencia del filtrado del acondicionamiento, antes de

aplicar las señales al µCu, estas son filtradas con un filtro analógico pasa-bajas de primer

orden con frecuencia de corte igual a 0.005Hz, para obtener una atenuación de -40dB a la

mitad de la frecuencia de muestreo, la cual es de 1Hz (ver secciones 6.7 y 6.8).

2.7 Módulo de conversión Analógico-Digital del PIC 16F874

El microcontrolador PIC seleccionado, contiene un sistema de adquisición de 8 canales

de 10 bits. El convertidor A/D emplea la técnica de aproximaciones sucesivas y cuenta con:

Page 29: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

19

un multiplexor, un circuito de muestro y retención, y un convertidor A/D de aproximaciones

sucesivas, todo está integrado en un módulo llamado módulo de conversión A/D [1].

Los siguientes registros están relacionados exclusivamente con el módulo A/D (ver tabla 2.4):

• ADRESH (A/D Result High Register).

• ADRESL (A/D Result Low Register).

• ADCON0 (A/D Control Register0).

• ADCON1 (A/D Control Register1).

Los registros ADRESH Y ADRESL, son los registros donde se almacena el valor

generado (resultante) por la conversión A/D.

El registro ADCON0, es el que se encarga del control del módulo A/D. Y el registro

ADCON1, se encarga de configurar las funciones de los pines (patas) del puerto. Ya que los

pines del puerto pueden ser usadas como entradas analógicas (además RA3, puede usarse

también como entrada para el voltaje de referencia), o E/S digitales.

Los siguientes registros también están asociados con el módulo A/D, pero no

exclusivamente (ver tabla 2.4):

• INTCON

• PIR1

• PIE1

• TRISA

• PORTA

• TRISE

• PORTE

El INTCON, es un registro de lectura/escritura, el cual contiene varios de los bits

habilitadores de interrupciones y banderas indicadoras.

Page 30: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

20

El PIR1, es un registro que contiene los bits, que trabajan como banderas indicadoras

de las interrupciones periféricas.

El PIE1, es el registro que contiene los bits habilitadores de las interrupciones

periféricas.

El TRISA, es el registro mediante el cual se puede configurar el PORTA, ya sea como

entrada (TRISA=111111), o como salida (TRISA=000000), basta con hacer 1 el bit,

correspondiente a la pata del PORTA que se desea usar como entrada y hacer cero aquella

que se desee usar como salida. El PORTA cuenta con 6 bits, que pueden ser configurados

como de entrada o como de salida. PORTA, es el registro mediante el cual se tiene acceso a

los valores de entrada o de salida, según como se haya configurado TRISA.

TRISE, es el registro de configuración del PORTE, el cual está formado por 3 bits, que

pueden ser configurados como entradas o como salidas (dependiendo con que valores se

carguen los bits, si con 1’s o 0’s).

PORTE, este registro permite leer, o escribir en el PORTE dependiendo de lo como

este configurado TRISE (como entrada o como salida). DIRECCIÓN NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

0Bh, 8Bh, 10Bh,18Bh

INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF

Och PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE Ieh ADRESH Registro que guarda el resultado de la conversión A/D 9Eh ADRESL Registro que guarda el resultado de la conversión A/D 1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0

GO/ DONE ---- ADON

9Fh ADCON1 ADFM ---- ---- ---- PCFG3 PCFG2 PCFG1 PCFG0 85h TRISA ---- ---- PORTA Registro de configuración del PORTA 05h PORTA ---- ---- PORTA Registro que puede ser usado como entrada o salida dependiendo de

cómo se configure el TRISA 89h TRISE IBF OBF IBOV PSPMODE ---- Bits de configuración del PORTE 09h PORTE ---- ---- ---- ---- ---- RE2 RE1 RE0

Tabla 2.4 Bits que componen cada uno de los registros relacionados con el módulo de conversión A/D del PIC 16F874.

Donde:

Las celdas sombreadas no se utilizan en la conversión A/D.

Page 31: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

21

Funciones de los bits (ver tabla 2.4):

• Gie INTCON<7> = Bit habilitador de las interrupciones globales.

1 = Habilita todas las interrupciones

0 = Deshabilita todas las interrupciones

• Peie INTCON<6> = Bit habilitador de las interrupciones periféricas.

1 = Habilita todas las interrupciones periféricas

0 = Deshabilita todas las interrupciones periféricas

• Adif PIR1<6> = Bandera de interrupción del ADC (convertidor Analógico-digital).

1 = Significa que la conversión A/D, se ha completado

0 = La conversión A/D no ha terminado

• Adie PIE1<6> = Bit habilitador de la interrupción del ADC.

1 = Habilita las interrupciones del convertidor A/D

0 = Deshabilita las interrupciones del convertidor A/D

• Adcs1:Adcs0 ADCON0<7:6> = Bits de selección del reloj de conversión A/D.

00 = Fosc/2

01 = Fosc/8

10 = Fosc/32

11 = Frc (Reloj derivado del oscilador RC interno, del modulo A/D)

• Chs2:Chs0 ADCON0<5:4:3> Bits de selección de los canales analógicos (ver tabla

2.5).

000 = Canal 0, (RA0/AN0)

001 = Canal 1, (RA1/AN1)

010 = Canal 2, (RA2/AN2)

011 = Canal 3, (RA3/AN3)

100 = Canal 4, (RA5/AN4)

101 = Canal 5, (RE0/AN5)

Page 32: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

22

110 = Canal 6, (RE1/AN6)

111 = Canal 7, (RE2/AN7)

• Go/ Done ADCON0<2> Bit de estado de la conversión A/D.

Si Adon=1:

1 = Conversión A/D, en progreso (haciendo este bit =1 inicia la conversión A/D)

0 = Conversión A/D, no está en progreso (este bit es automáticamente limpiado vía

hardware cuando la conversión A/D termina)

• Adon ADCON0<0> Bit de encendido del convertidor A/D.

1 = El módulo del convertidor A/D, está operando

0 = El módulo del convertidor A/D, está apagado

• Adfm ADCON1<7> Bit de selección del formato (justificación a la derecha o a la

izquierda). Éste bit no se encuentra implementado para el 16F874, por lo que siempre

será cero ( justificación a la izquierda).

1 = Justificación a la derecha. Los 6 bits más significativos del registro ADRESH, se

leen como cero

0 = Justificación a la izquierda. Los 6 bits menos significativos del ADRESL, se leen

como cero

• Pcfg3:Pcfg0 ADCON1<3:2:1:0> Bits de control de configuración del puerto (ver

tabla 2.5). PCFG3: PCFG0

AN7 RE2

AN6 RE1

AN5 RE0

AN4 RA5

AN3 RA3

AN2 RA2

AN1 RA1

AN0 RA0

Vref+ Vref- CANAL/Refs

0000 A A A A A A A A VDD VSS 8/0 0001 A A A A Vref+ A A A RA3 VSS 7/1 0010 D D D A A A A A VDD VSS 5/0 0011 D D D A Vref+ A A A RA3 VSS 4/1 0100 D D D D A D A A VDD VSS 3/0 0101 D D D D Vref+ D A A RA3 VSS 2/1 011X D D D D D D D D VDD VSS 0/0 1000 A A A A Vref+ Vref- A A RA3 RA2 6/2 1001 D D A A A A A A VDD VSS 6/0 1010 D D A A Vref+ A A A RA3 VSS 5/1 1011 D D A A Vref+ Vref- A A RA3 RA2 4/2 1100 D D D A Vref+ Vref- A A RA3 RA2 3/2 1101 D D D D Vref+ Vref- A A RA3 RA2 2/2 1110 D D D D D D D A VDD VSS 1/0 1111 D D D D Vref+ Vref- D A RA3 RA2 1/2

Tabla 2.5 Bits de control de configuración de los puertos A y E (PORTA y PORTE).

Page 33: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

23

Donde:

A = Entrada analógica.

D = Entrada/Salida (I/O) digital.

• TRISA<5:4:3:2:1:0> Estos bits se usan configurar el PORTA, ya sea como entrada o

como salida.

Todos aquellos bits que sean 1’s, configurarán a ese pin del PORTA como entrada y el

que sea cero se configurará como salida

• RA5:RA0 PORTA<5:4:3:2:1:0> Estos bits podrán ser usados como entradas o

como salidas dependiendo, de cómo se hallan configurado los bits del TRISA.

• TRISE<2:1:0> Estos bits se usan para configurar el PORTE, ya sea como entrada o

como salida.

Todos aquellos bits que sean 1’s, configurarán a ese pin del PORTE como entrada y el

que sea cero se configurará como salida

• RE2:RE0 PORTE<2:1:0> Estos bits podrán ser usados como entradas o como

salidas, dependiendo, de cómo se hallan configurado los bits del TRISE.

Una vez que se conoce la función de los bits de los registros que se encuentran

asociados al módulo de conversión A/D, se explicará el programa que lo controlará para el

PIC 16F874.

2.8 Funcionamiento del módulo de conversión A/D del 16F874

El muestreo y retención se realiza mediante un capacitor interno al µCu (Sample and

Hold Capacitor) el cual se carga a un voltaje igual al voltaje de entrada, y se retiene su carga

durante el proceso de conversión.

Page 34: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

24

El convertidor A/D produce una salida digital (código binario de 10 bits). El número

digital generado se almacena en los registros ADRESH y ADRESL, con justificación a la

izquierda. Lo cual significa que los 8 bits más significativos de la conversión se encontrarán

almacenados en ADRESH y los restantes en los bits más significativos de ADRESL.

Al final de la conversión el bit Go/ Done se limpia (ADCON0<2>) y la bandera Adif

se activa (PIR1<6>) (ver figura 7, y figura 8).

El módulo A/D, posee 2 entradas que son utilizadas como voltajes de referencia (Vref

alto y Vref bajo). Los cuales pueden ser seleccionados mediante la configuración de los bits

Pcfg3 al Pcfg0 del registro ADCON1 (ADCON1<3:2:1:0>) [1], [2].

El proceso de conversión consta de dos partes: la adquisición y la conversión A/D, lo

cual se muestra en la figura 2.5.

TIEMPO DE ADQUISICIÓN (TACQ)

TIEMPO DE CONVERSIÓN A-D

(12TAD)

Tiempo de muestreo

El capacitor de muestreo y retención inicia su carga.Después de la conversión A-D, o cuando un nuevo canal es seleccionado.

Cuando la conversión A-D está iniciando, se fija (activa)el bit Go.

La conversión finaliza, y el resultado se guarda en ADRESH y ADRESL.El capacitor empieza a adquirir el voltaje de entrada, durante la selección del canal, se activa el bit ADIF y se limpia Go.

Figura 2.5 Proceso de conversión A/D.

2.9 Cálculos para el convertidor A/D

Los siguientes cálculos permiten saber aproximadamente cuanto tiempo será

consumido como máximo por las operaciones de adquisición y conversión A/D.

Page 35: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

25

Tiempo de Adquisición (TACQ)

Durante la conversión A/D, se debe permitir que el capacitor de S&H, se cargue

completamente al voltaje del canal de entrada. Para poder calcular este tiempo mínimo

requerido se usa la siguiente ecuación:

Tiempo de fijado del amplificador+Tiempo de carga del capacitor de retencion+Coeficiente de temperaturaACQT =

ACQ AMP C COFFT T T T= + +

(2.6)

2AMP segT µ= (dado por el manual)Tiempo de fijado del amplificador (2.7)

( )( ) 1120 1 ln2047

C SS ST pF K R R= − Ω+ +

Tiempo de carga mínimo requerido por

el capacitor S&H .

(2.8)

Donde:

• Rs Impedancia de la fuente, la cual debe ser < 10kΩ , pero > 50Ω (recomendación

del fabricante) (ver figura 2.6) [1], [2].

• RssResistencia del interruptor del muestreo (resistencia interna) (ver figura 2.6).

• 1 kΩResistencia de interconexión interna, (RIC) (ver figura 2.6).

• 120pFCapacitor de S&H (CHOLD) (ver figura 2.6).

Figura 2.6 Modelo de una entrada analógica.

Page 36: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

26

Si VDD=5V, entonces RSS=7kΩ, ver figura 2.7 dada por el fabricante:

Figura 2.7 Comportamiento de RSS en función de VDD.

Y considerando el peor de los casos cuando RS=10kΩ. Entonces:

( )( ) 1120 18 ln 16.472047

CT pF K segµ= − Ω ≈

Por lo tanto, si se sabe que la temperatura máxima de operación es de 50 C° ,

considerando el peor de los casos entonces:

( )( )2 16.47 25 0.05 /ACQ AMP C COFFT T T T seg seg Temp C seg Cµ µ µ= + + = + + − ° °

( )( )2 16.47 50 25 0.05 / 19.72ACQT seg seg C seg C segµ µ µ µ= + + − ° ° =

(2.9)

De tal forma que no debe adquirirse con un T<19.72 segµ , para que el error al cargar

no sobrepase (1/ 2)LSB [1], [2].

Tiempo de conversión A/D

Con una frecuencia de muestreo de 1Hz por canal, y 11 canales, el convertidor debe ser

lo suficientemente rápido para realizar conversiones a una razón de 11Hz (tal frecuencia de

muestreo, y dicha cantidad de canales serán justificados más adelante). Esto significa que el

tiempo requerido debe ser menor que 90.90mseg, y el tiempo de conversión está dado por:

12(32 )12 AD ToscTconversion T == (2.10)

Donde TAD, es el tiempo de conversión requerido por bit. Puede pensarse entonces

que debería multiplicarse por 10 y no por 12, pero esto no ocurre así ya que después de que

cada conversión es completada, se requiere que transcurran 2TAD para que la adquisición

Page 37: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

27

pueda iniciar de nuevo. Durante este tiempo el capacitor de S&H, no se conecta a la entrada

analógica seleccionada [1], [2].

El TOSC es el periodo del oscilador del µCu. La frecuencia máxima del oscilador a lo

que puede trabajar el PIC es de 4Mhz. El PIC se va operar a esta frecuencia y por lo tanto:

1 0.254

OSCT segMhz

µ = =

(2.11)

132 32 84

AD OSCT T segMhz

µ = = =

(2.12)

Por lo que el tiempo de conversión para 10 bits es:

( )12 12 8 96ADTconversion T seg segµ µ= = ≈

Entonces con una frecuencia de 4MHz el convertidor no tiene ningún problema para

realizar las conversiones a razón de 8.64KHz (115.72 segµ de periodo).

Los bits resultantes de la conversión se encuentran distribuidos del siguiente modo en

los registros ADRESH y el ADRESL, como se muestra en la tabla 2.6. JUSTIFICACIÓN A LA IZQUIERDA (ADFM=0)

BITS DE LA CONVERSIÓN (BIT9-BIT0) BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 X X X X X X

ADRESH (BIT7-BIT0) ADRESL (BIT7-BIT0) Tabla 2.6 Distribución de los bits resultantes de la conversión A/D (Registros ADRESH y ADRESL).

Donde X=No importa.

De la tabla 2.6 se observa que los 8 bits más significativos se encuentran almacenados

en ADRESH, y los 2 bits menos significativos en ADRESL, pero para este proyecto sólo son

de interés los 8 bits más significativos. A continuación la figura 2.8 muestra el diagrama de

flujo del programa para el manejo de la conversión A/D .

Page 38: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

28

DECLARAR REGISTROS

CONFIGURAR PORTA COMO ENTRADA (DDAARAAA)

SELECCIONAR CANAL

ACTIVAR Flag_CAD

TOMAR LOS 8 BITS MÁS SIGNIFICATIVOS DE LA CONVERSIÓN

INICIO

Flag_Reloj=1?

SI

NO

INTERRUPCIÓN

ACTIVAR EL MÓDULO DE CONVERSIÓN

ESPERAR EL TIEMPO DE ADQUISICIÓN

INICIAR CONVERSIÓN

TERMINO CONVERSIÓN A/D?

SI

NO

SIGUIENTE CANAL

SELECCIONAR RELOJ DE CONVERSIÓN

Figura 2.8 Diagrama de flujo de la conversión A/D.

Page 39: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

29

Capítulo 3. Manejo del puerto serie del PIC

Los datos de las señales adquiridos por el µCu, deben transferirse a la PC para su

procesamiento y almacenamiento.

En una computadora, el intercambio de datos con el exterior se realiza a través de los

denominados puertos. En ocasiones no es conveniente transferir todos los bits

simultáneamente por lo cual se desarrollaron dispositivos denominados USART (Universal

Synchronous/Asynchronous Receiver/Transmiter).

Con estos dispositivos los datos se transfieren como una sucesión de pulsos, la cual se

envía a través de una sola línea, y el receptor recibe el tren de pulsos e identifica el estado de

cada bit, obteniendo como resultado el dato transmitido.

Al modo de transmisión en el cual se transfieren todos los bits simultáneamente se le

llama en paralelo, y al modo en el cual se transfieren como una sucesión de pulsos se le llama

en serie.

Se denomina puerto paralelo al dispositivo mediante el cual se transmiten datos en

paralelo.

Se denomina puerto serie al dispositivo mediante el cual se transfieren datos en serie.

3.1 Transmisión en paralelo

Con este tipo de transmisión se alcanzan velocidades de transmisión altas, pero se

requiere 1 hilo por cada bit. El tipo de drivers empleados en los puertos paralelos permite una

distancia máxima de transmisión de algunos metros (15 metros como máximo).

Page 40: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

30

3.2 Transmisión en serie

Con este tipo de transmisión se requieren dos hilos (uno para transmitir o recibir o

ambos) y uno de tierra, o tres hilos si se recibe y transmite por hilos diferentes (transmisión

asíncrona). En caso de que la transmisión fuese síncrona entonces se requeriría de un hilo

adicional para el reloj.

Los drivers disponibles para la transmisión en serie permiten alcanzar distancias

máximas de transmisión del orden de kilómetros. La desventaja de la transmisión en serie es

que la rapidez de transmisión es baja. Una ventaja muy importante de la transmisión en serie

es su mayor inmunidad al ruido, ya que para los drivers del puerto serie un 1 lógico se

encuentra de -3 a –25 volts, y un 0 lógico desde +3 a +25 volts, mientras que para el puerto

paralelo un 1 lógico existe de 2.8 a 5 volts, y un 0 lógico de 0 a 1.8 volts. Por lo tanto es más

fácil que el ruido pueda alterar el estado lógico de los bits que forman el dato en una

transmisión en paralelo ya que su zona de transición es de sólo 1volt, en cambio para la

transmisión en serie es de 6 volts [19].

3.3 Métodos para la sincronía

Cuando se están transfiriendo datos (en serie o en paralelo) el receptor debe recolectar

los datos dentro de un intervalo de tiempo dado. Entonces, además de los datos se requiere de

información adicional para que el receptor identifique estos intervalos de tiempo. A esta

información se le conoce como información para la sincronía, y es usual referirse a ella

simplemente como la sincronía. Existen dos métodos para generar esta información

denominados síncrono y asíncrono. En general el método asíncrono sólo se emplea para la

transmisión de datos en serie. De acuerdo con el método para la sincronía, a la correspondiente

transmisión (Tx) de datos se le llama:

• Síncrono (Tx Síncrona o formato de datos síncrono)

• Asíncrono (Tx Asíncrona o formato de datos asíncrono)

Page 41: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

31

Método síncrono

En este método la información para la sincronía se proporciona mediante una señal

independiente que se envía por una línea separada de los datos. Esta señal contiene pulsos, los

cuales definen el intervalo de tiempo en el cual se debe recolectar el dato. Es costumbre

denominar a esta señal como reloj para la sincronía [7], [8].

La figura 3.1 muestra el formato para la transmisión en serie síncrona.

TREN DE BITS

Volts CARACTER

T

Tiempo

Reloj de sincronía (Instantes de muestreo)

Figura 3.1 Formato de transmisión, de una señal síncrona, controlado por un reloj.

Método asíncrono

En el método asíncrono la información para la sincronía está implícita en el propio

dato. Como el dato, aparece como una sucesión de pulsos (un pulso por cada bit), entonces se

definen con precisión cual es el primer pulso, cual es el último pulso, y cuantos son los pulsos

en total. También está definida la duración de cada pulso.

El voltaje de la línea por la cual se transmiten los datos sólo puede tener dos valores,

nivel uno y nivel dos (nivel N1 y nivel N2). Cuando no se está transmitiendo ningún dato,

esta línea permanece en uno de estos dos niveles, por ejemplo en el nivel N1. Cuando se

inicia la transmisión la línea cambiará al nivel N2, y permanecerá en este durante un intervalo

de tiempo igual a la duración establecida para un pulso. A este pulso se le conoce como el bit

de inicio. Si se van a transmitir n bits, entonces durante los siguientes n intervalos de tiempo

(iguales a la duración de un pulso) el nivel de la línea indicará el valor del bit (0 o 1). Al

Page 42: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

32

terminar el último bit la línea se sostiene en el nivel N2 durante un intervalo de tiempo igual a

la duración de un pulso o bit. A este último bit se le llama bit de paro. Luego la línea regresará

al nivel N1, y permanecerá en este hasta que se inicie la transmisión de otro dato (ver figuras

3.2 y 3.3).

Aunque el receptor no recibe el reloj para la sincronía por un hilo separado, la

frecuencia esta implícita en la duración de 1 bit. Con esta información y los bits de inicio, y de

paro es posible generar en el receptor los instantes apropiados para el muestreo de los datos.

Cuando el receptor detecta el arranque de la transmisión un reloj interno se encarga de generar

los tiempos en que se tomaran las muestras de los bits. Obviamente este reloj opera a una

frecuencia más alta (cuando menos 3 veces mayor) que la usada por el transmisor.

Normalmente la información de un bit se recolecta en el punto medio del intervalo de tiempo

que dura un bit o pulso [19].

El formato de datos asíncrono que empleará es el siguiente:

Figura 3.2 Formato de datos asíncronos.

TREN DE BITS

Volts

CARÁCTER

Bit de

arranque

B0 B1 B2 B3 B4 B5 B6 Bit de

Paridad

Bit de

paro

Bit de

paro

Tiempo

Figura 3.3 Representación en el tiempo de una señal asíncrona.

1 - 0 B6 B5 B4 B3 B2 B1 B0 0 1 1

Bit de Paridad

Bit de Paro (stop, 1,1.5,2) Bits de datos

Bit de Arranque

(start)

LSB MSB

Page 43: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

33

Opcionalmente puede incluirse con el dato un bit de paridad, el cual se utiliza para la

detección de errores [7], [8].

3.4 Modos de intercambio de información

Además dependiendo de la forma en que la información sea intercambiada entre el

emisor y el receptor, su comunicación puede clasificarse como:

• Simplex (SX)

• Half-duplex (HDX)

• Full-duplex (FDX)

• Full/full-duplex (F/FDX)

Simplex

Así se les llama al modo de operación de un sistema de comunicaciones, en el cual las

trasmisiones ocurren sólo en un sentido (ver figura 3.4). En un sistema en donde se estén

comunicando 2 puntos, sólo uno de los puntos podrá transmitir, pero jamás recibir y el otro

punto hará lo opuesto sólo podrá recibir, jamás transmitir.

Figura 3.4 Modo de operación simplex.

Half-duplex

En este modo de operación ambos puntos, pueden transmitir pero no al mismo tiempo

(ver figura 3.5).

Figura 3.5 Modo de operación Half-duplex.

Receptor Emisor

Receptor-Emisor

Emisor-Receptor

o

Page 44: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

34

Full-duplex

En este modo de operación las transmisiones pueden ocurrir al mismo tiempo, en

ambos sentidos (por ejemplo el teléfono, es Full-duplex)(ver figura 3.6)

Figura 3.6 Modo de operación Full-duplex.

Full/full-duplex

En este modo de operación, se puede transmitir y recibir información pero de más de

un origen (ver figura 3.7).

Figura 3.7 Modo de operación Full/full-duplex.

Se eligió transmitir la información por medio de un puerto serie por las siguientes

razones:

• Mayor inmunidad al ruido.

• Se requieren menos hilos.

• Es capaz de soportar cableado con longitudes mayores.

• Los radio módems son compatibles con la transmisión en serie.

Receptor-Emisor

Emisor-Receptor

y

Receptor-Emisor

Emisor-Receptor

y

Receptor-Emisor

y y

Page 45: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

35

3.5 Formato de la información a transmitir

Los datos se enviarán por paquetes según el formato mostrado en la figura 3.8: Carácter de inicio

de paquete

Canal0

Canal1

Caqnal2

Canal3

C.F.E.

Transferencia

Frecuencia

CRC

CRC

Carácter de fin de paquete

ORDEN DE TRANSMISIÓN DE CADA BYTE 1 2 3 4 5 6 7 8 9 10 11

Figura 3.8 Paquete de información (orden en que son transmitidos los datos hacia la PC).

3.6 Módulo de comunicaciones USART del 16F874

El módulo USART es uno de los dos módulos de entrada/salida, conque cuenta este

microcontrolador [1]. Este módulo puede ser configurado como:

• Un sistema asíncrono.

• Un sistema síncrono.

En este trabajo el módulo se configurará como asíncrono. El módulo tiene capacidad

para transmitir y recibir 9 bits. El noveno bit se puede utilizar como bit de paridad para el dato

o bien como un indicador (cuando es igual a 1) de que el dato es una dirección. Este último

caso ocurre cuando se tiene comunicación entre varios procesadores, pero para este trabajo el

noveno bit simplemente no será empleado.

Los registros asociados con este módulo son:

• TXSTA (Transmit Status and Control Register)

• RCSTA (Receive Status and Control Register).

• SPBRG (Baud Rate Generator Register).

Y su configuración de bits se muestran en la tabla 3.1. DIRECCIÓN NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

98h TXSTA CSRC TX9 TXEN SYNC ---- BRGH TRMT TX9D 18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 99h Registro Generador del BAUD RATE

Tabla 3.1 Registros asociados con la USART, con sus respectivos bits. Donde:

Las celdas sombreadas no se utilizan en la generación del BAUD RATE (BRG).

Page 46: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

36

Funciones de los bits (ver tabla 3.1):

• Tx9 TXSTA<6> = Bit habilitador de la transmisión del noveno bit (bit paridad).

1 = Selecciona 9 bits de transmisión

0 = Selecciona 8 bits de transmisión

• Txen TXSTA<5> = Bit habilitador de la transmisión.

1 = Habilita transmisión

0 = Deshabilita transmisión

Funciones de los bits (ver tabla 3.1):

• Sync TXSTA<4>= Bit de selección del modo de transmisión.

1 = Modo síncrono

0 = Modo asíncrono

• Brgh TXSTA<2> = Bit de selección del tipo de BAUD RATE (Velocidad).

1 = Velocidad Alta (Modo asíncrono)

0 = Velocidad Baja (Modo asíncrono)

• Trmt TXSTA<1>= Bit estado del registro de corrimiento de transmisión.

1 = TSR vació

0 = TSR lleno

• Tx9d TXSTA<0> = Noveno bit del dato a transmitir (Puede ser el de paridad).

Funciones de los bits (ver tabla 3.1):

• Spen RCSTA<7> = Bit habilitador del puerto serie.

1 = Habilita el puerto serie

0 = Deshabilita el puerto serie

Page 47: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

37

Generador del BAUDRATE de la USART (BRG)

La razón de transmisión de los datos (o equivalentemente la duración de un bit) está

controlada por la frecuencia de un reloj. Esta frecuencia se establece mediante la

especificación del llamado BAUDRATE (BR).

El BAUDRATE especifica la razón de transmisión en bits/seg. Obsérvese que la razón

de transferencia de los datos no es igual al BAUDRATE. Por ejemplo, si el formato de los

datos es 1 bit de inicio, 8 bits de datos, y 1 bit de paro, la razón de transferencia de datos sería:

( )8 0.810bits BAUDRATE BAUDRATEbits = (3.1)

El BR depende de la frecuencia del reloj del µCu, del valor almacenado en el registro

SPBRG del µCu, y del valor del bit Brgh del registro TXSTA, según la tabla 3.2: SYNC BRGH=0 (Velocidad Baja) BRGH=1 (Velocidad alta)

0 (Modo asíncrono)

FoscBAUDRATE=64(SPBRG+1)

FoscBAUDRATE=16(SPBRG+1)

1 (Modo síncrono)

FoscBAUDRATE=4(SPBRG+1)

------

Tabla 3.2 Formulas para el cálculo del BAUDRATE.

3.7 Elección del BAUDRATE

En todo canal de transmisión la señal es alterada, ya sea por ruido o interferencias, o

bien debido a las imperfecciones del canal. El cableado empleado para la transmisión así como

el radio del radio módem distorsiona la señal de diversas maneras como por ejemplo:

distorsión de la amplitud, de la fase, ecos, etc...

En general mientras mayor sea la razón de transmisión de los datos, mayor será la

calidad requerida del canal de transmisión. Entonces para atenuar hasta donde sea posible los

Page 48: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

38

efectos nocivos del canal de transmisión es conveniente establecer el BAUDRATE como el

mínimo suficiente para transmitirlos de acuerdo con la rapidez con que se generan.

El formato propuesto para los datos es de 10 bits por carácter (1 bit de inicio, 8 bits de

datos, y 1 bit de paro). Como se van adquirir los datos a razón de 1Hz, y se adquieren 7

canales entonces se tiene que se generan un total de 10(7)=70 bits/seg.

Los 7 canales se envían en el orden que muestra la figura 3.8. Para formar el bloque se

requieren 4 bytes adicionales, como estos bytes se generan en el programa, el tiempo

requerido para hacerlo es mucho menor que 1 seg. Por lo cual se puede tomar como cero, y

entonces habrá que estar en posibilidades de transmitir un total de 70+40=110bits/seg, o sea el

BR mínimo debe ser 110bits/seg.

Como el µCu tiene que realizar otras tareas además de transmitir los datos debe

elegirse un BR mayor. 110bits/seg es un BR muy bajo para un radio módem moderno por lo

que es posible tomar un BR mayor.

Se pueden evitar complicaciones en el programa si se especifica que se puede enviar un

bloque en un intervalo de tiempo menor que el intervalo entre la adquisición de 2 canales

sucesivos. Este intervalo de tiempo es 1/7 de segundo. Entonces se puede especificar un BR

según:

110 770 /1/ 7

bitsBR bits seg≥ = (3.2)

Nuevamente hay que considerar que el µCu debe hacer otras tareas además de

transmitir. Si se especifica que el tiempo empleado en la transmisión requiere cuando mucho

la mitad del tiempo de procesamiento entonces el BR necesario sería:

1540 /BR bits seg≥ (3.3)

Page 49: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

39

Existe un conjunto de BR estándar empleados por la mayoría de los equipos. Los

valores estándar más cercanos a 1540bits/seg son 1200bits/seg y 2400bits/seg. Entonces el

valor elegido para el BR fue 2400bits/seg.

A continuación se calcula el valor que debe almacenarse en el registro SPBRG para

obtener el BR de 2400bits/seg, con la opción Brgh=1, y una frecuencia de 4MHz para el reloj

del µCu.

-Datos:

Fosc= 4Mhz

BAUDRATE (deseado) = 2,400

Brgh=1

Sync=0

FoscSPBRG= 116(BAUDRATE)

4 MhzSPBRG= 1 103.166667 10316(2400)

− = ≈

4MhzBAUDRATE calculado= 2403.8461516(103+1)

=

Por lo tanto:

BAUDRATE calculado-BAUDRATE deseadoERROR=BAUDRATE deseado

2403.84615-2400ERROR= 0.00160256412400

ERROR(%)=0.16025641%

=

(3.4)

3.8 Funcionamiento del transmisor asíncrono

El transmisor asíncrono está formado por el registro TSR (Transmit Serial Shift), un

buffer de lectura/escritura TXREG, los cuales son el corazón del transmisor, además cuenta

Page 50: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

40

con los siguientes bits Tx9, Txen, Trmt, Tx9d, Spen, y Txif mediante los cuales se controla la

transmisión.

El funcionamiento general es el siguiente; el registro TXREG se carga con el dato a

trasmitir vía software, tomándolo del Bus de Datos, posteriormente y de manera automática

el registro TSR toma el dato que se encuentre almacenado en el TXREG y lo transmite por el

pin RC6/Tx/CK (ver figura 4.6).

Una vez que el TXREG transfiere los datos al TSR, este se encuentra vacío lo cual es

indicado a través de la habilitación de la bandera de interrupción Txif (Txif=1). Esta bandera

se activará sin importar el estado del bit Txie, sin poder ser deshabilitada por programa; esto

significa que sólo puede ser limpiado cuando un nuevo dato se carga en el registro TXREG.

Además otro bit el Trmt muestra el estado del registro TSR, este registro es un bit de sólo

lectura, el cual se activa cuando el registro TSR se encuentra vacío, además este bit es

independiente de la lógica de interrupción por lo que el usuario puede estar revisando este bit

para determinar el estado del registro TSR (ver figura 3.9).

A continuación se proporciona un diagrama de flujo, ilustrativo de la transmisión de

los datos. La figura 3.9, no incluye la parte de adquisición de los datos, sólo muestra la parte

de transmisión.

Page 51: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

41

INICIO

DECLARAR REGISTROS

CONFIGURAR PUERTOS E/S

INTERRUPCIÓN

ESTABLECER BAUDRATE (Frecuencia de la transferencia en bits por segundo)

SELECCIONAR MODO ASÍNCRONO

HABILITAR PUERTO SERIE

HABILITAR LA TRANSMISIÓN

TOMAR EL DATO A TRANSMITIR

Flag_Reloj=0?

SI

NO

TSR ESTA VACÍO?

SI

NO

INICIAR LA TRANSMISIÓN

ACTIVAR Flag_TxSIGUIENTE CANAL

Figura 3.9 Diagrama de flujo de la transmisión asíncrona.

Page 52: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

42

3.9 Control de Errores

En todo sistema de comunicación existen errores, debido a las características no ideales

de los medios de transmisión, ya sea que se realice a través de un simple cable, fibra óptica, o

radio frecuencias; sin importar cual sea la vía utilizada para realizar la comunicación, siempre

existirán errores, por esta razón existen métodos de detección y corrección de tales errores [7],

[8], [12]. Y se pueden clasificar de la siguiente forma:

• Métodos de detección de errores sin corrección

• Métodos de detección con corrección de errores

Entre los métodos de detección existen los siguientes, entre otros:

• Redundancia

• De cuenta exacta

• Bit de paridad

• Código de redundancia cíclica (CRC)

Redundancia

Este método consiste en transmitir el dato 2 veces, de este modo en el receptor estos

dos datos son comparados y en caso de no ser iguales, significa que ocurrió un error.

De cuenta exacta

Este método es usado por ejemplo: por el código ARQ, en el cual cada carácter

contiene 3 unos por dato, de tal forma que si el receptor no recibe esa misma cantidad de unos

significa que existió un error.

Bit de paridad

Es un método muy sencillo de detección de errores el cual consiste en agregar un bit al

dato transmitido (Bit de paridad), el cual se usa para obligar a que cada dato posea un número

Page 53: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

43

impar o par de unos, por esta razón existen dos tipos de paridad: paridad par, y paridad impar.

Por ejemplo, si se transmite el siguiente dato:

Dato=P 10001110, donde P=bit de paridad

Si la paridad es par P=0, y si la paridad es impar P=1, debido a que existen 4 unos en el

dato. Y en el lado del receptor se cotejan cuantos unos llegaron en el dato con su bit de

paridad, y en caso de haber cambiado un bit, el error sería detectado.

Esté método posee ventajas y desventajas, su principal ventaja radica en su sencillez,

pero tiene grandes desventajas, ya que detecta sólo cambios de un número impar de bits, ya

que si un número par de bits cambia, el bit de paridad se mantendría sin cambio, por lo que el

error no sería detectado, se dice que este método sólo detecta el 50% de los errores de

transmisión lo cual es muy pobre. Por ejemplo, si se transmite un dato=P 10001110, donde

P=bit de paridad par, entonces P=0, y se recibe un dato=P 00001111, entonces P=0, por lo

tanto este error no sería detectado. De tal forma que todo cambio de bits que no produzcan un

bit de paridad diferente, no serán detectados.

Código de redundancia cíclica (CRC)

Se dice que este es el mejor método de detección de errores, ya que detecta alrededor

del 99.95% de los errores ocurridos en la transmisión. El CRC es el residuo de una operación

de división entre el dato a transmitir (Gx) más rbits (res el grado del polinomio generador),

y un polinomio generador (Px), la división no se realiza mediante una resta estándar, sino por

medio de una operación XOR. El CRC resultante se agrega al dato a ser transmitido. Y el

receptor recibe el dato y su CRC, los cuales se toman y se les aplica exactamente el mismo

proceso de división, sólo que en este caso el CRC debe ser igual a cero, cualquier otro

resultado en el CRC calculado en el receptor, significaría que ha ocurrido un error en la

transmisión. Pasos para el cálculo del CRC:

1. ( )G x rbits+ , donde r es el grado del polinomio generador.

2. ( )( )

G x rP x

+ , se obtiene un residuo (utilizando XOR) llamado CRC.

Page 54: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

44

3. ( )G x CRC Tx+ = , trama a transmitir.

Existen varios estándares internacionales que establecen un polinomio generador

determinado, los cuales son:

• CRC-12= 12 11 3 2 1x x x x x+ + + + +

• CRC-16= 16 15 2 1x x x+ + +

• CRC-CCITT= 16 12 5 1x x x+ + +

El CRC-16, y el CRC-CCITT, tienen las siguientes ventajas:

• Detectan todos los errores de 1 y 2 bits

• Detectan los errores con un número impar de bits invertidos

• Detectan ráfagas de error≤16 bits

• Detectan el 99.997% de los errores con longitudes de 17 bits

• Y el 99.998% con longitudes≥18 bits

Entre los métodos que detectan y corrigen errores existen los siguientes:

• Retransmisión

• Código de Hamming

Retransmisión

La retransmisión consiste en reenviar el dato cuando se ha recibido con error, ya que

el receptor se encargará de solicitar el reenvío del dato recibido con error. Este es un método

bastante confiable, pero no siempre es el de mayor eficiencia, debido a que esta depende del

tamaño del dato, de tal forma que si se emplea un dato corto, las posibilidades de que ocurra

un error en la transmisión es pequeña, pero en el caso que se usase un dato largo, las

posibilidades de error se incrementan, así como también las peticiones de reenvío. Además

este método no aplica para esta implementación ya que la comunicación será simplex.

Page 55: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

45

Código de Hamming

Con este método se detectan y se corrigen errores ocurridos en la transmisión, sin

necesidad de retransmitir el dato. La corrección del dato se realiza en el receptor. En este

método el número de bits que son necesarios agregar al dato a transmitir está definido en

función de la siguiente expresión:

2 1n m n≥ + +

Donde:

• n=número de bits de Hamming

• m=número de bits en el carácter de datos

Cabe señalar que este código de Hamming sólo podrá detectar y corregir un error de 1

bit. La ventaja de este método es que elimina la necesidad de reenvío de los datos, claro

siempre y cuando no exista error en más de 1 bit, pero su desventaja es que requiere de

tiempos de transmisión más largos debido a los bits de Hamming agregados al dato.

3.10 Selección del método de detección de error

Para este sistema en particular se decidió emplear el CRC, debido a que tiene una

excelente detección de error, y es más sencillo que emplear código de Hamming. La estrategia

para el manejo de los errores que se seguirá será la siguiente: cuando se detecte un error, el

receptor no solicitará retransmisión del paquete de información, ni lo corregirá, en lugar de

esto se tomará el último paquete de información recibido sin error, se dejará una opción de

configuración para que se defina la cantidad de errores máximos a tolerar durante un

determinado tiempo, antes de generar una alarma para indicar que existen problemas serios

con el enlace de comunicación.

Page 56: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

46

3.11 Elaboración del programa de cálculo del CRC

Como ya se mencionó anteriormente, el cálculo del CRC, es el residuo de la división

de el dato a transmitir(G(x)) más rbits, entre el polinomio generador (P(x)). Por ejemplo, en

este proyecto se utilizará el estándar CRC-16, por lo que en la operación de división habría

que anexarle 16 ceros a G(x), para llevar acabo el cálculo del CRC. Un ejemplo sencillo sería

el siguiente:

Datos:

• Dato a Tx = ( )G x 12 11 9 7 5 3 1 1101010101001x x x x x x+ + + + + + =

• Polinomio Generador = ( )P x 5 3 1 101001x x+ + =

• rbits=5 ceros 00000

Esto se realiza en el transmisor (ver figura 3.10). 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0

1 0 1 0 0 1

XOR 0 1 1 1 0 0 0

OPERACIÓN XOR 1 0 1 0 0 1 ENTRADAS SALIDA XOR 0 1 0 0 0 1 1

A B 1 0 1 0 0 1

1 1 0 XOR 0 0 1 0 1 0 0 1

0 0 0 1 0 1 0 0 1

1 0 1 XOR 0 0 0 0 0 0 0 0 1 0 0 0 0 0

0 1 1 1 0 1 0 0 1

CRC 0 1 0 0 1

T(x) 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1

G(x) CRC

Figura 3.10 CRC en el transmisor.

Y en el receptor, se toma ( )G x y el CRC , y se realiza lo siguiente: lógicamente tanto

el transmisor como el receptor están de acuerdo en cuanto al polinomio generador empleado

(ver figura 3.11).

Page 57: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

47

1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1

1 0 1 0 0 1

XOR 0 1 1 1 0 0 0

1 0 1 0 0 1

XOR 0 1 0 0 0 1 1

1 0 1 0 0 1

XOR 0 0 1 0 1 0 0 1

1 0 1 0 0 1

XOR 0 0 0 0 0 0 0 0 1 0 1 0 0 1

1 0 1 0 0 1

CRC 0 0 0 0 0

Figura 3.11 CRC en el receptor.

El CRC =0, lo cual indica que no se tuvo ningún error en la transmisión. Cualquier

otroCRC diferente de cero indica que existió un error.

Implementación CRC-16

La figura siguiente muestra la lógica empleada para la implementación del CRC. De

este diagrama se observa que todo el control del programa se lleva acabo mediante el manejo

de 3 registros de corrimiento, los cuales afectan al bit de acarreo del PIC (Bit <0> del registro

STATUS), y mediante el monitoreo de este bit se controla que operación realizar. Los tres

registros de corrimiento son: DATA_HIGH, DATA_LOW, y BUFFER (ver figura 3.12).

Otro par de registros que también se ligan de esta misma forma son XOR0_1 y

XOR0_0, los cuales almacenarán los resultados de las operaciones XOR, y por consiguiente

son los que contendrán el valor del CRC-16 resultante al final del programa, y los bits del

polinomio generador se almacenan en los registros Px_GENERADOR_1, y

Px_GENERADOR_0 (ver figura 3.12).

Figura 3.12 Lógica del cálculo del CRC.

Page 58: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

48

Además es importante mencionar que el número total de corrimientos necesarios para

el cálculo del CRC, está determinado por el tamaño del paquete de información. Por ejemplo,

Consideremos que se va a transmitir un paquete de información de 11 bytes (en estos 11 bytes

ya se están considerando los 2 bytes correspondientes a los 16 ceros que se deben agregar para

el cálculo del CRC), de tal forma que ocurrirá lo siguiente:

• DATA_HIGHAlmacenará el primer byte a transmitir

• DATA_LOWAlmacenará el segundo dato a transmitir

• BUFFERAlmacenará el tercer dato a transmitir

• Y el cuarto byte será cargado en el BUFFER una vez que ya se hayan acarreado los

8 bits del tercer byte en DATA_LOW. De tal forma que cuando

CONTA_CORRIMIENTO=8 provocará que BUFFER=4to. byte, y cuando

CONTA_CORRIMIENTO=16 provocará que BUFFER=5to. byte y así

sucesivamente hasta completar el total de corrimientos necesarios, los cuales se

encuentran definidos por la siguiente expresión:

Total de corrimientos= (# de bytes que forman el paquete de información – 2)*(8)

Donde:

• 2 se refiere a los primeros dos registros de corrimiento

• 8 se refiere a los 8 bits que conforman 1 byte

Por lo tanto para esté caso en particular Total de corrimientos=(11-2)*(8)=72

corrimientos.

Inicialmente XOR0_1 se carga con el valor de Px_GENERADOR_1, y XOR0_0 con el

valor de Px_GENERADOR_0.

La primera operación XOR, se efectúa entre los registros XOR0_1 con DATA_HIGH,

y XOR0_0 con DATA_LOW, pero el resto de las operaciones XOR se realizan cuando el bit7

del registro XOR0_1 es 1, y este es cargado en C. De tal forma que mientras XOR0_1<7>=0,

indica que no se puede realizar la operación XOR. Desde luego que si XOR0_1<7>=1, indica

que se debe realizar la operación XOR, pero está no se realiza si no hasta que se efectúen los

corrimientos en los registros XOR0_0, DATA_HIGH, DATA_LOW, BUFFER, y de que se

Page 59: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

49

cheque si DATA_LOW<0>, es 1 o 0, del cual dependerá que XOR0_0<0> sea igual a 1 o 0.

Una vez terminadas todas estas operaciones es cuando se realiza la operación XOR en caso de

ser necesario.

Page 60: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

50

Capítulo 4. Implementación del monitoreo de las señales digitales y el

programa del microcontrolador

Las señales digitales que se van a monitorear son:

1. Frecuencia de la Planta de Fuerza

2. Transferencia de la Planta de Fuerza

3. Existencia de la alimentación de C.F.E.

Las señales de Transferencia y la de existencia de alimentación de C.F.E. sólo tienen

dos posibles valores, un nivel bajo (aproximadamente 0 volts), y un nivel alto

(aproximadamente 5 volts), por lo que su procesamiento es diferente al de las señales

analógicas.

En este punto es conveniente recordar que para que la razón de adquisición de los datos

sea constante (y por lo tanto la razón de la transmisión de los datos), se requiere de un reloj

para definir el instante de tiempo en el cual se debe iniciar la adquisición. A este reloj se le

llama “reloj de tiempo real”. Si no se contase con un reloj de tiempo real para controlar esto,

entonces se tendría una razón de adquisición variable, ya que el µCu no se tarda la misma

cantidad de tiempo en adquirir y transmitir un dato analógico, en comparación con uno digital

(ver figura 4.1).

RELOJ DE TIEMPO REAL(Flag_Reloj)

Se desea transmitir 11 datos por segundo = 90.90mseg por dato

← Se transmiten 11 datos →

1 0 1 0 1 0 1 ∫ ∫

∫ ∫

0 1

Adquirir y

Almacenar

Dato

Transmitir

Dato

Adquirir y

Almacenar

Dato

Transmitir

Dato

Calcular

CRC Transmitir

Dato

Adquirir y

Almacenar

Dato

45.45mseg 45.45mseg

← 90.90mseg →

Figura 4.1 Reloj de tiempo real.

Page 61: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

51

Los tiempos de procesamiento de las señales analógicas y digitales no son iguales estas

varían, de tal forma que: la adquisición y almacenamiento de las señales analógicas requiere

de 226mseg, en cambio las señales digitales requieren 29µseg. El proceso de transmisión de

una señal analógica requiere de 4mseg y una digital de 3mseg.

Después de adquirir y transmitir los datos de las 7 señales se calcula el CRC, el cual se

lleva un tiempo de procesado de 6mseg (todos estos tiempos de procesado son sólo

aproximaciones).

4.1 Medición de la frecuencia

Al dispositivo empleado para la medición de la frecuencia se le denomina

frecuencímetro. Para la implementación de un frecuencímetro se requiere de:

• Una ventana de tiempo la cual en este caso será de 1 seg.

• Un contador que se incremente con cada pulso presente de la señal cuya frecuencia se

va a medir, durante el tiempo determinado por la ventana de tiempo (1 seg).

Para obtener un intervalo de tiempo se emplean dispositivos denominados timers

(temporizadores), y para contar pulsos se emplean dispositivos denominados contadores.

En general un timer es un contador el cual cuenta los pulsos generados por un reloj

muy preciso (frecuentemente se usa el propio reloj del µCu).

Los contadores y los timers pueden implementarse por medio de hardware o por

programa. La implementación por programa requiere tiempo del procesador. En este tiempo el

procesador no realiza tarea útil alguna. Prácticamente todos los µCu modernos incluyen timers

y contadores implementados con hardware, por lo que normalmente no es necesario

implementarlos por programa. Como un timer es sólo un tipo especial de contador, los timers

de los µCu están diseñados para usarse también como contadores.

Page 62: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

52

El 16F874, cuenta con los siguientes timers/contadores:

• TIMER0 (TMR0)

• TIMER1 (TMR1)

• TIMER2 (TMR2)

Características de los timers

TMR0

• Contador(Síncrono/Asíncrono)/Temporizador de 8 bits

• De lectura/escritura

• Reloj interno o externo

• Selección del flanco en el reloj externo

• Predivisor de la frecuencia

• Generador de interrupción opcional en el desbordamiento

La tabla 4.1 muestra los registros asociados al TIMER0: DIRECCIÓN NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

01h TMRO REGISTRO DE TMR0 0Bh INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF 81h OPTION RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 Tabla 4.1 Registros asociados a TMR0.

Donde:

Las celdas sombreadas no se utilizan en TMR0.

Funciones de los bits (ver tabla 4.1):

• TMR0 = Registro del TMR0.

• Gie INTCON<7> = Bit habilitador de las interrupciones.

1 = Habilita todas las interrupciones

0 = Deshabilita todas las interrupciones

Page 63: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

53

• Peie INTCON<6> = Bit habilitador de las interrupciones periféricas.

1 = Habilita todas las interrupciones

0 = Deshabilita todas las interrupciones

• Toie INTCON<5> = Bit habilitador de la interrupción de desborde de TMR0.

1 = Habilita la interrupción de TMR0

0 = Deshabilita la interrupción de TMR0

• Toif INTCON<2> = Bandera de desborde de TMR0.

1 = Se desbordó TMR0

0 = No se desbordó TMR0

• Tocs OPTION<5> = Bit habilitador del tipo de reloj para TMR0.

1 = Pulsos introducidos a través de TOCK1 (Contador)

0 = Pulsos de reloj interno / 4oscF (Temporizador)

• Tose OPTION<4> = Bit de selección para el tipo de flanco para el TOCK1.

1 = Incrementa TMR0 cada flanco descendente

0 = Incrementa TMR0 cada flanco ascendente

• Psa OPTION<3> = Bit de asignación del divisor de frecuencias.

1 = El divisor de frecuencias se le asigna al WDT

0 = El divisor de frecuencia se le asigna al TMR0

• Ps2-Ps0 OPTION<2,1,0> = Bit del predivisor (ver tabla 4.2).

1 = Incrementa TMR0 cada flanco descendente

0 = Incrementa TMR0 cada flanco ascendente

Page 64: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

54

El predivisor se configura según la siguiente tabla: PS2 PS1 PS0 DIVISIÓN TMR0 DIVISIÓN WDT

0 0 0 1:2 1:1 0 0 1 1:4 1:2 0 1 0 1:8 1:4 0 1 1 1:16 1:8 1 0 0 1:32 1:16 1 0 1 1:64 1:32 1 1 0 1:128 1:64 1 1 1 1:256 1:128

Tabla 4.2 Configuración del predivisor de TMR0.

TMR1

• Contador/Temporizador de 16 bits

• De lectura/escritura

• Reloj interno o externo

• Interrupción opcional por desbordamiento de FFFFh a 0000h

La tabla 4.3 muestra los registros asociados al TIMER1: DIRECCIÓN NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

0Bh INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF 0Ch PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0Eh TMR1L Registro del TMR1 (Almacena los 8 bits menos significativos del TMR1) 0Fh TMR1H Registro del TMR1 (Almacena los 8 bits más significativos del TMR1) 10h T1CON ---- ---- T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

Tabla 4.3 Registros asociados a TMR1.

Donde:

Las celdas sombreadas no se utilizan en TMR1.

Funciones de los bits (ver tabla 4.3):

• Tmr1if PIR1<0> = Bandera de desbordamiento de TMR1.

1 = TMR1 se desbordó

0 = TMR1 no se ha desbordado

• Tmr1IE PIE1<0> = Bit de habilitación de desbordamiento del TMR1.

1 = Habilita la interrupción por desbordamiento del TMR1

0 = Deshabilita la interrupción por desbordamiento

• TMR1L = Registro que contiene los 8 bits menos significativos de TMR1.

Page 65: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

55

• TMR1H = Registro que contiene los 8 bits más significativos de TMR1.

• T1ckps1- T1ckps0 T1CON<5,4> = Bits de selección del rango de división.

• T1oscen T1CON<3> = Bit de selección del oscilador de TMR1.

1 = Habilita el oscilador

0 = Deshabilita el oscilador

• 1T sync T1CON<2> = Bit de control de sincronía del reloj externo del TMR1.

1 = No sincroniza con el reloj externo (Si Tmr1cs=1)

0 = Sincroniza con el reloj externo (Si Tmr1cs=1)

Este bit es ignorado,si Tmr1cs=0

• Tmr1cs T1CON<1> = Bit de selección de la fuente de los impulsos de contaje.

1 = Reloj externo que se aplica por las terminales de entrada RC0/T1OSO/T1CKI y

RC1/T1OSI/CCP2

0 = Reloj interno

• Tmr1on T1CON<0> = Bit de encendido de timer1

1 = Habilita timer1

0 = Deshabilita timer1

En la tabla 4.4 se muestran las posibles configuraciones del divisor de TMR1: T2CKPS1 T2CKPS0 RANGOS

0 0 1:1 0 1 1:2 1 0 1:4 1 1 1:8

Tabla 4.4 Configuración del divisor de TMR1.

TMR2

• Temporizador de 8 bits

• De lectura/escritura

• Predivisor de frecuencia programable

• Postdivisor de frecuencia programable

Page 66: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

56

• Interrupción opcional al coincidir TMR2 y PR2

En la tabla 4.5 se muestran los registros asociados a TMR2: DIRECCIÓN NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

0Bh INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF 0Ch PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0Eh TMR2 Registro del Timer2 10h T2CON ---- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR20N T2CKPS1 T2CKPS0 92h PR2 Registro de Timer2

Tabla 4.5 Registros asociados a TMR2.

Donde:

Las celdas sombreadas no se utilizan en TMR2.

En base a las características de cada uno de los timers, se implementará el reloj de

tiempo real con el timer1, debido a que puede conseguir una mayor temporización, por ser de

16 bits. Y el frecuencímetro será implementado usando el reloj de tiempo real en conjunto con

un registro de conteo auxiliar para generar la ventana de tiempo, y se empleará timer0 como

contador de pulsos. Estos pulsos son externos, y el timer2 no puede configurarse para aceptar

pulsos externos.

El reloj de tiempo real debe tener una frecuencia de 11Hz. El timer1 se configurará

para que genere una interrupción por cada periodo de conteo. Con cada par de interrupciones

se realizará la adquisición de un dato, y su posterior transmisión.

TMR1 cuenta con 2 registros (TMR1H y TMR1L de 8 bits cada uno), y un divisor (2

bits), a través de los cuales se configura la temporización deseada. Estos registros son

contadores que se incrementan, con los pulsos producidos por un reloj. En este caso TMR1 se

incrementa en forma ascendente con los pulsos producidos por un reloj interno del µCu.

Cuando el valor del conteo almacenado es estos registros llega a su máximo (FFFFh)

se genera una interrupción y el conteo se reiniciará (0000h). Por lo cual la temporización

obtenida depende del valor inicialmente almacenado en estos registros, de la frecuencia de

reloj empleado, y de los bits del divisor asociado. La siguiente formula muestra lo anterior:

Page 67: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

57

1 4( ).( 1 : 1 ).( )oscTMR T TMR H TMR L DIVISOR= (4.1)

Como se desean adquirir y transmitir 11 datos por segundo (11Hz), y considerando que

la mitad del tiempo se adquiere y en la otra se transmite, entonces se requiere de un reloj con

un periodo de 90.90mseg, en la mitad de ese periodo se adquiere y en la otra se transmite, por

lo que, se requiere que se genere una interrupción cada 45.45mseg. Por lo tanto con una

temporización deseada de 45.45mseg, con un divisor de 8, un reloj de 4MHz, los registros

TMR1H y TMR1L, se deben precargar con un valor de:

10145.4545455 4. .(65536 ).(8)

4m N

M = −

1045.4545455 65536

1 (8)m N

µ= −

10 59854.1818N =

De tal forma que timer1 debe cargarse con 59854 (1110 1001 1100 1110).

Flag_Reloj representa el bit de estado del reloj de tiempo real (Flag_Reloj es el reloj de

tiempo real), y a través de su chequeo se controla en que momento se debe adquirir un dato

(Flag_Reloj=1), y cuando transmitirlo (Flag_Reloj=0).

Por lo tanto durante 45.456mseg, Flag_Reloj=1, y durante los posteriores 45.456mseg

se desactivará dicho bit, produciendo un reloj con el siguiente comportamiento (ver figura

4.2): Flag_Reloj

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

1segundo

90.90mseg

TMR0 cuenta el número de pulsos entrantes a TOCK1=Frecuencia

Figura 4.2 Comportamiento de Flag_Reloj.

Page 68: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

58

Como ya se mencionó anteriormente para la implementación del frecuencímetro se

requiere de una ventana de tiempo de 1 segundo, y un contador que se incremente con cada

pulso presente de la señal cuya frecuencia se desea medir.

La ventana de tiempo se implementó aprovechando el reloj de tiempo real, ya que este

produce un reloj con una frecuencia de 11Hz. Si se cuentan los 11 pulsos por segundo

generados por dicho reloj, se obtiene la ventana de tiempo de 1 segundo requerida, y contando

los pulsos externos recibidos por timer0 durante dicho segundo se obtiene la frecuencia de la

señal.

Inicialmente el timer0 estará establecido a cero. Al iniciar la adquisición del dato 11 se

toma la lectura del timer0. Como 22 periodos del timer1 son igual a 1 segundo, la cuenta del

timer0 es el número de pulsos externos que ha recibido en un segundo. Después de tomar la

cuenta del timer0, su valor se reestablece a cero. La siguiente interrupción del timer1

corresponderá a la adquisición del primer dato, y se vuelve a repetir el procedimiento (ver

figura 4.3).

Por lo tanto:

• La medición de la frecuencia se hace sólo una vez por segundo .

• Timer0 se encarga de contar el número de pulsos entrantes al sistema a través de la

terminal RA4/TOCK1, durante 1 segundo completo, lo que equivale a 22

interrupciones de timer1, lo cual es igual a 11 pulsos del reloj de tiempo real.

El frecuencímetro resultante tendrá un error de 1Hz± , debido a que sólo se estarán

manejando valores enteros de frecuencia. Como el tamaño del registro de TMR0 es 8 bits su

cuenta puede alcanzar como máximo 255. Entonces la frecuencia máxima que se podrá medir

será 255Hz. La frecuencia nominal de la planta es de 60Hz.

Page 69: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

59

SE GENERA INTERRUPCIÓN

TOMAR FRECUENCIA LIMPIAR TMR0

INICIO

TRANSCURRIERON 45.45mseg?

SI

NO

DESACTIVAR:Flag_Reloj

Flag_TxFlag_CAD

Flag_CRC_16

TRANSCURRIO 1seg?

SI

NO

CONFIGURAR TIMER1

Flag_Reloj=0?

SI

NO

ACTIVAR Flag_Reloj

Figura 4.3 Diagrama de flujo de la interrupción.

4.2 Monitoreo de las señales de CFE y de Transferencia del sistema

El monitoreo de estas señales se realiza consultando el estado de dos pines del

microcontrolador configuradas previamente como entradas digitales. De tal forma que uno de

ellos indique si existe o no alimentación de C.F.E. (PORTE<1>) y el otro indique si se llevó

acabo la transferencia del sistema (PORTE<2>), dependiendo si su estado es un 1 lógico o un

0 lógico (ver tabla 4.6).

Page 70: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

60

SEÑAL ESTADO DESCRIPCIÓN

Alimentación C.F.E. 1 Existe alimentación de C.F.E.

0 No existe alimentación de C.F.E.

Transferencia

1 Se realizó Transferencia de C.F.E a Planta

de Fuerza y Banco de Baterías

0 No se realizó Transferencia

Tabla 4.6 Tabla descriptiva de las señales de C.F.E y Transferencia del sistema.

4.3 Programa del µCu para la adquisición y la transmisión de los datos

Características

• Se transmiten 11 bytes = 7 bytes de datos + 2 CRC + 2 caracteres delimitadores de

paquete, controlados por Flag_Reloj.

• BaudRate= 2400 bps.

• Se transmiten de 11 datos por segundo (Frecuencia de Tx=11 Hz).

• Se emplea el CRC-16 como método de detección de errores.

Funcionamiento

La primera etapa del programa inicializa registros, y realiza las configuraciones de los

módulos pertinentes (USART, timers etc..), después de inicializar y configurar el programa

realiza lo siguiente:

Toma el carácter de inicio de paquete cuando Flag_Reloj=1, y lo transmite una vez

que Flag_Reloj=0. Posteriormente terminada la transmisión se activa la bandera Flag_Tx.

Una vez ya transmitido el carácter de inicio, procede a esperar a que Flag_Reloj=0,

para tomar la lectura del primer canal analógico, una vez ocurrido esto se adquiere el dato y se

realiza la conversión A/D, lo cual se indica activando la bandera Flag_CAD. Después se

almacena el dato resultante de la conversión. Lo siguiente que hace el programa es esperar a

que Flag_Reloj=0, para pasar a transmitir el dato, indicando su finalización a través de la

activación de la bandera Flag_Tx, y si no se han transmitido los 4 canales analógicos, pasa a

Page 71: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

61

seleccionar el siguiente canal, repitiéndose el procedimiento ya mencionado para el anterior

canal analógico.

Una vez que termina de transmitir los 4 datos de los canales analógicos pasa a tomar el

primer dato digital una vez que Flag_Reloj=1, después de tomar el dato lo almacena, y pasa a

esperar a que Flag_Reloj=0, para transmitirlo, una vez terminada la transmisión activa la

bandera Flag_Tx, lo cual finaliza la transmisión del primer dato digital. Estos pasos se repiten

para cada una de las señales digitales.

Ya transmitidos los 3 canales digitales, procede a calcular el CRC_16, empleando para

esto los valores de cada uno de los canales previamente almacenados. Una vez culminado el

cálculo del CRC_16 se activa la bandera Flag_CRC_16,y se procede a esperar a que

Flag_Reloj=1, para tomar el primer byte del CRC, y posteriormente se espera a que

Flag_Reloj=0 para dar inicio a su transmisión, y se activa Flag_Tx una vez terminada dicha

operación. Este mismo proceso se repite para el segundo byte del CRC.

Después pasa a esperar a que Flag_Reloj=1, para tomar el carácter de fin de paquete, y

espera a que Flag_Reloj=0 para transmitirlo, lo cual activa Flag_Tx, dando por finalizado la

transmisión del primer paquete de información (ver figura 4.4). Posteriormente se reinicializan

los canales analógicos, y posteriormente se toma y se transmite el carácter de inicio de

paquete repitiéndose todo el procedimiento ya mencionado (ver figura 4.5).

Con lo mencionado anteriormente, se puede observar que todo el control se realiza a

través del reloj de tiempo real implementado, por medio de TMR1. Ya que a través de este y

de la bandera Flag_Reloj, se controla cuando tomar un dato, cuando transmitirlo, y a además

proporciona la base de tiempos para la medición de la frecuencia. Y es importante mencionar

que todas las banderas indicadoras se desactiva cuando Flag_Reloj=0. Carácter de inicio

de paquete

Voltaje Planta de

Fuerza

Corriente Planta de

Fuerza

Voltaje Banco de Baterías

Corriente Banco de Baterías

C.F.E.

Transferencia

Frecuencia

CRC

CRC

Carácter de fin de paquete

ORDEN DE TRANSMISIÓN DE CADA BYTE 1 2 3 4 5 6 7 8 9 10 11 Figura 4.4 Estructura del paquete de información transmitido.(Orden en que son transmitidos los datos).

Page 72: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

62

INICIO

DECLARAR REGISTROS

CONFIGURAR PUERTOS E/S

INTERRUPCIÓN

CONFIGURAR USART

CONFIGURAR TIMERS

Flag_Reloj=1?

SI

NO

Flag_Reloj=0?

SI

NO

TRANSMITIR DATO

CONFIGURAR PORTA COMO ENTRADA (DDAARAAA)

TOMAR CARÁCTER DE INICIO DE PAQUETE

TSR ESTA VACÍO?

SI

NO

Flag_Reloj=1?

SI

NO

SELECCIONAR CANAL

ADQUIRIR EL DATO (Analógico)

TERMINO CONVERSIÓN A/D?

SI

NO

ACTIVAR Flag_CAD

ALMACENAR DATO

Flag_Reloj=0?

SI

NO

TSR ESTA VACÍO?

SI

NO

TRANSMITIR DATO

ACTIVAR Flag_Tx

A

1

Page 73: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

63

SIGUIENTE CANAL

Flag_Reloj=1?

SI

NO

Flag_Reloj=0?

SI

NO

TRANSMITIR DATO

TOMAR DATO (Digital)

TSR ESTA VACÍO?

SI

NO

CALCULAR CRC-16

ACTIVAR Flag_CRC_16

TOMAR BYTE CRC

Flag_Reloj=0?

SI

NO

TSR ESTA VACÍO?

SI

NO

TRANSMITIR DATO

ACTIVAR Flag_Tx

B

SE TRANSMITIERON LOS DATOS DE LOS 4 CANALES ANALÓGICOS?

NO

SI

A

1

ALMACENA DATO

SE TRANSMITIERON LOS DATOS DE LOS 3 CANALES DIGITALES?

NO

SI

SIGUIENTE CANAL

Flag_Reloj=1?

SI

NO

ACTIVAR Flag_Tx

SE TRANSMITIERON LOS 2 BYTES DEL CRC?

NO

SI

SIGUIENTE BYTE

Page 74: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

64

Flag_Reloj=1?

SI

NO

Flag_Reloj=0?

SI

NO

TRANSMITIR DATO

TOMAR CARÁCTER DE FIN DE PAQUETE

TSR ESTA VACÍO?

SI

NO

1

B

ACTIVAR Flag_Tx

Flag_Reloj=1?

SI

NO

Flag_Reloj=0?

SI

NO

TRANSMITIR DATO

TOMAR CARÁCTER DE INICIO DE PAQUETE

TSR ESTA VACÍO?

SINO

ACTIVAR Flag_Tx

REINICIAR CANALES ANALÓGICOS

Page 75: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

65

SE GENERA INTERRUPCIÓN

TOMAR FRECUENCIA LIMPIAR TMR0

INICIO

TRANSCURRIERON 45.45mseg?

SI

NO

DESACTIVAR:Flag_Reloj

Flag_TxFlag_CAD

Flag_CRC_16

TRANSCURRIO 1seg?

SI

NO

CONFIGURAR TIMER1

Flag_Reloj=0?

SI

NO

ACTIVAR Flag_Reloj

Figura 4.5 Diagrama de flujo del programa del microcontrolador.

Page 76: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

66

La figura 4.6 muestra el circuito del sistema de monitoreo:

Figura 4.6 Circuito del sistema de monitoreo.

Page 77: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

67

Capítulo 5. Control del puerto serie de la PC

5.1 Control de la interfaz serial de la PC

Una interfaz es un dispositivo, el cual permite que dos equipos se enlacen, con la

finalidad de intercambiar información. En el mercado existen diferentes fabricantes de este

tipo de dispositivos los cuales no se podrían conectar si no existiesen normas o estándares.

Por esta razón se creo una norma para la transmisión de señales digitales en modo serie, la

cual fue definida por el CCITT (UIT-T) en su recomendación V.24 (la cual proporciona la

lista de definiciones de circuitos de intercambio entre equipos terminales de datos “ETD “ y

equipos terminales de circuitos de datos “ECD”), la cual tiene su equivalente en el RS232, esta

norma se complementa con la norma V.28 (características eléctricas) y la ISO 2110

(características mecánicas) [7].

El µCu entrega los bits a transmitir por el pin RC6/TX/CK, los niveles de voltaje en

este pin son TTL (0Volts y 5Volts nominales), y no son compatibles con el estándar RS232

(cero lógico va desde +3 a +25 volts y un 1 lógico se encuentra entre –3 a –25 volts) [7], [8],

[11], [12], [19].

La conversión entre niveles se realiza con unos circuitos denominados drivers. En este

proyecto se emplea el C.I. ST232CN, que es un equivalente al conocido MAX232 [10] (ver

figura 4.6).

La salida de los drivers se aplica al radio módem de transmisión (Tx), y el radio

módem de recepción (Rx) demodula la señal y la entrega con niveles TTL al puerto serie de la

computadora.

Para la computadora la interfaz serie esta constituida por un conjunto de puertos y

algunas interrupciones asociadas. Una PC es capaz de soportar más de un puerto serie. Se

acostumbra nombrar a estos puertos como COM1, COM2, COM3... , y así sucesivamente.

Page 78: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

68

A continuación se da una tabla de puertos COM1 a COM4, las direcciones bases de

sus registros asociados, y las correspondientes interrupciones. La dirección base es la primera

dirección de su correspondiente conjunto de puertos. Usualmente se identifica a los puertos

con la dirección base (ver tabla 5.1). NOMBRE DIRECCIÓN BASE INTERRUPCIÓN (IRQ)

Com1 3F8h 4 Com2 2F8h 3 Com3 3E8 4 Com4 2E8 3

Tabla 5.1 Direcciones bases más usadas para el puerto serie.

En caso de que no se conozcan la direcciones bases usadas por los puertos, estás se

puede conocer leyendo la información directamente desde el área de datos del BIOS de la

computadora a través de la dirección 0000:0400 [11].

Como ya se mencionó anteriormente los puertos series se implementan mediante un

circuito denominado UART (Transmisor Receptor Asíncrono Universal). Las computadoras

personales modernas emplean las UART 16550A, 16C550 o variantes de estas [4].

En una comunicación serie asíncrona es necesario que el transmisor y el receptor

utilicen el mismo protocolo de comunicación, para que estos se puedan entender: número de

bits de datos, bits de paridad, bits de paro, BAUDRATE y el control del flujo. El control de

flujo se puede realizar por software o hardware.

Los conectores del puerto serie vienen en dos presentaciones: el conector de 25

terminales (DB25), y el conector de 9 terminales(DB9) (ver tabla 5.2). #TERMINAL (D25) #TERMINAL (DB9) NOMBRE (E/S) FUNCIÓN

Pin 2 Pin 3 Transmitir Dato (Tx)Salida Salida de datos de la interfaz Pin3 Pin2 Recibir Dato (Rx) Entrada Entrada de datos a la interfaz Pin4 Pin7 Solicitud de Envió (RTS)Salida Define condición de dato,

listo para envío Pin5 Pin8 Libre para Envío (CTS) Entrada Señal de entrada que permite

la transmisión Pin6 Pin6 Equipo de Dato Listo

(DSR) Entrada Entrada que notifica el estado

de disponibilidad Pin7 Pin5 Tierra(SG) Señal común de tierra única Pin8 Pin1 Detección de Portadora

(CD) Entrada Indica presencia de datos

Pin20 Pin4 Terminal de Datos Listo (DTR)Salida

Salida de señal que indica disponible para transmitir

Pin22 Pin9 Indicador de Anillo (RI)Entrada Se lleva acabo, debido al timbre de teléfono

Tabla 5.2 Terminales del puerto serie.

Page 79: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

69

Como ya se mencionó anteriormente la UART, cuenta con registros e interrupciones

mediante las cuales se controla el funcionamiento del puerto. En total son 12 registros, los

cuales se listan a continuación (ver tabla 5.3 y tabla 5.4):

• Registros de retención de datos (THR/RHR)

• Registros de estado de interrupción y registros de control (IER/ISR)

• Registro de control FIFO (FCR)

• Registros de estado de la línea y de control (LCR/LSR)

• Registros de estado del módem y de control (MCR/MSR)

• Registro de configuración del reloj (velocidad o BAUD RATE) y de control

(DLL/DLM)

• Registro de cancelaciones accesible para el usuario (SPR)

A continuación se listan los registros detallando el significado de su contenido: DIRECCIÓN (0-7) LCR<7>(Divisor

Latch Enable) MODO LECTURA MODO

ESCRITURA A2 A1 A0 0 0 0 0 RHR THR 0 0 0 1 LSB OF DIVISOR

LATCH (Latch Divisor para el bit

LSB)

LSB OF DIVISOR LATCH (Latch

Divisor para el bit LSB)

0 0 1 0 IER IER 0 0 0 1 MSB OF DIVISOR

LATCH (Latch Divisor para el bit

MSB)

MSB OF DIVISOR LATCH (Latch

Divisor para el bit MSB)

0 1 0 X ISR FCR 0 1 1 X LCR LCR 1 0 0 X MCR MCR 1 0 1 X LSR Reservado 1 1 0 X MSR Reservado 1 1 1 X SR SR

Tabla 5.3 Registros de la UART de la PC.

Donde:

X = No importa.

Page 80: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

70

DIRECCIÓN REGISTRO BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT1 BIT 0 COLECCIÓN DE REGISTROS GENERALES

0 RHR[XX] BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 0 THR[XX] BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 1 IER[00] 0 0 0 0 Interrupción

de estado del módem

Interrupción de estado de línea recibida

THR RHR

2 FCR[00] RCVR gatillo (MSB)

RCVR gatillo (LSB)

0 0 Selección del modo

DMA

Reset FIFO XMIT

Reset FIFO RCVR

Habilita FIFO

2 ISR[01] Habilita FIFO´s

Habilita FIFO´s

0 0 INT prioridad

bit 2

INT prioridad

bit 1

INT prioridad

bit 0

INT estado

3 LCR[00] Habilita latch divisor

Selecciona Rompimiento

(break)

Selecciona paridad

Paridad par Habilita paridad

Bits de stop

Longitud de palabra

Longitud de palabra

4 MCR[00] 0 0 0 Habilita LoopBack

-OP2 -OP1 -RTS -DTR

5 LSR[60] Error dato FIFO

Registro de dato vacío

Registro de transmisión

vacío

Interrupción de rompimiento

Error de marco

Error de paridad

Error de desbordado (Overrrun)

Recibe datos listo

6 MSR[X0] CD RI DSR CTS Delta -CD

Delta -RI

Delta -DSR

Delta -CTS

7 SPR[FF] BIT 8 BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 REGISTROS DEL GENERADOR DEL BAUD RATE. ACCESIBLES CUANDO LCR<7>=1

0 DLL[XX] BIT 8 BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 1 DLM[XX] BIT 15 BIT 14 BIT 13 BIT 12 BIT 11 BIT 10 BIT 9 BIT8

Tabla 5.4 Configuración de bits de los registros internos de la UART.

De la tabla anterior se puede observar que los 12 registros requieren un total de 8

direcciones, esto es posible gracias al uso del bit 7 del registro LCR (Habilitador del Latch

Divisor), también conocido como Bit de Acceso al Latch Divisor o DLAB por sus siglas en

ingles (Divisor Latch Access Bit). De tal forma que cuando el bit LCR<7>=1, son habilitados

dos registros a través de los cuales se programa el BAUDRATE.

La UART usa un reloj de 1.8432 MHz, cuya frecuencia se divide entre 16, lo que

permite que el BUDRATE máximo posible sea de 115,200. Los valores que deben contener

los registros de configuración del BAUDRATE, se muestran en la tabla 5.5: BAUD RATE (Velocidad) en

bps (Bits por Segundo) 16 X DIVISOR DLM DLL

50 2304d900h 09h 00h 75 1536d600h 06h 00h 150 768d300h 03h 00h 300 384d180h 01h 80h 600 192dC0h 00h C0h

1200 96d60h 00h 60h 2400 48d30h 00h 30h 4800 24d18h 00h 18h 7200 16d10h 00h 10h 9600 12d0Ch 00h 0Ch 19.2K 6d06h 00h 06h 38.4K 3d03h 00h 03h 57.6K 2d02h 00h 02h 115.2K 1d01h 00h 01h

Tabla 5.5 Configuraciones de BAUDRATE más usados.

Page 81: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

71

El manejo del puerto serie en cuanto al momento en que puede transferirse un dato

entre la UART y la PC, se puede implementar de dos maneras:

• Mediante el censado o chequeo constante de los bits indicadores de estado de las tareas

de la UART (Polling).

• Mediante la utilización de interrupciones.

El hacer un polling a la UART, es un método más lento que el de las interrupciones,

porque le exige más atención al CPU de la PC, pero es mucho más sencillo implementarlo.

En este trabajo se usará el método de polling, debido a su sencillez, y a que esta aplicación en

particular no requiere grandes velocidades, además de que los procesadores modernos son

sumamente rápidos, y son capaces de manejar estas tareas, y otras más, al mismo tiempo con

facilidad.

El control de flujo requiere del manejo de varias señales (RTS, DTR, CTS, Rx y Tx).

En aplicaciones de baja velocidad es posible reducir el número de señales a sólo 3 (Rx,Tx y

SG). Esta forma de implementación del control de flujo se conoce como módem nulo. A

continuación la figura 5.1 muestra la configuración de módem nulo empleado.

Figura 5.1 Configuración de módem nulo (comunicación simplex).

En esta configuración las terminales DTR, DSR, y CD, están unidas, de tal forma que

cuando DTR=1, se indica que la PC esta lista para recibir datos y automáticamente se activa

Page 82: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

72

DSR indicando que la línea esta disponible, y CD también se activa indicando que se detectó

una señal de datos (ver figura 5.1).

Además las líneas RTS y CTS también se unen. Por lo tanto cuando RTS=1 indicando

que se desea Tx en forma inmediata recibe la respuesta de que puede iniciar la transmisión

CTS=1. Por lo tanto sólo se necesita de 2 terminales (ver figura 5.1) en la PC, RD y SG ya

que está sólo recibirá datos, nunca transmitirá datos. Es decir la comunicación será simplex

[7], [8], [11].

5.2 Elección del lenguaje de programación, para la implementación del control del

puerto serie de la PC

Se requiere de un lenguaje de programación que permita controlar la UART de la PC

mediante el acceso directo a sus registros. En el mercado existe más de una opción, pero se

decidió emplear C++ (Turbo C++ versión 3.0 de Borland), debido a que C++ permite tener

acceso directo a cualquier puerto de la PC de una manera relativamente sencilla. Debe

recordarse que para la PC los registros de la UART son solamente puertos.

En el mercado existen otros lenguajes mediante los cuales se puede controlar el puerto

serie, como por ejemplo Visual Basic 6.0 (VB). Pero emplear VB trae consigo, llevar acabo el

control del puerto mediante el uso de las APIS de windows (Windows Application

Programming Interface), esto requeriría de recursos que van más allá del lenguaje y los

controles comunes con que cuenta Visual Basic, lo cual le agregaría una complejidad mayor al

programa. De cualquier forma a través de VB no se tiene un control directo del puerto, se

podría decir que es una forma virtual de controlar el puerto, ya que no se tiene acceso directo

a los registros de la UART como en el caso de C++.

5.3 Programa para la recepción de los datos

El programa de recepción en la PC, realiza las siguientes funciones:

• Sincronizar la recepción del paquete de datos.

Page 83: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

73

• Revisar que el paquete no contenga algún error.

Si se recibe sin errores, entonces hace lo siguiente:

• Filtrar los datos de las señales analógicas (ver capítulo 6).

• Generar los archivos necesarios para el programa de graficación (ver capítulo 7).

Sincronización de la recepción

Para sincronizarse el sistema primero espera recibir el probable carácter de inicio de

paquete. Posteriormente recibe los siguientes 10 caracteres, una vez que ya tiene formado el

probable paquete se verifica si el carácter de fin de paquete se encuentra en la última posición,

y si los caracteres correspondientes a la posición 4, y 5 del paquete poseen valores digitales

lógicos entre 1 o 0, ya que estos no pueden contener ningún otro valor, sólo cuando todas estas

condiciones se cumplen es cuando se considera que existe sincronía. Posteriormente los

interpreta de acuerdo con el formato del paquete: los primeros 7 son los datos, los dos

siguientes el CRC y el último el carácter de fin de paquete. Después de recibir el último

carácter el programa reinicia la secuencia anterior.

Verificación de que el paquete no contenga algún error

Durante la recepción se pueden presentar los siguientes tipos de errores:

• Datos alterados

• No se reciben caracteres

• Perdida de sincronía

El sistema detecta que un dato fue alterado cuando el cálculo del CRC (CRC-16) del

paquete recibido es diferente de cero, lo que provoca que el contador de errores se incremente.

La lógica del programa del CRC-16 en el receptor es exactamente la misma que en el

transmisor, por esta razón la lógica de implementación del CRC-16 ya mostrada también es

aplicable en el receptor, la única diferencia consiste en que se implemento empleando otro

lenguaje de programación el cual es C++ (ver figura 3.11 y figura 3.12).

Page 84: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

74

Si no se reciben caracteres durante 1 segundo, se detecta que hay un cero, y se

incrementa el contador de ceros y el de errores en 1.

Además es posible que el sistema se descincronice debido a la pérdida de uno o más

caracteres durante la transmisión, lo cual se detecta como un error, y se incrementa el

contador de errores del sistema.

La tabla 5.6 muestra cuando se incrementan los contadores de errores y ceros. MOTIVO ERRORES CEROS

Si no se recibe nada durante un segundo SI SI Si el carácter recibido no corresponde con lo esperado (caracteres de inicio y fin de

paqueteerror de sincronía)

SI

NO

Si el CRC es diferente de cero SI NO Tabla 5.6 Motivos que producirán un incremento en los contadores de errores y ceros.

Es importante mencionar que una vez que se detecta un error, la estrategia que se

sigue es la siguiente: el paquete de información no es corregido, sino que se toma el último

paquete recibido correctamente, y se continúa con el procesamiento (filtrado,

almacenamiento, y generación de archivos).

Procesamiento de un paquete sin errores

Una vez que el paquete se recibe sin errores, o que se toma el paquete de datos anterior

se realiza lo siguiente: los datos que provienen de señales analógicas son filtrados,

almacenados, y finalmente se generan sus archivos binarios correspondientes. Los datos

digitales se almacenan directamente sin filtrarse y se generarán sus archivos binarios.

Se decidió almacenar los datos como archivos de tipo binario ya que este tipo de

archivos requieren menos espacio de memoria al almacenarse.

Es importante mencionar que los archivos generados con este programa, almacenarán

como máximo el equivalente a las ultimas 12 horas de información, generadas por los equipos,

y se estarán actualizando una vez por minuto.

Page 85: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

75

Además de generar los 7 archivos correspondientes a los canales de información,

también se generan los archivos de los errores y ceros ocurridos durante las ultimas 12 horas,

los cuales también se actualizan por minuto.

Funcionamiento general del programa

Primero se declaran las variables, se selecciona y configura el puerto COM a emplear,

y se limpian los archivos binarios si ya existen o se generan si no existen.

Posteriormente se cargan los coeficientes del filtro digital a emplear, para el filtrado de

los datos correspondientes a las señales analógicas. A continuación se intenta leer un dato, en

caso de que no se haya recibido ningún dato durante e1 transcurso de un segundo, se

incrementan los contadores de ceros y errores ocurridos, se toma el último paquete de datos

recibido correctamente, y se continua (Continue).

Una vez que el flujo del programa se encuentra en Continue, lo cual ocurre cada vez

que se forme un paquete de datos, se pasa a filtrar los datos recibidos, de cada uno de los

canales analógicos, y posteriormente son almacenados. Los datos de los canales digitales no

se filtran, se almacenan directamente. Y cuando se hayan almacenado la cantidad de datos

equivalentes a 1 minuto de información se pasa a generar los archivos binarios de los 7 canales

de información, del conteo de errores, del conteo de ceros ocurridos, se limpian los contadores

de errores y ceros, y se pasa el flujo del programa a esperar el inicio de un nuevo paquete de

información (Again) (ver figura 5.2). Si no se ha almacenado aun el equivalente a 1 minuto de

información, entonces sólo se procesa (filtra y/o almacena) el último paquete de datos, y se

pasa el flujo del programa a Again para esperar el inicio de un nuevo paquete de datos.

En caso de haberse recibido algún dato se examina este para ver si es el carácter de

inicio de paquete, si no lo es se regresa a leer otro dato nuevo (Again). Si es el carácter de

inicio de paquete se inicializa el contador de canales.

Page 86: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

76

Lo siguiente es esperar un nuevo dato, el cual corresponderá con el primer dato del

primer canal analógico muestreado, se revisa si llegó algún dato en el último segundo, si no se

recibió nada se incrementan los contadores de errores y ceros, se toma el último paquete de

datos recibidos, y se pasa a continuar (Continue). En caso de haber recibido algún dato se

revisa si el dato recibido es el carácter de fin de paquete y si el contador de canales llegó a su

máximo, en caso de no serlo se verifica sólo si el contador de canales a alcanzado su valor

máximo, si es así significa que ocurrió algún error, por lo que se pasa a incrementar el

contador de errores, se toma el último paquete de información recibido correctamente y se

continúa (Continue). Si el contador no a llegado a su valor máximo, se almacena el dato, se

incrementa contador de canales, y si no ha llegado a su máximo, regresa a leer el siguiente

dato del puerto.

Si el dato recibido es el carácter de fin de paquete y el contador de canales llegó a su

máximo, entonces se revisa si los caracteres correspondientes a la posición 4 y 5 del paquete

de datos son 1 o 0, y si es así, se procede a calcular el CRC del paquete recibido, si el CRC

resultante es igual a cero, se actualiza el último paquete recibido correctamente, y se va a

continuar (Continue). En caso de que alguno de los caracteres 4 y 5 del paquete de datos sea

diferente de 1 o 0, o en caso de que el CRC sea diferente de cero, significa que el paquete tiene

un error, entonces se incrementa el contador de errores, se toma el paquete de datos anterior y

se va a continuar (Continue).

Page 87: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

77

INICIO

DECLARAR VARIABLES

CONFIGURAR PUERTO

SELECCIONAR PUERTO

BORRAR ARCHIVOS BINARIOS

CARGAR COEFICIENTES DEL FILTRO DIGITAL

Se recibio algo durante 1 seg?

SI

NO

REINICIA CONTADOR DE CANALES

LEER DATO DEL PUERTO

Llego carácter de incio de paquete?

SI

NO

INCREMENTA CONTADOR DE ERRORES Y CEROS

SE TOMA EL PAQUETE DE DATOS ANTERIOR

A

Again

Continue

Page 88: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

78

Si DATO recibido es igual al carácter de fin de paquete y contador canales llego a

su máximo?

SI

LEER DATO DEL PUERTO

Se recibio algo durante 1 seg?

SI

NO

PAQUETE DE DATOS ANTERIOR=PAQUETE DE DATOS

INCREMENTA CONTADOR DE ERRORES Y CEROS

SE TOMA EL PAQUETE DE DATOS ANTERIOR

Continue

A

NO

CALCULAR CRC

CRC=0?

SI

NO

Contador canales llego a su máximo?

SI

NO

INCREMENTA CONTADOR DE ERRORES

SE TOMA EL PAQUETE DE DATOS ANTERIOR

ALMACENA EL DATO EN EL PAQUETE DE DATOS

INCREMENTA CONTADOR DE CANALES

Contador de canales llego a su máximo?

NO

SI

A

INCREMENTA CONTADOR DE ERRORES

SE TOMA EL PAQUETE DE DATOS ANTERIOR

Si los caracteres correspondientres a las posicines 4 y 5 del paquete de datos son

diferentes de 1 o 0?

SI

NO

Page 89: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

79

Figura 5.2 Diagrama de flujo general de recepción en la PC.

FILTRAR LA INFORMACIÓN DE CADA UNO DE LOS CANALES ANALÓGICOS, Y ALMACENAR

LOS VALORES OBTENIDOS

REINICIA CONTADOR DE CANALES

INCREMENTAR CONTADOR DE CANALES

Contador canales es mayor o igual a total canales?

SI

NO

Continue

1 0( ) ( ) ( )

N M

k kk k

y n a y n k b x n k= =

= − − + −∑ ∑

ALMACENAR LOS DATOS DELOS CANALES DIGITALES

INCREMENTA CONTADOR POSICIÓN

Posición es mayor o igual al máximo de datos por minuto?

NO

SI

REINICIAR POSICIÓN

GENERAR LOS ARCHIVOS BINARIOS DE LOS 7 CANALES DE INFORMACIÓN, ERRORES, Y

EL DE CEROS OCURRIDOS DURANTE EL ÚLTIMO MINUTO

REINICIAR CONTADOR DE ERRORES Y CEROS Again

Se presionó alguna tecla?

SI

NO

FIN

Page 90: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

80

5.4 Conexión vía radio módems

Los radio módems, son dispositivos de comunicación inalámbrica (radio frecuencia),

que se han diseñado para sustituir los enlaces seriales por cable entre dispositivos de

comunicación, en aplicaciones de monitoreo y control (ver figura 8.1). Los radio módems son

transparentes para los usuarios, ya que emplean el protocolo de un módem nulo.

En el mercado existen una gran variedad de estos, los hay desde los que soportan

velocidades de transmisión de 300bps hasta 115.2 kbps, empleando el puerto de

entrada/salida serie (RS-232), requiriendo una alimentación de 5Vcd ( www.comlab.com ).

5.5 Elección del radio módem El radio módem a emplear en una aplicación de este tipo debe contar con las siguientes

características:

• Poseer interfaz serial (RS-232).

• Alimentación de 12Volts como máximo.

• Debe ser capaz de soportar el BAUDRATE empleado (2400bps).

• Debe tener el alcance (Potencia de transmisión) necesario para cubrir la comunicación

deseada.

• Debe respetar las normas mexicanas ( www.cofetel.gob.mx ).

Conexión vía radio módem Microcontrolador

Convertidor A/D

USART (Puerto Serie)

Radio Módem

RS-232Radio

Módem

RS-232

Pc (Gráficación)

RA0RA1RA2RA5

TOCK1RE1RE2

Puerto Serie

TTL/RS-232

Radio Frecuencia

Antena

Figura 5.3 Conexión vía radio módem.

Page 91: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

81

Los voltajes de alimentación de los radio módems pueden variar, de 5Vcd, 9Vcd,

12Vcd. Además algunos radio módem aceptan entradas TTL.

Page 92: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

82

Capítulo 6. Filtros

Un filtro es un dispositivo que permite el paso a través de él, de una señal cuya

frecuencia está en cierto rango o ciertos rangos de frecuencias. La banda de paso es el rango o

rangos de frecuencias que pueden pasar por el filtro. Al rango o rangos de frecuencias que son

bloqueadas por el filtro se le llama banda de rechazo.

Desde el punto de vista de las señales que manejan los filtros se pueden clasificar

como: analógicos y digitales.

• Filtros analógicos. Son aquellos que filtran señales que son continuas en el tiempo

(analógicas).

• Filtros digitales. Son aquellos que filtran señales digitales.

A los puntos extremos o bordes de las bandas de paso y de rechazo de un filtro se les

llaman frecuencias de corte y se especifican en Hz o radianes. Los filtro ya sean analógicos o

digitales se clasifican en función de sus bandas de paso, como se indica a continuación:

• Filtros pasa-bajas. Es aquel filtro que deja pasar todas aquellas señales cuyas

frecuencias sean inferiores a su frecuencia de corte cw . La banda de paso es el conjunto de

todas las frecuencias w tales que 0 cw w≤ ≤ . Y la banda de rechazo es el conjunto de

todas las frecuencias w tales que w > cw .

• Filtros pasa-altas. Es aquel filtro que deja pasar todas aquellas señales cuyas

frecuencias sean superiores a su frecuencia de corte cw . La banda de paso son todas las

frecuencias w tales que cw w≥ . Y la banda de rechazo son todas las frecuencias w tales

que w < cw .

Page 93: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

83

• Filtros pasa-banda. Es aquel filtro que deja pasar señales cuyas frecuencias se

encuentren en un rango de frecuencias intermedias. Por lo tanto este tipo de filtro posee

dos frecuencias de corte, una inferior 1( )w , y otra superior 2( )w , y sólo pasaran aquellas

señales cuyas frecuencias se encuentren entre estas frecuencias de corte. Es decir la banda

de paso esta definida por el conjunto de todas las frecuencias w tales que 1 2w w w≤ ≤ .

Un filtro pasa-banda tiene dos bandas de rechazo y están definidas por los conjuntos de

todas las frecuencias w tales que w < 1w y w > 2w .

• Filtros rechaza-banda. Es aquel filtro que hace lo opuesto al pasa-banda. Este filtro

rechazará todas aquellas señales que se encuentren en un rango de frecuencias intermedias.

Sólo pasarán aquellas señales cuyas frecuencias sean menores a la primera frecuencia de

corte 1( )w w≤ , y también dejará pasar aquellas cuyas frecuencias sean mayores a la

segunda frecuencia de corte 2( )w w≥ . Es decir la banda de rechazo esta definida por el

conjunto de todas las frecuencias w tales que 1 2w w w< < .

Un filtro rechaza-banda tiene dos bandas de paso y están definidas por los conjuntos de

todas las frecuencias w tales que w < 1w y w > 2w .

Un filtro es ideal si el cambio de la banda de paso a la banda de rechazo es abrupto.

Un filtro real no tiene este comportamiento. El paso de una banda a otra abarca un cierto rango

de frecuencias denominado banda de transición (ver figura 6.1).

Además en un filtro ideal la amplitud de las señales es escalada por un factor constante

en todas las bandas. En la banda de rechazo el factor es cero y en las bandas de paso el factor

es uno. Estas constantes definen lo que se conoce como características de amplitud o también

como la ganancia del filtro.

En un filtro real la ganancia no es constante en ninguna de las bandas si no que

contiene variaciones. Estas variaciones pueden ser monotonicas o de carácter oscilatorio

(rizado). En la figura 6.1 se muestran las características de amplitud de un filtro ideal y un

filtro real.

Page 94: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

84

( )jwH e

1

Banda de paso

Banda de rechazo

w

0 cw π

a) Curva de ganancia filtro pasa-bajas ideal con frecuencia de corte cw

b) Curva de ganancia filtro pasa-bajas real

Figura 6.1 Curva de ganancia de un filtro pasa-bajas ideal y real.

Al procedimiento que se realiza para obtener unas determinadas características de

amplitud para un filtro se le llama aproximación. Existen diferentes tipos de aproximaciones

para el diseño de filtros, como por ejemplo: las aproximaciones Butterworth, Chebyshev etc...

Estas aproximaciones proporcionan diferentes características de amplitud y selectividad. Se

dice que un filtro es más selectivo entre más pequeña sea su banda de transición [13], [14].

El orden de un filtro (el cual se definirá después) diseñado par satisfacer determinadas

características dependerá de la aproximación usada.

Page 95: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

85

6.1 Especificaciones de un filtro

Las características de amplitud de un filtro se definen en base a un conjunto de

parámetros denominados especificaciones del filtro. En la siguiente figura 6.2 se muestra

como se definen estos parámetros.

Figura 6.2 Especificaciones de un filtro real.

Comúnmente a estos parámetros se les asigna los siguientes nombres:

• 1δ : Rizado en la banda de paso

• 2δ : Rizado en la banda de rechazo

• rw : Borde de la banda de rechazo

• pw : Borde de la banda de paso

Además la respuesta en frecuencia del filtro ( ( )jwH e ), puede variar de dos formas:

• Monotonicamente (ver figura 6.3)

Figura 6.3 Variación monotonica.

Page 96: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

86

• No-Monotonicamente (ver figura 6.4)

Figura 6.4 Variación No-monotonica.

Las variaciones pueden combinarse en cada banda, de tal forma que puede haber filtros

con variaciones monotonicas en su banda de paso y variaciones no-monotonicas en su banda

de rechazo y viceversa, esto dependerá del tipo de aproximación empleada.

6.2 Filtros digitales lineales e invariantes en el tiempo

Un filtro digital tiene como entrada una sucesión de números y da como salida otra

sucesión de números. Sean ( ), ( ( 1)),..... ( 1), ( )x n M x n M x n x n− − − − , M elementos sucesivos

en el tiempo de la señal de entrada, y sean ( ), ( ( 1)),..... ( 1), ( )y n N y n N y n y n− − − − , N

elementos sucesivos en el tiempo de la correspondiente señal de salida del filtro.

El filtro digital define la relación entre el valor ( )y n de la salida y sus N valores

previos, y el valor ( )x n de la entrada y los M valores previos de la entrada. Los filtros se

pueden clasificar según esta relación.

Para los denominados filtros digitales lineales e invariantes en el tiempo (FDLIT) esta

relación es de la forma:

1 0( ) ( ) ( )

N M

k kk k

y n a y n k b x n k= =

= − − + −∑ ∑ (6.1)

En donde cada una de las ka y kb son constantes.

Page 97: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

87

Los FDLIT se clasifican a su vez en filtros con respuesta impulso finita o FIR (por sus

iniciales en ingles Finite Impulse Response), y filtros con respuesta impulso infinita o IIR (por

sus iniciales en ingles Infinite Impulse Response).

En los filtros FIR todas las constantes ka son cero y en los IIR al menos una ka es

diferente de cero. Entonces para los filtros FIR la relación anterior se simplifica y es:

0( ) ( )

M

kk

y n b x n k=

= −∑ (6.2)

En este trabajo sólo se emplean los filtros IIR por lo que se discutirán más en detalle

que los FIR.

Para un filtro IIR el valor de la constante N se define como el orden del filtro y a las

constantes ka y kb se les llama coeficientes del filtro.

La notación ( )x n es una simplificación, en realidad ( )x n significa el valor de la

sucesión en el tiempo t=nT, en donde T es el tiempo entre dos elementos sucesivos de la

sucesión. Si ( )x n proviene de muestrear una señal continua en el tiempo, T representa el

periodo de muestreo. También puede convenirse en que esta notación se corresponde con el

caso T=1.

Respuesta a un impulso

Un impulso ( )nδ es una señal tal que todas sus muestras son igual a cero, excepto en

n=0, en donde su valor es uno, o sea (0) 1δ = .

Cuando la entrada ( )x n de un filtro es un impulso, a la correspondiente salida se le

conoce como la respuesta impulso del filtro y se denota por ( )h n .

Page 98: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

88

La transformada Z de una sucesión ( )x n , ( )X z se define como:

( ) ( ) k

kX z x k z

∞−

=−∞

= ∑ (6.3)

En donde z es una variable compleja.

El conocer la respuesta a un impulso de un filtro permite saber si el filtro es estable y si

es causal. Se dice que un filtro es estable si ( )h n , esta acotada, y se dice que es causal si el

filtro no responde antes de que se le aplique la entrada, dicho de otra forma un filtro es causal

si ( ) 0h n = para valores de 0n < .

Si ( )X z , ( )Y z y ( )H z son la transformada z de la entrada, la salida y la respuesta

impulso de un filtro respectivamente, entonces se cumple la siguiente relación:

( ) ( )( )

Y z H zX z

= (6.4)

A ( )H z se le denomina función de transferencia del filtro [15], [16].

En términos de los coeficientes ka y kb de la ecuación (6.4) se tiene también que:

0

1

( )1

Mk

kk

Nk

kk

b zH z

a z

=

=

=+

(6.5)

Características de amplitud de un filtro

Si ( )x n es una sucesión senoidal Cos wn la salida ( )y n del filtro es también senoidal y

esta dada por:

( ) ( ) ( ( ))jwy n H e Cos wn wφ= + (6.6)

En donde:

( ) ( ) jwjw

z eH e H z

==

( ) arg ( )jww H eφ =

Page 99: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

89

Entonces la sucesión con frecuencia w , Cos wn aparece a la salida del filtro escalado

en amplitud por el factor ( )jwH e , y por lo tanto las características de amplitud del filtro están

definidas por ( )jwH e .

La sucesión de salida ( ( ))Cos wn wφ+ tiene un ángulo de fase ( )wφ con respecto de la

entrada Cos wn , el cual esta en función de la frecuencia.

6.3 Diseño de un filtro digital

Dadas las especificaciones para un filtro el problema del diseño consiste en determinar

las constantes ka y kb de tal manera que ( )jwH e satisfaga estas especificaciones. Una vez

encontradas estas constantes el filtro digital se implementa mediante el cálculo de la ecuación

(6.1):

1 0( ) ( ) ( )

N M

k kk k

y n a y n k b x n k= =

= − − + −∑ ∑

Normalmente las señales no son sucesiones senoidales puras, sino que son una

combinación de un conjunto de señales senoidales que abarcan un rango continuo de

frecuencias.

Si en la banda de paso del filtro la fase ( ) arg( ( ))jww H eφ = no es proporcional a la

frecuencia, o sea si ( )w cwφ ≠ , en donde c es una constante, la forma de la señal será

modificada (aun cuando este en la banda de paso) a esto se le conoce como distorsión de fase

[15], [16].

Entonces es deseable que en la banda de paso del filtro la fase sea lineal o al menos

aproximadamente lineal.

Page 100: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

90

Relación entre la transformada de Fourier y la transformada de Fourier discreta

Se sabe que existe una relación de correspondencia entre la frecuencia en tiempo

continuo Ω , y la frecuencia en tiempo discreto w . De tal forma que la frecuencia en tiempo

discreto w corresponde con la Ω multiplicada por un intervalo de muestreo T.

La transformada de Fourier en tiempo continuo (FT) de una señal continua en el

tiempo ( )x t esta definida por:

( ) ( ) j tX j x t e dt

∞− Ω

−∞

Ω = ∫ (6.7)

( )X jΩ describe la señal ( )x t como una función de la frecuencia Ω , y se llama

representación de ( )x t en el dominio de la frecuencia [15], [16].

Y la FT inversa en tiempo continuo esta definida por:

1( ) ( )2

j tx t X j e dπ

∞Ω

−∞

= Ω Ω∫ (6.8)

La cual permite la representación de la señal ( )x t en términos de su transformada de

Fourier en tiempo continuo ( )X jΩ .

La transformada de Fourier en tiempo discreto (DTFT) de una señal muestreada ( )x n

esta definida por la expresión:

( ) ( )jw jwn

nX e x n e

∞−

=−∞

= ∑ (6.9)

La transformada ( )jwX e describe la señal ( )x n como una función de la frecuencia w ,

y se le llama representación en el dominio de la frecuencia de ( )x n [15], [16].

Page 101: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

91

Y la transformada de Fourier inversa en tiempo discreto de una señal muestreada se

define como:

2

0

1( ) ( )2

jw jwnx n X e e dwπ

π= ∫

(6.10)

La cual permite la representación de la señal ( )x n en términos de su transformada de

Fourier en tiempo discreto ( )jwX e .

Si se sustituye w T= Ω en la ecuación (6.9) de la DTFT se obtiene en función de la

frecuencia continuaΩ :

( ) ( ) ( )jw j Tn

w Tn

X j X e x n eδ

∞− Ω

=Ω=−∞

Ω = = ∑

Y tomando su transformada de Fourier inversa se obtiene:

( ) ( ) ( )

nx t x n t nTδ δ

=−∞

= −∑ (6.11)

Es decir ( )X jδ Ω es la transformada de Fourier de la señal continua en el tiempo

( )x tδ . ( )x tδ es igual a la señal continua ( )x t muestreada mediante impulsos en t=nT , como

se demuestra a continuación:

Por definición ( ) 0tδ = para 0t ≠ , entonces el producto ( ). ( )x t tδ es igual a (0). ( )x tδ .

Por lo tanto:

( ) ( ) ( ) ( )x t t nT x nT t nTδ δ− = −

Ya que t-nT es igual a cero en t=nT.

Como ya se había establecido antes ( )x n representa el valor de ( )x t en el tiempo

t=nT, y entonces:

( ) ( ) ( ) ( )x t t nT x n t nTδ δ− = −

Page 102: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

92

Y la suma de la ecuación (6.11) representa a las muestras de ( )x t para n−∞ < < ∞ .

La ecuación (6.11) puede escribirse también como:

( ) ( ) ( ) ( ) ( )

n nx t x nT t nT x t t nTδ δ δ

∞ ∞

=−∞ =−∞

= − = −∑ ∑ (6.12)

Es decir la señal muestreada se puede representar como el producto de la señal original

( )x t y un tren de impulsos, a esto se le llama muestreo mediante impulsos [16].

La frecuencia a la que se muestrea una señal en tiempo continuo mΩ tiene un efecto el

cual se determina relacionando la FT de ( )x tδ con la FT de ( )x t . La siguiente expresión

representa esta relación:

1( ) ( ( ))mk

X j X j kTδ

=−∞

Ω = Ω− Ω∑ (6.13)

La cual muestra que la FT de la señal muestreada ( )X jδ Ω está representada por la

suma infinita de versiones desplazadas de la FT de la señal continua ( )X jΩ . Los

desplazamientos son múltiplos enteros de mΩ (ver figura 6.5). De tal forma que si mΩ no es

lo suficientemente grande las versiones desplazadas de ( )X jΩ se traslaparan unas con otras, a

esto se le conoce como efecto de traslape o alias. Para evitar este efecto mΩ debe ser mayor

que 2 veces la componente de frecuencia más alta de la señal original W (ver figura 6.5) [16].

Page 103: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

93

a) Espectro de una señal en tiempo continuo, donde W =frecuencia

máxima de la señal

b) Espectro de la señal muestreada, cuando mΩ > 2W (sin ALIAS, donde

mΩ =frecuencia de muestreo en rad/seg

c) Espectro de la señal con traslape (ALIAS), con 2m WΩ <

Figura 6.5 Espectro de frecuencia de una señal sin ALIAS y con ALIAS (traslape).

6.4 Diseño de los filtros IIR

Los filtros IIR se describen a través de la ecuación (6.1):

1 0( ) ( ) ( )

N M

k kk k

y n a y n k b x n k= =

= − − + −∑ ∑

Page 104: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

94

Existen dos formas de diseñar filtros IIR, los cuales son:

• Métodos indirectos

• Métodos directos

Con los métodos indirectos se diseñan filtros digitales basados en diseños de filtros

analógicos, y los directos como su nombre lo indica, son con los que se diseña filtros digitales

directamente. El método de diseño de filtros IIR más empleado es el método indirecto

conocido como transformación bilineal.

Con este método se obtiene un filtro digital con función de transferencia ( )H z a partir

de un filtro analógico con función de transferencia ( )H s mediante la transformación:

2 11

zsT z

− = +

(6.14)

En donde T es el periodo de muestreo.

Si ( )Ha s es la función de transferencia del filtro analógico, el correspondiente filtro

digital ( )H z esta dado por:

1

12 1 2 1. .

1 1

( ) ( )a z zsT z T z

H z H s −

−− −

= =+ +

= (6.15)

Donde s es la variable de la transformada de Laplace para funciones continuas, y z es

la variable de la transformada z para funciones discretas. Con las aproximaciones más

comunes para el diseño de filtros analógicos se obtiene ( )Ha s como una función racional con

coeficientes constantes, por lo tanto con la transformación bilineal ( )H z también se obtiene

una función racional con coeficientes constantes, por lo tanto el filtro resultante se puede

implementar mediante la ecuación de diferencias:

1 0( ) ( ) ( )

N M

k kk k

y n a y n k b x n k= =

= − − + −∑ ∑

Page 105: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

95

Las variables s, y z son ambas variables complejas. Al evaluar ( )Ha s en s j= Ω se

obtiene la respuesta de frecuencia del filtro analógico ( )Ha jΩ , y al evaluar ( )H z en jwz e=

se obtiene la respuesta de frecuencia del filtro digital ( )jwH e , o sea:

( ) ( )s j

Ha j Ha s= Ω

Ω =

( ) ( ) jwjw

z eH e H z

==

La transformada bilineal preserva las características principales del filtro analógico

como lo son: linealidad, estabilidad, causalidad, y el tipo de filtro (pasa-bandas, pasa-bajas

etc..)

Para que un filtro analógico sea estable sus polos deben estar en el semiplano izquierdo

del plano s, en caso contrario el sistema es inestable. Del mismo modo un filtro digital es

estable si sus polos están dentro de un circulo unitario con centro en el origen del plano z.

Entonces si la ( )s f z= conserva la estabilidad de un filtro analógico. El semiplano izquierdo

del plano s, debe mapear al interior del circulo unitario en el plano z, el semiplano derecho del

plano s debe mapear al exterior del circulo unitario en el plano z, y finalmente el eje

imaginario del plano s debe mapear a la circunferencia del circulo unitario. A continuación se

determina el mapeo del circulo unitario en el plano z al eje imaginario de plano s bajo la

transformación bilineal.

Si jwz e= , entonces: 1 / 2 / 2 / 2

1 / 2 / 2 / 2

2 1 2 1 2 .( ) 2 2 . ( / 2) 2 . ( / 2)1 1 .( ) 2. ( / 2)

jw jw jw jw

jw jw jw jw

z e e e e j Sen w js Tan wz e e e e Cos w

− − − −

− − − −

− − −= = = = = Τ + Τ + Τ + Τ Τ

Como s jσ= + Ω :

jσ + Ω = 2 . ( / 2)j Tan w

Τ

(6.16)

Page 106: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

96

Haciendo σ =0 para considerar únicamente el eje imaginario del plano s se obtiene.

jΩ = 2 . ( / 2)j tan wΤ

o sea

2 . tan( / 2)wT

Ω = (6.17)

La ecuación anterior define como mapea el circulo unitario en el plano z al eje

imaginario del plano s (ver figura 6.6).

De acuerdo con la ecuación (6.17) cuando w varia de 0 a π , Ω varia de 0 a ∞ y

cuando w varia de 0 a π− , Ω varia de 0 a −∞ . Entonces la mitad superior de la

circunferencia del circulo unitario en el plano z mapea al semieje positivo del plano complejo

s, y la mitad inferior de la circunferencia del circulo unitario en el plano z mapea al semieje

negativo del plano complejo s (ver figura 6.6).

Figura 6.6 Propiedades de la transformación bilineal.

Entonces mientras que la frecuencia del filtro digital varía de 0 a π , la frecuencia del

filtro analógico varia de 0 a ∞ . Esto provoca una distorsión ya que se mapea el intervalo de

[ ]0,∞ al intervalo finito [ ]0,π . A esta distorsión se le llama distorsión de alabeo. Esta

Page 107: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

97

distorsión se evita predistorsionando las frecuencias críticas (frecuencias de corte) del filtro

digital kw , mapeandolas a las frecuencias críticas del filtro analógico kΩ de acuerdo con la

siguiente formula:

2

kk

wtan Ω =

, para k=1,2,3,4,5........ (6.18)

De este modo al aplicar la transformación bilineal las frecuencias críticas del filtro

analógico mapearán a las frecuencias digitales críticas correctas.

El proceso de diseño con la transformación bilineal consta de los siguientes pasos:

• Establecer especificaciones.

• Predistorsionar las frecuencias críticas.

• Determinar ( )Ha s .

• Aplicar la transformación bilineal a ( )Ha s .

Al aplicar la transformación bilineal se obtiene ( )H z . Si se expresa ( )H z como una

función racional de 1z− :

0 0 11

0 1

0

...( )( )( ) ...

Mk

k Mk MN N

k Nk

k

b zb b b zY zH z

X z a a z a za z

−−

=− −

=

+ + += = =

+ + +

(6.19)

Despejando 0 ( )a Y z de la ecuación (6.19):

00 1

( ) ( ) ( )M N

k kk k

k ka Y z b z x z a z x z− −

= =

= −∑ ∑

Una propiedad de la transformada z establece que si ( )Y z es la transformada z de

( )y n entonces la transformada z de ( )y n k− es ( )kz Y z− [15], [16].

Page 108: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

98

Aplicando esta propiedad, la ecuación anterior puede escribirse en el tiempo como:

)()()(10

0 knyaknxbnyaN

kk

M

kk −−−= ∑∑

==

Y dividiendo ambos miembros entre 0a se obtiene finalmente:

−−−= ∑∑

==

)()(1)(100

knyaknxba

nyN

kk

M

kk

La ecuación anterior es la ecuación de diferencias mediante la cual se implementa el

filtro digital ( )H z .

Existen programas para el diseño de los filtros digitales mediante los cuales el proceso

de diseño es relativamente simple. Entre ellos está Matlab (Matlab versión 5.3) el cual cuenta

con herramientas para el procesamiento de señales (Signal Processing Toolbox), entre las

cuales se encuentran las necesarias para el diseño de filtros digitales. Más adelante se detalla

como se emplearon estas herramientas para diseñar los filtros necesarios para este proyecto

mediante el método indirecto.

Como se mencionó anteriormente existen dos tipos de filtros digitales, los IIR y los

FIR. Dependiendo de las propiedades del filtro, las características de la señal, y la información

que se pretende obtener de esta, alguno de los tipos de filtros resultará más apropiado.

Los filtros FIR pueden diseñarse para tener fase lineal y por lo tanto conservar la forma

de onda de una señal que este dentro de la banda de paso. También son inherentemente

estables. Una desventaja de estos filtros es que su selectividad es baja.

Por el contrario los filtros IIR no pueden tener fase lineal, pueden ser inestables y

tienen una selectividad alta.

Page 109: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

99

Que los filtros FIR sean menos selectivos que los IIR, implica que dadas unas

especificaciones, el orden del filtro requerido para satisfacerlas será mayor para un filtro FIR

que para un filtro IIR.

El orden puede ser o no importante dependiendo de la implementación. Si se

implementa mediante hardware un mayor orden implica más componentes lo cual se reflejará

en un costo mayor. Si se implementa mediante software el costo será la ejecución de más

código, y por lo tanto un tiempo de ejecución mayor. Si se dispone de suficiente tiempo del

procesador para la ejecución del código del filtro entonces en términos reales un orden mayor

no implica ninguna desventaja [15], [16].

Si la información que se pretende obtener de la señal no requiere que se conserve

fielmente la forma de esta, entonces tampoco la imposibilidad de obtener una fase lineal

representa una desventaja.

Como la transformación bilineal conserva la propiedad de estabilidad entonces basta

con diseñar un filtro analógico estable, para que el filtro digital derivado de este también lo

sea, y por lo tanto eliminar la posibilidad de que el correspondiente filtro IIR sea inestable.

Los métodos más comunes para obtener aproximaciones para filtros analógicos tienen

implícita la condición de estabilidad por lo que este aspecto no requiere ninguna atención

especial [17].

En cambio los IIR, son más selectivos por lo cual se obtienen filtros de un orden

mucho menor que los FIR, pero estos filtros no pueden tener fase lineal, además de que

pueden ser inestables lo que produciría que no sirviera como filtro. Por lo tanto estos filtros se

utilizan en aplicaciones donde la forma no es tan importante, como por ejemplo en una

aplicación como la de esta tesis.

Lo que se quiere obtener de las señales de la presente aplicación es la tendencia de

estas a largo plazo, o sea sus componentes de frecuencias bajas. Entonces deberá aplicarse un

filtrado pasa-bajas. En general la fase de un filtro IIR pasa-bajas será aproximadamente lineal

Page 110: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

100

a frecuencias muy bajas, y se alejará de la linealidad al aumentar la frecuencia. Entonces para

este proyecto no se requiere de la fase lineal.

Con una computadora típica moderna se dispone de un tiempo más que suficiente para

implementar el filtro, ya que lo único que se tiene que ejecutar es el código para la ecuación

(6.1). Como ya se mencionó anteriormente, al implementar el filtro mediante software no hay

ninguna ventaja real del filtro IIR sobre el FIR en lo relativo al orden del filtro.

Por las razones ya expuestas se decidió implementar el filtro pasa-bajas para las

señales analógicas mediante un filtro IIR.

Si bien los filtros IIR tienen mayor selectividad que los FIR lo cierto es que la

selectividad en particular dependerá de la aproximación que se use para el filtro analógico. En

la tabla 6.1 se muestran algunas de estas aproximaciones más comunes y sus propiedades: TIPO RESPUESTA EN FRECUENCIA

( )H jΩ

CARACTERÍSTICAS GENERALES

Butterworth

-Poseen un comportamiento monotonico tanto en la banda de paso como en la de rechazo. -Su fase no es muy lineal. -Distorsión de fase media.

Chebyshev tipo I

-Poseen un comportamiento de no-monotonico en su banda de paso (rizado), y un comportamiento monotonico en su banda d rechazo. -Es mas selectivo que un Butterworth. -Distorsión de fase grande.

Chebyshev tipo II

-Poseen un comportamiento monotonico en su banda de paso, y un comportamiento de rizado en su banda de rechazo. -Es más selectivo que un Butterworth. -Distorsión de fase grande.

Elípticos

-Son los más selectivos. -Su fase es la menos lineal de todos. -Distorsión de fase muy grande.

Tabla 6.1 Características de los filtros analógicos usados habitualmente para diseñar filtros digitales IIR.

Page 111: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

101

Observando la tabla 6.1, se puede ver que entre más selectiva sea un aproximación su

fase será más no-lineal. La aproximación Butterworth se considera como un buen compromiso

entre la selectividad, y la no-linealidad de la fase, por esta razón se eligió la aproximación

Butterworth para diseñar los filtros de este proyecto.

6.5 Cálculo del filtro digital

El cálculo del filtro consiste en determinar los coeficientes de la función de

transferencia del filtro o equivalentemente los coeficientes de su ecuación de diferencias. Para

el diseño del filtro se emplearon las funciones buttord, y butter. Las cuales se describen a

continuación:

[N,Wn]=BUTTORD(Wp,Ws,Rp,Rs). Se obtiene el orden mínimo de un filtro digital

IIR Butterworth N y su frecuencia de corte Wn, con una perdida no mayor que de Rp dB en

su banda de paso, y al menos una perdida de Rs dB en su banda de rechazo.

Wp y Ws son las frecuencias de corte de la banda de paso, y de rechazo, las cuales

están normalizadas de 0 a 1, donde 1 corresponde a la frecuencia de Nyquist normalizada

(frecuencia de muestreo/2).

Resumiendo:

• NOrden del filtro (Salida)

• WnFrecuencia de corte del filtro pasa-bajas (Salida)

• WpFrecuencia de corte de la banda de paso (Entrada)

• WsFrecuencia de corte de la banda de rechazo (Entrada)

• RpAtenuación del rizo en la banda de paso (Entrada)

• RsAtenuación del rizo en la banda de rechazo (Entrada)

[B,A] = BUTTER (N,Wn). Se obtienen los coeficientes de la ecuación de diferencias

para un filtro pasa-bajas digital IIR Butterworth de orden N, y frecuencia de corte Wn. Wn

debe darse normalizada 0.0<Wn<1.0, en donde 1 corresponde a la frecuencia de muestreo

Page 112: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

102

entre 2. Los coeficientes se regresan en los vectores A y B. Los elementos ib del vector B

corresponden al numerador de la función de transferencia ( )H z , y los coeficientes ia del

vector A corresponden al denominador de la función de transferencia ( )H z .

Tanto en el vector A como en el vector B los coeficientes se corresponden con las

potencias de 1z− en orden decreciente. Las funciones manejan automáticamente, y de manera

transparente para el usuario la transformación bilineal. Es decir toma en cuenta la

predistorsión de las frecuencias, calcula ( )Ha s , aplica la transformación bilineal.

El proceso se hace en dos etapas. La función buttord recibe como entrada las

especificaciones del filtro, y da como salida el orden del filtro N, y la frecuencia de corte Wn

del filtro Butterworth.

N y Wn se dan como entrada para la función butter, y esta da como salida los

coeficientes del filtro en los vectores B y A. Una vez obtenidos A y B, sus elementos se usan

para implementar la ecuación de diferencias.

0 1( ) ( ) ( )

N N

k kk k

y n b x n k a y n k= =

= − − −∑ ∑

La implementación del filtro por medio de la ecuación de diferencias se conoce como

implementación en la forma directa I de un filtro IIR.

6.6 Filtrado de las señales analógicas

En la figura 6.7 se muestra un diagrama de bloques del procesamiento de las señales

analógicas. Una parte del procesamiento de estas señales es el filtrado digital.

Page 113: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

103

Figura 6.7 Diagrama a bloques para el filtrado de las señales analógicas.

Aunque se tiene como opción el filtrar las señales analógicas mediante filtros

analógicos (antes de convertirlas a digitales) se decidió filtrar las señales digitalmente por dos

razones.

• No implica ningún costo adicional, porque el filtrado se implementa mediante

software.

• El filtrado digital tiene varias ventajas sobre el filtrado analógico [15], [16].

Entre las ventajas de los filtros digitales se pueden mencionar las siguientes:

• Su versatilidad, ya que se implementan por medio de un programa. Por ejemplo si se

modifica el filtro, lo único que cambiarían serían los coeficientes, y el código para la

implementación del filtro no sufría ningún cambio.

• Sus características no varían con el tiempo como es el caso de los filtros analógicos,

cuyas características si varían debido al envejecimiento de sus componentes.

La señal en tiempo continuo posee componentes de ruido aditivo y otras

interferencias, las cuales alteran a la señal original. El ruido y las interferencias pueden tener

componentes con frecuencias por encima de las componentes de frecuencia de la señal. Es

decir el ancho de banda de la señal alterada puede ser mayor que el de la señal original. De

este modo se puede definir una frecuencia de muestreo (igual a 2 veces el ancho de banda del

filtro antialias), tal que se evite la distorsión por traslape de frecuencias [15], [16]. El filtro

analógico antialias implementado es un filtro RC de primer orden.

FILTRO ANTIALIAS A/D FILTRO DIGITAL (Software)

GRAFICACIÓN (Software)

COMPUTADORA

( )x t

( )x n ( )y n

( )y t

ALMACENAMIENTO (Software)

Page 114: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

104

6.7 Diseño del filtro digital

Para diseñar el filtro digital primero deben definirse las especificaciones. Estas

especificaciones incluyen las características de amplitud y fase del filtro, y la frecuencia de

muestreo ( mf ).

El filtro digital será un pasa-bajas, con el objetivo de reducir el ruido de altas

frecuencias, y suavizar los cambios transitorios (por ejemplo al arrancar la planta), e

interferencias. La frecuencia de muestreo mf debe ser al menos igual a 2 veces la frecuencia

máxima de la señal analógica.

El espectro de frecuencia de las señales reales, decae asintoticamente hacia 0 a

frecuencias altas como se muestra en la figura 6.8.

Figura 6.8 Espectro ( )X jw de una señal real.

En general a frecuencias suficientemente altas en donde las componentes de la señal

son más débiles, el espectro está dominado por el ruido, es decir a frecuencias suficientemente

altas la señal consistirá básicamente de ruido.

La presencia del ruido a frecuencias altas dificulta el establecimiento de la componente

máxima de frecuencia o el ancho de banda de la señal. Si es posible distinguir a partir de que

frecuencia empieza a dominar el ruido sobre la señal (como se muestra en la figura 6.9),

entonces podemos tomar esta frecuencia como el ancho de banda de la señal. En general esto

no es posible o es muy difícil hacerlo, y entonces debe definirse el ancho de banda de manera

Page 115: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

105

arbitraria como por ejemplo tomar la frecuencia a la cual el espectro tiene una amplitud del

1% de su amplitud en la frecuencia cero. En base a esta frecuencia se establecería la

frecuencia de corte del filtro pasa-bajas (ver figura 6.9).

Figura 6.9 Espectro ( )jwX e .

El paso siguiente consiste en definir la frecuencia de muestreo. Para evitar el traslape

de frecuencias debe determinarse a que frecuencia el espectro es igual a cero y tomar al menos

2 veces esta frecuencia como la frecuencia de muestreo mf .

Como anteriormente ya se dijo, en la práctica puede ser difícil establecer esta

frecuencia, y entonces del mismo modo en que se definió la frecuencia de corte para la

señal cf , se sigue una estrategia arbitraria como por ejemplo tomar una frecuencia a la cual el

espectro tiene una amplitud de 0.05% de su amplitud en la frecuencia cero, si se le llama xf a

esta frecuencia, la frecuencia de muestreo mf debe ser al menos 2 veces esta frecuencia (ver

figura 6.10).

Figura 6.10 Espectro ( )jwX e real, mf >2 xf .

Page 116: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

106

Si se elige una mf inadecuada se obtendría un espectro como el mostrado en la figura

6.11, donde toda la información de la señal contenida en el rango de frecuencias sombreado

se perdería por el efecto de traslape.

Figura 6.11 Efecto del alias mf <2 xf .

Para definir cf y xf se requiere obtener sus espectros de frecuencias. En la práctica no

siempre se justifica la obtención de estos espectros. Por ejemplo puede no ser necesario

conservar todas las frecuencias de la señal, como es el caso con las señales que se van a

monitorear con este proyecto. Las razones para esto se detallan a continuación.

La primera razón es que no se va a efectuar ningún tipo de control sobre estas señales.

Esto elimina la necesidad de una respuesta rápida a las variaciones de éstas, o

equivalentemente no se requiere de las componentes de frecuencia altas de estas señales. El

objetivo principal es detectar fallas en los equipos.

Una fluctuación muy rápida en el valor de una señal aún cuando esté fuera de rango, no

significa necesariamente que hay una falla. En general es más práctico monitorear la tendencia

promedio de las señales. En caso de una falla en un equipo tarde o temprano la tendencia de la

correspondiente señal la llevará fuera de rango. Otra razón para eliminar las frecuencias altas

es que se disminuyen las falsas alarmas por variaciones transitorias.

Page 117: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

107

Otro aspecto a considerar es que mientras mayor sea la frecuencia de muestreo se

generarán más datos, y se requerirá de mayor capacidad de almacenamiento en la

computadora.

En base al criterio de monitorear las tendencias promedio se consideró que una

frecuencia de muestreo de 1Hz es más que suficiente. Es decir podrán observarse

fluctuaciones con un periodo de 2 segundos como mínimo. Aún así esta frecuencia es muy

grande si se considera que las señales se van a monitorear remotamente. En otras palabras el

tiempo de respuesta será muy grande y de ninguna manera será del orden de segundos.

Se eligió una frecuencia de muestreo de 1Hz únicamente para digitalizar los datos y

como se discutirá posteriormente esta frecuencia se disminuirá considerablemente en la

computadora donde se van almacenar los datos.

6.8 Implementación del filtro antialias

El filtro antialias debe diseñarse de tal forma que todas aquellas frecuencias por encima

de / 2mf , sean atenuadas hasta niveles despreciables (ver figura 6.12).

Figura 6.12 Respuesta en frecuencia del filtro pasa-bajas antialias.

El filtro antialias es un simple filtro RC de primer orden, y se implementó como se

muestra en la figura 6.13.

Page 118: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

108

Figura 6.13 Filtro antialias analógico.

La función de transferencia del filtro es:

1( )H sRSC

= (6.20)

Y posee un polo en:

1sRC−

=

Las características de amplitud ( )H jw de este filtro se muestran en la figura 6.14. En

la frecuencia 1/(RC), ( )H jw es igual a 0.7071 o –3dB ( ( )20log ( )H jw ).

Figura 6.14 Respuesta en frecuencia del filtro pasa-bajas empleado.

Si se toma esta frecuencia como la frecuencia de corte del filtro, entonces el rizado o

atenuación máxima en la banda de paso será de –3dB.

Page 119: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

109

La pendiente de ( )H jw en la banda de transición en dB es igual a 6 /dB Octava− o

20 /dB Decada− aproximadamente. Esto significa que si 10 cf f= , ( )H jw en dB será igual

a 20dB− (0.1 en escala lineal), y si 100 cf f= será 40dB− (0.01 en escala lineal).

El filtro se diseñará para que ( )H jw =0.01 a la frecuencia / 2 (1/ 2)mf Hz= . Con esta

condición la frecuencia de corte cf debe ser:

0.005

(100)(2) 200m m

cf ff Hz= = =

(6.21)

Si bien esta frecuencia de corte es muy baja y también la banda de transición es muy

grande, este filtro se incluyó únicamente con el objetivo de eliminar la distorsión por alias

durante las pruebas del sistema. Como ya se indicó anteriormente en la tarjeta de

acondicionamiento deben incluirse filtros antialias de un orden apropiado y con el ancho de

banda apropiado para cada señal.

Para el diseño del filtro normalmente se elige el capacitor, y se calcula la resistencia

con la ecuación siguiente:

12 ( )c

Rf Cπ

= (6.22)

Tomando 100C Fµ= , se obtiene el siguiente valor de R

1 318.32 (0.005)(100 )

R kπ µ

= = Ω

En la práctica se elige el valor estándar de resistencia más cercano por encima de

318.3kΩ . Para resistencias con una tolerancia del 5% el valor más cercano es 330kΩ . Pero se

decidió sustituir esta resistencia única por dos de 680kΩ conectadas en paralelo entre sí, las

cuales dan como resultado la resistencia equivalente más cercana de 340kΩ (ver figura 6.13).

Este cambio tiene como finalidad sumarle una componente de cd (Vcd) a la señal de entrada,

para obtener siempre voltajes positivos.

Page 120: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

110

6.9 Submuestreo

El tamaño de los archivos para almacenar los datos adquiridos es directamente

proporcional a la frecuencia de muestreo. La frecuencia con la que se muestrean las señales

analógicas para digitalizarlas es de 1Hz. Con esta frecuencia se generarían archivos muy

grandes, los cuales requerirían de una capacidad de almacenamiento grande y también un

tiempo de procesado grande. Como lo que importa es la tendencia de las señales se decidió

submuestrear para tener una frecuencia efectiva de 1/10 de la frecuencia de muestreo de la

adquisición (1Hz).

Disminuir por un factor de 10 el tamaño de los archivos generados y almacenados en

la computadora, y el tiempo para su procesamiento.

Para ilustrar el efecto del submuestreo sobre el tamaño de los archivos a continuación

se realizan algunos cálculos al respecto.

Los archivos generados durante la adquisición representan las últimas 24 horas de

funcionamiento de los equipos. Entonces para calcular el tamaño de los archivos debe

considerarse la adquisición a una frecuencia de muestreo dada durante un intervalo de tiempo

de 24 horas. Para una frecuencia de muestreo de 1 Hz se tendría lo siguiente:

Los archivos generados se almacenan en binario. Cada dato se almacena en formato

single de 4 bytes. Si se recibe un dato por segundo (1Hz) entonces en 1 minuto se

almacenarían 240 bytes, en 1 hora serían 14400 bytes, y considerando que los archivos se

almacenan por día, por lo tanto en 24 horas se requeriría de 345600 bytes (337.5 Kbytes de

espacio en disco) por archivo para cada señal.

El submuestreo de 1/10 equivale a realizar un muestreo de 0.1Hz, por lo tanto la

nueva frecuencia de muestreo sería mf =0.1Hz. Entonces el tamaño del archivo de 24 horas

para una señal será 345600 bytes/10=34560 bytes (33.75Kbytes de espacio en disco).

Page 121: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

111

Como los datos se digitalizan con una frecuencia de muestreo de 1Hz estos contendrán

frecuencias hasta 0.5Hz. Si se submuestrean estos datos a una frecuencia de muestreo de

0.1Hz las componentes por encima de 0.05Hz producirían distorsión por traslape de

frecuencia. Para evitar esta distorsión los datos se filtran digitalmente con un filtro digital

pasa-bajas con una frecuencia de corte igual a 0.05Hz antes de proceder al submuestreo.

Este filtro además de evitar la distorsión por traslape dejará pasar sólo las frecuencias

bajas que contienen la información de la tendencia de las señales.

6.10 Coeficientes obtenidos del filtro digital

Para el diseño del filtro digital antialias se establecieron las siguientes especificaciones:

• Frecuencia de corte de la banda de paso fp, 0.025Hz.

• Frecuencia de corte de la banda de rechazo fs, 0.03Hz.

• Amplitud del rizo de la banda de paso rp, –3dB.

• Amplitud del rizo de la banda de rechazo rs, -40dB.

• Aproximación Butterworth.

En la tabla 6.2 se muestran las especificaciones para el filtro digital, y los coeficientes

del filtro que satisfacen las especificaciones dadas. ESPECIFICACIONES ORDEN DEL FILTRO Y COEFICIENTES OBTENIDOS

0.0250.03

3400.1

fp Hzfs Hzrp dBrs dBfm Hz

=== −= −=

15N =

0.5040Wn = [0.0002, 0.0026, 0.0182, 0.0787, 0.2361, 0.5194, 0.8656,

1.1129, 1.1129, 0.8656, 0.5194, 0.2361, 0.0787, 0.0182, 0.0026, 0.0002]

B =

[1.0000,0.1187, 2.0383, 0.2023, 1.5235, 0.1235, 0.5235, 0.0337, 0.0882, 0.0042, 0.0068, 0.0002, 0.0002, 0.0000, 0.0000, 0.0000]

A =

Tabla 6.2 Especificaciones y coeficientes del filtro digital antialias.

Page 122: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

112

Con este filtro se asegura que todas aquellas frecuencias por encima de 0.03Hz serán

atenuadas en –40dB (su amplitud se reducirá por un factor igual a 100).

Page 123: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

113

Capítulo 7. Graficación en la PC

Hasta este punto de la implementación, se cuenta con los archivos correspondientes de

cada señal a monitorear. Dichos archivos serán empleados por el sistema de graficación para

producir las graficas de cada señal.

7.1 Elección del leguaje de programación para la graficación

Se requiere de un lenguaje de programación que permita que el sistema, se ejecute bajo

ambiente Windows, ya que este, es más poderoso para aplicaciones gráficas, comparado por

ejemplo con el ambiente de DOS. Por esta razón se eligió Visual Basic 6.0 .

7.2 Sistema de graficación

El sistema de graficación se implementó usando un componente de graficación con

que cuenta Visual Basic, conocido como mschart control (mschrt20.ocx), a través del cual se

pueden obtener gráficos de formas muy sencillas ( www.msdn.microsoft.com ).

Las principales características de este control son las siguientes:

• Acepta los principales tipos de gráficos (barras, líneas, pastel etc..)

• Es sencillo proporcionarle los datos para su graficación, ya que posee un grid asociado,

el cual puede ser llenado directamente, o importando los datos desde una hoja de

cálculo o desde una matriz.

Por estas razones fue que se eligió usar este control.

El sistema implementado debe ser capaz de realizar las siguientes funciones básicas:

• Graficar las últimas 12 horas de funcionamiento de cada una de las señales a

monitorear.

• Generar alarmas cuando las señales no se encuentran en su rango correcto de

comportamiento.

• Regenerar gráficas de días anteriores.

Page 124: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

114

• Generar reportes semanales de las alarmas.

• Dejar opciones de configuración de alarmas para el usuario.

Por lo cual el sistema ya implementado se dividió en 4 partes (ver figura 7.1):

• Sistema de monitoreo

• Visor de graficas anteriores

• Visor de alarmas

• Configuración de alarmas

Figura 7.1 Diagrama de bloques ilustrativo del sistema de graficación.

Page 125: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

115

7.3 Sistema de monitoreo

Esta parte es la más importante ya que realiza las siguientes tareas:

• Genera las gráficas de las señales, y genera sus archivos por día.

• Genera las alarmas cuando existen, y genera sus archivos por día.

• Copia los archivos de configuración de alarmas por día.

• Realiza el submuestreo de los datos.

La tabla 7.1 muestra que archivos genera el programa en C++, y el de VB. ARCHIVO PROGRAMA EN C++

(ÚLTIMAS 12 HORAS) VB

ARCHIVOS DE GRAFICAS (POR DÍA)

ARCHIVOS DE ALARMAS (POR DÍA)

Voltaje Planta d e Fuerza SI SI SI Corriente Planta de Fuerza SI SI SI

Frecuencia Planta de Fuerza SI SI SI Voltaje Banco de Baterías SI SI SI

Corriente Banco de Baterías SI SI SI Alimentación C.F.E. SI SI SI

Transferencia SI SI Errores SI SI SI Ceros SI SI

Configuración de alarmas (por día)

NO SI

NOTA.- Todos los archivos generado son archivos binarios, ya que de este modo se generan archivos de menor tamaño. Tabla 7.1 Archivos generados por cada uno de los programas.

Apariencia de la ventana del sistema de monitoreo

La figura 7.2 muestra la apariencia de la ventana del sistema de monitoreo generada

por el programa.

Page 126: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

116

Figura 7.2 Apariencia de la ventana del sistema de monitoreo.

En la parte superior izquierda de la figura 7.2 puede verse el menú principal, el cual

está compuesto por las opciones de VER, CONFIGURACIÓN, ACERCA DE, SALIR.

Al elegir la opción VER, se podrá tener acceso a otro par de opciones, las cuales son

las siguientes: Gráficas Anteriores (visor de gráficas anteriores), y el de Alarmas Anteriores

(visor de Alarmas Anteriores).

La opción de CONFIGURACIÓN, proporciona el acceso a la forma donde se

configuran las alarmas.

La opción ACERDA DE..., proporciona información del autor del sistema, y

finalmente la de SALIR, tal como su nombre lo índica sirve para salir del sistema (detener la

ejecución del sistema entero).

Page 127: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

117

Además se cuenta con dos graficadores (controles mschart) a través de los cuales se

gráfica la información de la señal elegida en los menús respectivos de cada graficador, los

cuales se encuentran a la derecha de cada uno de estos.

En la parte superior de cada graficador aparece un título, el cual indica que señal es la

que se está representando actualmente, a su vez entre los dos graficadores aparece una hora, la

cual indica la hora en que se inició a tomar la gráfica (esta es para los dos graficadores). Y en

la parte superior derecha aparece la hora actual del sistema.

También puede observarse que existe una opción de Zoom, para cada graficador, esta

opción tiene como finalidad permitir que el usuario pueda hacer acercamientos a las gráficas,

ya que no hay que olvidar que finalmente cada graficador representará una figura equivalente

a 12 horas de información, de tal forma que si no se contase con esta opción la gráfica sería

poco clara, por esta razón se agregó esta opción al sistema.

A su vez en el Zoom, aparecen un par de opciones, que son: limite superior, y limite

inferior (el rango de valores entre estos dos limites representas los rangos correctos de la

señal), estas opciones permiten activar o desactivar la aparición de la(s) línea(s) horizontales

que las representan (ver figura 7.2).

Además este sistema realiza el submuestreo de 1/10 de la frecuencia de muestreo con

la cual se digitalizaron los datos después de haber sido procesados por el filtro digital. El

submuestreo se realiza antes de graficar los datos. El submuestreo no es configurable para el

usuario.

Diagramas de flujo del sistema de monitoreo

El control de la temporización del sistema se realiza a través de un timer, el cual se

encuentra configurado con una temporización de 1 minuto.

Page 128: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

118

El funcionamiento general de esta parte del sistema, esta descrito por los siguientes

diagramas (figuras 7.3 y 7.4), correspondientes a los diagramas de flujo del sistema de

monitoreo y el timer en VB.

INICIO

CONFIGURAR TIMER A 60000mseg.

Ya paso 1 minuto?

SI

NO

ACTUALIZA FECHA

ACTUALIZA TIEMPO

CARGA SIST. MONITOREO

Figura 7.3 Diagrama de flujo del timer en VB.

Page 129: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

119

INICIO SIST. DE MONITOREO

DECLARAR E INICIALIZAR VARIABLES

LEER ARCHIVO

ABRIR ARCHIVO

Ya paso el 1er. minuto?

SI

NO

GENERA NUEVO ARCHIVO DE RESPALDO

DESPLEGA MENSAJE DE ALARMA

COPIA ARCHIVO DE CONFIGURACIÓN DE ALARMA

GENERA ARCHIVOS DE LAS GRAFICAS (DEL DIA)

GENERA ARCHIVOS DE ALARMAS (DEL DIA)

Cambio la fecha?

SI

NO

GENERA NUEVO ARCHIVO DE ALARMA

ESCRIBIR EN EL ARCHIVO DE ALARMA CORRESPONDIENTE

SIGUIENTE ARCHIVO

A

Cambió la fecha?

SI

NO

ESCRIBE EN EL ARCHIVO

Hay alarma?

SI

NO

COPIA ARCHIVO DE CONFIGURACIÓN DE ALARMA (DEL DIA)

Se leyeron todos los archivos?

SI

NO

regresa

regresa

Page 130: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

120

TOMAR EL RANGO DE VALORES A VER

TOMAR LOS LIMITES SUPERIOR E INFERIOR DEL ZOOM

TOMAR LOS LIMITES SUPERIOR E INFERIOR DEL ZOOM

Se desea hacer Zoom (superior)?

SI

NO

MOSTRAR LA GRÁFICA DE LA SEÑAL SELECCIONADA EN EL MENU SUPERIOR

Se desea hacer Zoom (inferior)?

SI

NO

A

0

20

40

60

80

100

1er min 2do min. 3er min. 4to min.

TOMAR EL RANGO DE VALORES A VER

MOSTRAR LA GRÁFICA DE LA SEÑAL SELECCIONADA EN EL MENU INFERIOR

0

20

40

60

80

100

1er min 2do min. 3er min. 4to min.

Figura 7.4 Diagrama de flujo del sistema de monitoreo.

Page 131: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

121

7.4 Visor de graficas anteriores

Realiza lo siguiente:

• Regenera las gráficas de días anteriores

• Permite imprimir la gráfica, y los datos empleados para su obtención en un solo

reporte.

Apariencia de la ventana del visor de graficas anteriores

Para acceder a este visor basta con elegir del menú principal del sistema de monitores

la opción siguiente VER/Gráficas Anteriores. Entonces aparecerá en pantalla el visor el cual

cuenta con la siguiente apariencia (ver figura 7.5):

Figura 7.5 Apariencia de la ventana del visor de gráficas anteriores.

Page 132: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

122

Observando la figura 7.5 y comparándola con la 7.2, se puede ver que existen pocas

diferencias entre ambas. Las diferencias son las siguientes la figura 7.5 posee un calendario a

través del cual el usuario puede regenerar las señales producidas por los equipos a través de la

selección de la fecha de interés.

Además en la parte superior izquierda este visor cuenta con una opción de impresión,

la cual proporciona la posibilidad de imprimir reportes tanto de la gráfica superior, así como

de la inferior. El reporte generado contendrá la gráfica y el listado de los datos mediante los

cuales se reprodujo dicha gráfica (ver figura 7.6).

Figura 7.6 Apariencia de el reporte del visor de graficas anteriores.

Page 133: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

123

Diagrama de flujo del visor de gráficas anteriores

La figura 7.7 muestra el diagrama de flujo, que describe el funcionamiento del visor de

gráficas anteriores.

INICIO VISOR DE GRÁFICAS

ANTERIORES

DECLARAR E INICIALIZAR VARIABLES

ELEGIR FECHA

Existen los archivos?

NO

SI

ABRIR ARCHIVO

TOMAR LIMITES SUPERIOR E INFERIOR DEL ZOOM

LEER EL ARCHIVO DE ALARMAS DE ESA FECHA

TOMAR EL RANGO DE VALORES A VER

Desea imprimir reporte?

SI

NO

IMPRIMIR REPORTE

TOMAR LIMITE SUPERIOR E INFERIOR DEL ZOOM

TOMAR EL RANGO DE VALORES A VER

LEER ARCHIVO

Se desea hacer Zoom (superior)?

SI

NO

DESPLEGAR MENSAJE “NO EXISTEN LOS ARCHIVOS PARA LA FECHA ELEGIDA”

SIGUIENTE ARCHIVO

Se leyeron todos los archivos?

SI

MOSTRAR LA GRÁFICA DE LA SEÑAL SELECCIONADA EN EL MENU INFERIOR

0102030405060708090

100

1er min 2do min. 3er min. 4to min.

NO

AGREGAR INFORMACIÓN AL REPORTE (superior)

Se desea hacer Zoom (inferior)?

SI

NO

MOSTRAR LA GRÁFICA DE LA SEÑAL SELECCIONADA EN EL MENU INFERIOR

0102030405060708090

100

1er min 2do min. 3er min. 4to min.

AGREGAR INFORMACIÓN AL REPORTE(inferior)

Figura 7.7 Diagrama de flujo del visor de graficas anteriores.

Page 134: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

124

7.5 Visor de alarmas por semana

Realiza lo siguiente:

• Genera reportes semanales de las alarmas ocurridas

• Permite imprimir dicho reporte

Apariencia de la ventana del visor de alarmas por semana

Para acceder a este visor basta con elegir del menú principal del sistema de monitores

la opción siguiente VER/Alarmas Anteriores. Entonces aparecerá en pantalla la ventana del

visor, la cual cuenta con la siguiente apariencia (ver figura 7.8):

Figura 7.8 Apariencia de la ventana del visor de alarmas semanales.

En la parte de superior izquierda de la forma, se encuentra la opción de imprimir el

reporte semanal, el cual tiene una estructura como la que se muestra en la figura 7.9.

Page 135: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

125

Page 136: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

126

Figura 7.9 Apariencia de el reporte del visor de alarmas por semana.

Page 137: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

127

Diagrama de flujo del visor de alarmas por semana

El diagrama que muestra la figura 7.10 describe el funcionamiento del visor de

alarmas por semana.

INICIO VISOR DE ALARMAS

SEMANALES

DECLARAR E INICIALIZAR VARIABLES

ELEGIR UNA FECHA DE LA SEMANA DE INTERES

LEER ARCHIVO DE CONFIG. ALARMAS

IMPRIMIR REPORTE

DESPLEGAR MENSAJE “NO EXISTEN ARCHIVOS”

NO

LEER ARCHIVO DE ALARMA

Desea imprimir reporte?

SI

NO

SELECCIONAR TODAS LAS FECHAS DE DICHA SEMANA

SIGUIENTE FECHA

Se leyeron todos los archivos de la semana?

SI

AGREGAR INFORMACIÓN AL REPORTE

SI

Existen los archivos?

NO

Figura 7.10 Diagrama de flujo del visor de alarmas por semana.

Page 138: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

128

7.6 Configuración de alarmas

• Permite que el usuario configure los niveles, y tiempos de alarmado para cada

señal.

Apariencia de la ventana de configuración de alarmas

Para ingresar a la opción de configuración de alarmas, basta con elegir

CONFIGURACIÓN/Configuración en el menú principal del sistema de monitoreo, y entonces

se visualizara la siguiente ventana (ver figura 7.11).

Figura 7.11 Apariencia de la ventana de configuración de alarmas.

En la figura 7.11, se muestran las opciones de configuración con las que cuenta el usuario.

Page 139: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

129

Condiciones para el disparo de las alarmas

La tabla 7.2 muestra las condiciones bajo las cuales se dispararán las alarmas. ALARMA CONDICIÓN

Voltaje Planta de Fuerza (VPF)

Si el nivel de la señal es menor que el mínimo configurado, o si el nivel de la señal es mayor que el máximo configurado, y el tiempo de duración de tal nivel de señal es mayor o igual al tiempo configurado,

entonces se dispara la alarma de la señal correspondiente.

NOTA.- Una vez disparada una alarma esta no dejara este estado mientras la el nivel de la señal no sea mayor, o menor que el nivel

configurado ± 1% de histéresis† , según sea el caso (para la medición de la FPF no se aplica histéresis en este sistema).

Corriente Planta de Fuerza (APF)

Voltaje Banco de Baterías (VBB)

Corriente Banco de Baterías (ABB)

Frecuencia Planta de Fuerza (FPF) Tasa de Error (#Errores por minuto =ERR) Si el número de errores generados durante un minuto es mayor que la

cantidad máxima configurada, y este nivel de errores se mantiene un tiempo mayor o igual al tiempo configurado, entonces se dispara una

alarma de este tipo. Transferencia (TRA) Si la señal de C.F.E. es igual al de Transferencia, y este estado se

mantiene un tiempo mayor o igual al tiempo configurado entonces se dispara una alarma de este tipo.

Tabla 7.2 Condiciones para la generación o disparo de las alarmas.

Cada vez que se presente una condición de alarma el sistema desplegará un mensaje

indicándola, tal como se muestra en la figura 7.12, tal mensaje desaparecerá sólo cuando el

usuario presione el botón cerrar.

Figura 7.12 Mensaje de alarmado.

†El termino de histéresis, se define como la diferencia entre 2 puntos de conmutación sobre el parámetro de

cambio.

Page 140: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

130

7.7 Pruebas de laboratorio del filtro pasa-bajas digital antialias

El filtro pasa-bajas digital empleado para eliminar el alias en el submuestreo tiene una

banda de paso de 0 a 0.025Hz, y la banda de rechazo es de 0.03 a 0.05Hz, con una frecuencia

de muestreo de 0.1Hz.

Para probar el filtro se requería de un generador de señales capaz de generar ondas

senoidales en este rango de frecuencias. Como no se dispuso de un generador con estas

características, se escalaron las frecuencias por un factor de 10 (hacia arriba), incluyendo la

frecuencia de muestreo, para poder realizar las pruebas. Al escalar todas las frecuencias por el

mismo factor lo coeficientes del filtro no cambian.

El escalamiento en la frecuencia de muestreo consistió simplemente en eliminar el

submuestreo. El comportamiento del filtro con mf igual a 1Hz será idéntico al

comportamiento con la frecuencia de submuestreo de 0.1Hz.

Una vez realizado el escalamiento las especificaciones del filtro son las mostradas en la tabla

7.3. PARÁMETROS DE DISEÑO ORDEN DEL FILTRO Y COEFICIENTES OBTENIDOS

0.250.3

340

1

fp Hzfs Hzrp dBrs dBfm Hz

=== −= −=

15N =

0.5040Wn =

[0.0002, 0.0026, 0.0182, 0.0787, 0.2361, 0.5194, 0.8656, 1.1129, 1.1129, 0.8656, 0.5194, 0.2361, 0.0787, 0.0182, 0.0026, 0.0002]

B =

[1.0000,0.1187, 2.0383, 0.2023, 1.5235, 0.1235, 0.5235, 0.0337, 0.0882, 0.0042, 0.0068, 0.0002, 0.0002, 0.0000, 0.0000, 0.0000]

A =

Tabla 7.3 Filtro digital empleado durante las pruebas.

Para observar únicamente el efecto del filtro digital se deshabilitó el filtro analógico

antialias. Para ese efecto basta con desconectar el capacitor del filtro como se muestra en la

figura 7.13.

Page 141: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

131

Figura 7.13 Circuito de entrada empleado durante las pruebas de laboratorio.

Para las pruebas se aplicó como entrada una onda senoidal (Va) con las siguientes

frecuencias: 0.021Hz, 0.25Hz y 0.45Hz, y una componente de cd (Vcd), para obtener siempre

voltajes positivos. Los parámetros empleados para las pruebas son los mostrados en la tabla

7.4.

Los valores obtenidos por medición están dados en términos de dos voltajes, V1 y V2.

En donde V1 es el voltaje de pico positivo y V2 es el voltaje de pico negativo. Entonces el

voltaje de pico a pico es V2-V1. SEÑALES Va (C.A.) Señal analógica de entrada medida (RA0)

Prueba #1 4400.02147.6

V mVppf HzT seg

===

(680 240) 44047.60.021

Vpp mV mVT segf Hz

= − ===

Prueba #2 4040.254

V mVppf HzT seg

===

(668 264) 40440.25

Vpp mV mVT segf Hz

= − ===

Prueba#3 4200.452.2

V mVppf HzT seg

===

(700 280) 4202.20.45

Vpp mV mVT segf Hz

= − ===

Tabla 7.4 Parámetros empleados para las pruebas.

La frecuencia de 0.021Hz es aproximadamente /10pf y esta dentro de la banda de

paso. La frecuencia de 0.25Hz es igual a pf , y la de 0.45Hz esta dentro de la banda de

rechazo. Entonces en referencia a la amplitud la frecuencia de 0.021Hz deberá pasar por el

filtro con una atenuación menor que -3dB, la de 0.25Hz deberá atenuarse -3dB, y la de 0.45Hz

deberá ser atenuada al menos -40dB.

Page 142: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

132

Hay que considerar que la tabla 7.4, muestra los parámetros medidos de la señal

analógica de entrada, y tales resultados pueden contener errores de precisión ocurridos durante

su lectura en el osciloscopio.

Graficas obtenidas durante cada una de las pruebas

Las figuras 7.14, 7.16 y 7.18 muestran las entradas digitalizadas para cada una de las

pruebas respectivas, estas figuras proporcionan el valor de las cuentas o escalones resultantes

de las conversiones A/D, en donde las cuentas 0 equivalen a 0V, y las cuentas 255 equivalen a

123V.

La forma que poseen cada una de las entradas digitalizadas están definidas por la

frecuencia de muestreo, y por las frecuencias propias de las señales de entrada (estas dos

frecuencias definen el número de muestras tomadas por periodo para representar la señal

original). Otro aspecto que influye es que el componente de graficación empleado realiza una

interpolación lineal (ya que cada punto representativo de la señal es unido con el siguiente a

través de una línea recta).

Las figuras 7.15, 7.17, y 7.19 muestran las señales de salida resultantes del proceso de

digitalización y filtrado digital de cada una de las pruebas, dichas figuras proporcionan los

valores de las señales de salida en Volts.

Si se observan las figuras de las señales de salida resultantes de la digitalización y

filtrado, puede observarse que poseen en su parte inicial oscilaciones que ocurren de manera

muy rápida a estas oscilaciones se les conoce como la respuesta transitoria del filtro. Este

transitorio es característico de los filtros IIR, y es ocasionado por su retroalimentación.

Las características de amplitud de un filtro son aplicables al estado estacionario, es

decir cuando ha desaparecido la respuesta transitoria. La medición de las amplitudes de las

señales de prueba se realizaron en la porción de las graficas en donde las señales han

alcanzado el estado estacionario.

Page 143: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

133

Graficas obtenidas durante las pruebas

Para la prueba uno se empleó un Va con una frecuencia igual a 0.021Hz. Como

0.021Hz se encuentra dentro de la banda de paso del filtro digital, se espera que la amplitud

de la señal de salida sea atenuada cuando mucho –3dB después de ser filtrada.

Prueba #1

Figura 7.14 Señal de entrada digitalizada para la prueba #1 (zoom de los primeros 2 minutos). Los valores del eje

“y” representan los escalones resultantes de la conversión A/D por lo tanto pueden variar de 0 a 255.El eje “x”,

representa el tiempo en segundos (cada división del eje x en la gráfica representa 1 segundo).

Figura 7.15 Señal de salida digitalizada y filtrada para la prueba #1 (zoom de los primeros 2 minutos). Los

valores del eje “y” representa los valores de voltaje de la señal proporcional en función del valor máximo

configurado (100V+ 23% de tolerancia=123Vmáx), y el eje “x”, representa el tiempo en segundos (cada división

del eje x en la gráfica representa 1 segundo).

Page 144: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

134

A continuación en la tabla 7.5 se proporcionan los valores de la señal digitalizada de

entrada y los correspondientes valores de la señal de salida digitalizada y filtrada. Señal de entrada digitalizada Señal de salida digitalizada y filtrada Atenuación debe ser < -3dB

1 67V ≈ (# de escalón de la conversión A/D)

2 27V ≈ (# de escalón de la conversión A/D)

123(67 27)255

19.3

Vpp

Vpp V

= −

=

V1=32.1 V

V2=12.9 V

Vpp=V1-V2=19.2 V

Atenuación=20log(19.2/19.3)

Atenuación=-0.04dB

0.045dB<3dB, por lo tanto el resultado

se encuentra dentro de lo esperado.

Tabla 7.5 Tabla comparativa entre la señal de entrada digitalizada, y la señal de salida digitalizada y filtrada.

Para la prueba dos se empleo un Va con una frecuencia igual a 0.25Hz. Como 0.25Hz

es igual a la frecuencia de corte de la banda de paso del filtro, se espera que la amplitud de la

señal de salida sea atenuada –3dB después de ser filtrada.

Prueba #2

Figura 7.16 Señal de entrada digitalizada para la prueba #2 (zoom a los primeros 2 minutos). Los valores del eje

“y” representa los escalones resultantes de la conversión A/D por lo tanto pueden variar de 0 a 255. El eje “x”,

representa el tiempo en segundos (cada división del eje x en la gráfica representa 1 segundo).

Page 145: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

135

Figura 7.17 Señal de salida digitalizada y filtrada para la prueba #2 (zoom de los primeros 2 minutos). Los

valores del eje “y” representa los valores de voltaje de la señal proporcional en función del valor máximo

configurado (100V+ 23% de tolerancia=123Vmáx), y el eje “x”, representa el tiempo en segundos (cada división

del eje x en la gráfica representa 1 segundo).

A continuación en la tabla 7.6 se proporcionan los valores de la señal digitalizada de

entrada y los correspondientes valores de la señal de salida digitalizada y filtrada. Señal de entrada digitalizada Señal de salida digitalizada y filtrada Atenuación debe ser = -3dB

1 68V ≈ (# de escalón de la conversión

A/D)

2 27V ≈ (# de escalón de la conversión A/D)

123(68 27)255

19.7

Vpp

Vpp V

= −

=

V1=28.2 V

V2=16.7 V

Vpp=11.5V

Atenuación=20log(14/19.7)

Atenuación=-4.6dB

-4.6dB ≈ -3dB, por lo tanto el

resultado se encuentra dentro de lo

esperado.

Tabla 7.6 Tabla comparativa entre la señal de entrada digitalizada, y la señal de salida digitalizada y filtrada.

La atenuación obtenida fue de –4.6dB, la cual difiere de la esperada de –3dB, lo que

significa que la señal tuvo una atenuación mayor. La medición no es muy exacta porque la

frecuencia de muestreo es muy baja. Hay sólo 4 muestras por periodo y con este número de

muestras, y con una interpolación lineal no es posible reproducir fielmente la señal.

Entonces los valores obtenidos como resultado de la digitalización de la señal

analógica, no representan con exactitud todos los valores de dicha señal. Aun así se consideró

que los valores máximos y mínimos adquiridos se corresponden con los valores máximos y

mínimos de la señal original, ya que se está respetando el teorema de Nyquist(ver figura 7.16).

Page 146: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

136

Para la prueba tres se empleó un Va con una frecuencia igual a 0.45Hz. Como 0.45Hz

se encuentra dentro de la banda de rechazo del filtro digital, se espera que la amplitud de la

señal de salida sea atenuada al menos –40dB después de ser filtrada.

Prueba #3

Figura 7.18 Señal de entrada digitalizada para la prueba #3 (zoom a los primeros 2 minutos). Los valores del eje

“y” representa los escalones resultantes de la conversión A/D por lo tanto pueden variar de 0 a 255. El eje “x”,

representa el tiempo en segundos (cada división del eje x en la gráfica representa 1 segundo).

Figura 7.19 Señal de salida digitalizada y filtrada para la prueba #3 (zoom de los primeros 2 minutos). Los

valores del eje “y” representa los valores de voltaje de la señal proporcional en función del valor máximo

configurado (100V+ 23% de tolerancia=123Vmáx), y el eje “x”, representa el tiempo en segundos (cada división

del eje x en la gráfica representa 1 segundo).

Page 147: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

137

A continuación en la tabla 7.7 se proporcionan los valores de la señal digitalizada de

entrada y los correspondientes valores de la señal de salida digitalizada y filtrada. Señal de entrada digitalizada Señal de salida digitalizada y filtrada Atenuación debe ser >-40dB

1 68V ≈ (# de escalón de la conversión A/D)

2 27V ≈ (# de escalón de la conversión A/D)

123(68 27)255

19.7

Vpp

Vpp V

= −

=

Vsal ≈ 23 V

La variación no es apreciable.

Las variaciones están anuladas.

Por lo tanto el resultado se encuentra

dentro de lo esperado.

Tabla 7.7 Tabla comparativa entre la señal de entrada digitalizada, y la señal de salida digitalizada y filtrada.

En este caso nuevamente se tiene el problema de una frecuencia de muestreo muy baja,

por lo que la medición de amplitudes no puede ser muy exacta, sin embargo se ve claramente

que la amplitud de la señal de salida es despreciable lo cual muestra que esta se atenuó

fuertemente aunque no es posible determinar con precisión cuanto se atenuó.

Page 148: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

138

Capítulo 8. Conclusiones

En esta tesis se desarrolló un sistema prototipo el cual es capaz de monitorear las

señales producidas por una planta de fuerza y/o bancos de baterías.

La información adquirida por el sistema es enviada vía radio módems hacia una oficina

o central remota, y es presentada al usuario a través de gráficas de tendencia representativa de

cada una de las señales. Además cuenta con un visor de gráficas anteriores, un visor de

alarmas, y un módulo de configuración de alarmas.

El módulo principal del sistema de monitoreo genera las graficas actuales de las

señales (de las últimas 12 horas de trabajo), dispara las alarmas cuando existen, y genera los

archivos correspondientes por día. El visor de gráficas anteriores es capaz de regenerar la

gráfica de una señal de un determinado día, y además permite imprimir su reporte respectivo.

El visor de alarmas por semana permite generar e imprimir un reporte de las alarmas ocurridas

de la semana correspondiente al día elegido. Y finalmente el módulo de configuración de

alarmas en el cual el usuario puede configurar los niveles y tiempos de alarmado para cada

señal.

De tal forma que el sistema desarrollado en esta tesis es superior al sistema S.M.A.R.T.

reporter ya comentado en la introducción de esta tesis, ya que este sólo indica si un equipo

determinado se encuentra encendido o apagado.

El proyecto desarrollado permite que las personas encargadas de las plantas de fuerza

y/o bancos de baterías, realicen un mejor monitoreo ya que cuentan con una mayor cantidad

de información, y esta a su vez describe con mayor detalle el comportamiento de los equipos,

a través de lo cual el personal de mantenimiento puede decidir en que momentos es necesario

tomar acciones correctivas.

Page 149: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

139

8.1 Propuestas para desarrollos futuros

En forma general cualquier sistema puede ser modificado para mejorar su desempeño.

Algunas propuestas de mejora para este proyecto son las siguientes:

• Realizar el control del puerto COM, y la graficación empleando un solo lenguaje de

programación en ambiente Windows. Ya que actualmente este sistema emplea C++ de

ambiente DOS para el control del puerto COM, y VB para la graficación en ambiente

Windows. Lo que ocasiona que tenga que existir un compromiso de un lenguaje con el

otro.

• Aplicar más procesamiento a los datos, o sea realizar cálculos estadísticos, para contar

con otros parámetros, que permitan realizar una mejor evaluación del comportamiento

de las señales en el tiempo.

• Implantar opciones de control al sistema, o sea que el sistema remotamente fuese capaz

de realizar tareas de control como por ejemplo si la planta no genera el voltaje a la

frecuencia adecuada 60Hz, entonces que mejor se apague la planta para que los

equipos alimentados por esta no se dañen.

• Colocar la información disponible en Internet, de tal forma que el monitoreo se pudiese

realizar por esta vía. De ésta opción se desprenden otras, como las siguientes:

1. Simplemente tomar los archivos que genero el sistema actualmente y ponerlos

en un servidor de Internet. Esto se podría implementar realizando la operación

de envío con FTP.

2. Y la otra opción es directamente enviar la información adquirida por el

microcontrolador hacia un servidor de Internet, de tal forma que la información

almacenada en este fuese virgen, o sea que no se le alla aplicado ningún

procesamiento. Esto se podría lograr implementando el protocolo TCP/IP en un

Page 150: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

140

microcontrolador, o teniendo una PC que estuviese enviando los datos al

servidor sin procesarlos.

8.2 Aportes personales

La elaboración de esta tesis permitió aplicar de manera integral los conocimientos

adquiridos durante los estudios de la maestría en ciencias área telemática; incrementando a la

vez experiencia y conocimiento en:

• El diseño e implementación de sistemas con µCu de prestaciones mayores, ya que sólo

se contaba con experiencia empleando el PIC 16F84 el cuál posee características

reducidas en comparación con el PIC 16F874.

• La manipulación del puerto serie de las PC´s, ya que no se contaba con experiencia

previa.

• El diseño e implementación de filtros digitales, ya que nunca se había realizado una

implementación práctica con ellos, solamente en simulaciones con Matlab.

• En programación en C++ y VB, quedando de manifiesto que C++ es un lenguaje que

es fuerte, si lo que se desea es controlar el hardware de la PC, a diferencia de VB el

cual es muy pobre en este aspecto. Pero si lo que se desea es implementar sistemas que

manejen gráficos sin lugar a dudas VB (ambiente Windows) es muy superior a C++

(ambiente DOS).

• La implementación de sistemas para el manejo de errores de transmisión, debido a que

no se contaba con experiencia previa en la implementación práctica de métodos de

detección de errores de transmisión (CRC).

Page 151: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-i

ANEXO I. PLANTA DE FUERZA.

En este capitulo se describirán los equipos que conforman una planta de fuerza, asi

como también su funcionamiento:

La electricidad es una de las principales formas de energía utilizadas en el mundo

actual, es básica para el funcionamiento de la mayoría de los aparatos utilizados por el

hombre.

Hoy en día se cuenta con diversas formas de generar energía eléctrica entre las cuales

podemos mencionar las siguientes:

*Baterías.

Son dispositivos que transforman la energía química en energía eléctrica.

*Generadores.

Son dispositivos que producen electricidad por la rotación de un grupo de conductores

en un campo magnético. Dependiendo del medio utilizado para mover el generador podemos

tener los siguientes tipos:

-Motogeneradores (Movidos por motores).

-Generadores Eólicos (Movidos por el viento).

-Generadores Termoeléctricos (Movidos por una turbina de vapor).

-Generadores Hidroeléctricos (Movidos por caídas de agua).

-Generadores Nucleares (Movidos por energía nuclear).

-Celdas Solares. Son dispositivos que transforman la energía del sol en electricidad.

La principal fuente que proporciona energía eléctrica a los equipos y sistemas que

componen la planta telefónica es la red comercial, misma que se suministra a los equipos a

través de una subestación que alimenta a todos los que funcionan con corriente alterna y a los

rectificadores, por medio de los cuales se obtiene la corriente directa necesaria.

Page 152: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-ii

La continuidad del servicio depende del suministro ininterrumpido de la energía

eléctrica, es por esto que para los casos en que la energía eléctrica comercial falle, se cuenta

con equipos de emergencia como son los grupos electrógenos (motores a diesel) y/o bancos de

baterías.

a) GRUPOS ELECTRÓGENOS.

Un grupo electrógeno es un equipo cuya función consiste en la generación de energía

eléctrica a niveles de voltaje, corriente y frecuencia adecuados para la alimentación de los

diferentes equipos que constituyen una planta o central telefónica. Dicho equipo aprovecha la

energía mecánica proporcionada por una maquina de combustión interna para transformarla,

por medio de un generador, en energía eléctrica.

Estos equipos se utiliza como sistemas de alimentación auxiliar en aquellas centrales o

repetidores de microondas en los que se cuenta con el servicio de alimentación de energía

eléctrica comercial, y se utiliza como sistema de alimentación principal en aquellas en las que

no se cuenta con energía eléctrica comercial.

Un grupo electrógeno esta constituido por:

1.-Motor de Combustión Interna.

Es el encargado de proporcionar la energía mecánica al generador, por medio de la

transformación de la energía química de un combustible.

2.-Generador.

Este convierte la energía mecánica entregada por el motor en energía eléctrica.

Un generador es el encargado de producir electricidad por la rotación de un grupo de

conductores dentro de un campo magnético. Por lo tanto el generador recibe la energía

mecánica producida por el motor, y esta energía provoca que los conductores dentro del

generador giren dentro de un campo magnético, lo que a su vez provoca que se induzca una

Page 153: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-iii

fem ( fuerza electromotriz ) a través de ellos obteniendo finalmente energía eléctrica a la

salida.

Los generadores se clasifican como:

*Generadores de C-C.

*Generadores de C-A.

*Generadores de C-C.

Figura 1.Generador de corriente continua.

*Generador de Corriente Continua (C-C):

Un generador de corriente continua tiene cuatro elementos principales:

-Un campo magnético ( un imán permanente ).

-Un conductor único o en espira.

-Un conmutador.

-4 Escobillas.

El generador de corriente continua básico ver figura 1 produce una señal senoidal que

se convierte en corriente continua por medio de un conmutador. Primeramente si omitimos al

conmutador tendríamos lo que nos muestra la figura2, la cual nos muestra que por cada

rotación completa de la espira se genera un ciclo de salida senoidal.

Page 154: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-iv

Cuando el plano de la espira es perpendicular el campo magnético, los lados de la espira pasan

entre las líneas de flujo. Por lo tanto, no hay corte en las líneas de flujo y por lo tanto el voltaje

inducido es nulo. En cambio cuando cuándo la espira se encuentra en forma horizontal, o sea

cuando la espira si corta las líneas de flujo se induce el voltaje máximo a través de la espira,

lo que provoca que a la salida del generador se obtenga la señal que se observa en la figura 2 y

esto sucede dos veces durante cada rotación completa.

Figura 2. Producción de una onda senoidal

Como podemos ver en la figura 3, se muestra como funciona el conmutador y las

escobillas para producir la salida en corriente continua fluctuante.

Como se observa en al figura 3, si no se usara un filtro, a la salida del generador básico de una

espira se obtendría una señal que variaría muchísimo ya que partiría de un voltaje de 0 a un

voltaje máximo y de ahí regresaría a cero, y continuaría bajando hasta un valor máximo

negativo, a este comportamiento se le llama ondulación y este comportamiento produce que

esta salida sea inadecuada para muchas aplicaciones, por esta razón es que se construyen

generadores con más de una espira.

Page 155: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-v

Figura 3. Funcionamiento del conmutador.

Por ejemplo en un generador de dos espiras, una espira siempre está atrasada 90º de

rotación con respecto a la otra, por lo que cuando el voltaje de una de las espiras disminuye la

de la otra se incrementa y viceversa ver figura 4.

Figura 4. Generador de corriente continua de 2 espiras.

Si observamos la figura 4, notamos que el incrementar el número de espiras las

variaciones de voltaje disminuyen, y se incrementa el voltaje promedio, de tal forma que si

tuviésemos un generador de 4 espiras nuestro voltaje de salida seria como el mostrado en la

figura 5.

Page 156: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-vi

Figura 5. Generador de 4 espiras

Es importante señalar que la espiras y el conmutador juntos reciben el nombre de

armadura y a en ocasione de rotor; por lo tanto en este caso la armadura es la parte que gira.

Si deseamos incrementar voltaje de salida máximo generado, existen tres incrementar

el campo magnético, la segunda sería incrementar la velocidad de rotación o ambas, pero este

par de opciones hasta cierto limites llegan a ser impracticas y la tercera opción la cual sería la

mejor consiste en agregar muchas vueltas de alambre en lugar de una sola a cada espira

rotatoria, ya que el hacer esto provoca un comportamiento como el mostrado en la figura 6.

Figura 6. Aumento del número de vueltas de las espiras.

*Generadores de Corriente Alterna (C-A).

Aunque los Generadores de C-C se usan mucho en ciertas aplicaciones , tienen

limitaciones inherentes que los hace insatisfactorios para muchos otras usos. Algunas de estas

limitaciones se deben a las características de construcción, eléctricas y físicas, de los mismos

Page 157: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-vii

generadores de C-C, en tanto que las demás se deben a la naturaleza básica y a las propiedades

de la electricidad C-C. La mayor parte de las limitaciones debidas a los mismos generadores

provienen de dificultades de conmutadores que pueden producir grandes salidas con eficacia y

eficiencia. Los generadores de C-A, según se explicará posteriormente, no tienen

conmutadores y, en este aspecto son superiores a los generadores de C-C.

Sí se eliminara el conmutador, uniendo cada escobilla conectada permanentemente con

un extremo de la espira rotatoria, el voltaje que hay entre las escobillas seria exactamente el

voltaje existente entre los extremos de la bobina. Como se sabe, ésta es un voltaje de C-A. Así

pues, eliminando el conmutador y conectando permanentemente, en alguna forma, las

escobillas a extremos opuestos de la espira, el generador básico de C-C se puede convertir en

un generador simple de C-A.

En un generador de C-A no se requiere convertir de C-A a C-C, de manera que, en

lugar de conmutador, todo lo que se necesita es un medio para comunicar el voltaje inducido a

las escobillas. Esto se logra instalando anillos metálicos en los extremos de la bobina

rotatoria. Cada anillo se ajusta a un extremo de la bobina y ambos anillos giran al girar la

bobina. Estos anillos se llaman anillos rozantes. Figura 7.

Figura 7. Anillos rozantes.

En la forma de la figura 2, se puede apreciar que el voltaje de salida de un generador

simple de C-A es máximo cuando las lados de la espira pasan frente a los centros de los polos.

Page 158: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-viii

La razón es que, en estos puntos, los lados de la bobina cortan el número máximo de líneas

de flujo. Si se usaran cuatro polos en lugar de dos, el voltaje de salida seguiría alcanzando su

valor máximo cuando los lados de la bobina pasaran frente a los centros de los polos. Sin

embargo, como el número de polos se han duplicado, el voltaje sería máximo cuatro veces

durante cada rotación completa de la espira en lugar de dos veces como ocurre en el caso de

un generador de dos polos. Esto quiere decir que ahora se generan dos ciclos en una sola

revolución del generador. Ver figura 8.

Figura 8. Generador de C-A de cuatro polos

El campo magnético necesario para que funcione un generador de C-A es producido

por un devanado de campo, igual que en el caso de los generadores de C-C. Téngase presente

que el devanado de campo es un electroimán y, por lo tanto, necesita corriente para producir

su campo magnético. En un generador de C-C, la corriente para el devanado de campo puede

obtenerse conectando el devanado a una fuente externa de voltaje y en este caso, el generador

es un generador excitado separadamente. 0 bien, la corriente de excitación del devanado de

campo puede producirse conectando el devanado a la salida del generador. Como se recordara,

esto constituye un generador autoexcitado.

Sin embargo, en ambos casos, e independientemente de que el generador de C-C esté

excitado separadamente o autoexcitado, el voltaje aplicado el devanado de campo es de C-C.

Esto es necesario ya que se requiere una corriente de excitaci6n de C-C para que el generador

Page 159: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-ix

funcione debidamente. Como resultado, no se puede usar autoexcitación para los generadores

de C-A, ya que su salida es de C-A. Entonces deben usarse fuentes de voltaje de C-C

separadas para alimentar la corriente a los devanados de campo. En muchos generadores de

C-A la fuente de voltaje de C-C para el devanado de campo es un pequeño generador de C-C

que está dentro de la misma cubierta del generador de C-A.

Cuando un generador de C-A produce una cantidad de potencia relativamente pequeña,

los anillos rozantes operan satisfactoriamente, Por otra parte, cuando se manejan potencias

elevadas, resulta cada vez más difícil el aislar suficientemente sus anillos rozantes y por lo

tanto, éstos se convierten en un motivo frecuente de problemas. Debido a esto, la mayor parte

de los generadores de C-A tienen una armadura estacionaria y un campo rotatorio. En estos

generadores, las bobinas de armadura están montadas permanentemente con arreglo a la

circunferencia interna de la cubierta del generador, en tanto que las bobinas de campo y sus

piezas polares están montadas sobre un eje y giran dentro de la armadura estacionaria.

En el campo de una armadura estacionaria, la salida del generador puede conectarse

directamente a un circuito externo sin necesidad de anillos rozantes ni escobillas, lo cual

elimina problemas de aislamiento que existirían si fuese necesario producir corrientes y

voltajes elevados a la carga, por medio de anillos rozantes. Naturalmente, como el devanado

de campo gira, deben usarse anillos rozantes para conectar el devanado a su fuente externa de

excitaci6n de C-C. Sin embargo, los voltajes y corrientes que se manejan son pequeños,

comparados con los de armadura y no hay dificultad en suministrar el aislamiento suficiente.

Otra ventaja de usar una armadura estacionaria es que hace posible velocidades de

rotación mucho más altas y por lo tanto, voltajes más altos de los que se pueden obtener con

armaduras rotatorias; esto se debe nuevamente a la dificultad que hay en aislarla.

A velocidades de rotación muy elevadas, la elevada fuerza centrífuga que resulta hace

difícil aislar adecuadamente el devanado de armadura. Este problema no existe cuando el

devanado de campo gira a altas velocidades.

Page 160: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-x

En resumen, en tanto que prácticamente todos los generadores de C-C constan de una

armadura rotatoria y un campo estacionario la mayor parte de los generadores de C-A tienen

una armadura estacionario y un campo rotatorio. En el caso de una armadura estacionaria, se

pueden producir voltajes mucho mayores que los que son posibles con generadores de

armadura rotatoria. La parte de un generador que gira se llama rotor en tanto que la parte

estacionaria recibe el nombre de estator.

Generadores Monofásicos.

Cuando se trató de generadores de C-A, la armadura ha sido representada por una sola

espira. El voltaje inducido en esta espira sería muy pequeño; así pues, lo mismo que ocurre en

los generadores de C-C, la armadura consta en realidad de numerosas bobinas, cada una con

más de una espira. Las bobinas están devanadas de manera que cada uno de los voltajes en las

espiras de cualquier bobina se suman para producir el voltaje total de la bobina.

Las bobinas se pueden conectar de varias maneras, según el método específico que se

use para darle las características deseadas al generador.

Si todas las bobinas de armadura se conectan en serie aditiva, el generador tiene una

salida única. La salida es sinusoidal y en cualquier instante es igual en amplitud a la suma de

voltajes inducidos en cada una de las bobinas. Un generador con armadura devanada en esta

forma es un generador de una fase a monofásico. Todas las bobinas conectadas en serie

constituyen el devanado de armadura. En la práctica, muy pocos generadores de C-A son

monofásicos, ya que puede obtenerse una mayor eficiencia conectando las bobinas de

armadura mediante otro sistema.

Page 161: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xi

Figura 9. Generador de C-A Monofásico

Generador Bifásico

En un Generador Bifásico, las bobinas de armadura están devanadas de manera que el

generador tenga dos voltajes de salida separados que difieren en fase, por 90 grados. Un

generador simple bifásico de espira rotatoria consta de dos espiras perpendiculares entre sí;

cada espira está conectada a su propio juego de anillos rozantes. Cuando el voltaje inducido en

una espira es máximo, el voltaje en la otra es cero y viceversa. Por lo tanto, los voltajes

obtenidos en los anillos rozantes difieren 90 grados en fase.

Las bobinas de armadura de un generador bifásico real con una armadura estacionaria

se dividen en dos devanados monofásicos, espaciando cada bobina de los dos devanados de

manera que lo voltajes inducidos.

Page 162: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xii

Figura 10. Generador de C-A Bifásico

Generador Trifásico

Básicamente, los principios del generador trifásico son los mismos que los de un

generador bifásico, excepto que se tienen tres devanados espaciados igualmente y tres voltajes

de salida desfasados 120 grados entre sí. En la figura 27, se ilustra un generador simple

trifásico de espira rotatoria, incluyendo las formas de onda. Físicamente, las espiras

adyacentes están separadas por un ángulo equivalente a 60 grados de rotación. Sin embargo,

los extremos de la espira están conectados a los anillos rozantes de manera que la tensión 1

está adelantada 120 grados con respecto a la tensión 2; y la tensión 2, a su vez, está adelantada

120 grados con respecto a la tensión 3.

Page 163: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xiii

Figura 11. Generador Trifásico

También se muestra un diagrama simplificado de un generador trifásico de armadura

estacionaria. En este diagrama, las bobinas de cada devanado se combinan y están

representadas por una sola. Además, no aparece el campo rotatorio. La ilustración muestra que

el generador trifásico tiene tres devanados de armadura separados, desfasados 120 grados.

Conexión de Generadores Trifásicos.

Como se vio en lo anterior, hay seis puntos que salen de los devanados de armadura de

un generador trifásico y el voltaje de salida está conectado a la carga externa por medio de

estas seis puntas. En la práctica, esto no sucede así. En lugar de ello, se conectan los

devanados entre sí y sólo salen tres puntas que se conectan a la carga.

Existen dos maneras en que pueden conectarse los devanados de armadura. El que

emplee uno u otro es cosa que determina las características de salida del generador.

Maneras en que pueden conectarse los devanados de arma dura:

-Conexión Delta ( )∆ .

-Conexión en Estrella ( )Y .

Page 164: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xiv

-Conexión Delta ( )∆ .

En una de las conexiones, los tres devanados están conectados en serie y forman un

circuito cerrado. La carga está conectada a los tres puntos donde se unen los devanados. A esto

se le llama conexión delta, ya que su representaci6n esquemática es parecida a la letra

griega delta.

Figura 12. Conexión Delta

-Conexión en Estrella ( )Y .

En la otra conexión, una de las puntas de cada uno de los devanados se junta con una

de los otros dos, lo que deja tres puntas libres que salen para la conexión a la carga. A éste se

le llama conexión Y, ya que esquemáticamente representa la letra Y.

Nótese que, en ambos casos, los devanados están espaciados 120 grados, de manera

que, cada devanado producirá un voltaje desfasado 120 grados con respecto a los voltajes de

los demás devanados. También se llama conexión estrella.

Figura 13. Conexión Estrella (Y)

Page 165: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xv

Características de las Conexiones Delta y Estrella..

Como todos los devanados de una conexión están conectados en serie y forman un

circuito cerrado, podría parecer que hay una elevada corriente continuamente a los devanados,

aún en ausencia de carga conectada. En realidad, debido a la diferencia de fase que hay entre

los tres voltajes generados, pasa una corriente despreciable o nula en los devanados en

condiciones de vacío (sin carga).

Las tres puntas que salen de la conexión delta se usan para conectar la salida del

generador a la carga. El voltaje existente entre dos cualesquiera de las puntas, llamada voltaje

de la línea, es igual al voltaje generado en un devanado, que recibe el nombre de voltaje de

fase. Así pues, como se puede apreciar en la figura 14 , tanto los tres voltajes de fase como los

tres voltajes de línea son iguales y todos tienen el mismo valor. Sin embargo, la corriente en

cualquier línea es 3,o sea, aproximadamente 1.73 veces la corriente en cualquier fase del

devanado. Por lo tanto, nótese que una conexión delta suministra un aumento de corriente ,

pero no hay aumento en el voltaje.

La potencia total real que produce un generador trifásico, conectado en delta es igual a

3 ó 1.73 veces la potencia real en cualquiera de las líneas. Sin embargo, la potencia real

depende del factor de potencia ( ( )Cos θ ) del circuito. Por lo tanto, la potencia real total es

igual a 1.73 veces el voltaje de la línea multiplicado por la corriente de línea, multiplicada a su

vez, por el factor de potencia. O sea:

P real = 1.73* (E línea )*(I línea) ( )Cos θ

Figura 14. Voltajes y Corrientes en una conexión Delta.

Page 166: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xvi

Las características de voltaje y corriente de una conexión en estrella (Y) son opuestas a

las que presenta una conexión delta. El voltaje que hay entre dos líneas cualesquiera de una

conexión Y es 1.73 veces el voltaje de una fase, en tanto que las corrientes en la línea son

iguales a las corrientes en el devanado de cualquier fase. Esto presenta un contraste con la

conexión delta en la cual, según se recordará, el voltaje en la línea es igual al voltaje de fase y

la corriente en la línea es igual a 1.73 veces la corriente en la fase. Así pues, en tanto que una

conexión delta hace posible aumentar el voltaje, la conexión Y aumenta el voltaje pero no la

corriente.

La potencia total real que produce un generador conectado en Y es igual a la de un

generador conectado en delta. Por lo tanto, la potencia real es igual a:

P real = 1.73*(E línea)*(I línea) ( )Cos θ

Figura 15. Voltajes y Corrientes en una conexión en estrella

3.- Tablero de control

. El Tablero de Control de un grupo electrógeno tiene como función el arranque, paro y

protección del mismo.

-Arranque.

Cuando por algún motivo, la red comercial (C.F.E.o compañía de Luz) presenta

desviaciones ya sea en voltaje o frecuencia, el tablero se encarga de enviar al grupo

electrógeno una señal de arranque.

Page 167: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xvii

-Paro.

Cuando la red comercial haya regresado y estabilizado su nivel de voltaje (215 - 225

V.) y su frecuencia (59 -61 Hz) el tablero transferirá la carga a ésta y preparará la parada, del

grupo electrógeno.

-Protecciones

Dentro de sus funciones, el tablero de control se encarga de proteger al grupo

electrógeno de lo siguiente:

-Bajo Nivel o presión de aceite

-Alta Temperatura

-Largo tiempo de arranque

-Sobre corriente

-Frecuencia incorrecta

-Voltaje incorrecto

b) TABLEROS DE DISTRIBUCIÓN.

Función de los Tableros de Distribución. El Tablero de Distribución es la parte del

Sistema de Alimentación en el cual se dividen, por medio de interruptores y/o fusibles las

diferentes cargas y se realizan las mediciones de voltaje, corrientes, etc.

Clasificación de los Tableros de Distribución.

Según la naturaleza de la corriente manejada, los Tableros pueden ser de dos clases:

-Tableros de Corriente Alterna.

-Tableros de Corriente Continua.

-Tableros de Corriente Alterna

. Como su nombre lo expresa, estos tableros son en los cuales por un lado se conecta el

suministro de Corriente Alterna y por el otro las cargas de dicha corriente.

Page 168: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xviii

O sea es donde se dividen las cargas "ESENCIALES y cargas "NO ESENCIALES", (figura

16).

Las cargas esenciales son todas aquellas que por su importancia requieren de energía

en C.A. en forma ininterrumpida, razón por la cual se conectan al grupo electrógeno en caso

de cese de la red comercial.

Constitución de los Tableros de C.A. Un Tablero de C.A está constituido por:

a) Conexiones al Transformador

b) Conexiones al Grupo Electrógeno

c)Instrumentos de medición (Voltmetros, amperímetros, frecuencímetros).

d)Interruptores

e)Gabinete

Figura 16. Diagrama unifilar de un tablero de distribución de corriente alterna.

Page 169: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xix

-Tableros de Distribución de Corriente Directa.

Los Tableros de Distribución de Corriente Directa son parte integrante de la Planta

rectificadora. Se dividen, mediante fusibles independientes las diferentes cargas de Corriente

Directa. En el mismo Bastidor generalmente se encuentran todos los instrumentos de medición

( voltmetros y Amperímetros) y también se sitúan las funciones comunes de la Planta

(relevadores de alarma, sistema de carga de igualación, control de convertidores, etc.).

Al Tablero de Distribución de Corriente Directa se conectan por medio las barras de

distribución por un lado los rectificadores y por otro las diferentes cargas.

En algunos Tableros de Distribución también se disponen conexiones para baterías, en

cuyo caso se denomina como tablero de distribución y batería.

Cada soporte de fusible (portafusible) está hecho de tal forma que emita una alarma y señaliza

el fusible fundido.

Figura 17. Diagramas esquemáticos de tableros de corriente directa.

Page 170: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xx

c) RECTIFICADORES.

Función.

Los rectificadores tienen como función básica la conversión de corriente alterna en

corriente directa, necesaria para la alimentación del equipo telefónico y mantener cargadas las

baterías.

Constitución de un Rectificador.

Un rectificador se constituye de un circuito de potencia y un circuito de control.

Figura 18. Diagrama a bloques de un Rectificador

Circuito de Potencia.

Es a través del cual fluye toda la energía desde la fuente de C.A. hasta la carga de C.D.

El Circuito de Potencia esta formado por:

*Un contactor para la conexión y desconexión del circuito de potencia del rectificador.

*Transformador ó transformadores, para la adecuación del nivel del voltaje requerido.

*Circuito de rectificación, para la transformación de la energía alterna en directa.

*Circuito de filtro, para aplanar la señal rectificada a un nivel de rizo deseada.

En la figura 19 se muestra a bloques, de una forma sencilla, la constitución básica de un

rectificador,

CIRCUITO DE POTENCIA

CIRCUITO DE CONTROL

ENTRADA DE C-A SALIDA DE C-D

Page 171: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxi

Figura 19. Constitución de un Rectificador.

A continuación se describe cada uno de ellos.

Contactor.

Es un interruptor electromecánico cuya función es la de conectar y desconectar la

entrada del rectificador ya sea por operación normal o por falla del mismo.

Se constituye de uno a tres juegos de contactos (dependíendo de1 tipo de alimentaci6n

del rectificador) gobernados magneticamente por una bobina.

Figura 20. Símbolo del contactor.

Transformador.

Es un dispositivo encargado de transformar la energía de entrada a niveles de voltaje

requeridos por el rectificador.

Page 172: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxii

Dependiendo del tipo de rectificador el transformador puede ser monofásico ó

trifásico, en el segundo caso este se conecta en configuración Delta - Estrella ó Delta - Doble

Estrella (dependiendo de su diseño y capacidad).

Figura 21. Transformadores.

Circuito de rectificación.

En esta parte del circuito se realiza la conversión de C-A a C-D pulsante. El circuito

de rectificación dependiendo del tipo de rectificador puede ser a base de diodos de Selenio,

diodos de Silicio, Tiristores ó una combinación de diodos de Silicio y Tiristores. En la figura

21 se muestra la configuración de un diodo y un tiristor.

Figura 22. Representación simbólica del diodo y tiristor.

Page 173: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxiii

Tabla 1. Diferentes configuraciones de rectificadores a base de diodos.

Figura 23. Implementación de configuraciones a base de diodos y tiristores.

Circuito de filtro.

Las redes de filtro están compuestas por arreglos entre inductores y capacitores. Los

inductores utilizados son del tipo de núcleo de hierro y los capacitores ó condensadores son

del tipo electrolíticos.

Las redes de filtro tienen como función disminuir al mínimo el voltaje de rizo del

voltaje de salida del rectificador. En la figura 23 se muestra una configuración de una red de

filtro en ella puede observarse la representación esquemática de sus componentes.

Page 174: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxiv

Figura 24. Configuración de un filtro de salida

Circuito de control

Es por medio del cual se gobierna la aportación del rectificador.

El circuito de control se compone de:

*Circuito de regulación de voltaje:

Este se encarga de mantener el voltaje de salida dentro del límite requerido.

*Circuito de limitación de corriente:

Su función es no permitir al rectificador entregar más corriente de la que éste puede

manejar.

*Circuito de protección y Alarma. Ver figura 19.

Circuito de regulación de voltaje.

Su función consiste en mantener el voltaje de salida del rectificador en un valor

constante e independiente de las variaciones del voltaje de entrada (siempre que éste se

mantenga dentro de cierto rango) y de las variaciones en la carga.

Dependiendo del tipo de rectificador la regulación del voltaje se puede hacer por medio

de transformadores ferroresonantes ó mediante la variación de la fase de disparo de tiristores.

Regulación de voltaje por transformadores ferroresonantes.

La regulación de voltaje por transformador ferroresonante se realiza variando la

impedancia del transformador de potencia. En base a la figura 25 a continuación se describe la

regulación por transformador ferroresonante.

Page 175: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxv

El triac CRI, el inductor L1, el capacitar Cl sobre el devanado de T1 y el devanado

primario de T1 funcionan para controlar la tensión de salida del circuito de potencia. Las

señales de un circuito de pulsos determinan la duración de tiempo en que el triac es encendido

(ángulo de retorno de fase). Siempre que el triac esté conduciendo, la bobina supresora

(shoke), L1 está en paralelo con el capacitor C1.

Una variación en el ángulo de retorno de fase del disparo del triac cambia la

impedancia de este circuito. Este cambio en impedancia hará que la corriente en el devanado

cambie en magnitud y fase.

El cambio en magnitud y fase de la corriente en los secundarios de T1 afectarán la

corriente del primario mantendrán una tensión constante de salida en el devanado de T1.

La tensión en el primario de Tl es igual a la resultan te de la tensión de la línea de C-A

y la tensión desarrollada a través de la inductancia serie equivalente del primario de 1-1 Si la

fase y la magnitud de la tensión a través de la inductancia equivalente del primario de Tl se

puede controlar con respecto a la línea de C-A, entonces la tensión del primario casi como la

tensión de salida de la unidad se puede mantener constante no importando las variaciones de la

tensión de la línea, frecuencia de la línea o la carga.

Figura 25. Regulación de voltaje por transformador ferroresonante.

Page 176: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxvi

Regulación de voltaje por variación de fase de disparo de tiristores.

La regulación de voltaje por variación de fase de disparo de tiristores es realizada

adelantando o retardando el tiempo de disparo a los tiristores que constituyen el circuito de

rectificación. El circuito rectificador a base de tiristores mostrado en la figura 26 nos servirá

para explicar como se realiza este tipo de regulación.

Una muestra del voltaje de salida del rectificado es enviada al circuito de disparo

(punto b) el cual también recibe una señal de sincronía a través del secundario del

transformador.

El circuito de disparo suministra los pulsos "de disparo" a las terminales de compuerta

de los tiristores CR1 y CR2 controlando su estado de conducción.

Figura 26. Circuito rectificador a base de tiristores.

La fase de los pulsos de encendido producidos por el circuito de disparo es dependiente

del voltaje de salida del rectificador el cual se compara con un voltaje constante en el circuito

de disparo; capta un incremento en el voltaje de salida éste adelanta los disparos

incrementando con esto el voltaje de salida proporcionalmente. En la figura 27 se muestra el

efecto de variación de fase en los disparos a los tiristores.

Page 177: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxvii

Figura 27. Efecto de la variación del tiempo de disparo de los tiristores.

Circuito de limitación de corriente.

Tiene por objeto evitar que el rectificador entregue una corriente mayor a la de su

capacidad. Este circuito opera en conjunto con el de regulación de voltaje, censa la corriente

de salida y dicha muestra se utiliza para interactuar con el circuito de regulación de voltaje, en

caso de que la corriente tienda a aumentar, el circuito de limitación de corriente actúa sobre el

circuito de regulación de voltaje, provocando atraso en los disparos y disminución del tiempo

de conducción (dependiendo del tipo de regulación de voltaje) con lo cual la corriente de

salida es disminuida.

E1 valor al cual el circuito limitador de corriente de salida evita el incremento

adicional de la corriente de salida, se ajusta por medio un potenciómetro, este puede ajustarse

para limitar la corriente entre aproximadamente 100% y 125% de la capacidad del rectificador,

aunque el límite de corriente se ajusta a un 110%.

Page 178: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxviii

Circuito de protección y alarma.

Su función consiste en proteger de desviaciones de su funcionamiento que puedan

afectar al propio rectificador o al equipo que alimenta. Este circuito también señaliza audible

y/o visualmente, cualquier daño del rectificador.

Las protecciones más comunes son:

* Protección por alto o bajo nivel

* Protección por exceso de corriente de entrada

* Protección por sobre corriente

Modos de funcionamiento de rectificadores

-Flotación.

-Igualación.

-Flotación.

En esta forma de funcionamiento el rectificador proporciona energía a la carga al

mismo tiempo que proporciona a las baterías la corriente suficiente para reponer sus pérdidas

internas. Para este caso se ajusta el voltaje ( voltaje de flotación) entre 2.15 y 2.17 volts por

celda (Vpc).

-Igualación.

Cuando el rectificador funciona en igualación éste proporciona energía a la carga al

mismo tiempo que proporciona la corriente necesaria para reponer las pérdidas de las baterías

después de una descarga. Para este caso el ajuste de voltaje se realiza a 2.33 Vpc.

Operación en grupos de rectificadores.

Cuando se precisa de más de un rectificador para la alimentación de la carga, se

organizan grupos "planta" de rectificadores pudiendo operar de las siguientes maneras:

Page 179: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxix

Paralelización.

En esta forma de operación todos las rectificadores que constituyen la planta operan

simultáneamente dividiéndose la carga equitativamente.

A Paso.

Cuando una planta rectificadora trabaja a pasos existe uno de ellos (que se elige

manualmente) que opera como piloto, el cual trabaja permanentemente, permaneciendo el

resto de los rectificadores en "Stand - By" (encendido sin carga). Cuando el rectificador piloto

ha llegado al 75% de su capacidad se encenderá el primer paso del siguiente rectificador

tomando el 25% de su capacidad, si con esto no se cubre la demanda en corriente de la carga

este rectificador encenderá en segundo paso (50% de capacidad) y hasta el tercero (75% de su

capacidad) para después del cual se encenderá otro rectificador con su 1º, 2º y 3er paso (25,

50 y 75% de capacidad, así sucesivamente hasta llegar al último rectificador el cual conectará

hasta su último (4º) paso después de lo cual se irán conectando el cuarto paso del penúltimo,

antepenúltimo, hasta el segundo rectificador.

En forma similar se desconectan los pasos al disminuir la demanda. En la figura 11 se

muestran las gráficas de carga en una planta funcionando a paso.

Figura 28. Gráficas de carga en una planta con rectificadores operando a pasos.

Page 180: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxx

Tipos de rectificadores en TELMEX. Los diferentes tipos de rectificadores utilizados

en Telmex se describen en la tabla 2.

Tabla 2. Rectificadores utilizados en TELMEX.

Page 181: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxi

d) CONVERTIDORES.

Función.

Los convertidores son equipos cuya función consiste en transformar corriente continua

a corriente continua a un nivel diferente de la tensión original.

Tipos de Convertidores.

Dependiendo de su aplicación, (en Telmex) se cuenta con dos tipos de Convertidores:

Los Asociados y los Independientes.

-Convertidores Independientes.

Los Convertidores Independientes se utilizan para proporcionar voltajes diferentes a

los disponibles en la planta de corriente directa. Los convertidores Independientes utilizados

(en Telmex) son alimentados con 48 Vcd y se usan para proporcionar 24 y 130 Vcd.

Por la facilidad del mantenimiento y seguridad de operación que proporcionen estos

equipos, se recomienda que se instalen en los lugares en que las demandas no sean mayores de

15 Amperes para 24 volts ó 5 Amperes para 130 Volts.

-Convertidores Asociados.

Los Convertidores Asociados a los rectificadores, pueden considerarse como celdas

auxiliares, pues su función consiste en adicionar voltaje al de las baterías cuando éstas se

encuentran en descarga alimentando e1 equipo telefónico, conectándose en serie entre las

baterías y la carga. (Equipo Conectado).

Los Convertidores Asociados se clasifican en dos grupos: Convertidores Regulados y

Convertidores No Regulados.

Los convertidores regulados se caracterizan por agregar gradualmente a distribución la

tensión que la batería va perdiendo. En la figura 29 se muestra la curva de comportamiento de

un convertidor asociado regulando.

Page 182: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxii

Figura 29. Curva de comportamiento de un convertidor regulado.

Los convertidores no regulados tienen un voltaje de salida fijo, el cual se elige de tal

manera que pueda mantener la tensión de distribución por encima de un valor permitido, en

caso de que la batería esté descargada, sin causar sobretensión, no permitido en el equipo

telefónico.

En la figura 30 se puede observar la gráfica de comportamiento de un convertidor

asociado no regulado.

Figura 30. Curva de comportamiento de un convertidor no regulado.

De la figura 30 se puede observar que existen voltajes de entrada 2 y salida de

Convertidor 5. La tensión de arranque (en distribución) de los Convertidores se ajusta a 45

volts, mientras que la tensión de paro del Convertidor es de 55 volts, en distribución.

Constitución de los Convertidores.

Los Convertidores (Asociados e Independientes) están compuestos de un Circuito

Principal o de Potencia y un Circuito de Control ó Maniobra.

Page 183: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxiii

-Circuito Principal.

El Circuito Principal a de Potencia es por el cual fluye la potencia desde la

alimentación hasta la salida. Este circuito se compone básicamente de un filtro de entrada, que

evita el paso de ruido del Convertidor a la batería, un oscilador de potencia que genera una

tensión alterna, un puente rectificador y un filtro de salida que aplana la tensión de salida. En

los Convertidores (empleados en Telmex), existen dos tipos de circuitos de potencia.

-Circuito de Potencia a Tiritares.

Se caracteriza por utilizar tiristores para producir una onda semicuadrada. En la figura

3 se muestra el circuito de potencia de un Convertidor a Tiristores.

Figura 31. Circuito de potencia de un convertidor a tiristores.

El Circuito, comprende un filtro de entrada formado por el capacitor C9 y la

inductancia L4 que evitan que las oscilaciones del Convertidor pasen a baterías, un inversor

clase C formado por los tiristores 13 y 14, el transformador (2), el capacitor C28 y la

inductancia L5 que forman un circuito de conmutación por medio del cual se apagan los

tiristores 13 y 14. La conducción alternada de tiristores genera una tensión alterna en el

secundario del transformador (2), la cual es rectificada por los diodos (18) y (19) que forman

un rectificador de onda completa. La onda rectificada es filtrada por el filtro de salida formado

por C24, C25 y L3. El diodo 17 sirve para conducir la corriente de distribución cuando el

convertidor no está funcionando.

Page 184: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxiv

Circuito de potencia a transistores.

El circuito de potencia a transistores está formado por dos grupos de transistores

colocados en configuración de puente-paralelo en el cual dichos grupos son alternadamente

manejados de conducción a corte.

Figura 32. Circuito de potencia a transistores

Los transistores 401 y 404 forman un puente paralelo, y los transistores 402 y 403 .

Con la configuración formada por los cuatro transistores y el transformador T1 se forma una

onda cuadrada de la siguiente forma:

Suponiendo que todos los transistores están en corte, al momento de arrancar el

convertidor se aplica, por ejemplo, a los transistores 401 y 404 una onda cuadrada, cambiando

su estado a conducción y circulando corriente de colector - emisor de Q401, 2 a 1 del

transformador T1, emisor-colector de Q404 y finalmente a tierra a través a través de CR508.

En ese momento dichos transistores dejan de conducir empezando ahora a hacerlo los

transistores Q402 y Q403, circulando ahora la corriente de emisor-colector de Q403, 1ª. A del

transformador T1, emisor-colector de Q402 y finalmente a tierra.

Como puede observarse se presenta un cambio de polaridad en el primario de T1 lo

que induce una onda de señal alterna en el secundario de T1.

El circuito de potencia consta además de un filtro de entrada, un rectificador y un filtro de

salida. En la figura 33 se muestra dicha configuración.

Page 185: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxv

Figura 33. Configuración circuito de potencia.

Circuito de encendido.

Para los dos circuitos descritos anteriormente es necesario contar con un circuito

encargado ya sea para cebar los tiristores o para proporcionar las polarizaciones de base

necesarios para saturar los transistores.

En algunos convertidores a transistores (BAT-TAP, CST3) la conmutación de los

transistores es autónoma, esto es, que el circuito de conmutación es el mismo circuito de

potencia (ver figura 34), no siendo así para los dos circuitos antes expuestos, los cuales

necesitan circuitos de encendido.

Figura 34. Convertidor BAT-TAP

Page 186: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxvi

-Circuito de encendido de tiristores.

Por medio de este circuito se genera una serie de disparos desfasados 180 grados para

lograr el encendido alternado de los tiristores que forman el ondulador (inversor). La

constitución básica del circuito de disparo y las formas de onda se muestran en la figura 35 a

y b.

-Circuito de encendido para transistores.-

Los ggrupos de transistores descritos en el circuito de potencia también deben ser

alternadamente conmutados de corte a saturación y de saturación a corte. Esta conmutación

es por medio de la aplicación o no aplicación de un voltaje en la base de los transistores.

Esta señal es obtenida de dos osciladores (maestro y esclavo) que proporcionan dos señales

cuadradas y defasadas 180 grados.

Figura 35. Circuito a bloques de encendido de tiristores.

Page 187: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxvii

e) INVERSORES.

Función.

Un Inversor es un equipo cuya función consiste en transformar la energía eléctrica de corriente

directa en corriente alterna.

Los Inversores se utilizan para proporcionar energía eléctrica en corriente alterna a

equipos que requieren de un voltaje regulado y sin interrupciones, como son: Grabadoras,

Procesadores de Datos y ciertos equipos de Radio.

Constitución.

Un Inversor está constituido por: Un Circuito de Potencia, Circuito de Control de

Disparo y Sincronía de Línea, Filtros de entrada y Filtros Armónicos, Circuito de

Transferencia, señalización y Alarmas y Circuito de Protección (Figura 36).

Circuito de Potencia.

El Circuito de Potencia toma corriente directa y la conduce alternadamente a las

derivaciones de un transformador de tal manera que en dicho transformador se genera una

onda cuadrada. En la figura 37 se muestra el Circuito de Potencia típico.

Figura 36. Diagrama a bloques de un inversor.

Esta formado por un inductor (L), un par de tiristores (SCR1 y SCR2) un par de diodos

(D1 y D2) y un capacitor (C).

Page 188: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxviii

La corriente directa se proporciona a través del inductor (L) a los catodos de los

tiristores y al punto medio del primario del transformador.

Figura 37. Circuito de potencia de un inversor

Funcionamiento del circuito de potencia.

Asumiendo que ninguno de los tiristores está conduciendo y el capacitor C se

encuentra descargado. Al ser disparado SCR1, circula una corriente que va del positivo de la

batería, por el punto 2 del transformador, a través del tiristor SCR1, a través de L y finalmente

al negativo de la batería. La caída de potencial en el SCR es aproximadamente 1 volt, así que,

prácticamente todo el voltaje de la batería se aplica al bobinado izquierdo del transformador.

El primario del transformador actúa como un autotransformador, con lo cual el capacitor C se

carga al doble de voltaje de la batería.

En este instante se envía un pulso a la compuerta del SCR2, comenzando este a

conducir. Conduciendo los dos SCR's el capacitor se cortocircuita, forzando una corriente

inversa a través de SCR1 apagándolo, mientras que el SCR2 continúa conduciendo fluyendo la

corriente como se describió para el SCR1 pero ahora en el bobinado derecho del

transformador, cargando ahora el capacitar con el doble del voltaje de la batería pero con la

polaridad contraria. Al aplicar nuevamente un disparo al SCR1, se vuelve conductor y el

capacitor se descarga a través del SCR2 apagándolo. Esta secuencia se repite periódicamente

originando una onda cuadrada de doble voltaje de batería en el primario del transformador.

En el secundario del transformador aparece una onda cuadrada que al ser filtrada por

los filtros armónicos se convierte en una onda senoidal.

Page 189: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xxxix

La bobina L en serie con los SCR, reduce el valor de C. El capacitor de conmutación

C, los diodos D1 y D2 protegen a los SCR de la corriente reactiva.

Circuito de Control de Disparo.

Este circuito proporciona los disparos alternados (con un desfasamiento de 180 grados

eléctricos) a los SCR's para iniciar su conducción. Dicho circuito se compone de:

- Un Generador de Alta frecuencia (HF)

- Un Generador de baja frecuencia (120 HZ)

- Un divisor de pulsos (defasador de 180º )

- Un amplificador y Acoplador

Figura 38. Circuito de control de disparo.

El oscilador de baja frecuencia genera pulsos a una frecuencia de 120 Hz, estos pulsos

pueden ser generados por un oscilador de relajación, un oscilador ó un multivibrador astable.

El defasador divide la señal del oscilador de 120 Hz en dos señales cuadradas con frecuencia

de cambio de 60 Hz, desfasadas 180 grados eléctricos una de la otra. Dicho defasador consiste

en un multivibrador biestable. El generador de alta frecuencia consiste en un oscilador de

bloqueo el cual es gobernado por la salida del biestable.

Filtros.

El Inversor cuente con dos filtros, uno de entrada y otra de salida o armónico.

- Los filtros de entrada.

Se disponen en el inversor con el fin de evitar que el ruido generado en el circuito de

potencia sean transmitidos a las baterías.

Page 190: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xl

- Filtros Armónicos.

Los filtros armónicos son filtros de tipo pasa-banda y deben tener una selectividad tan

alta como sea posible con tal de obtener, a la salida del inversor una senoide con una

distorsión armónica muy baja (aprox. + 3%).

Circuito de Transferencia.

Este Circuito proporciona la señal requerida para el cambio de la carga a otro inversor

o en su defecto a la 1ínea en caso de daño del inversor de servicio normal.

El Circuito de Transferencia cuenta con monitores de alarmas y fallas a base de relevadores

que indican la operación o falla del inversor por medio de señales audibles y/o visuales.

Circuitos de Protección.

Los Circuitos de Protección detectan cualquier anomalía ya sea en el inversor o en la

tensión de alimentación (Baterías).

-Protección por Bajo Voltaje

-Protección por Alto Voltaje

La Operación del Inversor se detiene cuando el Circuito de Protección detecta

anomalías en el voltaje de alimentación.

f) BATERÍAS.

Introducción.

La telefonía requiere de 3 factores básicos que son: Conmutación, Transmisión y

Energía, y que sin éste último no entran en funciones los dos primeros.

En las plantas telefónicas existe una gran cantidad de equipo que para realizar sus

funciones requiere de dos tipos básicos de energía

a) Energía eléctrica

b) Energía Mecánica

Page 191: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xli

Para realizar el primer punto, se cuenta con los suministradores de corriente directa y

corriente alterna, que entregan la energía con las características necesarias para el buen

funcionamiento del equipo telefónico.

Para garantizar la continuidad del servicio telefónico, existen dos equipos de reserva en

caso de interrupción de la energía eléctrica comercial, estos son:

a) Batería

b) Grupo Electrógeno

Donde la primer reserva, en importancia; la constituyen las baterías. Por la razón de

que una vez la tensión de la red comercial cesa, las baterías desempeñan la función de

suministrar la corriente directa el equipo telefónico en el intervalo de que existe entre la

interrupción de la red comercial y el arranque del grupo electrógeno. En la figura 1, se muestra

la relación que guardan las baterías con respecto a la planta telefónica. La segunda reserva la

constituye el grupo electrógeno, ya que éste suministra la energía eléctrica cuando falla la red

eléctrica comercial.

Definición de Batería.

La batería es un equipo de emergencia capaz de almacenar energía en forma química,

para un proceso reversible suministrar energía eléctrica de corriente directa en forma

instantánea, cuando resulte necesario.

Page 192: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xlii

Figura 39. Relación que guardan las baterías con respecto a la plante telefónica.

En 1os sistemas de alimentación de corrientes de aquellos, equipos telefónicos de los

que se exige una gran seguridad de servicio y una alimentación de corriente continua, se

emplean prácticamente los acumuladores o baterías secundarias y en los sistemas modernos se

sigue la norma de alimentación directa, es decir; la batería o baterías están normalmente

cargadas y no participan en la alimentación de energía al equipo telefónico a excepción de

períodos de picos de carga de corta duración.

Función de una Batería.

-Como fuente de reserva de Corriente Directa.Una de las funciones primordiales de la

batería en una planta telefónica es proporcionar sin interrupción a los equipos telefónicos en

los casas de cese de la tensión de red, la energía suficiente durante el tiempo de duración del

corte o hasta que el grupo electrógeno, en su caso; haya arrancado.

La batería siempre se encuentra conectada en para1elo con una planta rectificadora trabajando

en:

a) Flotación

b) Carga-descarga

Page 193: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xliii

En la mayoría de las instalaciones, la planta rectificadora alimenta a la distribución y al

mismo , tiempo suministra una pequeña corriente a la batería, con el objeto de compensar las

perdidas internas y mantenerla en óptimas condiciones de carga. De esta manera, se cuenta

con una reserva máxima de corriente directa (C-D), que puede utilizarse, cuando existe una

interrupción de la energía eléctrica.

Como filtro.

La segunda función de la batería es como filtro un sofométrico eliminando las

variaciones de tensión "ruido" generadas por el rectificador asociada a la planta rectificadora.

Ya que las baterías tienen la propiedad de presentar una "impedancia muy baja" a su entrada

con lo que se logra atenuar las tensiones inherentes procedentes de rectificadores u otros

aparatos productores de interferencia, y en las instalaciones telefónicas para atenuar los

valores altos de tensiones transitorias y disminuir la diafonía.

Constitución de una Batería Plomo-Ácido.

Recipiente.

El recipiente o envase de una batería plomo-ácido se fabrica de una sola pieza

moldeada y se construye de hule duro o plástico transparente en aplicaciones estacionarias. El

recipiente debe resistir las temperaturas extremas de calor y frío además, de las sacudidas

cuando el acumulador es removido trasladado de un lugar a otro, también debe ser resistente a

la absorción de ácido.

En el fondo de cada una de los compartimientos destinados a los elementos, se

encuentran varias proyecciones moldeadas sobre los cuales repasan los elementos. Así se

evitan los cortos circuitos por sedimento, desprendido de las placas que se acumula en las

proyecciones sobre las cuales reposan las placas.

Placas.

Las placas de una batería se consideran como los materiales "activos". Existen dos

tipos de placas que son: positivas y negativas. Los materiales activos, por si solos no tienen

Page 194: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xliv

forma mecánica rígida resistente y especialmente los positivos, son muy malos conductores de

electricidad. Por lo que es necesario montarlos en cierta clase de armazón o rejilla de una

aleación compuesta principalmente de plomo y antimonio para mantener una forma física y

conducir la corriente a todas las partes del material. A su vez, en función del tipo de armazón

las placas se clasifican en:

a) Empastadas.

b) Multitubulares.

Las placas empastadas están hechas a base de óxido de plomo finamente pulverizado y

amasado, que en términos Industriales se conoce como "pasta". Estas pastas tienen como

objetivo lograr superficies de contacto grandes y éstas se colocan a presión mediante un

rodillo sobre una rejilla de aleación plomo-antimonio. Esta construcción casi siempre se

utiliza en las placas negativas, aunque se llega a usar en las positivas también.

Las placas multitubulares, están constituidas por una serie de varillas, cada una de ellas

rodeada por un tubo de caucho (hule), plástico o fibra de vidrio perforado, con el material

colocado en el espacio anular entre esos tubos o varillas y se utiliza exclusivamente para

las placas positivas.

Placas Positivas.

Las placas positivas están hechas de peróxido de plomo ( 2PbO ), que es la materia

activa, se identifica por su forma cristalina de color café oscuro. Sus moléculas se hallan

dispuestas en tal forma que le prestan una gran porosidad, lo que permite que el electrólito

penetre libremente entre las placas, véase figura 40.

Placas Negativas.

Las placas negativas, figura (2), son fabricadas con una masa porosa de plomo

esponjoso que permite la fácil penetración al electrólito. La materia activa también contiene

ciertos cuerpos llamados "Expansores" que se le han incorporado para impedir que el plomo

esponjoso se contraiga durante el tiempo de vida del acumulador, a su estado sólido inactivo.

Page 195: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xlv

Figura 40. Placas empastadas utilizadas como positivas y negativas.

Electrólito.

El electrólito de una batería plomo-ácido, es una solución química compuesta de ácido

sulfúrico y agua. El ácido sulfúrico del electrólito suministra el sulfato que se combina con las

materias activas de las placas para generar la energía eléctrica.

El ácido sulfúrico del electrólito sirve también como conductor de la energía eléctrica

dentro de la batería entre las placas positivas y negativas a través de los separadores.

Concentración.

La concentración de una solución química se refiere a la cantidad de soluto o

substancia química, en este caso es ácido sulfúrico químicamente puro, disuelta en un

volúmen específico de agua destilada.

La concentración de electrólito de un acumulador completamente cargado contiene

generalmente de un 35% de ácido sulfúrico en peso, 24% en volúmen. Esto corresponde a una

densidad específica de más o menos 1.265 a 26ºC.

Page 196: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xlvi

La concentración de solución acidulada (electrólito), se hace más debil a medida que la

celda se descarga. La cantidad de ácido consumida guarda proporción con la cantidad de

electricidad que sale de la celda.

Separadores

Los separadores son hojas delgadas de material poroso no conductor de la electricidad

que tiene como objetivo impedir el contacto entre las placas positivas y las placas negativas.

En la fabricación de separadores se utilizan materiales como fibras de celulosas impregnadas

con resina, hule microporoso y otros plásticos usados solos y en combinación con materiales

de fibra de vidrio, también como hojas de fibra de vidrio adheridos al separador microporoso.

El lado de los separadores vecina a las placas positivas lleva ranuras y proyecciones

para hacer que haya volumen de ácido en contacto con las placas positivas, para mejorar la

eficiencia y para facilitar la circulación de ácido dentro de la celda. Las proyecciones en los

separadores también sirven para disminuir el área de contacto de éstos con las placas positivas

que tienen un efecto oxidante muy pronunciado en los separadores.

Algunas veces se introducen entre los separadores las placas positivas, laminas

delgadas fabricadas con fibras de vidrio, que sirven para retardar las pérdidas del material

activo de las placas y para proteger los separadores contra la oxidación.

Conector.

El conector es una varilla de aleación plomo-antimonio que sujeta y conecta entre sí a

todas las placas positivas, cosa que también se hace con las placas negativas.

Bornes.

El borne es la terminal del conector. Esta terminal conduce la electricidad producida en

la batería hacia el circuito externo.

Page 197: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xlvii

Existen dos tipos de bornes de acumuladores de acuerdo a su forma y su aplicación.

a) Cónicos.

b) Prisma cuadrangular.

Construcción de Elementos.

Las placas positivas se sueldan eléctricamente a postes de conexión, y estos conjuntos

forman los grupos positivos; las placas negativas se sueldan igualmente a postes de conexión y

ellas forman el grupo negativo. Los dos grupos se unen, luego se introducen entre las placas

los separadores con su lado ranurado hacia las positivas. El conjunto de grupo negativo, grupo

Positivo y separadores se denomina "Elemento". En cada celda se utiliza un elemento.

En los elementos puede utilizarse el número y tamaño de placas que se desee, esto

depende de la cantidad de energía que se quiere almacenar; pero por razones de eficiencia,

generalmente habrá una placa negativa en exceso de las placas positivas.

Cuanto mayor sea el número de las placas que se utilizan por elemento, mas elevado será el

voltaje durante la descarga a regímenes elevados y a bajas temperaturas.

El voltaje de una celda bien cargada es siempre un poco mayor de 2 voltios, sea cual

fuere el número o tamaño de sus placas. El voltaje del acumulador es la sume total del voltaje

de cada una de sus celdas.

Proceso Electroquímico.

La reacción química de carga-descarga efectuada en un acumulador del tipo

plomo-ácido es:

2 2 4 4 22 2 2PbO Pb H SO PbSO H O+ + +

Descarga→

Carga←

Page 198: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xlviii

A continuación se explica el proceso electroquímico:

En el acumulador plomo-ácído totalmente cargado, todo el material activo de las placas

positivas es peróxido de plomo; el de las negativas es plomo esponja puro. Todo el ácido está

contenido en el electrólito y la densidad (gravedad específica) seencuentra a su máximo.

Cuando se va descargando el acumulador, una parte del acido se separa del electrólito que se

encuentra en los poros de las placas, forma una combinación química con el material activo y

lo convierte en sulfato de plomo a la vez que produce agua.

Según continúa la descarga, se va extrayendo ácido adicional del electrólito y se forma

más sulfato y más agua. Cuando continua este proceso, puede entenderse fácilmente el porqué

de la disminución de la densidad (gravedad específica), en un acumulador descargado, ya que

la proporción de ácido es menor con la cantidad de agua.

Cuando el acumulador es sometido a carga, el ácido contenido en el material activo

sulfatado es expulsado y retorna al electrólito. Este retorno del ácido al electrólito hace

aumentar la densidad, la cual continuará aumentando hasta que haya sido expulsado todo el

ácido contenido en las placas y se encuentre otra vez formando parte del electrólito. Con ello,

ya no habrá sulfato en las placas.

Una vez que todo el ácido ha regresado al electrólito, aunque se siga sometiéndo a

carga el acumulador, la densidad ya no aumentará más. Todo el ácido de las celdas se

encuentra en el electrólito y es cuando se dice que el acumulador esta totalmente cargado. El

material de las placas positivas ha vuelto a ser peróxido de plomo, el de las negativas es plomo

esponja puro y la densidad se en- cuentra a su máximo.

Para expresarlo brevemente al descargar las placas, absorben ácido; al cargar,

desprenden el ácido que absorbieron para que vuelva al electrólito.

Cuando las celdas van llegando a su estado de carga total, ya no pueden absorber toda

la energía de la corriente de carga; ese sobrante descompone el agua del electrólito en

Page 199: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-xlix

hidrógeno y oxígeno, que son liberados en forma de gases que salen de las celdas. Esta es la

razón principal por la que es necesario agregar agua a las celdas de un acumulador.

La característica mas útil de los acumuladores es su reversibilidad química. Esto quiere

decir que, cuando se obliga a pasar una corriente en sentido inverso a través del acumulador

plomo-ácido se invierte la acción química de descarga y el acumuladar se carga, a ésta

corriente se le llama "corriente de carga".

Densidad Específica y Capacidad de una Batería Plomo-Ácido.

Concepto de densidad específica.

La densidad específica de un liquido a sustancia es una comparación de su peso con el

peso de un volumen de agua idéntico.

El agua tiene una densidad específica de 31.000 /g cm . El ácido sulfúrico

químicamente puro tiene una densidad de, porque pesa 1.835 veces más que el mismo

volúmen de agua. La densidad específica de una solución de electrólito en un recipiente de

plomo-ácido alcanza de 1.21 a 1.300 para acumuladores nuevos completamente cargados.

Esto significa alrededor del 20% de ácido y 80% de agua. Cuando se tiene unamayor

densidad específica, menor es la resistencia interna del electrólito, y por lo tanto la corriente de

salida es mayor.

Concepto de capacidad de una batería.

La capacidad de un acumulador se refiere a su habilidad de suministrar potencia, es

decir la cantidad de corriente que puede suministrar en un tiempo dado.

La capacidad de un acumulador depende del número y tamaño de las placas usadas

por celda , también como el peso del material de la placa y el volumen de ácido presente.

La clasificación de acumuladores, se hace de acuerdo a su capacidad o corriente

nominal en unidades de Amper-Horas, el tiempo que generalmente dura es de 20 horas. De

esta manera si el acumulador tiene una clasificación de 100 Amperes-Hora significa que

Page 200: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-l

suministrará 5 amperes durante 20 horas antes de que su fuerza electromotriz (FEM)

disminuya al nivel de descarga que es de 1.75 volts por celda.

Sin embargo, esta cifra de 100 Amperes-hora tiene muy poco significado si no está

respaldada por los numerosos factores que influyen en la capacidad de un acumulador y

además, por el uso a que se le destina normalmente. Los factores principales que afectan a un

acumulador son:

a)Régimen de descarga.

b)Temperatura.

c)Densidad(gravedad específica).

d)Voltaje final

Por lo que antecede, se apreciará que la capacidad de un acumulador debe incluir

todos los requisitos que indiquen las condiciones dentro de las cuales dará un rendimiento

especificado. Para un acumulador con determinados requerimientos, se debe especificar, por

ejemplo:

Un acumulador de 12 celdas de 500 Amperes-Hora al régimen de 8 horas, a una

temperatura de 25°C (77°F), a un voltaje final de 1.75 Vpc, con una densidad específica de

1.250 a plena carga.

Tipos de Baterías

-Industrial.

Este tipo de acumulador se utiliza en servicios estacionarios como fuente de

alimentación de reserva ó emergencia, o en cualquier servicio en el cual se requiera poca

corriente durante largos períodos de tiempo.

Este tipo de baterías secundarias o acumuladores suelen tener una densidad específica

de 1.200 a 31.220 /g cm en carga completa. A menor densidad específica se obtiene más larga

vida, pero la resistencia interna es mayor y por lo tanto se tendrá menos corriente instantánea,

Page 201: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-li

produciéndose una tensión nominal de 2.05 Vpc para una densidad y un régimen de carga

largo.

-Automotriz.

Este tipo de acumulador se utiliza para arrancar motores automotrices, donde se

necesitan corrientes grandes, 150 a 340 amperes, con regímenes de descarga muy cortos.

Este tipo de acumuladores tiene una densidad de 31.280 a 1.300 /g cm en carga

completa. Sin embargo, cuanto mayor es la densidad específica mayor es la acción química,

por lo tanto el tiempo de vida de estas baterías (aproximadamente de 1 año) es más corto que

el de las baterías del tipo industrial (de 10 a 15 años).

a)Régimen de descarga.

La capacidad de un acumulador, varía con el régimen de descarga en amperes.

Mientras mayor sea este régimen, menor será la corriente total que suministre el acumulador

en condiciones que por lo demás sean idénticas. Esta relación variará ligeramente según los

diferentes tipos de celda y placa; pero en la figura 41, aparece una relación promedio para una

celda típica.

Figura 41. Curva de Capacidad-Régimen basado en el régimen de 8 horas.

Otro resultado del aumento de los regímenes de descarga, es que aumente la caída de

voltaje dentro de la celda, debido a su resistencia óhmica interna. Mientras mayor es la

corriente, mayor es la caída de voltaje útil que satisface la demanda.

Page 202: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-lii

El régimen que con mayor frecuencia se utiliza como norma es el de 8 horas, que se

puede expresar como “100 amperes a 8 horas” o bien “12.5 amperes durante 8 horas”.

A todas las baterías del tipo plomo-ácido en servicio de control se les mide su

capacidad en Amperes-Hora a 8 horas de descarga y un voltaje final de 1.75 volts por celda a

una temperatura de 25°C.

b)Temperatura.

A temperaturas elevadas, es usual que se aceleren muchas reacciones químicas. En los

acumuladores, las altas temperaturas disminuyen la resistencia ohmica interna y la viscosidad

del electrólito, con lo cual se reduce la caída de voltaje dentro de la celda y se mantiene su

voltaje terminal más alto. Estos factores se combinan para aumentar la capacidad de altas

temperaturas y reducirlas a bajas temperaturas. Debido al efecto de la temperatura en la

resistencia óhmica del electrólito, esta diferencia en capacidad varía según sea el régimen de

descarga. En la figura 42, se ilustra la relación aproximada para celdas típicas.

Figura 42. Efecto de la temperatura sobre la capacidad a 25°C 100 A-H.

La “temperatura de referencia”, usada en casi todo el mundo es de 25°C (77°F).

c)Densidad (Gravedad específica).

El grado con el que la densidad afecta a la capacidad de la celda, varía

considerablemente según el tipo y diseño del acumulador, pero la regla empírica que se aplica

generalmente, es una diferencia de 25 puntos en la densidad hará variar la capacidad entre 8 y

10%. Por ejemplo, si cierta celda tiene una capacidad de 100 Amperes-Hora con una densidad,

con carga total de 1.275, su capacidad será de 90-92 Amperes-Hora si su densidad con carga

total se reduce a 1.250.

Page 203: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-liii

La selección dela densidad (gravedad específica) con carga total es una función del diseño,

que depende de lograr un valor intermedio aceptable entre numerosos factores. Algunos de los

efectos de la diferencia de densidad ( en grado variable ), con los demás factores sin variación

son: DENSIDAD MÁS ALTA DENSIDAD MÁS BAJA

Más capacidad Menos capacidad

Menor duración Mayor duración

Se requiere menos espacio Se requiere más espacio

Régimen de descarga momentáneo, más elevado Régimen de descarga momentánea, más reducido

Menos adaptable para trabajos de flotación Más adaptable para trabajo de flotación

Más perdidas cuando está inactivo Menos pérdidas cuando está inactivo

Tabla 3. Algunos de los efectos de la diferencia de densidad.

d)Voltaje final.

Esté término se utiliza para designar el voltaje mínimo aceptable y útil con diversos

regímenes de descarga y es el valor al cual se puede lograr la máxima cantidad de Amperes-

Hora antes de que el voltaje de las celdas empiece su caída rápida conforme se va llegando al

punto de agotamiento. Se encuentra justamente encima de la “rodilla de la curva de descarga y

es menor con regímenes de descarga más elevados”.

El “voltaje final” seleccionado para una celda determinada; depende en gran parte de

su aplicación. Por ejemplo, con un régimen de descarga muy moderado (Régimen de 72 horas)

este valor puede llegar a ser muy alto, por ejemplo, 1.85 volts por celda (Vpc) ó puede ser

sumamente bajo, a razón de 1.00 Vpc en el caso de descargas fuertes como es el caso de

arranques de motores. Sin embargo, existe una norma de uso de 1.75 Vpc que es la que se

emplea comúnmente para la mayoría de los tipos.

Page 204: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-liv

Marcas y capacidades de baterías plomo-ácido utilizadas.

En centrales grandes EN CENTRALES GRANDES

MARCA TIPO VOLTS/CELDAS CAPACIDAD EN A.H.

EXIDE EHGS-7

EHGS-11

48/23

48/23

216

360

AISA DT 100

DT200

KT360

48/23 24/12

48/23 48/12 24/12

48/23 24/12

100

200

360

Tabla 4. Tabla de marcas y capacidades de baterías.

*Nota.- En la marca de baterías EXIDE, la cifra a la extrema derecha indica el número de

placas por celda de una batería. Y en la marca AISA, indica la capacidad en Ampere-Hora de

la celda.

Operación de las baterías

-Flotación.

La carga de flotación es un tipo de carga automática, en la cual la batería se encuentra

conectada permanentemente a un sistema eléctrico que está constituido por una planta

rectificadora y la carga (demanda de corriente). La planta rectificadora alimenta a la

distribución y al mismo tiempo suministra una pequeña corriente a la batería, con el objeto de

compensar las pérdidas internas y mantenerla en óptimas condiciones de carga.

Para la conservación y buen funcionamiento de la batería, se requiere de un voltaje de

operación específico denominado “voltaje de operación o reposo”, el cual es de 2.145 a 2.17

Volts por celda. Este voltaje tiene como finalidad mantener el grado de carga de la batería

durante largo tiempo sin sobrecarga. Ello significa que la batería no se “cargará” con el voltaje

de carga de flotación sólo tendrá lugar hasta que se alcance el 100% de carga. La batería se

Page 205: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-lv

carga solamente después de interrupciones de la red y posibles cargas de igualación, mientras

que la carga de flotación es permanente.

-Igualación.

La carga de igualación tiene como objetivo principal mantener la batería a plena carga

para evitar la sulfatación excesiva, sin embargo, para evitar toda sobrecarga apreciable. Para

lograr esto es común eliminar las cargas diarias o frecuentes cuando la batería está

nominalmente, aunque no totalmente, cargada y luego darle una “carga de igualación”,

periódica . Se trata simplemente de una continuación de la carga normal hasta que se logre un

estado de carga total. El voltaje, de operación específico, de igualación es de 2.33 volts por

celda, que es aplicado durante un lapso que varía de 8 a 24 horas después de una descarga de

apreciable duración.

La carga de igualación tiene el propósito de compensar las irregularidades que

pudieran haber ocurrido al encontrarse la batería a un voltaje menor que el voltaje de

flotación especificado.

La frecuencia con que se aplican esas cargas de igualación depende del trabajo de la

batería y puede fluctuar de un mes a varios meses cuando se encuentra en el servicio

estacionario de flotación.

Dimensionamiento de Baterías.

El dimensionamiento de baterías, se refiere al cálculo de la capacidad en Ampere-Hora,

de un banco de baterías para que esté satisfaga adecuadamente la demanda de corriente

directa de la planta telefónica, ya sea en una central telefónica de cualquier tipo, o en un

repetidor de microondas.

El dimensionamiento de baterías en centrales, se hace de tal manera que pueda cubrir

interrupciones de energía de 5 horas, por lo tanto:

Capacidad de baterías en centrales = 5*(demanda total).

Page 206: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

I-lvi

En el caso de repetidores de microondas debido a su lejanía con los centros de

mantenimiento, es conveniente que el tiempo de duración de la descarga de las baterías sea

mayor que en las centrales.

Por tal motivo, dichas baterías se dimensionan para cubrir interrupciones de energía de

hasta 24 horas por lo tanto:

Capacidad en repetidores de Microondas = 24 por demanda total.

Page 207: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-i

ANEXO II. PROGRAMA DEL MICROCONTROLADOR

;PROGRAMA QUE TRANSMITE UN PAQUETE DE DATOS, UTILIZANDO EL CRC_16 ;Pic=16F874 ;Envia los datos de 7 canales 4 analogicos y 3 digitales (CFE,Transferencia y frecuencia) ;Con su caracter de inico de paquete y de fin de paquete ;Utilizando un baud rate =2400 Kbps ;Utilizando una frecuencia de tx = 11 datos por segundo = 11Hz (1 paquete por segundo) ;Emplenado el CRC_16 y sin el bit de paridad ;El orden en que los datos son transmitidos son el siguiente: ;1.-Caracter de inicio de paquete (Char_Inicio) ;2.-Los 4 canales analogicos (0-3) ;3.-La bandera de CFE ;4.-La bandera de TRANSFERENCIA ;5.-El valor de la frecuencia ;6.-El valor del primer byte del CRC_16 ;7.-El valor del segundo byte del CRC_16 ;8.-Caracter de fin de paquete (Char_Fin) LIST P=16F874 #include <p16F874.inc> ;------------------------------------------------------------------------------------- ; DECLARACION DE VARIABLES ;------------------------------------------------------------------------------------- VALORH equ 0x31 ;Variable que almacena al valor de ADRESH VALORL equ 0X32 ;Variable que almacena al valor de ADRESL VALORTX equ 0x33 ;Variable que almacena el valora Tx, ingresado ;desde el PORTA FLAGINICIO equ 0x35 ;Bandera de inicio de paquete de información FLAGFIN equ 0x36 ;Bandera de fin de paquete de información CONFIGCANAL equ 0x37 ;Variable que controla el canal a usar para su ;conversión A/D TOTALCANALES equ 0x4A ;Variable que almacena el numero máximo de ;canales analógicos a utilizar. INCCONT equ 0x38 ;Variable que almacenara al contador del DELAY MAXCONT equ 0x39 ;Variable que almacenara el valor maximo a ;contar ;--------------------------------------------------------- ; VARIABLES A USAR POR EL CRC ;--------------------------------------------------------- DATA_HIGH EQU 0X40 ;Registro que almacena al DATO1 DATA_LOW EQU 0X41 ;Registro que almacena al DATO2 BUFFER EQU 0X42 ;Registro que almacenara el DATO3 Px_GENERADOR_1 EQU 0X44 ;Registros que almacenan al polinomio Px_GENERADOR_0 EQU 0X45 ;generador del CRC_16=X^16+X^15+..+X^2+X^0 XOR0_1 EQU 0X46 ;Registros que almacenan el resultado XOR0_0 EQU 0X47 ;de las operaciones XOR CRC_1 EQU 0X48 ;Registros que almacenan los 16 ceros ha CRC_0 EQU 0X49 ;agregar al paquete a Tx Add_Bit0 EQU 0 CONTA_CORRIMIENTO EQU 0X50 ;Registro que almacena el # de ;corrimiento que se han realizado ;Mediante el cual se detecta cuando ;se termino el programa TOTAL_CORRIMIENTO EQU 0X51 ;Almacena el # total de corrimientos ;a realizarse en este caso: 16 DATO_1 EQU 0X53 ;Variable que almacenará el contenido del DATO_1 .... DATO_2 EQU 0X54 DATO_3 EQU 0X55 DATO_4 EQU 0x56 DATO_5 EQU 0X57 DATO_6 EQU 0X58 DATO_7 EQU 0X59 AGREGAR_BIT EQU 0X60 ;Variable para indicar si es necesario realizar operación ;XOR despues de los corrimientos TOTAL_CORRI_BYTE EQU 0X61 ;Variable que almacena el # total de corrimientos ;que se deben realizar antes de terminar de agregar ;en BUFFER un nuevo dato. el cual sera -->8 CONTA_CORRI_0 EQU 0X62 ;Contador de corrimientos efectuados para el DATO0 CONTA_CORRI_1 EQU 0X63 ;Contador de corrimientos efectuados para el DATO1 CONTA_CORRI_2 EQU 0X64 ;Contador de corrimientos efectuados para el DATO2 CONTA_CORRI_3 EQU 0X65 ;Contador de corrimientos efectuados para el DATO3 CONTA_CORRI_4 EQU 0X66 ;Contador de corrimientos efectuados para el DATO4 CONTA_CORRI_5 EQU 0X67 ;Contador de corrimientos efectuados para el DATO5 CONTA_CORRI_6 EQU 0X68 ;Contador de corrimientos efectuados para el DATO6 CONTA_CORRI_7 EQU 0X69 ;Contador de corrimientos efectuados para el DATO7 ;*************************************************************************************

Page 208: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-ii

; DECLARACION DE VARIABLES ; PARA EL FRECUENCIMETRO Y EL RELOJ DE TIEMPO REAL ;************************************************************************************* COUNT equ 0x3A ;Variable que guarda el valor del contador ;auxiliar para el reloj de tiempo real ;------------------------------------------------------------------------------------- ; BANDERAS ;------------------------------------------------------------------------------------- FRECUENCIA equ 0x3D ;Variable que almacenará la frecuencia medida ;con el Timer0 CUENTA_FREC equ 0x3E ;Variable que almacena el contador de interrup- ;ciones para controlar la actuaizacion de la ;variable FRECUENCIA TRANSFERENCIA equ 0x5A ;Variable que almacenará el valor de la trans- ;ferencia medida en el PORTA,<5> PORTE_AUX equ 0x5B ;Variable que almacena el valor del PORTE com- ;plementado CFE equ 0x5C ;Variable que almacenará la bandera de alimen- ;tación CFE RELOJ_TREAL equ 0x5D ;Resgistro de estado del reloj de tiempo real Flag_Reloj equ 0 ;Bandera indicadora del reloj Flag_CAD equ 1 ;Bandera indicadora de fin de Conversion A/D Flag_CRC_16 equ 3 ;Bandera incidcadora de termino del calculo del ;CRC_16 Flag_Tx equ 4 ;Bandera indicadora de Tx Flag_CFE equ 5 ;Bandera de estado de CFE Flag_Transferencia equ 6 ;Bandera de estado de Transferencia ;------------------------------------------------------------------------------------- ; PROGRAMA PRINCIPAL ;------------------------------------------------------------------------------------- ORG 0 ;Inicio en el vector de reset goto Inicio ;Va a la primera instrucción del ;programa ORG 0X04 ;VECTOR DE INTERRUPCION goto interrupcion ;Salva vector de interrupción ORG 0X05 Inicio bsf STATUS,RP0 ;Selecciona BANCO1 bcf STATUS,RP1 movlw b'11111111' ;W-->11111111 movwf PORTA ;Config. PORTA como entrada ;PORTA movlw b'00000000' ;W-->00000000 movwf PORTB ;Config. como salida al PORTB,C Y D movwf PORTC movwf PORTD bcf STATUS,RP0 ;Selecciona BANCO0 movlw b'00100000' movwf TOTALCANALES ;TOTALCANALES-->W clrf CONFIGCANAL ;CONFIGCANAL-->00000000 movlw b'00000001' ;W-->1 movwf INCCONT ;INCCONT-->W movlw b'00010100' ;W-->20 movwf MAXCONT ;MAXCONT-->W movlw b'11110001' ;W-->241=Caracter de inicio de paquete movwf FLAGINICIO ;FLAGINICIO-->W movlw b'11111111' ;W-->255=Caracter de fin de paquete movwf FLAGFIN ;FLAGFIN-->W movlw b'00001011' ;W-->11 movwf CUENTA_FREC ;CUENTA_FREC-->11 movlw b'00000001' ;W-->1 movwf FRECUENCIA ;FRECUENCIA-->1 ;------------------------------------------------------------------------------------- ; REALIZAR CONFIGURACIONES ENVIAR CARACTER ; DE INICIO DE PAQUETE (SINCRONIA CANAL) ;------------------------------------------------------------------------------------- call Config_Timer ;Configurar registros de los Timers call configusart_tx ;Configurar usart call Char_Inicio ;Enviar caracter de inico de paquete bsf STATUS,RP0 ;Selecciona BANCO1 ;------------------------------------------------------------------------------------- ; CONFIGURACION DEL MODULO A/D ;------------------------------------------------------------------------------------- ;Configurar los pines del portA como entradas analógicas(ADCON1 BNK1) ;Reloj de conversion adc seleccionado=Fosc/32 ; movlw b'00001110' ;W-->00001110=DDDDDDDA ; movlw b'00000000' ;W-->AAAAAAAA ;b'00000010' ;w-->00000010=DDDAAAAA, Configuracion de las ;entradas analogicas y digitales

Page 209: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-iii

;movlw b'00001001' ;W-->DDAAAAAA ;entradas analogicas y digitales movlw b'00001010' ;W-->DDAARAAA movwf ADCON0 ;Configura como entrada analo- ;gica el CH0=RA0 ;------------------------------------------------------------------------------------- ;Seleccionar el reloj de conversión (ADCON0 BNK0) ;------------------------------------------------------------------------------------- bcf STATUS,RP0 ;Selecciona BANCO0 NewCAD ;Revisar que RELOJ_TREAL<0>=1, para poder iniciar la adquisición de los datos see3 btfss RELOJ_TREAL,Flag_Reloj ; RELOJ_TREAL<0>=1?. Cuando sea 1 salta goto see3 ;Seleccionar el canal de entrada A/D (ADCON0 BNK0) ;CH0-->RA0 movf CONFIGCANAL,W ;W-->CONFIGCANAL (El cual inicialmente es CH0) movwf ADCON0 ;canal=CH0-->RA0 bsf ADCON0,ADCS1 ;Reloj=Fosc/32 ;Activar el modulo A/D (ADCON0 BNK0) <<ADON<0>>> bsf ADCON0,ADON ;Activa el modulo convertidor A/D ;------------------------------------------------------------------------------------- ; CONFIGURAR LAS INTERRUPCIONES DEL ADC ;------------------------------------------------------------------------------------- ;En este programa no se están usando las interrupciones ;------------------------------------------------------------------------------------- ; ESPERAR EL TIEMPO DE ADQUISICION ;------------------------------------------------------------------------------------- nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ;------------------------------------------------------------------------------------- ; INICIAR CONVERSION (ADCON0 BNK0) bit Go/Done ;------------------------------------------------------------------------------------- bsf ADCON0,GO_DONE ;Inicia la conversión ;------------------------------------------------------------------------------------- ; ESPERAR A QUE TERMINE LA CONVERSION ;------------------------------------------------------------------------------------- Loop btfss ADCON0,GO_DONE ;Termino la conversión ADC? goto Ver ;si, Visualizar el resultado goto Loop ;no, continuar revisando ;------------------------------------------------------------------------------------- ; VISUALIZAR ;------------------------------------------------------------------------------------- ;Ver el resultado en los registros ADRESH y ADRESL Ver bcf STATUS,RP0 ;Selecciona BANCO0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Para unir en un sólo registro los 8 bits menos significativos de la conversion ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; call Formar_Byte ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;************************************************************************************* ;** Para cargar el dato al registro de Tx ;************************************************************************************* call Transmitir_Usart ;************************************************************************************* bcf STATUS,RP0 ;Selecciona el banco0 ;Limpiar el bit ADIF bcf PIR1,ADIF ;Limpia el bit ADIF, Bandera de ;interrupción del ADC (BNK0) ;------------------------------------------------------------------------------------- ; Llamar las subrutina para el control de los canales ;-------------------------------------------------------------------------------------

Page 210: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-iv

call Checa_7 ;Ya llego al canal7(CH7)? goto NewCAD ;///////////////////////////////////////////////////////////////////////////////////// ;// SUBRUTINAS ;///////////////////////////////////////////////////////////////////////////////////// Formar_Byte bsf PORTD,Flag_CAD ;Activar bandera de fin de conversion A/D movf ADRESH,W ;ADRESH-->W movwf VALORH call Almacena_DATOTx return Maxima_Conversion movlw b'11111111' movwf VALORH return ;///////////////////////////////////////////////////////////////////////////////////// configusart_tx ;------------------------------------------------------------------------------------- ; CONFIGURACION DEL MODULO usart ;------------------------------------------------------------------------------------- Inicializar bsf STATUS,RP0 ;Selecciona el banco1 ;movlw b'00011001' movlw b'01100111' ;W-->103=01100111 movwf TXREG ;Cargamos SPBRG con un valor de ;103, para lograr un Baud Rate=2400Kb bsf RCSTA,BRGH ;TXSTA<BRGH=1>-->Para obtener un Baud ;Rate de alta velocidad ;------------------------------------------------------------------------------------- ;2 HABILITAR EL PUERTO ;------------------------------------------------------------------------------------- bcf RCSTA,SYNC ;Configuramos como modo asíncrono bcf STATUS,RP0 ;Seleccionamos el banco0 bsf RCSTA,SPEN ;SPEN=1-->Habilita el puerto serial ;------------------------------------------------------------------------------------- ;3 INTERRUPCIONES ;------------------------------------------------------------------------------------- ;No utiliza interrupciones bsf STATUS,RP0 ;Selecciona el banco1 ;------------------------------------------------------------------------------------- ;4 NO USAR BIT NUEVE ;------------------------------------------------------------------------------------- bcf RCSTA,TX9 ;Bit de habilitación del Tx del bit 9(paridad) ;------------------------------------------------------------------------------------- ;5 Habilitar la Tx ;------------------------------------------------------------------------------------- bsf RCSTA,TXEN ;Bit de habilitación de Tx=on return ;///////////////////////////////////////////////////////////////////////////////////// Transmitir_Usart bcf STATUS,RP0 ;Seleccionamos el banco0 ;------------------------------------------------------------------------------------- ; TOMAR EL VALOR A TRANSMITIR DEL REGISTRO VALORH ;------------------------------------------------------------------------------------- movf VALORH,W ;W-->VALORH movwf VALORTX ;Guarda el valor ingresado a través del PORTA a ser ;transmitido en VALORTX ;------------------------------------------------------------------------------------- ;7 CARGAR LOS DATOS AL REGISTRO TXREG (INICIAR TRANSMISION) ;------------------------------------------------------------------------------------- ;Revisa RELOJ_TREAL<0>=0? see2 btfsc RELOJ_TREAL,Flag_Reloj ;RELOJ_TREAL<0>=0? .Cuando sea 0 salta goto see2 ;Checamos si TXSTA<1>=TRMT=1, lo cual indica que TSR, esta vacio y listo ;para tx otro dato bsf STATUS,RP0 ;Selecciona el banco1 ciclo btfss RCSTA,TRMT ;TSR esta vacio? goto ciclo ;si la respuesta es no, regresa a ciclo bcf STATUS,RP0 ;Selecciona el banco0 movf VALORTX,W ;W-->VALORTX a tranmitir movwf TXREG ;TXREG-->W, lo cual inicia la TX

Page 211: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-v

;Activa la bandera de Transmision PORTD<4>=Flag_Tx bsf PORTD,Flag_Tx ;Indica que termino la Tx return ;///////////////////////////////////////////////////////////////////////////////////// Char_Inicio bcf STATUS,RP0 ;Selecciona BANCO0 ;Revisar que RELOJ_TREAL<0> sea 1 para iniciar operaciones call Reloj_High movf FLAGINICIO,W ;W-->FLAGINICIO movwf VALORH ;VALORH-->W call Transmitir_Usart return ;///////////////////////////////////////////////////////////////////////////////////// Char_Fin bcf STATUS,RP0 ;Selecciona BANCO0 ;Revisar que RELOJ_TREAL<0> sea 1 para iniciar operaciones call Reloj_High movf FLAGFIN,W ;W-->FLAGFIN movwf VALORH ;VALORH-->W call Transmitir_Usart return ;///////////////////////////////////////////////////////////////////////////////////// Checa_7 bcf STATUS,RP0 ;Selecciona BANCO0 ;movlw b'00101000' ;Para usar 6 canales analógicos, del 0 al 5 ;Para usar los 7 canales. b'00010000' ;W-->2 ;movlw b'00001000' movf TOTALCANALES,W ;W-->TOTALCANALES=Usar del 5 canales (0 al 5) subwf CONFIGCANAL,W ;W-->W-CONFIGCANAL=7-CONFIGCANAL btfsc STATUS,Z ;Es uno? goto r0 ;No, tomar el siguiente canal call Next_Canal goto r1 r0 call Reiniciar_Canales ;Si, que regrese al canal1(CH1) r1 return ;///////////////////////////////////////////////////////////////////////////////////// Reiniciar_Canales bcf STATUS,RP0 ;Selecciona BANCO0 ;------------------------------------------------------------------------------------- clrf CONFIGCANAL ;CONFIGCANAL-->W=1 (CH0) ;------------------------------------------------------------------------------------- ; ENVIAR CARACTER DE FIN DE PAQUETE (SINCRONIA CANAL) ;------------------------------------------------------------------------------------- call CFE_Tx ;Transmitir CFE call Transferencia_Tx ;Transmitir la transferencia call Frecuencia_Tx ;Transmitir la frecuencia medida call Calcular_CRC_16 ;------------------------------------------------------------------------------------- ; ENVIAR CARACTER DE INICIO DE PAQUETE (SINCRONIA CANAL) ;------------------------------------------------------------------------------------- call Char_Inicio return ;///////////////////////////////////////////////////////////////////////////////////// Next_Canal bcf STATUS,RP0 ;Selecciona BANCO0 movlw b'00001000' ;W-->00001000=8 addwf CONFIGCANAL,F ;CONFIGCANAL=CONFIGCANAL+1 movlw b'00011000' subwf CONFIGCANAL,W btfsc STATUS,Z call Toma_Canal4 return ;///////////////////////////////////////////////////////////////////////////////////// Toma_Canal4 movlw b'00001000' ;W-->00001000=8 addwf CONFIGCANAL,F ;CONFIGCANAL=CONFIGCANAL+1 return ;///////////////////////////////////////////////////////////////////////////////////// Almacena_DATOTx ;Localizar el canal

Page 212: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-vi

movlw b'00000000' ;W-->Canal0 subwf CONFIGCANAL,W ;W-->CONFIGCANAL-W btfsc STATUS,Z ;Z=0?. Salta call Carga_D1 movlw b'00001000' ;W-->Canal1 subwf CONFIGCANAL,W ;W-->CONFIGCANAL-W btfsc STATUS,Z ;Z=0?. Salta call Carga_D2 movlw b'00010000' ;W-->Canal2 subwf CONFIGCANAL,W ;W-->CONFIGCANAL-W btfsc STATUS,Z ;Z=0?. Salta call Carga_D3 movlw b'00100000' ;W-->Canal3 subwf CONFIGCANAL,W ;W-->CONFIGCANAL-W btfsc STATUS,Z ;Z=0?. Salta call Carga_D4 return ;///////////////////////////////////////////////////////////////////////////////////// Carga_D1 movf VALORH,W movwf DATO_1 ;DATO1-->W return ;///////////////////////////////////////////////////////////////////////////////////// Carga_D2 movf VALORH,W movwf DATO_2 ;DATO2-->W return ;///////////////////////////////////////////////////////////////////////////////////// Carga_D3 movf VALORH,W movwf DATO_3 ;DATO3-->W return ;///////////////////////////////////////////////////////////////////////////////////// Carga_D4 movf VALORH,W movwf DATO_4 ;DATO4-->W return ;///////////////////////////////////////////////////////////////////////////////////// Calcular_CRC_16 ;------------------------------------------------------------------------------------- ; INICIALIZAR LAS VARIABLES A USAR PARA EL CRC_16 ;------------------------------------------------------------------------------------- bcf STATUS,RP0 ;Selecciona Banco0 ;CRC_1 y CRC_0, almacenan los 16 ceros a agregar para calcular el CRC. clrf CRC_1 ;CRC_1-->00000000 clrf CRC_0 ;CRC_0-->00000000 clrf AGREGAR_BIT ;AGREGAR_BIT-->00000000 ;HACER DAT0_0=DATA_HIGH=Caracter de inicio movf FLAGINICIO,W ;W-->FLAGINICIO movwf DATA_HIGH ;DATA_HIGH-->W movf DATO_1,W ;W-->DATO_1 movwf DATA_LOW ;DATA_LOW-->W movf DATO_2,W ;W-->DATO_2 movwf BUFFER ;BUFFER-->W movlw b'10000000' ;W-->10000000. Polinomio generador del movwf Px_GENERADOR_1 ;CRC_16. Px_GENERADOR_1-->W-->10000000 movlw b'00000101' ;W-->00000101 movwf Px_GENERADOR_0 ;Px_GENERADOR_0-->W movf Px_GENERADOR_1,W ;W-->Px_GENERADOR_1 movwf XOR0_1 ;XOR0_1-->W-->10000000 movf Px_GENERADOR_0,W ;W-->Px_GENERADOR_0 movwf XOR0_0 ;XOR0_0-->W-->00000101 movlw b'01001000' ;W-->72. 16 ceros+ 7 canales=72 corrimientos movwf TOTAL_CORRIMIENTO ;TOTAL_CORRIMIENTO-->W-->00001000-->16 clrf CONTA_CORRIMIENTO ;CONTA_CORRIMIENTO-->00000000 movlw b'00001000' ;W-->8 movwf TOTAL_CORRI_BYTE ;TOTAL_CORRI_BYTE-->W

Page 213: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-vii

movlw b'00001000' ;W-->8 movwf CONTA_CORRI_0 ;CONTA_CORRI_0-->W movlw b'00010000' ;W-->16 movwf CONTA_CORRI_1 ;CONTA_CORRI_1-->W movlw b'00011000' ;W-->24 movwf CONTA_CORRI_2 ;CONTA_CORRI_2-->W movlw b'00100000' ;W-->32 movwf CONTA_CORRI_3 ;CONTA_CORRI_3-->W movlw b'00101000' ;W-->40 movwf CONTA_CORRI_4 ;CONTA_CORRI_4-->W movlw b'00110000' ;W-->48 movwf CONTA_CORRI_5 ;CONTA_CORRI_5-->W movlw b'00111000' ;W-->56 movwf CONTA_CORRI_6 ;CONTA_CORRI_6-->W movlw b'01000000' ;W-->64 movwf CONTA_CORRI_7 ;CONTA_CORRI_7-->W ;;;;;;;;;; PROGRAMA crc_16 ;;;;;;;;;;;;;;;;;;;;;; rlf DATA_HIGH,F ;DATA_HIGH-->1000100? rlf DATA_LOW,F ;DATA_LOW -->0100011? ;C=1?.Salta. C (Del DATA_LOW) btfss STATUS,C ;C=1?. Salta goto Jmp0 ;DLC_FUE_UNO bsf DATA_HIGH,Add_Bit0 ;DATA_HIGH-->B6B5B4B3B2B1B0(1) goto Jmp1 Jmp0 ;DLC_FUE_CERO bcf DATA_HIGH,Add_Bit0 ;DATA_HIGH-->B6B5B4B3B2B1B0(0) Jmp1 rlf BUFFER,F ;BUFFER-->0000000X incf CONTA_CORRIMIENTO,F ;CONTA_CORRIMIENTO=CONTA_CORRIMIENTO+1 ;C=1.Salta. C (Del BUFFER) btfss STATUS,C ;C=?. Salta goto Jmp2 ;BUFC_FUE_UNO bsf DATA_LOW,Add_Bit0 ;DATA_LOW-->B6B5B4B3B2B1B0(1) goto Jmp3 Jmp2 ;BUFC_FUE_CERO bcf DATA_LOW,Add_Bit0 ;DATA_LOW-->B6B5B4B3B2B1B0(0) Jmp3 ;REALIZA LA PRIMERA OPERACION XOR movf DATA_HIGH,W ;W-->DATA_HIGH xorwf XOR0_1,F ;XOR0_1-->XOR0_1 (XOR) W movf DATA_LOW,W ;W-->DATA_LOW xorwf XOR0_0,F ;XOR0_0-->XOR0_0 (XOR) W ;MOVER PUNTERO OTRO rlf XOR0_1,F ;XOR0_1-->0001000? ;C=1?. Salta (Del XOR0_1) btfss STATUS,C ;C=1?. Salta goto Jmp20 ;Agregar_Bit_SI bsf AGREGAR_BIT,0 goto Jmp21 Jmp20 ;Agregar_Bit_NO bcf AGREGAR_BIT,0 Jmp21 call Realizar_Corrimientos ;Operación XOR btfss AGREGAR_BIT,0 ;Salta si es 1? goto No_Xor call Realizar_XOR No_Xor ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;MANEJO DE LOS BYTES DE DATOS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_0,W ;W-->CONTA_CORRI_0-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT3 movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_1,W ;W-->CONTA_CORRI_1-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT4

Page 214: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-viii

movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_2,W ;W-->CONTA_CORRI_2-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT5 movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_3,W ;W-->CONTA_CORRI_3-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT6 movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_4,W ;W-->CONTA_CORRI_4-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT7 movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_5,W ;W-->CONTA_CORRI_5-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT8 movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_6,W ;W-->CONTA_CORRI_6-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT9 movf CONTA_CORRIMIENTO,W ;W-->CONTA_CORRIMIENTO subwf CONTA_CORRI_7,W ;W-->CONTA_CORRI_7-1 btfsc STATUS,Z ;Z=0?. Salta call Carga_DT10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;PREGUNTAR SI YA SE CUMPLIERON EL TOTAL DE TODOS LOS CORRIMIENTOS movf CONTA_CORRIMIENTO,W ;W-->TOTAL_CORRIMIENTO subwf TOTAL_CORRIMIENTO,W ;W-->TOTAL_CORRIMIENTO-W btfss STATUS,Z ;Cuando Z=1?. Salta goto OTRO bsf PORTD,Flag_CRC_16 ;Activar bandera fin CRC_16 ;Transmitir las variables que contienen el valor del CRC_16 ;Revisar que RELOJ_TREAL<0> sea 1 para iniciar operacion call Reloj_High movf XOR0_1,W ;W-->XOR0_1 movwf VALORH ;VALORH-->W call Transmitir_Usart ;Revisar que RELOJ_TREAL<0> sea 1 para iniciar las operaciones call Reloj_High movf XOR0_0,W ;W-->XOR0_0 movwf VALORH ;VALORH-->W call Transmitir_Usart call Char_Fin return ;--------------------------------------------------------- ; SUBRUTINAS DEL CRC_16 ;--------------------------------------------------------- ;///////////// Realizar_Corrimientos ;///////////// rlf XOR0_0,F ;XOR0_0-->1100000? ;C=1?. Salta (DEL XOR0_0) btfss STATUS,C ;C=1?. Salta goto Jmp4 ;XOR00_FUE_UNO bsf XOR0_1,Add_Bit0 ;XOR0_1-->B6B5B4B3B2B1B0(1) goto Jmp5 Jmp4 ;XR00_FUE_CERO bcf XOR0_1,Add_Bit0 ;XOR0_1-->B6B5B4B3B2B1B0(0) Jmp5 ;AGREGAR BIT rlf DATA_HIGH,F ;DATA_HIGH-->0000100? rlf DATA_LOW,F ;DATA_LOW -->1100000? ;C=1?. Salta (DEL DATA_LOW) btfss STATUS,C ;C=1?. Salta goto Jmp6 ;DLC_FUE_UNO bsf DATA_HIGH,Add_Bit0 ;DATA_HIGH-->B6B5B4B3B2B1B0(1) goto Jmp7 Jmp6 ;DLC_FUE_CERO bcf DATA_HIGH,Add_Bit0 ;DATA_HIGH-->B6B5B4B3B2B1B0(0) Jmp7 rlf BUFFER,F ;BUFFER-->00XXXXXX incf CONTA_CORRIMIENTO,F ;CONTA_CORRIMIENTO=CONTA_CORRIMIENTO+1

Page 215: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-ix

;C=1?. Salta (DEL BUFFER) btfss STATUS,C ;C=1?. Salta goto Jmp8 ;BUFC_FUE_UNO bsf DATA_LOW,Add_Bit0 ;DATA_LOW-->B6B5B4B3B2B1B0(1) goto Jmp9 Jmp8 ;BUFC_FUE_CERO bcf DATA_LOW,Add_Bit0 ;DATA_LOW-->B6B5B4B3B2B1B0(0) Jmp9 ;CHECAR DATA_LOW,<0>=1 o 0? btfss DATA_LOW,Add_Bit0 goto Jmp10 ;DL0_FUE_UNO bsf XOR0_0,Add_Bit0 ;XOR0_0-->B6B5B4B3B2B1B0(1) goto Jmp11 Jmp10 ;DL0_FUE_CERO bcf XOR0_0,Add_Bit0 ;XOR0_0-->B6B5B4B3B2B1B0(0) Jmp11 return ;///////////// Realizar_XOR ;REALIZAR XOR movf Px_GENERADOR_1,W ;W-->Px_GENERADOR_1 xorwf XOR0_1,F ;XOR0_1-->XOR0_1 (XOR) W movf Px_GENERADOR_0,W ;W-->Px_GENERADOR_0 xorwf XOR0_0,F ;XOR0_0-->XOR0_0 (XOR) W return ;//////////// Carga_DT3 movf DATO_3,W ;W-->DATO_3 movwf BUFFER ;BUFFER-->W return Carga_DT4 movf DATO_4,W ;W-->DATO_4 movwf BUFFER ;BUFFER-->W return Carga_DT5 movf DATO_5,W ;W-->DATO_5 movwf BUFFER ;BUFFER-->W return Carga_DT6 movf DATO_6,W ;W-->DATO_6 movwf BUFFER ;BUFFER-->W return Carga_DT7 movf DATO_7,W ;W-->DATO_7 movwf BUFFER ;BUFFER-->W return Carga_DT8 movf FLAGFIN,W movwf BUFFER ;BUFFER-->W return Carga_DT9 movf CRC_1,W ;W-->CRC_1 movwf BUFFER ;BUFFER-->W return Carga_DT10 movf CRC_0,W ;W-->CRC_0 movwf BUFFER ;BUFFER-->W return CONTA_TERMINO movf XOR0_1,W ;W-->XOR0_1 movwf CRC_1 ;CRC-->W movwf PORTB ;Ver CRC en PORTB return ;--------------------------------------------------------------------------------------- ; TRANSMITIR Y ALMACENAR LA FRECUENCIA MEDIDA ;--------------------------------------------------------------------------------------- Frecuencia_Tx bcf STATUS,RP0 ;Selecciona BANCO0 ;Revisar que RELOJ_TREAL<0> sea 1 para iniciar operaciones call Reloj_High movf FRECUENCIA,W ;W-->FRECUENCIA movwf DATO_7 ;DATO_7--> FRECUENCIA. Almacena la frecuencia

Page 216: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-x

movwf VALORH ;VALORH-->Frecuencia para ser Tx call Transmitir_Usart bcf STATUS,RP0 ;Selecciona BANCO0 return ;--------------------------------------------------------------------------------------- ; TRANSMITIR Y ALMACENAR C.F.E. ;--------------------------------------------------------------------------------------- CFE_Tx bcf STATUS,RP0 ;selecciona BANCO0 ;Revisar que RELOJ_TREAL<0> sea 1 para inciar operaciones call Reloj_High movf PORTE,W movwf PORTE_AUX ;PORTE_AUX-->W btfsc PORTE_AUX,1 ;CFE<1>=0?. Entonces salta goto PORTE_1_CFE call PORTE_CFE_0 goto PORTE_0_CFE PORTE_1_CFE call PORTE_CFE_1 PORTE_0_CFE movf CFE,W ;W-->CFE movwf DATO_5 ;DATO_7-->CFE. Almacena CFE movwf VALORH ;VALORH-->CFE para ser Tx call Transmitir_Usart bcf STATUS,RP0 ;Selecciona BANCO0 return PORTE_CFE_0 clrf CFE ;CFE-->0 ;bcf PORTD,5 bcf PORTD,Flag_CFE return PORTE_CFE_1 ;bsf PORTD,5 bsf PORTD,Flag_CFE movlw b'00000001' ;W-->1 movwf CFE ;CFE-->W return ;--------------------------------------------------------------------------------------- ; TRANSMITIR Y ALMACENAR LA TRANSFERENCIA DEL SISTEMA ;--------------------------------------------------------------------------------------- Transferencia_Tx bcf STATUS,RP0 ;selecciona BANCO0 ;Revisar que RELOJ_TREAL<0> sea 1 para inciar operaciones call Reloj_High movf PORTE,W movwf PORTE_AUX ;PORTE_AUX-->W btfsc PORTE_AUX,2 ;TRANSFERENCIA<2>=0?. Entonces salta goto PORTE_1 call PORTE_Trans_0 goto PORTE_0 PORTE_1 call PORTE_Trans_1 PORTE_0 movf TRANSFERENCIA,W ;W-->TRANSFERENCIA movwf DATO_6 ;DATO_7--> TRANSFERENCIA. Almacena la TRANSFERENCIA movwf VALORH ;VALORH-->Transferencia para ser Tx call Transmitir_Usart bcf STATUS,RP0 ;Selecciona BANCO0 return PORTE_Trans_0 clrf TRANSFERENCIA ;TRANSFERENCIA-->0 ;bcf PORTD,6 bcf PORTD,Flag_Transferencia return PORTE_Trans_1 ;bsf PORTD,6 bsf PORTD,Flag_Transferencia movlw b'00000001' ;W-->1 movwf TRANSFERENCIA ;TRANSFERENCIA-->W return ;--------------------------------------------------------------------------------------- ; CONFIGURA TIMER1 PARA EL RELOJ DE TIEMPO REAL ;---------------------------------------------------------------------------------------

Page 217: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-xi

Config_Timer bsf STATUS,RP0 ;Selecciona BNK1 movlw b'11111000' ;Desactiva las resistencias PULL-UP del PORTB ;Flanco ascendente de interrupción externa ;Pulsos introducidos en el TOCK1 (Contador) ;Incrementa TMR0 cada flanco descendente ;Se le asigna el divisor al WDT(Perro Guardián) movwf TMR0 bcf STATUS,RP0 ;BNK0 movlw b'00000010' ;b'00000010' ;W-->2 movwf COUNT ;COUNT-->W=2 ;;;movlw b'00110001' movlw b'00110000' movwf T1CON ;Configurar TIMER1. Prediv=8, TIMER=on movlw b'11101001' movwf TMR1H ;Se carga TMR1H:TMR1L = 59854 = 1110 1001 1100 1110 movlw b'11001110' movwf TMR1L movlw b'11000000' ;W-->11000000 movwf INTCON ;Permite las interrupciones Globales y las que no ;están contenidas en INTCON clrf PIR1 ;Limpia registro de banderas bcf PIR1,TMR1IF ;Limpia bandera de interrupcion del timer1 ;;;; bsf T1CON,0 ;Timer1=ON ;;;; bsf STATUS,RP0 ;selecciona BNK1 clrf PIR1 ;Deshabilita todas las interrupciones bsf PIR1,TMR1IE ;Permite la interrupción por desbordamiento del timer1 bcf STATUS,RP0 ;Selecciona BNK0 clrf PORTB clrf PORTD bcf STATUS,RP0 ;Selecciona BNK0 return ;--------------------------------------------------------------------------------------- ; SUBRUTINAS DE CONTROL DEL TIEMPO DE TX , POR MEDIO ; DEL RELOJ DE TIEMPO REAL ;--------------------------------------------------------------------------------------- Reloj_High ;Revisar que RELOJ_TREAL<0>=1, para poder continuar see4 btfss RELOJ_TREAL,Flag_Reloj ;RELOJ_TREAL<0>=1?. Cuando sea 1 salta goto see4 return ;*************************************************************************************** ; INTERRUPCION ;*************************************************************************************** interrupcion bsf PORTD,2 decfsz COUNT,1 ;RSI. Decrementa COUNT y brinca si =0 goto seguir Count_0 movlw b'00000010' ;W-->2 movwf COUNT ;Recarga el valor incial de Count-->2 ;btfsc PORTD,0 ;Flag_Reloj=0?. Entonces Salta btfsc RELOJ_TREAL,Flag_Reloj ;Flag_Reloj=0?. Entonces Salta goto rd0_1 bsf PORTD,Flag_Reloj bsf RELOJ_TREAL,Flag_Reloj bcf PORTD,Flag_Tx ;Limpia bandera de Tx goto seguir rd0_1 bcf PORTD,Flag_Reloj ;Limpia bandera de Reloj bcf RELOJ_TREAL,Flag_Reloj ;Limpia registro de estado del reloj bcf PORTD,Flag_Tx ;Limpia bandera de Tx bcf PORTD,Flag_CAD ;Limpia bandera de Conversión A/D bcf PORTD,Flag_CRC_16 ;Limpia bandera de CRC_16 ;Probamos que ya hayan transcurrido 11 interrupciones para actualizar ;el valor medido de la frecuencia decfsz CUENTA_FREC,1 ;Decrementa una unidad y salta si =0 goto seguir ;Ver lo que tiene TMRO_OPTION en el PORTB clrf PORTB ;Limpia PORTB

Page 218: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

II-xii

movf TMR0,W ;W-->TMR0 movwf FRECUENCIA ;FRECUENCIA-->W movwf PORTB ;PORTB-->W clrf TMR0 ;Limpia el registro de TMR0 movlw b'00001011' ;W-->11 movwf CUENTA_FREC ;CUENTA_FREC-->W seguir movlw b'00110001' movwf T1CON ;Configurar TIMER1. Prediv=8, TIMER=on movlw b'11101001' movwf TMR1H ;Se carga TMR1H:TMR1L = 59854 = 1110 1001 1100 1110 movlw b'11001110' movwf TMR1L movlw b'11000000' ;W-->11000000 movwf INTCON ;Permite las interrupciones Globales y las que no ;están contenidas en INTCON bcf PIR1,TMR1IF ;Limpia bandera de interrupcion del timer1 bsf STATUS,RP0 ;Selecciona BNK1 clrf PIR1 ;Limpia registro de banderas bsf PIR1,TMR1IE ;Permite la interrupción por desbordamiento del timer1 bcf STATUS,RP0 ;Selecciona BNK0 bcf PORTD,2 retfie end ;/////////////////////////////////////////////////////////////////////////////////////

Page 219: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-i

ANEXO III. PROGRAMA PARA LA RECEPCIÓN DE LOS DATOS (C++)

// PROGRAMA QUE UTILIZA EL MÉTODO DE POLLING, PARA CONTROLAR LA UART DE UNA PC //Este programa recibe un paquete de datos de 7 canales + 2 caracteres de inico // y fin de paquete + 2 caracteres correspondientes al CRC_16 //Además genera los archivos binarios correspondientes a los 7 canales de //DATOS recibidos. //Realiza el filtrado digital //Además realiza el chequeo de error empleando el polinomio generador del CRC_16 #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <iostream.h> #include <ctype.h> #include <bios.h> #include <time.h> int chrt; int BB; int DATO; void Elegir_PUERTO_COM(); void Configurar_PtoSerial(); void Configurar_COM1(); void Configurar_COM2(); void Configurar_COM3(); void Configurar_COM4(); void Leer_Dato(); void Leer_COM1(); void Leer_COM2(); void Leer_COM3(); void Leer_COM4(); //Filtros //Orden del filtro #define M 16 int Channel=0; unsigned int i,j, posicion=0; int CantidadCanales=9; int CuentaCanal; //El numero de canales es 7 + los caracteres de inicio y fin de paquete, //los 2 caracteres del CRC_16 int PaqueteDATO[9]; int PaqueteDATO_Anterior[9]; //int vector[32767-->Maxima Dimension de un arreglo]; //define el # de datos por segundo #define NumDatos 60 //define el # de segundos a graficar #define NumSegundos 720 int BANDERA=0; //Funciones que almacenan los datos por minuto int huge CANAL0[NumDatos]; int huge CANAL1[NumDatos]; int huge CANAL2[NumDatos]; int huge CANAL3[NumDatos]; int huge CANAL4[NumDatos]; int huge CANAL5[NumDatos]; int huge CANAL6[NumDatos]; int huge IN_NOT_FILTER[NumDatos]; //Funciones de almacenamiento void Almacenar_CH0(); void Almacenar_CH1(); void Almacenar_CH2(); void Almacenar_CH3(); void Almacenar_CH4(); void Almacenar_CH5(); void Almacenar_CH6(); double SALIDA0=0,SALIDA1=0,SALIDA2=0,SALIDA3=0; double Xn0[M],Xn1[M],Xn2[M],Xn3[M]; double Yn0[M],Yn1[M],Yn2[M],Yn3[M]; double A[M],B[M]; void Menu_FPB(); //Coeficientes de los filtros void Coeficientes_FPB_Butterworth_1(); void Menu_Filtrar(); void Calcular_Yn0(); void Calcular_Yn1(); void Calcular_Yn2(); void Calcular_Yn3(); int N=M;

Page 220: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-ii

void Hacer_Corrimientos_Entrada_Salida(); void Hacer_Corri_Entrada_Salida1(); void Hacer_Corri_Entrada_Salida2(); void Hacer_Corri_Entrada_Salida3(); //Define la direcci¢n base del puerto COM #define PORT1 0X3F8 #define PORT2 0x2F8 #define PORT3 0x3E8 #define PORT4 0x2E8 char COMX='D';//Para que tome por default el COM4 //Direcciones para el puerto serie //COM1 0x3F8 //COM2 0x2F8 //COM3 0X3E8 //COM4 0X2E8 //Variables MENU FPB char opcion=0; //VARIABLES PARA LA GENERACION DE LOS ARCHIVOS BINARIOS POR CANAL struct mystruct int i; ; struct mystruct s; int Generar_ArchiBin_CH0();int Generar_ArchiBin_CH1();int Generar_ArchiBin_CH2(); int Generar_ArchiBin_CH3();int Generar_ArchiBin_CH4();int Generar_ArchiBin_CH5(); int Generar_ArchiBin_CH6(); int Borrar_ArchiBin(); int Generar_ArchiBin_Entrada_SinFiltrar(); //Variable global que se encargara de controlar la generaci¢n del archivo binario long Count=1,Count1=1,Count2=1,Count3=1,Count4=1,Count5=1,Count6=1,Count7=1; long Count8=1,Count9=1; //Variables para el corrimineto del archivo binario int LongRegistro=sizeof(s); long LongArchivo; //************************************************************ //VARIABLES A UTILIZAR PARA REALIZAR EL CHEQUEO DE ERROR(CRC) //************************************************************ unsigned char Px_GENERADOR_1,Px_GENERADOR_0,DATA_HIGH,DATA_LOW,BUFFER; unsigned char CONTA_CORRIMIENTO,CONTA_CORRI_0,CONTA_CORRI_1,CONTA_CORRI_2; unsigned char XOR0_1,XOR0_0,CRC_1,CRC_0; unsigned char Bit7_DL,Bit7_BUFF; unsigned char MASCARA_BIT7=128; //10000000 unsigned char MASCARA_BIT0=1; //00000001 unsigned char MASCARA_BIT0_NO=254; //11111110 unsigned char Bit7_XOR0_1,Bit7_XOR0_0; unsigned char DATO_0,DATO_1,DATO_2,DATO_3,DATO_4,DATO_5,DATO_6,DATO_7; unsigned char DATO_8,DATO_9,DATO_10,TOTAL_CORRIMIENTO,Bit0_DL; unsigned char CHAR_INICIO=241; unsigned char CHAR_FIN=255; void Operaciones(); void Calcular_CRC_16(); int Generar_ArchiBin_Errores(); int Generar_ArchiBin_Ceros(); int ContaErrores=0; int ContaCeros=0; void Almacena_PaqueteDATO_Anterior(); void Toma_PaqueteDATO_Anterior(); //Variables para el biostime long bios_time; double Tseg_Anterior,Tseg; double Tseg_Anterior1,Tseg1; int BANDERA_CARACTER_NORx=0; void Toma_PaqueteDATO_Ceros(); //Programa Principal void main() int i; clrscr(); //Elegir el puerto COM a utilizar do Elegir_PUERTO_COM(); while(opcion !=27); printf("\nPuerto elegido=----->%c\n",COMX); //getch(); Configurar_PtoSerial(); Borrar_ArchiBin(); //Filtro por default Coeficientes_FPB_Butterworth_1();

Page 221: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-iii

printf("Corriendo"); Again: printf("\nTseg_Anterior1=%.4f Tseg=%.4f bios_time=%lu CLK_TCK=%4f\n",Tseg_Anterior1,Tseg,bios_time,CLK_TCK); // getch(); //Mientras no se reciba el caracter de sincronia de canales //no continuar con el programa do //Again:Leer_Dato(); Leer_Dato(); //Si salio de la funcion Leer_Dato, debido a que no recibio nada //Entonces que tome el paquete de ceros y regrese a tomar un nuevo tiempo //Anterior //printf(" DEspues del DO while"); if (BANDERA_CARACTER_NORx==1) printf("\nNO SE RECIBIO NADA--******----****--PAQUETE CEROS\n"); printf(">>>>>> NORx=%d <<<<<<<",BANDERA_CARACTER_NORx); ContaErrores=ContaErrores+1; ContaCeros=ContaCeros+1; Toma_PaqueteDATO_Ceros(); BANDERA_CARACTER_NORx=0; goto Continue; while(DATO!=CHAR_INICIO); //getch(); //Formar el paquete de informaci¢n CuentaCanal=0; do Leer_Dato(); if (BANDERA_CARACTER_NORx==1) printf("\nNO SE RECIBIO NADAII--******----****--PAQUETE CEROS\n"); //printf(">>>>>> NORx=%d <<<<<<<",BANDERA_CARACTER_NORx); Toma_PaqueteDATO_Ceros(); ContaErrores=ContaErrores+1; ContaCeros=ContaCeros+1; BANDERA_CARACTER_NORx=0; goto Continue; //Checar cuando se recibe el caracter de fin de paquete if((DATO==CHAR_FIN)&&(CuentaCanal>=CantidadCanales)) //Checar que el PaqueteDATO[4 y 5] sean 1 o 0 if (((PaqueteDATO[4]==0)||(PaqueteDATO[4]==1))&&((PaqueteDATO[5]==0)||(PaqueteDATO[5]==1))) printf("\nPaquete Completado--->COMPLETO>\n"); Calcular_CRC_16(); //Checar el resultado obtenido del calculo del CRC_16 if((XOR0_1==0) && (XOR0_0==0)) printf("\nPaquete --->BUENO CRC"); Almacena_PaqueteDATO_Anterior(); else //Error de integridad de los datos printf("\nPaquete --->ERROR!"); ContaErrores=ContaErrores+1; //En caso de existir algun error en los datos toma el ultimo paquete //de DATO correcto Toma_PaqueteDATO_Anterior(); printf("\n---------------------\n"); goto Continue; else ContaErrores=ContaErrores+1; Toma_PaqueteDATO_Anterior(); goto Continue; //Error de sincronia //Si ya llegaron todos los datos y el £ltimo recibido no es el caracter de //fin de paquete, entonces existe un error if((DATO!=CHAR_FIN)&&(CuentaCanal>=CantidadCanales)) printf("Error RECIBIDO!!!=%d\n",DATO); ContaErrores=ContaErrores+1; Toma_PaqueteDATO_Anterior(); goto Continue;

Page 222: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-iv

PaqueteDATO[CuentaCanal]=DATO; CuentaCanal=CuentaCanal+1; while(CuentaCanal<=CantidadCanales); do Continue:Menu_Filtrar(); Channel=Channel+1; if(Channel>=CantidadCanales-2)//Menos los 2 caracteres del CRC Channel=0; posicion=posicion+1; if(posicion>=NumDatos) posicion=0; //Generar los archivos Generar_ArchiBin_CH0(); Generar_ArchiBin_CH1(); Generar_ArchiBin_CH2(); Generar_ArchiBin_CH3(); Generar_ArchiBin_CH4(); Generar_ArchiBin_CH5(); Generar_ArchiBin_CH6(); Generar_ArchiBin_Errores(); Generar_ArchiBin_Entrada_SinFiltrar(); Generar_ArchiBin_Ceros(); printf("\n-->>><>>>>>ContaErrores=%d",ContaErrores); printf("\n--/*/*/----ContaCeros=%d",ContaCeros); //getch(); ContaErrores=0; ContaCeros=0; goto Again; while(!kbhit()); //Mientras no se presione una tecla //Fin del programa principal void Elegir_PUERTO_COM() cout<<"\n\n MEN£ PUERTO COM \n\n"; cout<<"Seleccionar puerto COMX a utilizar:\n\n"; cout<<"A.-COM1 (0x3F8)\n"; cout<<"B.-COM2 (0X2F8)\n"; cout<<"C.-COM3 (0X3E8)\n"; cout<<"D.-COM4 (0X2E8)\n"; cout<<"ESC.-Salir-->\n\n"; opcion=toupper(getche()); switch(opcion) case 'A': COMX='A'; break; case 'B': COMX='B'; break; case 'C': COMX='C'; break; case 'D': COMX='D'; break; void Configurar_PtoSerial() switch(COMX) case 'A': Configurar_COM1(); break; case 'B': Configurar_COM2(); break; case 'C': Configurar_COM3(); break; case 'D': Configurar_COM4(); break; void Configurar_COM1() //PORT1+1-->Registro <IER>

Page 223: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-v

outportb(PORT1+1,0); //Apagar interrupciones -PORT1- /* PORT1 - Estableciendo la Comunicaci¢n */ //PORT1+3-->Register <LCR> outportb(PORT1+3,0X80); //Establecer DLAB //PORT1+0-->Registro <DLAB> outportb(PORT1+0,0X30); //Establecer Baud Rate- Divisor Latch Low Byte //Default 0x03=38,400 bps // 0x01=115,200 bps // 0x02=56,700 bps // 0x06=19,200 bps // 0x0C=9,600 bps // 0x18=4,800 bps // 0x30=2,400 bps //PORT1+1-->Registro <IER> outportb(PORT1+1,0X00); //Establecer Baud Rate - Divisor Latch High Byte //PORT1+3-->Registro <LCR> outportb(PORT1+3,0X03); //8 bits, sin paridad, 1 Bit de Stop //PORT1+2-->Registro <FCR> outportb(PORT1+2,0XC7); //Registro de control FIFO //PORT1+4-->Registro <MCR> outportb(PORT1+4,0X0B); //Activar DTR, RTS, y OUT2 void Configurar_COM2() //PORT1+1-->Registro <IER> outportb(PORT2+1,0); //Apagar interrupciones -PORT1- /* PORT1 - Estableciendo la Comunicaci¢n */ //PORT1+3-->Register <LCR> outportb(PORT2+3,0X80); //Establecer DLAB //PORT1+0-->Registro <DLAB> outportb(PORT2+0,0X30); //Establecer Baud Rate- Divisor Latch Low Byte //Default 0x03=38,400 bps // 0x01=115,200 bps // 0x02=56,700 bps // 0x06=19,200 bps // 0x0C=9,600 bps // 0x18=4,800 bps // 0x30=2,400 bps //PORT1+1-->Registro <IER> outportb(PORT2+1,0X00); //Establecer Baud Rate - Divisor Latch High Byte //PORT1+3-->Registro <LCR> outportb(PORT2+3,0X03); //8 bits, sin paridad, 1 Bit de Stop //PORT1+2-->Registro <FCR> outportb(PORT2+2,0XC7); //Registro de control FIFO //PORT1+4-->Registro <MCR> outportb(PORT2+4,0X0B); //Activar DTR, RTS, y OUT2 void Configurar_COM3() //PORT1+1-->Registro <IER> outportb(PORT3+1,0); //Apagar interrupciones -PORT1- /* PORT1 - Estableciendo la Comunicaci¢n */ //PORT1+3-->Register <LCR> outportb(PORT3+3,0X80); //Establecer DLAB //PORT1+0-->Registro <DLAB> outportb(PORT3+0,0X30); //Establecer Baud Rate- Divisor Latch Low Byte //Default 0x03=38,400 bps // 0x01=115,200 bps // 0x02=56,700 bps // 0x06=19,200 bps // 0x0C=9,600 bps // 0x18=4,800 bps // 0x30=2,400 bps //PORT1+1-->Registro <IER> outportb(PORT3+1,0X00); //Establecer Baud Rate - Divisor Latch High Byte //PORT1+3-->Registro <LCR> outportb(PORT3+3,0X03); //8 bits, sin paridad, 1 Bit de Stop //PORT1+2-->Registro <FCR> outportb(PORT3+2,0XC7); //Registro de control FIFO //PORT1+4-->Registro <MCR> outportb(PORT3+4,0X0B); //Activar DTR, RTS, y OUT2 void Configurar_COM4() //PORT1+1-->Registro <IER> outportb(PORT4+1,0); //Apagar interrupciones -PORT1- /* PORT1 - Estableciendo la Comunicaci¢n */ //PORT1+3-->Register <LCR> outportb(PORT4+3,0X80); //Establecer DLAB //PORT1+0-->Registro <DLAB> outportb(PORT4+0,0X30); //Establecer Baud Rate- Divisor Latch Low Byte //Default 0x03=38,400 bps

Page 224: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-vi

// 0x01=115,200 bps // 0x02=56,700 bps // 0x06=19,200 bps // 0x0C=9,600 bps // 0x18=4,800 bps // 0x30=2,400 bps //PORT1+1-->Registro <IER> outportb(PORT4+1,0X00); //Establecer Baud Rate - Divisor Latch High Byte //PORT1+3-->Registro <LCR> outportb(PORT4+3,0X03); //8 bits, sin paridad, 1 Bit de Stop //PORT1+2-->Registro <FCR> outportb(PORT4+2,0XC7); //Registro de control FIFO //PORT1+4-->Registro <MCR> outportb(PORT4+4,0X0B); //Activar DTR, RTS, y OUT2 void Leer_Dato() switch(COMX) case 'A': Leer_COM1(); break; case 'B': Leer_COM2(); break; case 'C': Leer_COM3(); break; case 'D': Leer_COM4(); break; void Leer_COM1() //Tomar la lectura del tiempo bios_time = biostime(0, 0L); //Proporciona el # de ticks ocurridos desde las cero horas Tseg_Anterior1=bios_time/CLK_TCK; do chrt=inportb(PORT1+5); //PORT1+5-->Register <LSR> //Revisar si se ha recivido un byte if (chrt&1==1) BB=inportb(PORT1); // Si, toma el byte DATO=BB; printf("\nDATO=%d",DATO); BANDERA=1; else //Si BANDERA=0(nose recibio caracter y ya paso 1 segundo, entonces //hay que salir del ciclo y hacer que tome el paquete con ceros) bios_time = biostime(0, 0L); Tseg=bios_time/CLK_TCK;//Nuevo tiempo //Si ya paso 1 segundo entonces continuar if ((Tseg>=Tseg_Anterior1+1)&&(CuentaCanal<CantidadCanales)) BANDERA=1;//Para salir del ciclo BANDERA_CARACTER_NORx=1; CuentaCanal=0; //getch(); //Fin else while(BANDERA!=1); BANDERA=0; void Leer_COM2() //Tomar la lectura del tiempo bios_time = biostime(0, 0L); //Proporciona el # de ticks ocurridos desde las cero horas Tseg_Anterior1=bios_time/CLK_TCK; do chrt=inportb(PORT2+5); //PORT1+5-->Register <LSR> //Revisar si se ha recivido un byte if (chrt&1==1) BB=inportb(PORT2); // Si, toma el byte DATO=BB; printf("\nDATO=%d",DATO); BANDERA=1; else

Page 225: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-vii

//Si BANDERA=0(nose recibio caracter y ya paso 1 segundo, entonces //hay que salir del ciclo y hacer que tome el paquete con ceros) bios_time = biostime(0, 0L); Tseg=bios_time/CLK_TCK;//Nuevo tiempo //Si ya paso un segundo entonces continuar if ((Tseg>=Tseg_Anterior1+1)&&(CuentaCanal<CantidadCanales)) BANDERA=1;//Para salir del ciclo BANDERA_CARACTER_NORx=1; CuentaCanal=0; //Fin else while(BANDERA!=1); BANDERA=0; void Leer_COM3() //Tomar la lectura del tiempo bios_time = biostime(0, 0L); //Proporciona el # de ticks ocurridos desde las cero horas Tseg_Anterior1=bios_time/CLK_TCK; do chrt=inportb(PORT3+5); //PORT1+5-->Register <LSR> //Revisar si se ha recivido un byte if (chrt&1==1) BB=inportb(PORT3); // Si, toma el byte DATO=BB; printf("\nDATO=%d",DATO); BANDERA=1; else //Si BANDERA=0(nose recibio caracter y ya paso 1 segundo, entonces //hay que salir del ciclo y hacer que tome el paquete con ceros) bios_time = biostime(0, 0L); Tseg=bios_time/CLK_TCK;//Nuevo tiempo if ((Tseg>=Tseg_Anterior1+1)&&(CuentaCanal<CantidadCanales)) BANDERA=1;//Para salir del ciclo BANDERA_CARACTER_NORx=1; CuentaCanal=0; //Fin else while(BANDERA!=1); BANDERA=0; void Leer_COM4() //Tomar la lectura del tiempo bios_time = biostime(0, 0L); //Proporciona el # de ticks ocurridos desde las cero horas Tseg_Anterior1=bios_time/CLK_TCK; do chrt=inportb(PORT4+5); //PORT1+5-->Register <LSR> //Revisar si se ha recivido un byte if (chrt&1==1) BB=inportb(PORT4); // Si, toma el byte DATO=BB; printf("\nDATO=%d",DATO); BANDERA=1; else //Si BANDERA=0(nose recibio caracter y ya paso 1 segundo, entonces //hay que salir del ciclo y hacer que tome el paquete con ceros) bios_time = biostime(0, 0L); Tseg=bios_time/CLK_TCK;//Nuevo tiempo if ((Tseg>=Tseg_Anterior1+1)&&(CuentaCanal<CantidadCanales)) BANDERA=1;//Para salir del ciclo BANDERA_CARACTER_NORx=1; CuentaCanal=0; //Fin else while(BANDERA!=1); BANDERA=0; //************************************************************************** /* Funciones FILTROS DIGITALES PASA_BAJAS */ //************************************************************************** void Menu_Filtrar()

Page 226: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-viii

switch (Channel) case 0: Calcular_Yn0();; break; case 1: Calcular_Yn1();; break; case 2: Calcular_Yn2();; break; case 3: Calcular_Yn3();; break; case 4: CANAL4[posicion]=(int)PaqueteDATO[4];; break; case 5: CANAL5[posicion]=(int)PaqueteDATO[5];; break; case 6: CANAL6[posicion]=(int)PaqueteDATO[6];; break; default: printf("Bug!\n"); void Coeficientes_FPB_Butterworth_1() printf("Entro Almacenar Coeficientes Butter_1"); N=M; int i; for(i=0;i<N;i++) A[i]=0;B[i]=0; Xn0[i]=0;Xn1[i]=0;Xn2[i]=0;Xn3[i]=0; Yn0[i]=0;Yn1[i]=0;Yn2[i]=0;Yn3[i]=0; A[0]=1*(-1); A[1]=0.1187*(-1); A[2]=2.0383*(-1); A[3]=0.2023*(-1); A[4]=1.5235*(-1); A[5]=0.1235*(-1); A[6]=0.5275*(-1); A[7]=0.0337*(-1); A[8]=0.0882*(-1); A[9]=0.0042*(-1); A[10]=0.0068*(-1); A[11]=0.0002*(-1); A[12]=0.0002*(-1); A[13]=0; A[14]=0; A[15]=0; B[0]=0.0002; B[1]=0.0026; B[2]=0.0182; B[3]=0.0787; B[4]=0.2361; B[5]=0.5194; B[6]=0.8656; B[7]=1.1129; B[8]=1.1129; B[9]=0.8656; B[10]=0.5194; B[11]=0.2361; B[12]=0.0787; B[13]=0.0182; B[14]=0.0026; B[15]=0.0002; /////////////////////////////////////////////////// // Para el CANAL0 /////////////////////////////////////////////////// void Calcular_Yn0() Xn0[0]=PaqueteDATO[0]; printf("PDATO0--->=%d\n",PaqueteDATO[0]); //Yn=-1*[A(1)Y(1)+A(2)Y(2)+A(3)Y(3)]+[B(0)X(0)+B(1)X(1)+B(2)X(2)+B(3)X(3)] int i; double Acum_Entrada=0; double Acum_Salida=0; //printf("*****calcula XN0 \n"); for(i=0;i<=N-1;i++) Acum_Entrada=Acum_Entrada+(B[i]*Xn0[i]); //printf("*****calcular Yn0 \n"); for(i=1;i<=N-1;i++) Acum_Salida=Acum_Salida+(A[i]*Yn0[i]); SALIDA0=(Acum_Salida+Acum_Entrada); Yn0[0]=SALIDA0; //printf("\nSALIDA0=%f\n",SALIDA0); //Almacenar la salida del filtro en Canal0 CANAL0[posicion]=(int)SALIDA0; //Guardar_Salida_CH0(); IN_NOT_FILTER[posicion]=PaqueteDATO[0]; //Hacer los corrimientos

Page 227: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-ix

Hacer_Corrimientos_Entrada_Salida(); void Hacer_Corrimientos_Entrada_Salida() //printf("\nHacer corrimiento a la entrada\n"); int m=N-1; int i; //Recorrer los valores X(n) una posici¢n //Implementar un registro de corrimiento while(m>=1) Xn0[m]=Xn0[m-1]; Yn0[m]=Yn0[m-1]; m=m-1; /////////////////////////////////////////////////// // Para el CANAL1 /////////////////////////////////////////////////// void Calcular_Yn1() Xn1[0]=PaqueteDATO[1]; printf("PDATO1--->=%d\n",PaqueteDATO[1]); //Yn=-1*[A(1)Y(1)+A(2)Y(2)+A(3)Y(3)]+[B(0)X(0)+B(1)X(1)+B(2)X(2)+B(3)X(3)] int i; double Acum_Entrada=0; double Acum_Salida=0; //printf("*****calcula XN1 \n"); for(i=0;i<=N-1;i++) Acum_Entrada=Acum_Entrada+(B[i]*Xn1[i]); // printf("*****calcular Yn1 \n"); for(i=1;i<=N-1;i++) Acum_Salida=Acum_Salida+(A[i]*Yn1[i]); SALIDA1=(Acum_Salida+Acum_Entrada); Yn1[0]=SALIDA1; //printf("SALIDA1=%f\n",SALIDA1); //Almacenar la salida del filtro en Canal1 CANAL1[posicion]=(int)SALIDA1; //Guardar_Salida_CH1()(Truncando) //Hacer los corrimientos Hacer_Corri_Entrada_Salida1(); void Hacer_Corri_Entrada_Salida1() int m=N-1; int i; //Recorrer los valores X(n) una posici¢n //Implementar un registro de corrimiento while(m>=1) Xn1[m]=Xn1[m-1]; Yn1[m]=Yn1[m-1]; m=m-1; /////////////////////////////////////////////////// // Para CANAL2 /////////////////////////////////////////////////// void Calcular_Yn2() Xn2[0]=PaqueteDATO[2]; printf("PDATO2--->=%d\n",PaqueteDATO[2]); //Yn=-1*[A(1)Y(1)+A(2)Y(2)+A(3)Y(3)]+[B(0)X(0)+B(1)X(1)+B(2)X(2)+B(3)X(3)] int i; double Acum_Entrada=0; double Acum_Salida=0; // printf("*****calcula XN1 \n"); for(i=0;i<=N-1;i++) Acum_Entrada=Acum_Entrada+(B[i]*Xn2[i]); //printf("*****calcular Yn1 \n"); for(i=1;i<=N-1;i++) Acum_Salida=Acum_Salida+(A[i]*Yn2[i]); SALIDA2=(Acum_Salida+Acum_Entrada); Yn2[0]=SALIDA2; printf("\n--->SALIDA2--->%f\n",SALIDA2); //Almacenar la salida del filtro en Canal0 CANAL2[posicion]=(int)SALIDA2; //Guardar_Salida_CH2()(Truncando)

Page 228: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-x

//Hacer los corrimientos Hacer_Corri_Entrada_Salida2(); void Hacer_Corri_Entrada_Salida2() int m=N-1; int i; //Recorrer los valores X(n) una posici¢n //Implementar un registro de corrimiento while(m>=1) Xn2[m]=Xn2[m-1]; Yn2[m]=Yn2[m-1]; m=m-1; ////////////////////////////////////////////////////// // Para CANAL3 ////////////////////////////////////////////////////// void Calcular_Yn3() Xn3[0]=PaqueteDATO[3]; printf("PDATO3--->=%d\n",PaqueteDATO[3]); //Yn=-1*[A(1)Y(1)+A(2)Y(2)+A(3)Y(3)]+[B(0)X(0)+B(1)X(1)+B(2)X(2)+B(3)X(3)] int i; double Acum_Entrada=0; double Acum_Salida=0; // printf("*****calcula XN1 \n"); for(i=0;i<=N-1;i++) Acum_Entrada=Acum_Entrada+(B[i]*Xn3[i]); //printf("*****calcular Yn1 \n"); for(i=1;i<=N-1;i++) Acum_Salida=Acum_Salida+(A[i]*Yn3[i]); SALIDA3=(Acum_Salida+Acum_Entrada); Yn3[0]=SALIDA3; //printf("SALIDA3=%f\n",SALIDA3); //Almacenar la salida del filtro en Canal0 CANAL3[posicion]=(int)SALIDA3; //(Truncando).Guardar_Salida_CH3() //Hacer los corrimientos Hacer_Corri_Entrada_Salida3(); void Hacer_Corri_Entrada_Salida3() int m=N-1; int i; //Recorrer los valores X(n) una posici¢n //Implementar un registro de corrimiento while(m>=1) Xn3[m]=Xn3[m-1]; Yn3[m]=Yn3[m-1]; m=m-1; //--------------------------------------------------------------------------- // GENERAR LOS ARCHIVOS BINARIOS DE LOS CANALES //--------------------------------------------------------------------------- int Generar_ArchiBin_CH0() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica0.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) s.i = CANAL0[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */

Page 229: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xi

Count=Count+1; fclose(stream); printf("\n*-* FILE generado CANAL0 *-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\grafica0.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=CANAL0[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo CANAL0\n"); return 0; int Generar_ArchiBin_CH1() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count1<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica1.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) s.i = CANAL1[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count1=Count1+1; fclose(stream); printf("\n*-* FILE generado CANAL1 *-*\n"); else

Page 230: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xii

///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\grafica1.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=CANAL1[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo CANAL1\n"); return 0; int Generar_ArchiBin_CH2() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count2<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica2.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) s.i = CANAL2[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count2=Count2+1; fclose(stream); printf("\n*-* FILE generado CANAL2 *-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\grafica2.txt","r+b"))==NULL)

Page 231: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xiii

printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=CANAL2[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo CANAL2\n"); return 0; int Generar_ArchiBin_CH3() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count3<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica3.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) s.i = CANAL3[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count3=Count3+1; //printf("Count3=%u\n",Count3); fclose(stream); printf("\n*-* FILE generado CANAL3 *-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\grafica3.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream);

Page 232: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xiv

while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=CANAL3[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo CANAL3\n"); return 0; int Generar_ArchiBin_CH4() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count4<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica4.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) s.i = CANAL4[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count4=Count4+1; fclose(stream); printf("\n*-* FILE generado CANAL4 *-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\grafica4.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n");

Page 233: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xv

fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=CANAL4[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo CANAL4\n"); return 0; int Generar_ArchiBin_CH5() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count5<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica5.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) s.i = CANAL5[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count5=Count5+1; fclose(stream); printf("\n*-* FILE generado CANAL5 *-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\grafica5.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover

Page 234: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xvi

//Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=CANAL5[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo CANAL5\n"); return 0; int Generar_ArchiBin_CH6() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count6<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica6.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) s.i = CANAL6[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count6=Count6+1; fclose(stream); printf("\n*-* FILE generado CANAL6 *-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\grafica6.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR;

Page 235: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xvii

fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=CANAL6[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo CANAL6\n"); printf("\nnreg_Escribir-66-->%d\n",nreg_Escribir); return 0; int Generar_ArchiBin_Errores() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count7<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\Errores.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; s.i =ContaErrores; //CANAL0[i]; printf("ContaErrores=%d",ContaErrores); fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count7=Count7+1; fclose(stream); printf("\n*-* FILE generado Errores*-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\Errores.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); printf("\n*** CORRIMIENTO Errores ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros //LongArchivo=ftell(stream); nreg_Leer=1;//NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); printf("\nPOSI777-------->%d\n",posi); printf("\nLong REgistro------>%d\n",LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1;

Page 236: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xviii

nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-1/*-NumDatos*/); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros;//-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i=ContaErrores;//CANAL0[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo Errores\n"); //getch(); printf("\nCount7--->%d",Count7); printf("\nnreg_Escribir---777777>%d\n",nreg_Escribir); //getch(); return 0; int Generar_ArchiBin_Ceros() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count9<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\Ceros.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; s.i =ContaCeros; //CANAL0[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count9=Count9+1; fclose(stream); printf("\n*-* FILE generado Ceros*-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir if((stream=fopen("c:\\Ceros.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); printf("\n*** CORRIMIENTO Ceros ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros //LongArchivo=ftell(stream); nreg_Leer=1;//NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); printf("\nPOSI777-------->%d\n",posi); printf("\nLong REgistro------>%d\n",LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-1/*-NumDatos*/); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc..

Page 237: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xix

nreg_Escribir=NumRegistros;//-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i=ContaCeros;//CANAL0[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("cerro el archivo Ceros\n"); //getch(); printf("\nCount9--->%d",Count9); printf("\nnreg_Escribir---777777>%d\n",nreg_Escribir); //getch(); return 0; //--------------------------------------------------------------------------- // borrar LOS ARCHIVOS BINARIOS DE LOS CANALES //--------------------------------------------------------------------------- int Borrar_ArchiBin() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\grafica0.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado CANAL0*-*\n"); //Borrar el archivo del CANAL1 if ((stream = fopen("c:\\grafica1.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado CANAL1*-*\n"); //Borrar el archivo del CANAL2 if ((stream = fopen("c:\\grafica2.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado CANAL2*-*\n"); //Borrar el archivo del CANAL3 if ((stream = fopen("c:\\grafica3.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado CANAL3*-*\n"); //Borrar el archivo del CANAL4 if ((stream = fopen("c:\\grafica4.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado CANAL4*-*\n"); //Borrar el archivo del CANAL5 if ((stream = fopen("c:\\grafica5.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado CANAL5*-*\n"); //Borrar el archivo del CANAL6 if ((stream = fopen("c:\\grafica6.txt", "wb")) == NULL) /* open file TEST.$$$ */

Page 238: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xx

fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado CANAL6 *-*\n"); //Borrar el archivo de Errores if ((stream = fopen("c:\\Errores.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado Errores *-*\n"); if ((stream = fopen("c:\\InNotFilter.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado ENTRADA SIN FILTRAR *-*\n"); //Borrar el archivo de ceros if ((stream = fopen("c:\\Ceros.txt", "wb")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; fclose(stream); printf("\n*-* FILE borrado Ceros*-*\n"); return 0; void Calcular_CRC_16() DATA_HIGH=CHAR_INICIO;//241; //Caracter de inicio de paquete DATA_LOW=PaqueteDATO[0]; BUFFER=PaqueteDATO[1]; DATO_3=PaqueteDATO[2]; DATO_4=PaqueteDATO[3]; DATO_5=PaqueteDATO[4]; DATO_6=PaqueteDATO[5]; DATO_7=PaqueteDATO[6]; DATO_8=CHAR_FIN;//255; //Caracter de fin de paquete DATO_9=PaqueteDATO[7]; //CRC_1 DATO_10=PaqueteDATO[8];//CRC_0 CONTA_CORRIMIENTO=0; TOTAL_CORRIMIENTO=72; Px_GENERADOR_1=128; //10000000 Px_GENERADOR_0=5; //00000101 CRC_1=0; //00000000 CRC_0=0; //00000000 XOR0_1=Px_GENERADOR_1; XOR0_0=Px_GENERADOR_0; //Programa PRINCIPAL DATA_HIGH=DATA_HIGH<<1; //rlf DH -->B6B5B4B3B2B1B0? //Data_Low,F=? //Para detectar si el bit7 del DATA_LOW es 1 o 0 Bit7_DL=MASCARA_BIT7 & DATA_LOW; if(Bit7_DL==128) //Es 1? //Hacer 1 el bit menos significativo del DATA_HIGH DATA_HIGH=DATA_HIGH | MASCARA_BIT0; //DLC_FUE_UNO else //Es 0 //printf("Bit7_DL es diferente de 128=1000 0000"); DATA_HIGH=DATA_HIGH & MASCARA_BIT0_NO; DATA_LOW=DATA_LOW<<1; //DATA_LOW -->B6B5B4B3B2B1B0? //BUFFER,7=? //Para detectar si el bit 7 del BUFFER es 1 o 0 Bit7_BUFF=MASCARA_BIT7 & BUFFER; if(Bit7_BUFF==128) //Bit7_BUFF=1? DATA_LOW=DATA_LOW | MASCARA_BIT0; //BUFC_FUE_UNO

Page 239: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xxi

else //printf("Bit7_BUFF es diferente de 128=1000 0000"); DATA_LOW=DATA_LOW & MASCARA_BIT0_NO; BUFFER=BUFFER<<1; //BUFFER -->B6B5B4B3B2B1B0? CONTA_CORRIMIENTO=CONTA_CORRIMIENTO+1; //Incrementa el contador de corrimientos //REALIZA LA PRIMERA OPERACION XOR XOR0_1=Px_GENERADOR_1 ^ DATA_HIGH;//XOR0_1 ^ DATA_HIGH; XOR0_0=Px_GENERADOR_0 ^ DATA_LOW;//XOR0_0 ^ DATA_LOW; //MOVER PUNTERO //El bit 7 del XOR0_1 es 1 o 0? OTRO: Bit7_XOR0_1= MASCARA_BIT7 & XOR0_1; if(Bit7_XOR0_1==128) Operaciones(); //REALIZAR XOR XOR0_1=XOR0_1 ^ Px_GENERADOR_1; //XOR0_1=XOR0_1 (XOR) Px_GENERADOR_1 XOR0_0=XOR0_0 ^ Px_GENERADOR_0; //XOR0_0=XOR0_0 (XOR) Px_GENERADOR_0 CONTA_CORRIMIENTO=CONTA_CORRIMIENTO+1; else Operaciones(); CONTA_CORRIMIENTO=CONTA_CORRIMIENTO+1; //MANEJO DE LOS BYTES DE DATOS switch (CONTA_CORRIMIENTO) case 8: BUFFER=DATO_3;; break; case 16: BUFFER=DATO_4;; break; case 24: BUFFER=DATO_5;; break; case 32: BUFFER=DATO_6;; break; case 40: BUFFER=DATO_7;; break; case 48: BUFFER=DATO_8;; break; case 56: BUFFER=DATO_9;; break; case 64: BUFFER=DATO_10;; break; //Preguntar si ya se cumplieron el total de corrimiento if(CONTA_CORRIMIENTO!=TOTAL_CORRIMIENTO)goto OTRO; fin: //Subrutinas del CRC_16 void Operaciones() XOR0_1=XOR0_1<<1; //XOR0_1 -->B6B5B4B3B2B1B0? Bit7_XOR0_0=MASCARA_BIT7 & XOR0_0; //BIT7_XOR0_0=MASCARA_BIT7 (AND) XOR0_0 //Bit 7 del XOR_0=1? if(Bit7_XOR0_0==128) //Si es 1 XOR0_1=XOR0_1 | MASCARA_BIT0; //XOR0_1=XOR0_1 (OR) MASCARA_BIT0 else //Es 0 XOR0_1=XOR0_1 & MASCARA_BIT0_NO; //XOR0_1=XOR0_1 (AND) MASCARA_BIT0_NO XOR0_0=XOR0_0<<1; //XOR0_0-->B6B5B4B3B2B1B0? //Agregar BIT DATA_HIGH=DATA_HIGH<<1; //DATA_HIGH-->B6B5B4B3B2B1B0? Bit7_DL=MASCARA_BIT7 & DATA_LOW; //Es Bit7_DL 1? if(Bit7_DL==128) DATA_HIGH=DATA_HIGH | MASCARA_BIT0;//DATA_HIGH=DATA_HIGH (OR) MASCARA_BIT0 else DATA_HIGH=DATA_HIGH & MASCARA_BIT0_NO; DATA_LOW=DATA_LOW<<1; //DATA_LOW-->B6B5B4B3B2B1B0? Bit7_BUFF=MASCARA_BIT7 & BUFFER; if(Bit7_BUFF==128) DATA_LOW=DATA_LOW | MASCARA_BIT0;//DATA_LOW=DATA_LOW (OR) MASCARA_BIT0 else DATA_LOW=DATA_LOW & MASCARA_BIT0_NO;

Page 240: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xxii

BUFFER=BUFFER<<1; //BUFFER-->B6B5B4B3B2B1B0? //CHECAR SI DATA_LOW,<0>=1 o 0? Bit0_DL=MASCARA_BIT0 & DATA_LOW; if(Bit0_DL==1) XOR0_0=XOR0_0 | MASCARA_BIT0; else XOR0_0=XOR0_0 & MASCARA_BIT0_NO; void Almacena_PaqueteDATO_Anterior() //Almacenar el £ltimo PaqueteDATO bueno=Paquete Anterior printf("\nAlmacena el £ltimo paquete recibido"); for (int k=0;k<9;k++) PaqueteDATO_Anterior[k]=PaqueteDATO[k]; printf("\nPDA=%d PD=%d ",PaqueteDATO_Anterior[k],PaqueteDATO[k]); void Toma_PaqueteDATO_Anterior() //Toma el £ltimo PaqueteDATO bueno=Paquete Anterior, debido a que //hubo un error for (int k=0;k<9;k++) PaqueteDATO[k]=PaqueteDATO_Anterior[k]; printf("\nTomo PaqueteDATO_Anterior++++++++++++++++++++++++>>"); printf("\nPDA=%d PD=%d ",PaqueteDATO_Anterior[k],PaqueteDATO[k]); void Toma_PaqueteDATO_Ceros() //Toma el £ltimo PaqueteDATO bueno=Paquete Anterior, debido a que //hubo un error for (int k=0;k<9;k++) PaqueteDATO[k]=4;//PaqueteDATO_Anterior[k]; printf("\nTomo PaqueteDATO_Ceros++++++++++++++++++++++++>>"); printf("\nPDA=%d PD=%d ",PaqueteDATO_Anterior[k],PaqueteDATO[k]); //Generar el archivo de los datos de la entrada sin filtrar int Generar_ArchiBin_Entrada_SinFiltrar() FILE *stream; struct mystruct s; long nreg_Leer,nreg_Escribir; int VALOR; long posi; long NumRegistros=0; if (Count8<=NumSegundos) //Abrir un fichero para a¤adir informacion al final del mismo. Si el archivo no existe se crea if ((stream = fopen("c:\\InNotFilter.txt", "a+b")) == NULL) /* open file TEST.$$$ */ fprintf(stderr, "Cannot open output file.\n"); return 1; for(i=0;i<=NumDatos-1;i++) //s.i = CANAL1[i]; s.i=IN_NOT_FILTER[i]; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ Count8=Count8+1; fclose(stream); printf("\n*-* FILE generado Entrada Sin FILTRAR *-*\n"); else ///////////////////////////////////////////////////////////////////////////// // HACER EL CORRIMIENTO DE LA INFORMACION EN EL MISMO ARCHIVO ///////////////////////////////////////////////////////////////////////////// // Abrir un fichero para escribir y leer //Abrir un fichero para escribir y leer. el archivo debe existir

Page 241: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

III-xxiii

if((stream=fopen("c:\\InNotFilter.txt","r+b"))==NULL) printf("El fichero no puede abrirse."); exit(1); //Leer datos del fichero y mostrarlos en la salida est ndar fread(&s,sizeof(s),1,stream); while(!ferror(stream) && !feof(stream)) //Leer el siguiente registro del fichero fread(&s,sizeof(s),1,stream); //printf("\n*** CORRIMIENTO ***\n"); fseek(stream,0L,SEEK_END); //MUEVE EL PUNTERO AL FINAL DEL ARCHIVO NumRegistros=ftell(stream)/LongRegistro; //total de registros nreg_Leer=NumDatos; nreg_Escribir=1; do posi=(long)(nreg_Leer)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referencia ala primera posicion en el fichero a mover //Leer datos del fichero y hacer el corrimiento fread(&s,sizeof(s),1,stream); VALOR=s.i; //Colocar el puntero donde se desea recorrrer el valor (al inicio del archivo) posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero s.i =VALOR; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ nreg_Leer=nreg_Leer+1; nreg_Escribir=nreg_Escribir+1; while(nreg_Escribir<=NumRegistros-NumDatos); //cuando haga el ultimo corrimiento //Agregar al final el archivo los datos correspondientes para el //ultimo segundo,minuto etc.. nreg_Escribir=NumRegistros-NumDatos+1;//posicionamos el puntero posi=(long)(nreg_Escribir-1)*(LongRegistro); fseek(stream,posi, SEEK_SET); //Hace referncia ala primera posicion en el fichero for(unsigned int z=0;z<=NumDatos-1;z++) s.i=IN_NOT_FILTER[z]; fwrite(&s, sizeof(s), 1, stream); fclose(stream); printf("Cerro el archivo Entrada sin Filtrar\n"); //getch(); return 0;

Page 242: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-i

ANEXO IV. PROGRAMA DEL SISTEMA DE GRAFICACIÓN (VB)

a)SISTEMA DE MONITOREO Form_Sistema_Monitoreo '---------------------------------------------------------------------------------- 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 '---------------------------------------------------------------------------------- Dim DATOS As Data Dim DATOSS As Datas 'Para escribir en los archivos de respaldo Dim LongCadena As Integer Dim Bandera As Integer Private Sub Acerca_de_Click() Form_Acercade.Show End Sub Private Sub Alarmas_Anteriores_Click() Form_Alarmas_Visor.Show End Sub Private Sub Chk_Lim_Inferior_Click() Flag_Lim_Inferior = Chk_Lim_Inferior.Value End Sub Private Sub Chk_Lim_Inferior1_Click() Flag_Lim_Inferior1 = Chk_Lim_Inferior1.Value End Sub Private Sub Chk_Lim_Superior_Click() Flag_Lim_Superior = Chk_Lim_Superior.Value End Sub Private Sub Chk_Linea_Alarma_Click() Flag_Linea_Alarma = Chk_Linea_Alarma.Value End Sub Private Sub Chk_Limite_Inferior1_Click() Flag_Lim_Inferior1 = Chk_Lim_Inferior1.Value End Sub Private Sub Chk_Limite_Superior1_Click() Flag_Lim_Superior1 = Chk_Lim_Superior1.Value End Sub Private Sub Chk_Lim_Superior1_Click() Flag_Lim_Superior1 = Chk_Lim_Superior1.Value End Sub Private Sub Cmd_Aceptar_Zoom_Click() Acepta_Zoom End Sub Public Sub Acepta_Zoom() 'Validacion de los textboxes del Zoom 'Ambos limites deben ser mayores a cero y diferentes uno del otro 'y el minuto superior debe ser menor al tiempo trans currido If (Val(Txt_Min_Inicio.Text) >= 0) And (Val(Txt_Min_Fin.Text) > Val(Txt_Min_Inicio.Text)) And (Val(Txt_Min_Fin.Text) <= TIEMPO) Then 'Si ya se realizó un Zoom, entonces el siguiente zoom es un zoom en el zoom 'lo cual cambia los limites de inicio y fin del zoom If (Flag_Profundidad_Zoom = 0) And (Con_Puntos_Activados = 2) Then Min_Inicio = (Txt_Min_Inicio.Text) Min_Fin = (Txt_Min_Fin.Text) Min_Inicio_Anterior = Min_Inicio End If If (Flag_Profundidad_Zoom = 1) And (DIFERENCIA <> 1) And (Con_Puntos_Activados = 2) Then Min_Inicio = Min_Inicio + Minuto0 Min_Fin = Min_Inicio_Anterior + Minuto1 Min_Inicio_Anterior = Min_Inicio End If

Page 243: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-ii

DIFERENCIA = Min_Fin - Min_Inicio LBLDIFERENCIA.Caption = Str(DIFERENCIA) 'Actualizar cajas de texto Txt_Min_Inicio.Text = Str(Min_Inicio) Txt_Min_Fin.Text = Str(Min_Fin) 'Reactivar el priemr menu de opcion Activar_Menu Zoom Else MsgBox "PARAMETROS NO VALIDOS DEL ZOOM!" Txt_Min_Inicio.Text = "" Txt_Min_Fin.Text = "" Txt_Min_Inicio.Text = "0" Txt_Min_Fin.Text = "1" Inicio = Val(Txt_Min_Inicio.Text) Fin = Val(Txt_Min_Fin.Text) Min_Inicio = Inicio Min_Fin = Fin End If End Sub Public Sub Zoom() Dim Range As Integer Dim Inicio As Integer Dim Fin As Integer Dim Col As Long Range = Min_Fin - Min_Inicio Inicio = Min_Inicio Fin = Min_Fin ReDim Matrix_Graficador0_Aux(0 To (((Range * (NumBytes_1seg + 1)) / Periodo_Submuestreo) - 1), 1 To (Tot_Lineas)) Col = 0 If (TIEMPO <> 0) Then Select Case Grafica_Opcion Case 0 Habilitar_Chks_Zoom 'Tomar el rango de datos deseado For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0_Aux(Col, 1) = Matrix_Graficador0(Columna, 1) Col = Col + 1 Next Columna Colum = Col 'Establecer las amplitudes de los limites Limite_Superior = Max_Volt_PF Limite_Inferior = Min_Volt_PF 'Revisar que líneas fueron activadas Activar_Desactivar_Series Establecer_Colores_Series 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 1 Habilitar_Chks_Zoom 'Tomar el rango de datos deseado For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0_Aux(Col, 1) = Matrix_Graficador1(Columna, 1) Col = Col + 1 Next Columna Colum = Col 'Establecer las amplitudes de los limites Limite_Superior = Max_Volt_BB Limite_Inferior = Min_Volt_BB 'Revisar que líneas fueron activadas Activar_Desactivar_Series Establecer_Colores_Series 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 2 Deshabilitar_Chks_Zoom 'Tomar el rango de datos deseado For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0_Aux(Col, 1) = Matrix_Graficador2(Columna, 1) Col = Col + 1 Next Columna Col = 0 ReDim Matrix_Graficador1_Aux(0 To (((Range * (NumBytes_1seg + 1)) / Periodo_Submuestreo) - 1), 1 To (Tot_Lineas)) For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux(Col, 1) = Matrix_Graficador3(Columna, 1) Col = Col + 1 Next Columna

Page 244: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-iii

Colum = Col 'Establecer las amplitudes de las preventivas For Renglon = 0 To (Colum - 1) Step 1 Matrix_Graficador0_Aux(Renglon, 4) = 0 + 0.1 Matrix_Graficador1_Aux(Renglon, 4) = 0 + 0.1 'Y hace cero la del otro limite Matrix_Graficador0_Aux(Renglon, 5) = 1 - 0.1 Matrix_Graficador1_Aux(Renglon, 5) = 1 - 0.1 Next Renglon Establecer_Colores_Series 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 3 Habilitar_Chks_Zoom 'Deshabilitar limite inferior ya quie no se requiere y limpiarlo Chk_Lim_Inferior.Enabled = False Chk_Lim_Inferior.Value = 0 ReDim Matrix_Graficador0_Aux(0 To (Range - 1), 1 To Tot_Lineas) 'Tomar el rango de datos deseado For Columna = Inicio To (Fin - 1) Step 1 Matrix_Graficador0_Aux(Col, 1) = Matrix_Graficador4(Columna, 1) Col = Col + 1 Next Columna Col = 0 For Columna = Inicio To (Fin - 1) Step 1 Matrix_Graficador0_Aux(Col, 5) = Matrix_Graficador8(Columna, 1) Col = Col + 1 Next Columna Colum = Col 'Establecer las amplitudes de los limites Limite_Superior = Max_Error Limite_Inferior = Max_Error 'Revisar que líneas fueron activadas Activar_Desactivar_Series 'Cambiar el color de la serie 5 'Establecer_Color_Serie5 With MSChart_Graficador0.Plot.SeriesCollection(5).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 213, 164, 22 'Amarillo End With 'Activar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = True Lbl_CerosXMinuto.Visible = True End Select End If 'Hacer Flag_Profundidad_Zoom=1, indicando que ya se realizó un zoom Flag_Profundidad_Zoom = 1 'Flag_Profundidad_Zoom + 1 'Una vez realizado el zoom hay que reiniciar el contador de la pila del zoom Pos_Pila = 0 Lblpila.Caption = Str(Pos_Pila) 'Graficarlo en el componente MSChart_Graficador0.ChartData = Matrix_Graficador0_Aux Establecer_Labels_Zoom If (Grafica_Opcion = 2) Then MSChart_Graficador1.ChartData = Matrix_Graficador1_Aux 'Establecer_Labels_Transferencia Establecer_Labels_Zoom_Transferencia End If If (Grafica_Opcion = 3) Then MSChart_Graficador0.ChartData = Matrix_Graficador0_Aux Establecer_Labels_Zoom_Errores End If End Sub Public Sub Deshabilitar_Chks_Zoom() Chk_Lim_Superior.Enabled = False Chk_Lim_Inferior.Enabled = False End Sub Public Sub Habilitar_Chks_Zoom() Chk_Lim_Superior.Enabled = True Chk_Lim_Inferior.Enabled = True End Sub Public Sub Activar_Desactivar_Series() If (Opcion(3) = True) Then If ((Chk_Lim_Superior.Value <> 1)) Then 'Borrar todas las series menos la señal For Renglon = 0 To (Colum - 1) Step 1 Matrix_Graficador0_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite

Page 245: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-iv

Matrix_Graficador0_Aux(Renglon, 2) = 0 For S = 2 To 4 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True Next S 'Muestra serie5 MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = False Next Renglon Else 'Activar señal y limite superior y ceros For Renglon = 0 To (Colum - 1) Step 1 Matrix_Graficador0_Aux(Renglon, 3) = Limite_Superior 'Max_Error 'Y hace cero la del otro limite Matrix_Graficador0_Aux(Renglon, 2) = 0 Next Renglon 'Mostrar las series MSChart_Graficador0.Plot.SeriesCollection(3).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection(2).Position.Hidden = True For S = 4 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True Next S ''' MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = False End If Else If (Chk_Lim_Inferior.Value <> 1) And (Chk_Lim_Superior.Value <> 1) Then 'And (Chk_Linea_Alarma <> 1) Then 'Desactivarlas todas menos la de la señal For Renglon = 0 To (Colum - 1) Step 1 Matrix_Graficador0_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite Matrix_Graficador0_Aux(Renglon, 2) = 0 Next Renglon For S = 2 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Lim_Inferior.Value <> 1) And (Chk_Lim_Superior.Value = 1) Then 'And (Chk_Linea_Alarma = 1) Then 'Áctivar nomas de la señal y el limite superior 'que tome la amplitud de el limite superior For Renglon = 0 To (Colum - 1) Step 1 Matrix_Graficador0_Aux(Renglon, 3) = Limite_Superior 'Max_Volt_PF 'Y hace cero la del otro limite Matrix_Graficador0_Aux(Renglon, 2) = 0 Next Renglon MSChart_Graficador0.Plot.SeriesCollection(1).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection(3).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection(2).Position.Hidden = True For S = 4 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Lim_Inferior.Value = 1) And (Chk_Lim_Superior.Value = 1) Then ' And (Chk_Linea_Alarma = 1) Then 'Activar la señal y los dos limites For Renglon = 0 To (Colum - 1) Step 1 Matrix_Graficador0_Aux(Renglon, 3) = Limite_Superior 'Max_Volt_PF 'Y hace cero la del otro limite Matrix_Graficador0_Aux(Renglon, 2) = Limite_Inferior 'Min_Volt_PF Next Renglon MSChart_Graficador0.Plot.SeriesCollection(1).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection(3).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection(2).Position.Hidden = False 'Áctivar nomas de la señal y la e la linea de alarma For S = 4 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Lim_Inferior.Value = 1) And (Chk_Lim_Superior.Value <> 1) Then ' And (Chk_Linea_Alarma <> 1) Then 'Áctivar nomas de la señal y el limite inferior 'que tome la amplitud de el limite superior For Renglon = 0 To (Colum - 1) Step 1 Matrix_Graficador0_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite Matrix_Graficador0_Aux(Renglon, 2) = Limite_Inferior 'Min_Volt_PF Next Renglon MSChart_Graficador0.Plot.SeriesCollection(1).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection(3).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(2).Position.Hidden = False 'Áctivar nomas de la señal y la e la linea de alarma For S = 4 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True

Page 246: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-v

Next S End If End If End Sub Private Sub Cmd_Aceptar_Zoom1_Click() Acepta_Zoom1 End Sub Public Sub Acepta_Zoom1() 'Validacion de los textboxes del Zoom 'Ambos limites deben ser mayores a cero y diferentes uno del otro 'y el minuto superior debe ser menor al tiempo trans currido If (Val(Txt_Min_Inicio1.Text) >= 0) And (Val(Txt_Min_Fin1.Text) > Val(Txt_Min_Inicio1.Text)) And (Val(Txt_Min_Fin1.Text) <= (TIEMPO)) Then 'Si ya se realizó un Zoom, entonces el siguiente zoom es un zoom en el zoom 'lo cual cambia los limites de inicio y fin del zoom If (Flag_Profundidad_Zoom1 = 0) And (Con_Puntos_Activados1 = 2) Then Min_Inicio1 = (Txt_Min_Inicio1.Text) Min_Fin1 = (Txt_Min_Fin1.Text) Min_Inicio_Anterior1 = Min_Inicio1 End If If (Flag_Profundidad_Zoom1 = 1) And (DIFERENCIA1 <> 1) And (Con_Puntos_Activados1 = 2) Then Min_Inicio1 = Min_Inicio1 + Minuto2 Min_Fin1 = Min_Inicio_Anterior1 + Minuto3 Min_Inicio_Anterior1 = Min_Inicio1 End If DIFERENCIA1 = Min_Fin1 - Min_Inicio1 LBLDIFERENCIA.Caption = Str(DIFERENCIA1) 'Actualizar cajas de texto Txt_Min_Inicio1.Text = Str(Min_Inicio1) Txt_Min_Fin1.Text = Str(Min_Fin1) 'Reactivar el priemr menu de opcion Activar_Menu1 Zoom1 Else MsgBox "PARAMETROS NO VALIDOS DEL ZOOM!" Txt_Min_Inicio1.Text = "" Txt_Min_Fin1.Text = "" Txt_Min_Inicio1.Text = "0" Txt_Min_Fin1.Text = "1" Inicio1 = Val(Txt_Min_Inicio1.Text) Fin1 = Val(Txt_Min_Fin1.Text) Min_Inicio1 = Inicio1 Min_Fin1 = Fin1 End If End Sub Private Sub Configuracion_Click() Form_Configuracion.Show End Sub Private Sub Form_Load() Dim f As Single f = 155 diezporciento = 0.1 * f f = f + diezporciento g = Round(f) 'Establecer a que minuto pertenece el primer punto para el zoom Modulo = f Mod 10 Entero = f \ 10 Resto = f - (Entero * 10) If (Resto >= 0.5) Then f = (Entero * 10) + 1 Else f = (Entero * 10) End If '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'Variables para la realización del Zoom empleando el mouse 'Dimensionar la pila para establecer los limites del zoom ReDim Pila(0 To 2) ReDim Pila1(0 To 2) 'Inicializar la bandera Flag_Profundidad_Zoom la cual pemitira saber 'cuando se debe realizar un Zoom dentro del Zoom Flag_Profundidad_Zoom = 0 Flag_Profundidad_Zoom1 = 0 'Inicializar la variable que indica cuantos puntos se han activado para el zoom Con_Puntos_Activados = 0 Con_Puntos_Activados1 = 0 'Puntero que controla la posicion donde se agregaran los nuevos datos 'en el archivo de respaldo de graficas Puntero = 1

Page 247: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-vi

Puntero1 = 1 Puntero2 = 1 Puntero3 = 1 Puntero4 = 1 Puntero5 = 1 Puntero6 = 1 Puntero7 = 1 Puntero8 = 1 Puntero9 = 1 Puntero_Alarma = 1 Puntero_Alarma1 = 1 Puntero_Alarma2 = 1 Puntero_Alarma3 = 1 Puntero_Alarma4 = 1 Puntero_Alarma5 = 1 Puntero_Alarma6 = 1 Puntero_Alarma7 = 1 'Contador de minutos transcurridos, el cual controlara los minutos 'para la generación de los archivos de respaldo de graficas anteriores TIEMPO_MINUTOS = 0 '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Contador_Minutos = 1 TIEMPO = 0 Num_Escalones_ADC = 255 '# de escalones del convertidor A/D 'Proporcionar el numero de bytes a graficar por tandas y el numer de tandas a graficar NumBytes_1seg = 60 - 1 '1440 - 1 '550 '- 1 'definimos el numero de datos por minuto NumRenglones = 720 - 1 '12 - 1 '60 - 1 'Definimos el numero de renglones a graficar NumDatos_1min = 60 - 1 '60 Periodo_Submuestreo = 10 '10 'Periodo a emplear para el submuestreo 'Redimensionar los vectores de alarma ReDim Menor_Volt_PF(NumRenglones) ReDim Menor_Amp_PF(NumRenglones) ReDim Menor_Frec_PF(NumRenglones) 'Redimensionar los vectores de 1 sólo renglon Dimension = ((NumBytes_1seg + 1) * (NumRenglones + 1)) 'Para graficar con lineas 'Total delíneas a graficar Tot_Lineas = 6 'Inicializar las variables para las restricciones Restriccion_Max_Volt_PF = 1000 Restriccion_Max_Volt_BB = 1000 Restriccion_Max_Amp_PF = 1000 Restriccion_Max_Amp_BB = 1000 Restriccion_Max_Frec_PF = 100 ReDim Vector_Renglon(Dimension) 'Para el canal0 ReDim Vector_Submuestreo(Dimension / Periodo_Submuestreo) ReDim Vector_Renglon7(NumRenglones + 1) 'Para los Errores ReDim Vector_Submuestreo7(Dimension / Periodo_Submuestreo) ReDim Vector_AlarmaON(Dimension) ReDim Vector_AlarmaON_OFF(Dimension) ReDim Vector_AlarmaON_OFF_Flag(Dimension) ReDim Vector_AlarmaON_Amp_PF(Dimension) ReDim Vector_AlarmaON_Amp_PF_OFF(Dimension) ReDim Vector_AlarmaON_Amp_PF_OFF_Flag(Dimension) ReDim Vector_AlarmaON_Frec_PF(Dimension) ReDim Vector_AlarmaON_Frec_PF_OFF(Dimension) ReDim Vector_AlarmaON_Frec_PF_OFF_Flag(Dimension) ReDim Vector_AlarmaON_Volt_BB(Dimension) ReDim Vector_AlarmaON_Volt_BB_OFF(Dimension) ReDim Vector_AlarmaON_Volt_BB_OFF_Flag(Dimension) ReDim Vector_AlarmaON_Amp_BB(Dimension) ReDim Vector_AlarmaON_Amp_BB_OFF(Dimension) ReDim Vector_AlarmaON_Amp_BB_OFF_Flag(Dimension) ReDim Vector_AlarmaON_Transferencia(Dimension) ReDim Vector_AlarmaON_Transferencia_OFF(Dimension) ReDim Vector_AlarmaON_Transferencia_OFF_Flag(Dimension) ReDim Vector_AlarmaON_Errores(NumRenglones + 1) ReDim Vector_AlarmaON_Errores_OFF(NumRenglones + 1) ReDim Vector_AlarmaON_Errores_OFF_Flag(NumRenglones + 1) 'Para el manejo de Alarmas y Alarmas Preventivas ReDim Pos_AlarmaPrev_Inicio(Dimension) ReDim Pos_AlarmaPrev_Fin(Dimension)

Page 248: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-vii

'Dimensionar el vector que almacena el ultimo minuto a agragar 'a los archivos de respaldo ReDim Vector_Respaldo(0 To (((NumBytes_1seg + 1) / Periodo_Submuestreo) - 1)) Dim CONFIGURACION_ALARMA As ALARMA_CONFIG 'Estructura empleada para leer el 'archivo Alarma.txt NumRegistro_Alarma = FreeFile Direccion_Alarma = App.Path + "\Alarma.txt" 'Abrir el archivo usando acceso binario Open Direccion_Alarma For Binary As #NumRegistro_Alarma 'Leer el archivo usando la estructura ALARMA_CONFIG Get #NumRegistro_Alarma, 1, CONFIGURACION_ALARMA Posicion = Seek(NumRegistro_Alarma) Close NumRegistro_Alarma 'Asignar los valores leidos del archivo Alarma.txt a los text_box de 'configuración Min_Volt_PF = Str(CONFIGURACION_ALARMA.Alarma_Min_Volt_PF) Max_Volt_PF = Str(CONFIGURACION_ALARMA.Alarma_Max_Volt_PF) Min_Volt_PF_AUX = Max_Volt_PF Min_Amp_PF = Str(CONFIGURACION_ALARMA.Alarma_Min_Amp_PF) Max_Amp_PF = Str(CONFIGURACION_ALARMA.Alarma_Max_Amp_PF) Min_Amp_PF_AUX = Max_Amp_PF Min_Frec_PF = Str(CONFIGURACION_ALARMA.Alarma_Min_Frec_PF) Max_Frec_PF = Str(CONFIGURACION_ALARMA.Alarma_Max_Frec_PF) Min_Frec_PF_AUX = Max_Frec_PF Min_Volt_BB = Str(CONFIGURACION_ALARMA.Alarma_Min_Volt_BB) Max_Volt_BB = Str(CONFIGURACION_ALARMA.Alarma_Max_Volt_BB) Min_Amp_BB = Str(CONFIGURACION_ALARMA.Alarma_Min_Amp_BB) Max_Amp_BB = Str(CONFIGURACION_ALARMA.Alarma_Max_Amp_BB) Max_Error = Str(CONFIGURACION_ALARMA.Alarma_Max_Error) Tiempo_Alarma_Volt_PF = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Volt_PF)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Amp_PF = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Amp_PF)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Frec_PF = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Frec_PF)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Volt_BB = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Volt_BB)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Amp_BB = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Amp_BB)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Error = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Error)) ' * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Transferencia_CFEPF = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Transferencia_CFEPF)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Transferencia_PFCFE = (Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Transferencia_PFCFE)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) 'Captura el tiempo de inicio de graficación LblHora_Inicio.Caption = Time LblTime.Caption = Time 'Iniciar la variable Hora_Ultima_Alarma= Hora_Inicio-1 Hora_Ultima_Alarma = Mid(LblHora_Inicio.Caption, 1, 5) Restar_HORAS 1, Hora_Ultima_Alarma Hora_Ultima_Alarma = Etiqueta_Hora_Inicio 'Etiqueta_Hora_inicio=variable que cotiene el 'resultado proporcionado por la funcion Restar_Horas Valor_Alarma_Anterior = Val(Mid(Hora_Ultima_Alarma, 1, 2) + Mid(Hora_Ultima_Alarma, 4, 2)) Cargar_Frm Flag_Alarma_Volt_PF = 0 ' indico que la forma de alarma volt pf esta cerrrada Flag_Alarma_Amp_PF = 0 Flag_Alarma_Frec_PF = 0 Flag_Alarma_Volt_BB = 0 Flag_Alarma_Amp_BB = 0 Flag_Alarma_Transferencia = 0 Flag_Alarma_Errores = 0 Flag_Alarma_Volt_PF_On = 0 ' indico que la forma de alarma volt pf esta cerrrada Flag_Alarma_Amp_PF_On = 0 Flag_Alarma_Frec_PF_On = 0 Flag_Alarma_Volt_BB_On = 0 Flag_Alarma_Amp_BB_On = 0 Flag_Alarma_Transferencia_On = 0 Flag_Alarma_Errores_On = 0 '---------------------------------------------------------------------------------- 'Para deshabilitar maximizar, minimizar y cerrar ventana Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) '---------------------------------------------------------------------------------- '---------------------------------------------------------------------------------- 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) 'For i = 3 To 0 Step -1 ' Success = DeleteMenu(hMenu, i, MF_BYPOSITION) 'Next Success = DeleteMenu(hMenu, 8, MF_BYPOSITION) Success = DeleteMenu(hMenu, 7, MF_BYPOSITION)

Page 249: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-viii

Success = DeleteMenu(hMenu, 6, MF_BYPOSITION) Success = DeleteMenu(hMenu, 5, MF_BYPOSITION) Success = DeleteMenu(hMenu, 4, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 3, MF_BYPOSITION) Success = DeleteMenu(hMenu, 2, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 1, MF_BYPOSITION) Success = DeleteMenu(hMenu, 0, MF_BYPOSITION) '---------------------------------------------------------------------------------- Exit Sub End Sub Public Sub Cargar_Frm() 'CArgar valores anteriores a los objetos de seleccion Carga_Seleccion_Anterior Dim S As Long Limpiar_VectorAlarmaOn 'Para el corrimiento TxtPosi_Alarma.Text = "" TxtFlags_Alarma.Text = "" TxtFlags_Alarma_Escrita.Text = "" 'Para Dimensionar el vector que se va a entregar al componente graficador If TIEMPO = 0 Then ReDim Matrix_Graficador0_Aux(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador0(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador1(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador2(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador3(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador4(0 To 0, 1 To Tot_Lineas) ReDim Matrix_Graficador5(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador6(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador7(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Graficador8(0 To 0, 1 To Tot_Lineas) Else ReDim Matrix_Graficador0_Aux(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador0(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador1(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador2(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador3(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador4(0 To (TIEMPO - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador5(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador6(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador7(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) - 1), 1 To Tot_Lineas) ReDim Matrix_Graficador8(0 To (TIEMPO - 1), 1 To Tot_Lineas) End If 'Leer_Archivos 'Para controlar la lectura de los archivos através de una sola función de Abrir Grafica For S = 0 To 6 Step 1 Select Case S Case 0 '----------------------------------------- 'Canal0-->Voltaje Planta de fuerza '----------------------------------------- NomArchivo = "Grafica0.txt" 'Nombre del archivo a abrir 'NomArchivo = "InNotFil.txt" AbrirGrafica (NomArchivo) 'Abrir archivo y guardar su contenido en un vector SubMuestreo Lineas_Alarma 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "VPF_" Nombre_Base_Alarma = "AVPF_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado Dim Sub_Pos As Integer Sub_Pos = 0 For i = ((TIEMPO - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (((TIEMPO) * (NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Vector_Respaldo(Sub_Pos) = Matrix_Graficador0(i, 1) Sub_Pos = Sub_Pos + 1

Page 250: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-ix

Next i 'Inicializar puntero Puntero = Puntero1 Generar_Archivos_Respaldo (Nombre_Base) Puntero1 = Puntero Puntero = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Agregar información al archivo de alarmas en caso de 'ser necesario Puntero_Alarma = Puntero_Alarma1 Generar_Archivo_AlarmaS Nombre_Base_Alarma, Vector_AlarmaON, Vector_AlarmaON_OFF_Flag Puntero_Alarma1 = Puntero_Alarma Puntero_Alarma = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Else Fecha = Date ' Fecha contiene la fecha del sistema actual. DIA = Mid(Fecha, 1, 2) MES = Mid(Fecha, 4, 2) ANO = Mid(Fecha, 7, 4) Fecha = DIA + "_" + MES + "_" + ANO RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de Configuración de alarmas RUTA = App.Path + "\Configuraciones" + "\" + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Sacar una copia al archivo de configuración de alarmas y guardarla en 'la carpeta Configuraciones RUTA = App.Path + "\Configuraciones" + "\" '+ Fecha + "*.txt" FileCopy App.Path + "\Alarma.txt", RUTA + Fecha + ".txt" End If Case 1 '----------------------------------------- 'Canal2-->Voltaje Banco de baterías '----------------------------------------- 'MsgBox ("Entro al case 1") NomArchivo = "Grafica2.txt" 'Nombre del archivo a abrir AbrirGrafica (NomArchivo) SubMuestreo2 Lineas_Alarma2 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "VBB_" Nombre_Base_Alarma = "AVBB_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado Sub_Pos = 0 For i = ((TIEMPO - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (((TIEMPO) * (NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Vector_Respaldo(Sub_Pos) = Matrix_Graficador1(i, 1) Sub_Pos = Sub_Pos + 1 Next i 'Inicializar puntero Puntero = Puntero2 Generar_Archivos_Respaldo (Nombre_Base) Puntero2 = Puntero Puntero = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Agregar información al archivo de alarmas en caso de 'ser necesario Puntero_Alarma = Puntero_Alarma2 Generar_Archivo_AlarmaS Nombre_Base_Alarma, Vector_AlarmaON_Volt_BB, Vector_AlarmaON_Volt_BB_OFF_Flag Puntero_Alarma2 = Puntero_Alarma Puntero_Alarma = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye

Page 251: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-x

On Error Resume Next Kill RUTA End If Case 2 '----------------------------------------- 'Canal 4 y 5--> CFE y Transferencia del sistema '----------------------------------------- 'MsgBox ("Entro al case 1") NomArchivo = "Grafica4.txt" 'Nombre del archivo a abrir AbrirGrafica (NomArchivo) SubMuestreo4 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "CFE_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado 'Dim Sub_Pos As Integer Sub_Pos = 0 For i = ((TIEMPO - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (((TIEMPO) * (NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Vector_Respaldo(Sub_Pos) = Matrix_Graficador2(i, 1) Sub_Pos = Sub_Pos + 1 Next i 'Inicializar puntero Puntero = Puntero3 Generar_Archivos_Respaldo (Nombre_Base) Puntero3 = Puntero Puntero = 1 Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA End If NomArchivo = "Grafica5.txt" 'Nombre del archivo a abrir AbrirGrafica (NomArchivo) SubMuestreo5 Lineas_Alarma45 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "TRA_" Nombre_Base_Alarma = "ATRA_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado 'Dim Sub_Pos As Integer Sub_Pos = 0 For i = ((TIEMPO - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (((TIEMPO) * (NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Vector_Respaldo(Sub_Pos) = Matrix_Graficador3(i, 1) Sub_Pos = Sub_Pos + 1 Next i 'Inicializar puntero Puntero = Puntero4 Generar_Archivos_Respaldo (Nombre_Base) Puntero4 = Puntero Puntero = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Agregar información al archivo de alarmas en caso de 'ser necesario Puntero_Alarma = Puntero_Alarma3 Generar_Archivo_AlarmaS Nombre_Base_Alarma, Vector_AlarmaON_Transferencia, Vector_AlarmaON_Transferencia_OFF_Flag Puntero_Alarma3 = Puntero_Alarma Puntero_Alarma = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA End If Case 3 '----------------------------------------- 'Canal de Errores por minuto '----------------------------------------- NomArchivo7 = "Errores.txt" 'Nombre del archivo a abrir AbrirErrores (NomArchivo7) 'Abrir archivo y guardar su contenido en un vector Almacenar_MatrizErrores

Page 252: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xi

Lineas_AlarmaErrores 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "ERR_" Nombre_Base_Alarma = "AERR_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado Sub_Pos = 0 For i = (TIEMPO - 1) To (TIEMPO - 1) Step 1 Vector_Respaldo(Sub_Pos) = Matrix_Graficador4(i, 1) Sub_Pos = Sub_Pos + 1 Next i 'Inicializar puntero Puntero = Puntero5 Generar_Archivos_Respaldo_ERROR (Nombre_Base) Puntero5 = Puntero Puntero = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Agregar información al archivo de alarmas en caso de 'ser necesario Puntero_Alarma = Puntero_Alarma4 Generar_Archivo_AlarmaS Nombre_Base_Alarma, Vector_AlarmaON_Errores, Vector_AlarmaON_Errores_OFF_Flag Puntero_Alarma4 = Puntero_Alarma Puntero_Alarma = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA End If NomArchivo7 = "Ceros.txt" 'Nombre del archivo a abrir AbrirCeros (NomArchivo7) 'Abrir archivo y guardar su contenido en un vector Almacenar_MatrizCeros 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "CER_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado Sub_Pos = 0 For i = (TIEMPO - 1) To (TIEMPO - 1) Step 1 Vector_Respaldo(Sub_Pos) = Matrix_Graficador8(i, 1) Sub_Pos = Sub_Pos + 1 Next i 'Inicializar puntero Puntero = Puntero9 Generar_Archivos_Respaldo_ERROR (Nombre_Base) Puntero9 = Puntero Puntero = 1 Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA End If Case 4 '----------------------------------------- 'Canal1-->Corriente Planta de fuerza '----------------------------------------- NomArchivo = "Grafica1.txt" 'Nombre del archivo a abrir AbrirGrafica (NomArchivo) 'Abrir archivo y guardar su contenido en un vector SubMuestreo1 Lineas_Alarma1 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "APF_" Nombre_Base_Alarma = "AAPF_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado Sub_Pos = 0 For i = ((TIEMPO - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (((TIEMPO) * (NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Vector_Respaldo(Sub_Pos) = Matrix_Graficador5(i, 1) Sub_Pos = Sub_Pos + 1 Next i

Page 253: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xii

'Inicializar puntero Puntero = Puntero6 Generar_Archivos_Respaldo (Nombre_Base) Puntero6 = Puntero Puntero = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Agregar información al archivo de alarmas en caso de 'ser necesario Puntero_Alarma = Puntero_Alarma5 Generar_Archivo_AlarmaS Nombre_Base_Alarma, Vector_AlarmaON_Amp_PF, Vector_AlarmaON_Amp_PF_OFF_Flag Puntero_Alarma5 = Puntero_Alarma Puntero_Alarma = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA End If Case 5 '----------------------------------------- 'Canal6-->Frecuencia Planta de fuerza '----------------------------------------- NomArchivo = "Grafica6.txt" 'Nombre del archivo a abrir AbrirGrafica (NomArchivo) 'Abrir archivo y guardar su contenido en un vector SubMuestreo6 Lineas_Alarma6 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "FPF_" Nombre_Base_Alarma = "AFPF_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado Sub_Pos = 0 For i = ((TIEMPO - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (((TIEMPO) * (NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Vector_Respaldo(Sub_Pos) = Matrix_Graficador6(i, 1) Sub_Pos = Sub_Pos + 1 Next i 'Inicializar puntero Puntero = Puntero7 Generar_Archivos_Respaldo (Nombre_Base) Puntero7 = Puntero Puntero = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Agregar información al archivo de alarmas en caso de 'ser necesario Puntero_Alarma = Puntero_Alarma6 Generar_Archivo_AlarmaS Nombre_Base_Alarma, Vector_AlarmaON_Frec_PF, Vector_AlarmaON_Frec_PF_OFF_Flag Puntero_Alarma6 = Puntero_Alarma Puntero_Alarma = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA End If Case 6 '----------------------------------------- 'Canal3-->Corriente Banco de Baterías '----------------------------------------- NomArchivo = "Grafica3.txt" 'Nombre del archivo a abrir AbrirGrafica (NomArchivo) 'Abrir archivo y guardar su contenido en un vector SubMuestreo3 Lineas_Alarma3 'Generar el archivo de respaldo 'Agregar la parte donde se generaran los archivos con los cuales se podran recuperar 'las graficas establecidas pasadas Nombre_Base = "ABB_" Nombre_Base_Alarma = "AABB_" If TIEMPO <> 0 Then 'Tomar sólo el último minuto graficado Sub_Pos = 0 For i = ((TIEMPO - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (((TIEMPO) * (NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Vector_Respaldo(Sub_Pos) = Matrix_Graficador7(i, 1)

Page 254: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xiii

Sub_Pos = Sub_Pos + 1 Next i 'Inicializar puntero Puntero = Puntero8 Generar_Archivos_Respaldo (Nombre_Base) Puntero8 = Puntero Puntero = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Agregar información al archivo de alarmas en caso de 'ser necesario Puntero_Alarma = Puntero_Alarma7 Generar_Archivo_AlarmaS Nombre_Base_Alarma, Vector_AlarmaON_Amp_BB, Vector_AlarmaON_Amp_BB_OFF_Flag Puntero_Alarma7 = Puntero_Alarma Puntero_Alarma = 1 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Else RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA 'Para su correspondiente archivo de alarmas RUTA = App.Path + "\Alarmas" + "\" + Nombre_Base_Alarma + Fecha + "*.txt" 'Si el archivo del dia de hoy ya existe,lo destruye On Error Resume Next Kill RUTA End If End Select Next S 'Esconder la serie de alarma MSChart_Graficador0.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True 'Para mostrar la grafica seleccionada If Chk_Zoom.Value = 1 Then Acepta_Zoom Else Mostrar_Grafica End If If Chk_Zoom1.Value = 1 Then Acepta_Zoom1 Else If Not (Opcion(2).Value = True) Then Mostrar_Grafica1 End If End If End Sub Public Sub Generar_Archivos_Respaldo(Archivo_Respaldo As String) NumRegister = FreeFile 'Solo cuando la fecha cambie entonces se debe cambiar 'el nombre del archivo, osea HMS=hora que forma parte del nombre If Fecha <> Fecha_Anterior Then NUEVA_HORA = CStr(Time) 'Restarle un minuto a la hora tomada por Nueva_Hora Restar_HORAS 1, NUEVA_HORA HOURS = Mid(Etiqueta_Hora_Inicio, 1, 2) MINUTES = Mid(Etiqueta_Hora_Inicio, 4, 2) SECONDS = Mid(NUEVA_HORA, 7, 2) HMS = Val(HOURS + MINUTES + SECONDS) Puntero = 1 Puntero1 = 1 Puntero2 = 1 Puntero3 = 1 Puntero4 = 1 Puntero5 = 1 Puntero6 = 1 Puntero7 = 1 Puntero8 = 1 Puntero9 = 1 'Sacar una copia al archivo de configuración de alarmas y guardarla en 'la carpeta Configuraciones RUTA = App.Path + "\Configuraciones" + "\" FileCopy App.Path + "\Alarma.txt", RUTA + Fecha + ".txt" End If RUTA = App.Path + "\Graficas" + "\" + Archivo_Respaldo + Fecha + ".txt" 'Abrir el archivo para escribir en modo binario Open RUTA For Binary As #NumRegister 'Escribir la hora de inicio, antes de los datos de la grafica If (Puntero = 1) Then Put #NumRegister, Puntero, HMS 'Vector_Respaldo(i) Puntero = Seek(NumRegister)

Page 255: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xiv

End If For i = 0 To (((NumBytes_1seg + 1) / (Periodo_Submuestreo)) - 1) Put #NumRegister, Puntero, Vector_Respaldo(i) Puntero = Seek(NumRegister) Next i 'Cambiar fecha_anterior Fecha_Anterior = Fecha Puntero = Seek(NumRegister) Close NumRegister End Sub Public Sub Generar_Archivos_Respaldo_ERROR(Archivo_Respaldo_ERROR As String) NumRegister = FreeFile 'Solo cuando la fecha cambie entonces se debe cambiar 'el nombre del archivo, osea HMS=hora que forma parte del nombre If Fecha <> Fecha_Anterior Then NUEVA_HORA = Time HOURS = Mid(NUEVA_HORA, 1, 2) MINUTES = Mid(NUEVA_HORA, 4, 2) SECONDS = Mid(NUEVA_HORA, 7, 2) HMS = Val(HOURS + MINUTES + SECONDS) Puntero = 1 Puntero1 = 1 Puntero2 = 1 Puntero3 = 1 Puntero4 = 1 Puntero5 = 1 Puntero6 = 1 Puntero7 = 1 Puntero8 = 1 Puntero9 = 1 End If RUTA = App.Path + "\Graficas" + "\" + Nombre_Base + Fecha + ".txt" 'Abrir el archivo para escribir en modo binario Open RUTA For Binary As #NumRegister 'Escribir la hora de inicio, antes de los datos de la grafica If (Puntero = 1) Then Put #NumRegister, Puntero, HMS 'Vector_Respaldo(i) Puntero = Seek(NumRegister) End If Put #NumRegister, Puntero, Vector_Respaldo(0) Puntero = Seek(NumRegister) 'Cambiar fecha_anterior Fecha_Anterior = Fecha Puntero = Seek(NumRegister) Close NumRegister End Sub Public Sub AbrirGrafica(Archivo As String) Dim SubIndice As Long Dim pos As Long Dim Renglon As Long Dim z As Long Dim SubIndex As Long 'Para obtener de manera segura, un numero de fichero libre NumRegistro = FreeFile Direccion = "c:\" + NomArchivo 'Abrir el archivo por acceso binario Open Direccion For Binary As #NumRegistro Len = Len(DATOS) SubIndice = 0 Renglon = 0 SubIndex = 0 Do 'Leer los datos con la sentencia Get Get #NumRegistro, , DATOS TxtDATO.Text = TxtDATO.Text + Str(DATOS.Dato) Vector_Renglon(SubIndex) = Val(TxtDATO.Text) SubIndex = SubIndex + 1 TxtDATO.Text = "" Posicion = Seek(NumRegistro) Loop Until EOF(NumRegistro) LblListo.Caption = "ok" 'nada por aqui Posicion = Seek(NumRegistro) Close NumRegistro End Sub 'Abrir el archivo de Errores Public Sub AbrirErrores(Archivo7 As String) Dim SubIndice As Long Dim SubIndex As Long

Page 256: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xv

Dim pos As Long Dim Renglon As Long Dim z As Long 'Para obtener de manera segura, un numero de fichero libre NumRegistro7 = FreeFile Direccion7 = "c:\" + NomArchivo7 'Abrir el archivo por acceso binario Open Direccion7 For Binary As #NumRegistro7 Len = Len(DATOS) SubIndex = 0 SubIndice = 0 Renglon = 0 Do 'Leer los datos con la sentencia Get Get #NumRegistro7, , DATOS TxtDATO_Errores.Text = TxtDATO_Errores.Text + Str(DATOS.Dato) 'Alamecenar todos los valores en un vector Vector_Renglon7(SubIndex) = Val(TxtDATO_Errores.Text) SubIndex = SubIndex + 1 If (SubIndex > NumRenglones) Then GoTo Cerrar End If TxtDATO_Errores.Text = "" Posicion = Seek(NumRegistro7) Loop Until EOF(NumRegistro7) Cerrar: Posicion = Seek(NumRegistro7) Close NumRegistro7 End Sub 'Abrir el archivo de Errores Public Sub AbrirCeros(Archivo7 As String) Dim SubIndice As Long Dim SubIndex As Long Dim pos As Long Dim Renglon As Long Dim z As Long 'Para obtener de manera segura, un numero de fichero libre NumRegistro7 = FreeFile Direccion7 = "c:\" + NomArchivo7 'Abrir el archivo por acceso binario Open Direccion7 For Binary As #NumRegistro7 Len = Len(DATOS) SubIndex = 0 SubIndice = 0 Renglon = 0 Do 'Leer los datos con la sentencia Get Get #NumRegistro7, , DATOS TxtDATO_Errores.Text = TxtDATO_Errores.Text + Str(DATOS.Dato) 'Alamecenar todos los valores en un vector Vector_Renglon7(SubIndex) = Val(TxtDATO_Errores.Text) SubIndex = SubIndex + 1 If (SubIndex > NumRenglones) Then GoTo Cerrar End If TxtDATO_Errores.Text = "" Posicion = Seek(NumRegistro7) Loop Until EOF(NumRegistro7) Cerrar: TxtDATO_Errores.Text = "" Posicion = Seek(NumRegistro7) Close NumRegistro7 End Sub Public Sub SubMuestreo() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo If (Columna = 0) Then 'Matrix_Graficador0(Columna, 1) = (((Max_Volt_PF + (0.1 * Max_Volt_PF)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) Matrix_Graficador0(Columna, 1) = Vector_Renglon(Columna) '(((Max_Volt_PF + (0.1 * Max_Volt_PF)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) Else 'Matrix_Graficador0(Columna / Periodo_Submuestreo, 1) = (((Max_Volt_PF + (0.1 * Max_Volt_PF)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) Matrix_Graficador0(Columna / Periodo_Submuestreo, 1) = Vector_Renglon(Columna) '(((Max_Volt_PF + (0.1 * Max_Volt_PF)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) End If

Page 257: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xvi

Next Columna End If End Sub Public Sub SubMuestreo2() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo If (Columna = 0) Then Matrix_Graficador1(Columna, 1) = (((Max_Volt_BB + (0.1 * Max_Volt_BB)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) Else Matrix_Graficador1((Columna) / Periodo_Submuestreo, 1) = (((Max_Volt_BB + (0.1 * Max_Volt_BB)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) End If Next Columna End If aqui = (((Max_Volt_BB + (0.1 * Max_Volt_BB)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna - 1) Verdf = Vector_Renglon(Columna - 1) End Sub Public Sub SubMuestreo4() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo If (Columna = 0) Then Matrix_Graficador2(Columna, 1) = Vector_Renglon(Columna) Else Matrix_Graficador2((Columna) / Periodo_Submuestreo, 1) = Vector_Renglon(Columna) End If Next Columna End If End Sub Public Sub SubMuestreo5() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo If (Columna = 0) Then Matrix_Graficador3(Columna, 1) = Vector_Renglon(Columna) Else Matrix_Graficador3((Columna) / Periodo_Submuestreo, 1) = Vector_Renglon(Columna) End If Next Columna End If End Sub Public Sub Almacenar_MatrizErrores() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To (TIEMPO - 1) Step 1 Matrix_Graficador4(Columna, 1) = Vector_Renglon7(Columna) ' * Columna + 10 Txt_Errores.Text = Txt_Errores.Text & "-" & Str(Matrix_Graficador4(Columna, 1)) Next Columna End If End Sub Public Sub Almacenar_MatrizCeros() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To (TIEMPO - 1) Step 1 Matrix_Graficador8(Columna, 1) = Vector_Renglon7(Columna) ' * Columna + 10 Next Columna For Columna = 0 To (TIEMPO - 1) Step 1 Matrix_Graficador4(Columna, 5) = Matrix_Graficador8(Columna, 1) Next Columna End If End Sub Public Sub Lineas_Alarma() 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Select Case Serie Case 2 Matrix_Graficador0((Renglon) / Periodo_Submuestreo, Serie) = Min_Volt_PF Case 3

Page 258: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xvii

Matrix_Graficador0((Renglon) / Periodo_Submuestreo, Serie) = Max_Volt_PF Case 4 Matrix_Graficador0((Renglon) / Periodo_Submuestreo, Serie) = Min_Volt_PF - 1 Case 5 Matrix_Graficador0((Renglon) / Periodo_Submuestreo, Serie) = Max_Volt_PF + 1 Case 6 Matrix_Graficador0((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Volt_PF End Select Next Renglon Next Serie 'Case para establecer los colores de las lineas indicadoras de alarmas (de cada serie) For Serie = 1 To 6 Step 1 Select Case Serie Case 1 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With Case 2 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 3 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 4 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With Case 5 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With Case 6 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With End Select Next Serie Pintar_Alarma End Sub Public Sub Establecer_Colores_Series() 'Case para establecer los colores de las lineas indicadoras de alarmas (de cada serie) For Serie = 1 To 6 Step 1 Select Case Serie Case 1 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With

Page 259: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xviii

Case 2 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 3 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 4 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With Case 5 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With Case 6 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With End Select Next Serie End Sub Public Sub Lineas_Alarma2() 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Select Case Serie Case 2 Matrix_Graficador1((Renglon) / Periodo_Submuestreo, Serie) = Min_Volt_BB Case 3 Matrix_Graficador1((Renglon) / Periodo_Submuestreo, Serie) = Max_Volt_BB Case 4 Matrix_Graficador1((Renglon) / Periodo_Submuestreo, Serie) = Min_Volt_BB - 1 Case 5 Matrix_Graficador1((Renglon) / Periodo_Submuestreo, Serie) = Max_Volt_BB + 1 Case 6 Matrix_Graficador1((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Volt_BB End Select Next Renglon Next Serie Pintar_Alarma2 End Sub Public Sub Lineas_Alarma45() 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Select Case Serie Case 2 Matrix_Graficador2((Renglon) / Periodo_Submuestreo, Serie) = 0 Matrix_Graficador3((Renglon) / Periodo_Submuestreo, Serie) = 0 Case 3 Matrix_Graficador2((Renglon) / Periodo_Submuestreo, Serie) = 1 Matrix_Graficador3((Renglon) / Periodo_Submuestreo, Serie) = 1 Case 4 Matrix_Graficador2((Renglon) / Periodo_Submuestreo, Serie) = 0 + 0.1

Page 260: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xix

Matrix_Graficador3((Renglon) / Periodo_Submuestreo, Serie) = 0 + 0.1 Case 5 Matrix_Graficador2((Renglon) / Periodo_Submuestreo, Serie) = 1 - 0.1 Matrix_Graficador3((Renglon) / Periodo_Submuestreo, Serie) = 1 - 0.1 Case 6 Matrix_Graficador2((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Transferencia Matrix_Graficador3((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Transferencia End Select Next Renglon Next Serie Pintar_Alarma45 End Sub Public Sub Lineas_AlarmaErrores() 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To (TIEMPO - 1) Step 1 Select Case Serie Case 2 Matrix_Graficador4((Renglon), Serie) = Max_Error Case 3 Matrix_Graficador4((Renglon), Serie) = Max_Error Case 4 Matrix_Graficador4((Renglon), Serie) = Max_Error Case 5 Matrix_Graficador4((Renglon), Serie) = Max_Error Case 6 Matrix_Graficador4((Renglon), Serie) = Amplitud_Alarma_Error End Select Next Renglon Next Serie Pintar_Alarma7 End Sub Public Sub Pintar_Alarma() 'Revisar cuales Alarmas Preventivas han durado 'lo suficiente para ser alarma Dim Serie1, Serie2 As Integer Dim DURACION As Integer Dim AlarmaPrev_Anterior As Integer Dim Flag_Inicio As Integer Dim Pos_AlarmaPrev_Ini As Integer Dim Pos_Alarma As Integer 'Posicion que almacenará la posicion de la alarma Pos_Alarma = 0 Flag_Inicio = 0 Serie2 = 0 Serie1 = 0 DURACION = 0 Flag_Inicio = 0 Dim Min_Volt As Single Dim Max_Volt As Single Dim DIFERENCIA As Single Min_Volt = Min_Volt_PF Max_Volt = Max_Volt_PF Do While (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) If ((Matrix_Graficador0(Serie1, 1) < Min_Volt_PF) Or (Matrix_Graficador0(Serie1, 1) > Max_Volt_PF)) Then Do While ((((Matrix_Graficador0(Serie1, 1)) < Min_Volt) Or ((Matrix_Graficador0(Serie1, 1)) > Max_Volt)) And (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1))) 'Aplicar los niveles para histeresis del 1% If (Matrix_Graficador0(Serie1, 1) > Max_Volt) Or (Matrix_Graficador0(Serie1, 1) < Min_Volt_PF) Then DIFERENCIA = Max_Volt_PF - Min_Volt_PF Max_Volt = (((Max_Volt_PF) - (0.01 * DIFERENCIA))) Min_Volt = (((Min_Volt_PF) + (0.01 * DIFERENCIA))) End If If (Flag_Inicio = 0) Then Flag_Inicio = 1 Pos_AlarmaPrev_Ini = Serie1 + 1 End If Serie1 = Serie1 + 1 DURACION = DURACION + 1 If Not (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) Then Exit Do End If Loop 'Si la alarma preventiva duro lo suficiente entonces 'cambia el color de las barras a roja=alarma If (DURACION >= Tiempo_Alarma_Volt_PF) Then

Page 261: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xx

'Sila alarma ocurre en el primer minuto alarmar desde la posición 1 If Pos_AlarmaPrev_Ini = 0 Then Vector_AlarmaON(Pos_Alarma) = 1 'Almacena la posicion donde inica la Else Vector_AlarmaON(Pos_Alarma) = Pos_AlarmaPrev_Ini 'Almacena la posicion donde inica la End If If (Pos_Alarma = 0) Then Duracion_1er_Alarma = Pos_AlarmaPrev_Ini + DURACION - 1 End If Pos_Alarma = Pos_Alarma + 1 'Alarma End If End If Flag_Inicio = 0 DURACION = 0 Serie1 = Serie1 + 1 Loop '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Para saber en que minuto se encuentra la primera alarma For k = 1 To TIEMPO Step 1 If (Duracion_1er_Alarma > ((((k - 1) * (NumBytes_1seg + 1)) / Periodo_Submuestreo))) And (Duracion_1er_Alarma <= (((k) * (NumBytes_1seg + 1)) / Periodo_Submuestreo)) And (Duracion_1er_Alarma <> 0) Then MINUTE = k End If Next k LblMinute = Str(MINUTE) Lbl1er_Minuto.Caption = Str(Duracion_1er_Alarma) '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Corrimiento If (Vector_AlarmaON(0) + Duracion_1er_Alarma - ((NumBytes_1seg + 1) / Periodo_Submuestreo) <= Tiempo_Alarma_Volt_PF) Then Corrimiento End If Dibujar_Alarma End Sub Public Sub Pintar_Alarma2() 'Revisar cuales Alarmas Preventivas han durado 'lo suficiente para ser alarma Dim Serie1, Serie2 As Integer Dim DURACION As Integer Dim AlarmaPrev_Anterior As Integer Dim Flag_Inicio As Integer Dim Pos_AlarmaPrev_Ini As Integer Dim Pos_Alarma As Integer 'Posicion que almacenará la posicion de la alarma Pos_Alarma = 0 Flag_Inicio = 0 Serie2 = 0 Serie1 = 0 DURACION = 0 Flag_Inicio = 0 Dim Max As Single Dim Min As Single Dim DIFERENCIA As Single Max = Max_Volt_BB Min = Min_Volt_BB Do While (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) If ((Matrix_Graficador1(Serie1, 1) < Min_Volt_BB) Or (Matrix_Graficador1(Serie1, 1) > Max_Volt_BB)) Then Do While ((((Matrix_Graficador1(Serie1, 1)) < Min) Or ((Matrix_Graficador1(Serie1, 1)) > Max)) And (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1))) 'Aplicar los niveles para histeresis del 1% If (Matrix_Graficador1(Serie1, 1) > Max) Or (Matrix_Graficador1(Serie1, 1) < Min) Then DIFERENCIA = Max_Volt_BB - Min_Volt_BB Max = (((Max_Volt_BB) - (0.01 * DIFERENCIA))) 'DIFERENCIA Min = (((Min_Volt_BB) + (0.01 * DIFERENCIA))) 'DIFERENCIA End If If (Flag_Inicio = 0) Then Flag_Inicio = 1 Pos_AlarmaPrev_Ini = Serie1 + 1 End If Serie1 = Serie1 + 1 DURACION = DURACION + 1 If Not (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) Then Exit Do End If Loop 'Si la alarma preventiva duro lo suficiente entonces 'cambia el color de las barras a roja=alarma If (DURACION >= Tiempo_Alarma_Volt_BB) Then 'Si la alarma ocurre en el primer minuto alarmar desde la posición 1

Page 262: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxi

If Pos_AlarmaPrev_Ini = 0 Then Vector_AlarmaON_Volt_BB(Pos_Alarma) = 1 'Almacena la posicion donde inica la Else Vector_AlarmaON_Volt_BB(Pos_Alarma) = Pos_AlarmaPrev_Ini 'Almacena la posicion donde inica la End If If (Pos_Alarma = 0) Then Duracion_1er_Alarma_Volt_BB = Pos_AlarmaPrev_Ini + DURACION - 1 End If Pos_Alarma = Pos_Alarma + 1 'Alarma End If End If Flag_Inicio = 0 DURACION = 0 Serie1 = Serie1 + 1 Loop '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Para saber en que minuto se encuentra la primera alarma For k = 1 To TIEMPO Step 1 If (Duracion_1er_Alarma_Volt_BB > ((((k - 1) * (NumBytes_1seg + 1)) / Periodo_Submuestreo))) And (Duracion_1er_Alarma_Volt_BB <= (((k) * (NumBytes_1seg + 1)) / Periodo_Submuestreo)) And (Duracion_1er_Alarma_Volt_BB <> 0) Then MINUTE1 = k End If Next k LblMinute = Str(MINUTE1) Lbl1er_Minuto.Caption = Str(Duracion_1er_Alarma_Volt_BB) '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Corrimiento If (Vector_AlarmaON_Volt_BB(0) + Duracion_1er_Alarma_Volt_BB - ((NumBytes_1seg + 1) / Periodo_Submuestreo) <= Tiempo_Alarma_Volt_BB) Then Corrimiento2 End If Dibujar_Alarma2 End Sub Public Sub Pintar_Alarma45() 'Detectar si se realizó la transferencia (Transferencia=1), cuando CFE=0 Dim Serie1 As Integer Dim Serie2 As Integer Dim DURACION As Integer Dim Pos_Alarma As Integer Dim Flag_Inicio As Integer Dim Pos_Alarma_Prev_Ini As Integer Flag_Inicio = 0 Do While (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) If (Matrix_Graficador2(Serie1, 1) = Matrix_Graficador3(Serie1, 1)) Then Do While (Matrix_Graficador2(Serie1, 1) = Matrix_Graficador3(Serie1, 1)) And (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) If (Flag_Inicio = 0) Then Flag_Inicio = 1 Pos_AlarmaPrev_Ini = Serie1 End If Serie1 = Serie1 + 1 DURACION = DURACION + 1 If Not (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) Then Exit Do End If Loop 'Si dura lo suficiente que alarme If (DURACION >= Tiempo_Alarma_Transferencia_CFEPF) Then If Pos_AlarmaPrev_Ini = 0 Then Vector_AlarmaON_Transferencia(Pos_Alarma) = 1 'Almacena la posicion donde inica la Else Vector_AlarmaON_Transferencia(Pos_Alarma) = Pos_AlarmaPrev_Ini 'Almacena la posicion donde inica la End If If (Pos_Alarma = 0) Then Duracion_1er_Alarma_CFE_Transferencia = Pos_AlarmaPrev_Ini + DURACION - 1 End If Pos_Alarma = Pos_Alarma + 1 End If End If Flag_Inicio = 0 DURACION = 0 Serie1 = Serie1 + 1 Loop '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Para saber en que minuto se encuentra la primera alarma For k = 1 To TIEMPO Step 1

Page 263: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxii

If (Duracion_1er_Alarma_CFE_Transferencia > ((((k - 1) * (NumBytes_1seg + 1)) / Periodo_Submuestreo))) And (Duracion_1er_Alarma_CFE_Transferencia <= (((k) * (NumBytes_1seg + 1)) / Periodo_Submuestreo)) And (Duracion_1er_Alarma_CFE_Transferencia <> 0) Then MINUTE2 = k End If Next k LblMinute = Str(MINUTE2) Lbl1er_Minuto.Caption = Str(Duracion_1er_Alarma_CFE_Transferencia) '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Corrimiento If (Vector_AlarmaON_Transferencia(0) + Duracion_1er_Alarma_CFE_Transferencia - ((NumBytes_1seg + 1) / Periodo_Submuestreo) <= Tiempo_Alarma_Transferencia_CFEPF) Then Corrimiento45 End If Dibujar_AlarmaPreventiva45 Dibujar_Alarma45 ''''''''''''''''''''''''''''''*********************''''''''''''''''''''' End Sub Public Sub Dibujar_AlarmaPreventiva45() Dim Serie1 If (TIEMPO <> 0) Then Serie1 = ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) 'Ultimo valor a graficar 'revisar el ultimmo valor del vector para saber si existe alarma preventiva If (Matrix_Graficador2(Serie1, 1) = Matrix_Graficador3(Serie1, 1)) Then '(Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) 'Pintar alarma preventiva If (Matrix_Graficador2(Serie1, 1) = 0) Then Flag_Preventiva45 = 2 Else Flag_Preventiva45 = 3 End If Else 'Escondelas Flag_Preventiva45 = 0 End If End If End Sub Public Sub Pintar_Alarma7() 'Revisar cuales Alarmas Preventivas han durado 'lo suficiente para ser alarma Dim Serie1, Serie2 As Integer Dim DURACION As Integer Dim AlarmaPrev_Anterior As Integer Dim Flag_Inicio As Integer Dim Pos_AlarmaPrev_Ini As Integer Dim Pos_Alarma As Integer Flag_Inicio = 0 Serie2 = 0 Serie1 = 0 DURACION = 0 Flag_Inicio = 0 Do While (Serie1 <= (TIEMPO - 1)) If (Matrix_Graficador4(Serie1, 1) > Max_Error) Then Do While (((Matrix_Graficador4(Serie1, 1)) > 0) And ((Matrix_Graficador4(Serie1, 1)) > Max_Error)) And (Serie1 <= (TIEMPO - 1)) If (Flag_Inicio = 0) Then Flag_Inicio = 1 Pos_AlarmaPrev_Ini = Serie1 End If Serie1 = Serie1 + 1 DURACION = DURACION + 1 If Not (Serie1 <= (TIEMPO - 1)) Then Exit Do End If Loop 'Si la alarma preventiva duro lo suficiente entonces 'cambia el color de las barras a roja=alarma If (DURACION >= Tiempo_Alarma_Error) Then If Pos_AlarmaPrev_Ini = 0 Then Vector_AlarmaON_Errores(Pos_Alarma) = 0 'Almacena la posicion donde inica la Else Vector_AlarmaON_Errores(Pos_Alarma) = Pos_AlarmaPrev_Ini 'Almacena la posicion donde inica la End If If (Pos_Alarma = 0) Then Duracion_1er_Alarma_Errores = Pos_AlarmaPrev_Ini + DURACION - 1 End If Pos_Alarma = Pos_Alarma + 1 'Alarma End If End If Flag_Inicio = 0 DURACION = 0 Serie1 = Serie1 + 1 Loop ''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Page 264: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxiii

'Para saber en que minuto se encuentra la primera alarma For k = 1 To (TIEMPO - 1) Step 1 If (Duracion_1er_Alarma_Errores > (k - 1)) And (Duracion_1er_Alarma_Errores <= k) Then MINUTE3 = k End If Next k LblMinute = Str(MINUTE3) Lbl1er_Minuto.Caption = Str(Duracion_1er_Alarma_Errores + 1) '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Corrimiento If (Vector_AlarmaON_Errores(0) + (Duracion_1er_Alarma_Errores + 1) <= Tiempo_Alarma_Error) Then Corrimiento7 End If Dibujar_Alarma7 ''''''''''''''''''''''''''''''*********************''''''''''''''''''''' End Sub Public Sub Limpiar_VectorAlarmaOn() If Vector_AlarmaON(Dimension - 1) <> 0 Then ReDim Vector_AlarmaON(Dimension) ReDim Vector_AlarmaON_OFF(Dimension) End If End Sub Public Sub Corrimiento() 'Cuando tiempo llegue a su máximo+1 significa que se estan realizando los corrimientos en los archivos 'Por lo tanto es necesario realizar los corrimientos en los indicadores de alarma If Flag_Corrimiento = 2 Then 'Hacer corrimiento For i = 0 To TIEMPO Step 1 Vector_AlarmaON_OFF(i) = Vector_AlarmaON_OFF(i + 1) Vector_AlarmaON(i) = Vector_AlarmaON(i + 1) Vector_AlarmaON_OFF_Flag(i) = Vector_AlarmaON_OFF_Flag(i + 1) Next i 'Hacer cero la ultima posición Vector_AlarmaON_OFF(i + 1) = 0 Vector_AlarmaON(i + 1) = 0 Vector_AlarmaON_OFF_Flag(i + 1) = 0 End If End Sub Public Sub Corrimiento2() 'Cuando tiempo llegue a su máximo+1 significa que se estan realizando los corrimientos en los archivos 'Por lo tanto es necesario realizar los corrimientos en los indicadores de alarma If Flag_Corrimiento = 2 Then 'Hacer corrimiento For i = 0 To TIEMPO Step 1 Vector_AlarmaON_Volt_BB_OFF(i) = Vector_AlarmaON_Volt_BB_OFF(i + 1) Vector_AlarmaON_Volt_BB(i) = Vector_AlarmaON_Volt_BB(i + 1) Vector_AlarmaON_Volt_BB_OFF_Flag(i) = Vector_AlarmaON_Volt_BB_OFF_Flag(i + 1) Next i 'Hacer cero la ultima posición Vector_AlarmaON_Volt_BB_OFF(i + 1) = 0 Vector_AlarmaON_Volt_BB(i + 1) = 0 Vector_AlarmaON_Volt_BB_OFF_Flag(i + 1) = 0 End If End Sub Public Sub Corrimiento45() 'Cuando tiempo llegue a su máximo+1 significa que se estan realizando los corrimientos en los archivos 'Por lo tanto es necesario realizar los corrimientos en los indicadores de alarma If Flag_Corrimiento = 2 Then 'Hacer corrimiento For i = 0 To TIEMPO Step 1 Vector_AlarmaON_Transferencia_OFF(i) = Vector_AlarmaON_Transferencia_OFF(i + 1) Vector_AlarmaON_Transferencia(i) = Vector_AlarmaON_Transferencia(i + 1) Vector_AlarmaON_Transferencia_OFF_Flag(i) = Vector_AlarmaON_Transferencia_OFF_Flag(i + 1) Next i 'Hacer cero la ultima posición Vector_AlarmaON_Transferencia_OFF(i + 1) = 0 Vector_AlarmaON_Transferencia(i + 1) = 0 Vector_AlarmaON_Transferencia_OFF_Flag(i + 1) = 0 End If End Sub Public Sub Corrimiento7() 'Cuando tiempo llegue a su máximo+1 significa que se estan realizando los corrimientos en los archivos 'Por lo tanto es necesario realizar los corrimientos en los indicadores de alarma If Flag_Corrimiento = 2 Then 'Hacer corrimiento For i = 0 To (TIEMPO - 2) Step 1 Vector_AlarmaON_Errores_OFF(i) = Vector_AlarmaON_Errores_OFF(i + 1) Vector_AlarmaON_Errores(i) = Vector_AlarmaON_Errores(i + 1) Vector_AlarmaON_Errores_OFF_Flag(i) = Vector_AlarmaON_Errores_OFF_Flag(i + 1) Next i 'Hacer cero la ultima posición Vector_AlarmaON_Errores_OFF(i + 1) = 0 Vector_AlarmaON_Errores(i + 1) = 0 Vector_AlarmaON_Errores_OFF_Flag(i + 1) = 0

Page 265: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxiv

End If End Sub Public Sub Dibujar_Alarma() Dim i As Integer For i = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 If (Vector_AlarmaON(i) <= ((TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) And (Vector_AlarmaON(i) > 0) And (Vector_AlarmaON_OFF(i) <> 1) Then 'Pintar linea de alarma en rojo For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Matrix_Graficador0((Renglon) / Periodo_Submuestreo, 6) = Matrix_Graficador0(Vector_AlarmaON(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) Next Renglon 'Alamacenar la amplitud de la Alarma Amplitud_Alarma_Volt_PF = Matrix_Graficador0(Vector_AlarmaON(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) 'Marca que ya se activo dicha alarma, para que sólo se alarma una vez por alarma Vector_AlarmaON_OFF(i) = 1 'Pintar linea de alarma en rojo Flag_Alarma_Volt_PF_On = 1 End If Next i Msg_Alarma_Volt_PF 'Ver las banderas en un textbox 'Ver en un textbox el contebido del vector de alarmas For l = 0 To TIEMPO Step 1 TxtPosi_Alarma.Text = TxtPosi_Alarma.Text & "-" & Str(Vector_AlarmaON(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma.Text = TxtFlags_Alarma.Text & "-" & Str(Vector_AlarmaON_OFF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma_Escrita.Text = TxtFlags_Alarma_Escrita.Text & "-" & Str(Vector_AlarmaON_OFF_Flag(l)) Next l '''HISTERESIS HISTERESIS_1Porciento Min_Volt_PF, Max_Volt_PF, Matrix_Graficador0 End Sub 'Aplicar HISTERESIS Public Sub HISTERESIS() ''if ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Dim Min_Volt As Single Dim Max_Volt As Single 'Aplicar los niveles para histeresis del 1% Min_Volt = ((Min_Volt_PF) + (0.01 * Min_Volt_PF)) / 0.99 Max_Volt = ((Max_Volt_PF) + (0.01 * Max_Volt_PF)) / 0.99 If TIEMPO <> 0 Then If (Matrix_Graficador0((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1, 1) < Min_Volt) Then 'Cambiar la amplitud de las lineas de alarma For k = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0(k, 2) = Min_Volt Next k End If If (Matrix_Graficador0((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1, 1) > Max_Volt) Then 'Cambiar la amplitud de las lineas de alarma For k = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0(k, 3) = Max_Volt Next k End If End If End Sub Public Sub Dibujar_Alarma2() Dim i As Integer For i = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 If (Vector_AlarmaON_Volt_BB(i) <= ((TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) And (Vector_AlarmaON_Volt_BB(i) > 0) And (Vector_AlarmaON_Volt_BB_OFF(i) <> 1) Then 'Pintar linea de alarma en rojo For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Matrix_Graficador1((Renglon) / Periodo_Submuestreo, 6) = Matrix_Graficador1(Vector_AlarmaON_Volt_BB(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) Next Renglon 'Alamacenar la amplitud de la Alarma Amplitud_Alarma_Volt_BB = Matrix_Graficador1(Vector_AlarmaON_Volt_BB(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) 'Marca que ya se activo dicha alarma, para que sólo se alarma una vez por alarma Vector_AlarmaON_Volt_BB_OFF(i) = 1 'Pintar linea de alarma en rojo Flag_Alarma_Volt_BB_On = 1 End If Next i Msg_Alarma_Volt_BB

Page 266: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxv

'Ver las banderas en un textbox 'Ver en un textbox el contebido del vector de alarmas For l = 0 To TIEMPO Step 1 TxtPosi_Alarma.Text = TxtPosi_Alarma.Text & "-" & Str(Vector_AlarmaON_Volt_BB(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma.Text = TxtFlags_Alarma.Text & "-" & Str(Vector_AlarmaON_Volt_BB_OFF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma_Escrita.Text = TxtFlags_Alarma_Escrita.Text & "-" & Str(Vector_AlarmaON_Volt_BB_OFF_Flag(l)) Next l HISTERESIS_1Porciento Min_Volt_BB, Max_Volt_BB, Matrix_Graficador1 End Sub Public Sub HISTERESIS_1Porciento(Min_Val As Integer, Max_Val As Integer, Matriz() As Single) Dim Min As Single Dim Max As Single Dim DIFERENCIA As Single 'Aplicar los niveles para histeresis del 1% DIFERENCIA = Max_Val - Min_Val Max = (((Max_Val) - (0.01 * DIFERENCIA))) 'DIFERENCIA Min = (((Min_Val) + (0.01 * DIFERENCIA))) 'DIFERENCIA If TIEMPO <> 0 Then If (Matriz((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1, 1) < Min) Then 'Cambiar la amplitud de las lineas de alarma For k = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matriz(k, 2) = Min Next k End If If (Matriz((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1, 1) > Max) Then 'Cambiar la amplitud de las lineas de alarma For k = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matriz(k, 3) = Max Next k End If End If End Sub Public Sub Dibujar_Alarma45() Dim i As Integer For i = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 If (Vector_AlarmaON_Transferencia(i) <= ((TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) And (Vector_AlarmaON_Transferencia(i) > 0) And (Vector_AlarmaON_Transferencia_OFF(i) <> 1) Then 'Pintar linea de alarma en rojo For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Matrix_Graficador2((Renglon) / Periodo_Submuestreo, 6) = Matrix_Graficador2(Vector_AlarmaON_Transferencia(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) Matrix_Graficador3((Renglon) / Periodo_Submuestreo, 6) = Matrix_Graficador3(Vector_AlarmaON_Transferencia(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) Next Renglon 'Alamacenar la amplitud de la Alarma Amplitud_Alarma_Transferencia = Matrix_Graficador2(Vector_AlarmaON_Transferencia(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) 'Marca que ya se activo dicha alarma, para que sólo se alarma una vez por alarma Vector_AlarmaON_Transferencia_OFF(i) = 1 'Pintar linea de alarma en rojo Flag_Alarma_Transferencia_On = 1 End If Next i Msg_Alarma_Transferencia 'Ver las banderas en un textbox 'Ver en un textbox el contebido del vector de alarmas For l = 0 To TIEMPO Step 1 TxtPosi_Alarma.Text = TxtPosi_Alarma.Text & "-" & Str(Vector_AlarmaON_Transferencia(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma.Text = TxtFlags_Alarma.Text & "-" & Str(Vector_AlarmaON_Transferencia_OFF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma_Escrita.Text = TxtFlags_Alarma_Escrita.Text & "-" & Str(Vector_AlarmaON_Transferencia_OFF_Flag(l)) Next l End Sub Public Sub Dibujar_Alarma7() Dim i As Integer For i = 0 To (TIEMPO - 1) Step 1 If (Vector_AlarmaON_Errores(i) <= TIEMPO) And (Vector_AlarmaON_Errores(i) > 0) And (Vector_AlarmaON_Errores_OFF(i) <> 1) Or ((Duracion_1er_Alarma_Errores >= Tiempo_Alarma_Error) And (Vector_AlarmaON_Errores(0) = 0) And (Vector_AlarmaON_Errores_OFF(0) <> 1)) Then 'Pintar linea de alarma en rojo For Renglon = 0 To (TIEMPO - 1) Step 1 Matrix_Graficador4(Renglon, 6) = Matrix_Graficador4(Vector_AlarmaON_Errores(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) Next Renglon 'Alamacenar la amplitud de la Alarma

Page 267: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxvi

Amplitud_Alarma_Error = Matrix_Graficador4(Vector_AlarmaON_Errores(i), 1) 'Vector_Submuestreo(Vector_AlarmaON(i)) 'Marca que ya se activo dicha alarma, para que sólo se alarma una vez por alarma Vector_AlarmaON_Errores_OFF(i) = 1 'Pintar linea de alarma en rojo Flag_Alarma_Errores_On = 1 End If Next i Msg_Alarma_Errores 'Ver las banderas en un textbox 'Ver en un textbox el contebido del vector de alarmas For l = 0 To (TIEMPO - 1) Step 1 TxtPosi_Alarma.Text = TxtPosi_Alarma.Text & "-" & Str(Vector_AlarmaON_Errores(l)) Next l For l = 0 To (TIEMPO - 1) Step 1 TxtFlags_Alarma.Text = TxtFlags_Alarma.Text & "-" & Str(Vector_AlarmaON_Errores_OFF(l)) Next l For l = 0 To (TIEMPO - 1) Step 1 TxtFlags_Alarma_Escrita.Text = TxtFlags_Alarma_Escrita.Text & "-" & Str(Vector_AlarmaON_Errores_OFF_Flag(l)) Next l End Sub Public Sub Msg_Alarma_Volt_PF() If (Flag_Alarma_Volt_PF = 1) Then 'Pintalo rojo MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False End If End Sub Public Sub Msg_Alarma_Volt_BB() If (Flag_Alarma_Volt_BB = 1) Then 'Pintalo rojo MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False End If End Sub Public Sub Msg_Alarma_Transferencia() If (Flag_Alarma_Transferencia = 1) Then 'Pintalo rojo MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False End If End Sub Public Sub Msg_Alarma_Errores() If (Flag_Alarma_Errores = 1) Or (Flag_Alarma_Errores_On = 1) Then 'Pintalo rojo MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False LblMsg.Caption = "Entro a Msg_Alarma_Errores" End If End Sub Private Sub Chk_Zoom_Click() 'Bandera que indica que fue seleccionado el Chk_Zoom Flag_Zoom = Chk_Zoom.Value 'Revisar valor del chk_zoom Checa_Zoom If (Chk_Zoom.Value <> 1) Then Mostrar_Grafica End If End Sub Public Sub Checa_Zoom() 'Habilitar todas las opciones de Zoom cuando se active el Chk_Zoom If (Chk_Zoom.Value = 1) Then Cmd_Aceptar_Zoom.Enabled = True Chk_Lim_Inferior.Enabled = True Chk_Lim_Superior.Enabled = True 'Permitir seleccionar las partes del grafico MSChart_Graficador0.AllowSelections = True 'Desactivar el primer menu de opcion Desactivar_Menu Else 'Activar el primer menu de opcion Activar_Menu Cmd_Aceptar_Zoom.Enabled = False Chk_Lim_Inferior.Enabled = False Chk_Lim_Superior.Enabled = False 'No Permitir seleccionar las partes del grafico MSChart_Graficador0.AllowSelections = False 'Reactivar todas las series For j = 2 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(j).Position.Hidden = False Next j 'Inicilizar contador de limites para el zoom Pos_Pila = 0 Lblpila.Caption = Str(Pos_Pila) 'Limpiar bandera indicadora de profundidad de zoom Flag_Profundidad_Zoom = 0 'Limpiar la variable que alamcena el minuto de inicio anterior Min_Inicio_Anterior = 0

Page 268: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxvii

DIFERENCIA = 0 End If 'desactivar alarma MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True If (Opcion(2).Value = True) Then MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If End Sub Private Sub Chk_Zoom1_Click() 'Bandera que indica que fue seleccionado el Chk_Zoom Flag_Zoom1 = Chk_Zoom1.Value 'Revisar valor del chk_zoom Checa_Zoom1 If (Chk_Zoom1.Value <> 1) Then Mostrar_Grafica1 End If End Sub Public Sub Checa_Zoom1() 'Habilitar todas las opciones de Zoom cuando se active el Chk_Zoom If (Chk_Zoom1.Value = 1) Then Cmd_Aceptar_Zoom1.Enabled = True Chk_Lim_Inferior1.Enabled = True Chk_Lim_Superior1.Enabled = True 'Permitir seleccionar las partes del grafico MSChart_Graficador1.AllowSelections = True 'Desactivar el primer menu de opcion Desactivar_Menu1 Else 'Activar el primer menu de opcion Activar_Menu1 Cmd_Aceptar_Zoom1.Enabled = False Chk_Lim_Inferior1.Enabled = False Chk_Lim_Superior1.Enabled = False 'Reactivar todas las series 'Permitir seleccionar las partes del grafico MSChart_Graficador1.AllowSelections = False For j = 2 To 5 Step 1 MSChart_Graficador1.Plot.SeriesCollection(j).Position.Hidden = False Next j 'Inicilizar contador de limites para el zoom Pos_Pila1 = 0 Lblpila.Caption = Str(Pos_Pila1) 'Limpiar bandera indicadora de profundidad de zoom Flag_Profundidad_Zoom1 = 0 'Limpiar la variable que alamcena el minuto de inicio anterior Min_Inicio_Anterior1 = 0 DIFERENCIA1 = 0 End If 'desactivar alarma MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End Sub Private Sub Gráficas_Anteriores_Click() Form_Visor.Show End Sub Private Sub Opcion_Click(Index As Integer) 'Para saber que grafica se desea mostrar For i = 0 To 3 If Opcion(i).Value <> False Then Select Case i Case 0 Grafica_Opcion = i 'Muestra titulo LblTitulo0.Caption = "VOLTAJE(Volts)" Habilitar_Series 'Habilitar el Menu1 y el Zoom1 Activar_Menu1 Chk_Zoom1.Enabled = True 'si la anterior opcion seleccionada es tranferencia, repintar Mschart_graficador1 'con la opcion seleccionada If (LblTitulo1.Caption = "TRANSFERENCIA") Then Opcion1(0).Value = True LblTitulo1.Caption = "CORRIENTE(Amp)" Mostrar_Grafica1 End If Establecer_Colores_Series 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 1 Grafica_Opcion = i 'Muestra titulo LblTitulo0.Caption = "VOLTAJE(Volts)" Habilitar_Series

Page 269: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxviii

'Habilitar el Menu1 y el Zoom1 Activar_Menu1 Chk_Zoom1.Enabled = True 'si la anterior opcion seleccionada es tranferencia, repintar Mschart_graficador1 'con la opcion seleccionada If (LblTitulo1.Caption = "TRANSFERENCIA") Then Opcion1(0).Value = True LblTitulo1.Caption = "CORRIENTE(Amp)" Mostrar_Grafica1 End If Establecer_Colores_Series 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 2 Grafica_Opcion = i 'Muestra titulo LblTitulo0.Caption = "C.F.E." LblTitulo1.Caption = "TRANSFERENCIA" 'Para deshabilitar las series innecesarias Deshabilitar_Series 'deshabilitar el Menu1 y el Zoom1 y limpia chk_zoom1 Chk_Zoom1.Enabled = False Chk_Zoom1.Value = 0 Desactivar_Menu1 Establecer_Colores_Series 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 3 Grafica_Opcion = i 'Muestra titulo LblTitulo0.Caption = "#ERRORES x MINUTO" Habilitar_Series 'Habilitar el Menu1 y el Zoom1 Activar_Menu1 Chk_Zoom1.Enabled = True 'si la anterior opcion seleccionada es tranferencia, repintar Mschart_graficador1 'con la opcion seleccionada If (LblTitulo1.Caption = "TRANSFERENCIA") Then Opcion1(0).Value = True LblTitulo1.Caption = "CORRIENTE(Amp)" Mostrar_Grafica1 End If 'Establecer_Color_Serie5 With MSChart_Graficador0.Plot.SeriesCollection(5).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 213, 164, 22 'Amarillo End With 'Activar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = True Lbl_CerosXMinuto.Visible = True End Select End If Next i Flag_Grafica_Opcion = Grafica_Opcion 'Si no esta activo el zoom entonces mostrar grafica If Not (Chk_Zoom.Value = 1) Then Mostrar_Grafica Else 'Si no llamar funcion realizar Zoom 'Checa_Zoom 'Deshabilita la serie 6 de alarma el gaficador1 If (Opcion(2).Value = True) Then MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If Acepta_Zoom 'Zoom End If End Sub Private Sub Opcion1_Click(Index As Integer) 'Para saber que grafica se desea mostrar 'si se deshabilito Chk_zoom1 entonces deshabilitar el menu1 For i = 0 To 2 If Opcion1(i).Value <> False Then Select Case i Case 0 Grafica_Opcion1 = i 'Poner titulo LblTitulo1.Caption = "CORRIENTE (Amp)" Habilitar_Series1 Case 1

Page 270: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxix

Grafica_Opcion1 = i 'Poner titulo LblTitulo1.Caption = "FRECUENCIA (Hz)" Habilitar_Series1 Case 2 Grafica_Opcion1 = i LblTitulo1.Caption = "CORRIENTE (Amp)" Habilitar_Series1 End Select End If Next i Flag_Grafica_Opcion1 = Grafica_Opcion1 'Si no esta activo el zoom entonces mostrar grafica If Not (Chk_Zoom1.Value = 1) Then Mostrar_Grafica1 Else 'Si no llamar funcion realizar Zoom Acepta_Zoom1 End If End Sub Public Sub Mostrar_Grafica() If TIEMPO <> 0 Then 'Para mostrar la gráfica seleccionada Select Case Grafica_Opcion Case 0 If Flag_Alarma_Volt_PF_On = 1 Then 'Mostrar linea de alarma MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False Else MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True End If Case 1 'Verificar si alarmo si es asi pintar la linea en rojo If Flag_Alarma_Volt_BB_On = 1 Then MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False Else MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True End If Case 2 'Verificar si alarmo si es asi pintar la linea en rojo If Flag_Alarma_Transferencia_On = 1 Then MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = False Else MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If Case 3 'Verificar si alarmo si es asi pintar la linea en rojo If Flag_Alarma_Errores_On = 1 Then MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = False Else MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True End If End Select Select Case Grafica_Opcion Case 0 If Chk_Zoom.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador0.ChartData = Matrix_Graficador0 'Establecer etiquetas Establecer_Labels End If Case 1 If Chk_Zoom.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador0.ChartData = Matrix_Graficador1 Establecer_Labels Establecer_Colores_Series End If Case 2 If Chk_Zoom.Value <> 1 Then 'Deshabilitar series Deshabilitar_Series MSChart_Graficador0.ChartData = Matrix_Graficador2 Establecer_Labels MSChart_Graficador1.ChartData = Matrix_Graficador3 Establecer_Labels1 Establecer_Colores_Series End If Case 3 If Chk_Zoom.Value <> 1 Then

Page 271: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxx

'Habilitar series Habilitar_Series MSChart_Graficador0.ChartData = Matrix_Graficador4 'Establecer_Color_Serie5 With MSChart_Graficador0.Plot.SeriesCollection(5).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 213, 164, 22 'Cafe End With 'Establecer_Labels For Columna = 0 To (TIEMPO - 1) Step 1 MSChart_Graficador0.Row = Columna + 1 Conta_Minutos = Columna + 1 Num_Row = Columna + 1 Establecer_Formato_HHMM Next Columna End If End Select End If End Sub Public Sub Establecer_Labels() 'Establecer etiquetas Conta_Minutos = 0 Num_labels = MSChart_Graficador0.RowCount Contador = 0 For Columna = 0 To (Num_labels - 1) Step 1 If (Columna = 0) Then Contador = 1 MSChart_Graficador0.Row = Columna + 1 MSChart_Graficador0.RowLabel = Mid(LblHora_Inicio, 1, 5) Else Contador = Contador + 1 If Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo) Then Num_Row = Columna + 1 Conta_Minutos = (Columna + 1) / ((NumBytes_1seg + 1) / Periodo_Submuestreo) Establecer_Formato_HHMM Contador = 0 Else 'Limpa label MSChart_Graficador0.Row = Columna + 1 MSChart_Graficador0.RowLabel = "" End If End If Next Columna End Sub Public Sub Establecer_Formato_HHMM() Dim HH_MM_Inicio As String Dim HORA As Integer Dim minuto As Integer Dim CADhora As String Dim CADminuto As String Dim Checar_Formato_Tiempo As String If (Len(LblHora_Inicio.Caption) > 8) Then Checar_Formato_Tiempo = 1 'Formato 1-12 horas a.m. o p.m. Else Checar_Formato_Tiempo = 0 'Formato 0-24 horas End If 'Tomar de referencia la primer etiqueta establecida si es la primera vez que se entra 'a esta funcion If (Conta_Minutos = 1) Then Etiqueta_Index = Mid(LblHora_Inicio.Caption, 1, 5) End If 'Tomar de referencia el ultimo label estblecido 'HH_MM_Inicio = LblHora_Inicio.Caption HH_MM_Inicio = Etiqueta_Index HORA = Val(Mid(HH_MM_Inicio, 1, 2)) minuto = Val(Mid(HH_MM_Inicio, 4, 5)) 'Incrementar minutos minuto = minuto + 1 Lblminutos.Caption = minuto If (minuto >= 60) Then 'Incrementa las horas HORA = HORA + 1 minuto = 0 'Dependiendo del formato usado reiniciar hora If (Checar_Formato_Tiempo = 1) Then If (HORA > 12) Then HORA = 1 End If Else If (HORA > 23) Then HORA = 0 End If

Page 272: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxi

End If End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (HORA >= 0) And (HORA <= 9) Then CADhora = ("0" & CStr(HORA)) Else CADhora = (CStr(HORA)) End If 'si los minutos son >=0 o <=9 If (minuto >= 0) And (minuto <= 9) Then CADminuto = ("0" & CStr(minuto)) Else CADminuto = (CStr(minuto)) End If Etiqueta_Index = CADhora & ":" & CADminuto '& Mid(HORA_INICIO, 6, 4) & AM_PM MSChart_Graficador0.Row = Num_Row MSChart_Graficador0.RowLabel = Etiqueta_Index LblConta_Entro = Etiqueta_Index Lblminutos = Str(minuto) End Sub Public Sub Establecer_Labels_Transferencia() 'Establecer etiquetas Dim Num_labels As Integer Num_labels = MSChart_Graficador0.RowCount Contador = 0 For Columna = 0 To (Num_labels - 1) Step 1 If (Columna = 0) Then Contador = 1 MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador1.RowLabel = Str(Columna) Else Contador = Contador + 1 If Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo) Then MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador1.RowLabel = Str((Columna + 1) / ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Contador = 0 Else 'Limpa label MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador1.RowLabel = "" '(Columna / Periodo_Submuestreo) + 1 End If End If Next Columna End Sub Public Sub Establecer_Labels1() 'Establecer etiquetas Dim Num_labels As Integer Num_labels = MSChart_Graficador1.RowCount Contador = 0 Conta_Minutos1 = 0 For Columna = 0 To (Num_labels - 1) Step 1 If (Columna = 0) Then Contador = 1 MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador1.RowLabel = Mid(LblHora_Inicio, 1, 5) 'Str(Columna) Else Contador = Contador + 1 If Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo) Then Num_Row1 = Columna + 1 Conta_Minutos1 = (Columna + 1) / ((NumBytes_1seg + 1) / Periodo_Submuestreo) Establecer_Formato_HHMM1 Contador = 0 Else 'Limpa label MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador1.RowLabel = "" '(Columna / Periodo_Submuestreo) + 1 End If End If Next Columna End Sub Public Sub Establecer_Formato_HHMM1() Dim HH_MM_Inicio1 As String Dim hora1 As Integer Dim Minuto1 As Integer Dim CADhora1 As String Dim CADminuto1 As String Dim Checar_Formato_Tiempo1 As String If (Len(LblHora_Inicio.Caption) > 8) Then Checar_Formato_Tiempo1 = 1 'Formato 1-12 horas a.m. o p.m. Else Checar_Formato_Tiempo1 = 0 'Formato 0-24 horas

Page 273: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxii

End If 'Tomar de referencia la primer etiqueta establecida si es la primera vez que se entra 'a esta funcion If (Conta_Minutos1 = 1) Then Etiqueta_Index1 = Mid(LblHora_Inicio.Caption, 1, 5) End If 'Tomar de referencia el ultimo label estblecido 'HH_MM_Inicio = LblHora_Inicio.Caption HH_MM_Inicio1 = Etiqueta_Index1 hora1 = Val(Mid(HH_MM_Inicio1, 1, 2)) Minuto1 = Val(Mid(HH_MM_Inicio1, 4, 5)) 'Incrementar minutos Minuto1 = Minuto1 + 1 Lblminutos.Caption = minuto If (Minuto1 >= 60) Then 'Incrementa las horas hora1 = HORA + 1 Minuto1 = 0 'Dependiendo del formato usado reiniciar hora If (Checar_Formato_Tiempo1 = 1) Then If (hora1 > 12) Then hora1 = 1 End If Else If (hora1 > 23) Then hora1 = 0 End If End If End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (hora1 >= 0) And (hora1 <= 9) Then CADhora1 = ("0" & CStr(hora1)) Else CADhora1 = (CStr(hora1)) End If 'si los minutos son >=0 o <=9 If (Minuto1 >= 0) And (Minuto1 <= 9) Then CADminuto1 = ("0" & CStr(Minuto1)) Else CADminuto1 = (CStr(Minuto1)) End If Etiqueta_Index1 = CADhora1 & ":" & CADminuto1 '& Mid(HORA_INICIO, 6, 4) & AM_PM MSChart_Graficador1.Row = Num_Row1 MSChart_Graficador1.RowLabel = Etiqueta_Index1 LblConta_Entro = Etiqueta_Index1 Lblminutos = Str(Minuto1) End Sub Public Sub Mostrar_Grafica1() If TIEMPO <> 0 Then 'Para mostrar la gráfica seleccionada Select Case Grafica_Opcion1 Case 0 If Flag_Alarma_Amp_PF_On = 1 Then MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = False Else MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If Case 1 'Verificar si alarmo si es asi pintar la linea en rojo If Flag_Alarma_Frec_PF_On = 1 Then MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = False Else MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If Case 2 'Verificar si alarmo si es asi pintar la linea en rojo If Flag_Alarma_Amp_BB_On = 1 Then MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = False Else MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If End Select Select Case Grafica_Opcion1 Case 0 If Chk_Zoom1.Value <> 1 Then 'Habilitar series Habilitar_Series1 MSChart_Graficador1.ChartData = Matrix_Graficador5

Page 274: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxiii

Establecer_Labels1 End If Case 1 If Chk_Zoom1.Value <> 1 Then 'Habilitar series Habilitar_Series1 MSChart_Graficador1.ChartData = Matrix_Graficador6 Establecer_Labels1 End If Case 2 If Chk_Zoom1.Value <> 1 Then 'Habilitar series Habilitar_Series1 MSChart_Graficador1.ChartData = Matrix_Graficador7 Establecer_Labels1 End If End Select End If End Sub Public Sub Carga_Seleccion_Anterior() 'Reasignar los ultimos valores señaldos en los botones de opcion yel checkbox Opcion(Flag_Grafica_Opcion).Value = True Chk_Zoom.Value = Flag_Zoom Opcion1(Flag_Grafica_Opcion1).Value = True Chk_Zoom1.Value = Flag_Zoom1 'Para el ZOOM Chk_Lim_Inferior.Value = Flag_Lim_Inferior Chk_Lim_Superior.Value = Flag_Lim_Superior Txt_Min_Inicio.Text = Str(Min_Inicio) Txt_Min_Fin.Text = Str(Min_Fin) 'Para el Zoom1 Chk_Lim_Inferior1.Value = Flag_Lim_Inferior1 Chk_Lim_Superior1.Value = Flag_Lim_Superior1 Txt_Min_Inicio1.Text = Str(Min_Inicio1) Txt_Min_Fin1.Text = Str(Min_Fin1) End Sub '************************************************************************* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Para el 2do. Menú ****************************************************** '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Sub SubMuestreo1() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo If (Columna = 0) Then Matrix_Graficador5(Columna, 1) = (((Max_Amp_PF + (0.1 * Max_Amp_PF)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) Else Matrix_Graficador5((Columna) / Periodo_Submuestreo, 1) = (((Max_Amp_PF + (0.1 * Max_Amp_PF)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) End If Next Columna End If End Sub Public Sub SubMuestreo6() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo If (Columna = 0) Then Matrix_Graficador6(Columna, 1) = Vector_Renglon(Columna) Else Matrix_Graficador6((Columna) / Periodo_Submuestreo, 1) = Vector_Renglon(Columna) End If Next Columna End If End Sub Public Sub SubMuestreo3() Dim Columna As Long Columna = 0 If TIEMPO <> 0 Then For Columna = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo If (Columna = 0) Then Matrix_Graficador7(Columna, 1) = (((Max_Amp_BB + (0.1 * Max_Amp_BB)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) Else

Page 275: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxiv

Matrix_Graficador7((Columna) / Periodo_Submuestreo, 1) = (((Max_Amp_BB + (0.1 * Max_Amp_BB)) / 0.9) / Num_Escalones_ADC) * Vector_Renglon(Columna) End If Next Columna End If End Sub Public Sub Lineas_Alarma1() 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Select Case Serie Case 2 Matrix_Graficador5((Renglon) / Periodo_Submuestreo, Serie) = Min_Amp_PF Case 3 Matrix_Graficador5((Renglon) / Periodo_Submuestreo, Serie) = Max_Amp_PF Case 4 Matrix_Graficador5((Renglon) / Periodo_Submuestreo, Serie) = Min_Amp_PF - 1 Case 5 Matrix_Graficador5((Renglon) / Periodo_Submuestreo, Serie) = Max_Amp_PF + 1 Case 6 Matrix_Graficador5((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Amp_PF End Select Next Renglon Next Serie Pintar_Alarma1 End Sub Public Sub Lineas_Alarma6() 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Select Case Serie Case 2 Matrix_Graficador6((Renglon) / Periodo_Submuestreo, Serie) = Min_Frec_PF Case 3 Matrix_Graficador6((Renglon) / Periodo_Submuestreo, Serie) = Max_Frec_PF Case 4 Matrix_Graficador6((Renglon) / Periodo_Submuestreo, Serie) = Min_Frec_PF - 1 Case 5 Matrix_Graficador6((Renglon) / Periodo_Submuestreo, Serie) = Max_Frec_PF + 1 Case 6 Matrix_Graficador6((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Frec_PF End Select Next Renglon Next Serie Pintar_Alarma6 End Sub Public Sub Lineas_Alarma3() 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Select Case Serie Case 2 Matrix_Graficador7((Renglon) / Periodo_Submuestreo, Serie) = Min_Amp_BB Case 3 Matrix_Graficador7((Renglon) / Periodo_Submuestreo, Serie) = Max_Amp_BB Case 4 Matrix_Graficador7((Renglon) / Periodo_Submuestreo, Serie) = Min_Amp_BB - 1 Case 5 Matrix_Graficador7((Renglon) / Periodo_Submuestreo, Serie) = Max_Amp_BB + 1 Case 6 Matrix_Graficador7((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Amp_BB End Select Next Renglon Next Serie Pintar_Alarma3 End Sub Public Sub Pintar_Alarma1() 'Revisar cuales Alarmas Preventivas han durado 'lo suficiente para ser alarma Dim Serie1, Serie2 As Integer Dim DURACION As Integer Dim AlarmaPrev_Anterior As Integer Dim Flag_Inicio As Integer Dim Pos_AlarmaPrev_Ini As Integer Dim Pos_Alarma As Integer 'Posicion que almacenará la posicion de la alarma Pos_Alarma = 0 Flag_Inicio = 0 Serie2 = 0 Serie1 = 0 DURACION = 0 Flag_Inicio = 0

Page 276: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxv

Dim Max As Single Dim Min As Single Dim DIFERENCIA As Single Max = Max_Amp_PF Min = Min_Amp_PF Do While (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) If ((Matrix_Graficador5(Serie1, 1) < Min_Amp_PF) Or (Matrix_Graficador5(Serie1, 1) > Max_Amp_PF)) Then Do While ((((Matrix_Graficador5(Serie1, 1)) < Min) Or ((Matrix_Graficador5(Serie1, 1)) > Max)) And (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1))) 'Aplicar los niveles para histeresis del 1% If (Matrix_Graficador5(Serie1, 1) > Max) Or (Matrix_Graficador5(Serie1, 1) < Min) Then DIFERENCIA = Max_Amp_PF - Min_Amp_PF Max = (((Max_Amp_PF) - (0.01 * DIFERENCIA))) Min = (((Min_Amp_PF) + (0.01 * DIFERENCIA))) End If If (Flag_Inicio = 0) Then Flag_Inicio = 1 Pos_AlarmaPrev_Ini = Serie1 + 1 End If Serie1 = Serie1 + 1 DURACION = DURACION + 1 If Not (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) Then Exit Do End If Loop 'Si la alarma preventiva duro lo suficiente entonces 'cambia el color de las barras a roja=alarma If (DURACION >= Tiempo_Alarma_Amp_PF) Then 'Sila alarma ocurre en el primer minuto alarmar desde la posición 1 If Pos_AlarmaPrev_Ini = 0 Then Vector_AlarmaON_Amp_PF(Pos_Alarma) = 1 'Almacena la posicion donde inica la Else Vector_AlarmaON_Amp_PF(Pos_Alarma) = Pos_AlarmaPrev_Ini 'Almacena la posicion donde inica la End If If (Pos_Alarma = 0) Then Duracion_1er_Alarma_Amp_PF = Pos_AlarmaPrev_Ini + DURACION - 1 End If Pos_Alarma = Pos_Alarma + 1 'Alarma End If End If Flag_Inicio = 0 DURACION = 0 Serie1 = Serie1 + 1 Loop '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Para saber en que minuto se encuentra la primera alarma For k = 1 To TIEMPO Step 1 If (Duracion_1er_Alarma_Amp_PF > ((((k - 1) * (NumBytes_1seg + 1)) / Periodo_Submuestreo))) And (Duracion_1er_Alarma_Amp_PF <= (((k) * (NumBytes_1seg + 1)) / Periodo_Submuestreo)) And (Duracion_1er_Alarma_Amp_PF <> 0) Then MINUTE4 = k End If Next k LblMinute = Str(MINUTE4) Lbl1er_Minuto.Caption = Str(Duracion_1er_Alarma_Amp_PF) '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Corrimiento If (Vector_AlarmaON_Amp_PF(0) + Duracion_1er_Alarma_Amp_PF - ((NumBytes_1seg + 1) / Periodo_Submuestreo) <= Tiempo_Alarma_Amp_PF) Then Corrimiento1 End If Dibujar_Alarma1 End Sub Public Sub Pintar_Alarma6() 'Revisar cuales Alarmas Preventivas han durado 'lo suficiente para ser alarma Dim Serie1, Serie2 As Integer Dim DURACION As Integer Dim AlarmaPrev_Anterior As Integer Dim Flag_Inicio As Integer Dim Pos_AlarmaPrev_Ini As Integer Dim Pos_Alarma As Integer 'Posicion que almacenará la posicion de la alarma Pos_Alarma = 0 Flag_Inicio = 0 Serie2 = 0 Serie1 = 0 DURACION = 0 Flag_Inicio = 0 Do While (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) If ((Matrix_Graficador6(Serie1, 1) < Min_Frec_PF) Or (Matrix_Graficador6(Serie1, 1) > Max_Frec_PF)) Then

Page 277: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxvi

Do While ((((Matrix_Graficador6(Serie1, 1)) < Min_Frec_PF) Or ((Matrix_Graficador6(Serie1, 1)) > Max_Frec_PF)) And (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1))) If (Flag_Inicio = 0) Then Flag_Inicio = 1 Pos_AlarmaPrev_Ini = Serie1 + 1 End If Serie1 = Serie1 + 1 DURACION = DURACION + 1 If Not (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) Then Exit Do End If Loop 'Si la alarma preventiva duro lo suficiente entonces 'cambia el color de las barras a roja=alarma If (DURACION >= Tiempo_Alarma_Frec_PF) Then 'Sila alarma ocurre en el primer minuto alarmar desde la posición 1 If Pos_AlarmaPrev_Ini = 0 Then Vector_AlarmaON_Frec_PF(Pos_Alarma) = 1 'Almacena la posicion donde inica la Else Vector_AlarmaON_Frec_PF(Pos_Alarma) = Pos_AlarmaPrev_Ini 'Almacena la posicion donde inica la End If If (Pos_Alarma = 0) Then Duracion_1er_Alarma_Frec_PF = Pos_AlarmaPrev_Ini + DURACION - 1 End If Pos_Alarma = Pos_Alarma + 1 'Alarma End If End If Flag_Inicio = 0 DURACION = 0 Serie1 = Serie1 + 1 Loop '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Para saber en que minuto se encuentra la primera alarma For k = 1 To TIEMPO Step 1 If (Duracion_1er_Alarma_Frec_PF > ((((k - 1) * (NumBytes_1seg + 1)) / Periodo_Submuestreo))) And (Duracion_1er_Alarma_Frec_PF <= (((k) * (NumBytes_1seg + 1)) / Periodo_Submuestreo)) And (Duracion_1er_Alarma_Frec_PF <> 0) Then MINUTE5 = k End If Next k LblMinute = Str(MINUTE5) Lbl1er_Minuto.Caption = Str(Duracion_1er_Alarma_Frec_PF) '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Corrimiento If (Vector_AlarmaON_Frec_PF(0) + Duracion_1er_Alarma_Frec_PF - ((NumBytes_1seg + 1) / Periodo_Submuestreo) <= Tiempo_Alarma_Frec_PF) Then Corrimiento6 End If Dibujar_Alarma6 End Sub Public Sub Pintar_Alarma3() 'Revisar cuales Alarmas Preventivas han durado 'lo suficiente para ser alarma Dim Serie1, Serie2 As Integer Dim DURACION As Integer Dim AlarmaPrev_Anterior As Integer Dim Flag_Inicio As Integer Dim Pos_AlarmaPrev_Ini As Integer Dim Pos_Alarma As Integer 'Posicion que almacenará la posicion de la alarma Pos_Alarma = 0 Flag_Inicio = 0 Serie2 = 0 Serie1 = 0 DURACION = 0 Flag_Inicio = 0 Dim Min As Single Dim Max As Single Dim DIFERENCIA As Single Max = Max_Amp_BB Min = Min_Amp_BB Do While (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) If ((Matrix_Graficador7(Serie1, 1) < Min_Amp_BB) Or (Matrix_Graficador7(Serie1, 1) > Max_Amp_BB)) Then Do While ((((Matrix_Graficador7(Serie1, 1)) < Min) Or ((Matrix_Graficador7(Serie1, 1)) > Max)) And (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1))) 'Aplicar los niveles para histeresis del 1% If (Matrix_Graficador7(Serie1, 1) > Max) Or (Matrix_Graficador7(Serie1, 1) < Min) Then Max = ((Max_Amp_BB) + (0.01 * Max_Amp_BB)) / 0.99 DIFERENCIA = Max_Amp_BB - Min_Amp_BB Max = (((Max_Amp_BB) - (0.01 * DIFERENCIA))) Min = (((Min_Amp_BB) + (0.01 * DIFERENCIA))) End If

Page 278: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxvii

If (Flag_Inicio = 0) Then Flag_Inicio = 1 Pos_AlarmaPrev_Ini = Serie1 + 1 End If Serie1 = Serie1 + 1 DURACION = DURACION + 1 If Not (Serie1 <= ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1)) Then Exit Do End If Loop 'Si la alarma preventiva duro lo suficiente entonces 'cambia el color de las barras a roja=alarma If (DURACION >= Tiempo_Alarma_Amp_BB) Then 'Sila alarma ocurre en el primer minuto alarmar desde la posición 1 If Pos_AlarmaPrev_Ini = 0 Then Vector_AlarmaON_Amp_BB(Pos_Alarma) = 1 'Almacena la posicion donde inica la Else Vector_AlarmaON_Amp_BB(Pos_Alarma) = Pos_AlarmaPrev_Ini 'Almacena la posicion donde inica la End If If (Pos_Alarma = 0) Then Duracion_1er_Alarma_Amp_BB = Pos_AlarmaPrev_Ini + DURACION - 1 End If Pos_Alarma = Pos_Alarma + 1 'Alarma End If End If Flag_Inicio = 0 DURACION = 0 Serie1 = Serie1 + 1 Loop '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Para saber en que minuto se encuentra la primera alarma For k = 1 To TIEMPO Step 1 If (Duracion_1er_Alarma_Amp_BB > ((((k - 1) * (NumBytes_1seg + 1)) / Periodo_Submuestreo))) And (Duracion_1er_Alarma_Amp_BB <= (((k) * (NumBytes_1seg + 1)) / Periodo_Submuestreo)) And (Duracion_1er_Alarma_Amp_BB <> 0) Then MINUTE6 = k End If Next k LblMinute = Str(MINUTE6) Lbl1er_Minuto.Caption = Str(Duracion_1er_Alarma_Amp_BB) '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Corrimiento If (Vector_AlarmaON_Amp_BB(0) + Duracion_1er_Alarma_Amp_BB - ((NumBytes_1seg + 1) / Periodo_Submuestreo) <= Tiempo_Alarma_Amp_BB) Then Corrimiento3 End If Dibujar_Alarma3 End Sub Public Sub Corrimiento1() 'Cuando tiempo llegue a su máximo+1 significa que se estan realizando los corrimientos en los archivos 'Por lo tanto es necesario realizar los corrimientos en los indicadores de alarma If Flag_Corrimiento = 2 Then 'Hacer corrimiento For i = 0 To TIEMPO Step 1 Vector_AlarmaON_Amp_PF_OFF(i) = Vector_AlarmaON_Amp_PF_OFF(i + 1) Vector_AlarmaON_Amp_PF(i) = Vector_AlarmaON_Amp_PF(i + 1) Vector_AlarmaON_Amp_PF_OFF_Flag(i) = Vector_AlarmaON_Amp_PF_OFF_Flag(i + 1) Next i 'Hacer cero la ultima posición Vector_AlarmaON_Amp_PF_OFF(i + 1) = 0 Vector_AlarmaON_Amp_PF(i + 1) = 0 Vector_AlarmaON_Amp_PF_OFF_Flag(i + 1) = 0 End If End Sub Public Sub Corrimiento6() 'Cuando tiempo llegue a su máximo+1 significa que se estan realizando los corrimientos en los archivos 'Por lo tanto es necesario realizar los corrimientos en los indicadores de alarma If Flag_Corrimiento = 2 Then 'Hacer corrimiento For i = 0 To TIEMPO Step 1 Vector_AlarmaON_Frec_PF_OFF(i) = Vector_AlarmaON_Frec_PF_OFF(i + 1) Vector_AlarmaON_Frec_PF(i) = Vector_AlarmaON_Frec_PF(i + 1) Vector_AlarmaON_Frec_PF_OFF_Flag(i) = Vector_AlarmaON_Frec_PF_OFF_Flag(i + 1) Next i 'Hacer cero la ultima posición Vector_AlarmaON_Frec_PF_OFF(i + 1) = 0 Vector_AlarmaON_Frec_PF(i + 1) = 0 Vector_AlarmaON_Frec_PF_OFF_Flag(i + 1) = 0 End If End Sub Public Sub Corrimiento3()

Page 279: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxviii

'Cuando tiempo llegue a su máximo+1 significa que se estan realizando los corrimientos en los archivos 'Por lo tanto es necesario realizar los corrimientos en los indicadores de alarma If Flag_Corrimiento = 2 Then 'Hacer corrimiento For i = 0 To TIEMPO Step 1 Vector_AlarmaON_Amp_BB_OFF(i) = Vector_AlarmaON_Amp_BB_OFF(i + 1) Vector_AlarmaON_Amp_BB(i) = Vector_AlarmaON_Amp_BB(i + 1) Vector_AlarmaON_Amp_BB_OFF_Flag(i) = Vector_AlarmaON_Amp_BB_OFF_Flag(i + 1) Next i 'Hacer cero la ultima posición Vector_AlarmaON_Amp_BB_OFF(i + 1) = 0 Vector_AlarmaON_Amp_BB(i + 1) = 0 Vector_AlarmaON_Amp_BB_OFF_Flag(i + 1) = 0 End If End Sub Public Sub Dibujar_Alarma1() Dim i As Integer For i = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 If (Vector_AlarmaON_Amp_PF(i) <= ((TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) And (Vector_AlarmaON_Amp_PF(i) > 0) And (Vector_AlarmaON_Amp_PF_OFF(i) <> 1) Then 'Pintar linea de alarma en rojo For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Matrix_Graficador5((Renglon) / Periodo_Submuestreo, 6) = Matrix_Graficador5(Vector_AlarmaON_Amp_PF(i), 1) Next Renglon 'Alamacenar la amplitud de la Alarma Amplitud_Alarma_Amp_PF = Matrix_Graficador5(Vector_AlarmaON_Amp_PF(i), 1) 'Marca que ya se activo dicha alarma, para que sólo se alarma una vez por alarma Vector_AlarmaON_Amp_PF_OFF(i) = 1 'Pintar linea de alarma en rojo Flag_Alarma_Amp_PF_On = 1 End If Next i Msg_Alarma_Amp_PF 'Ver las banderas en un textbox 'Ver en un textbox el contebido del vector de alarmas For l = 0 To TIEMPO Step 1 TxtPosi_Alarma.Text = TxtPosi_Alarma.Text & "-" & Str(Vector_AlarmaON_Amp_PF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma.Text = TxtFlags_Alarma.Text & "-" & Str(Vector_AlarmaON_Amp_PF_OFF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma_Escrita.Text = TxtFlags_Alarma_Escrita.Text & "-" & Str(Vector_AlarmaON_Amp_PF_OFF_Flag(l)) Next l HISTERESIS_1Porciento Min_Amp_PF, Max_Amp_PF, Matrix_Graficador5 End Sub Public Sub Dibujar_Alarma6() Dim i As Integer For i = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 If (Vector_AlarmaON_Frec_PF(i) <= ((TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) And (Vector_AlarmaON_Frec_PF(i) > 0) And (Vector_AlarmaON_Frec_PF_OFF(i) <> 1) Then 'Pintar linea de alarma en rojo For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Matrix_Graficador6((Renglon) / Periodo_Submuestreo, 6) = Matrix_Graficador6(Vector_AlarmaON_Frec_PF(i), 1) Next Renglon 'Alamacenar la amplitud de la Alarma Amplitud_Alarma_Frec_PF = Matrix_Graficador6(Vector_AlarmaON_Frec_PF(i), 1) 'Marca que ya se activo dicha alarma, para que sólo se alarma una vez por alarma Vector_AlarmaON_Frec_PF_OFF(i) = 1 'Pintar linea de alarma en rojo Flag_Alarma_Frec_PF_On = 1 End If Next i Msg_Alarma_Frec_PF 'Ver las banderas en un textbox 'Ver en un textbox el contebido del vector de alarmas For l = 0 To TIEMPO Step 1 TxtPosi_Alarma.Text = TxtPosi_Alarma.Text & "-" & Str(Vector_AlarmaON_Frec_PF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma.Text = TxtFlags_Alarma.Text & "-" & Str(Vector_AlarmaON_Frec_PF_OFF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma_Escrita.Text = TxtFlags_Alarma_Escrita.Text & "-" & Str(Vector_AlarmaON_Frec_PF_OFF_Flag(l)) Next l End Sub Public Sub Dibujar_Alarma3() Dim i As Integer For i = 0 To ((TIEMPO * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 If (Vector_AlarmaON_Amp_BB(i) <= ((TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo))) And (Vector_AlarmaON_Amp_BB(i) > 0) And (Vector_AlarmaON_Amp_BB_OFF(i) <> 1) Then

Page 280: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xxxix

'Pintar linea de alarma en rojo For Renglon = 0 To ((TIEMPO * (NumBytes_1seg + 1)) - 1) Step Periodo_Submuestreo Matrix_Graficador7((Renglon) / Periodo_Submuestreo, 6) = Matrix_Graficador7(Vector_AlarmaON_Amp_BB(i), 1) Next Renglon 'Alamacenar la amplitud de la Alarma Amplitud_Alarma_Amp_BB = Matrix_Graficador7(Vector_AlarmaON_Amp_BB(i), 1) 'Marca que ya se activo dicha alarma, para que sólo se alarma una vez por alarma Vector_AlarmaON_Amp_BB_OFF(i) = 1 'Pintar linea de alarma en rojo Flag_Alarma_Amp_BB_On = 1 End If Next i Msg_Alarma_Amp_BB 'Ver las banderas en un textbox 'Ver en un textbox el contebido del vector de alarmas For l = 0 To TIEMPO Step 1 TxtPosi_Alarma.Text = TxtPosi_Alarma.Text & "-" & Str(Vector_AlarmaON_Amp_BB(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma.Text = TxtFlags_Alarma.Text & "-" & Str(Vector_AlarmaON_Amp_BB_OFF(l)) Next l For l = 0 To TIEMPO Step 1 TxtFlags_Alarma_Escrita.Text = TxtFlags_Alarma_Escrita.Text & "-" & Str(Vector_AlarmaON_Amp_BB_OFF_Flag(l)) Next l HISTERESIS_1Porciento Min_Amp_BB, Max_Amp_BB, Matrix_Graficador7 End Sub Public Sub Msg_Alarma_Amp_PF() If (Flag_Alarma_Amp_PF = 1) Then 'Pintalo rojo MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = False End If End Sub Public Sub Msg_Alarma_Frec_PF() If (Flag_Alarma_Frec_PF = 1) Then 'Pintalo rojo MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = False End If End Sub Public Sub Msg_Alarma_Amp_BB() If (Flag_Alarma_Amp_BB = 1) Then 'Pintalo rojo MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = False End If End Sub Private Sub Salir_Click() End End Sub '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '************************************************************************* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '************************************************************************* '************** VALIDACIÓN CAJAS DE TEXTO ******************************** '************************************************************************* Private Sub Txt_Min_Inicio_keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub Txt_Min_Fin_keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub Txt_Min_Inicio1_keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub Txt_Min_Fin1_keypress(keyascii As Integer)

Page 281: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xl

Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Public Sub Valida_TextBox() If (Digitos < 48) Or (Digitos > 57) Then Bandera = 1 MsgBox "Error solo acepta digitos del 0-9" End If End Sub '************************************************************************* Public Sub Habilitar_Series() For S = 2 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = False Next S 'Esconder la serie de alarma 'DESHABILITAR LINEA DE ALARMA Y PREVENTIVAS MSChart_Graficador0.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End Sub Public Sub Habilitar_Series1() For S = 2 To 5 Step 1 MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = False Next S 'DESHABILITAR LINEA DE ALARMA Y PREVENTIVAS MSChart_Graficador0.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End Sub Public Sub Deshabilitar_Series() '2 to 5 If (Flag_Preventiva45 = 0) Then 'Deshabilitar todas For S = 2 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S Else If (Flag_Preventiva45 = 2) Then MSChart_Graficador0.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection((Flag_Preventiva45 + 1) + 2).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection((Flag_Preventiva45 + 1) + 2).Position.Hidden = True For S = 2 To 3 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S Else MSChart_Graficador0.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection((Flag_Preventiva45 - 1) + 2).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection((Flag_Preventiva45 - 1) + 2).Position.Hidden = True For S = 2 To 3 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S End If End If 'DESHABILITAR LA LINEA DE ALARMA Y LAS LINEAS AMARILLAS 'Esconder la serie de alarma MSChart_Graficador0.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End Sub Public Sub Desactivar_Menu() For i = 0 To 3 Step 1 Opcion(i).Enabled = False

Page 282: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xli

Next i End Sub Public Sub Activar_Menu() For i = 0 To 3 Step 1 Opcion(i).Enabled = True Next i End Sub Public Sub Desactivar_Menu1() For i = 0 To 2 Step 1 Opcion1(i).Enabled = False Next i End Sub Public Sub Activar_Menu1() For i = 0 To 2 Step 1 Opcion1(i).Enabled = True Next i End Sub Public Sub Zoom1() Dim Range1 As Integer Dim Inicio1 As Integer Dim Fin1 As Integer Dim Col1 As Long Range1 = Min_Fin1 - Min_Inicio1 Inicio1 = Min_Inicio1 Fin1 = Min_Fin1 ReDim Matrix_Graficador1_Aux(0 To (((Range1 * (NumBytes_1seg + 1)) / Periodo_Submuestreo) - 1), 1 To Tot_Lineas) Col1 = 0 If TIEMPO <> 0 Then Select Case Grafica_Opcion1 Case 0 'Tomar el rango de datos deseado For Columna = (Inicio1 * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To ((Fin1) * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux(Col1, 1) = Matrix_Graficador5(Columna, 1) Col1 = Col1 + 1 Next Columna Colum1 = Col1 'Establecer las amplitudes de los limites Limite_Superior1 = Max_Amp_PF Limite_Inferior1 = Min_Amp_PF 'Revisar que líneas fueron activadas Activar_Desactivar_Series1 Case 1 'Tomar el rango de datos deseado For Columna = (Inicio1 * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin1 * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux(Col1, 1) = Matrix_Graficador6(Columna, 1) Col1 = Col1 + 1 Next Columna Colum1 = Col1 'Establecer las amplitudes de los limites Limite_Superior1 = Max_Frec_PF Limite_Inferior1 = Min_Frec_PF 'Revisar que líneas fueron activadas Activar_Desactivar_Series1 Case 2 'Tomar el rango de datos deseado For Columna = (Inicio1 * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin1 * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux(Col1, 1) = Matrix_Graficador7(Columna, 1) Col1 = Col1 + 1 Next Columna Colum1 = Col1 'Establecer las amplitudes de los limites Limite_Superior1 = Max_Amp_BB Limite_Inferior1 = Min_Amp_BB 'Revisar que líneas fueron activadas Activar_Desactivar_Series1 End Select End If 'Hacer Flag_Profundidad_Zoom=1, indicando que ya se realizó un zoom Flag_Profundidad_Zoom1 = 1 'Flag_Profundidad_Zoom + 1 'Una vez realizado el zoom hay que reiniciar el contador de la pila del zoom Pos_Pila1 = 0 Lblpila.Caption = Str(Pos_Pila1) 'Graficarlo en el componente MSChart_Graficador1.ChartData = Matrix_Graficador1_Aux Establecer_Labels_Zoom1 End Sub Public Sub Establecer_Labels_Zoom1() 'Establecer etiquetas

Page 283: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xlii

Dim Num_labels As Integer Dim Ini As Integer Ini = Min_Inicio1 Num_labels = MSChart_Graficador1.RowCount Establecer_Formato_HHMM_Zoom_Inicio1 Contador = 0 For Columna = 0 To (Num_labels - 1) Step 1 If (Columna = 0) Then Contador = 1 MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador1.RowLabel = Etiqueta_Index1 Else Contador = Contador + 1 If Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo) Then Ini = Ini + 1 Num_Row1 = Columna + 1 Establecer_Formato_HHMM1 Contador = 0 Else 'Limpa label MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador1.RowLabel = "" End If End If Next Columna End Sub Public Sub Establecer_Formato_HHMM_Zoom_Inicio1() 'Leer el Lblhora_inicio y sumarle el Min_inicio y generar los labels hasta llegar 'al Num_labels (#máximo de elementos a graficar) Dim HH_MM_Inicio1 As String Dim hora1 As Integer Dim Minuto1 As Integer Dim CADhora1 As String Dim CADminuto1 As String Dim Parte_Entera1 As Long 'Proporciona el # de horas a sumarle a la hora de inicio de graficción Dim Parte_Restante1 As Long 'Proporciona el # de minutos a sumarle a la hora de inicio de graficación 'Limpiar Etiqueta_Index Etiqueta_Index1 = "" 'Para saber cuantas horas hay que sumar Parte_Entera1 = Min_Inicio1 \ 60 'Regresa la parte entera de la división If (Min_Inicio1 > 59) Then Parte_Restante1 = Min_Fin1 - Parte_Entera1 * 60 'Regresa la parte fraccionaria de la división Else Parte_Restante1 = Min_Inicio1 End If HH_MM_Inicio1 = Mid(LblHora_Inicio.Caption, 1, 5) hora1 = Val(Mid(HH_MM_Inicio1, 1, 2)) 'Para sabe la hora Minuto1 = Val(Mid(HH_MM_Inicio1, 4, 5)) 'Para saber el # de minutos en la hora 'Establecer la hora de inicio del Zoom If (Len(LblHora_Inicio.Caption) > 8) Then Checar_Formato_Tiempo = 1 Else Checar_Formato_Tiempo = 0 End If 'Revisar si el minuto + Parte_Restante > 60 If (Minuto1 + Parte_Restante1 > 59) Then Minuto1 = (Minuto1 + Parte_Restante1) - 60 hora1 = hora1 + 1 Else Minuto1 = Minuto1 + Parte_Restante1 End If 'Sumarle las horas que sean necesarias For k = 1 To Parte_Entera1 Step 1 hora1 = hora1 + 1 'Dependiendo del formato usado reiniciar hora If (Checar_Formato_Tiempo = 1) Then If (hora1 > 12) Then hora1 = 1 End If Else If (hora1 > 23) Then hora1 = 0 End If End If Next k 'Formar nueva Hora If (hora1 >= 0) And (hora1 <= 9) Then CADhora1 = ("0" & CStr(hora1)) Else CADhora1 = (CStr(hora1)) End If

Page 284: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xliii

'si los minutos son >=0 o <=9 If (Minuto1 >= 0) And (Minuto1 <= 9) Then CADminuto1 = ("0" & CStr(Minuto1)) Else CADminuto1 = (CStr(Minuto1)) End If Etiqueta_Index1 = CADhora1 & ":" & CADminuto1 End Sub Public Sub Establecer_Labels_Zoom_Transferencia() 'Establecer etiquetas Dim Num_labels As Integer Num_labels = MSChart_Graficador0.RowCount For Columna = 0 To (Num_labels - 1) Step 1 MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador0.Row = Columna + 1 MSChart_Graficador1.RowLabel = MSChart_Graficador0.RowLabel 'Str(Ini) 'Str((Inicio1 + 1) / ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Next Columna End Sub Public Sub Establecer_Labels_Zoom() 'Establecer etiquetas Dim Num_labels As Integer Dim Ini As Integer Ini = Min_Inicio Num_labels = MSChart_Graficador0.RowCount Establecer_Formato_HHMM_Zoom_Inicio Contador = 0 For Columna = 0 To (Num_labels - 1) Step 1 If (Columna = 0) Then Contador = 1 MSChart_Graficador0.Row = Columna + 1 MSChart_Graficador0.RowLabel = Etiqueta_Index Else Contador = Contador + 1 If Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo) Then Ini = Ini + 1 Num_Row = Columna + 1 Establecer_Formato_HHMM Contador = 0 Else 'Limpa label MSChart_Graficador0.Row = Columna + 1 MSChart_Graficador0.RowLabel = "" End If End If Next Columna End Sub Public Sub Establecer_Labels_Zoom_Errores() 'Establecer_Labels Establecer_Formato_HHMM_Zoom_Inicio For Columna = Min_Inicio To (Min_Fin - 1) Step 1 Conta_Minutos = Columna + 1 Num_Row = Columna + 1 - Min_Inicio Establecer_Formato_HHMM Next Columna End Sub Public Sub Establecer_Formato_HHMM_Zoom_Inicio() 'Leer el Lblhora_inicio y sumarle el Min_inicio y generar los labels hasta llegar 'al Num_labels (#máximo de elementos a graficar) Dim HH_MM_Inicio As String Dim HORA As Integer Dim minuto As Integer Dim CADhora As String Dim CADminuto As String Dim Parte_Entera As Long 'Proporciona el # de horas a sumarle a la hora de inicio de graficción Dim Parte_Restante As Long 'Proporciona el # de minutos a sumarle a la hora de inicio de graficación 'Limpiar Etiqueta_Index Etiqueta_Index = "" 'Para saber cuantas horas hay que sumar Parte_Entera = Min_Inicio \ 60 'Regresa la parte entera de la división If (Min_Inicio > 59) Then Parte_Restante = Min_Fin - Parte_Entera * 60 'Regresa la parte fraccionaria de la división Else Parte_Restante = Min_Inicio End If HH_MM_Inicio = Mid(LblHora_Inicio.Caption, 1, 5) HORA = Val(Mid(HH_MM_Inicio, 1, 2)) 'Para sabe la hora minuto = Val(Mid(HH_MM_Inicio, 4, 5)) 'Para saber el # de minutos en la hora 'Establecer la hora de inicio del Zoom

Page 285: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xliv

If (Len(LblHora_Inicio.Caption) > 8) Then Checar_Formato_Tiempo = 1 Else Checar_Formato_Tiempo = 0 End If 'Revisar si el minuto + Parte_Restante > 60 If (minuto + Parte_Restante > 59) Then minuto = (minuto + Parte_Restante) - 60 HORA = HORA + 1 Else minuto = minuto + Parte_Restante End If 'Sumarle las horas que sean necesarias For k = 1 To Parte_Entera Step 1 HORA = HORA + 1 'Dependiendo del formato usado reiniciar hora If (Checar_Formato_Tiempo = 1) Then If (HORA > 12) Then HORA = 1 End If Else If (HORA > 23) Then HORA = 0 End If End If Next k 'Formar nueva Hora If (HORA >= 0) And (HORA <= 9) Then CADhora = ("0" & CStr(HORA)) Else CADhora = (CStr(HORA)) End If 'si los minutos son >=0 o <=9 If (minuto >= 0) And (minuto <= 9) Then CADminuto = ("0" & CStr(minuto)) Else CADminuto = (CStr(minuto)) End If Etiqueta_Index = CADhora & ":" & CADminuto End Sub Public Sub Activar_Desactivar_Series1() If (Chk_Lim_Inferior1.Value <> 1) And (Chk_Lim_Superior1.Value <> 1) Then 'Desactivarlas todas menos la de la señal For Renglon = 0 To (Colum1 - 1) Step 1 Matrix_Graficador1_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite Matrix_Graficador1_Aux(Renglon, 2) = 0 Next Renglon For S = 2 To 5 Step 1 MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Lim_Inferior1.Value <> 1) And (Chk_Lim_Superior1.Value = 1) Then 'Áctivar nomas de la señal y el limite superior 'que tome la amplitud de el limite superior For Renglon = 0 To (Colum1 - 1) Step 1 Matrix_Graficador1_Aux(Renglon, 3) = Limite_Superior1 'Y hace cero la del otro limite Matrix_Graficador1_Aux(Renglon, 2) = 0 Next Renglon MSChart_Graficador1.Plot.SeriesCollection(1).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(3).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(2).Position.Hidden = True For S = 4 To 5 Step 1 MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Lim_Inferior1.Value = 1) And (Chk_Lim_Superior1.Value = 1) Then 'Activar la señal y los dos limites For Renglon = 0 To (Colum1 - 1) Step 1 Matrix_Graficador1_Aux(Renglon, 3) = Limite_Superior1 'Y hace cero la del otro limite Matrix_Graficador1_Aux(Renglon, 2) = Limite_Inferior1 Next Renglon MSChart_Graficador1.Plot.SeriesCollection(1).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(3).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(2).Position.Hidden = False 'Áctivar nomas de la señal y la e la linea de alarma For S = 4 To 5 Step 1

Page 286: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xlv

MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Lim_Inferior1.Value = 1) And (Chk_Lim_Superior1.Value <> 1) Then 'Áctivar nomas de la señal y el limite inferior 'que tome la amplitud de el limite superior For Renglon = 0 To (Colum1 - 1) Step 1 Matrix_Graficador1_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite Matrix_Graficador1_Aux(Renglon, 2) = Limite_Inferior1 Next Renglon MSChart_Graficador1.Plot.SeriesCollection(1).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(3).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(2).Position.Hidden = False 'Áctivar nomas de la señal y la e la linea de alarma For S = 4 To 5 Step 1 MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S End If End Sub '---------------------------------------------------------------------------------------------------- ' AGREGADO DE LA OTRA FORMA '---------------------------------------------------------------------------------------------------- Private Sub Timer1_Timer() 'Ejecuta este código cada intervalo programado a Timer1 If LblTime.Caption <> CStr(Time) Then LblTime.Caption = Time End If Fecha = Date ' Fecha contiene la fecha del sistema actual. DIA = Mid(Fecha, 1, 2) MES = Mid(Fecha, 4, 2) ANO = Mid(Fecha, 7, 4) Fecha = DIA + "_" + MES + "_" + ANO 'Control del orden de carga de las formas TIEMPO = TIEMPO + 1 If TIEMPO > NumRenglones Then TIEMPO = NumRenglones + 1 Flag_Corrimiento = Flag_Corrimiento + 1 If Flag_Corrimiento >= 2 Then Flag_Corrimiento = 2 End If End If 'Probar nueva hora inicio 'Cambiar hora de inico cuando inicien los corrimientos If Flag_Corrimiento = 2 Then Nueva_Hora_Inicio End If 'Cargar componente de graficación nuevamente Cargar_Frm Contador_Minutos = Contador_Minutos + 1 'Revisar si hubo alarma Msg_Alarma_Volt_PFF Msg_Alarma_Volt_BBB Msg_Alarma_TransferenciaS Msg_Alarma_ErroresS Msg_Alarma_Amp_PFF Msg_Alarma_Frec_PFF Msg_Alarma_Amp_BBB LblTiempo.Caption = "TIEMPO = " & Str(TIEMPO) & " MINUTOS" End Sub Public Sub Msg_Alarma_Volt_PFF() 'Mostrar mensaje de alarma If Flag_Alarma_Volt_PF_On = 1 Then Unload Form_MsgAlarma_Volt_PF Form_MsgAlarma_Volt_PF.Show Beep End If End Sub Public Sub Msg_Alarma_Volt_BBB() 'Mostrar mensaje de alarma If Flag_Alarma_Volt_BB_On = 1 Then Unload Form_MsgAlarma_Volt_BB Form_MsgAlarma_Volt_BB.Show Beep End If End Sub Public Sub Msg_Alarma_TransferenciaS() 'Mostrar mensaje de alarma If Flag_Alarma_Transferencia_On = 1 Then Unload Form_MsgAlarma_Transferencia_CFEPF Form_MsgAlarma_Transferencia_CFEPF.Show

Page 287: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xlvi

Beep End If End Sub Public Sub Msg_Alarma_ErroresS() 'Mostrar mensaje de alarma If Flag_Alarma_Errores_On = 1 Then Unload Form_MsgAlarma_Errores Form_MsgAlarma_Errores.Show Beep End If End Sub Public Sub Msg_Alarma_Amp_PFF() 'Mostrar mensaje de alarma If Flag_Alarma_Amp_PF_On = 1 Then Unload Form_MsgAlarma_Amp_PF Form_MsgAlarma_Amp_PF.Show Beep End If End Sub Public Sub Msg_Alarma_Frec_PFF() 'Mostrar mensaje de alarma If Flag_Alarma_Frec_PF_On = 1 Then Unload Form_MsgAlarma_Frec_PF Form_MsgAlarma_Frec_PF.Show Beep End If End Sub Public Sub Msg_Alarma_Amp_BBB() 'Mostrar mensaje de alarma If Flag_Alarma_Amp_BB_On = 1 Then Unload Form_MsgAlarma_Amp_BB Form_MsgAlarma_Amp_BB.Show Beep End If End Sub '---------------------------------------------------------------------------------------------------- 'HH:MM:SS 'Cuando inicien los corrimientos restarle 1 minuto a LblHora_Inicio Public Sub Nueva_Hora_Inicio() Longitud_HORA_Inicio = Len(LblHora_Inicio.Caption) HORA_INICIO = LblHora_Inicio.Caption If (Longitud_HORA_Inicio = 8) Then Formato_24Horas Else Formato_12Horas End If End Sub Public Sub Formato_24Horas() 'Obtener el # de minutos en cadena MM = Val(Mid(HORA_INICIO, 4, 2)) 'Obtener el # de horas de la cadena HH = Val(Mid(HORA_INICIO, 1, 2)) 'Incrementar minutos MM = MM + 1 If (MM >= 60) Then 'Incrementa las horas HH = HH + 1 MM = 0 If (HH >= 24) Then 'Reiniciar horas HH = 0 End If End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (HH >= 0) And (HH <= 9) Then CADHH = ("0" & CStr(HH)) Else CADHH = (CStr(HH)) End If 'si los minutos son >=0 o <=9 If (MM >= 0) And (MM <= 9) Then CADMM = ("0" & CStr(MM)) Else CADMM = (CStr(MM)) End If LblNueva_Hora.Caption = CADHH & ":" & CADMM & Mid(HORA_INICIO, 6, 8) LblHora_Inicio.Caption = CADHH & ":" & CADMM & Mid(HORA_INICIO, 6, 8) End Sub Public Sub Formato_12Horas()

Page 288: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xlvii

'Obtener el # de minutos en cadena MM = Val(Mid(HORA_INICIO, 4, 2)) 'Obtener el # de horas de la cadena HH = Val(Mid(HORA_INICIO, 1, 2)) 'Obtener si es AM o PM AM_PM = Mid(HORA_INICIO, 10, 13) 'Incrementar minutos MM = MM + 1 If (MM >= 60) Then 'Incrementa las horas HH = HH + 1 MM = 0 If (HH > 12) Then 'Que cambie AM_PM If (AM_PM = AM) Then AM_PM = "p.m." Else AM_PM = "a.m." End If 'Reiniciar horas HH = 1 End If End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (HH >= 0) And (HH <= 9) Then CADHH = ("0" & CStr(HH)) Else CADHH = (CStr(HH)) End If 'si los minutos son >=0 o <=9 If (MM >= 0) And (MM <= 9) Then CADMM = ("0" & CStr(MM)) Else CADMM = (CStr(MM)) End If LblNueva_Hora.Caption = CADHH & ":" & CADMM & Mid(HORA_INICIO, 6, 4) & AM_PM LblHora_Inicio.Caption = CADHH & ":" & CADMM & Mid(HORA_INICIO, 6, 4) & AM_PM Ver = Len(LblNueva_Hora.Caption) End Sub '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '% Código para la selección del zoom empleando el mouse '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Private Sub MSChart_Graficador0_PointActivated(Serie As _ Integer, PuntoDatos As Integer, MouseFlags As _ Integer, Cancel As Integer) Serie = 1 Lblpila.Caption = Str(Pos_Pila) If (Pos_Pila <= 0) Then Pos_Pila = 0 End If 'Si son iguales los borra If (PuntoDatos = PuntoDatos_Anterior1) Then PuntoDatos = 1 PuntoDatos_Anterior1 = 1 Pila(Pos_Pila) = 1 Flag_Borra_Zoom = 1 End If 'Se envia el foco de seleccion siempre a la serie1-->la señal(1) MSChart_Graficador0.SelectPart VtChPartTypePoint, Serie, PuntoDatos, index3, index4 'Label1.Caption = Str(PuntoDatos) 'incrementar sub indice pila 'Si son diferentes los almacena If (PuntoDatos <> PuntoDatos_Anterior1) Then Pila(Pos_Pila) = PuntoDatos Pos_Pila = Pos_Pila + 1 Else Pos_Pila = Pos_Pila - 1 End If PuntoDatos_Anterior1 = PuntoDatos 'Para limitar el crecimiento de la pila If (Pos_Pila > 1) Then Pos_Pila = Pos_Pila - 1 End If If (Flag_Borra_Zoom = 1) Then 'Pos_Pila = Pos_Pila - 1

Page 289: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xlviii

PuntoDatos_Anterior1 = Pila(0) Flag_Borra_Zoom = 0 'Pasar el enfoque a Pila(0) MSChart_Graficador0.SelectPart VtChPartTypePoint, Serie, PuntoDatos_Anterior1, index3, index4 End If 'Incrementar el contador de puntos activados Con_Puntos_Activados = Con_Puntos_Activados + 1 'Si ya se establecieron dos puntos hay que realizar el zoom If (Con_Puntos_Activados = 2) Then Establecer_Limites_Minutos Acepta_Zoom 'Inicializar el contador de puntos activados para que automaticamente este 'listo para realizar otro zoom Con_Puntos_Activados = 0 End If End Sub Private Sub MSChart_Graficador1_PointActivated(Serie As _ Integer, PuntoDatos As Integer, MouseFlags As _ Integer, Cancel As Integer) Serie = 1 Lblpila.Caption = Str(Pos_Pila1) If (Pos_Pila1 <= 0) Then Pos_Pila1 = 0 End If 'Si son iguales los borra If (PuntoDatos = PuntoDatos_Anterior2) Then PuntoDatos = 1 PuntoDatos_Anterior2 = 1 Pila1(Pos_Pila1) = 1 Flag_Borra_Zoom1 = 1 End If 'Se envia el foco de seleccion siempre a la serie1-->la señal(1) MSChart_Graficador1.SelectPart VtChPartTypePoint, Serie, PuntoDatos, index3, index4 'Si son diferentes los almacena If (PuntoDatos <> PuntoDatos_Anterior2) Then Pila1(Pos_Pila1) = PuntoDatos Pos_Pila1 = Pos_Pila1 + 1 Else Pos_Pila1 = Pos_Pila1 - 1 End If PuntoDatos_Anterior2 = PuntoDatos 'Para limitar el crecimiento de la pila If (Pos_Pila1 > 1) Then Pos_Pila1 = Pos_Pila1 - 1 End If If (Flag_Borra_Zoom1 = 1) Then 'Pos_Pila = Pos_Pila - 1 PuntoDatos_Anterior2 = Pila1(0) Flag_Borra_Zoom1 = 0 'Pasar el enfoque a Pila(0) MSChart_Graficador1.SelectPart VtChPartTypePoint, Serie, PuntoDatos_Anterior2, index3, index4 End If 'Incrementar el contador de puntos activados Con_Puntos_Activados1 = Con_Puntos_Activados1 + 1 'Si ya se establecieron dos puntos hay que realizar el zoom If (Con_Puntos_Activados1 = 2) Then Establecer_Limites_Minutos1 Acepta_Zoom1 'Inicializar el contador de puntos activados para que automaticamente este 'listo para realizar otro zoom Con_Puntos_Activados1 = 0 End If End Sub '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Public Sub Establecer_Limites_Minutos() Dim Modulo As Integer Dim Entero As Integer Dim Flotante As Double Dim Resto As Integer Dim Modulo1 As Integer Dim Entero1 As Integer Dim Flotante1 As Double Dim Resto1 As Integer Dim Auxiliar As Integer

Page 290: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xlix

'Establecer a que minuto pertenece el primer punto para el zoom Modulo = Pila(0) Mod ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Entero = Pila(0) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Flotante = Pila(0) / ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto = Pila(0) - Entero * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero es 0 y resto>=0 entonces minuto0=0 If (Entero = 0) And (Resto >= 0) Then Minuto0 = 0 End If If (Entero <> 0) And (Resto > 0) Then Minuto0 = Entero End If If (Entero <> 0) And (Resto = 0) Then Minuto0 = Entero - 1 End If 'Establecer a que minuto pertenece el segundo punto para el zoom Modulo1 = Pila(1) Mod ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Entero1 = Pila(1) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Flotante1 = Pila(1) / ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto1 = Pila(1) - Entero1 * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero1 es 0 y resto1>=0 entonces minuto1=0 If (Entero1 = 0) And (Resto1 >= 0) Then Minuto1 = 0 End If If (Entero1 <> 0) And (Resto1 > 0) Then Minuto1 = Entero1 End If If (Entero1 <> 0) And (Resto1 = 0) Then Minuto1 = Entero1 - 1 End If 'Cual de los limites es el mayor If (Minuto0 > Minuto1) Then Auxiliar = Minuto0 Minuto0 = Minuto1 Minuto1 = Auxiliar + 1 Else Minuto1 = Minuto1 + 1 End If Txt_Min_Inicio.Text = Minuto0 Txt_Min_Fin.Text = Minuto1 Lblminuto0.Caption = Str(Minuto0) Lblminuto1.Caption = Str(Minuto1) End Sub Public Sub Establecer_Limites_Minutos1() Dim Modulo As Integer Dim Entero As Integer Dim Flotante As Double Dim Resto As Integer Dim Modulo1 As Integer Dim Entero1 As Integer Dim Flotante1 As Double Dim Resto1 As Integer Dim Auxiliar As Integer 'Establecer a que minuto pertenece el primer punto para el zoom Modulo = Pila1(0) Mod ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Entero = Pila1(0) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Flotante = Pila1(0) / ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto = Pila1(0) - Entero * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero es 0 y resto>=0 entonces minuto0=0 If (Entero = 0) And (Resto >= 0) Then Minuto2 = 0 End If If (Entero <> 0) And (Resto > 0) Then Minuto2 = Entero End If If (Entero <> 0) And (Resto = 0) Then Minuto2 = Entero - 1 End If 'Establecer a que minuto pertenece el segundo punto para el zoom Modulo1 = Pila1(1) Mod ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Entero1 = Pila1(1) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Flotante1 = Pila1(1) / ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto1 = Pila1(1) - Entero1 * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero1 es 0 y resto1>=0 entonces minuto1=0 If (Entero1 = 0) And (Resto1 >= 0) Then Minuto3 = 0 End If If (Entero1 <> 0) And (Resto1 > 0) Then Minuto3 = Entero1 End If

Page 291: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-l

If (Entero1 <> 0) And (Resto1 = 0) Then Minuto3 = Entero1 - 1 End If 'Cual de los limites es el mayor If (Minuto2 > Minuto3) Then Auxiliar = Minuto2 Minuto2 = Minuto3 Minuto3 = Auxiliar + 1 Else Minuto3 = Minuto3 + 1 End If Txt_Min_Inicio1.Text = Minuto2 Txt_Min_Fin1.Text = Minuto3 Lblminuto0.Caption = Str(Minuto2) Lblminuto1.Caption = Str(Minuto3) End Sub Private Sub MSChart_Graficador0_PointSelected(SERIES As Integer, dataPoint As Integer, MouseFlags As Integer, Cancel As Integer) 'LblPuntoDatos_Anterior.Caption = Str(PuntoDatos_Anterior) End Sub Private Sub MSChart_Graficador0_PlotActivated(MouseFlags As Integer, Cancel As Integer) 'Se produce cuando el usuario hace doble clic en el trazado del gráfico. 'MSChart1.SelectPart VtChPartTypePoint, SERIES, Posicion1, index3, index4 Pos_Pila = 0 Lblpila.Caption = Str(Pos_Pila) End Sub Private Sub MSChart_Graficador1_PlotActivated(MouseFlags As Integer, Cancel As Integer) 'Se produce cuando el usuario hace doble clic en el trazado del gráfico. 'MSChart1.SelectPart VtChPartTypePoint, SERIES, Posicion1, index3, index4 Pos_Pila1 = 0 Lblpila.Caption = Str(Pos_Pila1) End Sub Public Sub Generar_Archivo_Alarma(Archivo_Alarma As String) Dim Pos_Alarma As Long Pos_Alarma = 0 'Mientras la posición de la alarma sea diferente de cero continuar Do While (Vector_AlarmaON(Pos_Alarma) <> 0) 'Primero hay que saber en que minuto se genera la alarma Entero_Alarma = Vector_AlarmaON(Pos_Alarma) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto_Alarma = Vector_AlarmaON(Pos_Alarma) - Entero_Alarma * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero1 es 0 y resto1>=0 entonces minuto1=0 If (Entero_Alarma = 0) And (Resto_Alarma >= 0) Then Minuto_Alarma = 0 End If If (Entero_Alarma <> 0) And (Resto_Alarma > 0) Then Minuto_Alarma = Entero_Alarma End If If (Entero_Alarma <> 0) And (Resto_Alarma = 0) Then Minuto_Alarma = Entero_Alarma - 1 End If 'Solo cuando la fecha cambie entonces se debe cambiar 'el nombre del archivo, osea HMS=hora que forma parte del nombre If Fecha <> Fecha_Anterior Then HOURS_ALARMA = Mid(LblHora_Inicio.Caption, 1, 2) MINUTES_ALARMA = Mid(LblHora_Inicio.Caption, 4, 2) SECONDS_ALARMA = Mid(LblHora_Inicio.Caption, 7, 2) HMS_ALARMA = HOURS_ALARMA + "_" + MINUTES_ALARMA Puntero_Alarma = 1 Puntero_Alarma1 = 1 End If 'Sumarle el minuto en el que ocurrió la alarma Sumar_HORAS (Minuto_Alarma) 'Preguntar si la alarma actual es mayor que la alarma anterior Valor_Alarma = Val(Mid(Etiqueta_Alarma, 1, 2) + Mid(Etiqueta_Alarma, 4, 2)) RUTA = App.Path + "\Alarmas" + "\" + Archivo_Alarma + Fecha + ".txt" ' + "_" + HMS + ".txt" If (Vector_AlarmaON_OFF_Flag(Pos_Alarma) <> 1) Then 'Generar un archivo binario en el que se almacenen todas las alarmas ocurridas NumRegister = FreeFile 'Abrir el archivo para escribir en modo binario Open RUTA For Binary As #NumRegister Put #NumRegister, Puntero_Alarma, Valor_Alarma 'Minuto_Alarma Puntero = Seek(NumRegister) 'Cambiar fecha_anterior Fecha_Anterior = Fecha Fecha_Alarma_Anterior = Fecha Puntero_Alarma = Seek(NumRegister) Close NumRegister Valor_Alarma_Anterior = Valor_Alarma 'Indicar que ya fue escrita esa alarma

Page 292: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-li

Vector_AlarmaON_OFF_Flag(Pos_Alarma) = 1 End If Pos_Alarma = Pos_Alarma + 1 Loop End Sub 'sintaxis, Nombre_Base,Vector_AlarmaON,Vector_Alarma_ON_OFF_Flag Public Sub Generar_Archivo_AlarmaS(Archivo_Alarma As String, Vector_ON() As Integer, Vector_ON_OFF_Flag() As Integer) Dim Pos_Alarma As Long Pos_Alarma = 0 'Mientras la posición de la alarma sea diferente de cero continuar Do While (Vector_ON(Pos_Alarma) <> 0) Entero_Alarma = Vector_ON(Pos_Alarma) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto_Alarma = Vector_ON(Pos_Alarma) - Entero_Alarma * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero1 es 0 y resto1>=0 entonces minuto1=0 If (Entero_Alarma = 0) And (Resto_Alarma >= 0) Then Minuto_Alarma = 0 End If If (Entero_Alarma <> 0) And (Resto_Alarma > 0) Then Minuto_Alarma = Entero_Alarma End If If (Entero_Alarma <> 0) And (Resto_Alarma = 0) Then Minuto_Alarma = Entero_Alarma - 1 End If 'Solo cuando la fecha cambie entonces se debe cambiar 'el nombre del archivo, osea HMS=hora que forma parte del nombre If Fecha <> Fecha_Anterior Then Puntero_Alarma = 1 Puntero_Alarma1 = 1 Puntero_Alarma2 = 1 Puntero_Alarma3 = 1 Puntero_Alarma4 = 1 Puntero_Alarma5 = 1 Puntero_Alarma7 = 1 End If 'Sumarle el minuto en el que ocurrió la alarma Sumar_HORAS (Minuto_Alarma) 'Preguntar si la alarma actual es mayor que la alarma anterior Valor_Alarma = Val(Mid(Etiqueta_Alarma, 1, 2) + Mid(Etiqueta_Alarma, 4, 2)) RUTA = App.Path + "\Alarmas" + "\" + Archivo_Alarma + Fecha + ".txt" ' + "_" + HMS + ".txt" If (Vector_ON_OFF_Flag(Pos_Alarma) <> 1) Then 'Generar un archivo binario en el que se almacenen todas las alarmas ocurridas NumRegister = FreeFile 'Abrir el archivo para escribir en modo binario Open RUTA For Binary As #NumRegister Put #NumRegister, Puntero_Alarma, Valor_Alarma 'Minuto_Alarma Puntero = Seek(NumRegister) 'Cambiar fecha_anterior Fecha_Anterior = Fecha Puntero_Alarma = Seek(NumRegister) Close NumRegister Valor_Alarma_Anterior = Valor_Alarma 'Indicar que ya fue escrita esa alarma Vector_ON_OFF_Flag(Pos_Alarma) = 1 End If Pos_Alarma = Pos_Alarma + 1 Loop End Sub Public Sub Sumar_HORAS(TotMinutos As Long) Dim HH_MM_Inicio As String Dim HORA As Integer Dim minuto As Integer Dim CADhora As String Dim CADminuto As String Dim Checar_Formato_Tiempo As String Dim NHoras As Integer Dim NMinutos As Integer Dim E_Minutos As Long Dim M_Minutos As Long Dim R_Minutos As Long Dim E_Horas As Long Dim M_Horas As Long Dim R_Horas As Long NHoras = TotMinutos \ 60 'Parte entera NMinutos = TotMinutos - (NHoras * 60) 'Resto Etiqueta_Alarma = Mid(LblHora_Inicio.Caption, 1, 5) HORA = Val(Mid(Etiqueta_Alarma, 1, 2)) minuto = Val(Mid(Etiqueta_Alarma, 4, 5)) 'Usando formato de 0-->23 horas

Page 293: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lii

E_Minutos = (minuto + NMinutos) \ 60 'si E_Minutos es <>0, entonces hay que reiniciar los minutos M_Minutos = (minuto + NMinutos) Mod 60 R_Minutos = (minuto + NMinutos) - (E_Minutos * 60) 'Establecer minutos If (E_Minutos <> 0) Then minuto = 0 minuto = minuto + R_Minutos HORA = HORA + E_Minutos Else minuto = minuto + NMinutos End If E_Horas = (HORA + NHoras) \ 24 'Si E_Horas es <>0, entonces hay que reiniciar las horas M_Horas = (HORA + NHoras) Mod 24 R_Horas = (HORA + NHoras) - (E_Horas * 24) 'Establecer horas If (E_Horas <> 0) Then HORA = 0 HORA = HORA + R_Horas Else HORA = HORA + NHoras End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (HORA >= 0) And (HORA <= 9) Then CADhora = ("0" & CStr(HORA)) Else CADhora = (CStr(HORA)) End If 'si los minutos son >=0 o <=9 If (minuto >= 0) And (minuto <= 9) Then CADminuto = ("0" & CStr(minuto)) Else CADminuto = (CStr(minuto)) End If Etiqueta_Alarma = CADhora & ":" & CADminuto End Sub Public Sub Restar_HORAS(TotMinutos As Long, n_hrs As String) Dim HH_MM_Inicio As String Dim HORA As Integer Dim minuto As Integer Dim CADhora As String Dim CADminuto As String Dim Checar_Formato_Tiempo As String Dim NHoras As Integer Dim NMinutos As Integer Dim E_Minutos As Long Dim M_Minutos As Long Dim R_Minutos As Long Dim E_Horas As Long Dim M_Horas As Long Dim R_Horas As Long 'TotMinutos = 61 '1075 'Para saber cuantas horas y minutos hay que quitar NHoras = TotMinutos \ 60 'Parte entera NMinutos = TotMinutos - (NHoras * 60) 'Resto Etiqueta_Hora_Inicio = Mid(n_hrs, 1, 5) 'Nueva_Hora, 1, 5) 'LblHora_Inicio.Caption, 1, 5) HORA = Val(Mid(Etiqueta_Hora_Inicio, 1, 2)) minuto = Val(Mid(Etiqueta_Hora_Inicio, 4, 5)) 'Usando formato de 0-->23 horas E_Minutos = (minuto + NMinutos) \ 60 'si E_Minutos es <>0, entonces hay que reiniciar los minutos M_Minutos = (minuto + NMinutos) Mod 60 R_Minutos = (minuto + NMinutos) - (E_Minutos * 60) 'Establecer minutos If (E_Minutos <> 0) Then minuto = 60 '0 minuto = minuto - R_Minutos '+ R_Minutos HORA = HORA - E_Minutos '+ E_Minutos Else minuto = minuto - NMinutos '+ NMinutos End If E_Horas = (HORA - NHoras) \ 24 'Si E_Horas es <>0, entonces hay que reiniciar las horas M_Horas = (HORA - NHoras) Mod 24 R_Horas = (HORA - NHoras) + (E_Horas * 24) 'Establecer horas

Page 294: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-liii

If (E_Horas <> 0) Then HORA = 24 HORA = HORA - R_Horas '+ R_Horas Else HORA = HORA - NHoras '+ NHoras End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (HORA >= 0) And (HORA <= 9) Then CADhora = ("0" & CStr(HORA)) Else CADhora = (CStr(HORA)) End If 'si los minutos son >=0 o <=9 If (minuto >= 0) And (minuto <= 9) Then CADminuto = ("0" & CStr(minuto)) Else CADminuto = (CStr(minuto)) End If Etiqueta_Hora_Inicio = CADhora & ":" & CADminuto End Sub b)VISOR DE GRAFICAS ANTERIORES Form_Visor '---------------------------------------------------------------------------------- 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 '---------------------------------------------------------------------------------- Dim DATOS_Visor As Data_Visor Dim HORA_STARTS As HORA_START Private Sub Chk_Zoom_Click() 'Bandera que indica que fue seleccionado el Chk_Zoom Flag_Zoom_Visor = Chk_Zoom.Value 'Revisar valor del chk_zoom Checa_Zoom If (Chk_Zoom.Value <> 1) Then Mostrar_Grafica 'Llenado RichTextBox Validar_Llenado_RTF End If End Sub Private Sub Chk_Zoom1_Click() 'Bandera que indica que fue seleccionado el Chk_Zoom Flag_Zoom1_Visor = Chk_Zoom1.Value 'Revisar valor del chk_zoom Checa_Zoom1 If (Chk_Zoom1.Value <> 1) Then Mostrar_Grafica1 'Validar el llenado del RTF Validar_Llenado_RTF1 End If End Sub Private Sub Cmd_Aceptar_Zoom_Click() Acepta_Zoom End Sub Private Sub Cmd_Aceptar_Zoom1_Click() Acepta_Zoom1 End Sub Private Sub Form_Load() 'Inicializar los nombres de las señales ReDim Vector_Nombres_Senales(0 To 3) Vector_Nombres_Senales(0) = "REPORTE --> VOLTAJE PLANTA DE FUERZA [Volts] Vs TIEMPO [hh:mm]" Vector_Nombres_Senales(1) = "REPORTE --> VOLTAJE BANCO DE BATERIAS [Volts] Vs TIEMPO [hh:mm]" Vector_Nombres_Senales(2) = "REPORTE --> C.F.E. Vs TIEMPO [hh:mm] Y TRANSFERENCIA Vs TIEMPO [hh:mm]" Vector_Nombres_Senales(3) = "REPORTE --> #ERRORES X MINUTO Vs TIEMPO [hh:mm]" ReDim Vector_Nombres_Senales1(0 To 2) Vector_Nombres_Senales1(0) = "REPORTE --> CORRIENTE PLANTA DE FUERZA [Amps] Vs TIEMPO [hh:mm]"

Page 295: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-liv

Vector_Nombres_Senales1(1) = "REPORTE --> FRECUENCIA PLANTA DE FUERZA [Hz] Vs TIEMPO [hh:mm]" Vector_Nombres_Senales1(2) = "REPORTE --> CORRIENTE BANCO DE BATERÍAS [Amps] Vs TIEMPO [hh:mm]" 'Establecer que máximo pueda seleccionar los archivos de la fecha actual(dia actual) MonthView1.MaxDate = Date 'Variables para la realización del Zoom empleando el mouse 'Dimensionar la pila para establecer los limites del zoom ReDim Pila_Visor(0 To 2) ReDim Pila1_Visor(0 To 2) 'Para el corrimiento TxtPosi_Alarma.Text = "" TxtFlags_Alarma.Text = "" ReDim Vector_Renglon_Visor(Dimension) 'Inicializar la fecha con una que si exista EXTENSION_DATE = "20_07_2003" Label5.Caption = EXTENSION_DATE Cargar_Visor '---------------------------------------------------------------------------------- 'Para deshabilitar maximizar, minimizar y cerrar ventana Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) '---------------------------------------------------------------------------------- '---------------------------------------------------------------------------------- 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) 'For i = 3 To 0 Step -1 ' Success = DeleteMenu(hMenu, i, MF_BYPOSITION) 'Next Success = DeleteMenu(hMenu, 8, MF_BYPOSITION) Success = DeleteMenu(hMenu, 7, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 6, MF_BYPOSITION)'Para que cierre la forma Success = DeleteMenu(hMenu, 5, MF_BYPOSITION) Success = DeleteMenu(hMenu, 4, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 3, MF_BYPOSITION)'Para que minimice Success = DeleteMenu(hMenu, 2, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 1, MF_BYPOSITION)'Para que se pueda mover la ventana Success = DeleteMenu(hMenu, 0, MF_BYPOSITION) '---------------------------------------------------------------------------------- End Sub Public Sub Cargar_Visor() 'Leer el archivo corrrespondiente de alarmas perteneciente a ese dia Leer_Archivo_Alarmas 'Para controlar la lectura de los archivos através de una sola función de Abrir Grafica For S = 0 To 6 Step 1 Select Case S Case 0 '----------------------------------------- 'Canal0-->Voltaje Planta de fuerza '----------------------------------------- NomArchivo_Visor = "VPF_" + EXTENSION_DATE + ".txt" AbrirGrafica (NomArchivo_Visor) 'Abrir archivo y guardar su contenido en un vector 'MsgBox "alto" LblHora_Inicio.Caption = Mid(HORA_INICIO_GRAFICA, 2, 2) + ":" + (Mid(Str(HORA_STARTS.HORA_START), 4, 2)) + ":" + (Mid(Str(HORA_STARTS.HORA_START), 6, 2)) Posicion_Visor1 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador0_Visor(0 To (Posicion_Visor1 - 2), 1 To Tot_Lineas) 'Muestras Muestras Matrix_Graficador0_Visor, Posicion_Visor1 Lineas_Alarma Matrix_Graficador0_Visor, Posicion_Visor1, Min_Volt_PF_Visor, Max_Volt_PF_Visor Colores_Series Case 1 '----------------------------------------- 'Canal2-->Voltaje Banco de baterías '----------------------------------------- NomArchivo_Visor = "VBB_" + EXTENSION_DATE + ".txt" AbrirGrafica (NomArchivo_Visor) Posicion_Visor2 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador1_Visor(0 To (Posicion_Visor2 - 2), 1 To Tot_Lineas) Muestras Matrix_Graficador1_Visor, Posicion_Visor2 Lineas_Alarma Matrix_Graficador1_Visor, Posicion_Visor2, Min_Volt_BB_Visor, Max_Volt_BB_Visor Case 2 '----------------------------------------- 'Canal 4 y 5--> CFE y Transferencia del sistema

Page 296: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lv

'----------------------------------------- NomArchivo_Visor = "CFE_" + EXTENSION_DATE + ".txt" AbrirGrafica (NomArchivo_Visor) Posicion_Visor3 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador2_Visor(0 To (Posicion_Visor3 - 2), 1 To Tot_Lineas) Muestras Matrix_Graficador2_Visor, Posicion_Visor3 NomArchivo_Visor = "TRA_" + EXTENSION_DATE + ".txt" AbrirGrafica (NomArchivo_Visor) Posicion_Visor4 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador3_Visor(0 To (Posicion_Visor4 - 2), 1 To Tot_Lineas) Muestras Matrix_Graficador3_Visor, Posicion_Visor4 Lineas_Alarma45 Matrix_Graficador2_Visor, Posicion_Visor3, Matrix_Graficador3_Visor, Posicion_Visor4, 0, 1 Case 3 '----------------------------------------- 'Canal de Errores por minuto '----------------------------------------- NomArchivo_Visor = "ERR_" + EXTENSION_DATE + ".txt" AbrirGrafica (NomArchivo_Visor) Posicion_Visor5 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador4_Visor(0 To (Posicion_Visor5 - 2), 1 To Tot_Lineas) Muestras Matrix_Graficador4_Visor, Posicion_Visor5 Lineas_Alarma Matrix_Graficador4_Visor, Posicion_Visor5, Max_Error_Visor, Max_Error_Visor NomArchivo_Visor = "CER_" + EXTENSION_DATE + ".txt" AbrirGrafica (NomArchivo_Visor) Posicion_Visor6 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador8_Visor(0 To (Posicion_Visor6 - 2), 1 To Tot_Lineas) Almacenar_MatrizCeros Matrix_Graficador8_Visor, Posicion_Visor6, Matrix_Graficador4_Visor, Posicion_Visor5 Case 4 '----------------------------------------- 'Canal1-->Corriente Planta de fuerza '----------------------------------------- NomArchivo_Visor = "APF_" + EXTENSION_DATE + ".txt" AbrirGrafica (NomArchivo_Visor) 'Abrir archivo y guardar su contenido en un vector Posicion_Visor7 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador5_Visor(0 To (Posicion_Visor7 - 2), 1 To Tot_Lineas) Muestras Matrix_Graficador5_Visor, Posicion_Visor7 Lineas_Alarma Matrix_Graficador5_Visor, Posicion_Visor7, Min_Amp_PF_Visor, Max_Amp_PF_Visor Case 5 '----------------------------------------- 'Canal6-->Frecuencia Planta de fuerza '----------------------------------------- NomArchivo_Visor = "FPF_" + EXTENSION_DATE + ".txt" '20_07_2003.txt" AbrirGrafica (NomArchivo_Visor) 'Abrir archivo y guardar su contenido en un vector Posicion_Visor8 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador6_Visor(0 To (Posicion_Visor8 - 2), 1 To Tot_Lineas) Muestras Matrix_Graficador6_Visor, Posicion_Visor8 Lineas_Alarma Matrix_Graficador6_Visor, Posicion_Visor8, Min_Frec_PF_Visor, Max_Frec_PF_Visor Case 6 '----------------------------------------- 'Canal3-->Corriente Banco de Baterías '----------------------------------------- NomArchivo_Visor = "ABB_" + EXTENSION_DATE + ".txt" '20_07_2003.txt" AbrirGrafica (NomArchivo_Visor) 'Abrir archivo y guardar su contenido en un vector Posicion_Visor9 = Posicion_Visor 'Dimensionar la matriz que contendrá los 'valores de la señal a graficar ReDim Matrix_Graficador7_Visor(0 To (Posicion_Visor9 - 2), 1 To Tot_Lineas) Muestras Matrix_Graficador7_Visor, Posicion_Visor9 Lineas_Alarma Matrix_Graficador7_Visor, Posicion_Visor9, Min_Amp_BB_Visor, Max_Amp_BB_Visor End Select Next S 'Esconder la serie de alarma 'DESHABILITAR LINEA DE ALARMA Y PREVENTIVAS MSChart_Graficador0.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True 'Para mostrar la grafica seleccionada Mostrar_Grafica Mostrar_Grafica1 'CArgar valores anteriores a los objetos de seleccion

Page 297: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lvi

Carga_Seleccion_Anterior End Sub Public Sub AbrirGrafica(Archivo As String) Dim SubIndice As Long Dim pos As Long Dim Renglon As Long Dim z As Long Dim SubIndex As Long Dim Posicion As Long 'Para obtener de manera segura, un numero de fichero libre NumRegistro_Visor = FreeFile Direccion_Visor = App.Path + "\Graficas\" + Archivo Label5.Caption = Archivo 'Abrir el archivo por acceso binario Open Direccion_Visor For Binary As #NumRegistro_Visor SubIndice = 0 Renglon = 0 SubIndex = 0 'Leer los primeros 4 bytes, correspondientes a la hora Get #NumRegistro_Visor, , HORA_STARTS HORA_INICIO_GRAFICA = Str(HORA_STARTS.HORA_START) Posicion = Seek(NumRegistro_Visor) Do 'Leer los datos con la sentencia Get Get #NumRegistro_Visor, , DATOS_Visor TxtDATO.Text = TxtDATO.Text + Str(DATOS_Visor.Dato_Visor) Vector_Renglon_Visor(SubIndex) = Val(TxtDATO.Text) SubIndex = SubIndex + 1 TxtDATO.Text = "" Posicion = Seek(NumRegistro_Visor) Loop Until EOF(NumRegistro_Visor) LblListo.Caption = "ok" 'nada por aqui Posicion = Seek(NumRegistro_Visor) Close NumRegistro_Visor Posicion_Visor = SubIndex Total_Elementos_Archivo = Posicion End Sub Public Sub Muestras(Matriz() As Single, Position As Long) Dim Columna As Long Columna = 0 For Columna = 0 To (Position - 2) Step 1 If (Columna = 0) Then Matriz(Columna, 1) = Vector_Renglon_Visor(Columna) Else Matriz(Columna, 1) = Vector_Renglon_Visor(Columna) End If Next Columna End Sub Public Sub Almacenar_MatrizCeros(Matriz0() As Single, Position0 As Long, Matriz1() As Single, Position1 As Long) Dim Columna As Long Columna = 0 For Columna = 0 To (Position1 - 2) Step 1 Matriz0(Columna, 1) = Vector_Renglon_Visor(Columna) Next Columna For Columna = 0 To (Position0 - 2) Step 1 Matriz1(Columna, 5) = Matriz0(Columna, 1) Next Columna End Sub Public Sub Lineas_Alarma(Matriz() As Single, Position As Long, Val_Min As Integer, Val_Max As Integer) 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To (Position - 2) Step 1 Select Case Serie Case 2 Matriz((Renglon), Serie) = Val_Min 'Min_Volt_PF_Visor Case 3 Matriz((Renglon), Serie) = Val_Max ' Max_Volt_PF_Visor Case 4 Matriz((Renglon), Serie) = Val_Min - 1 'Min_Volt_PF_Visor - 1 Case 5 Matriz((Renglon), Serie) = Val_Max + 1 'Max_Volt_PF_Visor + 1 Case 6 'Matrix_Graficador0_Visor((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Volt_PF_visor End Select Next Renglon Next Serie

Page 298: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lvii

End Sub Public Sub Lineas_Alarma45(Matriz0() As Single, Position0 As Long, Matriz1() As Single, Position1 As Long, Val_Min As Integer, Val_Max As Integer) 'Case para establecer las amplitudes de las lineas indicadoras de alarmas For Serie = 2 To 6 Step 1 For Renglon = 0 To (Position0 - 2) Step 1 Select Case Serie Case 2 Matriz0((Renglon), Serie) = Val_Min Matriz1((Renglon), Serie) = Val_Min Case 3 Matriz0((Renglon), Serie) = Val_Max Matriz1((Renglon), Serie) = Val_Max Case 4 Matriz0((Renglon), Serie) = Val_Min + 0.1 Matriz1((Renglon), Serie) = Val_Min + 0.1 Case 5 Matriz0((Renglon), Serie) = Val_Max - 0.1 Matriz1((Renglon), Serie) = Val_Max - 0.1 Case 6 'Matrix_Graficador3((Renglon) / Periodo_Submuestreo, Serie) = Amplitud_Alarma_Transferencia End Select Next Renglon Next Serie End Sub Public Sub Colores_Series() 'Case para establecer los colores de las lineas indicadoras de alarmas (de cada serie) For Serie = 1 To 6 Step 1 Select Case Serie Case 1 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With Case 2 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 3 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 4 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With Case 5 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With Case 6 With MSChart_Graficador0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With With MSChart_Graficador1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With

Page 299: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lviii

End Select Next Serie End Sub Public Sub Mostrar_Grafica() Select Case Grafica_Opcion_Visor Case 0 If Chk_Zoom.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador0 MSChart_Graficador0.ChartData = Matrix_Graficador0_Visor 'Establecer etiquetas Establecer_Labels MSChart_Graficador0 End If Case 1 If Chk_Zoom.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador0 MSChart_Graficador0.ChartData = Matrix_Graficador1_Visor Establecer_Labels MSChart_Graficador0 Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 End If Case 2 If Chk_Zoom.Value <> 1 Then 'Deshabilitar series Deshabilitar_Series MSChart_Graficador0.ChartData = Matrix_Graficador2_Visor Establecer_Labels MSChart_Graficador0 MSChart_Graficador1.ChartData = Matrix_Graficador3_Visor Establecer_Labels MSChart_Graficador1 Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 End If Case 3 If Chk_Zoom.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador0 MSChart_Graficador0.ChartData = Matrix_Graficador4_Visor 'Establecer_Color_Serie5 With MSChart_Graficador0.Plot.SeriesCollection(5).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 213, 164, 22 'Cafe End With For Columna = 0 To (Posicion_Visor5 - 2) Step 1 MSChart_Graficador0.Row = Columna + 1 Conta_Minutos_Visor = Columna + 1 Num_Row = Columna + 1 Establecer_Formato_HHMM MSChart_Graficador0 Next Columna End If End Select End Sub Public Sub Leer_Archivo_Alarmas() Dim CONFIGURACION_ALARMA_Visor As ALARMA_CONFIG 'Estructura empleada para leer el 'archivo Alarma.txt NumRegistro_Alarma_Visor = FreeFile Label5.Caption = EXTENSION_DATE Direccion_Alarma_Visor = App.Path + "\Configuraciones\" + EXTENSION_DATE + ".txt" 'Abrir el archivo usando acceso binario Open Direccion_Alarma_Visor For Binary As #NumRegistro_Alarma_Visor 'Leer el archivo usando la estructura ALARMA_CONFIG Get #NumRegistro_Alarma_Visor, 1, CONFIGURACION_ALARMA_Visor Posicion = Seek(NumRegistro_Alarma_Visor) Close NumRegistro_Alarma_Visor 'Asignar los valores leidos del archivo Alarma.txt a los text_box de 'configuración Min_Volt_PF_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Min_Volt_PF) Max_Volt_PF_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Max_Volt_PF) Min_Amp_PF_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Min_Amp_PF) Max_Amp_PF_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Max_Amp_PF) Min_Frec_PF_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Min_Frec_PF) Max_Frec_PF_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Max_Frec_PF) Min_Volt_BB_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Min_Volt_BB) Max_Volt_BB_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Max_Volt_BB) Min_Amp_BB_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Min_Amp_BB) Max_Amp_BB_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Max_Amp_BB) Max_Error_Visor = Str(CONFIGURACION_ALARMA_Visor.Alarma_Max_Error) Tiempo_Alarma_Volt_PF_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Volt_PF)) Tiempo_Alarma_Amp_PF_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Amp_PF)) Tiempo_Alarma_Frec_PF_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Frec_PF)) Tiempo_Alarma_Volt_BB_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Volt_BB)) Tiempo_Alarma_Amp_BB_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Amp_BB)) Tiempo_Alarma_Error_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Error)) Tiempo_Alarma_Transferencia_CFEPF_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Transferencia_CFEPF)) Tiempo_Alarma_Transferencia_PFCFE_Visor = (Str(CONFIGURACION_ALARMA_Visor.Alarma_Tiempo_Transferencia_PFCFE)) End Sub

Page 300: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lix

Public Sub Acepta_Zoom() Txt_Min_Inicio.Text = Minuto0_Visor Txt_Min_Fin.Text = Minuto1_Visor Lblminuto0.Caption = Str(Minuto0_Visor) Lblminuto1.Caption = Str(Minuto1_Visor) 'Validacion de los textboxes del Zoom 'Ambos limites deben ser mayores a cero y diferentes uno del otro 'y el minuto superior debe ser menor al tiempo trans currido If (Val(Txt_Min_Inicio.Text) >= 0) And (Val(Txt_Min_Fin.Text) > Val(Txt_Min_Inicio.Text)) Then ' And (Val(Txt_Min_Fin.Text) <= TIEMPO) Then 'Si ya se realizó un Zoom, entonces el siguiente zoom es un zoom en el zoom 'lo cual cambia los limites de inicio y fin del zoom If (Flag_Profundidad_Zoom_Visor = 0) And (Con_Puntos_Activados_Visor = 2) Then Min_Inicio_Visor = (Txt_Min_Inicio.Text) Min_Fin_Visor = (Txt_Min_Fin.Text) Min_Inicio_Anterior_Visor = Min_Inicio_Visor End If If (Flag_Profundidad_Zoom_Visor = 1) And (DIFERENCIA_Visor <> 1) And (Con_Puntos_Activados_Visor = 2) Then Min_Inicio_Visor = Min_Inicio_Visor + Minuto0_Visor Min_Fin_Visor = Min_Inicio_Anterior_Visor + Minuto1_Visor Min_Inicio_Anterior_Visor = Min_Inicio_Visor End If DIFERENCIA_Visor = Min_Fin_Visor - Min_Inicio_Visor LBLDIFERENCIA.Caption = Str(DIFERENCIA_Visor) 'Actualizar cajas de texto Txt_Min_Inicio.Text = Str(Min_Inicio_Visor) Txt_Min_Fin.Text = Str(Min_Fin_Visor) 'Reactivar el priemr menu de opcion Activar_Menu Zoom Else MsgBox "PARAMETROS NO VALIDOS DEL ZOOM!" Txt_Min_Inicio.Text = "" Txt_Min_Fin.Text = "" Txt_Min_Inicio.Text = "0" Txt_Min_Fin.Text = "1" Inicio_visor = Val(Txt_Min_Inicio.Text) Fin_visor = Val(Txt_Min_Fin.Text) Min_Inicio_Visor = Inicio_visor Min_Fin_Visor = Fin_visor End If End Sub Public Sub Activar_Menu() For i = 0 To 3 Step 1 Opcion(i).Enabled = True Next i End Sub Public Sub Zoom() Dim Range As Integer Dim Inicio As Integer Dim Fin As Integer Dim Col As Long Range = Min_Fin_Visor - Min_Inicio_Visor Inicio = Min_Inicio_Visor Fin = Min_Fin_Visor ReDim Matrix_Graficador0_Aux_Visor(0 To (((Range * (NumBytes_1seg + 1)) / Periodo_Submuestreo) - 1), 1 To (Tot_Lineas)) Col = 0 Select Case Grafica_Opcion_Visor Case 0 Habilitar_Chks_Zoom Chk_Lim_Superior, Chk_Lim_Inferior 'Tomar el rango de datos deseado For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0_Aux_Visor(Col, 1) = Matrix_Graficador0_Visor(Columna, 1) Col = Col + 1 Next Columna Colum_Visor = Col 'Establecer las amplitudes de los limites Limite_Superior_Visor = Max_Volt_PF_Visor Limite_Inferior_Visor = Min_Volt_PF_Visor 'Revisar que líneas fueron activadas Activar_Desactivar_Series Chk_Lim_Superior, Chk_Lim_Inferior, Matrix_Graficador0_Aux_Visor, Colum_Visor, MSChart_Graficador0, Limite_Superior_Visor, Limite_Inferior_Visor, Opcion(3) Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 1 Habilitar_Chks_Zoom Chk_Lim_Superior, Chk_Lim_Inferior 'Tomar el rango de datos deseado

Page 301: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lx

For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0_Aux_Visor(Col, 1) = Matrix_Graficador1_Visor(Columna, 1) Col = Col + 1 Next Columna Colum_Visor = Col 'Establecer las amplitudes de los limites Limite_Superior_Visor = Max_Volt_BB_Visor Limite_Inferior_Visor = Min_Volt_BB_Visor 'Revisar que líneas fueron activadas Activar_Desactivar_Series Chk_Lim_Superior, Chk_Lim_Inferior, Matrix_Graficador0_Aux_Visor, Colum_Visor, MSChart_Graficador0, Limite_Superior_Visor, Limite_Inferior_Visor, Opcion(3) Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 2 Deshabilitar_Chks_Zoom Chk_Lim_Superior, Chk_Lim_Inferior 'Tomar el rango de datos deseado For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador0_Aux_Visor(Col, 1) = Matrix_Graficador2_Visor(Columna, 1) Col = Col + 1 Next Columna Col = 0 ReDim Matrix_Graficador1_Aux_Visor(0 To (((Range * (NumBytes_1seg + 1)) / Periodo_Submuestreo) - 1), 1 To (Tot_Lineas)) For Columna = (Inicio * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux_Visor(Col, 1) = Matrix_Graficador3_Visor(Columna, 1) Col = Col + 1 Next Columna Colum_Visor = Col 'Establecer las amplitudes de las preventivas For Renglon = 0 To (Colum_Visor - 1) Step 1 Matrix_Graficador0_Aux_Visor(Renglon, 4) = 0 + 0.1 Matrix_Graficador1_Aux_Visor(Renglon, 4) = 0 + 0.1 'Y hace cero la del otro limite Matrix_Graficador0_Aux_Visor(Renglon, 5) = 1 - 0.1 Matrix_Graficador1_Aux_Visor(Renglon, 5) = 1 - 0.1 Next Renglon Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 3 Habilitar_Chks_Zoom Chk_Lim_Superior, Chk_Lim_Inferior 'Deshabilitar limite inferior ya quie no se requiere y limpiarlo Chk_Lim_Inferior.Enabled = False Chk_Lim_Inferior.Value = 0 ReDim Matrix_Graficador0_Aux_Visor(0 To (Range - 1), 1 To Tot_Lineas) 'Tomar el rango de datos deseado For Columna = Inicio To (Fin - 1) Step 1 Matrix_Graficador0_Aux_Visor(Col, 1) = Matrix_Graficador4_Visor(Columna, 1) Col = Col + 1 Next Columna Col = 0 For Columna = Inicio To (Fin - 1) Step 1 Matrix_Graficador0_Aux_Visor(Col, 5) = Matrix_Graficador8_Visor(Columna, 1) Col = Col + 1 Next Columna Colum_Visor = Col 'Establecer las amplitudes de los limites Limite_Superior_Visor = Max_Error_Visor Limite_Inferior_Visor = Max_Error_Visor 'Revisar que líneas fueron activadas Activar_Desactivar_Series Chk_Lim_Superior, Chk_Lim_Inferior, Matrix_Graficador0_Aux_Visor, Colum_Visor, MSChart_Graficador0, Limite_Superior_Visor, Limite_Inferior_Visor, Opcion(3) 'Cambiar el color de la serie 5 'Establecer_Color_Serie5 With MSChart_Graficador0.Plot.SeriesCollection(5).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 213, 164, 22 'Amarillo End With 'Activar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = True Lbl_CerosXMinuto.Visible = True End Select 'Hacer Flag_Profundidad_Zoom=1, indicando que ya se realizó un zoom Flag_Profundidad_Zoom_Visor = 1 'Flag_Profundidad_Zoom + 1 'Una vez realizado el zoom hay que reiniciar el contador de la pila del zoom Pos_Pila_Visor = 0 Lblpila.Caption = Str(Pos_Pila_Visor) 'Graficarlo en el componente MSChart_Graficador0.ChartData = Matrix_Graficador0_Aux_Visor Establecer_Labels_Zoom MSChart_Graficador0, Min_Inicio_Visor, Min_Fin_Visor

Page 302: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxi

If (Grafica_Opcion_Visor = 2) Then MSChart_Graficador1.ChartData = Matrix_Graficador1_Aux_Visor Establecer_Labels_Zoom_Transferencia End If If (Grafica_Opcion_Visor = 3) Then MSChart_Graficador0.ChartData = Matrix_Graficador0_Aux_Visor Establecer_Labels_Zoom_Errores End If 'Para llenar el Richtextbox Validar_Llenado_RTF End Sub Private Sub Gráfica_Inferior_Click() If (Grafica_Opcion_Visor = 2) Then Call Gráfica_Superior_Click Else Impresora1 Vector_Nombres_Senales1(Grafica_Opcion1_Visor), MSChart_Graficador1 'Averiguar cuantos lineas tiene el richtextbox Numero_vbcrlf RichTextBox2 Dividir_Impresion RichTextBox2, RichTextBox4 End If End Sub Private Sub Gráfica_Superior_Click() 'Imprimir las graficas y su encabezado Impresora Vector_Nombres_Senales(Grafica_Opcion_Visor), MSChart_Graficador0, MSChart_Graficador1 ', MSChart_Graficador1 'Averiguar cuantos lineas tiene el richtextbox Numero_vbcrlf RichTextBox1 Dividir_Impresion RichTextBox1, RichTextBox3 End Sub Public Sub Numero_vbcrlf(Objeto_RTB_Fuente As RichTextBox) Dim caracter As String Dim p As Long Dim Lin As Long Dim Long_RTB As Long p = 1 Lin = 0 Long_RTB = Len(Objeto_RTB_Fuente.Text) TOT_LINE = 0 TOT_CAR = 0 'Mientras no se llegue al fin de texto Do While (p < Long_RTB) car = Mid(Objeto_RTB_Fuente.Text, p, 1) caracter = Mid(Objeto_RTB_Fuente.Text, p, 2) If (caracter = vbCrLf) Then 'Total de cambios de linea en el richtextbox Lin = Lin + 1 End If p = p + 1 Loop TOT_LINE = Lin TOT_CAR = Long_RTB End Sub Public Sub Dividir_Impresion(Objeto_RTB_Fuente As RichTextBox, Objeto_RTB_Destino As RichTextBox) Dim Tot_Lin_Hoja1 As Long Dim Cad_Str As String Dim Tot_Lin_Hojas As Long Dim Cont_Lin As Long Dim p As Long Dim Tot_Hojas As Long Dim Cont_Hojas As Long Cont_Hoja = 1 p = 1 Cont_Lin = 1 Tot_Lin_Hoja1 = 30 Max_Lin_Hoja = 75 'Mientras no se llegue al fin de texto Do While (p < TOT_CAR - 2) 'Long_RTB) Do While ((Cont_Lin <= (Max_Lin_Hoja) * Cont_Hoja) And (Cont_Lin < TOT_LINE)) 'Tot_Lineas) car = Mid(Objeto_RTB_Fuente.Text, p, 1) Cad_Str = Cad_Str + car caracter = Mid(Objeto_RTB_Fuente.Text, p, 2) If (caracter = vbCrLf) Then 'Total de cambios de linea en el richtextbox Cont_Lin = Cont_Lin + 1 End If p = p + 1 Loop 'agregarlos al richtextbox

Page 303: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxii

Objeto_RTB_Destino.Text = Cad_Str 'Imprimir RTB Imprimir_RTB Objeto_RTB_Destino 'Limpiar RTB Cad_Str = "" Cont_Hoja = Cont_Hoja + 1 Loop End Sub Public Sub Imprimir_RTB(Objeto_RTB As RichTextBox) Printer.PrintQuality = vbPRPQDraft On Error GoTo ElError Printer.Print " " Objeto_RTB.SelPrint Printer.hDC Printer.EndDoc ElError: End Sub Private Sub Impresora(Nombre_Senal As String, Objeto_Mschart As MSChart, Optional Objeto_Mschart1 As MSChart) 'Nombre_Grafica As String) Dim Cte As Long Cte = 4300 '4200 '4400 '3800 Objeto_Mschart.EditCopy Printer.PrintQuality = vbPRPQDraft On Error GoTo ERR Printer.Print " " Crear_Linea "=", 86 Printer.CurrentX = 0 Printer.CurrentY = 0 Crear_Linea "=", 86 Printer.Print Linea + vbCrLf + Nombre_Senal + vbCrLf + Linea + vbCrLf 'Cordenada en la que se ubicará el contenido del graficador superior Printer.PaintPicture Clipboard.GetData(), 0, 500 'Agregar la grafica inferior en el reporte, cuando se elija, CFE y transferencia If (Grafica_Opcion_Visor = 2) Then Objeto_Mschart1.EditCopy On Error GoTo ERR Printer.Print " " Printer.CurrentX = 0 Printer.CurrentY = 4200 '4400 'Cordenada en la que se ubicará el contenido del graficador inferior Printer.PaintPicture Clipboard.GetData(), 0, 4800 '5000 '5200 Cte = 8800 '9000 '9200 End If Printer.EndDoc ERR: End Sub Private Sub Impresora1(Nombre_Senal As String, Objeto_Mschart As MSChart) ' Optional Objeto_Mschart11 As MSChart) 'Nombre_Grafica As String) Dim Cte As Long Cte = 4400 '3800 Objeto_Mschart.EditCopy Printer.PrintQuality = vbPRPQDraft On Error GoTo ERR Printer.Print " " Crear_Linea "=", 86 Printer.CurrentX = 0 Printer.CurrentY = 0 Crear_Linea "=", 86 Printer.Print Linea + vbCrLf + Nombre_Senal + vbCrLf + Linea + vbCrLf 'Cordenada en la que se ubicará el contenido del graficador superior Printer.PaintPicture Clipboard.GetData(), 0, 500 Printer.EndDoc ERR: End Sub '??????????????????????????????????????????????????????????????????' '?????????????????????????????????????????????????????????????????? Private Sub Opcion_Click(Index As Integer) 'Para saber que grafica se desea mostrar For i = 0 To 3 If Opcion(i).Value <> False Then Select Case i Case 0 Grafica_Opcion_Visor = i 'Muestra titulo LblTitulo0.Caption = "VOLTAJE(Volts)" Habilitar_Series MSChart_Graficador0 'Habilitar el Menu1 y el Zoom1 Activar_Menu1 Chk_Zoom1.Enabled = True 'si la anterior opcion seleccionada es tranferencia, repintar Mschart_graficador1 'con la opcion seleccionada If (LblTitulo1.Caption = "TRANSFERENCIA") Then Opcion1(0).Value = True LblTitulo1.Caption = "CORRIENTE(Amp)" Mostrar_Grafica1 End If

Page 304: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxiii

Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 1 Grafica_Opcion_Visor = i 'Muestra titulo LblTitulo0.Caption = "VOLTAJE(Volts)" Habilitar_Series MSChart_Graficador0 'Habilitar el Menu1 y el Zoom1 Activar_Menu1 Chk_Zoom1.Enabled = True 'si la anterior opcion seleccionada es tranferencia, repintar Mschart_graficador1 'con la opcion seleccionada If (LblTitulo1.Caption = "TRANSFERENCIA") Then Opcion1(0).Value = True LblTitulo1.Caption = "CORRIENTE(Amp)" Mostrar_Grafica1 End If Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 2 Grafica_Opcion_Visor = i 'Muestra titulo LblTitulo0.Caption = "C.F.E." LblTitulo1.Caption = "TRANSFERENCIA" 'Para deshabilitar las series innecesarias Deshabilitar_Series 'deshabilitar el Menu1 y el Zoom1 y limpia chk_zoom1 Chk_Zoom1.Enabled = False Chk_Zoom1.Value = 0 Desactivar_Menu1 Establecer_Colores_Series MSChart_Graficador0, MSChart_Graficador1 'Ocultar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = False Lbl_CerosXMinuto.Visible = False Case 3 Grafica_Opcion_Visor = i 'Muestra titulo LblTitulo0.Caption = "#ERRORES x MINUTO" Habilitar_Series MSChart_Graficador0 'Habilitar el Menu1 y el Zoom1 Activar_Menu1 Chk_Zoom1.Enabled = True 'si la anterior opcion seleccionada es tranferencia, repintar Mschart_graficador1 'con la opcion seleccionada If (LblTitulo1.Caption = "TRANSFERENCIA") Then Opcion1(0).Value = True LblTitulo1.Caption = "CORRIENTE(Amp)" Mostrar_Grafica1 End If 'Establecer_Color_Serie5 With MSChart_Graficador0.Plot.SeriesCollection(5).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 213, 164, 22 'Amarillo End With 'Activar etiqueta de la cantidad de ceros por minuto Shp_CerosXMinuto.Visible = True Lbl_CerosXMinuto.Visible = True End Select End If Next i Flag_Grafica_Opcion_Visor = Grafica_Opcion_Visor 'Si no esta activo el zoom entonces mostrar grafica If Not (Chk_Zoom.Value = 1) Then Mostrar_Grafica 'Para llenar el Richtextbox Validar_Llenado_RTF Else 'Si no llamar funcion realizar Zoom 'Checa_Zoom 'Deshabilita la serie 6 de alarma el gaficador1 If (Opcion(2).Value = True) Then MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If Acepta_Zoom End If End Sub Public Sub Habilitar_Series(Mschart_Control As MSChart)

Page 305: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxiv

For S = 2 To 5 Step 1 Mschart_Control.Plot.SeriesCollection(S).Position.Hidden = False Next S 'DESHABILITAR LINEA DE ALARMA Y PREVENTIVAS MSChart_Graficador0.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End Sub Public Sub Mostrar_Grafica1() Select Case Grafica_Opcion1_Visor Case 0 If Chk_Zoom1.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador1 MSChart_Graficador1.ChartData = Matrix_Graficador5_Visor Establecer_Labels MSChart_Graficador1 End If Case 1 If Chk_Zoom1.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador1 MSChart_Graficador1.ChartData = Matrix_Graficador6_Visor Establecer_Labels MSChart_Graficador1 End If Case 2 If Chk_Zoom1.Value <> 1 Then 'Habilitar series Habilitar_Series MSChart_Graficador1 MSChart_Graficador1.ChartData = Matrix_Graficador7_Visor Establecer_Labels MSChart_Graficador1 End If End Select End Sub Public Sub Activar_Menu1() For i = 0 To 2 Step 1 Opcion1(i).Enabled = True Next i End Sub Public Sub Establecer_Colores_Series(Mschart_Ctrl0 As MSChart, Mschart_Ctrl1 As MSChart) 'Case para establecer los colores de las lineas indicadoras de alarmas (de cada serie) For Serie = 1 To 6 Step 1 Select Case Serie Case 1 With Mschart_Ctrl0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With With Mschart_Ctrl1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 0, 255 'AZUL End With Case 2 With Mschart_Ctrl0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With Mschart_Ctrl1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 3 With Mschart_Ctrl0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With With Mschart_Ctrl1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 0, 255, 0 'verde End With Case 4 With Mschart_Ctrl0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With Mschart_Ctrl1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With

Page 306: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxv

Case 5 With Mschart_Ctrl0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With With Mschart_Ctrl1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 235, 235, 22 'Amarillo End With Case 6 With Mschart_Ctrl0.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With With Mschart_Ctrl1.Plot.SeriesCollection(Serie).DataPoints(-1) .Brush.Style = VtBrushStyleSolid .Brush.FillColor.Set 255, 0, 0 'rojo End With End Select Next Serie End Sub Public Sub Deshabilitar_Series() '2 to 5 If (Flag_Preventiva45 = 0) Then 'Deshabilitar todas For S = 2 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S Else If (Flag_Preventiva45 = 2) Then MSChart_Graficador0.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection((Flag_Preventiva45 + 1) + 2).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection((Flag_Preventiva45 + 1) + 2).Position.Hidden = True For S = 2 To 3 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S Else MSChart_Graficador0.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador1.Plot.SeriesCollection(Flag_Preventiva45 + 2).Position.Hidden = False MSChart_Graficador0.Plot.SeriesCollection((Flag_Preventiva45 - 1) + 2).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection((Flag_Preventiva45 - 1) + 2).Position.Hidden = True For S = 2 To 3 Step 1 MSChart_Graficador0.Plot.SeriesCollection(S).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(S).Position.Hidden = True Next S End If End If 'DESHABILITAR LINEA DE ALARMA Y PREVENTIVAS MSChart_Graficador0.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(4).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(5).Position.Hidden = True MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End Sub Public Sub Desactivar_Menu1() For i = 0 To 2 Step 1 Opcion1(i).Enabled = False Next i End Sub Private Sub Opcion1_Click(Index As Integer) 'Para saber que grafica se desea mostrar 'si se deshabilito Chk_zoom1 entonces deshabilitar el menu1 For i = 0 To 2 If Opcion1(i).Value <> False Then Select Case i Case 0 Grafica_Opcion1_Visor = i 'Poner titulo LblTitulo1.Caption = "CORRIENTE (Amp)" Habilitar_Series MSChart_Graficador1 Case 1 Grafica_Opcion1_Visor = i 'Poner titulo LblTitulo1.Caption = "FRECUENCIA (Hz)" Habilitar_Series MSChart_Graficador1 Case 2 Grafica_Opcion1_Visor = i LblTitulo1.Caption = "CORRIENTE (Amp)" Habilitar_Series MSChart_Graficador1

Page 307: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxvi

End Select End If Next i Flag_Grafica_Opcion1_Visor = Grafica_Opcion1_Visor 'Si no esta activo el zoom entonces mostrar grafica If Not (Chk_Zoom1.Value = 1) Then Mostrar_Grafica1 'Llenar richttextbox Validar_Llenado_RTF1 Else Acepta_Zoom1 End If End Sub Public Sub Acepta_Zoom1() Txt_Min_Inicio1.Text = Minuto0_Visor Txt_Min_Fin1.Text = Minuto1_Visor Lblminuto0.Caption = Str(Minuto0_Visor) Lblminuto1.Caption = Str(Minuto1_Visor) 'Validacion de los textboxes del Zoom 'Ambos limites deben ser mayores a cero y diferentes uno del otro 'y el minuto superior debe ser menor al tiempo trans currido If (Val(Txt_Min_Inicio1.Text) >= 0) And (Val(Txt_Min_Fin1.Text) > Val(Txt_Min_Inicio1.Text)) Then ' And (Val(Txt_Min_Fin1.Text) <= (TIEMPO)) Then 'Si ya se realizó un Zoom, entonces el siguiente zoom es un zoom en el zoom 'lo cual cambia los limites de inicio y fin del zoom If (Flag_Profundidad_Zoom1_Visor = 0) And (Con_Puntos_Activados1_Visor = 2) Then Min_Inicio1_Visor = (Txt_Min_Inicio1.Text) Min_Fin1_Visor = (Txt_Min_Fin1.Text) Min_Inicio_Anterior1_Visor = Min_Inicio1_Visor End If If (Flag_Profundidad_Zoom1_Visor = 1) And (DIFERENCIA1_Visor <> 1) And (Con_Puntos_Activados1_Visor = 2) Then Min_Inicio1_Visor = Min_Inicio1_Visor + Minuto0_Visor Min_Fin1_Visor = Min_Inicio_Anterior1_Visor + Minuto1_Visor Min_Inicio_Anterior1_Visor = Min_Inicio1_Visor End If DIFERENCIA1_Visor = Min_Fin1_Visor - Min_Inicio1_Visor LBLDIFERENCIA.Caption = Str(DIFERENCIA1_Visor) 'Actualizar cajas de texto Txt_Min_Inicio1.Text = Str(Min_Inicio1_Visor) Txt_Min_Fin1.Text = Str(Min_Fin1_Visor) 'Reactivar el priemr menu de opcion Activar_Menu1 Zoom1 Else MsgBox "PARAMETROS NO VALIDOS DEL ZOOM!" Txt_Min_Inicio1.Text = "" Txt_Min_Fin1.Text = "" Txt_Min_Inicio1.Text = "0" Txt_Min_Fin1.Text = "1" Inicio1_Visor = Val(Txt_Min_Inicio1.Text) Fin1_Visor = Val(Txt_Min_Fin1.Text) Min_Inicio1_Visor = Inicio1_Visor Min_Fin1_Visor = Fin1_Visor End If End Sub Public Sub Establecer_Labels(Mschart_Control As MSChart) Conta_Minutos_Visor = 0 Num_labels = Mschart_Control.RowCount Contador = 0 For Columna = 0 To (Num_labels - 1) Step 1 If (Columna = 0) Then Contador = 1 Mschart_Control.Row = Columna + 1 Mschart_Control.RowLabel = Mid(LblHora_Inicio, 1, 5) Else Contador = Contador + 1 If Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo) Then Num_Row = Columna + 1 Conta_Minutos_Visor = (Columna + 1) / ((NumBytes_1seg + 1) / Periodo_Submuestreo) Establecer_Formato_HHMM Mschart_Control Contador = 0 Else 'Limpa label Mschart_Control.Row = Columna + 1 Mschart_Control.RowLabel = "" End If End If Next Columna

Page 308: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxvii

End Sub Public Sub Establecer_Formato_HHMM(Mschart_Control As MSChart) Dim HH_MM_Inicio As String Dim HORA As Integer Dim minuto As Integer Dim CADhora As String Dim CADminuto As String Dim Checar_Formato_Tiempo As String If (Len(LblHora_Inicio.Caption) > 8) Then Checar_Formato_Tiempo = 1 'Formato 1-12 horas a.m. o p.m. Else Checar_Formato_Tiempo = 0 'Formato 0-24 horas End If 'Tomar de referencia la primer etiqueta establecida si es la primera vez que se entra 'a esta funcion If (Conta_Minutos_Visor = 1) Then Etiqueta_Index_Visor = Mid(LblHora_Inicio.Caption, 1, 5) End If 'Tomar de referencia el ultimo label estblecido HH_MM_Inicio = Etiqueta_Index_Visor HORA = Val(Mid(HH_MM_Inicio, 1, 2)) minuto = Val(Mid(HH_MM_Inicio, 4, 5)) 'Incrementar minutos minuto = minuto + 1 Lblminutos.Caption = minuto If (minuto >= 60) Then 'Incrementa las horas HORA = HORA + 1 minuto = 0 'Dependiendo del formato usado reiniciar hora If (Checar_Formato_Tiempo = 1) Then If (HORA > 12) Then HORA = 1 End If Else If (HORA > 23) Then HORA = 0 End If End If End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (HORA >= 0) And (HORA <= 9) Then CADhora = ("0" & CStr(HORA)) Else CADhora = (CStr(HORA)) End If 'si los minutos son >=0 o <=9 If (minuto >= 0) And (minuto <= 9) Then CADminuto = ("0" & CStr(minuto)) Else CADminuto = (CStr(minuto)) End If Etiqueta_Index_Visor = CADhora & ":" & CADminuto Mschart_Control.Row = Num_Row Mschart_Control.RowLabel = Etiqueta_Index_Visor LblConta_Entro = Etiqueta_Index_Visor Lblminutos = Str(minuto) End Sub Public Sub Checa_Zoom() 'Habilitar todas las opciones de Zoom cuando se active el Chk_Zoom If (Chk_Zoom.Value = 1) Then Cmd_Aceptar_Zoom.Enabled = True Chk_Lim_Inferior.Enabled = True Chk_Lim_Superior.Enabled = True 'Permitir seleccionar las partes del grafico MSChart_Graficador0.AllowSelections = True 'Desactivar el primer menu de opcion Desactivar_Menu Else 'Activar el primer menu de opcion Activar_Menu Cmd_Aceptar_Zoom.Enabled = False Chk_Lim_Inferior.Enabled = False Chk_Lim_Superior.Enabled = False 'No Permitir seleccionar las partes del grafico MSChart_Graficador0.AllowSelections = False 'Reactivar todas las series

Page 309: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxviii

For j = 2 To 5 Step 1 MSChart_Graficador0.Plot.SeriesCollection(j).Position.Hidden = False Next j 'Inicilizar contador de limites para el zoom Pos_Pila_Visor = 0 Lblpila.Caption = Str(Pos_Pila_Visor) 'Limpiar bandera indicadora de profundidad de zoom Flag_Profundidad_Zoom_Visor = 0 'Limpiar la variable que alamcena el minuto de inicio anterior Min_Inicio_Anterior_Visor = 0 DIFERENCIA_Visor = 0 End If 'desactivar alarma MSChart_Graficador0.Plot.SeriesCollection(6).Position.Hidden = True If (Opcion(2).Value = True) Then MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End If End Sub Public Sub Desactivar_Menu() For i = 0 To 3 Step 1 Opcion(i).Enabled = False Next i End Sub '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '% Código para la selección del zoom empleando el mouse '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Private Sub MSChart_Graficador0_PointActivated(Serie As _ Integer, PuntoDatos As Integer, MouseFlags As _ Integer, Cancel As Integer) Serie = 1 Lblpila.Caption = Str(Pos_Pila_Visor) If (Pos_Pila_Visor <= 0) Then Pos_Pila_Visor = 0 End If 'Si son iguales los borra If (PuntoDatos = PuntoDatos_Anterior1_Visor) Then PuntoDatos = 1 PuntoDatos_Anterior1_Visor = 1 Pila_Visor(Pos_Pila_Visor) = 1 Flag_Borra_Zoom = 1 End If 'Se envia el foco de seleccion siempre a la serie1-->la señal(1) MSChart_Graficador0.SelectPart VtChPartTypePoint, Serie, PuntoDatos, index3, index4 'Label1.Caption = Str(PuntoDatos) 'incrementar sub indice pila 'Si son diferentes los almacena If (PuntoDatos <> PuntoDatos_Anterior1_Visor) Then Pila_Visor(Pos_Pila_Visor) = PuntoDatos Pos_Pila_Visor = Pos_Pila_Visor + 1 Else Pos_Pila_Visor = Pos_Pila_Visor - 1 End If PuntoDatos_Anterior1_Visor = PuntoDatos 'Para limitar el crecimiento de la pila If (Pos_Pila_Visor > 1) Then Pos_Pila_Visor = Pos_Pila_Visor - 1 End If If (Flag_Borra_Zoom = 1) Then 'Pos_Pila = Pos_Pila - 1 PuntoDatos_Anterior1_Visor = Pila_Visor(0) Flag_Borra_Zoom = 0 'Pasar el enfoque a Pila(0) MSChart_Graficador0.SelectPart VtChPartTypePoint, Serie, PuntoDatos_Anterior1, index3, index4 End If 'Incrementar el contador de puntos activados Con_Puntos_Activados_Visor = Con_Puntos_Activados_Visor + 1 'Si ya se establecieron dos puntos hay que realizar el zoom If (Con_Puntos_Activados_Visor = 2) Then Establecer_Limites_Minutos Pila_Visor Acepta_Zoom 'Inicializar el contador de puntos activados para que automaticamente este 'listo para realizar otro zoom Con_Puntos_Activados_Visor = 0 End If End Sub

Page 310: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxix

'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Public Sub Establecer_Limites_Minutos(Pilas() As Long) Dim Modulo As Integer Dim Entero As Integer Dim Flotante As Double Dim Resto As Integer Dim Modulo1 As Integer Dim Entero1 As Integer Dim Flotante1 As Double Dim Resto1 As Integer Dim Auxiliar As Integer 'Establecer a que minuto pertenece el primer punto para el zoom Modulo = Pilas(0) Mod ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Entero = Pilas(0) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Flotante = Pilas(0) / ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto = Pilas(0) - Entero * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero es 0 y resto>=0 entonces minuto0=0 If (Entero = 0) And (Resto >= 0) Then Minuto0_Visor = 0 End If If (Entero <> 0) And (Resto > 0) Then Minuto0_Visor = Entero End If If (Entero <> 0) And (Resto = 0) Then Minuto0_Visor = Entero - 1 End If 'Establecer a que minuto pertenece el segundo punto para el zoom Modulo1 = Pilas(1) Mod ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Entero1 = Pilas(1) \ ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Flotante1 = Pilas(1) / ((NumBytes_1seg + 1) / (Periodo_Submuestreo)) Resto1 = Pilas(1) - Entero1 * (((NumBytes_1seg + 1) / (Periodo_Submuestreo))) 'Si entero1 es 0 y resto1>=0 entonces minuto1=0 If (Entero1 = 0) And (Resto1 >= 0) Then Minuto1_Visor = 0 End If If (Entero1 <> 0) And (Resto1 > 0) Then Minuto1_Visor = Entero1 End If If (Entero1 <> 0) And (Resto1 = 0) Then Minuto1_Visor = Entero1 - 1 End If 'Cual de los limites es el mayor If (Minuto0_Visor > Minuto1_Visor) Then Auxiliar = Minuto0_Visor Minuto0_Visor = Minuto1_Visor Minuto1_Visor = Auxiliar + 1 Else Minuto1_Visor = Minuto1_Visor + 1 End If End Sub Public Sub Habilitar_Chks_Zoom(Chk_Superior As CheckBox, Chk_Inferior As CheckBox) Chk_Superior.Enabled = True Chk_Inferior.Enabled = True End Sub Public Sub Activar_Desactivar_Series(Chk_Superior As CheckBox, Chk_Inferior As CheckBox, Matriz_Aux() As Single, Col_Visor As Integer, Mschart_Control_Aux As MSChart, Limite_Sup As Integer, Limite_Inf As Integer, Optional Opt As OptionButton) If (Opt = True) Then If ((Chk_Superior.Value <> 1)) Then 'Borrar todas las series menos la señal For Renglon = 0 To (Col_Visor - 1) Step 1 Matriz_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite Matriz_Aux(Renglon, 2) = 0 'For S = 2 To 4 Step 1 For S = 2 To 4 Step 1 Mschart_Control_Aux.Plot.SeriesCollection(S).Position.Hidden = True Next S Mschart_Control_Aux.Plot.SeriesCollection(5).Position.Hidden = False Next Renglon Else 'Activar señal y limite superior y ceros For Renglon = 0 To (Col_Visor - 1) Step 1 Matriz_Aux(Renglon, 3) = Limite_Sup 'Y hace cero la del otro limite Matriz_Aux(Renglon, 2) = 0 Next Renglon 'Mostrar las series Mschart_Control_Aux.Plot.SeriesCollection(3).Position.Hidden = False Mschart_Control_Aux.Plot.SeriesCollection(2).Position.Hidden = True For S = 4 To 5 Step 1 Mschart_Control_Aux.Plot.SeriesCollection(S).Position.Hidden = True

Page 311: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxx

Next S Mschart_Control_Aux.Plot.SeriesCollection(5).Position.Hidden = False End If Else If (Chk_Inferior.Value <> 1) And (Chk_Superior.Value <> 1) Then 'Desactivarlas todas menos la de la señal For Renglon = 0 To (Col_Visor - 1) Step 1 Matriz_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite Matriz_Aux(Renglon, 2) = 0 Next Renglon For S = 2 To 5 Step 1 Mschart_Control_Aux.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Inferior.Value <> 1) And (Chk_Superior.Value = 1) Then 'Áctivar nomas de la señal y el limite superior 'que tome la amplitud de el limite superior For Renglon = 0 To (Col_Visor - 1) Step 1 Matriz_Aux(Renglon, 3) = Limite_Sup 'Y hace cero la del otro limite Matriz_Aux(Renglon, 2) = 0 Next Renglon Mschart_Control_Aux.Plot.SeriesCollection(1).Position.Hidden = False Mschart_Control_Aux.Plot.SeriesCollection(3).Position.Hidden = False Mschart_Control_Aux.Plot.SeriesCollection(2).Position.Hidden = True For S = 4 To 5 Step 1 Mschart_Control_Aux.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Inferior.Value = 1) And (Chk_Superior.Value = 1) Then 'Activar la señal y los dos limites For Renglon = 0 To (Col_Visor - 1) Step 1 Matriz_Aux(Renglon, 3) = Limite_Sup 'Y hace cero la del otro limite Matriz_Aux(Renglon, 2) = Limite_Inf Next Renglon Mschart_Control_Aux.Plot.SeriesCollection(1).Position.Hidden = False Mschart_Control_Aux.Plot.SeriesCollection(3).Position.Hidden = False Mschart_Control_Aux.Plot.SeriesCollection(2).Position.Hidden = False 'Áctivar nomas de la señal y la e la linea de alarma For S = 4 To 5 Step 1 Mschart_Control_Aux.Plot.SeriesCollection(S).Position.Hidden = True Next S End If If (Chk_Inferior.Value = 1) And (Chk_Superior.Value <> 1) Then 'Áctivar nomas de la señal y el limite inferior 'que tome la amplitud de el limite superior For Renglon = 0 To (Col_Visor - 1) Step 1 Matriz_Aux(Renglon, 3) = 0 'Y hace cero la del otro limite Matriz_Aux(Renglon, 2) = Limite_Inf 'Limite_Inferior_Visor 'Min_Volt_PF Next Renglon Mschart_Control_Aux.Plot.SeriesCollection(1).Position.Hidden = False Mschart_Control_Aux.Plot.SeriesCollection(3).Position.Hidden = True Mschart_Control_Aux.Plot.SeriesCollection(2).Position.Hidden = False 'Áctivar nomas de la señal y la e la linea de alarma For S = 4 To 5 Step 1 Mschart_Control_Aux.Plot.SeriesCollection(S).Position.Hidden = True Next S End If End If End Sub Public Sub Deshabilitar_Chks_Zoom(Chk_Superior As CheckBox, Chk_Inferior As CheckBox) Chk_Superior.Enabled = False Chk_Inferior.Enabled = False End Sub Public Sub Carga_Seleccion_Anterior() 'Reasignar los ultimos valores señaldos en los botones de opcion yel checkbox Opcion(Flag_Grafica_Opcion_Visor).Value = True Chk_Zoom.Value = Flag_Zoom_Visor Opcion1(Flag_Grafica_Opcion1_Visor).Value = True Chk_Zoom1.Value = Flag_Zoom1_Visor 'Para el ZOOM Chk_Lim_Inferior.Value = Flag_Lim_Inferior_Visor Chk_Lim_Superior.Value = Flag_Lim_Superior_Visor Txt_Min_Inicio.Text = Str(Min_Inicio_Visor) Txt_Min_Fin.Text = Str(Min_Fin_Visor)

Page 312: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxi

'Para el Zoom1 Chk_Lim_Inferior1.Value = Flag_Lim_Inferior1_Visor Chk_Lim_Superior1.Value = Flag_Lim_Superior1_Visor Txt_Min_Inicio1.Text = Str(Min_Inicio1_Visor) Txt_Min_Fin1.Text = Str(Min_Fin1_Visor) End Sub Public Sub Establecer_Labels_Zoom(Mschart_Ctrl As MSChart, Min_Starts As Integer, Min_Ends As Integer) 'Establecer etiquetas Dim Num_labels As Integer Dim Ini As Integer Ini = Min_Starts Num_labels = Mschart_Ctrl.RowCount Establecer_Formato_HHMM_Zoom_Inicio Min_Starts, Min_Ends Contador = 0 For Columna = 0 To (Num_labels - 1) Step 1 If (Columna = 0) Then Contador = 1 Mschart_Ctrl.Row = Columna + 1 Mschart_Ctrl.RowLabel = Etiqueta_Index_Visor Else Contador = Contador + 1 If Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo) Then Ini = Ini + 1 Num_Row = Columna + 1 Establecer_Formato_HHMM Mschart_Ctrl Contador = 0 Else 'Limpa label Mschart_Ctrl.Row = Columna + 1 Mschart_Ctrl.RowLabel = "" End If End If Next Columna End Sub Public Sub Establecer_Formato_HHMM_Zoom_Inicio(Min_Start As Integer, Min_End As Integer) 'Leer el Lblhora_inicio y sumarle el Min_inicio y generar los labels hasta llegar 'al Num_labels (#máximo de elementos a graficar) Dim HH_MM_Inicio As String Dim HORA As Integer Dim minuto As Integer Dim CADhora As String Dim CADminuto As String Dim Parte_Entera As Long 'Proporciona el # de horas a sumarle a la hora de inicio de graficción Dim Parte_Restante As Long 'Proporciona el # de minutos a sumarle a la hora de inicio de graficación Etiqueta_Index_Visor = "" 'Para saber cuantas horas hay que sumar 'Parte_Entera = Min_Inicio \ 60 'Regresa la parte entera de la división Parte_Entera = Min_Start \ 60 'Regresa la parte entera de la división If (Min_Start > 59) Then Parte_Restante = Min_End - Parte_Entera * 60 'Regresa la parte fraccionaria de la división Else Parte_Restante = Min_Start End If HH_MM_Inicio = Mid(LblHora_Inicio.Caption, 1, 5) HORA = Val(Mid(HH_MM_Inicio, 1, 2)) 'Para sabe la hora minuto = Val(Mid(HH_MM_Inicio, 4, 5)) 'Para saber el # de minutos en la hora 'Establecer la hora de inicio del Zoom If (Len(LblHora_Inicio.Caption) > 8) Then Checar_Formato_Tiempo = 1 Else Checar_Formato_Tiempo = 0 End If 'Revisar si el minuto + Parte_Restante > 60 If (minuto + Parte_Restante > 59) Then minuto = (minuto + Parte_Restante) - 60 HORA = HORA + 1 Else minuto = minuto + Parte_Restante End If 'Sumarle las horas que sean necesarias For k = 1 To Parte_Entera Step 1 HORA = HORA + 1 'Dependiendo del formato usado reiniciar hora If (Checar_Formato_Tiempo = 1) Then If (HORA > 12) Then HORA = 1 End If Else If (HORA > 23) Then HORA = 0

Page 313: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxii

End If End If Next k 'Formar nueva Hora If (HORA >= 0) And (HORA <= 9) Then CADhora = ("0" & CStr(HORA)) Else CADhora = (CStr(HORA)) End If 'si los minutos son >=0 o <=9 If (minuto >= 0) And (minuto <= 9) Then CADminuto = ("0" & CStr(minuto)) Else CADminuto = (CStr(minuto)) End If Etiqueta_Index_Visor = CADhora & ":" & CADminuto End Sub Public Sub Checa_Zoom1() 'Habilitar todas las opciones de Zoom cuando se active el Chk_Zoom If (Chk_Zoom1.Value = 1) Then Txt_Min_Inicio1.Enabled = True Txt_Min_Fin1.Enabled = True Cmd_Aceptar_Zoom1.Enabled = True Chk_Lim_Inferior1.Enabled = True Chk_Lim_Superior1.Enabled = True 'Permitir seleccionar las partes del grafico MSChart_Graficador1.AllowSelections = True 'Desactivar el primer menu de opcion Desactivar_Menu1 Else 'Activar el primer menu de opcion Activar_Menu1 Txt_Min_Inicio1.Enabled = False Txt_Min_Fin1.Enabled = False Cmd_Aceptar_Zoom1.Enabled = False Chk_Lim_Inferior1.Enabled = False Chk_Lim_Superior1.Enabled = False 'Reactivar todas las series 'Permitir seleccionar las partes del grafico MSChart_Graficador1.AllowSelections = False For j = 2 To 5 Step 1 MSChart_Graficador1.Plot.SeriesCollection(j).Position.Hidden = False Next j 'Inicilizar contador de limites para el zoom Pos_Pila1_Visor = 0 Lblpila.Caption = Str(Pos_Pila1_Visor) 'Limpiar bandera indicadora de profundidad de zoom Flag_Profundidad_Zoom1_Visor = 0 'Limpiar la variable que alamcena el minuto de inicio anterior Min_Inicio_Anterior1_Visor = 0 DIFERENCIA1_Visor = 0 End If 'desactivar alarma MSChart_Graficador1.Plot.SeriesCollection(6).Position.Hidden = True End Sub Public Sub Zoom1() Dim Range1 As Integer Dim Inicio1 As Integer Dim Fin1 As Integer Dim Col1 As Long Range1 = Min_Fin1_Visor - Min_Inicio1_Visor Inicio1 = Min_Inicio1_Visor Fin1 = Min_Fin1_Visor ReDim Matrix_Graficador1_Aux_Visor(0 To (((Range1 * (NumBytes_1seg + 1)) / Periodo_Submuestreo) - 1), 1 To Tot_Lineas) Col1 = 0 Select Case Grafica_Opcion1_Visor Case 0 'Tomar el rango de datos deseado For Columna = (Inicio1 * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To ((Fin1) * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux_Visor(Col1, 1) = Matrix_Graficador5_Visor(Columna, 1) Col1 = Col1 + 1 Next Columna Colum1_Visor = Col1 'Establecer las amplitudes de los limites Limite_Superior1_Visor = Max_Amp_PF_Visor Limite_Inferior1_Visor = Min_Amp_PF_Visor 'Revisar que líneas fueron activadas Activar_Desactivar_Series Chk_Lim_Superior1, Chk_Lim_Inferior1, Matrix_Graficador1_Aux_Visor, Colum1_Visor, MSChart_Graficador1, Limite_Superior1_Visor, Limite_Inferior1_Visor, Opcion(3) Case 1

Page 314: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxiii

'Tomar el rango de datos deseado For Columna = (Inicio1 * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin1 * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux_Visor(Col1, 1) = Matrix_Graficador6_Visor(Columna, 1) Col1 = Col1 + 1 Next Columna Colum1_Visor = Col1 'Establecer las amplitudes de los limites Limite_Superior1_Visor = Max_Frec_PF_Visor Limite_Inferior1_Visor = Min_Frec_PF_Visor 'Revisar que líneas fueron activadas Activar_Desactivar_Series Chk_Lim_Superior1, Chk_Lim_Inferior1, Matrix_Graficador1_Aux_Visor, Colum1_Visor, MSChart_Graficador1, Limite_Superior1_Visor, Limite_Inferior1_Visor, Opcion(3) Case 2 'Tomar el rango de datos deseado For Columna = (Inicio1 * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) To (Fin1 * (((NumBytes_1seg + 1) / Periodo_Submuestreo)) - 1) Step 1 Matrix_Graficador1_Aux_Visor(Col1, 1) = Matrix_Graficador7_Visor(Columna, 1) Col1 = Col1 + 1 Next Columna Colum1_Visor = Col1 'Establecer las amplitudes de los limites Limite_Superior1_Visor = Max_Amp_BB_Visor Limite_Inferior1_Visor = Min_Amp_BB_Visor 'Revisar que líneas fueron activadas Activar_Desactivar_Series Chk_Lim_Superior1, Chk_Lim_Inferior1, Matrix_Graficador1_Aux_Visor, Colum1_Visor, MSChart_Graficador1, Limite_Superior1_Visor, Limite_Inferior1_Visor, Opcion(3) End Select 'Hacer Flag_Profundidad_Zoom=1, indicando que ya se realizó un zoom Flag_Profundidad_Zoom1_Visor = 1 'Flag_Profundidad_Zoom + 1 'Una vez realizado el zoom hay que reiniciar el contador de la pila del zoom Pos_Pila1_Visor = 0 Lblpila.Caption = Str(Pos_Pila1_Visor) 'Graficarlo en el componente MSChart_Graficador1.ChartData = Matrix_Graficador1_Aux_Visor Establecer_Labels_Zoom MSChart_Graficador1, Min_Inicio1_Visor, Min_Fin1_Visor 'Validar el llemado del rtf Validar_Llenado_RTF1 End Sub Public Sub Establecer_Labels_Zoom_Transferencia() 'Establecer etiquetas Dim Num_labels As Integer Num_labels = MSChart_Graficador0.RowCount For Columna = 0 To (Num_labels - 1) Step 1 MSChart_Graficador1.Row = Columna + 1 MSChart_Graficador0.Row = Columna + 1 MSChart_Graficador1.RowLabel = MSChart_Graficador0.RowLabel 'Str(Ini) 'Str((Inicio1 + 1) / ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Next Columna End Sub Public Sub Establecer_Labels_Zoom_Errores() 'Establecer_Labels Establecer_Formato_HHMM_Zoom_Inicio Min_Inicio_Visor, Min_Fin_Visor For Columna = Min_Inicio_Visor To (Min_Fin_Visor - 1) Step 1 Conta_Minutos_Visor = Columna + 1 Num_Row = Columna + 1 - Min_Inicio_Visor Establecer_Formato_HHMM MSChart_Graficador0 Next Columna End Sub Private Sub MSChart_Graficador1_PointActivated(Serie As _ Integer, PuntoDatos As Integer, MouseFlags As _ Integer, Cancel As Integer) Serie = 1 Lblpila.Caption = Str(Pos_Pila1_Visor) If (Pos_Pila1_Visor <= 0) Then Pos_Pila1_Visor = 0 End If 'Si son iguales los borra If (PuntoDatos = PuntoDatos_Anterior2_Visor) Then PuntoDatos = 1 PuntoDatos_Anterior2_Visor = 1 Pila1_Visor(Pos_Pila1_Visor) = 1 Flag_Borra_Zoom1 = 1 End If 'Se envia el foco de seleccion siempre a la serie1-->la señal(1) MSChart_Graficador1.SelectPart VtChPartTypePoint, Serie, PuntoDatos, index3, index4 'Si son diferentes los almacena If (PuntoDatos <> PuntoDatos_Anterior2_Visor) Then Pila1_Visor(Pos_Pila1_Visor) = PuntoDatos

Page 315: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxiv

Pos_Pila1_Visor = Pos_Pila1_Visor + 1 Else Pos_Pila1_Visor = Pos_Pila1_Visor - 1 End If PuntoDatos_Anterior2_Visor = PuntoDatos 'Para limitar el crecimiento de la pila If (Pos_Pila1_Visor > 1) Then Pos_Pila1_Visor = Pos_Pila1_Visor - 1 End If If (Flag_Borra_Zoom1 = 1) Then PuntoDatos_Anterior2_Visor = Pila1_Visor(0) Flag_Borra_Zoom1 = 0 'Pasar el enfoque a Pila(0) MSChart_Graficador1.SelectPart VtChPartTypePoint, Serie, PuntoDatos_Anterior2, index3, index4 End If 'Incrementar el contador de puntos activados Con_Puntos_Activados1_Visor = Con_Puntos_Activados1_Visor + 1 'Si ya se establecieron dos puntos hay que realizar el zoom If (Con_Puntos_Activados1_Visor = 2) Then Establecer_Limites_Minutos Pila1_Visor Acepta_Zoom1 'Inicializar el contador de puntos activados para que automaticamente este 'listo para realizar otro zoom Con_Puntos_Activados1_Visor = 0 End If End Sub Private Sub MonthView1_DateClick(ByVal DateClicked As Date) LblWeek.Caption = Str(MonthView1.Week) LblDate.Caption = Str(MonthView1.Value) 'Establecer que máximo pueda seleccionar los archivos de la fecha actual(dia actual) MonthView1.MaxDate = Date ' Devuelve el primer archivo *.TXT que tenga el atributo de oculto. dias = Mid(LblDate, 1, 2) mess = Mid(LblDate, 4, 2) anos = Mid(LblDate, 7, 4) EXTENSION_DATE = dias + "_" + mess + "_" + anos Label5.Caption = EXTENSION_DATE Cont_Files = 0 miArchivo = Dir(App.Path + "\Graficas\*" + EXTENSION_DATE + ".TXT") ', vbArchive) Do While (miArchivo <> "") ' Or (Cont_Files > 9) Cont_Files = Cont_Files + 1 'Averiguar cuantos archivos existen en la carpeta. 'Deben existir 9 archivos para poder regenerar todas las graficas miArchivo = Dir Loop 'Revisar que exista su respectivo, archivo de Configuración de alarmas miArchivo_Config = Dir(App.Path + "\Configuraciones\*" + EXTENSION_DATE + ".TXT") 'Solo si existen los 9 archivos respectivos se debe permitir regenerar 'los archivos. 'En caso opuesto hay que mostrar un mensaje indicando que los archivos no existen If (Cont_Files = 9) And (miArchivo_Config <> "") Then 'MsgBox "Carga_Visor" Cargar_Visor 'Para llenar de nuevo todo Dim OP As Integer Dim OP1 As Integer OP = Gafica_Opcion_Visor OP1 = Grafica_Opcion_Visor1 Call Opcion_Click(OP) Call Opcion1_Click(OP1) 'Rehabilitar menus Rehabilitar_Menus Else Beep 'Limpia el componente de graficación y el RichTextBox 'ReDim Matrix_Vacio(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - TIEMPO) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) ReDim Matrix_Vacio(0 To (((Dimension / Periodo_Submuestreo) - (((NumRenglones + 1) - 1) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)))), 1 To Tot_Lineas) MSChart_Graficador0.ChartData = Matrix_Vacio MSChart_Graficador1.ChartData = Matrix_Vacio 'Limpiar el RichTextBox RichTextBox1.Text = "" RichTextBox2.Text = "" Deshabilitar_Menus Form_Msg.Show End If

Page 316: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxv

End Sub Public Sub Deshabilitar_Menus() For i = 0 To 3 Opcion(i).Enabled = False Next i For i = 0 To 2 Opcion1(i).Enabled = False Next i End Sub Public Sub Rehabilitar_Menus() For i = 0 To 3 Opcion(i).Enabled = True Next i For i = 0 To 2 Opcion1(i).Enabled = True Next i End Sub Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If mvHasFocus Then mvHasFocus = False Call Command1_Click End If End Sub Private Sub MonthView1_GotFocus() mvHasFocus = True End Sub 'Escribir los valors de la grafica en el richttextbox, para posteriormente ser impreso Public Sub Llenar_RichTextBox(Objeto_Mschart As MSChart) ', Dimension_Max As Long) 'Matriz() As Single, Dimension_Max As Long) Dim Cadena As String Dim Vector() As Single Dim Cad_Minuto As String Dim Cont_Minuto As Long Dim Dimension_Max As Long Crear_Linea "=", 86 Head_Report = Head_Report + Linea + vbCrLf + Vector_Nombres_Senales(0) + vbCrLf + Linea + vbCrLf Dimension_Max = Objeto_Mschart.RowCount Dim HEAD_Valores As String HEAD_Valores = "" HEAD_Valores = HEAD_Valores + "FECHA:" + Str(MonthView1.Value) + vbCrLf 'Buscar hora de inicio Objeto_Mschart.Row = 1 Objeto_Mschart.Column = 1 HEAD_Valores = HEAD_Valores + "HORA DE INICIO=" + Objeto_Mschart.RowLabel 'Buscar la hora de fin Objeto_Mschart.Row = Dimension_Max HEAD_Valores = HEAD_Valores + " HORA DE FIN=" + Objeto_Mschart.RowLabel + vbCrLf 'Dim Contador As Long Contador = 0 Cont_Minuto = 0 Crear_Linea "-", 86 'Cantidad máxima de labels Dimension_Max = Objeto_Mschart.RowCount Objeto_Mschart.Row = ((NumBytes_1seg + 1) / Periodo_Submuestreo) 'Escribir la etiqueta del minuto de inicio Cad_Minuto = Objeto_Mschart.RowLabel For c = 1 To (Dimension_Max) Objeto_Mschart.Column = 1 Objeto_Mschart.Row = c Cadena = Cadena + CStr(Format(Objeto_Mschart.Data, "000000.0000")) + " " Contador = Contador + 1 'cuando contador sea 6, cambiar de linea en el richtextbox If (Contador = ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Then Cont_Minuto = Cont_Minuto + 1 Sumar_HORAS Cont_Minuto, Cad_Minuto 'Si ya escibio la última posicion, entonces ya no es necesario escribir el minuto If (Cont_Minuto <> ((Dimension_Max) / ((NumBytes_1seg + 1) / Periodo_Submuestreo))) Then Cadena = Cadena + vbCrLf + vbCrLf + "MINUTO--> " + Etiqueta_Alarma_Visor + vbCrLf End If Contador = 0 End If Next c RichTextBox1.Text = RichTextBox1.Text + Head_Report + HEAD_Valores + Linea + vbCrLf + "MINUTO--> " + Cad_Minuto + vbCrLf + Cadena + vbCrLf + vbCrLf End Sub Public Sub Llenar_RichTextBox1(Objeto_Mschart As MSChart, Objeto_RTB As RichTextBox, Nombre_Senal As String, Optional Flag As Integer) ', Dimension_Max As Long) 'Matriz() As Single, Dimension_Max As Long) Dim Cadena As String

Page 317: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxvi

Dim Vector() As Single Dim Cad_Minuto As String Dim Cont_Minuto As Long Dim Dimension_Max As Long Dim Periodo_Muestras As Long Periodo_Muestras = (NumBytes_1seg + 1) / Periodo_Submuestreo 'Si se eligió Errores, entonces hacer periodo_muestras=1 If (Grafica_Opcion_Visor = 3) And (Flag = 1) Then Periodo_Muestras = 1 End If 'Limpiar las cadenas Head_Report = "" HEAD_Valores = "" Linea = "" Cad_Minuto = "" Cadena = "" Objeto_RTB.Text = "" Crear_Linea "=", 86 'Agregarle el nombre de la señal Dimension_Max = Objeto_Mschart.RowCount HEAD_Valores = "" HEAD_Valores = HEAD_Valores + "FECHA:" + Str(MonthView1.Value) + vbCrLf 'Buscar hora de inicio Objeto_Mschart.Row = 1 Objeto_Mschart.Column = 1 HEAD_Valores = HEAD_Valores + "HORA DE INICIO=" + Objeto_Mschart.RowLabel 'Buscar la hora de fin Objeto_Mschart.Row = Dimension_Max HEAD_Valores = HEAD_Valores + " HORA DE FIN=" + Objeto_Mschart.RowLabel + vbCrLf Contador = 0 Cont_Minuto = 0 Crear_Linea "-", 86 'Cantidad máxima de labels Dimension_Max = Objeto_Mschart.RowCount Objeto_Mschart.Row = Periodo_Muestras 'Escribir la etiqueta del minuto de inicio Cad_Minuto = Objeto_Mschart.RowLabel For c = 1 To (Dimension_Max) Objeto_Mschart.Column = 1 Objeto_Mschart.Row = c Cadena = Cadena + CStr(Format(Objeto_Mschart.Data, "000000.0000")) + " " Contador = Contador + 1 'cuando contador sea 6, cambiar de linea en el richtextbox If (Contador = (Periodo_Muestras)) Then Cont_Minuto = Cont_Minuto + 1 Sumar_HORAS Cont_Minuto, Cad_Minuto 'Si ya escibio la última posicion, entonces ya no es necesario escribir el minuto If (Cont_Minuto <> ((Dimension_Max) / (Periodo_Muestras))) Then Cadena = Cadena + vbCrLf + vbCrLf + "MINUTO--> " + Etiqueta_Alarma_Visor + vbCrLf End If Contador = 0 End If Next c Objeto_RTB.Text = Objeto_RTB.Text + Head_Report + HEAD_Valores + Linea + vbCrLf + "MINUTO--> " + Cad_Minuto + vbCrLf + Cadena + vbCrLf + vbCrLf '+ "*" End Sub Public Sub Crear_Linea(Usar_Caracter As String, Longitud_Linea As Long) Linea = "" For i = 1 To Longitud_Linea Linea = Linea + Usar_Caracter '"*" Next i End Sub Public Sub Sumar_HORAS(TotMinutos As Long, Hora_Ini As String) Dim HH_MM_Inicio As String Dim HORA As Integer Dim minuto As Integer Dim CADhora As String Dim CADminuto As String Dim Checar_Formato_Tiempo As String Dim NHoras As Integer Dim NMinutos As Integer Dim E_Minutos As Long Dim M_Minutos As Long Dim R_Minutos As Long Dim E_Horas As Long Dim M_Horas As Long Dim R_Horas As Long NHoras = TotMinutos \ 60 'Parte entera NMinutos = TotMinutos - (NHoras * 60) 'Resto Etiqueta_Alarma_Visor = Hora_Ini

Page 318: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxvii

HORA = Val(Mid(Etiqueta_Alarma_Visor, 1, 2)) minuto = Val(Mid(Etiqueta_Alarma_Visor, 4, 5)) 'Usando formato de 0-->23 horas E_Minutos = (minuto + NMinutos) \ 60 'si E_Minutos es <>0, entonces hay que reiniciar los minutos M_Minutos = (minuto + NMinutos) Mod 60 R_Minutos = (minuto + NMinutos) - (E_Minutos * 60) 'Establecer minutos If (E_Minutos <> 0) Then minuto = 0 minuto = minuto + R_Minutos HORA = HORA + E_Minutos Else minuto = minuto + NMinutos End If E_Horas = (HORA + NHoras) \ 24 'Si E_Horas es <>0, entonces hay que reiniciar las horas M_Horas = (HORA + NHoras) Mod 24 R_Horas = (HORA + NHoras) - (E_Horas * 24) 'Establecer horas If (E_Horas <> 0) Then HORA = 0 HORA = HORA + R_Horas Else HORA = HORA + NHoras End If 'Formar nueva Hora 'si las horas son >=0 o <=9 If (HORA >= 0) And (HORA <= 9) Then CADhora = ("0" & CStr(HORA)) Else CADhora = (CStr(HORA)) End If 'si los minutos son >=0 o <=9 If (minuto >= 0) And (minuto <= 9) Then CADminuto = ("0" & CStr(minuto)) Else CADminuto = (CStr(minuto)) End If Etiqueta_Alarma_Visor = CADhora & ":" & CADminuto '& Mid(HORA_INICIO, 6, 4) & AM_PM End Sub Public Sub Validar_Llenado_RTF() 'Llenar el richtextbox If (Grafica_Opcion_Visor = 0) Or (Grafica_Opcion_Visor = 1) Then Llenar_RichTextBox1 MSChart_Graficador0, RichTextBox1, Vector_Nombres_Senales(Grafica_Opcion_Visor) End If 'Si se selecciono CFE y transferencia, hacer el reporte con los dos graficadores If (Grafica_Opcion_Visor = 2) Then 'Para CFE Llenar_RichTextBox1 MSChart_Graficador0, RichTextBox1, Vector_Nombres_Senales(Grafica_Opcion_Visor) Dim Cadena_CFE As String Cadena_CFE = RichTextBox1.Text 'Para TRANSFERENCIA Llenar_RichTextBox1 MSChart_Graficador1, RichTextBox1, Vector_Nombres_Senales(Grafica_Opcion_Visor) Dim Cadena_TRA As String Cadena_TRA = RichTextBox1.Text 'LLenar el richt textbox1 con el reporte entero RichTextBox1.Text = "" RichTextBox1.Text = Cadena_CFE + Cadena_TRA End If 'Si se seleccionó Error If (Grafica_Opcion_Visor = 3) Then Llenar_RichTextBox1 MSChart_Graficador0, RichTextBox1, Vector_Nombres_Senales(Grafica_Opcion_Visor), 1 End If 'Si no es ninguno de los anteriores entonces, hacer lo siguiente If ((Grafica_Opcion_Visor <> 2) And (Grafica_Opcion_Visor <> 3)) Then 'Llenar el richtextbox Llenar_RichTextBox1 MSChart_Graficador0, RichTextBox1, Vector_Nombres_Senales(Grafica_Opcion_Visor) End If End Sub Public Sub Validar_Llenado_RTF1() 'Llenar richttextbox Llenar_RichTextBox1 MSChart_Graficador1, RichTextBox2, Vector_Nombres_Senales1(Grafica_Opcion1_Visor) End Sub c)VISOR DE ALARMAS POR SEMANA Form_Alarmas_Visor '---------------------------------------------------------------------------------- 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long

Page 319: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxviii

Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 '---------------------------------------------------------------------------------- 'Rutas a usar para la busqueda y lectura de los 'Archivos Dim Ruta_Configuraciones As String Dim Ruta_Alarmas As String 'Estructura para leer el archivo de configuracion de alarmas Dim CONFIGURE_Alarmas As ALARMA_CONFIG 'Estructura para leer las horas en que existió alarma Dim HORA_ALARMA As Data_Alarma Private Sub CmdImprimir_Click() Printer.PrintQuality = vbPRPQDraft On Error GoTo ElError Printer.Print " " RichTextBox1.SelPrint (Printer.hDC) Printer.EndDoc Flag_Imprimir = 1 ElError: End Sub Private Sub Form_Load() Flag_Imprimir = 0 'Rutas a usar para la busqueda y lectura de los 'Archivos Ruta_Configuraciones = App.Path + "\Configuraciones\" Ruta_Alarmas = App.Path + "\Alarmas\" 'Inicializar los vecrores donde se almacenarán las horas 'de alarma encontradas ReDim Horas_General(1000) ReDim Horas_VPF(1000) ReDim Horas_FPF(1000) ReDim Horas_APF(1000) ReDim Horas_VBB(1000) ReDim Horas_ABB(1000) ReDim Horas_ERR(1000) ReDim Horas_TRA(1000) 'Vector que almacena los nombres bases de los archivos 'a buscar ReDim Vector_Nombre_Base(0 To 6) 'Inicializar el vector Vector_Nombre_Base(0) = "AVPF_" Vector_Nombre_Base(1) = "AFPF_" Vector_Nombre_Base(2) = "AAPF_" Vector_Nombre_Base(3) = "AVBB_" Vector_Nombre_Base(4) = "AABB_" Vector_Nombre_Base(5) = "AERR_" Vector_Nombre_Base(6) = "ATRA_" '---------------------------------------------------------------------------------- 'Para deshabilitar maximizar, minimizar y cerrar ventana Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) '---------------------------------------------------------------------------------- '---------------------------------------------------------------------------------- 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) 'For i = 3 To 0 Step -1 ' Success = DeleteMenu(hMenu, i, MF_BYPOSITION) 'Next Success = DeleteMenu(hMenu, 8, MF_BYPOSITION) Success = DeleteMenu(hMenu, 7, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 6, MF_BYPOSITION)'Para que cierre la forma Success = DeleteMenu(hMenu, 5, MF_BYPOSITION) Success = DeleteMenu(hMenu, 4, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 3, MF_BYPOSITION)'Para que minimice Success = DeleteMenu(hMenu, 2, MF_BYPOSITION) 'Success = DeleteMenu(hMenu, 1, MF_BYPOSITION)'Para que se pueda mover Success = DeleteMenu(hMenu, 0, MF_BYPOSITION) '---------------------------------------------------------------------------------- End Sub

Page 320: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxix

Private Sub MonthView1_DateClick(ByVal DateClicked As Date) Dim Fecha_Posible_Inicio As Variant Dim Fecha_Inicio As Variant Dim Fecha_Posible_Fin As Variant Dim Fecha_Fin As Variant ReDim Fechas_Seleccionadas(0 To 6) 'Limpiar Reporte semanal RichTextBox1.Text = "" 'Establecer que máximo pueda seleccionar los archivos de la fecha actual(dia actual) MonthView1.MaxDate = Date 'A que semana pertenece la fecha seleccionada LblWeek.Caption = Str(MonthView1.Week) LblDate.Caption = Str(MonthView1.Value) Fecha_Inicio = MonthView1.Value 'LblDate 'Encontrar en que fecha inicia la semana elejida Do While (MonthView1.Week = LblWeek) Fecha_Posible_Inicio = MonthView1.Value - 1 If (Fecha_Posible_Inicio < MonthView1.MinDate) Then Exit Do End If MonthView1.Value = Fecha_Posible_Inicio If (MonthView1.Week = LblWeek) Then Fecha_Inicio = MonthView1.Value End If Loop MonthView1.Value = LblDate Fecha_Fin = LblDate 'Encontrar en que fecha termina la semana elejida Do While (MonthView1.Week = LblWeek) Fecha_Posible_Fin = MonthView1.Value + 1 If (Fecha_Posible_Fin > MonthView1.MaxDate) Then Exit Do End If MonthView1.Value = Fecha_Posible_Fin If (MonthView1.Week = LblWeek) Then Fecha_Fin = MonthView1.Value End If Loop 'Establecer en el Monthview la fecha seleccionada MonthView1.Value = LblDate 'Seleccionar en el monthview1 todas las fechas 'correspondientes a la semana seleccionada MonthView1.SelStart = Fecha_Inicio MonthView1.SelEnd = Fecha_Fin 'Alamacenar todas las fechas seleccionadas en un 'vector de fechas, para saber que archivos hay 'buscar y abrir Fechas_Seleccionadas(0) = Fecha_Inicio For k = 1 To 6 If ((Fecha_Inicio + k) > Fecha_Fin) Then Exit For End If Fechas_Seleccionadas(k) = Fecha_Inicio + k Next k 'Revisar si existen los archivos de Configuracion de 'alarmas correspondiente a la primera fecha del 'vector Fechas_Seleccionadas(), en caso de no existir 'informar al usuario que no existen archivos para esta 'fecha Existen_Archivos_Configuracion Fechas_Seleccionadas 'Leer el contenido de los archivos de Configuracion y Alarmas 'correspondientes a la semana Leer_Archivos_Config_Alarmas Fechas_Seleccionadas End Sub Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If mvHasFocus Then mvHasFocus = False Call Command1_Click End If End Sub Private Sub MonthView1_GotFocus() mvHasFocus = True End Sub Public Sub Existen_Archivos_Configuracion(Fechas() As String) Dim Nombre_Archivo As String Dim Existe_Archivo As String Dim Contador As Long Contador = 0

Page 321: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxx

For i = 0 To 6 Nombre_Archivo = Mid(Fechas(i), 1, 2) + "_" + Mid(Fechas(i), 4, 2) + "_" + Mid(Fechas(i), 7, 4) Existe_Archivo = Dir(Ruta_Configuraciones + Nombre_Archivo + ".*") If (Existe_Archivo <> "") Then 'Guardar el nombre de la fecha Fechas(Contador) = Existe_Archivo Contador = Contador + 1 End If Next i 'Sólo indicar que no existen los archivos cuando no exista ningún 'archivo para la semana deseada If (Contador = 0) Then Form_Msg2.Show 'El archivo no existe End If 'Limpiar el resto de los espacios en el vector Do While (Contador < 7) Fechas(Contador) = "" Contador = Contador + 1 Loop End Sub Public Sub Encontrar_Senal_Alarma(Nombre_Fecha As String) Dim Nombre As String Dim B0, B1, B2, B3, B4, B5, B6 As Integer B0 = 0 B1 = 0 B2 = 0 B3 = 0 B4 = 0 B5 = 0 B6 = 0 'Limpiar vectores ReDim Horas_VPF(1000) ReDim Horas_VBB(1000) ReDim Horas_APF(1000) ReDim Horas_ABB(1000) ReDim Horas_FPF(1000) ReDim Horas_ERR(1000) ReDim Horas_TRA(1000) 'Ver si el archivo existe. en caso de existir entonces abrirlo y almacenar 'las horas resultantes en su respectivo vector For i = 0 To 6 'Formar el nombre del archivo a buscar Nombre = Vector_Nombre_Base(i) + Nombre_Fecha 'Fechas_Seleccionadas(0) ' + ".txt" Existe = Dir(Ruta_Alarmas + Nombre) 'Si Existe<>"", entonces el archivo si existe If (Existe <> "") Then 'Limpiar el vector de Horas_General ReDim Horas_General(1000) 'Leer los archivos de las alarmas y almacenar los resultados obtenidos 'en vectores Leer_Archivo_Alarmas Nombre, Horas_General 'Dependiendo del valor de i,será el vector donde se deben alamacenar 'las alarmas encontradas Select Case i Case 0 'El contenido del vector Horas_General(), pertenece 'al VPF k = 0 Do While (Horas_General(k) <> 0) Horas_VPF(k) = Horas_General(k) k = k + 1 Loop Case 1 'El contenido del vector Horas_General(), pertenece 'al FPF k = 0 Do While (Horas_General(k) <> 0) Horas_FPF(k) = Horas_General(k) k = k + 1 Loop Case 2 'El contenido del vector Horas_General(), pertenece 'al APF k = 0 Do While (Horas_General(k) <> 0) Horas_APF(k) = Horas_General(k) k = k + 1 Loop Case 3 'El contenido del vector Horas_General(), pertenece 'al Volt VBB k = 0 Do While (Horas_General(k) <> 0) Horas_VBB(k) = Horas_General(k)

Page 322: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxi

k = k + 1 Loop Case 4 'El contenido del vector Horas_General(), pertenece 'al ABB k = 0 Do While (Horas_General(k) <> 0) Horas_ABB(k) = Horas_General(k) k = k + 1 Loop Case 5 'El contenido del vector Horas_General(), pertenece 'al ERR k = 0 Do While (Horas_General(k) <> 0) Horas_ERR(k) = Horas_General(k) k = k + 1 Loop Case 6 'El contenido del vector Horas_General(), pertenece 'al TRA k = 0 Do While (Horas_General(k) <> 0) Horas_TRA(k) = Horas_General(k) k = k + 1 Loop End Select Else B0 = B0 + 1 End If Next i 'Una vez que ya se tiene la información en sus respectivos vectores 'lo siguiente es crear la tabla de horas de alarma en el Richtextbox 'Trazar una lineá HEAD_Alarmas = Linea + vbCrLf HEAD_Alarmas = HEAD_Alarmas + "ALARMAS(hh:mm)" + vbCrLf Establecer_Encabezado_Tabla_Horas "AVPF", HEAD_Alarmas Establecer_Encabezado_Tabla_Horas "AFPF", HEAD_Alarmas Establecer_Encabezado_Tabla_Horas "AAPF", HEAD_Alarmas Establecer_Encabezado_Tabla_Horas "AVBB", HEAD_Alarmas Establecer_Encabezado_Tabla_Horas "AABB", HEAD_Alarmas Establecer_Encabezado_Tabla_Horas "AERR", HEAD_Alarmas Establecer_Encabezado_Tabla_Horas "ATRA", HEAD_Alarmas HEAD_Alarmas = HEAD_Alarmas + Linea + vbCrLf Establecer_Formato_Fuentes "Courier New", 8, True, False 'Si todas las banderas fueron 1, significa que no existe ninguna alarma If (B0 = 7) Then 'Escribir puras "---" en la tabla de alarmas, indicando que no hubo alarmas For c = 1 To 7 Step 1 Escribir_Tabla_Limpia Tabla Next c 'Pasar a la siguiente linea Tabla = Tabla + vbCrLf Else 'Despues del encabezado hay que llenar la tabla con el contenido 'de los vectores j = 0 'Escribir en la primer columna,mientras en el vector exista algún valor Do While ((Horas_VPF(j) <> 0) Or (Horas_FPF(j) <> 0) Or (Horas_APF(j) <> 0) _ Or (Horas_VBB(j) <> 0) Or (Horas_ABB(j) <> 0) Or (Horas_ERR(j) <> 0) Or (Horas_TRA(j) <> 0)) Escribir_Tabla Horas_VPF(j), Tabla Escribir_Tabla Horas_FPF(j), Tabla Escribir_Tabla Horas_APF(j), Tabla Escribir_Tabla Horas_VBB(j), Tabla Escribir_Tabla Horas_ABB(j), Tabla Escribir_Tabla Horas_ERR(j), Tabla Escribir_Tabla Horas_TRA(j), Tabla Tabla = Tabla + vbCrLf j = j + 1 Loop End If End Sub Public Sub Leer_Archivos_Config_Alarmas(Nombre_Archivo() As String) 'Estructura del reporte semanal de alarmas 'Encabezado del reporte Dim Encabezado_Reporte As String Dim Fecha_Alarma As String Establecer_Formato_Fuentes "Courier New", 8, True, False 'Formar el encabezado del reporte semanal Crear_Linea "=", 112 Encabezado_Reporte = Linea + vbCrLf + "REPORTE DE ALARMAS --> SEMANA #:" + LblWeek + vbCrLf + Linea + vbCrLf

Page 323: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxii

RichTextBox1.Text = RichTextBox1.Text + Encabezado_Reporte 'Para que lea cada uno de los dias, de la semana '0'0'0'0'0'0'0'0'0'0'0' Do While ((d < 7) And (Fechas_Seleccionadas(d) <> "")) '0'0'0'0'0'0'0'0'0'0'0' Fecha_Alarma = "FECHA:" + Mid(Fechas_Seleccionadas(d), 1, 10) + vbCrLf longi = Len(Espacios) HEAD_Configuracion = Fecha_Alarma + "CONFIGURACIÓN ALARMAS" + vbCrLf Establecer_Encabezado_Tabla "SEÑAL", HEAD_Configuracion Establecer_Encabezado_Tabla "NIVEL_MAX", HEAD_Configuracion Establecer_Encabezado_Tabla "NIVEL_MIN", HEAD_Configuracion Establecer_Encabezado_Tabla "TIEMPO", HEAD_Configuracion 'Darle un cambio de línea HEAD_Configuracion = HEAD_Configuracion + Espacios + vbCrLf Crear_Linea "-", 112 HEAD_Configuracion = HEAD_Configuracion + Linea + vbCrLf 'Leer el archivo de configuración de alarmas de una determinada fecha Leer_Niveles_Config Ruta_Configuraciones + Fechas_Seleccionadas(d) Agregar_Niveles_Cadena "VPF -->", CStr(CONFIGURE_Alarmas.Alarma_Max_Volt_PF), CStr(CONFIGURE_Alarmas.Alarma_Min_Volt_PF), CStr(CONFIGURE_Alarmas.Alarma_Tiempo_Volt_PF) Agregar_Niveles_Cadena "APF -->", CStr(CONFIGURE_Alarmas.Alarma_Max_Amp_PF), CStr(CONFIGURE_Alarmas.Alarma_Min_Amp_PF), CStr(CONFIGURE_Alarmas.Alarma_Tiempo_Amp_PF) Agregar_Niveles_Cadena "FPF -->", CStr(CONFIGURE_Alarmas.Alarma_Max_Frec_PF), CStr(CONFIGURE_Alarmas.Alarma_Min_Frec_PF), CStr(CONFIGURE_Alarmas.Alarma_Tiempo_Frec_PF) Agregar_Niveles_Cadena "VBB -->", CStr(CONFIGURE_Alarmas.Alarma_Max_Volt_BB), CStr(CONFIGURE_Alarmas.Alarma_Min_Volt_BB), CStr(CONFIGURE_Alarmas.Alarma_Tiempo_Volt_BB) Agregar_Niveles_Cadena "ABB -->", CStr(CONFIGURE_Alarmas.Alarma_Max_Amp_BB), CStr(CONFIGURE_Alarmas.Alarma_Min_Amp_BB), CStr(CONFIGURE_Alarmas.Alarma_Tiempo_Amp_BB) Agregar_Niveles_Cadena "ERR -->", CStr(CONFIGURE_Alarmas.Alarma_Max_Error), "---", CStr(CONFIGURE_Alarmas.Alarma_Tiempo_Error) Agregar_Niveles_Cadena "TRA -->", "---", "---", CStr(CONFIGURE_Alarmas.Alarma_Tiempo_Transferencia_CFEPF) Configuracion_Alarmas = Configuracion_Alarmas + vbCrLf '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Averiguar que señales generaron alarmas Encontrar_Senal_Alarma Fechas_Seleccionadas(d) 'escribir el reporte en el RichTextBox RichTextBox1.Text = RichTextBox1.Text + HEAD_Configuracion _ + Configuracion_Alarmas + HEAD_Alarmas + Tabla + vbCrLf 'Limpiar las cadenas, para la siguiente lectura Configuracion_Alarmas = "" Tabla = "" d = d + 1 If (d = 7) Then Exit Do End If Loop End Sub Sub Leer_Niveles_Config(RUTA As String) Dim NumReg Dim Pos_Sub As Long NumReg = FreeFile 'Abrir el archivo usando acceso binario Open RUTA For Binary As #NumReg 'Leer el archivo usando la estructura ALARMA_CONFIG Get #NumReg, 1, CONFIGURE_Alarmas Pos_Sub = Seek(NumReg) Close NumReg End Sub Sub Leer_Archivo_Alarmas(Nombre_Archivo As String, Vector_Guardar() As Long) Dim SubIndice As Long Dim pos As Long Dim Renglon As Long Dim z As Long Dim SubIndex As Long Dim Posicion As Long 'Para obtener de manera segura, un numero de fichero libre NumRegistro_Alarma_Visor = FreeFile 'Abrir el archivo por acceso binario Open Ruta_Alarmas + Nombre_Archivo For Binary As #NumRegistro_Alarma_Visor SubIndice = 0 Renglon = 0 SubIndex = 0

Page 324: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxiii

Do 'Leer los datos con la sentencia Get Get #NumRegistro_Alarma_Visor, , HORA_ALARMA TxtDATO.Text = TxtDATO.Text + Str(HORA_ALARMA.Dato_Alarma_Visor) + "-" Horas_General(SubIndex) = Val(TxtDATO.Text) SubIndex = SubIndex + 1 TxtDATO.Text = "" Posicion = Seek(NumRegistro_Alarma_Visor) Loop Until EOF(NumRegistro_Alarma_Visor) 'nada por aqui Posicion = Seek(NumRegistro_Alarma_Visor) Close NumRegistro_Visor Posicion_Visor = SubIndex Total_Elementos_Archivo = Posicion End Sub Public Sub Establecer_Formato_Fuentes(Tipo_Fuente As String, Tamano_Fuente As Integer, Negritas As Boolean, Optional Subrayado As Boolean) ' Optional color As ColorConstants) RichTextBox1.Font = Tipo_Fuente RichTextBox1.Font.Size = Tamano_Fuente RichTextBox1.Font.Bold = Negritas RichTextBox1.Font.Underline = Subrayado End Sub Public Sub Completar_Espacios(Long_Cadena As Long, Optional Denominador_Longitud_Linea As Long) Dim Espacios_Blanco As Long If (Denominador_Longitud_Linea <> 0) Then Espacios = "" Espacios_Blanco = 112 / Denominador_Longitud_Linea - Long_Cadena For i = 1 To Espacios_Blanco Espacios = Espacios + " " ' "*" Next i Else Espacios = "" Espacios_Blanco = 16 - Long_Cadena For i = 1 To Espacios_Blanco Espacios = Espacios + " " '"*" Next i End If End Sub Public Sub Crear_Linea(Usar_Caracter As String, Longitud_Linea As Long) Linea = "" For i = 1 To Longitud_Linea Linea = Linea + Usar_Caracter '"*" Next i End Sub Public Sub Agregar_Niveles_Cadena(Nombre_Senal As String, Level_Max As String, Level_Min As String, Time_P As String) Configuracion_Alarmas = Configuracion_Alarmas + Nombre_Senal Completar_Espacios (Len(Nombre_Senal)) Configuracion_Alarmas = Configuracion_Alarmas + Espacios 'Agregar los valores leidos del archivo de configuración de alarmas Nivel_Max = Level_Max 'Agregar el valor a la cadena Configuracion_Alarmas = Configuracion_Alarmas + Nivel_Max 'completar los espacios para dejar el cursor en el lugar adecuado para 'la siguiente señal Completar_Espacios (Len(Nivel_Max)) 'Agregarlo a la cadena Configuracion_Alarmas = Configuracion_Alarmas + Espacios 'Agregar los valores leidos del archivo de configuración de alarmas Nivel_Min = Level_Min 'Agregar el valor a la cadena Configuracion_Alarmas = Configuracion_Alarmas + Nivel_Min 'completar los espacios para dejar el cursor en el lugar adecuado para 'la siguiente señal Completar_Espacios (Len(Nivel_Min)) 'Agregarlo a la cadena Configuracion_Alarmas = Configuracion_Alarmas + Espacios 'Agregar los valores leidos del archivo de configuración de alarmas Tiempo_P = Time_P 'Agregar el valor a la cadena Configuracion_Alarmas = Configuracion_Alarmas + Tiempo_P 'completar los espacios para dejar el cursor en el lugar adecuado para 'la siguiente señal Completar_Espacios (Len(Tiempo_P)) 'Agregarlo a la cadena Configuracion_Alarmas = Configuracion_Alarmas + Espacios + vbCrLf End Sub

Page 325: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxiv

Public Sub Establecer_Encabezado_Tabla(Nombre_Nivel As String, Cadena_Encabezado As String) Cadena_Encabezado = Cadena_Encabezado + Nombre_Nivel Completar_Espacios (Len(Nombre_Nivel)) longi = Len(Espacios) Cadena_Encabezado = Cadena_Encabezado + Espacios End Sub Public Sub Establecer_Encabezado_Tabla_Horas(Nombre_Nivel As String, Cadena_Encabezados As String) Cadena_Encabezados = Cadena_Encabezados + Nombre_Nivel Completar_Espacios (Len(Nombre_Nivel)) longi = Len(Espacios) Cadena_Encabezados = Cadena_Encabezados + Espacios End Sub Public Sub Escribir_Tabla(Senal As Long, Cadena As String) Dim Signal As String 'Convertir el contenido del vector a cadena Signal = CStr(Senal) If (Signal <> "0") Then 'Establecer el formato HH:MM Signal = Mid(Signal, 1, 2) + ":" + Mid(Signal, 3, 2) 'Agregarlo a la cadena Cadena = Cadena + Signal Completar_Espacios Len(Signal) Cadena = Cadena + Espacios Else 'Indicar que no hubo alarma Signal = "---" 'Agregarlo ala cadena Cadena = Cadena + Signal Completar_Espacios Len(Signal) Cadena = Cadena + Espacios End If End Sub Public Sub Escribir_Tabla_Limpia(Cadena As String) 'Senal As Long, Cadena As String) Dim Signal As String 'Agregarlo a la cadena Signal = "---" Cadena = Cadena + Signal Completar_Espacios Len(Signal) Cadena = Cadena + Espacios End Sub Private Sub Reporte_Semanal_Click() Numero_vbcrlf End Sub Public Sub Numero_vbcrlf() Dim Max_Lin_Hoja As Integer Dim CARACTERES As String Dim p As Long Dim Lin As Long Dim Long_RTB As Long Dim Cad_String As String Dim Cont_Hoja As String Dim Tot_Lineas As Long Tot_Lineas = 0 Max_Lin_Hoja = 75 Cad_String = "" Cont_Hoja = 1 p = 1 Lin = 0 Long_RTB = Len(RichTextBox1.Text) RichTextBox2.Text = "" Do While (p < Long_RTB) car = Mid(RichTextBox1.Text, p, 1) caracter = Mid(RichTextBox1.Text, p, 2) If (caracter = vbCrLf) Then 'Total de cambios de linea en el richtextbox Lin = Lin + 1 End If p = p + 1 Loop 'Total de lineas en el richtextbox1 Tot_Lineas = Lin Lin = 0 p = 1 car = "" 'Mientras no se llegue al fin de texto Do While (p < Long_RTB) Do While (Lin <= (Max_Lin_Hoja) * Cont_Hoja) And (Lin < Tot_Lineas) car = Mid(RichTextBox1.Text, p, 1) Cad_String = Cad_String + car caracter = Mid(RichTextBox1.Text, p, 2)

Page 326: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxv

If (caracter = vbCrLf) Then 'Total de cambios de linea en el richtextbox Lin = Lin + 1 End If p = p + 1 Loop 'agregarlos al richtextbox RichTextBox2.Text = Cad_String 'Imprimir RTB Imprimir_RTB 'Limpiar RTB Cad_String = "" Cont_Hoja = Cont_Hoja + 1 Loop End Sub Public Sub Imprimir_RTB() Printer.PrintQuality = vbPRPQDraft On Error GoTo ElError Printer.Print " " RichTextBox2.SelPrint Printer.hDC Printer.EndDoc Flag_Imprimir = 1 ElError: End Sub d)CONFIGURACIÓN DE ALARMAS Form_Configuracion Public Bandera As Integer 'Bandera para el control de las validaciones de 'los textbox Public Bandera_Restriccion As Integer Dim CONFIGURACION_ALARMA As ALARMA_CONFIG 'Estructura empleada para leer el 'archivo Alarma.txt Private Sub CmdUtilizar_Predeterminado_Click() 'En este boton se creará el nuevo archivo de configuración de las alarmas 'Para obtener de manera segura, un numero de fichero libre 'Restricciones de alarma Restricciones_Alarma 'Asignar los valores de los text_box a las variables globales a usar 'Llenar_Var_Con_Textbox End Sub Public Sub Guardar_Configuracion() NumRegistro_Alarma = FreeFile Direccion_Alarma = App.Path + "\Alarma.txt" 'Abrir el archivo por acceso binario Open Direccion_Alarma For Binary As #NumRegistro_Alarma 'Escribir lo datos en el nuevo archivo Alarma.txt Put #NumRegistro_Alarma, 1, Min_Volt_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Max_Volt_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Min_Amp_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Max_Amp_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Min_Frec_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Max_Frec_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Min_Volt_BB Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Max_Volt_BB Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Min_Amp_BB Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Max_Amp_BB Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, Max_Error Posicion = Seek(NumRegistro_Alarma) 'Escribe los tiempos para accionar las alarmas Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Volt_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Amp_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Frec_PF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Volt_BB Posicion = Seek(NumRegistro_Alarma)

Page 327: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxvi

Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Amp_BB Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Error Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Transferencia_CFEPF Posicion = Seek(NumRegistro_Alarma) Put #NumRegistro_Alarma, Posicion, AuxTiempo_Alarma_Transferencia_PFCFE Posicion = Seek(NumRegistro_Alarma) Close NumRegistro_Alarma 'Sacar una copia al archivo de configuración de alarmas y guardarla en 'la carpeta Configuraciones RUTA = App.Path + "\Configuraciones" + "\" '+ Fecha + "*.txt" FileCopy App.Path + "\Alarma.txt", RUTA + Fecha + ".txt" End Sub Private Sub Form_Load() Bandera = 0 Bandera_Restriccion = 0 'Leer el archivo de Alarma.txt para recuperar la configuración de alarmas 'almacenada como predeterminada NumRegistro_Alarma = FreeFile Direccion_Alarma = App.Path + "\Alarma.txt" 'Abrir el archivo usando acceso binario Open Direccion_Alarma For Binary As #NumRegistro_Alarma 'Leer el archivo usando la estructura ALARMA_CONFIG Get #NumRegistro_Alarma, 1, CONFIGURACION_ALARMA Posicion = Seek(NumRegistro_Alarma) Close NumRegistro_Alarma 'Asignar los valores leidos del archivo Alarma.txt a los text_box de 'configuración TxtMin_Volt_PF.Text = Str(CONFIGURACION_ALARMA.Alarma_Min_Volt_PF) TxtMax_Volt_PF.Text = Str(CONFIGURACION_ALARMA.Alarma_Max_Volt_PF) TxtMin_Amp_PF.Text = Str(CONFIGURACION_ALARMA.Alarma_Min_Amp_PF) TxtMax_Amp_PF.Text = Str(CONFIGURACION_ALARMA.Alarma_Max_Amp_PF) TxtMin_Frec_PF.Text = Str(CONFIGURACION_ALARMA.Alarma_Min_Frec_PF) TxtMax_Frec_PF.Text = Str(CONFIGURACION_ALARMA.Alarma_Max_Frec_PF) TxtMin_Volt_BB.Text = Str(CONFIGURACION_ALARMA.Alarma_Min_Volt_BB) TxtMax_Volt_BB.Text = Str(CONFIGURACION_ALARMA.Alarma_Max_Volt_BB) TxtMin_Amp_BB.Text = Str(CONFIGURACION_ALARMA.Alarma_Min_Amp_BB) TxtMax_Amp_BB.Text = Str(CONFIGURACION_ALARMA.Alarma_Max_Amp_BB) TxtMax_Error.Text = Str(CONFIGURACION_ALARMA.Alarma_Max_Error) TxtTiempo_Alarma_Volt_PF = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Volt_PF) TxtTiempo_Alarma_Amp_PF = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Amp_PF) TxtTiempo_Alarma_Frec_PF = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Frec_PF) TxtTiempo_Alarma_Volt_BB = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Volt_BB) TxtTiempo_Alarma_Amp_BB = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Amp_BB) TxtTiempo_Alarma_Error = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Error) TxtTiempo_Alarma_Transferencia_CFEPF = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Transferencia_CFEPF) TXTTiempo_Alarma_Transferencia_PFCFE = Str(CONFIGURACION_ALARMA.Alarma_Tiempo_Transferencia_PFCFE) End Sub Private Sub TxtMin_Volt_PF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMin_Amp_PF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMin_Frec_PF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMax_Volt_PF_Keypress(keyascii As Integer) Digitos = keyascii

Page 328: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxvii

Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMax_Amp_PF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMax_Frec_PF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMin_Volt_BB_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMin_Amp_BB_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMax_Volt_BB_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMax_Amp_BB_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtMax_Error_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtTiempo_Alarma_Volt_PF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtTiempo_Alarma_Amp_PF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtTiempo_Alarma_Frec_PF_Keypress(keyascii As Integer)

Page 329: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxviii

Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtTiempo_Alarma_Volt_BB_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtTiempo_Alarma_Amp_BB_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtTiempo_Alarma_Error_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Private Sub TxtTiempo_Alarma_Transferencia_CFEPF_Keypress(keyascii As Integer) Digitos = keyascii Valida_TextBox If (Bandera = 1) Then keyascii = 0 Bandera = 0 End If End Sub Public Sub Valida_TextBox() If (Digitos < 48) Or (Digitos > 57) Then Bandera = 1 MsgBox "Error solo acepta digitos del 0-9" End If End Sub Public Sub Restricciones_Alarma() 'Restricciones planta de fuerza 'Voltaje If Not (((Val(TxtMin_Volt_PF.Text)) <> (Val(TxtMax_Volt_PF.Text))) And ((Val(TxtMax_Volt_PF.Text)) > (Val(TxtMin_Volt_PF.Text))) And ((Val(TxtMin_Volt_PF.Text)) > 0) And ((Val(TxtMax_Volt_PF.Text)) < Restriccion_Max_Volt_PF)) Then Beep MsgBox "ERROR!!! RANGO DE VOLTAJES PLANTA DE FUERZA" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtMin_Volt_PF.Text = Str(Min_Volt_PF) TxtMax_Volt_PF.Text = Str(Max_Volt_PF) End If If Not ((Val(TxtTiempo_Alarma_Volt_PF.Text) > 0) And (Val(TxtTiempo_Alarma_Volt_PF.Text) <= NumRenglones)) Then Beep MsgBox "ERROR!!! TIEMPO VOLTAJES PLANTA DE FUERZA" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtTiempo_Alarma_Volt_PF.Text = Str(Tiempo_Alarma_Volt_PF / (((NumBytes_1seg + 1) / Periodo_Submuestreo))) End If 'Corriente If Not (((Val(TxtMin_Amp_PF.Text)) <> (Val(TxtMax_Amp_PF.Text))) And ((Val(TxtMax_Amp_PF.Text)) > (Val(TxtMin_Amp_PF.Text))) And ((Val(TxtMin_Amp_PF.Text)) > 0) And ((Val(TxtMax_Amp_PF.Text)) < Restriccion_Max_Amp_PF)) Then Beep MsgBox "ERROR!!! RANGO DE CORRIENTE PLANTA DE FUERZA" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtMin_Amp_PF.Text = Str(Min_Amp_PF) TxtMax_Amp_PF.Text = Str(Max_Amp_PF) End If If Not ((Val(TxtTiempo_Alarma_Amp_PF.Text) > 0) And (Val(TxtTiempo_Alarma_Amp_PF.Text) <= NumRenglones)) Then Beep MsgBox "ERROR!!! TIEMPO CORRIENTE PLANTA DE FUERZA" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtTiempo_Alarma_Amp_PF.Text = Str(Tiempo_Alarma_Amp_PF / (((NumBytes_1seg + 1) / Periodo_Submuestreo))) End If 'Frecuencia

Page 330: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-lxxxix

If Not (((Val(TxtMin_Frec_PF.Text)) <> (Val(TxtMax_Frec_PF.Text))) And ((Val(TxtMax_Frec_PF.Text)) > (Val(TxtMin_Frec_PF.Text))) And ((Val(TxtMin_Frec_PF.Text)) > 0) And ((Val(TxtMax_Frec_PF.Text)) < Restriccion_Max_Frec_PF)) Then Beep MsgBox "ERROR!!! RANGO DE FECUENCIAS PLANTA DE FUERZA" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtMin_Frec_PF.Text = Str(Min_Frec_PF) TxtMax_Frec_PF.Text = Str(Max_Frec_PF) End If If Not ((Val(TxtTiempo_Alarma_Frec_PF.Text) > 0) And (Val(TxtTiempo_Alarma_Frec_PF.Text) <= NumRenglones)) Then Beep MsgBox "ERROR!!! TIEMPO FRECUENCIA PLANTA DE FUERZA" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtTiempo_Alarma_Frec_PF.Text = Str(Tiempo_Alarma_Frec_PF / (((NumBytes_1seg + 1) / Periodo_Submuestreo))) End If 'Restricciones Banco de Baterías 'Voltaje If Not (((Val(TxtMin_Volt_BB.Text)) <> (Val(TxtMax_Volt_BB.Text))) And ((Val(TxtMax_Volt_BB.Text)) > (Val(TxtMin_Volt_BB.Text))) And ((Val(TxtMin_Volt_BB.Text)) > 0) And ((Val(TxtMax_Volt_BB.Text)) < Restriccion_Max_Volt_BB)) Then Beep MsgBox "ERROR!!! RANGO DE VOLTAJES BANCO DE BATERÍAS" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtMin_Volt_BB.Text = Str(Min_Volt_BB) TxtMax_Volt_BB.Text = Str(Max_Volt_BB) End If If Not ((Val(TxtTiempo_Alarma_Volt_BB.Text) > 0) And (Val(TxtTiempo_Alarma_Volt_BB.Text) <= NumRenglones)) Then Beep MsgBox "ERROR!!! TIEMPO VOLTAJES BANCO DE BATERÍAS" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtTiempo_Alarma_Volt_BB.Text = Str(Tiempo_Alarma_Volt_BB / (((NumBytes_1seg + 1) / Periodo_Submuestreo))) End If 'Corriente If Not (((Val(TxtMin_Amp_BB.Text)) <> (Val(TxtMax_Amp_BB.Text))) And ((Val(TxtMax_Amp_BB.Text)) > (Val(TxtMin_Amp_BB.Text))) And ((Val(TxtMin_Amp_BB.Text)) > 0) And ((Val(TxtMax_Amp_BB.Text)) < Restriccion_Max_Amp_BB)) Then Beep MsgBox "ERROR!!! RANGO DE CORRIENTE BANCO DE BATERÍAS " Bandera_Restriccion = 1 'Reestablecer valor anterior TxtMin_Amp_BB.Text = Str(Min_Amp_BB) TxtMax_Amp_BB.Text = Str(Max_Amp_BB) End If If Not ((Val(TxtTiempo_Alarma_Amp_BB.Text) > 0) And (Val(TxtTiempo_Alarma_Amp_BB.Text) <= NumRenglones)) Then Beep MsgBox "ERROR!!! TIEMPO CORRIENTE BANCO DE BATERÍAS" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtTiempo_Alarma_Amp_BB.Text = Str(Tiempo_Alarma_Amp_BB / (((NumBytes_1seg + 1) / Periodo_Submuestreo))) End If 'Error If Not ((Val(TxtMax_Error.Text) > 0) And (Val(TxtMax_Error.Text) <= NumBytes_1seg)) Then Beep MsgBox "ERROR!!! CANTIDAD MÁXIMA DE ERRORES" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtMax_Error.Text = Str(Max_Error) End If If Not ((Val(TxtTiempo_Alarma_Error.Text) > 0) And (Val(TxtTiempo_Alarma_Error.Text) <= NumRenglones)) Then Beep MsgBox "ERROR!!! TIEMPO ERRORES" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtTiempo_Alarma_Error.Text = Str(Tiempo_Alarma_Error) End If 'Transferencia If Not ((Val(TxtTiempo_Alarma_Transferencia_CFEPF.Text) > 0) And (Val(TxtTiempo_Alarma_Transferencia_CFEPF.Text) <= NumRenglones)) Then Beep MsgBox "ERROR!!! TIEMPO TRANSFERENCIA" Bandera_Restriccion = 1 'Reestablecer valor anterior TxtTiempo_Alarma_Transferencia_CFEPF.Text = Str(Tiempo_Alarma_Transferencia_CFEPF / (((NumBytes_1seg + 1) / Periodo_Submuestreo))) End If 'Verifica si no hubo errores limpiar etiqueta de error restricción If Not (Bandera_Restriccion = 1) Then 'Si se realizó un cambio en las alarmas reiniciar los vectores de alarmas Reiniciar_Alarmas Llenar_Var_Con_Textbox Guardar_Configuracion End If Bandera_Restriccion = 0 End Sub Public Sub Reiniciar_Alarmas() 'Revisar si la configuración de alarmas anterior tuvo un cambio entonces reiniciar 'Para la planta de fuerza

Page 331: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xc

'Voltaje If (Min_Volt_PF <> Val(TxtMin_Volt_PF.Text)) And (Max_Volt_PF <> Val(TxtMax_Volt_PF.Text)) And (Tiempo_Alarma_Volt_PF <> (Val(TxtTiempo_Alarma_Volt_PF.Text)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Then 'Reiniciar los vectores de alarma de voltaje de la PF ReDim Vector_AlarmaON(Dimension) ReDim Vector_AlarmaON_OFF(Dimension) ReDim Vector_AlarmaON_OFF_Flag(Dimension) 'almacena las banderas que indican que 'alarma ya fue escrita en el archivo de alarmas End If 'Corriente PF If (Min_Amp_PF <> Val(TxtMin_Amp_PF.Text)) And (Max_Amp_PF <> Val(TxtMax_Amp_PF.Text)) And (Tiempo_Alarma_Amp_PF <> (Val(TxtTiempo_Alarma_Amp_PF.Text)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Then 'Reiniciar los vectores de alarma de voltaje de la PF ReDim Vector_AlarmaON_Amp_PF(Dimension) ReDim Vector_AlarmaON_Amp_PF_OFF(Dimension) ReDim Vector_AlarmaON_Amp_PF_OFF_Flag(Dimension) End If 'Frecuencia PF If (Min_Frec_PF <> Val(TxtMin_Frec_PF.Text)) And (Max_Frec_PF <> Val(TxtMax_Frec_PF.Text)) And (Tiempo_Alarma_Frec_PF <> (Val(TxtTiempo_Alarma_Frec_PF.Text)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Then 'Reiniciar los vectores de alarma de voltaje de la PF ReDim Vector_AlarmaON_Frec_PF(Dimension) ReDim Vector_AlarmaON_Frec_PF_OFF(Dimension) ReDim Vector_AlarmaON_Frec_PF_OFF_Flag(Dimension) End If 'Voltaje BB If (Min_Volt_BB <> Val(TxtMin_Volt_BB.Text)) And (Max_Volt_BB <> Val(TxtMax_Volt_BB.Text)) And (Tiempo_Alarma_Volt_BB <> (Val(TxtTiempo_Alarma_Volt_BB.Text)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Then 'Reiniciar los vectores de alarma de voltaje de la PF ReDim Vector_AlarmaON_Volt_BB(Dimension) ReDim Vector_AlarmaON_Volt_BB_OFF(Dimension) ReDim Vector_AlarmaON_Volt_BB_OFF_Flag(Dimension) End If 'Corriente BB If (Min_Amp_BB <> Val(TxtMin_Amp_BB.Text)) And (Max_Amp_BB <> Val(TxtMax_Amp_BB.Text)) And (Tiempo_Alarma_Amp_BB <> (Val(TxtTiempo_Alarma_Amp_BB.Text)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Then 'Reiniciar los vectores de alarma de voltaje de la PF ReDim Vector_AlarmaON_Amp_BB(Dimension) ReDim Vector_AlarmaON_Amp_BB_OFF(Dimension) ReDim Vector_AlarmaON_Amp_BB_OFF_Flag(Dimension) End If 'Errores If (Max_Error <> Val(TxtMax_Error.Text)) And (Tiempo_Alarma_Error <> Val(TxtTiempo_Alarma_Error.Text)) Then 'Reiniciar los vectores de alarma de voltaje de la PF ReDim Vector_AlarmaON_Errores(Dimension) ReDim Vector_AlarmaON_Errores_OFF(Dimension) ReDim Vector_AlarmaON_Errores_OFF_Flag(Dimension) End If 'Transferencia If (Tiempo_Alarma_Transferencia_CFEPF <> Val(TxtTiempo_Alarma_Transferencia_CFEPF.Text) * ((NumBytes_1seg + 1) / Periodo_Submuestreo)) Then 'Reiniciar los vectores de alarma de voltaje de la PF ReDim Vector_AlarmaON_Transferencia(Dimension) ReDim Vector_AlarmaON_Transferencia_OFF(Dimension) ReDim Vector_AlarmaON_Transferencia_OFF_Flag(Dimension) End If End Sub Public Sub Llenar_Var_Con_Textbox() 'Para el manejo de las alarmas AuxTiempo_Alarma_Volt_PF = Val(TxtTiempo_Alarma_Volt_PF.Text) AuxTiempo_Alarma_Amp_PF = Val(TxtTiempo_Alarma_Amp_PF.Text) AuxTiempo_Alarma_Frec_PF = Val(TxtTiempo_Alarma_Frec_PF.Text) AuxTiempo_Alarma_Volt_BB = Val(TxtTiempo_Alarma_Volt_BB.Text) AuxTiempo_Alarma_Amp_BB = Val(TxtTiempo_Alarma_Amp_BB.Text) AuxTiempo_Alarma_Error = Val(TxtTiempo_Alarma_Error.Text) AuxTiempo_Alarma_Transferencia_CFEPF = Val(TxtTiempo_Alarma_Transferencia_CFEPF.Text) 'Asignar los valores de los text_box a las variables globales a usar Min_Volt_PF = Val(TxtMin_Volt_PF.Text) Max_Volt_PF = Val(TxtMax_Volt_PF.Text) Min_Amp_PF = Val(TxtMin_Amp_PF.Text) Max_Amp_PF = Val(TxtMax_Amp_PF.Text) Min_Frec_PF = Val(TxtMin_Frec_PF.Text) Max_Frec_PF = Val(TxtMax_Frec_PF.Text) Min_Volt_BB = Val(TxtMin_Volt_BB.Text) Max_Volt_BB = Val(TxtMax_Volt_BB.Text) Min_Amp_BB = Val(TxtMin_Amp_BB.Text) Max_Amp_BB = Val(TxtMax_Amp_BB.Text) Max_Error = Val(TxtMax_Error.Text) 'Para el manejo de las alarmas Tiempo_Alarma_Volt_PF = (Val(TxtTiempo_Alarma_Volt_PF.Text)) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Amp_PF = Val(TxtTiempo_Alarma_Amp_PF.Text) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Frec_PF = Val(TxtTiempo_Alarma_Frec_PF.Text) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Volt_BB = Val(TxtTiempo_Alarma_Volt_BB.Text) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Amp_BB = Val(TxtTiempo_Alarma_Amp_BB.Text) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) Tiempo_Alarma_Error = Val(TxtTiempo_Alarma_Error.Text) Tiempo_Alarma_Transferencia_CFEPF = Val(TxtTiempo_Alarma_Transferencia_CFEPF.Text) * ((NumBytes_1seg + 1) / Periodo_Submuestreo) End Sub

Page 332: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xci

e)MODULOS Module_Archivos_Alarmas 'Variables que almacenan las horas,minutos y segundos 'del archivo de alarma Public HOURS_ALARMA As String Public MINUTES_ALARMA As String Public SECONDS_ALARMA As String Public HMS_ALARMA As String 'Punteros para el manejo de los archivos de alarma Public Puntero_Alarma As Long 'Puntero general del archivo Public Puntero_Alarma1 As Long 'VPF Public Puntero_Alarma2 As Long 'VBB Public Puntero_Alarma3 As Long 'CFE Y TRANSFERENCIA Public Puntero_Alarma4 As Long 'ERRORES Public Puntero_Alarma5 As Long 'APF Public Puntero_Alarma6 As Long 'FPF Public Puntero_Alarma7 As Long 'ABB 'Variables para encontrar a que minuto pertenece la alarma Public Entero_Alarma As Long Public Resto_Alarma As Long Public Minuto_Alarma As Long Public HORA_ALARMA As Long 'Almacena la hora de la primer alarma Public HORA_ULTIMA_ALARMA_VPF As Long 'Alamacena la hora de la última alarma ocurrida 'Variable que almacena el nombre base Public Nombre_Base_Alarma As String Public HHA As String Public MMA As String Public HHMMA As Long Public Etiqueta_Alarma As String 'Esta variable almacena la hora de inicio-1 Public Hora_Ultima_Alarma As String 'Esta alamacena el valor númerico de Hora_Ultima_Alarma Public Valor_Alarma_Anterior As Long 'Almacena el valor de la posible alarma actual Public Valor_Alarma As Long 'Fecha_Alarma Public Fecha_Alarma As Long Public Fecha_Alarma_Anterior As String 'Vector que alamacena los indicadores de que alarma ya 'fue almacenada en el archivo de alarmas Public Vector_AlarmaON_OFF_Flag() As Integer Public Vector_AlarmaON_Amp_PF_OFF_Flag() As Integer Public Vector_AlarmaON_Frec_PF_OFF_Flag() As Integer Public Vector_AlarmaON_Volt_BB_OFF_Flag() As Integer Public Vector_AlarmaON_Amp_BB_OFF_Flag() As Integer Public Vector_AlarmaON_Transferencia_OFF_Flag() As Integer Public Vector_AlarmaON_Errores_OFF_Flag() As Integer Module_Archivos_Alarmas_Visor 'Vector que almacena las fechas de los archivos 'a buscar, para generar el reporte de alarmas 'semanal Public Fechas_Seleccionadas() As String 'Bandera que indica que se ya s ha presionado por 'primera vez el boton de imprimir Public Flag_Imprimir As Integer 'Estructura para recuperar las horas de las alrmas 'almacenadas en los archivos Type Data_Alarma Dato_Alarma_Visor As Long End Type 'Cadena que almacena las alarmas de cada señal Public Cadena_Tot As String 'Cadena que almacena los espacios en blanco necesarios 'para mantener una estructura bien definida en el reporte Public Espacios As String 'cadena de linea sepración creada Public Linea As String 'Cadena que almacena la estructura del reporte Public Configuracion_Alarmas As String Public Tabla As String Public HEAD_Configuracion As String

Page 333: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xcii

Public HEAD_Alarmas As String 'Vectores donde e lamacenaran todas las horas 'leidas de los archivos de alarmas Public Horas_General() As Long Public Horas_VPF() As Long Public Horas_FPF() As Long Public Horas_APF() As Long Public Horas_VBB() As Long Public Horas_ABB() As Long Public Horas_ERR() As Long Public Horas_TRA() As Long 'Vector que almacena los nombres bases de los archivos 'que generaron alarmas Public Vector_Nombre_Base() As String 'Punteros que permitiran saber que dimension 'tiene el vector con más horas de alarma encontradas Public Punter As Long Public Punter1 As Long Public Punter2 As Long Public Punter3 As Long Public Punter4 As Long Public Punter5 As Long Public Punter6 As Long Public Punter7 As Long Module_Archivos_Respaldo Type Datas DATOSS As Double 'Estructura tipo DATAS End Type Public Puntero As Long 'Puntero general de generación de archivos Public Puntero1 As Long 'Volt_PF Public Puntero2 As Long 'Volt_BB Public Puntero3 As Long 'CFE Public Puntero4 As Long 'Transferencia Public Puntero5 As Long 'Errores por minuto Public Puntero6 As Long 'Amp_PF Public Puntero7 As Long 'Frec_PF Public Puntero8 As Long 'Amp_BB Public Puntero9 As Long 'Ceros por minuto 'CONTADOR MINUTOS, alamcena la cantidad de minutos 'transcurridos desde que se inicio la graficación Public TIEMPO_MINUTOS As Long 'Variable que almacena la fecha Public Fecha As String Public Fecha_Anterior As String 'Almacenan dia_mes_ano que entrega la función Date Public DIA As String Public MES As String Public ANO As String 'Variables para almacenar la hora de inicio Public HOURS As String Public MINUTES As String Public SECONDS As String 'Public HMS As String Public HMS As Single Public NumRegister As Integer 'Variable que almacena el nombre base del archivo de respaldo 'a generar Public Nombre_Base As String 'Vector que almacena los ultimos minutos graficados de cada 'señal para ser escritos en sus respectivos archivos de respaldo Public Vector_Respaldo() As Single 'variables para trabajar conun sistema de ficheros, se deben de 'crear un sistema de ficheros Public osf As FileSystemObject Public RUTA As String Public RUTA2 As String Public NUEVA_HORA As String 'Alamacena la hora de inicio en los archivos de 'regeneración de las señales Public Etiqueta_Hora_Inicio As String 'Vector que alamacena los nombres de los archivos de respaldo a regenerar Public Nombres_Archivos As String

Page 334: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xciii

'ALMACENA LA FECHA ELEGIDA EN EL COMPONENTE MONTHVIEW Public EXTENSION_DATE As String Module_Global Option Explicit Option Base 0 Public Contador_Minutos As Integer Public NumBytes_1seg As Long 'Variable de # de datos por minuto Public NumRenglones As Long 'Variable de # de minutos a representar (Renglones) Public Periodo_Submuestreo As Long 'Variable que almacena el periodo del submuestreo a emplear 'Variable para la validacion de la cajas de texto Public Digitos As Integer '------------------------------------------- 'GRAFICAS CONTENIDAS EN Form_GraficaI 'Variables Abrir Grafica-->Canal0 '------------------------------------------- Public NumRegistro As Integer Public NomArchivo As String Public Direccion As Variant Type Data Dato As Integer 'Estructura tipo DATA End Type Type Registro Lectura As Byte 'Estructura registro End Type '------------------------------------------- 'Variables Abrir Errores-->Canal7 '------------------------------------------- Public NumRegistro7 As Integer Public NomArchivo7 As String Public Direccion7 As Variant '-------------------------------------------- '-------------------------------------------- 'Variables a usar para la configuracion de 'las alarmas '-------------------------------------------- Public NumRegistro_Alarma As Integer Public Direccion_Alarma As Variant 'Valores predeterminados planta de fuerza auxiliar Public Min_Volt_PF As Integer Public Max_Volt_PF As Integer Public Min_Amp_PF As Integer Public Max_Amp_PF As Integer Public Min_Frec_PF As Integer Public Max_Frec_PF As Integer 'Valores predeterminados banco de baterías Public Min_Volt_BB As Integer Public Max_Volt_BB As Integer Public Min_Amp_BB As Integer Public Max_Amp_BB As Integer 'Valor predeterminado de errores Public Max_Error As Integer '-------------------------------------------- '-------------------------------------------- 'Estructuras y variables utilizadas para crear 'y leer el archivo de configuración de alarmas '-------------------------------------------- 'Estructura de alarmas Type ALARMA_CONFIG Alarma_Min_Volt_PF As Integer Alarma_Max_Volt_PF As Integer Alarma_Min_Amp_PF As Integer Alarma_Max_Amp_PF As Integer Alarma_Min_Frec_PF As Integer Alarma_Max_Frec_PF As Integer 'Valores predeterminados banco de baterías Alarma_Min_Volt_BB As Integer Alarma_Max_Volt_BB As Integer Alarma_Min_Amp_BB As Integer Alarma_Max_Amp_BB As Integer 'Valor predeterminado de errores Alarma_Max_Error As Integer 'Valores de los tiempos de las alarmas Alarma_Tiempo_Volt_PF As Integer Alarma_Tiempo_Amp_PF As Integer Alarma_Tiempo_Frec_PF As Integer Alarma_Tiempo_Volt_BB As Integer

Page 335: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xciv

Alarma_Tiempo_Amp_BB As Integer Alarma_Tiempo_Error As Integer Alarma_Tiempo_Transferencia_CFEPF As Integer Alarma_Tiempo_Transferencia_PFCFE As Integer End Type '-------------------------------------------- '-------------------------------------------- 'Variables para graficar todos los datos en 'un solo vector '-------------------------------------------- '-------------------------------------------- 'Para CANAL0 Public Vector_Renglon() As Integer Public Vector_Submuestreo() As Integer Public Vector_AlarmaON() As Integer Public Vector_AlarmaON_Amp_PF() As Integer Public Vector_AlarmaON_Frec_PF() As Integer Public Vector_AlarmaON_Volt_BB() As Integer Public Vector_AlarmaON_Amp_BB() As Integer Public Vector_AlarmaON_Transferencia() As Integer Public Vector_AlarmaON_Errores() As Integer Public Dimension As Long 'Para el manejo de Alarmas Preventivas Public Tiempo_Alarma_Volt_PF As Integer Public Tiempo_Alarma_Amp_PF As Integer Public Tiempo_Alarma_Frec_PF As Integer Public Tiempo_Alarma_Volt_BB As Integer Public Tiempo_Alarma_Amp_BB As Integer Public Tiempo_Alarma_Error As Integer Public Tiempo_Alarma_Transferencia_CFEPF As Integer Public Tiempo_Alarma_Transferencia_PFCFE As Integer 'Para el manejo de Alarmas Preventivas Public AuxTiempo_Alarma_Volt_PF As Integer Public AuxTiempo_Alarma_Amp_PF As Integer Public AuxTiempo_Alarma_Frec_PF As Integer Public AuxTiempo_Alarma_Volt_BB As Integer Public AuxTiempo_Alarma_Amp_BB As Integer Public AuxTiempo_Alarma_Error As Integer Public AuxTiempo_Alarma_Transferencia_CFEPF As Integer Public AuxTiempo_Alarma_Transferencia_PFCFE As Integer '--------------------------------------------- '-------------------------------------------- 'Para los Errores Public Vector_Renglon7() As Integer Public Vector_AlarmaPrev7() As Integer Public Vector_Submuestreo7() As Integer '-------------------------------------------- '-------------------------------------------- Public TIEMPO As Integer Public Flag_Alarma_Volt_PF As Integer Public Flag_Alarma_Amp_PF As Integer Public Flag_Alarma_Frec_PF As Integer Public Flag_Alarma_Volt_BB As Integer Public Flag_Alarma_Amp_BB As Integer Public Flag_Alarma_Transferencia As Integer Public Flag_Alarma_Errores As Integer 'Para graficar valores con punto flotante Public Num_Escalones_ADC As Integer 'Para graficar con lineas Public Matrix_Graficador0() As Single 'Double Public Matrix_Graficador1() As Single 'Double Public Matrix_Graficador2() As Single 'Double Public Matrix_Graficador3() As Single 'Double Public Matrix_Graficador4() As Single 'Double Public Matrix_Graficador5() As Single 'Double Public Matrix_Graficador6() As Single 'Double Public Matrix_Graficador7() As Single 'Double 'Errores Public Matrix_Graficador8() As Single 'Double 'Ceros 'Vectores pa indicar que alarmas ya fueron indicadas Public Vector_AlarmaON_OFF() As Integer Public Vector_AlarmaON_Amp_PF_OFF() As Integer Public Vector_AlarmaON_Frec_PF_OFF() As Integer Public Vector_AlarmaON_Volt_BB_OFF() As Integer Public Vector_AlarmaON_Amp_BB_OFF() As Integer Public Vector_AlarmaON_Transferencia_OFF() As Integer Public Vector_AlarmaON_Errores_OFF() As Integer 'Banderas para saber si ya alarmo Public Flag_Alarma_Volt_PF_On As Integer Public Flag_Alarma_Amp_PF_On As Integer Public Flag_Alarma_Frec_PF_On As Integer Public Flag_Alarma_Volt_BB_On As Integer Public Flag_Alarma_Amp_BB_On As Integer

Page 336: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xcv

Public Flag_Alarma_Transferencia_On As Integer Public Flag_Alarma_Errores_On As Integer 'Variable que almacena la duración de la primer alarma de la lista Public Duracion_1er_Alarma As Integer Public Duracion_1er_Alarma_Volt_BB As Integer Public Duracion_1er_Alarma_CFE_Transferencia As Integer Public Duracion_1er_Alarma_Errores As Integer Public Duracion_1er_Alarma_Amp_PF As Integer Public Duracion_1er_Alarma_Frec_PF As Integer Public Duracion_1er_Alarma_Amp_BB As Integer 'Variable para el Total de lineas indicadoras Public Tot_Lineas As Integer 'Variable pa almacenar el valor de la serie 6 de alarma 'que se pierde al realizar la redimensión de la matriz Public Amplitud_Alarma_Volt_PF As Single 'Double Public Amplitud_Alarma_Volt_BB As Single 'Double Public Amplitud_Alarma_Transferencia As Single 'Double Public Amplitud_Alarma_Error As Single 'Double Public Amplitud_Alarma_Frec_PF As Single 'Double Public Amplitud_Alarma_Amp_PF As Single 'Double Public Amplitud_Alarma_Amp_BB As Single 'Double 'Bandera que indica cuando hay corriemientos en los archivos Public Flag_Corrimiento As Integer 'Variable que almacenara el minuto donde se encuentra el fin de la primera alarma del vector de alarmas Public MINUTE As Integer Public MINUTE1 As Integer Public MINUTE2 As Integer Public MINUTE3 As Integer Public MINUTE4 As Integer Public MINUTE5 As Integer 'Variable que almacena la posición de la primera 'Variables para las restricción Public Restriccion_Max_Volt_PF As Integer Public Restriccion_Min_Volt_PF As Integer Public Restriccion_Max_Volt_BB As Integer Public Restriccion_Min_Volt_BB As Integer Public Restriccion_Max_Amp_PF As Integer Public Restriccion_Min_Amp_PF As Integer Public Restriccion_Max_Amp_BB As Integer Public Restriccion_Min_Amp_BB As Integer Public Restriccion_Max_Frec_PF As Integer Public Restriccion_Min_Frec_PF As Integer 'Indica que linea preventiva pintar en la 'transferencia Public Flag_Preventiva45 As Integer 'subindice ara el establecimiento de las etiquetas 'con el formato de 12 horas Public Conta_Minutos As Integer Public Num_Row As Long Public Num_labels As Long Public Conta_Entro As Long Public Conta_Entro_Minutos As Long Public Etiqueta_Index As String Public Conta_Minutos1 As Integer Public Num_Row1 As Long Public Num_labels1 As Long Public Conta_Entro1 As Long Public Conta_Entro_Minutos1 As Long Public Etiqueta_Index1 As String Module_Hora 'HH:MM:SS Public HH As Integer Public MM As Integer Public SS As Integer Public CADHH As String Public CADMM As String Public HORA_INICIO As String 'Para el formato de 12horas Public AM_PM As String 'Para saber que formato esta unsando el tiempo Public Checar_Formato_Tiempo As Integer Module_Visor 'Para graficar con líneas 'Public Matrix_Graficador0_Aux_Visor() As Single

Page 337: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xcvi

Public Matrix_Graficador0_Visor() As Single Public Matrix_Graficador1_Visor() As Single Public Matrix_Graficador2_Visor() As Single Public Matrix_Graficador3_Visor() As Single Public Matrix_Graficador4_Visor() As Single Public Matrix_Graficador5_Visor() As Single Public Matrix_Graficador6_Visor() As Single Public Matrix_Graficador7_Visor() As Single Public Matrix_Graficador8_Visor() As Single 'Para limpiar el mschart cuando el archivo 'de la fecha elegida no existe Public Matrix_Vacia() As Single '------------------------------------------- 'GRAFICAS CONTENIDAS EN Form_GraficaI 'Variables Abrir Grafica-->Canal0 '------------------------------------------- Public NumRegistro_Visor As Integer Public NomArchivo_Visor As String Public Direccion_Visor As Variant Public Vector_Renglon_Visor() As Single 'Total de elemntos contenidos en el archivo Public Posicion_Visor As Long 'General Public Posicion_Visor1 As Long Public Posicion_Visor2 As Long Public Posicion_Visor3 As Long Public Posicion_Visor4 As Long Public Posicion_Visor5 As Long Public Posicion_Visor6 As Long Public Posicion_Visor7 As Long Public Posicion_Visor8 As Long Public Posicion_Visor9 As Long 'Total de elementos contenidos en el archivo dado en bytes Public Total_Elementos_Archivo As Long Public Total_Elementos_Archivo1 As Long Public Total_Elementos_Archivo2 As Long Public Total_Elementos_Archivo3 As Long Public Total_Elementos_Archivo4 As Long Public Total_Elementos_Archivo5 As Long Public Total_Elementos_Archivo6 As Long Public HORA_INICIO_GRAFICA As String 'Single Type Data_Visor Dato_Visor As Single 'Estructura tipo DATA End Type Type HORA_START HORA_START As Single 'Estructura registro End Type '-------------------------------------------- 'Variables a usar para la configuracion de 'las alarmas '-------------------------------------------- Public NumRegistro_Alarma_Visor As Integer Public Direccion_Alarma_Visor As Variant 'Valores predeterminados planta de fuerza auxiliar Public Min_Volt_PF_Visor As Integer Public Max_Volt_PF_Visor As Integer Public Min_Amp_PF_Visor As Integer Public Max_Amp_PF_Visor As Integer Public Min_Frec_PF_Visor As Integer Public Max_Frec_PF_Visor As Integer 'Valores predeterminados banco de baterías Public Min_Volt_BB_Visor As Integer Public Max_Volt_BB_Visor As Integer Public Min_Amp_BB_Visor As Integer Public Max_Amp_BB_Visor As Integer 'Valor predeterminado de errores Public Max_Error_Visor As Integer '-------------------------------------------- 'Para el manejo de Alarmas Preventivas Public Tiempo_Alarma_Volt_PF_Visor As Integer Public Tiempo_Alarma_Amp_PF_Visor As Integer Public Tiempo_Alarma_Frec_PF_Visor As Integer Public Tiempo_Alarma_Volt_BB_Visor As Integer Public Tiempo_Alarma_Amp_BB_Visor As Integer Public Tiempo_Alarma_Error_Visor As Integer Public Tiempo_Alarma_Transferencia_CFEPF_Visor As Integer Public Tiempo_Alarma_Transferencia_PFCFE_Visor As Integer 'Cadena donde se almacena la etiqueta de horas Public Etiqueta_Alarma_Visor As String 'cadena que alamacena el resultado de la funcion de formato HH:MM Public Etiqueta_Index_Visor As String

Page 338: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xcvii

'contador de minutos Public Conta_Minutos_Visor As Long 'vector que almacena las cadenas de los encabezados 'del reporte de valores Graficas Public Vector_Nombres_Senales() As String Public Vector_Nombres_Senales1() As String 'Variable que propporciona el total de lines contenidas 'en el Richtextbox a imprimir Public TOT_LINE As Long Public TOT_CAR As Long 'Total de caracteres Module_Zoom 'Bandera que almacena si fue seleccionado el chk_zoom Public Flag_Zoom As Integer Public Flag_Lim_Inferior As Integer Public Flag_Lim_Superior As Integer Public Flag_Linea_Alarma As Integer 'Variable que almacena que grafica se desea observar del primer menú Public Grafica_Opcion As Integer 'Bandera que almacena la ultima opcion seleccionada del menú Public Flag_Grafica_Opcion As Integer 'Matrix que almacenará el rango de valorea a graficar Public Matrix_Graficador0_Aux() As Single 'Double 'Variables que almacenan el valor guardado en los textboxes 'del Zoom Public Min_Inicio As Integer Public Min_Fin As Integer Public Min_Inicio_Anterior As Integer 'Variable que almacena el valor de colum Public Colum As Integer 'Variables que alamacenan las amplitudes de las limites de alarma Public Limite_Superior As Integer Public Limite_Inferior As Integer 'Bandera que indica si se hizo doble click dos veces en la 'misma posicion Public Flag_Limite1_Zoom As Integer Public PuntoDatos_Anterior1 As Integer 'Alamcena la posicion anterior 'elegida por el zoom 'Pila Public Pila() As Long Public Pos_Pila As Integer 'Bandera que indica cuando se debe realizar un Zoom dentro de un Zoom Public Flag_Profundidad_Zoom As Integer Public Minuto0 As Integer Public Minuto1 As Integer 'Variable que almacena cuantos limites se han capturado del zoom 'con el mouse (cuantas veces se entro al evento Point_Activated) Public Con_Puntos_Activados As Integer 'Variable que almacena la diferencia del Mi_Inicio y el Min_Fin Public DIFERENCIA As Integer Module_Zoom_Visor 'Bandera que almacena si fue seleccionado el chk_zoom Public Flag_Zoom_Visor As Integer Public Flag_Lim_Inferior_Visor As Integer Public Flag_Lim_Superior_Visor As Integer Public Flag_Linea_Alarma_Visor As Integer 'Variable que almacena que grafica se desea observar del primer menú Public Grafica_Opcion_Visor As Integer 'Bandera que almacena la ultima opcion seleccionada del menú Public Flag_Grafica_Opcion_Visor As Integer 'Matrix que almacenará el rango de valorea a graficar Public Matrix_Graficador0_Aux_Visor() As Single 'Double 'Variables que almacenan el valor guardado en los textboxes 'del Zoom Public Min_Inicio_Visor As Integer Public Min_Fin_Visor As Integer Public Min_Inicio_Anterior_Visor As Integer 'Variable que almacena el valor de colum Public Colum_Visor As Integer 'Variables que alamacenan las amplitudes de las limites de alarma Public Limite_Superior_Visor As Integer Public Limite_Inferior_Visor As Integer

Page 339: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xcviii

'Bandera que indica si se hizo doble click dos veces en la 'misma posicion Public Flag_Limite1_Zoom_Visor As Integer Public PuntoDatos_Anterior1_Visor As Integer 'Alamcena la posicion anterior 'elegida por el zoom 'Pila Public Pila_Visor() As Long Public Pos_Pila_Visor As Integer 'Bandera que indica cuando se debe realizar un Zoom dentro de un Zoom Public Flag_Profundidad_Zoom_Visor As Integer Public Minuto0_Visor As Integer Public Minuto1_Visor As Integer 'Variable que almacena cuantos limites se han capturado del zoom 'con el mouse (cuantas veces se entro al evento Point_Activated) Public Con_Puntos_Activados_Visor As Integer 'Variable que almacena la diferencia del Mi_Inicio y el Min_Fin Public DIFERENCIA_Visor As Integer Module_Zoom1 'Bandera que almacena si fue seleccionado el chk_zoom Public Flag_Zoom1 As Integer Public Flag_Lim_Inferior1 As Integer Public Flag_Lim_Superior1 As Integer Public Flag_Linea_Alarma1 As Integer 'Variable que almacena que grafica se desea observar del primer menú Public Grafica_Opcion1 As Integer 'Bandera que almacena la ultima opcion seleccionada del menú Public Flag_Grafica_Opcion1 As Integer 'Matrix que almacenará el rango de valorea a graficar Public Matrix_Graficador1_Aux() As Single 'Double 'Variables que almacenan el valor guardado en los textboxes 'del Zoom Public Min_Inicio1 As Integer Public Min_Fin1 As Integer Public Min_Inicio_Anterior1 As Integer 'Variable que almacena el valor de colum Public Colum1 As Integer 'Variables que alamacenan las amplitudes de las limites de alarma Public Limite_Superior1 As Integer Public Limite_Inferior1 As Integer 'Bandera que indica si se hizo doble click dos veces en la 'misma posicion Public Flag_Limite1_Zoom1 As Integer Public PuntoDatos_Anterior2 As Integer 'Alamcena la posicion anterior 'elegida por el zoom 'Pila Public Pila1() As Long Public Pos_Pila1 As Integer 'Bandera que indica cuando se debe realizar un Zoom dentro de un Zoom Public Flag_Profundidad_Zoom1 As Integer Public Minuto2 As Integer Public Minuto3 As Integer 'Variable que almacena cuantos limites se han capturado del zoom 'con el mouse (cuantas veces se entro al evento Point_Activated) Public Con_Puntos_Activados1 As Integer 'Variable que almacena la diferencia del Mi_Inicio y el Min_Fin Public DIFERENCIA1 As Integer Module_Zoom1_Visor 'Bandera que almacena si fue seleccionado el chk_zoom Public Flag_Zoom1_Visor As Integer Public Flag_Lim_Inferior1_Visor As Integer Public Flag_Lim_Superior1_Visor As Integer Public Flag_Linea_Alarma1_Visor As Integer 'Variable que almacena que grafica se desea observar del primer menú Public Grafica_Opcion1_Visor As Integer 'Bandera que almacena la ultima opcion seleccionada del menú Public Flag_Grafica_Opcion1_Visor As Integer 'Matrix que almacenará el rango de valorea a graficar Public Matrix_Graficador1_Aux_Visor() As Single 'Double 'Variables que almacenan el valor guardado en los textboxes 'del Zoom Public Min_Inicio1_Visor As Integer Public Min_Fin1_Visor As Integer Public Min_Inicio_Anterior1_Visor As Integer

Page 340: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-xcix

'Variable que almacena el valor de colum Public Colum1_Visor As Integer 'Variables que alamacenan las amplitudes de las limites de alarma Public Limite_Superior1_Visor As Integer Public Limite_Inferior1_Visor As Integer 'Bandera que indica si se hizo doble click dos veces en la 'misma posicion Public Flag_Limite1_Zoom1_Visor As Integer Public PuntoDatos_Anterior2_Visor As Integer 'Alamcena la posicion anterior 'elegida por el zoom 'Pila Public Pila1_Visor() As Long Public Pos_Pila1_Visor As Integer 'Bandera que indica cuando se debe realizar un Zoom dentro de un Zoom Public Flag_Profundidad_Zoom1_Visor As Integer Public Minuto2_Visor As Integer Public Minuto3_Visor As Integer 'Variable que almacena cuantos limites se han capturado del zoom 'con el mouse (cuantas veces se entro al evento Point_Activated) Public Con_Puntos_Activados1_Visor As Integer 'Variable que almacena la diferencia del Mi_Inicio y el Min_Fin Public DIFERENCIA1_Visor As Integer f)MENSAJES DE ALARMA Form_Msg Private Sub CmdCerrar_Click() Unload Me End Sub Form_Msg2 Private Sub CmdCerrar_Click() Unload Me End Sub Form_MsgAlarma_Amp_BB 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 Private Sub CmdCerrar_Click() Flag_Alarma_Amp_BB = 0 Flag_Alarma_Amp_BB_On = 0 Unload Me End Sub Private Sub Form_Load() Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) 'DIMENSIONA EL TAMAÑO DE LA FORMA ScaleHeight = 2145 ScaleWidth = 4440 LblTiempo.Caption = Str(TIEMPO) 'Para visualizar el tiempo Flag_Alarma_Amp_BB = 1 'Bandera que indica ventana de alarma activa 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) For i = 8 To 0 Step -1 Success = DeleteMenu(hMenu, i, MF_BYPOSITION) Next Exit Sub End Sub Form_MsgAlarma_Amp_PF 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Page 341: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-c

'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 Private Sub CmdCerrar_Click() Flag_Alarma_Amp_PF = 0 Flag_Alarma_Amp_PF_On = 0 Unload Me End Sub Private Sub Form_Load() Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) 'DIMENSIONA EL TAMAÑO DE LA FORMA ScaleHeight = 2145 ScaleWidth = 4440 LblTiempo.Caption = Str(TIEMPO) 'Para visualizar el tiempo Flag_Alarma_Amp_PF = 1 'Bandera que indica ventana de alarma activa 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) For i = 8 To 0 Step -1 Success = DeleteMenu(hMenu, i, MF_BYPOSITION) Next Exit Sub End Sub Form_MsgAlarma_Errores 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 Private Sub CmdCerrar_Click() Flag_Alarma_Errores = 0 Flag_Alarma_Errores_On = 0 Unload Me End Sub Private Sub Form_Load() Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) 'DIMENSIONA EL TAMAÑO DE LA FORMA ScaleHeight = 2145 ScaleWidth = 4440 LblTiempo.Caption = Str(TIEMPO) 'Para visualizar el tiempo Flag_Alarma_Errores = 1 'Bandera que indica ventana de alarma activa 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) For i = 8 To 0 Step -1 Success = DeleteMenu(hMenu, i, MF_BYPOSITION) Next Exit Sub End Sub Form_MsgAlarma_Frec_PF 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Page 342: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-ci

'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 Private Sub CmdCerrar_Click() Flag_Alarma_Frec_PF = 0 Flag_Alarma_Frec_PF_On = 0 Unload Me End Sub Private Sub Form_Load() Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) 'DIMENSIONA EL TAMAÑO DE LA FORMA ScaleHeight = 2145 ScaleWidth = 4440 LblTiempo.Caption = Str(TIEMPO) 'Para visualizar el tiempo Flag_Alarma_Frec_PF = 1 'Bandera que indica ventana de alarma activa 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) For i = 8 To 0 Step -1 Success = DeleteMenu(hMenu, i, MF_BYPOSITION) Next Exit Sub End Sub Private Sub Label2_Click() End Sub Form_MsgAlarma_Transferencia_CFEPF 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 Private Sub CmdCerrar_Click() Flag_Alarma_Transferencia = 0 Flag_Alarma_Transferencia_On = 0 Unload Me End Sub Private Sub Form_Load() Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) 'DIMENSIONA EL TAMAÑO DE LA FORMA ScaleHeight = 2145 ScaleWidth = 4440 LblTiempo.Caption = Str(TIEMPO) 'Para visualizar el tiempo Flag_Alarma_Transferencia = 1 'Bandera que indica ventana de alarma activa 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) For i = 8 To 0 Step -1 Success = DeleteMenu(hMenu, i, MF_BYPOSITION) Next Exit Sub End Sub Form_MsgAlarma_Volt_BB 'Para deshabilitar los botones de maximizar y minimizar y cerrar

Page 343: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

IV-cii

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 Private Sub CmdCerrar_Click() Flag_Alarma_Volt_BB = 0 Flag_Alarma_Volt_BB_On = 0 Unload Me End Sub Private Sub Form_Load() Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) 'DIMENSIONA EL TAMAÑO DE LA FORMA ScaleHeight = 2145 ScaleWidth = 4440 LblTiempo.Caption = Str(TIEMPO) 'Para visualizar el tiempo Flag_Alarma_Volt_BB = 1 'Bandera que indica ventana de alarma activa 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) For i = 8 To 0 Step -1 Success = DeleteMenu(hMenu, i, MF_BYPOSITION) Next Exit Sub End Sub Form_MsgAlarma_Volt_PF 'Para deshabilitar los botones de maximizar y minimizar y cerrar Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 'Constantes Const SC_SIZE = &HF000 Const SC_MOVE = &HF010 Const SC_MINIMIZE = &HF020 Const SC_MAXIMIZE = &HF030 Const SC_CLOSE = &HF060 Const SC_RESTORE = &HF120 Const MF_SEPARATOR = &H800 Const MF_BYPOSITION = &H400 Const MF_BYCOMMAND = &H0 Private Sub CmdCerrar_Click() Flag_Alarma_Volt_PF = 0 Flag_Alarma_Volt_PF_On = 0 Unload Me End Sub Private Sub Form_Load() Dim hwnd&, hMenu&, Success& Dim i% hwnd = Me.hwnd hMenu = GetSystemMenu(hwnd, 0) 'DIMENSIONA EL TAMAÑO DE LA FORMA ScaleHeight = 2145 ScaleWidth = 4440 LblTiempo.Caption = Str(TIEMPO) 'Para visualizar el tiempo Flag_Alarma_Volt_PF = 1 'Bandera que indica ventana de alarma activa ' Flag_Alarma_Volt_PF_On = 1 'Para eliminar las opciones de minimizar etc.. de la forma 'Quitar todos (va de 0 a 8) For i = 8 To 0 Step -1 Success = DeleteMenu(hMenu, i, MF_BYPOSITION) Next Exit Sub End Sub

Page 344: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

B-1

Bibliografía

[1] Microchip.(2001).16F874 Data Sheet 28/40-Pin 8-Bit CMOS FLASH. U.S.A.

[2] Microchip.(1997).Pic MicroTM Mid-Range MCU Family Reference Manual. U.S.A.

[3] Katsuhiko Ogata.(1996). Sistemas de Control en Tiempo Discreto.(2a ed.).México:

Prentice Hall.

[4] Exar.(2000). ST16C550 Uart with 16-Byte Fifos’s. U.S.A.

[5] Ronald J. Tocci.(1996).Sistemas Digitales, Principios y Aplicaciones.(6a ed.).México:

Prentice Hall.

[6] Barry B. Brey.(1995).Los microprocesadores intel arquitectura, programación e

interfaces.(3a ed.). México: Prentice Hall.

[7] José Manuel Huidobro Moya.(1999).Sistemas de Telecomunicación e Informáticos,

Sistemas Telemáticos. España: Paraninfo.

[8] Wayne Tomasi.(1996).Sistemas de Comunicaciones Electrónicas.(2a ed.).México: Prentice

Hall.

[9] Thomas L. Floyd.(1996).Fundamentos de Electrónica Digital.(1a ed.).México:Limusa.

[10] STMicroelectronics.(2001).ST232 5V Powered Multi-Channel RS-232 Drivers and

Receivers. Italy.

[11] J.Terry Godfrey.(1991).Lenguaje Ensamblador para Microcomputadoras IBM, para

principiantes y avanzados. (1a ed.).México: Prentice Hall.

[12] Andrew S. Tanenbaum.(1997). Redes de computadoras.(3a ed.).México: Prentice Hall.

[13] Robert F. Coughlin, Frederick F. Driscoll.(1993).Amplificadores Operacionales y

Circuitos Integrados Lineales.( 4a ed.). México:Prentice Hall.

[14] Norbert R. Malik.(1996).Circuitos Electrónicos, Análisis, Simulación y

Diseño.España:Prentice Hall.

[15] John G. Proakis, Dimitris G. Manolakis.(1998).Tratamiento Digital de Señales,

Principios, algoritmos y aplicaciones.( 3a ed.).España: Prentice Hall.

[16] Simon Haykin, Barry Van Veen.(2001).Señales y Sistemas.( 1a ed.).México: Limusa.

[17] L.P. Huelsman, P.E. Allen.(1980).Introduction to the Theory and Design of Active

Filters. United States of America: McGraw-Hill.

Page 345: SISTEMA DE MONITOREO Y ALARMAS …digeset.ucol.mx/tesis_posgrado/Pdf/CASTRO... · maestría en ciencias área telemática . sistema de monitoreo y alarmas prototipo, para plantas

B-2

[18] Aristides Alvarez, Ana Lusi. ¿Qué es un Microcontrolador? Guía del Estudiante Versión

1.1. Obtenido en la Red Mundial el 17 de marzo de 2001: http://www.parallax.com

/Downloads/Documentation/edu/intl/What's_a_Microcontroller_(Spanish).pdf

[19] Andrés de Santos Lleó. (2002, 7 de febrero). Sistemas Electrónicos Digitales. Obtenido

en la Red Mundial el 10 de abril de 2002: http://www.die.upm.es/andres/sedg/cap8.pdf