Tanques Industriales

130
DESARROLLO DE PROGRAMAS DE SUPERVISIÓN Y CONTROL APLICADOS A LA AUTOMATIZACIÓN DE LIMPIEZA DE TANQUES INDUSTRIALES Autor: Jorge Guardia Guillén

Transcript of Tanques Industriales

Page 1: Tanques Industriales

DESARROLLO DE PROGRAMAS DE SUPERVISIÓN Y CONTROL APLICADOS A LA AUTOMATIZACIÓN DE LIMPIEZA

DE TANQUES INDUSTRIALES

Autor: Jorge Guardia Guillén

Page 2: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 2 de 130

DESARROLLO DE PROGRAMAS DE SUPERVISIÓN Y

CONTROL APLICADOS A LA AUTOMATIZACIÓN DE

LIMPIEZA DE TANQUES INDUSTRIALES

EDITA: CSI–F ENSEÑANZA

SEVILLA Autor: Jorge Guardia Guillén

Page 3: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 3 de 130

© Jorge Guardia Guillén

e–mail: [email protected]

Diseño de portada e imágenes: Jorge Guardia Guillén. Todas las imágenes que aparecen en esta obra han sido elaboradas por el autor o son de dominio público.

EDITA: CSI–F Enseñanza Sevilla.

Impreso en España – Printed in Spain

ISBN: 978-84-692-9663-9

Depósito Legal: SE 2798-2010

Reservados todos los derechos. Queda rigurosamente prohibida, sin la autorización escrita del autor, la reproducción total o parcial de esta obra por cualquier medio o procedimiento, bajo las sanciones establecidas en las leyes, incluidos la reprografía y el tratamiento informático.

Page 4: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 4 de 130

1 OBJETIVOS ______________________________________________________________________ 5

2 TECNOLOGÍAS INTEGRADAS______________________________________________________ 6

2.1 Sistema de Control _____________________________________________________________ 6 2.1.1 CPU______________________________________________________________________ 6 2.1.2 Sistema de Entradas y Salidas__________________________________________________ 7 2.1.3 Interfaz de Comunicación - Programación ________________________________________ 8 2.1.4 Lenguajes de programación y la norma IEC 1131-3_________________________________ 8

2.2 Sistema SCADA ______________________________________________________________ 11 2.2.1 Programas secuenciales, interactivos y orientados a eventos _________________________ 13

3 DESCRIPCIÓN DE LA INSTALACIÓN Y MODOS DE FUNCIONAMIENTO_______________ 14

4 ELECCIÓN DE SOLUCIONES _____________________________________________________ 15

4.1 Sistema de Control ____________________________________________________________ 15 4.1.1 Autómata _________________________________________________________________ 15 4.1.2 Lenguaje de Programación. Software utilizado____________________________________ 19 4.1.3 Configuración Hardware _____________________________________________________ 20

4.2 Sistema SCADA ______________________________________________________________ 20 4.2.1 Software de programación ___________________________________________________ 20 4.2.2 Comunicación SCADA ⇔ Sistema de control ____________________________________ 22 4.2.3 Estructura del programa SCADA ______________________________________________ 24

5 PROGRAMAS DE CONTROL_______________________________________________________ 26

6 PROGRAMA DE PLC _____________________________________________________________ 27

6.1 Estructura de Bloques del Programa de PLC ______________________________________ 27

6.2 Funcionamiento de los Distintos Módulos._________________________________________ 28 6.2.1 FC104 Activación Bits Forzados. ______________________________________________ 28 6.2.2 FC101 Bits de Configuración _________________________________________________ 28 6.2.3 FC3 Organización del Programa _______________________________________________ 28 6.2.4 FC12 Reset Valores Receta y Variables Programa _________________________________ 29 6.2.5 FC5 Tipo de Paso Actual ____________________________________________________ 30 6.2.6 FC2 Seguridades Inicio Receta ________________________________________________ 30 6.2.7 FC6 Cálculo de Cambio de Paso_______________________________________________ 31 6.2.8 FC1 Preparación Solución Limpieza____________________________________________ 32 6.2.9 FC7 Envío Solución Limpieza ________________________________________________ 33 6.2.9 FC8 Recirculación__________________________________________________________ 34 6.2.10 FC9 Vaciado _____________________________________________________________ 34 6.2.11 FC10 Activación Salidas____________________________________________________ 34 6.2.12 FC50 Cálculo de Defectos___________________________________________________ 34 6.2.13 FC4 Datos Cabecera DB100 _________________________________________________ 35 6.2.14 FC11 Datos Entradas Salidas PLC ⇔ SCADA __________________________________ 35

6.3 Tabla de Entradas, Salidas, Marcas y Temporizadores ______________________________ 36

7 Código Programa PLC _____________________________________________________________ 42

8 Código Programa SCADA __________________________________________________________ 85

9 Formularios Desarrollados_________________________________________________________ 128

Bibliografía ______________________________________________________________________ 130

Page 5: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 5 de 130

1 OBJETIVOS Los objetivos que se persiguen en el presente documento son:

� Automatizar el proceso de limpieza de una instalación industrial de productos alimentarios. Para ello, se parte de un cuaderno de especificaciones del cliente.

� Resolver la aplicación con productos existentes en el mercado de la automatización.

Dichos equipos deberán cumplir las especificaciones de la instalación, ser robustos y ampliables. Disponer de un servicio técnico de asistencia y post-venta, sin olvidar el apartado de precios y repuestos.

� Programar los distintos equipos seleccionados.

La arquitectura consiste en un PC en el cual se ejecuta un programa SCADA que supervisa, controla y modifica las recetas del sistema de control. El sistema de control se encarga de controlar y gestionar los distintos elementos de campo como bombas, electroválvulas, sensores,...

PC programación

Sistema de control PLC PC con SCADA

Elementos de campo

Figura 1

Page 6: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 6 de 130

2 TECNOLOGÍAS INTEGRADAS

2.1 Sistema de Control Actualmente en la industria, el sistema de control más empleado es el autómata programable o PLC, siglas de Program Logic Control (Controlador lógico programable). Puede definirse como un equipo electrónico programable diseñado para controlar, en tiempo real y en ambiente industrial, procesos secuenciales.

Un autómata programable se puede considerar como un sistema basado en un microprocesador, siendo sus partes fundamentales la Unidad Central de Proceso (CPU), la Memoria y el Sistema de Entradas y Salidas (E/S).

2.1.1 CPU La CPU realiza el control interno y externo del autómata y la interpretación de las instrucciones del programa. A partir de las instrucciones almacenadas en la memoria y de los datos que recibe de las entradas, genera las señales de las salidas. La memoria puede estar estructurada de la siguiente forma:

• Memoria del programa de usuario: aquí introduciremos el programa que el autómata va a

ejecutar cíclicamente.

• Memoria de la tabla de datos: se suele subdividir en zonas según el tipo de datos (como

marcas de memoria, temporizadores, contadores, etc.).

Memoria: - Sistema operativo - Memoria de E/S - Programa de usuario - Pilas - Variables internas Microprocesador Reloj

Fuente de alimentación

Registros y unidades de E/S

Acopladores E/S - Sensores - Actuadores

E/S serie - RS485 - RS232

Expansión E/S - E/S adicionales - E/S especiales

Expansión BUS - Red industrial

Figura 2

Page 7: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 7 de 130

• Memoria del sistema: aquí se encuentra el programa en código máquina que monitoriza

el sistema (programa del sistema o firmware). Este programa es ejecutado directamente

por el microprocesador / microcontrolador que posea el autómata.

• Memoria de almacenamiento: se trata de memoria externa que empleamos para

almacenar el programa de usuario, y en ciertos casos parte de la memoria de la tabla de

datos. Suele ser de uno de los siguientes tipos: EPROM, EEPROM, o FLASH1.

Sus funciones son:

• Vigilar que el tiempo de ejecución del programa de usuario no excede un determinado

tiempo máximo (tiempo de ciclo máximo). A esta función se le suele denominar

Watchdog (perro guardián).

• Ejecutar el programa de usuario.

• Crear una imagen de las entradas, ya que el programa de usuario no debe acceder

directamente a dichas entradas (para reducir el tiempo scan).

• Renovar el estado de las salidas en función de la imagen de las mismas obtenida al final

del ciclo de ejecución del programa de usuario (por el mismo motivo anterior).

• Chequeo del sistema.

2.1.2 Sistema de Entradas y Salidas El sistema de Entradas y Salidas recoge la información del proceso controlado (entradas) y envía las acciones de control del mismo (salidas). Los dispositivos de entrada pueden ser pulsadores, interruptores, finales de carrera, termostatos, presostatos, detectores de nivel, detectores de proximidad, contactos auxiliares de relés y contactores, etc. Por su parte, los dispositivos de salida son también muy variados: Pilotos indicadores, relés, contactores, arrancadores de motores, válvulas, etc. En general, las entradas y salidas (E/S) de un autómata pueden ser discretas, analógicas, numéricas o especiales. Las E/S discretas se caracterizan por presentar dos estados diferenciados: presencia o ausencia de tensión, relé abierto o cerrado, etc. Su estado se puede visualizar mediante indicadores tipo LED que se iluminan cuando hay señal en la entrada o cuando se activa la salida. Los niveles de tensión de las entradas más comunes son 24 V cc/ca, 48 V cc/ca y 220 V ca. Los dispositivos de salida más frecuentes son relés, transistores y triacs. Pueden ser a 24 Vcc/ca, 120 Vac y 220 Vac. 1 EPROM siglas de Erasable Programmable Read-Only Memory. Se borran mediante luz ultravioleta. EEPROM siglas de electrically-erasable programmable read-only memory. FLASH es una forma evolucionada de la memoria EEPROM. Funcionan a mayor velocidad.

Page 8: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 8 de 130

