Lenguajes de Programación Lenguajes de Programación Introducción a los Lenguajes de Programación Los lenguajes de programación utilizados en los controladores programables han evolucionado a la par que es estos se han desarrollado y expandido. Los lenguajes de programación permiten que el usuario introduzca programas de control dentro de un controlador programable, utilizando una sintaxis establecida. Los lenguajes de hoy tienen instrucciones nuevas y versátiles, que llevan a cabo potentes funciones que les permiten manejar grandes cantidades de información fácilmente. Tipos de Lenguajes de Programación Los lenguajes de programación para controladores más empleados hoy en día son: • Escalera • Grafcet • Booleano Los lenguajes de escalera y booleano implementan operaciones esencialmente de la misma manera, pero difieren en la forma como las instrucciones son representadas e ingresadas en el controlador. El lenguaje Grafcet implementa instrucciones de control de una manera diferente, basado en pasos y acciones en un programa orientado a gráficos Lenguaje de Escalera Los controladores programables fueron desarrollados para ser fácilmente programados utilizando expresiones y símbolos de los diagramas de relés, para representar la lógica de programación necesaria para el control de máquinas y procesos. El lenguaje de programación resultante, que usa los símbolos básicos de la lógica de relés se llama lenguaje de escalera. Controladores Programables Ramón Medina Página 2 de 89 Lenguajes de Programación Circuito en lógica cableada y su correspondiente implementación en diagrama de escalera La evolución del lenguaje de escalera original ha ido añadiendo instrucciones cada vez más poderosas. Estas nuevas funciones han sido agregadas a las operaciones básicas de relé, temporizado y conteo. El término función es utilizado para describir instrucciones, que como su nombre implica, llevan a cabo funciones de transferencia de datos dentro de los controladores programables. Estas instrucciones siguen basadas en los principios de la lógica básica de relés, aunque permiten la implementación de operaciones complejas. Las adiciones a la lógica básica de relés incluyen bloques de función que usan un conjunto de instrucciones para operar sobre un bloque de información. El uso de los bloques de función incrementa la potencia del lenguaje de escalera básico, conformando lo que se conoce como lenguaje de escalera mejorado. Formato de bloques de función mejorados El formato de representación de las funciones mejoradas dependen del fabricante del controlador programable; sin embargo, todas las funciones básicas y mejoradas similares, operan de la misma manera. Como se indicó anteriormente, los lenguajes de escalera disponibles pueden ser divididos en: Controladores Programables Ramón Medina Página 3 de 89 Lenguajes de Programación • Lenguaje de escalera básico • Lenguaje de escalera mejorado Cada uno de los grupos consta de muchas instrucciones que forman el lenguaje. La clasificación de qué instrucciones caen dentro de cada categoría, difiere de un fabricante a otro, ya que no existe una clasificación formalmente estandarizada. Sin embargo, a lo largo de los años se ha establecido un estándar de facto. Algunas veces las instrucciones del lenguaje básico de escalera son frecuentemente referidas como lenguajes de bajo nivel. Clasificación de las instrucciones La línea que define la agrupación de instrucciones es típicamente establecida entre categorías funcionales. Estas categorías incluyen: • • • • • • • • • Relé Temporizado Conteo Control de programa y flujo Aritmética Manipulación de datos Transferencia de datos Funciones especiales (secuenciadores) Comunicación a través de la red Aunque las categorías están claramente definidas, la clasificación es subjetiva. Sin embargo, no obstante la clasificación, el hecho es que mientras más categorías de instrucciones un controlador soporta, más poderosas son las estrategias de control que se pueden implementar con él. Lo usual es que controladores pequeños tengan sólo instrucciones básicas con tal vez algunas instrucciones mejoradas. Los controladores más potentes, incorporan conjuntos de instrucciones avanzadas. Sin embargo, la tendencia es hacia que los controladores pequeños incorporen instrucciones avanzadas. Controladores Programables Ramón Medina Página 4 de 89 Lenguajes de Programación Grafcet Grafcet (Graphe Fonctionnel de Commande Étape Transition) es un lenguaje gráfico simbólico que fue originado en Francia, que representa el programa de control como pasos o etapas de la máquina o proceso. Grafcet es el fundamento del estándar IEC 1131 para Diagramas de Funciones Secuenciales (SFC) que permite que varios lenguajes de programación de controladores puedan ser utilizados en un único programa de control. Lógica cableada y su representación correspondiente en Grafcet Los diagramas Grafcet proporcionan una representación parecida a la de un diagrama de flujo, de los eventos que se dan en cada etapa de un programa de control. Estos diagramas usan tres componentes principales - pasos, transiciones y acciones - para representar eventos. EL estándar IEC 1131 utiliza también esos mismos componentes; sin embargo, las instrucciones dentro de las acciones pueden utilizar cualquiera de los lenguajes posible, incluyendo diagrama de escalera. Algunos controladores programables pueden ser directamente en lenguaje Grafcet. Lo usual sin embargo, es que los fabricantes proporcionen herramientas para programación Grafcet fuera de línea, que es convertido en lenguaje de escalera o lenguaje booleano para ser descargado en el controlador. Traducción Grafcet Controladores Programables Ramón Medina Página 5 de 89 Lenguajes de Programación Booleano Algunos fabricantes de controladores programables utilizan lista de instrucciones (a veces llamado lenguaje booleano) para programar sus equipos. La lista de instrucciones utiliza sintaxis del álgebra booleana para ingresar y explicar la lógica de control; usan funciones lógicas AND, OR y NOT para implementar programas de control. Lógica cableada y su correspondiente representación booleana El lenguaje booleano es básicamente una manera de ingresar programas de control en un controlador, en lugar de propiamente un lenguaje orientado a instrucciones. Cuando se despliega en un dispositivo de programación, el lenguaje booleano es muchas veces visualizado como diagrama de escalera en lugar de los comandos booleanos que definen la instrucción. Formato de Lenguaje de Escalera El diagrama de escalera es un conjunto de instrucciones simbólicas que son utilizadas para crear programas de control. Los símbolos pueden ser configurados para obtener la lógica de control deseada. El lenguaje de escalera es también conocido con el nombre de simbología de contactos. Las funciones principales de un programa en diagrama de escalera están orientadas a controlar salida y ejecutar funciones operacionales, basado en la condición de las entradas. Los diagramas de escalera utilizan peldaños (rung) para acometer su control. Controladores Programables Ramón Medina Página 6 de 89 Lenguajes de Programación Estructura del peldaño de un diagrama en escalera En general, un peldaño consiste de un conjunto de condiciones de entrada (representado por instrucciones de contactos) y una instrucción de salida al final del peldaño (representado por un símbolo de bobina). Las instrucciones de contacto para un peldaño puede ser referenciados como condiciones de entrada, condiciones de peldaño o lógica de control. Un peldaño es VERDAD cuando su lógica tiene continuidad. La continuidad lógica existe cuando la potencia fluye a través del peldaño de izquierda a derecha. La ejecución de eventos lógicos que habilitan la salida, proveen esta continuidad. En un diagrama de escalera, la línea de la izquierda simula la línea L1 de un diagrama de relé, mientras que la de la derecha simula la línea L2 de una representación electromecánica. La continuidad ocurre cuando el paso entre esas dos líneas contiene elementos de contacto en condición cerrada, permitiendo que la potencia fluya de izquierda a derecha. Esos elementos de contacto se cierran o abren de acuerdo al estado de las entradas referenciadas. Ilustración de varios caminos de continuidad en un diagrama de escalera Controladores Programables Ramón Medina Página 7 de 89 Lenguajes de Programación La continuidad es normalmente representada por los dispositivos de monitoreo del controlador, por líneas resaltadas. Monitoreo de un dispositivo mostrando (a) continuidad en el peldaño y (b) continuidad en una entrada Cuando un diagrama de escalera contiene un bloque funcional, las instrucciones de contacto se usan para representar las condiciones de entrada que habilitan la lógica del bloque. Un bloque funcional puede tener una o varias entradas de habilitación que controlan su operación. Adicionalmente, puede tener una o varias salidas, que representan el estado de la función que se ejecuta. Bloques funcionales con (a) una línea de habilitación y una salida y (b) una línea de habilitación, un comando de inicio de conteo y dos salidas Dependiendo de la instrucción, se habilitan otras líneas que manejan el bloque utilizando funciones de reinicialización o control. Para hacer que un bloque esté activo en todo momento sin ninguna lógica que lo controle, el usuario puede omitir toda lógica de contacto y colocar una línea de continuidad. Controladores Programables Ramón Medina Página 8 de 89 Lenguajes de Programación Bloque de función que está siempre habilitado La matriz de peldaños de escalera determina el número máximo de elementos de contacto que pueden ser utilizados para programar un peldaño. El tamaño de la matriz es diferente según el fabricante y del dispositivo de programación empleado. Para operaciones de bloques funcionales, la matriz de escalera puede tener menos elementos de contacto disponibles, porque la representación del bloque de función toma espacio en la matriz. En controladores con formatos de escalera mejorados, la matriz puede usar uno o más espacios de símbolos de contacto para representar la instrucción en el dispositivo de programación. Matriz de condiciones de entrada en un diagrama de escalera en formato de bloque Matriz de condiciones de entrada en un diagrama de escalera en formato de instrucciones de escalera mejoradas La matriz de escalera representa todas las posibles posiciones donde se pueden colocar símbolos de contacto. Los dispositivos de programación normalmente despliegan todas esas posibles posiciones en la pantalla, permitiendo que los usuarios coloquen los contactos donde deseen. Sin embargo, según el fabricante, algunas reglas para la colocación de contactos pueden aplicar. La mayoría de los controladores no permiten contactos que provoquen un flujo de potencia de derecha a izquierda. Por lo tanto, estrategias de control Controladores Programables Ramón Medina Página 9 de 89 Lenguajes de Programación que hagan uso de este recurso, deben ser reescritas de tal manera que sólo incluyan lógicas donde el flujo sea de izquierda a derecha. Flujo inverso en el contacto D Ejemplo 1 Se pide resolver la lógica de escalera representada en la siguiente figura, de tal manera que no exista la condición de flujo reverso. Dicha condición no es parte de la lógica requerida para que la salida sea energizada. Solución La lógica del flujo directo determina a salida Y. La implementación utilizando conceptos lógicos es como se muestra: Controladores Programables Ramón Medina Página 10 de 89 Lenguajes de Programación Dicha ecuación puede ser simplificada utilizando álgebra de Boole para obtener la siguiente ecuación: Esta es equivalente al circuito lógico: Y equivalente al siguiente diagrama de escalera: Ejemplo 2 Se pide resolver el siguiente caso de tal manera que no exista flujo reverso, considerando que dicho flujo es necesario para la lógica de control. Controladores Programables Ramón Medina Página 11 de 89 Lenguajes de Programación Solución La lógica requerida para la salida Y queda reflejada en la siguiente ecuación lógica: El término F•D•B•C implementa la secuencia correspondiente al flujo inverso que requiere la salida Y. El diagrama de escalera correspondiente se muestra a continuación: Instrucciones de Relés Las instrucciones de relé son las instrucciones más básicas del lenguaje de escalera. Estas instrucciones representan estados ENCENDIDO/APAGADO de las entras y salidas conectadas. Las instrucciones de relés usan dos tipos de símbolos: contactos y bobinas. Los contactos representan las condiciones de entrada que deben ser evaluadas en un peldaño específico, para determinar el control de la salida. Las bobinas representan las salidas de los peldaños. Controladores Programables Ramón Medina Página 12 de 89 Lenguajes de Programación Instrucciones de relé En un programa, cada contacto y bobina está referenciado con una dirección, la cual identifica que está siendo evaluado o controlado. La dirección referencia la tabla de entradas y salidas de la entrada o salida conectada, o del bit de almacenamiento interno. El formato de los contactos depende de la lógica de control deseada. Los contactos pueden ser colocados en serie, paralelo o serie-paralelo, según lo requiera la estrategia de control de una salida en particular. Cuando la continuidad lógica existe, la condición del peldaño es VERDADERA; esto significa, que el peldaño controlará la salida especificada. Si la condición del peldaño es FALSA, no existe continuidad. Las instrucciones de relés proporcionan la misma funcionalidad que la lógica de relé cableada, pero con mayor flexibilidad. Estas instrucciones proporcionan la capacidad de examinar el estado ENCENDIDO/APAGADO de bits específicos en memoria y controlar el estado de salidas internas y externas. Examinar ENCENDIDO / Normalmente Abierto Una instrucción Examinar ENCENDIDO (examine-ON) referidas como contacto normalmente abierto (NO), verifica la condición de ENCENDIDO de una dirección referenciada. Esta dirección puede referenciar un bit de la tabla de entrada, correspondiendo a un dispositivo de entrada, un bit de salida en la tabla de estados internos, o un bit en la tabla de salida, correspondiendo a un dispositivo de salida. Durante la ejecución de una instrucción Examinar ENCENDIDO en el programa de control, el procesador determina si la dirección referenciada está en condición ENCENDIDO. Si la Controladores Programables Ramón Medina Página 13 de 89 Lenguajes de Programación dirección contiene un cero lógico (APAGADO), el procesador no cambia el estado del contacto normalmente abierto y por ende, no proporciona continuidad al peldaño. Si la dirección referenciada contiene un uno lógico (ENCENDIDO), el procesador cierra la condición normalmente abierto, proporcionando flujo de potencia a través del peldaño. Instrucción examinar ENCENDIDO con lógica 0 y con lógica 1 Examinar APAGADO / Normalmente Cerrado Una instrucción Examinar APAGADO (Examine OFF), llamada contacto normalmente cerrado (NC), verifica una condición de APAGADO en la dirección referida. Al igual que en el caso de la instrucción Examinar ENCENDIDO, la dirección referenciada puede estar en la tabla de entradas, salidas o estados internos. Durante la ejecución de una instrucción Examinar APAGADO, el procesador verifica que la dirección referenciada este APAGADA. Si la dirección contiene un cero lógico (APAGADO), la instrucción continuará permitiendo el flujo de potencia (continuidad) a través de sus contactos normalmente cerrados. Si la dirección contiene un uno lógico (ENCENDIDO), la instrucción abrirá los contactos normalmente cerrados, rompiendo la continuidad en el peldaño. Una instrucción Examinar APAGADO puede ser asociada con una función lógica NOT. Controladores Programables Ramón Medina Página 14 de 89 Lenguajes de Programación Instrucción examinar APAGADO con lógica 0 y con lógica 1 Bobina de Salida Una instrucción de bobina de salida controla bien sea una salida real (conectada al controlador a través de una interface de salida) o un estado interno (relé de control). Esta instrucción utiliza una dirección de salida en su área de almacenamiento interna. Durante la ejecución de una instrucción de bobina de salida, el procesador evalúa todas las condiciones de entrada en el peldaño. Si no existe continuidad, el procesador coloca un cero en el bit de la dirección de la bobina de salida, indicando una condición APAGADA. Si por el contrario el procesador detecta continuidad, el procesador coloca un uno lógico en la dirección referenciada por la instrucción de bobina de salida. Este estado lógico uno indica una condición ENCENDIDA para la instrucción de bobina de salida. Por lo tanto, si la instrucción de bobina está referenciando un bit en la tabla de salidas, el procesador encenderá la salida correspondiente. Esto a su vez encenderá el dispositivo de campo conectado al terminar referenciado por la dirección de la bobina de salida. El procesador encenderá el dispositivo sólo después de haber resuelto completamente el programa y actualizado las salidas al final del ciclo de ejecución. Controladores Programables Ramón Medina Página 15 de 89 Lenguajes de Programación Instrucción de bobina de salida con lógica 0 y con lógica 1 Cuando una bobina de salida se usa como estado interno, la dirección hace referencia a un bit en la tabla de estados internos. En este caso, cuando la bobina de salida es ENCENDIDA, el bit correspondiente se coloca en estado uno. Estas salidas internas son utilizadas cuando el programa requiere de secuencias de bloqueo cruzado o cuando una salida real no es necesaria. Los contactos normalmente abiertos y cerrados de una bobina de salida se abrirán o cerrarán de acuerdo con el estado de la bobina. Contactos normalmente abiertos y cerrados manejando bobinas internas y reales Bobina de Salida Negada Una instrucción de bobina de salida negada es esencialmente lo opuesto a una instrucción de bobina de salida. Si no existe continuidad en el peldaño, la instrucción ENCIENDE el bit de salida correspondiente. Si existe continuidad, la salida es APAGADA. Cuando una bobina de salida negada está encendida, sus contactos de referencia cambian de estado. Si la bobina de Controladores Programables Ramón Medina Página 16 de 89 Lenguajes de Programación salida negada está APAGADA, sus contactos auxiliares permanecen en sus estados por defecto. Diagrama de escalera donde se ilustra un bobina negada Una instrucción de bobina negada puede ser complicada de implementar. Por esta razón, es frecuentemente más fácil obtener dicha funcionalidad aplicando reglas Booleanas a la expresión lógica que maneja el peldaño. Ejemplo 3 Implementar una lógica de escalera equivalente a la que se muestra, utilizando una salida de bobina negada. Solución La expresión lógica asociada a Y se describe con la siguiente ecuación: Utilizando las Leyes de Morgan, la función Y negada puede ser expresada como: Y el diagrama de escalera correspondiente se muestra a continuación: Controladores Programables Ramón Medina Página 17 de 89 Lenguajes de Programación En esta lógica, la salida Y se ACTIVARÁ si y A y B están ENCENDIDOS o si C y B están ENCENDIDOS. Este último circuito es lógicamente idéntico al primero. Ejemplo 4 Implementar una lógica Y negada sin utilizar bobina de salida negada Solución La forma más sencilla es utilizar el diagrama anterior, agregando un peldaño adicional como se indica en la figura Bobina de Salida con Memoria La instrucción de enganche de bobina de salida (latch coil) ocasiona que una salida permanezca energizada aún cuando cambie el estado de los contactos que causaron su Controladores Programables Ramón Medina Página 18 de 89 Lenguajes de Programación energización. Si cualquier peldaño tiene continuidad lógica, la instrucción ENCIENDE el bit de salida y lo mantiene así, aún cuando la continuidad lógica se pierda. La salida permanecerá ENCENDIDA hasta que sea 'borrada' con la instrucción correspondiente. La instrucción de borrado es la única manera automática (programada) de APAGAR la salida. La instrucción de desenganche de una bobina de salida APAGA una bobina de salida enganchada. Cuando el peldaño tiene continuidad lógica, la instrucción APAGA la salida referida. Instrucciones de enganche y desenganche en formato de relé Las instrucciones de enganche y desenganche pueden ser representadas por un bloque de función. Bloques funcionales de enganche y desenganche Salida de Pulso Una instrucción de salida de pulso opera de manera parecida a como lo hace la bobina de salida. Si el peldaño tiene continuidad lógica, la salida de pulso es ENCENDIDA. Sin embargo, la duración del estado ENCENDIDO es de un ciclo de ejecución o menos, dependiendo de dónde esté localizado en el programa de control. Las salidas de pulso son normalmente utilizadas para reinicializar condiciones en un ciclo de ejecución. Controladores Programables Ramón Medina Página 19 de 89 Lenguajes de Programación Instrucción de salida de pulso y su diagrama de tiempo Dependiendo del tipo de controlador que se use, la salida de pulso puede ser disparada por un flanco de bajada o de un flanco de subida. Contacto de Transición La instrucción de contacto de transición proporciona un pulso cuando la señal que la dispara hace una transición de ENCENDIDO a APAGADO o de APAGADO a ENCENDIDO. En una instrucción de flanco de subida, los contactos cerrarán por exactamente un ciclo de ejecución cada vez que la señal de disparo pasa de APAGADO a ENCENDIDO. El contacto permitir la continuidad lógica durante el ciclo de ejecución luego de lo cual, se abrirá nuevamente, aunque la señal de disparo continúe en su estado de aserción. La señal de disparo debe hacer nuevamente la transición de APAGADO a ENCENDIDO para que el contacto se pueda cerrar nuevamente. De manera similar, en una instrucción de flanco de bajada, la señal de disparo debe ir de ENCENDIDO a APAGADO para cerrar el contacto por un ciclo de ejecución. La señal de disparo puede ser una entrada o salida externa así como una salida interna. Contactos transicionales por flancos de subida y bajada, y sus diagramas de tiempo Los controladores programables que no proveen instrucciones de salida de pulso, generalmente cuentan con instrucciones de contacto de transición. Al igual que en las salidas de pulso, el contacto de transición es usado para reinicializar condiciones en un ciclo de ejecución, como por ejemplo, una bobina de salida con memoria (desenganchar). Controladores Programables Ramón Medina Página 20 de 89 Lenguajes de Programación Programación de Instrucciones Relés Evaluación de la Ejecución de la Escalera La evaluación del barrido (ciclo de ejecución) es un concepto importante, ya que define el orden en que el procesador ejecutará el diagrama de escalera. El procesador inicia la ejecución del diagrama de escalera luego de que ha leído el estado de las entradas y actualizado la tabla de entradas. Comienza desde el tope del programa (primer peldaño) y continua ejecutándolos secuencialmente uno a la vez. A medida que resuelve cada peldaño, examina las direcciones referenciadas por cada instrucción programada, para evaluar la continuidad lógica. Si la salida de un peldaño afecta peldaños subsiguientes, el procesador considerará cualquier cambio en el mismo barrido. Sin embargo, si la salida de un peldaño afecta peldaños anteriores, el procesador no regresará para resolverlos. Esto se puede comprender con mayor claridad al observar las siguientes figuras. El contacto normalmente abierto 10, que asumiremos corresponde a un pulsador, activa el primer peldaño. Si el contacto 10 se ENCIENDE, el a su vez encenderá la salida 100. En los peldaños siguientes, el contacto 100 enciende la salida 101, el contacto 101 enciende la salida 102 y el contacto 102 enciende la salida 103. Aunque estén conectados en diferentes peldaños, todas las salidas se encenderán en el mismo ciclo de ejecución, porque el procesador actualiza los dispositivos físicos cuando este finaliza. En este caso, si las salidas 100, 101, 102 y 103 estuvieran conectadas a lámparas piloto, todas ellas se encenderían al mismo tiempo. Diagrama de escalera donde todas las salidas se encienden en el mismo ciclo de ejecución La siguiente figura ilustra la misma lógica de escalera, pero con los peldaños ubicados en orden inverso. Asumiendo que la entrada 10 es presionada en el primer barrido, el procesador debe hacer cuatro ciclos de ejecución antes de energizar la salida 103. La lógica que el procesador usa en el primer barrido es la que se describe a continuación. Cuando la entrada 10 es activada, el procesador examina la referencia 102 y encuentra que está APAGADA; por lo tanto, la salida 103 permanece APAGADA. En el segundo peldaño el contacto 101 está APAGADO; por lo tanto, la salida 102 permanece APAGADA. En el tercer Controladores Programables Ramón Medina Página 21 de 89 Lenguajes de Programación peldaño, el contacto 100 está apagado, de tal manera que la salida 101 permanece APAGADA. En el cuarto peldaño, el contacto 10 está ENCENDIDO, porque el pulsador fue presionado, de tal manera que la salida 100 se enciende. El siguiente ciclo de ejecución (segundo), si el pulsador permanece ENCENDIDO, la salida 101 se encenderá porque al final del primer barrido, la dirección de referencia 100 fue puesta a uno lógico. Esta lógica continuará hasta el cuarto barrido, cuando las cuatro salidas estarán ENCENDIDAS. Las salidas se apagarán de la misma manera, cuando el pulsador sea liberado. Diagrama de escalera donde las salidas se encienden en diferentes ciclos de ejecución La operación física de un circuito como el de la última figura es caso imposible de observar mientras el controlador ejecuta el programa, porque este completa su ciclo de ejecución en milisegundos. Las lámparas piloto parecerá que se encienden al mismo tiempo, aún cuando realmente lo hagan en diferentes ciclos de ejecución. La única forma de observar las salidas del diagrama de escalera es utilizando la operación de ejecución de un sólo ciclo. Con esta operación, el procesador lee las entradas, ejecuta la lógica, actualiza las salidas y se detiene hasta que otra operación un sólo ciclo sea ejecutada. La operación de un sólo ciclo de ejecución es usada generalmente durante el período de prueba del programa de control. Lo importante en este caso es que si se desea que la salida de un peldaño tenga efecto en otro en el mismo ciclo de ejecución, este debe ser programado primero. Si no se hace así, podrían suscitarse problemas de orden de ejecución, especialmente cuando se emplean contactos de transición y salidas de pulso para desenganchar salidas. La siguiente figura ilustra este tipo de problema, donde la instrucción de desenganche de la salida nunca ocurrirá. Una vez que se cierra el contacto 10, el enganche de la salida 100 sólo podrá ser desecho por la activación del contacto 11. Cuando se cierra el contacto 12, dispara un pulso de salida 11 (o el contacto transicional 12) durante un ciclo de ejecución. Sin embargo, al final del ciclo, la salida de pulso se apaga, de tal manera que no alcanza a desenganchar la salida 100 en el siguiente barrido. Controladores Programables Ramón Medina Página 22 de 89 Lenguajes de Programación Ni la salida de pulso ni el contacto transicional serán capaces de desenganchar la bobina 100 Programando Entradas Normalmente Cerradas Para explicar cómo programar entradas normalmente cerradas, veamos el siguiente ejemplo. Supongamos que queremos implementar una lógica idéntica a la del circuito presentado. Lógica cableada Implementar la misma lógica significa que la lámpara piloto PL1 en el controlador debe comportarse de la misma manera que el circuito cableado. Si PB1 no es presionado, PL1 estará ENCENDIDA; al presionar PB1, PL1 se apaga. Las figuras muestran dos métodos posibles para programar PB1 e implementar la lógica. A primera vista podría pensarse que la primera figura contiene la solución; sin embargo, esto no es verdad. La solución correcta es la que se muestra en la segunda figura. Implementación lógica con PB1 programado como contacto normalmente cerrado Controladores Programables Ramón Medina Página 23 de 89 Lenguajes de Programación Implementación lógica con PB1 programado como contacto normalmente abierto En la primera figura, la dirección de referencia de PB1 (entrada 10) es programada como un contacto normalmente cerrado (examinar APAGADO) que maneja la bobina de salida 100, que está conectada a la lámpara piloto PL1. Cuando el controlador inicia, lee el estado del dispositivo conectado a la entrada 10 y almacena la información en la tabla de entradas. Si PB1 no es presionado, el procesador lee la entrada 10 como un uno lógico. Durante la ejecución de la lógica de escalera, el controlador evaluará la instrucción examinar APAGADO, y como la referencia (entrada 10) está ENCENDIDA, abrirá el contacto normalmente cerrado, interrumpiendo la continuidad. Por lo tanto, la salida 100 estará desactivada y PL1 no se encenderá. . Si por el contrario PB1 es presionado, la localidad 10 estará en un cero lógico. La instrucción examinar APAGADO del procesador estará en su condición acertada proporcionando continuidad lógica al peldaño y encendiendo la salida 100 y la lámpara piloto PL1. Continuidad lógica con (a) PB1 sin presionar y (b) PB1 presionado En el segundo de los casos planteados originalmente, la condición de entrada normalmente cerrada fue programada como una instrucción examinar ENCENDIDO. Durante la operación, si PB1 no es presionado, la entrada 10 permanece en estado ENCENDIDO. Cuando el procesador evalúa el peldaño, su búsqueda de una condición ENCENDIDA en la referencia 10 será VERDAD. Por lo tanto, el contacto 10 se cerrará proporcionando continuidad lógica encendiendo la salida 100 y la lámpara piloto. Por otra parte, cuando PB1 es presionada, la entrada tendrá un estado APAGADO y el procesador almacenará un cero lógico en la tabla de entrada. Durante la evaluación del peldaño, el procesador encontrará que la condición ENCENDIDA en la referencia 10 es FALSA (la entrada 10 está apagada) por lo que no habrá continuidad lógica porque los contactos permanecerán abiertos. Por lo tanto, la salida 100 y la lámpara piloto estarán apagadas. Controladores Programables Ramón Medina Página 24 de 89 Lenguajes de Programación Continuidad lógica con (a) PB1 sin presionar y (b) PB1 presionado La solución de programación para una entrada normalmente cerrada (como se muestra en el segundo caso), ejemplifica lo siguiente: para que un dispositivo cableado normalmente cerrado se comporte como normalmente cerrado al ser conectado a un controlador, este debe ser programa como una instrucción examinar ENCENDIDO (instrucción de contacto normalmente abierto). Las entradas discretas de un controlador pueden ser configuradas para que se comporten como normalmente abierta o cerrada sin importar su condición original. Esta habilidad de poder examinar el estado cerrado o abierto de cada dispositivo, es la clave de la flexibilidad de los controladores. No importa cómo esté cableado el dispositivo (normalmente abierto o cerrado), el controlador puede ser programado para que lleve a cabo la operación deseada sin modificar el cableado. Recuerde que el estado de programación de las entradas depende no sólo de cómo está cableado, si también de la acción de control deseada. Ejemplo 6 Muestre la implementación en un controlador de la lógica cableada que se presenta en la siguiente figura, considerando que un contacto normalmente abierto está conectado a la entrada del módulo. Describa la operación de cada implementación. Use la dirección de entrada 10 para el pulsador y las direcciones 30 y 31 para las lámparas piloto PL1 y PL2 respectivamente. Controladores Programables Ramón Medina Página 25 de 89 Lenguajes de Programación Solución Al examinar el circuito se tiene que si PB1 no es presionado, la lámpara PL1 debe estar apagada. PL2 debe estar encendida por que el otro contacto de PB1 (el normalmente cerrado) proporciona potencia a PL2. Es posible cablear cualquiera de las dos conexiones (A o B) de PB1 al módulo de entrada para satisfacer la lógica requerida. Recuerde que es posible hacer que cualquier contacto funcione como lo requiere el programa de control. La siguiente figura muestra la solución para la conexión del contacto normalmente abierto. Una instrucción examinar ENCENDIDO maneja a PL1 y una examinar APAGADO a PL2. Cuando el contacto A de PB1 no está presionado, PL1 está apagado y PL2 encendido. El primer peldaño implementa un pulsador cableado como un contacto normalmente abierto para que actúe como tal, mientras que el segundo implementa un pulsador cableado como normalmente abierto, para que se comporte como uno normalmente cerrado. Ejemplo 7 Muestre la implementación en un controlador de la lógica cableada que se presenta en la siguiente figura, considerando que un contacto normalmente cerrado está conectado a la entrada del módulo. Describa la operación de cada implementación. Use la dirección de entrada 10 para el pulsador y las direcciones 30 y 31 para las lámparas piloto PL1 y PL2 respectivamente. Controladores Programables Ramón Medina Página 26 de 89 Lenguajes de Programación Solución La siguiente figura muestra la solución cuando se conecta el contacto normalmente cerrado. En este caso, una instrucción examinar APAGADO es la que maneja a PL1. Durante la operación, el contacto B de PB1 proporciona potencia al módulo si el pulsador no es presionado y por lo tanto, su dirección de referencia (10) es en estado uno lógico. El contacto normalmente cerrado de la dirección 10 permanece abierto mientras que PB1 no sea presionando manteniendo a PL1 apagado. En el segundo peldaño, la instrucción examinar ENCENDIDO maneja la salida para PL2 (31), que permanece cerrada mientras PB1 no sea presionado. El primer peldaño implementa un pulsador cableado como normalmente cerrado, para que se comporte como uno normalmente abierto, mientras que el segundo implementa un pulsador cableado como normalmente cerrado, para que se comporte como tal. Como se ilustra en el ejemplo anterior, una entrada normalmente abierta puede ser programada para que se comporte con una normalmente cerrada y viceversa. Sin embargo, por razones de seguridad, los dispositivos normalmente cerrados deben ser cableados al módulo de entrada como tal, utilizando instrucciones examinar ENCENDIDO, de tal manera que se comporten de la manera en que han sido diseñados. Un dispositivo cableado como normalmente abierto no debe ser programado para que se comporte como uno normalmente cerrado, especialmente si está siendo usado para interrumpir la continuidad cuando un dispositivo está presionado o cerrado. La siguiente figura muestra un ejemplo de un botón de parada normalmente cerrado, utilizado para interrumpir la alimentación de un motor. Durante la operación, cuando el pulsador de arranque ha sido presionado y enganchado por los contactos internos del motor (100), el motor enciende. El pulsador (normalmente cerrado) de parada interrumpe la continuidad lógica de la bobina de salida del motor. Pulsando este pulsador de parada, es la única manera en la que el motor puede ser detenido. Sin embargo, si el cableado del pulsador se corta por accidente, el circuito del motor se desacopla. Controladores Programables Ramón Medina Página 27 de 89 Lenguajes de Programación El pulsador de parada (normalmente cerrado) es programado como normalmente abierto. El contacto 100 es usado como enganche con el botón de arranque luego de ser presionado Luego de que el pulsador de arranque es presionado y liberado, el motor permanece encendido Si el pulsador de parada es presionado cuando el motor está encendido, éste se apagará Si el cableado del pulsador de parada se rompe accidentalmente cuando el motor está encendido, éste se apaga Es posible conseguir la misma lógica de control colocando un pulsador de parada normalmente abierto en lugar de uno normalmente cerrado, implementándolo como un circuito normalmente cerrado en el programa del controlador. Cuando el botón de arranque es presionado, el motor se enciende; si el botón de parada es presionado, el motor se apaga. Sin embargo, no habrá manera de detener el motor si el cableado del pulsador normalmente abierto se rompe. La instrucción examinar APAGADO correspondiente al pulsador de parada no interrumpirá nunca la continuidad lógica. La única manera de detener el motor será apagando el controlador. Este tipo de configuración del controlador es peligrosa y debe ser evitada. Controladores Programables Ramón Medina Página 28 de 89 Lenguajes de Programación El pulsador de parada (normalmente abierto) es programado como normalmente cerrado. Al presionar el botón de arranque, se enciende el motor Luego de que el pulsador de arranque es presionado y liberado, el motor permanece encendido Si el pulsador de parada es presionado cuando el motor está encendido, éste se apagará Si el cable del botón de parada se rompe mientras está encendido el motor, no habrá forma de detenerlo Temporizadores y Contadores Los temporizadores y contadores son instrucciones internas que proveen las mismas funciones que sus contrapartes de hardware. Ellos activan o desactivan un dispositivo luego de que transcurre un determinado lapso de tiempo o de que se ha alcanzado un conteo específico. Los temporizadores y contadores son típicamente considerados como salidas internas. Al igual que las instrucciones de relé, los temporizadores y contadores son fundamentales para la programación en diagrama de escalera. Las instrucciones de temporizador pueden tener un o más bases de tiempo que son usadas para cronometrar un evento. La base de tiempo es la resolución o precisión del temporizador. Si se desea que un temporizador cronometre un evento de 10 segundos, el usuario debe configurarlo especificando el número de veces que la base de tiempo se debe repetir para llegar a los 10 segundos. Por lo tanto, si la base de tiempo es de un segundo, entonces el temporizador debe contar diez veces antes de activar su salida. A este número de cuentas se le llama comúnmente tick. Las bases de tiempo más comunes son 0,01 segundos, 0,1 segundos y 1 segundo. Controladores Programables Ramón Medina Página 29 de 89 Lenguajes de Programación Bases de tiempo Los temporizadores son usados para añadir un determinado lapso de tiempo a una salida del programa. Las aplicaciones de los temporizadores en un controlador son innumerables, ya que han reemplazado casi completamente a sus contrapartes de hardware. Como ejemplo, un temporizador puede ser utilizado para introducir un retardo de 0,01 segundos en un programa de control. El programa requiere el retardo, porque de otra forma el controlador encenderá sus salidas demasiado rápido en comparación con el sistema cableado de relés que está reemplazando. Este pequeño retardo disminuye la velocidad de repuesta de otros componentes, de tal manera que la operación del sistema sea la correcta. Las instrucciones de conteo, son utilizadas para contar eventos tales como partes que transitan por una banda transportadora y el número de veces que una válvula solenoide se enciende, entre otros. Los contadores, junto con los temporizadores, deben tener dos valores, el valor final y el valor acumulado. Estos valores son almacenados en la tabla de datos. El valor final es el número de ticks o cuentas que debe ser alcanzado antes de que el temporizador o contador encienda su salida. El valor acumulado es el número actual de ticks o cuentas que han transcurrido desde que el temporizador o contador inició su operación. Ambos registros son definidos al momento de programar la instrucción. Ejemplo 8 Durante la ejecución de un proyecto de modernización, se encontró que una parte del circuito de escalera al ser configurado en el controlador, no funcionaba correctamente. Este malfuncionamiento se debía al hecho de que en el circuito cableado, el relé CR5, que era energizado a través del dispositivo LS4, tenía un tiempo de retardo suficientemente grande como para sincronizarse con el resto del circuito permitiendo que la actuación del solenoide fuera la correcta. Ahora que ha sido implementado en el controlador, el relé CR5 no tiene el retardo. El retardo requerido se estima en 3 ciclos AC (60 Hz) y las bases de tiempo disponibles en el controlador son 0,01, 0,1 y 1 segundo. ¿Cuál base de tiempo debe ser usada para crear el retardo y cuántos ticks debe demorar? Solución El retardo estimado de 3 ciclos AC se calcula de la siguiente manera: Controladores Programables Ramón Medina Página 30 de 89 Lenguajes de Programación 1 = 16,66 milisegundos 60 3 = 50,00 milisegundos 3 ciclos = 60 1 ciclo = El retardo requerido es de 50 milisegundos. Por lo tanto, la única base de tiempo suficientemente pequeña es la de 0,01 segundos. Usando esta base de tiempo, el temporizador debe contar 5 ticks para recrear el retardo. Instrucciones de Temporizado Los controladores proveen varios tipos de instrucciones de temporizado. Sin embargo, los distintos fabricantes dan diferentes definiciones para las funciones de temporizado que ofrecen. Instrucciones de temporizado La función de las distintas instrucciones de temporizado es esencialmente la misma, difiriendo únicamente en el tipo de salida que proporciona. La siguiente figura muestra los dos formatos que se emplean para los temporizadores. Instrucción de temporizado en formato de bloque y de diagrama de escalera Controladores Programables Ramón Medina Página 31 de 89 Lenguajes de Programación Un temporizador con formato de bloque, tiene una o más entradas dependiendo del controlador. Estas entradas son la línea de control y la línea de habilitación/inicialización. Si la línea de control es VERDAD y la línea de habilitación es también VERDAD, el bloque de función iniciará el temporizado. Un temporizador con formato de escalera generalmente tiene sólo una entrada, la cual corresponde a la línea de control. Si la línea de control está ENCENDIDA, el temporizador iniciará su conteo. Un aspecto común de ambos formatos es el uso de un registro que contiene el valor final y otro que contiene el valor acumulado. Algunos controladores permiten que el usuario ingrese un valor constante directamente en el temporizador, para establecer el valor final. Este valor particular debe ser ingresado en el registro predefinido para el temporizador especificado. La base de tiempo del temporizador es configurable de acuerdo con el controlador utilizado. Cuando el conteo acumulado de ticks iguala el valor final, el temporizador ejecuta su función y establece su condición de salida, que depende del tipo de temporizador utilizado. Es importante destacar que cuando un temporizador programado reemplaza un temporizador cableado, ellos sustituyen los contactos demorados asociados a los temporizadores, pero no los contactos instantáneos que puedan estar disponibles en un temporizador cableado. Circuito cableado con contactos instantáneos y retardados Controladores Programables Ramón Medina Página 32 de 89 Lenguajes de Programación La figura anterior ilustra un ejemplo que muestra contactos de temporizadores ‘demorados’ e instantáneos. El temporizador TMR1 en l línea 1 tiene un contacto instantáneo en la línea 2 (TMR1-1), el cual es usado para enganchar PB1, y un contacto demorado (TMR1-2) en la línea 5. Para traducir este tipo de lógica a un programa de control, el usuario debe 'atrapar' el temporizador, de tal manera que se consiga el enganche instantáneo Energizado en ENCENDIDO El temporizador con retardo para encender (TON) proporciona una acción retardada o mide la duración de un evento. Una vez que el peldaño tiene continuidad, el temporizador continúa contando los intervalos de tiempo (ticks) y lo hace hasta que el tiempo acumulado iguala al tiempo prefijado. Cuando los dos valores son iguales, el temporizador energiza su salida y cierra los contactos demorados asociados con la salida. El contacto demorado puede ser usado en el programa tanto normalmente abierto como normalmente cerrado. Si la continuidad lógica se pierde antes de que el temporizador finalice su conteo, este reinicializa su registro acumulador a cero. Temporizador con retardo en encendido Desenergizado en ENCENDIDO La instrucción de desenergizado en encendido (TON) opera de manera similar a como lo hace la de energizado en encendido, con la diferencia de que la salida del temporizador inicia ENCENDIDA. La instrucción desenergiza la salida una vez que el peldaño tienen continuidad lógica y que el lapso de tiempo ha transcurrido (valor del registro acumulador igual al del registro preestablecido). Los fabricantes de controladores normalmente proporcionan sólo Controladores Programables Ramón Medina Página 33 de 89 Lenguajes de Programación temporizador de desenergizado o de energizado en encendido, ya que es muy fácil implementar uno a partir del otro. La figura a continuación muestra el diagrama de tiempo para ambos tipos. Diagrama de tiempo para un temporizador energizado en ENCENDIDO y desenergizado en ENCENDIDO Energizado en APAGADO Una instrucción de temporizador energizado en APAGADO proporciona una acción demorada. Si el peldaño no tiene continuidad, el temporizador comienza el conteo de los intervalos de tiempo hasta que el valor acumulado iguala al valor prefijado. Cuando los valores son iguales, el temporizador energiza su salida y cierra el contacto demorado asociado. El contacto demorado puede ser usado en el programa normalmente abierto o normalmente cerrado. Si la continuidad lógica ocurre antes de que el temporizador finalice su conteo, el valor acumulado retorna a cero. Temporizador de energizado en apagado Controladores Programables Ramón Medina Página 34 de 89 Lenguajes de Programación Desenergizado en APAGADO La instrucción de desenergizado en APAGADO (TOF) opera de manera similar a como lo hace la de desenergizado en encendido; sin embargo, la salida del temporizador está ENCENDIDA y será apagada cuando el peldaño pierda continuidad lógica y el lapso de tiempo establecido haya transcurrido. Algunos fabricantes de controladores proporcionan sólo uno de los temporizadores de desenergizado, ya que es muy sencillo implementar uno a partir del otro. La figura a continuación, muestra los diagramas de tiempo correspondientes. Diagrama de tiempo para (a) una instrucción de energizado en apagado y (b) desenergizado en apagado Retentivo en ENCENDIDO Un temporizador retentivo con retardo en ENCENDIDO (RTO) es utilizado en los casos en que el valor acumulado deba ser mantenido aún cuando la continuidad lógica o la energía del sistema. Si el peldaño tiene continuidad lógica, el temporizador comienza el conteo de los intervalos de tiempo hasta que el valor acumulado iguala al preestablecido. El acumulador mantiene su valor, aún si la energía o la continuidad lógica se pierden antes de que el temporizador haya finalizado su conteo. Cuando el tiempo acumulado igual al preestablecido, el temporizador energiza su salida y cierra los contactos asociados. Los contactos pueden ser usados normalmente abiertos o cerrados. La instrucción de reinicialización del temporizador retentivo regresa el valor acumulado a cero. Reinicialización de Retentivo La instrucción de reinicialización del temporizador retentivo es la única manera para reinicializar automáticamente el valor acumulado. Si el peldaño tiene continuidad lógica, esta instrucción reinicializa el valor acumulado a cero. La dirección de la instrucción de reinicialización debe ser igual a la del temporizador retentivo. Controladores Programables Ramón Medina Página 35 de 89 Lenguajes de Programación Instrucciones de Conteo Existen dos tipos básicos de contadores: los que cuentan hacia arriba y los que lo hacen hacia abajo. El formato puede variar según el controlador. En algunos controladores se usa un formato de escalera, mientras que en otros se usa de bloque. La figura a continuación muestra ambos formatos. Contador en formato (a) de bloque y (b) de relé Tipos de contadores Contador Ascendente El contador ascendente (CTU) añade una cuenta, cada vez que el evento referido ocurre. En una aplicación de control, este contador enciende o apaga un dispositivo luego de alcanza un cierto conteo. Además, este contador puede llevar registro del número de partes (botellas, piezas, etc.) que pasan por un cierto punto. Un contador ascendente incrementa su valor Controladores Programables Ramón Medina Página 36 de 89 Lenguajes de Programación acumulado cada vez que el evento hace una transición de APAGADO a ENCENDIDO. Cuando el valor acumulado alcanza el valor prefijado, el contador enciende su salida, finaliza el conteo y cierra el contacto asociado. Luego de que el contador alcanza su valor prefijado, inicializa el valor de su acumulador o simplemente continua contando cada evento que suceda. Contador Descendente Un contador descendente (CTD) decrementa el valor de conteo cada vez que ocurre un evento determinado. En muchas ocasiones es utilizado en conjunto con un contador ascendente para formar un contador ascendente/descendente, sobre la base de que ambos contadores tengan los mismos registros. En un contador bidireccional, el contador descendente proporciona una manera de corregir información introducida por el ascendente. Por ejemplo, mientras que un contador ascendente totaliza el número de botellas llenas que pasan por un cierto punto, un contador descendente con el mismo registro puede restar una del valor acumulado, cada vez que detecta que está incorrectamente llena. Dependiendo del tipo de controlador, el contador descendente puede detenerse al llegar a cero o continuar hasta un número negativo máximo. En el formato de bloque, el conteo descendente ocurre cada vez que la entrada correspondiente pasa de APAGADO a ENCENDIDO. Inicialización de Contador La instrucción de inicialización del contador (CTR) coloca un valor cero en el registro acumulador. Al programarlo, esta instrucción tendrá la misma dirección que la del contador al que inicializa. Si el peldaño donde está esta instrucción de inicialización tiene continuidad lógica, entonces inicializa el contador. La línea de inicialización en el formato de bloque almacena un cero en el registro acumulador. La figura a continuación muestra un ejemplo típico de un contador en formato de bloque con instrucciones de conteo ascendente, descendente y de inicialización. El contador incrementará su valor acumulado hasta que el contacto 10 se cierre, lo decrementará hasta que cierre el contacto 11 y se reinicializará a cero cuando cierre el contacto 12. Si el conteo es igual a 15, la salida 100 se encenderá. Si el contenido del registro 1003 es mayor que 15, la salida 101 se encenderá. La salida 102 se encenderá cuando el valor acumulado sea menor que 15. Controladores Programables Ramón Medina Página 37 de 89 Lenguajes de Programación Bloque contador con instrucciones de conteo hacia arriba, hacia abajo e inicialización Ejemplo 9 La figura a continuación muestra un bloque contador empleado para totalizar las partes que son detectadas por un sensor fotoeléctrico (PE). El valor predefinido de conteo es de 500. Se pide modificar el circuito de tal manera que el contador se inicialice automáticamente cada vez que llegue a 500. Adicionalmente, se pide añadir las instrucciones necesarias para implementar una salida que indique cuando el conteo haya llegado a 500. Solución La siguiente figura muestra el circuito que inicializará el contador automáticamente. Cuando el valor prefijado y el acumulado se igualan, la salida 100 del contador se ENCIENDE, enganchando la salida 101 para indicar que se alcanzó el conteo. La misma salida del contador lo inicializa. Recuerda que el controlador ha evaluado todas las entradas, de tal manera que el contador estará inicializado para el próximo ciclo de ejecución. La entrada 11 es utilizada para desenganchar manualmente la salida 101. Controladores Programables Ramón Medina Página 38 de 89 Lenguajes de Programación Ejemplo 10 Resuelva el caso del ejemplo 9 utilizando permisivos en lugar de bobinas con memoria. Solución La siguiente figura ilustra el circuito de permisivos que engancha la salida del contador, indicando que esté alcanzó el valor predeterminado. El pulsador de inicialización (entrada 11) es programado como normalmente cerrado a partir de un dispositivo normalmente abierto. Si la entrada es de importancia para efectos de seguridad, entonces el circuito debe incorporar un pulsador normalmente cerrado que sea programado con una instrucción examinar APAGADO. Instrucciones de Control de Programa y Flujo Este grupo de instrucciones dirige el flujo de las operaciones así como la ejecución de instrucciones dentro del programa en escalera. Esas funciones son llevadas a cabo mediante instrucciones de salto y retorno, que son ejecutadas cuando ocurren ciertas condiciones lógicas que han sido programadas. Las instrucciones de control de flujo forman una especie de enrejado dentro del programa. Este enrejado contiene grupos de instrucciones que son Controladores Programables Ramón Medina Página 39 de 89 Lenguajes de Programación utilizadas para implementar una determinada función. La figura siguiente muestra el enrejado logrado a partir del uso de instrucciones de control de flujo. Enrejado creado mediante el uso de instrucciones para control de flujo Las instrucciones en el enrejado son ejecutadas sólo si el peldaño donde se encuentra la instrucción de control de flujo, tiene continuidad lógica. Algunos controladores programables, dependiendo de sus capacidades y del alcance de la aplicación, puede usar varios tipos de instrucciones de control de flujo. Esas instrucciones permiten que el controlador eficientemente ejecute rutinas especiales (programadas por el usuario) que son invocadas sólo cuando es necesario, optimizando la respuesta del sistema. La siguiente tabla muestra algunas de las más usadas instrucciones para control del flujo. Esas instrucciones normalmente funcionan en pareja. Cuando es así, la instrucción de inicia hace que el controlador ejecute una serie de instrucciones en otra sección del programa de control. La otra instrucción regresa la ejecución del controlador hasta el sitio donde quedó el programa cuando se verificó la bifurcación. Controladores Programables Ramón Medina Página 40 de 89 Lenguajes de Programación Instrucciones de control de flujo Relé de Control Maestro Un relé de control maestro (MCR) activa o desactiva la ejecución de un grupo o zona de peldaños. Un peldaño MCR es usado con un peldaño END para encerar un grupo de peldaños. Ejemplo de una instrucción MCR Controladores Programables Ramón Medina Página 41 de 89 Lenguajes de Programación El enrejado consiste en un peldaño MCR con entradas condicionales al inicio de la zona y un peldaño END sin condicionales al final de la zona. Cuando el peldaño MCR es VERDAD, activa la salida referenciada, permitiendo que las salidas de los peldaños dentro de la zona sean controladas por sus respectivas entradas. Cuando la salida MCR se APAGA, desenergiza las salidas dentro de la zona. Control de Último Estado en la Zona La instrucción para control de último estado en la zona (ZCL) es similar al relé de control maestro (MCR). Esta determina si va a ser evaluado o no un grupo de peldaños. Para usar esta instrucción se coloca una salida ZCL con entradas condicionales al inicio de la zona y una END ZCL sin condicionales al final. Cuando se activa la salida ZCL, las salidas dentro de la zona son controladas por sus respectivas entradas. Cuando la instrucción ZCL se apaga, las salidas dentro de la zona permanecen en su último estado. Fin La instrucción fin (END) establece el final de una zona controlada por un relé de control maestro (MCR) o por una instrucción de control de último estado de la zona (ZCL). Esta instrucción típicamente es incondicional. Esta instrucción puede o no referenciar a una instrucción MCR o ZCL. Si lo hace, la instrucción termina ese MCR o ZCL específico. Si no es así, terminará la última instrucción MCR o ZCL. Ir a La instrucción ir a (JMP) permite que la secuencia de ejecución del programa sea alterada bajo ciertas condiciones. Si existe continuidad lógica en el peldaño, la instrucción JMP le indica al procesador que vaya directamente a ejecutar el peldaño indicado. Al usar esta instrucción, el controlador puede alterar el orden de ejecución del programa de control ejecutando los peldaños que requieren atención inmediata. La figura a continuación ilustra un ejemplo de uso de la instrucción JMP. Es necesario tener especial cuidado cuando se 'salte' sobre contadores y temporizadores ya que esto evita que dichas instrucciones realicen su trabajo. Controladores Programables Ramón Medina Página 42 de 89 Lenguajes de Programación Ejecutar Subrutina Similar a la instrucción JMP, ejecutar subrutina (GOSUB) permite que sea alterada la ejecución secuencial de un programa dada una condición. Al usar esta instrucción, si la condición lógica es VERDAD, la salida GOSUB le indica al procesador que transfiera la ejecución del programa de control a la etiqueta (LBL) especificada. Ejemplo de una instrucción JMP El procesador continúa la ejecución hasta que encuentra una instrucción de retorno. Cada subrutina en el programa debe comenzar con un peldaño etiquetado y terminar con una instrucción de retorno incondicional. La instrucción GOSUB es muy útil cuando una porción del programa es referenciada por varias secciones del programa de control principal o es utilizada cada vez que transcurre un determinado lapso de tiempo. Normalmente las subrutinas están localizadas al final del programa o en un área especificada por el fabricante del controlador. Si el controlador no tiene un área reservada para subrutinas, es posible crearla programando un peldaño falso con control directo a otro peldaño falso al final de las subrutinas programadas. Controladores Programables Ramón Medina Página 43 de 89 Lenguajes de Programación Controlador con subrutinas asignadas al final del programa de control Controladores Programables Ramón Medina Página 44 de 89 Lenguajes de Programación Área de subrutinas creada por el usuario Etiqueta Una etiqueta (LBL) identifica un peldaño destino de una instrucción GOSUB. La dirección de referencia de la instrucción LBL debe ser igual a la de la instrucción GOSUB con la cual funciona. La instrucción LBL no contribuye a la continuidad lógica del peldaño, y para efectos prácticos, siempre es VERDAD. Esta instrucción debe ser siempre la primera condición en el peldaño. Una etiqueta que haya sido referenciada por una dirección única, sólo puede ser usada una vez en un programa. Retorno La instrucción de retorno (RET) termina una subrutina y es programada sin entradas condicionales. Cuando el programa de control se encuentra con la instrucción, retorna al programa principal, a partir del peldaño inmediato siguiente a la instrucción GOSUB que inició la ejecución de la subrutina. A partir de ese momento, continua la ejecución normal. Cada subrutina debe tener una instrucción de retorno. Controladores Programables Ramón Medina Página 45 de 89 Lenguajes de Programación Instrucciones Aritméticas Las instrucciones aritméticas en un controlador incluyen las cuatro operaciones básicas de suma, resta, multiplicación y división. En adición a dichas operaciones básicas, algunos controladores incluyen el cálculo de raíz cuadrada. Instrucciones aritméticas Como otras instrucciones, las aritméticas puede estar en formato básico o de bloque; sin embargo, la operación es básicamente la misma. La figura a continuación ilustra los diferentes formatos. Controladores Programables Ramón Medina Página 46 de 89 Lenguajes de Programación Bobina, contacto e instrucción aritmética en formato de bloque La mayoría de las instrucciones aritméticas requieren de tres registros, dos para los operandos y uno para el resultado. Lagunas instrucciones, como la multiplicación y la división, pueden usar cuatro registros. La mayoría de las operaciones aritméticas en un controlador requieren aritmética de simple precisión, lo cual implica que los resultados pueden ser almacenados en un registro cada uno. Para operaciones que requieran manejar números grandes, algunos controladores ofrecen aritmética de doble precisión. En términos prácticos esto significa que los resultados requieren el doble de registros para ser almacenados. Por ejemplo, una operación de suma en doble precisión requiere seis registros. Un registro puede almacenar como valor máximo el número 65.535 en 16 bits si no se considera signo. Si el bit más significativo es utilizado para el signo, entonces el rango de representación será desde -37.678 hasta -37.677. Si el resultado de la operación es mayor que el máximo soportado, se presenta una condición de desbordamiento y se encenderá un bit o salida asociado a esta condición. El formato numérico empleado en las operaciones matemáticas varía de acuerdo al controlador, pero normalmente es de tres, cuatro o cinco dígitos binarios (BCD o binario)- En simple precisión BCD, el valor máximo es 9.999 (sin signo) y +/-999 (con signo). La figura a continuación presenta instrucciones aritméticas en formato tanto de escalera como de bloque. El formato de escalera requiere de instrucciones de transferencia de datos para obtener los operandos. En el formato de bloque funcional, algunos fabricantes proporcionan la habilidad de colocarlos en cascada. Configuración en cascada que permite la ejecución de varias funciones aritméticas en secuencia Controladores Programables Ramón Medina Página 47 de 89 Lenguajes de Programación La posibilidad de colocarlos en cascada es muy útil cuando se tiene que trabajar con múltiples operaciones aritméticas, ya que una instrucción activa la siguiente una vez que ha finalizado. Otros fabricantes permiten que las operaciones aritméticas se ejecutadas usando bloques de varios registros contiguos como operandos para almacenar los resultados en otro bloque de registros. Operación aritmética en forma de bloque funcional En este caso, el contenido de los registros 1000, 1001, 1002 y 1003 van a ser sumados a los registros 1200, 1201, 1202 y 1203 y el resultado almacenado en 1400, 1401, 1402 y 1403. Suma Escalera La instrucción de suma en formato de escalera suma los valores almacenados en dos posiciones de memoria referenciadas por la instrucción. Cada controlador accede a dichos valores de manera distinta. Algunos usan la instrucción de transferencia de datos obtener (GET) para acceder a los registros de los operandos. Suma en formato de escalera Otros simplemente referencian dos registros utilizando símbolos de contacto. Suma en formato de contactos El procesador almacena la suma de los valores en el registro referenciado por la bobina ADD. Si la operación de suma está habilitada sólo cuando algunas condiciones sean VERDADERAS, Controladores Programables Ramón Medina Página 48 de 89 Lenguajes de Programación entonces dichas condiciones han de ser programadas antes del peldaño con la operación de suma. La condición de desbordamiento es típicamente señalada por un bit en registro de resultado. Bloque La instrucción de suma en formato de bloque, suma dos valores almacenados dentro del controlador y coloca el resultado en el registro especificado. Los operandos pueden ser constantes, valores provenientes de las tablas de entradas y salidas o variables almacenadas en la memoria. Bloque funcional de suma Una línea de control habilita la operación de suma. Cuando la condición del peldaño es VERDAD, el procesador lleva a cabo la operación de suma. En la figura anterior, los registros 1000 y 1001 pueden tener valores preestablecidos, registros de almacenamiento o registros de entradas y salidas. Cada vez que una transición de APAGADO a ENCENDIDO habilita la línea de control, la instrucción suma los valores de los dos registros y coloca el resultado en la dirección 2000. La salida de terminado indica que la instrucción fue completada. Esta salida permanece ENCENDIDA en tanto la línea de control sea VERDAD. Si se produce un desbordamiento como resultado de la operación, se enciende la salida correspondiente. Cuando esto sucede, el controlador almacena como resultado, el máximo valor que él pueda manejar. Controladores Programables Ramón Medina Página 49 de 89 Lenguajes de Programación Algunos controladores usan aritmética de doble precisión cuando trabajan con formato de bloque. Esta operación es idéntica en esencia y sólo difiere en que se emplean dos registros por operando y dos para el resultado. Bloque de suma con doble precisión Ejemplo 11 En la figura siguiente, dos ingredientes son añadidos al tanque de un reactor para su mezclado. Los módulos de entrada analógicas, que proporcionan información de 12 bits en formato BCD, envían datos de los flujos de los dos ingredientes al controlador. Los valores son almacenados en los registros 1000 y 1001. Se pide implementar instrucciones que lleven el control del monto total de los ingredientes combinados, de tal manera que dicha información puede ser desplegada en el monitor del operador. Controladores Programables Ramón Medina Página 50 de 89 Lenguajes de Programación Solución Un registro puede mantener el total de ambos ingredientes luego de añadir los dos flujos. La siguiente figura muestra cómo usar la instrucción sumar para almacenar el resultado BCD en el registro 2000.Nótese que dicho bloque está siempre activo. Resta Escalera La instrucción de substracción resta los valores almacenados en dos registros. Como en la instrucción de suma, si el peldaño está habilitado, la operación se ejecuta. Una instrucción de transferencia de datos GET es la que usualmente accede a los registros donde se encuentran los operandos. El resultado de la resta normalmente tiene un bit que indica un resultado negativo. Instrucción de resta en formato de escalera Bloque La instrucción de resta determina la diferencia entre dos valores y almacena el resultado en un registro. Controladores Programables Ramón Medina Página 51 de 89 Lenguajes de Programación Bloque funcional de resta Cuando la entrada de control está en estado lógico uno, el procesador ejecuta la operación. Tres registros mantienen la información durante la operación. Los valores contenidos en los registros pueden variar en formato e incluir o no el bit de signo. En la figura anterior, el registro 1000 puede contener el número 9.009 y el registro 1001 -10.020. El resultado de esa operación sería 19.029, que sería almacenado en el registro 2000. El algunos casos, el formato del registro de salida no incluye el signo y el controlador señaliza este dato utilizando salidas independientes que señalan si el resultado fue positivo, negativo o cero. Bloque de resta con salidas de signo Algunos controladores permiten añadir constantes añadiendo un indicador como por ejemplo la letra K, adelante del número. Los controladores que no proporcionan instrucciones para transferencia de E/S puede usar bloques de substracción para transferir valores multibit o analógicos desde o hacia la tabla de E/S. Ellos lo hace restando una constante igual a cero al dato de entrado y almacenando el resultado en el registro destino. La siguiente figura ilustra un ejemplo de un bloque SUB usado para leer una entrada analógica y escribirla en una salida del mismo tipo. Cuando se cierra el contacto 10, se ejecuta la función SUB. El registro 100 especifica la dirección de referencia del módulo de entrada o salida (analógico o multibit). Durante la lectura de una entrada, se resta una constante cero (registro 1001) del valor del registro 100 y el resultado es almacenado en el registro 1000 para su uso por parte del programa de control. Durante la operación de escritura en la salida, se resta una constante cero (registro 1001) del valor del registro 1000 y el resultado es enviado al módulo de salida (registro 100). Bloque de resta utilizado para (a) leer una entrada analógica y (b) escribir en una salida analógica Controladores Programables Ramón Medina Página 52 de 89 Lenguajes de Programación Multiplicación Escalera La multiplicación en formato de escalera trabaja sobre dos operandos y usa dos registros para depositar el resultado, esto porque en la mayor parte de los casos, el producto de dos números de cuadro dígitos produce un valor de más de 4 dígitos. Algunos controladores proporcionan registros adyacentes para almacenar el resultado. Instrucción de multiplicación en formato de escalera Dependiendo del controlador, una o dos bobinas referencian a los registros que contienen el resultado de la multiplicación. Las instrucciones GET permiten acceder a los registros operandos. Si se requiere que una condición habilite la operación, esta debe ser programada antes de que el peldaño de multiplicación acceda a los operandos. En la figura anterior, el contenido de los registros 1000 y 1001 serán multiplicados y el resultado almacenado en los registros 2000 y 2001. Bloque El bloque de multiplicación (MUL) usa dos registros para almacenar el resultado y un registro para cada operando. La siguiente figura ilustra el bloque de multiplicación, con una línea de control que habilita la operación. Controladores Programables Ramón Medina Página 53 de 89 Lenguajes de Programación Bloque funcional de multiplicación El controlador puede utilizar doble precisión para el bloque de multiplicación, por lo cual utilizaría el doble de registros para operandos y resultado. Esto permitiría que un número de 8 dígitos BCD pudiera ser multiplicado por otro número de 8 dígitos BCD produciendo un resultado de hasta 16 dígitos BCD, almacenado en 4 registros. Algunos controladores usan escalamiento, en los cuales el resultado de la multiplicación es mantenido temporalmente en dos registros y luego multiplicado por un valor de escalamiento (ver siguiente figura). Por ejemplo, supongamos que el controlador maneja formato de 4 dígitos BCD y que los registros 1000 y 1001 contienen los valores 9.001 y 8.172 respectivamente, con un factor de escalamiento de -5 (o 10 elevado a la -5). Si el controlador usa escalamiento, almacenará el resultado (73.556.172) en dos registros temporales (7355 en uno y 6172 en el otro) y luego lo multiplicará por el valor de escalamiento resultando 735,56173. Este resultado es redondeado a 736 y almacenado en un único registro. Conociendo que el resultado ha sido escalado, el usuario puede determinar el valor actual. Multiplicación con bloque de escalamiento Controladores Programables Ramón Medina Página 54 de 89 Lenguajes de Programación División Escalera La instrucción DIV encuentra el cociente de dos números. Este cociente es almacenado en dos registros y referenciado por una bobina de salida. El primer registro contiene la parte entera del cociente y el segundo la fracción decimal. Los operandos son recolectados utilizando una instrucción GET. Instrucción de división en formato de escalera Bloque El bloque funcional DIV calcula el cociente de dos números, almacenando el resultado en uno o más registros. El cálculo de la división se inicia cuando el peldaño de la línea de control tiene continuidad lógica. El registro 1000 (dividendo) es dividido por el contenido del registro 1001 (divisor) y el resultado es almacenado en dos registros contiguos. Bloque funcional de división En este caso, los registros destino son el 2000, que almacena la parte entera del resultado y el 2001, que almacena la fracción decimal. Dependiendo del controlador, el segundo registro puede contener el residuo en lugar de la fracción decimal. Algunos controladores permiten la utilización de un factor de escalamiento especificado en el bloque de división. Este factor permite la obtención de fracciones como resultado. Dependiendo del controlador que sea usado, un bloque de división puede tener tres posibles salidas. Cuando está energizado, la salida del tope indica si la operación fue exitosa, el segundo refleja un desbordamiento o error (división por cero) y la de abajo señala si el resultado tiene o no un residuo. Controladores Programables Ramón Medina Página 55 de 89 Lenguajes de Programación Raíz Cuadrada El bloque de raíz cuadrada (SQR) tiene generalmente dos o tres registros, uno que mantiene el operando y uno (o dos) que contiene el resultado. Uno de los registros para el resultado puede contener la parte entera y el otro la fracción decimal. El procesador puede también proporcionar la posibilidad de usar un factor de escalamiento. Cuando el peldaño tiene continuidad lógica, se ejecuta la operación. La primera salida señala si la operación fue o no exitosa y la segunda, si existe una condición de desbordamiento. Bloque funcional de raíz cuadrada La operación de raíz cuadrada es útil en aplicaciones como el cálculo del flujo a partir de la presión diferencial en una placa orificio. En esta aplicación, la rata de flujo (Q) es igual a una constante (K) multiplicada por la raíz cuadrada de la presión diferencial (∆Pa= Pout - Pin). Es necesario calcular la raíz cuadrada del valor analógico proveniente de la placa orificio y el resultado, multiplicado por la constante K. El valor final proporciona el volumen por unidad de tiempo. Instrucción de raíz cuadrada aplicada a la medición de flujo con placa orificio Controladores Programables Ramón Medina Página 56 de 89 Lenguajes de Programación Instrucciones de Manipulación de Datos Las instrucciones para manipulación de datos son mejoras sobre el conjunto básico de instrucciones en escalera. Mientras que las instrucciones tipo relé están limitadas al control de salidas internas y externas basado en el estado de un bit específico, las instrucciones de manipulación de datos permiten operaciones multibit. Estas instrucciones manejan operaciones que tienen lugar en uno, dos o más registros. Instrucciones de manipulación de datos Comparación de Datos Las instrucciones de comparación de datos (CMP) como lo implica su nombre, comparan valores almacenados en dos registros. Estas instrucciones son útiles cuando se verifica el rango de datos de una variable. En algunos controladores, las instrucciones de comparación de datos son expresadas en formato básico de escalera, mientras que en otros, son bloques funcionales. En ambos formatos, proporcionan tres comparaciones básicas: igual a, menor que y mayor que. Con base en el resultado de la comparación, el procesador puede encender o apagar salidas y llevar a cabo otras operaciones. Las instrucciones de comparación que usan el formato básico de escalera operan de manera similar a como lo hacen las instrucciones aritméticas. Si el peldaño tiene continuidad, la Controladores Programables Ramón Medina Página 57 de 89 Lenguajes de Programación instrucción lleva a cabo la operación; si la comparación es VERDAD, la instrucción pasa continuidad a la bobina de salida. Comparaciones en formato de escalera Las instrucciones de comparación típicas son mayor que (>), menor que (<) e igual a (=), además de las combinaciones entre ellas. La instrucción GET accede al primer registro a ser comparado. Las condiciones de la escalera son programadas antes de las instrucciones GET y CMP. En la figura anterior, si el contacto 10 cierra, el contenido del registro 600 es comparado con el del registro 501; si son iguales, se enciende la bobina 100. Si se cierra el contacto 11, el contenido del registro 601 es comparado con el contenido del registro 502; si es mayor o igual, se enciende la salida 101. El bloque funcional de comparación (mostrado en la siguiente figura), compara el contenido de dos registros, el 2000 y el 2001, para determinar en este caso si son iguales. El bloque energiza la salida 100 cuando se ejecuta la comparación y la 101, si la comparación es satisfecha. Algunos controladores pueden tener un bloque de comparación con varias salidas, que llevan a cabo múltiples comparaciones a la vez. Este tipo de bloques de comparación enciende la salida que corresponde al resultado obtenido. Bloques para (a) comparación sencilla y (b) comparación múltiple Algunos controladores ofrecen otra opción de comparación que usa un registro para implementar un límite (LIM). Esta instrucción compara el valor en tres registros para determinar si el dato en el registro del medio, entra comprendido entre los valores almacenados en los otros registros. Por ejemplo, el bloque funcional de límite que se muestra en la siguiente figura, compara los contenidos de los registros 1100, 1200 y 1300 para determinar si el valor en 1200 es menor o igual que el contenido en 1100 y si es mayor o Controladores Programables Ramón Medina Página 58 de 89 Lenguajes de Programación igual que el contenido en el registro 1300. Si la comparación es VERDAD, la instrucción energiza la salida que indica que la comparación fue satisfecha. Bloque de comparación que usa función limitadora En controladores que no disponen de la instrucción de comparación, es posible comparar valores utilizando un bloque de substracción. En este caso, las bobinas de salida señalan si el resultado de la comparación es positivo (mayor que), cero (igual a) o negativo (menor que). Ejemplo 11 La figura a continuación muestra una sección del programa de un ejemplo anterior en el que una instrucción de suma (ADD) fue usada para llevar registro de los dos ingredientes que estaban siendo añadidos al tanque reactor. Los dos primeros peldaños abren las válvulas de los ingredientes A y B, permitiendo que sean añadidos al tanque una vez que el comando correspondiente se ha encendido (entrada 10). Se pide implementar un bloque de instrucción que asegure que la válvula se cierre cuando el ingrediente A alcance 500 galones y el B alcance 750 galones. Solución La siguiente figura ilustra el uso de instrucciones de comparación que detectan cuando la cantidad de cada ingrediente llega a su máximo. Las salidas de las instrucciones de comparación son utilizadas como permisivos para romper la continuidad de los circuitos de Controladores Programables Ramón Medina Página 59 de 89 Lenguajes de Programación cada válvula. Los valores de los flujos de cada ingrediente (registros 1000 y 1001) son comparados con dos constantes (K). Matriz Lógica Un bloque funcional de matriz lógica implementa operaciones lógicas AND, OR, OR exclusivo, NAND, NOR y NOT sobre dos o más registros. La siguiente figura muestra una función típica de matriz lógica. Bloque funcional de matriz lógica Una operación de matriz lógica entre dos registros puede ser usada para enmascarar cierto bit del dato original y pasar sólo el estado de esos bits al registro de salida. La entrada de control de habilitación dispara la ejecución del bloque de función de matriz lógica. El bloque especifica el tipo de función lógica que será ejecutada, mientras que el usuario especifica los registros dentro del bloque. En la figura anterior, los registros 1000 y 1100 contienen los operandos, mientras que el registro 2000 contiene el resultado. La longitud de la operación indica el número de palabras o registros adyacentes a cada registro. Controladores Programables Ramón Medina Página 60 de 89 Lenguajes de Programación Bloque de función de matriz lógica utilizado para enmascarar bits de salida El bloque de función de matriz lógica tiene tres posibles salidas. Este energiza la salida superior cuando la línea de control está activa, energiza la salida del medio una vez que la operación ha sido completada y energiza la salida inferior si ocurrió algún error. Como ejemplo, examinemos la siguiente figura, que tiene una longitud de 8 y una función lógica AND. Cuando la entrada de control habilita el bloque, la función lógica ejecutará la operación AND entre el contenido de los registros 1000 al 1007 con los de los registros 1100 al 1107. Cada registro típicamente puede almacenar 16 bits de datos. En este caso, el bloque de función ejecutará una operación AND de 128 bits, almacenando el resultado en los registros 2000 al 2007. Algunos controladores tienen sólo dos operandos (por ejemplo, R1000 y R1001). En ese caso, ellos almacenan el resultado en uno de los registros que contiene uno de los operandos, borrando el dato previamente almacenado. Se puede prevenir la pérdida de la información contenida en el registro sobrescrito, transfiriendo previamente su contenido a otro registro. Controladores Programables Ramón Medina Página 61 de 89 Lenguajes de Programación Ejemplo de bloque de función de matriz lógica Conversión de Datos La instrucción de conversión de datos cambia el contenido de un registro dado de un formato a otro. Las instrucciones de conversión de datos típicamente incluyen BCD a binario, binario a BCD, absoluto, complemento e inversión. Una instrucción de conversión de BCD a binario (BCD-BIN) convierte un dato de entrada en formato BCD a formato binario. Esta conversión permite que el dato de entrada pueda ser utilizado en operaciones matemáticas. De manera similar, una instrucción binaria a BCD convierte datos en formato binario a formato BCD, permitiendo su uso por dispositivos de campo que operen en BCD. La operación del bloque de conversión de datos es básicamente la misma, no importa cual sea la dirección de la conversión. Cuando esté habilitada la línea de control, el bloque convierte el contenido del primer registro (BCD o binario) a binario o BCD según el tipo de instrucción. Hecha la conversión, coloca el resultado en el segundo registro y energiza el bloque de salida, una vez que la instrucción ha finalizado. Algunos controladores permiten que varios registros sean convertidos al mismo tiempo, indicando la longitud de la instrucción. Controladores Programables Ramón Medina Página 62 de 89 Lenguajes de Programación Conversión de formato BCD a binario Conversión de binario a formato BCD Conversión de binario a formato BCD en múltiples registros Las operaciones de valor absoluto, complemento e inversión normalmente se ejecutan sobre un único registro. En otras palabras, la operación almacena el resultado en el mismo registro donde se encuentra el operando. Controladores Programables Ramón Medina Página 63 de 89 Lenguajes de Programación Un bloque funcional de valor absoluto (ABS) calcula el valor absoluto del valor de entrada. Si el operando es -5876, el resultado será 5876. Un bloque funcional de complemento (COMPL) cambia el signo del valor original. Si el valor de entrada es 5876, el resultado será -5876. Bloque funcional para cálculo de valor absoluto, complemento e inversión La función de inversión (INV) invierte el estado de los bits del operando de entrada. Si el valor en el registro de entrada es 0000 1111 0000 1111, el resultado será 1111 0000 1111 0000 y se encenderá el bloque de salida cuando la instrucción se haya completado. Establecer Parámetros Constantes Algunas veces es necesario almacenar una constante en un registro. Por esta razón, algunos controladores proporcionan una instrucción que permite establecer parámetros constantes (SET). Cuando se habilita este bloque de función, almacena un valor determinado en el registro especificado, y enciende la salida una vez que la instrucción ha sido completada. Esta instrucción es muy útil para poner los registros de E/S a cero durante la inicialización. Bloque funcional para establecer constantes Incremento La instrucción INCR incrementa el contenido de un registro en uno. La instrucción es útil, por ejemplo, cuando se lleva registro de un número de eventos o de veces que se ejecuta una rutina. El bloque de incremento puede ser usado con un contador que tenga un valor Controladores Programables Ramón Medina Página 64 de 89 Lenguajes de Programación prefijado grande para llevar el conteo de cuántas veces se ha alcanzado el valor máximo del contador. Bloque funcional incremento Rotación y Desplazamiento Una instrucción de desplazamiento (SHIFT) mueve los bits de un registro de derecha a izquierda o de izquierda a derecha según el tipo utilizado. El bloque de desplazamiento utiliza variables bit-in y bit-out para especificar la ubicación del bit cuyo valor será desplazado. La variable bit-in es el valor que será añadido al registro, mientras que la variable bit-out es el valor que está siendo eliminado del registro. Estos bits pueden estar localizados en E/S reales que pueden ser usados como salida o entrada de datos de una operación de desplazamiento. Ejecución de un desplazamiento a la derecha Una instrucción de rotación (ROT), de manera similar a como lo hace la instrucción de desplazamiento, mueve la información de derecha a izquierda o de izquierda a derecha, pero en lugar de eliminar el dato que sale fuera del registro, este se convierte en el dato que ingresa por el extremo contrario. Controladores Programables Ramón Medina Página 65 de 89 Lenguajes de Programación Ejecución de rotación a la derecha La siguiente figura ilustra bloques funcionales para instrucciones de rotación y desplazamiento. La línea de control habilita la operación del bloque. Algunos bloques funcionales tienen líneas derecha e izquierda que determinan la dirección de la rotación o desplazamiento. El bloque de rotación o desplazamiento puede tener varias variables internadas, dependiendo del modelo del controlador. Bloques funcionales de (a) desplazamiento y (b) rotación En general el primer registro contiene el dato a ser desplazado o rotado. Si se especifica longitud, el primer registro especifica la posición de arranque. Por ejemplo, si la longitud es 3 en una instrucción de desplazamiento hacia la derecha, el bloque operará sobre un total de 48 bits. EL número de bits indica el número de posiciones que se desplazará o rotará de una vez, cuando se la línea de control se habilite. Las instrucciones de rotación y desplazamiento son útiles cuando el controlador deba llevar registro del estado de las entradas a lo largo de una banda transportadora. Ejemplo de una instrucción de desplazamiento a la derecha Controladores Programables Ramón Medina Página 66 de 89 Lenguajes de Programación Examinar Bit El bloque funcional examinar bit (XB) verifica el estado (ENCENDIDO o APAGADO) de un punto, bit o localidad de memoria. Este tipo de instrucción es usada cuando se emplean 'banderas' en un programa de control. Una bandera es un bit que es marcado para su posterior evaluación. En una instrucción examinar ENCENDIDO (XBON), el bloque verifica que el bit especificado esté ENCENDIDO. Si es así, el bloque energiza la salida. De manera similar, la instrucción examinar APAGADO, verifica que el bit especificado esté APAGADO. Bloque funcional de evaluación de bit Ejemplo 12 Una aplicación de control está a cargo del manejo de un proceso por lotes donde la lectura de una entrada de temperatura es crítica para este. El transductor de temperatura del proceso está conectado a un módulo de entradas analógicas de 4 canales de 0 a 10VDC con 12 bits de resolución. Los 4 bits restantes de cada canal son usados como indicador de estado del módulo. Ilustre cómo verificar la presencia de una falla en una entrada analógica que mida este crítico valor de temperatura. Solución Verificando el bit 17 del registro 1000 por una condición de APAGADO, es posible determinar si el canal ha fallado. La siguiente figura muestra cómo una instrucción XBOFF consigue hacer esta prueba. Cuando el bit 17 está APAGADO, se sabe que ha ocurrido una falla; si está ENCENDIDO, el canal está bien. Controladores Programables Ramón Medina Página 67 de 89 Lenguajes de Programación La instrucción que maneja la lógica de control es un contacto que se cierra cuando se lee la señal analógica. Para que la instrucción esté siempre operativa, aún cuando no se esté leyendo valor alguno, la línea de habilitación debe estar programada sin condicionales. Instrucciones de Transferencia de Datos Las instrucciones de transferencia de datos mueven (o transfieren) datos numéricos dentro del controlador en registros individuales o bloques (grupos de registros). Estas instrucciones pueden mover información hacia o desde cualquier lugar en la tabla de datos, con excepción de las áreas restringidas. Un uso típico de estas instrucciones lo constituye al traslado de constantes o valores preestablecidos hacia contadores y temporizadores, la lectura de entradas analógicas y módulos de entrada multibit y la transferencia de datos hacia módulos de salida. Al igual que con otras instrucciones, estas pueden ser representadas en formato de escalera y de bloque, aunque el segundo es el más común. Las funciones en formato de escalera Controladores Programables Ramón Medina Página 68 de 89 Lenguajes de Programación usadas para transferir información son GET y PUT, las cuales son utilizadas para implementar funciones aritméticas y de comparación de datos. Una instrucción GET accede a la información que se encuentra en un registro en particular, mientras que PUT sirve para almacenar valores. Instrucciones GET y PUT utilizadas en un diagrama de escalera El grupo de instrucciones de transferencia de datos constituye el conjunto de funciones más útil de los controladores 'mejorados'. Los nombres de las instrucciones para transferencia de datos puede que difieran de un controlador a otro, aunque ellos implementen básicamente las mismas funciones. Instrucciones de transferencia de datos Mover Esta instrucción (MOV) transfiere información de una localidad a otra, siendo el destino un registro de un bit. La figura a continuación muestra la función mover bit (MOVB) y mover registro (MOVR). Algunos controladores ofrecen instrucciones para mover bytes. Controladores Programables Ramón Medina Página 69 de 89 Lenguajes de Programación Bloques funcionales para (a) mover un bit y (b) mover registros Algunos controladores ejecutan la función mover hacia localidades especiales en la tabla de datos. En este caso, el controlador convierte automáticamente la información copiado al formato requerido por la ubicación destino. Por ejemplo, un registro o palabra puede contener un valor en formato BCD, que al ser transferido a otro registro o palabra sea almacenado en formato binario, ejecutándose una conversión BCD-binario. Otro tipo de instrucción es mover máscara (MOVM), que enmascara ciertos bits dentro del registro. La siguiente figura muestra este tipo de instrucción. Bloques funcionales para mover máscara El bloque mover máscara transfiere información en el registro 1000 al 1100, con la excepción de los bits especificados como 0 en la máscara del registro 2000. Otra instrucción de transferencia disponible en algunos controladores es mover estado. Esta función transfiere el estado de los módulos de E/S a registros de almacenamiento. Luego puede ser enmascarada, comparada o evaluada para determinar el estado de fallas en el sistema o en módulos de E/S. Con esta información, el controlador puede tomar acciones correctivas a través del programa de control. Mover Bloque La instrucción mover bloque (MOVBK) copia un grupo de registros de un lugar a otro. La longitud de los bloques es generalmente especificada por el usuario. La siguiente figura muestra un ejemplo de esta instrucción. Controladores Programables Ramón Medina Página 70 de 89 Lenguajes de Programación Bloque funcional para mover grupos de registros Cuando se energiza, la entrada de control dispara la ejecución del bloque. Este entonces transfiere información desde las localidades 1000 a la 1023 hasta 2000 a la 2003 respectivamente. Los datos en los registros 1000 al 1023 quedan inalterados. En algunos controladores, el usuario puede especificar cuantas localidades pueden ser transferidas durante un ciclo de ejecución. Mover Tabla La instrucción mover tabla transfiere información desde un bloque o tabla hasta un registro o palabra en la memoria. Existen dos tipos de instrucciones de movimiento de tabla: tabla a registro (TABLE-REG) y registro a tabla (REG- TABLE). La características principal de esta instrucción es el uso de un registro apuntador, que especifica la posición dentro de la tabla donde el registro será almacenado. La siguiente figura muestra un ejemplo de esta instrucción. Controladores Programables Ramón Medina Página 71 de 89 Lenguajes de Programación Bloques funcionales mara mover un valor de (a) una tabla a un registro y (b) de un registro a una tabla Una transición de APAGADO a ENCENDIDO en la entrada de control habilita la instrucción, que incrementa el contenido del registro apuntador cada vez que la entrada del medio (INCR) pasa de APAGADO a ENCENDIDO. La entrada inferior reinicializa el apuntador a cero (apuntando entonces al tope de la tabla). Si la información debe ser recuperada o almacenada en una posición específica de la tabla, el registro apuntador puede ser configurado con el valor apropiado para apuntar a la posición especificada. En la figura anterior la longitud especifica el número de posiciones en la tabla que serán transferidos (8 en el ejemplo). El bloque encenderá la salida superior luego de haber transferido los 8 registros. Energizará la salida del medio cuando el registro apuntador alcance la posición final de la tabla. Aplicaciones que usen esta instrucción incluyen carga de nueva información en una tabla, almacenamiento de información de entrada proveniente de módulos especiales, y la entrada de información de errores proveniente de otros procesos controlados. También es útil cuando se cambian parámetros en temporizadores y contadores y cuando se manejan simultáneamente grupos de salidas a través de registros de E/S. Una instrucción de movimiento de tabla puede también ser usada cuando se buscan valores en una tabla para comparación, interpolación lineal, etc. Controladores Programables Ramón Medina Página 72 de 89 Lenguajes de Programación Ejemplo 12 Un proceso por lotes opera en turnos de 8 horas cada, donde son procesados lotes de diferentes tamaños que son procesados a una velocidad aproximada de un lote por hora. Se pide implementar instrucciones para almacenar la información del lote, incluyendo el tamaño del lote en galones y la hora del día en que el lote fue finalizado. El registro 1000 mantiene el valor de lotes totales mientras que el 1500 almacena la hora del día (en horas y minutos) en formato BCD (HHMM). Solución La siguiente figura ilustra una instrucción de transferencia registro a tabla que moverá las salidas de los registros 1000 y 1500, usando el mismo registro apuntador para almacenar la información en dos tablas simultáneamente. Esto asegura que el registro apuntador señale a una cantidad de lote que corresponde a la hora en que este finalizar. La señal lote finalizado (Batch Done), que tal vez venga de la apertura de la válvula de descarga, dispara la ejecución de la instrucción de transferencia. Una vez que el registro es almacenado en la tabla, la instrucción incrementa el apuntador. El apuntador es incrementado en sólo uno de los bloques para evitar doble incremento. El incremento ocurre luego de que ambos bloques funcionales han sido ejecutados para asegurar que la información sea almacenado en la misma posición relativa dentro de cada tabla. En este caso la señal Batch Done es un contacto transicional, de tal manera que la instrucción registro a tabla sólo transfiera el registro una vez a la posición apropiada dentro de la tabla. Controladores Programables Ramón Medina Página 73 de 89 Lenguajes de Programación Transferencia de Bloque - E/S Algunos controladores proporcionan instrucciones para transferencia de bloques (BXFER), que son principalmente usados para transferir bloques de información con módulos de E/S especiales. Los dos tipos básicos de este tipo de instrucciones son block transfer in y block transfer out. La siguiente figura muestra un ejemplo de esta instrucción. Instrucción para transferencia de bloques La dirección del módulo para la transferencia de datos se especifica de manera explícita usando los parámetros chasis (rack) y ranura (slot). En la figura siguiente, se leerá el contenido de 8 canales del módulo inteligente ubicado en el la ranura 3 del chasis 1, cuya información será almacenada en los registros 1000 al 1007. Controladores Programables Ramón Medina Página 74 de 89 Lenguajes de Programación Instrucción para transferencia de bloques La entrada de control, cuando es habilitada, ejecuta la instrucción de transferencia. Durante la ejecución de esta instrucción, la información es almacenada en la posición de memoria o registros especificados. La longitud del bloque especifica cuántas posiciones son necesarias para almacenar los datos. Por ejemplo, la información proveniente de un módulo de entradas analógicas con cuatro canales, puede ser leída toda de una sola vez, si la longitud especificada es 4. Una instrucción block transfer out funciona de manera similar, con la dirección del módulo de salida especificando el destino de la información a ser transferida. La salida superior del bloque es la encargada de indicar la completación de la instrucción (al estar ENCENDIDA). Transferencia ASCII Las instrucciones de transferencia ASCII (ASCII XFER) transmiten información en formato ASCII entre el controlador y un dispositivo periférico. El bloque funcional opera en conjunto con el módulo de comunicación ASCII. La comunicación ASCII puede ocurrir de dos maneras: leer información desde un periférico o escribir datos en él. Este bloque funcional es usado ampliamente en aplicaciones donde se requiere generación de reportes. La siguiente figura muestra un bloque funcional ASCII. Controladores Programables Ramón Medina Página 75 de 89 Lenguajes de Programación Bloque funcional para transferencia ASCII La entrada de control activa la ejecución de la instrucción. Cuando se lee información, la instrucción permite que módulos especiales de E/S lleven a cabo la operación. El procesador entonces lee la información a partir de estos módulos, y la almacena en localidades especiales de la memoria (desde el primer registro hasta el último, tal y como se especifique por el parámetro de longitud). Las direcciones de E/S en el bloque especifica la localización del módulo. Cuando se escribe información, el procesador transfiere datos desde la posición donde están almacenados hasta la dirección donde se ubica el módulo. Algunas instrucciones de transferencia ASCII utilizan registros apuntadores para acceder a posiciones específicas en una tabla (por ejemplo, para decodificar un caracter de datos específico en una tabla de datos). Otras instrucciones ASCII permiten que el usuario especifique cuántos bytes o caracteres son transmitidos durante un ciclo de ejecución. La velocidad de transmisión es una función del ciclo de ejecución, que a su vez depende del número de dispositivos ASCII que estén activos en un momento dado. Una instrucción ASCII asume que se han configurado los valores apropiados de rata de transmisión, bit de arranque y parada y de paridad en el hardware del módulo de E/S. Transferencia de Cola - FIFO La instrucción de transferencia de cola (primero en entrar - primero en salir o FIFO) construye una tabla o cola donde se almacena la información. La función básica de esta operación es similar a la de un registro de desplazamiento, en la que una palabra (16 bits) es desplazada dentro de la cola, cada vez que se ejecuta la instrucción. La información siempre es desplazada en el orden en que fue recibida: el primer dato que ingresó será el primero en salir. La figura siguiente muestra un ejemplo de esta instrucción. Controladores Programables Ramón Medina Página 76 de 89 Lenguajes de Programación Bloque funcional FIFO Una operación FIFO consta de dos partes: una instrucción de entrada FIFO (FIFO IN) y otra de salida (FIFO OUT). La instrucción FIFO IN carga la cola mientras que FIFO OUT la descarga. Las instrucciones FIFO son útiles para almacenar información (recuperándola luego) de naturaleza temporal, en la medida en que vaya estando disponible. Una aplicación típica es el almacenamiento de recuperación de datos que están sincronizados con el movimiento externo de partes en una banda transportadora. Una transición APAGADO-ENCENDIDO en la línea de control se usa para iniciar el bloque FIFO. Algunos bloques puede disponer de una línea de inicializar para borrar la cola. En una instrucción FIFO, el registro de entrada contiene el valor que va a ser ingresado en la cola. La información es colocada en la cola cuando se ENCIENDE la línea de control. La información de la última posición de la cola es colocada en el registro de salida. La longitud del FIFO especifica el tamaño de la cola. La instrucción FIFO es muy útil cuando se trata de mantener valores obtenidos de un proceso en una 'ventana de tiempo en movimiento'. Por ejemplo, en la siguiente figura se muestra un perfil de temperatura en función del tiempo. Si se desea mantener una ventana de tiempo desde t0 hasta t1, los valores pueden ser almacenados en una cola. De esta manera, la cola mantendrá siempre los últimos valores (desde t0 hasta t1). Controladores Programables Ramón Medina Página 77 de 89 Lenguajes de Programación Perfil de temperatura Ordenamiento El bloque de función de ordenamiento (SORT) permite ordenar un bloque de registros, en orden ascendente o descendente, de acuerdo a su contenido. La siguiente figura muestra un bloque de ordenamiento en el cual el cierre del contacto 10, habilita la función. El bloque ordena el contenido de los registros 1000 al 1017 en orden ascendente y almacena el resultado en los registros 2000 al 2017. Este tipo de función es muy útil cuando se calculan estadísticos descriptivos tales como la mediana, operaciones éstas que requieren que la muestra esté ordenada. Bloque funcional para ordenamiento ascendente Instrucciones para Funciones Especiales Estas instrucciones, como su nombre lo implica, corresponde a operaciones que no son incluidas en ninguno de los otros grupos. Estas funciones típicamente están disponibles en controladores de medianos a grandes. Controladores Programables Ramón Medina Página 78 de 89 Lenguajes de Programación Funciones especiales Secuenciadores Un bloque secuenciador (SEQ) es una potente instrucción que proporciona un mecanismo para manipular un grupo de datos (secuencialmente) con base a una tabla de datos predefinida. Tabla secuenciadora La siguiente figura muestra un típico bloque funcional secuenciador. La entrada de control se encarga de iniciar la ejecución del bloque, ocasionando que el contenido de la tabla de secuencias sea transferida a salidas de manera secuencial. El registro apuntador señala al paso que será procesado. Cada vez que se energiza la entrada de control, el apuntador es incrementado automáticamente, apuntando al siguiente paso de la tabla. Dependiendo del tipo de controlador, la entrada de control puede ser manipulada por eventos o por tiempo. La línea de inicialización del apuntador puede hacer que este señale al primer paso en caso de ser necesario. La longitud y ancho de la secuencia especifican cuantos pasos y el número de bits contenidos en la tabla (respectivamente). Cuando se habilita la instrucción secuenciadora, se energiza la primera salida del bloque. La segunda salida señala el fin de la tabla del secuenciador. Controladores Programables Ramón Medina Página 79 de 89 Lenguajes de Programación Bloque funcional secuenciador Ejemplo 13 Una aplicación exigen la implementación de 10 pasos que deben ser ejecutados secuencialmente. Con el propósito de detectar fallas en la secuencia, el código del paso que está siendo ejecutado, debe ser mostrado en una pantalla de visualización. Se pide implementar un bloque de instrucción que satisfaga esta aplicación. Solución La siguiente figura muestra una manera de mostrar el código del paso utilizando un registro salida de 16 bits, conectado a un panel de visualización de 4 dígitos. El secuenciador transfiere los códigos de la tabla al registro de salida. El registro de salida es configurada de tal manera que haga referencia al interface de salida (por ejemplo chasis 0, ranura 7, palabra 7). Cada vez que la señal Start of Process Step va de APAGADO a ENCENDIDO, la salida del secuenciador envía la información al indicador. Controladores Programables Ramón Medina Página 80 de 89 Lenguajes de Programación Diagnóstico El bloque de diagnóstico (DIAG) compara dos bloques de memoria, uno que contiene las condiciones de entrada actuales y que contiene los valores de referencia. La instrucción compara esos bloques bit por bit para determinar si son idénticos. Si se presenta alguna diferencia, la instrucción almacena el número y el estado del bit en un registro de almacenamiento. Las instrucciones de diagnóstico son útiles para identificar malfuncionamiento de las máquinas. La siguiente figura ilustra un bloque de diagnóstico. La línea de control, al estar energizada, inicia el bloque de función. El bloque luego compara el contenido de los registros 1000 al 1007 con el contenido de los ubicados del 200 al 2007. Controladores Programables Ramón Medina Página 81 de 89 Lenguajes de Programación Bloque funcional para diagnóstico Si encuentra alguna diferencia, almacena la información en el registro 3000 sin alterar otras posiciones. Cuando finaliza la instrucción, se energiza la salida superior. La instrucción energiza la segunda salida, sólo cuando encuentra alguna diferencia. PID Los controladores capaces de ejecutar estrategias de control analógicos, serán los que dispongan de bloques funcionales PID. El usuario especifica los parámetros asociados al algoritmo, para el proceso de manera apropiada. La siguiente figura muestra un ejemplo de este tipo de instrucción. Bloque funcional PID La entrada de control, al estar energizada, inicia la operación automática del bloque PID. La entrada inferior, al estar energizada, determina si las variables del PID son monitoreadas pero no procesadas. Si el bloque no está activado (por ejemplo en modo manual), el controlador puede monitorear las variables si la línea correspondiente está habilitada. El Controladores Programables Ramón Medina Página 82 de 89 Lenguajes de Programación usuario especifica el registro correspondiente a la variable de entrada (IVR) y el registro de la variable de salida (OVR), que estarán asociados a localidades en módulos analógicos (entrada y salida). Los registros proporcional (PR), integral (IR) y derivativo (DR) contienen los valores de ganancia que deben ser especificados para controlar el proceso. El registro SPR (set point register) contiene el valor de referencia para el proceso. Dependiendo del controlador, el usuario puede también especificar otros registros tales como tiempo muerto, límites alto y bajo y velocidad de actualización. La salida superior del bloque PID indica que el lazo de control está activo. Otras salidas pueden indicar alarmas. Algunos controladores proporcionan capacidades de control PID sin bloques PID. En este caso, el controlador usa un módulo especial que contiene todos los parámetros necesarios. Una instrucción de salida, como por ejemplo un bloque de transferencia de salida o de movimiento de dato, transfiere los parámetros al módulo durante el proceso de inicialización del programa. El programa de control puede modificar la información en este módulo, en caso de ser necesario. Instrucciones de Comunicación en Red Las redes de área local (LAN) proporcionan canales de comunicación entre computadores independientes (referidos como nodos). Debido a que conectan computadores distintos, las LAN han creado la necesidad de instrucciones que permitan comunicación e intercambio de información entre los controladores conectados a la red. Por esta razón los fabricantes de controladores ofrecen instrucciones para comunicación a través de la red, que transfieren datos relacionados con el estado de contactos, bobinas y registros. Estas instrucciones de red son normalmente específicas a ciertas familias de controladores. La siguiente tabla muestra las instrucciones más comunes utilizadas en un entorno de red de controladores. Estas instrucciones son fáciles de implementar; sin embargo, el programador deberá ajustarse a las reglas de la red. Adicionalmente, el programador deberá asignar registros y organizar el programa de tal manera que eviten confusiones en la red. Controladores Programables Ramón Medina Página 83 de 89 Lenguajes de Programación Instrucciones para comunicación a través de la red Cuando el controlador ejecuta una instrucción de comunicación a través de la red, este envía la información al dispositivo correspondiente para procesar la transmisión. El formato de la instrucción puede variar dependiendo del controlador. En algunos casos el controlador usa instrucciones de transferencia de datos para acceder a la red mientras que en otros, emplea instrucciones específicas. Por lo tanto, las instrucciones que se presentan aquí representan una guía de referencia para ilustrar la implementación. La organización de una red depende de cómo ésta esté configurada. En algunos controladores, la interface de red está incluida en el procesador principal, mientras que en otros es un módulo independiente. Sin importar el formato, ambos interfaces llevan a cabo la misma función: comunicarse con la red. En los casos en que la interface de red está instalada en las ranuras de E/S, el controlador provee uno de varios mecanismos para configurar la red. Una solución es especificar el módulo de comunicaciones durante el proceso de configuración del sistema. Algunos controladores reconocen automáticamente la presencia y ubicación del módulo de comunicaciones. En otros casos, una instrucción de acceso a la red permite identificar la localización del módulo de red. Los contactos y bobinas de salida en una red pueden ser referenciados como salidas y contactos de red. Las salidas de red son salidas internas que están típicamente ubicadas en posiciones especiales dentro de la tabla de datos, junto con otros registros asociados a la red. Esos elementos pueden ser parte del área de almacenamiento interno, pero con capacidades adicionales relacionadas con la red. Por ejemplo (como se ilustra en la siguiente figura), si un controlador tiene 512 posibles salidas internas, 64 de ellas pudieran ser usadas como salidas de red. Asimismo, si dispone de 128 registros de almacenamiento, 32 de ellos podrían ser usados como registros de red. Esas direcciones asociadas a la red serán enviadas automáticamente si la red está activa. Controladores Programables Ramón Medina Página 84 de 89 Lenguajes de Programación Mapa de direcciones compatibles con red con todos los números en notación octal Las instrucciones presentadas en esta sección suponen que el controlador especifica la ranura del módulo de red durante la configuración del sistema. Salida de Red Una instrucción de salida de red, como se muestra en la siguiente figura, es usada en conjunto con un contacto de red para transferir la información de un bit de estado del controlador a la red. Operación de una salida de red y un contacto de red Si existe continuidad lógica, la salida de red encenderá la dirección referenciada. Enviará la información acerca del estado de la dirección especificada a la interface de red para su transmisión. Dependiendo del controlador, la dirección referenciada debe ser una bobina de red válida. Luego de la transmisión, el estado de la salida está disponible para todos los nodos en la red. Controladores Programables Ramón Medina Página 85 de 89 Lenguajes de Programación Contacto de Red Un contacto de red es una instrucción que captura la información de estado de una salida de red. La dirección de referencia del contacto de red debe ser el mismo que de la salida de red activa; de lo contrario, el contacto nunca será evaluado. La referencia debe ser una dirección válida. La figura anterior ilustra la operación de una instrucción de contacto de red usada en conjunto con una instrucción de salida de red. En esta instrucción, el procesador obtiene información de la red a medida que lee el buffer de estado del módulo de red, como si fuera una pequeña tabla de datos. Si la salida de red referenciada tiene estado lógico 1, el controlador ejecutará la evaluación de contactos abiertos o cerrados para proporcionar o remover continuidad. Esta evaluación dependerá de cómo fue configurado el contacto de red (normalmente abierto o cerrado). Enviar a la Red La instrucción enviar a la red (NET SEND) envía la información de un registro a la red local. Esta instrucción es habilitada a través de la línea de control. Puede incluir dos salidas para indicar que la operación fue ejecutada y que no se detectó ningún error. La siguiente figura ilustra una típica instrucción de envío a la red. Si se especifica una longitud de más de uno, la red puede recibir más de un registro (transmitido). Los registros a ser transmitidos deben ser consecutivos. La instrucción de envío a la red operan normalmente en conjunto con un de recepción de la red. Instrucción (a) enviar a la red y (b) recibir de la red Controladores Programables Ramón Medina Página 86 de 89 Lenguajes de Programación Recibir de la Red La instrucción recibir de la red (NET RCV) captura información de registros disponible en la red y la almacena en la tabla de datos del controlador. El usuario debe asegurarse que la dirección de los registros solicitados esté correctamente referenciada en la instrucción. Por ejemplo, si una instrucción NET SEND usa los registros 400 al 403, el controlador que recibe los datos debe hacer referencia a los mismos registros en la instrucción NET RCV. La figura anterior ilustra el uso de instrucciones de recepción de la red. Una vez que la información de la red es capturada, esta es almacenada en los registros destino. Las salidas disponibles señalan la completación de la operación y la presencia o no de errores. Enviar Nodo La instrucción enviar nodo (SEND NODE) opera de una manera más directa que lo que lo hace la instrucción NET SEND. En este caso, la información es transmitida a un nodo (controlador) específico en la red. Esencialmente, la instrucción SEND NODE implementa una función copiar, donde varios registros del nodo fuente, son copiados en el nodo destino. La siguiente figura ilustra la instrucción SEND NODE. La presencia de continuidad lógica en la línea de control, habilita la operación del bloque, que envía el contenido de los registros al nodo especificado como destino. El bloque almacena la información en los registros destino. Al finalizar enciende la primera salida, y en caso de error, enciende la segunda. Operación de un bloque funcional SEND NODE Controladores Programables Ramón Medina Página 87 de 89 Lenguajes de Programación Obtener Nodo La instrucción GET NODE recupera información de registros a partir de la información vertida en la red por otro controlador. Esta instrucción esencialmente copia la información del nodo origen al nodo destino. La siguiente figura ilustra el uso de una instrucción GET NODE. Cuando el bloque está habilitado, solicita el contenido de los registros especificados y almacena la información de los registros destino del controlador que ejecuta la función. La primera salida se energiza como señal de que la instrucción fue completada. La segunda se energiza si ocurre algún problema de comunicación durante la transmisión de los datos. Operación de un bloque funcional GET NODE Nemotécnicos Booleanos Los nemotécnicos booleanos constituyen un lenguaje de programación de controladores basado en operadores booleanos tales como AND, OR y NOT. Una instrucción nemotécnica escrita en una forma abreviada que incluye de 3 a 4 letras del nombre de la correspondiente operación. La siguiente tabla muestra un conjunto de instrucciones booleanas típicas y sus símbolos en diagrama de escalera equivalentes. El lenguaje booleano es usado para ingresar lógica en la memoria del controlador. Sin embargo, muchos controladores muestran la instrucción ingresada como diagrama de escalera. Controladores Programables Ramón Medina Página 88 de 89 Lenguajes de Programación Instrucciones booleanas y su equivalente en diagrama de escalera Los operadores booleanos de salida mejorados, que llevan a cabo funciones de control adicionales, son el resultado de actualizaciones del conjunto de instrucciones. La siguiente figura muestra un programa en lenguaje booleano con su diagrama de escalera equivalente. Programa en lenguaje booleano y su representación en diagrama de escalera Controladores Programables Ramón Medina Página 89 de 89