Está en la página 1de 236

Diseño de un control distribuido para una planta.

TITULACIÓN: Ingeniería Técnica en Telecomunicaciones Especialidad en


Telemática

AUTOR: Oscar López Risquez


DIRECTOR: Ramón Villarino Villarino
FECHA: Mayo del 2011

-1-
Índice

1. Índice

1 Índice 2
2 Estudio Situación Actual en la Industria. 5
2.1 Introducción 5
2.2. Evolución de la automatización industrial. 5
2.2.1. Estructuras generales de los sistemas de control industriales. 7
2.2.2. Control Centralizado. 8
2.2.3. Control Centralizado Multicapa. 8
2.2.3.1. Prestaciones. 9
2.2.3.2. Requisitos. 9
2.2.3.3. Módulos de un SCADA. 10
2.2.4. Control Distribuido. 10
2.3. Características específicas de las redes locales Industriales. 12
2.3.1. Características. 12
2.3.1.1. Entorno de funcionamiento hostil. 12
2.3.1.2. Restricciones Temporales. 12
2.3.1.3. Arquitecturas Adecuadas. 12
2.3.2. Jerarquía entre los niveles de comunicación. 12
2.3.2.1. Red de Factoría. 17
2.3.2.2. Red de Planta. 17
2.3.2.3. Red de Célula. 17
2.3.2.4. Bus de Campo (field bus). 18
2.4. Ejemplos de estudio. 22
2.4.1. Redes Map y Top. 22
2.4.1.1. Características de las redes MAP destacables. 24
2.4.2. Redes MINIMAP. 24
2.4.3. Ethernet Industrial. 26
2.4.4. PROFIBUS. 29
2.4.4.1. Estructura. 30
2.4.4.2.. Configuración física de Bus. 31
2.4.4.3. Versiones Compatibles. 32
2.4.4.4.. Estructura de la red. 35
2.4.4.5. Tecnología de transmisión. 37
2.4.5.. AS-I AKTUATOR SENSOR INTERFACE. 39
2.4.6.. INTERBUS. 41
2.4.7. CAN: CONTROLLER AREA NETWORKING. 44
2.4.8.. Comparación de los casos estudiados. 47
3. Estudio y desarrollo de un control distribuido para una planta. 48
3.1. Introducción. 48
3.2.. Estación de trabajo. 50
3.2.1. Software. 50
3.2.2. Funcionamiento. 51
3.2.2.1. Pantalla Inicio. 51
2
Índice

3.2.2.2. Pantalla Reacción. 53


3.3. Puerto Paralelo. 71
3.3.1. Introducción 71
3.3.1.1. Características físicas del puerto paralelo. 72
3.3.1.2. Registros del puerto paralelo (SPP). 74
3.4. Circuito Interface (Bus paralelo). 77
3.4.1. Introducción. 77
3.4.2. Descripción. 78
3.5. Circuito Estación Remota. 83
3.5.1. Introducción. 83
3.5.2. Descripción. 84
3.6. Circuito Contador. 87
3.6.1. Introducción. 87
3.6.2. Descripción. 87
3.7. PLC. 90
3.7.1. Definición de PLC. 90
3.7.2. Introducción. 91
3.7.3. Software. 91
3.7.3.1. Pantalla principal. 92
3.7.3.2. Pantalla Datos. 94
4. Conclusiones y líneas futuras. 99
4.1. Conclusiones. 99
4.2. Líneas futuras. 100
5. Bibliografía 101
5.1. Software Empleado 101
6. Links Datasheets. 102
ÍNDICE ANEXOS 103
7. Anexo1: Rutinas Programadas. 104
7.1. Pantallas Estación de Trabajo. 104
7.1.1. Código Página Inicio: 104
7.1.2. Código Pantalla Entrada Manual. 106
7.1.3. Código Pantalla Password. 112
7.1.4. Código Pantalla Válvula amoníaco. 114
7.1.5. Código Pantalla Inicio. 116
7.1.6. Código Pantalla Entrada Manual. 119
7.1.7. Código Pantalla Gráficas. 124
7.1.8. Código Pantalla Entradas/Salidas. 132
7.1.9. Código Pantalla Máximos y Mínimos. 148
7.1.10. Código Pantalla NAcceso. 150
7.1.11. Código Pantalla NPASSWORD. 151
7.1.12. Código Pantalla PPRINAPOYO. 152
7.1.13. Código Pantalla Principal. 155
7.1.14. Código Pantalla REFRIG. 200
7.1.15. Código Pantalla RegAlarm. 203

3
Índice

7.2. Código PLC. 203


7.2.1. Código Pantalla Principal. 203
7.2.2. Código Pantalla Datos. 215
8. Anexo2: Planos 228
8.1. Planos Circuito Interface. 228
8.1.1. Esquema Eléctrico. 228
8.1.2. Fotolito Circuito Interface. 229
8.1.3. Esquema Componentes. 229
8.2. Planos Estación Remota. 231
8.2.1. Esquema eléctrico. 231
8.2.2. Fotolito Circuito Estación Remota. 232
8.2.3. Esquema componentes. 233
8.3. Planos Circuito Contador. 234
8.3.1. Esquema eléctrico. 234
8.3.2. Fotolito Circuito Contador. 235
8.3.3. Esquema Componentes. 236

4
Estudio Situación Actual en la Industria.

2. Estudio Situación Actual en la Industria.

2.1. Introducción.
El desarrollo del control distribuido en la industria va paralelo al de las comunicaciones.
Cada vez es más necesario disponer de dispositivos inteligentes para realizar el control o la
supervisión remota, tanto de procesos de fabricación, como de almacenamiento o
distribución.
Los sistemas o redes de comunicación empleados en entornos industriales se encuentran
sometidos a una problemática específica que condiciona enormemente su diseño y los
diferencia de las redes de datos o redes de oficina. El desarrollo de los microprocesadores,
microcontroladores y los controladores lógicos programables (PLCs) dio lugar a la
aparición del control distribuido. En este tipo de esquema, un PLC o un microprocesador
controla una o más variables del sistema realizando un control directo de las mismas. Estos
equipos de control local se comunican con otros elementos de su nivel y con el nivel
superior de supervisión.

2.2. Evolución de la automatización industrial.


Los conceptos de automatización tienen sus orígenes con la revolución industrial. Los
elementos mediante los cuales se llevaban a cabo las decisiones de control eran elementos
mecánicos y electromagnéticos con el advenimiento de la electricidad (motores, relés,
temporizadores, contadores). Esto tenía el problema que los tableros de control (armarios
eléctricos) llegan a tomar grandes tamaños según se hacían automatizaciones más
complejas.
En los años 50 con la aparición de la electrónica comienzan a utilizarse los
semiconductores con lo que se reduce el tamaño de los armarios eléctricos y se reduce el
número de averías por desgaste de componentes. Aunque esto resultaba mucho más
amigable que los grandes tableros eléctricos del principio presentaba un problema de falta
de flexibilidad: ya que un sistema de control sólo sirve para una aplicación específica, y no
es reutilizable.
Debido a esto y a la creciente demanda industrial del momento en el año 1968 Ford y
General Motors plantean las especificaciones que debe cumplir un controlador electrónico
programable para ser realmente útil en la industria.
Es así que Bedford associates desarrolla un prototipo de controlador industrial, que puede
ser considerado el primer PLC de la historia (programmable logic controller o autómata
programable industrial). Este presentaba las características que reclamaba la industria:
• Reutilizable.
• Adaptado a entornos agresivos (industria)
• Fácilmente programable por técnicos eléctricos.
• Implementado con electrónica de estado sólido (semiconductores)

Los primeros PLCs se usaron para controlar procesos secuenciales (cadenas de montaje,
transporte, etc.). El problema que presentaba era que su memoria era cableada, por lo que
la reutilización es posible pero costosa. Se empezaron implementar memorias con
semiconductores eliminando las memorias cableadas mayor flexibilidad por la facilidad de
programación. Pero por entonces todavía la tecnología de los microprocesadores no era
-5-
Estudio Situación Actual en la Industria.

utilizable en la industria por falta de robustez, dificultad de conexión a equipos mecánicos


y dificultad de programación.
A mediados de los 70 los autómatas incorporan el microprocesador y las memorias
semiconductoras lo que permiten programar sin recablear (aumenta flexibilidad). Además
permiten realizar cálculos matemáticos y comunicar con un ordenador central (ordenador
encargado de controlar la planta enviando órdenes a los autómatas que gobiernan cada
proceso). Junto a esto aparecen los primeros DCS (sistemas de control distribuido) que
eran controladores lógicos al igual que los PLC's solo que estos en el principio dominaban
el reino del control de variables analógicas. De esta manera sistemas DCS trabajaban a la
par de sistemas separados de PLC para control discreto de variables on/off.
Hacia los finales de los 70 aparecen mejoras en los autómatas dándole a estos:
• Mayor memoria.
• Capacidad de gobernar bucles de control.
• Más tipos de E/S (conexión más flexible de sensores/actuadores).
• Lenguajes de programación más potentes.
• Comunicaciones más potentes. En los años 80 se continúa con las mejoras siendo
algunas de estas:
• Mayor velocidad de proceso.
• Dimensiones más reducidas.
• Técnicas de control más complejas (PID, inteligente, fuzzy).
• Múltiples lenguajes (contactos, lista instrucciones, GRAFCET, etc.).

En los años "90 cuando los sistemas de control basado en PC hicieron su aparición en la
escena de la automatización industrial, los partidarios de estos sistemas más poderosos y
abiertos afirmaban que dichos sistemas podrían llegar a suplantar a los controladores
lógicos programables (PLC's) y hasta los sistemas de control distribuidos (DCS's) en
numerosas aplicaciones. El PC tenía mucho que ofrecer, pero no suplantaría las
plataformas ya probadas de control industrial, no por lo menos en la forma de un PC de
escritorio. El PC era la mejor opción a la hora de integrar funcionalidad avanzada, como
puede ser conectividad de base de datos, integración, control analógico y simulación
basados en Web y comunicación de datos con terceros. El problema con el control basado
en PC ha sido siempre este. Los PC's que corren en sistemas operativos estándares con
hardware común resultan demasiado frágiles y temperamentales como para brindar un
control industrial confiable.
El resultado de todas estas innovaciones fue la aparición de controladores híbridos que
permiten manejo de variables analógicas y digitales, en conjunto con características como
procesador de punto flotante para cálculos personales, servidor Web interactivo embebido
que facilita las tareas de control y monitoreo, flash compacto removible para la recolección
y registro de datos, puertos seriales múltiples y conexionado mediante buses de campo para
la comunicación con terceros.

6
Estudio Situación Actual en la Industria.

En la actualidad tenemos disponibles gran variedad de autómatas híbridos compactos,


sencillos y modulares para aplicaciones incluso domésticas. Presentan grandes
posibilidades de ampliación. Y con una tendencia hacia una evolución continua de los
sistemas de comunicación, constituyendo redes de autómatas que permitan
implementaciones más complejas y seguras. Las nuevas características de los sistemas de
automatización apuntan a incorporar características de los sistemas distribuidos como:
• Escalabilidad
• Apertura
• Concurrencia
• Tolerancia a fallas
• Transparencia

2.2.1. Estructuras generales de los sistemas de control industriales.


La Ilustración I muestra en forma esquemática la estructura de Control implementadas
normalmente en la industria.

Ilustración 1 Estructura de Control.

En la misma pueden verse dos áreas bien definidas: Una la parte operativa y otra la parte
de control. En la parte operativa tenemos los dispositivos de hardware y software que
brindan la información necesaria para llevar a cabo las operaciones de planta necesarias,
con una interfaz amigable y entendible para el operador.
En la parte de control encontramos a los dispositivos de control (PLC's, DCP'S y PC’s
industriales) que permiten llevar a cabo las acciones de control en conjunto con los
actuadores. Entre todos estos dispositivos hay comunicación vertical (desde la parte de
control hacia la operativa y viceversa) y comunicaciones horizontales (entre distintos
dispositivos de control).
Las dos arquitecturas más conocidas de control industrial, aunque cabe aclarar que no son
las únicas y muchas soluciones de automatizaciones son una mezcla de estas que se adapta
a las necesidades específicas de cada situación.

7
Estudio Situación Actual en la Industria.

2.2.2. Control Centralizado.


En la Ilustración 2 puede verse la estructura general del control centralizado.

Ilustración 2 Estructura general del control centralizado

Está constituido por un computador, un interfaz de proceso y una estación de trabajo


(interfaz de operación).
La principal ventaja es que su arquitectura facilita el flujo de información y se hace posible
que los objetivos de optimización global del proceso puedan ser alcanzados, pero tiene la
desventaja que depende de la habilidad del computador. Para solucionar esto se aplica
redundancia de servicios críticos.
Una variante del control centralizado puede verse en la figura siguiente y quizás la más
aplicable, por la probada robustez de los controladores industriales.

2.2.3. Control Centralizado Multicapa.


A partir de esta arquitectura de control aparece el concepto de SCADA que viene de las
siglas de Supervisor Control And Data Adquisition, es decir: adquisición de datos y control
de supervisión.

Ilustración 3 Esquema Arquitectura SCADA

Se trata de una aplicación software especialmente diseñada para funcionar sobre


ordenadores en el control de producción, proporcionando comunicación con los
dispositivos de campo (controladores autónomos, autómatas programables, etc.) y
controlando el proceso de forma automática desde la pantalla del ordenador. Además,
provee de toda la información que se genera en el proceso productivo a diversos usuarios,
tanto del mismo nivel como de otros supervisores dentro de la empresa: control de calidad,
supervisión, mantenimiento, etc.

8
Estudio Situación Actual en la Industria.

En este tipo de sistemas usualmente existe un ordenador, que efectúa tareas de


supervisión y gestión de alarmas, así como tratamiento de datos y control de procesos. La
comunicación se realiza mediante redes LAN o buses especiales, los cuales serán
abordados más adelante para su estudio específico. Todo esto se ejecuta normalmente en
tiempo real, y están diseñados para dar al operador de planta la posibilidad de supervisar y
controlar dichos procesos. Los elementos de proceso del sistema de control pueden utilizar
una implementación estándar en tiempo real de CORBA (Common Object Request Broker
Architecture) para la comunicación entre objetos a través de redes. Además, la
especificación de interfaces será muy importante para el mantenimiento y conservación de
la inversión teniendo en cuenta los rápidos cambios tecnológicos. Por ello serán usados
estándares abiertos como RT POSIX o ATM, y también CORBA.
Los programas necesarios, y en su caso el hardware adicional que se necesite, se denomina
en general sistema SCADA.

2.2.3.1. Prestaciones:
Un paquete SCADA debe estar en disposición de ofrecer las siguientes prestaciones:
• Posibilidad de crear paneles de alarmas, que exigen la presencia del operador para
reconocer una parada o situación de alarma, con registro de incidencias.
• Generación de históricos de señal de planta, que pueden ser volcados para su
proceso sobre una hoja de cálculo.
• Ejecución de programas, que modifican la ley de control, o incluso anular o
modificar las tareas asociadas al autómata, bajo ciertas condiciones.
• Posibilidad de programación numérica, que permite realizar cálculos aritméticos de
elevada resolución sobre la CPU del ordenador.
Con ellas, se pueden desarrollar aplicaciones para ordenadores (tipo PC, por ejemplo), con
captura de datos, análisis de señales, presentaciones en pantalla, envió de resultados a disco
e impresora, etc.
Además, todas estas acciones se llevan a cabo mediante un paquete de funciones que
incluye zonas de programación en un lenguaje de uso general (como C, Pascal, o Basic), lo
cual confiere una potencia muy elevada y una gran versatilidad. Algunos SCADA ofrecen
librerías de funciones para lenguajes de uso general que permiten personalizar de manera
muy amplia la aplicación que desee realizarse con dicho SCADA.

2.2.3.2. Requisitos:
Un SCADA debe cumplir varios objetivos para que su instalación sea perfectamente
aprovechada:
• Deben ser sistemas de arquitectura abierta, capaces de crecer o adaptarse según
las necesidades cambiantes de la empresa.

9
Estudio Situación Actual en la Industria.

• Deben comunicarse con total facilidad y de forma transparente al usuario con el


equipo de planta y con el resto de la empresa (redes locales y de gestión).
• Deben ser programas sencillos de instalar, sin excesivas exigencias de hardware, y
fáciles de utilizar, con interfaces amigables con el usuario.

2.2.3.3. Módulos de un SCADA:


Los módulos o bloques software que permiten las actividades de adquisición,
supervisión y control son los siguientes:
• Configuración: permite al usuario definir el entorno de trabajo de su SCADA.
adaptándolo a la aplicación particular que se desea desarrollar.
• Interfaz gráfico del operador: proporciona al operador las funciones de control y
supervisión de la planta. El proceso se representa mediante sinópticos gráficos
almacenados en el ordenador de proceso y generados desde el editor incorporado en
el SCADA o importados desde otra aplicación durante la configuración del paquete.
• Módulo de proceso: ejecuta las acciones de mando preprogramadas a partir de los
valores actuales de variables leídas.
• Gestión y archivo de datos: se encarga del almacenamiento y procesado ordenado
de los datos, de forma que otra aplicación o dispositivo pueda tener acceso a ellos.
• Comunicaciones: se encarga de la transferencia de información entre la planta y la
arquitectura hardware que soporta el SCADA, y entre ésta y el resto de elementos
informáticos de gestión.

2.2.4. Control Distribuido.


La figura muestra un esquema de control distribuido, donde puede observarse es que es
muy similar al control centralizado multicapa solo que aquí se comunicación entre cada
Controlador de proceso.

Ilustración 4 Estructura Control Distribuido.

Existencia de varias unidades de control que llevan a cabo las tareas. En caso de avería o
sobrecarga de trabajo, será posible transferir todo o parte de las tareas a otras unidades.

10
Estudio Situación Actual en la Industria.

La idea de poder hacer bypass a las unidades con problemas permite evitar los bloqueos
necesarios del sistema, (paradas de planta) pero por otra parte exige que los diferentes
controladores tengan una asignación dinámica de las tareas y por tanto se les va a exigir
gran capacidad de acceso a la comunicación y de tratamiento de la información.
La desventaja de esto es la disminución de la velocidad de comunicación debido a los
retardos, posibles desbordamientos en el procesamiento de datos en cada nivel y falta de
flujo de información directa entre controladores. Pero esto está siendo solucionado por la
aparición de nuevas tecnología de comunicación de datos cada vez más potentes
Aquí vemos que también tenemos una unidad de control y supervisión (SCADA) que
cumple con las características antes mencionadas para el control centralizado multicapa.
A continuación se muestra una tabla comparativa sobre los aspectos principales de las dos
arquitecturas antes mencionadas.
TIPO DE CENTRALIZADA DISTRIBUIDA
ARQUITECTURA
RLGt." LATO RIO:
SUPERVISORIO: Lazos
de control cerrados por el Lazos de control cerrados
TIPO DE CONTROL automáticamente por el
operador. Adicional mente:
PREDOMINANTE sistema. Adicionalmente:
control secuencia] y
regulatorio. control secuencia, batch,
algoritmos avanzados, etc.
TIPOS DE VARIABLES DESACOPLADAS ACOPLADAS
Arcas geográficamente
ÁREA DE ACCIÓN Arca de la planta.
distribuidas.
UNIDADES DE
ADQUISICIÓN DE Controladores de lazo, PLC's,
Remotas, PLC's.
DATOS DCS's
Y CONTROL
Radio, satélite, líneas
MEDIOS DE telefónicas, conexión Redes de área local, conexión
COMUNICACIÓN directa. directa.
I.AN. WAN.
BASE DE DATOS CENTRALIZADA DISTRIBUIDA
A partir de lo expuesto hasta aquí se puede observar que la comunicación entre
controladores es un aspecto fundamental para el funcionamiento de un sistema de control
distribuido. A continuación se detallaran las características que deben tener estas redes de
controladores para operar en el ambiente de planta.

11
Estudio Situación Actual en la Industria.

2.3. Características específicas de las redes locales Industriales.

2.3.1. Características:

2.3.1.1. Entorno de funcionamiento hostil.


Las redes industriales deben ser lo suficientemente robustas como para soportar golpes,
atmósfera agresiva, radiaciones electromagnéticas, ruido eléctrico y otras perturbaciones
típicas de la operación en planta.

2.3.1.2. Restricciones Temporales.


Las redes que comunican elementos de control con requisitos como tiempo máximo de
entrega de mensajes, esquemas de prioridades e índices elevados de disponibilidad.

2.3.1.3. Arquitecturas Adecuadas.


Deben ser arquitecturas abiertas que permitan la interconexión de elementos de distintos
proveedores sin problemas.

2.3.2. Jerarquía entre los niveles de comunicación:


Clasificación jerárquica de las redes locales industriales.

Ilustración 5 Pirámide Jerárquica.

Según el entorno donde van a ser instaladas, el gráfico de la ilustración 5 muestra un


esquema de esto. En el esquema piramidal presentado, existen diferentes niveles de
comunicación, cada uno de ellos con diferentes necesidades.
Se puede hablar en realidad de dos tipos de redes: redes de control y redes de datos.
Las redes de control están ligadas a la parte baja de la pirámide, mientras que las redes de
datos (o de oficina) están más ligadas a las partes altas de la jerarquía.
12
Estudio Situación Actual en la Industria.

En general, las redes de datos están orientadas al transporte de grandes paquetes de datos,
que aparecen de forma esporádica (baja carga), y con un gran ancho de banda para permitir
el envío rápido de una gran cantidad de datos. En contraste, las redes de control se
enfrentan a un tráfico formado por un gran número de pequeños paquetes.
En principio, las redes de datos convencionales podrían emplearse para su uso como redes
de control, sin embargo, es evidente que no resultan adecuadas para las necesidades de este
tipo de aplicaciones. Por ejemplo, es sabido que la red Ethernet tiene una gran eficiencia,
hasta el 90-95% de la capacidad del canal cuando los mensajes son largos y
suficientemente espaciados. Sin embargo, la cantidad de información que una red Ethernet
es capaz de transportar cae bruscamente cuando se utiliza por encima del 35% de la
capacidad del canal, si el tamaño de los mensajes es pequeño, como puede verse en la
figura 6. En las redes de control es habitual encontrar este tipo de carga, porque el tráfico
de la red depende directamente de eventos estemos que están siendo controlados (o
monitorizados) por los diferentes nodos que la componen. A menudo, varios nodos
necesitan enviar información simultáneamente en función de uno o más eventos estemos.
Este hecho, junto con el gran número de nodos que suelen estar presentes, implica la
existencia de frecuentes periodos en los que muchas estaciones envían pequeños paquetes
de información.

Ilustración 6 Comparación de la Red Ethernet ante variaciones del tamaño de los paquetes.

Por todas estas razones, es necesario diseñar una arquitectura de red acorde a las
características particulares de este tipo de tráfico. En el diseño se deberán tener en cuenta
aspectos como los tipos de protocolos utilizados, la interoperabilidad, la topología y la
facilidad de administración. Deben usarse protocolos abiertos, disponibles por toda la
13
Estudio Situación Actual en la Industria.

comunidad de fabricantes y usuarios. Este aspecto es básico para conseguir que equipos de
diferentes fabricantes puedan trabajar en conjunto en una misma red. También juega un
papel fundamental determinar el tipo de información que viajará por la red. En las redes de
oficina, esta información consiste básicamente en datos de usuario y en algunas ocasiones
información para la administración y el mantenimiento de la propia red.
En una red de control, esta elección es menos clara ya que el correcto funcionamiento de la
red es vital.
Pueden distinguirse dos tipos de redes según la información que transporten: redes basadas
en comandos y redes basadas en estado. En las redes basadas en comandos, la información
consiste en una orden con la que un nodo controla el funcionamiento de otro. El principal
problema radica en que si se dispone de un amplio conjunto de tipos de nodos, habrá un
aumento exponencial del número de posibles comandos y de la sobrecarga que supone su
procesamiento.

Ilustración 7 Comparación entre redes de Datos y redes de Control

En las redes orientadas a estado las cosas son más sencillas. En este caso, la funcionalidad
de un nodo no depende de ningún otro. Cada nodo enviará mensajes en los que indicará a
los demás el estado en que se encuentra. Los nodos que reciban estos mensajes
modificarán su estado en función de la nueva información. Existen implementaciones que
combinan ambos métodos.

14
Estudio Situación Actual en la Industria.

Por lo que se refiere al tipo de topología que deben adoptar las redes de control, cabe
destacar que cualquiera de las topologías clásicas de las redes de datos es válida. Cada una
de ellas con sus propias ventajas y limitaciones. Cualquiera puede satisfacer las
necesidades de cableado, prestaciones y coste de algún tipo de aplicación. La elección está
determinada fundamentalmente por el control de acceso al medio y el tipo de medio que se
emplea. El conjunto formado por el medio, el control de acceso y la topología, afecta
prácticamente a cualquier otro aspecto de la red de control: coste, facilidad de instalación.
Habilidad, prestaciones, facilidad de mantenimiento y expansión.
La selección de la topología suele hacerse basándose en los requisitos específicos de cada
sistema en cuanto a coste de instalación y tolerancia a fallos. Muchas redes de control
permiten el uso de distintas topologías.
El control de acceso al medio es vital. Elegida una topología, hay que definir como
accederá cada nodo a la red. El objetivo es reducir las colisiones (idealmente eliminarlas)
entre los paquetes de datos y reducir el tiempo que tarda un nodo en ganar el acceso al
medio y comenzar a transmitir el paquete. En otras palabras, maximizar la eficiencia de la
red y reducir el retardo de acceso al medio. Este último parámetro es el factor principal a la
hora de determinar si una red sirve para aplicaciones en tiempo real o no.
El direccionamiento de los nodos es otro de los aspectos claves. En una red de control, la
información puede ser originada y/o recibida por cualquier nodo. La forma en que las
direcciones los paquetes de información afectarán de forma importante a la eficiencia y la
viabilidad global de la red. Se pueden distinguir tres tipos de direccionamiento:
a. Unicast: El paquete es enviado a un único nodo destino.
b. Multicast: El paquete es enviado a un grupo de nodos simultáneamente.
c. Broadcast: El paquete es enviado a todos los nodos de la red simultáneamente.
El direccionamiento broadcast presenta la ventaja de su sencillez. Es adecuado para redes
basadas en información de estado. Cada nodo informa a todos los demás de cuál es estado
actual. El principal inconveniente es que los nodos pueden tener que procesar paquetes que
no les afecten directamente. Los esquemas de direccionamiento unicast y multicast son
más eficientes, y facilitan operaciones como el acuse de recibo y el reenvió, características
que aumentan la Habilidad del sistema. En redes de control, es muy habitual encontrar
esquemas de direccionamiento del tipo maestro-esclavo. Este tipo de esquemas permite
plasmar ciertos aspectos jerárquicos del control de forma sencilla- a la vez que simplifica
el funcionamiento de la red y por tanto abarata los costes de la interfaz física.
La elección del medio físico afecta a aspectos tales como la velocidad de transmisión,
distancia entre nodos y fiabilidad. En muchas redes de control se recurre a una mezcla de
distintos medios físicos para cumplir con los requisitos de diferentes secciones al menor
coste posible. Se incorporarán los routers, puentes o repetidores necesarios para asegurar el
objetivo de una comunicación extremo a extremo transparente, al menor coste posible, y
sin que la integración conlleve una disminución de las prestaciones.
El control en tiempo real demanda de las redes de control buenos tiempos de respuesta
(baja latencia). Por ejemplo, el retardo entre la detección de un objeto en una línea de
montaje de alta velocidad y el arranque de una máquina de pintado puede ser del orden de
decenas de milisegundos. En general, las redes de datos no necesitan una respuesta en
15
Estudio Situación Actual en la Industria.

tiempo real cuando envían grandes conjuntos de datos a través de la red. El control de
acceso al medio y el número de capas implementadas en la arquitectura de red resultan
determinantes a la hora de fijar la velocidad de respuesta de la red. La implementación de
las siete capas del modelo OSI implica una mayor potencia de proceso por la sobrecarga
que conlleva con respecto a un sistema más sencillo que por ejemplo sólo implementase las
dos primeras capas. En ocasiones, los beneficios que aportan las capas adicionales
compensan la sobrecarga adicional (que implica un mayor costo), sobre todo a medida que
aumenta la funcionalidad demandada de la red y mejora la tecnología disponible. Cuando
la velocidad es el factor esencial, como ocurre con muchos buses de campo, el modelo
puede aligerarse ya que en la mayor parte de este tipo de aplicaciones las capas de red,
transporte, sesión y presentación no son necesarias, como muestra el esquema de la
ilustración 8.

Ilustración 8: Capas de modelo OSI/ISO y su relación con las redes de control.

Otra forma de favorecer un tiempo de respuesta pequeño es la capacidad para establecer


mensajes con diferentes prioridades, de forma que mensajes de alta prioridad (como por
ejemplo una alarma) tengan más facilidad para acceder al medio.
Por último, hay que destacar el papel que juega la seguridad de la red. Podemos destacar
dos niveles diferentes de seguridad. Por una parte la protección frente a accesos no
autorizados a la red, y por otra parte la protección frente a fallos del sistema y averías.
El primer problema es el menos grave, ya que la mayor parte de las redes de control no
están conectadas a redes externas a la fábrica. Además, en la práctica, la mayor parte de las
veces, las redes pertenecientes a los escalones más bajos de la pirámide no están
conectados siquiera con las redes de nivel superior dentro de la propia fábrica. En
cualquier caso, los mecanismos de protección son similares a los empleados en las redes de
datos: claves de usuario y autentificación de los nodos de la red.
La protección frente a fallos juega un papel mucho más importante, debido a que se debe
evitar a toda costa, que este hecho afecte negativamente a la planta. Por ejemplo, los

16
Estudio Situación Actual en la Industria.

sistemas de refrigeración de una central nuclear no pueden bloquearse porque la interfaz de


comunicaciones de un nodo de la red se averíe. Para ello es fundamental que los nodos
puedan detectar si la red está funcionando correctamente o no, y en caso de avería puedan
pasar a un algoritmo de control que mantenga la planta en un punto seguro. Si el sistema es
crítico, se deben incluir equipos redundantes, que reemplacen al averiado de forma
automática en caso de avería. La monitorización de la red y la capacidad de diagnóstico
representan por tanto dos puntos básicos de cualquier red de control.
La necesidad de buenas herramientas de mantenimiento y administración de la red son
vitales. No sólo por lo dicho anteriormente sino que también porque en las redes de control
las operaciones de reconfiguración y actualización de la red son frecuentes.

2.3.2.1. Red de Factoría:


La constituyen redes de oficina que comunican departamentos contabilidad-
administración, ventas, gestión de pedidos, almacén. Red de Planta. Generalmente están
basadas en tecnología Ethernet y conectadas a Internet a través de un firewall para proteger
la red interna de un ataque exterior. Brindan Servicios de comunicación como transferencia
de ficheros y proceso de transacciones teniendo un gran volumen de información
intercambiada y los tiempos de respuesta no son tan críticos.

2.3.2.2. Red de Planta.


La función de esta capa es interconectar módulos y células de fabricación entre sí, y con
departamentos como diseño o planificación. La información vinculada de esta capa es
administrada y controlada por aplicaciones SCADA, ya sea en forma centralizada o
distribuida según la arquitectura implementada. En estas redes el tráfico de datos es muy
variable desde mensajes cortos de órdenes de ejecución hasta mensajes interactivos de
terminales de operarios. Al protocolo usado en estas redes se lo denomina MAP
(Manufacturing Automation Protocol). En la práctica se emplean soluciones clásicas
Ethernet o Token Ring, con características especiales ya presentan menor costo y más
experiencia en su implantación frente a soluciones a medida.

I. Requisitos de estas redes:


• Manejar mensajes de cualquier tamaño.
• Gestión de errores de transmisión eficaces (detectar y corregir).
• Cubrir áreas extensas (puede llegar a varios kilómetros).
• Poder gestionar mensajes con prioridades.
• Amplio ancho de banda disponible

2.3.2.3. Red de Célula:


Interconectar dispositivos de control que operan en modo secuencial como por ejemplo
PLC’s.

17
Estudio Situación Actual en la Industria.

I. Características deseables de estas redes:


• Gestionar mensajes cortos eficientemente.
• Capacidad de manejar tráfico de eventos discretos.
• Mecanismos de control de error (El protocolo de comunicaciones debe detectar y
corregir errores).
• Posibilidad de transmitir mensaje prioritario.
• Bajo coste de instalación y de conexión por nodo.
• Recuperación rápida ante eventos anormales en la red.
• Alta disponibilidad (el tiempo medio entre fallos mayores que 100.000 horas, para
poder mejorar la disponibilidad se implementa redundancia de servicios críticos).
En la práctica son redes son de Tamaño pequeño (5 a 50 dispositivos.) trabajando con
Redes propietarias que resultan generalmente difíciles de ampliar a un cuando se dispone
de dispositivos de control de proveedores distintos. Se emplean protocolos asíncronos
(orientados al carácter) si los paquetes transferidos son del orden de Kbps o síncrono si son
de mayor tamaño (Mbps). Con un tráfico de mensajes cortos para control y sincronización
entre los dispositivos y ocasional transferencia de archivos.
Sí bien falta de una norma de aceptación general para estas redes se las suelen encuadrar en
las siguientes categorías:

II. Categorías:
• Redes de autómatas (generalmente dependen del fabricante): por ejemplo Jnct.
Jbus, Modbus, Uni-Telway.
• Redes locales heterogéneas: LAC-1, LAC-2.
• Redes normalizadas: Mini-MAP que resulta de una simplificación de MAP para
poder utilizar en entornos de tiempo real, en donde, el nivel de aplicación acceda
directamente al nivel de enlace del modelo OSI y PROWAY (Process Data Highway)
que consiste en una topología en bus y mecanismo de acceso por paso de testigo,
cuyos aspectos funcionales están orientados a su aplicación en control de procesos.
• Redes de propósito general: Ethernet.
Los controladores actuales disponen de dispositivos configurables de manera que
puedan comunicarse en alguna o varias de las categorías antes mencionadas.
También existen dispositivos que permiten pasar de un protocolo a otro sin
problemas, son como los Gateway de las redes de computadoras convencionales. (En
la sección 5 se abarcaran ejemplos concretos de estas redes).
2.3.2.4. Bus de Campo (field bus):
Un bus de campo es un término genérico que describe un conjunto de redes de
comunicación para uso industrial, cuyo objetivo es sustituir las conexiones punto a punto
entre los elementos de campo y el equipo de control a través del tradicional bucle de
corriente de 4-20mA. Típicamente son redes digitales, bidireccionales, multipunto,
montadas sobre un bus serie, que conectan dispositivos de campo como PLC’s,
transductores, actuadores y sensores. Cada dispositivo de campo incorpora cierta capacidad
de proceso, que lo convierte en un dispositivo inteligente, manteniendo siempre un costo
18
Estudio Situación Actual en la Industria.

bajo. Cada uno de estos elementos será capaz de ejecutar funciones simples de
autodiagnóstico, control o mantenimiento, así como de comunicarse bidireccionalmente a
través del bus.
El objetivo es reemplazar los sistemas de control centralizados por redes para control
distribuido con las que mejorar la calidad del producto, reducir costes y mejorar la
eficiencia. Para ello se basa en que la información que envían y/o reciben los dispositivos
de campo es digital, lo que resulta mucho más preciso que si se recurre a métodos
analógicos. Además, cada dispositivo de campo es un dispositivo inteligente y puede llevar
a cabo funciones propias de control, mantenimiento y diagnóstico. De esta forma, cada
nodo de la red puede informar en caso de fallo del dispositivo asociado, y en general sobre
cualquier anomalía asociada al dispositivo. Esta monitorización permite aumentar la
eficiencia del sistema y reducir la cantidad de horas de mantenimiento necesarias.
La principal ventaja que ofrecen los buses de campo, y la que los hace más atractivos a los
usuarios finales, es la reducción de costes. El ahorro proviene fundamentalmente de tres
fuentes: ahorro en coste de instalación, ahorro en el coste de mantenimiento y ahorros
derivados de la mejora del funcionamiento del sistema. Una de las principales
características de los buses de campo es una significativa reducción en el cableado
necesario para el control de una instalación. Cada célula de proceso sólo requiere un cable
para la conexión de los diversos nodos. Se estima que puede ofrecer una reducción de 5 a 1
en los costes de cableado. En comparación con otros tipos de redes, dispone de
herramientas de administración del bus que permiten la reducción del número de horas
necesarias para la instalación y puesta en marcha. El hecho de que los buses de campo sean
más sencillos que otras redes de uso industrial como por ejemplo MAP, hace que las
necesidades de mantenimiento de la red sean menores, de modo que la confiabilidad del
sistema a largo plazo aumenta. Además, los buses de campo permiten a los operadores
monitorizar todos los dispositivos que integran el sistema e interpretar fácilmente las
interacciones entre ellos. De esta forma, la detección de las fuentes de problemas en la
planta y su corrección resulta mucho más sencilla, reduciendo los costes de mantenimiento
y el tiempo de parada de la planta. Los buses de campo ofrecen mayor flexibilidad al
usuario en el diseño del sistema. Algunos algoritmos y procedimientos de control que con
sistemas de comunicación tradicionales debían incluirse en los propios algoritmos de
control, radican ahora en los propios dispositivos de campo, simplificando el sistema de
control y sus posibles ampliaciones. También hay que tener en cuenta que las prestaciones
del sistema mejoran con el uso de la tecnología de los buses de campo debido a la
simplificación en la forma de obtener información de la planta desde los distintos sensores.
Las mediciones de los distintos elementos de la red están disponibles para todos los demás
dispositivos. La simplificación en la obtención de datos permitirá el diseño de sistemas de
control más eficientes. Con la tecnología de los buses de campo, se permite la
comunicación bidireccional entre los dispositivos de campo y los sistemas de control, pero
también entre los propios dispositivos de campo. Otra ventaja de los buses de campo es
que sólo incluyen 4 capas (Física. Enlace. Aplicación y Usuario), y un conjunto de
servicios de administración. El usuario no tiene que preocuparse de las capas de enlace o
de aplicación. Sólo necesita saber cual es funcionalidad. Al usuario sólo se le exige tener
un conocimiento mínimo de los servicios de administración de la red, ya que parte de la

19
Estudio Situación Actual en la Industria.

información generada por dichos servicios puede ser necesaria para la reparación de
averías en el sistema. De hecho, prácticamente, el usuario sólo debe preocuparse de la capa
física y la capa de usuario.

I. Comunicación en el Bus:
Los métodos utilizados en los buses de campo para actualizar los datos de proceso o
entrada/salida son:
a. Strohe:
Petición de información por parte del maestro (dispositivo de control) y envío desde
los dispositivos esclavos (sensores - actuadores). Este método es muy eficiente para
sensores.
b. Polling:
El maestro envía información de salida al dispositivo y éste le responde con la
información de entradas.
c. Cambio de estado:
El dispositivo no transmite información hasta que se modifica el estado de las
variables. Muy eficiente en sistemas discretos.
d. Cíclico:
El dispositivo envía la información a la red en un intervalo de tiempo prefijado.
Además el bus de campo debe incorporar los servicios de comunicación necesarios
para los procesos de configuración, programación y test del bus.

II. Buses de Campo existentes:


Debido a la falta de estándares, diferentes empresas han desarrollado diferentes soluciones,
cada una de ellas con diferentes prestaciones y campos de aplicación. En una primera
clasificación podríamos dividirlos en los siguientes grupos:

i. Buses de alta velocidad y baja funcionalidad.


Diseñados para integrar dispositivos simples como finales de carrera, fotocélulas, relés y
actuadores simples, funcionando en aplicaciones de tiempo real, y agrupados en una
pequeña zona de la planta, típicamente una máquina. Suelen especificar las capas física y
de enlace del modelo OS1, es decir, señales físicas y patrones de bits de las tramas.
Algunos ejemplos son:

• CAN: Diseñado originalmente para su aplicación en vehículos.


• SDS: Bus para la integración de sensores y actuadores, basado en CAN
• ASI: Bus serie diseñado por Siemens para la integración de sensores y actuadores.

20
Estudio Situación Actual en la Industria.

ii. Buses de alta velocidad y funcionalidad media


Se basan en el diseño de una capa de enlace para el envío eficiente de bloques de datos de
tamaño medio. Estos mensajes permiten que el dispositivo tenga mayor funcionalidad de
modo que permite incluir aspectos como la configuración, calibración o programación del
dispositivo. Son buses capaces de controlar dispositivos de campo complejos, de forma
eficiente y a bajo coste. Normalmente incluyen la especificación completa de la capa de
aplicación, lo que significa que se dispone de funciones utilizables desde programas
basados en PC’s para acceder, cambiar y controlar los diversos dispositivos que
constituyen el sistema. Algunos incluyen funciones estándar para distintos tipos de
dispositivos (perfiles) que facilitan la interoperabilidad de dispositivos de distintos
fabricantes. Algunos ejemplos son:

• DeviceNet: Desarrollado por Alien-Bradley, utiliza como base el bus CAN, e


incorpora una capa de aplicación orientada a objetos.
• LONWorks Red desarrollada por Echelon.
• BitBus: Red desarrollada por INTEL.
• DIN MessBus: Estándar alemán de bus de instrumentación, basado en
comunicación RS-232.
• IntcrBus-S: Bus de campo alemán de uso común en aplicaciones medias.

iii. Buses de altas prestaciones


Son capaces de soportar comunicaciones a nivel de toda la factoría, en muy diversos tipos
de aplicaciones. Aunque se basan en buses de alta velocidad, algunos presentan problemas
debido a la sobrecarga necesaria para alcanzar las características funcionales y de
seguridad que se les exigen. La capa de aplicación oferta un gran número de servicios a la
capa de usuario- habitualmente un subconjunto del estándar MMS. Entre sus características
incluyen:
• Redes multi-maestro con redundancia.
• Comunicación maestro-esclavo según el esquema pregunta-respuesta.
• Recuperación de datos desde el esclavo con un límite máximo de tiempo
• Capacidad de direccionamiento unicast, multicast y broadcast.
• Petición de servicios a los esclavos basada en eventos.
• Comunicación de variables y bloques de datos orientada a objetos.
• Descarga y ejecución remota de programas.
• Altos niveles de seguridad de la red, opcionalmente con procedimientos de
autentificación.
• Conjunto completo de funciones de administración de la red.

Algunos ejemplos son:

• Profibus
• FIP
• Fieldbus Foundation
21
Estudio Situación Actual en la Industria.

iv. Buses para áreas de seguridad intrínseca.


Incluyen modificaciones en la capa física para cumplir con los requisitos específicos de
seguridad intrínseca en ambientes con atmósferas explosivas. La seguridad intrínseca es un
tipo de protección por la que el aparato en cuestión no tienen posibilidad de provoca una
explosión en la atmósfera circundante. Un circuito eléctrico o una parte de un circuito
tienen seguridad intrínseca, cuando alguna chispa o efecto térmico en este circuito
producidos en las condiciones de prueba establecidas por un estándar (dentro del cual
figuran las condiciones de operación normal y de fallo específicas) no puede ocasionar una
ignición. Algunos ejemplos son HART, Profibus PA o FIP.

2.4. Ejemplos de estudio.

2.4.1. Redes Map y Top


Para competir con las compañías japonesas fabricantes de automóviles, la General Motors
quería establecer una red que cubriera todas sus oficinas, fábricas, distribuidores y
proveedores. La idea central era que, cuando un cliente, localizado en cualquier parte del
mundo, ordenara un coche al distribuidor, éste le enviara inmediatamente su orden
mediante su ordenador conectado a la General Motors. A continuación la compañía
notificaría sus necesidades a sus proveedores. Una parte importante de la red de General
Motors fue la automatización de la fábrica, en la que todos los robots utilizados en las
líneas de ensamblado se conectarían por medio de una LAN. Dado que los coches
montados sobre la línea de ensamblado se mueven a una velocidad constante,
independientemente de si los robots están listos o no, se determinó que era fundamental
tener un límite superior del tiempo de transmisión en el peor caso. Ethernet no dispone de
dicha característica, es más un mensaje podría no llegar a enviarse nunca. Se optó por un
mecanismo de paso de testigo en bus (IEEE 802.4) en el que las máquinas van pasándose
el turno, produciendo así un comportamiento determinista. General Motors y otras
compañías con interés en la automatización de fábricas, vieron claramente la necesidad de
adoptar protocolos específicos en cada una de las capas OS1 para evitar incompatibilidades
posteriores. Este trabajo dio origen al Protocolo de Fabricación Automatizada (MAP), el
cual fue inicialmente adoptado con rapidez por varias compañías. Aproximadamente por la
misma época, la compañía Boeing se interesó en el establecimiento de normas para la
automatización de oficinas. Prefirió usar como base la red local Ethernet ya que no le
preocupaba un funcionamiento determinista de la misma (los aviones no se fabrican en
cadenas de montaje), y Ethernet estaba muy extendida. Sobre esta red local, Boeing
desarrolló un conjunto de protocolos orientados a la automatización de oficinas llamado
TOP (Protocolo Técnico y de Oficina), que varias compañías también adoptaron para la
automatización de sus propias oficinas. Los protocolos son TOP son muy similares a los de
redes de oficinas convencionales. Aunque MAP y TOP presentan diferencias en sus capas
inferiores, sus impulsores decidieron colaborar para asegurar que las capas de nivel medio
22
Estudio Situación Actual en la Industria.

y superior fueran totalmente compatibles. Las torres de protocolos de las redes MAP y
TOP siguen capa a capa el modelo OSI. La principal diferencia entre ambas redes está en
el medio físico y en el control de acceso al medio. Mientras las redes MAP sólo
contemplan el uso de paso de testigo en bus de acuerdo con el estándar IEEE 802.4, paso
de testigo en bus (Token Bus), la red TOP permite tanto el uso de Ethernet (o IEEE 802.3),
como de paso de testigo en anillo, Token Ring (IEEE 802.5). El resto de protocolos son
coincidentes. Para la capa de enlace, ambas redes se basan en el protocolo 802.2 (LLC) de
control lógico de enlace, operando en el modo sin conexión como un servicio ofrecido a la
capa de red. La capa de red utiliza el protocolo ISO 8473, que es muy parecido al
protocolo IP. La razón de esta elección es porque con el conocimiento que se tenía sobre la
interconexión de redes en ARPA (el origen de Internet), se demostró que el planteamiento
data grama es más flexible y robusto cuando se conectan redes heterogéneas múltiples, que
es un aspecto importante para las redes MAP y TOP. La capa de transporte se basa en el
protocolo ISO 8073. Se supone que la capa de red no es del todo fiable y gestiona el
control de error y de flujo. De esta forma MAP y TOP han podido conectarse a casi
cualquier tipo de red sin importar las deficiencias de éstas. El precio que se paga es la
necesidad de tener una capa de transporte complicada para ocuparse del servicio no fiable
de la red. Las capas de sesión y presentación utilizan los protocolos ISO 8327 e ISO 8823
respectivamente. Las normas OSI también se utilizan en la capa de aplicación,
particularmente el protocolo de transferencia de archivos y el de terminal virtual.

Ilustración 9: Protocolo MMPS

El protocolo MMPS, especialmente diseñado para aplicaciones industriales, establece un


servicio de mensajes entre controladores industriales para realizar las siguientes funciones:

• Acceso a variables
• Manejo de eventos
• Control de ejecución de los programas
• Comunicación con el operario
• Paso de ficheros
• Manejo de recursos comunes
• Acceso al estado de aparatos remotos
• Carga de programas
• Grabación histórica de eventos

23
Estudio Situación Actual en la Industria.

En una red MAP, en teoría, todos los nodos llevan implantadas las 7 capas del modelo de
referencia OSI.
El grado de complejidad que esto supone y el tiempo necesario para el intercambio de
unidades de protocolo de cada capa, ha provocado la aparición de una opción más sencilla,
que será estudiada en la sección 5.2.
MAP no cubre el nivel de bus de campo (estación y proceso), lo considera un nivel inferior
que se integra en la red mediante dispositivos inteligentes (PLC’s, PCs,...).Estos
dispositivos dispondrán de una conexión de enlace con MAP directamente o a través de
otro dispositivo. El MAP es un protocolo pensado para redes de tipo WAN incluye los
niveles de red, transporte, sesión y presentación. Esto le permite el fraccionamiento de
paquetes y el encaminamiento de los mismos a través de redes públicas o privadas. Lo que
resulta excesivamente costoso y complejo para pequeñas y medianas aplicaciones, sobre
todo para la interconexión de pequeños controladores a nivel industrial.
Basada en un bus con transmisión de banda ancha multicanal, que permite interconectar
los sistemas de control de planta con las aplicaciones de gestión, oficina, CAD.
Ordenadores de planta, canales de datos, voz, imágenes- ya sean estos locales o remotos.

2.4.1.1. Características de las redes MAP destacables:


• Todas las señales se transmiten moduladas en frecuencia
• Ancho de banda de 6 MHZ
• Número de nodos 10000 y distancia entre ellos 10 Km.

2.4.2. Redes MINIMAP.


Es el caso de MINI-MAP, que para agilizar las comunicaciones prescinde de las capas 3 a
la 6, como puede verse en la figura 10.

Ilustración 10: Capas MINIMAP

También se modificaron las capas física y de enlace. En la capa física se prescinde del
sistema de transmisión en banda ancha sobre cable coaxial y se pasa a una transmisión en
banda portadora, también sobre coaxial, que abarata enormemente el sistema de cableado y
sobre todo el interfaz de red que precisa cada dispositivo. Esto permite que pueda ser
24
Estudio Situación Actual en la Industria.

empleado con elementos de control en tiempo real de bajo coste. En la capa de enlace, en
el LLC (control lógico de enlace) se sustituye la norma IEEE 802.2 de tipo 1 por la IEEE
802.2 de tipo 3. Esta última proporciona los servicios de Envió de datos con acuse de
recibo y de Petición de datos con respuesta. Esto obliga a una interoperabilidad entre el
LLC y el MAC (mecanismo de detección y corrección de colisiones), teniendo este último
que incorporar la opción de prioridad de respuesta inmediata. Es decir, la estación que
transmite cede (junto con el mensaje que envía) el testigo a la receptora para que esta acuse
recibo o responda a la petición de datos de forma inmediata. Esto lógicamente permite
minimizar los tiempos de respuesta con el fin de ofrecer un buen servicio en tiempo real.
La capa de aplicación incorpora los mismos servicios MMS que MAP, lo que permite que
esta capa se pueda comunicar con una homologa en una red MAP a través de una pasarela
que incorpore las capas que le faltan a MINI-MAP.
La falta de la capa de red impide que haya comunicación extremo a extremo entre nodos
que se encuentran en segmentos separados por encaminadores (routers). Esto no plantea
ningún inconveniente puesto que elementos que han de trabajar en tiempo real deben
conectarse al mismo bus, para evitar las demoras que introducirían los elementos
intermedios.
Por otro lado, las funciones de la desaparecida capa de transporte son asumidas por el LLC
tipo 3 y el mapeado de las funciones entre el LLC y el MMS. Topología y estructura
lógica MINIMAP dispone de una topología de bus con un máximo de 64 nodos, pero
desde el punto de vista lógico funciona como un anillo. La codificación se realiza por
modulación de frecuencia en banda base y la transmisión de tipo síncrono. Cada estación
tiene asignada una dirección única e independiente de su situación física, formada por un
número de red (0 a 127) más un número de estación (0 a 62). El número de red 0 es para
arquitecturas
mono segmento y de I a 127 para multisegmento (varias MINIMAP integradas en una red
MAP).
Al inicializar la red, el testigo se le asigna a la dirección de la estación más alta y el paso
de testigo se realiza por orden decreciente de direcciones. Cuando un nodo recibe testigo
transmite y pasa el testigo, si no tiene mensajes que transmitir pasa el testigo. El tiempo de
posesión del testigo limitado a 800μs.

I. Protocolo:

Ilustración 11: Estructura de una trama MINIMAP

25
Estudio Situación Actual en la Industria.

Partes Constitutivas:
• Preámbulo 2 bytes: 55 hex. secuencia de 0 y I que se utiliza para la sincronización
y permite localizar el primer BIT útil.
• Inicio trama: carácter especial que depende de la codificación empleada
• Tipo de Trama 1 byte: MAC (Control de acceso al medio) y LLC (control lógico
de enlace)
• Direcciones destino/origen MAC: 6 bytes indican tipo de mensaje (punto a punto
o difundido), los nodos de destino u origen, el número de red y el tipo de servicio
(palabras comunes, memoria compartida,….)
• Datos/Control LLC: Contiene la códigos de registros o áreas de memoria de
origen y destino, así como el código de control LLC, que son ya propios de los
equipos de origen y destino del mensaje.
• CRC: 4 bytes para control de errores
• Fin de trama: al menos un BIT de error y un BIT que marca si es el final de
mensaje o se ha interrumpido por límite de tiempo en la posesión del testigo.
Como el acceso a la red es por paso de testigo y este se ejecuta por orden de mayor
dirección a menor, en caso de pérdida de testigo o arranque de la red una estación no
conoce la dirección de la estación que le precede o le sigue. Para esto existen
procedimientos de inicialización y reinicialización los que permiten crear una tabla con
esta información en cada estación.
Los procedimientos de inicialización y reinicialización se ejecutarán en los siguientes
casos:

• Arranque del sistema


• Eliminación de estaciones en la red
• Pérdida del testigo por error
• Periódicamente para detectar la inserción de nuevas estaciones

El formato de la pila de protocolos de la capa de aplicación es muy similar al del MAP


solo que aquí al MMPS se lo denomina MMS y desempeña las mismas tareas que el
anterior.

2.4.3. Ethernet Industrial.


El protocolo Industrial Ethernet, es una solución abierta estándar para la interconexión de
redes industriales que aprovecha los medios físicos y los chips de comunicaciones Ethernet
comerciales. Si se tiene en cuenta que la tecnología Ethernet se utiliza desde mediados de
los años setenta y su gran aceptación en el mundo, no es de extrañar que Ethernet brinde la
mayor comunidad de proveedores del mundo. Al utilizar Ethernet, no solo se sigue con una

26
Estudio Situación Actual en la Industria.

tendencia tecnológica actual, sino que, además, se posibilita obtener acceso a datos en el
nivel de los dispositivos de control mediante Internet.

• Ethernet Industrial es una red abierta que utiliza:


• El estándar de comunicación física y de datos IEEE 802.3
• El conjunto de protocolos TCP/IP
• El protocolo de control e información (CIP)

TCP/IP es el protozoo de nivel de transporte y red de Internet y suele estar vinculado con
las instalaciones Ethernet y el mundo de los negocios. TCP/IP proporciona una serie de
servicios que puede utilizar cualquier pareja de dispositivos para compartir datos. Dado
que la tecnología Ethernet y los conjuntos de protocolos estándar como TCP/IP han sido
proporcionados para uso público, se han producido en forma masiva y pueden conseguirse
fácilmente medios físicos y herramientas de software estandarizadas, con lo que puede
tenerse las ventajas de una tecnología conocida y una gran facilidad de acceso.
El UDP/IP protocolo de data grama de usuario) también se utiliza junto con la red
Ethernet. Este protocolo proporciona un transporte de datos rápido y eficiente,
características necesarias para el intercambio de información en tiempo real.
Para que Ethernet industrial tenga éxito se ha agregado el protocolo CIP al conjunto
TCP/UDP/1P con el fin de proporcionar un nivel de aplicaciones común.
Con la introducción de la tecnología de conmutación de Ethernet (switch) y la transmisión
de datos fuIl-Duplex, se minimizan las colisiones de dalos y el rendimiento en la red
aumenta drásticamente.
Por lo general, una red Ethernet utiliza una topología estrella activa en la que los grupos
de dispositivos están conectados punto a punto con un conmutador. La ventaja de una
topología tipo estrella radica en la compatibilidad con los productos de 10 y 100 Mbps
Puede combinar dispositivos de 10 y 100 Mbps Y el conmutador Ethernet negociará la
velocidad. Asimismo, la topología estrella le ofrece conexiones fáciles de cablear o de
depurar, o en las que resulta fácil delectar fallos o llevar a cabo tareas de mantenimiento.
Ethernet Industrial permite cubrir grandes distancias, la sea a nivel de una LAN: con
tecnología de Switching hasta 200 Km. O bien extendiéndose a una WAN, en todo el
mundo, mediante protocolo TCP/IP.
La ilustración 12 muestra un resumen de las características técnicas de Ethernet Industrial.

27
Estudio Situación Actual en la Industria.

Ilustración 12: Características técnicas de la Ethernet Industrial.

Los dos protocolos más usados son ISO, según normas ISO 8073, y este está optimizado
para la transferencia de variables para servicios y observación en tiempo real. Bajo este
protocolo resulta difícil de realizar encaminamiento (routing) a través de distintas redes por
este motivo se utiliza solo en el ámbito de LAN's.
El otro protocolo utilizado ese muy conocido TCP/IP , optimizado para la transferencia de
grandes cantidades de datos, y este caso si es más fácil y económico el ruteo entre distintas
redes, se utilizan en redes LAN estructuradas y en WAN. Esto permite el uso de
tecnológicas de información IT, como SNMP (protocolo de administración de redes), http
(protocolo de transferencia hipertexto), servicios WEB, etc.
Ethernet Industrial ha sido diseñada para gestionar grandes cantidades de datos de
transmisión de mensajes, hasta 1500 bytes por paquete. Permite la gestión de grandes
volúmenes de datos en modo previsible. Gracias a la gran aceptación de la tecnología
Ethernet en los últimos años, el costo por nodo de dispositivos Ethernet está disminuyendo
rápidamente.

28
Estudio Situación Actual en la Industria.

2.4.4. PROFIBUS:

Ilustración 13: Distribución PROFIBUS.

En el año 1987, las firmas alemanas Bosch, Klóckner Móeller y Siemens iniciaron un
proyecto de desarrollo de una arquitectura de comunicaciones industriales que permitiera
la interconexión de equipos de distintos fabricantes. Esta fue la base de un grupo de trabajo
al que se integraron otras grandes empresas tales como ABB, AEG, Landis&Gír. etc.,
algunas universidades y organizaciones técnicas estatales, entre ellas la propia VDE y el
Ministerio Federal de Investigación Alemán. Se formaron varios grupos de trabajo en
distintas áreas, cuya tarea esencial fue la de desarrollar un sistema abierto de
comunicaciones apto para integrar desde los sencillos transductores y elementos de campo,
pasando por los autómatas y controles numéricos hasta llegar al nivel de los
miniordenadores para diseño y gestión de la producción. El primer objetivo fue sólo el
diseño de un bus de campo con una estructura abierta y un protocolo compatible que
permitiera enlazar con una red adoptada como base en los niveles superiores (MAP).
A partir del año 1990 se abrió la posibilidad para cualquier usuario o empresa de
integrarse en un consorcio denominado PROFIBUS Nutzerorganisation, que a través de
diversos comités sigue desarrollando y dando soporte al nivel de aplicación y certificación
de productos. PROFIBUS es actualmente el líder de los sistemas basados en
buses de campo en Europa y goza de una aceptación mundial. Sus áreas de aplicación
incluyen manufacturación, automatización y generación de procesos.
Profibus especifica las características técnicas y funcionales de un sistema basado en un
bus de campo serie en el que controladores digitales descentralizados pueden ser
conectados entre sí desde el nivel de campo al nivel de control. Se distinguen dos tipos de
dispositivos, dispositivos maestros, que determinan la comunicación de datos sobre el bus.
Un maestro puede enviar mensajes sin una petición externa cuando posee el control de
29
Estudio Situación Actual en la Industria.

acceso al bus (el testigo). Los maestros también se denominan estaciones activas en el
protocolo Profibus. Como segundo tipo están los dispositivos esclavos, que son
dispositivos periféricos. Los esclavos son normalmente dispositivos de E/S, válvulas,
actuadores y transmisores de señal. No tienen el control de acceso al bus y sólo pueden
recibir mensajes o enviar mensajes al maestro cuando son autorizados para ello. Los
esclavos también son denominados estaciones pasivas, por lo que sólo necesitan una parte
del protocolo del bus.
PROFIBUS es un bus de campo normalizado internacional que fue estandarizado bajo la
norma EN 50 170. Esto asegura una protección óptima tanto a los clientes como a los
vendedores y asegura la independencia de estos últimos. Hoy en día, todos los fabricantes
líderes de tecnología de automatización ofrecen interfaces PROFIBUS para sus
dispositivos.

2.4.4.1. Estructura
La tecnología de transmisión más usada es la RS 485, conocida habitualmente como H2.
Su área de aplicación comprende aquellas aplicaciones donde prima su
simplicidad, la velocidad de transmisión y lo barato de la instalación. Se usa un par
diferencial con cable trenzado, previsto para comunicación semi-duplex, aunque
también puede implementarse con fibra óptica y enlaces con estaciones remotas vía
módem o vía radio. La velocidad de transmisión varía entre 9.6Kbits/s y 12Mbits/s,
dependiendo del medio físico, como se indica en la siguiente tabla:
Al conectar varias estaciones, hay que comprobar que el cable de las líneas de datos no sea
trenzado. El uso de líneas apantalladas es absolutamente esencial para el logro de una alta
inmunidad del sistema en ambientes con emisiones altas de
electromagnetismo (como en la fabricación de automóviles). El apantallamiento se usa
para mejorar la compatibilidad electromagnética (CEM).

Ilustración 14: Estructura PROFIBUS

30
Estudio Situación Actual en la Industria.

2.4.4.2. Configuración física del Bus.


Básicamente se dispone de dos tipos de estaciones: MAESTRAS (activas): que pueden
controlar el bus y transferir mensajes sin una petición remota, si está en posesión del
"testigo". (CJ1W-PRM21) ESCLAVAS (pasivas): sólo pueden reconocer mensajes
recibidos o transferir datos después de una petición remota. (CJ1W-PRT21, variadores,
controladores de cualquier tipo, E/S descentralizadas, etc.)
La configuración mínima constará de dos estaciones, siempre una de ellas como unidad
MAESTRA.
El número máximo de estaciones es de 32 y si usamos repetidores, podemos llegar a 127.
La distancia máxima y la velocidad de comunicación están ligadas de forma inversa.
Además de los dos tipos de estaciones anteriores, en una red PROFIBUS, pueden
encontrarse otros dos tipos:
• Expansiones E/S: este tipo de bloques constituyen la interfaz con las señales de
proceso y pueden estar integrados tanto en un nodo activo como en un nodo pasivo.
• Repetidores: los repetidores ejecutan el papel de simples transceptores
bidireccionables para regenerar la señal. Están especialmente pensados para largas
distancias de bus.
El cableado a realizar en la instalación puede ser de tipo ANILLO ó ABIERTO. En ambos
casos habrá que respetar la entrada y salida de señal al conectar el cable en los conectores y
si la instalación es de tipo abierto, se conectarán las resistencias de INICIO y FINAL de
línea en los conectores de los extremos

Ilustración 15: Ejemplo de módulo preparado para funcionar con PROFIBUS.

2.4.4.3. Versiones Compatibles.


31
Estudio Situación Actual en la Industria.

PROFIBUS es un bus de campo estándar que soporta un amplio rango de aplicaciones en


fabricación, procesado y automatización. Con PROFIBUS los componentes de distintos
fabricantes pueden comunicarse sin necesidad de ajustes especiales de interfaces. Puede ser
usado para transmisión crítica en el tiempo de datos a alta velocidad y para tareas de
comunicación extensas y complejas. Esta versatilidad viene dada por las tres versiones
compatibles que componen la familia PROFIBUS:

Ilustración 16: Arquitectura del Protocolo.

I. PROFIBUS PA:
Es un protocolo derivado PA, derivado de Process Automation, es un subconjunto de este
estándar, orientado a las comunicaciones de instrumentos de proceso. Es decir, equipos que
transmiten señales análogas como presión, temperatura, y otros. Está diseñada
especialmente para la automatización de procesos. Permite la conexión de sensores y
actuadores en una línea de bus común, incluso en zonas intrínsecamente seguras. Profibus
PA permite disponer de comunicación de datos y potencia en un mismo bus utilizando una
tecnología de dos hilos según el estándar internacional IEC 1158-2.
• Diseñado para automatización de procesos.
• Permite la conexión de sensores y actuadores a una línea de bus común incluso en
áreas especialmente protegidas.
• Permite la comunicación de datos y energía en el bus mediante el uso de 2
tecnologías (norma IEC 1158-2).

32
Estudio Situación Actual en la Industria.

Ilustración 17: PROFIBUS PA.

II. PROFIBUS DP:


Esta versión de Profibus, optimizada para una conexión económica y de alta velocidad,
está diseñada especialmente para la comunicación entre los sistemas de control de la
automatización y la E/S distribuidas a nivel del dispositivo. Profibus Dp puede utilizarse
para sustituir las transmisiones de señales paralelas de 24V a 20 mA.
• Optimizado para alta velocidad.
• Conexiones sencillas y baratas.
• Diseñada especialmente para la comunicación entre los sistemas de control de
automatismos y las entradas/salidas distribuidas.

Ilustración 18: PROFIBUS DP.

33
Estudio Situación Actual en la Industria.

III. PROFIBUS FMS:


Profibus FMS es la solución de aplicación general para las tareas de comunicación de la
célula. Los eficaces servicios FMS aportan una amplia gama de aplicaciones y
proporcionan una gran flexibilidad, también se puede utilizar para tareas de comunicación
complejas de gran alcance.
Especifica las características técnicas y funcionales de un sistema de bus de campo serie
con el que se pueden conectar en red controladores digitales descentralizados desde el
nivel del campo hasta el nivel de la célula. Distingue entre dispositivos maestros y
dispositivos esclavos.
Los dispositivos maestros determinan la comunicación de datos en el bus. Un maestro
puede enviar mensajes sin una solicitud externa cuando posee los derechos de acceso al
bus (el testigo). Los maestros también se denominan 'estaciones activas' en el protocolo
Profibus.
Los dispositivos esclavos son dispositivos periféricos. Los dispositivos esclavos comunes
incluyen dispositivos de entrada/salida, válvulas, accionamientos y transmisores de
medición. No tienen derechos de acceso al bus y sólo pueden reconocer mensajes recibidos
o enviar mensajes al maestro cuando se solicita que lo hagan. Los esclavos también se
denominan 'estaciones pasivas'.

Ilustración 19: PROFIBUS FMS.

Puede decirse sin lugar a dudas que PROFIBUS ha conseguido definir toda una red de
comunicación industrial, desde el nivel físico hasta el de aplicación, superando
ampliamente los límites de un bus de campo, integrando al máximo las técnicas de
comunicación previamente definidas y consolidadas En la actualidad la estructura es tal
que los grupos de los 20 países más industrializados ofrecen un soporte en su idioma para
el resto del mundo. Todos los grupos de usuarios se unen bajo la Organización PROFIBUS
International (Pl), que con más de 750 miembros es la organización de buses de campo
más grande del mundo.

34
Estudio Situación Actual en la Industria.

2.4.4.4. Estructura de la red.


La tecnología de transmisión más usada es la RS 485, conocida habitualmente como H2.
Su área de aplicación comprende aquellas aplicaciones donde prima su simplicidad, la
velocidad de transmisión y lo barato de la instalación. Se usa un par diferencial con cable
trenzado, previsto para comunicación semi-duplex, aunque también puede implementarse
con fibra óptica y enlaces con estaciones remotas vía módem o vía radio. La velocidad de
transmisión varía entre 9.6Kbíts/s y 2Mbits/s, dependiendo del medio físico, como se
indica en la tabla siguiente.
Al conectar varias estaciones, hay que comprobar que el cable de las líneas de datos no sea
trenzado. El uso de líneas apantalladas es absolutamente esencial para el logro de una alta
inmunidad del sistema en ambientes con emisiones altas de electromagnetismo. El
apantallamiento se usa para mejorar la compatibilidad electromagnética (CEM).

I. Elementos de Bus.
El elemento esencial del bus es el nodo. PROFIBUS prevé la existencia de dos tipos de
nodos:
• Activos: son nodos que pueden actuar como maestro del bus, tomando
enteramente el control del bus.
• Pasivos: son nodos que únicamente pueden actuar como esclavos y, por tanto, no
tienen capacidad para controlar el bus. Estos nodos pueden dialogar con los nodos
activos mediante un simple mecanismo de pregunta-respuesta, pero no pueden
dialogar directamente entre sí. Aparte de estos dos tipos de nodos, existen otros
dos bloques esenciales en la arquitectura del bus:
• Expansiones E/S: este tipo de bloques constituyen la interfaz con las señales de
proceso y pueden estar integrados tanto en un nodo activo como en un nodo
pasivo.
• Repetidores: los repetidores ejecutan el papel de simples transceptores
bidireccionables para regenerar la señal.

II. Topología.
La topología puede ser simplemente en forma de bus lineal o en forma de árbol, en el que
los repetidores constituyen el nudo de partida de una expansión del bus (ilustración 20).
Este caso, la estructura en árbol es puramente una impresión de dibujo, ya que el
PROFIBUS admite una estructura lógica de maestro flotante y una estación activa,
ejerciendo el papel de maestro, que puede estar físicamente conectada a lo que se pudiera
considerar una expansión del bus. Por tanto, incluso en caso de ramificaciones debe
considerarse como un bus único. El número máximo de nodos conectables a cada tramo
del bus, sin necesidad de repetidores es de 32.

35
Estudio Situación Actual en la Industria.

Ilustración 20: Topología.

A efectos de esta limitación los propios repetidores cuentan como un


nodo. El número máximo de nodos del bus es de 127, de los cuales un máximo de 32
pueden ser nodos activos. No existe ninguna limitación en cuanto a poder configurar una
estructura con buses anidados (un esclavo puede ser, a su vez, maestro de otro bus de nivel
inferior), aunque deben considerarse como buses independientes, dado que el protocolo no
permite direccionar desde arriba las estaciones de niveles inferiores.

III. Estructura lógica.


La estructura lógica es de tipo híbrido: las estaciones activas comparten una estructura de
maestro flotante, relevándose en el papel de maestro mediante paso de testigo. Las
estaciones pasivas sólo pueden ejercer el papel de esclavos, sea cual sea el maestro activo
en cada momento. La ilustración 21 ilustra esta estructura.

Ilustración 21: Estructura lógica.

Naturalmente esta estructura admite la posibilidad de que exista un solo nodo activo en el
bus, con lo que se convertiría en un bus con una estructura del tipo maestro-esclavo. Cabe
señalar que cuando una estación activa posee el testigo, considera a todas las demás como

36
Estudio Situación Actual en la Industria.

esclavos, incluyendo también al resto de estaciones activas que no poseen el testigo en


aquel momento.

2.4.4.5. Tecnología de transmisión.


El área de aplicación de un sistema de buses de campo está claramente determinada por la
elección de la tecnología de transmisión. Aparte de los requerimientos generales (seguridad
de transmisión, distancia de la misma, velocidad) cobran particular importancia los
factores electromecánicos. Cuando se mezclan aplicaciones para automatización de
procesos, los datos y la energía deben ser transmitidos en un cable común. Como es
imposible satisfacer todos los requerimientos con una tecnología de transmisión sencilla.
PROFIBUS aprovecha 3 variaciones:

I. RS 485 (Transmisión para DP/FMS).


Es la transmisión más frecuentemente utilizada por PROFIBUS. Esta tecnología de
transmisión es conocida como H2. Su área de aplicación incluye todas las áreas en las que
se requieren alta velocidad de transmisión y una instalación sencilla. Tiene la ventaja de
que posibles ampliaciones no influyen en las estaciones que se encuentran ya en operación.
Algunas de sus características son:
• Velocidad de transmisión de 9.6 Kbit/seg. a 12 Mbit/seg. Se seleccionará una
para todos los dispositivos.
• La estructura de la red es linear, con par trenzado.
• Conexión máxima de 32 estaciones sin repetidor (127 con repetidor).
• Longitud máxima del cable dependiente de la velocidad de transmisión.

Ilustración 22: Distancias basadas en la velocidad de transmisión.

En la conexión, es conveniente tener en cuenta algunas precauciones, de las que son


destacables:
• Se recomienda el uso de líneas de datos escudadas para mejorar la
compatibilidad electromagnética (EMC).

37
Estudio Situación Actual en la Industria.

• Se recomienda mantener las líneas de datos separadas de los cables de alto


voltaje.

II. IEC 1158-2 (Transmisión PA).


La tecnología de transmisión IEC 1158-2 cumple los requerimientos de las industrias
químicas y petroquímicas.
Posee una seguridad intrínseca y permite a los dispositivos de campo ser conectados al
bus. Es una tecnología principalmente usada por PROFIBUS PA y suele conocerse como
HI.
• La transmisión se basa en los siguientes principios:
• Cada segmento tiene sólo una fuente de energía.
• No se produce ningún tipo de alimentación cuando una estación está enviando
datos.
• Los dispositivos actúan como sumideros pasivos de corriente.
• Se permiten redes con estructura linear, en árbol y estrella.
• Para incrementar la Habilidad, se pueden diseñar segmentos de bus redundantes.

Las características más importantes de este tipo de transmisión son:


• Transmisión de datos digital, asíncrona, codificación Manchester.
• Velocidad de transmisión 31.25 Kbit/seg.
• Seguridad de los datos: prueba de error al principio y al final.
• Cable de dos líneas trenzadas.
• Opción de alimentación a distancia.
• Conexión de 32 estaciones por segmento (máximo de 126 con repetidor).
• Posibilidad de expansión hasta a 4 repetidores.
• La estructura de la red es linear, en árbol o una combinación de ambas.

Ilustración 23: IEC 1158-2.

38
Estudio Situación Actual en la Industria.

III. Fibra óptica.


Los conductores por fibra óptica pueden ser usados para aplicaciones PROFIBUS en
ambientes con interferencias electromagnéticas muy altas y para incrementar la distancia
máxima con velocidades elevados. Hay disponibles dos tipos de conductores. Los
conductores por fibra óptica (plástico) para distancias de 50m. o los conductores por fibra
óptica (cuarzo) para distancias de I Km. Son muy baratos. Muchos fabricantes ofrecen
conexiones especiales que posibilitan una conversión integrada de señales RS 485 para
trabajar con conductores de fibra óptica y viceversa. Esto proporciona un método muy
sencillo de intercambio entre transmisión RS 485 y transmisión por fibra óptica en un
mismo sistema.

Ilustración 24: Estructura con fibra óptica.

2.4.5. AS-I AKTUATOR SENSOR INTERFACE.


AS-i es un bus de campo desarrollado inicialmente por Siemens, para la interconexión de
actuadores y sensores binarios. Actualmente está recogido por el estándar IEC TG 17B.
A nivel físico, la red puede adoptar cualquier tipo de topología: estructura en bus, en árbol,
en estrella o en anillo, como muestra la ilustración 25.

Ilustración 25: Topologías.

39
Estudio Situación Actual en la Industria.

Permite la interconexión de un máximo de 31 esclavos. La longitud máxima de cada


segmento es de 100 metros. Dispone de repetidores que permiten la unión de hasta tres
segmentos, y de puentes hacia redes Profibus. Como medio físico de transmisión, emplea
un único cable que permite tanto la transmisión de datos como la alimentación de los
dispositivos conectados a la red. Su diseño evita errores de polaridad al conectar nuevos
dispositivos a la red. La incorporación o eliminación de elementos de la red no requiere la
modificación del cable.
El cable consta de dos hilos sin apantallamiento. Para lograr inmunidad al ruido, la
transmisión se hace basándose en una codificación Manchester. La señal con la
codificación Manchester se traduce en pulsos de corriente, que producen pulsos positivos y
negativos en la tensión de alimentación, que indican las transiciones en la señal. A partir de
la detección de dichas transiciones se reconstruye la secuencia de bits transmitida, como
muestra la figura 16.

Ilustración 26: Codificación de la información en el Bus AS-i.

Cada esclavo dispone de hasta 4 entradas/salidas, lo que hace que la red pueda controlar
hasta 124 E>'S digitales. La comunicación sigue un esquema maestro -esclavo, en la cual
el maestro interroga a las estaciones enviándoles mensajes (llamados telegramas) de 14 bits
y el esclavo responde con un mensaje de 7 bits. La duración de cada ciclo pregunta-
respuesta es de 150 us. En cada ciclo de comunicación se deben consultar todos los
esclavos, añadiendo dos ciclos extras para operaciones de administración del bus
(detección de fallos). El resultado es un tiempo de ciclo máximo de 5ms. Como muestra la
Ilustración 27.

40
Estudio Situación Actual en la Industria.

Ilustración 27: Tiempos de ciclo.

2.4.6. INTERBUS.
INTERBUS es un bus de campo para la interconexión de sensores y actuadores. Las partes
claves de INTERBUS han sido estandarizadas en Alemania por la DKE (Deutsche
Elektrotechnische Kommission para DIN y VDE).
INTERBUS se basa en un esquema maestro-esclavo. El maestro del bus actúa
simultáneamente como interfaz con los niveles superiores de la jerarquía de
comunicaciones.
La topología es de anillo, es decir, todos los dispositivos están conectados formando un
camino cerrado. El anillo principal es el que parte del maestro, aunque pueden formarse
otros anillos para adaptarse a la estructura particular de cada sistema. Este tipo de
conexiones se lleva a cabo mediante unos equipos denominados módulos terminadores de
bus.
Un rasgo distintivo de INTERBUS es que las líneas de envío y recepción de datos están
contenidas dentro de un mismo cable que une todos los dispositivos. De esta forma, el
sistema tiene el aspecto físico de un bus o un árbol. Típicamente, la capa física se basa en
el estándar RS-485. Debido a la estructura de anillo y a que es necesario transportar la
masa de las señales lógicas, INTERBUS requiere un cable de cinco hilos para interconectar
dos estaciones. Con velocidades de transmisión de 500 Kbits, pueden alcanzarse distancias
de hasta 400 m entre dispositivos. Cada dispositivo incorpora una función de repetidor que
permite extender el sistema hasta una longitud total de 13 Km. Para facilitar el
funcionamiento de INTERBUS, el número máximo de estaciones está limitado a 512.
La estructura punto a punto de INTERBUS y su división en anillo principal y sub-anillos
es ideal para la incorporación de distintos medios de transmisión en distintas zonas de la
41
Estudio Situación Actual en la Industria.

planta si esto fuese necesario. La estructura de anillo ofrece dos ventajas. La primera es
que permite el envío y recepción simultánea de datos (full dúplex).

Ilustración 28: Estructura INTERBUS.

En segundo lugar, la capacidad de autodiagnóstico del sistema se ve mejorada, ya que la


conexión de cada nodo a la red es activa. INTERBUS permite la detección preventiva de
errores por medio de una evaluación estadística de la calidad de las transmisiones. La
determinación de la frecuencia de los errores de transmisión permite prever la aparición de
fallo en un componente de la red.
Para facilitar la detección de errores y la puesta en marcha del sistema, INTERBUS
permite la desconexión transparente de los sub-anillos conectados al anillo principal. El
direccionamiento se basa en la posición física de cada sistema dentro del anillo, aunque
opcionalmente se dispone de la posibilidad del empleo de direcciones lógicas para acceder
a dispositivos individuales independientemente de su posición.
El protocolo de transmisión de INTERBUS se estructura en tres capas que se corresponden
con capas del modelo OSI. La capa 1 es la capa física. Especifica aspectos como la
velocidad, modos de codificación de la señal física, etc. La capa 2 se corresponde con la
capa de enlace. Garantiza la integridad de los datos y permite el soporte de dos tipos de
42
Estudio Situación Actual en la Industria.

datos, por una parte los datos correspondientes a procesos cíclicos, y por otra parte datos
que aparecen asincrónicamente. La capa de enlace es determinista, es decir, garantiza un
tiempo máximo para el transporte de datos entre dispositivos. El control de acceso al
medio se encuadra dentro de los mecanismos TDMA (Time División Múltiple Access),
eliminando así la posibilidad de colisiones. Cada dispositivo tiene reservado un slot de
tiempo adecuado para su función dentro del sistema. El tiempo de ciclo es la suma de los
tiempos asignados a cada dispositivo. Pueden definirse slots adicionales para la
transmisión de bloques de datos en modo conexión. De esta forma pueden enviarse grandes
bloques de datos a través de INTERBUS, sin alterar el tiempo de ciclo para los datos de
proceso. Otra ventaja importante que incorpora este tipo de control de acceso al medio, es
que Iodos los elementos insertan sus datos en el bus simultáneamente, lo que garantiza que
las mediciones en las que se basan los bucles de control, fueron realizadas
simultáneamente.
Este mecanismo también reduce la sobrecarga con información correspondiente al
protocolo, con lo que la eficiencia que se alcanza es alta.
La trama se forma por concatenación de los datos de cada estación. De forma física se
realiza mediante un registro. Cada dispositivo se une al anillo mediante un registro cuya
longitud depende de la cantidad de información que debe transmitir. Los datos
provenientes de las distintas estaciones van llegando al master en función de su posición
dentro del anillo. Cada ciclo de transmisión comienza con una secuencia de datos que
contiene la palabra de loopback seguida de los datos de salida de los distintos dispositivos,
en la línea de salida. Durante el envío de dalos, el flujo de retomo entra el maestro como
flujo de entrada. Tras el envío de la trama completa, se envía un CRC de 32 bits. Debido a
la estructura de conexiones punto a punto, el cálculo siempre se hace entre cada dos nodos,
por lo que no es necesario dar una vuelta completa al anillo. Por último se envía una
palabra de control para indicar el estado de cada dispositivo (detección de errores de
transmisión, etc.). Si no hubo errores comienza un nuevo ciclo, como se ve en el esquema
de la figura 18.
Además de los ciclos de datos, también hay ciclos de identificación. Este ciclo permite la
administración del bus. Cada dispositivo tiene un código de identificación que indica el
tipo de dispositivo de que se trata, y el tamaño de su bloque de datos. La configuración del
bus se lleva a cabo por una secuencia de ciclos de identificación en los que el maestro
comienza a leer en orden, la identificación de los dispositivos conectados. En función de
estas lecturas se configura la trama que circulara en el ciclo de datos. Desde el punto de
vista físico INTERBUS funciona según un procedimiento asíncrono de arranque y parada.
Se envía una cabecera que contiene información adicional como por ejemplo los
delimitadores de trama, código de función y tipo de mensaje, junto con ocho bits de datos
adicionales. Los momentos de inactividad se ocupan con mensajes de estado. No contienen
datos de la capa de enlace y sólo sirven para garantizar una actividad permanente en el
medio de transmisión. Si dicha actividad se interrumpe durante más de 20 ms., se
interpreta por todos los dispositivos como una caída del sistema. En respuesta a esta
situación, los dispositivos se desconectan de la red y van a un punto seguro definido con
antelación.
43
Estudio Situación Actual en la Industria.

La tercera de las capas de INTERBUS corresponde la capa de aplicación.


En el maestro se ejecuta de forma cíclica un programa que actualiza continuamente los
datos correspondientes a los distintos procesos conectados a la red, y los deja accesibles
para el sistema de control, de modo que por ejemplo un PLC puede acceder a ellos de
forma sencilla mediante instrucciones de entrada/salida. El uso de técnicas de acceso
directo a memoria evita el uso de servicios que necesitan grandes bloques de datos, lo que
facilita la consecución del tiempo real. El acceso desde ordenadores se realiza mediante
drivers.
INTERBUS implementa en la capa de aplicación un subconjunto de servicios basados en
MMS que se denomina PMS (Peripherals Message Specífication). Incluye unos 25
servicios que permiten la comunicación con dispositivos de proceso inteligentes. Estos
servicios permiten por ejemplo el establecimiento y monitorización de conexiones, lectura
y escritura de parámetros o la ejecución remota de programas

2.4.7. CAN: COTROLLER AREA NETWORKING.


CAN es un bus de comunicaciones serie estandarizado por [SO, que fue desarrollado
inicialmente a finales de los 80 para la industria del automóvil. En su especificación básica,
se exigía alta velocidad, alta inmunidad al ruido y capacidad para la detección de cualquier
tipo de error. Con el tiempo, CAN ha pasado de la industria automovilística a la
fabricación y a la industria aeronáutica.
Los protocolos definidos por CAN se ajustan a la especificación OSI. CAN define sólo las
dos capas más bajas: física y de enlace. Otras redes como SDS o DeviceNet proporcionan
especificaciones de la capa de aplicación sobre la base de CAN.
El medio físico consiste en un cable de par trenzado con los terminadores adecuados. En la
especificación básica de CAN, la velocidad máxima de transmisión es de 250 Kbps,
mientras que en la versión ampliada alcanza velocidades de I Mbps
La implementación básica de CAN presenta un fuerte acoplamiento entre la CPU y el
controlador CAN (que implementa los protocolos de capa física y de enlace). Los mensajes
son difundidos por toda la red y son comprobados por la CPU de cada una de las
estaciones que la forman. Este tipo de funcionamiento disminuye el aprovechamiento de la
velocidad de transmisión de la red. En la versión conocida como "Full CAN", el
controlador de red incorpora un filtro de selección de mensajes en base a un campo de
identificación. De esa forma la CPU sólo recibirá aquellos mensajes que le interesen.
Philips es el principal líder de la versión básica de CAN, mientras que Intel y Siemens
lideran la versión completa.
Full CAN permite dos tamaños distintos de identificadores de mensajes: la versión A
permite identificadores de 11 bits (2032 identificadores) figura 19, mientras que la versión
extendida (B) tiene identificadores de 29 bits, figura 20.
La capa de enlace define el formato y la temporización usada para la transmisión de los
mensajes. Las tramas CAN tienen dos bytes descriptores y hasta 8 bytes de datos. Los
descriptores definen la prioridad de los mensajes y su tipo. El primer campo, o campo de
arbitraje está formado por los 11 bits del identificador (en tramas tipo A) y el bit RTR. Si

44
Estudio Situación Actual en la Industria.

RTR vale 0, indica que se trata de una trama de datos, mientras que si vale 1 indica que se
trata de una petición de datos. En ese caso, el campo de datos indicará los bytes que
formarán la respuesta.

Ilustración 29: Trama tipo A.

El campo de control está formado por 6 bits. Los bits rl y r0 están reservados para futuras
ampliaciones del protocolo. Los cuatro bits que forman el DLC indican el número de bytes
que forman la trama de datos y que van a continuación.
El campo de datos contiene de cero a ocho bytes. El bit más significativo de cada byte es
el primero que se transmite. A continuación hay un campo de CRC, que contiene un
código de redundancia cíclica de 15 bits y un bit delimitador que siempre vale 1. El campo
de acuse de recibo consiste en dos bits. El primer bit se envía a I y es puesto a cero por las
estaciones que reciben correctamente el mensaje. El segundo es un bit delimitado que vale
I. El delimitador de final de trama consiste en 7 bits a 1. Tras cada trama hay un periodo de
tres bits (deben estar a 1), destinado a dar un tiempo mínimo a las estaciones a prepararse
para la recepción o envío de otro mensaje.
Las tramas de tipo B se diferencian en el campo de arbitraje. En este caso hay un primer
grupo de 11 bits similar al de las tramas de tipo A, y que actúa como valor base del
identificador. La segunda parte de los identificadores (18 bits) es la extensión del
identificador.
Para distinguir ambos formatos, la trama tipo B incorpora dos bits que separan los dos
trozos del identificador. El primero es el bit SRR (Substitute Remote Request). Se envía
siempre a 1 para dar prioridad a las tramas de datos estándar de tipo A con el mismo
identificador base. El bit IDE que sigue al bit SRR se envía siempre a 1, y permite
distinguir tramas tipo A y tipo B.

45
Estudio Situación Actual en la Industria.

Ilustración 30: Mecanismo de acceso al medio.

Una característica fundamental de CAN es que cuanto menor sea el identificador del
mensaje mayor es su prioridad Si dos nodos intentan transmitir simultáneamente, el
primero que envíe un cero cuando el otro intente enviar un I obtendrá el acceso al medio,
ya que el valor cero es dominante frente al valor I. Como cada estación es capaz de
monitorizar el medio físico, podrá detectar si su trama ha sido sobrescrita por otra de
mayor prioridad (que permanece inalterada). La estación que no ha podido enviar el
mensaje, reintentará el envío en cuanto detecte un periodo de inactividad, como puede
verse en la figura 21. Las ventajas de este mecanismo de acceso son la minimización del
retardo en el acceso al no tener que esperar por el tumo como sucede en un sistema de paso
de testigo, y la mejora de la eficiencia al evitar las colisiones destructivas. Los mensajes
son enviados por orden de prioridad.
Un bus CAN puede tener un máximo de 32 nodos. El número de mensajes por segundo
varía entre 2000 y 5000 en un bus de 250 Kbps, según el número de bytes por mensaje.
Aunque se ha dicho que CAN se basa en un medio físico de par trenzado, también existen
interfaces para la conexión mediante fibra óptica. El método más común es el par trenzado,
de modo que las señales se envían mediante una diferencia de tensión entre los dos hilos.
Los hilos reciben los nombres de CAN_H y CAN_L, y en estado inactivo la diferencia de
tensión entre ambos es de 2.5 V. Un 'I' se envía colocando CAN_H a más tensión que
CAN_L, mientras que un cero se envía colocando CAN_L a más tensión que CAN_H. El
uso de tensiones diferenciales permite el uso de CAN incluso si una de las líneas está
dañada, o en ambientes muy ruidosos.

46
Estudio Situación Actual en la Industria.

2.4.8. Comparación de los casos estudiados.


Para finalizar la sección se presenta la siguiente tabla donde se muestra en forma resumida
los parámetros más importantes de las distintas redes de comunicación de sistemas de
control estudiadas.
Tabla 1: Comparación de todos los casos estudiados.

47
Estudio y desarrollo de un control distribuido para una planta.

3. Estudio y desarrollo de un control distribuido para una planta.

3.1. Introducción:
Para hacer la demostración del funcionamiento del control de un lazo industrial, se ha
diseñado un sistema de automatización industrial, o control distribuido. Para ello se ha
creado una situación ficticia en una planta química, con un proceso indeterminado.
Llegados a este punto es muy importante remarcar, para evitar confusiones e
interpretaciones erróneas no deseadas, que el proceso diseñado y que se presenta a
continuación es totalmente aleatorio. No se ha copiado, ni plagiado en totalidad o parte
ningún proceso industrial real, ya que se vulneraría la posible confidencialidad de éstos.
Todos los elementos que se representan tanto en entornos gráficos, como en la propia
memoria, son totalmente inventados y sin una coherencia real, a nivel de diseño
industrial. El Proceso no muestra productos reales, las presiones, caudales,
intensidades, etc. no han sido calculados para un proceso concreto. Tanto los reactores,
intercambiadores, bombas, etc., no tienen porqué funcionar, ya que no han sido
calculados ni probados para este fin. Todo ello es tan solo un entorno gráfico necesario
para el planteamiento y posterior explicación del lazo de control aquí expuesto. Tras
todo esto solo queda decir, que cualquier semejanza, parecido o similitud a un proceso
real es una total coincidencia, hecho propio de la aleatoriedad y la casualidad.
Se ha elegido para la demostración un proceso químico industrial. Dicho proceso consta de
algunos elementos típicos de las plantas químicas, como pueden ser reactores,
intercambiadores de calor, bombas, depósitos, así como elementos de medida estándares,
medidores de presión de intensidad, de caudal, etc.
Como explicábamos anteriormente, los valores que se mostrarán e incluso podremos
modificar, no serán reales, e incluso podría darse la posibilidad de que fueran valores
incoherentes. Pero en nuestro caso la implicación o coherencia de estos valores no tiene
una relevancia de peso, ya que la parte que nos pertoca, no es la reacción, espesor de
estructuras, kv de válvulas, diámetro de tuberías, ni todo el conjunto de cálculos y diseños
de procesos industriales. Nuestro fin y único destino es el de control, así como de
proporcionar las herramientas y mecanismos necesarios para que el sistema sea seguro,
controlable, ajustable a las necesidades de cada momento y de un fácil manejo e intuitivo.
Estas herramientas están divididas en cinco partes muy diferenciadas y fácilmente
identificables. Pero antes de empezar con la descripción de cada una de ellas, debemos
aclara un aspecto importante de esta parte práctica. El sistema se ha desarrollado usando
como pilar central de comunicaciones el puerto paralelo de los PC’s. Este sistema
ciertamente ya no es muy utilizado en la actualidad, casi en desuso. Se ha tomado esta
determinación ya que poner en práctica un bus tal como el Profibus o similar, requiere de
una dificultad un tanto mayor así como de una inversión en tiempo y capital muy superior.
He creído que para hacer patente el funcionamiento del sistema, era más que suficiente
generar una arquitectura similar obviando este detalle, pero realizando el sistema lo más
parecido a lo existente en la actualidad. Como decíamos anteriormente, la simulación
consta de 5 partes, de las cuales solo daremos una pincelada, ya que más adelante serán
- 48 -
Estudio y desarrollo de un control distribuido para una planta.

debida y ampliamente desarrolladas. En primer lugar encontramos la Estación de Trabajo,


(E.T.). La Estación de Trabajo, es simplemente un PC con un entorno gráfico diseñado,
ajustándose a las necesidades particulares del proceso y desde donde se pueden controlar
todos los elementos que conforman el mismo. Es solo un elemento de visualización y
control, no tiene capacidad de mando. Con él, el operador puede saber el estado de todo lo
que está sucediendo en cada momento en la planta y actuar en consecuencia o dejar que el
propio sistema responda con el parámetro que previamente se le ha preprogramado. Es un
control virtual, ya que este ordenador no es el cerebro del sistema. Podríamos incluso
referirnos a él como una interface entre el usuario y el proceso industrial.
Tras él y como segundo elemento, nos encontramos el bus o líneas de comunicación del
sistema. Este elemento es el que se encarga de trasportar la información que se maneja en
todo el conjunto. Los elementos dejan su información en este bus, y ésta solo la recoge el
elemento para el que está diseñado. Cierto es que Profibus funciona mediante testigos para
pedir tanda de comunicación, pero nosotros para solucionar esto hemos intercalado un
circuito electrónico encargado de repartir los datos. Igualmente que en Profibus, nuestro
bus de comunicación es bidireccional, por lo que en principio todos los elementos se
pueden comunicar entre sí. Nuestro sistema no desarrolla todo este potencial, ya que
teniendo los elementos necesarios para esta bidireccionalidad, hay elementos que al diseñar
el hardware no se les ha dotado de esta funcionalidad. Más adelante en el apartado de
posibles mejoras implementaremos esta idea.
Tras el bus, y como cerebro del sistema nos topamos con el PLC. El PLC no es más que un
ordenador al cual se le provee de capacidad decisiva y ejecutiva. En nuestro caso es un
ordenador normal y corriente, y ciertamente este caso práctico en la realidad sería factible
en algunos supuestos. En la industria es menester equipos más robustos y ante todo
dedicados. Un PC tiene multitud de aplicaciones que no son necesarias para un PLC y en
algunos casos podrían incluso ser una desventaja. Es por ello que en el campo que nos
movemos, no es factible utilizarlos con estos fines. Los fabricantes tienen un gran abanico
de PLC’s con infinitas variedades para que sean adaptables a todo tipo de procesos
industriales. Nuestro PLC es un Ordenador Portátil al cual se le ha dotado de un software
cuya finalidad es la de decidir qué hacer con la información que recibe del bus. Tiene la
capacidad de informar de sucesos o de ejecutar acciones concretas.
Como cuarto elemento y dependiente también de una conexión al bus de datos, nos
encontramos con la Estación Remota, (E.R.). Este elemento no es más que un circuito
electrónico similar a un PLC, pero de inferior potencia y capacidad de decisión. Se encarga
de ejecutar las órdenes que recibe del bus, que por lo general y en su totalidad en nuestro
caso, son enviadas por el PLC. De él pueden depender diversos dispositivos tales como
bombas, variadores de frecuencia, reguladoras, actuadores, elementos de medida, etc.
Tiene la capacidad de recoger información, como averías o valores medidos y reportárselos
mediante el bus al PLC. Dichos elementos suelen estar ubicados en campo, normalmente
en cajas de conexiones en medio de la planta, así como también en cuartos eléctricos más
centralizados.
El quinto y último de nuestro ejemplo son los elementos finales, que al fin y al cabo son
los dan sentido a todo este dispositivo. Estos elementos son las bombas, agitadores,
49
Estudio y desarrollo de un control distribuido para una planta.

ventiladores, válvulas, etc. En nuestro caso simularemos esto con tres ventiladores, y un
circuito electrónico que mediante tres displays simulará el % de apertura de una válvula
reguladora ubicada remotamente en campo.

3.2. Estación de trabajo.


La Estación de Trabajo está compuesta por un PC de sobremesa, funcionando bajo
Windows XP.
Como explicamos en la introducción, este PC trabajará como una interface entre el hombre
y las máquinas. Para ello se ha diseñado un software en Visual Basic 6.0 que es el que se
encargará de traducir la información mostrada de forma gráfica en las ventanas, a códigos
BCD que se transmitirán mediante el puerto paralelo del PC. El software diseñado al igual
que el proceso, es de creación y diseños propios, no ha sido plagiado ni copiado en su
totalidad ni en parte de ella. Esto hace que no sea necesario ningún tipo de derechos de
autor ya que no vulnera licencia alguna.
3.2.1. Software
El software está dividido en diferentes ventanas, algunas de ellas son funcionales y otras de
apoyo al funcionamiento. Las ventanas funcionales, son aquellas que permiten al usuario
acceder y manipular valores o dispositivos. Las de apoyo sólo sirven para realizar
funciones preprogramadas a las cuales el operario no tiene acceso.
El entorno gráfico está inspirado en el sistema CITECT, pero el lenguaje de programación
es diferente ya que este sistema no está basado en Visual Basic 6.0. Para hacerlo más
verídico se ha simulado éste. En este entorno gráfico virtualizamos un proceso químico
indeterminado, en el cual como pieza central encontramos un reactor químico. Este está
compuesto por un agitador que funciona propulsado por un motor eléctrico. También posee
una bomba de vaciado que es la que extrae el producto ya terminado del reactor, así como
una bomba que recircula el producto del interior del mismo. Para mantener en todo
momento controlado todo el sistema, dicho reactor está dotado de unos indicadores de
presión, temperatura y nivel que miden a tiempo real lo sucedido en su interior. Estos
valores tienen unos mínimos y unos máximos. Cuando cualquiera de estos valores iguala o
supera estos límites, automáticamente se dispara una alarma tanto visual como acústica.
Pero para hacer que el sistema sea más elástico estos valores extremos se pueden
modificar. Es importante remarcarlo ya que si deseamos realizar diferentes productos
dentro del mismo reactor, es muy posible que éstos reaccionen generando valores de
temperatura y presión diferentes. Dichas modificaciones podrían generar conflictos de
seguridad. Por este motivo contamos con un sistema de seguridad que evitar accesos no
autorizados. Determinados valores no se pueden modificar sin un password. Algo
imprescindible para que solo los responsables de la planta o del proceso puedan alterar
parámetros que son importantes o de seguridad.
También disponemos de unas series de válvulas. En este diseño las hay de dos tipos: de
todo o nada y reguladoras. Las válvulas todo o nada, tienen el único fin de permitir o no el
paso del producto, en cambio las reguladoras como su nombre indican, nos permitirán
50
Estudio y desarrollo de un control distribuido para una planta.

manipular el caudal que deseamos circule en cada momento. En algunos casos podremos
ponerlo en función automático, de manera que basándose en unos datos preprogramados
ella se auto regulará sola.
Hemos incluido un depósito cuya finalidad desde el punto industrial quizá no sea muy
coherente, pero con ello demostramos un pequeño ciclo de funcionamiento automatizado,
basado en unos parámetros prefijados. Este depósito se va llenando hasta llegar a un nivel
máximo, cuando lo alcanza, automáticamente se pone en marcha una bomba que lo vacía
hasta un nivel mínimo determinado. Tras esto se repite el ciclo nuevamente.
Existen algunos elementos más, los cuales ya expondremos de forma más amplia.

3.2.2. Funcionamiento.

3.2.2.1. Pantalla Inicio.


En primer lugar nos encontramos con la pantalla de acceso. Esta pantalla está diseñada
para arrancar el programa, no la simulación. Es un sistema de seguridad, tan solo debería
poder arrancarlo personal autorizado, por lo que el acceso se hace mediante un password.

Ilustración 31. Pantalla Acceso.

51
Estudio y desarrollo de un control distribuido para una planta.

En esta pantalla podemos actuar de varias maneras diferentes:


Al inicio tenemos un cuadro de texto en el centro. Este cuadro está diseñado para que
introduzcamos un password. Para ello existen diferentes opciones. Podemos introducirlo
desde teclado. En las salas de control, el teclado es un elemento que en la mayoría de los
casos no es usual, por lo que precisamos de alternativas para cubrir todos los frentes
posibles. Una solución adoptada es la de crear un pequeño teclado manejable desde el
ratón. En esta pantalla si clicamos en el cuadro de control, nos aparecerá dicho teclado que
nos permitirá introducir valores alfanuméricos con el ratón.

Ilustración 32: Entrada sin teclado.

Una vez hemos elegido el tipo de teclado, podemos decidir si queremos o no ver lo que
escribimos, ya que es muy probable que no nos interese que las personas presentes sepan
cual es el código. Para ello disponemos de un botón que permite codificar los caracteres en
asteriscos.
En la parte superior de la pantalla inicio, encontramos un pequeño menú con dos opciones.
La primera sirve para cambiar el password de acceso, hacerlo periódicamente es algo
recomendable, y la segunda para cerrar el programa, algo que podemos hacer igualmente
52
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 33: Modificar password.

desde el botón “Cerrar”. Una vez introducido el password podemos clicar el botón
“Acceder” o pulsar “Return” en el teclado. Si el password es incorrecto recibiremos un
mensaje:

Ilustración 34: Password Incorrecto.

Y si es correcto pasaremos a la siguiente pantalla. Pero el acceso a la siguiente pantalla se


demorará unos segundos dependiendo de la potencia de la máquina, ya que en este instante
de forma subliminal el programa cargará en memoria una serie de parámetros que tiene en
una base de datos “Excel”. Todo ello se ve reflejado en una barra de progreso.

3.2.2.2. Pantalla Reacción.


Esta pantalla es el núcleo del sistema. Desde ella podemos controlar todos los dispositivos
que conforman la simulación. Es cierto que existen más pantallas auxiliares, pero todas
nacen de aquí. Una vez nos encontramos ante esta pantalla podemos realizar diversas
operaciones sin tener que activar el programa principal. Podemos observar en la imagen
siguiente que en la cabecera de la pantalla existen diversos botones con funcionalidades
diversas.

53
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 35: Pantalla Reactor.

• Empezaremos por la parte superior izquierda. En ella podemos ver un menú


desplegable que consta de diversas opciones.

Ilustración 36: Menú desplegable 1.

La funciones a las que nos da acceso son: activar la simulación, desactivarla y salir del
programa.
En el siguiente sub-menú llamado “Funciones” encontramos dos opciones más. La primera
nos permite visualizar una pantalla hibrida. La llamamos así por un simple motivo.
Anteriormente explicamos que existían dos tipos de pantallas: las que eran funcionales y
las que funcionan en un segundo plano. Pues ésta cumple en parte las dos opciones, ya que

54
Estudio y desarrollo de un control distribuido para una planta.

se encarga de traducir las órdenes que le enviaremos mediante un clic de ratón sobre un
elemento, convirtiéndolas en códigos BCD que viajarán a través del

Ilustración 37: Menú desplegable 2.

puerto paralelo al exterior. Pero también podemos acceder a ella y verificar el estado de los
puertos de salida del PC para comprobar que no existan errores en los mismos.

Ilustración 38: Entradas y Salidas.

La ilustración 38 nos muestra la pantalla a la que hacíamos referencia y que explicaremos


más adelante. Tras la opción de Entradas/Salidas nos encontramos otra opción llamada
Fallos y Dispositivos. Esta opción expande un desplegable por el lado derecho de la
pantalla de Reacción como podemos observar en la ilustración 39 presentada abajo. En este

55
Estudio y desarrollo de un control distribuido para una planta.

desplegable tenemos dos secciones: la sección del recuadro superior, y la del recuadro
inferior. La superior está compuesta por 11 indicadores luminosos.

Ilustración 39: Fallos y dispositivos.

Estos indicadores pueden adoptar tres colores. Cuando están en verde quiere decir que el
dispositivo está activado y funcionando correctamente. Cuando están en negro el
dispositivo está parado de forma correcta. Sin embargo si se encuentra en negro y a su
derecha aparece un indicador morado, quiere decir que el dispositivo se ha parado por un
fallo. Este fallo nos informa de una avería en un dispositivo final. El cuál estará indicado
por una señal acústica y un mensaje de texto que informará de forma escueta de que se
trata., Además el dispositivo supuestamente averiado se pondrá en rojo.
En el recuadro inferior encontramos otro indicador, el cual tan solo nos informa del estado
del PLC. Si está en verde quiere decir que el PLC está activo y funcionando y si por el
contrario está en negro nos informa de que no lo está.
Más abajo encontramos un botón con el nombre de Rearme. Este botón como su nombre
indica, sólo sirve para desenclavar el dispositivo de seguridad, que impide que un
dispositivo no se pueda arrancar sin verificar que ha sido reparado. Cuando un dispositivo
falle, enviará una señal desde el PLC la cual nos para el dispositivo y muestra el indicador

56
Estudio y desarrollo de un control distribuido para una planta.

morado que hemos comentado anteriormente, además de poner dicho elemento en rojo.
Para poder poner nuevamente en funcionamiento este elemento, se debe dar la orden desde
el PLC de que está activo nuevamente. Una vez el indicador morado ha desaparecido,
pulsando rearme, el dispositivo retorna a la posición de paro correcto, permitiendo
arrancarlo nuevamente.
• Una vez terminado de explicar el funcionamiento del menú haremos hincapié en la
pantalla de Entradas y Salidas que habíamos presentado hace un momento.
Esta pantalla, como bien explicamos en su momento, tiene la función principal de traducir
las órdenes, de marcha y paro, en códigos BCD. En este modo de funcionamiento, el
operador no tiene capacidad de manipulación de la información, pero sin embargo puede
acceder a ésta. Este acceso se limita simplemente a un uso informativo o de verificación,
ya que podemos ver el estado en todo momento de las entradas del puerto para
cerciorarnos si estamos recibiendo correctamente la información, o también para ver si
existe algún fallo en el bus de comunicación. Otra opción es el forzado de las salidas con lo
que creamos códigos BCD de forma manual, que permite hacer verificaciones de
funcionamiento.
Continuando por la parte superior izquierda de la pantalla de Reacción, nos topamos con
dos botones que si bien son diferentes tiene un roll común. Anteriormente nos referimos a
la seguridad, diciendo que hay parámetros que tan solo debería poder manipular personal
con un cierto nivel de acceso.

Ilustración 40: Loggin.

Precisamente estos botones tienen esa finalidad exacta. El botón de la izquierda nos
permite autentificarnos verificando el nivel de acceso que tenemos en el sistema. Como se
trata de una simple simulación, sólo hemos creado dos niveles de acceso: el de “Operador”
que es el que existe por definición y el de “Administrador”.

Ilustración 41: Nivel de Acceso.

Lógicamente el nivel de “Operador”, como es el más básico no requiere de clave, tan solo
lo precisa el de Administrador.

57
Estudio y desarrollo de un control distribuido para una planta.

Existe un cuadro de texto en la parte inferior derecha de la pantalla de Reacción donde se


puede ver en todo momento que nivel de acceso tenemos introducido.

Ilustración 42: Indicador de estado.

De todas maneras como esto es un sistema de seguridad, si el mecanismo detecta que el


password de “Administrador” está introducido y lleva un tiempo determinado sin usarse, lo
desactiva automáticamente. De esta forma no se puede dejar activado por error con el
consecuente peligro que ello conllevaría.
El acceso a esta pantalla es posible desde diversos puntos del programa no solo desde aquí.
El segundo botón realiza la misma función que el temporizador pero de forma manual,
pudiendo desactivar el estatus de Administrador en cualquier momento.
• Continuando hacia la derecha tenemos un nuevo pulsador llamado “R.Alarma”.
Desde el momento en que empieza la simulación van teniendo lugar una serie de sucesos.
Unos los provocaremos manualmente y otros esta programados para que surjan de forma
aleatoria. Todos ellos generarán alarmas tanto acústicas como visuales, así como una
pequeña línea de texto informando a que se debe el fallo.
Este sistema de mensajes que muestran la alarma tienen una gran ventaja, pero a su vez un
inconveniente. El problema surge cuando dos alarmas se producen muy seguidas. Ello
conlleva a que las líneas de texto queden solapadas por la alarma que la ha sucedido en
último lugar. Esto crea la posibilidad de que la primera no hayamos podido verse. Para ello
se ha creado un pequeño registro de alarmas, que es capaz de almacenar las 1000 últimas
recibidas, en el orden en que han sucedido. Este botón no hace más que mostrarnos este
registro para así poderlas visualizar todas.

58
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 43: Registro de Alarmas.

• El siguiente botón que explicaremos, tiene una forma un tanto peculiar. Como
hemos comentado ya en diversas ocasiones, en el momento en que se genera un error, se
lanza una alarma tanto acústica como visual.

Ilustración 44. Apercibimiento Alarma.

En la ilustración 44 podemos ver las dos formas que toma el mismo botón. Cuando está
activo, la zona roja exterior parpadea para indicarnos que una alarma ha sido lanzada. La
única manera de dar conocimiento al sistema de que nos damos por enterados para que
pare de sonar la sirena, es pulsando el contacto. Pero no nos confundamos, esto no
soluciona el fallo, si el fallo persiste tras ser pulsado, a los pocos segundos la alarma se
reactivará.
• El cuadro de texto que sigue a continuación es el encargado de indicar el tag, que
nos informa de qué tipo de alarma estamos hablando para poder tener una idea y saber
donde hay que actuar. Se puede comportar de dos maneras: cuando no existe ninguna
alarma activa nos muestra el tiempo que hace que se está ejecutando el programa

Ilustración 45: Cuadro Alarmas no activo.

59
Estudio y desarrollo de un control distribuido para una planta.

y cuando se activa alguna alarma, nos muestra el tag de ésta y al mismo tiempo parpadea
entre rojo y negro.

Ilustración 46: Cuadro Alarmas activo.

• Concluyendo con los botones que encabezan esta pantalla, llegamos al que es
probablemente el más importante de todos, el contacto que pone en funcionamiento todo el
sistema. Sin activarlo, la comunicación entre los distintos elementos que conforman este
proyecto no es posible. Cuando activamos este interruptor lo primero que vemos es que el
indicador luminoso de la derecha cambia de estado de “Parado” a “Activo”.

Ilustración 47: Interruptor de Inicio.

Al cambiar al estado de “Activo” en este preciso momento, se desbloquean todos los


elementos gráficos representados en el dibujo, de manera que podremos empezar a poner
en marcha bombas, a abrir válvulas, etc. teniendo en cuenta que algunos de ellos tienen
una secuencia determinada es decir, que para poner en marcha según qué elementos se
necesita previamente de la puesta en marcha de otros.
Si intentamos realizar esta operación sin cumplir la regla previa, nos aparecerá un mensaje
informándonos del error que estamos cometiendo. Dicho mensaje no genera alarma, solo
es informativo.
Al activar el interruptor, se inicia la cuenta en el cuadro de alarmas, del tiempo
transcurrido desde que se inicia. La estación de trabajo cuando detecta que esta activa, una
de las primeras operaciones que ejecuta es comprobar si se encuentra en línea con el PLC.
Si es así lo pone en funcionamiento, lanzando un mensaje informativo de que el PLC está
activo y encendiendo el indicador luminoso de la ventana desplegable. Si de lo contrario
detecta que el sistema no está en línea, se activa, pero nos muestra un mensaje
informándonos de que algo ocurre con el PLC.
Igual que sucede al conectar, si una vez el sistema está en marcha y pulsamos nuevamente
el interruptor, nos aparecerá un mensaje en pantalla preguntándonos si estamos seguros de
que queremos interrumpir el programa.

60
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 48: Interrumpir programa.

Si pulsamos “no”, el contador de tiempo continuará contando y a su vez el programa


seguirá su camino. Si por lo contrario pulsamos “si”, se interrumpirán todos los procesos
que se estén ejecutando, deteniéndose el contador de tiempo.
Ya hemos terminado con los elementos que conformarían el menú de funcionamiento
auxiliar, que son todos los botones y sub-menús de la parte superior de la pantalla de
Reacción. Ahora empezaremos a explicar el funcionamiento del entorno grafico
propiamente dicho. Haremos una explicación detallada de cada uno de sus elementos, así
como de las pantallas auxiliares de apoyo a los mismos.
• En primer lugar podemos observar que si pasamos el ratón por encima de la
pantalla, al situarse encima de los indicadores, así como de los dispositivos, bombas,
motores, válvulas, etc., aparece una etiqueta identificativa que desaparece al posicionarse
encima de otra, con la consecuente aparición de la nueva correspondiente. Esta es una
herramienta interesante ya que facilita la identificación de un elemento cuando hay muchos
similares. Observamos que para facilitar la posición del ratón en el sistema, no solo nos
podemos basar en la etiqueta que esté activa en cada momento, sino que el elemento sobre
el que se ha posicionado por última vez el rato queda enmarcado con un recuadro rojo.

Ilustración 49: Etiqueta y recuadro de selección.

• Los indicadores de valores medidos, que son los recuadros negros que podemos ver
repartidos a lo largo y ancho de toda la pantalla, tienen la utilizad de informarnos en cada

Ilustración 50: Indicador Valor Medido.

momento del valor que se está midiendo. Cada uno de ellos está tarado a un máximo y a u
mínimo. Estos valores limítrofes tienen la capacidad de lanzar alarmas en cuanto detecten
que el valor promedio ha llegado o superado este umbral. Si esto sucede, automáticamente

61
Estudio y desarrollo de un control distribuido para una planta.

se pondrán en color rojo, indicándonos que algo no está bien. Por lo que el operario podrá
actuar de alguna para corregir esta incidencia.

Ilustración 51: Indicador Valor Medido alarmado.

Pero como comentábamos anteriormente, estos valores se pueden modificar, haciendo el


sistema más elástico.

Ilustración 52: Modificar Valores Máximos y Mínimos.

Para modificarlos iremos a esta sub-pantalla de apoyo. Llegaremos a ella pulsando con el
botón izquierdo del ratón sobre el recuadro de medida que queramos modificar o
simplemente visualizar. Al hacerlo aparecerá este cuadro. Al ser un elemento de seguridad
necesita de un nivel de acceso superior al de “Operario” para entrar a modificar los datos.
Es por ello que en la parte superior derecha existe un botón, que es exactamente el mismo
que hay en la parte superior izquierda de la pantalla reacción.
Al pulsarlo ocurrirá exactamente lo mismo que antes, nos parecerá el recuadro para
identificarnos. Al hacerlo ya podremos modificar los valores inferior y superior.
Para modificar los valores una vez estemos correctamente identificados, pulsamos
directamente con el botón izquierdo del ratón sobre el recuadro donde está el valor a
corregir. Automáticamente nos aparecerá el cuadro de teclado en pantalla que ya hemos
visto y a su vez a la derecha del cuadro que nos indica el valor que vamos a prefijar,
aparecerá un botón cuya finalidad es verificar el valor que colocaremos.

62
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 53: Visual botones de verificación.

Esto nos evitará que podamos equivocarnos y colocar un valor máximo inferior al mínimo
o un mínimo superior al máximo.. Cuando tengamos los valores deseados introducidos
pulsaremos el botón “Salir”. Los límites nuevos ya son operativos, pero para que el
programa sea más liviano y funcione más ágil, estos valores quedan en memoria. Esto
quiere decir que si ahora tenemos un fallo de energía, al arrancar nuevamente el programa
tendríamos que modificarlos de nuevo. La operación que hace al cargar las bases de datos
al principio en la pantalla de “Inicio”, tiene su homólogo cuando cerramos el programa, ya
que nos preguntará antes de cerrarlo si queremos guardar las modificaciones. En caso
afirmativo, reescribirá todas las bases de datos con los nuevos valores.
• Continuando a través de esta pantalla para seguir un orden más o menos coherente,
nos desplazaremos de izquierda a derecha y de arriba abajo.
Lo primero que tenemos que explicar es que no todos los indicadores son iguales. Los hay
de medida y de valor prefijado. El recuadro IT7 superior es un indicador prefijado. En éste
colocamos la temperatura promedio que queramos que tenga el reactor, de forma que el
sistema dirigirá la reacción para que recoja ese parámetro. Podremos modificarlo tan solo
pulsando encima del mismo recuadro, para que nos salga el teclado en pantalla. Le
indicamos el valor deseado y aceptamos. Actuaremos de forma coherente, ya que no
podemos decirle al sistema que baje o suba en la reacción una cantidad absurda de grados,
ya que esto desestabilizaría la reacción. Por esta razón existe una limitación en cuanto a los
grados que se pueden subir y bajar a la vez.

Ilustración 54: Recuadro de valor prefijado.

• El siguiente dispositivo sobre el que podemos actuar es el agitador. Virtualmente,


se trataría de un motor conectado a un sistema reductor, que haría girar unas palas, cuya
función es la de homogenizar los elementos que están reaccionando dentro del reactor.
63
Estudio y desarrollo de un control distribuido para una planta.

Nosotros no podemos actuar sobre la velocidad de giro de éstas ni sobre ningún otro
parámetro que no sea su marcha o paro.

Ilustración 55: Marcha agitador.

Una vez pulsemos sobre el motor del agitador nos saldrá una ventana como la de la
ilustración 55, donde nos preguntará si estamos seguros de que queremos conectar el
dispositivo. Pulsando “No”, se cerrará la ventana y nada habrá sucedido. Si de lo contrario
pulsando en “Si”, automáticamente veremos como el motor toma el color verde. Los
indicadores de intensidad del agitador empiezan a marca un valor y el reactor alcanza un
nivel haciendo que todos sus indicadores de temperatura, presión y nivel empiecen a
oscilar. Ningún otro elemento del reactor puede ponerse en marcha sin que el agitador esté
en funcionamiento. Esto es un enclavamiento de seguridad, ya que no podemos vaciar el
contenido del reactor si este no se ha homogenizado correctamente. Para ello primero se ha
de hacer un estudio a nivel de calidad o seguridad, para ver qué tipo de sub-reacción se ha
podido generar al fallar este dispositivo. Este motor será uno de los tres elementos finales
que servirán como ejemplo real de funcionamiento del proyecto. Es decir, que cuando lo
conectemos o paremos, realmente se pondrá en marcha un elemento físico; en nuestro caso
un ventilador. Cuando generemos un error desde el PLC, algo que ya explicaremos cuando
tratemos el software del PLC, este motor se detendrá y se pondrá de color rojo, haciendo
necesario el botón de rearme que explicamos anteriormente en la pestaña desplegable.
• A continuación encontramos una bomba que realiza una recirculación y a su vez
puede ejecutar un vaciado de emergencia del reactor mediante una válvula de 3 vías. Esta
bomba puede darnos información de funcionamiento con tres parámetros: intensidad,
revoluciones y presión. Igual que en el caso del agitador, cuando pulsamos para poner en
marcha la bomba, nos aparece un cuadro que nos pregunta si estamos seguros de realiza la
acción. Si afirmamos, pero no cumplimos la condición que antes explicábamos de que el
agitador esté en marcha, obtendremos el siguiente cartel informativo.

64
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 56: Mensaje fallo enclavamiento marcha.

Sin embargo a modo representativo, en esta bomba hemos introducido otro tipo de
enclavamiento muy común en estos sistemas. Es un tipo de enclavamiento diseñado para
que el elemento se auto proteja de acciones dañinas. Muchos de los motores que se instalan
en la industria están acoplados a elementos reductores o a una infinidad de mecanismos los
cuales son sensibles a cambios bruscos de velocidad. Es por ello que a éste lo hemos
protegido para que en el caso de que lo paremos o se detenga por cualquier motivo, hasta
que la intensidad no baje de un valor, no permite ponerlo nuevamente en marcha. Todo
ello a su vez está directamente relacionado con las revoluciones a las que gira. Si
intentamos tal acción el sistema nos contestara con el siguiente mensaje.

Ilustración 57: Mensaje informativo que protege a la bomba contra cambios bruscos de velocidad.

En cuanto la intensidad baje del valor preestablecido nos permitirá ponerlo en marcha. Para
aumentar el realismo, ya que lo común en este tipo de dispositivos es que estén acoplados a
variadores de frecuencia, por lo que el arranque es progresivo, se ha hecho que los valores
medidos de intensidad, revoluciones y presión aumenten su valor paulatinamente, hasta
llegar al rendimiento de trabajo correcto, con lo que se estabilizan con las pequeñas
fluctuaciones típicas del proceso normal.
• En la parte inferior derecha del reactor, tenemos una bomba que se encarga de
extraer el producto acabado del reactor en condiciones normales de funcionamiento. La
tarea que realiza es prácticamente idéntica a la de la otra bomba. Sólo existe unas pequeñas
diferencias. La puesta en marcha no cambia. Al igual que en el caso anterior depende de
que el agitador del reactor se encuentre en marcha para ejecutar la orden de arranque, con
el mismo mensaje de error si se incumple este requisito. Sin embargo la prohibición de re
arrancar dependiendo de la intensidad, no está activa. Pero hemos incluido otra restricción.
Cuando observamos el diagrama, tras la bomba que estamos tratando existe una válvula
automática. Sería una incoherencia que nos permitiera poner en marcha dicha bomba sin
previamente abrir esta válvula, ya que el trabajo que realizaría esta bomba podría llevar a

65
Estudio y desarrollo de un control distribuido para una planta.

una avería. Entonces es lógico que este acto se tenga que realiza previamente, por lo que si
no lo hacemos nos generará un mensaje de error.

Ilustración 58: Mensaje de error que informa de que la válvula de salida esta cerrada.

Si cumplimos estos dos únicos enclavamientos la bomba se pondrá en marcha, y de igual


manera que en el caso anterior, tenemos tres indicadores para marcarnos la presión, la
intensidad y las revoluciones en cada momento de la bomba. De igual forma, tanto el paro
como la puesta en marcha son progresivas. Pero hemos incluido una nueva función muy
interesante en uno de estos cuadros de medida. Algo muy utilizado en estos sistemas de
control industrial, es poder saber la progresión en el tiempo de la variable, pues ello nos
informa de la tendencia que tiene, y nos permite actuar con antelación a cualquier exceso o
defecto en una variable. En definitiva nos está dibujando una función en el tiempo. En este
caso nos representará estos tres valores pertenecientes a la situación online de la bomba.
Estas gráficas las podemos extraer al hacer doble Chick en el medidor de revoluciones,
pero teniendo en cuenta que está enclavado a que haya algún valor medido, en el caso de
que no exista valor, no se ejecuta. Es lógico ya que representar nada es una estulticia.
Una vez hemos hecho doble Chick sobre el cuadro de medida de revoluciones de la bomba
de vaciado del reactor, nos aparecerá una pantalla como la siguiente.

66
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 59: Pantalla Gráficas de Tendencias.

La pantalla “Gráficas” se ha diseñado de forma básicamente informativa, permite un


mínimo de manipulación, pero muy limitado. De este apartado tan solo, se podría hacer un
software dedicado, ya que las posibilidades que brinda un buen historial de gráficas de
tendencias son muy amplias, y la ayuda que presta al control y prevención de riesgos en un
proceso, es importantísimo. Tan solo por ello no podemos dejar nuestro sistema sin
introducir este elemento.
No se ha trabajado este punto en profundidad, ya que implicaría prácticamente un proyecto
solo para este fin. Pero con la implementación que hemos realizado, será suficiente para
plantearlo y ejemplificarlo.
En un proceso real dispondríamos de un registro histórico de días, meses o incluso años.
En nuestro caso la medida es online, no está dotada de memoria, es decir una vez se cierra
las gráficas se borran. Los gráficos reales no tienen tiempo límite, el nuestro tiene una
duración determinada, pasada la cual empezaría de nuevo.
Una vez introducido un poco este tema, podemos exponer el funcionamiento de esta
ventana.

67
Estudio y desarrollo de un control distribuido para una planta.

Está dividida en dos partes: el recuadro de la izquierda, dedicado al ajuste de las gráficas, y
el recuadro de la derecha que nos permite una mínima manipulación de las funciones.
En el recuadro de la izquierda encontramos tres barras de ajuste (POS), la primera se
encarga del ajuste vertical de la variable. El valor de este ajuste se ve representado en todo
momento en un cuadro informativo a la derecha de dicha barra.
La segunda barra que incluye este apartado, tiene la función de jugar con la amplitud de la
gráfica, para poder exagerar los quiebros que esta hace, con el fin de poder observar mejor
estos cambios.
Por último tenemos la barra de “Span”, que realiza una multiplicación sobre la primera, de
modo que cada aumento de ésta supone el doble de rango en la primera.
Por último nos encontramos con dos botones, el primero tal y como su nombre indica
(PAUSA | |), detiene la gráfica y la reanuda al pulsarlo de nuevo. El segundo hace un auto
ajuste de posicionamiento vertical, cuando alguna variable se sale del dominio de la
ventana. Para ello actúa sobre la barra de ajuste vertical y sobre el span que de forma
automática ajusta la variable en el centro de la pantalla, pudiendo después colocarla donde
deseemos. Si empleamos este modo, cuando el sistema haya ajustado el canal deseado, nos
mostrará un mensaje informándonos de este hecho.
Ya hemos explicado cómo se ajustan las variables, pero no como se selecciona la que
deseamos. Para ello entra en juego el recuadro de la derecha. En este recuadro podemos
identificar varios canales. Cada canal está referenciado a una variable, que para
identificarlos de forma más clara, se ha dotado a cada uno de un color diferente. Para
activar o desactivar el canal, se pulsa sobre el botón que tiene el propio nombre. Con ello
lo activamos o desactivamos, pero aun no lo seleccionamos para un previo ajuste. Al
activar el canal aparecerá a la derecha del mismo un círculo azul que nos indica esto,
además de que empezará a dibujarse la función. Para seleccionar un canal cuando lo
queramos ajustar, clicaremos con el ratón en el cuadro de color donde pone el tag.
Automáticamente un recuadro rojo aparecerá, envolviéndolo, de esta manera queda
seleccionado este canal.
• Lo siguiente que encontramos avanzando hacia la derecha es una válvula
reguladora. La válvula funciona de forma diferente a los dispositivos explicados hasta el
momento. Para su activación no tenemos ningún enclavamiento, ya que es autosuficiente.
Pero como su función es regular la refrigeración del intercambiador, si no ponemos en
marcha las bombas de agua, que son con las que ha de intercambiar temperatura, no tiene
mucho sentido actuarla. Cuando hacemos “click” sobre la válvula nos aparece una nueva
ventana.

68
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 60: Reguladora intercambiador.

En esta ventana podemos regular la temperatura del intercambiador de dos maneras: de


forma manual o automática.
En el intercambiador se ha creado un generador de temperatura aleatorio, para simular un
proceso en funcionamiento. De esta manera se pueden hacer maniobras simuladas de
regulación de temperatura.
El regulador contiene dos barras de progreso: la primera nos indica la reacción que tiene la
temperatura, es decir, si la temperatura se incrementa, la barra crece, y si se decrementa la
barra encoge. En la segunda, la apertura de válvula que tenemos en cada momento. Estos
datos podemos verlos también de forma numérica en los dos cuadros de medida inferiores.
De los dos cuadros, en el superior tenemos la temperatura que queremos controlar, y en el
recuadro interior nos dice en % la abertura de la válvula.
Ésta se puede regular de forma manual mediante la barra de desplazamiento que hay bajo
los cuadros de medida. Podemos realizar aperturas de 1% mediante las flechas o mas
grandes desplazando el cursor. Finalmente podemos hacer que todo ello actúe de forma
automática regulando a una temperatura prefijada, pulsando el botón con las flechas en
círculo. Cuando funciona en modo automático las flechas giran de forma circular, cuando
está en forma manual estas detenidas.

69
Estudio y desarrollo de un control distribuido para una planta.

• Todos los demás elementos exceptuando una reguladora VA2, funcionan


exactamente igual, al pulsarlas nos pregunta si queremos o no ejecutarlas, si decimos que
sí se ponen en verde, de lo contrario permanecen inmutables.

Ilustración 61: Dispositivos.

La mayoría al ponerlos en marcha inducen a que los cuadros de medidas que dependen de
ellos tanto sean por el propio dispositivo, como si es por la línea que lo precede, empiecen
a reflejar valores.
• El último dispositivo de funcionamiento diferente a los demás es la válvula
reguladora VA2. Esta válvula funciona prácticamente igual que la reguladora de agua que
hemos explicado anteriormente, con algunas diferencias.

Ilustración 62. Reguladora VA2

Visualmente podemos ver que son muy parecidas, pero existen algunas diferencias
importantes de funcionamiento. Veamos la ilustración 62. Podemos observar que en la
parte superior izquierda existe un pequeño menú llamado “Ajuste”. Para explicar este
70
Estudio y desarrollo de un control distribuido para una planta.

comando, debemos aclarar un aspecto sobre esta válvula. Al final del proyecto veremos
que se controlan cuatro dispositivos reales, tres de los cuales son unos ventiladores que
simulan ser motores del proceso y el cuarto elemento es una válvula reguladora, que está
físicamente ejemplificada mediante los tres displays de 7 segmentos de un circuito
contadora. Además este último está también reflejado en el software del PLC mediante tres
displays digitales, pero implementados por software. Existe la posibilidad de que el valor
que tenemos en el PLC y el que tenemos en esta reguladora no coincidan, esto es muy
posible cuando ponemos en marcha el sistema. Con este botón sincronizamos a cero los
dos elementos tanto de la estación de trabajo como el del PLC.
Las dos barras de progreso tienen la misma finalidad que en el caso anterior, la única
diferencia es que anteriormente medían temperatura en la primera de ellas y ahora miden
caudal. La segunda sigue refiriéndose a la apertura de 0 a 100.
Los dos marcadores siguen la misma línea, el primero nos indica el caudal en m3 y el
segundo la apertura en %.
Una de las mayores diferencias reside en el control. Sólo podemos aumentar o disminuir la
apertura de 1 en 1%, y no existe el control automático.
Otra de las mayores diferencias es que esta reguladora posee gráfica de tendencias, con lo
que podemos medir en todo momento el caudal y la apertura que necesitamos.

3.3. Puerto Paralelo.


Para continuar con la exposición del proyecto explicaremos brevemente el funcionamiento
del puerto paralelo, de manera que podamos entender el funcionamiento del bus que hemos
creado, para la comunicación del sistema.

3.3.1. Introducción.
Un puerto paralelo es una interfaz entre una computadora y un periférico, cuya principal
característica es que los bits de datos viajan juntos, enviando un paquete de byte a la vez.
Es decir, se implementa un cable o una vía física para cada bit de datos formando un bus.
Mediante el puerto paralelo podemos controlar también periféricos como focos, motores
entre otros dispositivos, adecuados para automatización.
El puerto paralelo más conocido es el puerto de impresora (que cumplen la norma IEEE
1284, también denominados tipo Centronics) que destaca por su sencillez y que transmite
98 bits.
El puerto paralelo de las computadoras, de acuerdo a la norma Centronics, está compuesto
por un bus de comunicación bidireccional de 8 bits de datos, además de un conjunto de
líneas de protocolo. Las líneas de comunicación cuentan con un retenedor que mantiene el
último valor que les fue escrito hasta que se escribe un nuevo dato, las características
eléctricas son:

• Tensión de nivel alto: 3,3 o 5 V.


• Tensión de nivel bajo: 0 V.
71
Estudio y desarrollo de un control distribuido para una planta.

• Intensidad de salida máxima: 2,6 mA.


• Intensidad de entrada máxima: 24 mA.

La estructura consta de tres registros: de control, de estado y de datos.

• El registro de control es un bidireccional de 4 bits, con un bit de configuración


que no tiene conexión al exterior, su dirección en el LPT1 es 0x37A.
• El registro de estado, se trata de un registro de entrada de información de 5 bits, su
dirección en el LPT1 es 0x379.
• El registro de datos, se compone de 8 bits, es bidireccional. Su dirección en el
LPT1 es 0x378.

3.3.1.1. Características físicas del puerto paralelo.


La característica más relevante del puerto paralelo es que es capaz de transmitir 8 bits de
datos simultáneamente a través de 8 líneas en paralelo. La distancia máxima del cable es de
2 a 4 metros, lo que reduce mucho su ámbito de aplicación. A cambio la velocidad de
transferencia puede ser mayor que la de un puerto serie. Las señales eléctricas que utilizan
TTL en lógica positiva: 0 voltios para el 0 lógico y 5 voltios para el 1 lógico.
En la tabla siguiente se muestra un resumen de las señales del puerto paralelo y la
asignación de los contactos en los tres tipos de conectores.
PUERTO PARALELO.
A B C NOMBRE
1 1 15 /C0 /STR S STROBE
2 2 6 D0 D0 S BUS DE DATOS
3 3 7 D1 D1 S
4 4 8 D2 D2 S
5 5 9 D3 D3 S
6 6 10 D4 D4 S
7 7 11 D5 D5 S
8 8 12 D6 D6 S
9 9 13 D7 D7 S
10 10 3 S6 /ACK E ACKONELEDGE
11 11 1 /S7 BSY E BUSY
12 12 5 S5 PAP E PAPER OUT
13 13 2 S4 OFON E OFF-ON
14 14 17 /CT /ALF E AUTO LINE FEED

72
Estudio y desarrollo de un control distribuido para una planta.

15 32 4 S3 /FEC E ERROR
16 31 14 C2 /INI S INICIALIZAR
17 36 16 /C3 /DSL S SELECT
18 HLH
36 PLH
Resto de MASA
líneas a masa.
Tabla 2: asignación de los contactos en los tres tipos de conectores.

Ilustración 63: Conector DB 25.

Si deseamos utilizar el puerto paralelo para otros usos distintos de la conexión a una
impresora sabemos que disponemos de las siguientes señales genéricas en función del tipo
de puerto.
El puerto paralelo en los PC’s se presenta siempre como un conector DB-25 hembra al que
se suele conectar un cable CENTRONIC de la impresora por el extremo DB-25 macho.
Los nombres y funciones de las señales se relacionan con la conexión de una impresora
paralelo, pero desde el punto de vista más general, podemos ver el puerto paralelo como un
conjunto de E/S digitales a las que nombraremos según el tipo de registro. De este modo,
las salidas son las líneas D0-D7 del registro de datos y las líneas /C0, /C1, C2 y /C3 del
registro de control. Las entradas son S3, S4, S5, S6 y /S7.
Las señales de / indican lógica negativa: si el bit /S7 está a uno en la línea 11 hay cero
voltios.
La norma IEE 1284 define 3 tipos de conectores:
• Tipo A: Se corresponde con el clásico conector DB25 macho que se suele conectar
al ordenador, posee 25 conectores.
• Tipo B: Se corresponde con el conector CENTRONIC que se suele conectar a la
impresora, posee 36 conectores.
• Tipo C: Es un conector relativamente nuevo que se puede ver en algunos
dispositivos periféricos, posee 36 conectores.
73
Estudio y desarrollo de un control distribuido para una planta.

3.3.1.2. Registros del puerto paralelo (SPP).


En el PC original se montó un puerto CENTRONIC o SPP (Standard Paralell Port) cuyo
uso original fue el de conectar una impresora paralelo. Este puerto tiene el nombre
reservado de LPT1 o PRN bajo MS-DOS. En la actualidad este tipo de puertos, si bien es
cierto que aun se montan en los PC’s, están siendo reemplazados por los puertos USB.
El número de puertos paralelo y serie instalados en el PC pueden ser leído del área de datos
de la BIOS en las siguientes direcciones.

Detección del número de puertos


Dir. Bits Contenido Valor típico
0040:0011 D0-D1 Número total de puertos paralelo 0x01
0040:0011 Número total de puertos serie 0x02
Tabla 3: Detección del número de puertos.

Cada uno de los puertos instalados dispone de 3 direcciones de E/S para el acceso a 3
registros de 8 bits cada uno. La dirección base de cada uno de estos puertos se puede
obtener en el área de la BIOS.

Direcciones base de los puertos paralelos


Dir. De memoria Contenido Valor típico
0040:0008 Dir. Base para LPT1 0x03F8
0040:000A Dir. Base para LPT2 0x0278
0040:000C Dir. Base para LPT3
0040:000E Dir. Base para LPT4
Tabla 4: Direcciones base de los puertos paralelos.

A partir de la dirección base, cada puerto ocupa 3 direcciones de E/S.

Registros del puerto paralelo.


Dir. De E/S Acceso Contenido E/S LPT1
DIR_ES_BASE ESCRITURA Registro de datos (D0….D7) 0x3F8
DIR_ES_BASE+1 LECTURA Registro de estado (S0..S7) 0x3F9

74
Estudio y desarrollo de un control distribuido para una planta.

DIR_ES_BASE+2 LEC/ESC Registro de control (C0..C7) 0x03FA


Tabla 5: Registro del puerto paralelo..

Ilustración 64: Propiedades del Puerto paralelo.

A continuación mostraremos los tres registros del puerto paralelo SPP.

75
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 65: Registros SPP.

La primera columna indica la dirección de E/S donde se encuentra el registro. La segunda


columna indica el tipo de acceso: lectura o escritura. Obsérvese como el registro de estado
es de sólo lectura mientras que el de control es de lectura/escritura. El registro de datos es
de lectura y escritura: al escribir en él cambiamos la tensión en las líneas 2 a 9 del conector
DB25, si leemos de él sabremos la tensión actual de esas líneas. Si se encuentra activado el
modo bidireccional (bit C5 del registro de control) el registro de datos es de sólo lectura y
es un reflejo de las tensiones aplicadas en las líneas 2 a 9 del conector.
La columna INV indica si se produce una inversión hardware por parte de la interface
CENTRONICS, por ejemplo, cuando el bit /S7 está a uno, en la línea 11 del conector se
tiene cero voltios.
La columna L indica si la señal correspondiente del protocolo CENTRONICS va con
lógica positiva o con lógica negativa, por ejemplo, la línea /ACK (reconocimiento de
76
Estudio y desarrollo de un control distribuido para una planta.

datos) informa al PC de que se ha recibido un nuevo dato poniéndose a nivel bajo. Sin
embargo, puesto que /ACK se corresponde con el bit S6 y éste no tiene inversión hardware
cuando en la línea existan cero voltios en S6 habrá un 0 lógico.
Para evitar confusiones, se utilizan únicamente las nomenclaturas de las líneas a partir del
bit que ocupan. Las que trabajan en lógica negativa son: /S7, /C0’, /C1 y /C3. Como
resumen se muestra a continuación el mapa de entradas / salidas para el puerto paralelo.
El bit C$ se utiliza para activar las interrupciones en la interfaz, normalmente las rutinas de
la ROM-BIOS que manejan el puerto no utilizan interrupciones para comunicarse con la
impresora ya que se trata de un dispositivo de salida; sin embargo, se puede conseguir que
el puerto lance una interrupción (IRQ5 o IRQ7 típicamente) cuando se produce una
transición en el bit S6 (/ACK) correspondiente a la línea 10 del conector DB25.

Ilustración 66: Mapa de E/S.

3.4. Circuito Interface (Bus paralelo).


Una vez hemos descrito el funcionamiento de la estación de trabajo y del puerto paralelo,
continuaremos explicando cómo hemos hecho para hacer efectiva la comunicación. Es
decir en definitiva la arquitectura de nuestro bus.
3.4.1. Introducción
Este circuito será el primero de otros tres, que son junto al PC que hace de Estación de
trabajo y el que realiza la función de PLC conforman el hardware del proyecto.
En este primer circuito realizaremos la función de comunicación Estación de Trabajo al
PLC. Análogamente sería la red por la que viajarán los datos, bajo el protocolo de
comunicación adecuado, ya sea un bus “Profibus”, o cualquier otro. En nuestro caso será
77
Estudio y desarrollo de un control distribuido para una planta.

simplemente un lenguaje binario o BCD. Esta comunicación se realizará mediante el


puerto paralelo de los dos PC’s. Es un método fuera de uso hoy en día, pero para realizar
una demostración comprensible es más que suficiente, El diálogo se realizará a través de la
interpretación y el procesado de códigos binarios. Cada uno de ellos corresponderá a la
orden de activación o desactivación de un dispositivo, así como códigos de generación de
alarmas de funcionamiento incorrecto de dispositivos, que ya explicaremos en el apartado
correspondiente al circuito Estación Remota.

Ilustración 67. Vista Circuito interface.

3.4.2. Descripción.
Como ya hemos explicado anteriormente, el puerto paralelo del PC, está compuesto por un
conector DB25 hembra, estas 25 patillas están dispuestas en tres grupos. Salidas de control,
salidas de datos y entradas.
78
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 68: Patillaje DB25.

Para las salidas de datos contamos con 8 líneas numeradas de la D0 a la D7 en tecnología


TTL, es decir ± 5V, las cuales como su nombre indica (puerto paralelo), da señal a los 8
bits simultáneamente. Esto nos posibilita combinar esta salida desde el 0 (00000000), hasta
el 255 (11111111). Así mismo contamos con otra salida, la salida de Control, la cual posee
cuatro líneas desde la C0 a la C3, nos permite codificar desde el 0 al 16, pero con una
peculiaridad, que tres de las líneas funcionan negadas, es decir la única salida directa es la
C2, por lo que a la hora de usarla es un aspecto importante a tener en cuenta, sobre todo en
la implementación por software. Finalmente las entradas, están numeradas desde la S3 a la
S7, las tres primeras no son accesibles por lo que esto nos limita a la hora de recibir datos,
ya que pudiendo codificar hasta 255 nos hemos de conformar con 32. Tendremos en cuenta
sin embargo, que la última entrada la S7 es negada y funciona con lógica negativa.
Un aspecto importante para el diseño del circuito es conocer el comportamiento de las
entradas y salidas, ya que sin este conocimiento previo, el planteamiento del mismo sería
imposible. En cuanto a las salidas se refiere no existe problema alguno, ya que se trata
simplemente de dar orden de puesta a nivel alto o bajo, mediante unos comandos, que
explicaremos en el apartado de software. La dificultad, recae en las salidas. Las salidas al
igual que el resto, están basadas en TTL, pero a diferencia de las entradas, su estado inicial
es fácilmente conocido, se encuentran siempre a nivel lógico alto (1), Este nivel permanece
invariante hasta que se le fuerza a 0 mediante la puesta a nivel bajo de la línea de forma
física. Es decir, de alguna manera hay que llevar esta línea a potencial 0. Esto solo se
puede hacer mediante el control de algún tipo de dispositivo.
El sistema ha sido diseñado para que la comunicación entre la estación de trabajo y el PLC
sea bidireccional. Con este fin se han creado dos carriles, uno de tráfico de datos ET Æ
PLC y otra PLC Æ ET. Los datos que correrán desde la ET compartirán carril con otra
corriente proveniente de la Estación Remota (ER).
Empezaré la explicación de este circuito de la misma forma en que lo he concebido y en
idéntico orden. Nos situamos en la pantalla de un PC, que ficticiamente está ubicado en la
sala de control de una fábrica, la cual fabrica el producto X. El operario que controla el
79
Estudio y desarrollo de un control distribuido para una planta.

proceso desde esta interface decide actuar sobre un elemento, ya sea válvula, motor, o
simplemente modificando una consigna de temperatura, etc. Cuando éste realiza tal acción
se produce una cascada de bits que fluye desde el puerto paralelo de dicha estación de
trabajo en dirección a la red de comunicación. Puesto que todos los elementos de dicho
sistema no utilizan el mismo idioma, hay que traducirlo para que se puedan entender. Esta
es la función principal del circuito en cuestión, por el cual recibe este nombre. Los bits
entran por uno de los puertos DB25, éste es bidireccional, por lo que puede transmitir datos
en ambos sentidos. Pero de momento trataremos solo la afluencia de bits de entrada. Igual
que este puerto, el dispositivo cuenta con tres puertos más de idénticas características, pero
finalidades muy diferentes.
Una vez han atravesado el portal de acceso, la orden del operario en forma de bits, entra en
un circuito electrónico el cual se encargará de dirigirlos adecuadamente y con un orden
correcto. El sistema tiene dos carriles de opuestas direcciones, el carril actual dirección
PLC tiene una peculiaridad respecto al de regreso. Este puede albergar datos de entrada de
dos fuentes diferentes: ET y de la Estación Remota (ET). Es por ello que para separar los
unos de los otros se ha decidido usar una puerta lógica suma (OR) 74LS32, que evita el
trafico inadecuado de bits en sentido peligroso.

Ilustración 69: 74LS32

Al mismo tiempo hará funciones de driver, para impedir que el puerto paralelo pueda
sufrir por un consumo elevado de corriente al alimentar algún dispositivo.
Ahora tendremos que actuar de alguna manera sobre un dispositivo que nos pueda llevar
físicamente a cero las entradas del puerto paralelo del PLC. Como es lógico nos hemos
decantado por un transistor, ya que son de fácil manejo y muy sencillo funcionamiento. De
toda la amplia gama de transistores del mercado se ha elegido el BD137. Podemos pensar
que para el uso que le daremos es un transistor de mucha potencia, y estará
sobredimensionado quizás en demasía. Esta afirmación es cierta en su totalidad. Pero la
razón es que para la implementación de otros circuitos del proyecto sí que se necesita algo
más de potencia. Por lo que para unificar criterios usando el mismo en todos los circuitos,
decidí su empleo.

80
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 70: BD137

¿Cómo logramos con un transistor poner las entradas del PLC físicamente a un nivel lógico
cero?
En la patilla 2 del transistor o colector conectamos una línea de potencial fijo cero, más
comúnmente conocido como a masa. En la patilla 1 o emisor conectamos la entrada que
deseamos que cambie su potencial a nuestra voluntad, y finalmente la patilla 3 o base, se le
excita con la señal de salida de la puerta suma. Cuando esta última nos proporciona un 1, el
transistor se pone en conducción ya que superamos el umbral EB de 0.6 voltios, por lo que
la resistencia CE se encuentra en su valor mínimo produciéndose un cierre del circuito,
haciendo de esta manera que la entrada seleccionada encuentre al otro lado del transistor
un derivación a masa, por lo que cambia su potencial. Este cambio de potencial se traduce
en un cambio de estado que el PLC es capaz de detectar y actuará en consecuencia.
Sin embargo esto tiene un pequeño inconveniente: el transistor invierte la señal que recibe,
es decir, cuando recibe un 1 en la base, el transistor conduce y pone a cero la entrada. Este
pequeño conflicto es un concepto a tener en cuenta a la hora de la implementación con
software, del programa, ya que si lo obviamos tendremos serios problemas de
comunicación.
Una vez recorrido un carril, nos encontramos en el PLC. Realicemos el camino inverso,
pero por el sendero opuesto. Lo primero que observamos desde esta perspectiva, es que
también tenemos una peculiaridad diferente al ya recorrido. Esta característica
diferenciadora es que usamos dos tipos diferentes de salidas, cosa que en la ET no. Esto se
debe a que en los procesos industriales reales la ET no tiene capacidad de ejecución y el
PLC si. En nuestro caso no podría ser diferente, ya que de lo contrario nos alejaríamos de
la realidad. De ahí que tengamos dos tipos diferentes de salidas: unas se encargan de
activar y desactivar los dispositivos físicos tales como motores, bombas, actuadores,
niveles, etc. y la otra sirve para informar a la ET que la petición se ha realizado con o sin
éxito. Es decir es tan solo un camino de información, no de ejecución.
Sigamos con los bits que el operario había lanzado a nuestra red de control industrial. El
PLC ha recibido la información y decide en consecuencia. Él sabe lo que ha de hacer con
81
Estudio y desarrollo de un control distribuido para una planta.

esos datos, ya que posee una base de datos donde buscar y traducir la información, de tal
forma que opere la información adecuadamente. Una vez traducido, decide porque línea ha
de mandarlos, si es una orden de ejecución usará un camino, que son las salidas de control
del puerto paralelo y si es solo información utilizara las salidas de datos.
Supongamos que lo que deseaba el operador era poner en funcionamiento un dispositivo.
Esto llevara al PLC a tomar la decisión de usar las salidas de control para poder ejecutar la
orden. En cuanto el código sale del puerto del PLC, entra por el 2º puerto de entrada salida
del circuito interface. Este puerto es un conector DB25 idéntico al primero. Atravesado el
mismo llegamos nuevamente a la placa de circuito impreso, a ella accederán los datos
mediante un driver 74LS07. El driver es una puerta lógica muy simple, ya que su salida
tiene siempre el mismo valor que a su entrada. Su función es la de alimentar a los
dispositivos conectados en sus salidas, de tal manera que el elemento que da la señal, no
cargue con el peso del consumo del dispositivo final. De esta manera se protege el puerto
paralelo del ordenador de cualquier sobrecarga. Tiene una peculiaridad, necesita una
resistencia de pull-up. Una resistencia de pull-up es una resistencia de polarización
positiva. Es decir las salidas han de estar alimentadas a cinco voltios a través de una
resistencia de polarización, de lo contrario no funciona.

Ilustración 71: 74LS07.

La información atraviesa el driver, cuyo camino le conduce directamente al tercer puerto


DB25 del dispositivo interface. Este puerto tiene la finalidad de comunicar el PLC con los
dispositivos que controlan los elementos finales. Hablamos de PLC’s remotos, variadores
de frecuencia, actuadores, etc. Esta comunicación en nuestro sistema le conducirá a un
segundo circuito, el cual lo conoceremos por el nombre de Estación Remota (ER). Este
circuito emulará estos dispositivos de control. El funcionamiento del mismo lo
expondremos más adelante.

82
Estudio y desarrollo de un control distribuido para una planta.

3.5. Circuito Estación Remota.

3.5.1. Introducción.
La Estación Remota es el elemento del sistema de control distribuido encargado de
controlar localmente las instalaciones y procesos que se le asignan, en los proyectos de
automatización y control.
Es la parte que controla localmente y de la forma más autónoma posible la sección del
proceso que se le encomienda. Consta de dos partes:
• Controlador de procesos y comunicaciones.
• Electrónica de adquisición y telemando (entradas / salidas).

Ilustración 72. Montaje estación remota.

83
Estudio y desarrollo de un control distribuido para una planta.

Estos dispositivos pueden estar dotados de inteligencia y de una limitada capacidad de


decisión, siempre muy por debajo de la del PLC. Su función es la de recibir las órdenes del
PLC y decidir su ejecución local entre un número pequeño y limitado de dispositivos. Ésta
quizás sería la mayor diferencia entre estos y un PLC, ya que este último toma decisiones
sobre todo un sistema, o sobre un gran parte del mismo.
El circuito que ahora analizaremos tiene la función de determinar qué dispositivos acciona
o para, según interpreta las órdenes que el PLC le indica. Puesto que es sólo una
simulación de un sistema pequeño, tan solo dispondremos de una estación remota, pero un
proceso puede tener un gran número de ellas. Esto implicará que todos los dispositivos
serán activados y desactivados por la misma estación remota, algo que podría llevar al
equívoco de pensar que está al mismo nivel que un PLC.
El circuito constará de dos partes claramente diferenciadas por su funcionalidad y
relevancia. En primer lugar tendrá un módulo de entradas, procedentes del circuito
Interface. Este módulo se encargará de recibir las señales que prodecedentes de la ET y que
tras ser procesadas por el PLC se retornan al circuito Interface (IT) y a su vez este los
remite a la ER. Estas señales son códigos binarios que corresponden a las órdenes de
activación o desactivación de los dispositivos finales, así como, del control de un tercer y
último circuito, que simulará visualmente mediante tres displays de 7 segmentos, el
porcentaje de apertura y cerrado de una válvula ficticiamente ubicada en campo.
Y finalmente el módulo de control de los dispositivos finales, que en este caso se tratará de
3 pequeños ventiladores, que simularan los motores que funcionarían en un proceso real, y
que están gráficamente representados en el software.

3.5.2. Descripción.
El circuito en cuestión, recogerá 8 órdenes codificadas de forma BCD. Este número se ha
decidido, no por limitaciones de sistema ni por protocolos, más bien por la creencia de que
con la simulación de cuatro elementos finales era suficiente para exponer el
funcionamiento del lazo de control y hacer comprensible su funcionamiento.
Situémonos en el contexto expuesto en el circuito Interface. Esto nos lleva a ubicarnos en
el puerto de entrada salida 3 del dispositivo. Cuando el PLC ha determinado que la
respuesta que ha de tomar es del tipo ejecutiva, no informativa, dijimos que utilizaba para
tal fin las salidas de control que posee. Estas salidas constan de 4 líneas, donde podemos
codificar hasta 16 códigos BCD. De estos 16 tan sólo necesitamos 8, tres activarán los tres
ventiladores, otros tres los desactivarán y el resto se usan para incrementar o decrementar
el contador del circuito número 3.
Siguiendo con la orden que ejecutó el operador en la ET, nos encontramos un código BCD
de 4 bits que viaja en dirección a la ER. Una vez llegue al puerto de entrada de la ER, el
cual es un DB25 como todos los que conforman el sistema, nos encontramos con el primer
problema de diseño que hemos tenido que salvar para conseguir un funcionamiento
adecuado. Ha consistido en localizar un dispositivo que nos traduzca el BCD y decida
sobre que elemento se actúa si entrar en la complejidad de un sistema con

84
Estudio y desarrollo de un control distribuido para una planta.

microprocesador. Para ello se ha optado por el empleo de un decodificador BCD a decimal


de 10 salidas. Es decir es capaz de decodificar del 0 hasta el 9.

Ilustración 73. Decoder 74LS42.

Este chip tiene un comportamiento peculiar, ya que las 10 líneas de salida se encuentran
permanentemente a nivel alto hasta que una es seleccionada, la cual cambia su estado a
bajo. Es decir funciona con lógica negada. El comportamiento del chip es ideal, si no
tenemos en cuenta que la conexión de las salidas del puerto paralelo se hará de modo
secuencial. Esto quiere decir, que al poner las líneas de salida del puerto paralelo al nivel
lógico correcto, no todas lo harán a la vez, hay un tiempo de lapso. Este tiempo de lapsus
puede generar diferentes combinaciones BCD, al tiempo que se intenta generar la deseada,
con los posibles errores que todo ello conlleva. Para solucionar esto se ha empleado un
quinta línea, a la que llamaremos línea de activación. Esta línea da permiso para que los
datos accedan al 74LS42, de tal manera que lo hagan todos al unísono.

Ilustración 74. Línea de activación.

Para ello necesitan algo más que una simple línea. Necesitan un dispositivo donde actuar y
que haga su vez de puerta que tan solo se pueda abrir cuando la línea de acceso de paso.
Este elemento es una puerta AND. Podemos ver la disposición adoptada a tal efecto en la
ilustración 72 y como sólo es posible pasar los datos de las 4 líneas de entrada a la salida,
conectando la línea de activación. Así garantizamos que todos los bits son entregados a la
vez, por lo que el decodificador sólo podrá interpretar la orden adecuada.
Ahora el decodificador ya tiene su orden correcta y pone la salida correspondiente a cero
durante un margen de tiempo reducido. Necesitamos que un dispositivo sea capaz de leer

85
Estudio y desarrollo de un control distribuido para una planta.

este cambio de flanco y a su vez memorizar el estado, para que no desaparezca tan pronto
como el decodificador cambie el mismo.
La solución a este trabajo lo hace perfectamente un flip-flop J/K. Trabajando directamente
en sus entradas de set y reset obtenemos los resultados deseados. Para nuestra simulación
hemos escogido el integrado 74LS74.

Ilustración 75. Flip - flop 74LS74.

De esta manera cuando queramos conectar un dispositivo, codificaremos la orden de


conexión con una combinación de 4 bits del 0 al 9 de tal manera que cuando se produzca,
ásta pondrá a nivel bajo la salida del decodificador, y como el flip-flop funciona por flanco
descendente, activará su entrada de set poniendo la salida Q a 1. Análogamente cuando
queramos su desconexión, ejecutaremos el código para este fin, produciendo el nivel bajo
en la salida adecuada del decodificador, y dando un flanco de bajada al reset, con lo que la
salida Q adoptara un nivel lógico cero. Ahora tenemos las órdenes de marcha y paro
estables e inmutables. Sólo nos quedaría hacer que estas cumplan su misión actuando sobre
algún dispositivo real.

Ilustración 76. Relé.

Para ello se excita la base de un transistor mediante la salida Q del flip-flop. Ello hará que
cuando se encuentre a nivel alto, el transistor entre en saturación y cuando esté a nivel bajo
en corte. Esto unido a un relé conectará y desconectara los ventiladores que actuarán como
elementos finales.

86
Estudio y desarrollo de un control distribuido para una planta.

3.6. Circuito Contador.

3.6.1. Introducción.
Este circuito será junto a los ventiladores que hacen la función de dispositivos finales del
proceso industrial, una válvula virtual, ya que representará el controlador o iniciador que
llevan estos elementos para ajustar la apertura de la misma en %.
Constará de tres displays digitales de 7 segmentos, los cuales contarán de 0 a 100. Cada
pulsación de apertura o cerrado que el operador realice en la estación de trabajo, se
traducirá en un incremento o decremento numérico visible mediante estos displays. Como
para llevar esto a cabo tan solo disponíamos de dos líneas hemos tenido que hacer un
montaje un tanto particular que pasaremos a presentar de forma mucho más amplia
seguidamente.

Ilustración77. Circuito Contador.

3.6.2. Descripción.
Como comentábamos en el apartado anterior, este dispositivo simula la apertura de una
válvula reguladora en %. Para hacer esto disponíamos tan solo de dos líneas, una con la
87
Estudio y desarrollo de un control distribuido para una planta.

finalidad de incrementar y otra de decrementar. Para poder disponer de estas dos líneas,
hemos aprovechado el decodificador del circuito anterior. Como esta funcionalidad no
tenía un peso importante en el circuito ER no lo hemos expuesto, algo que haremos a
continuación.
Del mismo modo que en la ER dependiendo del código BCD activaba o desactivaba los
elementos finales de este lazo de control. Existen dos códigos binarios asignados
exclusivamente para las operaciones de incrementar y decrementar el contador.
Cuando el decodificador recibe cualquiera de estas dos señales, activa la línea de salida
correspondiente, con la única diferencia de que en este caso no existe flip-flop a la salida,
ya que ahora lo que nos interesa son valores pulsantes, no estacionarios, puesto que el
circuito lo que cuenta son pulsos, o cambios de flanco. Las dos líneas que nacen a la salida
del decodificador son directamente las entradas que utilizará para su cuenteo el circuito
contador.
Supongamos que tenemos el circuito en reposo, por lo que deberían verse tres ceros, uno
en cada uno de los display de 7 segmentos. En esta posición inicial pulsamos el botón de
incrementar un 1% la apertura de la reguladora. Tras recibir el decodificador la debida
orden da un el flanco descendente en la línea de salida correspondiente, esta llega al
circuito Contador. Este circuito consta de tres partes. La primera está compuesta por tres
circuitos integrados 74LS192, que son sendos contadores. Estos chips poseen entradas de
incremento (up) y de decremento (down) lo que nos permite el conteo en los dos sentidos.

Ilustración 78. 74LS192.

Poseen también las salidas de acarreo (carry) y (borrow) muy importante a la hora de
ordenar el paso de un display a otro. Cada contador es capaz de contar desde 0 hasta 9,
cuando alcanza a los valores extremos 0 y 9 utiliza las salidas de carry o borrow para
incrementar o decrementar el siguiente contador. Es decir cuando pasamos de un 9 a un 10
como un display de 7 segmentos sólo es capaz de representar hasta 9, para lograr el 10,
cuando contabiliza los 9 pulsos al llegar al décimo, automáticamente se pone a cero y da
un pulso de acarreo a la entrada up del siguiente contador. Análogamente cuando bajamos
de un 10 a un 9 el contador da una señal de borrow haciendo que el contador que marca el
uno decremento y posicionando al contador que marca un 0 en un 9. Una vez ha hecho el
conteo, este C.I. nos da esta información codificada en BCD a través de sus 4 salidas. Pero

88
Estudio y desarrollo de un control distribuido para una planta.

para poderlas representar en el display no es suficiente con esto, necesitamos un paso


intermedio. Este paso es un conversor de BCD a 7 segmentos (74LS47).

Ilustración 79. 74LS47

Como su nombre indica este chip tiene la única función de traducir la información BCD
que reciben sus cuatro entradas en siete salidas capaces de gobernar los 7 diodos led que
componen el display.

Ilustración 80. Display 7 Segmentos Ánodo común.

Existen dos tipos de displays los de ánodo común y los de cátodo común, la diferencia es
bien sencilla. Un display no es más que 7 leds juntos dentro de un mismo encapsulado.
Para ahorrar tamaño no es necesario colocar las 14 patillas necesarias para todos los leds,
ya que sería absurdo. Para ello se utiliza como común o todos los positivos, que sería
ánodo común, o se utilizan todos los negativos, cátodo común. Nosotros nos hemos
decantado por la de ánodo común. El funcionamiento en principio es el mismo, no
presentauna complejidad mayor, pero hemos decidido así por disponibilidad de material.

89
Estudio y desarrollo de un control distribuido para una planta.

3.7. PLC

3.7.1. Definición de PLC.


Puede definirse como un equipo electrónico programable en lenguaje no informático y
diseñado para controlar, en tiempo real y en ambiente industrial, procesos secuenciales.
Los autómatas son equipos electrónicos de cableado interno independiente del proceso a
controlar (hardware). Un autómata se integra en la máquina o instalación a controlar
mediante un programa que define la solución de las operaciones que se desea (Software) y
de un cableado directo a los elementos de entrada y de salida del autómata. El autómata
programable realiza funciones de control de tipo lógico y secuencial dentro de las fábricas,
es decir, en la proximidad de las máquinas en un entorno industrial. El funcionamiento
puede adaptarse plenamente a la formación y hábitos del personal de fabricación y
mantenimiento.
El número de instrucciones procesadas difiere de un autómata a otro. El programa es
directamente concebido por un automatista, electricista o mecánico. Este trabajo se facilita
aún más mediante el empleo de consolas de programación. Se convierte en un equipo
específico una vez dotado de un programa y acoplado con los elementos de entrada y
salida. El programa debe esta alojado en una memoria interna. Según el tipo de memoria
interna de programa, se distingue entre autómatas de programación libre y autómatas de
programación intercambiable.
Los autómatas de programación libre van equipados con una memoria de lectura / escritura
(RAM o memorias vivas) en donde puede introducirse el programa sin más dispositivos
adicionales que la consola de programación. Ello permite también leer un programa ya
introducido. La memoria RAM pierde su contenido en caso de caída de tensión, pero ello
puede evitarse mediante una batería tampón.
Los autómatas de programación intercambiable van equipados con una memoria de solo
lectura (PROM o EPROM), también denominada memoria muerta que debe cambiarse en
caso de modificación del programa. Las memorias EPROM pueden borrarse mediante una
radiación ultravioleta y posteriormente reprogramadas, mientras que las PROM no pueden
modificarse una vez ya se hayan programado. Si se desea realizar modificaciones será
preciso programar una nueva memoria PROM que sustituirá a la antigua.
Un autómata se presenta bajo la forma de un conjunto de tarjetas o circuitos impresos en
los que se han montado componentes electrónicos integrados. Estos se alojan en paneles o
RAC´s que las protegen mecánicamente. Las conexiones entre las diferentes tarjetas se
realizan por medio de un circuito impreso denominado BUS en la parte posterior de los
paneles.
El bloque de entradas / salidas sirve de órgano de enlace con la periferia. Memoriza los
valores presentes en las líneas de entrada en el momento de la toma en consideración de los
datos; así mismo sitúa los valores calculados sobre las líneas de salida.
El procesador es la unidad de tratamiento lógico que ejecuta los cálculos booleanos en
función de las instrucciones del programa. La CPU lleva igualmente consigo un conjunto
90
Estudio y desarrollo de un control distribuido para una planta.

de variables internas utilizables para las memorizaciones intermedias, registros de tiempo y


de conteo, registros de índice, etc.
Una vez hemos introducido de forma muy general que es y como funciona un PLC o
Autómata programable podemos empezar la explicación de como hemos diseñado el
nuestro.

3.7.2. Introducción.
Igual que en el caso de la estación remota, el PLC que hemos usado para implementar este
proyecto ha sido un PC, pero en este caso portátil. Este hecho hace que el proyecto sea más
transportable, ya que si implementáramos todo con dos PC’s de sobremesa sería difícil y
costoso el transporte. También es cierto que encontrar un portátil que incorporara un DB25
no ha sido tarea fácil, ya que si bien en los de sobre mesa aun es corriente en las placas
base modernas, en los portátiles por sus requerimientos de tamaño y austeridad, hace años
que fue eliminado. Para ello nos hemos decantado, por falta de opciones, de un portátil
algo longevo pero funcional. El dispositivo en sí, funciona bajo Windows 98, ya que por
capacidad de disco duro y memoria no es capaz de albergar un sistema de mayor potencia.
Pero ello no conlleva mayor problema ya que el lenguaje en Visual 6.0 funciona de igual
manera y los requerimientos de potencia que son necesarios para el funcionamiento de la
simulación, los cubre con creces.
De forma similar para este PC se ha desarrollado un software, también implementado en
Visual Basic 6.0, Este software es completamente diferente al de la Estación de Trabajo.
Esta requería de un diseño gráfico importante para su manipulación, algo que en un PLC
no es necesario. Hace años que en la industria han empezado a aparecer PLC’s con
pantallas que soportan un pequeño entorno gráfico. Podría decirse que estos autómatas
están en un sub-segmento entre estos dos dispositivos, pero siguen haciendo más la función
de PLC, ya que están lejos de poderse incorporar como elemento híbrido funcional.
Nosotros lo hemos equipado con una pequeña interface gráfica, a modo demostrativo, para
poder ejemplificar mejor el funcionamiento del sistema, pero podría obviarse en
prácticamente su totalidad y el global funcionaría de igual forma. En nuestro caso el PLC
estará compuesto del propio ordenador portátil más un cable CENTRONIC .

3.7.3. Software.
El software que se ha diseñado para este sistema se puede dividir en dos pantallas, cada
una de las cuales tiene una función específica, pero que para funcionar necesitan del
trabajo combinado de ambas.
• Pantalla principal
• Pantalla de datos.

91
Estudio y desarrollo de un control distribuido para una planta.

3.7.3.1. Pantalla principal

Ilustración 81. Pantalla Principal PLC.

Como comentábamos en la introducción de esta sección, vemos que el entorno gráfico


presente en esta ventana, no es demasiado funcional, ya que los parámetros a manipular no
son demasiados. Un PLC una vez se le ha programado ha de ser autónomo, por lo que
hacer un interface gráfica elaborada constituye una pérdida de recursos.
De todas maneras podemos observar una serie de botones y un pequeño menú, el cual nos
da la posibilidad de realizar algunas maniobras, pero muy limitadas. De igual manera que
con el software de la Estación de Trabajo, empezaremos a introducirnos en el software por
el menú desplegable de la parte superior.

Ilustración 82. Menú..

Si pinchamos en la primera opción llamada “Menú” tan solo encontraremos la posibilidad


de salir del programa. Es la única utilidad que tiene este botón.

92
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 83. Datos.

Al desplegar el sub-menú “Datos” se despliega una única opción que es la de “ver datos”.
Ésta opción lo que hace es activar la segunda venta que conforma este software, que
explicaremos en profundidad más adelante.
Hasta aquí llega el menú, ahora tan solo nos queda explicar una seri de botones que hay
distribuidos por la pantalla.

Ilustración 84. On OFF.

Como sus nombres indican estos botones tienen la función de arrancar y parar el programa
que corre por el PLC. Estos botones son para interrumpir la comunicación
momentáneamente por algún motivo, ya que el PLC se pone en marcha automáticamente al
conectar el sistema desde la Estación de Trabajo.
En el momento en que el programa se carga, automáticamente lee una serie de bancos de
datos que tiene almacenados y los carga en memoria. Estas bases de datos son traducciones
que utilizará el sistema para interpretar en cada momento que es cada código que recibe.
El sistema, aunque esté cargado el programa, no tiene capacidad de leer las entradas si no
se pulsa el botón de “ON” o se le da la orden desde la Estación de Trabajo. Una vez
ponemos en marcha el sistema, va leyendo ininterrumpidamente la entrada del puerto
paralelo, cada vez que le llega una información, la memoriza, se queda una copia en
memoria y otra copia corre todo el programa. La primera es memorizada, porque como ya
explicamos en el apartado en que exponíamos el funcionamiento del puerto paralelo,
cuando se genera un código en el puerto, éste se mantiene en este estado hasta que se
manda otro. Para evitar que esté leyendo durante mucho tiempo el mismo código, haciendo
trabajar inútilmente a todo el software con la misma información, se almacena la primera
vez que lo lee, y la segunda y sucesivas lecturas compara lo que lee con lo que tiene
almacenado, si es lo mismo, no lo deja pasar, de lo contrario tiene vía libre para circular
por el software.
El código que pasa este filtro, es comparado con la base de datos de entradas, y queda
identificado, en el caso de que se tratara de una de las combinaciones no asignadas
quedaría descartada. Una vez la información es identificada se manda a la siguiente
ventana donde se tratará para su posterior salida.

93
Estudio y desarrollo de un control distribuido para una planta.

Hemos podido ver que la manipulación en esta ventana es muy limitada, apenas podemos
hacer nada, ya que no es necesario.

3.7.3.2. Pantalla Datos

Ilustración 85. Pantalla Datos.

Visualmente podemos ver que esta ventana es algo más completa, pero como
comentábamos anteriormente, es todo ilustrativo, para hacer más comprensible el sistema,
y también nos sirve como ayuda la información que nos da esta pantalla.
No existen botones que nos permitan manipular información, sucede como en la ventana
anterior, porque el hecho de que sea más completa, no implica que sea mucho mas
manipulable, aunque es cierto que se pueden realizar más operaciones y que tiene una
opción, que luego explicaremos, que si es capaz de ejecutar acciones importantes, pero es
solo una excepción.
• Para seguir con la línea marcada hasta ahora, empezaremos introduciéndonos en el
programa, por el menú superior, que como en el caso anterior es muy básico y sencillo. En
el caso de la opción “Menú” vemos que como en el caso anterior solo nos permite cerrar
esta ventana, no tiene ningún uso más.

94
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 86. Menú.

• En el caso de la segunda opción “Datos“ veremos que se despliegan dos opciones.

Ilustración 87. Datos.

Antes de continuar, haremos un inciso necesario para poder explicar debidamente como
funciona este apartado. Si nos fijamos bien en la ilustración 88, podemos ver que se ha
dividido la ventana en 4 recuadros numerados del 1 al 4. Esto en la ventana original
lógicamente no se ve, sólo se ha hecho sobre la imagen de la misma para facilitar la
explicación. Hay que decir que cuando cargamos la pantalla correspondiente a dicha
ilustración, los recuadros 1 y 2 no son visibles. Para que lo sean hay que accionar sendos
comandos que ahora explicaremos. Pero por el contrario los recuadros 3 y 4 están activos y
visibles siempre.
Una vez dicho esto podemos proseguir con el sub-menú que habíamos preintroducido.
Cuando seleccionamos la primera opción “Mostrar Registros IO”, aparecerá en pantalla el
recuadro 1.

Ilustración 88. Mostrar Registros IO.

Esta pantalla es muy útil para comprobar a que tag equivale un código binario. Quizás
faltaría explicar un punto que no ha quedado del todo claro anteriormente. Las bases de
datos están compuestas por 5 registros. Tres de los cuales son los bits de entradas, los bits
de salidas y los bits de ejecución, así como dos registro de tags de entrada y tags de salida.
Los bits de entrada están directamente relacionados con los tags de entrada. Esto se ha
95
Estudio y desarrollo de un control distribuido para una planta.

hecho para comprobar en todo momento que el código correcto activa la opción deseada.
Así al enviar un código desde la estación de trabajo ha de coincidir con su tag de entrada.
Una vez tenemos el código relacionado con su tag de entrada, se le asigna un código de
salida y un tag de salida. El último registro es únicamente para los dispositivos reales que
se pondrán en marcha a través de los circuitos electrónicos. Si pulsamos en la parte
superior el botón de in, nos saldrá a la izquierda los bits de entrada y los tags que le
corresponde a cada código. De igual manera si pulsamos out ocurrirá lo mismo con la
salida. Pero si lo que queremos es comprobar un código o un tag únicamente
seleccionamos de los recuadros superiores el tag, o el código que queramos, este al ser
seleccionado se colocará en la casilla inferior que le pertoque y automáticamente en el otro
recuadro aparecerá su información homóloga. No tiene un efecto sobre el sistema, pero es
una gran herramienta que nos sirve para verificar si algún código no esta siendo
interpretado adecuadamente.
La segunda opción de este sub-menú, “Registro de entradas”, completa la pantalla anterior,
si recordamos la ilustración 88, veremos que corresponde al cuadro marcado con un 2.

Ilustración 89. Registro de entradas.

Vemos que al ejecutar este comando, el recuadro de la ilustración 91 se ha completado con


otro recuadro. Éste tiene dos funcionalidades: la primera va registrando todos los tags que
pasan el filtrado que recorren todo el software hasta el final. Es decir, todas aquellas
órdenes de marcha, paro, etc. que el PLC reciba y acepte su tag aparecerán en pantalla
quedando registrado. Es muy interesante porque es una manera de saber si se está
ejecutando lo mismo que se está ordenando desde la Estación de Trabajo. Otra función es
la de información. Cuando seleccionamos un tag del recuadro llamado con este nombre,
que se encuentra a su izquierda, automáticamente hace una pequeña descripción de este.
Así si tenemos alguna duda de que es exactamente ese tag, esto nos lo puede aclarar.
Si ocurriera que se nos llenara la pantalla de datos y queremos borrarla, tan solo tenemos
que clicar con el ratón en el recuadro destinado a los Registros de Entrada , y la limpia
dejándola vacía.
Ya hemos terminado con el menú y con los dos primeros recuadros.
• En el recuadro número 3 de la ilustración 88 encontramos diferentes elementos. Lo
primero que salta a la vista son los 11 tags con sus correspondientes indicadores
luminosos.
96
Estudio y desarrollo de un control distribuido para una planta.

Ilustración 90. Estado Dispositivos.

Cada vez que uno de estos dispositivos se activa desde la estación de trabajo, el indicador
luminoso de la izquierda se pone en verde, cuando se desactiva se pone en negro. El
indicador de la derecha permanece apagado, sólo se ilumina si ocurre algún error en
cualquiera de los dispositivos, en este caso se iluminará de rojo. A la vez este error se
transmitirá a la Estación de trabajo, donde el elemento en cuestión se detendrá y se
apostará en rojo. Este error como es generado desde el PLC solo se puede corregir si este
detecta que está solventado, para ello utilizaremos los controles que se encuentran
remarcados en rojo dentro del recuadro con el nombre de “Generar fallo”. Este recuadro
contiene los únicos mandos capaces de introducir modificaciones. Estos botones han sido
ideados únicamente para generar fallos en el sistema ejemplificando las posibles averías
que se puedan dar.

Ilustración 91. Selección de tag para generar averías.

Si pulsamos el desplegable, vemos que en él se encuentran todos los dispositivos que hay
implementados en el proyecto exceptuando la válvula de refrigeración. Cuando queramos
generar un error sólo tenemos que desplegar la lista, seleccionar el dispositivo y pulsar el
botón de aceptar. Automáticamente el indicador rojo del dispositivo seleccionado se
97
Estudio y desarrollo de un control distribuido para una planta.

iluminara, apagándose el verde, siempre y cuando éste estuviera en marcha. Esto dará la
orden de paro a la estación de trabajo del propio elemento, colocándolo en rojo. Cuando el
elemento ha quedado reparado, lo seleccionaremos nuevamente en el desplegable y cuando
pulsemos el botón de reset dicho componente restaurara el Led de avería apagándose éste.
Aquí es donde entra en juego el botón que teníamos en el cuadro desplegable de la pantalla
principal de la Estación de Trabajo. Ahora que la avería ha sido restaurada en el PLC, para
que el operado pueda disponer de la unidad, ha de pulsar este botón que resetea la avería en
la Estación de Trabajo.
• Por último tenemos el recuadro número 4, este recuadro es únicamente informativo,
solo da información útil para el observador.

Ilustración 92. Reguladora y datos E/S.

En primer caso lo que más llama la atención es el gran display digital. Éste marcará en
todo momento los incrementos y decrementos que desde la Estación de Trabajo le ordene
el operador. A su vez la barra de progreso irá avanzando o retrocediendo del mismo modo.
En el lado derecho tenemos cuatro recuadros informativos, los cuales nos dan lectura de
código de entrada y su tag, así como el código correspondiente de salida y su tag.

98
Conclusiones y Líneas futuras

4. Conclusiones y líneas futuras.


4.1. Conclusiones
Sería una ardua tarea el resumir toda esta temática en unas pocas líneas, ya que el mundo
que envuelve los sistemas de control industrial son tan amplios y adaptativos, que es
imposible el hacer generalizaciones. Es bien cierto, que gracias a las nuevas tecnologías
entorno a líneas de conexión como Ethernet, los buses de control tales como Profibus, así
como los potentes sistemas electrónicos que conforman los cerebros de los PLC, estaciones
Remotas, estaciones de trabajo etc. En definitiva unas nuevas tecnologías en desarrollo que
envuelven la industria de hoy y la futura, garantizan unos sistemas de producción, de una
efectividad jamás vista y lo más importante, garantizando unos niveles de seguridad muy
grandes. Todo ello unido a algo que prima sobre casi todos los demás factores mesurables,
a la hora del diseño de cualquier entorno industrial, que son los costes.
En definitiva la automatización industrial, es la definición de un mayor control sobre todos
los procesos que se realizan en la industria. No estamos aun cerca de decir que estos
sistemas pretendan sustituir al hombre para dicho cometido, pero bien es cierto, que su
presencia en las fábricas actuales se ha reducido gracias a estas tecnologías. Esto a costa
nuestro, implica una reducción de costes, axial como la reducción de el factor humanaos a
la hora de cierta toma de decisiones de cáliz peligroso para la seguridad.
Pero no tenemos que mirarlo con ojos desdeñosos, ya que esta gran afluencia de
información ayuda a los que formamos parte de estos procesos, a poseer un mayor
conocimiento en tiempo real de lo que estamos realizando, podemos tomar mejores y más
acertadas decisiones, porque el factor improvisador o de aleatoriedad se ha de reducir cada
día más.
Un tema muy importante al controlar todos estos datos, es mejorar la efectividad de los
equipos industriales, de forma que las reacciones, o productos que se generan en dichos
procedimientos, han mejorado su eficiencia, ayudando todo esto a que las emisiones de
productos nocivos y contaminantes se estén reduciendo día a día.
En lo que se refiere propiamente dicho al proyecto práctico realizado, debo decir que ya
conocía en parte el funcionamiento de dichos métodos, desde el punto de vista de usuario,
ya que llevo mucho años en este campo. Con ello he podido conocer la otra parte del
sistema, la parte más técnica y en definitiva la más importante. Hacer mi propio control
diseñándolo desde cero, me ha permitido ver hasta qué punto la complejidad que existe en
todo ello. Estudiarlo te introduce en el mundo, pero crearlo de cero hace que cosas que
realizas diariamente, dándole una banal importancia, resultan ser mucho más de lo que
parece. La implementación del software ha sido especialmente compleja, hasta llegar a
convertirse en reto en algunos puntos. El hardware no se ha quedado atrás, en complejidad,
pero quizás ha sido la parte más agradable de trabajar, ya que con ello nos hemos movido
en hechos reales. Pero al finalizar esta creo que ha quedado una simulación muy práctica,
de fácil compresión y muy cercana a la realidad que en definitiva era lo que se pretendía.

- 99 -
Conclusiones y Líneas futuras.

4.2. Líneas futuras.


El sistema que se ha desarrollado podría sufrir innumerables mejoras y perfeccionamiento,
en el caso de que quisiéramos un sistema más potente, y que requiriera controlar más
elementos, o realizar otras funciones.
Si empezamos por el software, utilizar Visual Basic para hacer el programa no es el
sistema mas apropiado. Fabricantes como CITECT, que es uno de los mas importantes
creadores de interfaces de control industrial tipo SCADA, utilizan un lenguaje de
programación similar llamado Cicode.
• Cicode es un lenguaje de programación. La estructura y la sintaxis del Cicode es
muy similar a la del lenguaje de programación Pascal, cuya principal diferencia es
que no incluye indicadores y conceptos asociados. Citect ofrece una rica
programación de la API de programación que incluye sofisticadas construcciones
tales como tareas concurrentes y los semáforos.
• Ejemplo programación en Cicode.
FUNCTION I0_Trace(STRING sPrompt)

INT hDev;
INT hTime;
STRING sText;

IF hTraceOn THEN
IF (StrLeft(sPrompt, StrLength(sMask)) = sMask) THEN
TraceMsg(sPrompt);

hTime = TimeCurrent();
sText = TimeToStr(hTime, 2)+" "+TimeToStr(hTime, 1)+"
"+sPrompt;

SemWait(hDebugSem, 10);
FileWriteLn(hDebugFile, sText);
SemSignal(hDebugSem);
END
END
END

En el tema hardware, empezaríamos por sustituir un bus paralelo, que si bien es más
potente que el serie, está limitado en cuanto a distancia y a número de datos a transmitir.
Por lo que sería otro punto mejorable dentro de nuestro sistema. Como estudiamos en la
primera parte del proyecto, la mayoría de los buses existentes hoy en DIA para entornos
industriales, se implementan sobre bus serie. Al sustituir esto cambiaremos también el
protocolo de comunicación por un más efectivo TCP IP por ejemplo. Nos permite un
mayor control del bus axial como detección de errores y un flujo de información mas
ordenado.
También podríamos introducir mejoras en los dispositivos electrónicos diseñados, sobre
todo en el circuito Estación Remota. Donde se le podría dotar de inteligencia utilizando un
microprocesador. A diferencia de ahora que la repartición de funciones la realiza un
decodificador

- 100 -
Bibliografía y Software empleado.

5. Bibliografía.
¾ " I he Measurement and Automation" calalog 2004 National Instrumentéis
¾ Revista "Instrumentación y Control Automático" n° 122
¾ "EtberNet/IP" Rockwell automation Noviembre 2000
¾ "NetLínx" Rockwell automation Noviembre 2002
¾ "Latinoamericana Advance" Siemens 2004
¾ "Sistemas De Control "Carmen D'Sousa www.monografias.com
¾ "Tecnologías y actividades de estandarización para la interconexión de Industrial
Networks" Alcatel para Fundación AUNA
¾ "Comunicaciones Industriales" Autores: V.Sempere, J. Silvestre, J.A. Martínez
Editorial: SPUPV (SPUPV-2002.213) Año:2002
¾ Departamento de Ingeniería de Sistemas y Automática Universidad de Vigo
¾ Universidad Miguel Hernández Dpto. Ingeniería.
¾ http://en.wikipedia.org/wiki/Citect
¾ http://es.wikipedia.org/wiki/Profibus_PA
¾ http://formacion.plcmadrid.es/descargas/docs/omron/ProfibusOmron.pdf
¾ Electrónica digital moderna. Teoría y Práctica . J.M.Angulo. Editorial Paraninfo.
¾ http://www.datasheetcatalog.net/es/datasheets_pdf/7/4/L/S/74LS74.shtml
¾ http://es.rs-online.com/web/
¾ http://www.alldatasheet.com/datasheet-pdf/pdf/27999/TI/74LS266.html
¾ Visual Basic Curso de programación Fco. Javier Ceballos Editorial ra-ma.

5.1. Software Empleado.


¾ Software de programación: Visual Basic 6.0
¾ Software de diseño y prueba : Multisim Power Pro Edition 10.0.144.
¾ Software de diseño: Rimu PCB 1.08.
¾ Software diseño gráfico. Microsoft Pain 5.1.
¾ Sistema Operativo Estación de trabajo: Windows XP SP3.
¾ Sistema Operativo PLC: Windows 98 SE.
¾ SimuladorDigital_095

- 101 -
Links datasheets

6. Link Datasheets.
¾ http://www.datasheetcatalog.org/datasheets/50/375549_DS.pdf
(74LS266)
¾ http://www.datasheetcatalog.org/datasheets/70/375318_DS.pdf
(74LS04)
¾ http://www.datasheetcatalog.org/datasheets/70/375337_DS.pdf
(74LS08)
¾ http://www.datasheetcatalog.org/datasheets/70/375334_DS.pdf
(74LS07)
¾ http://www.datasheetcatalog.org/datasheets/70/375703_DS.pdf
(74LS74)
¾ http://www.datasheetcatalog.org/datasheets/70/375646_DS.pdf
(74LS47)
¾ http://www.datasheetcatalog.org/datasheet/motorola/SN74LS148D.p
df (74LS147)
¾ http://www.datasheetcatalog.org/datasheets/105/361053_DS.pdf
(74LS192)
¾ http://www.datasheetcatalog.org/datasheet/fairchild/BD137.pdf
(BD137).

- 102 -
Índice de Anexos

ANEXOS

7. Anexo1: Rutinas Programadas. 104


7.1. Pantallas Estación de Trabajo. 104
7.1.1. Código Página Inicio: 104
7.1.2. Código Pantalla Entrada Manual. 106
7.1.3. Código Pantalla Password. 112
7.1.4. Código Pantalla Válvula amoníaco. 114
7.1.5. Código Pantalla Inicio. 116
7.1.6. Código Pantalla Entrada Manual. 119
7.1.7. Código Pantalla Gráficas. 124
7.1.8. Código Pantalla Entradas/Salidas. 132
7.1.9. Código Pantalla Máximos y Mínimos. 148
7.1.10. Código Pantalla NAcceso. 150
7.1.11. Código Pantalla NPASSWORD. 151
7.1.12. Código Pantalla PPRINAPOYO. 152
7.1.13. Código Pantalla Principal. 155
7.1.14. Código Pantalla REFRIG. 200
7.1.15. Código Pantalla RegAlarm. 203
7.2. Código PLC. 203
7.2.1. Código Pantalla Principal. 203
7.2.2. Código Pantalla Datos. 215
8. Anexo2: Planos 228
8.1. Planos Circuito Interface. 228
8.1.1. Esquema Eléctrico. 228
8.1.2. Fotolito Circuito Interface. 229
8.1.3. Esquema Componentes. 229
8.2. Planos Estación Remota. 231
8.2.1. Esquema eléctrico. 231
8.2.2. Fotolito Circuito Estación Remota. 232
8.2.3. Esquema componentes. 233
8.3. Planos Circuito Contador. 234
8.3.1. Esquema eléctrico. 234
8.3.2. Fotolito Circuito Contador. 235
8.3.3. Esquema Componentes. 236

- 103 -
Anexos1 Rutinas Programadas

7. Anexo1: Rutinas Programadas.

7.1. Pantallas Estación de trabajo.

7.1.1. Código Página Inicio:


Option Explicit
Dim opcion1 As Variant 'variable de elección de abrir o cerrar el
programa
Dim direccion, s As String 'variable dirección archivo de password
Dim psw As Variant ' variable que almacena es password
Dim msg As Variant
Dim ENCRIPT As Variant 'VARIABLE DE ENCRIPTADO
Dim act As Variant
Dim i As Integer

Private Sub Botonacceso_Click()


On Error GoTo B
direccion = App.Path & "\password.txt" 'entra en el archivo de
password y lo recupera para poderlo comparar con el introducido
Open direccion For Input As #1
On Error GoTo A 'en caso de que no haya nada en el archivo nos
lo indica.
Input #1, psw 'guarda lo que hay en el archivo en eta variable.
A:
If psw = "" Then
MsgBox "NO HAY PASSWORD GUARDADO", vbExclamation, "¡Atención!"
Load NPASSWORD
NPASSWORD.Visible = True
Close #1
Exit Sub
End If
Close #1
If Acceso1.Text = psw Then
ProgressBar1.Visible = True
Call CARGARPROGRAMA
Load PPrincipal
PPrincipal.Visible = True
Unload Form1
Else
MsgBox "¡PASSWORD INCORRECTO!", vbCritical, "¡ERROR!"
Acceso1 = ""
Acceso1.SetFocus
Exit Sub
End If
GoTo C
B:
MsgBox "¡Error acceso Password!", vbCritical, "¡ERROR!"
C:
End Sub

Private Sub ButtonMac1_Click()


act = MsgBox("¿ Salvar los cambios ?" & Chr(13), 324, "ATENCION")
- 104 -
Anexos1 Rutinas Programadas

If act = 7 Then
Else
ProgressBar1.Visible = True
Dim EXL As Excel.Application
Set EXL = New Excel.Application
Dim w As Excel.Workbook
Set w = EXL.Workbooks.Open(App.Path + "\MAXMIN.xls")
Dim s As Excel.Worksheet
Set s = w.Sheets("Hoja1")
For i = 2 To 23
ProgressBar1.Value = i
s.Range("C" & i).Value = MAX(i)
s.Range("D" & i).Value = MIN(i)
Next
Set s = Nothing
w.Save
w.Close
Set w = Nothing
Set EXL = Nothing
End If
Timer1.Enabled = True
End Sub

Private Sub CPassword_Click()


Load NPASSWORD
NPASSWORD.Visible = True
End Sub

Private Sub Form_Load()


Fecha.Caption = Date 'carga la fecha
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
If App.PrevInstance Then 'Rutina para detectar que el proyecto
ya está en ejecución y no lo repita
msg = App.EXEName & "Proyecto final de carrera.EXE" & " ya
está en ejecución"
MsgBox msg, 16, "Aplicación."
End
End If
End Sub

Private Sub Option1_Click()


Acceso1.PasswordChar = ""
End Sub

Private Sub Option2_Click()


Acceso1.PasswordChar = "*"
End Sub
Private Sub ACCESO1_CLICK()
Load Form2

105
Anexos1 Rutinas Programadas

Form2.Visible = True
NUM = 1
Form2.Frame2.Enabled = True
End Sub
Private Sub ACCESO1_KeyPress(KeyAscii As Integer) 'Realiza la misma
función que el botón acceder pero pulsando el botón Return del
teclado.
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
Call Botonacceso_Click
End If
End Sub

Private Sub Salir_Click()


End
End Sub

Private Sub Timer1_Timer()


End
End Sub
Private Sub CARGARPROGRAMA() ' carga los datos desde la hoja de
Excel hasta las 4 matrices
Dim EXL As Excel.Application
Set EXL = New Excel.Application
Dim w As Excel.Workbook
Set w = EXL.Workbooks.Open(App.Path + "\MAXMIN.xls")
Dim s As Excel.Worksheet
Set s = w.Sheets("Hoja1")
For i = 2 To 23
ProgressBar1.Value = i
MAX(i) = s.Range("C" & i).Value
MIN(i) = s.Range("D" & i).Value
UNI(i) = s.Range("E" & i).Value
referen(i) = s.Range("f" & i).Value
Next
Set s = Nothing
w.Save
w.Close
Set w = Nothing
Set EXL = Nothing
End Sub

7.1.2. Código Pantalla Entrada Manual:


Option Explicit
Dim mem(30) As Variant
Dim i, i2 As Integer

Private Sub ButtonMac1_Click()


Dim lR As Long
lR = SetTopMostWindow(Form2.hWnd, False)

106
Anexos1 Rutinas Programadas

Frame2.Enabled = False
Unload Form2
End Sub

Private Sub Command1_Click()


Text1 = Text1 & 1
i = i + 1
mem(i) = 1
End Sub

Private Sub Command10_Click()


Text1 = Text1 & 0
i = i + 1
mem(i) = 0
End Sub

Private Sub Command11_Click()


If Text1 = "" Then
Text1 = "-"
End If
i = i + 1
mem(i) = "-"
End Sub

Private Sub Command12_Click()


Text1 = Text1 & ","
i = i + 1
mem(i) = ","
End Sub

Private Sub Command13_Click()


If Text1 = "" Then
MsgBox "No se han introducido valores", vbExclamation,
"¡Atención!"
Exit Sub
End If
Select Case NUM
Case 1
Form1.Acceso1 = Form2.Text1
Case 2
NAcceso.Text1 = Form2.Text1
Case 3
NAcceso.Text2 = Form2.Text1
Case 4
MAXMIN.Text1 = Form2.Text1
Case 5
PPrincipal.Text18 = Form2.Text1
Case 6
MAXMIN.Text2 = Form2.Text1

107
Anexos1 Rutinas Programadas

End Select
Call Command42_Click
Frame2.Enabled = False
Unload Form2
End Sub

Private Sub Command14_Click()


Text1 = Text1 & "A"
i = i + 1
mem(i) = "A"
End Sub

Private Sub Command15_Click()


Text1 = Text1 & "B"
i = i + 1
mem(i) = "B"
End Sub

Private Sub Command16_Click()


Text1 = Text1 & "C"
i = i + 1
mem(i) = "C"
End Sub

Private Sub Command17_Click()


Text1 = Text1 & "D"
i = i + 1
mem(i) = "D"
End Sub

Private Sub Command18_Click()


Text1 = Text1 & "E"
i = i + 1
mem(i) = "E"
End Sub

Private Sub Command19_Click()


Text1 = Text1 & "F"
i = i + 1
mem(i) = "F"
End Sub

Private Sub Command2_Click()


Text1 = Text1 & 2
i = i + 1
mem(i) = 2
End Sub

Private Sub Command20_Click()


Text1 = Text1 & "G"
i = i + 1
mem(i) = "G"
End Sub

108
Anexos1 Rutinas Programadas

Private Sub Command21_Click()


Text1 = Text1 & "H"
i = i + 1
mem(i) = "H"
End Sub

Private Sub Command22_Click()


Text1 = Text1 & "I"
i = i + 1
mem(i) = "I"
End Sub

Private Sub Command23_Click()


Text1 = Text1 & "J"
i = i + 1
mem(i) = "J"
End Sub

Private Sub Command24_Click()


Text1 = Text1 & "K"
i = i + 1
mem(i) = "K"
End Sub

Private Sub Command25_Click()


Text1 = Text1 & "L"
i = i + 1
mem(i) = "L"
End Sub

Private Sub Command26_Click()


Text1 = Text1 & "M"
i = i + 1
mem(i) = "M"
End Sub

Private Sub Command27_Click()


Text1 = Text1 & "N"
i = i + 1
mem(i) = "N"
End Sub

Private Sub Command28_Click()


Text1 = Text1 & "Ñ"
i = i + 1
mem(i) = "Ñ"
End Sub

Private Sub Command29_Click()


Text1 = Text1 & "O"
i = i + 1
mem(i) = "O"
End Sub

109
Anexos1 Rutinas Programadas

Private Sub Command3_Click()


Text1 = Text1 & 3
i = i + 1
mem(i) = 3
End Sub

Private Sub Command30_Click()


Text1 = Text1 & "P"
i = i + 1
mem(i) = "P"
End Sub

Private Sub Command31_Click()


Text1 = Text1 & "Q"
i = i + 1
mem(i) = "Q"
End Sub

Private Sub Command32_Click()


Text1 = Text1 & "R"
i = i + 1
mem(i) = "R"
End Sub

Private Sub Command33_Click()


Text1 = Text1 & "S"
i = i + 1
mem(i) = "S"
End Sub

Private Sub Command34_Click()


Text1 = Text1 & "T"
i = i + 1
mem(i) = "T"
End Sub

Private Sub Command35_Click()


Text1 = Text1 & "U"
i = i + 1
mem(i) = "U"
End Sub

Private Sub Command36_Click()


Text1 = Text1 & "V"
i = i + 1
mem(i) = "V"
End Sub

Private Sub Command37_Click()


Text1 = Text1 & "W"
i = i + 1
mem(i) = "W"
End Sub

110
Anexos1 Rutinas Programadas

Private Sub Command38_Click()


Text1 = Text1 & "X"
i = i + 1
mem(i) = "X"
End Sub

Private Sub Command39_Click()


Text1 = Text1 & "Y"
i = i + 1
mem(i) = "Y"
End Sub

Private Sub Command4_Click()


Text1 = Text1 & 5
i = i + 1
mem(i) = 5
End Sub

Private Sub Command40_Click()


Text1 = Text1 & "Z"
i = i + 1
mem(i) = "Z"
End Sub

Private Sub Command41_Click()


For i2 = 1 To 30
If i2 = i Then
mem(i2) = ""
i = i - 1
End If
If mem(i2) = "" Then
GoTo A
End If
Next
A:
Text1 = ""
For i2 = 1 To 30
Text1 = Text1 & mem(i2)
If mem(i2) = "" Then
Exit Sub
End If
Next

End Sub

Private Sub Command42_Click()


Text1 = ""
For i2 = 1 To 30
mem(i2) = ""
Next
i = 0
End Sub

111
Anexos1 Rutinas Programadas

Private Sub Command43_Click()


Text1 = Text1 & " "
End Sub

Private Sub Command5_Click()


Text1 = Text1 & 6
i = i + 1
mem(i) = 6
End Sub

Private Sub Command6_Click()


Text1 = Text1 & 7
i = i + 1
mem(i) = 7
End Sub

Private Sub Command7_Click()


Text1 = Text1 & 4
i = i + 1
mem(i) = 4
End Sub

Private Sub Command8_Click()


Text1 = Text1 & 8
i = i + 1
mem(i) = 8
End Sub

Private Sub Command9_Click()


Text1 = Text1 & 9
i = i + 1
mem(i) = 9
End Sub

Private Sub Form_Load()


Dim lR As Long
lR = SetTopMostWindow(Form2.hWnd, True)
End Sub
Private Sub TEXT1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
Call Command13_Click
End If
End Sub

7.1.3. Código Pantalla Modificar Password.


Option Explicit
Dim A As Integer 'VARIABLE PARA IDENTIFICAR TIPO DE ERROR
Dim direccion As String 'variable direccion archivo de password
Dim psw, psw2 As Variant ' variable que almacena es password
Dim ENCRIPT As Variant 'VARIABLE DE ENCRIPTADO

Private Sub ButtonMac1_Click()


If Text1 = "" Then
112
Anexos1 Rutinas Programadas

A = 1
Call error
Exit Sub
End If
If Text2 = "" Then
A = 2
Call error
Exit Sub
End If
If Text1 = Text2 Then
Else
A = 3
Call error
Exit Sub
End If
psw = Text2.Text
'ENCRIPT = Encriptado(psw)
direccion = App.Path & "\password.txt"
Open direccion For Output As #1
Print #1, psw
Close #1
Form1.Acceso1.SetFocus
Unload NPASSWORD
End Sub

Private Sub ButtonMac2_Click()


Dim lR As Long
lR = SetTopMostWindow(NAcceso.hWnd, False)
Unload NPASSWORD
End Sub

Private Sub Form_Load()


Dim lR As Long
lR = SetTopMostWindow(NPASSWORD.hWnd, True)
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
End Sub

Private Sub error()


Select Case A
Case 1
MsgBox "¡No ha introducido ningún password!", vbInformation,
"¡ATENCIÓN!"
Text1.SetFocus
Case 2
MsgBox "¡No ha verificado el password!", vbInformation, "¡ATENCIÓN!"
Text2.SetFocus
Case 3
MsgBox "¡Los Passwords no coinciden!", vbInformation, "¡ATENCIÓN!"
End Select
End Sub

Private Sub TEXT2_KeyPress(KeyAscii As Integer)


If KeyAscii = vbKeyReturn Then

113
Anexos1 Rutinas Programadas

KeyAscii = 0
Call Command1_Click
End If
End Sub
7.1.4. Código Válvula Amoniaco.
Option Explicit
Dim MAX As Integer

Private Sub ButtonMac1_Click()


AMONIAC.Hide
End Sub

Private Sub Form_Load()


Dim lR As Long
lR = SetTopMostWindow(AMONIAC.hWnd, True) 'ENCLAVA LA PANTALLA AL
FRENTE
AMONIAC.Width = 2640
AMONIAC.Height = 8370
Text4 = PPrincipal.Text21
Text2 = Text4 & " ºC"
PROGRESO.Value = 0
End Sub

Private Sub HScroll1_Change()


Text3 = HScroll1.Value / 10
Text1 = Text3 & " %"
APERTURA.Value = HScroll1.Value / 10
If PPrincipal.Picture38.Visible = True Then
If HScroll1.Value > 0 Then
Timer1.Enabled = True
Else
Timer1.Enabled = False
End If
ElseIf PPrincipal.Picture37.Visible = True Then
If HScroll1.Value > 0 Then
Timer1.Enabled = True
Else
Timer1.Enabled = False
End If
End If
Text4 = PPrincipal.Text21
Text2 = Text4 & " º"
SALMU = Text3
PROGRESO.Value = HScroll1.Value / 10
End Sub

Private Sub Picture2_Click()


If Timer2.Enabled = True Then
Timer2.Enabled = False
Else
Timer2.Enabled = True
End If
If Timer3.Enabled = True Then
Timer3.Enabled = False
114
Anexos1 Rutinas Programadas

Else
Timer3.Enabled = True
End If
End Sub

Private Sub Picture3_Click()


If Timer2.Enabled = True Then
Timer2.Enabled = False
Else
Timer2.Enabled = True
End If
If Timer3.Enabled = True Then
Timer3.Enabled = False
Else
Timer3.Enabled = True
End If
End Sub

Private Sub Timer1_Timer()


Text4 = PPrincipal.Text21
CAUDAL.Value = Text4 + 50
If Text4 > 0 Then
PPrincipal.Picture37.Visible = False
PPrincipal.Picture38.Visible = True
Else
PPrincipal.Picture38.Visible = False
PPrincipal.Picture37.Visible = True
End If
Text2 = Text4 & " ºC"
End Sub

Private Sub TEXT2_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub
Private Sub TEXT1_KeyPress(KeyAscii As Integer)
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub
Private Function Aleatorio(Minimo As Long, Maximo As Long) As Long
Randomize ' inicializar la semilla
Aleatorio = CLng((Minimo - Maximo) * Rnd + Maximo)
End Function

Private Sub Timer2_Timer()


If Picture2.Visible = True Then
Picture2.Visible = False
Picture3.Visible = True

115
Anexos1 Rutinas Programadas

Else
Picture3.Visible = False
Picture2.Visible = True
End If
End Sub

Private Sub Timer3_Timer()


If PPrincipal.Text21 > 15 Then
If HScroll1.Value = HScroll1.MAX Then
Else
HScroll1.Value = HScroll1.Value + 1
End If
ElseIf PPrincipal.Text21 < 15 Then
If HScroll1.Value = HScroll1.MIN Then
Else
HScroll1.Value = HScroll1.Value - 1
End If
End If
Text4 = PPrincipal.Text21
Text2 = Text4 & " º"
End Sub

7.1.5. Código Pantalla Inicio.


Option Explicit
Dim opcion1 As Variant 'variable de elección de abrir o cerrar el
programa
Dim direccion, s As String 'variable direccion archivo de password
Dim psw As Variant ' variable que almacena es password
Dim msg As Variant
Dim ENCRIPT As Variant 'VARIABLE DE ENCRIPTADO
Dim act As Variant
Dim i As Integer

Private Sub Botonacceso_Click()


On Error GoTo B
direccion = App.Path & "\password.txt" 'entra en el archivo de
password y lo recupera para poderlo comparar con el introducido
Open direccion For Input As #1
On Error GoTo A 'en caso de que no haya nada en el archivo nos
lo indica.
Input #1, psw 'guarda lo que hay en el archivo en eta variable.
A:
If psw = "" Then
MsgBox "NO HAY PASSWORD GUARDADO", vbExclamation,
"¡Atención!"
Load NPASSWORD
NPASSWORD.Visible = True
Close #1
Exit Sub
End If
Close #1
If Acceso1.Text = psw Then
ProgressBar1.Visible = True
Call CARGARPROGRAMA
116
Anexos1 Rutinas Programadas

Load PPrincipal
PPrincipal.Visible = True
Unload Form1
Else
MsgBox "¡PASSWORD INCORRECTO!", vbCritical, "¡ERROR!"
Acceso1 = ""
Acceso1.SetFocus
Exit Sub
End If
GoTo C
B:
MsgBox "¡Error acceso Password!", vbCritical, "¡ERROR!"
C:
End Sub

Private Sub ButtonMac1_Click()


act = MsgBox("¿ Salvar los cambios ?" & Chr(13), 324, "ATENCION")
If act = 7 Then
Else
ProgressBar1.Visible = True
Dim EXL As Excel.Application
Set EXL = New Excel.Application
Dim w As Excel.Workbook
Set w = EXL.Workbooks.Open(App.Path + "\MAXMIN.xls")
Dim s As Excel.Worksheet
Set s = w.Sheets("Hoja1")
For i = 2 To 23
ProgressBar1.Value = i
s.Range("C" & i).Value = MAX(i)
s.Range("D" & i).Value = MIN(i)
Next
Set s = Nothing
w.Save
w.Close
Set w = Nothing
Set EXL = Nothing
End If
Timer1.Enabled = True
End Sub

Private Sub CPassword_Click()


Load NPASSWORD
NPASSWORD.Visible = True
End Sub

Private Sub Form_Load()


Fecha.Caption = Date 'carga la fecha
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
If App.PrevInstance Then 'Rutina para detectar que el proyecto
ya está en ejecución y no lo repita
msg = App.EXEName & "Proyecto final de carrera.EXE" & " ya
está en ejecución"
MsgBox msg, 16, "Aplicación."

117
Anexos1 Rutinas Programadas

End
End If
End Sub

Private Sub Option1_Click()


Acceso1.PasswordChar = ""
End Sub

Private Sub Option2_Click()


Acceso1.PasswordChar = "*"
End Sub

Private Sub ACCESO1_CLICK()


Load Form2
Form2.Visible = True
NUM = 1
Form2.Frame2.Enabled = True
End Sub
Private Sub ACCESO1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
Call Botonacceso_Click
End If
End Sub

Private Sub Salir_Click()


End
End Sub

Private Sub Timer1_Timer()


End
End Sub
Private Sub CARGARPROGRAMA()
Dim EXL As Excel.Application
Set EXL = New Excel.Application
Dim w As Excel.Workbook
Set w = EXL.Workbooks.Open(App.Path + "\MAXMIN.xls")
Dim s As Excel.Worksheet
Set s = w.Sheets("Hoja1")
For i = 2 To 23
ProgressBar1.Value = i
MAX(i) = s.Range("C" & i).Value
MIN(i) = s.Range("D" & i).Value
UNI(i) = s.Range("E" & i).Value
referen(i) = s.Range("f" & i).Value
Next
Set s = Nothing
w.Save
w.Close
Set w = Nothing
Set EXL = Nothing
End Sub

118
Anexos1 Rutinas Programadas

7.1.6. Código Pantalla Entrada Manual.


Option Explicit
Dim mem(30) As Variant
Dim i, i2 As Integer

Private Sub ButtonMac1_Click()


Dim lR As Long
lR = SetTopMostWindow(Form2.hWnd, False)
Frame2.Enabled = False
Unload Form2
End Sub

Private Sub Command1_Click()


text1 = text1 & 1
i = i + 1
mem(i) = 1
End Sub

Private Sub Command10_Click()


text1 = text1 & 0
i = i + 1
mem(i) = 0
End Sub

Private Sub Command11_Click()


If text1 = "" Then
text1 = "-"
End If
i = i + 1
mem(i) = "-"
End Sub

Private Sub Command12_Click()


text1 = text1 & ","
i = i + 1
mem(i) = ","
End Sub

Private Sub Command13_Click()


If text1 = "" Then
MsgBox "No se han introducido valores", vbExclamation,
"¡Atención!"
Exit Sub
End If
Select Case NUM
Case 1
Form1.Acceso1 = Form2.text1
Case 2
NAcceso.text1 = Form2.text1
Case 3
NAcceso.Text2 = Form2.text1
Case 4
MAXMIN.text1 = Form2.text1
Case 5
119
Anexos1 Rutinas Programadas

PPrincipal.Text18 = Form2.text1
Case 6
MAXMIN.Text2 = Form2.text1
End Select
Call Command42_Click
Frame2.Enabled = False
Unload Form2
End Sub

Private Sub Command14_Click()


text1 = text1 & "A"
i = i + 1
mem(i) = "A"
End Sub

Private Sub Command15_Click()


text1 = text1 & "B"
i = i + 1
mem(i) = "B"
End Sub

Private Sub Command16_Click()


text1 = text1 & "C"
i = i + 1
mem(i) = "C"
End Sub

Private Sub Command17_Click()


text1 = text1 & "D"
i = i + 1
mem(i) = "D"
End Sub

Private Sub Command18_Click()


text1 = text1 & "E"
i = i + 1
mem(i) = "E"
End Sub

Private Sub Command19_Click()


text1 = text1 & "F"
i = i + 1
mem(i) = "F"
End Sub

Private Sub Command2_Click()


text1 = text1 & 2
i = i + 1
mem(i) = 2
End Sub

Private Sub Command20_Click()


text1 = text1 & "G"
i = i + 1

120
Anexos1 Rutinas Programadas

mem(i) = "G"
End Sub

Private Sub Command21_Click()


text1 = text1 & "H"
i = i + 1
mem(i) = "H"
End Sub

Private Sub Command22_Click()


text1 = text1 & "I"
i = i + 1
mem(i) = "I"
End Sub

Private Sub Command23_Click()


text1 = text1 & "J"
i = i + 1
mem(i) = "J"
End Sub

Private Sub Command24_Click()


text1 = text1 & "K"
i = i + 1
mem(i) = "K"
End Sub

Private Sub Command25_Click()


text1 = text1 & "L"
i = i + 1
mem(i) = "L"
End Sub

Private Sub Command26_Click()


text1 = text1 & "M"
i = i + 1
mem(i) = "M"
End Sub

Private Sub Command27_Click()


text1 = text1 & "N"
i = i + 1
mem(i) = "N"
End Sub

Private Sub Command28_Click()


text1 = text1 & "Ñ"
i = i + 1
mem(i) = "Ñ"
End Sub

Private Sub Command29_Click()


text1 = text1 & "O"
i = i + 1

121
Anexos1 Rutinas Programadas

mem(i) = "O"
End Sub

Private Sub Command3_Click()


text1 = text1 & 3
i = i + 1
mem(i) = 3
End Sub

Private Sub Command30_Click()


text1 = text1 & "P"
i = i + 1
mem(i) = "P"
End Sub

Private Sub Command31_Click()


text1 = text1 & "Q"
i = i + 1
mem(i) = "Q"
End Sub

Private Sub Command32_Click()


text1 = text1 & "R"
i = i + 1
mem(i) = "R"
End Sub

Private Sub Command33_Click()


text1 = text1 & "S"
i = i + 1
mem(i) = "S"
End Sub

Private Sub Command34_Click()


text1 = text1 & "T"
i = i + 1
mem(i) = "T"
End Sub

Private Sub Command35_Click()


text1 = text1 & "U"
i = i + 1
mem(i) = "U"
End Sub

Private Sub Command36_Click()


text1 = text1 & "V"
i = i + 1
mem(i) = "V"
End Sub

Private Sub Command37_Click()


text1 = text1 & "W"
i = i + 1

122
Anexos1 Rutinas Programadas

mem(i) = "W"
End Sub

Private Sub Command38_Click()


text1 = text1 & "X"
i = i + 1
mem(i) = "X"
End Sub

Private Sub Command39_Click()


text1 = text1 & "Y"
i = i + 1
mem(i) = "Y"
End Sub

Private Sub Command4_Click()


text1 = text1 & 5
i = i + 1
mem(i) = 5
End Sub

Private Sub Command40_Click()


text1 = text1 & "Z"
i = i + 1
mem(i) = "Z"
End Sub

Private Sub Command41_Click()


For i2 = 1 To 30
If i2 = i Then
mem(i2) = ""
i = i - 1
End If
If mem(i2) = "" Then
GoTo A
End If
Next
A:
text1 = ""
For i2 = 1 To 30
text1 = text1 & mem(i2)
If mem(i2) = "" Then
Exit Sub
End If
Next

End Sub

Private Sub Command42_Click()


text1 = ""
For i2 = 1 To 30
mem(i2) = ""
Next
i = 0

123
Anexos1 Rutinas Programadas

End Sub

Private Sub Command43_Click()


text1 = text1 & " "
End Sub

Private Sub Command5_Click()


text1 = text1 & 6
i = i + 1
mem(i) = 6
End Sub

Private Sub Command6_Click()


text1 = text1 & 7
i = i + 1
mem(i) = 7
End Sub

Private Sub Command7_Click()


text1 = text1 & 4
i = i + 1
mem(i) = 4
End Sub

Private Sub Command8_Click()


text1 = text1 & 8
i = i + 1
mem(i) = 8
End Sub

Private Sub Command9_Click()


text1 = text1 & 9
i = i + 1
mem(i) = 9
End Sub

Private Sub Form_Load()


Dim lR As Long
lR = SetTopMostWindow(Form2.hWnd, True)
End Sub
Private Sub TEXT1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
Call Command13_Click
End If
End Sub

7.1.7. Código Pantalla Gráficas.


Dim Start_Pos
Dim End_Pos
Dim X
Dim A, B, C, D, E, F
Dim ampl1, ampl2, AMPL3, AMPL4, AMPL5, AMPL6, X2, POS, var1, var2,
var3 As Integer
124
Anexos1 Rutinas Programadas

Dim CANAL1, CANAL2, CANAL3 As Boolean


Dim REG(17000) As Integer
Dim REG2(17000) As Integer
Private Declare Function SendMessage Lib "user32" Alias
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam
As Long, lParam As Any) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Dim xx As Integer

Private Sub ButtonMac1_Click()


Dim lR As Long
lR = SetTopMostWindow(GRAFICAS.hWnd, False) 'DESACTIVA EL
ENCLAVAMIENTO DE PANTALLA AL FRENTE
Timer1.Enabled = False
Timer2.Enabled = False
PPrincipal.Timer12.Enabled = False
ampl1 = 0
ampl2 = 0
AMPL3 = 0
AMPL4 = 0
AMPL5 = 0
AMPL6 = 0
X2 = 0
POS = 0
var1 = 0
var2 = 0
var3 = 0
X = 0
A = 0
B = 0
C = 0
D = 0
E = 0
F = 0
C1A = 0
C1B = 0
C1C = 0
CANAL1 = False
CANAL2 = False
CANAL3 = False
Unload Me
End Sub

Private Sub ButtonMac2_Click()


If Timer1.Enabled = True Then
Timer1.Enabled = False
Timer2.Enabled = False
Else
Timer1.Enabled = True
Timer2.Enabled = True
End If
If ButtonMac2.Caption = "Pausa ||" Then
ButtonMac2.Caption = "Reanudar"
Else

125
Anexos1 Rutinas Programadas

ButtonMac2.Caption = "Pausa ||"


End If
End Sub

Private Sub ButtonMac3_Click()


HScroll2.Value = 2
HScroll2.Value = 1
If Timer3.Enabled = True Then
Timer3.Enabled = False
Else
Timer3.Enabled = True
End If
End Sub

Private Sub Check1_Click()


Frame2.Visible = True
Shape7.Visible = True
End Sub

Private Sub Check2_Click()


Frame2.Visible = False
Shape7.Visible = False
End Sub

Private Sub Command1_Click()


If CANAL1 = False Then
CANAL1 = True
Label1.Caption = "CANAL1"
Shape4.Visible = True
Else
CANAL1 = False
Shape4.Visible = False
End If
Shape1.Visible = True
Shape2.Visible = False
Shape3.Visible = False
Text6 = 12
End Sub

Private Sub Command2_Click()


If CANAL2 = False Then
CANAL2 = True
Label1.Caption = "CANAL2"
Shape5.Visible = True
Else
CANAL2 = False
Shape5.Visible = False
End If
Shape1.Visible = False
Shape2.Visible = True
Shape3.Visible = False
End Sub

Private Sub Command3_Click()

126
Anexos1 Rutinas Programadas

If CANAL3 = False Then


CANAL3 = True
Label1.Caption = "CANAL3"
Shape6.Visible = True
Else
CANAL3 = False
Shape6.Visible = False
End If
Shape1.Visible = False
Shape2.Visible = False
Shape3.Visible = True
End Sub

Private Sub Command4_Click()


PPrincipal.Timer3.Enabled = False
PPrincipal.Text1.BackColor = &H80000005
PPrincipal.Text1.ForeColor = &H80000008
PPrincipal.INTAGITADOR.BackColor = &HFFFFFF
PPrincipal.Text6.BackColor = &HFFFFFF
PPrincipal.Text8.BackColor = &HFFFFFF
MSGALRM = 0
PPrincipal.Shape5.Visible = False
End Sub

Private Sub FlatScrollBar1_Change()


HScroll1.MAX = (500 * FlatScrollBar1.Value)
Text1 = FlatScrollBar1.Value
End Sub
Private Sub Form_Load()
Dim lR As Long
lR = SetTopMostWindow(GRAFICAS.hWnd, True) 'ENCLAVA LA PANTALLA AL
FRENTE
Timer1.Enabled = False
Timer2.Enabled = False
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
Start_Pos = 0
End_Pos = 0
Randomize
ampl1 = 300
ampl2 = 2
AMPL3 = 400
AMPL4 = 2
AMPL5 = 300
AMPL6 = 2
Timer1.Enabled = True
Timer2.Enabled = True
Select Case GRAF
Case 1
Label8.Caption = "Int.Bomba vaciado Reactor"
Label9.Caption = "Rev.Bomba vaciado Reactor"
Label10.Caption = "Caudal Bomba vaciado Reactor"
Case 2
Label8.Caption = "Apertura Válvula en %"

127
Anexos1 Rutinas Programadas

Label9.Caption = "Caudal refrigeración"


Label10.Caption = "Temperatura líquido"
End Select
Frame2.Visible = False
Shape7.Visible = False
Picture1.Left = 0
FlatScrollBar1.Value = 0
HScroll2.Value = 1
End Sub

Private Sub HScroll1_Change()


If Shape1.Visible = True Then
ampl1 = HScroll1.Value
End If
If Shape2.Visible = True Then
AMPL3 = HScroll1.Value
End If
If Shape3.Visible = True Then
AMPL5 = HScroll1.Value
End If
Text4 = HScroll1.Value
End Sub

Private Sub HScroll2_Change()


If Shape1.Visible = True Then
ampl2 = HScroll2.Value
End If
If Shape2.Visible = True Then
AMPL4 = HScroll2.Value
End If
If Shape3.Visible = True Then
AMPL6 = HScroll2.Value
End If
Text3 = HScroll2.Value
End Sub

Private Sub Timer1_Timer()


X = X + 1 'incrementa la variable
If X < 300 Then
Else
Picture1.Left = Picture1.Left - 38
End If
If Picture1.Left < -17000 Then
Picture1.Cls
Picture1.Left = 0
X = 0
X2 = 0
Start_Pos = xx
End_Pos = 0
B = 0
A = 0
C = 0
D = 0
E = 0

128
Anexos1 Rutinas Programadas

F = 0
Else
Picture1.ScaleMode = 3
If CANAL1 = True Then
Picture1.ForeColor = &HFF00&
Picture1.Line (Start_Pos, B)-(End_Pos, A)
VAL1 = Aleatorio(CLng(4), CLng(12))
Text11 = C1B
End If
If CANAL2 = True Then
Picture1.ForeColor = &HFF&
Picture1.Line (Start_Pos, D)-(End_Pos, C)
val2 = Aleatorio(CLng(10), CLng(17))
Text12 = C1A
End If
If CANAL3 = True Then
Picture1.ForeColor = &HFFFF&
Picture1.Line (Start_Pos, F)-(End_Pos, E)
val3 = Aleatorio(CLng(1), CLng(10))
Text13 = C1C
End If
B = A
D = C
F = E
Start_Pos = End_Pos
End_Pos = End_Pos + 2.5
End If
End Sub

Private Sub Timer2_Timer()


On Error GoTo z
A = ((C1B * ampl2 * -1) + ampl1)
On Error GoTo z
C = Int((C1A * AMPL4 * -1) + AMPL3)
On Error GoTo z
E = Int((C1C * AMPL6 * -1) + AMPL5)
z:
End Sub

Private Function Aleatorio(Minimo As Long, Maximo As Long) As Long


Randomize ' inicializar la semilla
Aleatorio = CLng((Minimo - Maximo) * Rnd + Maximo)
End Function

Private Sub Picture2_Click()


Shape1.Visible = True
Shape2.Visible = False
Shape3.Visible = False
HScroll1.Value = 0
FlatScrollBar1.Value = 1
Label1.Caption = "CANAL1"
End Sub

Private Sub Picture3_Click()

129
Anexos1 Rutinas Programadas

Shape1.Visible = False
Shape2.Visible = True
Shape3.Visible = False
HScroll1.Value = 0
FlatScrollBar1.Value = 1
Label1.Caption = "CANAL2"
End Sub

Private Sub PICTURE4_CLICK()


Shape1.Visible = False
Shape2.Visible = False
Shape3.Visible = True
HScroll1.Value = 0
FlatScrollBar1.Value = 1
Label1.Caption = "CANAL3"
End Sub

Private Sub Timer3_Timer()


If Shape1.Visible = True Then
On Error GoTo G
ProgressBar1.MAX = Text11 + 300
ProgressBar = Text4
G:
If HScroll1.Value - Text11 < 201 Then
If HScroll1.Value = HScroll1.MAX Then
If FlatScrollBar1.Value = FlatScrollBar1.MAX Then
Timer3.Enabled = False
MsgBox "Span fuera de rango", vbExclamation,
"¡Atención!"
Else
FlatScrollBar1.Value = FlatScrollBar1.Value + 1
End If
Else
HScroll1.Value = HScroll1.Value + 1
End If
ElseIf HScroll1.Value - Text11 > 201 Then
If HScroll1.Value = HScroll1.MIN Then
If FlatScrollBar1.Value = FlatScrollBar1.MIN Then
Timer3.Enabled = False
MsgBox "Span fuera de rango", vbExclamation,
"¡Atención!"
Else
FlatScrollBar1.Value = FlatScrollBar1.Value - 1
HScroll1.Value = HScroll1.MAX
End If
Else
On Error GoTo ZZZ
HScroll1.Value = HScroll1.Value + 1
ZZZ:
End If
End If
If HScroll1.Value - Text11 = 201 Then
Timer3.Enabled = False
MsgBox "CANAL1 Ajustado", vbInformation, "¡Atención!"

130
Anexos1 Rutinas Programadas

ProgressBar1.Value = 0
End If
End If
If Shape2.Visible = True Then
On Error GoTo D
ProgressBar1.MAX = Text12 + 300
ProgressBar1.Value = Text4
D:
If HScroll1.Value - Text12 < 201 Then
If HScroll1.Value = HScroll1.MAX Then
If FlatScrollBar1.Value = FlatScrollBar1.MAX Then
Timer3.Enabled = False
MsgBox "Span fuera de rango", vbExclamation,
"¡Atención!"
Else
FlatScrollBar1.Value = FlatScrollBar1.Value + 1
End If
Else
HScroll1.Value = HScroll1.Value + 1
End If
ElseIf HScroll1.Value - Text12 > 201 Then
If HScroll1.Value = HScroll1.MIN Then
If FlatScrollBar1.Value = FlatScrollBar1.MIN Then
Timer3.Enabled = False
MsgBox "Span fuera de rango", vbExclamation,
"¡Atención!"
Else
FlatScrollBar1.Value = FlatScrollBar1.Value - 1
HScroll1.Value = HScroll1.MAX
End If
Else
On Error GoTo ZZ
HScroll1.Value = HScroll1.Value + 1
ZZ:
End If
End If

If HScroll1.Value - Text12 = 201 Then


Timer3.Enabled = False
MsgBox "CANAL2 Ajustado", vbInformation, "¡Atención!"
ProgressBar1.Value = 0
End If
End If
If Shape3.Visible = True Then
On Error GoTo J
ProgressBar1.Value = Text13 + 300
ProgressBar1.Value = Text4
J:
If HScroll1.Value - Text13 < 201 Then
If HScroll1.Value = HScroll1.MAX Then
If FlatScrollBar1.Value = FlatScrollBar1.MAX Then
Timer3.Enabled = False
MsgBox "Span fuera de rango", vbExclamation,
"¡Atención!"

131
Anexos1 Rutinas Programadas

Else
FlatScrollBar1.Value = FlatScrollBar1.Value + 1
End If
Else
HScroll1.Value = HScroll1.Value + 1
End If
ElseIf HScroll1.Value - Text13 > 201 Then
If HScroll1.Value = HScroll1.MIN Then
If FlatScrollBar1.Value = FlatScrollBar1.MIN Then
Timer3.Enabled = False
MsgBox "Span fuera de rango", vbExclamation,
"¡Atención!"
Else
FlatScrollBar1.Value = FlatScrollBar1.Value - 1
HScroll1.Value = HScroll1.MAX
End If
Else
HScroll1.Value = HScroll1.Value + 1
End If
End If
If HScroll1.Value - Text13 = 201 Then
Timer3.Enabled = False
MsgBox "CANAL3 Ajustado", vbInformation, "¡Atención!"
ProgressBar1.Value = 0
End If
End If
End Sub

7.1.8. Código Pantalla Entradas/Salidas.


Option Explicit
Dim i, J, J0, J1, J2, J3, J4, MEMENTRADA As Integer
Dim led As Byte
Dim Control As Boolean
Dim bRetVal As Boolean, bit As Byte
Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer,
ByVal Data As Byte)
Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer,
ByVal Data As Integer)
Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As
Integer, ByVal Data As Long)
Private Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer)
As Byte
Private Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As
Integer) As Integer
Private Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As
Integer) As Long
Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)

132
Anexos1 Rutinas Programadas

Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As


Integer, ByVal bit As Byte) As Boolean
Private Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As
Integer, ByVal Val As Boolean) As Boolean
Private Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As
Integer, ByVal Val As Boolean) As Boolean
Private Declare Function IsDriverInstalled Lib "IO.DLL" () As
Boolean

Private Sub cmdActiva_Click()


If Control = False Then
Timer2.Enabled = True
Control = True
Frame1.Enabled = True
cmdActiva.Caption = "Desactivar Forzado Salida"
Else
Timer2.Enabled = False
Control = False
Frame1.Enabled = False
cmdActiva.Caption = "Activar Forzado Salida"
End If
End Sub

Private Sub Command1_Click()


If Timer3.Enabled = True Then
Timer3.Enabled = False
Else
Timer3.Enabled = True
End If
End Sub

Private Sub Form_Load()


Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
Dim lR As Long
If INOUT.Visible = True Then
lR = SetTopMostWindow(INOUT.hWnd, True) 'ENCLAVA LA PANTALLA AL
FRENTE
End If
Frame1.Enabled = False
Text1.Text = 0
PortOut &H378, 0
NotPortBit &H379, 3
NotPortBit &H379, 4
NotPortBit &H379, 5
NotPortBit &H379, 6
SetPortBit &H379, 7
For led = 0 To 7
led1(led).Visible = False
LedE1(led).Visible = False
Next led
Control = False
If ENTSAL > 0 Then
Call COMUNICACION

133
Anexos1 Rutinas Programadas

End If
End Sub

Private Sub Form_Unload(Cancel As Integer)


PortOut &H378, 0
End Sub

Private Sub reset_Click()


Text1.Text = 0
PortOut &H378, 0
For led = 0 To 7
led1(led).Visible = False
led0(led).Visible = True
Next led
End Sub

Private Sub Salir_Click()


Unload INOUT
End Sub

Private Sub Spin10_Click()


bRetVal = GetPortBit(&H378, 7)
Select Case bRetVal
Case Is = False
SetPortBit &H378, 7
Text1.Text = Val(Text1.Text) + 128
led1(7).Visible = True
led0(7).Visible = False
Case Is = True
NotPortBit &H378, 7
Text1.Text = Val(Text1.Text) - 128
led1(7).Visible = False
led0(7).Visible = True
End Select
End Sub

Private Sub Spin3_Click()


bRetVal = GetPortBit(&H378, 0)
Select Case bRetVal
Case Is = False
SetPortBit &H378, 0
Text1.Text = Val(Text1.Text) + 1
led1(0).Visible = True
led0(0).Visible = False
Case Is = True
NotPortBit &H378, 0
Text1.Text = Val(Text1.Text) - 1
led1(0).Visible = False
led0(0).Visible = True
End Select
End Sub

Private Sub Spin4_Click()


' verifica el estado del bit 1 , pin 4

134
Anexos1 Rutinas Programadas

bRetVal = GetPortBit(&H378, 1)
Select Case bRetVal
Case Is = False
' pone el bit 1 q corresponde al pin 4 a nivel 1
SetPortBit &H378, 1
Text1.Text = Val(Text1.Text) + 2
led1(1).Visible = True
led0(1).Visible = False
Case Is = True
' pone el bit 1 q corresponde al pin 4 a nivel 0
NotPortBit &H378, 1
Text1.Text = Val(Text1.Text) - 2
led1(1).Visible = False
led0(1).Visible = True
End Select
End Sub

Private Sub Spin5_Click()


' verifica el estado del bit 2 , pin 5
bRetVal = GetPortBit(&H378, 2)
Select Case bRetVal
Case Is = False
' pone el bit 2 q corresponde al pin 5 a nivel 1
SetPortBit &H378, 2
Text1.Text = Val(Text1.Text) + 4
led1(2).Visible = True
led0(2).Visible = False
Case Is = True
' pone el bit 2 q corresponde al pin 4 a nivel 0
NotPortBit &H378, 2
Text1.Text = Val(Text1.Text) - 4
led1(2).Visible = False
led0(2).Visible = True
End Select
End Sub

Private Sub Spin6_Click()


' verifica el estado del bit 3 , pin 6
bRetVal = GetPortBit(&H378, 3)
Select Case bRetVal
Case Is = False
' pone el bit 3 q corresponde al pin 5 a nivel 1
SetPortBit &H378, 3
Text1.Text = Val(Text1.Text) + 8
led1(3).Visible = True
led0(3).Visible = False
Case Is = True
' pone el bit 3 q corresponde al pin 4 a nivel 0
NotPortBit &H378, 3
Text1.Text = Val(Text1.Text) - 8
led1(3).Visible = False
led0(3).Visible = True
End Select
End Sub

135
Anexos1 Rutinas Programadas

Private Sub Spin7_Click()


' verifica el estado del bit 4 , pin 7
bRetVal = GetPortBit(&H378, 4)
Select Case bRetVal
Case Is = False
' pone el bit 4 q corresponde al pin 5 a nivel 1
SetPortBit &H378, 4
Text1.Text = Val(Text1.Text) + 16
led1(4).Visible = True
led0(4).Visible = False
Case Is = True
' pone el bit 4 q corresponde al pin 4 a nivel 0
NotPortBit &H378, 4
Text1.Text = Val(Text1.Text) - 16
led1(4).Visible = False
led0(4).Visible = True
End Select
End Sub

Private Sub Spin8_Click()


' verifica el estado del bit 5 , pin 8
bRetVal = GetPortBit(&H378, 5)
Select Case bRetVal
Case Is = False
' pone el bit 5 q corresponde al pin 5 a nivel 1
SetPortBit &H378, 5
Text1.Text = Val(Text1.Text) + 32
led1(5).Visible = True
led0(5).Visible = False
Case Is = True
' pone el bit 5 q corresponde al pin 4 a nivel 0
NotPortBit &H378, 5
Text1.Text = Val(Text1.Text) - 32
led1(5).Visible = False
led0(5).Visible = True
End Select
End Sub

Private Sub Spin9_Click()


' verifica el estado del bit 6 , pin 9
bRetVal = GetPortBit(&H378, 6)
Select Case bRetVal
Case Is = False
' pone el bit 6 q corresponde al pin 5 a nivel 1
SetPortBit &H378, 6
Text1.Text = Val(Text1.Text) + 64
led1(6).Visible = True
led0(6).Visible = False
Case Is = True
' pone el bit 6 q corresponde al pin 4 a nivel 0
NotPortBit &H378, 6
Text1.Text = Val(Text1.Text) - 64
led1(6).Visible = False

136
Anexos1 Rutinas Programadas

led0(6).Visible = True
End Select
End Sub

Private Sub Timer1_Timer()


If Timer1.Interval = 1 Then
bRetVal = PortIn(&H378)
LEntrada = PortIn(&H378)
If GetPortBit(&H378, 0) = True Then
Le1 = "1"
LedE1(0).Visible = True
LedE0(0).Visible = False
Else
Le1 = "0"
LedE1(0).Visible = False
LedE0(0).Visible = True
End If
If GetPortBit(&H378, 1) = True Then
Le2 = "1"
LedE1(1).Visible = True
LedE0(1).Visible = False
Else
Le2 = "0"
LedE1(1).Visible = False
LedE0(1).Visible = True
End If
If GetPortBit(&H378, 2) = True Then
Le3 = "1"
LedE1(2).Visible = True
LedE0(2).Visible = False
Else
Le3 = "0"
LedE1(2).Visible = False
LedE0(2).Visible = True
End If
If GetPortBit(&H378, 3) = True Then
Le4 = "1"
LedE1(3).Visible = True
LedE0(3).Visible = False
Else
Le4 = "0"
LedE1(3).Visible = False
LedE0(3).Visible = True
End If
If GetPortBit(&H378, 4) = True Then
Le5 = "1"
LedE1(4).Visible = True
LedE0(4).Visible = False
Else
Le5 = "0"
LedE1(4).Visible = False
LedE0(4).Visible = True
End If
If GetPortBit(&H378, 5) = True Then

137
Anexos1 Rutinas Programadas

Le6 = "1"
LedE1(5).Visible = True
LedE0(5).Visible = False
Else
Le6 = "0"
LedE1(5).Visible = False
LedE0(5).Visible = True
End If
If GetPortBit(&H378, 6) = True Then
Le7 = "1"
LedE1(6).Visible = True
LedE0(6).Visible = False
Else
Le7 = "0"
LedE1(6).Visible = False
LedE0(6).Visible = True
End If
If GetPortBit(&H378, 7) = True Then
Le8 = "1"
LedE1(7).Visible = True
LedE0(7).Visible = False
Else
Le8 = "0"
LedE1(7).Visible = False
LedE0(7).Visible = True
End If
End If
End Sub

Private Sub Timer2_Timer()


If Picture10.Visible = False Then
Picture10.Visible = True
Else
Picture10.Visible = False
End If
End Sub

Private Sub Timer3_Timer()


For i = 3 To 7
If GetPortBit(&H379, i) = True Then
LedE2(i - 2).Visible = True
LedE0(i + 5).Visible = False
Label5(i - 2).Caption = 1
Else
LedE2(i - 2).Visible = False
LedE0(i + 5).Visible = True
Label5(i - 2).Caption = 0
End If
Next
If Label5(1).Caption = 1 Then
Label2 = 1
Else
Label2 = 0
End If

138
Anexos1 Rutinas Programadas

If Label5(2).Caption = 1 Then
Label2 = Label2 + 2
Else
Label2 = Label2
End If
If Label5(3).Caption = 1 Then
Label2 = Label2 + 4
Else
Label2 = Label2
End If
If Label5(4).Caption = 1 Then
Label2 = Label2 + 8
Else
Label2 = Label2
End If
If Label5(5).Caption = 1 Then
Label2 = Label2 + 16
Else
Label2 = Label2
End If
End Sub

Private Sub COMUNICACION()


Select Case ENTSAL
Case 1 'ACTIVAR EL AGITADOR DEL REACTOR
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 2 'DESACTIVAR EL AGITADOR DEL REACTOR
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then

139
Anexos1 Rutinas Programadas

NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 3 ' BOMBA CIRCUITO REACTOR MARCHA
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 4 ' BOMBA CIRCUITO REACTOR PARO
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 5 'REGULADORA INCREMENTO
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then

140
Anexos1 Rutinas Programadas

SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 6 'REGULADORA DECREMENTO
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 7 'BOMBA VACIADO MARCHA
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 8 'BOMBA VACIADO PARO
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then

141
Anexos1 Rutinas Programadas

NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 9 'BOMBA REFRIGERACION1 MARCHA
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 10 'BOMBA REFRIGERACION1 PARO
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 11 'BOMBA REFRIGERACION2 MARCHA
If GetPortBit(&H378, 0) = False Then

142
Anexos1 Rutinas Programadas

SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 12 'bomba refrigeracion 2 parada
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 13 'valvula salida abierta
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True

143
Anexos1 Rutinas Programadas

'*******************************************************************
*****
Case 14 'valvula salida cerrada
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 15 'comprobacion plc marcha
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 16 'válvula frío cerrada
'*******************************************************************
*****
Case 17 ' motor 1 agua marcha
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then

144
Anexos1 Rutinas Programadas

NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 18 'motor 1 agua paro
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 19 ' motor 2 agua marcha
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 23 'VLVULA AIREACION ABIERTA
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then

145
Anexos1 Rutinas Programadas

SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 24 'VALVULA AIREACION CERRADA
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 25 ' motor 2 agua paro
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 26 'MARCHA SOPLANTE
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then

146
Anexos1 Rutinas Programadas

SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
Case 27
If GetPortBit(&H378, 0) = False Then
SetPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
Timer4.Enabled = True
'*******************************************************************
*****
End Select
End Sub
Private Sub Timer4_Timer()
If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
ENTSAL = 0
Timer4.Enabled = False
Unload INOUT

147
Anexos1 Rutinas Programadas

End Sub

7.1.9. Código Pantalla Máximos y Mínimos.


Option Explicit
Dim REG1, REG2 As Variant

Private Sub ButtonMac1_Click()


Dim lR As Long
lR = SetTopMostWindow(RegAlarm.hWnd, False)
ButtonMac2.Visible = False
ButtonMac3.Visible = False
MAXMIN.Frame1.Enabled = False
MAXMIN.Frame2.Enabled = False
Unload MAXMIN
End Sub

Private Sub ButtonMac2_Click()


If Text2 > Text1 Then
MsgBox "Valor máximo inferior al mínimo", vbCritical, "¡ERROR!"
Text1 = REG1
Exit Sub
End If
For i = 2 To 23
On Error GoTo B
If mxmn = i Then
MAX(i) = Text1
GoTo B
End If
Next
B:
ButtonMac2.Visible = False
PPrincipal.Timer24.Enabled = False
PPrincipal.Timer24.Enabled = True
End Sub

Private Sub ButtonMac3_Click()


If Text2 > Text1 Then
MsgBox "Valor máximo inferior al mínimo", vbCritical, "¡ERROR!"
Text2 = REG2
Exit Sub
End If
For i = 2 To 23
On Error GoTo N
If mxmn = i Then
MIN(i) = Text2
GoTo N
End If
Next
N:
ButtonMac3.Visible = False
PPrincipal.Timer24.Enabled = False
PPrincipal.Timer24.Enabled = True
End Sub

148
Anexos1 Rutinas Programadas

Private Sub Command1_Click()


Load NAcceso
NAcceso.Visible = True
End Sub

Private Sub Form_Load()


Dim lR As Long
lR = SetTopMostWindow(MAXMIN.hWnd, True)
If PPrincipal.Text2 = "ADMINISTRADOR" Then
MAXMIN.Text1.Enabled = True
MAXMIN.Text2.Enabled = True
MAXMIN.Frame1.Enabled = True
MAXMIN.Frame2.Enabled = True
End If
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
For i = 2 To 23
If mxmn = i Then
Label1.Caption = referen(i)
Text1 = MAX(i) & " " & UNI(i)
Text2 = MIN(i) & " " & UNI(i)
GoTo z
End If
Next
z:
REG1 = Text1
REG2 = Text2
End Sub
Private Sub TEXT1_KeyPress(KeyAscii As Integer)
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT1_CLICK()


Load Form2
Form2.Show
NUM = 4
ButtonMac2.Visible = True
End Sub

Private Sub TEXT2_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT2_CLICK()


Load Form2
Form2.Show

149
Anexos1 Rutinas Programadas

NUM = 6
ButtonMac3.Visible = True
End Sub

7.1.10. Código Pantalla NAcceso.


Option Explicit
Dim A As Integer 'VARIABLE PARA DEFINIR TIPO DE ACCESOS SEGUN LOGIN
Private Sub ButtonMac1_Click()
If TEXT1.Text = "ADMINISTRADOR" Then
If TEXT2.Text = "ADMIN" Then
A = 1
Call NIVACCESO
Else
MsgBox "Password Incorrecto", vbCritical, "¡ERROR!"
TEXT2 = ""
TEXT2.SetFocus
Exit Sub
End If
Else
MsgBox "Usuario Incorrecto", vbCritical, "¡ERROR!"
TEXT1 = ""
TEXT1.SetFocus
Exit Sub
End If
Unload NAcceso
End Sub

Private Sub ButtonMac2_Click()


Dim lR As Long
lR = SetTopMostWindow(NAcceso.hWnd, False)
Unload NAcceso
End Sub

Private Sub Form_Load()


Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
Dim lR As Long
lR = SetTopMostWindow(NAcceso.hWnd, True)
End Sub

Private Sub NIVACCESO()


Select Case A
Case 1
PPrincipal.TEXT2.Text = "ADMINISTRADOR"
PPrincipal.Salir.Enabled = True
MAXMIN.TEXT1.Enabled = True
MAXMIN.TEXT2.Enabled = True
MAXMIN.Frame1.Enabled = True
MAXMIN.Frame2.Enabled = True
PPrincipal.Timer24.Enabled = True
End Select
End Sub

150
Anexos1 Rutinas Programadas

Private Sub TEXT1_CLICK()


Load Form2
Form2.Visible = True
NUM = 2
Form2.Frame2.Enabled = True
End Sub

Private Sub TEXT2_CLICK()


Load Form2
Form2.Visible = True
NUM = 3
Form2.Frame2.Enabled = True
End Sub
Private Sub TEXT2_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
Call ButtonMac1_Click
End If
End Sub

7.1.11. Código Pantalla NPASSWORD.


Option Explicit
Dim A As Integer 'VARIABLE PARA IDENTIFICAR TIPO DE ERROR
Dim direccion As String 'variable direccion archivo de password
Dim psw, psw2 As Variant ' variable que almacena es password
Dim ENCRIPT As Variant 'VARIABLE DE ENCRIPTADO

Private Sub ButtonMac1_Click()


If text1 = "" Then
A = 1
Call error
Exit Sub
End If
If TEXT2 = "" Then
A = 2
Call error
Exit Sub
End If
If text1 = TEXT2 Then
Else
A = 3
Call error
Exit Sub
End If
psw = TEXT2.Text
direccion = App.Path & "\password.txt"
Open direccion For Output As #1
Print #1, psw
Close #1
Form1.Acceso1.SetFocus
Unload NPASSWORD
End Sub
151
Anexos1 Rutinas Programadas

Private Sub ButtonMac2_Click()


Dim lR As Long
lR = SetTopMostWindow(NAcceso.hWnd, False)
Unload NPASSWORD
End Sub
Private Sub Form_Load()
Dim lR As Long
lR = SetTopMostWindow(NPASSWORD.hWnd, True)
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
End Sub
Private Sub error()
Select Case A
Case 1
MsgBox "¡No ha introducido ningun password!", vbInformation,
"¡ATENCIÓN!"
text1.SetFocus
Case 2
MsgBox "¡No ha verificado el password!", vbInformation, "¡ATENCIÓN!"
TEXT2.SetFocus
Case 3
MsgBox "¡Los Passwords no coinciden!", vbInformation, "¡ATENCIÓN!"
End Select
End Sub

Private Sub TEXT2_KeyPress(KeyAscii As Integer)


If KeyAscii = vbKeyReturn Then
KeyAscii = 0
Call ButtonMac1_Click
End If
End Sub

7.1.12. Código Pantalla PPRINAPOYO.


Private Sub Timer1_Timer()
'Marcadores
PPrincipal.Shape1.Visible = False
PPrincipal.Shape2.Visible = False
PPrincipal.Shape3.Visible = False
PPrincipal.Shape4.Visible = False
PPrincipal.Shape6.Visible = False
PPrincipal.Shape7.Visible = False
PPrincipal.Shape8.Visible = False
PPrincipal.Shape9.Visible = False
PPrincipal.Shape10.Visible = False
PPrincipal.Shape11.Visible = False
PPrincipal.Shape12.Visible = False
PPrincipal.Shape13.Visible = False
PPrincipal.Shape14.Visible = False
PPrincipal.Shape15.Visible = False
PPrincipal.Shape16.Visible = False
PPrincipal.Shape17.Visible = False
PPrincipal.Shape18.Visible = False
PPrincipal.Shape19.Visible = False
PPrincipal.Shape20.Visible = False
152
Anexos1 Rutinas Programadas

PPrincipal.Shape21.Visible = False
PPrincipal.Shape22.Visible = False
PPrincipal.Shape25.Visible = False
PPrincipal.Shape26.Visible = False
PPrincipal.Shape27.Visible = False
PPrincipal.Shape28.Visible = False
PPrincipal.Shape29.Visible = False
PPrincipal.Shape30.Visible = False
PPrincipal.Shape31.Visible = False
PPrincipal.Shape32.Visible = False
PPrincipal.Shape33.Visible = False
PPrincipal.Shape35.Visible = False
PPrincipal.Label2.Visible = False
PPrincipal.Label3.Visible = False
PPrincipal.Label4.Visible = False
PPrincipal.Label5.Visible = False
PPrincipal.Label6.Visible = False
PPrincipal.Label7.Visible = False
PPrincipal.Label8.Visible = False
PPrincipal.Label11.Visible = False
PPrincipal.Label12.Visible = False
PPrincipal.Label13.Visible = False
PPrincipal.Label15.Visible = False
PPrincipal.Label16.Visible = False
PPrincipal.Label17.Visible = False
PPrincipal.Label18.Visible = False
PPrincipal.Label19.Visible = False
PPrincipal.Label20.Visible = False
PPrincipal.Label21.Visible = False
PPrincipal.Label22.Visible = False
PPrincipal.Label23.Visible = False
PPrincipal.Label24.Visible = False
PPrincipal.Label25.Visible = False
PPrincipal.Label26.Visible = False
PPrincipal.Label27.Visible = False
PPrincipal.Label28.Visible = False
PPrincipal.Label29.Visible = False
PPrincipal.Label30.Visible = False
PPrincipal.Label31.Visible = False
PPrincipal.Label32.Visible = False
PPrincipal.Label33.Visible = False
PPrincipal.Label34.Visible = False
PPrincipal.Label35.Visible = False
PPrincipal.Label37.Visible = False
Select Case MARCO
Case 1
PPrincipal.Shape14.Visible = True
PPrincipal.Label22.Visible = True
Case 2
PPrincipal.Shape28.Visible = True
PPrincipal.Label21.Visible = True
Case 3
PPrincipal.Shape28.Visible = True
PPrincipal.Label21.Visible = True

153
Anexos1 Rutinas Programadas

Case 4
PPrincipal.Shape13.Visible = True
PPrincipal.Label20.Visible = True
Case 5
PPrincipal.Shape12.Visible = True
PPrincipal.Label19.Visible = True
Case 6
PPrincipal.Shape27.Visible = True
PPrincipal.Label18.Visible = True
Case 7
PPrincipal.Shape27.Visible = True
PPrincipal.Label18.Visible = True
Case 8
PPrincipal.Shape26.Visible = True
PPrincipal.Label17.Visible = True
Case 9
PPrincipal.Shape26.Visible = True
PPrincipal.Label17.Visible = True
Case 10
PPrincipal.Shape11.Visible = True
PPrincipal.Label16.Visible = True
Case 11
PPrincipal.Shape10.Visible = True
PPrincipal.Label15.Visible = True
Case 12
PPrincipal.Shape9.Visible = True
PPrincipal.Label13.Visible = True
Case 13
PPrincipal.Shape25.Visible = True
PPrincipal.Label12.Visible = True
Case 14
PPrincipal.Shape22.Visible = True
PPrincipal.Label11.Visible = True
Case 15
PPrincipal.Shape8.Visible = True
PPrincipal.Label5.Visible = True
Case 16
PPrincipal.Shape6.Visible = True
PPrincipal.Label7.Visible = True
Case 17
PPrincipal.Shape1.Visible = True
PPrincipal.Label3.Visible = True
Case 18
PPrincipal.Shape2.Visible = True
PPrincipal.Label2.Visible = True
Case 19
PPrincipal.Shape3.Visible = True
PPrincipal.Label4.Visible = True
Case 20
PPrincipal.Shape4.Visible = True
PPrincipal.Label8.Visible = True
Case 21
PPrincipal.Shape7.Visible = True
PPrincipal.Label6.Visible = True

154
Anexos1 Rutinas Programadas

Case 22
PPrincipal.Shape29.Visible = True
PPrincipal.Label23.Visible = True
Case 23
PPrincipal.Shape30.Visible = True
PPrincipal.Label24.Visible = True
Case 24
PPrincipal.Shape15.Visible = True
PPrincipal.Label25.Visible = True
Case 25
PPrincipal.Shape18.Visible = True
PPrincipal.Label26.Visible = True
Case 26
PPrincipal.Shape31.Visible = True
PPrincipal.Label27.Visible = True
Case 27
PPrincipal.Shape32.Visible = True
PPrincipal.Label28.Visible = True
Case 28
PPrincipal.Shape19.Visible = True
PPrincipal.Label29.Visible = True
Case 29
PPrincipal.Shape20.Visible = True
PPrincipal.Label30.Visible = True
Case 30
PPrincipal.Shape17.Visible = True
PPrincipal.Label31.Visible = True
Case 31
PPrincipal.Shape21.Visible = True
PPrincipal.Label32.Visible = True
Case 32
PPrincipal.Shape16.Visible = True
PPrincipal.Label34.Visible = True
PPrincipal.Label33.Visible = True
Case 33
PPrincipal.Shape33.Visible = True
PPrincipal.Label35.Visible = True
Case 34
Case 35
PPrincipal.Shape35.Visible = True
PPrincipal.Label37.Visible = True
End Select
Timer1.Enabled = False
Unload PPRINAPOYO
End Sub

7.1.13. Código Pantalla Principal.


Option Explicit
Dim CRONO As Long
Dim Tiempo As String
Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As
Integer, ByVal bit As Byte) As Boolean
155
Anexos1 Rutinas Programadas

Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer,


ByVal bit As Byte)
Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer,
ByVal Data As Byte)
Private Declare Function IsDriverInstalled Lib "IO.DLL" () As
Boolean
Dim act, ACTB, FORZAR2 As Variant
Dim TEMP, TEMP2, TEMP3, PRES, CAU, i, i2, I3, I4, I5, IM3 As Integer
Dim s, S2 As Integer
Dim SALMU2 As Integer ' VARIABLE PARA COMPROBAR SI MODIFICAMOS EL
VALOR DE LA REGULADORA Y ASI EJECUTAR LA RESTA O NO
Dim REST As Integer 'CONTADOR QUE LEE LAS ENTRADAS
Dim N0, N1, N2, N3, N4, CONTADOR As Integer
Dim AGITADORM As Boolean
Dim fallodisp, fallo As Variant 'variable que recoge el codigo del
dispositivo que ha fallado en el PLC

Private Sub ACTIVARPROGRAMA_Click()


If Picture9.Visible = True Then
Exit Sub
End If
ACTV = True
Picture9.Visible = True
Picture27.Visible = False
Picture10(0).Visible = False
Picture8.Visible = True
Timer6.Enabled = True
End Sub

Private Sub Botonacceso_Click()


Text1 = "MODO TEST"
PortOut &H378, 0
Timer24.Enabled = True
CONTADOR = 1
End Sub

Private Sub ButtonMac1_Click()


Load RegAlarm
RegAlarm.Visible = True
For i = 0 To 50
If REALARM(i) = "" Then
Exit Sub
End If
If RegAlarm.Text1.Text = "" Then
RegAlarm.Text1 = REALARM(i) & Chr(13) & Chr(10)
Else
RegAlarm.Text1 = RegAlarm.Text1 & REALARM(i) & Chr(13) &
Chr(10)
End If
Next
End Sub

156
Anexos1 Rutinas Programadas

Private Sub ButtonMac2_Click()


If ACTV = False Then
Exit Sub
End If
Picture21.Visible = False
Timer13.Enabled = True
End Sub

Private Sub Command1_Click()


Load NAcceso
NAcceso.Visible = True
End Sub

Private Sub Command2_Click()


'Restaura los niveles de acceso al nivel básico de operación
Text2.Text = "OPERADOR"
PPrincipal.Salir.Enabled = False
MAXMIN.Text1.Enabled = False
MAXMIN.Text2.Enabled = False
End Sub

Private Sub Command3_Click()


Timer3.Enabled = False
Text1.BackColor = &H80000005
Text1.ForeColor = &H80000008
INTAGITADOR.BackColor = &H80000007
Text6.BackColor = &H80000007
Text8.BackColor = &H80000007
INTAGITADOR.BackColor = &H80000007
MSGALRM = 0
Shape5.Visible = False
Text21.BackColor = &H80000007
Text5.BackColor = &H80000007
Text6.BackColor = &H80000007
Text7.BackColor = &H80000007
Text9.BackColor = &H80000007
Text10.BackColor = &H80000007
Text11.BackColor = &H80000007
Text27.BackColor = &H80000007
Text12.BackColor = &H80000007
Text1 = "Tiempo de funcionamiento simulación " & Tiempo
Timer26.Enabled = True
End Sub

Private Sub Command4_Click()


For i = 0 To 5
If Picture44(i).Visible = True Then
If LED3(i).Visible = True Then
Else
Picture44(i).Visible = False
Exit Sub
End If
End If
Next

157
Anexos1 Rutinas Programadas

End Sub

Private Sub Command5_Click()


mxmn = 9
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub DETENERPROGRAMA_Click()


If Picture10(0).Visible = True Then
Exit Sub
End If
If fallodisp = 29 Then GoTo ZZ
Volumen &HAD, 0, 1, 0
activar = MsgBox("¿Esta seguro que desea parar la simulación?",
324, "¡ATENCION!") 'elegimos si queremos parar o no del programa
Volumen &HAD, 0, 1, 0
ZZ:
If activar = 7 Then
Exit Sub
Else
ACTV = False
Picture9.Visible = False
Picture27.Visible = True
Picture10(0).Visible = True
Picture8.Visible = False
Timer7.Enabled = True
End If
End If
End Sub

Private Sub ensal_Click()


INOUT.Show
End Sub

Private Sub Form_Load()


Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
PPrincipal.Height = 11820
PPrincipal.Width = 15405
Text4.Text = Date
Text3.Text = Time
Text2.Text = "OPERADOR"
Picture2.Visible = True
Picture3.Visible = False
Nivel.Value = 0
SALMU2 = 0
SALMU = 0
CONTADOR = 0
End Sub

Private Sub FUNCIONAMIENTO_Timer()


If ACTV = False Then
Else

158
Anexos1 Rutinas Programadas

Call EntradasLeidas
End If
End Sub

Private Sub FyD_Click()


Timer22.Enabled = True
End Sub

Private Sub Info_Click()


Informacion.Show
End Sub

Private Sub IR1_REV_Click()


mxmn = 11
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub Picture12_Click()


If ACTV = False Then
Exit Sub
End If
Text18 = 215
Volumen &HAD, 0, 1, 0 'QUITA EL SONIDO
act = MsgBox("¿ MARCHA AGITADOR?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0 'DEVUELVE EL SONIDO
If act = 7 Then
Picture2.Visible = True
Picture3.Visible = False
Picture4.Visible = False
Timer2.Enabled = False
INTAGITADOR.Text = 0 & " A"
Else
If LED3(0).Visible = True Then
MsgBox "Imposible poner en marcha, Fallo en Agitador",
vbCritical, "¡Atención!"
Exit Sub
End If
Timer2.Enabled = True
Picture13.Visible = True
Picture12.Visible = False
ENTSAL = 1
Load INOUT
End If
End Sub
Private Sub PICTURE13_CLICK()
Volumen &HAD, 0, 1, 0 'QUITA EL SONIDO
act = MsgBox("¿ PARAR AGITADOR?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0 'DEVUELVE EL SONIDO
If act = 7 Then
Else
Picture2.Visible = True
Picture3.Visible = False

159
Anexos1 Rutinas Programadas

Picture4.Visible = False
Picture13.Visible = False
Picture12.Visible = True
Timer2.Enabled = False
ENTSAL = 2
Load INOUT
End If
End Sub

Private Sub Picture14_Click()


If ACTV = False Then
Exit Sub
End If
On Error GoTo B
If Text11 > 10 Then
MsgBox "No se puede poner en marcha la bomba hasta que baje la
intensidad", vbCritical, "¡ATENCION!"
Exit Sub
End If
B:
If Picture2.Visible = True Then
MsgBox "No se puede poner la recirculación sin nivel en el
reactor", vbCritical, "¡ATENCIÓN!"
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ MARCHA BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
If LED3(1).Visible = True Then
MsgBox "Imposible poner en marcha, Fallo en bomba", vbCritical,
"¡Atención!"
Exit Sub
End If
Picture14.Visible = False
Picture15.Visible = True
Timer11.Enabled = True
Text11.BackColor = &H0&
i2 = 0
ENTSAL = 3
Load INOUT
End If
End Sub

Private Sub Picture15_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ PARO BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else

160
Anexos1 Rutinas Programadas

If Picture2.Visible = False Then


MSGALRM = 3
Call ALARMAS
Text11.BackColor = &HFF&
End If
Timer9.Enabled = False
Picture15.Visible = False
Picture14.Visible = True
Timer11.Enabled = True
i2 = 0
ENTSAL = 4
Load INOUT
End If
End Sub

Private Sub Picture16_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ PARO BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
If Picture2.Visible = True Then
Else
MSGALRM = 4
Call ALARMAS
Text12.BackColor = &H80000008
Text13.BackColor = &H80000008
Text14.BackColor = &H80000008
End If
Picture16.Visible = False
Picture17.Visible = True
Timer8.Enabled = False
Timer10.Enabled = True
i2 = 0
ENTSAL = 8
Load INOUT
End If
End Sub

Private Sub Picture17_Click()


If ACTV = False Then
Exit Sub
End If
If Picture2.Visible = True Then
MsgBox "No se puede realizar sin nivel en el reactor",
vbCritical, "¡ATENCIÓN!"
Exit Sub
ElseIf Picture19.Visible = True Then
MsgBox "No se puede realizar sin abrir la válvula de salida
reactor", vbCritical, "¡ATENCIÓN!"
Exit Sub

161
Anexos1 Rutinas Programadas

End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ MARCHA BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
If LED3(3).Visible = True Then
MsgBox "Imposible poner en marcha, Fallo en bomba",
vbCritical, "¡Atención!"
Exit Sub
End If
Picture17.Visible = False
Picture16.Visible = True
Timer10.Enabled = True
Text12.BackColor = &H80000008
Text13.BackColor = &H80000008
Text14.BackColor = &H80000008
i2 = 0
ENTSAL = 7
Load INOUT
End If
End Sub

Private Sub Picture18_Click()


If Picture16.Visible = True Then
MsgBox "No se puede cerrar la válvula con la bomba en marcha",
vbCritical, "¡ATENCIÓN!"
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ CERRAR VÁLVULA ?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Picture18.Visible = False
Picture19.Visible = True
ENTSAL = 14
Load INOUT
End If
End Sub

Private Sub Picture19_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ ABRIR VÁLVULA ?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
ENTSAL = 13
Load INOUT
If MSGALRM = 7 Then
Else

162
Anexos1 Rutinas Programadas

Picture19.Visible = False
Picture18.Visible = True
End If
SNIFERIN.Enabled = True
End If
End Sub

Private Sub Picture22_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ MARCHA BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
If LED3(4).Visible = True Then
MsgBox "Imposible poner en marcha, Fallo en bomba",
vbCritical, "¡Atención!"
Exit Sub
End If
Picture23.Visible = True
Picture22.Visible = False
ENTSAL = 9
Load INOUT
End If
End Sub

Private Sub Picture23_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ ESTA SEGURO DE PARAR LA BOMBA ?" & Chr(13), 324,
"ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Picture22.Visible = True
Picture23.Visible = False
ENTSAL = 10
Load INOUT
End If
End Sub

Private Sub Picture24_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ ESTA SEGURO DE PARAR LA BOMBA ?" & Chr(13), 324,
"ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then

163
Anexos1 Rutinas Programadas

Else
Picture25.Visible = True
Picture24.Visible = False
ENTSAL = 12
Load INOUT
End If
End Sub

Private Sub Picture25_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ MARCHA BOMBA ?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
If LED3(5).Visible = True Then
MsgBox "Imposible poner en marcha , Fallo en bomba",
vbCritical, "¡Atención!"
Exit Sub
End If
Picture24.Visible = True
Picture25.Visible = False
ENTSAL = 11
Load INOUT
End If
End Sub

Private Sub Picture29_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ ABRIR VÁLVULA ?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Picture29.Visible = False
Picture30.Visible = True
ENTSAL = 23
Load INOUT
End If
End Sub

Private Sub Picture30_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ CERRAR VÁLVULA ?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else

164
Anexos1 Rutinas Programadas

Picture30.Visible = False
Picture29.Visible = True
ENTSAL = 24
Load INOUT
End If
End Sub

Private Sub Picture31_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ PARO BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Picture32.Visible = True
Picture31.Visible = False
Timer17.Enabled = False
Timer16.Enabled = False
Timer18.Enabled = False
Timer19.Enabled = True
ENTSAL = 18
Load INOUT
End If
End Sub

Private Sub Picture32_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ MARCHA BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Text23 = 0
Text16 = 0
Picture32.Visible = False
Picture31.Visible = True
Timer18.Enabled = True
Timer16.Enabled = True
Timer21.Enabled = True
Text21 = 15
ENTSAL = 17
Load INOUT
End If
End Sub

Private Sub Picture33_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0

165
Anexos1 Rutinas Programadas

ACTB = MsgBox("¿ MARCHA BOMBA?" & Chr(13), 324, "ATENCION")


Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Text23 = 0
Text16 = 0
Picture33.Visible = False
Picture34.Visible = True
Timer18.Enabled = True
Timer16.Enabled = True
Timer21.Enabled = True
Text21 = 15
ENTSAL = 19
Load INOUT
End If
End Sub

Private Sub Picture34_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ PARO BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Picture33.Visible = True
Picture34.Visible = False
Timer17.Enabled = False
Timer16.Enabled = False
Timer18.Enabled = False
Timer19.Enabled = True
ENTSAL = 25
Load INOUT
End If
End Sub

Private Sub Picture36_Click()


Picture36.Visible = False
Picture40.Visible = True
Call DETENERPROGRAMA_Click
End Sub

Private Sub Picture37_Click()


If ACTV = False Then
Exit Sub
End If
Load AMONIAC
AMONIAC.Show
End Sub

Private Sub Picture38_Click()


Load AMONIAC

166
Anexos1 Rutinas Programadas

AMONIAC.Show
End Sub

Private Sub Picture39_Click()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ MARCHA BOMBA?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
If Text16 = "" Then
Else
Timer20.Enabled = True
End If
End If
End Sub

Private Sub Picture40_Click()


Picture40.Visible = False
Picture36.Visible = True
Call ACTIVARPROGRAMA_Click
If Picture9.Visible = False Then
Else
Call comprobacionmarchaPLC
End If
End Sub
Private Sub comprobacionmarchaPLC()
ENTSAL = 15
Load INOUT
PLCstatus.Enabled = True
End Sub

Private Sub Picture5_Click()


Call Picture6_Click
End Sub

Private Sub Picture6_Click()


Volumen &HAD, 0, 1, 0
act = MsgBox("¿ PARO VENTILADOR?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If act = 7 Then
Else
Timer15.Enabled = False
Picture7.Visible = True
Picture6.Visible = False
Picture5.Visible = False
ENTSAL = 27
Load INOUT
End If
End Sub

Private Sub Picture7_Click()

167
Anexos1 Rutinas Programadas

If ACTV = False Then


Exit Sub
End If
Volumen &HAD, 0, 1, 0
act = MsgBox("¿ MARCHA VENTILADOR?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If act <> 7 Then
Timer15.Enabled = True
ENTSAL = 26
Load INOUT
Else
Timer15.Enabled = False
Picture7.Visible = True
Picture6.Visible = False
Picture5.Visible = False

End If
End Sub

Private Sub PLCstatus_Timer()


CONTADOR = CONTADOR + 1
If fallodisp = 30 Then
MsgBox "PLC activado", vbInformation, "¡Atención!"
PLCstatus.Enabled = False
CONTADOR = 0
Exit Sub
End If
If CONTADOR = 5 Then
MsgBox "El PLC no esta activado o falla la comunicación",
vbExclamation, "¡Atención!"
Picture45.Visible = True
Label69 = "PLC Error"
PLCstatus.Enabled = False
CONTADOR = 0
End If
End Sub

Private Sub Salir_Click()


If Picture9.Visible = True Then
MsgBox "No se puede cerrar el programa, primero se ha de detener
la simulación", vbCritical, "¡Atención!"
Exit Sub
End If
Unload PPrincipal
Load Form1
Form1.Visible = True
Unload AMONIAC
Unload REFRIG
Unload GRAFICAS
End Sub

Private Sub SNIFERIN_Timer() 'MÉTODO PARA LEER LAS ENTRADAS


If GetPortBit(&H379, 3) = True Then
N0 = 0

168
Anexos1 Rutinas Programadas

Else
N0 = 1
s = 1
End If
If GetPortBit(&H379, 4) = True Then
N1 = 0
Else
N1 = 1
s = s + 2
End If
If GetPortBit(&H379, 5) = True Then
N2 = 0
Else
N2 = 1
s = s + 4
End If
If GetPortBit(&H379, 6) = True Then
N3 = 0
Else
N3 = 1
s = s + 8
End If
If GetPortBit(&H379, 7) = True Then
N4 = 1
s = s + 16
Else
N4 = 0
End If
FORZAR = N4 & N3 & N2 & N1 & N0
If s = 0 Then
GoTo FIN
Else
fallodisp = s
s = 0
End If
Call EntradasLeidas
FORZAR = ""
s = 0
FIN:
End Sub
Private Sub EntradasLeidas()
Select Case fallodisp
Case 1 'PARO AGITADOR REACOR
If MSGALRM = 6 Then
Else
MSGALRM = 6
Call ALARMAS
End If
Timer2.Enabled = False
Picture12.Visible = True
Picture13.Visible = False
ENTSAL = 2
Load INOUT
Case 2 ' Bomba vaciado parada

169
Anexos1 Rutinas Programadas

If MSGALRM = 9 Then
Else
MSGALRM = 9
Call ALARMAS
End If
Picture16.Visible = False
Picture17.Visible = True
ENTSAL = 8
Load INOUT
Timer10.Enabled = False
If Text13 < 10 Then
Else
Timer10.Enabled = True
End If
Case 3 ' PARO BOMBA CIRCUITO REACTOR
If MSGALRM = 8 Then
Else
MSGALRM = 8
Call ALARMAS
End If
Picture14.Visible = True
Picture15.Visible = False
ENTSAL = 4
Load INOUT
Timer11.Enabled = False
On Error GoTo A2
If Text11 < 10 Then 'Esta condición es para que en caso de que
coincida que hay un fallo con la bomba casi parada, no ponga el
timer en marcha el cual subiría la intensidad de la bomba de forma
irreal
Else
Timer11.Enabled = True
End If
A2:
Case 4 'PARO BOMBA REFRIGERACION 1
If MSGALRM = 10 Then
Else
MSGALRM = 10
Call ALARMAS
End If
ENTSAL = 10
Load INOUT
Picture22.Visible = True
Picture23.Visible = False
Case 5 ' PARO BOMBA REFRIGERACIÓN 2
If MSGALRM = 11 Then
Else
MSGALRM = 11
End If
Call ALARMAS
ENTSAL = 12
Load INOUT
Picture25.Visible = True
Picture24.Visible = False

170
Anexos1 Rutinas Programadas

Case 13
If MSGALRM = 7 Then
Else
MSGALRM = 7
Picture18.Visible = False
Picture19.Visible = True
Call ALARMAS
End If
Case 29 ' plc DESACTIVADO
Picture10(12).Visible = False
Picture42(11).Visible = True
MsgBox "PLC desactivado", vbExclamation, "¡Atención!"
Label69 = "PLC OFF"
Call Picture36_Click
Case 30 ' plc ACTIVADO
Picture10(12).Visible = True
Picture42(11).Visible = False
Picture45.Visible = False
Label69 = "PLC ON"
End Select
End Sub

Private Sub Text17_CLICK()


mxmn = 15
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub Timer1_Timer()


Text3.Text = ""
Text3.Text = Time
End Sub
Private Sub PICTURE5_MouseMove(Button As Integer, Shift As Integer,
X As Single, Y As Single)
Load PPRINAPOYO
MARCO = 27
End Sub
Private Sub PICTURE6_MouseMove(Button As Integer, Shift As Integer,
X As Single, Y As Single)
Load PPRINAPOYO
MARCO = 27
End Sub
Private Sub PICTURE7_MouseMove(Button As Integer, Shift As Integer,
X As Single, Y As Single)
Load PPRINAPOYO
MARCO = 27
End Sub

Private Sub PICTURE28_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
Load PPRINAPOYO
MARCO = 35
End Sub

171
Anexos1 Rutinas Programadas

Private Sub PICTURE26_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
Load PPRINAPOYO
MARCO = 35
End Sub

Private Sub text15_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Caudal circuito
refrigeración)
Load PPRINAPOYO
MARCO = 1
End Sub

Private Sub text20_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Caudal circuito
refrigeración)
Load PPRINAPOYO
MARCO = 30
End Sub

Private Sub text18_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Caudal circuito
refrigeración)
Load PPRINAPOYO
MARCO = 32
End Sub

Private Sub text19_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Caudal circuito
refrigeración)
Load PPRINAPOYO
MARCO = 32
End Sub

Private Sub text22_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Caudal circuito
refrigeración)
Load PPRINAPOYO
MARCO = 28
End Sub

Private Sub text24_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Caudal circuito
refrigeración)
Load PPRINAPOYO
MARCO = 29
End Sub

172
Anexos1 Rutinas Programadas

Private Sub text25_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Caudal circuito
refrigeración)
Load PPRINAPOYO
MARCO = 31
End Sub

Private Sub PICTURE22_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Bombas refrigeración)
Load PPRINAPOYO
MARCO = 33
End Sub

Private Sub PICTURE25_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Bombas refrigeración)
Load PPRINAPOYO
MARCO = 33
End Sub

Private Sub PICTURE23_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Bombas refrigeración)
Load PPRINAPOYO
MARCO = 33
End Sub

Private Sub PICTURE24_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Bombas refrigeración)
Load PPRINAPOYO
MARCO = 33
End Sub

Private Sub PICTURE29_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Válvula amoníaco)
Load PPRINAPOYO
MARCO = 26
End Sub

Private Sub PICTURE30_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Válvula amoníaco)
Load PPRINAPOYO
MARCO = 26
End Sub

Private Sub PICTURE37_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Válvula amoníaco)
Load PPRINAPOYO

173
Anexos1 Rutinas Programadas

MARCO = 2
End Sub

Private Sub PICTURE38_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
Load PPRINAPOYO
MARCO = 3
End Sub

Private Sub text14_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (presión bomba vaciado
reactor)
Load PPRINAPOYO
MARCO = 4
End Sub

Private Sub text12_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES ( bomba vaciado reactor
revoluciones e intensidad)
Load PPRINAPOYO
MARCO = 5
End Sub

Private Sub text13_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES ( bomba vaciado reactor
revoluciones e intensidad)
Load PPRINAPOYO
MARCO = 5
End Sub

Private Sub text16_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES ( bomba vaciado reactor
revoluciones e intensidad)
Load PPRINAPOYO
MARCO = 24
End Sub

Private Sub PICTURE16_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES ( bomba vaciado reactor)
Load PPRINAPOYO
MARCO = 7
End Sub

Private Sub PICTURE17_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES ( bomba vaciado reactor)
Load PPRINAPOYO
MARCO = 7
End Sub

174
Anexos1 Rutinas Programadas

Private Sub PICTURE14_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES ( bomba circuito reactor)
Load PPRINAPOYO
MARCO = 8
End Sub

Private Sub PICTURE15_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES ( bomba circuito reactor)
Load PPRINAPOYO
MARCO = 9
End Sub

Private Sub text11_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (Intensidad motor reactor)
Load PPRINAPOYO
MARCO = 10
End Sub

Private Sub text10_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (temperatura circuito
reactor)
Load PPRINAPOYO
MARCO = 11
End Sub

Private Sub text9_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (temperatura circuito
reactor)
Load PPRINAPOYO
MARCO = 12
End Sub

Private Sub PICTURE34_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (bombas refrigeración
intercambiador)
Load PPRINAPOYO
MARCO = 13
End Sub

Private Sub PICTURE32_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (bombas refrigeración
intercambiador)
Load PPRINAPOYO
MARCO = 13
End Sub

175
Anexos1 Rutinas Programadas

Private Sub PICTURE33_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (bombas refrigeración
intercambiador)
Load PPRINAPOYO
MARCO = 13
End Sub

Private Sub PICTURE31_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (bombas refrigeración
intercambiador)
Load PPRINAPOYO
MARCO = 13
End Sub

Private Sub TEXT26_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES (NIVEL D1)
Load PPRINAPOYO
MARCO = 14
End Sub

Private Sub PICTURE4_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 15
End Sub

Private Sub PICTURE3_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 15
End Sub

Private Sub PICTURE2_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 15
End Sub

Private Sub TEXT8_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 21
End Sub

Private Sub TEXT7_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES

176
Anexos1 Rutinas Programadas

Load PPRINAPOYO
MARCO = 16
End Sub

Private Sub ButtonMac2_MouseMove(Button As Integer, Shift As


Integer, X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 34
End Sub

Private Sub TEXT5_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 17
End Sub

Private Sub TEXT6_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 18
End Sub

Private Sub TEXT21_MouseMove(Button As Integer, Shift As Integer, X


As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 25
End Sub

Private Sub INTAGITADOR_MouseMove(Button As Integer, Shift As


Integer, X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 19
End Sub

Private Sub PICTURE12_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 20
End Sub

Private Sub PICTURE13_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 20
End Sub

177
Anexos1 Rutinas Programadas

Private Sub PICTURE20_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 22
End Sub

Private Sub PICTURE20_CLICK()


REFRIG.Show
End Sub

Private Sub PICTURE21_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 22
End Sub
Private Sub PICTURE19_MouseMove(Button As Integer, Shift As Integer,
X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 23
End Sub

Private Sub PICTURE18_MouseMove(Button As Integer, Shift As Integer,


X As Single, Y As Single)
'MARCO DE SELECCION DE LOS INDICADORES
Load PPRINAPOYO
MARCO = 23
End Sub

Private Sub Timer10_Timer()


i2 = i2 + 1
If Picture16.Visible = True Then
If i2 < 2 Then
I3 = 0 + 7
I4 = 0 + 1
I5 = 0 + 2
Else
I3 = I3 + 7
I4 = I4 + 1
I5 = I5 + 2
Text13 = (I3 + 7) '& " RPM"
Text14 = (I4 + 1) '& " Kg/cm2)"
Text12 = (I5 + 2) '& " A"
End If
Else
If i2 < 2 Then
I3 = 230 - 7
I4 = 31 - 1
I5 = 60 - 2
Else
I3 = I3 - 7
I4 = I4 - 1

178
Anexos1 Rutinas Programadas

I5 = I5 - 2
If Text13 < 0 Then
Else
Text13 = (I3 - 7) '& " RPM"
End If
If Text14 < 0 Then
Else
Text14 = (I4 - 1) '& " Kg/cm2)"
End If
If Text12 < 0 Then
Else
Text12 = (I5 - 2) '& " A"
End If
End If
End If
If i2 > 30 Then
Timer10.Enabled = False
If Picture16.Visible = True Then
Timer8.Enabled = True
Else
Text13 = "0 RPM"
End If
End If
End Sub

Private Sub Timer11_Timer()


i2 = i2 + 1
TEMP3 = Aleatorio(CLng(2100), CLng(2112))
Text9 = (TEMP3 - 1.5) / 10
If MSGALRM = 21 Then 'temperatura inferior reactor alta
Else
If Text9 > MAX(7) Then
MSGALRM = 21
Call ALARMAS
Text9.BackColor = &HFF&
End If
End If
If MSGALRM = 22 Then 'temperatura inferior reactor alta
Else
If Text9 < MIN(7) Then
MSGALRM = 22
Call ALARMAS
Text9.BackColor = &HFF&
End If
End If
If Picture15.Visible = True Then
If i2 < 2 Then
I3 = 0 + 7
I4 = 0 + 1
I5 = 0 + 2
Else
I3 = I3 + 4
I4 = I4 + 1
I5 = I5 + 2

179
Anexos1 Rutinas Programadas

Text27 = I3
Text10 = I4
Text11 = I5
End If
Else
If i2 < 2 Then
I3 = I3 - 7
I4 = I4 - 1
I5 = I5 - 2
Else
I3 = I3 - 4
I4 = I4 - 1
I5 = I5 - 2
If Text27 < 0 Then
Else
Text27 = I3
End If
If Text10 < 0 Then
Else
Text10 = I4
End If
If Text11 < 0 Then
Else
Text11 = I5
End If
End If
End If
If i2 > 30 Then
Timer11.Enabled = False
If Picture15.Visible = True Then
Timer9.Enabled = True
End If
End If
End Sub

Private Sub Timer12_Timer()


Select Case GRAF
Case 1
On Error GoTo A
C1B = Text12
C1A = Text13
C1C = Text14
A:
Case 2
On Error GoTo AA
C1B = REFRIG.Text3
C1A = Text15
C1C = Text25
AA:
End Select
End Sub

Private Sub Timer13_Timer()


Timer13.Enabled = False

180
Anexos1 Rutinas Programadas

Timer14.Enabled = True
End Sub

Private Sub Timer14_Timer()


Timer14.Enabled = False
End Sub

Private Sub Timer15_Timer()


Picture5.Visible = True
Picture7.Visible = False
If Picture6.Visible = True Then
Picture5.Visible = True
Picture6.Visible = False
Else
Picture5.Visible = False
Picture6.Visible = True
End If
End Sub

Private Sub Timer16_Timer()


If ACTV = False Then
Exit Sub
End If
If Text23 > 90 Then
Timer16.Enabled = False
Timer17.Enabled = True
Picture35.Visible = True
Picture39.Visible = False
Else
Text23 = Text23 + 0.01
ProgressBar1.Value = Text23
Text17 = Text23 & "%"
End If
End Sub

Private Sub Timer17_Timer()


If ACTV = False Then
Exit Sub
End If
If Text23 < 15 Then
Timer17.Enabled = False
Timer16.Enabled = True
Picture39.Visible = True
Picture35.Visible = False
Else
Text23 = Text23 - 0.01
ProgressBar1.Value = Text23
Text17 = Text23 & "%"
End If
End Sub

Private Sub Timer18_Timer()


If ACTV = False Then
Exit Sub

181
Anexos1 Rutinas Programadas

End If
Timer18.Interval = 100
If Text16 < 1350 Then
Text16 = Text16 + 5.3
Else
CAU = Aleatorio(CLng(1327), CLng(1350))
Text16 = CAU
Timer18.Interval = 1000
End If
End Sub

Private Sub Timer19_Timer()


If Text16 > 6 Then
Timer18.Interval = 100
Text16 = Text16 - 3.2
Else
Text16 = 0
Timer19.Enabled = False
End If
End Sub

Private Sub Timer2_Timer()


If ACTV = False Then
GoTo B:
End If
If Picture3.Visible = False Then
Picture3.Visible = True
Picture4.Visible = False
ElseIf Picture4.Visible = False Then
Picture4.Visible = True
Picture3.Visible = False
End If
Picture2.Visible = False
PRES = Aleatorio(CLng(350), CLng(560)) 'REALIZA EL VALOR ALEATORIO
DE INTENSIDAD DEL AGITADOR
INTAGITADOR = (PRES - 1) / 10
Text7 = Aleatorio(CLng(80), CLng(82)) 'REALIZA LA INDICACIÓN
ALEATORIA DEL NIVEL DEL REACTOR
Nivel.Value = Text7
PRES = Aleatorio(CLng((Text18 + 1) * 10), CLng((Text18 - 2) * 10))
'REALIZA EL VALOR ALEATORIO DE TEMPERATURA DEL REACTOR
Text19 = (PRES - 1) / 10
PRES = Aleatorio(CLng(50), CLng(53))
Text22 = Format(CDbl((PRES - 0.11) / 10) + (Text21 / 1000), "0.00")
' CON EL COMANDO FORMAT DECIDIMOS CUANTOS DECIMALES QUEREMOS QUE
SALGAN EN EL DISPLAY
PRES = Aleatorio(CLng(48), CLng(55))
Text5 = (PRES - 0.11) / 10
TEMP = Aleatorio(CLng(2100), CLng(2112)) 'REALIZAMOS UN PEQUEÑO
CALCULO PARA QUE OSCILE LA TEMPERATURA HASTA DECIMAS DE GRADO
Text6 = (TEMP - 1) / 10
TEMP2 = Aleatorio(CLng(2150), CLng(2200)) 'REALIZAMOS UN PEQUEÑO
CALCULO PARA QUE OSCILE LA TEMPERATURA HASTA DECIMAS DE GRADO
Text8 = (TEMP2 - 2) / 10

182
Anexos1 Rutinas Programadas

If ((TEMP2 - 2) / 10) - ((TEMP - 1) / 10) > 9.6 Then 'realizamos UNA


RESTA PARA QUE DE UNA ALARMA CUANDO LA TEMPERATURA SUPERIOR E
INFERIOR DISTEN MAS DE 9.5 GRADOS
Text6.BackColor = &HFF&
Text8.BackColor = &HFF&
MSGALRM = 2
Call ALARMAS 'LLAMADA AL METODO ALARMAS
End If
If INTAGITADOR > 55.9 Then
INTAGITADOR.BackColor = &HFF&
MSGALRM = 1
Call ALARMAS
End If
Text28 = MAX(2)
If MSGALRM = 1 Then 'DETECTA SI LOS MAXIMOS Y LOS MINIMOS SE HAN
MODIFICADO Y LANZAN ALARMA EN CASO NECESARIO
Else
If INTAGITADOR > MAX(2) Then
MSGALRM = 1
Call ALARMAS
INTAGITADOR.BackColor = &HFF&
End If
End If
If MSGALRM = 12 Then 'INTENSIDAD MINIMA REACTOR
Else
If INTAGITADOR < MIN(2) Then
MSGALRM = 12
Call ALARMAS
INTAGITADOR.BackColor = &HFF&
End If
End If
If MSGALRM = 13 Then 'PRESION MAXIMA REACTOR
Else
If Text5 > MAX(3) Then
MSGALRM = 13
Call ALARMAS
Text5.BackColor = &HFF&
End If
End If
If MSGALRM = 14 Then 'PRESION MAXIMA REACTOR
Else
If Text5 < MIN(3) Then
MSGALRM = 14
Call ALARMAS
Text5.BackColor = &HFF&
End If
End If
If MSGALRM = 15 Then 'temperatura inferior reactor alta
Else
If Text6 > MAX(4) Then
MSGALRM = 15
Call ALARMAS
Text6.BackColor = &HFF&
End If

183
Anexos1 Rutinas Programadas

End If
If MSGALRM = 16 Then 'temperatura inferior reactor baja
Else
If Text6 < MIN(4) Then
MSGALRM = 16
Call ALARMAS
Text6.BackColor = &HFF&
End If
End If
If MSGALRM = 17 Then 'temperatura inferior reactor alta
Else
If Text8 > MAX(5) Then
MSGALRM = 17
Call ALARMAS
Text6.BackColor = &HFF&
End If
End If
If MSGALRM = 18 Then 'temperatura inferior reactor baja
Else
If Text8 < MIN(5) Then
MSGALRM = 18
Call ALARMAS
Text6.BackColor = &HFF&
End If
End If
If MSGALRM = 19 Then 'temperatura inferior reactor alta
Else
If Text7 > MAX(6) Then
MSGALRM = 19
Call ALARMAS
Text7.BackColor = &HFF&
End If
End If
If MSGALRM = 20 Then 'temperatura inferior reactor alta
Else
If Text7 < MIN(6) Then
MSGALRM = 20
Call ALARMAS
Text7.BackColor = &HFF&
End If
End If
B:
End Sub

Private Function Aleatorio(Minimo As Long, Maximo As Long) As Long


Randomize
Aleatorio = CLng((Minimo - Maximo) * Rnd + Maximo)
End Function

Private Sub INTAGITADOR_click() 'APERTURA DE PANTALLA DE DATOS PARA


LAS ETIQUETAS
mxmn = 2
Load MAXMIN
MAXMIN.Visible = True

184
Anexos1 Rutinas Programadas

End Sub
Private Sub TEXT11_CLICK()
mxmn = 10
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT8_click()
mxmn = 5
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT5_click()
mxmn = 3
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT6_click()
mxmn = 4
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT7_click()
mxmn = 6
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT9_click()
mxmn = 7
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT10_click()
mxmn = 8
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT13_CLICK()
mxmn = 13
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT14_CLICK()
mxmn = 14
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub INTAGITADOR_KeyPress(KeyAscii As Integer) 'INHIVIDORES


DE ESCRITURA PARA LAS ETIQUETAS
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If

185
Anexos1 Rutinas Programadas

End Sub

Private Sub TEXT5_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT6_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub
Private Sub TEXT2_KeyPress(KeyAscii As Integer)
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT8_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT7_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT9_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT10_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0

186
Anexos1 Rutinas Programadas

End If
End Sub

Private Sub TEXT11_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT27_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT13_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT12_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT14_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT15_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT15_CLICK()


mxmn = 16
Load MAXMIN

187
Anexos1 Rutinas Programadas

MAXMIN.Visible = True
End Sub
Private Sub TEXT16_KeyPress(KeyAscii As Integer)
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT16_CLICK()


mxmn = 22
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub TEXT20_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT20_CLICK()


mxmn = 18
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub TEXT18_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT18_CLICK()


Load Form2
Form2.Visible = True
NUM = 5
End Sub

Private Sub TEXT19_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT19_CLICK()


mxmn = 12

188
Anexos1 Rutinas Programadas

Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub TEXT21_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT21_CLICK()


mxmn = 21
Load MAXMIN
MAXMIN.Visible = True
End Sub
Private Sub TEXT22_KeyPress(KeyAscii As Integer)
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT22_CLICK()


mxmn = 20
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub TEXT23_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT24_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT24_CLICK()


mxmn = 19
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub TEXT25_KeyPress(KeyAscii As Integer)

189
Anexos1 Rutinas Programadas

If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then


KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT25_CLICK()


mxmn = 17
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub TEXT26_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT26_CLICK()


mxmn = 23
Load MAXMIN
MAXMIN.Visible = True
End Sub

Private Sub ALARMAS() 'CON ESTE SUBPROGRAMA DECIDIMOS LA ALARMA QUE


SE PRESENTARÁ EN LA LINEA DE ALARMAS
Select Case MSGALRM
Case 1
Text1 = "IN1 Intensidad Alta agitador reactor "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 2
Text1 = "IT1 Dif Temp Inferior Superior Alta Reactor"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 3
Text1 = "B4 Bomba circuito reactor parada "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 4
Text1 = "B3 Bomba vaciado reactor parada con nivel en reactor"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 5
Text1 = "IT2 Temperatura refrigeración refrigerante muy alta"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 6
Text1 = "Fallo marcha agitador reactor"
Timer3.Enabled = True
Call REGISTRO_ALARMAS

190
Anexos1 Rutinas Programadas

Case 7 ' FALLO APERTUR A VÁLVULA SALIDA


Text1 = "Fallo apertura válvula salida reactor"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 8 'ALARMA PARO BOMBA CIRUCITO REACTOR
Text1 = "Fallo en bomba circuito reactor"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 9
Text1 = "Fallo en bomba vaciado reactor"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 10
Text1 = "Fallo en bomba refrigeración 1"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 11
Text1 = "Fallo en bomba refrigeración 2"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 12 ' INTENSIDAD BAJA AGITADOR REACTOR
Text1 = "IN1 Intensidad Baja Agitador reactor”
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 13 ' ALTA PRESION EN REACTOR
Text1 = "IP1 Presión alta reactor”
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 14 'BAJA PRESIÓN REACTOR
Text1 = "IP1 Presión baja reactor”
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 15
Text1 = "IT4 Temperatura inferior reactor, alta "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 16
Text1 = "IT4 Temperatura inferior reactor, baja "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 17
Text1 = "IT6 Temperatura superior reactor, alta "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 18
Text1 = "IT6 Temperatura superior reactor, baja "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 19
Text1 = "IL3 Nivel alto reactor "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 20
Text1 = "IL3 Nivel bajo reactor”

191
Anexos1 Rutinas Programadas

Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 21
Text1 = "IT5 Temperatura circuito reactor alta "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 22
Text1 = "IT5 Temperatura circuito reactor baja "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 23
Text1 = "IP3 Presión circuito reactor alta "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 24
Text1 = "IP3 Presión circuito reactor baja "
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 25
Text1 = "II3 Intensidad bomba circuito reactor alta"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 26
Text1 = "II3 Intensidad bomba circuito reactor baja"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 27
Text1 = "IR2 Revoluciones bomba circuito reactor altas"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 28
Text1 = "IR2 Revoluciones bomba circuito reactor bajas"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 29
Text1 = "IR1 Revoluciones bomba vaciado reactor altas"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
Case 30
Text1 = "IR1 Revoluciones bomba vaciado reactor bajas"
Timer3.Enabled = True
Call REGISTRO_ALARMAS
End Select
End Sub

Private Sub Timer20_Timer()


If Text17 > 1 Then
Text17 = Text17 - 0.01
Picture35.Visible = True
Picture39.Visible = False
ProgressBar1.Value = Text17
Else
Text17 = 0
Timer20.Enabled = False

192
Anexos1 Rutinas Programadas

Picture39.Visible = True
Picture35.Visible = False
End If
End Sub

Private Sub Timer21_Timer()


If SALMU2 = 0 Then
SALMU2 = SALMU
End If
If Text21 < 99 Then
If Text21 > 0 Then
If SALMU2 = SALMU Then
Text21 = Format(CDbl(Text21 + 0.005), "0.00")
Text24 = Format(CDbl(27 + (Text21 / 1000)), "0.00")
Text20 = Format(CDbl(2 + (Text21 / 800)), "0.00")
Text25 = Format(CDbl(15 + (Text21 / 800)), "0.00")
Else
Text21 = (Text21 + 0.35) - (SALMU / 5)
If REFRIG.Text3 < 25 Then
Timer21.Interval = 2000
ElseIf REFRIG.Text3 > 25 Then
Timer21.Interval = 2600
ElseIf REFRIG.Text3 > 50 Then
Timer21.Interval = 4200
ElseIf REFRIG.Text3 > 75 Then
Timer21.Interval = 7400
ElseIf REFRIG.Text3 > 98 Then
Timer21.Interval = 20000
End If
SALMU2 = SALMU
End If
Else
If Text21 > -5 Then
Text21 = (Text21 + 0.35) - (SALMU / 5)
Else
Text21 = -4.5
End If
End If
Else
If SALMU2 = SALMU Then
Else
CAU = Aleatorio(CLng(95.01), CLng(99.99))
Text21 = CAU - SALMU
Timer21.Interval = 1000
MSGALRM = 5
Call ALARMAS
Text21.BackColor = &HFF&
End If
End If
End Sub

Private Sub Timer22_Timer()


If PPrincipal.Width = 15405 Then
For i = 0 To 1740

193
Anexos1 Rutinas Programadas

PPrincipal.Width = 15405 + i
If PPrincipal.Width = 17145 Then
Timer22.Enabled = False
End If
Next
ElseIf PPrincipal.Width = 17145 Then
For i = 0 To 1740
PPrincipal.Width = 17145 - i
If PPrincipal.Width = 15405 Then
Timer22.Enabled = False
End If
Next
End If
End Sub

Private Sub Timer23_Timer()


Select Case ENTSAL
Case 1
Picture10(1).Visible = True
Picture42(0).Visible = False
Case 2
Picture10(1).Visible = False
Picture42(0).Visible = True
Case 3
Picture10(2).Visible = True
Picture42(1).Visible = False
Case 4
Picture10(2).Visible = False
Picture42(1).Visible = True
Case 5
Picture10(3).Visible = True
Picture42(2).Visible = False
Case 6
Picture10(3).Visible = False
Picture42(2).Visible = True
Case 7
Picture10(4).Visible = True
Picture42(3).Visible = False
Case 8
Picture10(4).Visible = False
Picture42(3).Visible = True
Case 9
Picture10(5).Visible = True
Picture42(4).Visible = False
Case 10
Picture10(5).Visible = False
Picture42(4).Visible = True
Case 11
Picture10(6).Visible = True
Picture42(5).Visible = False
Case 12
Picture10(6).Visible = False
Picture42(5).Visible = True
Case 13

194
Anexos1 Rutinas Programadas

Picture10(7).Visible = True
Picture42(6).Visible = False
Case 14
Picture10(7).Visible = False
Picture42(6).Visible = True
Case 17
Picture10(8).Visible = True
Picture42(7).Visible = False
Case 18
Picture10(8).Visible = False
Picture42(7).Visible = True
Case 19
Picture10(9).Visible = True
Picture42(8).Visible = False
Case 23
Picture10(10).Visible = True
Picture42(9).Visible = False
Case 24
Picture10(10).Visible = False
Picture42(9).Visible = True
Case 25
Picture10(9).Visible = False
Picture42(8).Visible = True
Case 26
Picture10(11).Visible = True
Picture42(10).Visible = False
Case 27
Picture10(11).Visible = False
Picture42(10).Visible = True
End Select
Select Case fallodisp
Case 1 ' AGITADOR REACTOR
For i = 0 To 10
LED3(i).Visible = False
Next
LED3(0).Visible = True
Case 2 'BOMBA VACIADO REACTOR
LED3(3).Visible = True
Picture44(3).Visible = True
Case 3 ' BOMBA CIRCUITO REACTOR
LED3(1).Visible = True
Picture44(1).Visible = True
Case 4 ' bomba refrigeración 1
LED3(4).Visible = True
Picture44(4).Visible = True
Case 5 ' bomba refrigeración 2
LED3(5).Visible = True
Picture44(5).Visible = True
Case 30
Case 31
For i = 0 To 10
LED3(i).Visible = False
Next
End Select

195
Anexos1 Rutinas Programadas

End Sub

Private Sub Timer24_Timer()


Text2 = "Operador"
MsgBox "Tiempo desconexión alcanzado", vbInformation, "¡Atención!"
Timer24.Enabled = False
End Sub

Private Sub Timer25_Timer()


If ACTV = False Then
Else
CRONO = CRONO + 1
Tiempo = Format(Int(CRONO / 36000) Mod 24, "00") & ":" & _
Format(Int(CRONO / 600) Mod 60, "00") & ":" & _
Format(Int(CRONO / 10) Mod 60, "00") & ":" & _
Format(CRONO Mod 10, "00")
If MSGALRM > 0 Then
Else
Text1 = "Tiempo de funcionamiento simulación " & Tiempo
End If
End If
End Sub

Private Sub Timer26_Timer()


Timer26.Enabled = False
End Sub

Private Sub Timer3_Timer()


If ACTV = False Then
GoTo B
End If
If Shape5.Visible = False Then
Shape5.Visible = True
Text1.BackColor = &HFF&
Text1.ForeColor = &H80000008
Else
Shape5.Visible = False
Text1.ForeColor = &HFF&
Text1.BackColor = &H80000008
End If
If Timer26.Enabled = False Then
PlaySound App.Path & "\SIRENA.wav"
End If
B:
End Sub

Private Sub Timer5_Timer()


Text26 = Aleatorio(CLng(40), CLng(45)) & "%"
End Sub

Private Sub Timer6_Timer() 'TEMPORIZADOR QUE DARÁ LA ORDEN DE


ARRANQUE A TODOS LOS ELEMENTOS SIMULADOS
Timer5.Enabled = True
Timer6.Enabled = False

196
Anexos1 Rutinas Programadas

End Sub

Private Sub Timer7_Timer() 'TEMPORIZADOR QUE SE ENCARGA DE DETENER


TODOS LOS ELEMENTOS ACTIVOS
Timer5.Enabled = False
Timer7.Enabled = False
End Sub

Private Sub REGISTRO_ALARMAS()


For i = 0 To 50
If REALARM(i) = "" Then
REALARM(i) = " Hora " & Text3.Text & " " & "Fecha " &
Text4.Text & " " & "Alarma " & Text1.Text
Exit Sub
Else
End If
Next
End Sub

Private Sub Timer8_Timer()


If Picture19.Visible = True Then
Call Picture16_Click
End If
Text14 = Aleatorio(CLng(30), CLng(32)) '& " Kg/cm2"
Text13 = Aleatorio(CLng(56), CLng(66)) '& " A"
Text12 = Aleatorio(CLng(200), CLng(230)) '& " RPM"
If MSGALRM = 29 Then 'Revoluciones bomba vaciado reactor
If Text12 > MAX(11) Then
MSGALRM = 29
Call ALARMAS
Text12.BackColor = &HFF&
End If
End If
If MSGALRM = 30 Then 'Revoluciones bomba vaciado reactor
If Text12 < MIN(11) Then
MSGALRM = 30
Call ALARMAS
Text12.BackColor = &HFF&
End If
End If
End Sub

Private Sub Timer9_Timer()


If Picture15.Visible = False Then
Timer11.Enabled = True
Timer9.Enabled = False
i2 = 0
End If
Text10 = Aleatorio(CLng(20), CLng(22))
TEMP3 = Aleatorio(CLng(2100), CLng(2112))
Text9 = (TEMP3 - 1.5) / 10
IM3 = Aleatorio(CLng(55), CLng(60))
Text11 = IM3
Text27 = Aleatorio(CLng(200), CLng(230))

197
Anexos1 Rutinas Programadas

If MSGALRM = 21 Then 'temperatura circuito reactor alta


Else
If Text9 > MAX(7) Then
MSGALRM = 21
Call ALARMAS
Text9.BackColor = &HFF&
End If
End If
If MSGALRM = 22 Then 'temperatura circuito reactor alta
Else
If Text9 < MIN(7) Then
MSGALRM = 22
Call ALARMAS
Text9.BackColor = &HFF&
End If
End If
If MSGALRM = 23 Then 'presion circuito reactor alta
Else
If Text10 > MAX(8) Then
MSGALRM = 23
Call ALARMAS
Text10.BackColor = &HFF&
End If
End If
If MSGALRM = 24 Then 'presion circuito reactor baja
Else
If Text10 < MIN(8) Then
MSGALRM = 24
Call ALARMAS
Text10.BackColor = &HFF&
End If
End If
If MSGALRM = 25 Then 'Intensidad bomba circuito reactor
If Text11 > MAX(10) Then
MSGALRM = 25
Call ALARMAS
Text11.BackColor = &HFF&
End If
End If
If MSGALRM = 26 Then 'Intensidad bomba circuito reactor
If Text11 < MIN(10) Then
MSGALRM = 26
Call ALARMAS
Text11.BackColor = &HFF&
End If
End If
If MSGALRM = 27 Then 'Intensidad bomba circuito reactor
If Text27 > MAX(9) Then
MSGALRM = 27
Call ALARMAS
Text27.BackColor = &HFF&
End If
End If
If MSGALRM = 28 Then 'Intensidad bomba circuito reactor

198
Anexos1 Rutinas Programadas

If Text27 < MIN(9) Then


MSGALRM = 28
Call ALARMAS
Text27.BackColor = &HFF&
End If
End If
End Sub

Private Sub TEXT12_DblClick()


If Text12 = "" Then
Exit Sub
End If
GRAF = 1
Timer12.Enabled = True
Load GRAFICAS
GRAFICAS.Visible = True
End Sub
Private Sub PICTURE21_CLICK()
If ACTV = False Then
Exit Sub
End If
Load REFRIG
REFRIG.Show
End Sub

Private Sub PICTURE26_CLICK()


If ACTV = False Then
Exit Sub
End If
Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ ABRIR VÁLVULA ?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Picture26.Visible = False
Picture28.Visible = True
End If
End Sub

Private Sub PICTURE28_CLICK()


Volumen &HAD, 0, 1, 0
ACTB = MsgBox("¿ CERRAR VÁLVULA ?" & Chr(13), 324, "ATENCION")
Volumen &HAD, 0, 1, 0
If ACTB = 7 Then
Else
Picture28.Visible = False
Picture26.Visible = True
End If
End Sub

199
Anexos1 Rutinas Programadas

7.1.14. Código Pantalla REFRIG.


Option Explicit
Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As
Integer, ByVal bit As Byte) As Boolean
Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Function IsDriverInstalled Lib "IO.DLL" () As
Boolean
Dim MAX As Integer
Dim CL As Boolean

Private Sub ButtonMac1_Click()


REFRIG.Hide
End Sub
Private Function Aleatorio(Minimo As Long, Maximo As Long) As Long
Randomize
Aleatorio = CLng((Minimo - Maximo) * Rnd + Maximo)
End Function

Private Sub Command1_Click()


If Text1 = "" Then
Exit Sub
ElseIf Text2 = "" Then
Exit Sub
End If
GRAF = 2
PPrincipal.Timer12.Enabled = True
Load GRAFICAS
GRAFICAS.Visible = True
End Sub

Private Sub Command2_Click()


If HScroll1.Value > 0 Then
If CL = False Then
HScroll1.Value = HScroll1.Value - 1
End If
ENTSAL = 6
Load INOUT
End If
If Text3 = 0 Then
Else
ProgressBar1.Value = Text3
End If
End Sub

Private Sub Command3_Click()


If PPrincipal.Picture23.Visible = True Or
PPrincipal.Picture24.Visible = True Then
Else
Exit Sub
End If
If HScroll1.Value < 100 Then
200
Anexos1 Rutinas Programadas

If CL = False Then
HScroll1.Value = HScroll1.Value + 1
End If
ENTSAL = 5
Load INOUT
End If
If Text3 < 1 Then
Else
ProgressBar1.Value = Text3
End If
End Sub

Private Sub Form_Load()


Dim lR As Long
lR = SetTopMostWindow(REFRIG.hWnd, True)
CL = False
End Sub

Private Sub HScroll1_Change()


Text3 = HScroll1.Value
Text1 = Text3 & "%"
CAUDAL.MAX = 9000
APERTURA.Value = Text3
If PPrincipal.Picture23.Visible = True Then
If HScroll1.Value > 1 Then
Timer1.Enabled = True
Else
Timer1.Enabled = False
End If
ElseIf PPrincipal.Picture24.Visible = True Then
If HScroll1.Value > 1 Then
Timer1.Enabled = True
Else
Timer1.Enabled = False
End If
Else
Text4 = 0
Text2 = Text4 & " º"
End If
End Sub

Private Sub Picture1_Click()


If CL = False Then
CL = True
Line1.Visible = True
Else
CL = False
Line1.Visible = False
End If
End Sub

Private Sub reset_Click()


If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0

201
Anexos1 Rutinas Programadas

End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
APERTURA.Value = 0
Text3 = 0
ProgressBar1.Value = 0
HScroll1.Value = 0
End Sub

Private Sub Timer1_Timer()


If PPrincipal.Picture23.Visible = True Or
PPrincipal.Picture24.Visible = True Then
Else
Text3 = 0
Text4 = 0
HScroll1.Value = 0
ProgressBar1.Value = 0
End If
Text4 = Aleatorio(CLng((Text3 * 9000) / 96), CLng((Text3 * 9000) /
100))
CAUDAL.Value = Text4
PPrincipal.Text15 = Text4
If Text4 > 1 Then
PPrincipal.Picture21.Visible = False
PPrincipal.Picture20.Visible = True
Else
PPrincipal.Picture20.Visible = False
PPrincipal.Picture21.Visible = True
End If
Text2 = Text4 & " m3"
If Text3 < 1 Then
Call reset_Click
End If
End Sub
Private Sub TEXT1_KeyPress(KeyAscii As Integer)
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub
Private Sub TEXT2_KeyPress(KeyAscii As Integer)
If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0

202
Anexos1 Rutinas Programadas

Else
KeyAscii = 0
End If
End Sub

7.1.15. Código Pantalla RegAlarm.


Private Sub ButtonMac1_Click()
Dim lR As Long
lR = SetTopMostWindow(RegAlarm.hWnd, True)
Unload RegAlarm
End Sub

Private Sub Form_Load()


Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
Dim lR As Long
lR = SetTopMostWindow(RegAlarm.hWnd, True)
End Sub

7.2. Código PLC.

7.2.1. Código Pantalla Principal.


option Explicit
Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer,
ByVal Data As Byte)
Private Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer)
As Byte
Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As
Integer, ByVal bit As Byte) As Boolean
Private Declare Function IsDriverInstalled Lib "IO.DLL" () As
Boolean
Dim CRONO As Long 'Contador.
Dim Tiempo As String 'Tiempo total transcurrido.
Dim rest, s2 As Integer 'variable que se utilizara para contar las
entradas mientras se lee el dato de cada una
Dim forzar, forzar2, s, REPET, repet2, abrirv, cerrarv As Variant
'variable que contendra el numero binario resultante de juntar los 5
bits de las entradas
Dim AA, FG As Variant 'VARIABLE PROVISIONAL SOLO PARA
PRUEVAS+++++++++++++++++++++++++++++++++++++++++++++
Dim ALARM As Integer ' s es una variable que se usa para desglosar
el numero binario en bits separados
Dim contenedor2 As Variant
Dim B1, B2, B3, B4, B5, C1, C2, C3, C4, C5 As Byte
203
Anexos1 Rutinas Programadas

Dim valorm As Variant


Dim para As Boolean
Dim contenedor As Variant
Dim d1, d2 As Integer 'variable que se queda con la posición del
dato encontrado en la matriz
Dim CountExit As Integer 'variable que lleva la cuenta para el timer
que hace ejecuta las salidas
Private Sub Command1_Click()
End
End Sub

Private Sub Form_Load()


Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'CENTRA EL FORMULARIO EN MEDIO DE LA VENTANA
CountExit = 0
Form2.Height = 8500
Form2.Width = 12000
abrirv = "00101"
cerrarv = "00110"
Form2.Caption = "PLC "
PortOut &H378, 0 'ponemos los puertos de salida acero
PortOut &H37A, 0 'ponemos los puertos de salida acero
'*******************************************************************
*******************************************
' LECTURA DATOS MATRIZ TAGS ENTRADAS
direccion = App.Path & "\TAGS.txt" 'PATH DONDE SE ENCUNTRA EL
ARCHIVO DE REGISTRO
Open direccion For Input As #1
Do While Not EOF(1) 'EOF: End Of File (Final del archivo)
Input #1, DATOSTAGS
If DATOSTAGS = "" Then
GoTo BB
End If
For i = 1 To 32
If MATRIZTAGS(i) = "" Then
MATRIZTAGS(i) = DATOSTAGS
GoTo b
End If
Next
b:
Loop
BB:
Close #1
'*******************************************************************
*******************************************
' LECTURA DATOS MATRIZ BITS ENTRADAS
direccion = App.Path & "\bitsbinarios.txt" 'PATH DONDE SE ENCUNTRA
EL ARCHIVO DE REGISTRO
Open direccion For Input As #1
Do While Not EOF(1) 'EOF: End Of File (Final del archivo)
Input #1, DATOSBITS
If DATOSBITS = "" Then
GoTo BB1
End If

204
Anexos1 Rutinas Programadas

For i = 1 To 32
If MATRIZBITS(i) = "" Then
MATRIZBITS(i) = DATOSBITS
GoTo B1
End If
Next
B1:
Loop
BB1:
Close #1
'*******************************************************************
*******************************************
' LECTURA DATOS MATRIZ BITS SALIDAS
direccion = App.Path & "\bitssalidas.txt" 'PATH DONDE SE ENCUNTRA EL
ARCHIVO DE REGISTRO
Open direccion For Input As #1
Do While Not EOF(1) 'EOF: End Of File (Final del archivo)
Input #1, DATOSBITSSALIDAS
If DATOSBITSSALIDAS = "" Then
GoTo BB2
End If
For i = 1 To 32
If MATRIZBITSSALIDAS(i) = "" Then
MATRIZBITSSALIDAS(i) = DATOSBITSSALIDAS
GoTo B2
End If
Next
B2:
Loop
BB2:
Close #1
'*******************************************************************
*******************************************
' LECTURA DATOS MATRIZ TAGS SALIDAS
direccion = App.Path & "\TAGSALIDAS.txt" 'PATH DONDE SE ENCUNTRA EL
ARCHIVO DE REGISTRO
Open direccion For Input As #1
Do While Not EOF(1) 'EOF: End Of File (Final del archivo)
Input #1, DATOSTAGSSALIDAS
If DATOSTAGSSALIDAS = "" Then
GoTo BB3
End If
For i = 1 To 32
If MATRIZTAGSSALIDAS(i) = "" Then
MATRIZTAGSSALIDAS(i) = DATOSTAGSSALIDAS
GoTo B3
End If
Next
B3:
Loop
BB3:
Close #1
'*******************************************************************
********************************************

205
Anexos1 Rutinas Programadas

' LECTURA DATOS MATRIZ TAGS SALIDAS


ACTIVAS
direccion = App.Path & "\bitsactivos.txt" 'PATH DONDE SE ENCUNTRA EL
ARCHIVO DE REGISTRO
Open direccion For Input As #1
Do While Not EOF(1) 'EOF: End Of File (Final del archivo)
Input #1, DATOSBITSACTIVOS
If DATOSBITSACTIVOS = "" Then
GoTo BB4
End If
For i = 1 To 32
If salidasactivas(i) = "" Then
salidasactivas(i) = DATOSBITSACTIVOS
GoTo B4
End If
Next
B4:
Loop
BB4:
Close #1
End Sub

Private Sub OFF_Click()


Timer6.Enabled = True
Timer2.Enabled = False
LED4.Visible = False
LED2.Visible = True
LED1.Visible = False
LED3.Visible = True
Timer1.Enabled = False 'PARAMOS EL CONTADOR DE TIEMPO DE
FUNCIONAMIENTO
LectorDatos.Enabled = False 'para la lectura de datos
Timer4.Enabled = False
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = False Then
SetPortBit &H378, 5
End If
Timer5.Enabled = True
End Sub

Private Sub ON_Click()


Timer6.Enabled = False

206
Anexos1 Rutinas Programadas

If LED4.Visible = True Then 'ESTA OPCIÓN EVITA QUE SE PULSE POR


ERROR EL BOTON DE ON CUNDO EL SISTEMA YA ESTÁ EN MARCHA
Else
LED4.Visible = True
LED3.Visible = False
LED1.Visible = True
Timer1.Enabled = True 'PONEMOS EN MARCHA EL CONTADOR DE TIEMPO
DE FUNCIONAMIENTO
Timer4.Enabled = True
Timer2.Enabled = True
Call RESET
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = False Then
SetPortBit &H378, 5
End If
Timer5.Enabled = True
End Sub

Private Sub SALIDA_Timer()


CountExit = CountExit + 1
If CountExit = 1 Then
If s > 0.9 Then
Text2 = Text2 & 0
AA = AA & 0
If GetPortBit(&H37A, 3) = True Then
NotPortBit &H37A, 3
End If
s = s - 1
s = s * 10
Else
AA = AA & 1
If GetPortBit(&H37A, 3) = False Then
SetPortBit &H37A, 3
End If
s = s * 10
End If
If s > 0.9 Then
Text2 = Text2 & 0
AA = AA & 0
If GetPortBit(&H37A, 2) = False Then
SetPortBit &H37A, 2

207
Anexos1 Rutinas Programadas

End If
s = s - 1
s = s * 10
Else
AA = AA & 1
If GetPortBit(&H37A, 2) = True Then
NotPortBit &H37A, 2
End If
s = s * 10
End If
If s > 0.9 Then
AA = AA & 1
If GetPortBit(&H37A, 1) = True Then
NotPortBit &H37A, 1
End If
s = s - 1
s = s * 10
Else
Text2 = Text2 & 0
AA = AA & 0
If GetPortBit(&H37A, 1) = False Then
SetPortBit &H37A, 1
End If
s = s * 10
End If
If s > 0.9 Then
Text2 = Text2 & 0
AA = AA & 0
If GetPortBit(&H37A, 0) = True Then
NotPortBit &H37A, 0
End If
s = s - 1
s = s * 10
Else
AA = AA & 1
If GetPortBit(&H37A, 0) = False Then
SetPortBit &H37A, 0
End If
s = s * 10
End If
End If
If CountExit = 2 Then
If GetPortBit(&H378, 6) = False Then
SetPortBit &H378, 6
End If
End If
If CountExit = 3 Then
CountExit = 0
NotPortBit &H378, 6
SALIDA.Enabled = False
End If
End Sub

Private Sub salir_Click()

208
Anexos1 Rutinas Programadas

End
End Sub

Private Sub Text1_click()


Text1.Visible = False
Timer3.Enabled = False
LED6.Visible = False
End Sub

Private Sub Timer1_Timer()


CRONO = CRONO + 1
Tiempo = Format(Int(CRONO / 36000) Mod 24, "00") & ":" & _
Format(Int(CRONO / 600) Mod 60, "00") & ":" & _
Format(Int(CRONO / 10) Mod 60, "00") & ":" & _
Format(CRONO Mod 10, "00")
Form2.Caption = "PLC
" & Tiempo
End Sub
Private Sub COMPARABITS()

DatosIO.Text5 = forzar2
Dim d1, d2 As Integer 'variable que se queda con la posición del
dato encontrado en la matriz
For i = 1 To 32
If forzar2 = MATRIZBITS(i) Then
d1 = i
GoTo B2
Else
If i = 32 Then
ALARM = 2
Call Alarma
End If
End If
Next
B2:
DatosIO.Text1 = MATRIZTAGS(d1)
contenedor = MATRIZTAGS(d1)
For i = 1 To 32
If contenedor = MATRIZTAGSSALIDAS(i) Then

d2 = i
GoTo B3
End If
Next
B3:
DatosIO.Text6 = MATRIZBITSSALIDAS(d2)
contenedor2 = MATRIZBITSSALIDAS(d2) 'con estos datos trabajaremos
para asignar las salidas
s = contenedor2 / 10000
If s > 0.9 Then
ALARM = 1
Call Alarma
DatosIO.Text6 = "SIN SALIDA"
DatosIO.Text2 = "SIN SALIDA"

209
Anexos1 Rutinas Programadas

Else
DatosIO.Text6 = MATRIZBITSSALIDAS(d2)
DatosIO.Text2 = MATRIZTAGSSALIDAS(i)
s = s * 10
s2 = 4
For i = 0 To 3
s2 = s2 - 1
If s > 0.9 Then
Text2 = Text2 & 1
AA = AA & 1
If GetPortBit(&H37A, s2) = False Then
SetPortBit &H37A, s2
End If
s = s - 1
s = s * 10
Else
Text2 = Text2 & 0
AA = AA & 0
If GetPortBit(&H37A, s2) = True Then
NotPortBit &H37A, s2
End If
s = s * 10
End If
Next
End If
FG = "1110"
If AA = FG Then
DatosIO.REPARTIDOR.Enabled = True
End If
FG = "1101"
If AA = FG Then
DatosIO.REPARTIDOR.Enabled = True
End If
AA = ""
End Sub

Private Sub Timer2_Timer()


If LED4.Visible = True Then
LED4.Visible = False
Else
LED4.Visible = True
End If
End Sub

Private Sub RESET()


forzar = ""
CRONO = 0
Form2.Caption = "PLC
" & "00:00:00:00"
End Sub

Private Sub Timer3_Timer()


If LED6.Visible = True Then
LED6.Visible = False

210
Anexos1 Rutinas Programadas

DatosIO.LED4.Visible = False
Else
LED6.Visible = True
DatosIO.LED4.Visible = True
End If
End Sub

Private Sub Timer4_Timer()


If GetPortBit(&H379, 3) = True Then
B1 = 0
Else
B1 = 1
End If
If GetPortBit(&H379, 4) = True Then
B2 = 0
Else
B2 = 1
End If
If GetPortBit(&H379, 5) = True Then
B3 = 0
Else
B3 = 1
End If
If GetPortBit(&H379, 6) = True Then
B4 = 0
Else
B4 = 1
End If
If GetPortBit(&H379, 7) = True Then
B5 = 1
Else
B5 = 0
End If
forzar = B5 & B4 & B3 & B2 & B1
REPET = "00000"
If forzar = REPET Then
forzar2 = ""
forzar = REPET
If DatosIO.LECTOR.Enabled = True Then
DatosIO.LECTOR.Enabled = False
End If
GoTo b
End If
If forzar2 = "" Then ' si la variable de comparación esta vacía que
la llene
forzar2 = forzar
Call NUEVOMÉTODO
DatosIO.Text5 = forzar
DatosIO.LECTOR.Enabled = True
Else
If forzar2 = forzar Then
Else
Call NUEVOMÉTODO
forzar2 = forzar

211
Anexos1 Rutinas Programadas

DatosIO.Text5 = forzar
DatosIO.LECTOR.Enabled = True
End If
End If
Text7 = forzar
b:
forzar = ""
End Sub

Private Sub Timer5_Timer()


If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = True Then
NotPortBit &H378, 5
End If
Timer5.Enabled = False
End Sub

Private Sub Timer6_Timer()


If GetPortBit(&H379, 3) = False Then
If GetPortBit(&H379, 4) = False Then
If GetPortBit(&H379, 5) = False Then
If GetPortBit(&H379, 6) = False Then
If GetPortBit(&H379, 4) = False Then
Call ON_Click
End If
End If
End If
End If
End If
End Sub

Private Sub verdatos_Click()


Load DatosIO
DatosIO.Show
End Sub
Private Sub Alarma()
Select Case ALARM
Case 1
Timer3.Enabled = True
Text1 = Text1 & "La entrada no esta codificada como salida " &
Chr(13) + Chr(10)
Case 2
Timer3.Enabled = True

212
Anexos1 Rutinas Programadas

Text1 = Text1 & "Error en base de datos de BITS entrada no


registrada" + Chr(13) + Chr(10)
End Select
End Sub

Private Sub VisAlarm_Click()


Text1.Visible = True
End Sub
Private Sub NUEVOMÉTODO()
For i = 1 To 32
valorm = MATRIZBITS(i)
contenedor = MATRIZBITSSALIDAS(i)
s = valorm / 10000
If s > 0.9 Then
C5 = 1
s = s - 1
s = s * 10
Else
C5 = 0
s = s * 10
End If
If s > 0.9 Then
C4 = 1
s = s - 1
s = s * 10
Else
C4 = 0
s = s * 10
End If
If s > 0.9 Then
C3 = 1
s = s - 1
s = s * 10
Else
C3 = 0
s = s * 10
End If
If s > 0.9 Then
C2 = 1
s = s - 1
s = s * 10
Else
C2 = 0
s = s * 10
End If
If s > 0.9 Then
C1 = 1
s = s - 1
s = s * 10
Else
C1 = 0
s = s * 10
End If
If B1 = C1 And B2 = C2 And B3 = C3 And B4 = C4 And B5 = C5 Then

213
Anexos1 Rutinas Programadas

contenedor2 = MATRIZBITS(i)
DatosIO.Text6 = MATRIZBITSSALIDAS(i)
DatosIO.Text5 = MATRIZBITS(i)
DatosIO.Text2 = MATRIZTAGSSALIDAS(i)
DatosIO.Text1 = MATRIZTAGS(i)
Text5 = contenedor2 & " " & contenedor
If contenedor = "00000" Then
GoTo FIN
End If
If contenedor = "10001" Then
Call controlsalidas
GoTo FIN
ElseIf contenedor = "10010" Then
Call controlsalidas
GoTo FIN
ElseIf contenedor = "10011" Then
Call controlsalidas
GoTo FIN
End If
s = contenedor / 10000
If s > 0.9 Then
ALARM = 1
Call Alarma
DatosIO.Text6 = "SIN SALIDA"
DatosIO.Text2 = "SIN SALIDA"
Else
DatosIO.Text6 = MATRIZBITSSALIDAS(i)
DatosIO.Text2 = MATRIZTAGSSALIDAS(i)
s = s * 10
s2 = 4
SALIDA.Enabled = True
End If
GoTo veri
Else
End If
Next
FIN:
veri:
End Sub

Private Sub controlsalidas()


If contenedor = "10001" Then
If GetPortBit(&H378, 1) = False Then
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then
NotPortBit &H378, 4
End If

214
Anexos1 Rutinas Programadas

If GetPortBit(&H378, 5) = False Then


SetPortBit &H378, 5
End If
ElseIf contenedor = "10010" Then
SetPortBit &H378, 1
NotPortBit &H378, 2
NotPortBit &H378, 3
SetPortBit &H378, 4
NotPortBit &H378, 5
ElseIf contenedor = "10011" Then
SetPortBit &H378, 1
NotPortBit &H378, 2
NotPortBit &H378, 3
SetPortBit &H378, 4
SetPortBit &H378, 5
End If
End Sub

7.2.2. Código Pantalla Datos.


Option Explicit
Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer,
ByVal bit As Byte)
Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As
Integer, ByVal bit As Byte) As Boolean
Dim IO, busc As Boolean
Dim DISP, SD, SD1, SD2, I2, i4 As Integer
Dim buscar, buscar2 As Variant
Dim MLEDS(7) As Integer
Dim Entradas As Variant

Private Sub Command1_Click() 'resetea los leds de alarma


For i = 0 To 10
LED3(i).Visible = False
LED4(i).Visible = True
Next
If GetPortBit(&H378, 1) = False Then '1
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then '0
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then '1
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then '1
SetPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = False Then '0
SetPortBit &H378, 5
End If
215
Anexos1 Rutinas Programadas

PUESTAACERO.Enabled = True
End Sub

Private Sub Command2_Click()


If Frame4.Visible = True Then
Frame4.Visible = False
End If
Frame1.Visible = False
End Sub

Private Sub Command3_Click()


If Combo1.Text = "Fallo" Then
Else
If Combo1.Text = "Agitador del Reactor" Then
I2 = 0
If LED2(0).Visible = True Then
If GetPortBit(&H378, 1) = False Then '1
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then '0
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then '0
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then '0
NotPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = True Then '0
NotPortBit &H378, 5
End If
PUESTAACERO.Enabled = True
End If
ElseIf Combo1.Text = "Bomba Circuito Reactor" Then
I2 = 1
If LED2(1).Visible = True Then
If GetPortBit(&H378, 1) = False Then '1
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then '1
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then '0
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then '0
NotPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = True Then '0
NotPortBit &H378, 5
End If
PUESTAACERO.Enabled = True
End If
ElseIf Combo1.Text = "Válvula Reguladora Refrigeración" Then

216
Anexos1 Rutinas Programadas

I2 = 2
ElseIf Combo1.Text = "Bomba Vaciado Reactor" Then
I2 = 3
If LED2(3).Visible = True Then
If GetPortBit(&H378, 1) = True Then '0
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = False Then '1
SetPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then '0
NotPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then '0
NotPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = True Then '0
NotPortBit &H378, 5
End If
PUESTAACERO.Enabled = True
End If
ElseIf Combo1.Text = "Bomba Refrigeración Reactor 1" Then
I2 = 4
If LED2(4).Visible = True Then
If GetPortBit(&H378, 1) = True Then '0
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then '0
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then '1
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then '0
NotPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = True Then '0
NotPortBit &H378, 5
End If
PUESTAACERO.Enabled = True
End If
ElseIf Combo1.Text = "Bomba Refrigeración Reactor 2" Then
I2 = 5
If LED2(5).Visible = True Then
If GetPortBit(&H378, 1) = False Then '1
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then '0
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then '1
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = True Then '0

217
Anexos1 Rutinas Programadas

NotPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = True Then '0
NotPortBit &H378, 5
End If
PUESTAACERO.Enabled = True
End If
ElseIf Combo1.Text = "Válvula Salida Reactor" Then
I2 = 6
If LED2(6).Visible = True Then
If GetPortBit(&H378, 1) = False Then '1
SetPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then '0
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = False Then '1
SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then '1
SetPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = True Then '0
NotPortBit &H378, 5
End If
PUESTAACERO.Enabled = True
End If
ElseIf Combo1.Text = "Bomba Agua 1" Then
I2 = 7
ElseIf Combo1.Text = "Bomba Agua 2" Then
I2 = 8
ElseIf Combo1.Text = "Válvula Aireación" Then
I2 = 9
ElseIf Combo1.Text = "Soplante" Then
I2 = 10
End If
End If
For i = 0 To 10
If I2 = i Then
LED3(i).Visible = True
LED4(i).Visible = False
GoTo H
End If
LED3(i).Visible = False
LED4(i).Visible = True
H:
Next
End Sub

Private Sub ComponentesActivos_Timer()


If Text4 = 0 Then
Label18 = "Válvula cerrada"
LED2(2).Visible = False
LED1(2).Visible = True

218
Anexos1 Rutinas Programadas

Else
LED1(2).Visible = False
LED2(2).Visible = True
End If
ComponentesActivos.Enabled = False
End Sub

Private Sub Form_Load()


Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
SD2 = Text4
DatosIO.Width = 11715
DatosIO.Height = 8490
End Sub

Private Sub LECTOR_Timer()


Entradas = Text5
If Entradas = "00001" Then 'Agitador reactor marcha
LED2(0).Visible = True
LED1(0).Visible = False
If LED3(0).Visible = True Then
Combo1.Text = "Agitador del Reactor"
Call Command3_Click
End If
ElseIf Entradas = "00010" Then 'Agitador reactor paro
LED2(0).Visible = False
LED1(0).Visible = True
ElseIf Entradas = "00011" Then
LED2(1).Visible = True
LED1(1).Visible = False
If LED3(1).Visible = True Then
Combo1.Text = "Bomba Circuito Reactor"
Call Command3_Click
End If
ElseIf Entradas = "00100" Then
LED2(1).Visible = False
LED1(1).Visible = True
ElseIf Entradas = "00101" Then
REPARTIDOR.Enabled = True
ElseIf Entradas = "00110" Then
REPARTIDOR.Enabled = True
ElseIf Entradas = "00111" Then
LED2(3).Visible = True
LED1(3).Visible = False
ElseIf Entradas = "01000" Then
LED2(3).Visible = False
LED1(3).Visible = True
ElseIf Entradas = "01001" Then
LED2(4).Visible = True
LED1(4).Visible = False
ElseIf Entradas = "01010" Then
LED2(4).Visible = False
LED1(4).Visible = True
ElseIf Entradas = "01011" Then

219
Anexos1 Rutinas Programadas

LED2(5).Visible = True
LED1(5).Visible = False
ElseIf Entradas = "01100" Then
LED2(5).Visible = False
LED1(5).Visible = True
ElseIf Entradas = "01101" Then
LED2(6).Visible = True
LED1(6).Visible = False
ElseIf Entradas = "01110" Then
LED2(6).Visible = False
LED1(6).Visible = True
ElseIf Entradas = "01111" Then
Form2.ON = True
ElseIf Entradas = "10001" Then
LED2(7).Visible = True
LED1(7).Visible = False
ElseIf Entradas = "10010" Then
LED2(7).Visible = False
LED1(7).Visible = True
ElseIf Entradas = "10011" Then
LED2(8).Visible = True
LED1(8).Visible = False
ElseIf Entradas = "11001" Then
LED2(8).Visible = False
LED1(8).Visible = True
ElseIf Entradas = "10111" Then
LED2(9).Visible = True
LED1(9).Visible = False
ElseIf Entradas = "11000" Then
LED2(9).Visible = False
LED1(9).Visible = True
ElseIf Entradas = "11010" Then
LED2(10).Visible = True
LED1(10).Visible = False
ElseIf Entradas = "11011" Then
LED2(10).Visible = False
LED1(10).Visible = True
ElseIf Entradas = "11100" Then
If Text4 > 50 Then
SD2 = 100
Else
SD2 = 0
End If
End If
LECTOR.Enabled = False
End Sub

Private Sub FALLO()


If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If

220
Anexos1 Rutinas Programadas

If GetPortBit(&H378, 3) = False Then


SetPortBit &H378, 3
End If
If GetPortBit(&H378, 4) = False Then
SetPortBit &H378, 4
End If
If GetPortBit(&H378, 5) = False Then
SetPortBit &H378, 5
End If
Form2.Timer5.Enabled = True
End Sub

Private Sub MRegIO_Click()


Frame1.Visible = True
End Sub
Private Sub Option1_Click()
IO = True
Text7 = ""
Text8 = ""
VISUALBITS = ""
VISUALTAGS = ""
For i = 1 To 32
VISUALBITS = VISUALBITS & MATRIZBITS(i) + Chr(13) + Chr(10)
VISUALTAGS = VISUALTAGS & MATRIZTAGS(i) + Chr(13) + Chr(10)
Next
End Sub

Private Sub Option2_Click()


IO = False
Text7 = ""
Text8 = ""
VISUALBITS = ""
VISUALTAGS = ""
For i = 1 To 16
VISUALBITS = VISUALBITS & MATRIZBITSSALIDAS(i) + Chr(13) +
Chr(10)
VISUALTAGS = VISUALTAGS & MATRIZTAGSSALIDAS(i) + Chr(13) +
Chr(10)
Next
End Sub

Private Sub PUESTAACERO_Timer()


If GetPortBit(&H378, 0) = True Then
NotPortBit &H378, 0
End If
If GetPortBit(&H378, 1) = True Then
NotPortBit &H378, 1
End If
If GetPortBit(&H378, 2) = True Then
NotPortBit &H378, 2
End If
If GetPortBit(&H378, 3) = True Then
NotPortBit &H378, 3
End If

221
Anexos1 Rutinas Programadas

If GetPortBit(&H378, 4) = True Then


NotPortBit &H378, 4
End If
PUESTAACERO.Enabled = False
End Sub

Private Sub RegIN_Click()


Frame1.Visible = True
Frame4.Visible = True
End Sub
Private Sub REPARTIDOR_Timer()
If Text5 = "00101" Then
Call sumardisplay
ElseIf Text5 = "00110" Then
Call restardisplay
End If
REPARTIDOR.Enabled = False
End Sub

Private Sub salir_Click()


DatosIO.Hide
End Sub

Private Sub text1_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub text1_change()


Text3 = Text3 & Text1 + Chr(13) + Chr(10)
End Sub

Private Sub text2_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub
Private Sub Text4_Change()
If Text4 > 1 Then
LED2(2).Visible = True
LED1(2).Visible = False
Else
LED2(2).Visible = False
LED1(2).Visible = True
End If
End Sub

Private Sub text5_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then

222
Anexos1 Rutinas Programadas

KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub text6_KeyPress(KeyAscii As Integer)


If Not IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
Else
KeyAscii = 0
End If
End Sub

Private Sub TEXT6_CHANGE()


ComponentesActivos.Enabled = True
End Sub
Private Sub Text7_Change()
If Text7 = "AGITADORM" Then
Text3 = "Marcha motor agitador del reactor"
ElseIf Text7 = "AGITADORP" Then
Text3 = "Paro motor agitador del reactor"
ElseIf Text7 = "CIRCUITOM" Then
Text3 = "Marcha motor circuito del reactor"
ElseIf Text7 = "CIRCUITOP" Then
Text3 = "Paro motor circuito del reactor"
ElseIf Text7 = "REGULADORA1" Then
Text3 = "1% de apertura válvula reguladora refrigeración"
ElseIf Text7 = "REGULADORA2" Then
Text3 = "1% de cierre válvula reguladora refrigeración"
ElseIf Text7 = "VACIADOM" Then
Text3 = "Marcha motor vaciado reactor"
End If
End Sub
Private Sub Timer1_Timer()
If SD2 = 100 Then
Exit Sub
End If
If SevenSegment2.DisplayNumber = 9 Then
If SevenSegment3.DisplayNumber = 9 Then
SevenSegment3.DisplayNumber = 0
SevenSegment2.DisplayNumber = 0
SevenSegment4.DisplayNumber = 1
End If
End If
SD = SD + 1
If SD < 10 Then
Else
SD = 0
SD1 = SD1 + 1
End If
SD2 = SD2 + 1
SevenSegment3.DisplayNumber = SD
If SD1 > 9 Then

223
Anexos1 Rutinas Programadas

SD1 = 9
Else
SevenSegment2.DisplayNumber = SD1
End If
Text4 = SD2
ProgressBar2.Value = SD2
End Sub
Private Sub Timer2_Timer()
If IO = True Then
If busc = False Then
buscar = VISUALBITS.SelText
Text8 = buscar
For i = 1 To 32
If buscar = MATRIZBITS(i) Then
Text7 = MATRIZTAGS(i)
GoTo B1
End If
Next
B1:
Else
buscar2 = VISUALTAGS.SelText
Text7 = buscar2
For i = 1 To 32
If buscar2 = MATRIZTAGS(i) Then
Text8 = MATRIZBITS(i)
GoTo B2
End If
Next
B2:
End If
Else
If busc = False Then
buscar = VISUALBITS.SelText
Text8 = buscar
For i = 1 To 32
If buscar = MATRIZBITSSALIDAS(i) Then
Text7 = MATRIZTAGSSALIDAS(i)
GoTo B3
End If
Next
B3:
Else
buscar2 = VISUALTAGS.SelText
Text7 = buscar2
For i = 1 To 32
If buscar2 = MATRIZTAGSSALIDAS(i) Then
Text8 = MATRIZBITSSALIDAS(i)
GoTo B4
End If
Next
B4:
End If
End If
Timer2.Enabled = False

224
Anexos1 Rutinas Programadas

End Sub
Private Sub Timer4_Timer()
If GetPortBit(&H379, 3) = False Then
MsgBox "Entrada S3 correcta"
End If
End Sub
Private Sub VISUALBITS_click()
Timer2.Enabled = True
busc = False
End Sub
Private Sub VISUALTAGS_click()
Timer2.Enabled = True
busc = True
End Sub
Private Sub sumardisplay()
Dim x, y, z As Integer
If SD2 = 100 Then
Exit Sub
End If
SD2 = SD2 + 1
If SD2 > 0 Then
If SD2 < 100 Then
Text4 = SD2
Picture3(0).Visible = True
z = SD2 Mod 10
For i = 0 To 9
If i = z Then
Picture1(i).Visible = True
Else
Picture1(i).Visible = False
End If
Next
y = (SD2 / 10) - z / 10
Text9 = y
For i = 0 To 9
If i = Text9 Then
Picture2(i).Visible = True
Else
Picture2(i).Visible = False
If i = y Then
Picture2(y).Visible = True
End If
End If
Next
ElseIf SD2 > 99 Then
For i = 1 To 9
Picture1(i).Visible = False
Picture2(i).Visible = False
Next
Picture3(1).Visible = True
Picture3(0).Visible = False
Picture1(0).Visible = True
Picture2(0).Visible = True
Text4 = 100

225
Anexos1 Rutinas Programadas

SD2 = 100
End If
Else
Picture3(0).Visible = True
Picture1(0).Visible = True
Picture2(0).Visible = True
Text4 = SD2
End If
ProgressBar2.Value = SD2
Label18 = " Abriendo válvula %"
End Sub
Private Sub restardisplay()
Dim x, y, z As Integer
If SD2 = 0 Then
Exit Sub
End If
If SD2 > 0 Then
SD2 = SD2 - 1
If SD2 < 100 Then
Text4 = SD2
Picture3(0).Visible = True
z = SD2 Mod 10
For i = 0 To 9
If i = z Then
Picture1(i).Visible = True
Else
Picture1(i).Visible = False
End If
Next
y = (SD2 / 10) - z / 10
Text9 = y
For i = 0 To 9
If i = Text9 Then
Picture2(i).Visible = True
Else
Picture2(i).Visible = False
If i = y Then
Picture2(y).Visible = True
End If
End If
Next
Else
For i = 1 To 9
Picture1(i).Visible = False
Picture2(i).Visible = False
Next
Picture3(1).Visible = True
Picture3(0).Visible = False
Picture1(0).Visible = True
Picture2(0).Visible = True
End If
Else
For i = 1 To 9
Picture1(i).Visible = False

226
Anexos1 Rutinas Programadas

Picture2(i).Visible = False
Next
Picture3(0).Visible = True
Picture3(1).Visible = False
Picture1(0).Visible = True
Picture2(0).Visible = True
Text4 = SD2
End If
ProgressBar2.Value = SD2
Label18 = " Cerrando válvula %"
End Sub
Private Sub TEXT3_DblClick()
Text3 = ""
EndSub

227
Anexo 2: Planos

8. Anexo2: Planos
8.1. Planos Circuito Interface.
8.1.1. Esquema Eléctrico.

- 228 -
Anexo 2: Planos

8.1.2. Fotolito Circuito Interface.

- 229 -
Anexo 2: Planos

8.1.3. Esquema componentes.

- 230 -
Anexo 2: Planos

8.2. Planos Estación Remota.


8.2.1. Esquema Eléctrico.

- 231 -
Anexo 2: Planos

8.2.2. Fotolito Circuito Estación Remota.

- 232 -
Anexo 2: Planos

8.2.3. Esquema componentes

- 233 -
Anexo 2: Planos

8.3. Planos Circuito Contador.


8.3.1. Esquema eléctrico.

- 234 -
Anexo 2: Planos

8.3.2. Fotolito Circuito Contador.

- 235 -
Links Datasheets.

8.3.3. Esquema Componentes.

- 236 -

También podría gustarte