Las E/S analógicas tienen como función la conversión de una magnitud analógica (tensión o corriente) equivalente a una magnitud física (temperatura, presión, etc.) en una expresión binaria de 11, 12 o más bits, dependiendo de la precisión deseada. Esto se realiza mediante conversores analógico - digitales (DAC's). Las E/S numéricas permiten la adquisición o generación de información a nivel numérico, en códigos BCD, Gray u otros. La información numérica puede ser entrada mediante dispositivos electrónicos digitales apropiados. Por su parte, las salidas numéricas suministran información para ser utilizada en dispositivos visualizadores (de 7 segmentos) u otros equipos digitales. Por último, las E/S especiales se utilizan en procesos en los que con las anteriores E/S vistas son poco efectivas, bien porque es necesario un gran número de elementos adicionales, bien porque el programa necesita de muchas instrucciones. Entre las más importantes están:

� Entradas para termopar y termoresistencia: Para el control de temperaturas.

� Entradas rápidas (contadores para encoder por ejemplo)

� Salidas de trenes de impulso: Para el control de motores paso a paso.

� Entradas y salidas de regulación P+I+D (Proporcional + Integral + Derivativo):

Para procesos de regulación de alta precisión.

� Salidas ASCII: Para la comunicación con periféricos inteligentes (equipo de

programación, impresora, PC, etc.).

2.1.3 Interfaz de Comunicación - Programación Todo autómata, salvo casos excepcionales, posee la capacidad de poder comunicarse con otros dispositivos (como un PC, otros autómatas, pantallas de visualización, etc.). Lo normal es que posea una E/S serie del tipo RS-232 / RS-422. Hoy día este tipo de interfaz está evolucionado a Profibus2 o Ethernet. A través de esta línea se pueden manejar todas las características internas del autómata, incluida la programación del mismo, y suele emplearse para monitorización del proceso y para diagnostico de averías.

2.1.4 Lenguajes de programación y la norma IEC 1131-3

En la actualidad cada fabricante emplea su propio lenguaje de programación, lo que significa, que existe una gran variedad comparable con la cantidad de PLC’s que hay en el mercado.

2 Profibus (Process Field Bus) es un popular estándar de bus de campo. Se trata de una red abierta, estándar e independiente de cualquier fabricante

Page 9: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 9 de 130

Las formas que adopta el lenguaje de programación usado para realizar programas se denominan representación del lenguaje de programación.

Hasta el momento existen tres tipos de representaciones como las más difundidas en el ámbito mundial, las cuales cada fabricante las emplea para su programación, estas son:

- Lista de instrucciones (AWL)

- Plano de funciones y (FUP)

- Diagrama contactos o plano de contactos (LADDER)

Es obvio, que la gran diversidad de lenguajes de programación da lugar a que cada fabricante tenga su propia representación, originando cierta incomodidad al usuario cuando programa más de un tipo de PLC.

Con el objetivo de uniformizar estas representaciones, se ha establecido una norma internacional, IEC 1131-3, que se encarga de estandarizar los lenguajes de programación.

Esta norma contempla dos tipos de lenguajes de programación:

- Lenguajes Gráficos

- Lenguajes Textuales

� LENGUAJES GRÁFICOS Se denomina lenguaje gráfico a la representación basada en símbolos gráficos, de tal forma que según la disposición en que se encuentran cada uno de estos símbolos Y en conformidad a su sintaxis que lo gobierna, expresa una lógica de mando y control. Dentro de ellos tenemos:

� Carta de Funciones Secuénciales o Grafcet El Grafcet es una representación de análisis gráfico donde se establecen las funciones de un sistema secuencial. Este lenguaje consiste en una secuencia de etapas y transiciones, asociadas respectivamente con acciones y condiciones. Las etapas representan las acciones a realizar y las transiciones las condiciones que deben cumplirse para ir desarrollando acciones. La Etapa - Transición es un conjunto indisociable.

Suele casar bien con procesos continuos.

5

6

7

Etapa

Transición

Figura 3

Page 10: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 10 de 130

� Plano de Funciones

Es una representación gráfica orientada a las puertas lógicas AND, OR y sus combinaciones. Las funciones individuales se representan con un símbolo, donde su lado izquierdo se ubica las entradas y en el derecho las salidas. Los símbolos usados son iguales o semejantes a los que se utilizan en los esquemas de bloques en electrónica digital.

� Diagrama de Contactos o lenguaje LADDER El LADDER, también denominado lenguaje de contactos o en escalera, es un lenguaje de programación gráfico muy popular dentro de los autómatas programables debido a que está basado en los esquemas eléctricos de control clásicos. De este modo, con los conocimientos que todo técnico eléctrico posee, es muy fácil adaptarse a la programación en este tipo de lenguaje.

� LENGUAJES TEXTUALES

Este tipo de lenguaje se refiere básicamente al conjunto de instrucciones compuesto de letras, códigos y números de acuerdo a una sintaxis establecida.

Se considera un lenguaje de menor nivel que los gráficos y por lo general se utilizan para programar pequeños PLC’s cuyos programas no son muy complejos, o para programar instrucciones no programables en modo gráfico (programación avanzada a muy bajo nivel).

Figura 4

Figura 5

Page 11: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 11 de 130

Existen dos lenguajes diferentes en nivel y tipo de aplicación, ellos son

� Lista de Instrucciones

Son instrucciones del tipo Booleanas, utilizando para su representación letras y números.

Dado que se usan abreviaturas nemotécnicas, no se requiere gran memoria para tareas de automatización.

En este tipo de representación es donde puede sacarse el máximo partido a la programación del PLC. Puesto que es la que tiene el mayor juego de instrucciones de programación además de permitir el acceso a todos los elementos del autómata.

La desventaja radica la dificultad en su confección y sobre todo para la localización de errores y averías.

� Texto Estructurado

Es un lenguaje del tipo booleano de alto nivel y estructurado, incluye las típicas sentencias de selección (IF-THEN-ELSE) y de interacción (FOR, WHILE Y REPEAT), además de otras funciones específicas para aplicaciones de control.

Su uso es ideal para aplicaciones en las que se requiere realizar cálculos matemáticos, comparaciones, emular protocolos, etc.

2.2 Sistema SCADA SCADA, acrónimo de Supervisory Control And Data Adquisition (en español, Control supervisor y adquisición de datos). 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.

Figura 6

Page 12: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 12 de 130

Comprende todas aquellas soluciones de aplicación para referirse a la captura de información de un proceso o planta industrial, con esta información es posible realizar una serie de análisis o estudios con los que se pueden obtener valiosos indicadores que permitan una retroalimentación sobre un operador o sobre el propio proceso, tales como:

� Estado actual del proceso. Valores instantáneos

� Desviación o deriva del proceso. Evolución histórica y acumulada

� Generación de alarmas

� HMI Human Machine Interface (Interfaz hombre-máquina)

� Toma de decisiones:

o Mediante acción humana

o Automática (mediante la utilización de sistemas basados en el conocimiento o

sistemas expertos

� Ejecutar acciones de control iniciadas por el operador, tales como: abrir o cerrar

válvulas, arrancar o parar bombas, etc.

� Monitorizar procesos químicos, físicos o de transporte en sistemas de suministro de

agua, para controlar la generación y distribución de energía eléctrica y otros procesos

de distribución.

� Gestión de la producción (facilita la programación de la fabricación)

� Mantenimiento (proporciona magnitudes de interés para evaluar y determinar modos

de fallo, índices de fiabilidad, entre otros)

� Control de Calidad (proporciona de manera automatizada los datos necesarios para

calcular índices de estabilidad de la producción, tolerancias, etc.

� Administración. Actualmente pueden enlazarse estos datos del SCADA con un

servidor ERP (Enterprise Resource Planning o sistema de planificación de recursos

empresariales), e integrarse como un módulo más

� Tratamiento histórico de información (mediante su incorporación en bases de datos)

Existen en el mercado múltiples fabricantes que ofrecen software para la implementación de sistemas SCADA. Por ejemplo, Siemens con Wincc, Allen Bradley con RSView32, OMRON con CX-Supervisor, etc. Dichos programas tienen un elevado precio (llevan asociada una licencia hardware o software) y requieren de un aprendizaje del entorno de programación y desarrollo. No obstante, aportan muchas ventajas en cuanto a la generación y configuración de las pantallas (imágenes, botones, válvulas, etc.), manejo, manipulación y actualización de variables.

Page 13: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 13 de 130

Son sistemas abiertos, es decir, el cliente final, normalmente, dispone del programa fuente con lo cual puede él mismo u otro integrador modificar la aplicación. La aplicación SCADA corre normalmente en un PC (preferiblemente de tipo industrial), el cual intercambia información con el sistema de control y muestra los datos a través de diversas pantallas. El tipo de conexión física, así como la topología y el protocolo de comunicación dependerán del PLC en cuestión (MPI, Profibus, Ethernet, ...). Según la complejidad, tamaño de la instalación o requerimientos en el tratamiento y almacenamiento de la información puede ser necesario la conexión con otros PC’s. Dichos equipos actúan como clientes del PC servidor el cual les suministra los datos para la visualización y/o modificación. Entre estos equipos lo habitual es que estén conectados a través de una red Ethernet. En cuanto a los lenguajes de programación, dependerá del paquete de software del fabricante. Está muy extendidos el uso de lenguaje C, C++, Visual Basic, o específicos de cada fabricante que normalmente siguen ciertas normas de los lenguajes mencionados anteriormente.

2.2.1 Programas secuenciales, interactivos y orientados a eventos Existen distintos tipos de programas. En los primeros tiempos de los ordenadores los programas eran de tipo secuencial (también llamados tipo batch) Un programa secuencial es un programa que se arranca, lee los datos que necesita, realiza los cálculos e imprime o guarda en el disco los resultados. Mientras un programa secuencial está ejecutándose no necesita ninguna intervención del usuario. A este tipo de programas se les llama también programas basados u orientados a procedimientos o a algoritmos (procedural languages). Este tipo de programas siguen utilizándose en la actualidad, pero la difusión de los PC’s ha puesto de actualidad otros tipos de programación. Los programas interactivos exigen la intervención del usuario en tiempo de ejecución, bien para suministrar datos, bien para indicar al programa lo que debe hacer por medio de menús. Los programas interactivos limitan y orientan la acción del usuario. Un ejemplo de programa interactivo podría ser Matlab. Por su parte los programas orientados a eventos son los programas típicos de Windows, tales como Word y PowerPoint. Cuando uno de estos programas ha arrancado, lo único que hace es quedarse a la espera de las acciones del usuario, que en este caso son llamadas eventos. El usuario dice si quiere abrir y modificar un fichero existente, o bien comenzar a crear un fichero desde el principio. Estos programas pasan la mayor parte de su tiempo esperando las acciones del usuario (eventos) y respondiendo a ellas. Las acciones que el usuario puede realizar en un momento determinado son variadísimas, y exigen un tipo especial de programación: la programación orientada a eventos. Este tipo de programación es sensiblemente más complicada que la secuencial y la interactiva.

Page 14: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 14 de 130

Figura 7

3 DESCRIPCIÓN DE LA INSTALACIÓN Y MODOS DE FUNCIONAMIENTO La instalación consta de un total de seis depósitos en los cuales se realizan operaciones de fermentación y guarda de una fábrica de cerveza. Tras cada cocimiento es necesario realizar una limpieza y desinfección de los tanques. Dicho proceso se realizaba de forma manual. Este procedimiento presentaba grandes inconvenientes:

� Falta de limpieza en paredes y fondo de los depósitos � Los análisis microbiológicos indicaban presencia de organismos aerobios y anaerobios en

fermentación. � Elevado consumo de agua � Se trata de un proceso manual que requiere al menos dos operarios.

Los objetivos de la automatización del proceso son:

� Asegurar la limpieza y desinfección. Conseguir una perfecta situación microbiológica � Reducir el consumo de agua. Para ello usar la cantidad mínima necesaria de detergentes y

desinfectantes � Que el proceso sea totalmente autónomo

El método de limpieza se denomina CIP (Cleaning In Place – Limpieza ‘In Situ’). Es el más ecológico y económico, puesto que consume menos agua y menos detergentes. El esquema de la instalación se indica en el siguiente gráfico.

Page 15: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 15 de 130

La filosofía de trabajo es la siguiente:

1. Preparar las soluciones (agua, agua + ácido, agua, agua + sosa,...) en el tanque de

preparación

2. Enviar al tanque destino

3. Recircular un tiempo determinado

4. Tirar la solución

Un ejemplo real de receta sería:

1. Enjuague con 2500 l de agua y 5 minuto de recirculación

2. Enjuague con 2500 l de agua y 5 minuto de recirculación

3. Disolución de 2500 l de agua y 25 l de ácido durante 35 minutos de recirculación

4. Enjuague con 2500 l de agua y 5 minuto de recirculación

5. Enjuague con 2500 l de agua y 5 minuto de recirculación

6. Disolución de 2500 l de agua y 140 ml de desinfectante durante 10 minutos de

recirculación

La automatización de esta receta, conlleva no sólo la exactitud en las cantidades sino la posibilidad de optimizar el proceso mediante pruebas y análisis de los resultados obtenidos. 4 ELECCIÓN DE SOLUCIONES

4.1 Sistema de Control

4.1.1 Autómata El PLC seleccionado es de la firma Siemens modelo SIMATIC S7-300. Las razones que han llevado a su elección son: • Configuración modular y rápida expansión posibles a través de módulos de interfaz con un

bus plano integrado en la parte posterior.

• Amplitud modular a través de módulos digitales, analógicos, simulación y módulos de

función que permiten la comunicación con otros tipos de módulos.

• Funciones integradas: contadores, posicionadores, control de lazo cerrado, y medición de

frecuencia en las CPU’s 312/314 IFM.

Page 16: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 16 de 130

• Interfaz PROFIBUS integrado en las series 300 2-DP. La CPU puede utilizarse también

como esclavo de la red.

• Procesamiento de grandes fórmulas matemáticas.

• Memoria de Programa de hasta 85 K en instrucciones

• Hasta 1.024 entradas /salidas

• Interfaz Multipunto para configurar pequeñas redes con la ayuda de un PC/PG.

• Rápido tiempo de ejecución que permite a la CPU ejecutar hasta 1024 instrucciones binarias

en 0.1 ms.

• Configuración / Programación rápida y sencilla con ayuda del software STEP 7.

• Amplias posibilidades de diagnóstico con ayuda de STEP 7. Buffer de mensajes de error con

fecha y hora, además de ayuda de diagnosis de módulos en la búsqueda de errores por parte

del usuario.

Dentro de la familia S7-300 hemos seleccionado el modelo S7-315-2DP cuyas características técnicas indicamos a continuación: Tensión de alimentación 24 Vdc Consumo de corriente - Corriente de conexión, tipo - I²t - Potencia de pérdida, tipo

2,5 A 0,5 A²s 2,5 W

Memoria / Respaldo - Memoria de trabajo •integrada •ampliable - Memoria de carga •enchufable (MMC)

128 Kbytes No 8 Mbytes

Respaldo Con batería o MMC CPU / Bloques DB (Bloques de datos globales) - Cantidad - Capacidad

1.024 16 Kbytes

FB (Bloques de función) - Cantidad - Capacidad

2.048 16 Kbytes

FC (Funciones) - Cantidad - Capacidad

2.048 16 Kbytes

OB (Bloques de organización) - Capacidad

16 Kbytes

Profundidad de anidamiento - Según prioridad - Adicionales dentro de un OB de error

8 4

Tiempos de ejecución - Para operaciones de bits - Para operaciones de palabras

0,1 μs 0,2 μs

Page 17: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 17 de 130

- Para aritmética en coma fija - Para aritmética en coma flotante

2 μs 3 μs

Área de datos Contadores S7 - Cantidad •de ellos, remanente sin batería -ajustable •remanencia -ajustable •Margen de computo -ajustable

256 Si Si Si

Contador IEC - Disponible - Tipo

Si SFB

Temporizadores S7 - Cantidad •Remanencia -ajustable -preajustado •Margen de tiempo -Límite inferior -Límite superior

256 Si sin remanencia 10 ms 9.990 s

Temporizador IEC - Disponible - Tipo

Si SFB

Área de datos Marcas - Cantidad - Remanencia ajustable - Cantidad de marcas de ciclo

2.048 bytes Si; MB0 a MB2047 8; 1 byte de marcas

Bloques de datos - Cantidad - Capacidad

1.023; de DB1 a DB102316 Kbytes

Datos locales - según prioridad

128 bytes

Área de direccionamiento Area de direccionamiento de periferia - Entradas - Salidas

2 Kbytes 2 Kbytes

Imagen de proceso - Entradas - Salidas

128 bytes 128 bytes

Canales digitales - Entradas - Salidas

16.384 16.384

Canales analógicos - Entradas - Salidas

1.024 1.024

Hardware - Bastidores - Módulos por bastidor

4 8

Cantidad de maestros DP - integrados -a través de CP

1 4

Reloj hardware (tiempo real) Respaldo / sincronizado

Si Si

Funciones de comunicación - Funciones de comunicación PG / OP - Routing

Si Si

Page 18: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 18 de 130

Comunicación de datos globales - admitida - capacidad del paquete GD

Si 22 bytes

Comunicación básica S7 Si Primera interfaz - Tipo - Física - Separación galvánica - Alimentación de la interfaz

Interfaz RS485 integradaRS485 No 200 mA

Funcionalidad - MPI - Maestro DP - Esclavo DP - Acoplamiento punto a punto

Si No No No

MPI - Cantidad de enlaces - Servicios • Funciones de comunicación PG / OP • Routing • Comunicación de datos globales • Comunicación básica S7 • Comunicación S7 • Velocidad de transmisión

16 Si Si Si Si Si 187,5 Kbits/s

Segunda interfaz - Tipo - Física - Separación galvánica - Alimentación de la interfaz

Integrada RS485 RS485 Si 200 mA

Funcionalidad - MPI - Maestro DP - Esclavo DP - Acoplamiento punto a punto

No Si Si No

Maestro DP - Cantidad de enlaces - Servicios • Funciones de comunicación PG / OP • Routing • Admisión de equidistancia • SYNC / FREEZE • DPV1 • Velocidad de transmisión • Cantidad de esclavos DP • Campo de la dirección .- Entradas .- Salidas

16 Si Si Si Si Si Si 12 Mbits/s 124 244 Kbytes 244 Kbytes

Esclavo DP - Cantidad de enlaces - Servicios • Funciones de comunicación PG / OP • Routing • Comunicación directa • DPV1 • Velocidad de transmisión • Memoria intermedia .- Entradas .- Salidas

16 Si Si Si No 12 Mbits/s 244 bytes 244 bytes

CPU / Programación Lenguaje de programación

Page 19: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 19 de 130

- STEP 7 - KOP - FUP - AWL - SCL - CFC - GRAPH - HiGraph®

Si Si Si Si Si No Si Si

Dimensiones y pesos - Peso - Anchura - Altura - Profundidad

290 g 40 mm 125 mm 130 mm

4.1.2 Lenguaje de Programación. Software utilizado Durante la mayor parte del programa, se ha seguido la programación en lenguaje de contactos (LADDER), por la facilidad que presenta su interpretación. No obstante, en algunos casos ha sido necesario recurrir a programación en AWL, puesto que sólo en este tipo es posible programar estructuras más complejas. El software de programación utilizado es STEP 7 de Siemens. Con dicho programa, es posible programar cualquier CPU de las series 300 y 400 de Siemens. El formato de representación KOP sigue los principios del lenguaje ”Esquema de contactos” (en inglés Ladder Logic) fijados en la norma DIN EN-61131-3 (int. IEC 1131-3). En STEP 7 se utiliza la programación estructurada en bloques. Así tenemos:

- OB: Bloque de organización

- FB: Bloque de función

- FC: Función

- DB: Módulo de datos (se utiliza para almacenar datos)

El sistema operativo de la CPU del S7 ejecuta el OB 1 de forma cíclica: Una vez finalizada la ejecución del OB 1, el sistema operativo comienza a ejecutarlo de nuevo. La ejecución cíclica del OB 1 comienza una vez que el arranque ha finalizado. En el OB 1 es posible realizar la llamada a bloques de función (FB’s, SFB’s) o a funciones (FC’s, SFC’s). El OB 1 presenta la prioridad más baja de todos los OB’s sometidos a vigilancia en lo que respecta a su tiempo de ejecución. Con excepción del OB 90, todos los demás OB’s pueden interrumpir la ejecución del OB 1. Los eventos siguientes dan lugar a que el sistema operativo llame al OB 1:

• Final de la ejecución del arranque

• Final de la ejecución del OB 1 (durante el ciclo anterior).

Page 20: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 20 de 130

Una vez finalizada la ejecución del OB 1, el sistema operativo envía datos globales. Antes de arrancar de nuevo el OB 1, el sistema operativo escribe la imagen de proceso de las salidas en los módulos de salidas, actualiza la imagen de proceso de las entradas y recibe datos globales para la CPU. El software Step 7 ofrece una supervisión del tiempo de ciclo máximo garantizando el tiempo de reacción máximo. El valor del tiempo de ciclo máximo está preajustado a 150 ms. Puede modificarse la parametrización de este valor en la configuración hardware o con la función de sistema SFC 43 ”RE_TRIGR”, activar de nuevo la supervisión temporal en cualquier punto del programa. Si el programa sobrepasa el tiempo de ciclo máximo para el OB 1, el sistema operativo llama al OB 80 (OB de error de tiempo). Si no está programado el OB 80, la CPU pasa al estado operativo STOP. Además de la supervisión del tiempo de ciclo máximo, puede garantizarse el cumplimiento de un tiempo de ciclo mínimo. El sistema operativo retarda el comienzo de un nuevo ciclo (escritura de la imagen de proceso de las salidas en los módulos de salidas) hasta que se haya alcanzado el tiempo de ciclo mínimo. La diferencia entre una función (FC) y un bloque de función (FB) consiste en que a la llamada a un FB está asociado un bloque de datos (el DB de instancia), el cual almacena las variables locales del bloque conforme a la tabla de declaración de variables de ese bloque de función. En el caso de la función, los parámetros de llamada y las asignaciones de memoria local que se utilicen durante el procesamiento de la función utilizan memoria de la pila que se sobrescribirá en cuanto se llame a otro bloque.

4.1.3 Configuración Hardware

Descripción Tarjeta Referencia Fuente de alimentación PS 307 5A 6ES7307-1EA00-0AA0 CPU CPU 315-2DP 6ES7315-2AF03-0AB0 Tarjeta entradas digitales DI16xDC24V 6ES7321-1BH02-0AA0 Tarjeta salidas digitales DO16xDC24V/0,5 A 6ES7322-1BH01-0AA0 Tarjeta entradas / salidas analógicas AI4/AO2x8/8Bits 6ES7334-0CE01-0AA0

4.2 Sistema SCADA

4.2.1 Software de programación Como sistema de visualización y control se ha desarrollado una aplicación en Visual Basic 6.0 que cumple los objetivos fijados en el cuaderno de especificaciones del cliente. Veamos alguna de las ventajas que aporta este lenguaje de programación. Es un lenguaje de fácil aprendizaje pensado tanto para programadores principiantes como expertos, guiado por eventos, y centrado en un motor de formularios que facilita el rápido desarrollo de aplicaciones gráficas.

Page 21: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 21 de 130

En el caso de programadores expertos por la facilidad con la que se desarrollan aplicaciones complejas en muy poco tiempo (comparado por ejemplo con Visual C++). En el caso de programadores novatos por el hecho de ver de lo que son capaces a los pocos minutos de empezar a trabajar con él. Su principal innovación, que luego fue adoptada por otros lenguajes, fue el uso de un tipo de dll, llamado inicialmente vbx y posteriormente ocx, que permiten contener toda la funcionalidad de un control y facilitar su rápida incorporación a los formularios. Visual Basic es un lenguaje de programación visual, también llamado de 4ª generación. Esto quiere decir, que un gran número de tareas se realizan sin escribir código, simplemente con operaciones gráficas realizadas con el ratón sobre la pantalla. Visual Basic es un programa basado en objetos, aunque no orientado a objetos como C++ o Java. La diferencia está en que Visual Basic utiliza objetos con propiedades y métodos, pero carece de los mecanismos de herencia y polimorfismo propios de los verdaderos lenguajes orientados a objetos como Java y C++. � Ventajas

• Visual Basic es un lenguaje simple y por tanto fácil de aprender. • Su mayor facilidad radica en el diseño de formularios, mediante el arrastre de

controles. • Miles de Foros alrededor de la Web lo hacen el lenguaje con mayor cobertura que

cualquier otro. • La sintaxis es cercana al lenguaje humano. • Es un lenguaje RAD, centrado en conseguir en el menor tiempo posible los resultados

deseados • Permite el tratamiento de mensajes de Windows. • Gran parte del trabajo en el diseño de formularios está realizado, gracias a la gran

gama de controles incorporados junto al lenguaje que ahorran costes de tiempo de desarrollo.

• Soporta el uso de componentes COM y ActiveX. • Permite crear controles personalizados fácilmente del mismo modo que el diseño de

formularios. • Permite generar librerías dinámicas (DLL) ActiveX de forma nativa y Win32 (no

ActiveX, sin interfaz COM) mediante una reconfiguración de su enlazador en el proceso de compilación.

Page 22: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 22 de 130

� Inconvenientes

• Sólo existe un compilador e IDE, llamado igual que el lenguaje. • Sólo genera ejecutables para Windows. • No existe forma alguna de exportar el código a otras plataformas fuera de Windows

(al contrario que con los lenguajes .NET gracias al Proyecto Mono3). • Los ejecutables generados son relativamente lentos. • NO permite programación a bajo nivel ni incrustar secciones de código en ASM. • Sólo permite el uso de funciones de librerías dinámicas (DLL) stdcall. • Para que los ejecutables que genera funcionen necesita una DLL llamada

MSVBVMxy.DLL: MicroSoft Visual Basic Virtual Machine x.y (versión). Provee todas las funciones y características implementadas en el lenguaje.

• NO soporta tratamiento de procesos como parte del lenguaje. • El tratamiento de errores que tiene mediante la orden on error no sigue los patrones

estructurados (que es mejorado en .NET con la orden try/catch). • NO incluye operadores a nivel de bits. • NO permite el manejo de memoria dinámica, punteros, etc. como parte del lenguaje. • NO avisa de ciertos errores o advertencias (se puede configurar el compilador para

generar ejecutables sin los controladores de desbordamiento de enteros o las comprobaciones de límites en matrices entre otros, dejando así más de la mano del programador la tarea de controlar dichos errores)

• El tratamiento de mensajes de Windows es básico e indirecto. • Los controles personalizados no mejoran la potencia de la API de Windows, y en

determinados casos acudir a ésta será el único modo de conseguir el control personalizado deseado.

4.2.2 Comunicación SCADA ⇔ Sistema de control Para establecer la comunicación entre el SCADA y el PLC, se ha optado por un paquete de software del fabricante Siemens, denominado PRODAVE S7 (Prozessdatenverkehr - Intercambio de datos de proceso). El software consiste en unas librerías de enlace dinámico (DLL) que pueden ser integradas en el programa SCADA (funciones que se llamarán desde Visual Basic). El tráfico de datos entre PC y PLC es establecido por PRODAVE S7 a través de la interfaz MPI del PLC. La interfaz MPI (Multi Point Interface – Interfaz Multi-Punto) consiste en un método descentralizado determinístico. Un token o testigo sirve como derecho de emisión a través de la red de comunicación. Además debe ser pasado en un tiempo establecido. Así se garantiza un tiempo máximo de circulación del token. Los datos característicos de dicho protocolo de comunicación son: 3 Mono es el nombre de un proyecto de código abierto impulsado por Novell para crear un grupo de herramientas libres, basadas en GNU / Linux y compatibles con .NET.

Page 23: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 23 de 130

- Velocidad: 187,5 kbit/s

- Número de estaciones: 127

- Longitud: 50 m (puede aumentarse utilizando repetidores)

- Método de acceso: Bus Token

- Soporte de transminsión: cable bifilar apantallado o fibra óptica

- Topología: .- Eléctrica: línea

.- Óptica: arbol, estrella, anillo

PRODAVE S7 permite no solo evaluar y monitorizar sino que también puede influenciar en el proceso a través de diferentes funciones integradas. PRODAVE consiste básicamente en dos partes:

o Driver para Windows 95/98/ME y windows NT/2000.

o Adaptador para lenguaje de alto nivel.

Permite operar con distintos PLC’s de la familia Siemens: S7-200, S7-300, S7-400, M7 y C7. La conexión puede llevarse a cabo mediante las siguientes tarjetas proporcionadas por el fabricante:

o CP 5611 PCI-CARD

o CP 5511 PCMCIA-CARD

o CP 5411 ISA-CARD

o MPI-ISA-CARD

o COM a traves de PC-ADAPTER

En nuestro caso, hemos optado por la comunicación a través del PC-ADAPTER. Dicha elección queda justificada por el menor precio y por la facilidad de conexión puesto que sólo requiere la existencia de un puerto serie en el PC.

Page 24: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 24 de 130

4.2.3 Estructura del programa SCADA � FUNCIONAMIENTO El programa tiene un comportamiento basado en eventos y unas tareas de ejecución periódica de refresco y escritura de variables en el PLC.

� Funcionamiento orientado a eventos: Existe una barra de herramientas con botones y menús cuya estructura y funcionamiento se indica a continuación: - Instalación: Aparece una lista despleglable con acceso a: - Pupitre: Una interfase que permite activar una seta de parada de

emergencia, el pulsador de marcha de la instalación e indicar el

tanque sobre el que se va a realizar la limpieza.

- Defectos: se accede a una pantalla en la cual visualizamos el registro de

defectos y avisos de la instalación con estampación de fecha y

hora. Es posible, actualizar y resetear.

- Usuarios: Algunas funciones del programa (p.ej. la creación de recetas) están restringidas mediante una lista de usuarios cuyo nivel de acceso permite distintas acciones. Desde este botón la lista de acciones posibles son: - Iniciar sesión

- Cerrar sesión

- Dar de alta a un nuevo usuario

- Dar de baja a un usuario

- Recetas: Esta pantalla es la encargada de diseñar un programa de limpieza de los tanques. No hay límite en el número de recetas a almacenar y la navegación entre ellas se consigue a través de dos flechas de desplazamiento. Asimismo, se almacena la fecha y el usuario que la creó o la modificó. Las acciones posibles son: - Editar

- Nueva

- Salvar

- Eliminar

- Cargar en PLC

Page 25: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 25 de 130

- Informes: Una vez terminada la ejecución de la receta es posible generar un informe que será exportado a un fichero excel con libre elección del nombre y la ubicación donde guardarlo. Los datos a reportar son: - Nombre de la receta

- Nº de tanque

- Nº de pasos

- Pasos de la receta con sus datos

- Registro de inicio, fin y duración de cada paso.

� Funcionamiento de las tareas periódicas:

Si se desea que una acción suceda con cierta periodicidad se puede utilizar un control Timer. Este control produce de modo automático un evento cada cierto número de milisegundos. La propiedad más importante de un objeto de este tipo es Interval, que determina, precisamente, el intervalo en milisegundos entre eventos consecutivos. La acción que se desea activar debe programarse en el evento Timer de ese mismo control. Si en algún momento se desea detener momentáneamente la acción periódica es suficiente con hacer False la propiedad Enabled del control Timer y para arrancarla de nuevo volver a hacer True esa propiedad. Haciendo 0 la propiedad Interval también se consigue inhabilitar el Timer. Existen tres temporizadores cuyo cometido se detalla a continuación:

o TimAbrirPLC: Este control se inicia al arrancar el programa y se encarga de establecer la comunicación con el PLC. Tiene un intervalo de ejecución de 200 ms y se controla el número de veces que se ejecuta si no tiene éxito la apertura de la comunicación.

o TimScanPLC: Este temporizador se encarga de leer (tarea de refresco) y de

activar (escritura de salidas) las señales al PLC. Al no tratarse de una aplicación crítica se ha fijado el intervalo en 200 ms.

o TimSleep: Si no se actúa sobre el PC (ratón ni teclado) el programa detiene la

comunicación con el PLC. Para ello este control se activa cada 60 s e incrementa un contador. Si se llega a 30 minutos el programa se desconecta del PLC. Este acción, no implica que se detenga una receta en el caso en que estuviese activa. Se dispone de un botón de comando para volver a conectar en el formulario principal.

Page 26: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 26 de 130

� Almacenamiento de datos: Para guardar los datos se ha creado una base de datos en Access cuyos datos son modificados desde la aplicación. Los datos que se almacenan son: - Lista de defectos: En esta tabla se encuentran los textos de las alarmas. Cada una lleva una clave que es la que activa el programa y busca el texto asociado. El orden indica también la prioridad de dicha alarma. - Defectos: Aquí se encuentran registrados los últimos defectos que se han producido. Desde el programa esta tabla se refresca al actualizar o resetear. - Recetas: Esta tabla guarda los nombres de las recetas, el usuario que la creó, la última modificación y la fecha de estos sucesos. - Pasos recetas: Esta tabla está vinculada con la anterior. Y se encuentran los datos propios de cada una (litros, tiempos, ...). 5 PROGRAMAS DE CONTROL En este apartado, desarrollaremos y justificaremos como se han realizado los programas de PLC, PC y la interfaz de comunicación entre ambos. El programa de PLC, se ha realizado con la herramienta de programación Step7. Prácticamente, en la totalidad del programa se ha seguido la programación en lenguaje de contactos (KOP) por su facilidad en la interpretación y depuración. El programa se encuentra estructurado, como veremos más adelante, en una serie de módulos que atienden una funcionalidad específica y distinta de las demás. Se ha procurado, ‘encapsular’ dichos módulos creando para ello una interfaz de entrada y salida. De modo que un cambio en la programación no implique reprogramar otro módulo sino adaptar la interfaz a lo sumo. Para el SCADA, hemos utilizado el software Visual Basic 6.0. Como ya hemos descrito en los puntos anteriores, dicho lenguaje de programación presenta múltiples ventajas. Fundamentalmente en lo que se refiere a la creación y programación de interfaz gráfica (formularios). También en este caso, se ha procurado que las funciones sean objetos cuya relación con otra funciones se establezca a través de su interfaz (parámetros de entrada y salida). Para salvar los datos se ha generado una base de datos en access cuya información es leída y modificada desde el programa de usuario. La interfaz de comunicación entre PC y PLC se ha resuelto con bloques de datos (DB’s). Se han creados dos bloques de datos, uno para las recetas de limpieza y otro para registrar entradas, salidas y variables de intercambio. Esta estrategia de agrupar los datos, tiene la ventaja de que la lectura y escritura de datos es mucho más rápida que si accediéramos a datos aislados.

Page 27: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 27 de 130

6 PROGRAMA DE PLC

6.1 Estructura de Bloques del Programa de PLC El programa del PLC consiste en un bucle que se repite indefinidamente. Dicho bucle principal consiste en el módulo OB1. Desde él se realizan las llamadas al resto de módulos, si las condiciones de ejecución así lo requieren. Existen otros módulos que son llamados desde el sistema operativo del PLC (firmware 4) y responden a eventos periódicos, alarmas o a la inicialización (re-arranque del programa). La estructura de llamadas que sigue el programa de autómata es la siguiente: OB1 � FC104. Activación Bits Forzados

� FC101. Bits de Configuración

� FC3. Organización del programa � FC12. Reset valores receta y variables programa

� FC5. Tipo de paso actual

� FC2. Seguridades inicio receta � FC6. Cálculo de cambio de paso � SFC1. Leer reloj CPU

� FC1. Preparación solución limpieza

� SFC40. Habilitar interrupción

� FC100. Convertir entero a tiempo S5

� SFC39. Deshabilitar interrupción

� FC6. Cambio de paso � SFC1. Leer reloj CPU

� FC7. Envío solución limpieza � FC6. Cambio de paso � SFC1. Leer reloj CPU

� FC8. Recirculación � FC100. Convertir entero a tiempo S5

� FC6. Cambio de paso � SFC1. Leer reloj CPU

� FC9. Vaciado � FC6. Cambio de paso � SFC1. Leer reloj CPU

� FC10. Activación salidas

� FC50. Cálculo de defectos

� FC4. Datos cabecera DB100 � SFC1. Leer reloj CPU

� FC11. Datos Entradas Salidas PLC=>SCADA

� SFC1. Leer reloj CPU

� FC150. Extrae Fecha (FC6 de siemens)

� FC151. Extrae hora (FC8 de siemens)

� FC40. Convierte TIME a S5TIME

4 Firmware o Programación en Firme, es un bloque de instrucciones de programa para propósitos específicos, grabado en una memoria tipo ROM, que establece la lógica de más bajo nivel que controla los circuitos electrónicos de un dispositivo. Al estar integrado en la electrónica del dispositivo es en parte hardware, pero también es software.

Page 28: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 28 de 130

� FC105. Desactivar bits (simulación funcionamiento)

OB35 Interrupción cíclica 5

OB82 Defectos entradas / salidas

OB100 OB Arranque Los campos sombreados indican módulos de Siemens cuyo código se encuentra protegido (Know-how Protect)

6.2 Funcionamiento de los Distintos Módulos.

6.2.1 FC104 Activación Bits Forzados. Este módulo persigue dos objetivos. Por un lado, a nivel de simulación, su programación consiste en devolver la confirmación en forma de entrada al activar una salida. Por ejemplo, al activarse la salida “A3.6 E.V. Entrada de agua en tanque de preparación” ponemos a uno la entrada “E6.0 Detector válvula de agua tanque de preparación abierta”. Con ello, es posible refrescar la monitorización en pantalla del proceso. La otra razón, es para evitar la aparición de alarmas. Ya que si tras un retardo no recibimos confirmación de una maniobra se señaliza el defecto y dependiendo de su importancia se podría detener la ejecución de la receta (válvulas, contactores, ...).

6.2.2 FC101 Bits de Configuración Este módulo sirve para configurar el valor de algunas constantes ya sean binarias, enteros, formato tiempo S5, etc. Por citar algunos, las marcas ‘M1.0 Bit siempre a uno’ es muy útil para puentear señales así como la marca ‘M1.1 Bit siempre a cero’ para anular temporalmente un segmento.

6.2.3 FC3 Organización del Programa Para que un programa funcione de forma estable y robusta es muy recomendable definir marcas que representen los distintos estados en que pueda encontrarse la instalación. Cada estado permitirá determinadas acciones bloqueando otras. Este bloque se encarga de definir los estados en que se puede encontrar la instalación. Por tanto, este módulo se ejecuta de forma incondicional todos los ciclos de scan. Las marcas programadas son:

o Parada emergencia: Implica la parada del programa, así como desactivar cualquier salida activa (bombas, electroválvulas, etc). Normalmente se activa con una seta de emergencia

Page 29: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 29 de 130

o desde algún bit del SCADA y su activación se corresponde con una situación de peligro para las personas o la instalación.

o Instalación en servicio: Memoria que registra que el operario mediante un pulsador pone

en servicio la instalación. Es incompatible con la marca anterior.

o Instalación en automático: Necesario para poder arrancar una receta de limpieza.

o Autorización movimientos automáticos: Estando en automático es necesario tener activa esta marca para que se activen las salidas.

o Autorización movimientos manuales: Incompatible con el anterior. Es el estado en que la

instalación permite manualmente desde el SCADA arrancar / parar bombas, electroválvulas, etc.

o Orden arrancar receta: Permite el inicio de una receta de limpieza, si las condiciones de la

instalción lo permiten.

o Receta en ejecución: Estado que registra que se ha iniciado una receta y se encuentra en ejecución, aunque podría encontrarse detenida.

o Parar receta: Bit que detiene la ejecución de la receta en función de determinadas

alarmas.

o Memoria receta parada: Bit que registra que la receta se ha detenido. Con ello es posible reanudarla donde se quedó parada y continúe el tiempo que le faltase (llenado de un tanque, tiempo de recirculación, etc).

o Reset receta: Bit que devuelve la instalación a estado inicial. Pone a cero los valores de

tiempo así como de los pasos que tuviese ejecutado.

o Fin receta: Bit que señaliza que se ha terminado el proceso de limpieza.

6.2.4 FC12 Reset Valores Receta y Variables Programa En ocasiones, será necesario poder parar una receta y comenzarla de nuevo sin volver a cargarla. Para esta funcionalidad se ha programado este módulo que inicializa determinadas variables relacionadas con el estado de la receta que estaba en ejecución. La datos de una receta de limpieza se encuentra en un módulo de datos. La estructura es plana, por tanto para resetear los valores se ha programado un bucle y un puntero con un offset que se encarga de poner a cero los siguientes valores:

- Estado del paso.

- Hora de inicio.

- Hora de finalización.

Page 30: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 30 de 130

Mediante un contador que comparamos con el número máximo de pasos sabremos si hay que ejecutarlo o salir del bucle. El sistema dispone de dos punteros denominados AR1 y AR2. Mediante la carga del valor inicial del primer paso en AR1 y añadiéndole el offset adecuado vamos recorriendo la tabla.

6.2.5 FC5 Tipo de Paso Actual Cada paso de la receta está codificado con un valor entero según:

o 1: Paso de preparación

o 2: Paso de envío

o 3: Paso de recirculción

o 4: Paso de vaciado

Este módulo se encarga de comprobar en todo momento el tipo de paso actual de la receta. Para ello, trabaja con un puntero el cual apunta al tipo de paso activo. La variable que almacena dicho valor se encuentra siempre a los mismos intervalos siendo: Puntero = (PasoActivo*42-14), la dirección de memoria dentro del DB100 a la que hay que apuntar. También se comprueba:

o Si es el primer paso de la receta se activa el ‘bit seguridad inicio receta’ o El tipo de paso sólo puede valer 1...4. En caso contrario se indica con una alarma.

o El número de pasos debe estar comprendido entre 1 ... número máximo (parámetro que

establece el módulo de configuración).

6.2.6 FC2 Seguridades Inicio Receta Al comienzo de una receta es necesario verificar una serie de seguridades. Este bloque se encarga de ello, comprobando las siguientes condiciones iniciales:

o Comprueba que el número de pasos se encuentra entre un mínimo y un máximo. Si esta condición no se satisface se genera una alarma que lo indica.

o Realiza una diferenciación entre las dos posibles zonas objeto de la limpieza (tanques de

fermentación / tanques guarda).

o Comprueba que el tanque seleccionado coincida con el que físicamente está conectado (en el proyecto el tanque conectado lo simula el SCADA desde el formulario ‘Pupitre’). La disconformidad se señaliza con su alarma correspondiente.

o El primer paso consiste siempre en comprobar que el tanque no esté lleno. Para ello, se

abre la válvula de retorno y se vigila la señal del flujostato que indica si existe caudal circulando. De ser así se interrumpe la receta y se indica con una alarma.

Page 31: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 31 de 130

6.2.7 FC6 Cálculo de Cambio de Paso Este módulo se llama cada vez que se produce un cambio de paso. Recibe como argumentos de entrada el número de pasos y el paso actual y busca el siguiente paso a realizar. Comprueba si se ha terminado la receta activando entonces una marca. Dentro de las variables de cada paso existe una que indica el estado. Se codifica como:

o 0: No realizado

o 1: En ejecución

o 2: Terminado

De nuevo, para leer el estado se utiliza un puntero. En este caso se trabaja con el puntero del sistema, AR1 y un offset. Su cálculo en este caso es (PasoActivo*42-12). Se encarga de asignar el estado ‘terminado’ al paso activo desde el que se llama el módulo y registra fecha y hora en la variable correspondiente. Para ello se utiliza la función del sistema SFC1 Read CLK. Para buscar el siguiente paso a ejecutar se ha programado un bucle cuyo funcionamiento es: Si encuentra un nuevo paso a ejecutar registra fecha y hora del inicio de dicho suceso. Asimimso realiza un reset del tiempo transcurrido en el que era paso actual.

¿Npasos<=PasoActivo?

PasoActivo++

¿Estado=2?

SI

NO

SI

NO

EstadoPaso=1

Puntero++

Error

Page 32: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 32 de 130

6.2.8 FC1 Preparación Solución Limpieza Este módulo se encarga de preparar las distintas soluciones de limpieza. Por tanto se encarga de vigilar el volumen de agua y los tiempos de funcionamiento de las distintas bombas. La instalación dispone de un caudalimetro en la entrada de agua al depósito cuya magnitud es leida por el PLC como una entrada analógica. Por tanto, habrá que integrar dicho caudal para conocer el volumen. Para integrar se ha seguido el método de integración numérica denominado regla del trapecio, cuyas características indicamos a continuación. La regla del trapecio o regla trapezoidal es una de las fórmulas cerradas de Newton-Cotes. Considérese la función f(X), cuya gráfica entre los extremos X = a y X = b se muestra en la figura. Una aproximación suficiente al área bajo la curva se obtiene dividiéndola en n fajas de ancho

XΔ y aproximándo el área de cada faja mediante un trapecio, como se indica en la figura. Llamando a las ordenadas Y i (i = 1, 2, 3, ...., n+1), las áreas de los trapecios son:

⎟⎠⎞⎜

⎝⎛ +Δ=

221

1YYXA

⎟⎠⎞⎜

⎝⎛ +Δ=

232

2YYXA

....

⎟⎠⎞⎜

⎝⎛ +Δ= +

21nn

nYYXA

El área total comprendida entre X = a y X = b está dada por:

n

b

a

AAAdxxfA +++≅= ∫ ...)( 21

Page 33: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 33 de 130

Sustituyendo las ecuaciones en esta expresión se obtiene:

)2...22(2

)( 1321 ++++++Δ≅= ∫ nn

b

a

YYYYYXdxxfA

Para implementarlo en el autómata, se ha utilizado el OB35. Este módulo es arrancado por el sistema operativo del PLC a intervalos iguales. Con ello, resolvemos la división del eje de tiempos. En nuestro caso el intervalo se ha fijado en 20 ms (esto se realiza en la aplicación Configuración Hardware). Para no estar ejecutándo el OB35 continuamente, se activa al inicio del módulo y se detiene al finalizar el llenado. Para ello, utilizamos las funciones del sistema:

o SFC40 EN_IRT (Enable New Interrupts and Asynchronous Errors) Permite activar la interrupción

o SFC39 DIS_IRT (Disable New Interrupts and Asynchronous Errors) Bloquea la

interrupción cíclica El algoritmo consiste en:

o Leer entrada analógica y escalarla

o Calcular área del intervalo y sumar al acumulado

o Actualizar valores

Dentro del módulo FC se vigila el valor del volumen y se interrumpe al alcanzar la consigna. Además del agua y dependiendo del paso la receta requiere añadir sosa, tensoactivo, etc. Para ello, el módulo lee los parámetros asociados del módulo de datos DB100 auxiliandose del puntero del sistema AR1. Dichos valores son del tipo entero. Como se usarán en temporizadores, es necesario pasarlo al formato S5Time de Siemens. Para ello se ha programado el módulo FC100 (CONV_INT_S5T) que se encarga de realizar dicha operación. Si la receta es detenida, se almacena el tiempo restante de los temporiozadores que estuvieran activos. De modo que al continuar la receta no empiecen de nuevo sino el tiempo restante.

6.2.9 FC7 Envío Solución Limpieza Gestiona el trasvase de la solución preparada en el paso anterior al tanque de destino. Para ello, activará la bomba del carro movil o de envío a guarda. El paso finaliza con la caida retardada de ls señal del fujostato correspondiente.

Page 34: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 34 de 130

6.2.9 FC8 Recirculación La solución enviada requiere de un tiempo de recirculación para asegurar su contacto con las paredes de los tanques y las tuberías. El módulo FC8 lee mediante el puntero del sistema, AR1, el tiempo establecido por receta y lo almacena en un temporizador auxiliándose del FC100, que como ya hemos indicado adapta el dato de entero a S5Time. También almacena el tiempo residual en caso de que la receta sea detenida. Calcula asimismo que válvulas ha de abrir y que bombas arrancar en función del tanque de destino.

6.2.10 FC9 Vaciado Este paso asume el vaciado del tanque sobre el que estamos trabajando. Sólo necesita conocer la zona del tanque destino para activar las válvulas y bombas correspondientes. El proceso finaliza con la señal retardada del flujostato apropiado.

6.2.11 FC10 Activación Salidas Siguiendo con la filosofía de trabajo de encapsular objetos, este módulo gobierna todas las salidas del PLC. Pilotos, válvulas y bombas son activadas desde este bloque. La programación general de una salida será:

o En automático: Dependerá de las condiciones propias del elemento y del tipo de paso activo.

o En manual: El elemento es activado a petición del operador a través del SCADA.

6.2.12 FC50 Cálculo de Defectos Para el correcto funcionamiento de la instalación es necesario el diagnóstico de la misma y la respuesta apropiada ante defectos y averías. Además, suponen una gran ayuda a las tareas de mantenimiento. Existe un módulo de datos, DB110 COM_PLC_PC, donde intercambian datos el PLC y el SCADA. La estructura que hemos seguido es la siguiente:

o Copia de la imagen de entradas digitales.

Page 35: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 35 de 130

o Copia de la imagen de salidas digitales.

o Zona de reserva (para futuras ampliaciones). o Bits de comunicación PLC->PC. Sólo el PLC puede modificar su estado y el PC

consultarlo. o Bits de comunicación PC->PLC. Su valor solo puede cambiarlo el SCADA.

o Bits de activación de salidas para funcionamiento manual de la instalación.

o Bits de defectos. Son activados por el PLC y visualizados en la pantalla del SCADA.

o Datos adicionales para monitorización de variables varias.

En la programación de defectos hemos seguido un criterio de prioridad, por el cual a menor valor mayor prioridad del defecto. Cuanto mayor prioridad del defecto implica mayor efecto sobre la instalación. Por ejemplo, al pulsar una seta de emergencia (prioridad alta) el sistema responde con la parada incondicional de todas las salidas (válvulas y bombas) y de la receta.

6.2.13 FC4 Datos Cabecera DB100 En este bloque se escriben determinadas variables de la cabecera del módulo de datos DB100 DB_REC_FERM. Fundamentalmente, son datos para gestión de la receta e históricos. Los datos que registra son:

o Fecha y hora del inicio de la receta. o Fecha y hora de la finalización.

o Calcula el tiempo transcurrido en el paso activo.

o Compara el tiempo transcurrido con un máximo para señalizar una alarma.

6.2.14 FC11 Datos Entradas Salidas PLC ⇔ SCADA Como ya sabemos, resulta más económico en tiempo leer los datos todos juntos en forma de tabla que múltiples accesos individuales. Por este motivo, en el DB110 COM_PLC_PC se agrupan las variables que requiere el SCADA. Las tareas que realiza esta función son:

o Crea una copia de la imagen del proceso de entradas y salidas. o Refresca los datos de interconexión.

o Confirma los siguientes datos:

Page 36: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 36 de 130

- Nº de la receta

- Nº del tanque a limpiar

- Estado

- Paso actual

- Tiempo paso actual

- Volumen de agua en tanque de preparación

- Valor temporizadores sosa, ácido, tensoactivo y desinfectante

6.3 Tabla de Entradas, Salidas, Marcas y Temporizadores A continuación se adjunta un listado con las entradas, salidas, marcas y temporizadores usados en el programa. Dicha tabla se genera en Step7 con la aplicación Editor de simbolos. El uso de simbolos o etiquetas facilita recordar las variables, así como facilita la interpretación y diagnóstico.

Entradas Dirección Símbolo Tipo Comentario

E 0.0 EPEMERG BOOL Control parada de emergencia / Puesta en servicio E 0.1 FALIMOK BOOL Fuente de alimentacion OK E 0.2 QBENVIO BOOL Magnetotérmico bomba envío CIP E 0.3 QBAPOLLO BOOL Magnetotérmico bomba APOLLOS E 0.5 QBSOSA BOOL Magnetotérmico bomba dosificadora sosa caústica E 0.6 QBACIDO BOOL Magnetotérmico bomba dosificadora Acido E 0.7 QBTENSO BOOL Magnetotérmico bomba dosificadora tensoactivo E 1.0 QBDESIN BOOL Magnetotérmico bomba dosificadora NaCLO E 1.1 EPES BOOL Puls. puesta en servicio / Reset paro emergencia E 1.2 EAUTO BOOL Sel. AutomAtico / Manual E 1.3 PLS BOOL PULSO LITRO POR SEGUNDO E 2.0 EVAA1 BOOL Detector valvula abierta (Aspiracion 1 carro movil) E 2.1 EVAA2 BOOL Detector valvula abierta (Aspiracion 2 carro movil) E 2.2 EVAI1 BOOL Detector valvula abierta (Impulsion 1 carro movil) E 2.3 EVAI2 BOOL Detector valvula abierta (Impulsion 2 carro movil) E 2.4 BQCMI1A BOOL Detector valvula abierta (Impulsion 1 carro movil) E 2.5 KMBCM BOOL Confirmacion activacion bomba carro movil E 2.6 BQCMI2A BOOL Detector vAlvula abierta (Impulsion 2 carro movil) E 2.7 NIVCARRO BOOL Flujostato aspiracion carro movil E 3.0 BIT4 BOOL Contacto identificacion tanques. BIT 4 E 3.1 BIT3 BOOL Contacto identificacion tanques. BIT 3 E 3.2 BIT2 BOOL Contacto identificacion tanques. BIT 2 E 3.3 BIT1 BOOL Contacto identificacion tanques. BIT 1 E 3.4 BIT0 BOOL Contacto identificacion tanques. BIT 0 E 4.0 EVAA1A BOOL Detector valvula abierta (Aspiracion 1 tanques Apollo) E 4.1 EVAA2A BOOL Detector valvula abierta (Aspiracion 2 tanques Apollo) E 4.3 EVAI1A BOOL Detector valvula abierta (Impulsion 1 tanques Apollo)

Page 37: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 37 de 130

E 4.5 EVAI2A BOOL Detector valvula abierta (Impulsion 2 tanques Apollo) E 4.7 BAMARCHA BOOL Confirmacion activacion bomba tanques Apollo E 5.0 ENA BOOL Flujostato aspiracion tanques Apollo E 5.1 BQCBA1 BOOL Detector conexion bola CIP Apollo 1 E 5.2 BQCSA1 BOOL Detector conexion salida Apollo 1 E 5.3 BQCBA2 BOOL Detector conexion bola CIP Apollo 2 E 5.4 BQCSA2 BOOL Detector conexion salida Apollo 2 E 6.0 BQVEAA BOOL Detector Valvula abierta (Entrada de agua tanque prep.) E 6.1 BQVSTPC BOOL Detector vAlvula cerrada (Salida tanque preparacion) E 6.2 BQVSTPA BOOL Detector vAlvula abierta (Salida tanque preparacion) E 6.3 NIVBENVIO BOOL Flujostato aspiracion bomba envío E 7.0 CSC BOOL CONFIRMACION SALIDA CARBONICO

Salidas Dirección Símbolo Tipo Comentario

A 0.0 PPES BOOL Piloto puesta en servicio / Reset paro emergencia (SBLPS) A 0.1 PVER BOOL Señal luminosa baliza verde A 0.2 PROJ BOOL Señal luminosa baliza roja A 0.3 BALIZA BOOL Señal sonora baliza A 0.4 BECIP BOOL Contactor bomba envío CIP A 0.5 BAPOLO BOOL Contactor bomba APOLLOS A 0.6 BSOSA BOOL Contactor bomba dosificadora sosa caústica A 0.7 BACIDO BOOL Contactor bomba dosificadora Acido A 1.0 BTENSO BOOL Contactor bomba dosificadora tensoactivo A 1.1 BDESIN BOOL Contactor bomba dosificadora NaCLO A 1.2 BCARRO BOOL Contactor bomba carro movil A 1.3 SB0NTI BOOL SALIDA BIT 0 Nº TANQUE INTERCAMBIO A 1.4 SB1NTI BOOL SALIDA BIT 1 Nº TANQUE INTERCAMBIO A 1.5 SB2NTI BOOL SALIDA BIT 2 Nº TANQUE INTERCAMBIO A 1.6 SB3NTI BOOL SALIDA BIT 3 Nº TANQUE INTERCAMBIO A 1.7 SB4NTI BOOL SALIDA BIT 4 Nº TANQUE INTERCAMBIO A 2.0 SVA1 BOOL E.V. abrir vAlvula aspiracion 1 carro movil A 2.1 SVA2 BOOL E.V. abrir vAlvula aspiracion 2 carro movil A 2.2 SVI1 BOOL E.V. abrir vAlvula impulsion 1 carro movil A 2.3 SVI2 BOOL E.V. abrir vAlvula impulsion 2 carro movil A 2.4 SB5NTI BOOL SALIDA BIT 5 Nº TANQUE INTERCAMBIO A 2.7 SAVC BOOL SALIDA ABRIR VALVULA DE CARBONICO A 3.0 SVA1A BOOL E.V. abrir vAlvula aspiracion 1 tanques Apollo A 3.1 SVA2A BOOL E.V. abrir vAlvula aspiracion 2 tanques Apollo A 3.2 SVI1A BOOL E.V. abrir vAlvula impulsion 1 tanques Apollo A 3.3 SVI2A BOOL E.V. abrir vAlvula impulsion 2 tanques Apollo A 3.6 YVEAPA BOOL E.V. abrir entrada agua preparacion A 3.7 YVSTPA BOOL E.V. abrir salida tanque preparacion

Marcas Dirección Símbolo Tipo Comentario

M 0.0 BIT0.1S BOOL BIT DE O.1 SEGUNDOS M 0.1 BIT0.2S BOOL BIT DE O.2 SEGUNDOS

Page 38: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 38 de 130

M 0.2 BIT0.4S BOOL BIT DE O.4 SEGUNDOS M 0.3 BIT0.5S BOOL BIT DE O.5 SEGUNDOS M 0.4 BIT0.8S BOOL BIT DE O.8 SEGUNDOS M 0.5 BIT1S BOOL BIT DE 1 SEGUNDOS M 0.6 BIT1.6S BOOL BIT DE 1.6 SEGUNDOS M 0.7 BIT2S BOOL BIT DE 2 SEGUNDOS M 1.0 ON BOOL SIEMPRE A UNO M 1.1 OFF BOOL SIEMPRE A CERO M 5.0 BSEGREC BOOL BIT DE TRANSICCION SEGURIDAD RECETA M 5.1 BTPASO1 BOOL BIT DE TRANSICCION PASO 1 M 5.2 BTPASO2 BOOL BIT DE TRANSICCION PASO 2 M 5.3 BTPASO3 BOOL BIT DE TRANSICCION PASO 3 M 5.4 BTPASO4 BOOL BIT DE TRANSICCION PASO 4 M 5.5 BTPASO5 BOOL BIT DE TRANSICCION PASO 5 M 5.6 BTPASO6 BOOL BIT DE TRANSICCION PASO 6 M 5.7 BTPASO7 BOOL BIT DE TRANSICCION PASO 7 M 6.0 FPArec BOOL FLANCO POSITIVO ARRANCAR RECETA M 6.1 FPRRec BOOL FLANCO POSITIVO RESET RECETA M 6.2 FPPLS BOOL FLANCO POSITIVO PULSO LITRO POR SEGUNDO M 6.3 FPCBACIDO BOOL FLANCO POSITIVO CONFIRMACION BOMBA ACIDO M 6.4 FFHL BOOL Flanco Positivo Fecha y Hora Leida M 6.5 BTPASO13 BOOL BIT DE TRANSICCION PASO 13 M 6.6 BTPASO14 BOOL BIT DE TRANSICCION PASO 14 M 6.7 BTPASO15 BOOL BIT DE TRANSICCION PASO 15 M 7.0 PACIDO BOOL PASO CON ACIDO M 7.1 AACIDO BOOL ACTIVAR ALARMA ACIDO

M 7.2 CONFBACIDO BOOL CONFIRMACION BOMBA ACIDO EN FUNCIONAMIENTO

M 7.3 BTPASO19 BOOL BIT DE TRANSICCION PASO 19 M 7.4 BTPASO20 BOOL BIT DE TRANSICCION PASO 20 M 12.0 AB5NTI BOOL AUXILIAR BIT 5 Nº TANQUE INTERCAMBIO M 13.3 AB0NTI BOOL AUXILIAR BIT 0 Nº TANQUE INTERCAMBIO M 13.4 AB1NTI BOOL AUXILIAR BIT 1 Nº TANQUE INTERCAMBIO M 13.5 AB2NTI BOOL AUXILIAR BIT 2 Nº TANQUE INTERCAMBIO M 13.6 AB3NTI BOOL AUXILIAR BIT 3 Nº TANQUE INTERCAMBIO M 13.7 AB4NTI BOOL AUXILIAR BIT 4 Nº TANQUE INTERCAMBIO M 15.0 M15.0 BOOL Auxiliar Agua Preparacion M 20.0 PEMERG BOOL PARADA EMERGENCIA M 20.1 IES BOOL INSTALACION EN SERVICIO M 20.2 AUTO BOOL INSTALACION EN AUTOMATICO M 20.3 AutMovMan BOOL AUTORIZACION MOVIMIENTOS MANUALES M 20.4 ARec BOOL ARRANCAR RECETA M 20.5 PRec BOOL PARAR RECETA M 20.6 ResetRec BOOL RESET RECETA M 20.7 RecEjec BOOL RECETA EN EJECUCION M 21.0 FinRec BOOL FIN RECETA M 21.1 AutMovAut BOOL AUTORIZACION MOVIMIENTOS AUTOMATICOS M 21.2 MRecP BOOL MEMORIA RECETA PARADA M 21.3 BPrep BOOL BIT DE PREPARACION M 21.4 BEnv BOOL BIT DE ENVIO

Page 39: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 39 de 130

M 21.5 BRecirc BOOL BIT DE RECIRCULACION M 21.6 BVac BOOL BIT DE VACIADO M 21.7 BPPaso BOOL BIT DE PRINCIPIO DE PASO M 22.0 SegInicRec BOOL SEGURIDAD INICIO RECETA M 22.1 BSegInic BOOL BIT SEGURIDAD INICIO M 22.2 PRecXDefM BOOL PARADA RECETA POR DEFECTO MANIOBRA M 22.3 BDEF BOOL BIT DE DEFECTO M 22.4 PRECXDEFI BOOL PARADA RECETA POR DEFECTO INSTALACION M 22.5 LTF BOOL LIMPIAR TANQUES DE FERMENTACION M 22.6 LTA BOOL LIMPIAR TANQUES APOLLO M 25.0 B0 BOOL BIT 0 CODIFICACION M 25.1 B1 BOOL BIT 1 CODIFICACION M 25.2 B2 BOOL BIT 2 CODIFICACION M 25.3 B3 BOOL BIT 3 CODIFICACION M 25.4 B4 BOOL BIT 4 CODIFICACION

M 30.0 OAVSIFerm BOOL ORDEN ABRIR VALVULA SEGURIDAD INICIO FERMENTACION

M 30.1 OAVA BOOL ORDEN ABRIR VALVULA AGUA M 30.2 OABSOSA BOOL ORDEN ARRANCAR BOMBA DE SOSA M 30.3 OABACIDO BOOL ORDEN ARRANCAR BOMBA ACIDO M 30.4 OABDESIN BOOL ORDEN ARRANCAR BOMBA DESINFECTANTE M 30.5 OABTENSO BOOL ORDEN ARRANCAR BOMBA TENSOACTIVO M 30.6 OAVPREP BOOL ORDEN ABRIR VALVULA PREPARCION M 30.7 OAVA2E BOOL ORDEN ABRIR VALVULA ASPIRACION 2 PASO ENVIO M 31.0 OAVI1E BOOL ORDEN ABRIR VALVULA IMPULSION 1 PASO ENVIO M 31.1 OABECIP BOOL ORDEN ARRANCAR BOMBA ENVIO CIP

M 31.2 OABCARROE BOOL ORDEN ARRANCAR BOMBA CARRO MOVIL PASO ENVIO

M 31.3 OAVA2R BOOL ORDEN ABRIR VALVULA ASPIRACION 2 PASO RECIRCULACION

M 31.4 OAVI1R BOOL ORDEN ABRIR VALVULA IMPULSION 1 PASO RECIRCULACION

M 31.5 OABCARROR BOOL

ORDEN ARRANCAR BOMBA CARRO MOVIL PASO RECIRCULACION

M 31.6 OAVA2V BOOL ORDEN ABRIR VALVULA ASPIRACION 2 PASO VACIADO M 31.7 OAVI2V BOOL ORDEN ABRIR VALVULA IMPULSION 2 PASO VACIADO

M 32.0 OABCARROV BOOL ORDEN ARRANCAR BOMBA CARRO PASO VACIADO

M 32.1 OABAPE BOOL ORDEN ARRANCAR BOMBA APOLLO PASO ENVIO

M 32.2 OABAPR BOOL ORDEN ARRANCAR BOMBA APOLLO PASO RECIRCULACION

M 32.3 OABAPV BOOL ORDEN ARRANCAR BOMBA APOLLO PASO VACIADO M 200.0 MEPEMERG BOOL Control parada de emergencia / Puesta en servicio M 200.1 MFALIMOK BOOL Fuente de alimentaciOn OK M 200.2 MQBENVIO BOOL Magnetotérmico bomba envío CIP

M 200.3 MQBAPOLLO BOOL Magnetotérmico bomba APOLLOS

M 200.5 MQBSOSA BOOL Magnetotérmico bomba dosificadora sosa caústica M 200.6 MQBACIDO BOOL Magnetotérmico bomba dosificadora Acido M 200.7 MQBTENSO BOOL Magnetotérmico bomba dosificadora tensoactivo M 201.0 MQBDESIN BOOL Magnetotérmico bomba dosificadora NaCLO M 201.1 MEPES BOOL Puls. puesta en servicio / Reset paro emergencia

Page 40: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 40 de 130

M 201.2 MEAUTO BOOL Sel. AutomAtico / Manual M 202.0 MEVCA1 BOOL Detector vAlvula cerrada (AspiraciOn 1 carro movil) M 202.1 MEVCA2 BOOL Detector vAlvula cerrada (Aspiracion 2 carro movil) M 202.2 MEVCI1 BOOL Detector vAlvula cerrada (Impulsion 1 carro movil) M 202.3 MEVCI2 BOOL Detector vAlvula cerrada (Impulsion 2 carro movil) M 202.4 MBQCMI1A BOOL Detector vAlvula abierta (Impulsion 1 carro movil) M 202.5 MKBCARRO BOOL Confirmacion activacion bomba carro movil M 202.6 MBQCMI2A BOOL Detector vAlvula abierta (Impulsion 2 carro movil) M 202.7 MENC BOOL Flujostato aspiracion carro movil M 203.0 MBIT4 BOOL Contacto identificacion tanques. BIT 4 M 203.1 MBIT3 BOOL Contacto identificacion tanques. BIT 3 M 203.2 MBIT2 BOOL Contacto identificacion tanques. BIT 2 M 203.3 MBIT1 BOOL Contacto identificacion tanques. BIT 1 M 203.4 MBIT0 BOOL Contacto identificacion tanques. BIT 0 M 204.0 MEVCA1A BOOL Detector vAlvula cerrada (Aspiracion 1 tanques Apollo) M 204.1 MEVCA2A BOOL Detector vAlvula cerrada (Aspiracion 2 tanques Apollo) M 204.2 MBQTAA2A BOOL Detector vAlvula abierta (Aspiracion 2 tanques Apollo) M 204.3 MEVCI1A BOOL Detector vAlvula cerrada (Impulsion 1 tanques Apollo) M 204.4 MBQTAI1A BOOL Detector vAlvula abierta (Impulsion 1 tanques Apollo) M 204.5 MEVCI2A BOOL Detector vAlvula cerrada (Impulsion 2 tanques Apollo) M 204.6 MBQTAI2A BOOL Detector vAlvula abierta (Impulsion 2 tanques Apollo) M 204.7 MKBAPOLLO BOOL Confirmacion activacion bomba tanques Apollo M 205.0 MENA BOOL Flujostato aspiracion tanques Apollo M 205.1 MBQCBA1 BOOL Detector conexion bola CIP Apollo 1 M 205.2 MBQCSA1 BOOL Detector conexion salida Apollo 1 M 205.3 MBQCBA2 BOOL Detector conexion bola CIP Apollo 2 M 205.4 MBQCSA2 BOOL Detector conexion salida Apollo 2 M 206.0 MEVCA BOOL Detector vAlvula cerrada (Entrada de agua tanque prep.) M 206.1 MEVCPREP BOOL Detector vAlvula cerrada (Salida tanque preparacion) M 206.2 MBQVSTPA BOOL Detector vAlvula abierta (Salida tanque preparacion) M 206.3 MENPREP BOOL Flujostato aspiracion bomba envío M 210.0 MPPES BOOL Piloto puesta en servicio / Reset paro emergencia (SBLPS) M 210.1 MPVER BOOL Señal luminosa baliza verde M 210.2 MPROJ BOOL Señal luminosa baliza roja M 210.3 MBALIZA BOOL Señal sonora baliza M 210.4 MBECIP BOOL Contactor bomba envío CIP M 210.5 MBAPOLLO BOOL Contactor bomba APOLLOS M 210.6 MBSOSA BOOL Contactor bomba dosificadora sosa caústica M 210.7 MBACIDO BOOL Contactor bomba dosificadora Acido M 211.0 MBTENSO BOOL Contactor bomba dosificadora tensoactivo M 211.1 MBDESIN BOOL Contactor bomba dosificadora NaCLO M 211.2 MBCARRO BOOL Contactor bomba carro movil M 212.0 MSVA1 BOOL E.V. abrir vAlvula aspiracion 1 carro movil M 212.1 MSVA2 BOOL E.V. abrir vAlvula aspiracion 2 carro movil M 212.2 MSVI1 BOOL E.V. abrir vAlvula impulsion 1 carro movil M 212.3 MSVI2 BOOL E.V. abrir vAlvula impulsion 2 carro movil M 213.0 MSVA1A BOOL E.V. abrir vAlvula aspiracion 1 tanques Apollo M 213.1 MSVA2A BOOL E.V. abrir vAlvula aspiracion 2 tanques Apollo M 213.2 MSVI1A BOOL E.V. abrir vAlvula impulsion 1 tanques Apollo

Page 41: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 41 de 130

M 213.3 MSVI2A BOOL E.V. abrir vAlvula impulsion 2 tanques Apollo M 213.6 MYVEAPA BOOL E.V. abrir entrada agua preparacion M 213.7 MYVSTPA BOOL E.V. abrir salida tanque preparacion MB 25 AUXCOD BYTE AUXILIAR CODIFICACION TANQUE MD 2 PTP DWORD PUNTERO A TIPO DE PASO DB100

MD 5 PAL_TPASOS DWORD PALABRA DE TRANSICCION DE PASOS

MW 10 VAGUAPREP INT VOLUMEN AGUA PREPARACION

MW 12 PACNT WORD PALABRA AUXILIAR CODIFICACION Nº TANQUE PARA INTERCAMBIO

Temporizadores Dirección Símbolo Tipo Comentario

T 0 TSA TIMER TEMPORIZADOR SEGURIDAD ARRANQUE T 1 TBSOSA TIMER TEMPORIZADOR BOMBA SOSA T 2 TBACIDO TIMER TEMPORIZADOR BOMBA ACIDO T 3 TBDESIN TIMER TEMPORIZADOR BOMBA DESINFECTANTE T 4 TBTENSO TIMER TEMPORIZADOR BOMBA TENSOACTIVO T 5 TTCVAC TIMER TEMPORIZADOR TANQUE CIP VACIO T 6 TTA1VAC TIMER TEMPORIZADOR TUBERIA ASPIRACION 1 VACIA T 7 TRECIRC TIMER TEMPORIZADOR RECIRCULACION T 8 TTLVAC TIMER TEMPORIZADOR TANQUE LIMPIADO VACIO

T 9 TDMVA2 TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA ASPIRACION 2

T 10 TDMVI1 TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA IMPULSION 1

T 11 TDCOM TIMER TEMPORIZADOR DEFECTO COMUNICACION T 12 TECNT TIMER TEMPORIZADOR ESPERA CONFIRMACION Nº TANQUE T 13 TBCIP TIMER TEMPORIZADOR BOMBA ENVIO CIP T 100 TDVA TIMER TEMPOTIZADOR DEFECTO VALVULA AGUA T 101 TDBSOSA TIMER TEMPORIZADOR DEFECTO BOMBA SOSA T 102 TDMBACIDO TIMER TEMPORIZADOR DEFECTO MANIOBRA BOMBA ACIDO

T 103 TDMBDESIN TIMER TEMPORIZADOR DEFECTO MANIOBRA BOMBA DESINFECTANTE

T 104 TDMBTENSO TIMER TEMPORIZADOR DEFECTO BOMBA DE TENSOACTIVO

T 105 TDMVPREP TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA SALIDA PREPARACION

T 106 TDMVA1 TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA ASPIRACION 1

T 107 TDMVI2 TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA IMPULSION 2

T 108 TDMBECIP TIMER TEMPORIZADOR DEFECTO MANIOBRA BOMBA ENVIO CIP

T 109 TDMBCARRO TIMER TEMPORIZADOR DEFECTO MANIOBRA CARRO MOVIL

T 110 TDMVA1A TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA ASPIRACION 1 APOLLO

T 111 TDMVA2A TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA ASPIRACION 2 APOLLO

T 112 TDMVI1A TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA IMPULSION 1 APOLLO

Page 42: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 42 de 130

T 113 TDMVI2A TIMER TEMPORIZADOR DEFECTO MANIOBRA VALVULA IMPULSION 2 APOLLO

T 114 TDBAPOLLO TIMER TEMPORIZADOR DEFECTO MANIOBRA BOMBA APOLLO 7 Código Programa PLC DATA_BLOCK DB 1 TITLE =FLANCOS, BITS AUXILIARES, CONSTANTES, ETC VERSION : 0.1 STRUCT AuxFpPes : BOOL ; //AUILIAR FLANCO 0->1 PUESTA EN SERVICIO AuxFpArec : BOOL ; //AUILIAR FLANCO 0->1 ARRANCAR RECETA AuxFpFinRec : BOOL ; //AUILIAR FLANCO 0->1 FIN RECETA AuxFpB1s : BOOL ; //AUILIAR FLANCO 0->1 BIT 1 SEGUNDO RESERVA1 : INT ; //RESERVA VAPAR2P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 2 TIEMPO PASO PREPARACIÓN VAPAR3P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 3 TIEMPO PASO PREPARACIÓN VAPAR4P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 4 TIEMPO PASO PREPARACIÓN VAPAR5P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 5 TIEMPO PASO PREPARACIÓN VAPAR6P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 6 TIEMPO PASO PREPARACIÓN VAPAR7P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 7 TIEMPO PASO PREPARACIÓN VAPAR8P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 8 TIEMPO PASO PREPARACIÓN VAPAR9P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 9 TIEMPO PASO PREPARACIÓN VAPAR10P : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 10 TIEMPO PASO PREPARACIÓN VAPAR1R : S5TIME ; //VARIABLE AUXILIAR PARAMETRO 1 TIEMPO PASO RECIRCULACIÓN CAUDALK : DINT ; //CAUDAL INSTANTE K CAUDALK1 : DINT ; //CAUDAL INSTANTE K-1 VOLUMEN : REAL ; //VOLUMEN TANQUE DE PREPARACIÓN TIEMPO_DEF : S5TIME ; //CONSTANTE TIEMPO PARA DEFECTO VAPAR1P : DINT ; //VARIABLE AUXILIAR PARAMETRO 1 LITROS DE AGUA PASO PREPARACION MAXNPASOS : INT ; //MAXIMO NUMERO DE PASOS EN RECETA FH : DATE_AND_TIME ; //Fecha y hora AuxFpBenv : BOOL ; //AUXILIAR FLANCO 0->1 BIT ENVIO AuxVAguaPrep : INT ; //AUXILIAR VOLUMEN AGUA TANQUE PREPARACION FPB1s : BOOL ; //FLANCO POSITIVO BIT 1 SEGUNDO END_STRUCT ; BEGIN AuxFpPes := FALSE; AuxFpArec := FALSE; AuxFpFinRec := FALSE; AuxFpB1s := FALSE; RESERVA1 := 0; VAPAR2P := S5T#0MS; VAPAR3P := S5T#0MS; VAPAR4P := S5T#0MS; VAPAR5P := S5T#0MS; VAPAR6P := S5T#0MS; VAPAR7P := S5T#0MS; VAPAR8P := S5T#0MS; VAPAR9P := S5T#0MS; VAPAR10P := S5T#0MS; VAPAR1R := S5T#0MS; CAUDALK := L#0; CAUDALK1 := L#0; VOLUMEN := 0.000000e+000; TIEMPO_DEF := S5T#0MS; VAPAR1P := L#0; MAXNPASOS := 0; FH := DT#90-1-1-0:0:0.000; AuxFpBenv := FALSE; AuxVAguaPrep := 0; FPB1s := FALSE; END_DATA_BLOCK

Page 43: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 43 de 130

DATA_BLOCK DB 100 TITLE = VERSION : 0.1 STRUCT CABECERA : STRUCT //CABECERA DE LA RECETA N_RECETA : INT ; //Nº DE LA RECETA N_PASOS : BYTE ; //Nº DE PASOS DE LA RECETA N_TANQUE : BYTE ; //Nº DEL TANQUE A LIMPIAR (1-16) INICIO : DATE_AND_TIME ; //FECHA Y HORA DE INICIO DE LA RECETA FIN : DATE_AND_TIME ; //FECHA Y HORA DE FINAL DE LA RECETA ESTADO : INT ; //ESTADO DE LA RECETA (0=INACTIVA; 1=EN EJECUCIÓN; 2=TERMINADA) PASO_ACT : INT ; //PASO ACTIVO DE LA RECETA TIEMPO : INT ; //TIEMPO (s) DE PASO ACTIVO END_STRUCT ; PASO1 : STRUCT //PASO 1 DE LA RECETA N_PASO : INT := 1; //Nº DEL PASO (1-20) TIPO_PASO : INT ; //TIPO DE PASO (1=PREPARACIÓN; 2=ENVÍO; 3=RECIRCULACIÓN; 4=VACIADO ESTADO : INT ; //(0=NO REALIZADO; 1=EN EJECUCIÓN; 2=TERMINADO) INICIO : DATE_AND_TIME ; //FECHA Y HORA DE INICIO DEL PASO FIN : DATE_AND_TIME ; //FECHA Y HORA DE FINAL DEL PASO PAR1 : INT ; //(TIPO_PASO=1: LITROS DE AGUA ; TIPO_PASO=2: T. RECIRCULACIÓN) PAR2 : INT ; //(TIPO_PASO=1: T. BOMBA SOSA) PAR3 : INT ; //(TIPO_PASO=1: T. BOMBA ÁCIDO) PAR4 : INT ; //(TIPO_PASO=1: T. BOMBA DESINFECTANTE) PAR5 : INT ; //(TIPO_PASO=1: T. BOMBA TENSOACTIVO) PAR6 : INT ; //PARÁMETRO 6 (RESERVA) PAR7 : INT ; //PARÁMETRO 7 (RESERVA) PAR8 : INT ; //PARÁMETRO 8 (RESERVA) PAR9 : INT ; //PARÁMETRO 9 (RESERVA) PAR10 : INT ; //PARÁMETRO 10 (RESERVA) END_STRUCT ; PASO2 : STRUCT //PASO 2 DE LA RECETA N_PASO : INT := 1; //Nº DEL PASO (1-20) TIPO_PASO : INT ; //TIPO DE PASO (1=PREPARACIÓN; 2=ENVÍO; 3=RECIRCULACIÓN; 4=VACIADO ESTADO : INT ; //(0=NO REALIZADO; 1=EN EJECUCIÓN; 2=TERMINADO) INICIO : DATE_AND_TIME ; //FECHA Y HORA DE INICIO DEL PASO FIN : DATE_AND_TIME ; //FECHA Y HORA DE FINAL DEL PASO PAR1 : INT ; //(TIPO_PASO=1: LITROS DE AGUA ; TIPO_PASO=2: T. RECIRCULACIÓN) PAR2 : INT ; //(TIPO_PASO=1: T. BOMBA SOSA) PAR3 : INT ; //(TIPO_PASO=1: T. BOMBA ÁCIDO) PAR4 : INT ; //(TIPO_PASO=1: T. BOMBA DESINFECTANTE) PAR5 : INT ; //(TIPO_PASO=1: T. BOMBA TENSOACTIVO) PAR6 : INT ; //PARÁMETRO 6 (RESERVA) PAR7 : INT ; //PARÁMETRO 7 (RESERVA) PAR8 : INT ; //PARÁMETRO 8 (RESERVA) PAR9 : INT ; //PARÁMETRO 9 (RESERVA) PAR10 : INT ; //PARÁMETRO 10 (RESERVA) END_STRUCT ; ... ... PAS0152 : STRUCT //PASO 152 DE LA RECETA N_PASO : INT := 1; //Nº DEL PASO (1-20) TIPO_PASO : INT ; //TIPO DE PASO (1=PREPARACIÓN; 2=ENVÍO; 3=RECIRCULACIÓN; 4=VACIADO ESTADO : INT ; //(0=NO REALIZADO; 1=EN EJECUCIÓN; 2=TERMINADO) INICIO : DATE_AND_TIME ; //FECHA Y HORA DE INICIO DEL PASO FIN : DATE_AND_TIME ; //FECHA Y HORA DE FINAL DEL PASO PAR1 : INT ; //(TIPO_PASO=1: LITROS DE AGUA ; TIPO_PASO=2: T. RECIRCULACIÓN) PAR2 : INT ; //(TIPO_PASO=1: T. BOMBA SOSA) PAR3 : INT ; //(TIPO_PASO=1: T. BOMBA ÁCIDO) PAR4 : INT ; //(TIPO_PASO=1: T. BOMBA DESINFECTANTE) PAR5 : INT ; //(TIPO_PASO=1: T. BOMBA TENSOACTIVO) PAR6 : INT ; //PARÁMETRO 6 (RESERVA) PAR7 : INT ; //PARÁMETRO 7 (RESERVA) PAR8 : INT ; //PARÁMETRO 8 (RESERVA) PAR9 : INT ; //PARÁMETRO 9 (RESERVA) PAR10 : INT ; //PARÁMETRO 10 (RESERVA) END_STRUCT ;

Page 44: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 44 de 130

END_STRUCT ; DATA_BLOCK DB 110 TITLE = VERSION : 0.1 STRUCT EW_0 : WORD ; //COPIA E0.0 a E1.7 EW_2 : WORD ; //COPIA E2.0 a E3.7 EW_4 : WORD ; //COPIA E4.0 a E5.7 EW_6 : WORD ; //COPIA E6.0 a E7.7 EW_8 : WORD ; //COPIA E8.0 a E9.7 AW_0 : WORD ; //COPIA A0.0 a A1.7 AW_2 : WORD ; //COPIA A2.0 a A3.7 AW_4 : WORD ; //COPIA A4.0 a A5.7 EA1 : INT ; //VALOR ENTRADA ANALOG. 1 EA2 : INT ; //VALOR ENTRADA ANALOG. 2 RESERVA_ES_1 : WORD ; //EMPLAZAMIENTO LIBRE 1 RESERVA_ES_2 : WORD ; //EMPLAZAMIENTO LIBRE 2 RESERVA_ES_3 : WORD ; //EMPLAZAMIENTO LIBRE 3 RESERVA_ES_4 : WORD ; //EMPLAZAMIENTO LIBRE 4 RESERVA_ES_5 : WORD ; //EMPLAZAMIENTO LIBRE 5 RESERVA_ES_6 : WORD ; //EMPLAZAMIENTO LIBRE 6 RESERVA_ES_7 : WORD ; //EMPLAZAMIENTO LIBRE 7 ZAMA : BOOL ; //AUTORIZACIÓN PLC MOV. AUTO. ZAMM : BOOL ; //AUTORIZACIÓN PLC MOV. MAN. ZRECEJ : BOOL ; //RECETA EN EJECUCIÓN ZRECSTOP : BOOL ; //RECETA PARADA POR EL PLC ZFINREC : BOOL ; //FIN RECETA ZIES : BOOL ; //INSTALACIÓN EN SERVICIO EnDef : BOOL ; //INSTALACION CON ALGUN DEFECTO MPLC_PC_347 : BOOL ; ZECNT : BOOL ; //EN ESPERA CONFIRMACION Nº DE TANQUE ZECBA : BOOL ; //EN ESPERA CONFIRMACION ACTIVACION BOMBA ACIDO MPLC_PC_352 : BOOL ; ZCRES : BOOL ; //CONFIRMACION RESET MPLC_PC_354 : BOOL ; MPLC_PC_355 : BOOL ; ... ... MPLC_PC_437 : BOOL ; XAUTMOVMAN : BOOL ; //BIT AUTORIZACIÓN MOVIMIENTOS MANUALES DESDE SCADA XAREC : BOOL ; //BIT ARRANCAR RECETA DESDE SCADA XPREC : BOOL ; //BIT PARAR RECETA DESDE SCADA XRESET_REC : BOOL ; //BIT RESET RECETA DESDE SCADA XRESET_DEF : BOOL ; //BIT RESET DEFECTOS DESDE SCADA XCOM_OK : BOOL ; //BIT COMUNICACION OK XPES : BOOL ; //BIT PUESTA EN SERVICIO XAUTO : BOOL ; //BIT PASAR A AUTOMATICO XPEMERG : BOOL ; //BIT PARADA EMERGENCIA MPC_PLC_451 : BOOL ; … … MPC_PLC_477 : BOOL ; XSAVA2 : BOOL ; //ABRIR VALVULA ASPIRACION 2 EN MANUAL XSAVA : BOOL ; //ABRIR VALVULA DE AGUA EN MANUAL XSABSOSA : BOOL ; //ARRANCAR BOMBA DE SOSA EN MANUAL XSABACIDO : BOOL ; //ARRANCAR BOMBA DE ACIDO EN MANUAL XSABDESIN : BOOL ; //ARRANCAR BOMBA DE DESINFECTANTE EN MANUAL XSABTENSO : BOOL ; //ARRANCAR BOMBA DE TENSOACTIVO EN MANUAL XSAVPREP : BOOL ; //ABRIR VALVULA PREPARACION EN MANUAL XSAVA1 : BOOL ; //ABRIR VALVULA ASPIRACION 1 EN MANUAL XSAVI2 : BOOL ; //ABRIR VALVULA IMPULSION 2 EN MANUAL XSABECIP : BOOL ; //ARRANCAR BOMBA ENVIO CIP EN MANUAL XSABCARRO : BOOL ; //ARRANCAR BOMBA CARRO MOVIL EN MANUAL XSAVI1 : BOOL ; //ABRIR VALVULA IMPULSION 1 EN MANUAL XSAVA2A : BOOL ; //ABRIR VALVULA ASPIRACION 2 APOLLO EN MANUAL XSAVA1A : BOOL ; //ABRIR VALVULA ASPIRACION 1 APOLLO EN MANUAL

Page 45: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 45 de 130

XSAVI1A : BOOL ; //ABRIR VALVULA IMPULSION 1 APOLLO EN MANUAL XSAVI2A : BOOL ; //ABRIR VALVULA IMPULSION 2 APOLLO EN MANUAL XSABAPOLLO : BOOL ; //ARRANCAR BOMBA APOLLO EN MANUAL MPC_PLC_501 : BOOL ; ... ... MPC_PLC_507 : BOOL ; XSCBACIDO : BOOL ; //CONFIRMACION BOMA ACIDO EN MARCHA MPC_PLC_511 : BOOL ; … … MPC_PLC_537 : BOOL ; XDSEMERG : BOOL ; //DEFECTO SETA EMERGENCIA PULSADA XDFALIM : BOOL ; //DEFECTO FUENTE DE ALIMENTACION XDQBENVIO : BOOL ; //DEFECTO MAGNETOTERMICO BOMBA DE ENVIO XDQBAPOLLO : BOOL ; //DEFECTO MAGNETOTERMICO BOMBA APOLLO XDQBACARRO : BOOL ; //DEFECTO MAGNETOTERMICO BOMBA CARRO MOVIL XDQBSOSA : BOOL ; //DEFECTO MAGNETOTERMICO BOMBA DE SOSA XDQBACIDO : BOOL ; //DEFECTO MAGNETOTERMICO BOMBA DE ACIDO XDQBTENSO : BOOL ; //DEFECTO MAGNETOTERMICO BOMBA DE TENSOACTIVO XDQBDESIN : BOOL ; //DEFECTO MAGNETOTERMICO BOMBA DE DESINFECTANTE DEF_551 : BOOL ; … … DEF_557 : BOOL ; XDMEA : BOOL ; //DEFECTO MODULO ENTRADA ANALOGICA DEF_561 : BOOL ; … … DEF_577 : BOOL ; XDMVA : BOOL ; //DEFECTO MANIOBRA VÁLVULA DE AGUA XDMBSOSA : BOOL ; //DEFECTO MANIOBRA BOMBA DE SOSA XDMBACIDO : BOOL ; //DEFECTO MANIOBRA BOMBA DE ACIDO XDMBDESIN : BOOL ; //DEFECTO MANIOBRA BOMBA DE DESINFECTANTE XDMBTENSO : BOOL ; //DEFECTO MANIOBRA BOMBA DE TENSOACTIVO XDMVPREP : BOOL ; //DEFECTO MANIOBRA VÁLVULA SALIDA PREPARACIÓN XDMVA1 : BOOL ; //DEFECTO MANIOBRA VÁLVULA ASPIRACIÓN 1 XDMVI2 : BOOL ; //DEFECTO MANIOBRA VÁLVULA IMPULSIÓN 2 XDMBECIP : BOOL ; //DEFECTO MANIOBRA BOMBA ENVÍO CIP XDMBCARRO : BOOL ; //DEFECTO MANIOBRA BOMBA CARRO MÓVIL XDMVA2 : BOOL ; //DEFECTO MANIOBRA VALVULA ASPIRACION 2 XDMVI1 : BOOL ; //DEFECTO MANIOBRA VALVULA IMPULSION 1 XDMVA1A : BOOL ; //DEFECTO MANIOBRA VALVULA ASPIRACION 1 APOLLO XDMVA2A : BOOL ; //DEFECTO MANIOBRA VALVULA ASPIRACION 2 APOLLO XDMVI1A : BOOL ; //DEFECTO MANIOBRA VALVULA IMPULSION 1 APOLLO XDMVI2A : BOOL ; //DEFECTO MANIOBRA VALVULA IMPULSION 2 APOLLO XDMBAPOLLO : BOOL ; //DEFECTO MANIOBRA BOMBA APOLLO DEF_601 : BOOL ; … … DEF_607 : BOOL ; XDPASO_ACT : BOOL ; //DEFECTP PASO ACTIVO (FUERA RANGO 1-20) XDTIP_PASO : BOOL ; //DEFECTO TIPO DE PASO (FUERA RANGO 1-4) XDTC : BOOL ; //DEFECTO TANQUE CONECTADO XDNPASOS : BOOL ; //DEFECTO NUMERO DE PASOS RECETA XDTNV : BOOL ; //DEFECTO TANQUE NO VACÍO XDCOM : BOOL ; //DEFECTO COMUNICACIÓN PLC <=> PC DEF_616 : BOOL ; … … DEF_637 : BOOL ; R1 : WORD ; R2 : WORD ; R3 : WORD ; R4 : WORD ; R5 : WORD ; R6 : WORD ; R7 : WORD ; R8 : WORD ; R9 : WORD ; R10 : WORD ; R11 : WORD ; R12 : WORD ; R13 : WORD ; NREC : WORD ; //NUMERO DE LA RECETA NTANQUE : WORD ; //NUMERO DEL TANQUE

Page 46: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 46 de 130

ESTADO_REC : WORD ; //ESTADO DE LA RECETA PASO_ACT : WORD ; //PASO ACTUAL TIEMPO_ACT : WORD ; //TIEMPO ACTUAL VOLAGUA : WORD ; //VOLUMEN AGUA TANQUE DE PREPARACION TSOSA : WORD ; //TIEMPO SOSA TACIDO : WORD ; //TIEMPO ACIDO TTENSO : WORD ; //TIEMPO TENSOACTIVO TDESIN : WORD ; //TIEMPO DESINFECTANTE TRECIRC : WORD ; //TIEMPO DE RECIRCULACION END_STRUCT ; FUNCTION FC 6 : VOID TITLE =FC PARA CALCULAR CAMBIOS DE PASOS VERSION : 0.1 VAR_INPUT NPasos : BYTE ; //NUMERO DE PASOS DE LA RECETA END_VAR VAR_IN_OUT PasoAct : INT ; //PASO ACTIVO DE LA RECETA END_VAR VAR_TEMP AuxCalcP : INT ; //AUXILIAR CALCULO PUNTERO ErrorHora1 : INT ; //ERROR HORA Y FECHA DE FIN PASO ACTIVO ErrorHora2 : INT ; //ERROR HORA Y FECHA DE INICIO SIGUIENTE PASO AuxFH : DATE_AND_TIME ; //AUXILIAR FECHA Y HORA ANPasos : INT ; //AUXILIAR Nº DE PASOS END_VAR BEGIN NETWORK TITLE =CONVERTIT DE BYTE A INT L #NPasos; T #ANPasos; NOP 0; NETWORK TITLE =VERIFICAR FIN RECETA FREC: L #ANPasos; L #PasoAct; <=I ; S M 21.0; NETWORK TITLE =SI FIN RECETA => FIN DE MÓDULO U M 21.0; SAVE ; BEB ; NETWORK TITLE =ABRIR DB_REC_FERM (DB100) AUF DB 100; NETWORK TITLE =ACTIVAR PRINCIPIO DE PASO U M 1.0; S M 21.7; NETWORK TITLE =COMPROBAR PRINCIPIO DE RECETA L #PasoAct; L 0; ==I ; //CALCULA RLO PARA SALTO L P#30.0; //CARGAR DIRECCIÓN BASE PALABRA "ESTADO" DB100 LAR1 ; SPB FP0; //SALTO A ETIQUETA FP0 NETWORK TITLE =CALCULO DIRECCIÓN PUNTERO A "ESTADO" U( ; L #PasoAct; L 42; *I ;

Page 47: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 47 de 130

T #AuxCalcP; UN OV; SAVE ; CLR ; U BIE; ) ; SPBNB _00b; L #AuxCalcP; L 12; -I ; T #AuxCalcP; _00b: NOP 0; NETWORK TITLE =PASO A FORMATO PUNTERO LA DIRECCIÓN "ESTADO" Y TRANSFIERE A AR1 L #AuxCalcP; SLW 3; LAR1 ; //CARGAR EN PUNTERO SISTEMA 1 (AR1) DIRECCIÓN "ESTADO" NETWORK TITLE =PASO ACTIVO = TERMINADO L 2; //"ESTADO" PASO = TERMINADO T DBW [AR1,P#0.0]; NETWORK TITLE =DETERMINAR FECHA Y HORA FIN DE PASO U M 1.0; SPBNB _010; CALL SFC 1 ( RET_VAL := #ErrorHora1, CDT := #AuxFH); _010: NOP 0; NETWORK TITLE =TRANSFERENCIA A PALABRA FIN PASO ACTIVO DEL DB_REC_FERM (DB100) L LD 6; //CARGA AÑO, MES, DÍA Y HORA (4 PRIMEROS BYTES DE AuxFH) T DBD [AR1,P#10.0]; //TRANFIERE A LOS 4 PRIMEROS BYTES DE FIN DEL PASO ACTIVO L LD 10; //CARGA MINUTO, SEGUNDO, MILISEGUNDO Y DIA SEMANA (4 SIGUIENTES) T DBD [AR1,P#14.0]; //TRANFIERE A LOS 4 ÚLTIMOS BYTES DE FIN DEL PASO ACTIVO NETWORK TITLE =ACTUALIZA VALOR PUNTERO SIGUIENTE VALOR "ESTADO" TAR1 ; //CARGA EN ACU1 DIRECCIÓN DE "ESTADO" (AR1) L P#42.0; //AUMENTA PUNTERO HASTA SIGUIENTE PASO "ESTADO" +I ; LAR1 ; NETWORK TITLE =BUSCAR SIGUIENTE PASO SIN REALIZAR (ESTADO<>2) FP0: NOP 0; //META DE SALTO L #NPasos; //COMPROBAR QUE NºPASOS RECETA ES <=20 L DB1.DBW 42; >I ; AUF DB 100; SPB EREC; //SALTO A ERROR-RECETA SI FUERA DE RANGO BUC1: L #NPasos; //COMPROBAR SI SE HA ALCANZADO FIN RECETA L #PasoAct; <=I ; SPB FREC; //SI ES ASI SALTA A FIN-RECETA L #PasoAct; //INCREMENTA PasoAct L 1; +I ; T #PasoAct; L DBW [AR1,P#0.0]; //CARGA VALOR DE "ESTADO" DEL SIGUIENTE PASO L 2; ==I ; SPBN FBUC; //SI PASO TERMINADO SIGUE; SI NO SALTA A FBUC TAR1 ; //CARGA EN ACU1 DIRECCIÓN DE "ESTADO" (AR1) L P#42.0; //OFFSET ENTRE "ESTADO" DISTINTOS PASOS +I ; LAR1 ; //AHORA EL PUNTERO AR1 APUNTA A "ESTADO" SIGUIENTE PASO SPA BUC1; FBUC: L 1; T DBW [AR1,P#0.0]; //"ESTADO" PASO ACTIVO = EN EJECUCIÓN

Page 48: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 48 de 130

NETWORK TITLE =DETERMINAR FECHA Y HORA INICIO DE PASO U M 1.0; SPBNB _011; CALL SFC 1 ( RET_VAL := #ErrorHora2, CDT := #AuxFH); _011: NOP 0; NETWORK TITLE =RESET TIEMPO PASO ACTIVO DEL DB_REC_FERM (DB100) L 0; T DB100.DBW 24; NOP 0; NETWORK TITLE =TRANSFERENCIA A "INICIO" PASO ACTIVO DEL DB_REC_FERM (DB100) L LD 6; //CARGA AÑO, MES, DÍA Y HORA (4 PRIMEROS BYTES DE AuxFH) T DBD [AR1,P#2.0]; //TRANFIERE A LOS 4 PRIMEROS BYTES DE INICIO DEL PASO ACTIVO L LD 10; //CARGA AÑO, MES, DÍA Y HORA (4 PRIMEROS BYTES DE AuxFH) T DBD [AR1,P#6.0]; //TRANFIERE A LOS 4 PRIMEROS BYTES DE INICIO DEL PASO ACTIVO NETWORK TITLE =ERROR RECETA; FUERA DE RANGO 1-20 EREC: NOP 0; //ERROR CALCULADO EN FC5 ETIQUETA RFP; ACTIVA DB110.DBX61.0 END_FUNCTION FUNCTION FC 12 : VOID TITLE =MODULO DE RESET VERSION : 0.1 VAR_TEMP TEMP0 : INT ; END_VAR BEGIN NETWORK TITLE =RESET SEGURIDAD INICIO AUF DB 100; U M 1.0; R M 22.0; NETWORK TITLE = L 0; T DBW 22; T MW 10; L 1; T #TEMP0; L P#30.0; //valor inicial puntero LAR1 ; //Carga en AR1 M001: L DB1.DBW 42; L #TEMP0; ==I ; AUF DB 100; SPB M002; //Salir del bucle tras ultimo paso L L#0; T DBD [AR1,P#0.0]; //reset T DBD [AR1,P#4.0]; T DBD [AR1,P#8.0]; T DBD [AR1,P#12.0]; T DBW [AR1,P#16.0]; TAR1 ; L P#42.0; //Offset siguiente paso +I ; LAR1 ; L #TEMP0; //Incrementa contador bucle L 1; +I ;

Page 49: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 49 de 130

T #TEMP0; SPA M001; M002: NOP 0; END_FUNCTION FUNCTION FC 100 : VOID TITLE =FC PARA CONVERSIÓN INT-S5T VERSION : 0.1 VAR_INPUT TENTRADA : INT ; //ENTRADA VALOR DE TIEMPO FORMATO INT END_VAR VAR_OUTPUT TSALIDA : S5TIME ; //SALIDA VALOR DE TIEMPO FORMATO S5T END_VAR VAR_TEMP VARAUXE : WORD ; //AUXILIAR ENTRADA WORD VARAUXS : WORD ; //AUXILIAR SALIDA WORD END_VAR BEGIN NETWORK TITLE =CONVERTIR VALOR DE ENTRADA A BCD L #TENTRADA; ITB ; T #VARAUXE; NOP 0; NETWORK TITLE =ASIGNAR BASE DE TIEMPO SEGUNDOS L #VARAUXE; L W#16#2000; OW ; T #VARAUXS; NOP 0; NETWORK TITLE =TRANSFERIR A LA SALIDA L #VARAUXS; T #TSALIDA; NOP 0; END_FUNCTION FUNCTION FC 102 : VOID TITLE = VERSION : 0.1 BEGIN NETWORK TITLE = U M 0.0; = E 1.3; END_FUNCTION FUNCTION FC 1 : VOID TITLE =FC PARA PREPARACIÓN DE SOLUCIONES DE CIP VERSION : 0.1 VAR_TEMP AuxAgua : BOOL ; //AUXILIAR AGUA PREPARACIÓN AuxSosa : BOOL ; //AUXILIAR SOSA AuxAcido : BOOL ; //AUXILIAR ACIDO AuxDesin : BOOL ; //AUXILIAR DESINFECTANTE AuxTenso : BOOL ; //AUXILIAR TENSOACTIVO ERR_SFC40 : INT ; //ERROR LLAMADA SFC40 ERR_SFC39 : INT ; //ERROR LLAMADA SFC39 PREP_PAR1 : INT ; //LITROS DE AGUA PREP_PAR2 : INT ; //TIEMPO BOMBA DE SOSA PREP_PAR3 : INT ; //TIEMPO BOMBA ACIDO PREP_PAR4 : INT ; //TIEMPO BOMBA DESINFECTANTE

Page 50: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 50 de 130

PREP_PAR5 : INT ; //TIMEPO BOMBA TENSOACTIVO AuxCmpAgua : DINT ; //AUXILIAR COMPARACION LLENADO AGUA END_VAR BEGIN NETWORK TITLE =RESET VOLUMEN U M 21.1; U M 21.7; U M 21.3; SPBN M200; L 0; T DB1.DBD 32; T DB1.DBD 24; T DB1.DBD 28; T MW 10; M200: NOP 0; NETWORK TITLE =ARRANCAR INTERRUPCIÓN CÍCLICA (OB35) U M 1.1; U M 21.1; U M 21.3; U M 21.7; SPBNB _001; CALL SFC 40 ( MODE := B#16#2, OB_NR := 35, RET_VAL := #ERR_SFC40); _001: NOP 0; NETWORK TITLE =INICIALIZAR REGISTRO DE DIRECCIONES (AR1) Y TRANSFERIR PARÁMETRO AUF DB 100; //ABRIR DB100 COMO DB GLOBAL U M 21.1; U M 21.3; //CONDICIONES DE EJECUCIÓN U M 21.7; SPBN M100; L DBW [AR1,P#20.0]; //LEER Y TRANSFERIR PARÁMETRO 1 T DB1.DBD 38; AUF DB 100; L DBW [AR1,P#22.0]; //LEER Y TRANSFERIR PARÁMETRO 2 T #PREP_PAR2; L DBW [AR1,P#24.0]; //LEER Y TRANSFERIR PARÁMETRO 3 T #PREP_PAR3; L DBW [AR1,P#26.0]; //LEER Y TRANSFERIR PARÁMETRO 4 T #PREP_PAR4; L DBW [AR1,P#28.0]; //LEER Y TRANSFERIR PARÁMETRO 5 T #PREP_PAR5; M100: NOP 0; NETWORK TITLE =CONVERTIR VALORES INT => S5T U M 21.1; U M 21.3; U M 21.7; = L 20.0; U L 20.0; SPBNB _002; CALL FC 100 ( TENTRADA := #PREP_PAR2, TSALIDA := DB1.DBW 4); _002: NOP 0; U L 20.0; SPBNB _003; CALL FC 100 ( TENTRADA := #PREP_PAR3, TSALIDA := DB1.DBW 6); _003: NOP 0; U L 20.0; SPBNB _004; CALL FC 100 ( TENTRADA := #PREP_PAR4,

Page 51: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 51 de 130

TSALIDA := DB1.DBW 8); _004: NOP 0; U L 20.0; SPBNB _005; CALL FC 100 ( TENTRADA := #PREP_PAR5, TSALIDA := DB1.DBW 10); _005: NOP 0; NETWORK TITLE =SI RECETA PARADA SE CARGA VALOR RESTANTE DEL TEMPORIZADOR U M 21.3; U M 20.5; = L 6.0; U L 6.0; SPBNB _007; L T 1; ITB ; L W#16#2000; OW ; T DB1.DBW 4; _007: NOP 0; U L 6.0; SPBNB _008; L T 2; ITB ; L W#16#2000; OW ; T DB1.DBW 6; _008: NOP 0; U L 6.0; SPBNB _009; L T 3; ITB ; L W#16#2000; OW ; T DB1.DBW 8; _009: NOP 0; U L 6.0; SPBNB _00a; L T 4; ITB ; L W#16#2000; OW ; T DB1.DBW 10; _00a: NOP 0; NETWORK TITLE =PASO DE NºREAL A ENTERO 32 BITS U M 1.1; SPBNB _006; L DB1.DBD 32; TRUNC ; T #AuxCmpAgua; _006: NOP 0; NETWORK TITLE = U A 3.6; SPBNB _013; CALL FC 102 ; _013: NOP 0; NETWORK TITLE =CONTAR VOLUMEN DE AGUA TANQUE DE PREPARACION UN A 3.6; //SI VÁLVULA CERRADA SALTA A M300 SPB M300; U E 1.3; FP M 6.2; SPBNB _00b; L MW 10; L 1; +I ; T MW 10; _00b: NOP 0; M300: NOP 0;

Page 52: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 52 de 130

NETWORK TITLE =VIGILANCIA LLENADO AGUA U M 21.1; U M 21.3; U( ; O( ; L MW 10; //COMPARA VOLUMEN CON CONSIGNA L DB1.DBD 38; >=D ; ) ; O M 15.0; //O SI RECETA SIN AGUA ) ; = M 15.0; NETWORK TITLE =BLOQUEO INTERRUPCIÓN CÍCLICA (OB35) U M 1.1; U M 21.3; U M 15.0; SPBNB _017; CALL SFC 39 ( MODE := B#16#2, OB_NR := 35, RET_VAL := #ERR_SFC39); _017: NOP 0; NETWORK TITLE =ORDEN ABRIR VÁLVULA DE AGUA (V1) U M 21.1; U M 21.3; UN M 15.0; = M 30.1; NETWORK TITLE =CONTROL TIEMPO BOMBA SOSA (T1) U M 21.1; U M 21.3; L DB1.DBW 4; SE T 1; U M 20.6; R T 1; NOP 0; NOP 0; NOP 0; NETWORK TITLE =COMPROBACION PASO CON ACIDO Y ACTIVAR ALARMA L DB1.DBW 6; L W#16#2000; >I ; = M 7.0; NETWORK TITLE =CONFIRMAR ACTIVACION BOMBA ACIDO U M 21.3; U( ; U DB110.DBX 51.0; FP M 6.3; O M 7.2; ) ; = M 7.2; NETWORK TITLE =ALARMA ACTIVAR BOMBA ACIDO U M 21.3; U M 7.0; UN M 7.2;

Page 53: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 53 de 130

= M 7.1; = DB110.DBX 35.1; NETWORK TITLE =CONTROL TIEMPO BOMBA ACIDO (T2) U M 21.1; U M 21.3; U( ; O M 7.0; ON M 7.0; ) ; L DB1.DBW 6; SE T 2; U M 20.6; R T 2; NOP 0; NOP 0; NOP 0; NETWORK TITLE =CONTROL TIEMPO BOMBA DESINFECTANTE (T3) U M 21.1; U M 21.3; L DB1.DBW 8; SE T 3; U M 20.6; R T 3; NOP 0; NOP 0; NOP 0; NETWORK TITLE =CONTROL TIEMPO BOMBA TENSOACTIVO (T4) U M 21.1; U M 21.3; L DB1.DBW 10; SE T 4; U M 20.6; R T 4; NOP 0; NOP 0; NOP 0; NETWORK TITLE =ORDEN ARRANCAR BOMBA SOSA U M 21.1; U M 21.3; UN T 1; = M 30.2; NETWORK TITLE =ORDEN ARRANCAR BOMBA ACIDO U M 21.1; U M 21.3; UN T 2; = M 30.3; NETWORK TITLE =ORDEN ARRANCAR BOMBA DESINFECTANTE U M 21.1; U M 21.3; UN T 3; = M 30.4; NETWORK TITLE =ORDEN ARRANCAR BOMBA TENSOACTIVO U M 21.1; U M 21.3; UN T 4; = M 30.5; NETWORK TITLE =CANCELAR BIT PRINCIPIO DE PASO U M 21.1; U M 21.3; R M 21.7;

Page 54: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 54 de 130

NETWORK TITLE =SI FIN PREPARACIÓN => CAMBIO DE PASO U M 21.1; U M 21.3; U M 15.0; U T 1; U T 2; U T 3; U T 4; SPBNB _01b; CALL FC 6 ( NPasos := DB100.DBB 2, PasoAct := DB100.DBW 22); _01b: NOP 0; END_FUNCTION FUNCTION FC 2 : VOID TITLE =FC PARA CALCULAR SEGURIDADES DE INICIO RECETA VERSION : 0.1 VAR_INPUT NTanque : BYTE ; //NÚMERO DE TANQUE A LIMPIAR NPasos : BYTE ; //NÚMERO DE PASOS EN RECETA END_VAR VAR_TEMP AuxCNP : BOOL ; //AUXILIAR COMPROBACIÓN Nº DE PASOS AuxCTC : BOOL ; //AUXILIAR COMPROBACIÓN TANQUE CONECTADO AuxTC : INT ; //AUXILIAR TANQUE CONECTADO AuxNTanque : INT ; //AUXILIAR Nº DE TANQUE AuxNPasos : INT ; //AUXILIAR Nº DE PASOS ASNT : INT ; //AUXILIAR SALIDA Nº TANQUE END_VAR BEGIN NETWORK TITLE =CONVERTIR DE BYTE A INT L #NTanque; T #AuxNTanque; L #NPasos; T #AuxNPasos; NETWORK TITLE =COMPROBAR QUE EL Nº DE PASOS RECETA ES >0 Y <=20 U( ; L #AuxNPasos; L 0; >I ; ) ; U( ; L #AuxNPasos; L DB1.DBW 42; <=I ; ) ; = #AuxCNP; NETWORK TITLE =DEFECTO Nº PASOS U M 22.1; U M 21.1; UN #AuxCNP; O ; U DB110.DBX 61.3; UN M 20.6; = DB110.DBX 61.3; NETWORK TITLE =RECETA TANQUES DE FERMENTACION U( ; L #AuxNTanque; L 1; >=I ; ) ; U( ;

Page 55: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 55 de 130

L #AuxNTanque; L 4; <=I ; ) ; = M 22.5; NETWORK TITLE =RECETA TANQUES APOLLO U( ; L #AuxNTanque; L 5; >=I ; ) ; U( ; L #AuxNTanque; L 6; <=I ; ) ; = M 22.6; NETWORK TITLE =ENMASCARAR BITS ENTRADA CODIFICACIÓN TANQUE L 0; //BORRAR BYTE CODIFICACION TANQUE T MB 25; U DB110.DBX 46.0; = E 3.4; = M 25.0; U DB110.DBX 46.1; //CAMBIAR BITS MAS SIGNIFICATIVOS = E 3.3; = M 25.1; U DB110.DBX 46.2; = E 3.2; = M 25.2; U DB110.DBX 46.3; = E 3.1; = M 25.3; U DB110.DBX 46.4; = E 3.0; = M 25.4; L MB 25; T #AuxTC; //PASAR A INT EL VALOR OBTENIDO NETWORK TITLE =COMPROBAR QUE NºTANQUE A LIMPIAR COINCIDA CON TANQUE CONECTADO L #AuxNTanque; L #AuxTC; ==I ; = #AuxCTC; NETWORK TITLE =DEFECTO TANQUE CONECTADO U M 22.1; U M 21.1; UN #AuxCTC; O ; U DB110.DBX 61.2; UN M 20.6; = DB110.DBX 61.2; NETWORK TITLE =ORDEN ABRIR VÁLVULAS SEGURIDAD INICIO FERMENTACIÓN U M 22.1; U M 21.1; U #AuxCNP; U #AuxCTC; = M 30.0; NETWORK TITLE =TEMPORIZADOR SEGURIDAD ARRANQUE RECETA U M 30.0; U( ; U M 22.5; U E 2.0; O ; U M 22.6;

Page 56: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 56 de 130

U E 4.0; ) ; L S5T#2S; SE T 0; NOP 0; NOP 0; NOP 0; NOP 0; NETWORK TITLE =INICIALIZAR AUXILIAR SALIDA CODIFICADA Nº DE TANQUE L 0; T #ASNT; NOP 0; NETWORK TITLE =CALCULAR CODIFICACION Nº TANQUE (INTERFASE SALIDA) U M 20.7; = L 10.0; U L 10.0; U( ; L #AuxNTanque; L 1; >=I ; ) ; U( ; L #AuxNTanque; L 8; <=I ; ) ; SPBNB _001; L #AuxNTanque; L 29; +I ; T #ASNT; _001: NOP 0; U L 10.0; U( ; L #AuxNTanque; L 9; >=I ; ) ; U( ; L #AuxNTanque; L 16; <=I ; ) ; SPBNB _002; L #AuxNTanque; L 31; +I ; T #ASNT; _002: NOP 0; U L 10.0; U( ; L #AuxNTanque; L 17; ==I ; ) ; SPBNB _003; L 38; T #ASNT; _003: NOP 0; U L 10.0; U( ; L #AuxNTanque; L 18; ==I ; ) ; SPBNB _004; L 48; T #ASNT; _004: NOP 0; NETWORK

Page 57: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 57 de 130

TITLE =CODIFICACION SALIDA BINARIA Nº TANQUE (BITS A12.4/A11.7--A11.3) L #ASNT; SLW 3; //DESPLAZAR BITS A POSICIONES 8-3 T MW 12; //TRANSFERIR A PALABRA AUXILIAR U M 13.3; = A 1.3; //BIT 0 CODIFICACION TANQUE U M 13.4; = A 1.4; //BIT 1 CODIFICACION TANQUE U M 13.5; = A 1.5; //BIT 2 CODIFICACION TANQUE U M 13.6; = A 1.6; //BIT 3 CODIFICACION TANQUE U M 13.7; = A 1.7; //BIT 4 CODIFICACION TANQUE U M 12.0; = A 2.4; //BIT 5 CODIFICACION TANQUE NETWORK TITLE =TEMPORIZADOR ESPERA CONFIRMACION Nº TANQUE U M 21.1; U M 22.1; L S5T#2S; SE T 12; NOP 0; NOP 0; NOP 0; NOP 0; NETWORK TITLE =ESPERANDO CONFIRMACION Nº TANQUE U M 21.1; U M 22.1; U( ; UN E 7.0; U T 12; ON T 12; ) ; = DB110.DBX 35.0; NETWORK TITLE =SI NO DETECTA FLUJO EN TRAS 5s => CAMBIA DE PASO U T 0; U T 12; U( ; O E 7.0; O M 1.0; ) ; U( ; U M 22.5; UN E 2.7; O ; U M 22.6; UN E 5.0; ) ; UN DB110.DBX 61.4; SPBNB _005; CALL FC 6 ( NPasos := DB100.DBB 2, PasoAct := DB100.DBW 22); _005: U BIE; S M 22.0; NETWORK TITLE =DEFECTO TANQUE NO VACÍO U M 22.1; U M 21.1; U T 0; U( ; U M 22.5; U E 2.7; O ; U M 22.6; U E 5.0;

Page 58: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 58 de 130

) ; O ; U DB110.DBX 61.4; UN M 20.6; = DB110.DBX 61.4; END_FUNCTION FUNCTION FC 3 : VOID TITLE =SEGURIDADES DE LA INSTALACIÓN VERSION : 0.1 BEGIN NETWORK TITLE =PARADA EMERGENCIA O DB110.DBX 54.0; O E 0.1; = M 20.0; NETWORK TITLE =INSTALACIÓN EN SERVICIO U( ; O E 1.1; O DB110.DBX 44.6; ) ; FP DB1.DBX 0.0; O ; U M 20.1; UN M 20.0; = M 20.1; NETWORK TITLE =INSTALACIÓN EN AUTOMÁTICO O E 1.2; O DB110.DBX 44.7; = M 20.2; NETWORK TITLE =AUTORIZACIÓN MOVIMIENTOS MANUALES U DB110.DBX 44.0; UN M 20.2; U M 20.1; = M 20.3; NETWORK TITLE =AUTORIZACIÓN MOVIMIENTOS AUTOMÁTICOS U M 20.2; U M 20.1; U M 20.7; UN M 20.5; = M 21.1; NETWORK TITLE =ORDEN ARRANCAR RECETA U DB110.DBX 44.1; U M 20.2; U M 20.1; = M 20.4; NETWORK TITLE =RECETA EN EJECUCIÓN U( ; O M 20.4; O ; U M 20.7; UN M 20.6; ) ; U M 20.2; = M 20.7; NETWORK TITLE =PARAR RECETA O DB110.DBX 44.2; O M 22.2; ON M 20.2;

Page 59: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 59 de 130

O M 22.4; = M 20.5; NETWORK TITLE =MEMORIA RECETA PARADA U M 20.7; U M 20.5; O ; U M 21.2; UN M 20.6; UN M 21.0; = M 21.2; NETWORK TITLE =RESET RECETA U DB110.DBX 44.1; FP M 6.0; U M 20.2; U M 21.0; O ; U DB110.DBX 44.3; U M 20.5; = M 20.6; NETWORK TITLE =FIN RECETA (RESET) U M 20.6; FP M 6.1; = L 0.0; U L 0.0; BLD 102; R M 21.0; U L 0.0; SPBNB _001; CALL FC 12 ; _001: NOP 0; END_FUNCTION FUNCTION FC 4 : VOID TITLE =FC PARA CALCULAR PALABRAS DE LA CABECERA DEL DB100 VERSION : 0.1 VAR_TEMP ERROR_HORA_INICIO : INT ; //VALOR DE RETORNO EN CASO DE ERROR AL LEER LA FECHA Y HORA INICIO ERROR_HORA_FIN : INT ; //VALOR DE RETORNO EN CASO DE ERROR AL LEER LA FECHA Y HORA FIN END_VAR BEGIN NETWORK TITLE =REGISTRAR FECHA Y HORA DE INICIO DE LA RECETA U M 20.4; FP DB1.DBX 0.1; SPBNB _001; CALL SFC 1 ( RET_VAL := #ERROR_HORA_INICIO, CDT := DB100.CABECERA.INICIO); _001: NOP 0; NETWORK TITLE =REGISTRAR FECHA Y HORA DEL FIN DE LA RECETA U M 21.0; FP DB1.DBX 0.2; SPBNB _002; CALL SFC 1 ( RET_VAL := #ERROR_HORA_FIN, CDT := DB100.CABECERA.FIN); _002: NOP 0; NETWORK TITLE =ESTADO DE LA RECETA =>INACTIVO U( ; U M 20.7;

Page 60: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 60 de 130

U M 20.5; O ; UN M 20.7; U( ; ON M 21.0; O M 20.6; ) ; ) ; SPBNB _003; L 0; T DB100.DBW 20; _003: NOP 0; NETWORK TITLE =ESTADO DE LA RECETA =>EN EJECUCIÓN U M 20.7; UN M 20.5; SPBNB _004; L 1; T DB100.DBW 20; _004: NOP 0; NETWORK TITLE =ESTADO DE LA RECETA =>TERMINADA U M 20.7; U M 21.0; SPBNB _005; L 2; T DB100.DBW 20; _005: NOP 0; NETWORK TITLE =COMPARACIÓN TIEMPO PASO CON VALOR MÁXIMO INT POSITIVO L DB100.DBW 24; L 32767; ==I ; SPB TSUP; NETWORK TITLE =CALCULO DEL TIEMPO DEL PASO ACTIVO U M 20.7; UN DB110.DBX 44.2; U M 22.0; UN M 21.0; U M 0.5; U DB1.DBX 56.0; SPBNB _006; L DB100.DBW 24; L 1; +I ; T DB100.DBW 24; _006: NOP 0; NETWORK TITLE =SEGEMENTO META DEL SALTO TSUP TSUP: NOP 0; END_FUNCTION FUNCTION FC 5 : VOID TITLE =MÓDULO QUE CALCULA EL TIPO DE PASO ACTIVO VERSION : 0.1 VAR_TEMP AuxCalc : INT ; //AUXILIAR CALCULOS AuxDefTipPaso : BOOL ; //AUXILIAR DEFECTO TIPO DE PASO END_VAR BEGIN NETWORK TITLE =INICIALIZACIÓN PUNTERO TIPO DE PASO ACTIVO L P#0.0; T MD 2; NOP 0;

Page 61: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 61 de 130

NETWORK TITLE =INICIALIZACIÓN BITS DE TIPO DE PASO DE LA RECETA U M 1.1; = M 21.3; = M 21.4; = M 21.5; = M 21.6; = M 22.1; NETWORK TITLE =VERIFICAR SI PASO ACTIVO ES DE INCIO (=0) L DB100.DBW 22; //CARGA PASO ACTIVO RECETA DE FERMENTACIÓN L 0; ==I ; = M 22.1; SPB FMOD; //SALTA A FIN MODULO NETWORK TITLE =COMPARAR PASO ACTIVO DENTRO DE RANGO 1-20 U( ; L DB100.DBW 22; L 1; >=I ; ) ; U( ; L DB100.DBW 22; L DB1.DBW 42; <=I ; ) ; SPBN RFP; NETWORK TITLE =CALCULO DIRECCIÓN PUNTERO U( ; L DB100.DBW 22; L 42; *I ; T #AuxCalc; UN OV; SAVE ; CLR ; U BIE; ) ; SPBNB _001; L #AuxCalc; L 14; -I ; T #AuxCalc; _001: NOP 0; NETWORK TITLE =PASO A FORMATO PUNTERO LA DIRECCIÓN OBTENIDA L #AuxCalc; SLW 3; T MD 2; LAR1 ; NETWORK TITLE =CONSULTA TIPO DE PASO ACTIVO PREPARACIÓN (PASO 1) AUF DB 100; //ABRIR DB_REC_FERM (DB100) L DBW [MD 2]; //CARGA VALOR TIPO DE PASO (1,2,3 O 4) L 1; ==I ; = M 21.3; = #AuxDefTipPaso; SPB TPC; //SALTO A TIPO DE PASO CALCULADO NETWORK TITLE =CONSULTA TIPO DE PASO ACTIVO ENVÍO (PASO 2) L DBW [MD 2]; L 2; ==I ; = M 21.4; = #AuxDefTipPaso; SPB TPC; //SALTO A TIPO DE PASO CALCULADO

Page 62: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 62 de 130

NETWORK TITLE =CONSULTA TIPO DE PASO ACTIVO RECIRCULACIÓN (PASO 3) L DBW [MD 2]; L 3; ==I ; = M 21.5; = #AuxDefTipPaso; SPB TPC; //SALTO A TIPO DE PASO CALCULADO NETWORK TITLE =CONSULTA TIPO DE PASO ACTIVO VACIADO (PASO 4) L DBW [MD 2]; L 4; ==I ; = M 21.6; = #AuxDefTipPaso; NETWORK TITLE =DEFECTO EN TIPO DE PASO (1<=TIP_PASO<=4) TPC: UN #AuxDefTipPaso; = DB110.DBX 61.1; NETWORK TITLE =FIN DE MÓDULO FMOD: U M 1.0; SAVE ; BEB ; NETWORK TITLE =RECETA FUERA DE PASO (EL VALOR PASO ACTIVO NO ESTA ENTRE 1-20) RFP: U M 1.0; = DB110.DBX 61.0; END_FUNCTION FUNCTION FC 7 : VOID TITLE =FC PARA ENVÍO DE LA SOLUCIÓN CIP VERSION : 0.1 BEGIN NETWORK TITLE =ORDEN ABRIR VÁLVULA PREPARACIÓN (V2) U M 21.1; U M 21.4; UN T 5; = M 30.6; NETWORK TITLE = CALL FC 100 ( TENTRADA := MW 10, TSALIDA := MW 16); NOP 0; NETWORK TITLE =CONTROL TANQUE CIP VACÍO U M 21.1; U M 21.4; U( ; O E 6.3; O M 1.0; ) ; L MW 16; SE T 5; NOP 0; NOP 0; NOP 0; NOP 0; NETWORK TITLE =ORDEN ABRIR VÁLVULA ASPIRACIÓN 1 E IMPULSIÓN 2 U M 21.1; U M 21.4; UN T 5;

Page 63: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 63 de 130

= M 30.7; = M 31.0; NETWORK TITLE =CONTROL TUBERÍA ASPIRACIÓN 1 VACÍA U M 21.1; U M 21.4; U( ; U M 22.5; UN E 2.7; O ; U M 22.6; UN E 5.0; U T 13; U M 1.1; ) ; U M 1.1; L S5T#5S; SE T 6; NOP 0; NOP 0; NOP 0; NOP 0; NETWORK TITLE =ORDEN ARRANCAR BOMBA ENVÍO CIP (B4) U M 21.1; U M 21.4; U M 30.6; U M 30.7; U M 31.0; = M 31.1; NETWORK TITLE =TEMPORIZADOR BOMBA ENVIO CIP U M 31.1; L S5T#4S; SE T 13; NOP 0; NOP 0; NOP 0; NOP 0; NETWORK TITLE =ORDEN ARRANCAR BOMBA CARRO MÓVIL (B5) U M 21.1; U M 21.4; U M 22.5; U( ; U M 30.6; U M 31.1; O M 31.2; ) ; U M 30.7; U M 31.0; U T 13; = M 31.2; NETWORK TITLE =ORDEN ARRANCAR BOMBA APOLLO U M 21.1; U M 21.4; U M 22.6; U( ; U M 30.6; U M 31.1; O M 32.1; ) ; U M 30.7; U M 31.0; U T 13; = M 32.1; NETWORK TITLE =CANCELAR BIT PRINCIPIO DE PASO U M 21.1;

Page 64: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 64 de 130

U M 21.4; R M 21.7; NETWORK TITLE =SI FIN ENVÍO => CAMBIO DE PASO U M 21.1; U M 21.4; U T 5; U( ; O T 6; O M 1.0; ) ; UN M 31.1; UN M 31.2; UN M 32.1; SPBNB _001; CALL FC 6 ( NPasos := DB100.DBB 2, PasoAct := DB100.DBW 22); _001: NOP 0; END_FUNCTION FUNCTION FC 8 : VOID TITLE =FC QUE CONTROLA LA RECIRCULACIÓN DE LA SOLUCIÓN CIP VERSION : 0.1 VAR_TEMP REC_PAR1 : INT ; //VARIABLE AUXILIAR PARA ALMACENAR PARÁMETRO 1 END_VAR BEGIN NETWORK TITLE =INICIALIZAR REGISTRO DE DIRECCIONES (AR1) Y TRANSFERIR PARÁMETRO AUF DB 100; //ABRIR DB100 U M 21.1; U M 21.5; //CONDICIONES DE EJECUCIÓN U M 21.7; SPBN M110; L DBW [AR1,P#20.0]; //LEER Y TRANSFERIR PARÁMETRO 1 T #REC_PAR1; M110: NOP 0; NETWORK TITLE =CONVERTIR VALOR PAR1 DE INT => S5T U M 21.1; U M 21.5; U M 21.7; SPBNB _001; CALL FC 100 ( TENTRADA := #REC_PAR1, TSALIDA := DB1.DBW 22); _001: NOP 0; NETWORK TITLE =SI RECETA PARADA SE CARGA VALOR RESTANTE DEL TEMPORIZADOR U M 21.5; U M 20.5; SPBNB _002; L T 7; ITB ; L W#16#2000; OW ; T DB1.DBW 22; _002: NOP 0; NETWORK TITLE =CONTROL TIEMPO RECIRCULACIÓN (T7) U M 21.1; U M 21.5; L DB1.DBW 22; SE T 7; NOP 0; NOP 0;

Page 65: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 65 de 130

NOP 0; NOP 0; NETWORK TITLE =ORDEN ABRIR VÁLVULAS RECIRCULACIÓN U M 21.1; U M 21.5; UN T 7; = M 31.3; = M 31.4; NETWORK TITLE =ORDEN ARRANCAR BOMBA CARRO MÓVIL U M 21.1; U M 21.5; U M 22.5; UN T 7; U M 31.3; U M 31.4; = M 31.5; NETWORK TITLE =ORDEN ARRANCAR BOMBA APOLLO U M 21.1; U M 21.5; U M 22.6; UN T 7; U M 31.3; U M 31.4; = M 32.2; NETWORK TITLE =CANCELAR BIT PRINCIPIO DE PASO U M 21.1; U M 21.5; R M 21.7; NETWORK TITLE =SI FIN RECIRCULACIÓN => CAMBIO DE PASO U M 21.1; U M 21.5; U T 7; UN M 31.5; UN M 32.2; SPBNB _003; CALL FC 6 ( NPasos := DB100.DBB 2, PasoAct := DB100.DBW 22); _003: NOP 0; END_FUNCTION FUNCTION FC 9 : VOID TITLE =MODULO QUE GESTIONA EL VACIADO DE LOS TANQUES VERSION : 0.1 BEGIN NETWORK TITLE =ORDEN ABRIR VALVULAS DE VACIADO, ASPIRACION(V3,V6) U M 21.1; U M 21.6; UN T 8; = M 31.6; = M 31.7; NETWORK TITLE =CONTROL TIEMPO VACIADO (T8) U M 21.1; U M 21.6; U( ; U M 22.5; U( ; ON E 2.7; O M 1.0; ) ;

Page 66: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 66 de 130

O ; U M 22.6; U( ; ON E 5.0; O M 1.0; ) ; ) ; L S5T#3S; SE T 8; NOP 0; NOP 0; NOP 0; NOP 0; NETWORK TITLE =ORDEN ARRANCAR BOMBA CARRO MOVIL (B5) U M 21.1; U M 21.6; U M 22.5; U M 31.6; U M 31.7; = M 32.0; NETWORK TITLE =ORDEN ARRANCAR BOMBA APOLLO U M 21.1; U M 21.6; U M 22.6; U M 31.6; U M 31.7; = M 32.3; NETWORK TITLE =CANCELAR BIT PRINCIPIO DE PASO U M 21.1; U M 21.6; R M 21.7; NETWORK TITLE =SI FIN VACIADO => CAMBIO DE PASO U M 21.1; U M 21.6; U T 8; UN M 32.0; UN M 32.3; SPBNB _001; CALL FC 6 ( NPasos := DB100.DBB 2, PasoAct := DB100.DBW 22); _001: NOP 0; END_FUNCTION FUNCTION FC 10 : VOID TITLE =MODULO DE ACTIVACION DE SALIDAS VERSION : 0.1 BEGIN NETWORK TITLE =PILOTO PUESTA EN SERVICIO U M 20.1; = A 0.0; NETWORK TITLE =BALIZA VERDE U( ; O M 21.1; O ; U M 20.7; U M 20.5; U M 0.3; ) ; UN M 22.3; = A 0.1; NETWORK

Page 67: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 67 de 130

TITLE =BALIZA ROJA U M 20.7; U M 20.5; UN M 22.3; O ; U M 22.3; U M 0.3; = A 0.2; NETWORK TITLE =SEÑAL SONORA U M 22.4; U M 0.5; U M 1.1; O ; U M 7.1; U M 0.7; = A 0.3; NETWORK TITLE =ABRIR VALVULA DE AGUA (V1) U M 21.1; U M 21.3; U M 30.1; O ; U M 20.3; U DB110.DBX 48.1; UN DB110.DBX 61.5; O M 213.6; = A 3.6; NETWORK TITLE =ABRIR VALVULA SALIDA PREPARACION (V2) U M 21.1; U M 21.4; U M 30.6; O ; U M 20.3; U DB110.DBX 48.6; UN DB110.DBX 61.5; O M 213.7; = A 3.7; NETWORK TITLE =ABRIR VALVULA ASPIRACION 2 CARRO MOVIL (V2) U M 21.1; U M 22.5; U M 21.4; U M 30.7; O ; U M 20.3; U DB110.DBX 48.0; UN DB110.DBX 61.5; = A 2.1; NETWORK TITLE =ABRIR VALVULA ASPIRACION 1 CARRO MOVIL (V1) U M 21.1; U M 22.5; U( ; U M 22.1; U M 30.0; O ; U M 21.5; U M 31.3; O ; U M 21.6; U M 31.6; ) ; O ; U M 20.3; U DB110.DBX 48.7; UN DB110.DBX 61.5; = A 2.0; NETWORK

Page 68: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 68 de 130

TITLE =ABRIR VALVULA IMPULSION 2 CARRO MOVIL (V4) U M 21.1; U M 22.5; U M 21.6; U M 31.7; O ; U M 20.3; U DB110.DBX 49.0; UN DB110.DBX 61.5; = A 2.3; NETWORK TITLE =ABRIR VALVULA IMPULSION 1 CARRO MOVIL (V3) U M 21.1; U M 22.5; U( ; U M 21.4; U M 31.0; O ; U M 21.5; U M 31.4; ) ; O ; U M 20.3; U DB110.DBX 49.3; UN DB110.DBX 61.5; = A 2.2; NETWORK TITLE =ABRIR VALVULA ASPIRACION 1 APOLLO U M 21.1; U M 22.6; U M 21.4; U M 30.7; O ; U M 20.3; U DB110.DBX 49.4; UN DB110.DBX 61.5; O M 213.0; = A 3.1; NETWORK TITLE =ABRIR VALVULA ASPIRACION 2 APOLLO U M 21.1; U M 22.6; U( ; U M 22.1; U M 30.0; O ; U M 21.5; U M 31.3; O ; U M 21.6; U M 31.6; ) ; O ; U M 20.3; U DB110.DBX 49.5; UN DB110.DBX 61.5; O M 213.1; = A 3.0; NETWORK TITLE =ABRIR VALVULA IMPULSION 2 APOLLO U M 21.1; U M 22.6; U M 21.6; U M 31.7; O ; U M 20.3; U DB110.DBX 49.6; UN DB110.DBX 61.5; O M 213.2; = A 3.3; NETWORK

Page 69: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 69 de 130

TITLE =ABRIR VALVULA IMPULSION 1 APOLLO U M 21.1; U M 22.6; U( ; U M 21.4; U M 31.0; O ; U M 21.5; U M 31.3; ) ; O ; U M 20.3; U DB110.DBX 49.7; UN DB110.DBX 61.5; O M 213.3; = A 3.2; NETWORK TITLE =ARRANCAR BOMBA DE SOSA (B1) U M 21.1; U M 21.3; U M 30.2; O ; U M 20.3; U DB110.DBX 48.2; UN DB110.DBX 61.5; O M 210.6; = A 0.6; NETWORK TITLE =ARRANCAR BOMBA DE ACIDO (B2) U M 21.1; U M 21.3; U M 30.3; O ; U M 20.3; U DB110.DBX 48.3; UN DB110.DBX 61.5; O M 210.7; = A 0.7; NETWORK TITLE =ARRANCAR BOMBA DE DESINFECTANTE (B3) U M 21.1; U M 21.3; U M 30.4; O ; U M 20.3; U DB110.DBX 48.4; UN DB110.DBX 61.5; O M 211.1; = A 1.1; NETWORK TITLE =ARRANCAR BOMBA DE TENSOACTIVO (B6) U M 21.1; U M 21.3; U M 30.5; O ; U M 20.3; U DB110.DBX 48.5; UN DB110.DBX 61.5; O M 211.0; = A 1.0; NETWORK TITLE =ARRANCAR BOMBA ENVIO CIP (B4) U M 21.1; U M 21.4; U M 31.1; O ; U M 20.3; U DB110.DBX 49.1; UN DB110.DBX 61.5; O M 210.4;

Page 70: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 70 de 130

= A 0.4; NETWORK TITLE =ARRANCAR BOMBA CARRO MOVIL (B5) U M 21.1; U M 22.5; U( ; U M 21.4; U M 31.2; O ; U M 21.5; U M 31.5; O ; U M 21.6; U M 32.0; ) ; O ; U M 20.3; U DB110.DBX 49.2; UN DB110.DBX 61.5; = A 1.2; NETWORK TITLE =ARRANCAR BOMBA APOLLO U M 21.1; U M 22.6; U( ; U M 21.4; U M 32.1; O ; U M 21.5; U M 32.2; O ; U M 21.6; U M 32.3; ) ; O ; U M 20.3; U DB110.DBX 50.0; UN DB110.DBX 61.5; O M 210.5; = A 0.5; NETWORK TITLE =SOLICITUD ARRANCAR VALVULA DE CARBONICO U M 21.1; UN M 21.0; U M 22.0; = A 2.7; END_FUNCTION FUNCTION FC 11 : VOID TITLE =MODULO QUE COPIA EL VALOR DE E/S EN DB110 VERSION : 0.1 VAR_TEMP Error_Fecha_hora : INT ; Fecha_hora : DATE_AND_TIME ; Fecha : DATE ; Hora : TIME_OF_DAY ; END_VAR BEGIN NETWORK TITLE =ABRIR DB110 AUF DB 110; NETWORK TITLE =TRANSFERENCIA DE VALORES EB0,EB1,EB2 Y EB3 L ED 0; T DBD 0; NOP 0; NETWORK

Page 71: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 71 de 130

TITLE =TRANSFERENCIA DE VALORES EB4,EB5,EB6 Y EB7 L ED 4; T DBD 4; NOP 0; NETWORK TITLE =TRANSFERENCIA DE VALORES EB8 Y EB9 L EW 8; T DBW 8; NOP 0; NETWORK TITLE =TRANSFERENCIA DE VALORES AB10,AB11,AB12 Y AB13 L AD 0; T DBD 10; NOP 0; NETWORK TITLE =TRANSFERENCIA DE VALORES AB14 Y AB15 L AW 4; T DBW 14; NOP 0; NETWORK TITLE =TRANSFERENCIA DE VALORES EW256 Y EW258 // L PEW 256 // T DBW 16 // L PEW 258 // T DBW 18 // NOP 0 NETWORK TITLE =COMUNICACAION AUTORIZACION MOVIMIENTOS AUTOMATICOS U M 21.1; = DB110.DBX 34.0; NETWORK TITLE =COMUNICACAION AUTORIZACION MOVIMIENTOS MANUALES U M 20.3; = DB110.DBX 34.1; NETWORK TITLE =COMUNICACION RECETA EN EJECUCION U M 20.7; = DB110.DBX 34.2; NETWORK TITLE =COMUNICACION RECETA DETENIDA U M 20.5; = DB110.DBX 34.3; NETWORK TITLE =COMUNICACION FIN RECETA U M 21.0; = DB110.DBX 34.4; NETWORK TITLE =COMUNICACION INSTALACION EN SERVICIO U M 20.1; = DB110.DBX 34.5; NETWORK TITLE =TRANSFERIR NUMERO DE LA RECETA L DB100.DBW 0; T DB110.DBW 90; NOP 0; NETWORK TITLE =TRANFERIR NUMERO DE TANQUE L DB100.DBB 3; T DB110.DBW 92; NOP 0; NETWORK TITLE =TRANSFERIR ESTADO RECETA

Page 72: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 72 de 130

L DB100.DBW 20; T DB110.DBW 94; NOP 0; NETWORK TITLE =TRANSFERIR PASO ACTUAL L DB100.DBW 22; T DB110.DBW 96; NOP 0; NETWORK TITLE =TRANSFERIR TIEMPO PASO ACTUAL L DB100.DBW 24; T DB110.DBW 98; NOP 0; NETWORK TITLE =TRANSFERIR VOLUMEN AGUA TANQUE DE PREPARACION L MW 10; T DB110.DBW 100; NOP 0; NETWORK TITLE =TRANSFERIR TEMPORIZADOR SOSA L T 1; T DB110.DBW 102; NOP 0; NETWORK TITLE =TRANSFERIR TEMPORIZADOR ACIDO L T 2; T DB110.DBW 104; NOP 0; NETWORK TITLE =TRANSFERIR TEMPORIZADOR TENSOACTIVO L T 4; T DB110.DBW 106; NOP 0; NETWORK TITLE =TRANSFERIR TEMPORIZADOR DESINFECTANTE L T 3; T DB110.DBW 108; NOP 0; NETWORK TITLE =REGISTRAR FECHA Y HORA DE INICIO DE LA RECETA U DB110.DBX 35.7; SPBNB _001; CALL SFC 1 ( RET_VAL := #Error_Fecha_hora, CDT := #Fecha_hora); _001: NOP 0; NETWORK TITLE = CALL FC 150 ( IN := #Fecha_hora, RET_VAL := #Fecha); NOP 0; NETWORK TITLE = L #Fecha; T MW 50; NOP 0; NETWORK TITLE = CALL FC 151 ( IN := #Fecha_hora, RET_VAL := #Hora); NOP 0; NETWORK

Page 73: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 73 de 130

TITLE = L #Hora; T MD 52; NOP 0; NETWORK TITLE = CALL FC 40 ( IN := MD 52, RET_VAL := MW 56); NOP 0; NETWORK TITLE = END_FUNCTION FUNCTION FC 50 : VOID TITLE =FC PARA GESTION DE DEFECTOS VERSION : 0.1 VAR_TEMP AuxDefCarro : BOOL ; //AUXILIAR DEFECTOS CARRO MOVIL AuxDefApollo : BOOL ; //AUXLIAR DEFECTOS APOLLO END_VAR BEGIN NETWORK TITLE =SETA EMERGENCIA PULSADA O E 0.0; O DB110.DBX 45.0; = DB110.DBX 54.0; NETWORK TITLE =DEFECTO FUENTE DE ALIMENTACION U E 0.1; = DB110.DBX 54.1; NETWORK TITLE =DEFECTO MAGNETOTERMICO BOMBA DE ENVIO U E 0.2; = DB110.DBX 54.2; NETWORK TITLE =DEFECTO MAGNETOTERMICO BOMBA APOLLO U E 0.3; = DB110.DBX 54.3; NETWORK TITLE =DEFECTO MAGNETOTERMICO BOMBA SOSA U E 0.5; = DB110.DBX 54.5; NETWORK TITLE =DEFECTO MAGNETOTERMICO BOMBA ACIDO U E 0.6; = DB110.DBX 54.6; NETWORK TITLE =DEFECTO MAGNETOTERMICO BOMBA TENSOACTIVO U E 0.7; = DB110.DBX 54.7; NETWORK TITLE =DEFECTO MAGNETOTERMICO BOMBA DESINFECTANTE U E 1.0; = DB110.DBX 55.0; NETWORK TITLE =DEFECTO MANIOBRA VALVULA DE AGUA U( ; U A 3.6; UN E 6.0; O ;

Page 74: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 74 de 130

UN A 3.6; U E 6.0; ) ; L S5T#5S; SE T 100; NOP 0; NOP 0; NOP 0; U T 100; S DB110.DBX 58.0; NETWORK TITLE =CONTROL MANIOBRA VALVULA SALIDA TANQUE DE PREPARACION U( ; U A 3.7; UN E 6.2; O ; UN A 3.7; U E 6.2; ) ; L DB1.DBW 36; SE T 105; NOP 0; NOP 0; NOP 0; U T 105; S DB110.DBX 58.5; NETWORK TITLE =CONTROL MANIOBRA VALVULA ASPIRACION 1 CARRO MOVIL U( ; U A 2.0; UN E 2.0; O ; UN A 2.0; U E 2.0; ) ; L DB1.DBW 36; SE T 106; NOP 0; NOP 0; NOP 0; U T 106; S DB110.DBX 58.6; NETWORK TITLE =CONTROL MANIOBRA VALVULA ASPIRACION 2 CARRO MOVIL U( ; U A 2.1; UN E 2.1; O ; UN A 2.1; U E 2.1; ) ; L DB1.DBW 36; SE T 9; NOP 0; NOP 0; NOP 0; U T 9; S DB110.DBX 59.2; NETWORK TITLE =CONTROL MANIOBRA VALVULA IMPULSION 1 CARRO MOVIL U( ; U A 2.2; UN E 2.2; O ; UN A 2.2; U E 2.2; ) ; L DB1.DBW 36; SE T 10; NOP 0; NOP 0; NOP 0;

Page 75: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 75 de 130

U T 10; S DB110.DBX 59.3; NETWORK TITLE =CONTROL MANIOBRA VALVULA IMPULSION 2 CARRO MOVIL U( ; U A 2.3; UN E 2.3; O ; UN A 2.3; U E 2.3; ) ; L DB1.DBW 36; SE T 107; NOP 0; NOP 0; NOP 0; U T 107; S DB110.DBX 58.7; NETWORK TITLE =CONTROL MANIOBRA VALVULA ASPIRACION 1 APOLLO U( ; U A 3.0; UN E 4.0; O ; UN A 3.0; U E 4.0; ) ; L DB1.DBW 36; SE T 110; NOP 0; NOP 0; NOP 0; U T 110; S DB110.DBX 59.4; NETWORK TITLE =CONTROL MANIOBRA VALVULA ASPIRACION 2 APOLLO U( ; U A 3.1; UN E 4.1; O ; UN A 3.1; U E 4.1; ) ; L DB1.DBW 36; SE T 111; NOP 0; NOP 0; NOP 0; U T 111; S DB110.DBX 59.5; NETWORK TITLE =CONTROL MANIOBRA VALVULA IMPULSION 1 APOLLO U( ; U A 3.2; UN E 4.3; O ; UN A 3.2; U E 4.3; ) ; L DB1.DBW 36; SE T 112; NOP 0; NOP 0; NOP 0; U T 112; S DB110.DBX 59.6; NETWORK TITLE =CONTROL MANIOBRA VALVULA IMPULSION 2 APOLLO U( ; U A 3.3; UN E 4.5;

Page 76: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 76 de 130

O ; UN A 3.3; U E 4.5; ) ; L DB1.DBW 36; SE T 113; NOP 0; NOP 0; NOP 0; U T 113; S DB110.DBX 59.7; NETWORK TITLE =CONTROL MANIOBRA BOMBA DE SOSA U( ; U A 0.6; UN A 0.6; O ; UN A 0.6; U A 0.6; ) ; L DB1.DBW 36; SE T 101; NOP 0; NOP 0; NOP 0; U T 101; S DB110.DBX 58.1; NETWORK TITLE =CONTROL MANIOBRA BOMBA DE ACIDO U( ; U A 0.7; UN A 0.7; O ; UN A 0.7; U A 0.7; ) ; L DB1.DBW 36; SE T 102; NOP 0; NOP 0; NOP 0; U T 102; S DB110.DBX 58.2; NETWORK TITLE =CONTROL MANIOBRA BOMBA DE DESINFECTANTE U( ; U A 1.1; UN A 1.1; O ; UN A 1.1; U A 1.1; ) ; L DB1.DBW 36; SE T 103; NOP 0; NOP 0; NOP 0; U T 103; S DB110.DBX 58.3; NETWORK TITLE =CONTROL MANIOBRA BOMBA DE TENSOACTIVO U( ; U A 1.0; UN A 1.0; O ; UN A 1.0; U A 1.0; ) ; L DB1.DBW 36; SE T 104; NOP 0; NOP 0;

Page 77: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 77 de 130

NOP 0; U T 104; S DB110.DBX 58.4; NETWORK TITLE =CONTROL MANIOBRA BOMBA ENVÍO CIP U( ; U A 0.4; UN A 0.4; O ; UN A 0.4; U A 0.4; ) ; L DB1.DBW 36; SE T 108; NOP 0; NOP 0; NOP 0; U T 108; S DB110.DBX 59.0; NETWORK TITLE =CONTROL MANIOBRA BOMBA CARRO MOVIL U( ; U A 1.2; UN E 2.5; O ; UN A 1.2; U E 2.5; ) ; L DB1.DBW 36; SE T 109; NOP 0; NOP 0; NOP 0; U T 109; S DB110.DBX 59.1; NETWORK TITLE =CONTROL MANIOBRA BOMBA APOLLO U( ; U A 0.5; UN E 4.7; O ; UN A 0.5; U E 4.7; ) ; L DB1.DBW 36; SE T 114; NOP 0; NOP 0; NOP 0; U T 114; S DB110.DBX 60.0; NETWORK TITLE =DEFECTO COMUNICACION PLC <=> PC UN DB110.DBX 44.5; U M 1.1; L S5T#10S; SE T 11; NOP 0; NOP 0; NOP 0; U T 11; S DB110.DBX 61.5; NETWORK TITLE =PARADA RECETA POR DEFECTO INSTALACION O DB110.DBX 54.0; O DB110.DBX 54.1; O DB110.DBX 54.2; O DB110.DBX 54.3; O DB110.DBX 54.5; O DB110.DBX 54.6; O DB110.DBX 54.7;

Page 78: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 78 de 130

O DB110.DBX 55.0; O ; U M 22.4; UN DB110.DBX 44.4; UN E 1.1; = M 22.4; NETWORK TITLE =AUXILIAR DEFECTO MANIOBRA CARRO MOVIL O DB110.DBX 58.6; O DB110.DBX 59.2; O DB110.DBX 59.3; O DB110.DBX 58.7; O DB110.DBX 59.1; = #AuxDefCarro; NETWORK TITLE =AUXILIAR DEFECTO MANIOBRA APOLLO O DB110.DBX 59.4; O DB110.DBX 59.5; O DB110.DBX 59.6; O DB110.DBX 59.7; O DB110.DBX 60.0; = #AuxDefApollo; NETWORK TITLE =PARADA RECETA POR DEFECTO MANIOBRA O DB110.DBX 58.0; O DB110.DBX 58.1; O DB110.DBX 58.2; O DB110.DBX 58.3; O DB110.DBX 58.4; O DB110.DBX 58.5; O DB110.DBX 59.0; O #AuxDefCarro; O #AuxDefApollo; O DB110.DBX 56.0; O ; U M 22.2; UN DB110.DBX 44.4; UN E 1.1; = M 22.2; NETWORK TITLE =RESET DEFECTOS U M 20.5; U( ; O DB110.DBX 44.4; O E 1.1; ) ; = L 1.0; U L 1.0; SPBNB _001; L DW#16#0; T DB110.DBD 54; _001: NOP 0; U L 1.0; SPBNB _002; L DW#16#0; T DB110.DBD 58; _002: NOP 0; U L 1.0; SPBNB _003; L W#16#0; T DB110.DBW 62; _003: NOP 0; NETWORK TITLE =CONFIRMACION RESET U DB110.DBX 44.4; = DB110.DBX 35.3; NETWORK TITLE =ALGUN DEFECTO ACTIVO O( ; L DB110.DBD 54; //1ªDOBLE PALABRA DE DEFECTOS

Page 79: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 79 de 130

L DW#16#0; <>D ; ) ; O( ; L DB110.DBD 58; //2ªDOBLE PALABRA DE DEFECTOS L DW#16#0; <>D ; ) ; O( ; L DB110.DBW 62; //3 PALABRA DE DEFECTOS L W#16#0; <>I ; ) ; = M 22.3; = DB110.DBX 34.6; END_FUNCTION FUNCTION FC 101 : VOID TITLE =FC para configuración VERSION : 0.1 BEGIN NETWORK TITLE =BIT SIEMPRE A CERO U E 0.0; UN E 0.0; = M 1.1; NETWORK TITLE =BIT SIEMPRE A UNO O E 0.0; ON E 0.0; = M 1.0; NETWORK TITLE =CARGAR VALOR PARA CONSTANTE DE TIEMPO PARA DEFECTO L S5T#3S; T DB1.DBW 36; NOP 0; NETWORK TITLE =CARGAR VALOR PARA MAXIMO NUMERO DE PASOS L 152; T DB1.DBW 42; NOP 0; NETWORK TITLE =FLANCO POSITIVO BIT 1 SEGUNDO U M 0.5; FP DB1.DBX 0.3; = DB1.DBX 56.0; END_FUNCTION FUNCTION FC 104 : VOID TITLE = VERSION : 0.1 BEGIN NETWORK TITLE = U A 3.6; = E 6.0; NETWORK TITLE = U A 2.0; = E 2.0; NETWORK TITLE = U A 2.1;

Page 80: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 80 de 130

= E 2.1; NETWORK TITLE = U A 2.2; = E 2.2; NETWORK TITLE = U A 2.3; = E 2.3; NETWORK TITLE = U A 2.4; = E 2.4; NETWORK TITLE = U A 1.2; = E 2.5; NETWORK TITLE = U A 0.4; U A 3.7; = E 6.3; NETWORK TITLE = U A 0.5; = E 5.0; NETWORK TITLE = U A 1.2; = E 2.7; NETWORK TITLE =VALOR A RESTAR AL VOLUMEN DE AGUA TANQUE PREPARACION POR SEGUNDO U M 21.1; U M 21.4; FP DB1.DBX 52.0; SPBNB _001; L MW 10; L 20; /I ; T DB1.DBW 54; _001: NOP 0; NETWORK TITLE =ACTUALIZAR VALOR VOLUMEN DE AGUA TANQUE DE PREPARACION U M 1.1; U M 21.1; U M 21.4; = L 0.0; U L 0.0; UN T 5; U M 0.3; U( ; L MW 10; L DB1.DBW 54; >=I ; ) ; U DB1.DBX 56.0; SPBNB _002; L MW 10; L DB1.DBW 54; -I ; T MW 10; _002: NOP 0; U L 0.0; U T 5; SPBNB _003; L 0; T MW 10;

Page 81: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 81 de 130

_003: NOP 0; NETWORK TITLE = U A 3.0; = E 4.0; NETWORK TITLE = U A 3.1; = E 4.1; NETWORK TITLE = U A 3.2; = E 4.3; NETWORK TITLE = U A 3.3; = E 4.5; NETWORK TITLE = U A 0.5; = E 4.7; NETWORK TITLE = U A 3.7; = E 6.2; END_FUNCTION FUNCTION FC 105 : VOID TITLE = VERSION : 0.1 BEGIN NETWORK TITLE = U M 1.1; = E 6.0; END_FUNCTION ORGANIZATION_BLOCK OB 1 TITLE =PROGRAMA CÍCLICO PRINCIPAL VERSION : 0.1 VAR_TEMP OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1) OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1) OB1_PRIORITY : BYTE ; //Priority of OB Execution OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1) OB1_RESERVED_1 : BYTE ; //Reserved for system OB1_RESERVED_2 : BYTE ; //Reserved for system OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds) OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds) OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds) OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started END_VAR BEGIN NETWORK TITLE = CALL FC 104 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE CONFIGURACION (FC101) CALL FC 101 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE ORGANIZACION DEL PROGRAMA (FC3)

Page 82: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 82 de 130

CALL FC 3 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE CALCULO DEL TIPO DE PASO ACTUAL (FC5) CALL FC 5 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO SEGURIDADES INICIO RECETA (FC2) CALL FC 2 ( NTanque := DB100.DBB 3, NPasos := DB100.DBB 2); NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE PREPARACION (FC1) CALL FC 1 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE ENVIO (FC7) CALL FC 7 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE RECIRCULACION (FC8) CALL FC 8 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE VACIADO (FC9) CALL FC 9 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE ACTIVACION DE SALIDAS (FC10) CALL FC 10 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE CALCULO DE DEFECTOS (FC50) CALL FC 50 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE ACTULIZACION DE VALORES DEL DB100 (FC4) CALL FC 4 ; NOP 0; NETWORK TITLE =LLAMADA AL MODULO DE ACTULIZACION DE E/S DEL DB110 (FC11) CALL FC 11 ; NOP 0; NETWORK TITLE = CALL FC 105 ; NOP 0; END_ORGANIZATION_BLOCK ORGANIZATION_BLOCK OB 35 TITLE =INTERRUPCIÓN CÍCLICA VERSION : 0.1 VAR_TEMP OB35_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1) OB35_STRT_INF : BYTE ; //16#36 (OB 35 has started) OB35_PRIORITY : BYTE ; //Priority of OB Execution OB35_OB_NUMBR : BYTE ; //35 (Organization block 35, OB35) OB35_RESERVED_1 : BYTE ; //Reserved for system OB35_RESERVED_2 : BYTE ; //Reserved for system OB35_PHASE_OFFSET : WORD ; //Phase offset (msec)

Page 83: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 83 de 130

OB35_RESERVED_3 : INT ; //Reserved for system OB35_EXC_FREQ : INT ; //Frequency of execution (msec) OB35_DATE_TIME : DATE_AND_TIME ; //Date and time OB35 started END_VAR BEGIN NETWORK TITLE =TRANSFORMACIÓN VALOR ANALÓGICO => CAUDAL UN A 3.6; //SI VÁLVULA CERRADA SALTA A FIN SPB FIN; L 0; //SI ENTRADA ES CERO CARGA CERO L MW 254; // L PEW 256 //LEE ENTRADA ANALÓGICA ==I ; SPB M001; L MW 254; L 1; *I ; L 16384; /R ; T DB1.DBD 24; SPA M002; M001: L 0; T DB1.DBD 24; M002: NOP 0; //META DE SALTO NETWORK TITLE =CALCULO DEL VOLUMEN = T(OB35)*(CAUDALK+CAUDALK1)/2 L DB1.DBD 24; L DB1.DBD 28; +R ; L 2.000000e+000; //DIVIDE POR 2 /R ; L 2.000000e-002; //MULTIPLICA POR TIEMPO DE INTEGRACIÓN *R ; L DB1.DBD 32; //TRANSFIERE A VOLUMEN +R ; T DB1.DBD 32; NETWORK TITLE =ACTUALIZAR VALORES (CAUDALK1 = CAUDALK) L DB1.DBD 24; T DB1.DBD 28; NOP 0; NETWORK TITLE =FIN MÓDULO FIN: NOP 0; END_ORGANIZATION_BLOCK ORGANIZATION_BLOCK OB 82 TITLE =DEFECTOS MODULOS DE E/S VERSION : 0.1 VAR_TEMP OB82_EV_CLASS : BYTE ; //16#39, Event class 3, Entering event state, Internal fault event OB82_FLT_ID : BYTE ; //16#XX, Fault identifcation code OB82_PRIORITY : BYTE ; //Priority of OB Execution OB82_OB_NUMBR : BYTE ; //82 (Organization block 82, OB82) OB82_RESERVED_1 : BYTE ; //Reserved for system OB82_IO_FLAG : BYTE ; //Input (01010100), Output (01010101) OB82_MDL_ADDR : INT ; //Base address of module with fault OB82_MDL_DEFECT : BOOL ; //Module defective OB82_INT_FAULT : BOOL ; //Internal fault OB82_EXT_FAULT : BOOL ; //External fault OB82_PNT_INFO : BOOL ; //Point information OB82_EXT_VOLTAGE : BOOL ; //External voltage low OB82_FLD_CONNCTR : BOOL ; //Field wiring connector missing OB82_NO_CONFIG : BOOL ; //Module has no configuration data OB82_CONFIG_ERR : BOOL ; //Module has configuration error OB82_MDL_TYPE : BYTE ; //Type of module OB82_SUB_NDL_ERR : BOOL ; //Sub-Module is missing or has error OB82_COMM_FAULT : BOOL ; //Communication fault

Page 84: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 84 de 130

OB82_MDL_STOP : BOOL ; //Module is stopped OB82_WTCH_DOG_FLT : BOOL ; //Watch dog timer stopped module OB82_INT_PS_FLT : BOOL ; //Internal power supply fault OB82_PRIM_BATT_FLT : BOOL ; //Primary battery is in fault OB82_BCKUP_BATT_FLT : BOOL ; //Backup battery is in fault OB82_RESERVED_2 : BOOL ; //Reserved for system OB82_RACK_FLT : BOOL ; //Rack fault, only for bus interface module OB82_PROC_FLT : BOOL ; //Processor fault OB82_EPROM_FLT : BOOL ; //EPROM fault OB82_RAM_FLT : BOOL ; //RAM fault OB82_ADU_FLT : BOOL ; //ADU fault OB82_FUSE_FLT : BOOL ; //Fuse fault OB82_HW_INTR_FLT : BOOL ; //Hardware interupt input in fault OB82_RESERVED_3 : BOOL ; //Reserved for system OB82_DATE_TIME : DATE_AND_TIME ; //Date and time OB82 started END_VAR BEGIN NETWORK TITLE =DEFECTO ENTRADA ANALOGICA L #OB82_MDL_ADDR; L 256; ==I ; S DB110.DBX 56.0; END_ORGANIZATION_BLOCK ORGANIZATION_BLOCK OB 100 TITLE = "Complete Restart" VERSION : 0.1 VAR_TEMP OB100_EV_CLASS : BYTE ; //16#13, Event class 1, Entering event state, Event logged in diagnostic buffer OB100_STRTUP : BYTE ; //16#81/82/83/84 Method of startup OB100_PRIORITY : BYTE ; //Priority of OB Execution OB100_OB_NUMBR : BYTE ; //100 (Organization block 100, OB100) OB100_RESERVED_1 : BYTE ; //Reserved for system OB100_RESERVED_2 : BYTE ; //Reserved for system OB100_STOP : WORD ; //Event that caused CPU to stop (16#4xxx) OB100_STRT_INFO : DWORD ; //Information on how system started OB100_DATE_TIME : DATE_AND_TIME ; //Date and time OB100 started END_VAR BEGIN NETWORK TITLE =BIT SIEMPRE A CERO CLR ; //Pone RLO a 0 = M 1.1; NETWORK TITLE =BIT SIEMPRE A UNO SET ; //Pone RLO a 1 = M 1.0; NETWORK TITLE =INICIALIZACIÓN PUNTERO TIPO DE PASO ACTIVO L P#0.0; T MD 2; NOP 0; NETWORK TITLE =CARGAR VALOR PARA CONSTANTE DE TIEMPO PARA DEFECTO L S5T#3S; T DB1.DBW 36; NOP 0; NETWORK TITLE =CARGAR VALOR PARA MAXIMO NUMERO DE PASOS L 152; T DB1.DBW 42; NOP 0; END_ORGANIZATION_BLOCK

Page 85: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 85 de 130

8 Código Programa SCADA Formulario PRINCIPAL Private Sub CBAcido_Click() 'Bomba de Acido. Pulsa activa pulsa desactiva OBAcido = CBAcido.value If OBAcido Then CBAcido.BackColor = BOTON_ON Else CBAcido.BackColor = BOTON_OFF End If End Sub Private Sub CBArrRec_Click() Dim I As Integer If CBArrRec.value And Not OAutMM And CBAuto.value And Not OResRec Then I = MsgBox("CONFIRME ARRANCAR LA RECETA Nº " & TNRec.Text & _ " EN EL TANQUE Nº " & TNDep(0), vbOKCancel, "ARRANCAR RECETA") If I <> 1 Then CBArrRec.value = False Exit Sub End If OArrRec = True CBArrRec.ForeColor = ROJO OParRec = False RecEnPLC.INICIO = Date FFinReceta = False Else OArrRec = False CBArrRec.ForeColor = AZUL OParRec = True End If End Sub Private Sub CBAuto_Click() If CBAuto.value Then OAutMM = False 'Autorizacion Movimientos Manuales CBAuto.ForeColor = AZUL CBAuto.Caption = "AUTO" OAuto = True CRecAnt.Enabled = False 'Flecha receta anterior CRecSig.Enabled = False 'Flecha receta siguiente CBResRec.Enabled = False habilita (True) If Not Rec_Car Then ' Si no se ha cargado receta CBArrRec.Locked = True I = MsgBox("DEBE CARGAR PRIMERO UNA RECETA", vbOKOnly, "ERROR") Else CBArrRec.Locked = False CBArrRec.Enabled = True End If Else OAutMM = True CBAuto.ForeColor = ROJO CBAuto.Caption = "MAN" OAuto = False CRecAnt.Enabled = True CRecSig.Enabled = True CBResRec.Enabled = True CBArrRec.value = False CBArrRec.Enabled = False habilita (False) End If End Sub Private Sub CBBCF_Click() 'Bomba Apollos. Pulsa activa pulsa desactiva OBCF = CBBCF.value If OBCF Then CBBCF.BackColor = BOTON_ON Else

Page 86: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 86 de 130

CBBCF.BackColor = BOTON_OFF End If End Sub Private Sub CBBCM_Click() 'Bomba del Carro movil. Pulsa activa pulsa desactiva OBCM = CBBCM.value If OBCM Then CBBCM.BackColor = BOTON_ON Else CBBCM.BackColor = BOTON_OFF End If End Sub Private Sub CBBPrep_Click() 'Bomba de envio CIP. Pulsa activa pulsa desactiva OBDep = CBBPrep.value If OBDep Then CBBPrep.BackColor = BOTON_ON Else CBBPrep.BackColor = BOTON_OFF End If End Sub Private Sub CBConectar_Click() cnt = 0 TimAbrirPLC.Enabled = True TimSleep.Enabled = True End Sub Private Sub CBDes_Click() 'Bomba de Desinfectante. Pulsa activa pulsa desactiva OBDens = CBDes.value If OBDens Then CBDes.BackColor = BOTON_ON Else CBDes.BackColor = BOTON_OFF End If End Sub Private Sub CBMan_Click() ' Control borrado If CBMan.value Then OAutMM = True CBAuto.value = False Else OAutMM = False End If End Sub Private Sub CBDesconectar_Click() res = unload_tool() TimScanPLC.Enabled = False TimAbrirPLC.Enabled = False CBConectar.Enabled = True Call Alarma("CONEXION TERMINADA POR USUARIO", VERDE) CBDesconectar.Enabled = False Call habilita(True) End Sub Private Sub CBResDef_Click() OResDef = True End Sub Private Sub CBResRec_Click() If OAutMM Or OParRec Then OResRec = True PBRecirc.Min = 0 PBRecirc.value = 0 LRecirc.Caption = 0 End If End Sub

Page 87: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 87 de 130

Private Sub CBSalir_Click() res = unload_tool() End End Sub Private Sub CBSosa_Click() 'Bomba de Sosa. Pulsa activa pulsa desactiva OBSosa = CBSosa.value If OBSosa Then CBSosa.BackColor = BOTON_ON Else CBSosa.BackColor = BOTON_OFF End If End Sub Private Sub CBTenso_Click() 'Bomba de Tensoactivo. Pulsa activa pulsa desactiva OBTenso = CBTenso.value If OBTenso Then CBTenso.BackColor = BOTON_ON Else CBTenso.BackColor = BOTON_OFF End If End Sub Private Sub CBVAgua_Click() ' Valvula de entrada de agua OVAgua = CBVAgua.value If OVAgua Then CBVAgua.BackColor = BOTON_ON Else CBVAgua.BackColor = BOTON_OFF End If End Sub Private Sub CBVCF5_Click() OVCF5 = CBVCF5.value If EVCM5 Then CBVCF5.BackColor = BOTON_ON Else CBVCF5.BackColor = BOTON_OFF End If End Sub Private Sub CBVCF6_Click() OVCF6 = CBVCF6.value If OVCF6 Then CBVCF6.BackColor = BOTON_ON Else CBVCF6.BackColor = BOTON_OFF End If End Sub Private Sub CBVCF7_Click() OVCF7 = CBVCF7.value If OVCF7 Then CBVCF7.BackColor = BOTON_ON Else CBVCF7.BackColor = BOTON_OFF End If End Sub Private Sub CBVCF8_Click() OVCF8 = CBVCF8.value If OVCF8 Then CBVCF8.BackColor = BOTON_ON Else CBVCF8.BackColor = BOTON_OFF End If End Sub Private Sub CBVCM1_Click() OVCM1 = CBVCM1.value If OVCM1 Then CBVCM1.BackColor = BOTON_ON Else

Page 88: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 88 de 130

CBVCM1.BackColor = BOTON_OFF End If End Sub Private Sub CBVCM2_Click() OVCM2 = CBVCM2.value If OVCM2 Then CBVCM2.BackColor = BOTON_ON Else CBVCM2.BackColor = BOTON_OFF End If End Sub Private Sub CBVCM3_Click() OVCM3 = CBVCM3.value If OVCM3 Then CBVCM3.BackColor = BOTON_ON Else CBVCM3.BackColor = BOTON_OFF End If End Sub Private Sub CBVCM4_Click() OVCM4 = CBVCM4.value If OVCM4 Then CBVCM4.BackColor = BOTON_ON Else CBVCM4.BackColor = BOTON_OFF End If End Sub Private Sub CBVPrep_Click() OVDep = CBVPrep.value If OVDep Then CBVPrep.BackColor = BOTON_ON Else CBVPrep.BackColor = BOTON_OFF End If End Sub Private Sub CRecAnt_Click() 'Control selección deposito atras Deposito = Deposito - 1 If Deposito < 1 Then Deposito = 1 TNDep(0).Text = Deposito If Rec_Car Then Rec_Car = False Call ConectaCarro(Deposito) End Sub Private Sub CRecSig_Click() 'Control selección deposito adelante Deposito = Deposito + 1 If Deposito > 6 Then Deposito = 6 If Rec_Car Then Rec_Car = False TNDep(0).Text = Deposito Call ConectaCarro(Deposito) End Sub Private Sub invisible() Dim I As Integer For I = 0 To 7 LDep2(I).Visible = False LDep3(I).Visible = False LDep4(I).Visible = False LDep5(I).Visible = False LDep6(I).Visible = False Next End Sub Public Sub habilita(si As Boolean) CBSosa.Locked = si CBAcido.Locked = si CBDes.Locked = si CBTenso.Locked = si CBVAgua.Locked = si CBVCF5.Locked = si CBVCF6.Locked = si CBVCF7.Locked = si

Page 89: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 89 de 130

CBVCF8.Locked = si CBBCF.Locked = si CBVPrep.Locked = si CBBPrep.Locked = si CBVCM1.Locked = si CBVCM2.Locked = si CBVCM3.Locked = si CBVCM4.Locked = si CBBCM.Locked = si End Sub Private Sub Form_Load() PLC_ON = False Call habilita(True) 'Inicialmente se establece el nivel de acceso como el más bajo NivelAcceso = 0 Call GestionaAccesos(NivelAcceso, Me) 'Ajusta el tamaño de las líneas de aviso inferiores al tamaño de la pantalla If Me.WindowState <> vbMinimized Then TAlarmas.Top = Me.Height - 900 TAlarmas.Width = Me.Width - 3555 End If 'Carga los parámetros de comunicación con el PLC plcadr.adr = 2 plcadr.SEGMENTID = 0 plcadr.RACKNO = 0 plcadr.SLOTNO = 2 TimScanPLC.Enabled = False TimAbrirPLC.Enabled = True TUBO_ON = AZUL Call Alarma("ESTABLECIENDO CONEXIÓN CON EL PLC... Espere", 2) Call MovMan(True) ContSleep = 0 OAutMM = True OAuto = False CBConectar.Enabled = False ' Deshabilita boton conectar Call invisible Deposito = 1 TNDep(0).Text = Deposito CBArrRec.Enabled = False Rec_Car = False End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) ContSleep = 0 End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Call MovMan(False) Call Cerrar_PLC End Sub Private Sub Form_Resize() 'Ajusta el tamaño de las líneas de aviso inferiores al tamaño de la pantalla If Me.WindowState <> vbMinimized Then If Me.Height < 2500 Then Me.Height = 2500 If Me.Width < 5000 Then Me.Width = 5000 TAlarmas.Top = Me.Height - 900 TAlarmas.Width = Me.Width - 3555 End If End Sub Private Sub Form_Terminate() 'Termina la aplicación cerrando todos los formularioas activos res = unload_tool() End End Sub Private Sub TBPpal_ButtonClick(ByVal Button As MSComctlLib.Button) 'Muestra las diferentes pantallas en función del botón activado Select Case Button Case "Recetas" If FRecetas.Visible Then Unload FRecetas Else FRecetas.Show , FPpal

Page 90: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 90 de 130

End If Case "Informes" If FInformes.Visible Then Unload FInformes Else FInformes.Show , FPpal End If End Select End Sub Private Sub TBPpal_ButtonMenuClick(ByVal ButtonMenu As MSComctlLib.ButtonMenu) 'Ídem para los botones con submenús Select Case ButtonMenu Case "Iniciar sesión" frmLogin.Show vbModal ' carga de forma modal;no sigue ejecutando hasta que descarga el form Call GestionaAccesos(NivelAcceso, Me) Me.TAlarmas.Text = "INICIADA SESIÓN USUARIO " & Usuario & " " & Time Case "Cerrar sesión" NivelAcceso = 0 Usuario = "Invitado" Call GestionaAccesos(NivelAcceso, Me) Me.TAlarmas.Text = "CERRADA SESIÓN DE USUARIO " & Usuario & " " & Time Case "Dar de alta a un nuevo usuario" FNewUser.Show vbModal Case "Dar de baja a un usuario" FDelUser.Show vbModal Case "Pupitre" FPupitre.Show vbModal Case "Defectos" FDef.Show vbModal End Select End Sub Private Sub TimAbrirPLC_Timer() cnt = cnt + 1 If cnt <= 1 Then 'Dos intentos para establecer conexion PLC_ON = Abrir_PLC() Else TimAbrirPLC.Enabled = False CBConectar.Enabled = True End If End Sub Private Sub TimScanPLC_Timer() Dim I As Integer Static PasoAnt 'Paso anterior If PLC_ON Then '*************************** 'Leer bloque de datos DB110 '*************************** res = d_field_read(110, 0, 112, buffer(0)) If res <> 0 Then Call Fallo_Com_PLC GoTo fin End If '*********************** 'Lectura de las entradas '*********************** For I = 0 To UltimaE Call STEP5_2_BIN(buffer(I), e, I) Next I '****************** 'Lectura de salidas '****************** For I = 0 To UltimaS Call STEP5_2_BIN(buffer(I + UltimaE + 1), a, I) Next I

Page 91: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 91 de 130

'********************************** 'Lectura de los bits de intercambio '********************************** Call STEP5_2_BIN(buffer(PrimerCanalPLC_PC), DBB34, 0) Call STEP5_2_BIN(buffer(PrimerCanalPLC_PC + 1), DBB35, 0) If DBB35(0, 3) Then OResDef = False '*********************** 'Lectura de los defectos '*********************** If DBB34(0, 6) Then For I = 0 To NumCanalDef - 1 Call STEP5_2_BIN(buffer(PrimerCanalDef + I), DEF, I) Next I ShDef.Visible = True Call Defectos Else Call SinDef End If VolAguaR = STEP5_2_DEC(100) If NPasoAc > 0 Then If ((RecEnPLC.PASOS(NPasoAc - 1).TIPO_PASO) = 3) Then TRecircR = (RecEnPLC.PASOS(NPasoAc - 1).PAR_1) - STEP5_2_DEC(110) ElseIf ((RecEnPLC.PASOS(NPasoAc - 1).TIPO_PASO) = 1) Then TBSosaR = (RecEnPLC.PASOS(NPasoAc - 1).PAR_2) - STEP5_2_DEC(102) TBAcidoR = (RecEnPLC.PASOS(NPasoAc - 1).PAR_3) - STEP5_2_DEC(104) TBTensoR = (RecEnPLC.PASOS(NPasoAc - 1).PAR_5) - STEP5_2_DEC(106) TBDesinR = (RecEnPLC.PASOS(NPasoAc - 1).PAR_4) - STEP5_2_DEC(108) End If Else TRecircR = 0 TBSosaR = 0 TBAcidoR = 0 TBTensoR = 0 TBDesinR = 0 End If '***************************** 'Lectura de valores de proceso '***************************** NRecPLC = STEP5_2_DEC(90) NTanquePLC = STEP5_2_DEC(92) EstadoPasoAc = STEP5_2_DEC(94) NPasoAc = STEP5_2_DEC(96) If PasoAnt <> NPasoAc Then 'Para estampar hora de inicio y fin de los pasos If (NPasoAc > 1) And (NPasoAc <= (RecEnPLC.N_PASOS * 4)) Then RecEnPLC.PASOS(NPasoAc - 2).FINAL = Time RecEnPLC.PASOS(NPasoAc - 1).INICIO = Time End If PasoAnt = NPasoAc If NPasoAc = 1 Then RecEnPLC.PASOS(NPasoAc - 1).INICIO = Time End If End If If (NPasoAc = RecEnPLC.N_PASOS * 4) And DBB34(0, 4) And Not FFinReceta Then RecEnPLC.PASOS(NPasoAc - 1).FINAL = Time FFinReceta = True End If TPasAct = STEP5_2_DEC(98) '*************************** 'ESCRITURA DE LAS SALIDAS '*************************** buffer(0) = -1 * (OAutMM * (2 ^ 0) + OArrRec * (2 ^ 1) + OParRec * (2 ^ 2) + OResRec * (2 ^ 3) + OResDef * (2 ^ 4) + OTestCom * (2 ^ 5) + OPES * (2 ^ 6) + OAuto * (2 ^ 7)) buffer(1) = -1 * (OPEmerg * (2 ^ 0) + OPES * (2 ^ 1)) If TAConectar >= 0 And TAConectar <= 6 Then buffer(2) = TAConectar Else

Page 92: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 92 de 130

buffer(2) = 0 End If buffer(3) = 0 buffer(4) = -1 * (OVAgua * (2 ^ 1) + OBTenso * (2 ^ 5) + OBDens * (2 ^ 4) + OBAcido * (2 ^ 3) + OBSosa * (2 ^ 2) + OVDep * (2 ^ 6) + OVCM1 * (2 ^ 7) + OVCM2 * (2 ^ 0)) buffer(5) = -1 * (OBDep * (2 ^ 1) + OVCF5 * (2 ^ 5) + OVCF6 * (2 ^ 4) + OVCF7 * (2 ^ 7) + OVCF8 * (2 ^ 6) + OVCM3 * (2 ^ 3) + OVCM4 * (2 ^ 0) + OBCM * (2 ^ 2)) buffer(6) = -1 * OBCF * (2 ^ 0) res = d_field_write(110, 44, 7, buffer(0)) If res <> 0 Then Call Fallo_Com_PLC GoTo fin End If OResRec = False OArrRec = False Call Sinoptico End If fin: End Sub Public Sub ConectaCarro(Dep As Integer) Dim I As Integer If Dep = 1 Then For I = 0 To 7 LDep1(I).Visible = True LDep2(I).Visible = False LDep3(I).Visible = False LDep4(I).Visible = False LDep5(I).Visible = False LDep6(I).Visible = False Next End If If Dep = 2 Then For I = 0 To 7 LDep1(I).Visible = False LDep2(I).Visible = True LDep3(I).Visible = False LDep4(I).Visible = False LDep5(I).Visible = False LDep6(I).Visible = False Next End If If Dep = 3 Then For I = 0 To 7 LDep1(I).Visible = False LDep2(I).Visible = False LDep3(I).Visible = True LDep4(I).Visible = False LDep5(I).Visible = False LDep6(I).Visible = False Next End If If Dep = 4 Then For I = 0 To 7 LDep1(I).Visible = False LDep2(I).Visible = False LDep3(I).Visible = False LDep4(I).Visible = True LDep5(I).Visible = False LDep6(I).Visible = False Next End If If Dep = 5 Then For I = 0 To 7 LDep1(I).Visible = False LDep2(I).Visible = False LDep3(I).Visible = False LDep4(I).Visible = False LDep5(I).Visible = True LDep6(I).Visible = False Next End If If Dep = 6 Then

Page 93: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 93 de 130

For I = 0 To 7 LDep1(I).Visible = False LDep2(I).Visible = False LDep3(I).Visible = False LDep4(I).Visible = False LDep5(I).Visible = False LDep6(I).Visible = True Next End If End Sub Public Sub Sinoptico() Dim I, j As Integer Dim PAgua, PSosa, PAcido, PDesinf, PTenso, PRecirc As Integer Dim ANIMA As Boolean Dim db As Database Dim RST As Recordset Dim Dibujo As Integer Dim Color As Long Call ConectaCarro(Deposito) 'Animación entrada agua ANIMA = e(6, 0) 'Mira si la valvula de entrada de agua esta abierta Dibujo = (-1) * (2 * ANIMA + 1 * ((Not ANIMA))) 'Si abierta objeto 2 sino objeto 1 If (CBVAgua.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVAgua.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If Color = (-1) * (ANIMA * TUBO_AGUA + ((Not ANIMA)) * TUBO_OFF) TAgua_1.BorderColor = Color PBDepPrep.value = VolAguaR 'Animación entrada tensoactivo ANIMA = a(1, 0) Dibujo = (-1) * (4 * ANIMA + 3 * (Not ANIMA)) If (CBTenso.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBTenso.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If Color = (-1) * (ANIMA * TUBO_SOSA + ((Not ANIMA)) * TUBO_OFF) For I = 0 To 2 TTenso_4(I).BorderColor = Color Next 'Animación entrada desinfectante ANIMA = a(1, 1) Dibujo = (-1) * (4 * ANIMA + 3 * ((Not ANIMA))) If (CBDes.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBDes.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If Color = (-1) * (ANIMA * TUBO_DESIN + ((Not ANIMA)) * TUBO_OFF) For I = 0 To 2 TDens_4(I).BorderColor = Color Next 'Animación entrada ácido ANIMA = a(0, 7) Dibujo = (-1) * (4 * ANIMA + 3 * (Not ANIMA)) If (CBAcido.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBAcido.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If Color = (-1) * (ANIMA * TUBO_ACIDO + ((Not ANIMA)) * TUBO_OFF) For I = 0 To 2 TAcido_4(I).BorderColor = Color Next 'Animación entrada sosa ANIMA = a(0, 6) Dibujo = (-1) * (4 * ANIMA + 3 * (Not ANIMA)) If (CBSosa.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBSosa.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If Color = (-1) * (ANIMA * TUBO_SOSA + ((Not ANIMA)) * TUBO_OFF) For I = 0 To 2 TSosa_4(I).BorderColor = Color Next

Page 94: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 94 de 130

'Animación salida depósito de preparación 'Flujostato ANIMA = e(6, 3) Dibujo = (-1) * (6 * ANIMA + 5 * (Not ANIMA)) If (FlujoPrep.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then FlujoPrep.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Válvula salida deposito preparacion ANIMA = e(6, 2) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVPrep.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVPrep.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If If ANIMA Then Select Case Deposito Case 1 To 4 For I = 0 To 3 TPrep_1(I).BorderColor = AZUL Next Case 5 To 6 For I = 0 To 2 TPrep_1(I).BorderColor = AZUL If I < 2 Then TPrep_A(I).BorderColor = AZUL End If Next End Select Else Select Case Deposito Case 1 To 4 For I = 0 To 3 TPrep_1(I).BorderColor = GRIS Next Case 5 To 6 For I = 0 To 2 TPrep_1(I).BorderColor = GRIS If I < 2 Then TPrep_A(I).BorderColor = GRIS End If Next End Select End If 'Bomba salida deposito preparacion ANIMA = a(0, 4) If ANIMA Then TUBO_ON = TUBO_ON_SP Dibujo = (-1) * (4 * ANIMA + 3 * (Not ANIMA)) If (CBBPrep.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBBPrep.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación de VCM1 ANIMA = e(2, 0) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCM1.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCM1.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación de VCM2 ANIMA = e(2, 1) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCM2.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCM2.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación de VCM3 ANIMA = e(2, 2) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCM3.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCM3.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación de VCM4 ANIMA = e(2, 3) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCM4.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCM4.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture

Page 95: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 95 de 130

End If 'Animación de la bomba del carro ANIMA = a(1, 2) Dibujo = (-1) * (4 * ANIMA + 3 * (Not ANIMA)) If (CBBCM.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBBCM.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Zona Fermentacion If Deposito >= 1 And Deposito <= 4 Then 'Animación flujostato carro móvil ANIMA = e(2, 7) Dibujo = (-1) * (6 * ANIMA + 5 * (Not ANIMA)) If (FlujoCM.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then FlujoCM.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If If e(2, 0) Then ' Si V1 activa TCM1.BorderColor = AZUL TCM2.BorderColor = AZUL Else TCM1.BorderColor = GRIS TCM2.BorderColor = GRIS End If If e(2, 1) Then ' Si V2 Activa TCM3.BorderColor = AZUL Else TCM3.BorderColor = GRIS End If If e(2, 2) Then ' Si V3 activa TCM4.BorderColor = AZUL Else TCM4.BorderColor = GRIS End If If e(2, 3) Then ' Si V4 activa For I = 4 To 7 Lvac(I).BorderColor = AZUL TCM5.BorderColor = AZUL TCM6.BorderColor = AZUL Next Else For I = 4 To 7 Lvac(I).BorderColor = GRIS Next TCM5.BorderColor = GRIS TCM6.BorderColor = GRIS End If 'Animacion tubos depositos de fermentacion Select Case Deposito Case 1 'Deposito 1 If e(2, 0) Then ' Si V1 activa For I = 4 To 7 LDep1(I).BorderColor = AZUL Next Else For I = 4 To 7 LDep1(I).BorderColor = GRIS Next End If If e(2, 2) Then ' Si V3 activa For I = 0 To 3 LDep1(I).BorderColor = AZUL Next Else For I = 0 To 3 LDep1(I).BorderColor = GRIS Next End If Case 2 'Deposito 2 If e(2, 0) Then ' Si V1 activa For I = 4 To 7 LDep2(I).BorderColor = AZUL Next

Page 96: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 96 de 130

Else For I = 4 To 7 LDep2(I).BorderColor = GRIS Next End If If e(2, 2) Then ' Si V3 activa For I = 0 To 3 LDep2(I).BorderColor = AZUL Next Else For I = 0 To 3 LDep2(I).BorderColor = GRIS Next End If Case 3 'Deposito 3 If e(2, 0) Then ' Si V1 activa For I = 4 To 7 LDep3(I).BorderColor = AZUL Next Else For I = 4 To 7 LDep3(I).BorderColor = GRIS Next End If If e(2, 2) Then ' Si V3 activa For I = 0 To 3 LDep3(I).BorderColor = AZUL Next Else For I = 0 To 3 LDep3(I).BorderColor = GRIS Next End If Case 4 'Deposito 4 If e(2, 0) Then ' Si V1 activa For I = 4 To 7 LDep4(I).BorderColor = AZUL Next Else For I = 4 To 7 LDep4(I).BorderColor = GRIS Next End If If e(2, 2) Then ' Si V3 activa For I = 0 To 3 LDep4(I).BorderColor = AZUL Next Else For I = 0 To 3 LDep4(I).BorderColor = GRIS Next End If End Select End If 'Zona Apollos If Deposito >= 5 And Deposito <= 6 Then 'Animacion tuberias If e(4, 0) Then ' Si V5 activa TCF1.BorderColor = AZUL TCF2.BorderColor = AZUL Else TCF1.BorderColor = GRIS TCF2.BorderColor = GRIS End If If e(4, 1) Then ' Si V6 Activa TCF3.BorderColor = AZUL Else TCF3.BorderColor = GRIS End If If e(4, 3) Then ' Si V7 activa TCF4.BorderColor = AZUL Else TCF4.BorderColor = GRIS End If

Page 97: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 97 de 130

If e(4, 5) Then ' Si V8 activa For I = 4 To 7 LVac_A(I).BorderColor = AZUL TCF5.BorderColor = AZUL TCF6.BorderColor = AZUL Next Else For I = 4 To 7 LVac_A(I).BorderColor = GRIS Next TCF5.BorderColor = GRIS TCF6.BorderColor = GRIS End If Select Case Deposito Case 5 'Deposito 5 If e(4, 0) Then ' Si V5 activa For I = 4 To 7 LDep5(I).BorderColor = AZUL Next Else For I = 4 To 7 LDep5(I).BorderColor = GRIS Next End If If e(4, 3) Then ' Si V7 activa For I = 0 To 3 LDep5(I).BorderColor = AZUL Next Else For I = 0 To 3 LDep5(I).BorderColor = GRIS Next End If Case 6 'Deposito 6 If e(4, 0) Then ' Si V5 activa For I = 4 To 7 LDep6(I).BorderColor = AZUL Next Else For I = 4 To 7 LDep6(I).BorderColor = GRIS Next End If If e(4, 3) Then ' Si V7 activa For I = 0 To 3 LDep6(I).BorderColor = AZUL Next Else For I = 0 To 3 LDep6(I).BorderColor = GRIS Next End If End Select 'Animación tuberías carro apollos 'Animación tuberías carro móvil 'Animación flujostato carro APOLLOS ANIMA = e(5, 0) Dibujo = (-1) * (6 * ANIMA + 5 * (Not ANIMA)) If (FlujoCF.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then FlujoCF.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If End If 'Animación de VCF5 ANIMA = e(4, 0) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCF5.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCF5.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture

Page 98: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 98 de 130

End If 'Animación de VCF6 ANIMA = e(4, 1) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCF6.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCF6.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación de VCF7 ANIMA = e(4, 3) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCF7.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCF7.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación de VCF8 ANIMA = e(4, 5) Dibujo = (-1) * (2 * ANIMA + 1 * (Not ANIMA)) If (CBVCF8.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBVCF8.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación de la bomba APOLLOS ANIMA = a(0, 5) Dibujo = (-1) * (4 * ANIMA + 3 * (Not ANIMA)) If (CBBCF.Picture <> ILSinoptico.ListImages.Item(Dibujo).Picture) Then CBBCF.Picture = ILSinoptico.ListImages.Item(Dibujo).Picture End If 'Animación del panel de mando TNRec = NRecPLC TComRec = RecEnPLC.COMRECETA On Error Resume Next If NPasoAc > 0 Then TNPas = RecEnPLC.PASOS(NPasoAc - 1).N_PASO_FOR TComPas = RecEnPLC.PASOS(NPasoAc - 1).COMPASO For I = 0 To 3 CBEtapa(I).value = ((RecEnPLC.PASOS(NPasoAc - 1).TIPO_PASO) >= I + 1) Next I Else TNPas = "" TComPas = "" For I = 0 To 3 CBEtapa(I).value = False Next I End If TNDep(1) = -1 * (2 ^ 4 * e(3, 0) + 2 ^ 3 * e(3, 1) + 2 ^ 2 * e(3, 2) + 2 ^ 1 * e(3, 3) + 2 ^ 0 * e(3, 4)) If DBB34(0, 4) Then TComPas = "FIN RECETA" OArrRec = False RecEnPLC.FINAL = Date End If Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset("SELECT * FROM CONFIGURACION") If RST.EOF Then I = MsgBox("SISTEMA DESCONFIGURADO. NO SE PUEDE CARGAR LA RECETA", vbCritical, "ERROR GRAVE") Call Cerrar_BD(db) Call Cerrar_RST(RST) GoTo fin End If Sosa = RST!CONF_BOMBASOSA Acido = RST!CONF_BOMBAACIDO Tensoac = RST!CONF_BOMBATENSOACTIVO Desinf = RST!CONF_BOMBADESINFECTANTE Call Cerrar_RST(RST) TAgua.Text = VolAguaR & " l" If Not RST.EOF Then RST.MoveLast RST.MoveFirst End If TSosa.Text = Format(Round(TBSosaR * Sosa), "000 l") TAcido.Text = Format(Round(TBAcidoR * Acido), "000 l") TTenso.Text = Format(Round(TBTensoR * Tensoac), "000 l") TDesin.Text = Format(Round(TBDesinR * Desinf), "000 ml") If DBB34(0, 2) Then

Page 99: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 99 de 130

j = (RecEnPLC.PASOS(NPasoAc - 1).N_PASO_FOR - 1) * 4 PAgua = RecEnPLC.PASOS(j).PAR_1 PSosa = Round(RecEnPLC.PASOS(j).PAR_2 * Sosa) PAcido = Round(RecEnPLC.PASOS(j).PAR_3 * Acido) PDesinf = Round(RecEnPLC.PASOS(j).PAR_4 * Desinf) PTenso = Round(RecEnPLC.PASOS(j).PAR_5 * Tensoac) PRecirc = RecEnPLC.PASOS(j + 2).PAR_1 If PAgua Then LEtapa(0).Caption = "Preparación (Agua: " & PAgua & " l)" If PSosa Then LEtapa(0).Caption = LEtapa(0).Caption & " + (Sosa: " & PSosa & " l)" If PAcido Then LEtapa(0).Caption = LEtapa(0).Caption & " + (Ácido: " & PAcido & " l)" If PDesinf Then LEtapa(0).Caption = LEtapa(0).Caption & " + (Desinfectante: " & PDesinf & " ml)" If PTenso Then LEtapa(0).Caption = LEtapa(0).Caption & " + (Tensoactivo: " & PTenso & " l)" If PRecirc Then LEtapa(2).Caption = "Recirculación (" & Format(PRecirc / 60, "00.0") & " min)" Else LEtapa(0).Caption = "Preparación: " LEtapa(2).Caption = "Recirculación: " End If If DBB34(0, 2) And Not DBB34(0, 3) Then 'Si receta en ejecucion y no parada If CBEtapa(2).value And Not CBEtapa(3) And Not DBB34(0, 3) Then LRecirc.Caption = HMS(TPasAct) PBRecirc.Min = 0 PBRecirc.Max = RecEnPLC.PASOS(NPasoAc - 1).PAR_1 PBRecirc.value = TPasAct Else PBRecirc.Min = 0 PBRecirc.Max = 0 PBRecirc.value = 0 LRecirc.Caption = 0 End If End If Call Cerrar_BD(db) Call Cerrar_RST(RST) fin: End Sub Public Function HMS(Segundos As Integer) As String Dim s, M As Integer M = Int(Segundos / 60) s = Segundos - (60 * M) HMS = Format(M, "00") & " : " & Format(s, "00") End Function Private Sub TimSleep_Timer() ContSleep = ContSleep + 1 If ContSleep > 30 Then res = unload_tool() TimSleep.Enabled = False End If End Sub Private Function Dev_Def_Num(I As Integer) As String Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim cadaux As String Dim Num As Integer 'Funcion que devuelve el texto asociado al indice del defecto que se le pasa como argumento Num = I cadSQL = "SELECT * FROM DEFECTOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST If Not .EOF Then .MoveLast .MoveFirst Do While (Not .EOF) And (Num - 1) .MoveNext Num = Num - 1 Loop End If Dev_Def_Num = !TEXTO End With Call Cerrar_RST(RST)

Page 100: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 100 de 130

Call Cerrar_BD(db) End Function Private Function BUSCA_DEF(I As Integer, j As Integer) As String Dim Indice As Long Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim cadaux As String Indice = I * 8 + j + 1 ' Calcula el indice del defecto 'Abre la tabla lista_defectos donde están los textos de los defectos cadSQL = "SELECT * FROM LISTA_DEFECTOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST If Not .EOF Then .MoveLast .MoveFirst .FindFirst "INDICE='" & CStr(Indice) & "'" If Not (.NoMatch) Then ' Si lo encuentra BUSCA_DEF = !TEXTO_DEF Exit Function Else ' Si no lo encuentra devuelve cadena vacia BUSCA_DEF = "" End If Else 'Si la tabla esta vacia BUSCA_DEF = "" End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) End Function Private Sub RELLENA_TABLA_DEFECTOS(Cad As String) Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim Registra As Boolean Registra = False 'Abre la tabla defectos donde se registran cadSQL = "SELECT * FROM DEFECTOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST If Not .EOF Then .MoveLast .MoveFirst .FindFirst "TEXTO='" & Cad & "'" If Not (.NoMatch) Then ' Si ya existe Exit Sub Else 'Si es nuevo lo registra .MoveLast Registra = True End If Else 'Si la tabla esta vacia Registra = True End If If Registra Then .AddNew !TEXTO = Cad !FECHA = Date !HORA = Time .Update End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Private Sub Defectos() Dim CadAl As String

Page 101: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 101 de 130

Dim I As Integer, j As Integer Static TIEMPO As Single Static cambio As Boolean Static DefAMostrar As Integer Dim numdef As Integer numdef = 0 ' Bucle anidado para buscar los textos de los defectos activos y registrarlos For I = 0 To NumCanalDef - 1 For j = 0 To 7 If DEF(I, j) = True Then Call RELLENA_TABLA_DEFECTOS(BUSCA_DEF(I, j)) numdef = numdef + 1 End If Next j Next I If (Timer - TIEMPO) > 2 Then TIEMPO = Timer cambio = Not cambio End If If cambio Then If DefAMostrar < numdef Then DefAMostrar = DefAMostrar + 1 Else DefAMostrar = 1 End If Else End If If DEF(0, 0) Then If OAutMM Then MovMan (False) End If If DEF(0, 1) Then If OAutMM Then MovMan (False) End If If Not DBB34(0, 5) Then If OAutMM Then MovMan (False) End If If DEF(0, 2) Then If OBDep Then OBDep = False CBBPrep.value = False End If If Not (ShDefBCIP.Visible) Then ShDefBCIP.Visible = True Else ShDefBCIP.Visible = False End If If DEF(0, 3) Then If OBCF Then OBCF = False CBBCF.value = False End If If Not (ShDefBA.Visible) Then ShDefBA.Visible = True Else ShDefBA.Visible = False End If If DEF(0, 4) Then If OBCM Then OBCM = False CBBCM.value = False End If If Not (ShDefBC.Visible) Then ShDefBC.Visible = True Else ShDefBC.Visible = False End If If DEF(0, 5) Then If OBSosa Then OBSosa = False

Page 102: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 102 de 130

CBSosa.value = False End If If Not (ShDefBS.Visible) Then ShDefBS.Visible = True Else ShDefBS.Visible = False End If If DEF(0, 6) Then If OBAcido Then OBAcido = False CBAcido.value = False End If If Not (ShDefBAc.Visible) Then ShDefBAc.Visible = True Else ShDefBAc.Visible = False End If If DEF(0, 7) Then If OBTenso Then OBTenso = False CBTenso.value = False End If If Not (ShDefBT.Visible) Then ShDefBT.Visible = True Else ShDefBT.Visible = False End If If DEF(1, 0) Then If OBDens Then OBDens = False CBDes.value = False End If If Not (ShDefBD.Visible) Then ShDefBD.Visible = True Else ShDefBD.Visible = False End If If DEF(4, 0) Then If OVAgua Then OVAgua = False CBVAgua.value = False End If If Not (ShDefVA.Visible) Then ShDefVA.Visible = True Else ShDefVA.Visible = False End If If DEF(5, 1) Then If OBCM Then OBCM = False CBBCM.value = False End If If Not (ShDefBC.Visible) Then ShDefBC.Visible = True Else ShDefBC.Visible = False End If If DEF(4, 5) Then If OVDep Then OVDep = False CBVPrep.value = False End If If Not (ShDefVCIP.Visible) Then ShDefVCIP.Visible = True Else ShDefVCIP.Visible = False End If If DEF(4, 6) Then If OVCM1 Then OVCM1 = False CBVCM1.value = False End If If Not (ShDefV1.Visible) Then ShDefV1.Visible = True Else ShDefV1.Visible = False End If

Page 103: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 103 de 130

If DEF(4, 7) Then If OVCM4 Then OVCM4 = False CBVCM4.value = False End If If Not (ShDefV4.Visible) Then ShDefV4.Visible = True Else ShDefV4.Visible = False End If If DEF(5, 2) Then If OVCM2 Then OVCM2 = False CBVCM2.value = False End If If Not (ShDefV2.Visible) Then ShDefV2.Visible = True Else ShDefV2.Visible = False End If If DEF(5, 3) Then If OVCM3 Then OVCM3 = False CBVCM3.value = False End If If Not (ShDefV3.Visible) Then ShDefV3.Visible = True Else ShDefV3.Visible = False End If If DEF(5, 4) Then If OVCF5 Then OVCF5 = False CBVCF5.value = False End If If Not (ShDefV5.Visible) Then ShDefV5.Visible = True Else ShDefV5.Visible = False End If If DEF(5, 5) Then ShDefV6.Visible = True If OVCF6 Then OVCF6 = False CBVCF6.value = False End If End If If DEF(5, 6) Then ShDefV8.Visible = True If OVCF8 Then OVCF8 = False CBVCF8.value = False End If End If If DEF(5, 7) Then ShDefV7.Visible = True If OVCF7 Then OVCF7 = False CBVCF7.value = False End If End If If DEF(6, 0) Then ShDefBA.Visible = True If OBCF Then OBCF = False CBBCF.value = False End If End If If DEF(7, 4) Then I = MsgBox("NO SE DETECTA TANQUE VACÍO. COMPRUEBE LAS CONEXIONES. OK=CONTINUAR RECETA. CANCEL=PARAR RECETA", vbOKCancel, "TANQUE NO VACÍO") If I = 1 Then OAnSegTV = True Else OAnSegTV = False End If End If

Page 104: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 104 de 130

fin: CadAl = Dev_Def_Num(DefAMostrar) Call Alarma(CadAl, ROJO) End Sub Private Sub MENSAJES() Dim CadMens As String If DBB34(0, 3) Then CadMens = "RECETA PARADA. SELECCIONE DE NUEVO AUTOMÁTICO Y ARRANQUE LA RECETA" GoTo fin End If If DBB34(0, 2) Then CadMens = "RECETA EN EJECUCIÓN" GoTo fin End If fin: Call Alarma(CadMens, AZUL) End Sub Private Sub SinDef() 'Quitar los marcos rojos de defecto de los elementos FPpal.TAlarmas.Text = "" ShDefBCIP.Visible = False ShDefVCIP.Visible = False ShDefV1.Visible = False ShDefV2.Visible = False ShDefV3.Visible = False ShDefV4.Visible = False ShDefBC.Visible = False ShDefV5.Visible = False ShDefV6.Visible = False ShDefV7.Visible = False ShDefV8.Visible = False ShDefBA.Visible = False ShDefVA.Visible = False ShDefBAc.Visible = False ShDefBS.Visible = False ShDefBD.Visible = False ShDefBT.Visible = False ShDef.Visible = False End Sub Formulario RECETAS Private Sub CRecAnt_Click() Dim db As Database Dim RST As Recordset Dim cadSQL As String 'Si existe RecAnt-1, la establece como activa y la carga Set db = OpenDatabase(DirDB) cadSQL = "SELECT * FROM RECETAS WHERE REC_NUM=" & RecAct - 1 Set RST = db.OpenRecordset(cadSQL) If Not RST.EOF Then RecAct = RecAct - 1 Call CargaReceta(RecAct) End If Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Private Sub CRecSig_Click() Dim db As Database Dim RST As Recordset Dim cadSQL As String 'Si existe RecAnt+1, la establece como activa y la carga Set db = OpenDatabase(DirDB) cadSQL = "SELECT * FROM RECETAS WHERE REC_NUM=" & RecAct + 1

Page 105: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 105 de 130

Set RST = db.OpenRecordset(cadSQL) If Not RST.EOF Then RecAct = RecAct + 1 Call CargaReceta(RecAct) End If Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Private Sub Form_Load() 'Deshabilita los botones del menú de la pantalla principal mientras esté activa la 'pantalla de recetas FPpal.TBPpal.Buttons.Item(1).Enabled = False FPpal.TBPpal.Buttons.Item(3).Enabled = False FPpal.TBPpal.Buttons.Item(5).Enabled = False 'Establece las habilitaciones de los botones del menú en función del Nivel de acceso Call GestionaAccesos(NivelAcceso, Me) 'Bloquea los datos de las recetas Call BlDatRec(True) 'Establece la receta activa a 1 y la carga RecAct = 1 Call CargaReceta(RecAct) End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 'Cambia el estado del botón Recetas del menu principal, por si ha cerrado el formulario 'recetas directamente FPpal.TBPpal.Buttons.Item(7).value = tbrUnpressed 'Establece las habilitaciones de los botones del menú en función del Nivel de acceso Call GestionaAccesos(NivelAcceso, FPpal) End Sub Private Sub TBRecetas_ButtonClick(ByVal Button As MSComctlLib.Button) Dim I As Integer Dim RecOK As Boolean 'Gestión de los botones del menú del formulario recetas Select Case Button.Caption Case "Eliminar" 'Determina si se trata de una receta o de un paso. Pide confirmación 'y llama a la subrutina correspondiente I = MsgBox("¿ESTÁ SEGURO DE DESEAR ELIMINAR LA RECETA F" & Format(RecAct, "00"), vbOKCancel, "ELIMINAR RECETA") If I = 1 Then Call Borrar_Receta(RecAct) Case "Nueva", "Editar" 'Diferencia los casos de activación/desactivación del botón 'Caso de activación If Button.value = tbrPressed Then 'Bloquea los botones mientras se edita la nueva receta TBRecetas.Buttons.Item(1).Enabled = (Button.Caption = "Editar") TBRecetas.Buttons.Item(3).Enabled = (Button.Caption = "Nueva") TBRecetas.Buttons.Item(7).Enabled = False TBRecetas.Buttons.Item(9).Enabled = False 'Carga una receta en blanco If (Button.Caption = "Nueva") Then Call NuevaReceta 'Desbloquea los controles del formulario para editar la receta Call BlDatRec(False) 'Caso de desactivación Else 'Avisa que no se guardará la receta y pide confirmación I = MsgBox("LA RECETA F" & Format(RecAct, "00") & " NO SE GUARDARÁ", vbOKCancel, "EDITOR DE RECETAS") If I = 1 Then 'Si no se desea guardar la receta, la borra de la base de datos y restablece 'los botones del menú TBRecetas.Buttons.Item(1).Enabled = True TBRecetas.Buttons.Item(1).value = tbrUnpressed TBRecetas.Buttons.Item(3).Enabled = True

Page 106: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 106 de 130

TBRecetas.Buttons.Item(3).value = tbrUnpressed TBRecetas.Buttons.Item(7).Enabled = True TBRecetas.Buttons.Item(9).Enabled = True NuevaRec = False Call BlDatRec(True) Else 'Si no confirma, seguimos Button.value = tbrPressed End If End If Case "Salvar" 'Comprueba la coherencia de la receta RecOK = CompruebaReceta() 'Si la receta es correcta... If RecOK Then 'Restablece los botones del menú y salva la receta, mostrándola en el formulario TBRecetas.Buttons.Item(1).Enabled = True TBRecetas.Buttons.Item(1).value = tbrUnpressed TBRecetas.Buttons.Item(3).Enabled = True TBRecetas.Buttons.Item(3).value = tbrUnpressed TBRecetas.Buttons.Item(7).Enabled = True TBRecetas.Buttons.Item(9).Enabled = True NuevaRec = False Call SalvarReceta(RecAct) Call CargaReceta(RecAct) Call BlDatRec(True) End If Case "Cargar en PLC" If Deposito < 1 Then I = MsgBox("DEBE SELECCIONAR ANTES UN Nº DE TANQUE", vbCritical, "CARGAR RECETA CIP EN PLC") GoTo fin End If I = MsgBox("CONFIRME CARGAR RECETA Nº " & RecAct & " EN EL TANQUE Nº " & FPpal.TNDep(0).Text, vbOKCancel, "CARGAR RECETA EN EL PLC") If I = 1 Then Me.MousePointer = vbHourglass FPpal.MousePointer = vbHourglass Call CargaRecetaPLC(RecAct, True) Me.MousePointer = vbDefault FPpal.MousePointer = vbDefault End If End Select fin: End Sub Private Sub BlDatRec(Bloq As Boolean) Dim I As Integer 'Establece el atributo bloqueado para todos los controles de datos del 'formulario de recetas For I = 0 To 14 TPasCom(I).Locked = Bloq TPasAgua(I).Locked = Bloq TPasSosa(I).Locked = Bloq TPasAcido(I).Locked = Bloq TPasDesinf(I).Locked = Bloq TPasTensoac(I).Locked = Bloq TPasRecirc(I).Locked = Bloq Next I TRecFecCrea.Locked = Bloq TRecCrea.Locked = Bloq TRecFecMod.Locked = Bloq TRecModifica.Locked = Bloq TRecComRec.Locked = Bloq End Sub 'Para que se seleccione todo el campo escrito Private Sub TPasCom_GotFocus(Index As Integer) TPasCom(Index).SelStart = 0 TPasCom(Index).SelLength = Len(TPasCom(Index).Text) End Sub 'Para que se seleccione todo el campo escrito Private Sub TPasAgua_GotFocus(Index As Integer) TPasAgua(Index).SelStart = 0 TPasAgua(Index).SelLength = Len(TPasAgua(Index).Text)

Page 107: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 107 de 130

End Sub 'Para que se seleccione todo el campo escrito Private Sub TPasSosa_GotFocus(Index As Integer) TPasSosa(Index).SelStart = 0 TPasSosa(Index).SelLength = Len(TPasSosa(Index).Text) End Sub 'Para que se seleccione todo el campo escrito Private Sub TPasAcido_GotFocus(Index As Integer) TPasAcido(Index).SelStart = 0 TPasAcido(Index).SelLength = Len(TPasAcido(Index).Text) End Sub 'Para que se seleccione todo el campo escrito Private Sub TPasDesinf_GotFocus(Index As Integer) TPasDesinf(Index).SelStart = 0 TPasDesinf(Index).SelLength = Len(TPasDesinf(Index).Text) End Sub 'Para que se seleccione todo el campo escrito Private Sub TPasTensoac_GotFocus(Index As Integer) TPasTensoac(Index).SelStart = 0 TPasTensoac(Index).SelLength = Len(TPasTensoac(Index).Text) End Sub 'Para que se seleccione todo el campo escrito Private Sub TPasRecirc_GotFocus(Index As Integer) TPasRecirc(Index).SelStart = 0 TPasRecirc(Index).SelLength = Len(TPasRecirc(Index).Text) End Sub 'Para que se seleccione todo el campo escrito Private Sub TRecComRec_GotFocus() TRecComRec.SelStart = 0 TRecComRec.SelLength = Len(TRecComRec.Text) End Sub 'Pone la primera letra en mayúscula y las demás en minúsculas Private Sub TPasCom_Validate(Index As Integer, Cancel As Boolean) If Len(TPasCom(Index).Text) > 0 Then TPasCom(Index).Text = UCase(Left(TPasCom(Index).Text, 1)) & Right(TPasCom(Index).Text, Len(TPasCom(Index).Text) - 1) End If End Sub 'Pasa a mayusculas al validar Private Sub TRecComRec_Validate(Cancel As Boolean) TRecComRec.Text = UCase(TRecComRec.Text) End Sub Public Sub CargaReceta(NRec As Integer) Dim db As Database Dim rstRec As Recordset Dim rstPas As Recordset Dim cadSQL As String Dim I As Integer Call Receta_Vacia(NRec) Set db = OpenDatabase(DirDB) 'Abre la tabla RECETAS y carga los datos cadSQL = "SELECT * FROM RECETAS WHERE REC_NUM=" & NRec Set rstRec = db.OpenRecordset(cadSQL) With rstRec If Not .EOF Then TRecNRec.Caption = "RECETA Nº " & !REC_NUM TRecComRec.Text = !REC_COM TRecFecCrea.Text = !REC_FEC_CREA TRecCrea.Text = !REC_AUTOR If !REC_ULT_MODIF <> "" Then TRecFecMod.Text = !REC_ULT_MODIF End If If !REC_AUT_ULT_MODIF <> "" Then TRecModifica.Text = !REC_AUT_ULT_MODIF TRecFecMod.Visible = (!REC_AUT_ULT_MODIF <> "") TRecModifica.Visible = (!REC_AUT_ULT_MODIF <> "")

Page 108: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 108 de 130

Label1.Visible = (!REC_AUT_ULT_MODIF) <> "" End If 'Abre la tabla PASOS_REC y carga los datos cadSQL = "SELECT * FROM PASOS_REC WHERE PAS_REC=" & NRec & " ORDER BY PAS_N_PASO" Set rstPas = db.OpenRecordset(cadSQL) With rstPas If Not .EOF Then .MoveLast .MoveFirst For I = 1 To .RecordCount TPasCom(I - 1).Text = !PAS_COM TPasAgua(I - 1).Text = !PAS_PAR1 TPasSosa(I - 1).Text = !PAS_PAR2 TPasAcido(I - 1).Text = !PAS_PAR3 TPasDesinf(I - 1).Text = !PAS_PAR4 TPasTensoac(I - 1).Text = !PAS_PAR5 TPasRecirc(I - 1).Text = !PAS_PAR6 .MoveNext Next I End If End With End If End With Call Cerrar_RST(rstRec) Call Cerrar_RST(rstPas) Call Cerrar_BD(db) End Sub Public Function CargaRecetaPLC(NRec As Integer, PLC As Boolean) Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim NPas, I, j As Integer Dim PasoVacio As Boolean Dim RecOK As Boolean Dim xx(10) As Integer Set db = OpenDatabase(DirDB) cadSQL = "SELECT * FROM PASOS_REC WHERE PAS_REC=" & NRec & " ORDER BY PAS_N_PASO" Set RST = db.OpenRecordset(cadSQL) With RST If .EOF Then I = MsgBox("LA RECETA Nº " & NRec & " NO ESTÁ REGISTRADA", vbCritical, "¡NO SE PUEDE CARGAR LA RECETA EN EL PLC!") GoTo fin Else RecOK = CompruebaReceta() If RecOK Then .MoveLast .MoveFirst NPas = 1 For I = 1 To .RecordCount - 1 PasoVacio = (Val(TPasAgua(I).Text) = 0) And (Val(TPasSosa(I).Text) = 0) PasoVacio = PasoVacio And (Val(TPasAcido(I).Text) = 0) And (Val(TPasDesinf(I).Text) = 0) PasoVacio = PasoVacio And (Val(TPasTensoac(I).Text) = 0) And (Val(TPasRecirc(I).Text) = 0) If Not PasoVacio Then NPas = NPas + 1 Else Exit For End If Next I RecEnPLC.COMRECETA = UCase(TRecComRec.Text) RecEnPLC.N_RECETA = NRec RecEnPLC.N_PASOS = NPas RecEnPLC.N_TANQUE = Deposito RecEnPLC.ESTADO = 0 RecEnPLC.PASO_ACTIVO = 0 RecEnPLC.TIEMPO = 0 For I = 1 To NPas RecEnPLC.PASOS(4 * I - 4).N_PASO_FOR = I RecEnPLC.PASOS(4 * I - 4).COMPASO = UCase(TPasCom(I - 1).Text) RecEnPLC.PASOS(4 * I - 4).N_PASO = 4 * I - 3 RecEnPLC.PASOS(4 * I - 4).TIPO_PASO = 1 RecEnPLC.PASOS(4 * I - 4).PAR_1 = !PAS_PAR1 RecEnPLC.PASOS(4 * I - 4).PAR_2 = Int(!PAS_PAR2 / Sosa) RecEnPLC.PASOS(4 * I - 4).PAR_3 = Int(!PAS_PAR3 / Acido)

Page 109: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 109 de 130

RecEnPLC.PASOS(4 * I - 4).PAR_4 = Int(!PAS_PAR4 / Desinf) RecEnPLC.PASOS(4 * I - 4).PAR_5 = Int(!PAS_PAR5 / Tensoac) RecEnPLC.PASOS(4 * I - 4).PAR_6 = 0 RecEnPLC.PASOS(4 * I - 4).PAR_7 = 0 RecEnPLC.PASOS(4 * I - 4).PAR_8 = 0 RecEnPLC.PASOS(4 * I - 4).PAR_9 = 0 RecEnPLC.PASOS(4 * I - 4).PAR_10 = 0 RecEnPLC.PASOS(4 * I - 3).N_PASO_FOR = I RecEnPLC.PASOS(4 * I - 3).COMPASO = UCase(TPasCom(I - 1).Text) RecEnPLC.PASOS(4 * I - 3).N_PASO = 4 * I - 2 RecEnPLC.PASOS(4 * I - 3).TIPO_PASO = 2 RecEnPLC.PASOS(4 * I - 3).ESTADO = 0 RecEnPLC.PASOS(4 * I - 3).PAR_1 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_2 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_3 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_4 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_5 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_6 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_7 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_8 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_9 = 0 RecEnPLC.PASOS(4 * I - 3).PAR_10 = 0 RecEnPLC.PASOS(4 * I - 2).N_PASO_FOR = I RecEnPLC.PASOS(4 * I - 2).COMPASO = UCase(TPasCom(I - 1).Text) RecEnPLC.PASOS(4 * I - 2).N_PASO = 4 * I - 1 RecEnPLC.PASOS(4 * I - 2).TIPO_PASO = 3 RecEnPLC.PASOS(4 * I - 2).ESTADO = 0 RecEnPLC.PASOS(4 * I - 2).PAR_1 = !PAS_PAR6 * 60 RecEnPLC.PASOS(4 * I - 2).PAR_2 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_3 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_4 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_5 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_6 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_7 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_8 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_9 = 0 RecEnPLC.PASOS(4 * I - 2).PAR_10 = 0 RecEnPLC.PASOS(4 * I - 1).N_PASO_FOR = I RecEnPLC.PASOS(4 * I - 1).COMPASO = UCase(TPasCom(I - 1).Text) RecEnPLC.PASOS(4 * I - 1).N_PASO = 4 * I RecEnPLC.PASOS(4 * I - 1).TIPO_PASO = 4 RecEnPLC.PASOS(4 * I - 1).ESTADO = 0 RecEnPLC.PASOS(4 * I - 1).PAR_1 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_2 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_3 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_4 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_5 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_6 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_7 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_8 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_9 = 0 RecEnPLC.PASOS(4 * I - 1).PAR_10 = 0 .MoveNext Next I Call Cerrar_BD(db) Call Cerrar_RST(RST) If Not PLC Then GoTo fin: 'Pasamos la cabecera de la receta 'Nº de la receta Call Normal2STEP5(NRec, 0) 'Nº de pasos buffer(2) = (4 * NPas) 'Nº de tanques buffer(3) = Deposito 'Fechas de inicio y final For I = 4 To 25 buffer(I) = 0 Next I 'escribe cabecera del DB res = d_field_write(100, 0, 26, buffer(0)) If res <> 0 Then Call Fallo_Com_PLC GoTo fin End If For I = 1 To 4 * NPas Call Normal2STEP5(RecEnPLC.PASOS(I - 1).N_PASO, (42 * (I - 1)))

Page 110: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 110 de 130

Call Normal2STEP5(RecEnPLC.PASOS(I - 1).TIPO_PASO, (42 * (I - 1) + 2)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).ESTADO, (42 * (I - 1) + 4)) For j = (42 * (I - 1) + 6) To (42 * (I - 1) + 21) buffer(j) = 0 Next j Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_1, (42 * (I - 1) + 22)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_2, (42 * (I - 1) + 24)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_3, (42 * (I - 1) + 26)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_4, (42 * (I - 1) + 28)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_5, (42 * (I - 1) + 30)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_6, (42 * (I - 1) + 32)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_7, (42 * (I - 1) + 34)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_8, (42 * (I - 1) + 36)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_9, (42 * (I - 1) + 38)) Call Normal2STEP5(RecEnPLC.PASOS(I - 1).PAR_10, (42 * (I - 1) + 40)) Next I res = d_field_write(100, 26, 168 * NPas, buffer(0)) If res <> 0 Then Call Fallo_Com_PLC GoTo fin End If Rec_Car = True End If End If End With fin: End Function Public Sub NuevaReceta() Dim db As Database Dim RST As Recordset Dim cadSQL As String Set db = OpenDatabase(DirDB) 'Abre la table RECETAS ordenada por nº de receta cadSQL = "SELECT * FROM RECETAS ORDER BY REC_NUM" Set RST = db.OpenRecordset(cadSQL) With RST 'Calcula el nº que le corresponde a la nueva receta y la establece como receta activa If Not .EOF Then .MoveLast .MoveFirst RecAct = .RecordCount + 1 Else RecAct = 1 End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) Call CargaReceta(RecAct) End Sub Public Sub Receta_Vacia(NRec As Integer) Dim I As Integer 'Inicializa el formulario Recetas con una recta vacía TRecNRec.Caption = "RECETA Nº " & NRec TRecComRec.Text = "" TRecFecCrea.Text = "" TRecCrea.Text = "" TRecFecMod.Text = "" TRecModifica.Text = "" For I = 0 To 14 TPasCom(I).Text = "" TPasAgua(I).Text = 0 TPasSosa(I).Text = 0 TPasAcido(I).Text = 0 TPasDesinf(I).Text = 0 TPasTensoac(I).Text = 0 TPasRecirc(I).Text = 0 Next I End Sub

Page 111: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 111 de 130

Public Function CompruebaReceta() As Boolean Dim I As Integer Dim PasoVacio As Boolean Dim CadMsg As String Dim db As Database Dim RST As Recordset CompruebaReceta = True Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset("SELECT * FROM CONFIGURACION") If RST.EOF Then CadMsg = "SISTEMA DESCONFIGURADO" CompruebaReceta = False GoTo MSG End If For I = 0 To 14 'Comprueba que no se trate de un paso vacio PasoVacio = (CDbl(TPasAgua(I).Text) = 0) And (CDbl(TPasSosa(I).Text) = 0) PasoVacio = PasoVacio And (CDbl(TPasAcido(I).Text) = 0) And (CDbl(TPasDesinf(I).Text) = 0) PasoVacio = PasoVacio And (CDbl(TPasTensoac(I).Text) = 0) And (CDbl(TPasRecirc(I).Text) = 0) If Not PasoVacio Then 'Reglas de coherencia de las recetas: '- Tiempo de recirculación >0 '- Litros de agua>0 '- No mezclar sosa y ácido '- Volúmen total '- Volúmenes de cada componente If CDbl(TPasAgua(I).Text) <= 0 Then CadMsg = "NO SE ADMITEN PASOS DE RECETA SIN AGUA (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If If CDbl(TPasSosa(I).Text) > 0 And CDbl(TPasAcido(I).Text) > 0 Then CadMsg = "NO SE PUEDE MEZCLAR SOSA Y ÁCIDO EN EL MISMO PASO (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If If CDbl(TPasRecirc(I).Text) <= 0 Then CadMsg = "TODOS LOS PASOS DEBEN INCLUIR UN TIEMPO DE RECIRCULACIÓN (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If If CDbl(TPasAgua(I)) > RST!CONF_VOLMAXPREP Then CadMsg = "EL VOLUMEN DE AGUA EXCEDE DEL MÁXIMO ADMISIBLE (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If If CDbl(TPasSosa(I)) > RST!CONF_VOLMAXSOSA Then CadMsg = "EL VOLUMEN DE SOSA EXCEDE DEL MÁXIMO ADMISIBLE (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If If CDbl(TPasAcido(I)) > RST!CONF_VOLMAXACIDO Then CadMsg = "EL VOLUMEN DE ACIDO EXCEDE DEL MÁXIMO ADMISIBLE (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If If CDbl(TPasTensoac(I)) > RST!CONF_VOLMAXTENSOAC Then CadMsg = "EL VOLUMEN DE TENSOACTIVO EXCEDE DEL MÁXIMO ADMISIBLE (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If If CDbl(TPasDesinf(I)) > RST!CONF_VOLMAXDESINF Then CadMsg = "EL VOLUMEN DE DESINFECTANTE EXCEDE DEL MÁXIMO ADMISIBLE (Paso" & I + 1 & ")" CompruebaReceta = False Exit For End If End If Next I MSG: Call Cerrar_BD(db) Call Cerrar_RST(RST) If Not CompruebaReceta Then I = MsgBox(CadMsg, vbOKOnly, "¡RECETA INCORRECTA!") End If

Page 112: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 112 de 130

End Function Public Sub Borrar_Receta(NRec As Integer) Dim db As Database Dim cadSQL As String 'Borra la receta de la tabla RECETAS Set db = OpenDatabase(DirDB) cadSQL = "DELETE * FROM RECETAS WHERE REC_NUM=" & NRec db.Execute cadSQL 'Borra todos los pasos de la receta de la table PASOS_REC cadSQL = "DELETE * FROM PASOS_REC WHERE PAS_REC=" & NRec db.Execute cadSQL Call Cerrar_BD(db) Call Reordena_Recetas End Sub Public Sub Reordena_Recetas() Dim db As Database Dim rstRec As Recordset Dim rstPas As Recordset Dim cadSQL As String Dim I, j As Integer Dim NodX As Node Set db = OpenDatabase(DirDB) cadSQL = "SELECT * FROM RECETAS ORDER BY REC_NUM" Set rstRec = db.OpenRecordset(cadSQL) With rstRec If Not .EOF Then .MoveLast .MoveFirst For I = 1 To .RecordCount .Edit 'Reordena la tabla RECETAS j = !REC_NUM !REC_NUM = I 'Reordena la tabla PASOS_REC cadSQL = "SELECT * FROM PASOS_REC WHERE PAS_REC=" & j & " ORDER BY PAS_N_PASO" Set rstPas = db.OpenRecordset(cadSQL) With rstPas If Not .EOF Then .MoveLast .MoveFirst For j = 1 To .RecordCount .Edit !PAS_REC = I !PAS_N_PASO = j .Update .MoveNext Next j End If End With .MoveNext Next I End If End With Call Cerrar_RST(rstRec) Call Cerrar_RST(rstPas) Call Cerrar_BD(db) Call CargaReceta(RecAct) End Sub Public Sub SalvarReceta(NRec As Integer) Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim I, iPas As Integer Dim RecMod As Boolean Dim Autor As String Dim PasoVacio As Boolean Set db = OpenDatabase(DirDB) 'Toma los datos del usuario

Page 113: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 113 de 130

cadSQL = "SELECT USU_DATOS FROM USUARIOS WHERE USUARIO='" & Usuario & "'" Set RST = db.OpenRecordset(cadSQL) If Not RST.EOF Then Autor = RST!USU_DATOS Else Autor = "Desconocido" End If Call Cerrar_RST(RST) 'Abre la tabla RECETAS cadSQL = "SELECT * FROM RECETAS WHERE REC_NUM=" & NRec & " ORDER BY REC_NUM" Set RST = db.OpenRecordset(cadSQL) 'Si la receta ya existe, la edita para salvar las modificaciones 'Si la receta no existe, la crea nueva With RST If Not .EOF Then .Edit RecMod = True Else .AddNew RecMod = False End If !REC_NUM = NRec !REC_COM = TRecComRec.Text If Not RecMod Then !REC_FEC_CREA = Date & " " & Time() !REC_AUTOR = Autor Else !REC_ULT_MODIF = Date & " " & Time() !REC_AUT_ULT_MODIF = Autor End If .Update End With Call Cerrar_RST(RST) 'Borra todos los pasos de la receta en cuestión de la tabla PASOS_REC cadSQL = "DELETE * FROM PASOS_REC WHERE PAS_REC=" & NRec db.Execute cadSQL 'Abre la tabla PASOS_REC para guardar los datos nuevos/modificados cadSQL = "SELECT * FROM PASOS_REC ORDER BY PAS_REC, PAS_N_PASO" Set RST = db.OpenRecordset(cadSQL) iPas = 1 For I = 0 To 14 PasoVacio = (CDbl(TPasAgua(I).Text) = 0) And (CDbl(TPasSosa(I).Text) = 0) PasoVacio = PasoVacio And (CDbl(TPasAcido(I).Text) = 0) And (CDbl(TPasDesinf(I).Text) = 0) PasoVacio = PasoVacio And (CDbl(TPasTensoac(I).Text) = 0) And (CDbl(TPasRecirc(I).Text) = 0) If Not PasoVacio Then With RST .AddNew !PAS_REC = NRec !PAS_N_PASO = iPas !PAS_PAR1 = CDbl(TPasAgua(I).Text) !PAS_PAR2 = CDbl(TPasSosa(I).Text) !PAS_PAR3 = CDbl(TPasAcido(I).Text) !PAS_PAR4 = CDbl(TPasDesinf(I).Text) !PAS_PAR5 = CDbl(TPasTensoac(I).Text) !PAS_PAR6 = CDbl(TPasRecirc(I).Text) !PAS_COM = TPasCom(I).Text .Update iPas = iPas + 1 End With End If Next I Call Cerrar_RST(RST) Call Cerrar_BD(db) Call CargaReceta(NRec) End Sub Formulario INFORMES Private Sub bordes(rango As String) Set xlr = xls.Range(rango) xlr.Borders(xlDiagonalDown).LineStyle = xlNone

Page 114: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 114 de 130

xlr.Borders(xlDiagonalUp).LineStyle = xlNone With xlr.Borders(xlEdgeLeft) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With xlr.Borders(xlEdgeTop) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With xlr.Borders(xlEdgeBottom) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With xlr.Borders(xlEdgeRight) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With xlr.Borders(xlInsideVertical).LineStyle = xlNone xlr.Borders(xlInsideHorizontal).LineStyle = xlNone xlr.Borders(xlDiagonalDown).LineStyle = xlNone xlr.Borders(xlDiagonalUp).LineStyle = xlNone With xlr.Borders(xlEdgeLeft) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With xlr.Borders(xlEdgeTop) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With xlr.Borders(xlEdgeBottom) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With xlr.Borders(xlEdgeRight) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With xlr.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With xlr.Borders(xlInsideHorizontal) On Error Resume Next .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub Private Sub Command1_Click() Dim I, j, k As Integer Dim r, c As Integer Dim strMsg As String Dim strFilter As String Dim aux As String Dim Fallo As Boolean Screen.MousePointer = vbHourglass Set xlb = xla.Workbooks.Add 'Crea un libro nuevo Set xls = xlb.Worksheets.Add 'Crea una hoja de calculo nueva xls.Activate 'Convierte esta hoja en la hoja activa. 'Es como hacer clic en la etiqueta de la hoja xls.Cells(2, 2) = txtComReceta.Text Set xlr = xls.Cells(2, 2) xlr.Select xlr.Font.size = 12

Page 115: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 115 de 130

xlr.Font.Bold = True xls.Cells(2, 6) = "FECHA" xls.Cells(2, 7) = RecEnPLC.INICIO Set xlr = xls.Range("F2:G2") xlr.Select xlr.Font.size = 12 xlr.Font.Bold = True xlr.Font.Color = vbGreen xls.Cells(3, 2) = "Nº de Receta" xls.Cells(3, 3) = txtNReceta xls.Cells(4, 2) = "Nº de Tanque" xls.Cells(4, 3) = txtNTanque xls.Cells(5, 2) = "Nº de Pasos" xls.Cells(5, 3) = txtNPasos xls.Cells(7, 2) = "PASOS" xls.Cells(7, 3) = "Agua (l)" xls.Cells(7, 4) = "Sosa (l)" xls.Cells(7, 5) = "Acido(l)" xls.Cells(7, 6) = "Desinfectante (ml)" xls.Cells(7, 7) = "Tensoactivo(l)" xls.Cells(7, 8) = "Recirculacion (min)" xls.Cells(24, 3) = "INICIO" xls.Cells(24, 4) = "FINAL" xls.Cells(24, 5) = "DURACIÓN" Set xlr = xls.Range("C24:E24") xlr.Select xlr.Font.size = 12 xlr.Font.Bold = True Set xlr = xls.Range("B7:H7") xlr.Select xlr.Font.size = 12 xlr.Font.Bold = True bordes ("B2:C5") Fallo = False For I = 0 To (txtNPasos * 4 - 1) 'Comprueba que la receta se ha terminado If (RecEnPLC.PASOS(I).INICIO = Empty Or RecEnPLC.PASOS(I).FINAL = Empty) Then Fallo = True strMsg = "La receta se ha detenido en el paso " strMsg = strMsg & vbCrLf & vbCrLf strMsg = strMsg & vbCrLf & "Se genera el fichero con los pasos completados" dev = MsgBox(strMsg, , "Aviso:Receta no finalizada") Exit For End If Next I If Fallo Then limite = Round(I / 4) Else limite = txtNPasos End If For I = 0 To limite - 1 xls.Cells(I + 8, 2) = RecEnPLC.PASOS(4 * I).COMPASO xls.Cells(I + 8, 3) = RecEnPLC.PASOS(4 * I).PAR_1 xls.Cells(I + 8, 4) = Round(RecEnPLC.PASOS(4 * I).PAR_2 * Sosa) xls.Cells(I + 8, 5) = Round(RecEnPLC.PASOS(4 * I).PAR_3 * Acido) xls.Cells(I + 8, 6) = Round(RecEnPLC.PASOS(4 * I).PAR_4 * Desinf) xls.Cells(I + 8, 7) = Round(RecEnPLC.PASOS(4 * I).PAR_5 * Tensoac) xls.Cells(I + 8, 8) = RecEnPLC.PASOS(4 * I + 2).PAR_1 / 60 xls.Cells(5 * I + 25, 2) = RecEnPLC.PASOS(4 * I).COMPASO Set xlr = xls.Cells(5 * I + 25, 2) xlr.Select xlr.Font.size = 12 xlr.Font.Bold = True xls.Cells(5 * I + 26, 2) = " Preparacion" xls.Cells(5 * I + 27, 2) = " Envío" xls.Cells(5 * I + 28, 2) = " Recirculación" xls.Cells(5 * I + 29, 2) = " Vaciado" Set xlr = xls.Range("B" & (5 * I + 26) & ":B" & (5 * I + 29)) xlr.Select xlr.Font.Color = vbBlue xls.Cells(5 * I + 26, 3) = RecEnPLC.PASOS(4 * I).INICIO xls.Cells(5 * I + 26, 4) = RecEnPLC.PASOS(4 * I).FINAL xls.Cells(5 * I + 26, 5) = CDate(RecEnPLC.PASOS(4 * I).FINAL - RecEnPLC.PASOS(4 * I).INICIO) xls.Cells(5 * I + 27, 3) = RecEnPLC.PASOS(4 * I + 1).INICIO xls.Cells(5 * I + 27, 4) = RecEnPLC.PASOS(4 * I + 1).FINAL xls.Cells(5 * I + 27, 5) = CDate(RecEnPLC.PASOS(4 * I + 1).FINAL - RecEnPLC.PASOS(4 * I + 1).INICIO) xls.Cells(5 * I + 28, 3) = RecEnPLC.PASOS(4 * I + 2).INICIO

Page 116: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 116 de 130

xls.Cells(5 * I + 28, 4) = RecEnPLC.PASOS(4 * I + 2).FINAL xls.Cells(5 * I + 28, 5) = CDate(RecEnPLC.PASOS(4 * I + 2).FINAL - RecEnPLC.PASOS(4 * I + 2).INICIO) xls.Cells(5 * I + 29, 3) = RecEnPLC.PASOS(4 * I + 3).INICIO xls.Cells(5 * I + 29, 4) = RecEnPLC.PASOS(4 * I + 3).FINAL On Error Resume Next xls.Cells(5 * I + 29, 5) = CDate(RecEnPLC.PASOS(4 * I + 3).FINAL - RecEnPLC.PASOS(4 * I + 3).INICIO) Set xlr = xls.Range("C" & (5 * I + 26) & ":E" & (5 * I + 29)) xlr.Select xlr.NumberFormat = "h:mm:ss" Next I bordes ("B7:H" & (txtNPasos + 7)) bordes ("B24:E" & ((txtNPasos * 5) + 24)) Set xlr = xls.Columns("B:H") 'Selecciona rango B-H xlr.Select xlr.EntireColumn.AutoFit 'Ajusta ancho columna al texto Screen.MousePointer = vbDefault strMsg = "Se han transportado los datos correctamente" strMsg = strMsg & vbCrLf & "a una hoja de calculo de Excel." strMsg = strMsg & vbCrLf & vbCrLf strMsg = strMsg & "¿Desea guardar la hoja de calculo de Excel?" If MsgBox(strMsg, vbQuestion + vbYesNo) = vbYes Then strFilter = "Archivos de excel(*.xls)|*.xls|Todos los archivos (*.*)|*.*" 'Filtro ficheros cdlgMain.Filter = strFilter aux = Left(Date, 2) & "_" & Mid(Date, 4, 2) & "_" & Right(Date, 4) cdlgMain.FileName = aux cdlgMain.ShowSave If cdlgMain.FileName <> "" Then ' Establecer CancelError a True cdlgMain.CancelError = True On Error GoTo CtrlError xls.SaveAs (cdlgMain.FileName) strMsg = "Los datos del reporte se han guardado en un archivo: " & vbCrLf & vbCrLf strMsg = strMsg & cdlgMain.FileName MsgBox strMsg, vbExclamation, "Hoja de calculo guardada" End If End If xlb.Saved = True xla.Quit Set xls = Nothing Set xlr = Nothing Set xlb = Nothing Set xla = Nothing Exit Sub CtrlError: ' El usuario ha hecho clic en el botón Cancelar If Err.Number = "1004" Then strMsg = "Error al guardar, compruebe que no este abierto el fichero" MsgBox strMsg, vbExclamation, "Error" End If xla.Quit Set xls = Nothing Set xlr = Nothing Set xlb = Nothing Set xla = Nothing Exit Sub End Sub Private Sub Command2_Click() Unload Me End Sub Private Sub Form_Load() txtComReceta.Text = RecEnPLC.COMRECETA txtNPasos.Text = RecEnPLC.N_PASOS txtNReceta.Text = RecEnPLC.N_RECETA txtNTanque.Text = RecEnPLC.N_TANQUE End Sub Formulario LOGIN Option Explicit

Page 117: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 117 de 130

Public LoginSucceeded As Boolean Private Sub cmdCancel_Click() 'establecer la variable global a false 'para indicar un inicio de sesión fallido LoginSucceeded = False Unload Me End Sub Private Sub cmdOK_Click() Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim I As Integer 'Abre la tabla usuarios donde están los usuarios reconocidos, 'sus contraseñas y niveles de acceso cadSQL = "SELECT * FROM USUARIOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST If Not .EOF Then .MoveLast .MoveFirst .FindFirst "USUARIO='" & UCase(cmbUsuarios.Text) & "'" If .NoMatch Then I = MsgBox("USUARIO DESCONOCIDO. Inténtelo de nuevo.", vbCritical, "LOGIN") Else If !Password = UCase(txtPassword.Text) Then NivelAcceso = !Nivel Usuario = !Usuario txtPassword.Text = "" Unload Me FPpal.TBPpal.Buttons.Item(3).ButtonMenus.Item(4).Enabled = True 'Habilita cerrar sesion Else I = MsgBox("CONTRASEÑA ERRÓNEA. Inténtelo de nuevo.", vbCritical, "LOGIN") End If End If End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Private Sub Form_Load() Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim I As Integer Dim cuenta As Integer 'Abre la tabla usuarios donde están los usuarios reconocidos, 'sus contraseñas y niveles de acceso cadSQL = "SELECT * FROM USUARIOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST .MoveLast .MoveFirst cuenta = .RecordCount ' cuenta los usuarios activos For I = cuenta To 1 Step -1 cmbUsuarios.AddItem RST.Fields(0).value ' Rellena valores del combo .MoveNext Next I End With Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Formulario NUEVO USUARIO Option Explicit

Page 118: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 118 de 130

Private Sub CmdAceptar_Click() Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim I As Integer Dim ValNiv As Integer 'Tratamiento de errores o datos incompletos ValNiv = Not (IsNumeric(TxtNivel.Text)) 'Si no es un numero If TxtUsuario.Text = "" Then I = MsgBox("Campo Usuario vacio", vbCritical, "LOGIN") Exit Sub ElseIf (TxtNivel.Text = "") Or (ValNiv) Or ((Val(TxtNivel.Text) < 0) Or (Val(TxtNivel.Text) > 10)) Then I = MsgBox("Campo Nivel vacio o no valido", vbCritical, "LOGIN") Exit Sub ElseIf TxtClave.Text = "" Then I = MsgBox("Campo clave vacio", vbCritical, "LOGIN") Exit Sub ElseIf TxtConfClave.Text = "" Then I = MsgBox("Campo confirmar clave vacio", vbCritical, "LOGIN") Exit Sub ElseIf TxtClave.Text <> TxtConfClave.Text Then I = MsgBox("La clave no ha sido confirmada correctamente", vbCritical, "LOGIN") Exit Sub End If 'Abre la tabla usuarios donde están los usuarios reconocidos, 'sus contraseñas y niveles de acceso cadSQL = "SELECT * FROM USUARIOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST If Not .EOF Then .MoveLast .MoveFirst .FindFirst "USUARIO='" & UCase(TxtUsuario.Text) & "'" If Not (.NoMatch) Then ' Si ya existe I = MsgBox("USUARIO REPETIDO. Inténtelo de nuevo.", vbCritical, "LOGIN") Exit Sub Else 'Si es nuevo lo registra .MoveLast .AddNew !Usuario = UCase(TxtUsuario.Text) !Nivel = TxtNivel.Text !Password = UCase(TxtClave.Text) .Update End If End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) Unload Me End Sub Private Sub CmdCancelar_Click() Unload Me End Sub Private Sub Form_Load() End Sub Formulario BORRAR USUARIO Option Explicit Private Sub cmdCancel_Click() Unload Me End Sub Private Sub cmdOK_Click()

Page 119: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 119 de 130

Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim cadSQL1 As String Dim I As Integer 'Abre la tabla usuarios donde están los usuarios reconocidos, 'sus contraseñas y niveles de acceso cadSQL = "SELECT * FROM USUARIOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST If Not .EOF Then .MoveLast .MoveFirst .FindFirst "USUARIO='" & UCase(cmbUsuarios.Text) & "'" If Not (.NoMatch) Then .Delete End If End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) Unload Me End Sub Private Sub Form_Load() Dim db As Database Dim RST As Recordset Dim cadSQL As String Dim I As Integer Dim cuenta As Integer 'Abre la tabla usuarios donde están los usuarios reconocidos, 'sus contraseñas y niveles de acceso cadSQL = "SELECT * FROM USUARIOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST .MoveLast .MoveFirst cuenta = .RecordCount ' cuenta los usuarios activos For I = cuenta To 1 Step -1 cmbUsuarios.AddItem RST.Fields(0).value ' Rellena valores del combo .MoveNext Next I End With Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Formulario PUPITRE Private Sub CBCerrarPupitre_Click() Hide End Sub Private Sub CBPET_Click() OPES = CBPET.value Call ANIMA End Sub Private Sub CBSeta_Click() OPEmerg = CBSeta.value Call ANIMA End Sub Private Sub CBValidar_Click()

Page 120: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 120 de 130

If TTAConectar = "" Then Exit Sub If TTAConectar >= 0 And TTAConectar <= 6 Then TAConectar = Val(TTAConectar) End If End Sub Private Sub Form_Load() Call ANIMA End Sub Private Sub ANIMA() If OPEmerg Then CBSeta.BackColor = BOTON_ON Else CBSeta.BackColor = BOTON_OFF End If If OPES Then CBPET.BackColor = BOTON_ON Else CBPET.BackColor = BOTON_OFF End If End Sub Formulario DEFECTOS Private Sub CBCerrarDef_Click() Unload Me End Sub Private Sub CBRefDef_Click() RELLENA_DEF End Sub Private Sub CBResetDefectos_Click() Dim db As Database Dim RST As Recordset Dim cadSQL As String ListDefectos.Clear 'Abre la tabla usuarios donde están los usuarios reconocidos, 'sus contraseñas y niveles de acceso cadSQL = "SELECT * FROM DEFECTOS" Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) With RST If Not .EOF Then .MoveLast .MoveFirst While Not .EOF .Delete .MoveNext Wend End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Private Sub Form_Load() RELLENA_DEF End Sub Private Sub RELLENA_DEF() Dim I As Integer Dim db As Database Dim RST As Recordset Dim cadSQL As String 'Abre la tabla usuarios donde están los usuarios reconocidos, 'sus contraseñas y niveles de acceso cadSQL = "SELECT * FROM DEFECTOS"

Page 121: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 121 de 130

Set db = OpenDatabase(DirDB) Set RST = db.OpenRecordset(cadSQL) ListDefectos.Clear With RST If Not .EOF Then .MoveFirst While Not .EOF ListDefectos.AddItem !FECHA & " " & !HORA & " " & !TEXTO .MoveNext Wend Else End If End With Call Cerrar_RST(RST) Call Cerrar_BD(db) End Sub Módulo GENERAL Type PASO_RECETA N_PASO_FOR As Integer COMPASO As String N_PASO As Integer TIPO_PASO As Integer ESTADO As Integer INICIO As Variant FINAL As Variant PAR_1 As Integer PAR_2 As Integer PAR_3 As Integer PAR_4 As Integer PAR_5 As Integer PAR_6 As Integer PAR_7 As Integer PAR_8 As Integer PAR_9 As Integer PAR_10 As Integer End Type Type RECETA N_RECETA As Integer N_PASOS As Byte N_TANQUE As Byte INICIO As Date FINAL As Date ESTADO As Integer PASO_ACTIVO As Integer TIEMPO As Integer PASOS(255) As PASO_RECETA COMRECETA As String End Type Global ContSleep As Long Global TanqueCon As Integer Global DepositoR As Integer Global TPasAct As Integer Global e(9, 7) As Boolean ' Matriz de entradas digitales Global a(5, 7) As Boolean ' Matriz de salidas digitales Global DBB34(0, 7) As Boolean Global DBB35(0, 7) As Boolean Global DBB44(0, 7) As Boolean Global DBB45(0, 7) As Boolean Global DBB58(0, 7) As Boolean Global DBB59(0, 7) As Boolean Global DBB61(0, 7) As Boolean Global PLC2PC(0, 7) As Boolean Global DEF(9, 7) As Boolean Global VolAguaR As Integer Global TBSosaR As Integer Global TBAcidoR As Integer Global TBTensoR As Integer Global TBDesinR As Integer Global TRecircR As Integer Global NRecPLC

Page 122: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 122 de 130

Global NTanquePLC As Integer Global EstadoPasoAc As Integer Global NPasoAc As Integer Global PLC_ON As Boolean 'Entradas de estado de la instalación Global EVAgua Global EBTenso As Boolean Global EBDens As Boolean Global EBAcido As Boolean Global EBSosa As Boolean Global EVDep As Boolean Global EFlujoDep As Boolean Global EBDep As Boolean Global EVCM1 As Boolean Global EVCM2 As Boolean Global EVCM3 As Boolean Global EVCM4 As Boolean Global EBCM As Boolean Global EFlujoCM As Boolean Global EVCF5 As Boolean Global EVCF6 As Boolean Global EVCF7 As Boolean Global EVCF8 As Boolean Global EBCF As Boolean Global EFlujoCF As Boolean Global ECParEm As Boolean Global ECFA As Boolean Global ETBDep As Boolean Global ETBC As Boolean Global ETBSosa As Boolean Global ETBAcido As Boolean Global ETBTenso As Boolean Global ETBDens As Boolean Global ESelMA As Boolean Global EITB0 As Boolean Global EITB1 As Boolean Global EITB2 As Boolean Global EITB3 As Boolean Global EITB4 As Boolean Global ECAA18 As Boolean Global ECIA18 As Boolean Global ECAA17 As Boolean Global ECIA17 As Boolean Global EInstSer As Boolean Global EFinRec As Boolean Global ERecPar As Boolean Global ERecEjec As Boolean Global EAutMovMan As Boolean Global EAutMovAut As Boolean Global EEspConfT As Boolean 'Entradas de defecto de la instalación Global DMVAgua As Boolean Global DMBSosa As Boolean Global DMBAcido As Boolean Global DMBDens As Boolean Global DMBTenso As Boolean Global DMVDep As Boolean Global DMVCM1 As Boolean Global DMVCM2 As Boolean Global DMVCM3 As Boolean Global DMVCM4 As Boolean Global DMBCM As Boolean Global DMBDep As Boolean Global DMCF5 As Boolean Global DMCF6 As Boolean Global DMCF7 As Boolean Global DMCF8 As Boolean Global DMBCF As Boolean Global DTCon As Boolean Global OVAgua As Boolean Global OBTenso As Boolean Global OBDens As Boolean Global OBAcido As Boolean Global OBSosa As Boolean Global OVDep As Boolean Global OBDep As Boolean

Page 123: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 123 de 130

'Órdenes al PLC Global OS0 As Boolean Global OS1 As Boolean Global OS2 As Boolean Global OS3 As Boolean Global OS4 As Boolean Global OS5 As Boolean Global OS6 As Boolean Global OS7 As Boolean Global OVCM1 As Boolean Global OVCM2 As Boolean Global OVCM3 As Boolean Global OVCM4 As Boolean Global OBCM As Boolean Global OVCF5 As Boolean Global OVCF6 As Boolean Global OVCF7 As Boolean Global OVCF8 As Boolean Global OBCF As Boolean Global OResDef As Boolean Global OResRec As Boolean Global OParRec As Boolean Global OArrRec As Boolean Global OAutMM As Boolean Global OAnSegTV As Boolean Global OTestCom As Boolean Global AutMovMan As Boolean Global OPES As Boolean Global OAuto As Boolean Global OPEmerg As Boolean Global XTPrep5 As Variant Global X2TV2 As Variant Global X2TV1 As Variant Global X1TV3 As Variant Global X1TV4 As Variant Global buffer(2600) As Byte Global bufferaux(112) As Byte Global RecEnPLC As RECETA Global Deposito As Integer Global Usuario As String Global NivelAcceso As Integer Global NuevaRec As Boolean Global Const ROJO = &HFF& Global Const AZUL = &HFF0000 Global Const VERDE = &HFF00& Global Const GRIS = &HC0C0C0 Global RecAct As Integer Global PasoAct As Boolean Global PasoAnt As Integer Global TAConectar As Integer 'Tanque a conectar Global Rec_Car As Boolean 'Variable a True si receta ha sido cargada Global Const DirDB = "D:\PFC\CIP_FERM\Base de Datos\BD_CIP" Global Const EV_ON = "D:\PFC\CIP_FERM\Imagenes\ValvulaON.gif" Global Const EV_OFF = "D:\PFC\CIP_FERM\Imagenes\ValvulaOFF.gif" Global Const BOMBA_ON = "D:\PFC\CIP_FERM\Imagenes\BombaON.gif" Global Const BOMBA_OFF = "D:\PFC\CIP_FERM\Imagenes\BombaOFF.gif" Global Const FLUJOSTATO_ON = "D:\PFC\CIP_FERM\Imagenes\FlujostatoON.gif" Global Const FLUJOSTATO_OFF = "D:\PFC\CIP_FERM\Imagenes\FlujostatoOFF.gif" Global Const TUBO_SOSA = &H808000 Global Const TUBO_ACIDO = &HFF& Global Const TUBO_DESIN = &HFF00& Global Const BOTON_ON = &HC0FFC0 Global Const BOTON_OFF = &H8000000F Global Const TUBO_AGUA = &HFF0000 Global Const TUBO_OFF = &HC0C0C0 Global Const UltimaE = 9 Global Const UltimaS = 5 Global Const PrimerCanalPLC_PC = 34 Global Const PrimerCanalPC_PLC = 44 Global Const PrimerCanalDef = 54 Global Const NumCanalDef = 10 Global Automatico As Boolean Global Manual As Boolean Global ANIMA_SINOPOTICO As Boolean Global TUBO_ON As Long Global TUBO_ON_SP As Long

Page 124: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 124 de 130

Global cnt As Integer Global xla As New Excel.Application Global xlb As New Excel.Workbook Global xls As New Excel.Worksheet Global xlr As Excel.Range Global Sosa As Variant, Acido As Variant, Tensoac As Variant, Desinf As Variant Global FFinReceta As Boolean 'Flanco positivo fin receta Public Sub GestionaAccesos(Nivel As Integer, F As Form) 'Autorización de movimientos manuales If Nivel <= 5 Then AutMovMan = False 'Determina la habilitación de los botones de los menús en función del nivel de acceso 'y de la pantalla en que estemos Select Case F.Name 'Pantalla principal Case "FPpal" FPpal.TBPpal.Buttons.Item(1).Enabled = (Nivel >= 0) FPpal.TBPpal.Buttons.Item(3).Enabled = (Nivel >= 0) FPpal.TBPpal.Buttons.Item(3).ButtonMenus.Item(2).Enabled = (Nivel >= 1) 'Cerrar sesion FPpal.TBPpal.Buttons.Item(3).ButtonMenus.Item(3).Enabled = (Nivel = 10) 'Alta usuario FPpal.TBPpal.Buttons.Item(3).ButtonMenus.Item(4).Enabled = (Nivel = 10) 'Baja usuario FPpal.TBPpal.Buttons.Item(5).Enabled = (Nivel >= 0) FPpal.TBPpal.Buttons.Item(7).Enabled = (Nivel >= 0) 'Pantalla de recetas Case "FRecetas" FRecetas.TBRecetas.Buttons.Item(1).Enabled = (Nivel >= 10) FRecetas.TBRecetas.Buttons.Item(3).Enabled = (Nivel >= 10) FRecetas.TBRecetas.Buttons.Item(5).Enabled = (Nivel >= 10) FRecetas.TBRecetas.Buttons.Item(7).Enabled = (Nivel >= 10) FRecetas.TBRecetas.Buttons.Item(9).Enabled = (Nivel >= 5) End Select End Sub Public Sub Cerrar_BD(db As Database) On Error Resume Next db.Close ' Cierra la base de datos Set db = Nothing ' libera la memoria End Sub Public Sub Cerrar_RST(RST As Recordset) On Error Resume Next RST.Close Set RST = Nothing End Sub Public Function Abrir_PLC() As Boolean res = unload_tool() res = load_tool(1, "S7ONLINE", plcadr) If res = 0 Then Abrir_PLC = True FPpal.TimAbrirPLC.Enabled = False FPpal.TimScanPLC = True Call Alarma("CONEXIÓN ESTABLECIDA CON EL PLC", VERDE) FPpal.CBConectar.Enabled = False FPpal.CBDesconectar.Enabled = True Call FPpal.habilita(False) Else Abrir_PLC = False FPpal.CBDesconectar.Enabled = False Call Fallo_Com_PLC End If End Function Public Function Cerrar_PLC() As Boolean res = unload_tool() Cerrar_PLC = True Call Alarma("CERRADA LA CONEXIÓN CON EL PLC", ROJO) End Function

Page 125: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 125 de 130

Public Sub Alarma(AlTxt As String, Color As Long) FPpal.TAlarmas.Text = AlTxt FPpal.TAlarmas.ForeColor = Color End Sub Public Sub Fallo_Com_PLC() PLC_ON = False FPpal.TimAbrirPLC.Enabled = True FPpal.TimScanPLC.Enabled = False Call Alarma("SIN CONEXIÓN CON EL PLC. Revise las conexiones entre el PC y el PLC. Avise a mantenimiento", ROJO) End Sub Public Function STEP5_2_BIN(Origen As Byte, Destino() As Boolean, Ind As Integer) Dim I As Integer Dim Num As Integer Num = Origen For I = 7 To 0 Step -1 If Num >= (2 ^ I) Then Destino(Ind, I) = True Num = Num - 2 ^ I Else Destino(Ind, I) = False End If Next I End Function Public Function STEP5_2_DEC(Ind As Integer) As Integer Dim CadHex As String Dim CadHexL As String Dim CadHexH As String CadHexL = Hex(buffer(Ind + 1)) CadHexH = Hex(buffer(Ind)) CadHex = "&H" & CadHexH & CadHexL STEP5_2_DEC = Val(CadHex) End Function Public Sub Normal2STEP5(Num As Integer, Ind As Integer) Dim CadHex As String Dim I, j As Integer CadHex = Hex(Num) j = 4 - Len(CadHex) For I = 1 To j CadHex = "0" & CadHex Next I buffer(Ind + 1) = Hex2Dec(Right(CadHex, 2)) buffer(Ind) = Hex2Dec(Left(CadHex, 2)) End Sub Public Function Hex2Dec(Cad As String) As Long Dim I, j As Integer Hex2Dec = 0 For I = 1 To 2 j = Asc(Mid(Cad, I, 1)) If (j <= 57) And (j >= 48) Then j = j - 48 ElseIf (j <= 70) And (j >= 65) Then j = j - 55 End If Hex2Dec = Hex2Dec + j * 16 ^ (2 - I) Next I End Function Public Sub MovMan(Aut) With FPpal 'Desautoriza los movimientos manuales OAutMM = OAutMM And Aut OVAgua = OVAgua And Aut

Page 126: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 126 de 130

OBTenso = OBTenso And Aut OBDens = OBDens And Aut OBAcido = OBAcido And Aut OBSosa = OBSosa And Aut OVDep = OVDep And Aut OBDep = OBDep And Aut OVCF5 = OVCF5 And Aut OVCF6 = OVCF6 And Aut OVCF7 = OVCF7 And Aut OVCF8 = OVCF8 And Aut OBCF = OBCF And Aut OBCM = OBCM And Aut OVCM1 = OVCM1 And Aut OVCM2 = OVCM2 And Aut OVCM4 = OVCM4 And Aut OResDef = OResDef And Aut OResRec = OResRec And Aut OParRec = OParRec And Aut OArrRec = OArrRec And Aut 'Inhabilita los botones de movimientos manuales .CBTenso.Enabled = Aut .CBDes.Enabled = Aut .CBAcido.Enabled = Aut .CBSosa.Enabled = Aut .CBVPrep.Enabled = Aut .CBBPrep.Enabled = Aut .CBVCM1.Enabled = Aut .CBVCM2.Enabled = Aut .CBVCM3.Enabled = Aut .CBVCM4.Enabled = Aut .CBBCM.Enabled = Aut .CBVCF5.Enabled = Aut .CBVCF6.Enabled = Aut .CBVCF7.Enabled = Aut .CBVCF8.Enabled = Aut .CBBCF.Enabled = Aut .CBTenso.value = .CBTenso.value And Aut .CBDes.value = Aut And .CBDes.value .CBAcido.value = Aut And .CBAcido.value .CBSosa.value = Aut And .CBSosa.value .CBVPrep.value = Aut And .CBVPrep.value .CBBPrep.value = Aut And .CBBPrep.value .CBVCM1.value = Aut And .CBVCM1.value .CBVCM2.value = Aut And .CBVCM2.value .CBVCM3.value = Aut And .CBVCM3.value .CBVCM4.value = Aut And .CBVCM4.value .CBBCM.value = Aut And .CBBCM.value .CBVCF5.value = Aut And .CBVCF5.value .CBVCF6.value = Aut And .CBVCF6.value .CBVCF7.value = Aut And .CBVCF7.value .CBVCF8.value = Aut And .CBVCF8.value .CBBCF.value = Aut And .CBBCF.value End With End Sub Módulo VBPRODAVE ' PRODAVE S7 declarations in Visual Basic ' for S7_300 ' '**************************************************************************************************************************** 'declarations for S7-200/300/400 '**************************************************************************************************************************** Type infotyp plcsw As Integer pgsw As Integer mlfb As String * 30 End Type Type mixdatatype

Page 127: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 127 de 130

type As Byte size As Byte bstno As Integer no As Integer End Type Type plcadrtype adr As Byte SEGMENTID As Byte SLOTNO As Byte RACKNO As Byte End Type Public Const BST_IN_RAM As Integer = 16 Public Const BST_IN_EPROM As Integer = 32 '**************************************************************************************************************************** 'declarations for S7-300/400 '**************************************************************************************************************************** Declare Function GetModuleFileNameA Lib "kernel32.dll" (ByVal hModule As Long, szPath As Byte, ByVal szPathLen As Long) As Long Declare Function load_tool Lib "w95_s7m.dll" (ByVal nr As Byte, ByVal dev As String, adr As plcadrtype) As Long Declare Function new_ss Lib "w95_s7m.dll" (ByVal nr As Byte) As Long Declare Function unload_tool Lib "w95_s7m.dll" () As Long Declare Function ag_info Lib "w95_s7m.dll" (value As infotyp) As Long ' blockno, no, amount, value Declare Function db_read Lib "w95_s7m.dll" (ByVal db As Long, ByVal dw As Long, anz As Long, value As Integer) As Long Declare Function db_write Lib "w95_s7m.dll" (ByVal db As Long, ByVal dw As Long, anz As Long, value As Integer) As Long Declare Function d_field_read Lib "w95_s7m.dll" (ByVal db As Long, ByVal nr As Long, ByVal anz As Long, value As Byte) As Long Declare Function d_field_write Lib "w95_s7m.dll" (ByVal db As Long, ByVal nr As Long, ByVal anz As Long, value As Byte) As Long '**************************************************************************************************************************** 'declarations for komfort.dll '**************************************************************************************************************************** 'errorno, errortext Declare Function error_message Lib "komfort.dll" (ByVal nr As Long, ByVal value$) As Long 'buffer, amount bytes Declare Sub swab_buffer Lib "komfort.dll" (value As Integer, ByVal anz As Integer) '**************************************************************************************************************************** 'variables para el programa CIP '**************************************************************************************************************************** Global DataTypeIdx As Integer Global OutputTypeIdx As Integer Global VerbIdx As Integer Global value_word(1024) As Integer Global value_byte(1024) As Byte Global plcadr As plcadrtype Global mixdata(17) As mixdatatype Global ErrorText As String Global res As Long Global AMOUNT As Long Global BLOCKNO As Long Global no As Long Global str As String

Page 128: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 128 de 130

9 Formularios Desarrollados Formulario PRINCIPAL

Formulario PUPITRE

Page 129: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 129 de 130

Formulario RECETAS Formulario DEFECTOS

Page 130: Tanques Industriales

Desarrollo de programas de supervisión y control aplicados a la automatización de limpieza de tanques industriales

Página 130 de 130

Bibliografía Web Wikipedia. La enciclopedia libre. • Enlace: http://es.wikipedia.org/wiki/Firmware • Enlace: http://es.wikipedia.org/wiki/SCADA • Enlace: http://es.wikipedia.org/wiki/Aut%C3%B3mata_programable • Enlace: http://es.wikipedia.org/wiki/Visual_Basic Web autómatas • Enlace: http://www.automatas.org Web Mixmail • Enlace: http://www.mailxmail.com/curso/informatica/controladores/ Web Universidad Autónoma Metropolitana • Enlace:http://luda.uam.mx/curso2/tema5/integral.html “Aprenda Visual Basic 6.0 como si estuviera en primero” Escuela Superior de Ingenieros Industriales de Navarra (vbasic60.pdf) "Autómatas Programables: fundamentos, manejo, instalación y prácticas" A. Porras / A.P.Montanero Ed. Mc Graw Hill Colección de manuales electrónicos Siemens • Comunicaciones (S7-300_IHBx_s.pdf) • Manual Prodave (Manual.pdf) • Catálogo de automatización ST70 (st7001_s.pdf) • Esquema de contactos (KOP) para S7-300 y S7-400 (s7kop_d.pdf)