Programación autómatas
de
simatic s7-300 (Lenguaje aWL) emiLio gonzáLez rueda
e-mail:
[email protected] www.canopina.com
Cano Pina, S.L. – Ediciones Ceysa © © Este producto está protegido por las leyes de propiedad intelectual. Está prohibida la reproducción o distribución de parte alguna de la presente edición, ya sea por medios electrónicos, mecánicos o cualquier otro, sin la previa autorización del editor. © de la presente edición: Cano Pina, S.L. – Ediciones Ceysa © © de la obra: el autor
TíTulo: Programación de Autómatas SIMATIC S7-300 (Lenguaje AWL) AuTor: Emilio González Rueda Edita: Cano Pina, S.L.- Ediciones Ceysa ISBN: 978-84-15884-61-3 Producción: Susana Encinas diseño
de PorTAdA:
Josep Costa i Ardiaca
Prólogo A quién va dirigido este libro Este libro va dirigido en general a todas aquellas personas que por razones de trabajo o estudio, tienen necesidad de conocer los autómatas SIEMENS de la clase SIMATIC S7-300.
Conocimientos previos, características y alcance de este libro Para un total aprovechamiento de lo que se explica en este libro, sería deseable que el lector tuviera ya conocimientos previos, aunque fueran elementales, sobre electricidad, neumática e informática en general. El libro hace especial énfasis en una metodología propia de programación de autómatas SIMATIC S7-300, consistente primeramente en la representación Grafcet de los procesos secuenciales considerados y posteriormente en la traducción a lenguaje AWL de estos procesos secuenciales. Así mismo, el lector que comienza en estos temas y el profesional que ya esté introducido en ellos, podrá observar como la técnica de programación que aquí se explica, en ocasiones puede parecer algo más compleja si se compara con otras técnicas de programación. Ahora bien, debe tenerse en cuenta que gracias a esta complejidad, el profesional puede obtener por este procedimiento, no solamente programas perfectamente estructurados, claros y fiables, sino algo de extrema importancia en procesos secuenciales, como es el obtener PROGRAMAS ULTRA RÁPIDOS CON TIEMPOS DE SCAN MÍNIMOS, totalmente inalcanzables con otras técnicas de programación convencional. Se trata, por tanto, de una técnica de programación segura y fiable, que por una parte puede usarse en general en cualquier caso de programación de procesos secuenciales y, por otra parte, es una técnica INSUSTITUIBLE si se trata de programar un proceso crítico donde los tiempos de scan del autómata deban ser muy pequeños. Con todo, el autor está elaborando un segundo libro como continuación de éste, en el que se explican las mismas materias, pero empleando técnicas de programación más conven-cionales (aunque como contrapartida, con tiempos de scan mucho más grandes), e incluso hacer extensiva esta técnica de programación a otros modelos de autómatas como OMRON o TELEMECÁNICA.
Material necesario para el aprendizaje
Sería aconsejable practicar los ejemplos de este libro, bien con un autómata real o bien con un programa de simulación. Así pues, el material adecuado para practicar los ejercicios de este libro, podría ser el siguiente: • Un ordenador personal (PC) como mínimo con: o Procesador Pentium III. o Memoria central de 64 MB . o Capacidad en disco libre de 500 MB. o Sistema operativo W98. o STEP-7, v5.0. • Un autómata S7-300 con 8 entradas y 8 salidas digitales, dotado de interruptores en sus entradas para simular contactos de entrada, así como un cable MPI para conectar el autómata al puerto serie del PC, o el simulador PLCSIM v5.0 de SIEMENS.
Lenguaje de programación
En este libro se hace uso exclusivamente del lenguaje de programación AWL de SIE-MENS, cuyas reglas se fijan en la norma DIN EN-61131-3 (int. IEC 1131-3).
Página web de especial interés
Evidentemente, en Internet es posible encontrar multitud de páginas web interesantes e incluso importantes, pero merece especial atención la página oficial de SIEMENS: http://www.ad.siemens.de/simatic/portal/index_76.htm Los nombres de productos que se listan a continuación (entre otros), son marcas registradas por SIEMENS AG: SIMATIC, SIMATIC NET, SIMATIC HMI, PLCSIM, STEP 7, AWL, KOP, FUP, NETPRO, MPI.
Índice 1
Elementos de un proceso industrial
2
Sistemas de numeración
3
Clases de registros
4
Operaciones lógicas
5
Los autómatas SIMATIC S7-300
6
Operaciones lógicas con Bits
7
STEP-7
8
Grafcet
9
Temporizadores y contadores
10
Operaciones FP y FN
11
Operaciones de carga, transferencia y comparación
12
Operaciones aritméticas y trigonométricas
13
Operaciones de desplazamiento y rotación
14
Operaciones de salto
15
Procesos en paralelo
16
Funciones (introducción)
17
Tipos de funciones
18
DBs y FBs
19
Direccionamiento
20
Algunos conceptos avanzados
21
SFCs
22
Cajón de sastre
ir a
Apéndice
Elementos de un proceso industrial
Capítulo 1
CAPÍTULO 1
Índice
Elementos de un proceso industrial 1.1
El proceso industrial
De una forma aproximada podemos decir que un proceso industrial es aquel que está formado por un conjunto de personas y máquinas que trabajan de manera coordinada, con objeto de crear un bien de consumo, donde el bien de consumo puede ser tan simple como un tapón de botella o tan complejo como un vehículo industrial. Ahora bien, lo cierto es que los procesos industriales, sean simples o complejos, se caracterizan cada vez más automatizados. Así pues, cada vez están más lejos los tiempos en que gracias a la habilidad manual de algunos artesanos, la sociedad se podía abastecer de bienes de consumo tan comunes como calzado, utensilios de cocina o ropa de vestir. Hoy en día, estos mismos bienes se fabrican con la ayuda de maquinaria sofisticada y en muchos casos con elementos de control electrónicos incorporados a estas máquinas que las hacen altamente rentables, ya que se consiguen elevados ciclos de producción. Así, hoy en día hablar de procesos industriales es casi lo mismo que hablar de procesos automatizados. Máquinas electrónicas tales como ordenadores, controles CNC, autómatas y robots, son totalmente corrientes en nuestras empresas, y el técnico que deba reparar estas máquinas o programar su funcionamiento o decidir la compra de nuevo material, debe conocer toda esta tecnología apasionante que constituye el mundo de la automatización industrial. 1.2
El sensor digital
En todo proceso industrial automatizado, es preciso captar señales que serán procesadas posteriormente. Uno de los sensores más comunes en las instalaciones industriales es el sensor digital, el que podemos imaginar como un interruptor eléctrico accionado por alguna variable física. Es el caso de los llamados “finales de carrera”, que son interruptores que se abren o se cierran según la fuerza que se haga sobre un elemento saliente en forma de rueda, varilla o pistón.
Fig.1.1. Finales de carrera OMRON.
11
Elementos de un proceso industrial
Capítulo 1
En el caso de los sensores inductivos, la variable física es un campo magnético que se ve influenciado por la presencia o ausencia en sus proximidades de materiales férricos, tales como el hierro o el acero en cualquiera de sus variantes. En estas condiciones, el sensor inductivo entrega un voltaje alto o bajo dependiendo de si la pieza férrica está dentro o fuera de su zona de acción.
Fig.1.2. Sensor inductivo SIEMENS.
Para materiales que no tienen características férricas, tales como madera, vidrio, cerámica, etc. se pueden usar sensores capacitivos. Estos sensores se fundamentan en la constante dieléctrica de la pieza que se aproxima a ellos, de tal forma que a su salida entregan un voltaje alto o bajo según el cuerpo a detectar esté o no en su zona de acción. Podemos citar también los sensores fotoeléctricos en general, dentro de los que tenemos por ejemplo los del tipo barrera, que entregan un voltaje alto o bajo según un elemento opaco, corte o no corte el haz de luz que pasa del cuerpo emisor hacia el receptor.
Fig.1.3. Sensores fotoeléctricos de barrera KEYENCE
Los sensores que detectan si una presión (por ejemplo de un gas en una tubería) está por encima o debajo de una determinada presión de consigna, reciben el nombre de presostatos, y si estos aparatos son eléctricos o electrónicos, a su salida nos entregan un voltaje alto o bajo según se de o no la circunstancia anterior. En fin, existen muchos más sensores de tipo digital en el mercado capaces de detectar variables físicas tan diferentes, como nivel de líquidos en tanques, presencia o ausencia de llama en un quemador industrial de gas, temperatura por encima o debajo de una temperatura de consigna, velocidad de un móvil por encima o debajo de una determinada velocidad prefijada, etc. Todos estos sensores, aun midiendo variables físicas de naturaleza totalmente diferente, tienen en común que la señal que entregan a su salida es (normalmente) una tensión eléctrica que pue12
Elementos de un proceso industrial
Capítulo 1
de ser alta (por ejemplo +24 VDC) o baja (por ejemplo 0 VDC). Cuando esto ocurre, decimos que el sensor es de tipo digital. 1.3
El sensor analógico
Cuando lo que se trata de medir no es la ausencia o presencia de una determinada variable física sino el valor que tiene dicha variable, entonces debemos emplear sensores analógicos, los que nos entregan a su salida, bien una tensión o bien una corriente proporcionales al valor que tenga dicha variable. Imaginemos que debemos medir el valor de una temperatura o el valor de una presión o la cantidad de litros por minuto del líquido que pasan por una tubería, en estos casos emplearemos sensores analógicos de temperatura, de presión o de caudal, con la precisión adecuada a cada caso. Lo mismo que antes hemos dicho para los sensores digitales referente a la gran cantidad de dispositivos existentes en el mercado, podemos decir lo mismo de los sensores analógicos, de los que existe una enorme variedad de modelos y características, dependiendo del tipo de variable que queramos medir y de la precisión que deseemos en la medida. Citemos por ejemplo un sensor de presión absoluta, capaz de medir presiones hasta 10 bar, y preparado para trabajar con líquidos corrosivos, que nos entrega a su salida una tensión máxima de 30 mV, con un error en la medida de ± 0.2%.
Fig.1.4. Sensor de presión OMEGA
Los termopares están formados por la unión de dos metales (especialmente elegidos), de tal forma que cuando se calienta la unión formada por estos metales, se genera un voltaje proporcional a la temperatura que se alcanza en la unión.
Fig.1.5. Termopares OMEGA
13
Elementos de un proceso industrial
1.4
Capítulo 1
El relé en general
El relé es sin duda un gran aliado dentro del mundo de los automatismos. Su funcionamiento podemos esquematizarlo en el siguiente dibujo:
A L B I
Fig.1.6. Principio del relé
Al cerrar el interruptor I, circula corriente por el devanado y el núcleo magnético (de hierro dulce) se transforma en un imán que atrae la pieza B (también de hierro dulce) sobre la A, cerrándose así el contacto eléctrico que hace que se encienda la lámpara L. La forma constructiva de un relé industrial puede ser muy variada en función del amperaje que los contactos puedan conmutar y de la tensión de funcionamiento, pudiéndose encontrar en el mercado relés que conmutan desde algunos miliamperios hasta unos 20 A. .
Fig.1.7. Relé industrial OMRON
1.5
El relé Reed
El relé Reed responde al mismo principio de funcionamiento que un relé normal, sólo que sus contactos de trabajo están encerrados dentro de una pequeña ampolla de vidrio en cuyo interior se ha introducido un gas inerte para evitar la oxidación de los contactos.
Fig.1.8. Principio del relé Reed
14
Elementos de un proceso industrial
Capítulo 1
Estos contactos están hechos de material ferromagnético y tienen forma de pequeñas varillas flexibles que están próximas entre si pero sin llegar a tocarse. En presencia de un campo magnético potente, tal como puede ocurrir al aproximar un imán a la ampolla de vidrio, las varillas se imantan y se atraen la una a la otra, con lo que se produce el contacto entre ambas, permitiendo así cerrar un circuito eléctrico. Este tipo de relé es muy seguro y se emplea ampliamente en la industria. 1.6
El contactor
El contactor podemos imaginarlo como un relé industrial capaz de trabajar con intensidades de corriente a partir de 20 A. Además de trabajar con elevadas intensidades de corriente, también es capaz de soportar fuertes sobrevoltajes en sus contactos procedentes de la interrupción de corrientes en los devanados de motores trifásicos, o incluso de la inversión brusca de corrientes en estos mismos devanados. Según la forma de trabajar el contactor, se agrupan en clases de funcionamiento tales como AC1, AC2, AC2’, AC3 y AC4, dependiendo del tipo de carga eléctrica que deba manejar el contactor.
Fig.1.9. Contactores SIEMENS
Además de la robustez de sus contactos eléctricos, el contactor se caracteriza por tener contactos eléctricos secundarios del tipo NA o NC, que son de estimable ayuda a la hora de realizar circuitos de maniobra con los contactos principales del contactor. Para nosotros, que en estos momentos sólo estamos interesados en el funcionamiento de los autómatas, el contactor debemos verlo como un elemento intermedio entre nuestro autómata y una carga eléctrica importante que deseamos manejar (por ejemplo, un motor trifásico con rotor en corto circuito). Dado que es evidente que desde un autómata no podemos excitar directamente una carga tan importante, el contactor, que sólo necesita en torno a 90 mA. para excitarse y cerrar sus contactos principales, nos resulta de gran ayuda porque nos basta desde el autómata enviar esta pequeña corriente al contactor, y éste será realmente el encargado de cerrar el circuito de potencia que ponga en marcha el motor.
15
Elementos de un proceso industrial
1.7
Capítulo 1
El cilindro neumático
El cilindro neumático está formado básicamente por un cilindro de metal (normalmente aluminio o aleaciones de aluminio capaces de soportar grandes esfuerzos) y en su interior un pistón perfectamente ajustado a la pared del cilindro que lleva un vástago de metal que sobresale por uno de sus extremos.
Fig.1.10. Cilindro neumático FESTO
El aire que penetra en el interior del cilindro es el que mueve el pistón que hay en su interior y éste a su vez, el que mueve el vástago del cilindro. Hay que hacer notar, que el aire que penetra en los cilindros neumáticos, ha de ser un aire totalmente limpio, carente de partículas pulverulentas en suspensión y estar totalmente seco. Para conseguir esto, se emplean filtros a base de materiales porosos y condensadores de humedad. 1.8
La electro válvula
Dado que los cilindros neumáticos funcionan con aire a presión y dado que los autómatas sólo disponen de señales eléctricas para gobernar los elementos que deben controlar, se hace necesario una pieza intermedia (la electro válvula) que permita transformar las señales eléctricas del autómata en acciones que controlen el funcionamiento de los cilindros neumáticos. El funcionamiento básico de una electro válvula se muestra más abajo en los dibujos, donde puede verse como el desplazamiento de una pieza (corredera) a derecha e izquierda, hace posible desviar el aire a presión que entra en la electro válvula, hacia los orificios superiores, de tal forma que en una posición de la corredera, el aire impulsa al émbolo del cilindro en un sentido, y en otra posición de la corredera el aire impulsa el émbolo en sentido contrario. Entre los modelos de electro válvulas más importantes que existen, podemos citar las del tipo 5/2 monoestables (izquierda) o las 5/3 biestables (derecha) con centro cerrado, de las que se adjunta un dibujo mostrando su principio de funcionamiento y el símbolo esquemático:
Fig.1.11. Electro válvulas 5/2 y 5/3
16
Elementos de un proceso industrial
Capítulo 1
Las del tipo 5/2 monoestables son adecuadas para controlar el movimiento de cilindros neumáticos de doble efecto con posiciones estables en los extremos del cilindro, mientras que las 5/3 biestables con centro cerrado son adecuadas para controlar cilindros neumáticos de doble efecto en los que se desea que el émbolo pueda detenerse, no sólo en los extremos del cilindro sino también en puntos intermedios del recorrido. Otro aspecto que diferencia unas electro válvulas de otras, es la tensión de excitación del solenoide, y como es lógico deberemos escoger aquellos modelos de electro válvulas que tengan una tensión de excitación del solenoide igual que la tensión de salida de nuestro autómata (normalmente, 24 VDC).
Fig.1.12. Electro válvula FESTO
1.9
Motores trifásicos
Los motores trifásicos en general, y muy en particular los asíncronos de rotor en corto circuito o “jaula de ardilla”, son sin duda piezas fundamentales en todo proceso industrial, por cuanto son motores robustos y fiables en su funcionamiento al no tener en su interior piezas que rocen las unas con las otras. Son motores muy sólidos, que tienen muy buenas prestaciones mecánicas, y quizás lo que es más importante, a precios muy competitivos. Su principio de funcionamiento se basa en los devanados de cobre que hay en el estator, que al ser conectados a tensión trifásica, crean un campo magnético giratorio en su interior. El rotor, formado por una pieza que recuerda la jaula de una ardilla (de ahí su nombre) reacciona a este campo magnético, creando su propio campo magnético pero desfasado 90º respecto al creado por el estator. Este desfase entre ambos campos magnéticos, es el causante de que el momento de la fuerza que tiende a hacer girar el rotor, sea siempre máximo, lo que permite usar estos motores en aplicaciones donde el arranque inicial ha de poseer un elevado par motor, como es el caso de los tornos eléctricos.
Fig.1.13. Motor trifásico SIEMENS
17
Elementos de un proceso industrial
Capítulo 1
Así, dependiendo del número de devanados que tenga el estator, múltiplos de tres (3), se consiguen motores que giren aproximadamente a: 3000 RPM, 1500 RPM, 1000 RPM, 750 RPM y 600 RPM. Otra variante de los motores trifásicos asíncronos de rotor en corto circuito, son los llamados moto reductores, los que están formados por el motor propiamente, acoplados a un mecanismo reductor de velocidad, tal como puede ser por ejemplo una corona dentada accionada por un tornillo sin fin solidario con el eje del motor. Sin embargo, tanto los motores trifásicos de devanados múltiples como los moto reductores, se están viendo relegados por la aparición de un nuevo elemento que casi podríamos decir que es revolucionario. Estamos hablando del variador de frecuencia, que permite a un coste muy aceptable, variar directamente la velocidad de giro de un motor trifásico asíncrono en corto circuito, con gran facilidad y haciendo trabajar al motor sin que éste pierda prestaciones tan importantes como es su par motor. Con todo, en estas aplicaciones hay que vigilar que a velocidades de giro muy bajas, el motor no se caliente, por cuanto el ventilador que llevan los motores trifásicos, es solidario con el motor mismo y lógicamente si el motor gira a pocas revoluciones el ventilador también, y es entonces cuando el motor puede calentarse peligrosamente. Siendo esto un problema, se resuelve con facilidad, simplemente proporcionando al motor un ventilador con motor eléctrico independiente que impulse hacia el motor el mismo caudal de aire independientemente de la velocidad de giro del motor.
18
Sistemas de numeración
Capítulo 2
CAPÍTULO 2
Índice
Sistemas de numeración 2.1 Sistema de numeración decimal El sistema de numeración que usamos en nuestra vida diaria, está formado por diez (10) cifras o signos numéricos, que son: Se escribe
Se pronuncia
0 1 2 3 4 5 6 7 8 9
Cero Uno Dos Tres Cuatro Cinco Seis Siete Ocho Nueve
Tenemos un total de diez (10) símbolos o signos numéricos, que todos conocemos perfectamente. Cuando tenemos que escribir una cantidad (entera), lo hacemos de la siguiente forma. Por ejemplo, imaginemos que tenemos 1492 naranjas. Escribiríamos: 1492 naranjas También hemos convenido que el primer número que empieza por la derecha se llama UNIDADES. Así, en el caso del número anterior, el “2” son las UNIDADES. El siguiente número empezando por la derecha y después de las UNIDADES, se ha convenido en llamarle DECENAS, y por tanto en nuestro número de ejemplo, el “9” son las DECENAS. Al siguiente número se ha convenido en llamarle CENTENAS, y en nuestro número de ejemplo el “4” son las CENTENAS. Al siguiente número, si lo hay, se le llamaría MILLARES o UNIDADES DE MILLAR, y en nuestro ejemplo los MILLARES seria el número “1”, etc. O sea que, según el convenio de numeración, los dígitos que forman los números enteros, según el lugar que ocupan dentro del número, reciben el siguiente nombre: Primer número empezando por la derecha Segundo número empezando por la derecha Tercer número empezando por la derecha Cuarto número empezando por la derecha Quinto número empezando por la derecha Sexto número empezando por la derecha Séptimo número empezando por la derecha Octavo número empezando por la derecha etc.
19
UNIDADES DECENAS CENTENAS UNIDADES DE MILLAR DECENAS DE MILLAR CENTENAS DE MILLAR UNIDADES DE MILLON DECENAS DE MILLON
Sistemas de numeración
Capítulo 2
Vamos a ver ahora qué significado tienen los números que hemos escrito en el ejemplo anterior. Cuando escribimos 1492 naranjas, realmente queremos decir que: Tenemos 2 naranjas sueltas Tenemos 9 cajas (decenas) de 10 naranjas cada caja Tenemos 4 cajas (centenas) de 100 naranjas cada caja Tenemos 1 caja (millares) de 1000 naranjas Observamos como las cajas, a partir de las decenas, son múltiplos de diez (10). Por ejemplo una caja de centenas, es diez (10) veces mayor que una caja de decenas. Una caja de millares, es diez (10) veces mayor que una de centenas, etc. Así pues, y teniendo en cuenta que la magnitud de una unidad se multiplica por diez (10) cuando pasamos a la unidad superior a su izquierda, el número anterior también se puede escribir así: 1492 = 1 x 10 x 10x 10 + MIL
4 x 10 x 10
+
CUATROCIENTOS
9 x 10 +
2
NOVENTA DOS
O así: 1 x 10 x 10 x 10 4 x 10 x 10 9 x 10 2 Es por esta razón que los números que usamos habitualmente decimos que están escritos en BASE DIEZ (10). Ahora entendemos el porqué. Sencillamente porque el número diez (10) es el que le da significado y valor numérico a la posición que ocupa cada dígito dentro del número total. Si por ejemplo el número anterior (1492) lo escribiéramos así: 1942 ¿Nos daría lo mismo? Claro está que no, ya que según lo que hemos dicho hasta aquí, el número 1942 significa: 1 x 10 x 10 x 10 9 x 10 x 10 4 x 10 2 Y salta a la vista que este segundo número, aunque tenga los mismos dígitos, es mayor que el anterior.
20
Sistemas de numeración
Capítulo 2
2.2 Sistema de numeración binario Ahora que ya entendemos como se forman los números, nos preguntamos si seria posible trabajar con “cajas” de menor capacidad, por ejemplo con cajas de capacidad dos (2). Veamos como haríamos esto. Imaginemos que tenemos un montón de naranjas en el suelo y nos han dicho que tenemos que contarlas, sólo que ahora las cajas que tenemos tienen capacidades de dos (2), cuatro (4), ocho (8), dieciséis (16), treinta y dos (32), sesenta y cuatro (64), etc. naranjas. Cogemos la primera naranja, después cogemos la segunda, y como tenemos dos (2) naranjas, las metemos en una caja de dos (2). Si ahora alguien nos preguntase cuantas naranjas hemos contado, podríamos decirle que hemos contado: 10 naranjas Esto es, no tenemos ninguna naranja suelta (cifra primera de la derecha) pero sí tenemos una (1) caja de dos (2) naranjas (cifra segunda empezando por la derecha). Si cogemos ahora dos (2) nuevas naranjas, junto con los dos (2) que ya teníamos, las podemos meter en una caja de cuatro (4), con lo que el número de naranjas hasta ahora será: 100
naranjas
Que significa que no tenemos ninguna naranja suelta, no tenemos tampoco ninguna caja de dos (2) pero si tenemos una (1) caja de cuatro (4). Si ahora cogemos una naranja mas, tendríamos 101 naranjas (una caja de cuatro (4) y una suelta) y si cogemos otra más, tendremos 110 naranjas (una caja de cuatro (4) y otra de dos (2), pero ninguna suelta). Se entiende que este procedimiento puede seguirse indefinidamente y que podemos escribir cualquier cantidad empleando únicamente dos (2) dígitos, que son el cero (0) y el uno (1). A estos números que emplean “cajas” que van de dos (2) en dos (2), o sea, con capacidad para 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, etc. unidades, se les llama números binarios o números escritos en base dos (2), y entendemos porqué se llaman así. Sencillamente porque el número dos (2) es el que le da significado y valor numérico a los dígitos del número binario total, lo mismo que antes pasaba con los número escritos en base diez (10). Observamos también, que solamente necesitamos dos (2) tipos de símbolos o dígitos para trabajar con números binarios, que son el cero (0) y el uno (1), frente a los diez (10) que se emplean normalmente en el sistema de numeración decimal. Hasta aquí queda claro que dada una cantidad de elementos a contar, lo mismo podemos escribirla con números en base diez (10) (sistema decimal), que con números en base dos (2) (sistema binario). Sin duda, ambos números tendrán aspecto distinto, pero ambos son iguales puesto que representan el mismo número de objetos o unidades contadas. Todo esto está bien, pero ¿cómo podemos hacerlo para pasar de un número escrito en base dos (2) a su equivalente en base diez (10)? La respuesta es sencilla. Simplemente tenemos que ir anotando las “cajas” existentes y su contenido. Veamos un ejemplo: 21
Sistemas de numeración
Capítulo 2
Número binario (escrito en base dos (2))…………. 1001101 Significado de cada dígito según su posición, empezando por la derecha: Nº de cajas 1 0 1 1 0 0 1
Unidades Cajas de dos (2) Cajas de cuatro (4) Cajas de ocho (8) Cajas de diez y seis (16) Cajas de treinta y dos (32) Cajas de sesenta y cuatro (64)
Naranjas 1 4 8 64
Total naranjas = 77 Bien, parece que esto no es tan difícil después de todo, pero ¿y si lo que queremos es transformar el número 77 escrito en base diez (10) en su equivalente en base dos (2)? ¿Cómo lo hacemos? Bien, en este caso el método consiste en dividir por dos (2) el número 77 (o el que nos den) hasta que la división ya no sea posible. Veamos esto: Dividendo
Divisor
Cociente
Resto
77
2
38
1
38
2
19
0
19
2
9
1
9
2
4
1
4
2
2
0
2
2
1
0
Una vez terminada la división, tomaremos el último cociente y los sucesivos restos en el orden marcado por las flechas, y con esto obtendremos el número binario equivalente, en este caso: 1001101. 2.3 Bit o Binit Dado un número binario cualquiera, como por ejemplo el anterior 1001101, ya que los dígitos que forman dicho número pertenecen a un número binario, a cada uno de ellos se le llama Binit. La palabra Binit procede del inglés “BINARY DIGIT”, tomando las tres primeras letras de “BINARY” (BIN) y las dos últimas de “DIGIT” (IT). Sin embargo, es práctica habitual llamar a los dígitos binarios con la palabra Bit (en lugar de Binit), lo que no es correcto, ya que como hemos dicho debe decirse Binit y no Bit, pero se ha extendido tanto este error, que también nosotros emplearemos la palabra Bit al hablar de dígitos binarios en lugar de Binit. Así pues, llamaremos Bit a un dígito binario cualquiera, sea cero (0) o uno (1).
22
Sistemas de numeración
Capítulo 2
2.4 Sistema de numeración octal Seguramente ya se habrá preguntado que si en definitiva el sistema de numeración decimal consiste en hacer “cajas” de 10, 100 (10 x 10), 1000 (10 x 10 x 10), etc. unidades de capacidad, y el sistema binario consiste en hacer “cajas” de 2, 4 (2x 2), 8 (2 x 2 x 2), 16 (2 x 2 x 2 x 2), etc. unidades de capacidad, entonces lo único que tenemos que hacer es coger “cajas” de la medida conveniente para así poder escribir nuestros números en la base que queramos. Efectivamente, las cosas son tan sencillas como hemos supuesto. Así pues, si por ejemplo queremos escribir números en base ocho (8) (base octal), tendremos que hacer “cajas” de 8, 64 (8 x 8), 512 (8 x 8 x 8), 4096 (8 x 8 x 8 x 8), etc. El número de símbolos empleados para los dígitos octales es también ocho (8) y son el 0, 1, 2, 3, 4, 5, 6 y 7. Por ejemplo, el número octal 3407, ¿a qué número decimal corresponde? Sabiendo lo que significa cada dígito, no tenemos más que aplicar lo que ya sabemos, y tendremos la solución a nuestra pregunta: Nº de cajas 7 0 4 3
Unidades sueltas Cajas de 8 (8) Cajas de 64 (8x8) Cajas de 512 (8x8x8)
Naranjas 7 256 1536
Total naranjas =
1799
¿Cómo pasaríamos ahora el número decimal 1799 a base octal? El sistema es similar al que ya vimos para pasar números decimales a binario, dividiendo sucesivamente por ocho (8) hasta que no se pueda más. Veamos el procedimiento: Dividendo 1799
Divisor
Cociente
Resto
8
224
7
224
8
28
0
28
8
3
4
Y volvemos a recuperar nuestro número original 3407, que en octal significa lo mismo que 1799 en base diez. 2.5 Sistema de numeración hexadecimal Bien, ya que nos hemos lanzado a escribir números en bases de numeración distintas a la nuestra habitual, la base diez (10), veamos por último una nueva base de numeración que suele emplearse bastante en temas de programación de autómatas. Nos estamos refiriendo a la base dieciséis (16) de numeración, también llamada base de numeración hexadecimal.
23
Sistemas de numeración
Capítulo 2
Los números expresados en esta base de numeración, emplean dieciséis (16) tipos diferentes de símbolos, y son: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F Observamos que además de los símbolos que ya conocemos que van del cero (0) hasta el nueve (9), aparecen las letras A, B, C, D, E y F, y nos quedamos un poco perplejos, ya que no estamos acostumbrados a ver letras con valor numérico. El caso es que dado que necesitamos dieciséis (16) símbolos diferentes para representar los dieciséis (16) dígitos que necesitamos para trabajar en base dieciséis (16), una de dos, o inventamos signos nuevos a partir del nueve (9) hasta llegar al dieciséis (16), o simplemente usamos las letras A, B, C, D, E y F pero interpretándolas, no como letras, sino como símbolos numéricos. Esto es justamente lo que se hace, o sea, asignamos o damos valor numérico a las letras A, B, C, D, E y F con el siguiente valor numérico: Dígito hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F
Valor numérico del dígito hexadecimal en base diez (10) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Así pues, el aspecto de un número hexadecimal puede ser el siguiente: O también:
A2B00AF 3BA0077
O también:
345
24
Sistemas de numeración
Capítulo 2
Alguien puede pensar que este último número no es un número hexadecimal ya que no tiene “letras”, pero obsérvese que el hecho de que en base dieciséis (16) un número pueda tener letras, no quiere decir que deba tenerlas necesariamente. Pensemos por ejemplo en el número decimal 1044. Este número no tiene 8’s ni 9’s, y sin embargo es un número decimal. Sin embargo es evidente que esto de escribir números en bases diferentes, puede llevar a confusión, a menos que sepamos exactamente en que base estamos trabajando. Es por esta razón, para evitar posibles confusiones, que se suele poner alguna indicación que advierta al lector de la base en la que se ha escrito el número en cuestión. Así por ejemplo: 1001110 3406 A05006
B O H
Nos estaría diciendo que 1001110 es un número binario (B), el número 3406 es un número octal (O), y el número A05006 es un número hexadecimal (H). Veamos ahora como lo hacemos para pasar de un número escrito en hexadecimal, a su equivalente en decimal. Si nos dieran un número hexadecimal, por ejemplo A05006, ¿cómo lo podríamos pasar a base diez (10)? Si tenemos en cuenta que ahora las “cajas” van de dieciséis (16) en dieciséis (16), esto es, ahora las “cajas” son de dieciséis (16), de doscientas cincuenta y seis (256 = 16 x 16), de cuatro mil noventa y seis (4096 = 16 x 16 x 16), de sesenta y cinco mil quinientas treinta y seis (65536 = 16 x 16 x 16 x 16), de un millón cuarenta y ocho mil quinientas setenta y seis (1048576 = 16 x 16 x 16 x 16 x 16), etc. tendremos: Nº de cajas 6 0 0 5 0 A
Unidades sueltas Cajas de 16 unidades Cajas de 256 unidades Cajas de 4.096 unidades Cajas de 65.536 unidades Cajas de 1.048.576 unidades
Naranjas
6
20.480 10.485.760
Total naranjas =
10.506.246
Claro que, por otra parte, ¿cómo pasaríamos un número decimal a base hexadecimal? Por ejemplo, el anterior número 10.506.246 en base diez (10), ¿será verdad que en hexadecimal es el A05006? Para comprobarlo, seguiremos el método ya conocido de ir dividiendo el número, en este caso el 10.506.246, por la base a la que se quiere pasar este número, en este caso dieciséis (16): Dividendo
Divisor
Cociente
Resto
10506246
16
656640
6
656640
16
41040
0
41040
16
2565
0
2565
16
160
5
160
16
10
0
25
Sistemas de numeración
Capítulo 2
Que leído en el orden indicado, nos da: (10)05006 = A05006 Que es el número original. 2.6 Paso del sistema binario a octal y viceversa Empecemos pintando la siguiente tabla:
0 1 2 3 4 5 6 7
000 001 010 011 100 101 110 111
Tomemos ahora un número binario cualquiera, por ejemplo el número: 10011011001101 Si lo que deseamos es transformar este número binario a su equivalente en base diez (10), empezaremos por hacer grupos de tres (3) dígitos, empezando por la derecha, de la siguiente forma: 010 011 011 001 101 Observamos que ha sido necesario añadir un cero (0) al ultimo grupo de números, ya que solo teníamos dos (2) números y necesitábamos tres (3), pero esto tampoco ha supuesto ningún problema, ya que los ceros añadidos por la izquierda, tampoco alteran el valor numérico del conjunto total. Bien, ahora debemos sustituir cada triada de números por su equivalente, según la tabla anterior. Así pues, nos quedará: 010 011 011 001 101 2 3 3 1 5 Y leemos el número 23315. Este número es el número octal equivalente al número binario 10011011001101, y observamos que fácil nos ha resultado pasar de binario a octal. Y para pasar un número de octal a binario, ¿cómo lo hacemos? Sencillamente, haremos uso de la misma tabla anterior e iremos sustituyendo directamente los números octales por sus triadas de números binarios. Veamos un ejemplo.
26
Sistemas de numeración
Capítulo 2
Dado el número octal 754031, vamos a pasarlo al número binario equivalente: 754031
111
101
100
000
011
001
Y juntando todos los números nos queda: 111101100000011001. 2.7 Paso del sistema binario a hexadecimal y viceversa Veamos ahora como pasaríamos un número binario a su equivalente en hexadecimal. Para ello, deberemos tener en cuenta la siguiente tabla de conversión: 0000 0001 0010 0011 0100 0101 0110 0111
0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111
8 9 A B C D E F
Si partimos del mismo número binario anterior, esto es, el número 10011011001101, ahora la regla consiste en formar grupos de cuatro (4) dígitos empezando por la derecha: 0010 0110 1100 1101 Nuevamente observamos como ha sido necesario añadir dos (2) ceros a la izquierda del número, que eran necesarios para tener grupos exactos de cuatro (4) dígitos, tal y como exige la regla. Bien, ahora se trata de asignar el número correspondiente, según la tabla anterior, a cada uno de los grupos de cuatro (4) dígitos: 0010 0110 1100 1101 2 6 C D Y leemos el número 26CD que en hexadecimal es lo mismo que el número binario 10011011001101. Sólo nos queda ahora pasar números hexadecimales a binarios, y el método también es muy sencillo, pues se trata de volver a aplicar la tabla anterior. Veamos un ejemplo. Nos dan el número hexadecimal A0DEF96. Para pasarlo a binario, sustituimos directamente cada dígito hexadecimal por la tétrada de números binarios de la tabla anterior, esto es: A0DEF96 Es equivalente a: 1010000011011110111110010110. 27
Sistemas de numeración
Capítulo 2
2.8 Código BCD La definición de código es la siguiente: “Es un conjunto de unidades de información relacionadas de forma sistemática y biunívoca con otro conjunto de signos y símbolos según unas determinadas reglas de traducción fijadas de antemano”. De la lectura anterior sobre la definición de código, deducimos que es posible crear infinidad de códigos distintos. Sin embargo en la práctica, solamente algunos códigos se han impuesto de forma generalizada, y entre ellos tenemos el código BCD, que se define según la siguiente tabla de conversión: 0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
Veamos como funciona esto. Si nos dan un número cualquiera escrito en base diez (10), tal como: 3891 Para pasarlo a código BCD, cambiaremos cada dígito por la tétrada de números correspondiente que indica la tabla anterior: 3891
0011
1000
1001
0001
Y reuniendo ahora estos números, tendremos: 11100010010001 Donde hemos suprimido los dos (2) ceros de la izquierda. A la vista de este número, podríamos pensar que se trata del número 3891 escrito en base dos (2), y para comprobar que esto no es así, convirtamos 3891 al número equivalente en base dos (2):
28
Sistemas de numeración
Dividendo 3891 1945 972 486 243 121 60 30 15 7 3
Capítulo 2
Divisor 2 2 2 2 2 2 2 2 2 2 2
Cociente 1945 972 486 243 121 60 30 15 7 3 1
Resto 1 1 0 0 1 1 0 0 1 1 1
Y nos queda 111100110011 que es distinto al número escrito en código BCD anterior. Por tanto, queda claro que un número escrito en código BCD, NO es de ninguna manera un número binario (aunque lo parezca), sino una codificación de un número real escrito en base diez (10).
29
Clases de registros
Capítulo 3
CAPÍTULO 3
Índice
Clases de registros 3.1 Biestables En electrónica digital se estudia un circuito especial que se conoce con el nombre de BIESTABLE. El biestable, como su nombre indica, tiene únicamente dos (2) estados estables, que quiere decir que a la salida de este elemento sólo podemos tener o un valor de tensión alto (normalmente +5 V.) o un valor de tensión bajo (normalmente 0 V.), pero en ningún caso un valor de tensión diferente a una cualquiera de estas dos (2) tensiones (a no ser que el biestable esté averiado). Si convenimos que el valor de tensión alto (+5 V.) de un biestable representa o equivale al numero “1” binario y que el valor de tensión bajo (0 V.) representa o equivale al numero binario “0”, entonces un biestable puede servirnos perfectamente para materializar los Bits de una maquina digital. 3.2 Registros Si un biestable puede almacenar un Bit, cuando queramos almacenar (o manipular) un conjunto de Bits, lógicamente emplearemos un conjunto de biestables. A estos conjuntos de biestables se les llama genéricamente REGISTROS que pueden estar formados en principio por un número cualquiera de biestables. 3.2.1
Bit
El Bit podemos representarlo como un registro formado por un único elemento de la siguiente manera: X
Donde “X” es el nombre que le hemos dado al Bit. Si en un momento determinado el Bit “X” tiene el valor “0”, podemos representarlo así: X 0
Y si este Bit toma el valor “1” y queremos representarlo, pondremos: X 1
31
Clases de registros
3.2.2
Capítulo 3
Nibble
La palabra NIBBLE se emplea para designar a registros formados por cuatro (4) Bits. Si al Bit lo hemos representado por un cuadrado y un nombre en la parte superior, al Nibble lo podemos representar como una serie de cuatro (4) pequeños cuadrados, de la siguiente manera: 3
2
1
0
Siendo la numeración que hemos puesto encima de cada cuadrado, el nombre que le damos a cada Bit (dentro del Nibble). 3.2.3
Byte
Llamamos Byte a un registro cualquiera que esté formado por ocho (8) Bits. Para representar un Byte gráficamente, lo haremos pintando ocho (8) cuadrados pequeños en sentido horizontal, y los numeraremos del cero “0” al “7” empezando por el que está más a la derecha: 7
6
5
4
3
2
1
0
Si quisiéramos representar el valor de un Byte para valores concretos de los Bits que lo forman, pondríamos (por ejemplo): 7
6
5
4
3
2
1
0
1
1
0
1
0
0
1
0
Siendo la forma de representación anterior totalmente correcta, resulta sin embargo más sencillo escribir directamente el valor numérico interno, prescindiendo de los cuadrados, de la siguiente forma: 11010010 Podemos simplificar aun más la forma de escribir el contenido numérico anterior, formando dos (2) grupos de números (dos (2) Nibbles), de la siguiente forma: 1101 0010 Y asociando cada Nibble al número hexadecimal de la tabla del apartado 2.7, tendremos: 1101 0010
D
2
32
Clases de registros
Capítulo 3
Con lo que podemos referirnos al contenido del Byte anterior simplemente escribiendo D2. Cuando se dispone de una gran cantidad de registros del tipo Byte, tal como pueden ser miles de Bytes, se hace uso de una unida superior al Byte que es Kilo Byte (KB), siendo el Kilo Byte la cantidad de 1.024 Bytes exactamente: 1 KB = 1.024 Bytes Si la cantidad de Bytes de que se está hablando supera el millón de Bytes, entonces se hace uso de una unidad superior al KB, que es el Mega Byte (MB), siendo el Mega Byte la cantidad de 1.024x1.024 Bytes exactamente: 1 MB = 1.024x1.024 Bytes = 1.048.576 Bytes Por ultimo, si la cantidad de Bytes de que se está hablando es superior al millar de MB, entonces se hace uso del Giga Byte (GB) que son exactamente 1.024x1.024x1.024 Bytes: 1 GB = 1.024x1.024x1.024 Bytes = 1.073.741.824 Bytes 3.2.4
Word
Si tenemos un conjunto de dieciséis (16) Bits, diremos que el registro formado por estos dieciséis (16) Bits, es un Word. O dicho con otras palabras, un Word es un registro formado por dieciséis (16) Bits. El Word, al igual que el Byte, se puede representar por un conjunto de pequeños cuadrados convenientemente numerados: 15 14 13
12 11 10
9
8
7
6
5
4
3
2
1
0
Si tenemos que representar los estados particulares de cada uno de los Bits que forman el Word en un momento determinado, podemos al igual que antes con el Byte, hacerlo de la siguiente manera (por ejemplo): 15 14
13 12 11 10
9
8
7
6
5
4
3
2
1
0
0
0
1
1
0
0
1
1
1
0
0
1
1
0
1
1
Si prescindimos del dibujo de los cuadros y de los números que hemos puesto encima, nos quedaría simplemente: 0100111100111001 Y si al igual que antes con los Bytes, hacemos grupos de cuatro (4) (Nibbles), tendremos: 0100 1111 0011 1001 Y si ahora traducimos cada Nibble por su equivalente hexadecimal según la tabla 2.7, tendremos: 0100 4
1111 F 33
0011 1001 3 9
Clases de registros
Capítulo 3
Con lo que el contenido del Word de ejemplo anterior quedaría simplemente como 4F39. 3.2.5
Double Word
El Double Word (doble palabra) es un registro formado por treinta y dos (32) Bits, que también al igual que el Byte y el Word podemos representar como un conjunto de treinta y dos (32) pequeños cuadrados numerados de la siguiente manera: 31
0
En este caso hemos pintado los cuadrados más pequeños, simplemente para que cupiesen en el papel, y también hemos suprimido los números intermedios que van del “0” al “31” puesto que el resto se sobrentiende perfectamente. No vamos a insistir aquí más sobre como representar el contenido numérico que pueda tener un Double Word, puesto que tendría el mismo tratamiento que en el caso del Word o del Byte. Esto es, haríamos grupos de cuatro (Nibbles) y pondríamos su equivalente en hexadecimal, según la tabla 2.7. Conviene sin embargo insistir aquí que el Double Word equivale a dos (2) Word, y como cada Word equivale a su vez a otros dos (2) Bytes, en definitiva el Double Word también equivale a cuatro (4) Bytes.
Word 1 Byte 3
Word 0 Byte 2
Byte 1
Byte 0
Podemos insistir aún más y decir que puesto que un Byte son dos (2) Nibbles, el Double Word equivale también a ocho (8) Nibbles, si bien esto ultimo no lo hemos representado en el dibujo por razones de claridad en el mismo. 3.2.6
Long Word
El Long Word (palabra larga) es por definición un registro formado por sesenta y cuatro (64) Bits, y lo mismo que hemos hecho con los demás registros, también el Long Word se puede representar gráficamente por una sucesión de sesenta y cuatro (64) cuadritos, numerados de derecha a izquierda desde el cero (0) al sesenta y tres (63). 63
0
A registros de esta longitud son aplicables todo cuanto hemos dicho para los registros anteriores, y así podemos decir que el Long Word equivale a dos (2) Double Word, a cuatro (4) Word, a ocho (8) Byte, a dieciséis (16) Nibble, y por supuesto a sesenta y cuatro (64) Bits. Hacemos notar, sin embargo, que actualmente los registros de sesenta y cuatro (64) Bits únicamente se emplean en informática, pero no en programación de autómatas SIEMENS.
34
Operaciones lógicas
Capítulo 4
CAPÍTULO 4
Índice
Operaciones lógicas 4.1 Introducción al álgebra de Bool George Bool nació el 2 de noviembre de 1815 en Lincoln (Inglaterra) y murió el 8 de diciembre de 1864 en Ballintemple (Irlanda). A él se debe la concepción de un nuevo tipo de álgebra aplicada al razonamiento lógico, que lleva su mismo nombre. El álgebra de Bool a diferencia del álgebra tradicional, no tiene que ver con el cálculo numérico, sino con el razonamiento lógico basado en dos únicas posibilidades: CIERTO o FALSO. Si en una conversación normal, admitimos que una determinada circunstancia puede que ocurra en todo o en parte, en el álgebra de Bool esto no es posible, ya que sólo se admite que la circunstancia de la que se está hablando, ocurra o no ocurra plenamente (no hay términos medios). Conceptos que usamos en la vida diaria tales como, “un poco”, “ligeramente”, “bastante”, “algunas veces”, etc., no tienen sentido en álgebra de Bool, donde solo existen dos opciones: “el hecho del que estamos hablando ocurre plenamente y es totalmente cierto”, o bien, “el hecho del que estamos hablando no ocurre de ninguna forma y es totalmente falso”. A estos dos estados posibles que puede tener un determinado fenómeno físico, se les suele representar a cada uno de ellos con las letras “H” y “L” (del ingles High y Low) o también con las palabras “TRUE” y “FALSE” o también con los números “1” y “0”, si bien en este último caso, los números “1” y “0” aquí no tienen valor numérico sino únicamente representan uno de los dos (2) estados posibles que pueda tomar un determinado fenómeno físico. A estos fenómenos físicos que solamente pueden tomar dos (2) (y únicamente dos (2)) estados, se les llama VARIABLES LÓGICAS. Un ejemplo de variable lógica puede ser el hecho de lanzar una moneda al aire. Si al hecho de salir cara le asignamos el valor “1” y al hecho de salir cruz le asignamos el valor “0”, entonces tenemos una variable lógica que sólo puede tomar uno de dos valores posibles, el “1” o el “0”. Otro ejemplo podría ser un interruptor de la luz. Si el interruptor sólo puede estar en el estado “CONECTADO” o “DESCONECTADO”, podemos asignar al estado “CONECTADO” el valor “1” y al “DESCONECTADO” el valor “0”, por lo que nuevamente estamos frente a una variable de tipo lógico. A las variables de tipo lógico, se las representa bien con una letra (A, B, C,…etc.) o bien las podemos representar con un nombre (MONEDA, INTERRUPTOR,… etc.) 4.2 Operaciones AND, OR y NOT De la misma manera que en el álgebra clásica se definen las operaciones de suma, resta, multiplicación y división entre números, aquí en el álgebra de Bool se definen también dos operaciones básicas entre los estados “1” y “0”, que son la operación AND y la operación OR. La operación AND se define de la siguiente forma:
35
Operaciones lógicas
Capítulo 4
Variable lógica A
Variable lógica B
A AND B
0 0 1 1
0 1 0 1
0 0 0 1
La tabla anterior representa todas las formas posibles de operar (con la operación AND) los estados “1” y “0”. Observamos que esta operación nos recuerda a la multiplicación clásica empleando solamente dos (2) números: el uno (1) y el cero (0), pero es necesario insistir una vez más, que no existe relación entre el “1” lógico del álgebra de Bool y el uno (1) numérico del álgebra tradicional. La tabla anterior la podemos también expresar con palabras de la siguiente manera: El resultado de una operación lógica AND entre dos (2) variables lógicas A y B será cierto (resultado “1”) cuando ambas variables lógicas sean ciertas (estado “1”), en caso contrario (esto es, cuando alguna de ellas al menos sea falsa o “0”) el resultado será falso o “0”. Para representar la operación AND entre dos (2) variables lógicas A y B, se puede hacer de la siguiente forma: A AND B Una segunda operación de gran importancia en el álgebra de Bool, es la operación OR, que se define según la siguiente tabla (llamada también tabla de la verdad de la operación OR): Variable lógica A
Variable lógica B
A OR B
0 0 1 1
0 1 0 1
0 1 1 1
Nuevamente no podemos evitar la tentación de comparar esta tabla con la operación suma del álgebra tradicional, entre los números uno (1) y cero (0), pero observamos como la última fila no es dos (2) como en la suma tradicional sino “1”. Así pues, no insistiremos más y aceptaremos que estas operaciones no tienen realmente relación con el álgebra que nos enseñaron cuando íbamos al colegio. Son DIFERENTES. También aquí podemos expresar con palabras la tabla anterior y podemos decir que la operación lógica OR entre dos (2) variables lógicas A y B es cierta o “1”, cuando al menos una variable lógica (o ambas) son ciertas o “1”. Solamente cuando ambas variables lógicas son falsas o “0”, el resultado de la operación es falso o “0”. Para representar la operación OR entre dos (2) variables lógicas A y B, se puede hacer de la siguiente forma: A OR B Por último nos queda la operación NOT (o NEGACION), que se puede representar colocando una pequeña raya horizontal sobre la variable lógica a la que se esté aplicando.
36
Operaciones lógicas
Capítulo 4
Así por ejemplo, la operación NOT sobre la variable lógica A se representaría de la siguiente forma:
Y se pronuncia “NOT A”. La tabla de la verdad de esta operación es la siguiente: Variable lógica A 0 1
1 0
También aquí podemos de una manera muy sencilla expresar con palabras la operación NOT, simplemente diciendo que la operación NOT sobre “0” es “1” y que la operación NOT sobre “1” es “0”. 4.3 Operaciones NAND, NOR, XOR y XNOR De las operaciones básicas definidas anteriormente AND, OR y NOT se derivan otras, que podríamos llamar compuestas por estar formadas por combinaciones de las operaciones básicas AND, OR y NOT. Tal es el caso de la operación NAND (NAND = NOT AND) cuya definición es la siguiente: Variable lógica A
Variable lógica B
A NAND B
0 0 1 1
0 1 0 1
1 1 1 0
Así, la operación NOR (NOR = NOT OR) se define de la siguiente manera: Variable lógica A
Variable lógica B
A NOR B
0 0 1 1
0 1 0 1
1 0 0 0
Y la operación XOR tiene la siguiente definición: Variable lógica A
Variable lógica B
A XOR B
0 0 1 1
0 1 0 1
0 1 1 0
37
Operaciones lógicas
Capítulo 4
La operación XNOR, la siguiente definición: Variable lógica A
Variable lógica B
A XNOR B
0 0 1 1
0 1 0 1
1 0 0 1
4.4 El Bit y la variable lógica del álgebra de Bool Cuando Bool hizo públicos sus estudios a cerca de lo que posteriormente se conocería como “álgebra de Bool”, éste no podía imaginar ni remotamente que sus estudios serían de enorme utilidad para el posterior desarrollo de la electrónica digital y de la obra cumbre de esta rama de la electrónica, los ordenadores digitales. Fue muchos años después, cuando empezaron a desarrollarse elementos electrónicos de funcionamiento TODO/NADA y células de almacenamiento de información digital, cuando se vio en el álgebra de Bool una poderosa herramienta para poder diseñar circuitos electrónicos digitales complejos. Para entonces, los ingenieros electrónicos acostumbrados a llamar Bit a la ausencia o presencia de un impulso eléctrico y, por otra parte, la similitud entre el concepto de variable lógica y lo anteriormente dicho de ausencia/presencia de impulso eléctrico, fue lo que hizo que ambos conceptos se usasen como iguales. Así pues, llamémosle variable lógica o llamémosle Bit, el caso es que estamos hablando del mismo concepto. Lo que para el álgebra de Bool es una variable lógica, en electrónica digital se le llama Bit, pero realmente estamos hablando de lo mismo en ambos casos, esto es, algo que puede tomar dos (2) estados y nada más que dos (2) estados. 4.5 Las operaciones AND, OR y NOT aplicadas a registros Si en 3.2 hemos visto qué se entiende por operaciones AND, OR y NOT entre variables lógicas (entre Bits), la operación lógica AND entre registros resulta de aplicar la operación AND entre los pares de Bits que forman las palabras lógicas que se operan. Así por ejemplo, si tenemos el Word A siguiente: 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
1
0
0
1
1
1
1
0
0
1
1
1
0
0
1
Y el Word B siguiente: 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
0
0
1
0
1
1
0
1
0
1
1
0
1
La operación AND entre el Word A y el Word B es: 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
1
0
0
0
1
0
1
0
0
1
0
1
0
0
1
Donde podemos comprobar que cada Bit del Word resultado, es consecuencia de realizar la operación AND, Bit a Bit entre los dos (2) Words según la siguiente expresión: (Bit “N” del Word A) AND (Bit “N” del Word B) = Bit “N” del Word resultado 38
Operaciones lógicas
Capítulo 4
Así, la operación OR entre los Words A y B anteriores, daría como resultado otro Word cuyos Bits serían el resultado de realizar la operación OR, Bit a Bit de los Words A y B. Veamos un ejemplo, tomando los mismos valores de A y B anteriores: Word A: 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
1
0
0
1
1
1
1
0
0
1
1
1
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
0
0
1
0
1
1
0
1
0
1
1
0
1
Word B:
(Word A) OR (Word B): 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
0
1
1
1
1
1
0
1
1
1
1
0
1
Siendo la operación realizada, la siguiente: (Bit “N” del Word A) OR (Bit “N” del Word B) = Bit “N” del Word resultado La operación NOT aplicada a un Word, resulta tan sencilla como cambiar los unos por ceros, y los ceros por unos, o lo que es lo mismo, se aplica la operación NOT individualmente Bit a Bit. Veamos un ejemplo: Word A: 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
1
0
0
1
1
1
1
0
0
1
1
1
0
0
1
Resultado de aplicar NOT al Word A: 15 1
14 0
13 1
12 1
11 0
10 0
9 0
8 0
7 1
6 1
5 0
4 0
3 0
2 1
1 1
0 0
Hacemos notar que a esta operación, también se la conoce como “complemento a 1” del Word de que se trate. O sea, que aplicar el “complemento a 1” a un Word o realizar la operación NOT a este mismo Word, es lo mismo. Con esta breve introducción a las operaciones lógicas más importantes del álgebra de Bool, terminamos aquí de momento este tema, pero volveremos a ellas más adelante, cuando veamos el repertorio de operaciones lógicas que forman STEP-7.
39
Los autómatas SIMATIC S7-300
Capítulo 5
CAPÍTULO 5
Índice
Los autómatas SIMATIC S7- 300 5.1 Partes de un autómata S7-300 El autómata que vamos a estudiar aquí pertenece a la serie SIMATIC S7-300 y podemos decir que aproximadamente su estructura interior responde al siguiente esquema:
Imágenes del proceso: * PAE * PAA
Memoria para bloques de datos de instancia
Memoria para bloques de datos generales
Memoria local
Contadores
Temporizadores
Memoria de marcas
Memoria del programa
CPU
Memoria RAM
Memoria ROM (Sistema operativo)
ALU • • • • •
Unidad de control ACU1 ACU2 AR1 AR2 PSW
Módulo de memoria externa.
Canal serie
Módulos periféricos Bus periférico Módulos digitales: • Entradas • Salidas
Módulos analógicos: • Entrada • Salida
Fig.5.1
41
Módulos funcionales hardware.
Los autómatas SIMATIC S7-300
Capítulo 5
5.2 Memoria RAM La memoria RAM, se caracteriza por tener acceso aleatorio (Random Access Memory) y como se ve, se reparte para formar muchos tipos diferentes de memorias, cada una de ellas con un significado propio. Otra característica de la memoria RAM, es que no es capaz de retener la información cuando falla la tensión, por lo que si se quiere conservar la información de esta memoria, es necesario respaldar la tensión de la memoria con una pila tampón. Resumamos en una tabla, el espacio que se reserva a cada tipo de memoria, según el modelo de autómata: Operando 312
314
315
315-2
Descripción
Programa M T Z L DB DI E A PE PA
48 KB 256 B 256 256 256 B 511 512 128 B 128 B 1024 B 1024 B
48 KB 256 B 128 64 256 B 255 192 128 B 128 B 768 B 767 B
128 KB 2048 B 256 64 256 B 1023 2048 128 B 128 B 1024 B 2048 B
Programa de usuario Memoria de marcas Temporizadores Contadores Memoria local Bloques de datos generales Bloques de datos de instancia Entradas digitales (PAE) Salidas digitales (PAA) Entrada directa de periferia Salida directa a periferia
16 KB 128 B 128 32 256 B 511 512 128 B 128 B 1024 B 1024 B
Como se ha visto en la tabla anterior, el espacio que se reserva para almacenar el programa de usuario, puede oscilar entre 16 y 256 KB dependiendo del modelo de autómata que se elija, y éste es un dato importante a la hora de elegir uno u otro autómata, por tanto puede ocurrir que según el modelo que elijamos, no nos quepa el programa que pensamos meter. Iremos viendo más adelante, qué papel juega cada memoria y cómo hemos de trabajar con ellas. 5.3 Memoria ROM (sistema operativo) La memoria ROM (Read Only Memory), como su nombre indica, es de “sólo lectura”, y se emplea en este caso para almacenar el sistema operativo del autómata. El sistema operativo es el encargado de gestionar todos los recursos del autómata, tales como entradas, salidas, la gestión de las memorias, la gestión de datos, la gestión de las alarmas, la gestión de los buses de comunicación, etc. El sistema operativo, sin embargo, no realiza ningún trabajo a no ser que lo solicite el programa que escribe y deposita el usuario en su interior. 5.4 ALU ALU son las iniciales de Arithmetic and Logic Unit, o Unidad Lógica y Aritmética. O sea, es un circuito electrónico complejo que realiza operaciones lógicas y aritméticas de cierta complejidad, tales como sumar, restar, multiplicar y dividir números enteros o racionales, aparte de operaciones trigonométricas tales como cálculo de senos, cosenos, tangentes, etc., y también cálculo de raíces cuadradas, exponenciales y logaritmos. 42
Los autómatas SIMATIC S7-300
Capítulo 5
Siendo un circuito de vital importancia en el autómata, su funcionamiento es totalmente transparente para el usuario, se activa a través de instrucciones de STEP-7. 5.4.1
ACU1 y ACU2
Los acumuladores ACU1 y ACU2 son ambos registros de treinta y dos (32) Bits y juegan un papel importante en las instrucciones de comparación así como operaciones aritméticas. Como registros de treinta y dos (32) Bits que son, se pueden considerar formados por dos (2) registros de dieciséis (16) Bits cada uno, o por cuatro (4) registros de ocho (8) Bits (Bytes): Acumulador 1: 31
2322
1615
8 7
ACU1H ACU1HH
0
ACU1L ACU1HL
ACU1LH
ACU1LL
Acumulador 2: 31
2322
1615
8 7
ACU2H ACU2HH
0
ACU2L
ACU2HL
ACU2LH
ACU2LL
Veremos más adelante como se trabaja con estos acumuladores y el papel que juegan en las instrucciones aritméticas y de comparación. 5.4.2
AR1 y AR2
Los registros AR1 y AR2 (Address Register 1 y 2) juegan un papel muy importante cuando se trabaja con operandos del tipo puntero, que veremos en los próximos capítulos. Al igual que ACU1 y ACU2, son registros de treinta y dos (32) Bits. 5.4.3
PSW
El PSW (Program Status Word) o palabra de estado, es un registro formado por dieciséis (16) Bits, cada uno de ellos con un significado propio. Veamos este registro:
43
Los autómatas SIMATIC S7-300 15
…..
9
8 RB
BIT 0 1 2 3 4 5 6 7 8 9 al 15
Ocupación /ER RLO STA OR OS OV A0 A1 RB Sin uso
Capítulo 5 7
6
A1
A0
5
4
3
2
1
0
OV
OS
OR
STA
RLO
/ER
Significado Bit de primera consulta* Bit de resultado lógico Bit de estado* Bit OR (=0)* Bit de desbordamiento memorizado Bit de desbordamiento Indicador de resultado Indicador de resultado Bit de resultado binario -
* Este Bit no es interpretable directamente por el usuario. De todos estos Bits es de destacar el RLO, que como veremos más adelante juega un papel muy destacado en la toma de decisiones de nuestros programas. 5.5 Módulo de memoria externa El usuario tiene la opción de introducir su programa desde una PG/PC hacia el autómata y depositarlo en la memoria del programa, tal y como hemos visto en 5.2., o bien depositar su programa en un circuito construido con memoria no volátil y conectar después este circuito al autómata. Estas memorias externas, pueden ser una buena opción si el usuario desea despreocuparse completamente de la batería tampón (en lo que a retención del programa se refiere), pero son sin duda una solución más cara que la convencional basada en memoria tampón. 5.6 Canal serie Todos los autómatas de la serie SIMATIC S7-300, poseen un puerto serie de comunicaciones tipo MPI, que el usuario puede usar bien para conectarse al autómata desde un PG/PC o bien para conectar otros autómatas en red. Las redes MPI son exclusivas de SIEMENS y son muy útiles cuando los requerimientos de velocidad en la transmisión no son muy exigentes, pues nos permite realizar conexiones entre autómatas a precio muy reducido y de aceptables prestaciones. 5.7 Bus periférico El bus periférico permite la conexión entre la CPU del autómata y las tarjetas de entrada/salida, analógicas o digitales y módulos funcionales conectados al mismo bastidor que la CPU. 5.8 Las entradas digitales Como ya vimos en el Capítulo 1, en un proceso industrial hay muchos elementos que suministran información sobre cómo está el proceso. Entre ellos, los sensores digitales, que informan de manera primaria pero efectiva, sobre el posicionamiento de piezas mecánicas en general.
44
Los autómatas SIMATIC S7-300
Capítulo 5
Estos sensores digitales se conectan al autómata en puntos concretos llamados “entradas digitales”, que reciben las señales digitales procedentes de los sensores digitales y permiten al autómata tener información sobre lo que ocurre en el proceso industrial. En la práctica, es posible escoger entre diferentes modelos de entradas digitales, según los sensores digitales que dispongamos entreguen una tensión alterna o continua. Son muy comunes las entradas digitales que trabajan en corriente continua, con valores de +24 V (valor alto) y 0 V (valor bajo). En lo que sigue, y si no se dice lo contrario, supondremos que nuestras entradas digitales son de este tipo. 5.9
Las salidas digitales
Al igual que el autómata recibe información en forma digital procedente de los sensores digitales, una forma habitual que se elige para que el autómata de órdenes hacia los elementos externos, es también digital, por medio de una tensión alta o baja. También aquí la tensión que entrega el autómata puede ser en corriente alterna o continua, pero es muy corriente que sea en corriente continua en la forma de +24 VDC (valor alto) y 0 V (valor bajo). También aquí, igual que hacíamos con las entradas, si no se dice lo contrario, trabajaremos únicamente con estos valores. 5.10
Ejecución del programa
El programa se ejecuta en un autómata en tres (3) modos diferentes: • • •
Ejecución cíclica Ejecución por alarmas Ejecución por tiempo
Decimos que el programa se ejecuta cíclicamente cuando el funcionamiento responde al siguiente esquema:
Captura de datos de los periféricos. (PAE)
Ejecución del programa principal. Scan
Transferencia de datos hacia los periféricos. (PAA)
Fig.5.2 45
Los autómatas SIMATIC S7-300
Capítulo 5
Cada vez que el proceso comienza por la parte superior, se dice que comienza un “scan”. El tiempo que emplea el autómata en ejecutar un scan, se controla automáticamente con un temporizador llamado “Watch Dog Timer”, que avisa poniendo un Bit de alarma a “1”si el tiempo excede de una cantidad prefijada. La ejecución por alarmas tiene lugar cuando determinados bloques de programa (veremos esto más despacio cuando estudiemos los OB’s en el Capítulo 22) se ponen en funcionamiento cuando tienen lugar determinados eventos especiales llamados alarmas. Finalmente, decimos que un determinado programa se ejecuta por tiempos, cuando una señal temporal y periódica obliga a la CPU a interrumpir su funcionamiento normal (cíclico) para procesar otro bloque de programa de mayor prioridad. También veremos esto más despacio cuando estudiemos el funcionamiento de los OB’s en el Capítulo 22. 5.11
PAE y PAA
En la Fig. 5.2 hemos pintado un rectángulo con un rotulo que dice “Captura de datos de los periféricos (PAE)”. Efectivamente, al comienzo de cada ciclo de scan, el autómata no pasa directamente a procesar las instrucciones de nuestro programa, sino que emplea un tiempo, primero en leer la información analógica y digital que pueda haber en todos los periféricos, y después deposita esta información en una memoria organizada en Bytes, llamada PAE. Durante la ejecución del programa principal, STEP-7 no deposita inmediatamente los resultados que van destinados a la periferia de salida, sino que los almacena en la tabla PAA. Es al final de la ejecución del programa principal cuando STEP-7 recoge los datos que están en la PAA y los lleva a la periferia hacia los elementos de salida (digital y analógica).
Fig.5.3 46
Los autómatas SIMATIC S7-300
Capítulo 5
Desde el punto de vista estructural, tanto la PAE como la PAA están organizadas en Bytes. Veamos la PAE más despacio:
Fig.5.4
Observamos como para referirnos a un Byte entero de la memoria de entradas digitales (E), lo hacemos de la siguiente forma (por ejemplo): EB12 Que se interpreta como el Byte número 12 de la memoria de entradas digitales. Si queremos referirnos a una palabra de la memoria de entradas digitales (E), lo hacemos de la siguiente forma (por ejemplo): EW102 Que se interpreta como la palabra 102 de la memoria de entradas digitales (E), y que está formada por los Bytes EB102 y EB103. Finalmente para referirnos a un único Bit, lo hacemos de la siguiente forma (por ejemplo): E2.2
47
Los autómatas SIMATIC S7-300
Capítulo 5
Que se interpreta como el Bit número dos (2) del Byte dos (2) de la memoria de entradas digitales (E). Aunque lo visto no es más que un ejemplo, realmente SIEMENS mantiene esta forma de representar la información digital para todos los tipos de memoria de que dispone el autómata. Veamos ahora la PAA:
Fig.5.5
Vemos como aquí se mantiene la forma de representar Bits individuales, Bytes, Word y Double Words igual que en la memoria E. Así, A4.2 significa que se trata del Bit número dos (2) del Byte cuatro (4) de la memoria de salidas digitales (A). AB16 representa al Byte 16 de la memoria de salidas digitales (A). AW98 representa al Word noventa y ocho (98) de le memoria de salidas digitales (A), que está formada por los Bytes AB98 y AB99. AD120 representa la Double Word número ciento veinte (120) de la memoria de salida digitales (A), que está formada por las Words AW120 y AW122, y estos a su vez por los Bytes AB120, AB121, AB122 y AB123. 48
Los autómatas SIMATIC S7-300
Capítulo 5
Observamos que respecto a los Bits individuales, la forma general de referirnos a ellos, responde a la expresión: LETRA Byte.Bit Donde “LETRA” es una letra que representa el tipo de memoria (E para entradas digitales y A para salidas digitales), después pondremos el número del Byte al que pertenezca el Bit, pondremos después un punto (.) de separación y finalmente el número del Bit, que debe ser un número comprendido entre cero (0) y siete (7). Observamos también que el Word AW98, está formado por los Bytes AB98 y AB99, por lo que al estar ocupados ya estos Bytes, el Word siguiente al AW98 no es el AW99, sino el AW100, formado por los Bytes AB100 y AB101. O dicho con otras palabras, si ya tenemos ocupado el Word AW98, no podemos usar el AW99 porque estaríamos sobrescribiendo el Byte AB99 que tienen en común. Lo mismo podemos decir del Double Word AD120, que está formada por los Word AW120 y AW122, y que estos a su vez están formados por los Bytes AB120, AB121, AB122 y AB123. Por tanto, el primer Byte libre que tenemos es el AB124, y por tanto el Double Word que sigue al AD120 es el AD124. Podemos resumir diciendo que los Word llevan siempre un número par y los Double Word también, pero la numeración va de cuatro (4) en cuatro (4). Resumiremos lo dicho hasta aquí en la siguiente tabla: AW0 AW2 AW4 AW6 AW8 AW10 AW12 etc.…
= = = = = = =
AB0 + AB1 AB2 + AB3 AB4 + AB5 AB6 + AB7 AB8 + AB9 AB10 + AB11 AB12 + AB13
Y si hacemos lo mismo para los Double Word, tendremos: AD0 AD4 AD8 AD12 AD16 AD20 AD24 Etc. 5.12
= = = = = = =
AW0 + AW2 AW4 + AW6 AW8 + AW10 AW12 + AW14 AW16 + AW18 AW20 + AW22 AW24 + AW26
= = = = = = =
AB0 + AB1 + AB2 + AB3 AB4 + AB5 + AB6 + AB7 AB8 + AB9 + AB10 + AB11 AB12 + AB13 + AB14 + AB15 AB16 + AB17 + AB18 + AB19 AB20 + AB21 + AB22 + AB23 AB24 + AB25 + AB26 + AB27
La memoria de marcas
La memoria de marcas, como ya vimos al principio del capítulo, es una parte de la memoria RAM y es de uso genérico dentro del autómata, lo que quiere decir que podemos usarla para aquello que nos haga falta en cada momento. Por ejemplo, podemos guardar resultados parciales de operaciones lógicas o de operaciones aritméticas, caracteres alfanuméricos que posteriormente presentaremos en una pantalla, etc. 49
Los autómatas SIMATIC S7-300
Capítulo 5
La memoria de marcas tiene la misma estructura en Bytes que las que ya hemos visto, y la podemos representar de la siguiente forma:
Fig.5.6
El lector habrá observado que estamos haciendo uso de los mismos conceptos ya vistos para la memoria de entradas digitales (E) y para la memoria de salidas digitales (A), razón por la que no insistiremos más aquí.
50
Operaciones lógicas con Bits
Capítulo 6
CAPÍTULO 6
Índice
Operaciones lógicas con Bits 6.1 Operación lógica U
En el apartado 4.2 vimos qué se entiende por operación AND y cómo se define en el Álgebra de Bool. La operación U en STEP-7 es la misma que la operación AND que vimos entonces, sólo que su aspecto es diferente. Allí para hacer la operación AND entre dos (2) Bits (por ejemplo A y B), escribíamos: A AND B Si después quisiéramos entregar el resultado de esta operación al Bit C, escribiríamos: C = A AND B Aquí en STEP-7 (y en lenguaje AWL, que es el que emplearemos habitualmente), si queremos hacer la operación AND entre los Bits (por ejemplo) E2.3 y E3.4, pondremos: U U
E2.3 E3.4
Y si ahora queremos entregar el resultado de esta operación a otro Bit, por ejemplo al A7.0, pondremos: U U =
E2.3 E3.4 A7.0
De esta forma, el Bit A7.0 recibe el resultado de la operación U entre los Bits E2.3 y E3.4., que de acuerdo con lo que ya vimos del Álgebra de Bool, el resultado será “1” únicamente cuando sean “1” los Bits E2.3 y E3.4 simultáneamente. ¿Qué ocurriría si en un momento determinado cambiasen las entradas E2.3 o E3.4? El lector debe tener siempre in mente, no solamente en este sencillo ejemplo sino a lo largo de todo el libro, lo que ya se explicó en el apartado 5.10 sobre el funcionamiento cíclico de los autómatas. El autómata está continuamente ejecutando el programa que hayamos introducido, por lo que detecta rápidamente cualquier variación que se produzca en las entradas. Si en un instante determinado, una o ambas entradas cambiasen de estado, el programa se actualizaría también. 6.2 El Bit RLO El Bit RLO lo vimos por primera vez en el apartado 5.4.3 pero poco sabemos de él. Sólo que está en el registro PSW y que las letras RLO significan “Resultado Lógico Operación”, pero nada más.
51
Operaciones lógicas con Bits
Capítulo 6
Realmente es uno de los Bits más importantes del PSW, ya que este Bit indica continuamente el resultado lógico de cualquier operación del tipo Bool. Esto es, en cualquier operación del tipo AND, OR, NOT o una combinación de éstas, el Bit RLO nos indica en cualquier momento cual es el resultado lógico de la operación en curso. 6.3 Operador de asignación “=” Realmente ya hemos hecho uso de este operador en el ejemplo anterior, pero allí no sabíamos que significaba y ahora conviene prestarle más atención para ver con más detalle como funciona. En el ejemplo anterior, U U =
E2.3 E3.4 A7.0
(1) (2) (3)
En las líneas (1) y (2) realizamos la operación U entre los Bits E2.3 y E3.4. Al finalizar la línea (2), el Bit RLO almacena ya el resultado lógico de las líneas (1) y (2) y al ejecutarse la línea (3), el operador de asignación “=”, asigna el valor que tiene el Bit RLO al Bit que está a la derecha del operador “=”, en este caso el Bit A7.0. El operador “=” asigna el valor que tenga el Bit RLO, al Bit que esté a su derecha.
Y esto es válido en cualquier momento, por lo que si el autómata realiza 1000 scan en un segundo, ejecutará 1000 veces el programa anterior y el operador “=” asignará 1000 veces por segundo el valor que tenga el Bit RLO al Bit A7.0, razón por la que el Bit A7.0 reflejará de forma instantánea cualquier variación que se produzca en E2.3 y/o E3.4. Ahora que ya sabemos qué es y cómo funciona el operador “=”, volvamos al ejemplo anterior para ver con más detalle aún el funcionamiento de las instrucciones. U U =
E2.3 E3.4 A7.0
(1) (2) (3)
La primera línea realmente lo que hace es asignar al Bit RLO, el valor que tenga E2.3 En la línea (2) se realiza la operación U entre RLO y el Bit E3.4, y finalmente en la línea (3) se asigna el valor que tenga RLO al Bit A7.0. 6.4 Operación lógica O La operación lógica O equivale a la operación OR que ya vimos en el apartado 4.2. Si allí la operación OR entre dos (2) Bits la escribíamos así: A OR B Y si queríamos asignar el resultado a un Bit C, poníamos: C = A OR B 52
Operaciones lógicas con Bits
Capítulo 6
Aquí en STEP-7 a esta operación la llamaremos operación O, y si por ejemplo los Bits que queremos operar son el E2.3 y E3.4, y el resultado asignárselo al Bit A7.0, pondremos: O O =
E2.3 E3.4 A7.0
(1) (2) (3)
Nuevamente podemos hacer aquí ahora un estudio detallado de las instrucciones anteriores y tendremos: En la línea (1) se asigna al Bit RLO el valor que tenga E2.3. En la línea (2) se realiza la operación O entre el Bit RLO y el Bit E3.4 y el resultado pasa a RLO, y finalmente en la línea (3) se asigna el valor del Bit RLO al Bit A7.0. 6.5 Operación lógica UN La operación UN actúa realmente como la pareja de instrucciones: U
N
Siendo U la operación que ya conocemos y N la operación NOT que vimos en 4.2. Dado un Bit cualquiera, primero aplicaremos la operación NOT a este Bit, que como sabemos le da la vuelta al Bit sobre el que se aplique, y después aplicaremos la operación U sobre el resultado anterior. Veamos un ejemplo para explicar el funcionamiento de esta operación: UN UN =
E2.3 E3.4 A7.0
En la primera línea, realizamos la operación NOT del Bit E2.3 y después el resultado se lo asignamos al Bit RLO. En la segunda línea realizamos la operación U entre RLO y NOT E3.4 y el resultado pasa a RLO. Y finalmente el valor final de RLO se lo asignamos al Bit A7.0. 6.6 Operación lógica ON La operación ON actúa también como la pareja de instrucciones O y NOT sobre : O
N
Aquí también es la operación N=NOT la primera que actúa sobre y después se realiza la operación O sobre el Bit resultante anterior. Veamos un ejemplo: ON ON =
E2.3 E3.4 A7.0
A “cámara lenta” seria así: en la primera línea realizamos la operación NOT sobre el Bit E2.3 y después pasamos al Bit RLO el resultado lógico anterior. En la segunda línea realizamos la operación O entre RLO y NOT E3.4, y el resultado se lo asignamos a RLO. Finalmente el valor de RLO se lo asignamos a A7.0. 53
Operaciones lógicas con Bits
Capítulo 6
6.7 Resumen de las operaciones U, O, UN y ON De lo visto hasta aquí, sobre todo si tenemos en cuenta el estudio detallado de cómo funcionan estas instrucciones, podemos llegar a la conclusión, de que manejar estas instrucciones es muy difícil. En realidad esto no es así y en la práctica, cuando trabajemos con estas instrucciones, basta con asignar mentalmente el valor “1” o “0” a cada línea lógica y operar los Bits resultantes. Veamos un ejemplo: U U UN U =
E2.0 E2.2 E2.4 E2.6 A7.0
Si en un instante determinado los valores de las entradas son: E2.0 = 1 E2.2 = 0 E2.4 = 0 E2.6 = 1 Los valores que toman las instrucciones anteriores, línea a línea, son: U U UN U =
E2.0 E2.2 E2.4 E2.6 A7.0
“1” “0” “1” “1” “0”
La primera línea es “1” puesto que E2.0 es “1”. La segunda línea es “0” puesto que E2.2 es “0”. La tercera línea es “1” puesto que E2.4 es “0”, pero la negación NOT le da la vuelta al “0” y lo transforma en “1”. La cuarta línea es “1” puesto que E2.6 es “1”. Finalmente si hacemos la operación U entre los resultados de las cuatro (4) líneas, nos da “0” puesto que la línea segunda es “0” y como ya sabemos, en la operación U, basta que un término sea “0” para que el resultado sea “0”. El mismo método simplificado podemos aplicar a operaciones O y ON. Por ejemplo, tomando los mismos valores para E2.0, E2.2, E2.4 y E2.6, tendremos: O O ON O =
E2.0 E2.2 E2.4 E2.6 A7.0
“1” “0” “1” “1” “1”
Ahora el resultado es “1”, ya que basta que un elemento sea “1” para que el resultado sea también “1”. 6.8 Operación lógica X La operación lógica X la vimos ya en 4.3, sólo que allí la llamábamos operación XOR.
54
Operaciones lógicas con Bits
Capítulo 6
Así pues, dados dos (2) Bits, por ejemplo E1.2 y E4.5, la operación X entre ambos Bits en lenguaje AWL se escribe así: X X
E1.2 E4.5
Y si queremos asignar el resultado a un Bit, por ejemplo la salida A124.0, pondremos: X X =
E1.2 E4.5 A124.0
Donde la salida A124.0 será “1” cuando el número de “1´s” sea un número impar. 6.9 Operación lógica XN La operación XN equivale a la operación lógica XOR NOT que también vimos en 4.3, sólo que aquí, al igual que hacíamos con la operación UN, aplicaremos primero la operación NOT sobre y luego la operación X sobre el resultado anterior. Veamos un ejemplo:
XN XN =
E1.2 E4.5 A124.0
Suponiendo que en un instante determinado los valores de E1.2 y E4.5 son: E1.2 = 0 E4.5 = 1 Nos daría como resultado A124.0 = 1, ya que al darle la vuelta a E1.2 y E4.5 nos queda la operación X entre “1” y “0”, con lo que el resultado es “1” por ser impar el número de “1’s”. 6.10
Uso de “U(“ y “)”
En ocasiones, para poder resolver un problema complejo, es necesario descomponer el problema complejo en otros de menor complejidad. Pensemos en el siguiente caso. Disponemos de cuatro (4) interruptores (A, B, C y D) y queremos montarlos de la siguiente manera: A
B
C
D
L
Fig.6.1 55
Operaciones lógicas con Bits
Capítulo 6
Observamos como los interruptores A y C están en paralelo entre ellos así como los interruptores B y D, y que a su vez la pareja de interruptores A-C está en serie con la pareja B-D. Si quisiéramos hacer un montaje equivalente al anterior usando un autómata, haríamos lo siguiente: A
B C
D
E124.0
A124.0
E124.1
A124.1
E124.2
A124.2
E124.3
A124.3
E124.4
A124.4
E124.5
A124.5
E124.6
A124.6
E124.7
A124.7
Entradas digitales
Salidas digitales
Fig.6.2
Las instrucciones equivalentes a poner A y C en paralelo son: O O
E124.0 E124.2
Así, las instrucciones equivalentes a poner B y D en paralelo son: O O
E124.1 E124.3
Y ahora nos queda poner en serie ambos bloques: U( O O ) U( O O )
E124.0 E124.2 E124.1 E124.3
Y ya sólo nos queda asignar el resultado a A124.0: U( O O ) U( O O ) =
E124.0 E124.2 E124.1 E124.3 A124.0 56
L
Operaciones lógicas con Bits
Capítulo 6
Obsérvese como los operadores “U (“ en primer lugar y “)” al final, nos permiten poner en serie los elementos que están entre los paréntesis “(“ y “)”. 6.11
Uso de “O(“ y “)”
Igual que antes, vamos a plantearnos el siguiente esquema eléctrico: A
B
C
D
L
Fig.6.3
En este circuito podemos decir que A está en serie con B, así como que C está en serie con D, y que ambas ramas están en paralelo entre sí. Igual que antes, si queremos resolver un circuito equivalente a éste pero con un autómata, la forma de conexión al autómata será la misma que en la Fig.6.2, razón por la que no la repetimos aquí otra vez. Las instrucciones AWL que equivalen a la rama serie superior son: U U
E124.0 E124.1
Y las instrucciones que equivalen a la rama serie inferior son: U U
E124.2 E124.3
Y si queremos reflejar que ambas ramas están en paralelo, pondremos: O( U U ) O( U U )
E124.0 E124.1 E124.2 E124.3
Y si queremos que el resultado aparezca en A124.0, pondremos: O( U U ) O( U U ) =
E124.0 E124.1 E124.2 E124.3 A124.0 57
Operaciones lógicas con Bits
Capítulo 6
Aquí ahora los operadores “O (“ y “)” nos permiten poner en paralelo lo que se encuentra entre los paréntesis “(“ y “)”. 6.12
Operación SET
La operación SET es muy sencilla, y se limita a poner a “1” el Bit RLO. Ejemplo: U E124.0 SET En este ejemplo, la operación U E124.0 puede dar como resultado “0” ó “1” según el valor de E124.0 sea igualmente “0” ó “1”. Ahora bien, independientemente del resultado lógico de esta operación (en definitiva, independientemente del valor que tenga RLO al llegar a la operación SET), esta operación pondrá a “1” el Bit RLO. 6.13
Operación CLR
La operación CLR es idéntica que la operación SET, sólo que pone a “0” el Bit RLO, independientemente del valor que tuviera RLO antes de ejecutarse CLR. Ejemplo: U E124.0 CLR Aquí, el programa al llegar a la altura de la operación CLR, pondrá a “0” el Bit RLO sin tener en cuenta el valor que tuviera RLO como resultado de operaciones lógicas anteriores. 6.14
Operación S
La operación S pone a “1” permanentemente , siempre y cuando el valor de RLO sea “1”. Ejemplo:
U U S
E124.0 (1) E124.1 (2) A124.0 (3)
Nota: Obsérvese que bastaría que RLO fuera “1” un instante (un pulso) para que se ejecutase la línea (3). E124.0 E124.1 A124.0
La salida A124.0 se pondrá a “1” permanentemente, si el resultado lógico (el Bit RLO) de las operaciones anteriores es “1”.
58
Operaciones lógicas con Bits
Capítulo 6
Así, si E124.0 y E124.1 son “1” simultáneamente, A124.0 se pondrá a “1” de forma permanente, entendiendo por “permanente” que aunque posteriormente el RLO pueda ser “0”, A124.0 continuará siendo “1”. 6.15
Operación R
La operación R es idéntica que la operación S, sólo que pone a “0” permanentemente si RLO=1. También aquí, una vez que se ponga a “0” por la acción de la operación R, queda a “0” independientemente de los valores posteriores de RLO. Ejemplo: U U R
E124.0 (1) E124.1 (2) A124.0 (3)
E124.0 E124.1 A124.0
NOTA: También aquí es aplicable lo que hemos dicho de la operación “S”, esto es, bastaría que RLO fuera “1” durante un instante (un pulso) para que se ejecutase la línea (3).
59
STEP-7
Capítulo 7
CAPÍTULO 7
Índice
STEP-7 7.1 El administrador de STEP-7 Primeramente pulsaremos dos (2) veces sobre el icono:
Fig.7.1
Que está (o debe estar) en el Escritorio de Windows, de allí saltaremos a la pantalla principal del Administrador de STEP-7:
Fig.7.2
El Administrador de STEP-7, aparecerá vacío si es la primera vez que accedemos a él, pero normalmente aparece con el último proyecto en el que hayamos estado trabajando. Empecemos por crear un proyecto que nos permita introducir nuestro programa. Para ello vayamos al menú “Archivo”, y tras pulsar con la flecha del ratón sobre este menú, veremos como se despliega de la siguiente forma:
61
STEP-7
Capítulo 7
Fig.7.3
Escogeremos la opción “Asistente Nuevo Proyecto”, tras lo que, aparece la imagen:
Fig.7.4
62
STEP-7
Capítulo 7
Haremos clic sobre “Siguiente>” y nos aparece la imagen:
Fig.7.5
Elegiremos (por ejemplo) la CPU 314, tras lo que haremos clic en “Siguiente>” y nos aparecerá la imagen:
Fig.7.6
A la que volvemos a responder con clic en “Siguiente>”, y aparecerá la imagen:
63
STEP-7
Capítulo 7
Fig.7.7
Aparece en la parte superior el nombre que STEP-7 asigna automáticamente a nuestros proyectos, en este caso S7_Pro1, pero que nosotros podemos cambiar por el nombre que queramos. Finalmente, al hacer clic sobre “Finalizar”, aparece el administrador general con nuestro proyecto (NOTA: Dependiendo de la versión de STEP-7, puede ser necesario oprimir el icono “Abrir proyecto/librería”, seleccionar el proyecto creado y abrirlo):
Icono de PLCSIM
Fig.7.8
64
STEP-7
Capítulo 7
7.2 PLCSIM PLCSIM es un programa que el lector, si lo desea, puede adquirir por separado, pues no está incluido dentro de STEP-7. Se trata sin duda de un magnífico simulador de autómatas SIEMENS, por lo que en este libro haremos mención frecuente de este simulador, pero evidentemente es mucho mejor disponer de un autómata SIEMENS conectado on-line con nuestro PC para así practicar los ejercicios que se vayan sugiriendo. El simulador PLCSIM se activa simplemente oprimiendo el icono correspondiente que está en la barra de herramientas del Administrador de STEP-7. Al hacerlo, aparece la ventana del simulador:
Fig.7.9
Donde la ventana de la izquierda corresponde a los mandos principales del autómata, la ventana del centro corresponde al Byte de entradas digitales EB124 y la ventana de la derecha al Byte de salidas digitales AB124. Invito al lector a que se familiarice con las opciones de este simulador, probando a insertar y borrar ventanas con entradas y salidas digitales, así como Bytes de memorias de marca, etc.
65
Grafcet
Capítulo 8
CAPÍTULO 8
Índice
Grafcet 8.1 Qué es Grafcet Grafcet procede de las palabras Graphe de Commande etape-transition y fue introducido en 1977 por la Association Française pour la Cybernétique Economique et Technique como un método gráfico evolucionado a partir de la redes de Petri que permite representar los automatismos secuenciales. Grafcet se define en la norma francesa UTE NF C 03-190 y posteriormente ha sido también definida por la norma internacional IEC-848, si bien en esta norma no se reconoce el nombre original Grafcet y se le cambia por el de Diagrama Funcional. Aquí en este libro sin embargo, emplearemos el nombre original GRAFCET, en honor de sus inventores. 8.2 Concepto de etapa en Grafcet Empecemos por poner un ejemplo introductorio. Supongamos que por la razón que sea hacemos el siguiente encargo textual a nuestro buen amigo Fulano:
Pedirle a Fulano que compre dos (2) barras de pan
“Mira Fulano, haz el favor de ir a la panadería que hay en la calle frente al portal de la casa, compras dos (2) barras de pan y me las traes”. ** Nuestro buen amigo Fulano, va a la panadería, compra las dos (2) barras de pan, nos las trae y nos dice:”Bien, aquí tienes las dos (2) barras de pan. ¿Puedo hacer algo más por ti?”. A lo que le respondemos: “Sí, por cierto. Hazme el favor de ir al estanco y comprar un paquete de cigarrillos y me lo traes.” ** Nuevamente nuestro amigo Fulano va al estanco, compra el paquete de cigarrillos y nos lo trae, diciéndonos: “Aquí estoy de nuevo. Ya he comprado el paquete de cigarrillos. ¿Puedo hacer algo más por ti? etc.… Obsérvese como en el ejemplo anterior, primeramente damos una orden, luego esperamos a que la orden se cumpla, y una vez la orden se ha cumplido, volvemos a dar otra orden. Volvemos a comprobar que la orden se ha cumplido y nuevamente volveríamos a dar una nueva orden, etc.…
67
No pasar mientras no se haya comprado el pan
Pedirle a Fulano que compre tabaco.
No pasar mientras no se haya comprado tabaco
Etc…
Fig. 8.1
Grafcet
Capítulo 8
El ejemplo anterior también podríamos ponerlo en forma gráfica de la siguiente forma: Vamos a poner ahora los dibujos anteriores, en un formato algo distinto, pero que básicamente representa las mismas ideas:
Pedirle a Fulano que compre dos (2) barras de pan.
1 Etapa 1
Ya ha comprado el pan
Pedirle a Fulano que compre tabaco
2
Ya ha comprado tabaco
Etapa 2
Etc. Fig. 8.2
En este último dibujo vemos como hay dos (2) partes. Parte 1, donde pedimos que Fulano nos compre pan (y la comprobación de que lo ha hecho), y parte 2, donde volvemos a encargarle que nos compre tabaco (y la comprobación de que lo ha hecho). Cada etapa lleva asociadas unas tareas a realizar, y después viene la comprobación de que estas tareas (u otras tareas asociadas al proceso) se han realizado. A la comprobación de que las tareas se han realizado, en Grafcet se le llama transición, y así diremos que la transición es cierta o falsa según se hayan realizado o no las tareas asociadas a la transición. Una “ETAPA” está formada por el conjunto de TODAS las tareas a realizar y por TODAS las transiciones que dependen de ella. Si tuviéramos que comparar Grafcet con algo, podríamos compararlo con una cadena formada por eslabones. En esta imaginaria “cadena”, al “eslabón” le llamamos etapa y ésta tendría la siguiente estructura:
BitDeEtapa N
Tareas: Tarea 1, Tarea 2, etc…
¿Tareas realizadas?
Fig. 8.3
68
Grafcet
Capítulo 8
Donde “N” es el número que asignamos a la etapa, “Tarea 1, Tarea 2, etc.” Es o son la/s tarea/s que asignamos a la etapa, “¿Tareas realizadas?” es la transición, la que sólo puede tomar dos (2) valores: CIERTO o FALSO (“1” o “0”), y “BitDeEtapa” es un Bit que si es “1” permite la ejecución de la etapa y si es “0” impide que la etapa se ejecute (NOTA: La transición no siempre consiste en verificar si las tareas asociadas a la etapa se han cumplido o no. La transición en general contiene una condición lógica que ha de ser cierta para poder pasar a la siguiente etapa). En Grafcet se llama secuencia a una serie de etapas encadenadas las unas con las otras como los eslabones de una cadena. Por ejemplo, el siguiente dibujo representa una secuencia:
1
Tarea1
2
Tarea 2
3
Tarea 3
Etc. Fig. 8.4
Así, dada una secuencia, se sobreentiende que la secuencia progresa siempre en sentido descendente. Si en alguna ocasión es necesario indicar que debe progresar hacia arriba, se indica con una línea y una flecha que indica el sentido ascendente del progreso: 1
Tarea 1
Transición 1 2
Tarea 2 Transición 2
3 Tarea 3 Transición 3 Fig. 8.5
69
Grafcet
Capítulo 8
En ocasiones es necesario indicar en el Grafcet que a partir de una etapa existen dos (2) o más caminos posibles. Esto se puede indicar así:
1
Transición 1a
Tarea 4
Tarea 1 Transición 1b
4
2
Transición 4
Tarea 2 Transición 2
3
Etc.
Tarea 3 Transición 3
Etc. Fig. 8.6
En este caso queremos indicar que al llegar a la etapa 1, tenemos dos (2) alternativas: irnos hacia la etapa 4 o irnos hacia la etapa 2. Si por ejemplo una vez realizada la Tarea1 de la etapa 1, se cumple la Transición 1a, la próxima etapa que se ejecute será la 4, pero si una vez realizada la Tarea1 la transición que se cumple es la Transición 1b, entonces la próxima etapa que se ejecute será la 2. Es importante hacer notar que en casos como este en que hay dos (2) o más alternativas, solamente una y nada más que una alternativa debe ser cierta, o lo que es lo mismo, las transiciones que controlan los caminos a seguir, deben ser excluyentes entre si, de tal forma que sólo una transición sea cierta y las demás falsas (no podemos tomar dos (2) caminos simultáneamente). Veamos ahora un ejemplo de Grafcet aplicado a un autómata. Se trata de dar la orden desde un autómata para que se cierre el contactor K1, y supongamos que hemos dispuesto los elementos de la siguiente forma: BE A124.0
E124.0 E124.1
K1
K1
M
Autómata Fig. 8.7
70
K1
Grafcet
Capítulo 8
Estos datos pasados a una tabla de Entradas/Salidas, nos quedarán así: Entradas digitales al autómata E124.0 Botón empezar (BE) E124.1 Contacto secundario de K1
A124.0
Salidas digitales del autómata Bobina del contactor K1
En este caso hemos dispuesto un “Botón empezar” que hemos conectado a la entrada E124.0. Uno de los contactos secundarios del tipo NA del contactor K1, lo hemos conectado a la entrada E124.1; la salida A124.0 del autómata la hemos conectado a la bobina de K1. Con este montaje pretendemos que al pulsar “BE”, el contactor K1 se cierre. Un contacto auxiliar NA de K1, informará al autómata que la operación se ha realizado, cuando en E124.1 se reciba un voltaje +24VDC. Veamos ahora como se representaría en Grafcet únicamente la etapa que se encarga de accionar el contactor y que comprueba que la maniobra se ha realizado: BitDeEtapa N
Cerrar contactor K1
¿Se ha cerrado el contactor? Fig. 8.8
Y si ahora cambiamos las frases por parámetros concretos, tendremos: M0.0 Hacer A124.0 = 1
N
¿E124.0=1?
Hacia etapa siguiente Fig. 8.9
Tenemos así los elementos típicos de una etapa Grafcet, esto es, una etapa donde se realizan tareas (en este caso cerrar un contactor) y una transición que caso de ser cierta, nos permitirá pasar a la etapa siguiente. Así observamos como en el Grafcet superior hemos expresado las ideas con palabras mientras que en el Grafcet inferior, hemos concretado las palabras y las hemos sustituido por parámetros concretos.
71
Grafcet
Capítulo 8
En general en Grafcet, al primer dibujo de este tipo que se hace, donde lo que se emplean son palabras, se le llama Grafcet de nivel 1 (G1) mientras que en al segundo dibujo, donde se sustituyen las palabras por parámetros técnicos concretos, se llama le Grafcet de nivel 2 (G2). Bien, hasta aquí tenemos ya de momento conocimientos suficientes de Grafcet para empezar con algunas cosas de interés. Más adelante, conforme necesitemos saber más, volveremos nuevamente a Grafcet, de momento con lo visto es suficiente. 8.3 Operación NOP 0 La operación NOP 0 no hace absolutamente nada en el autómata, excepto consumir tiempo. Se usa en ocasiones como operación de relleno y en otras ocasiones simplemente para perder tiempo. 8.4 Operación SPBN La operación SPBN es una operación de salto, que se usa para saltar a aquella línea del programa que tenga la etiqueta a su izquierda. La etiqueta ha de cumplir las siguientes condiciones: • •
Estar formada por un máximo de cuatro (4) caracteres, de los que el primero debe ser alfabético, pudiendo ser los otros tres (3) numéricos, alfabéticos o una combinación de ambos. Terminar con el símbolo dos puntos “:”.
Para que el salto se efectúe, es indispensable que el Bit RLO sea “0” inmediatamente antes de ejecutarse la operación SPBN . Por ejemplo: U M3.4 SPBN _000 _000: NOP 0 En este ejemplo, si el Bit M3.4 es “1”, entonces inmediatamente antes de ejecutarse SPBN _000, el Bit RLO será “1” también, con lo que el salto no llegará a producirse, y seguirán ejecutándose las operaciones que estén inmediatamente a continuación de SPBN _000. Si por el contrario el Bit M3.4 es “0”, entonces el Bit RLO será “0” también inmediatamente antes de la operación SPBN _000, y el salto se producirá, saltando el programa a la etiqueta “_000:” y continuándose allí el programa. 8.5 Formato cerrado En el apartado 8.2, al final del mismo, vimos un ejemplo de cómo se representa en Grafcet un caso real. Si quisiéramos traducir a lenguaje AWL la etapa Grafcet del ejemplo que pusimos allí, podríamos escribir:
72
Grafcet
Capítulo 8
U SPBN S U R S _000: NOP
M0.0 _000 A124.0 E124.0 M0.0 M0.1 0
//(1) //(2) //(3) //(4) //(5) //(6) //(7)
Si el “BitDeEtapa” es “1” hacer lo siguiente: Poner a “1” A124.0 Preguntar si E124.0=1, y si es cierto Poner a “0” M0.0 y a “1” M0.1.
Observamos como el Bit M0.0 en la línea (1) es el que permite que se ejecuten o no las operaciones comprendidas entre las líneas (3) y (6). Efectivamente, si M0.0 = 0, la operación SPBN _000 hará que el programa salte de la línea (2) a la línea (7) y en este caso las operaciones intermedias no se ejecutarán, pero si el Bit M0.0 en la línea (1) es “1”, entonces la operación SPBN _000 no se efectuará, el programa no saltará y se ejecutarán todas las operaciones de las líneas (2) a la (7). Ésta es precisamente la misión que tiene el BitDeEtapa que hemos definido en Grafcet, esto es, habilitar o deshabilitar la etapa según el BitDeEtapa esté o no esté a “1”. Si nos metemos dentro del paquete de operaciones, en la línea (3) tenemos la operación “S A124.0” que pone a “1” la salida A124.0, y la línea (4) se encarga de anular el BitDeEtapa de la etapa actual y activar el BitDeEtapa de la etapa siguiente, en el caso de que la transición (en este caso E124.0) sea cierta. Si expresamos esta misma idea de una forma general, partiendo de una etapa Grafcet también general, tendremos: BitDeEtapa N
Tareas: Tarea 1, Tarea 2, etc…
¿Transición cierta? Fig. 8.10
Y generalizando la idea anterior, podemos escribir:
_000:
U “BitDeEtapa” SPBN _000 --Tarea 1 Tarea 2 Cuerpo de la etapa ----Si la transición es cierta, anular la etapa actual y activar la siguiente. NOP 0
A esta plantilla la llamaremos plantilla en “formato cerrado”, ya que todas las operaciones a realizar están “encerradas” entre la operación “SPBN _000” y su meta “_000:”.
73
Grafcet
Capítulo 8
8.6 Etapa 0 Otro concepto importante en Grafcet es el de “Etapa 0”. En Grafcet, por Etapa “0” se entiende la etapa inicial del Grafcet. Diríamos que es el punto de partida del Grafcet y de donde arranca el proceso mismo. A esta etapa se la representa con una doble línea y se suele reservar para ella el número “0”, aunque realmente lo que caracteriza la etapa inicial no es el número “0” propiamente, sino el doble trazo. Tarea 0
0
Transición 0
Continúa
Fig. 8.11
8.7 El bloque de organización OB1 STEP-7, al igual que otros lenguajes de programación estructurados, hace uso de lo que podríamos llamar “cajas” en las que se encierran o se escriben partes concretas del programa que tienen una determinada misión. Así STEP-7, también hace uso de estas “cajas”, y uno de los tipos más importantes de “cajas” que se emplean son los llamados Bloques de Organización. A los Bloques de Organización se les representa con las letras “OB” (Organization Block) y le sigue un número que designa el número del bloque. Más adelante iremos viendo los distintos tipos que hay de bloques de organización en STEP-7, pero de momento empecemos con el más importante de todos ellos que es el OB1. El OB1 es el bloque de organización que alberga o contiene el programa principal. Realmente ya vimos este bloque en el apartado 5.10 cuando hablábamos de la forma cíclica de funcionar el programa en el autómata. Allí decíamos que primero se tomaban los datos de la periferia y se guardaban en la PAE, después el proceso ejecutaba el programa principal y finalmente se enviaban desde la PAA a la periferia los datos obtenidos en el programa principal. Bien, pues este bloque que contiene el programa principal y que se ejecuta cíclicamente, es precisamente OB1. 8.8 El bloque de organización OB100 El bloque de organización OB100 es otro de los bloques importantes de STEP-7. El bloque OB100 únicamente se ejecuta una vez cuando al girar la llave del frontal del autómata, se pasa del estado STOP al estado RUN.
74
Grafcet
Capítulo 8
Cuando esto ocurre, tal y como ya hemos dicho antes, el proceso ejecuta las instrucciones que pueda haber en OB100, UNA SOLA VEZ, hecho esto abandona OB100 y comienza a ejecutar las instrucciones de OB1 cíclicamente, y ya no vuelve a pasar más por OB100. Aprovechando este comportamiento de OB100, el programador es el que debe escribir las instrucciones que crea más convenientes en cada caso para OB100. Por ejemplo, una posible utilidad de OB100 podría ser la de inicializar algunas variables que después nos encontraremos en OB1. 8.9 Un ejemplo completo Con lo que sabemos, vamos a volver a plantearnos el ejemplo que pusimos al final de 8.2. Empezaremos por la tabla de Entradas/Salidas: Entradas digitales al autómata E124.0 Botón empezar (BE) E124.1 Contacto secundario de K1
Salidas digitales del autómata A124.0 Bobina del contactor K1
El Grafcet de nivel 1 (G1) será el siguiente: 0
Esperar
¿Botón empezar = ON?
1
Contactor = ON
¿Contacto secundario = ON?
Fig. 8.12
El Grafcet de nivel 2 (G2) será el siguiente: M0.0 Esperar
0
¿E124.0 = 1? M0.1 A124.0 = 1
1
¿E124.1 = 1? Etc. Fig. 8.13
75
Grafcet
Capítulo 8
Observamos que poner “E124.0=1” es lo mismo que poner con palabras “Botón empezar = ON”, poner “A124.0 = 1” es lo mismo que poner “Contactor = ON” y poner “E124.1=1” es lo mismo que poner “Contacto secundario = ON”, con la diferencia que al ser parámetros concretos, podemos manejarlos directamente con operaciones AWL. En el caso anterior, la flecha quiere indicar que faltaría continuar el Grafcet con nuevas etapas, pero en este caso vamos a terminar este Grafcet en este punto, ya que se trata solamente de un ejemplo introductorio. Si traducimos a lenguaje AWL las dos (2) etapas anteriores, tendremos: U SPBN
M0.0 _000
U R S _000: NOP 0
E124.0 M0.0 M0.1
U SPBN S U R S _001: NOP 0
M0.1 _001 A124.0 E124.1 M0.1 M0.2
//El cuerpo de la etapa está vacío puesto que no hay //tareas que hacer. //Si la receptividad de la transición es cierta, //(en este caso E124.0 =1), anular la etapa actual // y pasar a la siguiente.
//Cuerpo de la etapa en este caso. //Si la receptividad de la transición es cierta, //(en este caso E124.1 =1), anular la etapa actual M0.1=0, // y pasar a la siguiente M0.2=1.
El funcionamiento del programa sería así: Inicialmente la única etapa activa es la Etapa “0”. En esta etapa permanecemos mientras alguien no oprima el Botón Empezar (E124.0). Cuando alguien oprima este botón (E124.0=1) entonces se anula la Etapa “0” y pasamos a la etapa “1”, donde activamos el contactor (A124.0=1) y quedamos a la espera de que el contacto secundario (E124.1) nos confirme que efectivamente la orden ha sido cumplida (E124.1=1). Cuando esto sea así, anulamos la etapa actual “1” y activamos la “2” (suponiendo que exista). Nos queda una pregunta en el aire: ¿Quién activa inicialmente la etapa “0”? Recordando lo que hemos dicho anteriormente sobre OB100, para activar la Etapa “0” haremos uso del bloque OB100, en el que escribiremos las siguientes operaciones: SET S R
M0.0 M0.1
De esta forma, cuando el autómata entre en OB1, tendremos únicamente la etapa “0” activa y la etapa “1” inactiva, empezando así el programa correctamente. Recordando lo que ya vimos en el Capítulo 7, vamos a introducir nuestro programa en el autómata o bien en el simulador, para comprobar el funcionamiento de las operaciones anteriores. Para ello, haremos doble clic sobre el icono de STEP-7 en el Escritorio de Windows y saltamos a la ventana del Administrador de STEP-7.
76
Grafcet
Capítulo 8
Una vez en la ventana del Administrador de STEP-7, pulsaremos con la flecha de nuestro ratón sobre el nombre del proyecto, en este caso “S7_Pro1”, pero con el botón derecho del ratón, y elegiremos la opción “Insertar nuevo objeto/Programa S7”, tal y como muestra la imagen:
Fig. 8.14
Aceptaremos con el botón izquierdo del ratón, con lo que STEP-7 nos creará una carpeta nueva con el nombre “Programa S7(2)” que contiene a su vez la carpeta “Bloques”. Al hacer clic sobre esta última carpeta, en la parte derecha de la pantalla aparece el contenido de la carpeta “Bloques” y nos muestra el bloque OB1 ya creado, aunque vacío. Haremos nuevamente doble clic sobre este bloque OB1 y nos aparecerá la imagen:
Fig. 8.15
77
Grafcet
Capítulo 8
Al aceptar esta imagen, nos aparece otra nueva (según la versión que el lector tenga de STEP-7, puede tener un aspecto algo distinto):
Comenzar a escribir aquí
Fig. 8.16
Y ahora introduciremos nuestro programa a partir de donde marca la flecha, y tendremos:
No olvide oprimir este icono, después de haber escrito su programa
Fig. 8.17
78
Grafcet
Capítulo 8
Una vez escrito el programa, oprimiremos el icono “Guardar” y así guardaremos en disco nuestro trabajo. (NOTA: Obsérvese como el símbolo “//” permite añadir un comentario a la derecha de la operación.) Debemos volver ahora nuevamente a la ventana del Administrador general de STEP-7, para ello haga clic en el icono que contiene la huella de un zapato y un “7”, situado en la barra de herramientas inferior. No olvidemos que aún nos quedan por escribir una cuantas operaciones en OB100, puesto que ni siquiera tenemos el bloque OB100 a la vista, empecemos por crearlo. Para ello haga clic sobre el menú “Insertar” y elija la opción “Bloque S7/1 Bloque de organización” y aparecerá una ventana como la de la Fig. 8.15, donde tenemos que cambiar el número del bloque por el “100” para que se lea “OB100”. Una vez hecho esto, haremos clic en “Aceptar” y aparecerá pasados algunos segundos el nuevo bloque creado OB100 al lado del OB1. Para editar el nuevo bloque OB100 y escribir nuestras operaciones, haremos doble clic sobre el icono OB100 y aparecerá nuevamente una ventana muy similar a la de la Fig. 8.16. Nos situaremos más o menos donde indica la flecha de la Fig. 8.16 e introduciremos nuestro pequeño programa:
Fig. 8.18
Una vez hecho esto, haremos clic sobre el icono “Guardar” y después nuevamente clic sobre el icono que nos muestra el Administrador de STEP-7. 79
Grafcet
Capítulo 8
Bien, hasta aquí ya tenemos nuestro programa en memoria del PC, pero debemos introducirlo ahora o en el autómata o en el simulador. Si decidimos introducirlo en el autómata, no olvidemos dar tensión al autómata, y también poner la llave del frontal en la posición STOP, hecho esto, iremos al Administrador de STEP-7, seleccionaremos por ejemplo el bloque OB1 haciendo un solo clic sobre su icono, y una vez este seleccionado (se sabe que está seleccionado porque se pone de color azul oscuro) volveremos a hacer clic sobre el icono “Cargar”, tras lo que pasados algunos segundos, habremos conseguido cargar el bloque OB1 en el autómata. Debemos hacer lo mismo ahora con OB100, empezaremos por seleccionarlo, haciendo un clic sobre su icono y después un nuevo clic sobre el icono “Cargar”. Con esto tenemos ya el autómata cargado con el programa y sólo nos falta probarlo. Para ello giraremos la llave del frontal a la posición RUN y esperaremos algunos segundos hasta que las luces del frontal se estabilicen. No olvidemos que el bloque OB100 se ha ejecutado ya, cuando hemos pasado la llave del frontal desde la posición STOP a la RUN. Por tanto, nuestro programa se encuentra (o debería encontrarse) en estos momentos en la etapa “0”, por cuanto en la etapa OB100, no olvidemos que las órdenes que habíamos dado eran poner a “1” el Bit M0.0 y a “0” el Bit M0.1. Esta situación permanecerá así indefinidamente, y según nos indica el Grafcet de la Fig. 8.13, el proceso está esperando que alguien introduzca una tensión alta por E124.0. Al hacerlo así, la etapa “0” se desactiva y se activa simultáneamente la etapa “1”, donde la tarea que debe realizar es poner a “1” la salida A124.0. Observemos como el diodo LED de la salida A124.0 se enciende, indicando que A124.0 está a “1”, tal y como habíamos previsto. En estos momentos el programa está esperando a recibir una tensión alta por E124.1, confirmando que el contactor se ha cerrado. Si accionamos el interruptor de E124.1 e introducimos por esta entrada una tensión alta, el programa anulará la etapa “1” y activará la etapa “2” haciendo que M0.2 se ponga a “1”. Si la etapa “2” existe, el programa continuará hacia esta etapa y cuando ésta se cumpla, pasará a la etapa “3”, etc. Un caso particular: En algunos casos, la transición de la etapa siempre es cierta. Este es el caso normalmente cuando la/s tarea/s a realizar son órdenes internas al autómata cuya ejecución es instantánea y su comprobación se hace muy difícil o imposible. En estos casos en que la ejecución de las tareas es instantánea y además no tenemos forma de comprobar si las órdenes se han ejecutado correctamente o no, se recurre a poner a “1” la transición de esta etapa. Veamos el siguiente ejemplo: Se trata de diseñar una etapa en la que la tarea consiste en poner a “1”, por ejemplo el Bit A124.0.
80
Grafcet
Capítulo 8
Solución: Empezaremos pintando una tabla de las entradas y salidas del autómata y las asignaciones que hemos hecho: Entradas
Salidas A124.0
Pintaremos el Grafcet de nivel “1” y después el de nivel “2”: G1: BitDeEtapa N
Activar salida =1
G2: M0.0 A124.0 = 1
N =1
Representación de la etapa anterior, en formato cerrado: U M0.0 SPBN _001 S A124.0 SET R M0.0 S M0.1 _001: NOP 0
//Cuerpo de la etapa en este caso. //Pondremos “SET” cuando la transición sea “1”. //Anulamos la etapa actual caracterizada por M0.0, //y activamos la siguiente, caracterizada por M0.1.
Aquí en este caso no preguntamos si la transición es cierta puesto que es evidente que lo es. Ponemos la operación “SET”, anulamos la etapa actual y activamos la siguiente. Obsérvese además cómo indicamos que la transición es siempre cierta, con el símbolo “=1”.
81
Grafcet
Capítulo 8
Ejercicio 1 FCs
Control automático taladradora vertical
s Proyectar un circuito para el control automático de una taladradora vertical. Dicha máquina deberá realizar la siguiente función:
B
Ps
1º.- Mediante el pulsador B iniciamos el descenso de la herramienta, la cual, al llegar a un minirruptor fin de carrera FCb, debe interrumpir el descenso e iniciar la subida. 2º.- Al llegar en la subida a un minirruptor fin de carrera FBs, la herramienta debe detenerse. 3º.- El circuito deberá llevar un pulsador de emergencia Ps, mediante el cual pueda interrumpirse el descenso de la herramienta, para que automáticamente se inicie la subida. 4º.- Cuando la herramienta esté subiendo, de ninguna manera deberá poder iniciarse la bajada, aunque se pulse B.
b
Definido el diagrama del circuito, traducir a lenguaje STEP 7 a lógica cableada.
FCb
Aclaraciones: Se supone que el taladro tiene un mecanismo con dos (2) entradas marcadas SUBIR y BAJAR. Si la entrada SUBIR recibe un voltaje alto, el taladro subirá, y si la entrada BAJAR recibe el voltaje alto, el taladro bajará, y si ninguna entrada recibe tensión, el taladro estará quieto. Las tablas con los contactos de entradas/salidas son: Entradas E124.0 E124.1 E124.2 E124.3
B (botón empezar) FCs (fin de carrera superior). FCb (fin de carrera inferior) Ps (pulsador de emergencia).
Salidas A124.0 A124.1
G1:
SUBIR (subir taladro) BAJAR (bajar taladro)
G2: M0.0
0
NO SUBIR, NO BAJAR
0
¿Botón empezar?
A124.0=0, A124.1=0 E124.0=1
M0.1
1
BAJAR
1
¿Final de carrera inferior O Pulsador de emergencia? 2
SUBIR, NO BAJAR ¿Final de carrera superior?
82
A124.1=1
(E124.2=1) O (E124.3=1) M0.2
2
A124.0=1, A124.1=0 E124.1=1
Grafcet
Capítulo 8
Y la traducción de G2 a lenguaje AWL será: U SPBN R R U R S _000: NOP 0
M0.0 _000 A124.0 A124.1 E124.0 M0.0 M0.1
U SPBN S O O R S _001: NOP 0
M0.1 _001 A124.1 E124.2 E124.3 M0.1 M0.2
//Activar A124.1 (BAJAR). //Si el taladro ha llegado a su parte inferior //o alguien ha pulsado el paro de emergencia, //anular la etapa actual //y activar la próxima.
U SPBN S R U R S _002: NOP 0
M0.2 _002 A124.0 A124.1 E124.1 M0.2 M0.0
//Activar A124.0 (SUBIR) y desactivar //A124.1 (BAJAR). //Cuando el taladro llegue a su parte alta, //anular la etapa actual //y activar la etapa “0”.
//Poner a “0” las salidas A124.0 y A124.1 //Si alguien ha pulsado el botón empezar, //anular la etapa actual // y pasar a la siguiente.
Una vez hayamos introducido esta información en OB1 y guardado en disco, pasaremos primero a crear OB100 y después introduciremos lo siguiente: SET S R R
M0.0 M0.1 M0.2
Que también guardaremos en disco. Finalmente, volveremos al Administrador de STEP-7, seleccionaremos individualmente o en conjunto OB1 y OB100 y los introduciremos en el autómata (sin olvidarnos de poner previamente la llave del frontal en STOP). Al pasar la llave a RUN, podemos probar ahora nuestro programa. Aquí nuevamente, al pasar la llave de STOP a RUN se ha ejecutado una sola vez el bloque OB100, por lo que el autómata ha hecho A124.0=0 y A124.1=0, tal y como hemos programado, y después se queda esperando a que la transición E124.0=1, o lo que es lo mismo, a que alguien oprima el botón empezar B. Cuando esto ocurre, el autómata pasa a la etapa “1” donde pone a “1” la salida A124.1, y esto hace que la taladradora comience a bajar. 83
Grafcet
Capítulo 8
El programa espera en la etapa “1” a que su transición sea cierta, lo cual ocurrirá cuando o bien la taladradora llegue a su parte inferior y se active el final de carrera FCb (E124.2=1) o bien cuando alguien pulse el paro de emergencia Ps (E124.3=1) o incluso cuando ocurran ambas circunstancias a la vez. Cuando cualquiera de estas cosas ocurra, la transición será cierta y se anulará la etapa actual “1” y se activará la siguiente “2”. En la etapa “2”, el programa activa SUBIR y desactiva BAJAR, y así permanece hasta que detecta que el taladro ha llegado a la parte alta, que se lo indica FCs conectado a la entrada del autómata E124.1. Así pues, una vez E124.1=1, el programa desactiva la etapa “2” y activa la etapa “0”, permaneciendo en la etapa “0” hasta que alguien vuelve a pulsar el botón empezar B nuevamente y comienza otra vez el ciclo.
Ejercicio 2
Arranque directo
L1 L2 L3
PE
Arranque directo de un motor trifásico con rotor en corto circuito 1.- Elementos del esquema:
Q1
Q1 KM1 F1 M LM LF1 LBT
KM1 F1
Seccionador con fusibles incorporados Contactor de potencia Relé térmico de protección Motor trifásico Lámpara que señala motor en marcha Lámpara que señala disparo de F1 Lámpara que señala tensión en el circuito
2.- Funcionamiento Para poner en marcha, pulsar en S1 Para parar, pulsar en S2 El motor tambien se desconecta por disparo de F1 Lámparas de señalización de circuito bajo tensión (LBT), motor en servicio (LM) y disparo de relé térmico (LF1)
M 3∼
(NOTA: Es aconsejable que el lector realice un esquema eléctrico completo, donde aparezca el circuito de potencia anterior, el de maniobra, el autómata, los pulsadores y las lámparas de señalización.) S1
botón de marcha
S2
botón de paro
LM (motor = ON) LF1 (térmico)
RT = Relé térmico
84
Grafcet
Capítulo 8
La tabla con los contactos de entradas/salidas será: Entradas E124.0 S1 (botón de marcha) E124.1 S2 (botón de paro) E124.2 RT (relé térmico)
Salidas A124.0 A124.1
G1:
KM1 y LM LF1
1,2
Poner salidas=OFF
0
¿Botón de marcha=ON Y Relé térmico=OFF? Motor=ON; LM=ON
1
¿Relé térmico=ON?
¿Botón de PARO pulsado?
Motor=OFF LM=OFF LF1=ON
2
0
Relé térmico=OFF?
0
1,2
G2:
M0.0 A124.0=0; A124.1=0
0
(E124.0=1) Y (E124.2=0)
M0.1
A124.0=1
1
E124.1=1
E124.2=1 M0.2
2
0
A124.0=0 A124.1=1 E124.2=0
0
85
Grafcet
Capítulo 8
Antes de traducir nuestro Grafcet G2 a operaciones AWL, comentemos algunos detalles nuevos. Los números encima de la punta de flecha que están encima de la etapa “0”, indican los números de las etapas desde las que se llega a ésta. En este caso, las etapas “1” y “2”. Observamos también algo nuevo, y es la bifurcación que hay debajo de la etapa “1”. Esto significa que una vez el programa esté en la etapa “1”, podemos pasar desde aquí a la etapa “0” o a la etapa “2”, según sea cierta la transición “Botón de PARO está pulsado” o “Relé termico=ON”. La traducción de G2 a operaciones AWL, que pondremos en OB1, será: U SPBN R R U UN R S _000: NOP 0
M0.0 _000 A124.0 A124.1 E124.0 E124.2 M0.0 M0.1
U SPBN S U R S U R S _001: NOP 0
M0.1 _001 A124.0 E124.1 M0.1 M0.0 E124.2 M0.1 M0.2
//Poner el motor en marcha y encender lámpara LM. //Si alguien ha pulsado el botón de PARO, //anular la etapa actual //y volver a etapa “0”. //Si ha saltado el relé térmico, //anular la etapa actual //y activar la próxima.
U SPBN R S UN R S _002: NOP 0
M0.2 _002 A124.0 A124.1 E124.2 M0.2 M0.0
//Apagar motor, lámpara LM y //encender lámpara LF1. //Si alguien ha rearmado el relé térmico, //anular la etapa actual //y activar la etapa “0”.
//Poner a “0” las salidas A124.0 y A124.1 //Si alguien ha pulsado el botón de marcha Y //el relé térmico no está saltado, //anular la etapa actual // y pasar a la siguiente.
En cuanto a las instrucciones que pondremos en OB100, serán: SET S R R
M0.0 M0.1 M0.2
Como ya hemos hecho en ejercicios anteriores, guardaremos OB1 y OB100 en el disco del PC haciendo clic sobre el icono “Guardar”, volveremos al Administrador de STEP-7, seleccionaremos individualmente o en conjunto los bloques OB1 y OB100 y los introduciremos en el autómata con el icono “Cargar”, sin olvidarnos de poner en STOP el autómata previamente.
86
Grafcet
Capítulo 8
Una vez el programa en el autómata, pondremos la llave en la posición RUN, con lo que se ejecutarán las operaciones que hemos depositado en OB100, y el programa entrará en la etapa “0” donde pondrá las salidas A124.0 y A124.1 a “0” y se quedará esperando a que se cumpla la transición, la cual será cierta cuando E124.0=1 Y E124.2=0 (o lo que es lo mismo, que alguien pulse el botón de marcha Y que el relé térmico no esté saltado). Cuando se dé la circunstancia anterior, el programa anulará la etapa “0” y pasará a la etapa “1”, donde pondrá a “1” la salida A124.0, lo que producirá simultáneamente la puesta en marcha del motor y se encenderá la lámpara LM, tras esto el programa queda a la espera de que sea cierta o bien la transición de la izquierda “Botón de PARO pulsado” o bien la transición de la derecha “Relé térmico=ON” (pero no ambas). Si se cumple la transición de la izquierda E124.1=1 (o lo que es igual, “Botón de PARO pulsado = CIERTO”), entonces el programa anulará la etapa actual “1” y activará la etapa “0”, donde ya sabemos que las salidas se pondrán a “0”. Si por el contrario se cumple la transición de la derecha E124.2=1 (o lo que es igual, “Relé térmico=ON”), entonces se anulará la etapa actual “1” y se activará la etapa “2”. Si el programa activa la etapa “2”, lo primero que hará esta etapa es apagar el motor y la lámpara LM haciendo que A124.0 sea “0” y encendiendo la lámpara LF1 poniendo a “1” la salida A124.1. En esta etapa “2” permanecerá indefinidamente hasta que alguien rearme el relé térmico, con lo que la transición E124.2 volverá a “0” y el programa anulará la etapa actual “2” y activará la “0”, donde el programa queda a la espera de volver a empezar.
Ejercicio 3
Bomba de agua ON
OFF
FUNC TERMICO
BOMBA
El estado de disponibilidad o no de servicio, lo proporciona un selector de dos posiciones: Conectado (ON) Desconectado (OFF). La electrobomba se pondrá en marcha cuando el sensor de mínimo esté encendido y se apagará cuando, o bien se encienda el sensor de máximo, o bien salte el térmico o bien la desconectemos mediante el selector. Si la electrobomba está en servicio, deberá lucir una lámpara indicadora. Si salta el térmico se encenderá otra lámpara avisándolo.
(NOTA: Es aconsejable que el lector dibuje un esquema eléctrico completo, donde aparezca el circuito de potencia, el de maniobra, el autómata, los pulsadores y las lámparas de señalización.)
87
Grafcet
Capítulo 8
RT = Relé térmico Las tablas con los contactos de entrada/salida son: Entradas E124.0 E124.1 E124.2 E124.3 E124.4
Salidas A124.0 A124.1 A124.2
Selector en posición ON Selector en posición OFF Tanque lleno Tanque vacío RT (relé térmico)
Bomba Luz FUNCIONANDO Luz TERMICO
G1:
1,2
0
Poner salidas=OFF ¿El selector está en ON Y el tanque está VACIO Y el relé térmico no ha saltado?
1
Bomba=ON; Luz Func.=ON
¿Tanque lleno O Selector=OFF?
¿Relé térmico=ON? 2
0
Bomba=OFF Luz Func.=OFF Luz TERM.=ON ¿Relé térmico=OFF?
0
88
Grafcet
Capítulo 8
G2: 1,2 M0.0 0
A124.0=0; A124.1=0; A124.2=0 ¿(E124.0=1) Y (E124.1=0) Y (E124.2=0) Y (E124.3=1) Y (E124.4=0)?
M0.1
A124.0=1; A124.1=1
1
¿(E124.2=1) O ((E124.0=0) Y (E124.1)=1))?
M0.2
2
0
E124.4=1 A124.0=0 A124.1=1 A124.2=1 E124.4=0
0
Estos Grafcet G1 y G2, nos recuerdan mucho a los del Ejercicio 2, pero aquí su interpretación es diferente. La traducción a operaciones en lenguaje AWL será: U SPBN R R R U UN UN U UN R S _000: NOP 0
M0.0 _000 A124.0 A124.1 A124.2 E124.0 E124.1 E124.2 E124.3 E124.4 M0.0 M0.1
U SPBN S S O( U ) O( UN U ) R S
M0.1 _001 A124.0 A124.1 E124.2
//Poner a “0” las salidas A124.0, //A124.1 y //A124.2. //Si el selector está en la posición ON //Y no está en la posición OFF, //Y el sensor que marca lleno no está activado, //Y el sensor que marca tanque vacío si está activo, //Y el relé térmico no está activado, //entonces anular la etapa actual // y pasar a la siguiente.
//Poner bomba en marcha y //encender lámpara de luz FUNCIONANDO. //Si el tanque está lleno O
E124.0 E124.1
//el selector no está en posición ON //Y el selector si está en posición OFF
M0.1 M0.0
//Anular la etapa actual //y volver a etapa “0”. 89
Grafcet
Capítulo 8
U R S _001: NOP 0
E124.4 M0.1 M0.2
//Si ha saltado el relé térmico, //anular la etapa actual //y activar la próxima.
U SPBN R R S UN R S _002: NOP 0
M0.2 _002 A124.0 A124.1 A124.2 E124.4 M0.2 M0.0
//Apagar bomba, //apagar luz FUNCIONANDO y //encender luz TERMICO. //Si alguien ha rearmado el relé térmico, //anular la etapa actual //y activar la etapa “0”.
En cuanto a las instrucciones que pondremos en OB100, serán: SET S R R
M0.0 M0.1 M0.2
Ejercicio 4
Inversor de giro para motor trifásico
L1 L2 L3
1.- Esquema de potencia
Q1
KM1
L1, L2, L3 Q1 KM1, KM2 M
KM2
Acometida Seccionador con fusibles incorporados Inversor por contactor Motor trifásico
2.- Esquema de maniobra La selección de giro se hace por pulsadores, disponiendo el circuito de maniobra de lámparas de señalización de giro a derecha e izquierda y disparo de relé térmico.
F1
El paro se hace por medio del pulsador Pa.
M 3∼
(NOTA: Es aconsejable que el lector dibuje un esquema eléctrico, lo más completo posible donde aparezca el circuito de potencia, el de maniobra, el autómata, los pulsadores y las lámparas de señalización). Botón Gd (Girar dcha.)
Gd (Gira dcha.)
Botón Gi (Gira izda.)
Gi (Gira izda.) Rt (relé térmico)
Botón Pa (Parar)
90
Grafcet
Capítulo 8
La tabla con los contactos de entradas/salidas será: Entradas E124.0 E124.1 E124.2 E124.3
Salidas A124.0 A124.1 A124.2
Botón Gd (Girar dcha.) Botón Gi (Girar izda.) Botón Pa (Parar) Rt (Relé térmico)
G1:
Motor dcha. y lámpara Gd Motor izda. y lámpara Gi Lámpara Rt
Poner salidas = OFF
0
¿(Pulsador Gd) Y (NO Rt)?
¿(Pulsador Gi) Y (NO Rt)? Girar motor izda. .
Girar motor dcha.
1
Lámpara Gi = ON
2
Lámpara Gd = ON
No girar motor dcha..
No girar motor izda.
Lámpara Gd = OFF
Lámpara Gi = OFF
¿Botón Gi?
2
¿Botón Pa?
¿Botón Gd?
¿Rt = ON?
0
1
0
M0.0
G2:
0
0
(E124.1=1) Y (E124.3=0)
(E124.0=1) Y (E124.3=0) M0.1
M0.2
A124.0=1
A124.0=0
2
A124.1=1
A124.1=0
E124.1=1
2
E124.2=1
0
¿Rt = ON?
A124.0=0 A124.1=0 A124.2=0
0
1
¿Botón Pa?
E124.3=1
E124.0=1
0
1
91
E124.2=1
0
E124.3=1
0
Grafcet
Capítulo 8
La traducción a operaciones en lenguaje AWL será: U SPBN R R R U UN R S U UN R S _000: NOP 0
M0.0 _000 A124.0 A124.1 A124.2 E124.0 E124.3 M0.0 M0.1 E124.1 E124.3 M0.0 M0.2
//Poner a “0” las salidas A124.0, //A124.1 y //A124.2. //Si botón Gd está pulsado //Y no esta saltado el térmico, //anular la etapa actual // y pasar a la etapa “1”. //Si botón Gi está pulsado //Y no esta saltado el térmico, //anular la etapa actual // y pasar a la etapa “2”.
U SPBN S R U R S U R S U R S _001: NOP 0
M0.1 _001 A124.0 A124.1 E124.1 M0.1 M0.2 E124.2 M0.1 M0.0 E124.3 M0.1 M0.0
//Girar motor a dcha. y encender lámpara Gd. //Anular giro a izda. y apagar lámpara Gi. //Si botón Gi está pulsado, //anular etapa actual //y activar etapa “2”. //Si botón Pa está activado, //Anular la etapa actual //y volver a etapa “0”. //Si relé térmico ha saltado, //anular la etapa actual //y activar etapa “0”.
U SPBN S R U R S U R S U R S _002: NOP 0
M0.2 _002 A124.1 A124.0 E124.0 M0.2 M0.1 E124.2 M0.2 M0.0 E124.3 M0.2 M0.0
//Girar motor izda. y encender lámpara Gi //Anular giro dcha. y apagar lámpara Gd //Si alguien pulsa botón Gd, //anular la etapa actual //y activar la etapa “1”. //Si alguien pulsa botón Pa, //anular la etapa actual //y activar la etapa “0”. //Si ha saltado el relé térmico, //anular la etapa actual //y activar la etapa “0”.
En cuanto a las instrucciones que pondremos en OB100, serán: SET S R R
M0.0 M0.1 M0.2
92
Temporizadores y contadores
Capítulo 9
CAPÍTULO 9
Índice
Temporizadores y contadores 9.1 Qué es un temporizador En general llamaremos temporizador a cualquier dispositivo sea cual sea su naturaleza, capaz de permanecer en un estado durante un tiempo prefijado a partir de un evento concreto. En la vida diaria hacemos uso de temporizadores diferentes. Pensemos por ejemplo, cuando introducimos un alimento en un horno de microondas para calentarlo. El tiempo de calentamiento lo prefijamos con un mando incorporado en el aparato. O cuando ponemos un despertador por la noche para que nos despierte al día siguiente. Lo que hacemos en ambos casos es usar el microondas o el despertador como temporizador, etc. Si en los ejemplos anteriores los temporizadores eran piezas relativamente grandes, y que en cualquier caso podíamos tocar con las manos, en el caso de los autómatas, los temporizadores están constituidos por partes de la memoria RAM, como ya vimos en el apartado 5.2, conjuntamente con una forma especial de trabajar un oscilador maestro que existe en el interior del autómata. Son por tanto elementos electrónicos muy pequeños integrados en la CPU del autómata y cuyas características de funcionamiento son programables por el usuario. En cuanto al número de temporizadores que un autómata puede tener, depende del modelo elegido, tal y como ya vimos en la tabla del apartado 5.2. Desde el punto de vista de STEP-7, los temporizadores los podemos imaginar de la siguiente forma:
Tnº “BitDeDisparo”
S
“S5TIME”
TW
“BitDeReset”
R
Q
“BirReceptor”
DUAL
“WordDestino” (Binario)
DEZ
“WordDestino” (BCD)
Fig.9.1
Donde las flechas indican el sentido de entrada o salida de la información. Podemos resumir en una tabla el significado de cada elemento, de la siguiente forma:
93
Temporizadores y contadores
Capítulo 9
“BitDeDisparo” “S5TIME” “Tnº” “BitDeReset”
Es el Bit que pone en marcha el temporizador Es el tiempo que se carga en el temporizador Es el nombre del temporizador Es el Bit que pone a cero el temporizador Es el Bit que asignamos para recoger la información Es el Word que asignamos para recoger la información en formato Binario Es el Word que asignamos para recoger la información en formato BCD
“BitReceptor” “WordDestino”(Binario) “WordDestino”(BCD)
Aunque la tabla muestra con claridad el significado de cada elemento, podemos decir que el temporizador es como una “caja” a la que hay que suministrarle una información que es la representada por las flechas entrantes a la “caja”, y como consecuencia de esta información entrante, nos suministra una información saliente, representada por las flechas que salen de la “caja”. Los temporizadores se representan por la letra T mayúscula, seguida por un número que puede estar comprendido entre “0” y el número máximo que indique la tabla del apartado 5.2. Si bien en teoría es posible usar un temporizador en distintas partes del programa, en la práctica se recomienda usar un temporizador diferente cada vez que debamos utilizar uno. En realidad, esta es una política que el programador debería tener siempre presente, no solamente para los temporizadores sino en general cuando tenga que hacer uso de otros elementos del autómata, tales como memoria de marcas o contadores, que veremos posteriormente. Así pues, no olvide que una buena política de programación es: NO USAR LOS RECURSOS MÁS DE UNA VEZ
Volviendo a los temporizadores, hemos llamado “BitDeDisparo” al Bit que usemos para poner en marcha el temporizador, pero antes previamente deberemos haber introducido el tiempo en el mismo. Este tiempo, en el dibujo anterior viene representado por “S5TIME”, y esta expresión además de decirnos que debemos introducir un tiempo, nos dice que hemos de hacerlo precisamente en el formato usado por STEP-7 que se llama así: “S5TIME” El formato de tiempo “S5TIME” tiene el siguiente aspecto: S5T#aHbbMccSdddMS Siendo:
a bb cc ddd
= = = =
Horas Minutos Segundos Milisegundos
En este formato de tiempo “S5TIME”, el tiempo máximo que podemos manejar es de dos (2) horas, cuarenta y seis (46) minutos y treinta (30) segundos, o lo que es lo mismo, 9990 segundos. Veamos como representaríamos en formato “S5TIME”, una (1) hora, catorce (14) minutos y diez (10) segundos: S5T#1H14M10S 94
Temporizadores y contadores
O como representaríamos 1,5 segundos:
Capítulo 9
S5T#1S500MS
O 347 segundos: S5T#5M47S Es importante señalar, que STEP-7 admite que el usuario introduzca el tiempo en la unidad que desee, pues posteriormente STEP-7 nos lo cambia a las unidades convenientes. Así, en el ejemplo anterior, al escribir S5T#347S, STEP-7 nos lo cambia por S5T#5M47S. El “BitDeReset” como ya hemos dicho, es el Bit que pone a cero el temporizador. Esto quiere decir que si el temporizador aun no había agotado el tiempo que le habíamos introducido, con este Bit lo que hacemos es poner a “0” el tiempo restante (si es que todavía no es cero). El “BitReceptor” es el nombre que hemos dado al Bit que el programador designa para recibir el estado lógico (“1” o “0”) del temporizador en un momento determinado. Si la salida lógica del temporizador (salida Q) permanece a “1” mientras está temporizando, esta misma salida se pondrá a “0” cuando haya dejado de hacerlo. Si el programador está interesado en conocer el tiempo restante que aún le falta al temporizador para terminar, puede hacerlo por la salida DUAL, por donde el temporizador nos suministra este tiempo restante en formato Binario ocupando una palabra de dieciséis (16) Bits (un Word). La salida DEZ hace lo mismo que la DUAL, sólo que el tiempo restante hasta terminar la temporización nos lo suministra en formato BCD, ocupando una palabra de dieciséis (16) Bits (un Word). Para resumir lo dicho hasta aquí, pongamos un ejemplo que concrete lo que se ha explicado. Imaginemos que hemos de usar un temporizador. Elegiremos por ejemplo el temporizador T0 suponiendo que esté libre y no lo hayamos usado anteriormente. Deseamos cargar un tiempo de un (1) minuto y dieciséis (16) segundos en el temporizador, para lo que haremos uso del formato “S5TIME” siguiente: S5T#1M16S Deseamos que el temporizador se ponga en marcha cuando la entrada E124.0 pase de “0” a “1”, por lo que nuestro “BitDeDisparo” será en este caso precisamente E124.0. Tenemos previsto poner a cero el temporizador cuando la entrada E124.1 pase de “0” a “1”, por lo que nuestro “BitDeReset” será en este caso E124.1. Deseamos saber si el temporizador aún está temporizando o ha terminado ya, para lo que designamos por ejemplo el Bit M3.5 para recoger la salida Q del temporizador (después veremos como se hace), suponiendo que este Bit esté libre y no se haya usado con anterioridad. Si queremos saber el tiempo restante que aún queda por temporizar en formato Binario, el resultado podemos almacenarlo por ejemplo en la Word MW10 (suponiendo que esté libre) y si finalmente queremos almacenar este mismo tiempo pero en formato BCD, podemos hacerlo por ejemplo en la Word MW12, también suponiendo que esta palabra esté libre.
95
Temporizadores y contadores
Capítulo 9
Bien, hasta aquí tenemos idea de cómo funcionan los temporizadores en STEP-7, pero nos preguntamos cómo podemos hacerlo para introducir esta información en el autómata. Las ideas anteriores expresadas en lenguaje AWL serían así: U L Sx
“BitDeDisparo” “S5TIME” “Tnº”
Bit que pone en marcha el temporizador Tiempo que se carga en el temporizador Tipo y nombre del temporizador
U R
“BitDeReset” “Tnº”
Bit que pone a cero el temporizador Nombre del temporizador
L T
“Tnº” “WordDestino”(Binario)
Nombre del temporizador Word que asignamos para recoger la información en formato Binario
LC T
“Tnº” “WordDestino”(BCD)
Nombre del temporizador Word que asignamos para recoger la información en formato BCD
U =
“Tnº” “BitReceptor”
Nombre del temporizador Bit que asignamos para recoger la información
Donde no es obligatorio tener que escribir todas las operaciones que se indican anteriormente para poder trabajar con temporizadores. Por ejemplo, si lo único que deseamos es poner en marcha un temporizador y ver su estado reflejado en un Bit de marca, nos basta con usar las tres (3) primeras operaciones para poner en marcha el temporizador, y las dos (2) últimas para asignar el estado del temporizador al Bit de marca que deseemos. 9.2 Modelos de temporizadores STEP-7 tiene cinco (5) modelos diferentes de temporizadores que podemos usar según nuestras preferencias o según el problema que estemos resolviendo. Veamos qué modelos son estos. Modelo S-EVERZ (SE): El modelo S-EVERZ se representa con las letras SE y es un temporizador con retardo a la conexión. Gráficamente su comportamiento se puede representar así:
BitDeDisparo
Ejemplo:
SalidaLogica T
U L SE U =
E124.0 S5T#5S T0 T0 A124.0
Y expresado con palabras diríamos que este temporizador se activa un tiempo T después que BitDeDisparo pase de “0” a “1”, pero cuando BitDeDisparo cae a “0”, el temporizador también cae a “0”. Obsérvese como el temporizador no llega a activarse si la duración de BitDeDisparo no es mayor que T. 96
Temporizadores y contadores
Capítulo 9
Modelo S-AVERZ (SA): El modelo S-AVERZ se representa con las letras SA y es un temporizador con retardo a la desconexión. Gráficamente su comportamiento se puede representar así: Ejemplo:
BitDeDisparo SalidaLogica T
T
U L SA U =
E124.0 S5T#5S T1 T1 A124.2
Con palabras diremos que este temporizador se activa inmediatamente después que BitDeDisparo se pone a “1”, y que permanece activo un tiempo T después que BitDeDisparo cae a “0”. Modelo S-IMPULS (SI): El modelo S-IMPULS se representa con las letras SI y es un temporizador normal de impulso. Gráficamente su comportamiento se puede representar así: Ejemplo:
BitDeDisparo SalidaLogica T
T
U L SI U =
E124.2 S5T#5S T2 T2 A124.4
Con palabras diremos que el temporizador se activa inmediatamente después que BitDeDisparo pasa de “0” a “1”, y después permanece en “1” un tiempo T, después cae a “0”, excepto si BitDeDisparo ha caído a “0” antes que haya transcurrido el tiempo T, en ese caso el temporizador también cae a “0”. Modelo S-VIMP (SV): El modelo S-VIMP se representa con las letras SV y es un temporizador de impulso prolongado a la conexión. Gráficamente su comportamiento se puede representar así: BitDeDisparo
Ejemplo:
SalidaLogica T
T
U L SV U =
E124.5 S5T#5S T7 T7 A124.6
Con palabras diremos que el temporizador se activa inmediatamente después que BitDeDisparo pasa de “0” a “1” y permanece en “1” un tiempo T, después cae a “0” nuevamente. Obsérvese como aquí el tiempo que el temporizador está en “1” es independiente de la bajada a “0” de BitDeDisparo. Modelo S-SEVERZ (SS): El modelo S-SEVERZ se representa con las letras SS y es un temporizador de impulso prolongado a la desconexión.
97
Temporizadores y contadores
Capítulo 9
Gráficamente su comportamiento se puede representar así: BitDeDisparo BitDeReset SalidaLogica T
T
Aquí el temporizador se pone a “1” un tiempo T después que BitDeDisparo pase de “0” a “1” y cae a “0” si BitDeReset se pone a “1”. Veamos un ejemplo que resume lo que hemos dicho sobre temporizadores. Imaginemos que se desea encender durante 5 segundos una lámpara piloto después de accionar un pulsador. Si el pulsador lo conectamos a la entrada E124.0 y la lámpara a la salida A124.0, las operaciones serían las siguientes: U L SV
E124.0 S5T#5S T0
U =
T0 A124.0
//E124.0 es aquí BitDeDisparo //Cargamos 5 segundos //y los depositamos en el temporizador T0, //que hemos definido del tipo SV. //la salida lógica de T0 se la asignamos //a A124.0
Obsérvese como en este ejemplo tan sencillo (normalmente los casos reales también son sencillos), nos ha bastado con cinco (5) líneas de operaciones. La explicación de este ejemplo es la siguiente. Al accionar el pulsador, la entrada E124.0 pasa de “0” a “1” e inmediatamente lo hace también la salida A124.0 ya que es un reflejo directo de la salida lógica del temporizador. Por ser un temporizador del tipo SV, la duración de la salida sólo depende del tiempo que hayamos cargado en el mismo, por lo que tanto si el pulsador está o no está accionado, la salida permanecerá 5 segundos a “1” y después caerá a “0”. 9.3 Formato abierto En el apartado 8.5 vimos lo que llamábamos el formato cerrado de representación en lenguaje AWL de las etapas de Grafcet. Este formato es aplicable en general a todo tipo de operaciones y siempre que tengamos que traducir una etapa Grafcet a lenguaje AWL, emplearemos el formato cerrado. Sin embargo, en STEP-7 hay algunas operaciones tales como las que hacen uso de temporizadores (y las que usan contadores), que no admiten el formato cerrado que hemos visto anteriormente y necesitamos usar un formato distinto. Este nuevo formato, que llamaremos formato abierto, se define de acuerdo con la siguiente plantilla:
98
Temporizadores y contadores
Capítulo 9
U “BitDeEtapa” Tarea 1 Tarea 2 Cuerpo de la etapa --U “BitDeEtapa” Si la receptividad de la transición asociada a la etapa es cierta, anular la etapa actual y activar la siguiente. Esto es, en la construcción del formato abierto, anteponemos la operación “U BitDeEtapa” a cualquier operación que debamos hacer posteriormente. Veamos un ejemplo que resume lo que hemos dicho hasta aquí. Ejemplo: Se trata de activar un temporizador el que deseamos que esté 3 seg. activo a partir de su puesta en funcionamiento. M0.0 Hacer T0 = 3 seg. (SV)
N T0=0
Fig.9.2
Empecemos por explicar algunos aspectos nuevos que han aparecido en esta etapa Grafcet. En primer lugar, la tarea a realizar no es poner a “1” un Bit, sino cargar un temporizador con 3 segundos para que éste permanezca a “1” durante este tiempo y que este comportamiento sea independiente de cualquier otra circunstancia. Según esto, el temporizador lo elegiremos del tipo SV y lo anotaremos entre paréntesis para tenerlo en cuenta después cuando tengamos que traducir el dibujo Grafcet a operaciones AWL. En cuanto poner T0=0 en la transición, equivale a decir que ya han pasado 3 seg. desde que comenzó la etapa. Por tanto, la etapa Grafcet anterior en conjunto significa que debemos esperar en esta etapa 3 segundos antes de pasar a la siguiente. Si aplicamos lo que ya hemos dicho sobre formato abierto, pondremos: U L SV
M0.0 S5T#3s T0
U UN R S
M0.0 T0 M0.0 M0.1
Obsérvese como en el formato abierto se antepone la operación “U operaciones. 99
M0.0” al resto de las
Temporizadores y contadores
Capítulo 9
Ejercicio 1
PA (Pulsador de activación)
Entradas E124.0
Salidas
PA (Pulsador de activación)
A124.0
Salida 1
A124.1
Salida 2
G1: Esperar
0
¿PA? Esperar 5 seg. Salida 1 = ON
1
¿Han pasado 5 seg? Esperar 10 seg. Salida 2 = ON
2
¿Han pasado 10 seg? 0
100
Temporizadores y contadores
Capítulo 9
M0.0
G2:
Esperar
0 E124.0=1 M0.1
T0=5 seg (SV) A124.0 = T0
1 T0=0 M0.2
T1=10 seg (SV) A124.1 = T1
2 T1=0 0
Y la traducción a operaciones AWL en formato abierto será: U U R S
M0.0 E124.0 M0.0 M0.1
//Si estamos en la etapa “0”, //y E124.0 es “1”, //anular la etapa actual “0” //y activar la siguiente “1”.
U L SV
M0.1 S5T#5S T0
//Si estamos en la etapa “1”, //cargar 5 segundos //y depositarlos en T0 que se define del tipo SV.
U U =
M0.1 T0 A124.0
//Si estamos en la etapa “1” //asignar el estado lógico de T0 //a A124.0
U UN R S
M0.1 T0 M0.1 M0.2
//Si estamos en la etapa “1” //y T0 esta a “0” (ya ha temporizado), //anular etapa actual “1” //y activar la siguiente “2”.
U L SV
M0.2 S5T#10S T1
//Si estamos en la etapa “2” //cargar 10 segundos //y depositarlos en T1 que se define del tipo SV.
U U =
M0.2 T1 A124.1
//Si estamos en la etapa “2” //asignar el estado lógico de T1 //a A124.1
U UN R S
M0.2 T1 M0.2 M0.0
//Si estamos en la etapa “2” //y T1 esta a “0” (ya ha temporizado), //anular etapa actual “2” //y activar la siguiente “0”.
Pongamos ahora el OB100: SET S M0.0 R M0.1 R
M0.2
El lector puede comprobar ahora este programa introduciéndolo en el autómata y viendo como las salidas A124.0 y A124.1 evolucionan de acuerdo a lo previsto. 101
Temporizadores y contadores
Capítulo 9
Ejercicio 2
Rojo Ámbar Verde
Rojo Verde
Entradas PV (Pulsa verde)
E124.0
G1:
A124.0 A124.1 A124.2 A124.3 A124.4
Salidas Verde coches Ámbar coches Rojo coches Verde peatones Rojo peatones
G2:
0
Encender verde coches Apagar ámbar coches Apagar rojo coches Encender rojo peatones Apagar verde peatones
0
E124.0=1
¿PA?
1
Apagar verde coches Encender ámbar coches Apagar rojo coches Encender rojo peatones Apagar verde peatones Esperar 3 seg.
A124.0=0 A124.1=1 A124.2=0 A124.3=0 A124.4=1 T0=3 seg (SV)
M0.1 1
T0=0
¿Han pasado 3 seg?
2
A124.0=1 A124.1=0 A124.2=0 hes A124.3=0 A124.4=1
M0.0
Apagar verde coches Apagar ámbar coches Encender rojo coches Apagar rojo peatones Encender verde peatones Esperar 6 seg.
M0.2 2
A124.0=0 A124.1=0 A124.2=1 A124.3=1 A124.4=0 T1=6 seg (SV) T1=0
¿Han pasado 6 seg? 0
0 102
Temporizadores y contadores
Capítulo 9
Programación en lenguaje AWL del bloque OB1: U SPBN S R R R S U R S _000: NOP 0
M0.0 _000 A124.0 A124.1 A124.2 A124.3 A124.4 E124.0 M0.0 M0.1
//Si M0.0 es “1”, //ejecutar las operaciones que siguen. //poner a “1” la salida A124.0, //poner a “0” la salida A124.1, //poner a “0” la salida A124.2, //poner a “0” la salida A124.3, //poner a “1” la salida A124.4, //Si botón PV está pulsado //anular la etapa actual // y pasar a la etapa “1”.
U R S R R S
M0.1 A124.0 A124.1 A124.2 A124.3 A124.4
//Si M0.1 es “1”, //poner a “0” la salida A124.0, //poner a “1” la salida A124.1, //poner a “0” la salida A124.2, //poner a “0” la salida A124.3, //poner a “1” la salida A124.4,
U L SV
M0.1 S5T#3S T0
//Si M0.1 es “1”, //cargar 3 segundos, //y depositarlos en T0, que lo definimos del tipo SV.
U UN R S
M0.1 T0 M0.1 M0.2
//Si M0.1 es “1” //y T0 esta a “0” (ya ha temporizado) //anular etapa actual “1” //y activar etapa “2”.
U R R S S R
M0.2 A124.0 A124.1 A124.2 A124.3 A124.4
//Si M0.2 es “1” //poner a “0” la salida A124.0, //poner a “0” la salida A124.1, //poner a “1” la salida A124.2, //poner a “1” la salida A124.3, //poner a “0” la salida A124.4,
U L SV
M0.2 S5T#6S T1
//Si M0.2 es “1” //cargar 6 segundos, //y depositarlos en T1, que lo definimos del tipo SV.
U UN R S
M0.2 T1 M0.2 M0.0
//Si M0.2 es “1” //y T1 es “0” (ya ha temporizado), //anular etapa actual “2” //y activar etapa “0”.
Programación en lenguaje AWL del bloque OB100: SET S R R
M0.0 M0.1 M0.2
//Hacer RLO=1 //Si RLO=1, hacer M0.0=1 //Si RLO=1, hacer M0.1=0 //Si RLO=1, hacer M0.2=0
103
Temporizadores y contadores
Capítulo 9
9.4 Contadores El contador es también una herramienta interesante que nos permite resolver problemas complejos de programación allí donde es necesario llevar el contaje de una variable entera. Pensemos por ejemplo en cajas que deben contener un numero exacto de piezas menores (tornillos, tuercas, arandelas, etc.), o en procesos cuyo funcionamiento se basa en el contaje de unidades discretas, tales como los coches que puede haber en un aparcamiento o el numero de personas que han entrado en un local, etc. El uso de contadores nos permite resolver de forma inteligente problemas que nos encontramos en la resolución real de problemas complejos, por lo que conviene conocerlos con detalle. Al igual que los temporizadores los representábamos con un rectángulo que tenía entradas y salidas, también aquí podemos hacer lo mismo con los contadores: Znº “BitIncrementar”
ZV
“BitDecrementar”
ZR
“BitDeCarga” “NumeroACargar” “BitDeReset”
Q
S ZW
“BitReceptor”
DUAL
“WordDestino” (Binario)
DEZ
“WordDestino” (BCD)
R
Aquí el sentido de las flechas indica si la información debe proporcionarla el programador (flechas entrantes) o si es el contador el que nos proporciona información (flechas salientes). Si resumimos en una tabla los valores que hemos puesto en el dibujo, tendremos: “Znº” “BitIncrementar” “BitDecrementar” “BitDeCarga” “NúmeroACargar” “BitDeReset” “BitReceptor” “WordDestino”(Binario) “WordDestino”(BCD)
Es el nombre del contador Es el Bit que incrementa el contador Es el Bit que decrementa el contador Es el Bit que carga en el contador “NúmeroACargar” Es el número que deseamos cargar en el contador Es el Bit que pone a cero la cantidad que aún quede en el contador Es el Bit que recibe el estado “1” o “0” del contador. Es el Word que asignamos para recoger en formato Binario el número que aún quede en el contador. Es el Word que asignamos para recoger en formato BCD el número que aún quede en el contador.
104
Temporizadores y contadores
Capítulo 9
Los contadores se representan con la letra “Z” mayúscula seguida de un número que puede estar comprendido entre “0” y el número máximo que se indica en la tabla del apartado 5.2. También aquí aconsejamos al lector que use únicamente una sola vez cada contador, dentro de la política general de NO USAR LOS RECURSOS MÁS DE UNA VEZ. El uso y funcionamiento de los contadores es simple e intuitivo. Se trata (o nos las podemos imaginar) de cajas que sirven para contar cantidades enteras. Una vez definido el contador que vamos a emplear, debemos cargarlo inicialmente con un número que será el número que posteriormente incrementaremos o decrementaremos. Para hacer esto, además de introducir el número a cargar por la entrada ZW, deberemos hacer entrar por la entrada S el flanco positivo del “BitDeCarga”. Si no cargamos el contador con ninguna cantidad inicial, el contador parte con la cantidad “0”, por lo que el contador inicialmente únicamente admitirá ordenes de incrementar, ya que no es posible decrementar un contador por debajo de “0”. Una vez cargado un número inicial, el contador se incrementará una unidad, cada vez que entre un flanco positivo por la entrada ZV del “BitIncrementar”. Mientras el contador almacene un número que no sea “0”, la salida lógica Q del contador será “1”. Sin embargo, si por la entrada ZR entran flancos positivos del “BitDecrementar”, por cada flanco positivo que entre, disminuirá en una unidad el contador, y cuando su valor llegue a “0”, por la salida Q obtendremos el valor “0”. Si nos interesa poner a “0” el valor de un contador, deberemos introducir un flanco positivo por la entrada R, y esto hará que el contador se ponga a “0”. La salida Q ya hemos dicho que permanece a “1” si el valor del contador no es “0”, y pasará a ser “0” si el contenido del contador es también “0”. En cuanto a la salida DUAL, por aquí el contador nos suministra una Word con el valor Binario del valor actual que tenga el contador, mientras que por la salida DEZ nos suministra la misma información, pero en formato BCD. Lo expresado anteriormente de forma gráfica, podemos expresarlo también en lenguaje AWL de la siguiente manera: U ZV
“BitIncrementar” “Znº”
Bit que incrementa el contador Modo de funcionamiento y nombre del contador
U ZR
“BitDecrementar” “Znº”
Bit que decrementa el contador
U L S
“BitDeCarga” C#NNN “Znº”
Bit que carga el número NNN en el contador Carga del número NNN Orden de cargar el número NNN en contador
U R
“BitDeReset” “Znº”
El “BitDeReset” pone a “0” el contador. Orden de poner a “0” el contador de nombre “Znº”.
L T
“Znº” “WordDestino” (Binario)
Carga el valor residual del contador en formato binario y lo transfiere a “WordDestino”
LC T
“Znº” “WordDestino”
Carga el valor residual del contador en formato BCD y lo transfiere a “WordDestino”.
U =
“Znº” “BitReceptor”
El valor lógico del contador, se lo asigna a “BirReceptor”.
Modo de funcionamiento y nombre del contador
105
Temporizadores y contadores
Capítulo 9
Ejercicio 3 Se tiene una cinta transportadora por donde circulan pequeñas piezas metálicas, que van cayendo a una caja que está esperando en la parte inferior. La cinta la gobierna un motor trifásico. Una barrera fotoeléctrica permite contar las piezas que van cayendo a la caja. Una vez en la caja han caído diez (10) piezas, la cinta se para. En ese momento debe encenderse una lámpara piloto anunciando que la caja está llena. Cuando esto ocurre, un empleado/a retira la caja llena y coloca otra vacía manualmente, tras esto oprime un pulsador BE y el proceso vuelve a empezar.
Barrera fotoeléctrica
Pulsador BE
Caja llena
Tabla de entradas/salidas: Entradas E124.0 Pulsador BE E124.1 Barrera fotoeléctrica
Salidas A124.0 Hacia contactor de motor trifásico A124.1 Hacia lámpara “Caja llena”
106
Temporizadores y contadores
Capítulo 9
G1: Poner contador a 10
0
¿Pulsador BE?
1
Conectar motor Apagar lámpara Decrementar contador cada vez que pase pieza
¿Han caído 10 piezas? Apagar motor Encender lámpara
2 =1
0
G2:
2 M0.0 Z0= 10
0
E124.0=1 M0.1 1 C
A124.0=1 A124.1=0
Impulso procedente de barrera fotoeléctrica Z0=Z0-1
Z0=0 M0.2
A124.0=0 A124.1=1
2 =1
0
Empezaremos por explicar el funcionamiento del Grafcet G1. 107
Temporizadores y contadores
Capítulo 9
El proceso está a la espera de que alguien pulse el botón BE. Mientras tanto, el proceso permanece en la etapa “0”. En esta etapa, la tarea a realizar consiste en cargar un contador con el valor diez (10). Si alguien pulsa BE, el proceso pasa a la etapa “1”, donde las tareas a realizar son: Poner en marcha el motor de la cinta, apagar la lámpara que indica que la caja está llena y decrementar el contador cada vez que la barrera fotoeléctrica detecte que ha caído una pieza en la caja. En la etapa “1” se debe permanecer, hasta que se hayan contado diez (10) piezas. Una vez que se hayan contado diez (10) piezas, el proceso pasa a la etapa “2” donde se da la orden de parar la cinta transportadora y de encender la lámpara que indica que la caja está llena, tras lo que, sin esperar nada más, ya que la transición siempre es cierta, pasa nuevamente a la etapa “0”, donde el ciclo vuelve a empezar. Una vez entendido el funcionamiento general del proceso, observamos como hay algunos conceptos nuevos que no habíamos visto hasta ahora. Por ejemplo, en la etapa “1” de G2, hemos puesto tres (3) tareas a realizar en esta etapa. Las dos (2) primeras ya las conocemos, pues se trata simplemente de poner las salidas a “1” o a “0” según convenga, pero la tercera tarea dice que debemos decrementar el contador cada vez que la barrera fotoeléctrica detecte que ha caído una pieza en la caja. Esto es, no se trata de decrementar el contador simplemente porque estemos en la etapa “1”, sino que además de estar en la etapa “1” ponemos como condición que la barrera fotoeléctrica detecte que cae pieza. Esta idea de condicionar una tarea a una circunstancia (a un evento), en Grafcet se representa escribiendo la letra “C” mayúscula en el rectángulo que describe la tarea a realizar, y además por la parte superior del rectángulo, por encima de un trazo vertical, se pone el evento o circunstancia que condiciona la tarea. Observamos también como la transición de la etapa “2” siempre es cierta, y esto se representa con el símbolo “=1”. Sólo nos queda ahora, escribir las operaciones a realizar en lenguaje AWL, tomando como referencia el Grafcet G2 anterior:
Etapa 0
U L S
M0.0 C#10 Z0
//Si M0.0 es “1”, //cargar el número diez (10) //y depositarlo en Z0.
U U R S
M0.0 E124.0 M0.0 M0.1
//Si M0.0 es “1”, //y E124.0 es “1” (pulsador BE), //anular etapa actual “0” //y activar etapa “1”.
108
Temporizadores y contadores
Etapa 1
Etapa 2
Capítulo 9
U S R
M0.1 A124.0 A124.1
//Si M0.1 es “1”, //poner en marcha motor cinta //y apagar lámpara de caja llena.
U U ZR
M0.1 E124.1 Z0
//Si M0.1 es “1”, //y ha caído una pieza en la caja //decrementar Z0.
U UN R S
M0.1 Z0 M0.1 M0.2
//Si M0.1 es “1”, //y Z0 está a “0”, //anular etapa actual “1” //y activar la siguiente “2”.
U SPBN
M0.2 _002
//Si M0.2 es “1”, //ejecutar las operaciones siguientes:
A124.1 A124.0
//encender lámpara, //parar cinta,
M0.2 M0.0
//anular la etapa actual “2” // y pasar a la etapa “0”.
S R SET R S _002: NOP 0
Obsérvese como las etapas “0” y “1” se han escrito en formato abierto, por cuanto estamos trabajando con contadores, que deben tratarse en este formato. En cambio la etapa “2” que no contiene ni temporizadores ni contadores, la hemos escrito en formato cerrado. Nos falta ahora OB100: SET S M0.0 R M0.1 R M0.2 A la vista de este ejemplo y de otros anteriores que ya hemos visto, quizás el lector se pregunte si no seria posible hacer uso de un único formato (cerrado o abierto) para traducir todas las etapas de Grafcet a lenguaje AWL. Por la misma naturaleza de las operaciones de STEP-7, la respuesta es que esto NO es posible.
Ejercicio 4 Tenemos una caja metálica que funciona como una hucha, y que está dotada de los mecanismos que se indican en el dibujo:
Pulsador BE
109
Temporizadores y contadores
Capítulo 9
Un mecanismo de entrada y otro de salida, permiten por una parte introducir o extraer monedas y por otra parte informan al autómata que se han introducido o extraído monedas. Se dispone de un pulsador BE que al ser pulsado inicialmente, carga en la hucha (y de forma transparente para este caso) diez (10) monedas de 1 . Se desea diseñar un programa que ponga a “1” todas las salidas del Byte AB124, cuando en el interior de la hucha no haya ninguna moneda. Tabla de entradas/salidas: Entradas E124.0 Pulsador BE E124.1 Entra moneda E124.2 Sale moneda
Salidas AB124 No hay monedas
G1: Poner contador a 10
0
¿Botón empezar?
1
Apagar salidas de AB124
¿Ha salido 1 euro?
¿Ha entrado 1 euro? Incrementar contador
2
3
=1
1
Decrementar contador
¿Hay monedas?
¿No hay monedas? Encender salidas de AB124
4
1
=1 0
110
Temporizadores y contadores
G2:
Capítulo 9
4 M0.0 0
2,3
Z0=10
E124.0=1 M0.1 1
AB124=0
E124.1=1
M0.2
Z0=Z0+1
2
3
=1
1
E124.2=1
M0.3
Z0=Z0-1
Z0>0 1
Z0=0 AB124=”1”
4
=1 0
Prácticamente todo cuanto aparece en este Grafcet ya nos es familiar por haberlo visto en otros anteriores, así pues pasamos a comentar directamente el funcionamiento del mismo. Inicialmente el proceso se encuentra en la etapa “0”, donde la única tarea que tiene que hacer en esta etapa es cargar un contador con el número diez (10). Si alguien pulsa el botón BE, entonces el proceso pasa a la etapa “1”, donde la tarea encomendada es poner a “0” todas las salidas del Byte AB124. En esta etapa el proceso se queda esperando a que alguien introduzca o extraiga una moneda. Si por ejemplo se introduce una moneda, el proceso pasa a la etapa “2” donde la tarea consiste en incrementar el contador, y una vez hecho esto y sin más comprobaciones (ya que la transición en la etapa “2” siempre es cierta) pasa automáticamente a la etapa “1” donde vuelve a quedar a la espera. Si por el contrario se ha extraído una moneda, entonces el proceso pasa a la etapa “3” donde la tarea encomendada es decrementar el contador en una unidad. Una vez hecho esto, puede ocurrir que aún queden monedas en la hucha o bien que no quede ninguna moneda. En el primer caso, el proceso volverá a la etapa “1” quedando a la espera nuevamente, y en el segundo caso de que no quedasen más monedas, entonces el proceso entraría en la etapa “4” donde la tarea consiste en poner a “1” todas las salidas del Byte AB124, tras lo que, ya que la transición de la etapa “4” siempre es cierta, el proceso volvería a la etapa “0” y quedaría nuevamente a la espera.
111
Temporizadores y contadores
Capítulo 9
Nos queda ahora traducir a lenguaje AWL todo lo que está representado en G2 y que escribiremos directamente en OB1: U L S
M0.0 C#10 Z0
//Si M0.0 es “1”, //cargar el número diez (10) //y depositarlo en Z0.
U U R S
M0.0 E124.0 M0.0 M0.1
//Si M0.0 es “1”, //y E124.0 es “1” (pulsador BE), //anular etapa actual “0” //y activar etapa “1”.
U SPBN R R R R R R R R U R S U R S _001: NOP 0
M0.1 _001 A124.0 A124.1 A124.2 A124.3 A124.4 A124.5 A124.6 A124.7 E124.1 M0.1 M0.2 E124.2 M0.1 M0.3
//Si M0.1 es “1”, //realizar las siguientes acciones: //hacer A124.0=0 //hacer A124.1=0 //hacer A124.2=0 //hacer A124.3=0 //hacer A124.4=0 //hacer A124.5=0 //hacer A124.6=0 //hacer A124.7=0 //Si E124.1=1 (ha entrado 1 euro) //anular etapa actual “1” //y activar la etapa “2”. //Si E124.2=1 (se ha extraído 1 euro) //anular etapa actual “1” y //activar la etapa “3”.
U ZV
M0.2 Z0
//Si M0.2=1, //incrementar el contador Z0.
U R S
M0.2 M0.2 M0.1
//Si M0.2=1, //anular etapa actual “2”, //y activar la etapa “1”.
U ZR
M0.3 Z0
//Si M0.3=1, //decrementar Z0.
U U R S
M0.3 Z0 M0.3 M0.1
//Si M0.3=1, //y aun hay monedas (Z0>0), //anular la etapa actual “3” //y activar la etapa “1”.
U UN R S
M0.3 Z0 M0.3 M0.4
//Si M0.3=1, //y no quedan monedas (Z0=0), //anular etapa actual “3” //y activar etapa “4”.
Etapa 0
Etapa 1
Etapa 2
Etapa 3
112
Temporizadores y contadores
Etapa 4
U SPBN S S S S S S S S SET R S _004: NOP 0
Capítulo 9
M0.4 _004 A124.0 A124.1 A124.2 A124.3 A124.4 A124.5 A124.6 A124.7
//Si M0.4=1, //realizar las siguientes acciones: //hacer A124.0=1 //hacer A124.1=1 //hacer A124.2=1 //hacer A124.3=1 //hacer A124.4=1 //hacer A124.5=1 //hacer A124.6=1 //hacer A124.7=1
M0.4 M0.0
//anular etapa actual “4” //y activar etapa “0”.
En cuanto a OB100, no debemos olvidar poner también lo siguiente: SET S R R R
M0.0 M0.1 M0.2 M0.3
Con objeto de que quede activa únicamente la etapa “0” y todas las demás queden desactivadas cuando comience a ejecutarse el programa principal de OB1. NOTA: Al lector que ya tenga experiencia en programación de autómatas, puede parecerle extraño el empleo reiterativo de la operación “S” para poner a “1” ocho (8) Bits, cuando hay operaciones más simples que hacen lo mismo. Efectivamente esto es así, y si aquí no se ha hecho uso de estas operaciones, es por mantener un orden de aprendizaje y no distraer al lector en operaciones nuevas que de momento no son importantes. Así, el empleo de la operación SET en las etapas “2” y “4” aquí no es imprescindible hacerlo, pero se ha hecho por mantener el mismo esquema de programación en todas las etapas que tienen transiciones siempre ciertas.
113
Operaciones FP y FN
Capítulo 10
CAPÍTULO 10
Índice
Operaciones FP y FN 10.1
Operación FP
La operación “FP” detecta el flanco de subida de un BitDeEntrada. Para que funcione, hay que prestarle a esta instrucción un BitDeTrabajo. El resultado se refleja en RLO, que se hace “1” durante el scan actual. BitDeEntrada
RLO
Es “1” durante el scan actual La operación FP se escribe así: U FP
“BitDeEntrada” “BitDeTrabajo”
(1) (2) (3)
La líneas (1) y (2) testean constantemente si BitDeTrabajo pasa de “0” a “1”. Cuando esto ocurre, en la línea (3) y como resultado de las líneas (1) y (2), el Bit RLO valdrá “1” durante todo el scan actual. Posteriormente, en el siguiente scan, el Bit RLO caerá a “0”. Es importante entender esta mecánica de funcionamiento, y puesto que el Bit RLO no está presente en el programa de una manera explicita, deberemos tenerlo en cuenta mentalmente. 10.2
Operación FN
La operación FN detecta el flanco de bajada de un BitDeEntrada, haciendo que RLO permanezca a “1” durante el scan actual. BitDeEntrada RLO
La operación FN se escribe así: U FN
“BitDeEntrada” “BitDeTrabajo”
115
(1) (2) (3)
Operaciones FP y FN
Capítulo 10
Al igual que con FP, aquí en la línea (3) el Bit RLO permanecerá a “1” durante el scan actual, y ya que esto no se refleja explícitamente en el programa, deberemos tenerlo en cuenta mentalmente. Ejemplo: U FN S
“BitDeEntrada” “BitDeTrabajo” A124.0
(1) (2) (3)
Aquí la salida A124.0 pasará a ser “1” permanentemente, cuando BitDeEntrada pase de “1” a “0”. Esto se debe a que al estar haciendo uso de la operación FN, el Bit RLO valdrá “1” justo antes de ejecutarse la línea (3), y justo en el instante que BitDeEntrada pase de “1” a “0”. Ahora bien, ya que la operación “S” que está en la línea (3) se ejecuta únicamente si RLO vale “1”, en el instante en que RLO vale “1” coincidiendo con el flanco negativo de BitDeEntrada, en ese instante se ejecutará la línea (3) y A124.0 se pondrá a “1” permanentemente. BitDeEntrada RLO A124.0
10.3
Formato neutro
Las instrucciones FP y FN no pueden ejecutarse ni según el formato cerrado ni según el formato abierto. Que no puedan ejecutarse según el formato cerrado parece normal, ya que estas instrucciones necesitan refrescarse en cada ciclo de scan del autómata, y en un formato cerrado esto no es posible, ya que las operaciones que están comprendidas entre la operación “SPBN <meta>” y <meta:>, una vez que el BitDeEtapa ha pasado a ser “0”, quedan aisladas y no se ejecutan. Sin embargo no es tan evidente que tampoco puedan ejecutarse en un formato abierto y para ello lo mejor que podemos hacer es poner un ejemplo, para entender las razones. Tendremos: “BitDeEntrada” = E124.0 M0.0 PC
N =1
116
BitReceptor = M10.1
Operaciones FP y FN
Capítulo 10
Donde las letras “PC” (pulso condicionado) significan en este caso que “BitReceptor = M10.1” tendrá valor unitario durante un breve espacio de tiempo (forma de impulso), siempre y cuando “BitDeEntrada = E124.0” sea “1” en el transcurso de la etapa N. Las instrucciones AWL serán: U U FP =
M0.0 E124.0 M10.0 M10.1
Obsérvese que nuestra intención es que estando previamente el Bit M0.0 a “1”, aparezca entonces el flanco positivo en E124.0. Y efectivamente, si las cosas ocurren así, las instrucciones anteriores funcionan perfectamente y sin ningún problema. Ahora bien, pudiera ocurrir que fuera al revés, esto es, que estuviera previamente E124.0 a “1” y que entonces el Bit M0.0 pasase de “0” a “1”. Ocurriría entonces, que las instrucciones anteriores detectarían un flanco positivo, pero no sería el de E124.0 que es lo que deseamos, sino que sería el flanco positivo de M0.0. Así pues, ya que lo anterior es incierto (y por tanto peligroso), tenemos que reconocer que ni el formato cerrado ni el abierto nos permiten tratar adecuadamente estas instrucciones. Para resolver este dilema, emplearemos un nuevo tipo de etapa Grafcet que no haga uso del BitDeEtapa, de la siguiente manera: “BitDeEntrada” = E124.0 PC
N
BitReceptor = M10.1
=1
Las operaciones que asociaremos a esta etapa según lo dicho, serán: U FP =
E124.0 M10.0 M10.1
Estas etapas que no dependen de ningún BitDeEtapa las llamaremos etapas neutras, y su traducción en lenguaje AWL, formato neutro, para diferenciarlas del formato cerrado y formato abierto que ya hemos visto. Por no depender de ningún BitDeEtapa, se ejecutarán scan tras scan del autómata, y aunque estarán dentro de nuestro Grafcet, no se regirán por la mecánica que imponen los BitDeEtapa. Estas etapas las colocaremos preferentemente al principio de nuestro programa. Bit independiente Llamaremos Bit independiente al Bit que habiendo sido generado por otro Bit, podemos ponerlo a “0” o a “1” de manera permanente. U FP S
E 124.0 M0.0 M0.1 este es un Bit independiente
117
Operaciones FP y FN
Capítulo 10
Ejemplo: Se desea hacer A124.0 = 1 si E124.0 pasa de “0” a “1”, y A124.0 = 0 si E124.1 pasa de “0” a “1”. Entradas
Salidas
E124.0 Poner a “1” A124.0 E124.1 Poner a “0” A124.0
A124.0
G2:
1,2
E124.0 PC
10
M10.1
=1 E124.1 11
PC =1
M0.0 0
Esperar
E124.0↑ ≡ M10.1=1
M0.1
E124.1↑ ≡ M10.3=1
M0.2
A124.0=1
1
M10.3
A124.0=0
2
=1
=1
0
0
118
Operaciones FP y FN
Capítulo 10
Y las operaciones en lenguaje AWL serán: OB1: U FP =
E124.0 M10.0 M10.1
//Si E124.0 se hace “1”
U FP =
E124.1 M10.2 M10.3
//Si E124.1 se hace “1”
Etapa 0
U SPBN U R S U R S _000: NOP 0
M0.0 _000 M10.1 M0.0 M0.1 M10.3 M0.0 M0.2
//Si M0.0=1, //realizar las siguientes operaciones: //Si M10.1=1 //hacer M0.0=0 //y M0.1=1. //Si M10.3=1 //hacer M0.0=0 //y M0.2=1
Etapa 1
U SPBN S R S _001: NOP 0
M0.1 _001 A124.0 M0.1 M0.0
//Si M0.1=1, //realizar las siguientes operaciones: //hacer A124.0=1 //y M0.1=0 //y M0.0=1.
Etapa 2
U SPBN R R S _002: NOP 0
M0.2 _002 A124.0 M0.2 M0.0
//Si M0.2=1, //realizar las siguientes acciones: //hacer A124.0=0 //y M0.2=0 //y M0.0=1.
M0.0 M0.1 M0.2
//Hacer RLO=1 //Si RLO=1, hacer M0.0=1 //y M0.1=0 //y M0.2=0.
Etapa 10
Etapa 11
//M10.1 será “1” durante un scan
//M10.3 será “1” durante un scan
OB100: SET S R R
119
Operaciones de carga, transferencia y comparación
Capítulo 11
CAPÍTULO 11
Índice
Operaciones de carga, transferencia y comparación 11.1 Números enteros de dieciséis(16) Bits Por definición, un número entero de dieciséis(16) Bits, es aquel que en binario ocupa un registro de dieciséis (16) Bits. Así pues, y según lo anterior, el número de dieciséis (16) Bits más grande será el siguiente: 1111111111111111 Que corresponde al número en base diez (10): 65.535 Y el número más pequeño de dieciséis(16) Bits será lógicamente: 0 Por tanto, el mayor número entero es el “65.536” y el menor número entero es el “0”. Si queremos trabajar con números enteros de dieciséis(16) Bits, pero teniendo en cuenta su signo, entonces se reserva el Bit número quince (15) como Bit de signo, de tal forma que si este Bit es “0” se entiende que se trata de un entero positivo, y si es “1” se entiende que se trata de un entero negativo. Por ejemplo, según este convenio el número binario: 0111111111111111 Representa a número entero positivo “+32767”, y el número: 1000000000000000 Representa al número entero negativo “-32768”, siendo respectivamente el mayor y menor número entero de dieciséis (16) Bits con signo que podemos manejar (NOTA: la representación del número -32768 anterior, se ha hecho en complemento a dos (2), que se obtiene de conseguir primeramente el complemento a uno del número binario y sumarle después uno (1)). Obsérvese que si queremos trabajar con números enteros con signo que ocupen dieciséis (16) Bits, la capacidad de representar números enteros se divide prácticamente por dos (2) respecto al método que no tiene en cuenta el signo, por lo que el programador debe tener en cuenta esta circunstancia a la hora de trabajar con números enteros que ocupen dieciséis (16) Bits, pues según le demos valor de signo al Bit número quince (15), el número cambia completamente. 11.2 Números enteros de treinta y dos (32) Bits Con los números enteros de treinta y dos (32) Bits, podemos hacer lo mismo que antes con los de dieciséis (16), esto es, considerar que todos los Bits tienen valor numérico o bien darle al último Bit de la izquierda (Bit treinta y uno (31)) el valor de signo, con el mismo convenio de antes: Si es “0” diremos que es positivo y si es “1” diremos que es negativo.
121
Operaciones de carga, transferencia y comparación
Capítulo 11
Así pues, si tomamos los treinta y dos (32) Bits con valor numérico, el mayor número entero posible en este formato será: 11111111111111111111111111111111 Que corresponde al número decimal: 4.294.967.295 Que es el mayor número entero sin signo que podemos representar con treinta y dos (32) Bits. También aquí el menor número que podemos representar será lógicamente el: 0 Si al igual que antes reservamos el Bit treinta y uno (31), el que está más a la izquierda, como Bit de signo, entonces el mayor número entero con signo que podemos representar por este procedimiento es: 01111111111111111111111111111111 Que corresponde al número decimal: +2.147.483.647 Y el número negativo más pequeño será: 10000000000000000000000000000000 Que corresponde al número decimal: -2.147.483.648 (NOTA: Nuevamente esta representación del número entero con signo de treinta y dos (32) Bits, corresponde a la representación en complemento a dos (2) del número binario original, que se obtiene primeramente consiguiendo el complemento a uno (1) del número binario original, donde simplemente se cambian los unos por ceros y viceversa, y después se le suma uno (1)). 11.3 Números en coma flotante de treinta y dos (32) Bits STEP-7 emplea treinta y dos (32) Bits para trabajar con números en coma flotante, según el siguiente reparto (norma ANSI/IEEE Standard 754-1985): Veintitrés (23) Bits para la mantisa = m Ocho (8) Bits para el exponente = e Un (1) Bit par el signo de la mantisa = S La fórmula que se emplea para formar el número, conocidos los valores anteriores, es: Número = (1,m) ∗ 2 elevado (e-Bias) Siendo:
1 < e < 254 Bias = 127
122
Operaciones de carga, transferencia y comparación
Capítulo 11
Según lo anterior, el número más bajo posible expresado en coma flotante será: Número en coma flotante más pequeño = (1,0) ∗ 2 elevado a (1-127) = 1,0 ∗ 2 elevado a (-126) = 1,175 495E-38 Y el número en coma flotante más grande será 2-2 elevado a (-23) ∗ 2 elevado a (254-127) = 22 elevado a (-23) ∗ 2 elevado a (+127) = 3,402 823E+38 Como resumen, diremos que según la norma ya mencionada ANSI/IEEE Standard 754-1985, son números validos negativos los comprendidos entre: -3,402823E+38
hasta
-1,175495E-38
Mientras que para números positivos son válidos los comprendidos entre: +1,175495E-38
hasta
+3,402823E+38
Incluyendo el número “0”. Como el lector ha podido apreciar, la definición de lo que se entiende por número en coma flotante en STEP-7, es compleja y difícil. Ahora bien, como regla práctica y como resumen práctico de lo dicho hasta aquí sobre números en coma flotante, sólo debe recordar algo muy sencillo, y es que a efectos de programación de autómatas SIEMENS, un número en coma flotante es aquel que simplemente tiene un punto decimal de separación entre la parte entera y sus decimales. Ejemplos: +3.7 -22.056 +3.14159264 etc. 11.4 Resumen práctico en cuanto a números enteros y en coma flotante De lo dicho hasta aquí el lector puede sacar en conclusión que todo esto de los números enteros y en coma flotante es realmente muy complejo y difícil de manejar. Realmente en la práctica todo esto es mucho más simple de lo que parece, sólo ha de recordar la diferencia entre números enteros con signo y sin signo (recuerde, el Bit de la izquierda), si son enteros de dieciséis (16) Bits o de treinta y dos (32). En cuanto a los números en coma flotante, las cosas aún son más sencillas, si ha de trabajar con números que tengan parte decimal (números con “coma” que en STEP-7 son números con “punto”), entonces no hay duda que debe trabajar en coma flotante. ¡Así de simple! 11.5 Operaciones L y T En el Capítulo 5 vimos que los acumuladores ACU1 y ACU2 son registros de treinta y dos (32) Bits y que estos a su vez pueden subdividirse en otros registros más pequeños.
123
Operaciones de carga, transferencia y comparación
Capítulo 11
Las operaciones L y T tienen precisamente mucho que ver con estos dos (2) acumuladores, en la forma que se explica a continuación. Imaginemos que queremos depositar en la posición de memoria MW10 el número 1324. Para realizar esta operación, dado que STEP-7 no dispone de ninguna operación en lenguaje AWL que permita depositar directamente el número 1324 en la palabra MW10, deberemos realizar esta operación en dos fases: 1º
Cargar el acumulador ACU1 con el número 1324
2º
Transferir una copia del contenido del acumulador ACU1 a la Word MW10.
Esto mismo escrito con operaciones AWL seria así: L T
1324 MW10
Donde aquí la operación “L ” permite cargar constantes enteras con signo que como mucho ocupen dieciséis (16) Bits, comprendidos entre +32767 y – 32768, ambos inclusive. La operación “T” (transferir), transfiere el contenido (realmente una copia del contenido) de ACU1 a la posición de memoria MW10. ¿Y si quisiéramos depositar en el Double Word MD14 un número entero mayor que +32767 o menor que -32768, como lo haríamos? Veamos la siguiente operación: L T
L#+850000 MD14
Observamos que la operación que carga el acumulador ACU1 ahora tiene la forma de: L
L#
Donde puede ser cualquier número entero con signo comprendido entre: +2.147.483.647
y
-2.147.483.648
ambos inclusive. Si se tienen que manipular números en coma flotante (números decimales), entonces el formato es el siguiente: L T
Donde es cualquier número en coma flotante comprendido entre: +1,175495E-38
hasta
+3,402823E+38
-1,175495E-38
hasta
-3,402823E+38
124
Operaciones de carga, transferencia y comparación
Capítulo 11
Incluyendo el número cero (0). Obsérvese que el registro al que transferimos el número en coma flotante, ha de ser de treinta y dos (32) Bits, para que la operación sea coherente, ya que un número en coma flotante, ocupa también treinta y dos (32) Bits. Además de permitirnos trabajar con números enteros con signo de dieciséis (16) Bits, treinta y dos (32) Bits, y números en coma flotante con signo que ocupan treinta y dos (32) Bits, STEP-7 nos permite trabajar con constantes enteras sin signo de ocho (8), dieciséis (16) y treinta y dos (32) Bits escritos en base hexadecimal, según las siguientes plantillas: L L L
B#16# W#16# DW#16#
Siendo cualquier número entero sin signo hexadecimal de dos (2) cifras comprendido entre 0 y FF. Así, siendo cualquier número entero sin signo hexadecimal de cuatro (4) cifras comprendido entre 0 y FFFF. Y también, siendo cualquier número entero sin signo hexadecimal de ocho (8) cifras comprendido entre 0 y FFFFFFFF. Pongamos como ejemplos los siguientes: L T
B#16#EF MB2
L T
W#16#FAFB MW30
L T
DW#16#A23FCE00 MD40
En el primer ejemplo, cargamos ACU1 con el número hexadecimal “EF” y después lo transferimos al Byte MB2. En el segundo ejemplo, cargamos ACU1 con el número hexadecimal “FAFB” y después lo transferimos al Word MW30, y finalmente en el tercer ejemplo, cargamos el acumulador ACU1 con el número hexadecimal “A23FCE00” y después lo transferimos a la Double Word MD40. Obsérvese como en todos los casos hay una coherencia entre el tamaño del número que se carga en ACU1 y el tamaño del registro al que transferimos el número. Por ejemplo, no tendría sentido escribir algo así: L T
W#16#FAFB MB30
Ya que estamos intentado meter en un registro de ocho (8) Bits (un Byte) el número hexadecimal “FAFB”, que en Binario ocupa dieciséis (16) Bits. Continuando con este tema de manejar números, citemos también otros dos (2) métodos que tiene STEP-7 con los que podemos cargar el ACU1 (y después transferir) números escritos en Binario que tengan longitudes de dieciséis (16) o treinta y dos (32) Bits, según las siguientes plantillas: 125
Operaciones de carga, transferencia y comparación
L L
Capítulo 11
2# 2#
Donde y son respectivamente números binarios cualesquiera que tengan un máximo de dieciséis (16) y treinta y dos (32) Bits respectivamente. Por ejemplo: L T
2#1111010100011100 AW124
L 2#11110000111100001111000011110000 T MD12 Observe el lector como nuevamente mantenemos siempre una coherencia entre el tamaño del número que queremos transferir y el tamaño del registro donde queremos depositar el número. Hasta aquí hemos visto algunas de las formas más usuales de cargar y transferir constantes que se emplean en STEP-7, pero en ocasiones lo que deseamos no es depositar una constante en una posición de memoria, sino depositar en una posición de memoria el contenido de otra posición de memoria. Por ejemplo, ¿cómo podríamos transferir el contenido de MB14 a la posición de memoria MB20? La solución es la siguiente: L T
MB14 MB20
Aquí cargamos el contenido de MB14 en ACU1 y después transferimos el contenido de ACU1 a MB20, con lo que tenemos lo que pretendíamos, que era llevar MB14 a MB20. La misma técnica podemos emplearla para copiar o mover información residente en memoria en registros de dieciséis (16) o treinta y dos (32) Bits. Veamos algunos ejemplos: L T
MW10 MW2
L T
MD40 MD20
Hasta aquí hemos hecho uso exclusivamente del acumulador ACU1, pero veamos ahora como trabaja el acumulador ACU2, con el siguiente ejemplo: L L
MW10 W#16#ABCD
(1) (2)
En la operación (1), cargamos ACU1 con el contenido de la Word MW10, y en la operación (2) volvemos a cargar ACU1 con la constante “ABCD”. A simple vista parece que estas operaciones son contradictorias, pues primeramente cargamos ACU1 con la Word MW10 y después volvemos a cargar ACU1 con la constante “ABCD”, por lo que parece que al realizar la segunda carga del acumulador, se destruye o borra lo que habíamos cargado en la primera operación de carga.
126
Operaciones de carga, transferencia y comparación
Capítulo 11
Lo que realmente ocurre es que en la primera operación, el ACU1 se carga efectivamente con la Word MW10, pero al realizar la segunda operación de carga, primeramente el contenido del ACU1 pasa al acumulador ACU2, y después el ACU1 realiza la carga de la constante “ABCD”, de tal forma que la situación al final de la operación (2), es la siguiente: Contenido de ACU1 = Contenido de MW10 Contenido de ACU2 = Constante hexadecimal “ABCD” ¿Qué pasaría si encadenamos no dos (2), sino tres (3) operaciones “L”? Por ejemplo: L L L
MW10 W#16#ABCD MB14
(1) (2) (3)
En la operación (1), el ACU1 se cargaría con el contenido de MW10, después en la operación (2) primeramente el contenido de ACU1 (MW10) pasaría a ACU2 y después ACU1 se cargaría con la constante “ABCD”, y finalmente en la operación (3) primeramente el contenido de ACU1 (o sea, la constante “ABCD”) pasaría a ACU2 y después ACU1 se cargaría con el contenido del Byte MB14, con lo que el resultado final después de la operación (3) sería el siguiente: Contenido de ACU1 = Contenido de MB14 Contenido de ACU2 = Constante hexadecimal “ABCD” Obsérvese que de la misma forma que ACU2 recoge el contenido de ACU1 en cada operación “L”, no hay ningún registro que recoja el contenido de ACU2, por lo que encadenar tres (3) o más operaciones “L” conduce a una pérdida de información. 11.6 Operaciones de comparación ==I, <>I, >I, =I y <=I Cuando se trata de comparar números enteros SIN SIGNO de hasta dieciséis (16) Bits de longitud, STEP-7 dispone de las siguientes operaciones lógicas: ==I <>I >I =I <=I
Si los contenidos de ACU2 y ACU1 son iguales, entonces RLO=1. Si el contenido de ACU2 es distinto que ACU1, entonces RLO=1. Si el contenido de ACU2 es mayor que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es menor que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es mayor o igual que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es menor o igual que el contenido de ACU1, entonces RLO=1.
Supongamos que deseamos saber si el contenido de la Word MW10 es igual que el contenido de la Word MW20. Pondremos: L L ==I =
MW10 MW20 M3.0
(1) (2) (3) (4)
La operación (1) carga ACU1 con el contenido de MW10. La operación (2) carga ACU1 con el contenido de MW20, y MW10 que estaba en ACU1, pasa a ACU2. Finalmente en la operación (3) si ACU2 = ACU1, que es lo mismo que decir que el contenido de MW10 es igual que el contenido de MW20, RLO se pondrá “1” (en caso contrario RLO se pondrá a “0”) y en la operación (4) el valor de RLO se lo pasamos al Bit M3.0, con lo que del valor “1” o “0” que tenga M3.0 deduciremos si MW10 es o no es igual que MW20. 127
Operaciones de carga, transferencia y comparación
Capítulo 11
Un razonamiento totalmente paralelo al anterior podemos hacer, caso de querer saber si por ejemplo el contenido de MW10 es mayor que el contenido de MW20. Pondríamos: L L >I =
MW10 MW20 M3.0
(1) (2) (3) (4)
La operación (1) carga ACU1 con el contenido de MW10. La operación (2) carga ACU1 con el contenido de MW20, y MW10 que estaba en ACU1, pasa a ACU2. Finalmente en la operación (3) si ACU2 > ACU1, que es lo mismo que decir que el contenido de MW10 es mayor que el contenido de MW20, RLO se pondrá “1” (en caso contrario, RLO se pondrá a “0”) y en la operación (4) el valor de RLO se lo pasamos al Bit M3.0, con lo que del valor “1” ó “0” que tenga M3.0 deduciremos si MW10 es o no es mayor que MW20. 11.7
Operaciones de comparación ==D, <>D, >D, =D y <=D
Cuando se trata de comparar números enteros SIN SIGNO de hasta treinta y dos (32) Bits de longitud, STEP-7 dispone de las siguientes operaciones lógicas: ==D <>D >D =D <=D
Si los contenidos de ACU2 y ACU1 son iguales, entonces RLO=1. Si el contenido de ACU2 es distinto que ACU1, entonces RLO=1. Si el contenido de ACU2 es mayor que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es menor que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es mayor o igual que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es menor o igual que el contenido de ACU1, entonces RLO=1.
Obsérvese como aquí el juego de operaciones es totalmente idéntico al caso anterior de enteros sin signo de dieciséis (16) Bits, sólo que cambia la letra “I” por la letra “D”. Conceptualmente todo es exactamente igual que en el caso anterior, por lo que el siguiente ejemplo ya no tendrá ninguna dificultad para el lector: L L >=D =
MD10 MD20 M3.0
(1) (2) (3) (4)
Después de realizar la operación (2), el ACU2 contiene MD10 y ACU1 contiene MD20, y en la operación (3) el RLO se pondrá a “1” si ACU2 es mayor o igual que ACU1, que es lo mismo que decir si MD10 es mayor o igual que MD20, y este valor de RLO en la operación (4) se lo pasamos al Bit M3.0, por lo que según M3.0 valga “1” o “0” deduciremos si MD10 es mayor o igual que MD20, o no lo es. 11.8 Operaciones de comparación ==R, <>R, >R, =R y <=R En el caso de números en coma flotante, las operaciones de comparación son las siguientes: ==R <>R >R =R <=R
Si los contenidos de ACU2 y ACU1 son iguales, entonces RLO=1. Si el contenido de ACU2 es distinto que ACU1, entonces RLO=1. Si el contenido de ACU2 es mayor que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es menor que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es mayor o igual que el contenido de ACU1, entonces RLO=1. Si el contenido de ACU2 es menor o igual que el contenido de ACU1, entonces RLO=1.
Donde estas operaciones son conceptualmente equivalentes a las ya vistas, excepto que se refieren a cantidades expresadas en formato de coma flotante.
128
Operaciones de carga, transferencia y comparación
Capítulo 11
Ejemplo: L L >R =
MD10 1.162E+2
//Si el contenido de MD10 tomado como número en coma flotante //es mayor que la constante 1.162E+2 (o sea, 116.2), //hacer RLO=1, en caso contrario hacer RLO=0, y después //asignar el valor de RLO al Bit M1.0.
M1.0
Ejercicio 1 Diseñar un programa que ponga a “1” la salida A124.0 si EB124 es menor que EB125, que ponga a “1” la salida A124.1 si EB124 es igual que EB125 y que ponga a “1” A124.2 si EB124 es mayor que EB125. Empezaremos por pintar la tabla de entradas/salidas: Entradas
Salidas
EB124 EB125
A124.0 A124.1 A124.2
EB124EB125
El Grafcet de nivel 2 (G2) será: M0.0 Esperar
0
EB124
M0.1
A124.0=1 A124.1=0 A124.2=0
1
EB124=EB125
M0.2
A124.0=0 A124.1=1 A124.2=0
2
=1
EB124>EB125
M0.3
=1
=1
0
0
A124.0=0 A124.1=0 A124.2=1
3
0
La traducción a lenguaje AWL de G2 sería: En OB1: U SPBN L L
M0.0 _000 EB124 EB125
//Si M0.0=1, //realizar las siguientes operaciones: //Comparar EB124 con EB125 y si //EB124 es menor que EB125,
M0.0 M0.1 EB124 EB125
//anular etapa actual “0” y activar la “1”.
M0.0 M0.2 EB124 EB125
//anular etapa actual “0” y activar la “2”.
//Comparar EB124 con EB125 y si //EB124 es igual que EB125,
//Comparar EB124 con EB125 y si //EB124 es mayor que EB125, 129
Operaciones de carga, transferencia y comparación
En OB100:
Capítulo 11
>I R S _000: NOP
M0.0 M0.3 0
//anular etapa actual “0” y activar la “3”.
U SPBN S R R R S _001: NOP
M0.1 _001 A124.0 A124.1 A124.2 M0.1 M0.0 0
//Si M0.1=1, //realizar las siguientes operaciones: //Hacer: A124.0=1 // A124.1=0 // A124.2=0 //Anular etapa actual “1” y //activar la siguiente “0”.
U SPBN R S R R S _002: NOP
M0.2 _002 A124.0 A124.1 A124.2 M0.2 M0.0 0
//Si M0.2=1, //realizar las siguientes operaciones: //Hacer: A124.0=0 // A124.1=1 // A124.2=0 //Anular etapa actual “2” y //activar la siguiente “0”.
U SPBN R R S R S _003: NOP
M0.3 _003 A124.0 A124.1 A124.2 M0.3 M0.0 0
//Si M0.3=1, //realizar las siguientes operaciones: //Hacer: A124.0=0 // A124.1=0 // A124.2=1 //Anular etapa actual “3” y //activar la siguiente “0”.
SET S R R R
M0.0 M0.1 M0.2 M0.3
Ejercicio 2 Diseñar un programa que ponga a “1” todas las salidas de AB124 si E124.0=1. En caso contrario, que se apaguen las salidas de AB124. Empezaremos por pintar la tabla de entradas/salidas: Entradas E124.0
Salidas A124.0 A124.1 A124.2 A124.3 A124.4 A124.5 A124.6 A124.7
130
Operaciones de carga, transferencia y comparación
Capítulo 11
El Grafcet G2 será: M0.0 Esperar
0
E124.0=1
M0.1
AB124 =1
1
E124.0=0
M0.2
AB124=0
2
=1
=1 0
0
Con el Grafcet G2 anterior podemos escribir ahora las operaciones AWL, que serán las siguientes: //Si M0.0=1, U M0.0 SPBN _000 //realizar las siguientes operaciones: U E124.0 //Si E124.0=1, R M0.0 //anular etapa actual “0” y S M0.1 //activar etapa siguiente “1”. UN E124.0 //Si E124.0=0, R M0.0 //Anular etapa actual “0” y S M0.2 //activar la siguiente “2”. _000: NOP 0
En OB100:
U SPBN L T R S _001: NOP
M0.1 _001 B#16#FF AB124 M0.1 M0.0 0
//Si M0.1=1, //realizar las siguientes operaciones: //Cargar ACU1 con “FF” //y traspasarlo a AB124 //Anular etapa “1” //y activar etapa “0”.
U SPBN L T R S _002: NOP
M0.2 _002 0 AB124 M0.2 M0.0 0
//Si M0.2=1, //realizar las siguientes operaciones: //Cargar ACU1 con “0” //y traspasarlo a AB124 //Anular etapa “2” //y activar etapa “0”.
SET S R R
M0.0 M0.1 M0.2
131
Operaciones aritméticas y trigonométricas
Capítulo 12
CAPÍTULO 12
Índice
Operaciones aritméticas y trigonométricas 12.1
Preámbulo
Antes de abordar los temas siguientes, donde se hace constantemente mención del PSW y de los Bits que lo componen, veamos primeramente este apartado que explica brevemente la forma de consultar el estado de estos Bits. En el apartado 5.4.3 decíamos que PSW es un registro de dieciséis (16) Bits y que se podía representar de la siguiente forma: 15
…..
9
8 RB
BIT 0 1 2 3 4 5 6 7 8 9 al 15
Ocupación /ER RLO STA OR OS OV A0 A1 RB Sin uso
7
6
5
4
3
2
1
0
A1
A0
OV
OS
OR
STA
RLO
/ER
Significado Bit de primera consulta* Bit de resultado lógico Bit de estado* Bit OR (=0)* Bit de desbordamiento memorizado Bit de desbordamiento Indicador de resultado Indicador de resultado Bit de resultado binario -
Las operaciones lógicas U, UN, O, ON, X, XN que ya hemos visto, nos permiten averiguar el estado de los Bits RB, A1, A0, OV y OS, con arreglo a la siguiente tabla: ==0 <>0 >0 <0 >=0 <=0 UO BIE OS OV
Consulta de ((A1 = 0) Y (A0 = 0)) Consulta de (((A1 = 1) Y (A0 = 0)) Ó ((A1 = 0) Y (A0 = 1))) Consulta de ((A1 = 1) Y (A0 = 0)) Consulta de ((A1 = 0) Y (A0 = 1)) Consulta de (((A1 = 1) Y (A0 = 0)) Ó ((A1 = 0) Y (A0 = 0))) Consulta de (((A1 = 1) Y (A0 = 0)) Ó ((A1 = 0) Y (A0 = 1))) Consulta de ((A1 = 1) Y (A0 = 1)) Consulta de RB = 1 Consulta de OS = 1 Consulta de OV = 1
Por ejemplo: U U U U
==0 <>0 UO OV
//El RLO será “1” si A1=0 y A0=0 //El RLO será “1” si (A1=1 y A0=0) Ó (A1=0 y A0=1) //El RLO será “1” si A1=1 y A0=1 //El RLO será “1” si OV=1
etc.
133
Operaciones aritméticas y trigonométricas
12.2
Capítulo 12
Operación +I
La operación +I suma los contenidos de ACU2L y ACU1L y deposita el resultado en ACU1L (ver apartado 5.4.1). De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1L = SUMA = ACU2L + ACU1L Al realizar la suma de ACU2L y ACU1L, y dependiendo del resultado de la suma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si Si
Bits afectados del PSW al realizar la operación +I → SUMA = 0 -32768 <= SUMA < 0 32767 >= SUMA > 0 SUMA = -65536 65534 >= SUMA > 32767 -65535 <= SUMA < -32768
A1 0 0 1 0 0 1
A0 0 1 0 0 1 0
OV 0 0 0 1 1 1
OS 1 1 1
Las zonas sombreadas representan operaciones no válidas(Bit OV=1). Ejemplo: L L +I T
MW12 EW10
//El contenido de MW12 lo sumamos al //contenido de EW10 y el resultado de la suma
MW14
//lo depositamos en MW14
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.3
Operación -I
La operación -I resta los contenidos de ACU2L y ACU1L y deposita el resultado en ACU1L. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1L = RESTA = ACU2L - ACU1L Al realizar la resta de ACU2L y ACU1L, y dependiendo del resultado de la resta, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si
Bits afectados del PSW al realizar la operación -I → RESTA = 0 -32768 <= RESTA < 0 32767 >= RESTA > 0 65534 >= RESTA > 32767 -65535 <= RESTA < -32768
A1 0 0 1 0 1
A0 0 1 0 1 0
OV 0 0 0 1 1
OS 1 1
Las zonas sombreadas representan operaciones no válidas(Bit OV=1).Ejemplo: L L -I T
MW12 EW10
//Al contenido de MW12 le restamos el //contenido de EW10 y el resultado de la resta
MW14
//lo depositamos en MW14 (MW14=MW12-EW10) 134
Operaciones aritméticas y trigonométricas
Capítulo 12
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.4
Operación /I
La operación /I divide el contenido de ACU2L por el de ACU1L y deposita el resultado en ACU1, de tal forma que ACU1L contiene el cociente de la división, y ACU1H contiene el resto. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1L = COCIENTE DE (ACU2L / ACU1L) ACU1H = RESTO DE (ACU2L / ACU1L) Al realizar la división de ACU2L y ACU1L, y dependiendo del resultado de la división, pueden variar los Bits que forman el PSW (ver apartado 5.5.3) según la siguiente tabla: Si Si Si Si Si
Bits afectados del PSW al realizar la operación /I → COCIENTE = 0 -32768 <= COCIENTE < 0 32767 >= COCIENTE > 0 COCIENTE = 32768 División por cero
A1 0 0 1 1 1
A0 0 1 0 0 1
OV 0 0 0 1 1
OS 1 1
Las zonas sombreadas representan operaciones no válidas(Bit OV=1). Ejemplo: L L /I T
MW12 EW10
//El contenido de MW12 lo dividimos por el //contenido de EW10 y el resultado de la división
MD14
//lo depositamos en MD14.
De tal forma que MW14 contiene el resto y MW16 contiene el cociente. El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.5
Operación *I
La operación *I multiplica el contenido de ACU2L por el de ACU1L y deposita el resultado en ACU1 como entero doble ocupando los treinta y dos (32) Bits. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = PRODUCTO = ACU2L * ACU1L Al realizar la multiplicación de ACU2L y ACU1L, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si
Bits afectados del PSW al realizar la operación *I → PRODUCTO = 0 -32768 <= PRODUCTO < 0 32767 >= PRODUCTO > 0 PRODUCTO > 32768 PRODUCTO < -32768
135
A1 0 0 1 1 0
A0 0 1 0 0 1
OV 0 0 0 1 1
OS 1 1
Operaciones aritméticas y trigonométricas
Capítulo 12
Las zonas sombreadas representan operaciones no válidas(Bit OV=1). Ejemplo: L L *I T
MW12 EW10
//El contenido de MW12 lo multiplicamos por el //contenido de EW10 y el resultado de la operación
MD14
//lo depositamos en MD14.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.6
Operación +
La operación “+” suma una constante entera con signo de dieciséis (16) Bits o treinta y dos (32) Bits a ACU1L o ACU1 respectivamente y deposita el resultado en ACU1L o ACU1 respectivamente. De formar esquemática podríamos poner: ACU1L = ACU1L + ACU1 = ACU1 + Donde y pueden estar comprendidos entre: -32768 <= >= +32767 -2.147.483.648 <= >= +2.147.483.647 En esta operación no quedan afectados los Bits de PSW. Ejemplo: L L +I + T
MW12 EW10
//El contenido de MW12 lo sumamos con el //contenido de EW10 y al resultado de la operación
100 MW14
//le volvemos a sumar 100. Finalmente la suma total //la depositamos en MW14.
MD8 ED12
//El contenido de MD8 lo sumamos con el //contenido de ED12 y al resultado de la operación
L#-300 MD16
//le volvemos a sumar -300. Finalmente la suma total //la depositamos en MD16.
Ejemplo: L L +D + T 12.7
Operación +D
La operación +D suma el contenido de ACU2 con el de ACU1 y deposita el resultado en ACU1 como entero doble ocupando los treinta y dos (32) Bits. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = SUMA = ACU2 + ACU1 136
Operaciones aritméticas y trigonométricas
Capítulo 12
Al realizar la suma de ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si Si
Bits afectados del PSW al realizar la operación +D → SUMA = 0 SUMA -2.147.483.648 <= < 0 SUMA 2.147.483.647 >= > 0 SUMA = -4.294.967.296 SUMA 4.294.967.294 >= > 2.147.483.647 SUMA -4.294.967.295 <= < -2.147.483.648
A1 0 0 1 0 0 1
A0 0 1 0 0 1 0
OV 0 0 0 1 1 1
OS 1 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1). Ejemplo: L L +D T
MD12 ED16
//El contenido de MD12 lo sumamos con el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.8
Operación -D
La operación -D resta el contenido de ACU1 del contenido de ACU2 y deposita el resultado en ACU1 como entero doble ocupando los treinta y dos (32) Bits. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = RESTA = ACU2 - ACU1 Al realizar la resta de ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si
Bits afectados del PSW al realizar la operación -D → RESTA = 0 RESTA -2.147.483.648 <= < 0 RESTA 2.147.483.647 >= > 0 RESTA 4.294.967.294 >= > 2.147.483.647 RESTA -4.294.967.295 <= < -2.147.483.648
A1 0 0 1 0 1
A0 0 1 0 1 0
OV 0 0 0 1 1
OS 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1). Ejemplo: L L -D T
MD12 ED16
//Al contenido de MD12 le restamos el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea.
137
Operaciones aritméticas y trigonométricas
12.9
Capítulo 12
Operación /D
La operación /D divide el contenido de ACU2 por el contenido de ACU1 y deposita el resultado en ACU1, de tal forma que todo el registro ACU1 contiene únicamente el cociente de la operación como número entero (el resto se calcula por medio de la operación MOD). De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = DIVISIÓN = ACU2 / ACU1 Al realizar la división de ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si
Bits afectados del PSW al realizar la operación /D → DIVISIÓN = 0 -2.147.483.648 <= DIVISIÓN < 0 DIVISIÓN 2.147.483.647 >= > 0 DIVISIÓN = 2.147.483.648 DIVISIÓN POR CERO
A1 0 0 1 1 1
A0 0 1 0 0 1
OV 0 0 0 1 1
OS 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1). Ejemplo: L L /D T
MD12 ED16
//El contenido de MD12 lo dividimos por el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.10 Operación *D La operación *D multiplica el contenido de ACU2 por el contenido de ACU1 y deposita el resultado en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = PRODUCTO = ACU2 * ACU1 Al realizar la multiplicación de ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si
Bits afectados del PSW al realizar la operación *D → PRODUCTO = 0 -2.147.483.648 <= PRODUCTO < 0 2.147.483.647 >= PRODUCTO > 0 PRODUCTO > 2.147.483.647 PRODUCTO < -2.147.483.648
Las zonas sombreadas representan operaciones no válidas (Bit OV=1).
138
A1 0 0 1 1 0
A0 0 1 0 0 1
OV 0 0 0 1 1
OS 1 1
Operaciones aritméticas y trigonométricas
Capítulo 12
Ejemplo: L L *D T
MD12 ED16
//El contenido de MD12 lo multiplicamos por el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.11 Operación MOD La operación MOD divide el contenido de ACU2 por el contenido de ACU1 y deposita el resultado en ACU1. El resultado sólo contiene el resto de la división y no el cociente (el cociente se obtiene con la operación /D). De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = RESTO = ACU2 (MOD) ACU1 Al realizar la operación MOD entre ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla:
Si Si Si Si
Bits afectados del PSW al realizar la operación MOD → RESTO = 0 RESTO -2.147.483.648 <= < 0 RESTO 2.147.483.647 >= > 0 DIVISION POR CERO
A1 0 0 1 1
A0 0 1 0 1
OV 0 0 0 1
OS 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1). Ejemplo: L MD12 L ED16 MOD T MD20
//El contenido de MD12 lo dividimos por el //contenido de ED16 y el resultado de la operación //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.12 Operación +R La operación +R suma el contenido de ACU2 y ACU1 como números en coma flotante y deposita el resultado en ACU1, también como número en coma flotante. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = SUMA = ACU2 + ACU1 Al realizar la operación +R entre ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla:
139
Operaciones aritméticas y trigonométricas
Si Si Si Si Si Si Si Si
Capítulo 12
Bits afectados del PSW al realizar la operación +R en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA SUMA > +3.402823E+38 +1.175494E-38 < SUMA < +3.402823E+38 +1.401298E-45 < SUMA < +1.175494E-38 SUMA = +0,-0 -1.175494E-38 < SUMA < -1.401298E-45 -3.402823E+38 < SUMA < -1.175494E-38 SUMA < -3.402823E+38
A1 1 1 1 0 0 0 0 0
A0 1 0 0 0 0 0 1 1
OV 1 1 0 1 0 1 0 1
OS 1 1 1 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L L +R T
MD12 ED16
//El contenido de MD12 lo sumamos con el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.13 Operación -R La operación -R resta el contenido de ACU2 y ACU1 como números en coma flotante y deposita el resultado en ACU1, también como número en coma flotante. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = RESTA = ACU2 - ACU1 Al realizar la operación -R entre ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si Si Si Si
Bits afectados del PSW al realizar la operación -R en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA RESTA > +3.402823E+38 +1.175494E-38 < RESTA < +3.402823E+38 +1.401298E-45 < RESTA < +1.175494E-38 RESTA = +0,-0 -1.175494E-38 < RESTA < -1.401298E-45 -3.402823E+38 < RESTA < -1.175494E-38 RESTA < -3.402823E+38
A1 1 1 1 0 0 0 0 0
A0 1 0 0 0 0 0 1 1
OV 1 1 0 1 0 1 0 1
OS 1 1 1 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L L -R T
MD12 ED16
//Al contenido de MD12 le restamos el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 140
Operaciones aritméticas y trigonométricas
Capítulo 12
12.14 Operación *R La operación *R multiplica el contenido de ACU2 y ACU1 como números en coma flotante y deposita el resultado en ACU1, también como número en coma flotante. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = PRODUCTO = ACU2 * ACU1 Al realizar la operación *R entre ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Bits afectados del PSW al realizar la operación *R en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA PRODUCTO > +3.402823E+38 +1.175494E-38 < PRODUCTO < +3.402823E+38 +1.401298E-45 < PRODUCTO < +1.175494E-38 PRODUCTO = +0,-0 -1.175494E-38 < PRODUCTO < -1.401298E-45 -3.402823E+38 < PRODUCTO < -1.175494E-38 PRODUCTO < -3.402823E+38
Si Si Si Si Si Si Si Si
A1 1 1 1 0 0 0 0 0
A0 1 0 0 0 0 0 1 1
OV 1 1 0 1 0 1 0 1
OS 1 1 1 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L L *R T
MD12 ED16
//El contenido de MD12 lo multiplicamos por el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.15 Operación /R La operación /R divide el contenido de ACU2 por el de ACU1 como números en coma flotante y deposita el resultado en ACU1, también como número en coma flotante. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = COCIENTE = ACU2 / ACU1 Al realizar la operación /R entre ACU2 y ACU1, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si Si Si Si
Bits afectados del PSW al realizar la operación /R en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA COCIENTE > +3.402823E+38 +1.175494E-38 < COCIENTE < +3.402823E+38 +1.401298E-45 < COCIENTE < +1.175494E-38 COCIENTE = +0,-0 -1.175494E-38 < COCIENTE < -1.401298E-45 -3.402823E+38 < COCIENTE < -1.175494E-38 COCIENTE < -3.402823E+38
141
A1 1 1 1 0 0 0 0 0
A0 1 0 0 0 0 0 1 1
OV 1 1 0 1 0 1 0 1
OS 1 1 1 1 1
Operaciones aritméticas y trigonométricas
Capítulo 12
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L L /R T
MD12 ED16
//El contenido de MD12 lo dividimos por el //contenido de ED16 y el resultado de la operación
MD20
//lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.16 Operación ABS Esta operación calcula el valor absoluto del contenido de ACU1 como número en coma flotante de treinta y dos (32) Bits y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = ABS (ACU1) La operación ABS no depende de los Bits, ni modifica los Bits del PSW. Ejemplo: L ABS T
MD12
//El valor absoluto de MD12
MD20
//lo depositamos en MD20.
12.17 Operación SQR Esta operación calcula el cuadrado del contenido de ACU1 como número en coma flotante de treinta y dos (32) Bits y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = CUADRADO = ACU1 2 Al realizar la operación SQR, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Bits afectados del PSW al realizar la operación SQR en coma flotante→ Si NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA Si CUADRADO > +3.402823E+38 Si +1.175494E-38 < CUADRADO < +3.402823E+38 Si +1.401298E-45 < CUADRADO < +1.175494E-38 Si CUADRADO = +0,-0
A1 1 1 1 0 0
A0 1 0 0 0 0
OV 1 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L SQR T
MD12 MD20
//Calculamos el cuadrado del contenido de MD12 //y el resultado //lo depositamos en MD20.
142
Operaciones aritméticas y trigonométricas
Capítulo 12
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.18 Operación SQRT Esta operación calcula la raíz cuadrada del contenido de ACU1 como número en coma flotante de treinta y dos (32) Bits y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = RAIZ CUADRADA =
ACU 1
Al realizar la operación SQRT, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Bits afectados del PSW al realizar la operación SQRT en coma flotante→ Si NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA Si R.CUADRADA > +3.402823E+38 Si +1.175494E-38 < R.CUADRADA < +3.402823E+38 Si +1.401298E-45 < R.CUADRADA < +1.175494E-38 Si R.CUADRADA = +0,-0
A1 1 1 1 0 0
A0 1 0 0 0 0
OV 1 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L MD12 SQRT T MD20
//Calculamos la raíz cuadrada del contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.19 Operación EXP Esta operación calcula el número “e” elevado al contenido de ACU1 como número en coma flotante de treinta y dos (32) Bits y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = EXPONENCIAL = eACU1 Al realizar la operación EXP, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si
Bits afectados del PSW al realizar la operación EXP en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA R.CUADRADA > +3.402823E+38 +1.175494E-38 < R.CUADRADA < +3.402823E+38 +1.401298E-45 < R.CUADRADA < +1.175494E-38 R.CUADRADA = +0,-0
A1 1 1 1 0 0
A0 1 0 0 0 0
OV 1 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación.
143
Operaciones aritméticas y trigonométricas
Capítulo 12
Ejemplo: L EXP T
MD12 MD20
//Realiza la operación “e” elevado al contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.20 Operación LN La operación LN calcula el logaritmo neperiano del contenido de ACU1 como número en coma flotante de treinta y dos (32) Bits y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = L. NEPERIANO = LN (ACU1) Al realizar la operación LN, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si Si Si Si
Bits afectados del PSW al realizar la operación LN en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA L.NEPERIANO > +3.402823E+38 +1.175494E-38 < L.NEPERIANO < +3.402823E+38 +1.401298E-45 < L.NEPERIANO < +1.175494E-38 L.NEPERIANO = +0,-0 -1.175494E-38 < L.NEPERIANO < -1.401298E-45 -3.402823E+38 < L.NEPERIANO < -1.175494E-38 L.NEPERIANO < -3.402823E+38
A1 1 1 1 0 0 0 0 0
A0 1 0 0 0 0 0 1 1
OV 1 1 0 1 0 1 0 1
OS 1 1 1 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L LN T
MD12 MD20
//Calcula el logaritmo neperiano del contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.21 Operación SIN La operación SIN calcula el seno del contenido de ACU1 como ángulo en coma flotante de treinta y dos (32) Bits medido en radianes y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = SENO = SIN (ACU1) Al realizar la operación SIN, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla:
144
Operaciones aritméticas y trigonométricas
Si Si Si Si Si Si
Capítulo 12
Bits afectados del PSW al realizar la operación SIN en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA +1.175494E-38 < SENO < +3.402823E+38 +1.401298E-45 < SENO < +1.175494E-38 SENO = +0,-0 -1.175494E-38 < SENO < -1.401298E-45 -3.402823E+38 < SENO < -1.175494E-38
A1 1 1 0 0 0 0
A0 1 0 0 0 0 1
OV 1 0 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L SIN T
MD12 MD20
//Calcula el seno del contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.22 Operación COS La operación COS calcula el coseno del contenido de ACU1 como ángulo en coma flotante de treinta y dos (32) Bits medido en radianes y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = COSENO = COS (ACU1) Al realizar la operación COS, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Bits afectados del PSW al realizar la operación COS en coma flotante→ Si NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA Si +1.175494E-38 < COSENO <= 1 Si +1.401298E-45 < COSENO < +1.175494E-38 Si COSENO = +0,-0 Si -1.175494E-38 < COSENO < -1.401298E-45 Si -1 <= COSENO < -1.175494E-38
A1 1 1 0 0 0 0
A0 1 0 0 0 0 1
OV 1 0 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L COS T
MD12 MD20
//Calcula el coseno del contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.23 Operación TAN La operación TAN calcula la tangente del contenido de ACU1 como ángulo en coma flotante de treinta y dos (32) Bits medido en radianes y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = TANGENTE = TAN (ACU1) 145
Operaciones aritméticas y trigonométricas
Capítulo 12
Al realizar la operación TAN, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Si Si Si Si Si Si Si Si
Bits afectados del PSW al realizar la operación TAN en coma flotante→ NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA TANGENTE > +3.402823E+38 +1.175494E-38 < TANGENTE < +3.402823E+38 +1.401298E-45 < TANGENTE < +1.175494E-38 TANGENTE = +0,-0 -1.175494E-38 < TANGENTE < -1.401298E-45 -3.402823E+38 < TANGENTE < -1.175494E-38 TANGENTE < -3.402823E+38
A1 1 1 1 0 0 0 0 0
A0 1 0 0 0 0 0 1 1
OV 1 1 0 1 0 1 0 1
OS 1 1 1 1 1
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L TAN T
MD12 MD20
//Calcula LA TANGENTE del contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.24 Operación ASIN La operación ASIN calcula el arco cuyo seno es el contenido de ACU1 como ángulo en coma flotante de treinta y dos (32) Bits medido en radianes y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = ARCOSENO = ASIN (ACU1) Aquí el contenido de ACU1 debe ser un número comprendido entre +1 y -1, y el resultado de la operación será un número comprendido entre +π/2 y -π/2 como ángulo expresado en radianes. Al realizar la operación ASIN, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Bits afectados del PSW al realizar la operación ASIN en coma flotante→ Si NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA ARCOSENO Si +1.175494E-38 < <= +π/2 Si +1.401298E-45 < ARCOSENO < +1.175494E-38 Si ARCOSENO = +0,-0 Si -1.175494E-38 < ARCOSENO < -1.401298E-45 ARCOSENO Si < -1.175494E-38 -π/2 <=
A1 1 1 0 0 0 0
A0 1 0 0 0 0 1
OV 1 0 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L MD12 ASIN T MD20
//Calcula el arcoseno del contenido de MD12 //y el resultado //lo depositamos en MD20. 146
Operaciones aritméticas y trigonométricas
Capítulo 12
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.25 Operación ACOS La operación ACOS calcula el arco cuyo coseno es el contenido de ACU1 como ángulo en coma flotante de treinta y dos (32) Bits medido en radianes y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = ARCO_COSENO = ACOS (ACU1) Aquí el contenido de ACU1 debe ser un número comprendido entre +1 y -1, y el resultado de la operación será un número comprendido entre +π/2 y -π/2 como ángulo expresado en radianes. Al realizar la operación ACOS, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla: Bits afectados del PSW al realizar la operación ACOS en coma flotante→ Si NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA A.COSENO Si +1.175494E-38 < <= +π/2 Si +1.401298E-45 < A.COSENO < +1.175494E-38 Si A.COSENO = +0,-0 Si -1.175494E-38 < A.COSENO < -1.401298E-45 A.COSENO Si < -1.175494E-38 -π/2 <=
A1 1 1 0 0 0 0
A0 1 0 0 0 0 1
OV 1 0 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L MD12 ACOS T MD20
//Calcula el arco coseno del contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea. 12.26 Operación ATAN La operación ATAN calcula el arco cuya tangente es el contenido de ACU1 como ángulo en coma flotante de treinta y dos (32) Bits medido en radianes y el resultado lo deposita en ACU1. De una forma simplificada podríamos expresar esta idea de la siguiente forma: ACU1 = ARCOTANGENTE = ATAN (ACU1) El resultado de la operación será un número comprendido entre +π/2 y -π/2 como ángulo expresado en radianes. Al realizar la operación ATAN, y dependiendo del resultado de la misma, pueden variar los Bits que forman el PSW (ver apartado 5.4.3) según la siguiente tabla:
147
Operaciones aritméticas y trigonométricas
Capítulo 12
Bits afectados del PSW al realizar la operación ATAN en coma flotante→ Si NÚMERO NO VÁLIDO U OPERACIÓN NO PERMITIDA Si +1.175494E-38 < A.TANGENTE <= +π/2 Si +1.401298E-45 < A.TANGENTE < +1.175494E-38 Si A.TANGENTE = +0,-0 Si -1.175494E-38 < A.TANGENTE < -1.401298E-45 Si -π/2 <= A.TANGENTE < -1.175494E-38
A1 1 1 0 0 0 0
A0 1 0 0 0 0 1
OV 1 0 1 0 1 0
OS 1 1 1 -
Las zonas sombreadas representan operaciones no válidas (Bit OV=1), y donde en cualquier caso el Bit RLO no queda afectado por esta operación. Ejemplo: L MD12 ATAN T MD20
//Calcula el arco tangente del contenido de MD12 //y el resultado //lo depositamos en MD20.
El programador debe investigar (si lo considera necesario) como quedan afectados los Bits A1, A0, OV y OS para garantizar que el resultado de la operación es el que se desea.
148
Operaciones de desplazamiento y rotación
Capítulo 13
CAPÍTULO 13
Índice
Operaciones de desplazamiento y rotación 13.1
Operación SSI
La operación SSI desplaza a la derecha el contenido de ACU1L tantas veces a la derecha como indica , de tal forma que por la izquierda van entrando “1´s” si el Bit quince (15) es “1”, y van entrando “0’s” si el Bit quince (15) es “0”. El último Bit desplazado, se carga en el Bit A1 de PSW. Ejemplo:
13.2
L SSI
7 1
//Se carga ACU1L con el número 7 y después se desplaza //a la derecha un lugar, quedando finalmente el número 3.
L SSI
-7 2
//Se carga ACU1L con el número -7 (que en complemento a dos es //FFF9) y después se desplaza a la derecha dos lugares, quedando FFFE, //que equivale al número -2.
Operación SSD
La operación SSD desplaza a la derecha el contenido de ACU1 tantas veces a la derecha como indica , de tal forma que por la izquierda van entrando “1´s” si el Bit quince (15) es “1”, y van entrando “0’s” si l Bit quince (15) es “0”. El último Bit desplazado, se carga en el Bit A1 de PSW. Ejemplo:
13.3
L SSD
L#7 1
//Se carga ACU1 con el número 7 y después se desplaza //a la derecha un lugar, quedando finalmente el número 3.
L SSD
L#-7 2
//Se carga ACU1 con el número -7 (que en complemento a dos es //FFFFFFF9) y después se desplaza a la derecha dos lugares, quedando //FFFFFFFE, que equivale al número -2.
Operación SLW
La operación SLW desplaza a la izquierda el contenido de ACU1L tantas veces como indica , de tal forma que por la derecha van entrando “0´s”. El ACU1H queda inalterado. El último Bit desplazado, se carga en el Bit A1 de PSW. Ejemplo: L SLW
W#16#5678 5
//Cargamos ACU1L con el número hexadecimal //5678, y después de la operación SLW 5 //queda CF00
149
Operaciones de desplazamiento y rotación
13.4
Capítulo 13
Operación SRW
La operación SRW desplaza a la derecha el contenido de ACU1L tantas veces como indica , de tal forma que por la izquierda van entrando “0´s”. El ACU1H queda inalterado. El último Bit desplazado, se carga en el Bit A1 de PSW. Ejemplo: L SRW 13.5
W#16#5678 5
//Cargamos ACU1L con el número hexadecimal //5678, y después de la operación SRW 5 //queda 02B3
Operación SLD
La operación SLD desplaza a la izquierda el contenido de ACU1 tantas veces como indica , de tal forma que por la derecha van entrando “0´s”. El último Bit desplazado, se carga en el Bit A1 de PSW. Ejemplo: L SLD 13.6
DW#16#12345678 5
//Cargamos ACU1 con el número hexadecimal //12345678, y después de la operación SLD 5 //queda 468ACF00
Operación SRD
La operación SRD desplaza a la derecha el contenido de ACU1 tantas veces como indica , de tal forma que por la izquierda van entrando “0´s”. El último Bit desplazado, se carga en el Bit A1 de PSW. Ejemplo: L SRD 13.7
DW#16#12345678 5
Operación RLD
//Cargamos ACU1 con el número hexadecimal //12345678, y después de la operación SRD 5 //queda 0091A2B3
La operación RLD rota a la izquierda el contenido de ACU1 tantas veces como indica . Ejemplo: L RLD 13.8
DW#16#12345678 3
//Cargamos ACU1 con el número hexadecimal //12345678, y después de la operación RLD 3 //queda 91A2B3C0
Operación RRD
La operación RRD rota a la derecha el contenido de ACU1 tantas veces como indica . Ejemplo: L RRD
DW#16#12345678 3
//Cargamos ACU1 con el número hexadecimal //12345678, y después de la operación RRD 3 //queda 2468ACF.
150
Operaciones de salto
Capítulo 14
CAPÍTULO 14
Índice
Operaciones de salto 14.1 Operación SPA Ya vimos en el apartado 8.4 qué se entiende por en STEP-7, por lo que no volveremos a repetirlo aquí. Cuando STEP-7 está procesando las operaciones que hemos programado y se encuentra con la operación SPA , interrumpe su funcionamiento normal y salta incondicionalmente a aquella operación que lleva a su izquierda la etiqueta indicada. Es importante señalar, que el salto puede realizarse hacia delante, si está por delante de la operación en curso, o hacia atrás, si está por detrás de la posición origen del salto. La longitud del salto que puede realizarse está limitada a 32768 palabras de código de programa. Éste es un número muy grande que en la práctica permite que nos olvidemos del lugar donde queremos saltar y solamente en casos excepcionales en que está muy distante del lugar origen del salto, deberíamos preocuparnos de la longitud del salto. Ejemplo: U SPA L L +I T _000: NOP 0
M0.0 _000 5 MW12
(1) (2) (3) (4) (5) MW14 (6) (7)
//Independientemente del valor de RLO, //al llegar aquí, el programa salta a “_000”. //Cargar ACU1L con 5. //Cargar ACU2L con MW12. //Sumar ACU1L y ACU2L y depositarlo en ACU1L. //Transferir ACU1L a MW14.
Aquí el programa saltará de la línea (2) a la línea (7) incondicionalmente, por lo que las operaciones (3), (4), (5) y (6) nunca llegarán a ejecutarse. 14.2
Operación SPB
Cuando STEP-7 se encuentra con una operación de este tipo, realiza el salto a condición de que RLO en ese momento sea “1”. En caso contrario, el salto no se realiza. Ejemplo: U SPB L L +I T _000: NOP 0
M0.0 _000 5 MW12
(1) (2) (3) (4) (5) MW14 (6) (7)
//Si M0.0=1, //saltar a “_000”. //Cargar ACU1L con 5 //Cargar ACU2L con MW12 //Sumar ACU1L y ACU2L y depositarlo en ACU1L //Transferir ACU1L a MW14
Aquí el programa saltará de la línea (2) a la (7) si RLO es “1” cuando vaya a ejecutarse la línea (2). En caso contrario, no se producirá el salto y el programa continuará procesando las líneas (3) en adelante.
151
Operaciones de salto
14.3
Capítulo 14
Operación SPBN
Ya se vió en el apartado 8.4 esta operación, por lo que aquí nos limitaremos a poner solamente un ejemplo más. Ejemplo: U SPBN L L +I T _000: NOP 0
M0.0 _000 5 MW12
(1) (2) (3) (4) (5) MW14 (6) (7)
//Si M0.0=0, //saltar a “_000” si RLO = 0, sino, continuar. //Cargar ACU1L con 5 //Cargar ACU2L con MW12 //Sumar ACU1L y ACU2L y depositarlo en ACU1L //Transferir ACU1L a MW14
Aquí el programa saltará de la línea (2) a la (7) si RLO es “0” cuando vaya a ejecutarse la línea (2). En caso contrario, no se producirá el salto y el programa continuará procesando las líneas (3) en adelante. 14.4
Operación SPO
En este caso, el programa realiza el salto a si el Bit OV es “1”. En caso contrario, se continúa ejecutando las operaciones que siguen. Ejemplo: -SPO _000 (2) //Si OV=1, saltar a “_000”, en caso contrario, //continuar. L 5 (3) //Cargar ACU1L con 5 L MW12 (4) //Cargar ACU2L con MW12 +I (5) //Sumar ACU1L y ACU2L y depositarlo en ACU1L T MW14 (6) //Transferir ACU1L a MW14 _000: NOP 0 (7) Aquí el programa saltará de la línea (2) a la (7) si RLO es “0” cuando vaya a ejecutarse la línea (2). En caso contrario, no se producirá el salto y el programa continuará procesando las líneas (3) en adelante. 14.5
Operación SPZ
El programa realiza el salto a si A1 = A0 = 0, o lo que es lo mismo, si el resultado de la operación aritmética precedente da como resultado “0”. En caso contrario, se continúa ejecutando las operaciones que siguen. Ejemplo: L L -I SPZ SPA _000: NOP 0 U U = _001: NOP 0
MW10 MW12 _000 _001 M0.0 M0.1 M0.2
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
152
Operaciones de salto
Capítulo 14
El programa saltará de la línea (4) a la línea (6) si el resultado de restar MW10 y MW12 es “0”, en caso contrario ejecutará la línea (5) y saltará incondicionalmente a la línea (10). 14.6
Operación SPN
El programa realiza el salto a si A1 = 0 y A0 = 1, ó A1 = 1 y A0 =0, o lo que es lo mismo, si el resultado de la operación aritmética precedente es distinto de “0”. En caso contrario, se continúa ejecutando las operaciones que siguen. Ejemplo: L L +I SPN SPA _000: NOP 0 U U = _001: NOP 0
MW10 MW12 _000 _001 M0.0 M0.1 M0.2
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
El programa saltará de la línea (4) a la línea (6) si el resultado de sumar MW10 y MW12 es distinto que “0”, en caso contrario ejecutará la línea (5) y saltará incondicionalmente a la línea (10). 14.7
Operación SPP
El programa realiza el salto a si A1 = 1 y A0 =0, o lo que es lo mismo, si el resultado de la operación aritmética precedente es mayor que “0”. En caso contrario, se continúa ejecutando las operaciones que siguen. Ejemplo: L L -I SPP SPA _000: NOP 0 U U = _001: NOP 0
MW10 MW12 _000 _001 M0.0 M0.1 M0.2
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
El programa saltará de la línea (4) a la línea (6) si el resultado de restar MW10 y MW12 es mayor que “0”, en caso contrario ejecutará la línea (5) y saltará incondicionalmente a la línea (10). 14.8
Operación SPM
El programa realiza el salto a si A1 = 0 y A0 =1, o lo que es lo mismo, si el resultado de la operación aritmética precedente es menor que “0”. En caso contrario, se continúa ejecutando las operaciones que siguen.
153
Operaciones de salto
Ejemplo:
Capítulo 14
L MW10 (1) L MW12 -I SPM _000 SPA _001 _000: NOP 0 U M0.0 U M0.1 = M0.2 _001: NOP 0
(2) (3) (4) (5) (6) (7) (8) (9) (10)
El programa saltará de la línea (4) a la línea (6) si el resultado de restar MW10 y MW12 es menor que “0”, en caso contrario ejecutará la línea (5) y saltará incondicionalmente a la línea (10). 14.9
Operación SPPZ
El programa realiza el salto a si A0 =0, o lo que es lo mismo, si el resultado de la operación aritmética precedente es mayor o igual que “0”. En caso contrario, se continúa ejecutando las operaciones que siguen. Ejemplo:
L MW10 (1) L MW12 -I SPPZ _000 SPA _001 _000: NOP 0 U M0.0 U M0.1 = M0.2 _001: NOP 0
(2) (3) (4) (5) (6) (7) (8) (9) (10)
El programa saltará de la línea (4) a la línea (6) si el resultado de restar MW10 y MW12 es mayor o igual que “0”, en caso contrario ejecutará la línea (5) y saltará incondicionalmente a la línea (10). 14.10 Operación SPMZ El programa realiza el salto a si A1 =0, o lo que es lo mismo, si el resultado de la operación aritmética precedente es menor o igual que “0”. En caso contrario, se continúa ejecutando las operaciones que siguen. Ejemplo: L L -I SPMZ SPA _000: NOP 0 U U = _001: NOP 0
MW10 MW12 _000 _001 M0.0 M0.1 M0.2
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) 154
Operaciones de salto
Capítulo 14
El programa saltará de la línea (4) a la línea (6) si el resultado de restar MW10 y MW12 es menor o igual que “0”, en caso contrario ejecutará la línea (5) y saltará incondicionalmente a la línea (10). 14.11 Operación SPU El programa realiza el salto a si A1 =1 y A0 = 1, o lo que es lo mismo, si el resultado de la operación aritmética precedente es inválido. En caso contrario, se continúa ejecutando las operaciones que siguen. Ejemplo: L L /I SPU SPA _000: NOP 0 U U = _001: NOP 0
MW10 MW12 _000 _001 M0.0 M0.1 M0.2
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
El programa saltará de la línea (4) a la línea (6) si el resultado de dividir MW10 y MW12 es inválido, por ejemplo por un intento de división por “0”, en caso contrario ejecutará la línea (5) y saltará incondicionalmente a la línea (10). 14.12 Operación LOOP Se trata de un caso particular de operación de salto a que se ejecuta siempre que el contenido de ACU1L sea distinto de cero (0). En la ejecución de esta operación, previamente se decrementa el contenido de ACU1L y si después de decrementar el contenido de ACU1L este contenido es distinto de cero (0), se realiza el salto a , en caso contrario se continúa la ejecución normal del programa. Ejemplo: L _000: T L L +I T L LOOP
7 MW12 EW124 2 AW124 MW12 _000
(1) (2) (3) (4) (5) (6) (7) (8)
//Cargamos ACU1L con el número 7 //y lo almacenamos en MW12 // Operación intermedia // Operación intermedia // Operación intermedia // Operación intermedia //Recuperamos el valor que hay en MW12, //lo decrementamos, y si es distinto de “0” //volvemos a saltar a “_000”
155
Procesos en paralelo
Capítulo 15
CAPÍTULO 15
Índice
Procesos en paralelo 15.1 Qué se entiende por procesos en paralelo Imaginemos que tenemos una vivienda y que hemos decidido realizar los siguientes trabajos: • • • •
Pintar la habitación principal Pintar el recibidor Reparar la puerta de una habitación Reparar la persiana del comedor
(trabajo A) (trabajo B) (trabajo C) (trabajo D)
Nos ponemos a pensar en la mejor forma de realizar estos trabajos y supongamos que llegamos a la conclusión de que solo tenemos las dos (2) siguientes soluciones posibles: 1.- Todos los trabajos los haremos nosotros mismos sin contar con nadie. 2.- Llamaremos a unos amigos nuestros y nos repartiremos los trabajos. En el primer caso, si decidimos realizar estos trabajos nosotros mismos, los realizaremos uno tras de otro. Esto es, primero por ejemplo empezaremos pintando la habitación principal (trabajo A) y una vez hayamos pintado la habitación principal, comenzaremos a pintar el recibidor (trabajo B), y una vez hayamos terminado de pintar el recibidor, nos pondremos a reparar la puerta de la habitación (trabajo C), y cuando hayamos terminado este trabajo nos pondremos a reparar la persiana del comedor (trabajo D). Esquemáticamente podemos representar estos trabajos de la siguiente forma: Trabajo A Día 1
Trabajo B Día 4
Trabajo C Día 6
Trabajo D Día 8
Día del mes
Día 9
Otra posibilidad, tal y como hemos dicho antes, es contar con la colaboración de amigos nuestros y repartirnos entre todos estos trabajos, que de una forma esquemática podríamos poner: Trabajo A Día 4
Día 1 Trabajo B Día 1
Día del mes Día 3
Trabajo C Día 1
Día del mes Día 3
Trabajo D Día 1
Día del mes
Día del mes
Día 2
157
Procesos en paralelo
Capítulo 15
Observamos sin más que comparar ambas figuras, en el primer caso si decidimos hacer nosotros solos todo el trabajo, el tiempo total empleado será de nueve (9) días, mientras que en el segundo caso si realizamos los trabajos entre todos, el tiempo total para terminar los trabajos será de tan sólo cuatro (4) días. Este mismo concepto lo podemos trasladar al ámbito de los procesos industriales, y así podemos encontrarnos con procesos que (por la razón que sea) se realizan de forma encadenada (uno detrás de otro), mientras que hay otros procesos en los que los trabajos se realizan SIMULTÁNEAMENTE en el tiempo. Estos procesos que se realizan simultáneamente en el tiempo es lo que llamamos PROCESOS EN PARALELO. 15.2 Representación Grafcet de un proceso en paralelo Los procesos en paralelo se representan en Grafcet trazando dos líneas paralelas que indican el comienzo o final del proceso en paralelo. Veamos un ejemplo: 1
Comienzo proceso paralelo T1
2
5
T2
T5
3
6
T3 4
T46 7
Fin proceso paralelo
T7
En este ejemplo, una vez se ha validado la transición T1, comienza un proceso en paralelo (que se representa por una doble línea), en el que se activan simultáneamente las etapas dos (2) y cinco (5). El inicio de la etapa dos (2) da lugar al desencadenamiento de la secuencia representada por las etapas de la izquierda (etapas dos (2), tres (3) y cuatro (4)), mientras que el inicio de la etapa cinco (5) da lugar al desencadenamiento de la secuencia representada por las etapas de la derecha (etapas cinco (5) y seis (6)).
158
Procesos en paralelo
Capítulo 15
Es condición indispensable para que termine el proceso en paralelo y se active la etapa siete (7), que las últimas etapas del proceso, en este caso etapas cuatro (4) y seis (6), hayan terminado. En caso contrario, si alguna etapa no hubiese terminado, el proceso debería permanecer a la espera hasta que TODAS las últimas etapas del proceso en paralelo hubiesen terminado. De lo dicho anteriormente se deduce que la condición lógica que debe contener la transición T46 consiste (o debe consistir) básicamente en la exigencia de que las etapas cuatro (4) y seis (6) hayan terminado. De la misma manera que hemos representado en el ejemplo anterior un proceso paralelo que consta de dos (2) secuencias independientes, esta idea se puede generalizar para cualquier número de secuencias, si bien en todos los casos deben cumplirse los dos (2) puntos básicos que aquí hemos expuesto, esto es: • •
La transición de la etapa anterior al inicio del proceso en paralelo, cuando se valida, es la que activa simultáneamente las etapas de comienzo de todas las secuencias que forman el proceso en paralelo. El proceso paralelo termina cuando TODAS las últimas etapas de todos los procesos secuenciales, han terminado.
15.3 Máquinas transfer En el mundo industrial se habla a menudo de máquinas transfer. Ahora bien, ¿qué es una máquina transfer? Empezaremos por poner un ejemplo de máquina transfer y veremos después cuales son sus características principales y porqué se llaman así.
159
Procesos en paralelo
Capítulo 15
Esta máquina transfer funciona de la siguiente manera. Un operario se sienta en el taburete y suponiendo que en la máquina no hay ninguna pieza, comienza por coger de una caja (no visible en la imagen anterior) una pieza en forma de cilindro bajo y la coloca en el asiento de forma circular situado frente a él. A continuación oprime con el pie un pedal (no visible en la imagen anterior) y la máquina gira 90º en el sentido marcado por la flecha. Una vez la máquina transfer termina de realizar el giro, comienzan a ejecutarse los siguientes trabajos SIMULTÁNEAMENTE:
Trabajo A:
∗ ∗ ∗ ∗ ∗ ∗
Sale el cilindro C Sale el cilindro D Se retrae el cilindro D Sale el cilindro D Se retrae el cilindro D Se retrae el cilindro C
∗ ∗ ∗ ∗ ∗ ∗
Sale el cilindro E Sale el cilindro F Se retrae el cilindro F Sale el cilindro G Se retrae el cilindro G Se retrae el cilindro E
∗ ∗ ∗ ∗
Sale el cilindro H Salen los cilindros I y J Se retraen los cilindros I y J Se retrae el cilindro H
Tiempo
Trabajo B:
Tiempo
Trabajo C: Tiempo
Una vez TODOS los trabajos A, B y C han terminado, la máquina queda a la espera de que el operario retire la pieza ya trabajada que aparece frente a él (NOTA: lógicamente en los primeros ciclos de funcionamiento no aparecerá ninguna pieza trabajada), deposite una nueva pieza y oprima el pedal de comienzo de ciclo, después de esto, vuelven a repetirse los trabajos A, B y C ya mencionados. Y así indefinidamente. Veamos otro modelo de máquina transfer, donde esta vez el mecanismo que transfiere el trabajo, no tiene forma circular, sino lineal:
160
Procesos en paralelo
Capítulo 15
Cargador de tapones
C B
D
EV BF1
BF2
M
Cargador de botellas (planta)
A
Si imaginamos que el proceso hace ya tiempo que está en funcionamiento, el desarrollo del proceso productivo podemos esquematizarlo así: Comienza proceso paralelo (trabajos simultáneos): Trabajo A:
(Carga botella vacía sobre cinta transportadora principal)
∗ ∗
Tiempo
Sale el cilindro A Se retrae el cilindro A (Llenado de botella)
Trabajo D:
∗ ∗ ∗
Se retrae cilindro B Sale el cilindro B y se activa electro válvula EV Se cierra electro válvula EV
Tiempo
(Taponado de botella)
Trabajo C:
∗ ∗ ∗ ∗
Sale el cilindro D Sale el cilindro C Se retrae el cilindro C Se retrae el cilindro D
Tiempo
Una vez estos tres (3) procesos hayan terminado, comienza el Trabajo B: Trabajo B:
(Avance de la cinta transportadora principal)
∗
El motor M hace que la cinta avance
161
Tiempo
Procesos en paralelo
Capítulo 15
Finalmente, una vez que haya terminado el Trabajo B, volvería a comenzar el ciclo anterior automáticamente, empezando por los tres (3) Trabajos A, B y C en paralelo. En la práctica industrial, no solamente existen máquinas transfer de estas características (circulares en forma de mesa redonda horizontal o lineales en forma de cinta transportadora) sino que existen otros modelos derivados de los anteriores, como por ejemplo máquinas transfer rotatorias de plano vertical (o eje horizontal, que es lo mismo). Ahora bien, en todos los casos estas máquinas se caracterizan por realizar trabajos SIMULTÁNEOS sobre elementos o piezas base de trabajo, tales como los cilindros que hemos visto en el primer ejemplo o las botellas del segundo ejemplo.
162
Funciones (introducción)
Capítulo 16
CAPÍTULO 16
Índice
Funciones (introducción) 16.1
Qué es una función
Imaginemos que tenemos un proceso industrial formado por cintas transportadoras, motores trifásicos, manipuladores neumáticos o eléctricos, electro válvulas, motores servo, etc., y que todo este conjunto de elementos están controlados por un autómata, que como es lógico debemos programar previamente para que funcione todo el proceso. Supongamos ahora que hay una determinada parte del proceso que hemos de controlar repetidamente a lo largo de todo el programa que hemos introducido en el autómata. Si llamamos por ejemplo Tarea_1 al conjunto de operaciones que controlan esta parte del proceso, esquemáticamente el programa total podemos representarlo de la siguiente manera: Operaciones en general Operaciones en general Tarea_1 Operaciones en general Operaciones en general Tarea_1 Operaciones en general Tarea_1 Operaciones en general . . etc. Evidentemente, nuestro programa así concebido funcionará perfectamente si lo hemos programado sin errores, pero por otra parte dependiendo del número de veces que aparezca Tarea_1 en el programa principal (o del número de operaciones que contenga Tarea_1), empezamos a sospechar que este programa así concebido puede ser largo y problemático. Imaginemos ahora el programa anterior pero escrito de la siguiente forma: Operaciones en general Operaciones en general Llamar a Operaciones en general Operaciones en general Llamar a Operaciones en general Llamar a Operaciones en general . . etc.
Tarea_1
Fig.16.1
Donde el funcionamiento sería el siguiente: El desarrollo del programa principal es el mismo que en el caso anterior, pero ahora cuando llegamos a la posición donde antes poníamos las operaciones de Tarea_1, lo que hacemos es intercalar una operación especial que salta a una posición de memoria donde hemos depositado
163
Funciones (introducción)
Capítulo 16
UNA SOLA VEZ las operaciones de Tarea_1, y ahora lo único que tenemos que hacer es llamar a Tarea_1 tantas veces como nos haga falta. Pues bien, se llama función precisamente a esta parte del programa, la Tarea_1, que hemos metido en la caja y que llamamos desde el programa principal cuando nos hace falta. A este concepto de depositar determinadas partes del programa que se repiten a lo largo del mismo en determinadas posiciones de memoria, con objeto de aligerar el programa principal (entre otras ventajas), es lo que se llama programación estructurada. Las ventajas de la programación estructurada frente a la programación lineal que hemos visto hasta ahora, son muchas y evidentes, y podemos citar por ejemplo las siguientes: • • • • •
Aligerar de operaciones al programa principal. Disminuir el espaciado ocupado en memoria. Simplificar la programación del proceso. Aumentar la facilidad de mantenimiento del programa. Aumentar la facilidad de comprensión del programa.
Todos los puntos mencionados anteriormente son importantes, pero es sin duda el tercer punto “Simplificar la programación del proceso” el que tiene una gran importancia práctica, por cuanto el uso de funciones permite dividir un programa complejo en programas menores que posteriormente se “ensamblan” con llamadas desde el programa principal. ¡DIVIDE Y VENCERÁS! 16.2 Estructura de una llamada a función y de la función misma Empezaremos con un ejemplo muy sencillo, y lo iremos complicando gradualmente, para que el lector pueda ver la evolución del proceso de una forma progresiva. Empezaremos por crear una función. Para crear una función, primeramente deberemos tener un proyecto abierto en el administrador general de STEP-7 y tener seleccionado el objeto “Bloques”. A la derecha, tendremos seguramente el icono del Bloque de Organización OB1 y quizás algún otro bloque mas, como por ejemplo OB100. Iremos ahora al menú “Insertar” y nos pondremos a la altura de la opción “Bloque S7”, después de esto elegiremos la opción “3 Función” y haremos clic. Aparecerá entonces la siguiente imagen:
Fig.16.2 164
Funciones (introducción)
Capítulo 16
Donde STEP-7 nos sugiere como nombre de la nueva función el de FC1. Si estamos conformes con este nombre, daremos al botón “Aceptar” y acto seguido aparecerá junto a los demás bloques existentes, el nuevo bloque FC1. Hasta aquí, lo que hemos creado es una caja vacía que tiene como nombre FC1, pero ahora deberemos abrir esta “caja” y meter dentro el conjunto de operaciones que deseamos ejecutar en la nueva función. Para abrir la función FC1, simplemente haremos un doble clic sobre el icono de FC1, y aparecerá entonces el contenido de la función FC1, con el siguiente aspecto (el aspecto exacto puede variar algo según la versión de STEP-7 que tenga el lector):
Haga clic aquí para empezar a escribir
Al acercar el puntero del ratón a esta zona, el puntero se convierte en este símbolo. En este momento, puede bajarse esta línea de separación, haciendo clic y arrastrando hacia abajo. Sin embargo, para este ejemplo no necesita realizar esta operación.
Fig.16.3
Es hora de empezar a introducir operaciones dentro de FC1, y como primer ejemplo, pondremos simplemente lo siguiente: U E124.0 //Si E124.0=1 y U E124.1 //E124.1=1, entonces = A124.0 //hacer A124.0=1 Una vez que hemos escrito estas operaciones, guardaremos en disco duro el programa haciendo clic sobre el icono “Guardar” (tiene encima dibujado un disquete). Volveremos ahora al administrador general de STEP-7 y haremos ahora doble clic sobre el icono OB1, se nos abrirá una ventana idéntica a la anterior, sólo que lo que escribamos ahora, pertenecerá a OB1 y no a FC1. En OB1 escribiremos simplemente la siguiente operación: CALL FC1 Y acto seguido, haremos clic sobre el icono “Guardar”. Esta operación está formada por la palabra inglesa “CALL” que en español significa “LLAMAR”. Por tanto, la operación “CALL FC1” lo que hace es llamar a la función FC1 que hemos creado anteriormente.
165
Funciones (introducción)
Capítulo 16
Cuando use esta operación para llamar a una función, no olvide crear primeramente la función a la que está llamando, pues si no lo hace así, STEP-7 le pondrá en color rojo la operación, indicándole que no es correcta. Bien, hasta aquí hemos creado el bloque OB1 y la función FC1 y ambos los hemos programado con operaciones. Ahora, iremos al administrador general de STEP-7, seleccionaremos los objetos OB1 y FC1 y posteriormente los introduciremos bien en el autómata (si disponemos de él) o bien en el simulador PLCSIM, presionando sobre el icono “Cargar” (NOTA: si dispone del simulador PLCSIM, no olvide activar el simulador, haciendo clic sobre el icono “Activar/desactivar simulación”, antes de ordenar cargar el programa). Una vez cargados ambos bloque en el autómata real o simulado, lo pondremos en la posición “RUN” y podremos comprobar como el autómata ejecuta perfectamente el programa que hemos depositado en FC1. Si no hemos cometido ningún error, el programa funcionará perfectamente y podremos comprobar como A124.0 realiza la operación “AND” entre E124.0 y E124.1. Ahora bien, ¿qué mejoras nos aporta esta forma de trabajar frente a la programación lineal que hemos visto en capítulos anteriores? Lo que hasta ahora hemos conseguido es sacar las operaciones que estaban en OB1 y llevarlas a una caja que llamamos FC1, y esto puede suponer un ahorro en cuanto al número de operaciones que debamos escribir en OB1, pero nada más. Bien, esto ya es algo, pero si observamos el mecanismo de funcionamiento anterior, observamos que la llamada a la función FC1 es constante. Esto es, siempre que el proceso pasa por encima de la operación “CALL FC1”, el programa salta a FC1, y dado que el proceso pasa por encima de esta operación miles de veces por segundo, el salto a la función FC1 también será de miles de veces por segundo, con lo que con este mecanismo resulta que estamos permanentemente conectados a FC1. Claro que si lo que deseamos es precisamente estar conectados permanentemente a una función, éste es el método correcto, pero ¿y si lo que queremos es conectarnos a FC1 no permanentemente, sino en momentos concretos? Veamos otra forma de realizar la llamada a FC1 desde OB1: U SPBN CALL U R S _000: NOP
M0.0 _000 FC1 M200.0 M0.0 M0.1 0
(1) (2) (3) (4) (5) (6) (7)
En esta forma de hacer la llamada a FC1, observamos que únicamente es posible llamar a FC1 si el Bit M0.0 es “1”, ya que en caso contrario, se produce un salto desde la línea (2) a la (7) y no se llega a ejecutar la operación “CALL FC1”. Esto por una parte, pero por otra parte veamos que pasaría si en FC1 ponemos lo siguiente: U U = SET S
E124.0 E124.1 A124.0 M200.0
(1) (2) (3) (4) (5)
166
Funciones (introducción)
Capítulo 16
Observamos como hemos complementado las operaciones anteriores con las líneas (4) y (5), de tal forma que la función FC1, cuando termina de ejecutar las líneas (1), (2) y (3), la línea (4) pone a “1” e Bit RLO y la línea (5) pone a “1” el Bit M200.0. Si ahora tenemos en cuenta simultáneamente las operaciones de los bloque OB1 y FC1, vemos como el salto a FC1 se produce en primer lugar si, como hemos dicho antes, el Bit M0.0 es “1” pero además, cuando la función termina de ejecutar las operaciones que hemos puesto en FC1, la misma función pone a “1” el Bit M200.0, lo que tiene el efecto, cuando FC1 retorna a OB1, de poner a “0” el Bit M0.0 y a “1” el Bit M0.1. O dicho con otras palabras, se efectúa una llamada desde OB1 a FC1, y cuando FC1 termina, informa a OB1 de que ha terminado haciendo M200.0=1, y OB1 una vez que detecta que FC1 ha terminado, desconecta la llamada a FC1 y activa la etapa siguiente representada por el Bit M0.1. Este ejemplo anterior representa realmente el caso real más frecuente en programación, pues el programador cuando desea hacer uso de una función, lo único que pretende cuando llama a la función es que ésta realice el trabajo que está allí depositado y desconectarse después, para seguir escribiendo operaciones en el bloque OB1, o bien hacer una llamada a otra función. Así pues, éste es el caso normal en programación, pero nos faltaría perfeccionar algo más la función en si misma con objeto de poder disponer de un modelo de función que pueda servirnos en todos los casos. Vamos a representar con Grafcet las ideas que hemos visto hasta ahora, con algunos perfeccionamientos adicionales. Plantilla Grafcet en general de una función cualquiera: Desde bloque invocante
Inicializar la función en la 1ª pasada y no volver a ejecutar esta etapa
0
La función comienza siempre con una etapa de auto inicialización.
=1
BitDeEtapa_1 Tarea 1
1
¿Transición 1?
BitDeEtapa_2
Estas son las tareas específicas de la función.
Tarea 2
2
¿Transición 2? . . .
La función termina siempre con una etapa en la que se pone el BitDeFin=1 para anunciar al bloque invocante que la función ha terminado.
BitDeEtapa_N BitDeFin=1
N =1
Hacia bloque invocante Fig.16.4 167
Funciones (introducción)
Capítulo 16
Y para el conjunto de operaciones que llaman a la función FCn, seria así: BitDeEtapa_H Llamar a la función FCn
H
BitDeFin=1 Hacia etapa siguiente Fig.16.5
Si pasamos a operaciones AWL los Grafcet anteriores, tendremos: Para la función: O ON FP SPBN S R R
. . .
R R A: NOP
M0.0 M0.0 “BitDeTrabajo” A “BitDeEtapa_1” “BitDeEtapa_2” “BitDeEtapa_3”
“BitDeEtapa_N” “BitDeFin” 0
Tarea 1 de la función Tarea 2 de la función
Tareas específicas de la función
. . .
U SPBN R S R B: NOP
Etapa de auto inicialización
“BitDeEtapa_N” B ”BitDeEtapa_N” ”BitDeFin” “BitDeTrabajo” 0
Etapa final
Y las operaciones AWL equivalentes al Grafcet que realiza la llamada a la función serán: U SPBN CALL U R S C: NOP
“BitDeEtapa_H” C FCn ”BitDeFin” ”BitDeEtapa_H” ”BitDeEtapa_H+1 0
168
Operaciones de llamada a FCn desde el bloque invocante.
Funciones (introducción)
Capítulo 16
Ahora que ya tenemos un modelo de plantilla, tanto para la llamada a la función como para la función misma, veamos como quedarían los Grafcet para el ejemplo que habíamos planteado anteriormente. G2 de la llamada a la función: M0.1 Llamar a la función FC1
1
M200.0=1 Hacia etapa 2
Fig.16.6
Lo anterior en operaciones AWL: U SPBN CALL U R S _001: NOP
M0.1 _001 FC1 M200.0 M0.1 M0.2 0
G2 de la función: Desde OB1
En la 1ª pasada hacer: 0
Inicializar valores
M10.1=1 (BitDeEtapa_1 = 1) M10.2=0 (BitDeEtapa_2 = 0) M200.0=0 (BitDeFin = 0)
=1
M10.1 A124.0 = E124.0 * E124.1
1 =1
M10.2
M200.0 = 1 M10.0 = 0
2
(BitDeFin = 1) (BitDeTrabajo = 0)
=1 Hacia OB1 Fig.16.7
169
Funciones (introducción)
Capítulo 16
Que expresado en operaciones AWL será: O ON FP SPBN S R R _100: NOP
M0.0 M0.0 M10.0 _100 M10.1 M10.2 M200.0 0
U SPBN U U = SET R S _101: NOP
M10.1 _101 E124.0 E124.1 A124.0 M10.1 M10.2 0
U SPBN R S R _102: NOP
M10.2 _102 M10.2 M200.0 M10.0 0
//(M10.0 es aquí el “BitDeTrabajo”) //(M10.1 es aquí “BitDeEtapa_1”) //(M10.2 es aquí “BitDeEtapa_2”) //(M200.0 es aquí “BitDeFin”)
Tarea específica de la función
Como ejemplo práctico de lo explicado hasta aquí, vamos a introducir con la ayuda de STEP-7 el código anterior en una función de nombre FC1 y pondremos en OB1 las operaciones que también hemos visto más arriba, pero introduciendo las siguientes modificaciones (marcadas con un “*”): (*) (*) (*)
U FP S U SPBN CALL U R S _001: NOP
E125.0 M0.0 M0.1
//estas tres (3) operaciones, sólo nos sirven //para poner a “1” momentáneamente el //Bit M0.1 (crear el Bit libre M0.1 a partir de E125.0).
M0.1 _001 FC1 M200.0 M0.1 M0.2 0
En este caso, deberemos también crear un bloque OB100 (si no está creado ya) e introducir en él las siguientes operaciones: SET L T T
W#16#0 MW0 AW124
//Cargamos ACU1L con ceros //y los depositamos en MW0 //y AW124
Después de esto, y cargados todos los bloques en el autómata o en el simulador, podremos comprobar que el programa realiza la operación A124.0=E124.0 * E124.1 cada vez que pongamos a “1” la entrada E125.0. 170
Funciones (introducción)
Capítulo 16
16.3 Parámetros formales y parámetros actuales En el ejemplo de función que hemos puesto en el apartado anterior, nos bastaba con llamar a la función FC1 para que ésta realizase el trabajo específico que debía hacer, que era asignar a A124.0 el resultado de la operación lógica AND entre E124.0 y E124.1. Imaginemos ahora que hemos de realizar otra operación AND entre dos (2) Bits distintos a los anteriores, por ejemplo entre E124.6 y E124.7, y queremos asignarle el resultado de esta operación lógica al Bit de salida A125.1, y que también deseamos meter esta operación en una función. Para hacer lo anterior, no tenemos más que repetir paso por paso lo hecho con la función FC1, pero ahora con una nueva función FC2, y habremos resuelto el problema. Ahora bien, el resultado que vamos a obtener después de creada la función FC2 es que tendremos dos (2) funciones FC1 y FC2 distintas en cuanto a los parámetros que usa cada una, pero totalmente idénticas en cuanto al tratamiento que cada una de ellas hace de estos parámetros. Veamos esto más despacio. Repitamos aquí los contenidos de FC1 y FC2 en lenguaje AWL: La función FC1 realiza la tarea: A124.0 = E124.0 * E124.1 O M0.0 ON M0.0 FP M10.0 SPBN _100 S M10.1 R M10.2 R M200.0 _100: NOP 0
La función FC2 realiza la tarea: A125.1 = E124.6 * E124.7 O M0.0 ON M0.0 FP M20.0 SPBN _200 S M20.1 R M20.2 R M200.1 _200: NOP 0
U SPBN U U = SET R S _101: NOP
M10.1 M10.2 0
U SPBN U U = SET R S _201: NOP
M20.1 M20.2 0
U SPBN R S R _102: NOP
M10.2 _102 M10.2 M200.0 M10.0 0
U SPBN R S R _202: NOP
M20.2 _202 M20.2 M200.1 M20.0 0
M10.1 _101 E124.0 E124.1 A124.0
M20.1 _201 E124.6 E124.7 A125.1
Fig.16.8
Es evidente que ambas funciones realizan las mismas operaciones, y que lo que cambia de una a otra función son los Bits que estamos manipulando en cada una de ellas.
171
Funciones (introducción)
Capítulo 16
Llegados aquí, pongamos ahora una cualquiera de las funciones anteriores de la siguiente forma: O ON FP SPBN S R R _100: NOP
M0.0 M0.0 #BitDeTrabajo _100 #BitDeEtapa_1 #BitDeEtapa_2 #BitDeFin 0
U SPBN U U = SET R S _101: NOP
#BitDeEtapa_1 _101 #BitDeEntrada_1 #BitDeEntrada_2 #BitDeSalida #BitDeEtapa_1 #BitDeEtapa_2 0
U SPBN R S R _102: NOP
#BitDeEtapa_2 _102 #BitDeEtapa_2 #BitDeFin #BitDeTrabajo 0
El lector puede comprobar que esta última forma de escribir la función es idéntica a las funciones FC1 y FC2, sólo que hemos dado nombre a los valores de los parámetros. Llegados a este punto, se entiende perfectamente que según queramos ejecutar la función FC1 o la función FC2, no tenemos más que cambiar cada uno de los nombres que hemos puesto anteriormente, por los valores correspondientes en cada caso, y habremos resuelto el problema. O sea: #BitDeTrabajo #BitDeEtapa_1 #BitDeEtapa_2 #BitDeFin #BitDeEntrada_1 #BitDeEntrada_2 #BitDeSalida
Para FC1, sustituir por: M10.0 M10.1 M10.2 M200.0 E124.0 E124.1 A124.0
Para FC2, sustituir por: M20.0 M20.1 M20.2 M200.1 E124.6 E124.7 A125.1
Fig.16.9
A estos valores que aparecen en la columna de la izquierda es lo que en STEP-7 se conoce como PARÁMETROS FORMALES de la función, y los valores concretos que le pasamos a la función cuando nos interesa particularizarlos en un momento determinado, o sea, los valores de las columnas central y derecha, es lo que se conoce en STEP-7 como PARÁMETROS ACTUALES de la función. Como ejemplo práctico de lo que hemos dicho hasta aquí, vamos a crear una función FC1 cuyo contenido sea el que ya hemos dicho antes (lo volvemos a repetir):
172
Funciones (introducción)
Capítulo 16
O ON FP SPBN S R R _100: NOP
M0.0 M0.0 #BitDeTrabajo _100 #BitDeEtapa_1 #BitDeEtapa_2 #BitDeFin 0
U SPBN U U = SET R S _101: NOP
#BitDeEtapa_1 _101 #BitDeEntrada_1 #BitDeEntrada_2 #BitDeSalida #BitDeEtapa_1 #BitDeEtapa_2 0
U SPBN R S R _102: NOP
#BitDeEtapa_2 _102 #BitDeEtapa_2 #BitDeFin #BitDeTrabajo 0
Para ello, deberemos proceder ahora de forma algo distinta a como lo hemos hecho con la función del ejemplo anterior. Empezaremos por borrar la función FC1 si existe (botón de la derecha del ratón sobre FC1 y opción “Borrar”), y crearemos después nuevamente una función de nombre FC1. Haremos doble clic sobre FC1 y saltaremos al editor de FC1. Allí empezaremos por bajar la línea que se indica en la Fig.16.3 hasta que se muestre claramente la siguiente imagen:
Haga doble clic en este icono para definir los nuevos parámetros formales
Fig.16.10 173
Funciones (introducción)
Capítulo 16
Nota: El aspecto exacto del editor puede variar según la versión de que se disponga. Al hacer doble clic sobre el icono que se indica en la Fig.16.10, la imagen toma el siguiente aspecto:
Escriba el nombre del primer parámetro formal, por ejemplo “BitDeTrabajo”
Fig.16.11
Una vez introducido el nombre BitDeTrabajo, pulse la tecla tabulador y haga clic en la flecha que apunta hacia abajo. Se abrirá una ventana desplegable y puesto que BitDeTrabajo es un Bit lógico del tipo Bool, elegiremos la opción “Bool”. Finalmente pulsaremos nuevamente la tecla tabulador y podremos poner algún comentario sobre este Bit (este campo es opcional). Para entonces, STEP-7 ya ha preparado otra posición libre por debajo de la primera y con la misma técnica que hemos empleado antes, empezaremos por definir el nombre del segundo parámetro formal, por ejemplo BitDeEtapa_1. Una vez introducido el nombre BitDeEtapa_1, pasamos con el tabulador al campo “Tipo de datos” y nuevamente elegimos “Bool” por ser también BitDeEtapa_1 un Bit lógico. Le toca ahora el turno a BitDeEtapa_2, después de escribir este nombre en el campo “Nombre”, pondremos en el campo “Tipo de datos” el tipo BOOL. Nos desplazaremos ahora a la casilla inferior y allí escribiremos BitDeFin, después a su casilla de la derecha y nuevamente pondremos BOOL por tratarse también de un Bit. Más abajo pondremos el siguiente Bit que es BitDeEntrada_1, y como ya sabemos que es un Bit, lo declararemos del tipo BOOL. Pondremos después el siguiente Bit, BitDeEntrada_2 y como Bit que es, lo declararemos del tipo BOOL. Finalmente pondremos el BitDeFin que también declararemos del tipo BOOL. Una vez declarados todos los Bits, nos encontraremos con una imagen como la siguiente: 174
Funciones (introducción)
Capítulo 16
Fig.16.12
Ahora que ya hemos declarado los parámetros formales que vamos a usar en la función, podemos introducir el código de la función, quedando finalmente de la siguiente forma:
Fig.16.13
175
Funciones (introducción)
Capítulo 16
Con esto hemos terminado de editar FC1, con lo que ya podemos guardar nuestro trabajo en disco duro haciendo clic en el icono “Guardar”. Volveremos al administrador de STEP-7 y allí haremos doble clic sobre OB1, se nos abrirá nuevamente el editor y escribiremos las operaciones que ya vimos anteriormente y que volvemos a repetir aquí: (*) (*) (*)
U FP S U SPBN CALL U R S _001: NOP
E125.0 M0.0 M0.1
//estas tres (3) operaciones, sólo nos sirven //para poner a “1” momentáneamente el //Bit M0.1 (crear el Bit libre M0.1 a partir de E125.0).
M0.1 _001 FC1 M200.0 M0.1 M0.2 0
Obteniendo el siguiente resultado:
Este texto aparece en rojo
Fig.16.14
Obsérvese como aparecen los parámetros formales de FC1 en color rojo cuando escribimos la operación “CALL FC1”. Con esto, STEP-7 nos está diciendo que debemos proporcionar los parámetros actuales para esta llamada, y por tanto suponiendo que deseamos realizar la misma operación que la función FC1, deberemos igualar los parámetros formales anteriores con los de la tabla de la Fig.16.9, quedando finalmente lo siguiente:
176
Funciones (introducción)
Capítulo 16
Fig.16.15
Con esto podemos ya guardar OB1 en el disco duro y nos quedaría únicamente OB100, en el que depositaremos las siguientes operaciones: SET L T T T
W#16#0 MW0 MW10 AW124
Que también guardaremos en disco duro. Finalmente, introduciremos OB1, OB100 y FC1 en el autómata real o simulado, y comprobaremos que todo funciona según lo esperado. Volvamos ahora a editar OB1, borremos los parámetros actuales que teníamos y pongamos ahora los que correspondían a la antigua FC2 y que están en la tabla de la Fig.16.9. Si volvemos a cargar los bloques OB1, OB100 y FC1 en el autómata, comprobaremos que ahora el conjunto funciona igual que lo hacía la antigua función FC2. Por tanto, llegamos a la conclusión que lo único que tenemos que hacer es cambiar los parámetros actuales en la llamada a la nueva función, para que ésta se comporte bien como la antigua FC1 o bien como la antigua FC2.
177
Tipos de funciones
Capítulo 17
CAPÍTULO 17
Índice
Tipos de funciones 17.1 Tipos de funciones A efectos de uso de este libro, clasificaremos a las funciones en seis (6) tipos distintos, según su modo de funcionamiento y/o según la necesidad de pasar o no parámetros actuales a la función. Para ello, asociaremos a cada función una ficha como la siguiente: * Maneja algún elemento mecánico: ** El elemento mecánico es: ** Trabajo a realizar: * Tiene parámetros formales: * Tiene BitDeError: * Tiene temporizadores: Fig.17.1
Donde cada elemento tiene el siguiente significado: 1.-
“Maneja algún elemento mecánico:” A esta pregunta sólo se puede responder con (SÍ) o (NO), según la función controle o no controle directamente elementos mecánicos, tales como cilindros neumáticos o hidráulicos a través de electro válvula, motores de cualquier tipo a través de contactor, y en general cualquier elemento mecánico que tenga o no tenga elementos que puedan informar si la acción se ha realizado. 1a.-
“El elemento mecánico es:” Si a la pregunta “Maneja algún elemento mecánico:” se ha contestado (SÍ), entonces aquí se concreta qué elemento mecánico es. Por ejemplo CILINDRO NEUMÁTICO.
1b.-
“Trabajo a realizar:” Si a la pregunta “Maneja algún elemento mecánico:” se ha contestado (SÍ), entonces aquí se concreta qué trabajo se debe realizar. Por ejemplo SALIR ÉMBOLO.
2.-
“Tiene parámetros formales:” Esta pregunta solo se responde con (SÍ) o (NO), según la función necesite parámetros actuales que debamos pasarle, o no.
3.-
“Tiene BitDeError:” También esta pregunta se responde con (SÍ) o (NO), dependiendo de si el programador ha decidido dotar a la función con elementos de detección de error, o no.Para poder decir que el programa está dotado con elementos de tratamiento de errores, la función por una parte debe tener elementos de detección de errores que posteriormente se reflejen en el “BitDeError” y además externamente a la función que propiamente genera el BitDeError, debe existir un programa específico de tratamiento de errores. Sólo en caso de que se den estas circunstancias, tiene sentido la consideración de este Bit. 179
Tipos de funciones
4.-
Capítulo 17
“Tiene temporizadores:” Esta pregunta solo admite las respuestas (SÍ) o (NO). Si contestamos (SÍ) es porque la función tiene uno (1) o más temporizadores, en caso contrario, contestaremos (NO).
La clasificación de las funciones se resume en la siguiente tabla: Tipo de función
A
B
C
D
E
F
Ficha de la función * Maneja algún elemento mecánico:(NO) ** El elemento mecánico es:-** Trabajo a realizar:-* Tiene parámetros formales:(NO) * Tiene BitDeError:(NO) * Tiene temporizadores:(NO) * Maneja algún elemento mecánico:(NO) ** El elemento mecánico es:-** Trabajo a realizar:-* Tiene parámetros formales:(SÍ) * Tiene BitDeError:(NO) * Tiene temporizadores:(NO) * Maneja algún elemento mecánico:(SÍ) ** El elemento mecánico es:CILINDRO NEUMÁTICO ** Trabajo a realizar:SALIR ÉMBOLO * Tiene parámetros formales:(NO) * Tiene BitDeError:(NO) * Tiene temporizadores:(NO) * Maneja algún elemento mecánico:(SÍ) ** El elemento mecánico es:CILINDRO NEUMÁTICO ** Trabajo a realizar:SALIR ÉMBOLO * Tiene parámetros formales:(SÍ) * Tiene BitDeError:(NO) * Tiene temporizadores:(NO) * Maneja algún elemento mecánico:(SÍ) ** El elemento mecánico es:CILINDRO NEUMÁTICO ** Trabajo a realizar:SALIR ÉMBOLO * Tiene parámetros formales:(NO) * Tiene BitDeError:(SÍ) * Tiene temporizadores:(SÍ) * Maneja algún elemento mecánico:(SÍ) ** El elemento mecánico es:CILINDRO NEUMÁTICO ** Trabajo a realizar:SALIR ÉMBOLO * Tiene parámetros formales:(SÍ) * Tiene BitDeError:(SÍ) * Tiene temporizadores:(SÍ) Fig.17.2
Se observa como a la pregunta de “El elemento mecánico es:” siempre se ha contestado con “CILINDRO NEUMÁTICO”. La razón de contestar siempre con “CILINDRO NEUMÁTICO” en los casos que hay algún elemento mecánico a controlar, es porque básicamente todos los elementos mecánicos responden al siguiente esquema de funcionamiento: 180
Tipos de funciones
Capítulo 17
Orden de acción
PLC
Confirmación de que la orden de acción se ha realizado
Elemento mecánico real a controlar.
Fig.17.3
Cuando el autómata envía una orden a un elemento mecánico para que realice una acción, pueden pasar las siguientes cosas: a.-
Que el elemento mecánico SÍ disponga de sensores que informen al autómata de que la acción se ha ejecutado.
b.-
Que el elemento mecánico NO disponga de sensores que informen al autómata de que la acción se ha ejecutado.
En el primer caso de que el elemento mecánico si dispone de elementos sensores que informan al PLC de que la acción se ha ejecutado, puede ocurrir que el programador sólo esté interesado en recibir esta respuesta en si misma y no le preocupe el tiempo que haya empleado la acción en realizarse, o bien puede ocurrir que el programador no solamente esté interesado en recibir la confirmación de que la orden se ha ejecutado correctamente sino también si el tiempo empleado en esta acción ha sido superior o no a un tiempo máximo prefijado de antemano En el segundo caso de que el elemento mecánico no disponga de sensores que informen al PLC de que la acción se ha ejecutado, el programador tiene las siguientes alternativas, o bien supone que la orden se ha cumplido y nada más, o bien supone que la orden se ha cumplido después de esperar un tiempo prudencial. Si resumimos las anteriores ideas gráficamente, podremos poner:
Tiene sensores
Se desea confirmación de orden ejecutada pero no importa el tiempo empleado. Se desea confirmación de orden ejecutada y que ésta se ha realizado en un tiempo máximo previsto de antemano.
Orden de acción mecánica
Se supone que la acción se ha ejecutado. No tiene sensores
Se supone que la acción se ha ejecutado después de esperar un tiempo prudencial.
Todo lo anteriormente dicho es aplicable en general a cualquier elemento mecánico y también lo es a los cilindros neumáticos, razón por la que hemos puesto como respuesta CILINDRO NEUMÁTICO como elemento estándar representativo de todos ellos. En cuanto a la respuesta que se da de “SALIR ÉMBOLO” a la pregunta de “Trabajo a realizar”, también puede considerarse como una respuesta estándar dentro de las múltiples acciones simples que puede realizar un elemento mecánico, tales como: subir, bajar, girar, parar, cerrar, abrir, etc.
181
Tipos de funciones
Capítulo 17
17.2 Funciones tipo A Las funciones tipo A son las más sencillas de manejar, por cuanto no controlan ningún elemento mecánico externo. Estas funciones normalmente trabajan sobre Bits internos del PLC y los resultados de estas funciones quedan igualmente almacenados en el interior del PLC sin consecuencias mecánicas hacia el exterior. Por otra parte, no deberemos pasar a la función ningún parámetro actual, dado que estas funciones tienen toda la información auto contenida en si mismas. Veamos un ejemplo de funciones del tipo A. Se trata de realizar la siguiente operación lógica: M50.0 = (E125.0 * E125.1) + (E125.2 * E125.3) G1:
Desde bloque OB1
Inicializar la función en la 1ª pasada y no volver a ejecutar esta etapa
0
=1 Hacer M50.0 = (E125.0 * E125.1) + (E125.2 * E125.3)
1
=1 BitDeFin=1
2 =1
Hacia bloque invocante
G2:
Desde OB1
En la 1ª pasada hacer: 0
Inicializar valores
M10.1=1 (BitDeEtapa_1 = 1) M10.2=0 (BitDeEtapa_2 = 0) M200.0=0 (BitDeFin = 0)
=1 M10.1
M50.0 = (E125.0 * E125.1) + (E125.2 * E125.3)
1
=1 M10.2
M200.0 = 1 M10.0 = 0
2
(BitDeFin = 1) (BitDeTrabajo = 0)
=1 Hacia OB1 182
Tipos de funciones
Capítulo 17
Crearemos ahora la función FC1 y escribiremos dentro: O ON FP SPBN S R R _100: NOP
M0.0 M0.0 M10.0 _100 M10.1 M10.2 M200.0 0
U SPBN O( U U ) O( U U ) = SET R S _101: NOP
M10.1 _101
M10.1 M10.2 0
U SPBN R S R _102: NOP
M10.2 _102 M10.2 M200.0 M10.0 0
//(M10.0 es aquí el “BitDeTrabajo”) //(M10.1 es aquí “BitDeEtapa_1”) //(M10.2 es aquí “BitDeEtapa_2”) //(M200.0 es aquí “BitDeFin”)
E125.0 E125.1 E125.2 E125.3 M50.0
En OB1: (*) (*) (*)
U FP S U SPBN CALL U R S _001: NOP
En OB100:
SET L T T
E124.0 M0.0 M0.1
//estas tres (3) operaciones, sólo nos sirven //para poner a “1” momentáneamente el //Bit M0.1 (crear el Bit libre M0.1 a partir de E124.0).
M0.1 _001 FC1 M200.0 M0.1 M0.2 0
W#16#0 MW0 MW10
//Cargamos ACU1L con ceros //y los depositamos en MW0, //y MW10.
183
Tipos de funciones
Capítulo 17
17.3 Funciones tipo B Las funciones tipo B son prácticamente iguales que las del tipo A, sólo que hemos de pasar la información a la función en forma de parámetros actuales. Veamos un ejemplo idéntico al anterior, pero realizado con una función tipo B. Se trata de realizar la siguiente operación lógica: BitDeMarca = (Bit_1 * Bit_2) + (Bit_3 * Bit_4) Y después particularizarla para: M50.0 = (E125.0 * E125.1) + (E125.2 * E125.3) G1:
Desde bloque OB1
Inicializar la función en la 1ª pasada y no volver a ejecutar esta etapa
0
=1 Hacer: BitDeMarca = (Bit_1 * Bit_2) + (Bit_3 * Bit_4)
1
=1 BitDeFin=1
2 =1
Hacia bloque OB1
G2:
Desde OB1
En la 1ª pasada hacer: 0
Inicializar valores
M10.1=1 (BitDeEtapa_1 = 1) M10.2=0 (BitDeEtapa_2 = 0) M200.0=0 (BitDeFin = 0)
=1
BitDeEtapa_1 BitDeMarca = (Bit_1 * Bit_2) + (Bit_3 * Bit_4)
1
=1 BitDeEtapa_2 BitDeFin = 1 BitDeTrabajo = 0
2
=1 Hacia OB1
184
Tipos de funciones
Capítulo 17
Crearemos ahora la función FC1 y escribiremos dentro: NOTA: Previamente habremos definido los parámetros formales todos del tipo “in_out” y “BOOL”. O M0.0 ON M0.0 FP #BitDeTrabajo SPBN _100 S #BitDeEtapa_1 R #BitDeEtapa_2 R #BitDeFin _100: NOP 0
En OB1:
U SPBN O( U U ) O( U U ) = SET R S _101: NOP
#BitDeEtapa_1 #BitDeEtapa_2 0
U SPBN R S R _102: NOP
#BitDeEtapa_2 _102 #BitDeEtapa_2 #BitDeFin #BitDeTrabajo 0
U FP S
#BitDeEtapa_1 _101 #Bit_1 #Bit_2 #Bit_3 #Bit_4 #BitDeMarca
E 124.0 M 0.0 M 0.1
//estas tres (3) operaciones, sólo nos sirven //para poner a "1" momentáneamente el //Bit M0.1(crear el Bit libre M0.1 a partir de E125.0).
U M 0.1 SPBN _001 CALL FC 1 Bit_1 :=E125.0 Bit_2 :=E125.1 Bit_3 :=E125.2 Bit_4 :=E125.3 BitDeTrabajo :=M10.0 BitDeEtapa_1 :=M10.1 BitDeEtapa_2 :=M10.2 BitDeMarca :=M50.0 BitDeFin :=M200.0 U M 200.0 R M 0.1 S M 0.2 _001: NOP 0 185
Tipos de funciones
En OB100:
Capítulo 17
SET L T T
W#16#0 MW0 MW10
//Cargamos ACU1L con ceros //y los depositamos en MW0, //y MW10.
17.4 Funciones tipo C Las funciones tipo C se caracterizan por tener toda la información auto contenida en la función (igual que las A) pero éstas sí ordenan realizar acciones mecánicas. En este caso, controlaremos que la acción se ha realizado comprobando la respuesta del sensor correspondiente, pero no utilizaremos temporizadores para ver si la acción se ha realizado en un tiempo máximo concreto, ni tampoco estamos interesados en informar al bloque invocante sobre un posible mal funcionamiento del elemento mecánico. Veamos un ejemplo. Se trata de ordenar que salga el émbolo de un cilindro neumático de doble efecto. Para controlar al cilindro neumático, usaremos una electro válvula del tipo 5/2 monoestable (ver apartado 1.9) y supondremos que el solenoide está conectado a la salida del autómata A124.0. Así, el cilindro dispone de dos (2) reles Reed que detectan las posiciones extremas del émbolo del cilindro y que están conectados a E124.0 el rele Reed que detecta que el émbolo está dentro, y a E124.1 el que detecta que el émbolo está fuera. Tabla de entradas/salidas: Entradas
Salidas
E124.0
El émbolo del cilindro está dentro
E124.1
El émbolo del cilindro está fuera
A124.0
Salir cilindro
G1: Desde OB1
Inicializar la función en la 1ª pasada y no volver a ejecutar esta etapa
0
=1 Ordenar que salga el cilindro
1
¿Ha salido el cilindro? BitDeFin=1
2
=1 Hacia OB1
186
Tipos de funciones
G2:
Capítulo 17
Desde OB1
En la 1ª pasada hacer: 0
Inicializar valores
M10.1=1 (BitDeEtapa_1 = 1) M10.2=0 (BitDeEtapa_2 = 0) M200.0=0 (BitDeFin = 0)
=1 M10.1 Hacer A124.0=1
1
E124.1=1 M10.2 M200.0 = 1 M10.0 = 0
2 =1
Hacia OB1
Operaciones AWL en FC1:
En OB1:
O ON FP SPBN S R R _100: NOP
M0.0 M0.0 M10.0 _100 M10.1 M10.2 M200.0 0
U SPBN S U R S _101: NOP
M10.1 _101 A124.0 E124.1 M10.1 M10.2 0
U SPBN R S R _102: NOP
M10.2 _102 M10.2 M200.0 M10.0 0
U FP S U SPBN CALL U R S _001: NOP
E 125.0 M 0.0 M 0.1 M 0.1 _001 FC 1 M 200.0 M 0.1 M 0.2 0
//estas tres (3) operaciones, sólo nos sirven //para poner a "1" momentáneamente el //Bit M0.1(crear el Bit libre M0.1 a partir de E125.0).
187
Tipos de funciones
En OB100:
Capítulo 17
SET L T T
W#16#0 MW0 MW10
//Cargamos ACU1L con ceros //y los depositamos en MW0, //y MW10.
NOTA IMPORTANTE: Los ejercicios que se proponen en este libro no están pensados para ser introducidos directamente en un autómata que deba controlar un proceso real, porque se trata de ejemplos no optimizados de carácter didáctico que sólo pretenden mostrar al lector diferentes técnicas de programación.
Ejercicio 1
Fig.17.4
Se supone que un operario coloca un tubo de cobre manualmente en la posición indicada en la imagen. Una vez depositada la pieza, el operario pulsa un botón de inicio (BI) y a partir de ese momento ocurre lo siguiente: 1.2.3.4.5.6.7.8.9.10.11.12.13.14.-
Sale el cilindro A. Cuando se detecta que A ha salido completamente, sale el cilindro B. Cuando se detecta que B ha salido completamente, se retrae el cilindro B. Cuando se detecta que B ha entrado completamente, sale el cilindro C. Cuando se detecta que C ha salido completamente, sale el cilindro B. Cuando se detecta que B ha salido completamente, se retrae el cilindro B. Cuando se detecta que B ha entrado completamente, se retrae el cilindro A. se retrae el cilindro C. 188
Tipos de funciones
Capítulo 17
Sabemos además que todos los cilindros son de doble efecto y que su control se efectúa con electro válvulas 5/2 monoestables. Realizar un programa que controle el proceso anterior. Vamos a resolver este ejercicio empleando funciones del tipo C (empezamos por las del tipo C por ser las más sencillas en este género, aunque quizás no las que ocupan menos espacio). Asignaremos a cada movimiento elemental de la máquina una función concreta, de la siguiente forma: Función FC1 --Salir cilindro A Función FC2 --Entrar cilindro A Función FC3 --Salir cilindro B Función FC4 --Entrar cilindro B Función FC5 --Salir cilindro C Función FC6 --Entrar cilindro C Estas funciones contendrán toda la información necesaria para actuar (información auto contenida) y no emplearemos temporizadores para controlar los tiempos. Se supone que cada cilindro dispone de dos (2) reles Reed, uno en cada extremo, que informan al autómata de la posición extrema del émbolo. Según todo lo dicho, podemos pintar la siguiente tabla de entradas/salidas: Entradas
Salidas
E124.0
Botón inicio (BI)
A124.0
Salir cilindro/retraer cilindro A
E124.1
El émbolo del cilindro A está fuera
A124.1
Salir cilindro/retraer cilindro B
E124.2
El émbolo del cilindro A está dentro
A124.2
Salir cilindro/retraer cilindro C
E124.3
El émbolo del cilindro B está fuera
E124.4
El émbolo del cilindro B está dentro
E124.5
El émbolo del cilindro C está fuera
E124.6
El émbolo del cilindro C está dentro
G1 de OB1: Retraer cilindros A, B y C.
0
BI 1
5
Salir A 6
Salir B 7
Entrar B
Entrar A y C A y C han entrado
B ha entrado 4
Entrar B
B ha entrado
B ha salido 3
Salir B B ha salido
A ha salido 2
4
0
Salir C
C ha salido 5 189
Tipos de funciones
Capítulo 17
Veamos el G2 de OB1: 4 M0.0
Llamar a FC2 Llamar a FC4 Llamar a FC6
0
M0.5 5
E124.0 y BitDeFin de FC2 y BitDeFin de FC4 y BitDeFin de FC6
M0.1
BitDeFin de FC3
M0.6 6
Llamar a FC1
1
M0.7
M0.2 Llamar a FC3
7
Llamar a FC2 Llamar a FC6 BitDeFin de FC2 y BitDeFin de FC6
BitDeFin de FC3 M0.3 Llamar a FC4
3
Llamar a FC4 BitDeFin de FC4
BitDeFin de FC1 2
Llamar a FC3
0
BitDeFin de FC4 M0.4 Llamar a FC5
4
BitDeFin de FC5 5
Veamos ahora G1 de FC1: Desde OB1
Inicializar la función en la 1ª pasada y no volver a ejecutar esta etapa
0
=1 Ordenar que se retraiga el cilindro A
1
¿Se ha retraído A? BitDeFin=1 de FC1
2
=1 Hacia OB1
190
Tipos de funciones
Capítulo 17
G2 de FC1: Desde OB1 En la 1ª pasada hacer: M10.1=1 M10.2=0 M200.0=0
0
=1 M10.1 A124.0=0
1
E124.2=1 M10.2 M200.0=1
2
=1 Hacia OB1
Operaciones AWL en FC1: O ON FP SPBN S R R _100: NOP
M0.0 M0.0 M10.0 _100 M10.1 M10.2 M200.0 0
U SPBN S U R S _101: NOP
M10.1 _101 A124.0 E124.1 M10.1 M10.2 0
U SPBN R S R _102: NOP
M10.2 _102 M10.2 M200.0 M10.0 0
Con la misma técnica iríamos pintando primeramente los Grafcet G1 y G2 de cada función y posteriormente escribiríamos las operaciones AWL de cada de ellas, obteniéndose finalmente:
191
Tipos de funciones
Capítulo 17
_100:
FC2 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.3 _100 M10.4 M10.5 M200.1 0
_101:
U SPBN R U R S NOP
M10.4 _101 A124.0 E124.2 M10.4 M10.5 0
_102:
U SPBN R S R NOP
M10.5 _102 M10.5 M200.1 M10.3 0
_100:
FC3 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.6 _100 M10.7 M11.0 M200.2 0
_101:
U SPBN S U R S NOP
M10.7 _101 A124.1 E124.3 M10.7 M11.0 0
_102:
U SPBN R S R NOP
M11.0 _102 M11.0 M200.2 M10.6 0
_100:
FC5 O ON FP SPBN S R R NOP
M0.0 M0.0 M11.4 _100 M11.5 M11.6 M200.4 0
_101:
U SPBN S U R S NOP
M11.5 _101 A124.2 E124.5 M11.5 M11.6 0
_102:
U SPBN R S R NOP
M11.6 _102 M11.6 M200.4 M11.4 0
_100:
FC4 O ON FP SPBN S R R NOP
M0.0 M0.0 M11.1 _100 M11.2 M11.3 M200.3 0
_101:
U SPBN R U R S NOP
M11.2 _101 A124.1 E124.4 M11.2 M11.3 0
_102:
U SPBN R S R NOP
M11.3 _102 M11.3 M200.3 M11.1 0
_100:
FC6 O ON FP SPBN S R R NOP
M0.0 M0.0 M11.7 _100 M12.0 M12.1 M200.5 0
_101:
U SPBN R U R S NOP
M12.0 _101 A124.2 E124.6 M12.0 M12.1 0
_102:
U SPBN R S R NOP
M12.1 _102 M12.1 M200.5 M11.7 0
NOTA: Es correcto emplear las mismas etiquetas de salto en todas las funciones, ya que las funciones conocen únicamente a sus etiquetas y no las comparan con las etiquetas que puedan haber en otros bloques. No ocurre lo mismo con las marcas, que por ser recursos comunes a todos los bloques, son conocidas por todos ellos y debemos tener especial cuidado en NO DUPLICAR. Una vez que ya tenemos las funciones, es el momento de escribir OB1 según el G2:
192
Tipos de funciones
Capítulo 17
_000:
U SPBN CALL CALL CALL U U U U R S NOP
M0.0 _000 FC2 FC4 FC6 E124.0 M200.1 M200.3 M200.5 M0.0 M0.1 0
_001:
U SPBN CALL U R S NOP
M0.1 _001 FC1 M200.0 M0.1 M0.2 0
_002:
U SPBN CALL U R S NOP
M0.2 _002 FC3 M200.2 M0.2 M0.3 0
_003:
U SPBN CALL U R S NOP
M0.3 _003 FC4 M200.3 M0.3 M0.4 0
_004:
U SPBN CALL U R S NOP
M0.4 _004 FC5 M200.4 M0.4 M0.5 0
_005:
U SPBN CALL U R S NOP
M0.5 _005 FC3 M200.2 M0.5 M0.6 0
_006:
U SPBN CALL U R S NOP
M0.6 _006 FC4 M200.3 M0.6 M0.7 0
_007:
U SPBN CALL CALL U U R S NOP
M0.7 _007 FC2 FC6 M200.1 M200.5 M0.7 M0.0 0
El programa se ha dispuesto de esta forma por razones de espacio y debe leerse de arriba a abajo y de izquierda a derecha. Nos queda aun OB100, y pondremos: L B#16#0 T MB 0 CALL "FILL" BVAL :=P#M 0.0 BYTE 1 RET_VAL:=MW100 BLK :=P#M 1.0 BYTE 500 L W#16#0 T AW 124 SET S M 0.0
//SFC21
NOTA: No se preocupe el lector si de momento no entiende el significado de algunas operaciones, pues más adelante las estudiaremos con detalle. De momento lo que necesitamos saber, es que con estas operaciones ponemos a “0” el total de la memoria de marcas desde MW0 hasta la posición MW250, ponemos a “0” las salidas AW124 y ponemos a “1” el Bit M0.0. Nos queda ahora introducir nuestros programa en el autómata y comprobar su buen funcionamiento. Veamos otro ejemplo del mismo tipo que el anterior.
193
Tipos de funciones
Capítulo 17
Ejercicio 2
B
D ARRASTRADOR 3 ARRASTRADOR 2
C
N2
N3
N4
N1
ARRASTRADOR 1
A Fig.17.5
La máquina del dibujo, ensambla dos (2) chapas de la siguiente forma. El operario coloca manualmente dos (2) chapas, una en el arrastrador 2 y la otra en arrastrador 3, después de esto pulsa un Botón Empezar (BE) y a partir de aquí ocurre lo siguiente: 1.2.3.4.5.6.7.8.9.10.11.12.13.14.-
Sale cilindro A, que mueve el arrastrador N2-N1 hasta situar N1 bajo el cilindro D. Sale el cilindro D y efectúa el remachado de N1. Se retrae el cilindro D. Sale el cilindro C y sitúa N2 bajo el cilindro D. Sale el cilindro D y efectúa el remachado de N2. Se retrae el cilindro D. Se retrae el cilindro C. Se retrae el cilindro A y sitúa N3 bajo el cilindro D. Sale el cilindro D y efectúa el remachado de N3. Se retrae el cilindro D. Sale el cilindro B y sitúa N4 bajo el cilindro D. Sale el cilindro D y efectúa el remachado de N4. Se retrae el cilindro D. Se retrae el cilindro B.
El operario retira las chapas, coloca dos (2) nuevas chapas y el ciclo vuelve a comenzar. En todos los casos los cilindros están gobernados por electro válvulas del tipo 5/2 monoestables. Se pide realizar un programa que controle el proceso. Este ejercicio lo realizaremos también haciendo uso de funciones tipo C igual que el anterior. Sabemos que el empleo de estas funciones generan mucho código (tal y como se ha visto en el ejemplo pasado), pero por otra parte tienen la ventaja de permitirnos encerrar en una función tareas simples que después podemos llamar desde OB1. Lo mismo que antes, asignaremos cada movimiento elemental a una función, de la siguiente forma:
194
Tipos de funciones
Capítulo 17
Función FC1 Función FC2 Función FC3 Función FC4 Función FC5 Función FC6 Función FC7 Función FC8
-----------------
Salir cilindro A Entrar cilindro A Salir cilindro B Entrar cilindro B Salir cilindro C Entrar cilindro C Salir cilindro D Entrar cilindro D
Tabla de entradas/salidas: Entradas
Salidas
E124.0
Botón Empezar (BE)
A124.0
Salir cilindro/retraer cilindro A
E124.1
El émbolo del cilindro A está fuera
A124.1
Salir cilindro/retraer cilindro B
E124.2
El émbolo del cilindro A está dentro
A124.2
Salir cilindro/retraer cilindro C
E124.3
El émbolo del cilindro B está fuera
A124.3
Salir cilindro/retraer cilindro D
E124.4
El émbolo del cilindro B está dentro
E124.5
El émbolo del cilindro C está fuera
E124.6
El émbolo del cilindro C está dentro
E124.7
El émbolo del cilindro D está fuera
E125.0
El émbolo del cilindro D está dentro
Dibujaremos el G1 de OB1 (que es casi idéntico al G1 del ejercicio anterior): 0
A-, B-, C- y DBE y cilindros retraídos
1
2
3
4
Entrar C
7
11
Entrar A
12
Salir D
13
10
Entrar D D ha entrado
0 14
D ha salido
5
Salir D D ha salido
A ha entrado 9
Salir B B ha salido
C ha entrado 8
Entrar D D ha entrado
D ha entrado
Salir C
C ha salido
Entrar D
6
Entrar D D ha entrado
10
D ha salido
Salir D D ha salido
Salir D
5
Salir A A ha salido
9
4
Entrar B B ha entrado
0
NOTA: Por ejemplo A+ significa salir émbolo cilindro A, y A- significa retraer émbolo cilindro A. 195
Tipos de funciones
Capítulo 17
Y el G2 de OB1: 8 Llamar a FC2 Llamar a FC4 Llamar a FC6 Llamar a FC8
M0.0 0
4
1
Llamar a FC1
Llamar a FC7
5
BitDeFin de FC7 BitDeFin de FC7
M0.6
M1.2
BitDeFin de FC1
M0.2
BitDeFin de FC8 Llamar a FC7
M0.7
BitDeFin de FC7
BitDeFin de FC6
M0.3 3
Llamar a FC8
M1.0
BitDeFin de FC8
BitDeFin de FC2 4
M1.3
Llamar a FC5
BitDeFin de FC3 M1.4 Llamar a FC7
12
BitDeFin de FC7 M1.5 Llamar a FC8
13
9
BitDeFin de FC5
Llamar a FC3
11
Llamar a FC2
08
M0.4
BitDeFin de FC8
Llamar a FC6
7
Llamar a FC8
10
Llamar a FC8
6
2
Llamar a FC7
9
M0.5
E124.0 y BitDeFin de FC2 y BitDeFin de FC4 y BitDeFin de FC6 y BitDeFin de FC8.
M0.1
M1.1
BitDeFin de FC8 M1.6
5
Llamar a FC4
14
BitDeFin de FC4 0
En cuanto al G1 y G2 de las funciones, usaremos las ya hechas, ya que son las mismas funciones. Así pues, empecemos por escribir las operaciones de las funciones tal y como hicimos en el ejercicio anterior.
_100:
FC1 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.0 _100 M10.1 M10.2 M200.0 0
_101:
U SPBN S U R S NOP
M10.1 _101 A124.0 E124.1 M10.1 M10.2 0
_100:
FC2 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.3 _100 M10.4 M10.5 M200.1 0
_101:
U SPBN R U R S NOP
M10.4 _101 A124.0 E124.2 M10.4 M10.5 0
196
_100:
FC3 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.6 _100 M10.7 M11.0 M200.2 0
_101:
U SPBN S U R S NOP
M10.7 _101 A124.1 E124.3 M10.7 M11.0 0
Tipos de funciones
Capítulo 17
_102:
U SPBN R S R NOP
M10.2 _102 M10.2 M200.0 M10.0 0
_100:
FC4 O ON FP SPBN S R R NOP
M0.0 M0.0 M11.1 _100 M11.2 M11.3 M200.3 0
_101:
U SPBN R U R S NOP
M11.2 _101 A124.1 E124.4 M11.2 M11.3 0
_102:
U SPBN R S R NOP
M11.3 _102 M11.3 M200.3 M11.1 0
_102:
U SPBN R S R NOP
M10.5 _102 M10.5 M200.1 M10.3 0
_100:
FC5 O ON FP SPBN S R R NOP
M0.0 M0.0 M11.4 _100 M11.5 M11.6 M200.4 0
_101:
U SPBN S U R S NOP
M11.5 _101 A124.2 E124.5 M11.5 M11.6 0
_102:
U SPBN R S R NOP
M11.6 _102 M11.6 M200.4 M11.4 0
_100:
FC7 O ON FP SPBN S R R NOP
M0.0 M0.0 M12.2 _100 M12.3 M12.4 M200.6 0
_101:
U SPBN S U R S NOP
M12.3 _101 A124.3 E124.7 M12.3 M12.4 0
_102:
U SPBN R S R NOP
M12.4 _102 M12.4 M200.6 M12.2 0
197
_102:
U SPBN R S R NOP
M11.0 _102 M11.0 M200.2 M10.6 0
_100:
FC6 O ON FP SPBN S R R NOP
M0.0 M0.0 M11.7 _100 M12.0 M12.1 M200.5 0
_101:
U SPBN R U R S NOP
M12.0 _101 A124.2 E124.6 M12.0 M12.1 0
_102:
U SPBN R S R NOP
M12.1 _102 M12.1 M200.5 M11.7 0
_100:
FC8 O ON FP SPBN S R R NOP
M0.0 M0.0 M12.5 _100 M12.6 M12.7 M200.7 0
_101:
U SPBN R U R S NOP
M12.6 _101 A124.3 E125.0 M12.6 M12.7 0
_102:
U SPBN R S R NOP
M12.7 _102 M12.7 M200.7 M12.5 0
Tipos de funciones
Capítulo 17
Es el momento de pasar a operaciones AWL el G2 de OB1:
_000:
U SPBN CALL CALL CALL CALL U U U U U R S NOP
M0.0 _000 FC2 FC4 FC6 FC8 E124.0 M200.1 M200.3 M200.5 M200.7 M0.0 M0.1 0
_001:
U SPBN CALL U R S NOP
M0.1 _001 FC1 M200.0 M0.1 M0.2 0
_002:
U SPBN CALL U R S NOP
M0.2 _002 FC7 M200.6 M0.2 M0.3 0
_003:
U SPBN CALL U R S NOP
M0.3 _003 FC8 M200.7 M0.3 M0.4 0
_004:
U SPBN CALL U R S NOP
M0.4 _004 FC5 M200.4 M0.4 M0.5 0
_005:
U SPBN CALL U R S NOP
M0.5 _005 FC7 M200.6 M0.5 M0.6 0
_006:
U SPBN CALL U R S NOP
M0.6 _006 FC8 M200.7 M0.6 M0.7 0
_007:
U SPBN CALL U R S NOP
M0.7 _007 FC6 M200.5 M0.7 M1.0 0
_010:
U SPBN CALL U R S NOP
M1.0 _010 FC2 M200.1 M1.0 M1.1 0
_011:
U SPBN CALL U R S NOP
M1.1 _011 FC7 M200.6 M1.1 M1.2 0
_012:
U SPBN CALL U R S NOP
M1.2 _012 FC8 M200.7 M1.2 M1.3 0
_013:
U SPBN CALL U R S NOP
M1.3 _013 FC3 M200.2 M1.3 M1.4 0
_014:
U SPBN CALL U R S NOP
M1.4 _014 FC7 M200.6 M1.4 M1.5 0
_015:
U SPBN CALL U R S NOP
M1.5 _015 FC8 M200.7 M1.5 M1.6 0
_016:
U SPBN CALL U R S NOP
M1.6 _016 FC4 M200.3 M1.6 M0.0 0
En cuanto a OB100, usaremos el mismo que el del ejercicio anterior, razón por la que no lo repetiremos aquí.
198
Tipos de funciones
Capítulo 17
Ejercicio 3
Fig.17.6
Este ejemplo ya lo vimos en el apartado 15.3, sólo que allí nos sirvió únicamente como ejemplo de lo que es una máquina transfer, y aquí lo resolveremos ahora con detalle. Dado que el funcionamiento de la máquina ya se vio en 15.3, sólo remarcaremos el funcionamiento de los cilindros A y B, que en 15.3 no se explicaron. Cuando sale el émbolo del cilindro A, éste hace que la mesa gire un ángulo aproximado de 90º. Una vez realizado el giro de 90º, sale el cilindro B, que por su forma constructiva se encaja en un entrante de forma cónica de la mesa que permite, por una parte sujetar la mesa firmemente, por otra terminar de posicionar la mesa un ángulo exacto de 90º. Pasamos directamente a la tabla de contactos de entrada/salida: E124.0 E124.1 E124.2 E124.3 E124.4 E124.5 E124.6 E124.7 E125.0 E125.1 E125.2 E125.3 E125.4 E125.5 E125.6 E125.7 E126.0 E126.1 E126.2
Entradas Botón Empezar (BE) El émbolo del cilindro A está dentro El émbolo del cilindro A está fuera El émbolo del cilindro B está dentro El émbolo del cilindro B está fuera El émbolo del cilindro C está dentro El émbolo del cilindro C está fuera El émbolo del cilindro D está dentro El émbolo del cilindro D está fuera El émbolo del cilindro E está dentro El émbolo del cilindro E está fuera El émbolo del cilindro F está dentro El émbolo del cilindro F está fuera El émbolo del cilindro G está dentro El émbolo del cilindro G está fuera El émbolo del cilindro H está dentro El émbolo del cilindro H está fuera El émbolo del cilindro I/J está dentro El émbolo del cilindro I/J está fuera
(RR1) (RR2) (RR3) (RR4) (RR5) (RR6) (RR7) (RR8) (RR9) (RR10) (RR11) (RR12) (RR13) (RR14) (RR15) (RR16) (RR17) (RR18)
199
A124.0 A124.1 A124.2 A124.3 A124.4 A124.5 A124.6 A124.7 A125.0
Salidas Salir cilindro/retraer cilindro A Salir cilindro/retraer cilindro B Salir cilindro/retraer cilindro C Salir cilindro/retraer cilindro D Salir cilindro/retraer cilindro E Salir cilindro/retraer cilindro F Salir cilindro/retraer cilindro G Salir cilindro/retraer cilindro H Salir cilindro/retraer cilindros I/J
Tipos de funciones
Capítulo 17
Siendo “RRn” el rele Reed “n” que detecta la posición del émbolo del cilindro sobre el que esté montado. Emplearemos las siguientes funciones tipo C: Nombre FC1 FC2 FC3 FC4 FC5 FC6 FC7 FC8 FC9
Tarea
Nombre
Salir A (A+) Retraer A (A-) Salir B (B+) Retraer B (B-) Salir C (C+) Retraer C (C-) Salir D (D+) Retraer D (D-) Salir E (E+)
FC10 FC11 FC12 FC13 FC14 FC15 FC16 FC17 FC18
Tarea Retraer E (E-) Salir F (F+) Retraer F (F-) Salir G (G+) Retraer G (G-) Salir H (H+) Retraer H (H-) Salir I/J (I/J+) Retraer I/J (I/J-)
Dado que los cilindros que intervienen en este proceso funcionan en sus posiciones extremas, y las electro válvulas que se emplean son del tipo 5/2 monoestables, las funciones FC1-FC18 son del mismo tipo que ya vimos en el ejercicio anterior. Pondremos también una tabla donde se muestran los “BitDeFin” de cada función: Nombre de la función FC1 FC2 FC3 FC4 FC5 FC6 FC7 FC8 FC9
BitDeFin
Nombre de la función
M200.0 M200.1 M200.2 M200.3 M200.4 M200.5 M200.6 M200.7 M201.0
_100:
FC1 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.0 _100 M10.1 M10.2 M200.0 0
_101:
U SPBN S U R S NOP
M10.1 _101 A124.0 E124.2 M10.1 M10.2 0
_102:
U SPBN R S R NOP
M10.2 _102 M10.2 M200.0 M10.0 0
FC10 FC11 FC12 FC13 FC14 FC15 FC16 FC17 FC18
_100:
FC2 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.3 _100 M10.4 M10.5 M200.1 0
_101:
U SPBN R U R S NOP
M10.4 _101 A124.0 E124.1 M10.4 M10.5 0
_102:
U SPBN R S R NOP
M10.5 _102 M10.5 M200.1 M10.3 0
200
BitDeFin M201.1 M201.2 M201.3 M201.4 M201.5 M201.6 M201.7 M202.0 M202.1
_100:
FC3 O ON FP SPBN S R R NOP
M0.0 M0.0 M10.6 _100 M10.7 M11.0 M200.2 0
_101:
U SPBN S U R S NOP
M10.7 _101 A124.1 E124.4 M10.7 M11.0 0
_102:
U SPBN R S R NOP
M11.0 _102 M11.0 M200.2 M10.6 0
Tipos de funciones FC4
Capítulo 17
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M11.1 _100 M11.2 M11.3 M200.3 0
_101:
U SPBN R U R S NOP
M11.2 _101 A124.1 E124.3 M11.2 M11.3 0
_102:
U SPBN R S R NOP
M11.3 _102 M11.3 M200.3 M11.1 0
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M12.2 _100 M12.3 M12.4 M200.6 0
_101:
U SPBN S U R S NOP
M12.3 _101 A124.3 E125.0 M12.3 M12.4 0
_102:
U SPBN R S R NOP
M12.4 _102 M12.4 M200.6 M12.2 0
FC7
FC5
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M11.4 _100 M11.5 M11.6 M200.4 0
_101:
U SPBN S U R S NOP
M11.5 _101 A124.2 E124.6 M11.5 M11.6 0
_102:
U SPBN R S R NOP
M11.6 _102 M11.6 M200.4 M11.4 0
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M12.5 _100 M12.6 M12.7 M200.7 0
_101:
U SPBN R U R S NOP
M12.6 _101 A124.3 E124.7 M12.6 M12.7 0
_102:
U SPBN R S R NOP
M12.7 _102 M12.7 M200.7 M12.5 0
FC8
201
FC6
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M11.7 _100 M12.0 M12.1 M200.5 0
_101:
U SPBN R U R S NOP
M12.0 _101 A124.2 E124.5 M12.0 M12.1 0
_102:
U SPBN R S R NOP
M12.1 _102 M12.1 M200.5 M11.7 0
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M13.0 _100 M13.1 M13.2 M201.0 0
_101:
U SPBN S U R S NOP
M13.1 _101 A124.4 E125.2 M13.1 M13.2 0
_102:
U SPBN R S R NOP
M13.2 _102 M13.2 M201.0 M13.0 0
FC9
Tipos de funciones
Capítulo 17
_100:
FC10 O ON FP SPBN S R R NOP
M0.0 M0.0 M13.3 _100 M13.4 M13.5 M201.1 0
_101:
U SPBN R U R S NOP
M13.4 _101 A124.4 E125.1 M13.4 M13.5 0
_102:
U SPBN R S R NOP
M13.5 _102 M13.5 M201.1 M13.3 0
_100:
O ON FP SPBN S R R NOP
FC13 M0.0 M0.0 M14.4 _100 M14.5 M14.6 M201.4 0
_101:
U SPBN S U R S NOP
M14.5 _101 A124.6 E125.6 M14.5 M14.6 0
_102:
U SPBN R S R NOP
M14.6 _102 M14.6 M201.4 M14.4 0
_100:
FC11 O ON FP SPBN S R R NOP
M0.0 M0.0 M13.6 _100 M13.7 M14.0 M201.2 0
_101:
U SPBN S U R S NOP
M13.7 _101 A124.5 E125.4 M13.7 M14.0 0
_102:
U SPBN R S R NOP
M14.0 _102 M14.0 M201.2 M13.6 0
_100:
O ON FP SPBN S R R NOP
FC14 M0.0 M0.0 M14.7 _100 M15.0 M15.1 M201.5 0
_101:
U SPBN R U R S NOP
M15.0 _101 A124.6 E125.5 M15.0 M15.1 0
_102:
U SPBN R S R NOP
M15.1 _102 M15.1 M201.5 M14.7 0
202
_100:
FC12 O ON FP SPBN S R R NOP
M0.0 M0.0 M14.1 _100 M14.2 M14.3 M201.3 0
_101:
U SPBN R U R S NOP
M14.2 _101 A124.5 E125.3 M14.2 M14.3 0
_102:
U SPBN R S R NOP
M14.3 _102 M14.3 M201.3 M14.1 0
_100:
O ON FP SPBN S R R NOP
FC15 M0.0 M0.0 M15.2 _100 M15.3 M15.4 M201.6 0
_101:
U SPBN S U R S NOP
M15.3 _101 A124.7 E126.0 M15.3 M15.4 0
_102:
U SPBN R S R NOP
M15.4 _102 M15.4 M201.6 M15.2 0
Tipos de funciones
FC16
Capítulo 17
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M15.5 _100 M15.6 M15.7 M201.7 0
_101:
U SPBN R U R S NOP
M15.6 _101 A124.7 E125.7 M15.6 M15.7 0
_102:
U SPBN R S R NOP
M15.7 _102 M15.7 M201.7 M15.5 0
FC17
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M16.0 _100 M16.1 M16.2 M202.0 0
_101:
U SPBN S U R S NOP
M16.1 _101 A125.0 E126.2 M16.1 M16.2 0
_102:
U SPBN R S R NOP
M16.2 _102 M16.2 M202.0 M16.0 0
FC18
_100:
O ON FP SPBN S R R NOP
M0.0 M0.0 M16.3 _100 M16.4 M16.5 M202.1 0
_101:
U SPBN R U R S NOP
M16.4 _101 A125.0 E126.1 M16.4 M16.5 0
_102:
U SPBN R S R NOP
M16.5 _102 M16.5 M202.1 M16.3 0
Vamos a prestar ahora mucha atención al Grafcet G1 de OB1.
Hacer: A- , B+, C-, D-, E-, F-, G-, H- e I/J-
0
BE*RR1*RR4*RR5*RR7*RR9*RR11*RR13*RR15*RR17
B-
1 RR3
2
203
10,19,28,35
Tipos de funciones
Capítulo 17
1 A+
2
RR2 B+
3
RR4
C+
4
RR6
RR8
RR7
RR8
H-
27
RR15 E-
18
RR7
28
ESPERAR
RR9 C-
9
RR17
RR13 D-
8
G-
17
IJ-
26
RR11*RR14 D+
7
FG+
16
35
RR18
RR12 D-
6
RR1 I+ J+
25
19
ESPERAR
RR5 10
ESPERAR
TODAS LAS SECUENCIAS HAN TERMINADO
1
204
A-
34
RR16 F+
15
H+
24
RR10 D+
5
E+
14
ESPERAR
Tipos de funciones
Capítulo 17
Y ahora podemos pintar el G2 de OB1: M0.0 0
10,19,28,35
Llamar a: FC2, FC3, FC6, FC8, FC10, FC12, FC14, FC16, FC18 E124.0*M200.1*M200.2*M200.5*M200.7* M201.1*M201.3*M201.5*M201.7*M202.1
M0.1 FC4
1 E124.3
M0.2
FC1
2 E124.2
M0.3
FC3
3 E124.4
M1.3
M0.4 FC5
4
E124.6
M0.5
M1.5
E124.7
M0.7
E125.0
M1.0
E124.7
M1.1
FC10
18
FC16 E125.7
M2.5 28
E125.1 ESPERAR
19
E124.5
M1.2 10
ESPERAR
M1.2*M2.0*M2.5*M2.7
1
205
E124.1
M2.7
E126.1 27
FC2
34
FC17
25
FC14 E125.5
M1.7
M2.0 FC6
9
E126.0
M2.2
E125.3*E125.6 M2.4 17
FC8
8
FC15
E125.4 E126.2 M2.3 FC12 FC18 16 26 FC13
M1.6 FC7
7
M2.6 24
FC11
15
FC8
6
E125.2
M1.4
E125.0
M0.6
FC9
14
FC7
5
M2.1
ESPERAR
35
ESPERAR
Tipos de funciones
Capítulo 17
La traducción a lenguaje AWL del G2 anterior será: U M 0.0 SPBN _000 CALL FC 2 CALL FC 3 CALL FC 8 CALL FC 6 CALL FC 10 CALL FC 12 CALL FC 14 CALL FC 16 CALL FC 18 U E U M U M U M U M U M U M U M U M U M R M S M _000: NOP
124.0 200.1 200.2 200.7 200.5 201.1 201.3 201.5 201.7 202.1 0.0 0.1 0
U M 0.1 SPBN _001 CALL FC 4 U M 200.3 R M 0.1 S M 0.2 _001: NOP 0 U M 0.2 SPBN _002 CALL FC 1 U M 200.0 R M 0.2 S M 0.3 _002: NOP 0 U M 0.3 SPBN _003 CALL FC 3 U M 200.2 R M 0.3 S M 0.4 S M 1.3 S M 2.1 S M 2.6 _003: NOP 0 U M 0.4 SPBN _004 CALL FC 5 U M 200.4 R M 0.4 S M 0.5 _004: NOP 0
//Entrar A //Salir B //Entrar D //Entrar C //Entrar E //Entrar F //Entrar G //Entrar H //Entrar I/J //Botón empezar
U M 0.5 SPBN _005 CALL FC 7 U M 200.6 R M 0.5 S M 0.6 _005: NOP 0 U M 0.6 SPBN _006 CALL FC 8 U M 200.7 R M 0.6 S M 0.7 _006: NOP 0 U M 0.7 SPBN _007 CALL FC 7 U M 200.6 R M 0.7 S M 1.0 _007: NOP 0
//Entrar B
//Salir A
//Salir B
//Salir C
U M 1.0 SPBN _008 CALL FC 8 U M 200.7 R M 1.0 S M 1.1 _008: NOP 0 U M 1.1 SPBN _009 CALL FC 6 U M 200.5 R M 1.1 S M 1.2 _009: NOP 0 U M 1.3 SPBN _014 CALL FC 9 U M 201.0 R M 1.3 S M 1.4 _014: NOP 0 U M 1.4 SPBN _015 CALL FC 11 U M 201.2 R M 1.4 S M 1.5 _015: NOP 0
206
//Salir D
//Entrar D
//Salir D
//Entrar D
//Entrar C
//Salir E
//Salir F
Tipos de funciones
G
U M 1.5 SPBN _016 CALL FC 12
Capítulo 17
//Entrar F y salir
CALL FC 13 U M 201.3 U M 201.4 R M 1.5 S M 1.6 _016: NOP 0 U M 1.6 SPBN _017 CALL FC 14 U M 201.5 R M 1.6 S M 1.7 _017: NOP 0 U M 1.7 SPBN _018 CALL FC 10 U M 201.1 R M 1.7 S M 2.0 _018: NOP 0 U M 2.1 SPBN _024 CALL FC 15 U M 201.6 R M 2.1 S M 2.2 _024: NOP 0 U M 2.2 SPBN _025 CALL FC 17 U M 202.0 R M 2.2 S M 2.3 _025: NOP 0
//Entrar G
U M 2.3 SPBN _026 CALL FC 18 U M 202.1 R M 2.3 S M 2.4 _026: NOP 0 U M 2.4 SPBN _027 CALL FC 16 U M 201.7 R M 2.4 S M 2.5 _027: NOP 0
//Entrar H
U
//Entrar E
M 2.6 SPBN _034 CALL FC 2 U M 200.1 R M 2.6 S M 2.7 _034: NOP 0
//Entrar I/J
U U U U R R R R S
//Salir H
M M M M M M M M M
//Entrar A
1.2 2.0 2.5 2.7 1.2 2.0 2.5 2.7 0.1
//Salir I/J
17.5 Funciones tipo D A las funciones tipo D, igual que las B, hay que pasarles la información por medio de parámetros actuales, pues en sí mismas lo único que contienen son parámetros formales que nosotros hemos definido previamente. Además son específicas para manejo de elementos mecánicos estándar, y son sencillas de usar porque no contemplan la detección de errores ni tampoco contienen temporizadores. Vamos a ver un ejemplo de manejo de funciones tipo D. Resolveremos el mismo ejercicio anterior de la Fig.17.5, pero empleando funciones tipo D. Para ello, crearemos dos (2) funciones FC1 y FC2 tales que la FC1 realice la tarea de sacar el émbolo de un cilindro cualquiera y la FC2 realice la tarea de introducir el émbolo de un cilindro cualquiera. Empezaremos como siempre pintando la tabla de entradas/salidas, que lógicamente debe ser la misma que ya teníamos (cambia el software, no el hardware). 207
Tipos de funciones
Capítulo 17 Entradas
Salidas
E124.0
Botón Empezar (BE)
A124.0
Salir cilindro/retraer cilindro A
E124.1
El émbolo del cilindro A está fuera
A124.1
Salir cilindro/retraer cilindro B
E124.2
El émbolo del cilindro A está dentro
A124.2
Salir cilindro/retraer cilindro C
E124.3
El émbolo del cilindro B está fuera
A124.3
Salir cilindro/retraer cilindro D
E124.4
El émbolo del cilindro B está dentro
E124.5
El émbolo del cilindro C está fuera
E124.6
El émbolo del cilindro C está dentro
E124.7
El émbolo del cilindro D está fuera
E125.0
El émbolo del cilindro D está dentro
En principio deberíamos dibujar el G1 de OB1, pero dado que se trata del mismo mecanismo y del mismo funcionamiento, el G1 es también el mismo que ya teníamos. El G2 es también básicamente el mismo que el anterior, pero ahora cambiarán las órdenes concretas que tengamos que dar para conseguir los mismos resultados. Veamos esto: 8 M0.0 0
Llamar a FC2 (A) Llamar a FC2 (B) Llamar a FC2 (C) Llamar a FC2 (D)
4 M0.5
E124.0 y BitDeFin de FC2 (A) y BitDeFin de FC2 (B) y BitDeFin de FC2 (C) y BitDeFin deFC2 (D)
M0.1 1
Llamar a FC1 (A)
M1.1 9 Llamar a FC1 (D)
5
BitDeFin de FC1 (D) BitDeFin de FC1 (D)
M0.6
M1.2 10
Llamar a FC2 (D)
6 BitDeFin de FC1 (A)
M0.2 2
Llamar a FC1 (D)
BitDeFin de FC2 (D)
M0.7
BitDeFin de FC1 (D) 3
Llamar a FC2 (D)
BitDeFin de FC2 (D)
M0.4 4
BitDeFin de FC2 (C)
M1.0
11
M1.4 12
9
Llamar a FC1 (D)
BitDeFin de FC1 (D) 13
Llamar a FC2 (D)
BitDeFin de FC2 (D)
M1.6 5
Llamar a FC1 (B)
BitDeFin de FC1 (B)
BitDeFin de FC2 (A) M1.5
Llamar a FC1 (C)
BitDeFin de FC1 (C)
M1.3
Llamar a FC2 (A)
08
Llamar a FC2 (D)
BitDeFin de FC2 (D)
Llamar a FC2 (C)
7
M0.3
Llamar a FC1 (D)
14
Llamar a FC2 (B)
BitDeFin de FC2 (B) 0
208
Tipos de funciones
Capítulo 17
Donde: FC1 (LETRA) = Función FC1 con parámetros actuales de cilindro “LETRA” FC2 (LETRA) = Función FC2 con parámetros actuales de cilindro “LETRA” Veamos ahora el Grafcet G1 y G2 de FC1: G1 de FC1: Desde OB1
Inicializar la función en la 1ª pasada y no volver a ejecutar esta etapa
0 =1
Salir embolo del cilindro
1
El embolo ha salido
BitDeFin=1
2
=1 Hacia OB1
G2: Desde OB1
En la 1ª pasada hacer: 0
Inicializar valores
BitDeEtapa_1=1 BitDeEtapa_2=0 BitDeFin = 0
=1 BitDeEtapa_1 BitDeSalidaAfectada = 1
1
BitDeEntradaAfectada=1
BitDeEtapa_2
BitDeFin=1 BitDeTrabajo=0
2 =1
Hacia OB1
209
Tipos de funciones
Capítulo 17
Crearemos ahora la función FC1 en el administrador general de STEP-7 y empezaremos por declarar e introducir los parámetros formales de la función (tal y como ya vimos en el apartado 16.4) , que serán los siguientes (todos del tipo “in-out”): BitDeTrabajo BOOL BitDeEtapa_1 BOOL BitDeEtapa_2 BOOL BitDeFin BOOL BitDeSalidaAfectada BOOL BitDeEntradaAfectada BOOL Una vez declarados los nombres y el tipo de todos los parámetros formales, pasaremos a escribir las operaciones de FC1: O ON FP SPBN S R R _100: NOP
M0.0 M0.0 #BitDeTrabajo _100 #BitDeEtapa_1 #BitDeEtapa_2 #BitDeFin 0
U SPBN S U R S _101: NOP
#BitDeEtapa_1 _101 #BitDeSalidaAfectada #BitDeEntradaAfectada #BitDeEtapa_1 #BitDeEtapa_2 0
U SPBN R S R _102: NOP
#BitDeEtapa_2 _102 #BitDeEtapa_2 #BitDeFin #BitDeTrabajo 0
En cuanto al Grafcet G2 de FC2, es casi evidente que es idéntico al G2 de FC1, sólo que en lugar de tener como tarea la de “Salir émbolo del cilindro”, aquí tiene la de “Entrar émbolo del cilindro”, por lo que podemos poner:
210
Tipos de funciones
Capítulo 17 Desde OB1
G2 de FC2:
En la 1ª pasada hacer: 0
Inicializar valores
BitDeEtapa_1=1 BitDeEtapa_2=0 BitDeFin = 0)
=1 BitDeEtapa_1 BitDeSalidaAfectada = 0
1
BitDeEntradaAfectada=1 BitDeEtapa_2
BitDeFin=1 BitDeTrabajo=0
2
=1 Hacia OB1
Crearemos la función FC2 y declararemos los siguientes parámetros formales: BOOL BitDeTrabajo BitDeEtapa_1 BOOL BitDeEtapa_2 BOOL BitDeFin BOOL BitDeSalidaAfectada BOOL BitDeEntradaAfectada BOOL Que como podemos observar son los mismos que hemos usado en FC1. La razón de hacerlo así, es porque el nombre que demos a los parámetros formales de una función son únicamente conocidos por la función, por lo que nombres idénticos en funciones distintas se comportan como si los nombres fueran también distintos (Ejemplo: El Pepe que vive en el 1º 2ª no es el mismo Pepe que vive en el 4º 3ª, y aún llamándose igual, en sus respectivas casas no hay ninguna confusión). Así pues, el G2 de FC2 en operaciones AWL será: O M0.0 ON M0.0 FP #BitDeTrabajo SPBN _100 S #BitDeEtapa_1 R #BitDeEtapa_2 R #BitDeFin _100: NOP 0 U SPBN R U R S _101: NOP
#BitDeEtapa_1 _101 #BitDeSalidaAfectada // #BitDeEntradaAfectada #BitDeEtapa_1 #BitDeEtapa_2 0
U SPBN R S R _102: NOP
#BitDeEtapa_2 _102 #BitDeEtapa_2 #BitDeFin #BitDeTrabajo 0 211
Esta es la única operación que cambia
Tipos de funciones
Capítulo 17
Después de creadas (y guardadas en disco, ¡no lo olvide!) las funciones FC1 y FC2, es el momento de escribir las operaciones de OB1, y pondremos: En cada página se lee de arriba a abajo y de izquierda a derecha: U M 0.0 SPBN _000 CALL FC 2 BitDeTrabajo :=M10.0 BitDeEtapa_1 :=M10.1 BitDeEtapa_2 :=M10.2 BitDeFin :=M200.1 BitDeEntradaAfectada:=E124.2 BitDeSalidaAfectada :=A124.0 CALL FC 2 BitDeEtapa_2 :=M11.0 BitDeFin :=M200.5 BitDeEntradaAfectada:=E124.6 BitDeSalidaAfectada :=A124.2 CALL FC 2 BitDeTrabajo :=M11.1 BitDeEtapa_1 :=M11.2 BitDeEtapa_2 :=M11.3 BitDeFin :=M200.7 BitDeEntradaAfectada:=E125.0 BitDeSalidaAfectada :=A124.3 U M 200.1 U M 200.3 U M 200.5 U M 200.7 U E 124.0 R M 0.0 S M 0.1 _000: NOP 0 M 0.1 SPBN _001 CALL FC 1 BitDeTrabajo :=M11.4 BitDeEtapa_1 :=M11.5 BitDeEtapa_2 :=M11.6 BitDeFin :=M200.0 BitDeEntradaAfectada:=E124.1 BitDeSalidaAfectada :=A124.0 U M 200.0 R M 0.1 S M 0.2 _001: NOP 0
//A-
//B-
_003: NOP 0 //C-
//D-
U M 0.4 SPBN _004 CALL FC 1 BitDeTrabajo :=M12.5 BitDeEtapa_1 :=M12.6 BitDeEtapa_2 :=M12.7 BitDeFin :=M200.4 BitDeEntradaAfectada:=E124.5 BitDeSalidaAfectada :=A124.2 U M 200.4 R M 0.4 S M 0.5 _004: NOP 0
//A+
U M 0.5 SPBN _005 CALL FC 1 BitDeTrabajo :=M13.0 BitDeEtapa_1 :=M13.1 BitDeEtapa_2 :=M13.2 BitDeFin :=M200.6 BitDeEntradaAfectada:=E124.7 BitDeSalidaAfectada :=A124.3 U M 200.6 R M 0.5 S M 0.6 _005: NOP 0
//D+
U M 0.6 SPBN _006 CALL FC 2 BitDeTrabajo :=M13.3 BitDeEtapa_1 :=M13.4 BitDeEtapa_2 :=M13.5 BitDeFin :=M200.7 BitDeEntradaAfectada:=E125.0 BitDeSalidaAfectada :=A124.3 U M 200.7 R M 0.6 S M 0.7 _006: NOP 0
U
U M 0.2 SPBN _002 CALL FC 1 BitDeTrabajo :=M11.7 BitDeEtapa_1 :=M12.0 BitDeEtapa_2 :=M12.1 BitDeFin :=M200.6 BitDeEntradaAfectada:=E124.7 BitDeSalidaAfectada :=A124.3 U M 200.6 R M 0.2 S M 0.3 _002: NOP 0
BitDeTrabajo :=M10.3 BitDeEtapa_1 :=M10.4 BitDeEtapa_2 :=M10.5 BitDeFin :=M200.3 BitDeEntradaAfectada:=E124.4 BitDeSalidaAfectada :=A124.1 CALL FC 2 BitDeTrabajo :=M10.6 BitDeEtapa_1 :=M10.7
U M 0.7 SPBN _007 CALL FC 2 212
//C+
//D+
//D-
Tipos de funciones
U M 0.3 SPBN _003 CALL FC 2 BitDeTrabajo :=M12.2 BitDeEtapa_1 :=M12.3 BitDeEtapa_2 :=M12.4 BitDeFin :=M200.7 BitDeEntradaAfectada:=E125.0 BitDeSalidaAfectada :=A124.3 U M 200.7 R M 0.3 S M 0.4 CALL FC 2 BitDeTrabajo :=M14.1 BitDeEtapa_1 :=M14.2 BitDeEtapa_2 :=M14.3 BitDeFin :=M200.1 BitDeEntradaAfectada:=E124.2 BitDeSalidaAfectada :=A124.0 U M 200.1 R M 1.0 S M 1.1 _010: NOP 0 U M 1.1 SPBN _011 CALL FC 1 BitDeTrabajo :=M14.4 BitDeEtapa_1 :=M14.5 BitDeEtapa_2 :=M14.6 BitDeFin :=M200.6 BitDeEntradaAfectada:=E124.7 BitDeSalidaAfectada :=A124.3 U M 200.6 R M 1.1 S M 1.2 _011: NOP 0 U M 1.2 SPBN _012 CALL FC 2 BitDeTrabajo :=M14.7 BitDeEtapa_1 :=M15.0 BitDeEtapa_2 :=M15.1 BitDeFin :=M200.7 BitDeEntradaAfectada:=E125.0 BitDeSalidaAfectada :=A124.3 U M 200.7 R M 1.2 S M 1.3 _012: NOP 0 U M 1.3 SPBN _013 CALL FC 1 BitDeTrabajo :=M15.2 BitDeEtapa_1 :=M15.3 BitDeEtapa_2 :=M15.4 BitDeFin :=M200.2 BitDeEntradaAfectada:=E124.3 BitDeSalidaAfectada :=A124.1 U M 200.2 R M 1.3 S M 1.4 _013: NOP 0
Capítulo 17
//D-
//A-
//D+
//D-
:=M13.6 BitDeTrabajo BitDeEtapa_1 :=M13.7 BitDeEtapa_2 :=M14.0 BitDeFin :=M200.5 BitDeEntradaAfectada:=E124.6 BitDeSalidaAfectada :=A124.2 U M 200.5 R M 0.7 S M 1.0 _007: NOP 0 U M 1.0 SPBN _010 U M 1.4 SPBN _014 CALL FC 1 BitDeTrabajo :=M15.5 BitDeEtapa_1 :=M15.6 BitDeEtapa_2 :=M15.7 BitDeFin :=M200.6 BitDeEntradaAfectada:=E124.7 BitDeSalidaAfectada :=A124.3 U M 200.6 R M 1.4 S M 1.5 _014: NOP 0 U M 1.5 SPBN _015 CALL FC 2 BitDeTrabajo :=M16.0 BitDeEtapa_1 :=M16.1 BitDeEtapa_2 :=M16.2 BitDeFin :=M200.7 BitDeEntradaAfectada:=E125.0 BitDeSalidaAfectada :=A124.3 U M 200.7 R M 1.5 S M 1.6 _015: NOP 0 U M 1.6 SPBN _016 CALL FC 2 BitDeTrabajo :=M16.3 BitDeEtapa_1 :=M16.4 BitDeEtapa_2 :=M16.5 BitDeFin :=M200.3 BitDeEntradaAfectada:=E124.4 BitDeSalidaAfectada :=A124.1 U M 200.3 R M 1.6 S M 0.0 _016: NOP 0
//B+
213
//C-
//D+
//D-
//B-
Tipos de funciones
Capítulo 17
Nos queda únicamente OB100 que usaremos el mismo que el del ejercicio anterior, esto es: L B#16#0 T MB 0 CALL SFC 21 BVAL :=P#M 0.0 BYTE 1 RET_VAL:=MW100 BLK :=P#M 1.0 BYTE 500 L W#16#0 T AW 124 SET S M 0.0
//Hacemos MB0 = 0 //Llamamos a SFC21 para poner a CERO //la memoria de marcas. //NOTA: Ajustar la extensión de la zona de marcas, //según sea el modelo de autómata. //Ponemos a CERO las salidas.
17.6 Funciones tipo E Las funciones tipo E son muy útiles en la práctica porque permiten por una parte el gobierno de elementos mecánicos estándar y son capaces de detectar errores de funcionamiento en el elemento gobernado, y sin embargo no necesitan que se les pase parámetros actuales, ya que toda la información está auto contenida en la función. El método empleado en la detección de errores de funcionamiento en el elemento gobernado es por tiempo, de tal forma, que si el elemento gobernado no responde a la acción que la función le pedía en un tiempo determinado, la función interpreta que ha habido un error, y pondrá a “1” un “BitDeError” específico. Veamos con un ejemplo cómo sería la estructura Grafcet de una función de tipo E que controla un cilindro neumático. G1:
Desde bloque invocante Inicializar función en la 1ª pasada y no volver a ejecutar esta etapa.
0 =1
Salir embolo Cargar temporizador con T s.
1
(Embolo SÍ fuera) Y (tiempo NO excedido) (Embolo NO fuera) Y (tiempo SÍ excedido) BitDeError=0 BitRutinaErrores=0
2
BitDeError=1 BitRutinaErrores=1
3
=1
=1
4
Poner a cero temporizador Decrementar PalabraDeContar PalabraDeContar=0
5 214
Tipos de funciones
Capítulo 17
4 BitDeFin=1
5
=1 Hacia bloque invocante
G2: (NOTA: Se supone que A124.0 excita la electro válvula que gobierna el cilindro y que E124.1 recibe la respuesta del rele Reed que detecta émbolo fuera). Desde OB1
0
En la 1ª pasada hacer: =1
M10.1
M10.1=1 BitDeEtapa_1=1 M10.2=0 BitDeEtapa_2=0 M10.3=0 BitDeEtapa_3=0 M10.4=0 BitDeEtapa_4=0 M10.5=0 BitDeEtapa_5=0 MW100=2 PalabraDeContar=2 M150.0=0 BitDeError=0 M200.0=0 BitDeFin=0 M250.0=0 BitRutinaErrores=0
A124.0=1 T0 = 5seg (SV)
1
(E124.1=1) Y (T0=1) (E124.1=0) Y (T0=0) M10.2
M150.0=0 M250.0=0
2
M150.0=1 M250.0=1
3
=1
=1 M10.4
R T0 MW100=MW100 - 1
4
MW100=0
M10.5
M200.0=0
5
=1 Hacia OB1
O M 0.0 ON M 0.0 FP M 10.0 SPBN _100 S M 10.1 R M 10.2 R M 10.3 R M 10.4 R M 10.5 L 2 T MW 100
M10.3
//BitDeTrabajo //BitDeEtapa_1=1 //BitDeEtapa_2=0 //BitDeEtapa_3=0 //BitDeEtapa_4=0 //BitDeEtapa_5=0 //PalabraDeContar=2
215
Tipos de funciones
R M 150.0 R M 200.0 _100: NOP 0 U S
M 10.1 A 124.0
U M 10.1 L S5T#5S SV T 0
Capítulo 17
//BitDeError=0 //BitDeFin=0
//Salir émbolo //T0 = 5 seg //Tipo SV
U U U R S
M 10.1 E 124.1 T 0 M 10.1 M 10.2
U UN UN R S
M 10.1 E 124.1 T 0 M 10.1 M 10.3
//Si émbolo no fuera y //tiempo excedido, //anular etapa actual "1" y pasar a "3".
U M 10.2 SPBN _102 R M 150.0 R M 250.0 R M 10.2 S M 10.4 _102: NOP 0
//Anular BitDeError, //BitRutinaErrores y pasar a etapa "4".
U M 10.3 SPBN _103 S M 150.0 S M 250.0 R M 10.3 S M 10.4 _103: NOP 0
//Hacer BitDeError=1, //BitRutinaErrores=1 //y pasar a etapa "4".
U M 10.4 SPBN _104 R T 0 L MW 100 L 1 -I T MW 100 SPN _104 SET R M 10.4 S M 10.5 _104: NOP 0
//Poner a cero T0, y decrementar //MW100.
U M 10.5 SPBN _105 R M 10.5 S M 200.0 R M 10.0 _105: NOP 0
//Si émbolo fuera //y tiempo menor //que 5 seg., anular //etapa actual "1" y pasar a etapa"2".
//Si MW100 es "0", anular etapa //"4" y pasar a "5".
//Hacer BitDeFin=1
216
Tipos de funciones
Capítulo 17
En cuanto a la llamada desde OB1 y contenido de OB100: OB1
U E 125.0 FP M 0.0 S M 0.1
OB100 L B#16#0 T MB 0 CALL "FILL" //SFC21 BVAL :=P#M 0.0 BYTE 1 RET_VAL:=MW100 BLK :=P#M 1.0 BYTE 500 L W#16#0 T AW 124
//(*) //(*) //(*)
U M 0.1 SPBN _001 CALL FC 1 U M 200.0 R M 0.1 S M 0.2 _001: NOP 0 . . . U M250.0 SPBN _250 Rutina tratamiento de errores _250: NOP 0
17.7 Funciones tipo F Las funciones tipo F son iguales que las E, excepto que la información hay que pasársela por medio de parámetros actuales. En este caso, igual que en las funciones tipo E, el error se detecta por temporización. Como ejemplo, veamos el caso de un cilindro neumático (el mismo caso que el del apartado 17.6) y dado que el G1 es el mismo, pondremos únicamente el G2 de la función:
Desde OB1 En la 1ª pasada hacer: 0
BitDeEtapa_1=1 BitDeEtapa_2=0 BitDeEtapa_3=0 BitDeEtapa_4=0 BitDeEtapa_5=0 PalabraDeContar=2 BitDeError=0 BitDeFin=0 BitRutinaErrores=0
=1 BitDeEtapa_1 1
BitDeSalidaAfectada=1 Cargar Temporizador con Tiempo
(BitDeEntradaAfectada=1) (BitDeEntradaAfectada=0) Y (Temporizador=1) Y (Temporizador=0)
217
Tipos de funciones
Capítulo 17
1
1
BitDeEtapa_3
BitDeEtapa_2 BitDeError=0 BitRutinaErrores=0
2
BitDeError=1 BitRutinaErrores =1
3 =1
=1
BitDeEtapa_4 4
BitDeEtapa_5
R Temporizador PalabraDeContar= PalabraDeContar-1 PalabraDeContar =0 BitDeFin=1 BitDeTrabajo=0
5
=1 Hacia OB1
Y pasado a operaciones AWL: NOTA: Previamente habremos declarado los parámetros formales siguientes: In In In In In In In_out Out Out Out In In In Out
BitDeTrabajo BOOL BitDeEtapa_1 BOOL BitDeEtapa_2 BOOL BitDeEtapa_3 BOOL BitDeEtapa_4 BOOL BitDeEtapa_5 BOOL PalabraDeContar WORD BitDeError BOOL BitDeFin BOOL BitDeSalidaAfectada BOOL BitDeEntradaAfectada BOOL Temporizador TIMER Tiempo S5TIME BitRutinaErrores BOOL
M 0.0 O ON M 0.0 FP #BitDeTrabajo SPBN _100 S #BitDeEtapa_1 R #BitDeEtapa_2 R #BitDeEtapa_3 R #BitDeEtapa_4 R #BitDeEtapa_5 L 2 T #PalabraDeContar R #BitDeError R #BitDeFin _100: NOP 0
218
Tipos de funciones U S
Capítulo 17
#BitDeEtapa_1 #BitDeSalidaAfectada
U #BitDeEtapa_1 L #Tiempo SV #Temporizador U U U R S
#BitDeEtapa_1 # BitDeEntradaAfectada #Temporizador #BitDeEtapa_1 #BitDeEtapa_2
U UN UN R S
#BitDeEtapa_1 # BitDeEntradaAfectada #Temporizador #BitDeEtapa_1 #BitDeEtapa_3
U #BitDeEtapa_2 SPBN _102 R #BitDeError R #BitRutinaErrores R #BitDeEtapa_2 S #BitDeEtapa_4 _102: NOP 0
U #BitDeEtapa_3 SPBN _103 S #BitDeError S #BitRutinaErrores R #BitDeEtapa_3 S #BitDeEtapa_4 _103: NOP 0 U #BitDeEtapa_4 SPBN _104 R #Temporizador L #PalabraDeContar L 1 -I T #PalabraDeContar SPN _104 SET R #BitDeEtapa_4 S #BitDeEtapa_5 _104: NOP 0 U #BitDeEtapa_5 SPBN _105 R #BitDeEtapa_5 S #BitDeFin R #BitDeTrabajo _105: NOP 0
Nos queda finalmente OB1 y OB100: U E 125.0 FP M 0.0 S M 0.1
OB1
//(*) //(*) //(*)
U M0.1 SPBN _001 CALL FC 1 Temporizador :=T0 BitDeTrabajo :=M10.0 BitDeEtapa_1 :=M10.1 BitDeEtapa_2 :=M10.2 BitDeEtapa_3 :=M10.3 BitDeEtapa_4 :=M10.4 BitDeEtapa_5 :=M10.5 PalabraDeContar :=MW100 BitDeError :=M150.0 BitDeFin :=M200.0 BitDeSalidaAfectada :=A124.0 BitDeEntradaAfectada:=E124.0 Tiempo :=S5T#1S BitRutinaErrores :=M250.0 U M 200.0 R M 0.1 S M 0.2 _001: NOP 0 .
. . . U M250.0 SPBN _250 Rutina tratamiento de errores. _250: NOP 0 OB100 L B#16#0 T MB 0 CALL "FILL" BVAL :=P#M 0.0 BYTE 1 RET_VAL:=MW100 BLK :=P#M 1.0 BYTE 500 L W#16#0 T AW 124
219
Tipos de funciones
Capítulo 17
17.8 Concepto de parámetros “in”, “out” e “in_out” Como se ha podido observar a lo largo de los capítulos 16 y 17, cuando hemos tenido que declarar parámetros formales para una función, primero hemos tenido que decirle a STEP-7 si los parámetros formales eran del tipo “in”, “out” o “in_out”. Si nos imaginamos que una función es la caja que hemos pintado en la Fig. 17.7, se considera (o se dice) que el parámetro formal en cuestión es del tipo “in” cuando se trata de información entrante a la función de tal forma que esta información no sale de la función ni es usada por ninguna otra parte de nuestro programa fuera de la misma función. Diríamos que se trata de información para uso y consumo de la misma función. En este caso se tiene que declarar el parámetro formal del tipo “in”.
out
in Función in_out
Fig. 17.7
En otros casos el parámetro formal se genera en la función y es la función la que suministra una información saliente de la misma, como sería el caso de un Bit que se genera en la función y después por ejemplo desde OB1 comprobamos si este Bit está a “1” o a “0”. En este caso a este parámetro formal lo tenemos que declarar del tipo “out”. El caso de un parámetro “in_out” sería cuando se le suministra a la función el parámetro (por valor o dirección) en la llamada y posteriormente, después que la función haya manipulado este parámetro, tenemos que consultar el valor del parámetro desde el exterior de la función, por ejemplo desde OB1. Sin embargo, y aún sabiendo el significado de lo que es un parámetro entrante, saliente o entrante _ saliente, en la práctica puede ocurrir que se encuentre que no está seguro de si el parámetro formal que está declarando en su función es del tipo “in”, “out” o “in_out”. Si este es su caso y tiene problemas en el funcionamiento de su programa, intente declarar el nuevo parámetro del tipo “in_out” directamente y sin más. Si STEP-7 le acepta este parámetro como del tipo “in_out”, casi con toda seguridad que su programa funcionará ahora sin ningún problema.
220
DBs y FBs
Capítulo 18
CAPÍTULO 18
Índice
DBs y FBs 18.1
Qué es un bloque de datos
Un bloque de datos es una parte del programa especializada en almacenar información. El número de bloques de datos que pueden crearse con STEP-7, depende del modelo de autómata considerado. Así, por ejemplo el modelo de autómata 314 admite hasta 127 bloques de datos, y conforme vamos subiendo en importancia en cuanto al modelo de autómata, también sube el número máximo de bloques de datos con los que podemos trabajar en dicho modelo. En cuanto al tamaño de cada bloque de datos, varía según el modelo de autómata, pero un número medio puede ser en torno a ocho (8) KBytes por bloque aproximadamente. Los bloques de datos se clasifican en dos (2) categorías o grupos, que son: • •
BLOQUES DE DATOS GLOBALES BLOQUES DE DATOS DE INSTANCIA
De momento aún es pronto para dar una explicación precisa del porqué de esta clasificación de los bloques de datos, pero sí podemos adelantar que los llamados BLOQUES DE DATOS GLOBALES se llaman así porque la información que contienen está disponible desde cualquier parte del programa que sea necesario disponer de ella. Diríamos que es una información no restringida y que está a disposición de todo el mundo. En cuanto a los BLOQUES DE INSTANCIA, a diferencia de los globales, la información que contienen únicamente es accesible desde los BLOQUES DE FUNCIÓN, concepto éste (el de los bloques de función) que aún no hemos visto y que veremos más adelante. 18.2
Cómo se crea un bloque de datos global
Los bloques de datos globales se crean en STEP-7 igual que cualquier otro objeto. Esto es, iremos al administrador (el que tiene un zapato como icono) y en la ventana de la derecha y ayudándonos del menú insertar, insertaremos un bloque de datos del siguiente modo:
Fig.18.1 221
DBs y FBs
Capítulo 18
Una vez hecha la selección, aparecerá la siguiente ventana:
Fig.18.2
STEP-7 nos sugiere como nombre para el nuevo bloque de datos el que aparece en la ventana “Nombre y tipo” que corresponde al siguiente nombre libre de bloque disponible, en este caso DB1 ya que en este caso al no existir ningún otro bloque, DB1 es el primero disponible. Una vez aceptado el nombre, pulsaremos la tecla “Aceptar” y veremos como aparece junto a los iconos de los bloques ya existentes, el icono del nuevo bloque de datos que hemos creado DB1. 18.3
Partes de un bloque de datos global
Hasta aquí, STEP-7 se ha limitado a crear el nuevo bloque de datos, pero realmente en su interior no hay nada todavía. Así pues, para acceder al interior del DB creado, haremos doble clic con la flecha del ratón sobre el icono DB1 y aparecerá la pantalla de la Fig.18.3 mostrando el interior de DB1. NOTA: Los pasos exactos para la creación de bloques de datos, dependen ligeramente de la versión de STEP-7 que se esté usando. Observamos como aparecen las palabras “STRUCT” y “END_STRUCT” en la parte superior e inferior, lo que corresponde a palabras usadas por STEP-7 para la creación y manejo de los bloques de datos, pero que el lector en principio no debe tener en cuenta en absoluto. En la columna de la izquierda, donde pone “Nombre”, el usuario debe introducir el nombre del dato que desea depositar. En la siguiente columna, donde pone “Tipo”, el usuario debe declarar el tipo de dato que está introduciendo. Para ello el usuario puede escribir en esta casilla directamente el tipo de datos de que se trata (BOOL, BYTE, WORD, INT, etc.) o escoger el tipo de datos de una lista que se despliega al hacer clic con el botón de la derecha del ratón sobre la casilla en blanco “Tipo”. 222
DBs y FBs
Capítulo 18
Fig.18.3
Posteriormente, en la columna “Valor inicial” escribiremos el valor que deseamos tenga el dato introducido y finalmente en la columna comentario, podemos escribir si así nos parece, algún comentario sobre el dato en cuestión. Una vez cumplimentado este primer dato, daremos a la tecla “Enter” del teclado y nos aparecerá una nueva línea en la parte inferior donde podremos introducir un nuevo dato del tipo y valor que deseemos, y así iremos haciendo sucesivamente hasta completar la introducción manual de datos. 18.4
Designación de los datos de un bloque de datos
Conforme vayamos introduciendo datos, iremos observando como en la columna de la izquierda nos aparecen números. Estos números indican el número del Byte en el que comienza el dato en cuestión y que deberemos tener en cuenta a la hora de referirnos a estos datos. Veamos la siguiente imagen:
Fig.18.4 223
DBs y FBs
Capítulo 18
El primer dato “Dato_1” lo hemos definido del tipo INT (entero de 16 Bits) y comienza en el Byte “0” de este bloque de datos, según nos indica el número que está a la izquierda en la columna “Dirección”. El siguiente dato es “Dato_2” y lo hemos definido como un número real, y por tanto STEP-7 le asigna un espacio de treinta y dos (32) Bits, o lo que es lo mismo cuatro (4) Bytes. Este dato comienza en el Byte número dos (2), según nos indica el número de la izquierda, y puesto que su longitud es de cuatro (4) Bytes, ocupa los Bytes 2, 3, 4 y 5, siendo por tanto el Byte número seis (6) el que queda disponible para el siguiente dato. El siguiente dato es “Dato_3” que comienza en el Byte número seis (6) y aún tratándose de un dato que hemos declarado del tipo BOOL y que por tanto sólo necesita un Bit de espacio, STEP-7 le asigna un espacio de dos (2) Bytes por razones de coherencia con el resto de los datos. El siguiente dato “Dato_4” que hemos definido del tipo “S5TIME”, comienza en el Byte número ocho (8) y termina en el nueve (9). El siguiente dato “Dato_5” lo hemos declarado como un registro genérico del tipo “WORD” y que por tanto ocupa dieciséis (16) Bits, o sea dos (2) Bytes, razón por la que STEP-7 le asigna las direcciones diez (10) y once (11). El siguiente dato “Dato_6” lo hemos declarado como un registro genérico del tipo “BYTE”, ocho (8) Bits, y STEP-7 le asigna únicamente la dirección doce (12), y lo mismo hace con los datos “Dato_7” y “Dato_8”, asignándoles direcciones trece (13) y catorce (14) respectivamente. Con esto in mente, podemos dirigirnos ahora a los datos que hemos depositado, de la siguiente forma: DBW0 DBD2 DBX6. DBX7. DBW8 DBW10 DBB12 DBB13 DBB14
Es la dirección de “Dato_1” Es la dirección de “Dato_2” Es la dirección del Bit del Byte seis (6) Es la dirección del Bit del Byte siete (7) Es la dirección de “Dato_4” Es la dirección de “Dato_5” Es la dirección de “Dato_6” Es la dirección de “Dato_7” Es la dirección de “Dato_8”
Donde las dos letras iniciales “DB” en todos los casos significan que se trata de información perteneciente a un bloque de datos. Las plantillas de las direcciones de los datos que puede contener un bloque de datos, es la siguiente: DBX. Donde es el número del Byte y el número del Bit (entre 0 y 7) DBB Donde es el número del Byte (hasta 8000 aproximadamente, según modelo) DBW Donde es el número del Word (hasta 8000 aproximadamente, según modelo) DBD Donde es el número del Double Word (hasta 8000 aproximadamente, según modelo)
224
DBs y FBs
Capítulo 18
En el supuesto de que estemos trabajando con más de un bloque de datos, puede ser conveniente al referirnos al bloque de datos que nos interesa, el anteponer a la dirección anterior, el número del bloque de datos en cuestión. Así por ejemplo: DB3.DBB7 Significa que nos estamos refiriendo al Byte número siete (7) del bloque de datos DB3. Y en general, cuando tengamos necesidad de concretar el bloque de datos de que se trata, antepondremos a la dirección, lo siguiente: DB. 18.5
Siendo el número del bloque de datos
La operación AUF
Para poder usar un bloque de datos existente, deberemos primeramente ABRIR el bloque de datos. Esto se consigue con la operación AUF, cuya plantilla en general es la siguiente: AUF Por ejemplo: AUF L
DB1 DBW0
//Abre el bloque de datos DB1 //Se carga ACU1 con el contenido de DBW0
Si bien existe la operación AUF que abre el bloque de datos con el que nos interesa trabajar, no existe ninguna operación especifica que cierre un bloque de datos abierto. Ahora bien, si hemos abierto un bloque de datos global con la operación AUF y abrimos otro bloque de datos global, el primer bloque se cierra y sólo nos queda abierto el último bloque de datos global abierto (ATENCIÓN: más adelante en el apartado 18.10 veremos una excepción a esta regla cuando veamos los bloques de datos de instancia). Otra forma de acceder directamente a los datos de un bloque de datos sin usar la operación AUF, es dirigirnos al dato poniendo directamente su dirección completa. Por ejemplo, las operaciones anteriores se pueden sustituir por: L 18.6
DB1.DBW0
La operación L DBLG
En ocasiones el programador necesita conocer la longitud en Bytes de un determinado bloque de datos (su extensión). Para ello dispone de esta operación que deposita en ACU1L la longitud del bloque de datos como un número entero de dieciséis (16) Bits. Ejemplo:
AUF L
DB1 DBLG
(1) (2)
En la primera línea abrimos el bloque de datos DB1 y en la segunda línea depositamos la longitud o extensión en Bytes de DB1 en ACU1L, como número entero de dieciséis(16) Bits.
225
DBs y FBs
18.7
Capítulo 18
La operación L DBNO
La operación L DBNO permite averiguar el número del último bloque de datos global abierto y deposita este número en ACU1L como número entero de dieciséis(16) Bits. Para que se ejecute, simplemente se intercala la operación “L DBNO” en cualquier parte del programa donde sea necesaria esta información. 18.8
Ejemplo de un bloque de datos globales
Veamos un ejemplo con las operaciones básicas de manejo de bloques de datos globales que hemos visto hasta aquí. Empezaremos por crear un bloque de datos con una capacidad de diez (10) Bytes. Para ello, cree el bloque de datos con nombre DB1 y tipo “DB global”. Después edite DB1 e introduzca manualmente lo siguiente: Nombre Dato0 Dato1 Dato2 Etc.
Tipo STRUCT BYTE BYTE BYTE Etc.
Valor inicial B#16#0 B#16#0 B#16#0 Etc.
Con lo que finalmente quedará así:
Fig.18.5
Guardaremos nuestro bloque de datos en disco duro pulsando en el icono “Guardar” y a continuación abriremos OB1, donde escribiremos las siguientes operaciones: 226
DBs y FBs
Capítulo 18
AUF L T L T L T L T L T
DB1 B#16#12 DBB 0 W#16#3456 DBW 1 DW#16#789ABCDE DBD 3 DBLG AW 124 DBNO AW 126
Una vez hayamos guardado OB1 y DB1 primero en disco duro y después lo hayamos traspasado bien al simulador o bien al autómata real, podremos comprobar como el contenido de DB1 es el que aparece en la Fig. 18.6. En cuanto a la longitud de DB1 podemos verlo visualmente en la salida AW124, un diez (10), y el número del bloque en AW126, un uno (1).
Fig.18.6
18.9
Qué es un bloque de función
Sin duda esta es una pregunta importante, dado que los bloques de función son piezas importantes dentro de STEP-7. Así pues veamos con atención qué se entiende por bloque de función.
227
DBs y FBs
Capítulo 18
Si el lector ha seguido hasta aquí el orden normal de estudio, empezando por los primeros capítulos hasta llegar a éste, conocerá ya las funciones y la gran utilidad que tienen para el programador. Sin embargo, el lector recordará que las funciones que tenían parámetros formales como las del tipo B, D y F, al hacer la llamada a la función, ésta aparecía en la pantalla mostrándonos en rojo los parámetros formales que debíamos concretar con parámetros actuales, de tal forma que si no poníamos todos los parámetros actuales y por ejemplo intentábamos saltarnos uno, STEP-7 no nos lo permitía y nos impedía progresar hasta que no hubiéramos puesto todos y cada uno de los parámetros actuales. Los bloques de función vienen de alguna forma a subsanar este comportamiento, pues se comportan igual que las funciones (exactamente igual que las funciones) únicamente que al hacer la llamada al bloque de función, podemos elegir entre pasarle o no pasarle parámetros actuales. Sin saber aún nada sobre bloques de función, intuimos que si le pasamos al bloque de función el valor del parámetro actual, lógicamente se comportará como una función, pero ¿qué pasa si como hemos dicho antes no le pasamos ningún parámetro actual?, ¿cómo podrá trabajar el bloque de función si no le pasamos información?. Efectivamente la pregunta es completamente lógica ya que sin información no pueden trabajar, pero lo que hacen entonces los bloques de función (para no quedarse sin información que manejar) es almacenar previamente todos los valores por defecto de todos los parámetros formales que hayamos declarado, de tal forma que al hacer la llamada al bloque de función, si le pasamos la información a través de un parámetro actual, el bloque de función usará esta información, pero si no se la pasamos, tomará la que tiene ya almacenada como valor por defecto. Empezamos a entender el mecanismo de cómo trabajan estos bloques, pero quizás se nos presenta una duda: ¿Dónde guarda el bloque de función esta información preliminar que son los valores por defecto de los parámetros actuales?. La respuesta es ahora comprensible para nosotros. Efectivamente esta información preliminar que contiene los valores por defecto de los parámetros actuales que el bloque de función usará en caso de que no se la pasemos en la llamada, se almacena en un bloque de datos especial que se llama BLOQUE DE DATOS DE INSTANCIA. Así pues, el bloque de datos de instancia (insistimos) almacena los valores por defecto de los parámetros actuales (o formales, según se mire) que el bloque de función usará si no le pasamos el parámetro actual correspondiente en la llamada. De una forma muy esquemática, podríamos decir que un bloque de función viene a ser una función, más un bloque de datos de instancia asociado a la función, y aunque no sea muy correcto, podemos poner como formula recordatoria: Bloque de función = Función + Bloque de datos de instancia 18.10 Qué es un bloque de datos de instancia Aunque el concepto de bloque de datos de instancia prácticamente ya lo hemos introducido en el apartado anterior, insistiremos aquí sobre algunas peculiaridades de estos bloques. En primer lugar, se diferencian de los bloques de datos globales en que solamente son accesibles desde un bloque de función asociado (veremos esto en breve). Esto es, si queremos trabajar con datos que estén a disposición de la totalidad del programa, tendremos que usar bloques de datos globales, ya que los de instancia únicamente están disponibles para los bloques de función que en el momento de la llamada asociemos a estos. 228
DBs y FBs
Capítulo 18
Otro aspecto a considerar con los bloques de datos de instancia, es que si bien solamente podemos tener un único bloque de datos global abierto, es posible tener abiertos simultáneamente un bloque de datos global y otro de instancia. 18.11 Cómo se crea un bloque de función Como todos los objetos que se usan en STEP-7, los bloques de función se crean en la ventana del administrador. Así pues iremos a esta ventana y con el menú “Insertar” elegiremos la opción: Insertar/Bloque S7/2 Bloque de función En la imagen que aparece, Fig. 18.7, STEP-7 nos sugiere como nombre para el nuevo bloque de función el que aparece en la ventanilla superior izquierda. Podemos aceptar este nombre o ponerle otro distinto, siempre y cuando sea un nombre del tipo FB y no esté ya en uso por otro bloque de función existente. Así pues, haremos los cambios que creamos convenientes en la imagen, y daremos al botón “Aceptar”, apareciendo un nuevo icono con el nombre de FB1 en el administrador, que es nuestro recién creado bloque de función.
Fig.18.7
18.12 Edición de un bloque de función En el apartado anterior nos hemos limitado a crear una caja vacía con el nombre de FB1, pero ahora tenemos que meternos dentro de esta caja y depositar un contenido. Empezaremos pues por hacer un doble clic sobre el nuevo bloque de función FB1 y nos aparecerá la siguiente imagen:
229
DBs y FBs
Capítulo 18
Fig.18.8
Que como se ve tiene el mismo aspecto que la Fig.16.10 cuando editábamos las funciones creadas. Siguiendo la misma técnica que empleábamos con las funciones en el apartado 16.3, definiremos aquí los nombres de los nuevos parámetros formales. Por ejemplo:
Fig.18.9
Obsérvese sin embargo en esta imagen, como en el caso de un bloque de función hemos podido definir los valores por defecto de todos los parámetros formales que hemos introducido, mientras que en el apartado 16.3 no podíamos hacer lo mismo con los parámetros formales de las funciones.
230
DBs y FBs
Capítulo 18
Nos falta ahora introducir las operaciones AWL, quedando finalmente, al menos exteriormente, exactamente igual que aparece en la Fig. 16.13, razón por la que no repetimos aquí esta imagen otra vez. En cuanto al código de llamada desde OB1 de nuestro FB1, aún no podemos mostrarlo, por cuanto nos falta ver algo más. Efectivamente, nos falta crear ahora un nuevo bloque de datos de instancia que recoja los valores por defecto que hemos definido anteriormente. Para ello, iremos como siempre a la pantalla del administrador, e insertaremos en la ventana de la derecha un bloque de datos pulsando en: Insertar/Bloque S7/4 Bloque de datos Y nos aparecerá la imagen de la Fig.18.10, muy similar a la que ya vimos en Fig.18.2, sólo que ahora, en la ventana que permite seleccionar el “tipo”, elegiremos “DB de instancia” y posteriormente seleccionaremos en la ventana de la derecha el bloque de función al que le asociamos este bloque de datos (en este caso, sólo tenemos el bloque de función FB1, por lo que sólo aparece FB1). Queda así establecida una unión entre FB1 y DB1, de tal forma que se cumple lo que decíamos antes, esto es, que a DB1 sólo se puede acceder desde DB1, siendo DB1 un bloque de datos de instancia de FB1. NOTA: En otras versiones de STEP-7 es necesario realizar esta operación en dos (2) operaciones intermedias. Así por ejemplo, en la versión 5.0 de STEP-7, primeramente se crea un bloque de datos, por ejemplo DB1, y posteriormente al intentar editar este bloque de datos por primera vez, aparece una nueva ventana donde podemos ya asignar el DB1 creado como bloque de datos de instancia al bloque de función que deseemos, en nuestro caso con FB1.
Fig.18.10
Vamos a ver ahora que hay dentro de DB1. Para ello haremos doble clic sobre el icono de DB1, apareciendo la imagen siguiente:
231
DBs y FBs
Capítulo 18
18.13 Tipos de bloques de función
Fig.18.11
En el apartado 17.1 hicimos una clasificación (aproximada) de los distintos tipos de funciones que nos podemos encontrar, y teniendo en cuenta por otra parte lo que hemos dicho de que un bloque de función es muy aproximadamente lo mismo que una función con un bloque de datos de instancia asociado, en principio podríamos hacer uso de la misma tabla de clasificación de funciones, aplicándola ahora a bloques de función. Sin embargo, teniendo en cuenta que un bloque de función que NO tenga parámetros formales de hecho es una función, no incluiremos en esta tabla clasificatoria aquellos bloques de función que no los tengan, por lo que la tabla nos quedará así: Tipo de FB
I
II
III
Ficha del FB * Maneja algún elemento mecánico:(NO) ** El elemento mecánico es:-** Trabajo a realizar:-* Tiene parámetros formales:(SÍ) * Tiene BitDeError:(NO) * Tiene temporizadores:(NO) * Maneja algún elemento mecánico:(SÍ) ** El elemento mecánico es:CILINDRO NEUMÁTICO ** Trabajo a realizar:SALIR ÉMBOLO * Tiene parámetros formales:(SÍ) * Tiene BitDeError:(NO) * Tiene temporizadores:(NO) * Maneja algún elemento mecánico:(SÍ) ** El elemento mecánico es:CILINDRO NEUMÁTICO ** Trabajo a realizar:SALIR ÉMBOLO * Tiene parámetros formales:(SÍ) * Tiene BitDeError:(SÍ) * Tiene temporizadores:(SÍ) Fig.18.12 232
DBs y FBs
Capítulo 18
18.14 Bloques de función tipo I Los bloques de función tipo I no están pensados para manejar ningún elemento mecánico externo al autómata, sino únicamente para realizar operaciones internas en el autómata pero sin repercusión en el exterior. Sus principios de funcionamiento son idénticos a los que ya vimos para las funciones tipo B, por lo que remito al lector al apartado 17.3 donde ya se vieron estas funciones. La única diferencia (pero importante) es que ahora a los parámetros formales podemos asignarles valores por defecto, por lo que si volvemos a considerar el ejemplo que vimos en el apartado 17.3, pero ahora trabajando con bloques de función, pondremos (por ejemplo): Interfase
Nombre
Tipo de datos
Valor inicial
in in in in in in in out out
BitDeTrabajo BitDeEtapa_1 BitDeEtapa_2 Bit_1 Bit_2 Bit_3 Bit_4 BitDeSalida BitDeFin
Bool Bool Bool Bool Bool Bool Bool Bool Bool
FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE
Una vez creado y guardado el bloque de función FB1, crearemos el bloque de datos de instancia DB1, tal y como ya hemos visto en el apartado 18.12 y lo asociaremos a FB1 como “DB de instancia”. Nos queda ahora hacer la llamada desde OB1 y pondremos: U FP S
E124.0 M0.0 M0.1
U M0.1 SPBN _001 CALL FB1,DB1 BitDeTrabajo := BitDeEtapa_1 := BitDeEtapa_2 := Bit_1 := Bit_2 := Bit_3 := Bit_4 := BitDeSalida :=A124.0 BitDeFin :=M200.0 U R S _001: NOP
M200.0 M0.1 M0.2 0
En este caso al no pasar a FB1 ninguno de los parámetros actuales entrantes, se usarán los parámetros actuales por defecto almacenados en DB1, y como “Bit_1” y “Bit_2” tienen valores “TRUE” por defecto, el resultado de la llamada a FB1 es A124.0=1. 233
DBs y FBs
Capítulo 18
Ahora bien, si la llamada a FB1 la hacemos de la siguiente forma: U FP S
E124.0 M0.0 M0.1
U M0.1 SPBN _001 CALL FB1,DB1 BitDeTrabajo := BitDeEtapa_1 := BitDeEtapa_2 := Bit_1 :=E125.0 Bit_2 :=E125.1 Bit_3 :=E125.2 Bit_4 :=E125.3 BitDeSalida :=A124.0 BitDeFin :=M200.0 U R S _001: NOP
M200.0 M0.1 M0.2 0
Y si previamente hemos hecho E125.0=0, E125.1=0, E125.2=0 y E125.3=0, entonces el resultado de la llamada anterior es A124.0=0, ya que los valores por defecto que tenía FB1 no se han usado y en su lugar se han usado los valores actuales de E125.0, E125.1, E125.2 y E125.3. 18.15 Bloques de función tipo II Los bloques de función tipo II tienen su origen en las funciones tipo D y por tanto aquí también se trata de controlar un elemento mecánico, como puede ser un cilindro neumático. En este tipo de bloque de función no estamos interesados en detectar un posible mal funcionamiento del elemento mecánico que estemos controlando y por tanto no manejaremos el concepto de “BitDeError”, ni tampoco pensamos usar temporizadores. (Remitimos nuevamente al lector al apartado 17.5 con objeto de no repetir aquí todo lo que ya se dijo sobre estas funciones, y nos limitaremos en este apartado a resaltar lo que realmente es diferente entre los bloques de función tipo II y las funciones tipo D.) Los bloques de función tipo II, como bloques de función que son, usan parámetros formales que podemos inicializar con valores por defecto (esto es lo realmente típico de los bloques de función). Por tanto, lo mismo que ya hemos hecho con los bloques de función tipo I, ahora haremos lo mismo con los del tipo II, y cuando definamos los parámetros formales del bloque de función, pondremos también igualmente sus valores por defecto. Vamos a ver el caso de un bloque de función FB1 que controla tanto la salida como la entrada de un cilindro neumático. Para ello, como siempre, empezaremos por la tabla de contactos de entrada/salida:
234
DBs y FBs
Capítulo 18
Entradas E124.0 E124.1 E124.2 E124.3
Salidas
Pulsador para salir émbolo Pulsador para entrar émbolo El émbolo ha salido RR1 El émbolo ha entrado RR0
A124.0 Salir/retraer émbolo
Siendo RR0 y RR1 los reles Reed que detectan émbolo dentro y fuera respectivamente. Así mismo, se supone que A124.0 actúa sobre una electro válvula 5/2 monoestable que gobierna el cilindro. Pondremos ahora el G1 de FB1: Desde OB1 Inicializar el bloque de función en la 1ª pasada y no volver a ejecutar esta etapa.
0
=1 Salir embolo del cilindro
1
¿Ha salido el embolo? BitDeFin=1
2
=1 Hacia OB1
Y el G2 de FB1: Desde OB1 En la 1ª pasada hacer: 0
Inicializar valores
BitDeEtapa_1=1 BitDeEtapa_2=0 BitDeFin = 0
=1 BitDeEtapa_1 BitDeSalidaAfectada = 1
1
BitDeEntradaAfectada=1 BitDeEtapa_2
BitDeFin=1 BitDeTrabajo=0
2 =1
Hacia OB1
235
DBs y FBs
Capítulo 18
Crearemos el bloque de función FB1 con los siguientes parámetros formales y valores por defecto: Interfase Nombre Tipo de datos Valor inicial in in in in out out
BitDeTrabajo BitDeEtapa_1 BitDeEtapa_2 BitDeEntradaAfectada BitDeSalidaAfectada BitDeFin
Bool Bool Bool Bool Bool Bool
FALSE FALSE FALSE FALSE FALSE FALSE
Y escribiremos las siguientes operaciones: U #BitDeEtapa_2 SPBN _102 R #BitDeEtapa_2 S #BitDeFin R #BitDeTrabajo _102: NOP 0
O M 0.0 ON M 0.0 FP #BitDeTrabajo SPBN _100 S #BitDeEtapa_1 R #BitDeEtapa_2 R #BitDeFin _100: NOP 0 U #BitDeEtapa_1 SPBN _101 S #BitDeSalidaAfectada U #BitDeEntradaAfectada R #BitDeEtapa_1 S #BitDeEtapa_2 _101: NOP 0
Nos queda ahora la llamada de FB1 desde OB1, y pondremos: U E 125.0 FP M 0.0 S M 0.1 U M 0.1 SPBN _001 CALL FB 1 , DB1 BitDeTrabajo := BitDeEtapa_1 := BitDeEtapa_2 := BitDeEntradaAfectada:=E124.2 BitDeFin :=M200.0 BitDeSalidaAfectada :=A124.0 U M 200.0 R M 0.1 S M 0.2 _001: NOP 0 En cuanto a OB100, pondremos el mismo contenido del OB100 que poníamos al final del ejercicio del Capítulo 17. Al cargar el programa, bien en un autómata real o bien en el simulador PLCSIM, comprobamos su buen funcionamiento, a pesar de no haber enviado los parámetros actuales de “BitDeTrabajo”, “BitDeEtapa_1” y “BitDeEtapa_2”. 236
DBs y FBs
Capítulo 18
Las causas son las siguientes. Al no haber enviado los parámetros actuales para “BitDeTrabajo”, BitDeEtapa_1” y “BitDeEtapa_2”, FB1 toma los valores previamente almacenados en DB1 (“FALSE”, “FALSE” y “FALSE”) de estos parámetros formales como valores iniciales de los mismos, y si el lector analiza las operaciones escritas en FB1 podrá comprobar que estos valores son adecuados para su correcto funcionamiento. Se podría argumentar según lo dicho, que también sería correcto no enviar, por ejemplo, el parámetro actual M200.0 como “BitDeFin”, para que así FB1 tomase el valor “FALSE”=”0” como valor inicial, lo que en principio nos viene bien, ya que es justamente lo que hace FB1 en la etapa inicial. Sin embargo y dado que necesitamos conocer el valor final de M200.0 para proseguir hacia la siguiente etapa, nos vemos obligados a comunicarle a FB1 que deseamos que deposite en M200.0 el final de su cálculo, razón por la que no podemos prescindir de este parámetro. El parámetro actual E124.2 es más sencillo de entender, ya que si no se lo pasamos, FB1 tomará como valor por defecto el valor “FALSE”=”0”, y esto es tanto como aceptar que el émbolo nunca llegará a salir completamente, lo que no tiene sentido. El parámetro A124.0 también es vital pasárselo a FB1, para que se active la electro válvula correctamente como resultado de la tarea realizada. 18.16 Bloques de función tipo III Estos bloques de función provienen de las funciones tipo F que vimos en el apartado 17.7, e igual que las funciones, pueden ser interesantes en caso de que deseemos saber si el elemento mecánico que estamos gobernando, responde correctamente a las órdenes que se le dan desde el autómata en los tiempos previstos. Los Grafcet G1 y G2 por ser exactamente los mismos que ya se vieron en el apartado 17.7, no los vamos a repetir aquí, pero si pondremos la declaración de los parámetros formales, que es la siguiente: In In In In In In In_Out Out Out Out In In In Out
BOOL BitDeTrabajo BitDeEtapa_1 BOOL BitDeEtapa_2 BOOL BitDeEtapa_3 BOOL BitDeEtapa_4 BOOL BitDeEtapa_5 BOOL PalabraDeContar WORD BitDeError BOOL BitDeFin BOOL BitDeSalidaAfectada BOOL BitDeEntradaAfectada BOOL Temporizador TIMER Tiempo S5TIME BitRutinaErrores BOOL
FALSE FALSE FALSE FALSE FALSE FALSE W#16#0 FALSE FALSE FALSE FALSE S5T#5S FALSE
En cuanto al contenido de FB1, es exactamente el mismo que el de la función que también se vio en 17.7, por lo que no lo incluimos aquí. El contenido de OB1 sin embargo, si puede ser distinto, y podemos poner por ejemplo:
237
DBs y FBs
Capítulo 18
U E 125.0 FP M 0.0 S M 0.1 U M0.1 SPBN _001 CALL FB1, DB1 Temporizador BitDeTrabajo BitDeEtapa_1 BitDeEtapa_2 BitDeEtapa_3 BitDeEtapa_4
//(*) //(*) //(*)
BitDeEtapa_5 := PalabraDeContar :=MW100 BitDeError :=M150.0 BitDeFin :=M200.0 BitDeSalidaAfectada :=A124.0 BitDeEntradaAfectada:=E124.0 Tiempo := BitRutinaErrores :=M250.0 U M 200.0 R M 0.1 S M 0.2 _001: NOP 0
:=T0 := := := := :=
Donde observamos que no ha sido necesario pasarle los valores de “BitDeTrabajo”, BitDeEtapa_1”, BitDeEtapa_2”, BitDeEtapa_3”, BitDeEtapa_4” ni “BitDeEtapa_5”, por cuanto debido a la etapa de auto inicialización de FB1, no son necesarios. Tampoco hemos pasado el valor de “Tiempo”, ya que con el valor inicial que hemos declarado de cinco (5) segundos, es suficiente. Los parámetros formales de salida, como “BitDeError”, “BitDeFin”, “BitDeSalidaAfectada” y “BitRutinaErrores”, sí que le hemos dicho cuáles son los parámetros actuales que debe usar, con objeto de recoger la información resultante del cálculo efectuado por FB1. En cuanto al contenido de OB100, podemos poner por ejemplo: L B#16#0 T MB0 CALL SFC21 BVAL :=P#M0.0 BYTE 1 RET_VAL:=MW100 BLK :=P#M1.0 BYTE 500 L W#16#0 T AW124
238
Direccionamiento
Capítulo 19
CAPÍTULO 19
Índice
Direccionamiento 19.1 Direccionamiento inmediato En capítulos anteriores hemos visto ya este modo de dirigirnos a la información que tenemos almacenada en memoria, pero la volvemos a exponer aquí con más detalle. Así por ejemplo, cuando deseamos depositar un valor constante como puede ser un número o el equivalente codificado de un carácter alfabético en una posición de memoria, empezamos por cargar este valor en el ACU1 para después traspasarlo a la posición de memoria. Ejemplos: L T
14 MW10
L T
‘PEPE’ MW0
L T
DW#16#12345678 MD8
Observamos como en todos los casos, empezamos por cargar en ACU1 de forma INMEDIATA bien el número “14”, o bien las letras “PEPE” o bien los números “12345678”. A esta forma de trabajar con la información se le llama direccionamiento inmediato. 19.2 Direccionamiento directo En el direccionamiento directo, lo que manipulamos no son valores constantes como números o letras, sino direcciones de memoria que contienen estos valores constantes. Ejemplos:
L
DBB14
L
MW10
L
MD12
L
DBD16
T
MD0
En todos estos casos, estamos trabajando con la dirección de la información, pero no con la información misma como hacíamos en el modo inmediato. A esto se le llama direccionamiento directo. 19.3 Direccionamiento indirecto En el caso del direccionamiento indirecto, se procesa un operando que contiene la dirección que a su vez contiene el valor que se desea procesar. Es algo así como ir a una determinada dirección postal A, donde nos dan otra dirección postal B en la que encontramos definitivamente lo que buscamos. 239
Direccionamiento
Capítulo 19
Es por esta razón que hablamos de direccionamiento indirecto, porque la dirección del primer lugar no contiene lo que andamos buscando, sino que contiene la dirección de otro lugar que es donde realmente encontraremos lo que buscamos. En general, se llama puntero a estas direcciones de memoria que a su vez contienen otras direcciones de memoria. En STEP-7 se dispone de hasta tres (3) mecanismos como el indicado, que permiten al programador trabajar con direccionamiento indirecto, siendo estos los siguientes: • • •
Direccionamiento indirecto por memoria Direccionamiento indirecto por registro e intraárea Direccionamiento indirecto por registro e interarea
19.4 Direccionamiento indirecto por memoria Se habla de direccionamiento indirecto por memoria, cuando el puntero es una posición de memoria. En este caso, las posiciones de memoria válidas para este tipo de direccionamiento pueden ser las siguientes: • • • •
Marcas Bloques de datos globales Bloque de datos de instancia Memoria local
A su vez, estos punteros de memoria se dividen en dos (2) grupos: • •
Punteros de memoria de dieciséis (16) Bits Punteros de memoria de treinta y dos (32) Bits
En el primer caso, punteros de memoria de dieciséis (16) Bits, el contenido de esta palabra de dieciséis (16) Bits es un número entero sin signo que puede variar desde cero (0) hasta sesenta y cinco mil quinientos treinta y cinco (65535), por lo que este tipo de punteros únicamente son válidos si queremos hacer referencia a partes de la memoria del autómata que queden identificadas con solamente un único número entero, como son los temporizadores (por ejemplo T2, T7, etc.) o las funciones (por ejemplo FC3, FC6, etc.) o los bloques de datos (por ejemplo DB2, DB7, etc.) o los contadores (Z1, Z7, etc.). Ejemplo:
L T AUF
2 MW0 DB[MW2]
NOTA: [MW2] se lee como “el contenido de MW2”. En el segundo caso, punteros de memoria de treinta y dos (32) Bits, el contenido de esta palabra de treinta y dos (32) Bits se interpreta de la siguiente manera: 31 0 0 0 0
24 23 0 0 0 0 0 0 0 0
16 15 0 b b b b b b b
240
87 b b b b b b b b
0 b x x x
Direccionamiento
Capítulo 19
Los bits que van de la posición tres (3) hasta la dieciocho (18) ambos inclusive, forman el número del Byte, y los Bits cero (0), uno (1) y dos (2), forman el número del Bit. Por ejemplo, si nos estamos refiriendo al Bit cinco (5) del Byte diecinueve (19) de una memoria (la que sea), el contenido de la palabra anterior será el siguiente: 31 0 0 0 0
24 23 0 0 0 0 0 0 0 0
16 15 0 0 0 0 0 0 0 0
87 0 0 0 0 1 0 0 1
Ya que diez y nueve (19) en base dos (2) es:
Byte
0 1 1 0 1 Bit
10011 Y cinco (5) también en base dos (2) es: 101 Por tanto, en formato “Byte . Bit” será: 10011 . 101 El punto no se pone Ejemplo:
L T U
P#19.5 (1) MD0 (2) A[MD0] (3)
En este caso, el operador P#19.5 representa el formato Byte.Bit (en definitiva dos números, el diecinueve (19) y el cinco (5)) los cuales depositamos en ACU1 en la línea (1). En la línea (2) trasladamos el Byte.Bit al Double Word MD0, y en la línea (3) indagamos el estado del Bit A19.5, ya que MD0 contiene la pareja de números “19.5”. 19.5 Direccionamiento indirecto por registro intraárea Este es otro tipo de direccionamiento indirecto en el que se hace uso de los registros de desplazamiento AR1 y AR2, así como de los operadores “P#” que ya hemos visto en el ejemplo anterior. En general el operador “P#” puede tener los siguientes formatos: • •
P# LETRA BYTE.BIT P# BYTE.BIT
Este operador (que habitualmente también se le llama puntero pero que no debe confundirse con lo que hemos explicado anteriormente sobre punteros) junto con los registros de direcciones AR1 o AR2, permite trabajar también de forma indirecta de la siguiente forma: Letra/s_identificativas_de_la_direccion_de_memoria,_excepto_el_Byte.Bit[AR1(o R2),P#Byte.Bit]
Donde “Letra/s_identificativas_de_la_direccion_de_memoria,_excepto_el_Byte.Bit” es suficientemente auto explicativo y “[AR1(ó AR2),P#Byte.Bit]” nos proporcionan la dirección restante en el formato Byte.Bit.
241
Direccionamiento
Capítulo 19
Veamos ejemplos que expliquen lo dicho: L LAR1 U
P#14.2 A[AR1,P#2.5]
(1) (2) (3)
En la línea (1) cargamos ACU1 con la pareja “14.2”. En la línea (2) llevamos a AR1 la pareja “14.2” y en la línea (3) empezamos por resolver lo que hay dentro de los corchetes, que es lo siguiente: [AR1, P#2.5] = [“14.2” + “2.5”] = [“16.7”] Con lo que la línea (3) se interpreta finalmente como: U
A16.7
Veamos otro ejemplo del mismo estilo: L LAR1 U
P#5.6 A[AR2,P#2.5]
(1) (2) (3)
Ahora ACU1 se carga con la pareja “”5.6” en la línea (1). En la línea (2) se traspasa esta pareja a AR2 y en la línea (3) se empieza por resolver el interior de los corchetes: [AR2, P#2.5] = [“5.6” + “2.5”] = [“8.3”] Y la línea (3) queda finalmente como: U
A8.3
Obsérvese como se ha resuelto la suma de “5.6” + “2.5”. La regla que debe aplicar en estos casos consiste en sumar los Bits de ambos números, en este caso seis (6) y cinco (5), y el resultado once (11) se pasa a base ocho (8), que nos da trece (13) en base ocho (8). Después se deja el tres (3) como número del Bit y nos llevamos uno (1) que sumado a cinco (5) y dos (2), nos dan ocho (8). Como regla de “andar por casa” para el caso de direccionamiento indirecto por registro intraárea, recordemos únicamente que en este tipo de direccionamiento, el interior de los corchetes nos proporciona el desplazamiento dentro del área de memoria que estemos manejando en el formato Byte.Bit, y por tanto necesitamos exteriormente al corchete las letras que identifican el tipo de memoria para completar la dirección de la misma. Debido a que en este tipo de direccionamiento únicamente necesitamos proporcionar el desplazamiento dentro del área de memoria en el formato Byte.Bit, los punteros que se usan en este formato se pueden guardar en registros del tipo Double Word, treinta y dos (32) Bits, con idéntico formato que el visto en el apartado anterior. 19.6 Direccionamiento indirecto por registro interárea En el caso de direccionamiento interárea, se trata de especificar no solamente el desplazamiento del elemento de memoria dentro de su área, sino también el tipo de memoria de que se trata.
242
Direccionamiento
Capítulo 19
Este tipo de direccionamiento se parece mucho al direccionamiento indirecto por registro intraárea ya visto en el apartado anterior, pero su interpretación es algo diferente, ya que aquí lo que se guarda previamente en el registro AR1 o AR2 no es el desplazamiento en formato Byte.Bit, sino una dirección completa de memoria. Veamos ejemplos: L LAR1 U
P#M14.2
(1) (2) (3)
[AR1,P#1.3]
Ahora en la línea (1) cargamos en ACU1 la dirección “M14.2” que nos pasa el operador P#M14.2. En la línea (2) traspasamos a AR1 el valor “M14.2”. En la línea (3) empezaremos por resolver el contenido de los corchetes: [AR1, P#1.3] = [M “14.2” + “1.3”] = M [“14.2” + “1.3”] = M 15.5 Por lo que la línea (3) queda finalmente como: U
M15.5
Veamos otro ejemplo: L LAR2 L T
P#A122.0
(1) (2) (3) (4)
B#16#EF B[AR2, P#2.0]
En (1) cargamos ACU1 con la dirección “A122.0”. En (2) traspasamos a AR2 la dirección anterior. En (3) cargamos ACU1 con “EF” como cifras hexadecimales. En (4) tendremos: [AR2, P#2.0] = [A “122.0”+ “2.0”] = A[“122.0” + “2.0”] = A124.0 Con lo que la línea (4) se leerá finalmente como: T
AB124
Obsérvese como hemos tenido especial cuidado en poner a cero (0) este Bit , ya que lo que nos interesa es el número del Byte y no el del Bit. En este caso, el puntero también puede guardarse en un Double Word, pero ahora el significado de los Bits que forman el registro de treinta y dos (32) Bits, es el siguiente: 31 1 0 0 0
24 23 0 r r r 0 0 0 0
16 15 0 b b b b b b b
243
87 b b b b b b b b
0 b x x x
Direccionamiento
Capítulo 19
Aquí el significado de los Bits que van del tres (3) al dieciocho (18) (los marcados con “b”) es el mismo que ya vimos en el apartado 19.5, y también los Bits cero (0), uno (1) y dos (2) (los marcados con “x”) tienen el mismo significado que en el apartado 19.5, pero obsérvese como aparece ahora un “1” en la posición treinta y uno (31), lo cual indica que se trata de direccionamiento indirecto por registro interáarea, y además los Bits veinticuatro (24), veinticinco (25) y veintiséis (26) (los marcados con “r”) especifican el área de memoria de que se trata, según la siguiente tabla: Código hexadecimal 1 2 3 4 5 6 7
Área de memoria E A M DB DI L
Significado Entradas digitales Salidas digitales Memoria de marcas Bloques de datos globales Bloques de datos de instancia Memoria local Datos locales precedentes
19.7 El puntero generalizado Hasta aquí hemos visto como podemos direccionar de forma indirecta nuestros recursos de memoria del autómata, pero hay un caso particular que aun no hemos contemplado y es el caso de los datos almacenados en un bloque de datos en general. Si tenemos un bloque de datos de tipo global, por ejemplo DB6, y queremos referirnos a estos datos según el método de direccionamiento indirecto intraárea, pondremos (por ejemplo): AUF L LAR1 L T
DB6 P#0.0 DBB[AR1,P#0.0] MB0
Si quisiéramos resolver este caso con el método de direccionamiento indirecto interárea, pondríamos (por ejemplo): AUF L LAR1 L T
DB6 P#DBX0.0 B[AR1,P#0.0] MB0
Ahora bien, lo que no podríamos es escribir lo siguiente: L LAR1 L T
P#DBX0.0 DB6.B[AR1,P#0.0] MB0
No es posible
De aquí deducimos que si queremos que el puntero incluya el número del DB que estamos manejando, entonces se tiene que ampliar la idea de puntero para que tenga en cuenta el número del DB, de la siguiente forma:
244
Direccionamiento 15
14
Capítulo 19 13
12
11
10
9
8
7
6
5
4
3
2
1
0
B15 B14 B13 B12 B11 B10 B9
B8
B7
B6
B5
B4
B3
B2
B1
B0
0
0
B2
B1
B0
0
0
0
0
0
B12 B11 B10 B9
B8
B7
B6
B5
B4
B3
B2
B1
B0
1
0
0
B15 B14 B13 B2
B1
B0
: Contiene el número del bloque de datos (o cero (0) si no es un bloque de datos)
: Contiene un número que depende del tipo de memoria usada (ver tabla anterior). :
Contiene el número del Byte que estemos manejando.
:
Contiene el número del Bit que estemos manejando.
El problema que tiene manejar punteros con este formato de seis (6) Bytes, es que no podemos guardarlos en registros convencionales como los acumuladores ACU1 o ACU2 ni tampoco en los registros de direccionamiento AR1 o AR2, ya que están formados por cuatro (4) Bytes y necesitaríamos seis (6) para guardar un puntero de este tipo. Nos queda sin embargo el recurso de guardar estos punteros en el interior de bloques de datos, definiendo previamente la posición donde pensemos guardar el puntero como del tipo POINTER.
245
Algunos conceptos avanzados
Capítulo 20
CAPÍTULO 20
Índice
Algunos conceptos avanzados 20.1
Los punteros como parámetros formales
En STEP-7 es posible usar punteros como parámetros formales, tanto a la hora de llamar a una función como a un bloque de función, de tal forma que lo que recibe la función o el bloque de función cuando se le envía un parámetro actual en forma de puntero, es una dirección de memoria y no el valor que pueda tener esa dirección de memoria. Si hasta ahora empleábamos el símbolo: #ParametroFormal Para referirnos a uno cualquiera de los parámetros formales de una función (o bloque de función), ahora cuando tengamos que hacer referencia a un parámetro formal que se haya definido del tipo POINTER (puntero), deberemos emplear el siguiente símbolo: P##ParametroFormalTipoPOINTER Veremos más adelante con algunos ejemplos la indudable utilidad de esta nueva herramienta, pero es preciso decir sin embargo que el manejo de los punteros como parámetros formales, complica fácilmente la redacción del programa, por lo que hay que andar con mucho cuidado cuando se trabaja con punteros. Veamos un ejemplo básico de trabajo con punteros: Se trata de enviar un puntero simple del tipo P#Byte.Bit a una función FC1, de tal forma que en cuanto se reciba este valor en la función, interrogaremos al Bit E “Byte.Bit” y asignaremos después este valor a la salida A125.0. Declaración de parámetros formales de FC1: In
Byte_Bit
POINTER
Operaciones en FC1: L LAR1 L LAR1 U =
P##Byte_Bit
//(1) //(2) //(3) //(4) //(5) //(6)
D [AR1,P#2.0] E [AR1,P#0.0] A 125.0
Operaciones en OB1: CALL FC 1 Byte_Bit:=P#124.0
//(1) //(2)
En la línea (1) de OB1 hacemos la llamada a la función FC1 y en la línea (2) pasamos a FC1 la pareja de números “124.0” en forma de puntero P#124.0.
247
Algunos conceptos avanzados
Capítulo 20
De lo dicho anteriormente, lo que realmente ocurre es que en OB1 se almacena en memoria local el puntero que estamos enviando y lo que realmente se envía a FC1 es la dirección del primer Byte a partir del que se encuentran los seis (6) Bytes del puntero que hemos guardado y que deseamos enviar. En la línea (1) de FC1, se carga en ACU1 la dirección (que ya hemos dicho) del primer Byte de la memoria local de OB1 a partir del que se encuentran los seis (6) Bytes que contienen el puntero que se desea pasar a FC1, y en la línea (2) de FC1 se pasa a AR1 esta dirección. En la línea (3) cargamos en ACU1 el contenido de la dirección que almacena AR1, pero con un desplazamiento de dos (2) Bytes (NOTA: obsérvese que estamos recurriendo a direccionamiento por registro e intraárea) con lo que se cargan en ACU1 los Bytes dos (2), tres (3), cuatro (4) y cinco (5) del puntero guardado en la memoria local de OB1 (NOTA: esto es posible gracias a que es viable acceder a la memoria local del bloque anterior, en este caso OB1, desde FC1). En la línea (4) pasamos a AR1 los mencionados Bytes dos (2), tres (3), cuatro (4) y cinco (5) del puntero guardado en la memoria local de OB1, que en definitiva contienen el puntero P#124.0, y en la línea (5) finalmente recuperamos la dirección completa E124.0 (NOTA: obsérvese que esta vez hemos usado el valor puntero P#0.0 pues dado que AR1 ya tiene la información que necesitamos, aquí no es necesario sumar nada a AR1). Vamos a ver otro ejemplo, pero ahora lo que enviamos es un puntero completo del tipo P#Letra Byte.Bit. Declaración de parámetros formales de FC1: In
Letra_Byte_Bit POINTER
Operaciones en FC1: L LAR1 L LAR1 U =
P##Letra_Byte_Bit D [AR1,P#2.0] [AR1,P#0.0] A 125.0
//(1) //(2) //(3) //(4) //(5) //(6)
Operaciones en OB1: CALL FC 1 Letra_Byte_Bit:=P#E124.0
//(1) //(2)
En lo que respecta a OB1, la mecánica es muy similar a la del caso anterior, pues al hacer la llamada a FC1 y pasarle el puntero P#E124.0, lo que realmente estamos haciendo es almacenar previamente en memoria local de OB1 el puntero P#E124.0 en formato de seis (6) Bytes y lo que enviamos realmente a FC1 es la dirección del primer Byte en el que se ha guardado este puntero. En la línea (1) de FC1 se guarda en ACU1 la dirección donde comienza el puntero almacenado en la memoria local anterior (la memoria local de OB1), en la línea (2) se pasa a AR1 esta dirección, y en la línea (3) se almacenan en ACU1 los Bytes dos (2), tres (3), cuatro (4) y cinco (5) del puntero guardado en la memoria local de OB1 (NOTA: obsérvese que estamos haciendo uso de direccionamiento por registro interárea) que contienen la dirección final del dato, gracias al valor constante P#2.0 que estamos sumando.
248
Algunos conceptos avanzados
Capítulo 20
En la línea (4) pasamos a AR1 la dirección final donde está nuestro dato y finalmente en la línea (5) indagamos finalmente por el estado del Bit (NOTA: aquí tampoco sumamos ningún desplazamiento al contenido de AR1, pues ya contiene la información que se necesita). 20.2
Un ejemplo completo
Imaginemos el siguiente problema. Tenemos tres (3) motores eléctricos M1, M2 y M3 trifásicos asíncronos con rotor en corto circuito con las siguientes potencias eléctricas: • • •
El motor M1 tiene una potencia de 2 Kw. El motor M2 tiene una potencia de 7 Kw. El motor M3 tiene una potencia de 12 Kw.
Nuestra intención es poner los tres (3) motores en marcha simultáneamente por el método estrella-triangulo de la figura, pero teniendo en cuenta la diferencia de potencia entre los motores y la diferencia de inercia mecánica del rotor que hay entre ellos, hemos pensado acoplar a cada motor un dispositivo que nos indique eléctricamente, por medio de un contacto, en qué momento el motor ha alcanzado determinada velocidad. Concretamente, las siguientes velocidades para cada motor: • • •
Para el motor M1, 1600 RPM Para el motor M2, 1100 RPM Para el motor M3, 800 RPM
Por otra parte, y teniendo en cuenta que pensamos emplear tres (3) contactores independientes para cada motor para realizar la maniobra de arranque estrella-triangulo, vamos a suponer que los contactores que destinamos a cada motor son los siguientes: • • •
Para el motor M1, contactores KM1, KM2 y KM3 Para el motor M2, contactores KM4, KM5 y KM6 Para el motor M3, contactores KM7, KM8 y KM9
Se dispone también de un pulsador P1 el cual al ser oprimido, inicia el proceso de puesta en marcha de los tres (3) motores. Con todo esto, podemos confeccionar ya la siguiente tabla de entradas/salidas: E124.0 E124.1 E124.2 E124.3
Entradas Botón inicio (P1) Velocidad de 1600 RPM alcanzada en M1 Velocidad de 1100 RPM alcanzada en M2 Velocidad de 800 RPM alcanzada en M3
A124.0 A124.1 A124.2 A124.3 A124.4 A124.5 A124.6 A124.7 A125.0
Salidas Hacia devanado de KM1 Hacia devanado de KM2 Hacia devanado de KM3 Hacia devanado de KM4 Hacia devanado de KM5 Hacia devanado de KM6 Hacia devanado de KM7 Hacia devanado de KM8 Hacia devanado de KM9
Con esta información, vamos a empezar por diseñar una función FC1 en la que escribiremos las operaciones necesarias para poner en marcha uno cualquiera de los tres (3) motores, y para ello emplearemos una función del tipo D, con objeto de no manejar temporizadores ni posibles errores del mecanismo controlado, que por ser el primer ejemplo, complicarían las cosas innecesariamente. 249
Algunos conceptos avanzados
Capítulo 20
G1 de FC1:
G2 de FC1:
Desde bloque OB1
0
=1
Desde bloque OB1
Inicializar la función en la 1ª pasada y no volver a ejecutar esta etapa.
Hacer:
0
¿Alcanzada velocidad?
BitSalida_3=0 BitSalida_2=1
2 =1
BitDeEtapa_3 BitDeFin=1 BitDeTrabajo=0
3
BitVelocidadOK
BitDeEtapa_2
=1
BitSalida_3=1 BitSalida_1=1
1
Pasar motor a triangulo
2
=1
BitDeEtapa_1 Arrancar motor en estrella
1
BitDeFin=1 BitDeTrabajo=0
3
=1
BitDeEtapa_1=1 BitDeEtapa_2=0 BitDeEtapa=3=0 BitDeFin=0
=1
Hacia bloque OB1
Hacia bloque OB1
La declaración de los parámetros formales de FC1 será: In In In In In_out In_out In_out In_out In_out
BitDeTrabajo BOOL BitDeEtapa_1 BOOL BitDeEtapa_2 BOOL BitDeEtapa_3 BOOL BitSalida_1 POINTER BitSalida_2 POINTER BitSalida_3 POINTER BitDeFin POINTER BitVelocidadOK POINTER
Las operaciones de FC1: O M 0.0 0.0 ON M FP #BitDeTrabajo SPBN _100 S #BitDeEtapa_1 R #BitDeEtapa_2 R #BitDeEtapa_3 L P##BitDeFin LAR1 L D [AR1,P#2.0] LAR1 SET R [AR1,P#0.0] _100: NOP 0 U #BitDeEtapa_1 SPBN _101 L P##BitSalida_3 LAR1 L D [AR1,P#2.0] LAR1 SET
S [AR1,P#0.0] L P##BitSalida_1 LAR1 L D [AR1,P#2.0] LAR1 SET S [AR1,P#0.0] L P##BitVelocidadOK LAR1 L D [AR1,P#2.0] LAR1 U [AR1,P#0.0] R #BitDeEtapa_1 S #BitDeEtapa_2 _101: NOP 0 U #BitDeEtapa_2 SPBN _102 L P##BitSalida_3 LAR1 L D [AR1,P#2.0] LAR1 250
SET R [AR1,P#0.0] L P##BitSalida_2 LAR1 L D [AR1,P#2.0] LAR1 SET S [AR1,P#0.0] R #BitDeEtapa_2 S #BitDeEtapa_3 _102: NOP 0 U #BitDeEtapa_3 SPBN _103 R #BitDeEtapa_3 L P##BitDeFin LAR1 L D [AR1,P#2.0] LAR1 SET S [AR1,P#0.0] R #BitDeTrabajo _103: NOP 0
Algunos conceptos avanzados
Capítulo 20
Veamos ahora OB1 y OB100:
U E 125.0 FP M 0.0 S M 0.1
//(*) //(*) //(*)
U M 0.1 SPBN _000 CALL FC 1 BitDeTrabajo :=M10.0 BitDeEtapa_1 :=M10.2 BitDeEtapa_2 :=M10.2 BitDeEtapa_3 :=M10.3 BitSalida_1 :=A124.0 BitSalida_2 :=A124.1 BitSalida_3 :=A124.2 BitDeFin :=M200.0 BitVelocidadOK:=E124.1
OB1 CALL FC 1 BitDeTrabajo :=M15.0 BitDeEtapa_1 :=M15.1 BitDeEtapa_2 :=M15.2 BitDeEtapa_3 :=M15.3 BitSalida_1 :=A124.6 BitSalida_2 :=A124.7 BitSalida_3 :=A125.0 BitDeFin :=M200.2 BitVelocidadOK:=E124.3 U M U M U M R M S M _000: NOP
200.0 200.1 200.2 0.1 0.2 0 OB100 L B#16#0 T MB 0 CALL "FILL" BVAL :=P#M 0.0 BYTE 1 RET_VAL:=MW100 BLK :=P#M 1.0 BYTE 500 L W#16#0 T AW 124
CALL FC 1 BitDeTrabajo :=M10.4 BitDeEtapa_1 :=M10.5 BitDeEtapa_2 :=M10.6 BitDeEtapa_3 :=M10.7 BitSalida_1 :=A124.3 BitSalida_2 :=A124.4 BitSalida_3 :=A124.5 BitDeFin :=M200.1 BitVelocidadOK:=E124.2
Se puede observar como por estar trabajando con funciones clase D, al hacer la llamada a la misma, nos vemos obligados a enviar parámetros actuales tales como M10.0, M10.1, M10.2, M10.3, M10.4, M10.5, M10.6, M10.7, M15.0, M15.1, M15.2 y M15.3, aún sabiendo que en este caso particular no serán usados por la función, debido a que la etapa de inicialización de la función que estamos empleando posee mecanismos que hacen innecesario el envío de los valores de estos Bits. Se nos ocurre que si en lugar de usar una función tipo D usamos un bloque de función tipo II, podríamos ahorrarnos el envío de los Bits mencionados, ya que una característica típica de los bloques de función es la opción que tenemos de enviar o no enviar los parámetros actuales. Efectivamente, si resolvemos este mismo ejemplo con un bloque de función FB1 tipo II, pero manteniendo todo exactamente igual como lo hemos definido en FC1, entonces el contenido de FB1 será el mismo que el de FC1 (razón por la que no repetimos aquí las operaciones) y únicamente notaremos el siguiente cambio en la llamada a FB1 desde OB1:
251
Algunos conceptos avanzados
U E 125.0 FP M 0.0 S M 0.1
Capítulo 20
//(*) //(*) //(*)
OB1
U M 0.1 SPBN _000 CALL FB 1, DB 1 BitDeTrabajo := BitDeEtapa_1 := BitDeEtapa_2 := BitDeEtapa_3 := BitSalida_1 :=A124.0 BitSalida_2 :=A124.1 BitSalida_3 :=A124.2 BitDeFin :=M200.0 BitVelocidadOK:=E124.1
CALL FB 1, DB 1 BitDeTrabajo := BitDeEtapa_1 := BitDeEtapa_2 := BitDeEtapa_3 := BitSalida_1 :=A124.6 BitSalida_2 :=A124.7 BitSalida_3 :=A125.0 BitDeFin :=M200.2 BitVelocidadOK:=E124.3 U M U M U M R M S M _000: NOP
200.0 200.1 200.2 0.1 0.2 0 OB100 L B#16#0 T MB 0 CALL "FILL" BVAL :=P#M 0.0 BYTE 1 RET_VAL:=MW100 BLK :=P#M 1.0 BYTE 500 L W#16#0 T AW 124
CALL FB 1, DB 1 BitDeTrabajo := BitDeEtapa_1 := BitDeEtapa_2 := BitDeEtapa_3 := BitSalida_1 :=A124.3 BitSalida_2 :=A124.4 BitSalida_3 :=A124.5 BitDeFin :=M200.1 BitVelocidadOK:=E124.2
Vamos a perfeccionar lo hecho hasta aquí y para ello vamos borrar el actual bloque de datos DB1 y vamos a definir en su lugar tres (3) nuevos bloques de datos de instancia DB1, DB2 y DB3 asociados a la FB1 anterior, pero con los siguientes contenidos: DB1: BitDeTrabajo BitDeEtapa_1 BitDeEtapa_2 BitDeEtapa_3 BitDeFin BitSalida_1 BitSalida_2 BitSalida_3 BitVelocidadOK
BOOL BOOL BOOL BOOL POINTER POINTER POINTER POINTER POINTER
FALSE FALSE FALSE FALSE P#P 0.0 P#P 0.0 P#P 0.0 P#P 0.0 P#P 0.0
FALSE FALSE FALSE FALSE P#M 200.0 P#A 124.0 P#A 124.1 P#A 124.2 P#E 124.1
BOOL BOOL BOOL BOOL POINTER POINTER POINTER POINTER POINTER
FALSE FALSE FALSE FALSE P#P 0.0 P#P 0.0 P#P 0.0 P#P 0.0 P#P 0.0
FALSE FALSE FALSE FALSE P#M 200.1 P#A 124.3 P#A 124.4 P#A 124.5 P#E 124.2
BOOL BOOL BOOL BOOL POINTER POINTER POINTER POINTER POINTER
FALSE FALSE FALSE FALSE P#P 0.0 P#P 0.0 P#P 0.0 P#P 0.0 P#P 0.0
FALSE FALSE FALSE FALSE P#M 200.2 P#A 124.6 P#A 124.7 P#A 125.0 P#E 124.3
DB2: BitDeTrabajo BitDeEtapa_1 BitDeEtapa_2 BitDeEtapa_3 BitDeFin BitSalida_1 BitSalida_2 BitSalida_3 BitVelocidadOK
DB3: BitDeTrabajo BitDeEtapa_1 BitDeEtapa_2 BitDeEtapa_3 BitDeFin BitSalida_1 BitSalida_2 BitSalida_3 BitVelocidadOK
252
Algunos conceptos avanzados
Capítulo 20
En cuanto a la llamada desde OB1, tendremos: (De arriba a abajo y de izquierda a derecha) //(*) CALL FB 1 , DB2 CALL FB 1 , DB3 //(*) BitDeTrabajo := BitDeTrabajo := //(*) BitDeEtapa_1 := BitDeEtapa_1 := BitDeEtapa_2 := BitDeEtapa_2 := U M 0.1 BitDeEtapa_3 := BitDeEtapa_3 := SPBN _001 BitDeFin := BitDeFin := CALL FB 1 , DB1 BitSalida_1 := BitSalida_1 := BitDeTrabajo := BitSalida_2 := BitSalida_2 := BitDeEtapa_1 := BitSalida_3 := BitSalida_3 := BitDeEtapa_2 := BitVelocidadOK:= BitVelocidadOK:= BitDeEtapa_3 := BitDeFin := U M 200.0 BitSalida_1 := U M 200.1 BitSalida_2 := U M 200.2 BitSalida_3 := R M 0.1 BitVelocidadOK:= S M 0.2 _001: NOP 0 U E 125.0 FP M 0.0 S M 0.1
Observamos la total ausencia de parámetros actuales, debido a que estamos haciendo uso de los parámetros por defecto que se encuentran en los bloques de datos de instancia DB1, DB2 y DB3. 20.3 El parámetro ANY El parámetro ANY (ANY = cualquiera) viene a ser como un parámetro comodín que es posible usar sea cual sea el tipo de dato que estemos tratando. El formato de un parámetro ANY ocupa diez (10) Bytes y es el siguiente (caso de que se quieran representar los tipos de datos que se indican en la Tabla 20.1) 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
1
0
0
0
0
B7
B6
B5
B4
B3
B2
B1
B0
(1)
(2) B15 B14 B13 B12 B11 B10 B9
B8
B7
B6
B5
B4
B3
B2
B1
B0
(3)
(4) B15 B14 B13 B12 B11 B10 B9
B8
B7
B6
B5
B4
B3
B2
B1
B0
(5)
(6) B7
(0)
B4
B3
B2
B1
B0
0
0
0
0
0
(8) B12 B11 B10 B9
B8
B7
B6
B5
B4
B3
B2
B1
B0
B6
B5
B15 B14 B13 (7) B2
B1
B0
(9)
:
Tipo de dato, según Tabla 20.1
:
Factor de repetición o número de veces que se repite el tipo de dato.
:
Número de DB ( o cero (0) si no es un DB)
:
Área de memoria según Tabla 20.2
:
Dirección del Byte
:
Dirección del Bit 253
Algunos conceptos avanzados
Capítulo 20
En caso de quererse representar temporizadores, contadores o bloques, el parámetro ANY tiene el siguiente formato: 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
(0)
0
0
0
1
0
0
0
0
B7
B6
B5
B4
B3
B2
B1
B0
(1)
(2)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
(3)
(4)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
(5)
(6) B7
B6
B5
B4
B3
B2
B1
B0
0
0
0
0
0
0
0
0
(7)
(8) B15 B14 B13 B12 B11 B10 B9
B8
B7
B6
B5
B4
B3
B2
B1 B0
(9)
Color
:
Tipo de dato, según Tabla 20.1
Color
:
Número del contador, temporizador o bloque
Código hexadecimal 0 1 2 3 4 5 6 7 8
Tipo de dato
Comentario
NIL BOOT BYTE CHAR WORD INT DWORD DINT REAL
PUNTERO CERO BITS BYTES (8 BITS) MARCAS (8 BITS) PALABRAS (16 BITS) ENTEROS (16 BITS) DOBLES PALABRAS (32 BITS) ENTEROS DOBLES (32 BITS) NÚMERO EN COMA FLOTANTE (32 BITS) FECHA HORA DEL DÍA
9 DATE A TIME_OF_DAY (TOD) B TIME C S5TIME E DATE_AND_TIME (DT) 13 STRING 17 BLOCK_FB 18 BLOCK_FC 19 BLOCK_DB 1A BLOCK_SDB 1C COUNTER 1D TIMER
TIEMPO TIEMPO S5TIME FECHA Y HORA (64 BITS) CADENA DE CARACTERES NÚMERO DE FB NÚMERO DE FC NÚMERO DE DB NÚMERO DE SDB NÚMERO DE CONTADOR NÚMERO DE TEMPORIZADOR
Tabla 20.1
254
Algunos conceptos avanzados
Capítulo 20
Código hexadecimal Área de memoria 81 E
Comentario MEMORIA DE ENTRADAS DIGITALES MEMORIA DE SALIDAS DIGITALES MEMORIA DE MARCAS MEMORIA DE BLOQUE DE DATOS GLOB. MEMORIA DE BLOQUE DE DATOS DE INS. MEMORIA LOCAL MEMORIA LOCAL PRECEDENTE
82 A 83 M 84 DB 85 DI 86 L 87 Tabla 20.2
20.4 Uso del parámetro ANY Si en una función o bloque de función declaramos los parámetros formales del tipo ANY, entonces al hacer la llamada de la función o del bloque de función, podemos enviar como parámetro actual cualquier valor de parámetro simple, compuesto, temporizadores, contadores o bloques. Si por ejemplo tenemos una función FC20 que contiene los parámetros formales ParFormal_1, ParFormal_2 y ParFormal_3, y los tres (3) los hemos declarado del tipo ANY, al hacer la llamada de FC20 podemos enviar por ejemplo un número entero INT, una palabra WORD, un temporizador T20, etc. Otro uso del parámetro ANY es la definición de áreas extensas de memoria. Por ejemplo: P#M20.0 Byte 50 Indicaría que se trata de un área de memoria de marcas que comienza en el Bit cero (0) del Byte veinte (20) de la memoria de marcas y termina cincuenta (50) Bytes más adelante. Otro ejemplo: P# DB10.DBX5.0 S5TIME 3 Significa que se trata de una área de memoria que comienza en el Bit cero (0) del Byte cinco (5) del bloque de datos globales DB10 y termina tres (3) unidades de tiempo S5TIME más adelante. Ahora bien como una unidad de tiempo S5TIME ocupa un Word (dos (2) Bytes), tres (3) unidades de tiempo S5TIME ocuparán seis (6) Bytes, y por tanto el área anterior terminará en el Bit DB10.DBX10.7 inclusive. Otro ejemplo: P# A 10.0 BOOL 4 Se trata de un área de memoria que comienza en el Bit A10.0 y termina en A10.3 inclusive. Total, cuatro (4) Bits.
255
SFCs
Capítulo 21
CAPÍTULO 21
Índice
SFCs 21.1
Introducción a las SFCs
Se llaman funciones del sistema, y se representan de la forma SFC , a aquellas funciones que ya están incluidas en el autómata. No todos los autómatas tienen todo el repertorio de SFCs que existe, y por tanto es necesario averiguar previamente las funciones de que dispone el autómata con el que vayamos a trabajar. En este capítulo se hace únicamente un breve repaso de aquellas SFCs que se consideran más importantes desde el punto de vista didáctico e introductorio al tema. 21.2
El parámetro RET_VAL
Cuando se hace una llamada a una SFC, puede ocurrir que como resultado de la ejecución de dicha SFC ésta nos devuelva alguna información que debamos considerar. Un parámetro común usado como retorno de información (saliente de la función) es el parámetro RET_VAL en el que la función deposita un código de error, cuando este se produce (NOTA: RET_VAL no siempre devuelve códigos de error). El formato de RET_VAL es el de una palabra de dieciséis (16) Bits con el siguiente significado 15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Bit 15: Este Bit es “1” si se ha producido un error en la ejecución de la SFC. Bits 14….Bit 8: Si el contenido de estos Bits es “0” se trata de un error específico de la función llamada, y en este caso los Bits 7 al Bit 0 contienen un número que informa del tipo de error. En este caso es necesario hacer un estudio de los errores específicos que puede devolver la función llamada para saber de qué tipo de error se trata. En caso de que el contenido de los Bits 14….Bit 8 sea distinto de cero, entonces se trata de un error de tipo general, cuyo significado se refleja en la tabla siguiente: (“x” es el número del parámetro que ha producido el error) Contenido de los Bits 15….Bit 0 Significado 8x7F Error interno producido por el parámetro “x”. 8x22 Se ha intentado leer un parámetro fuera del área permitida. 8x23 Se ha intentado escribir un parámetro fuera del área permitida. 8x24 Se ha producido un error al leer un parámetro. 8x25 Se ha intentado escribir un parámetro fuera del área asignada. 8x26 El temporizador asignado no existe.
257
SFCs
Capítulo 21
8x27 El contador asignado no existe. 8x28 Al leer el parámetro “x” se encuentra que la dirección del parámetro no es “0”. 8x29 Al escribir el parámetro “x” se encuentra que la dirección del parámetro no es “0”. 8x30 Se ha intentado escribir sobre un parámetro que esta en un DB global protegido contra escritura. 8x31 Se ha intentado escribir sobre un parámetro que esta en un DB de instancia protegido contra escritura. 8x32 Número incorrecto de DB. 8x34 Número incorrecto de FC. 8x35 Número incorrecto de FB. 8x3A Se hace referencia a un DB no cargado. 8x3C Se hace referencia a un FC no cargado. 8x3E Se hace referencia a un FB no cargado. 8x42 Se ha producido un error al leer un dato de periferia de entradas. 8x43 Se ha producido un error al escribir un dato de periferia de salidas. 8x44 Error de lectura en el intento n-simo. 8x45 Error de escritura en el intento n-simo. El parámetro RET_VAL tiene un significado diferente del anterior cuando se trabaja con las siguientes funciones de sistema: SFC 7 SFC 11 SFC 13 SFC 51 SFC 55 SFC 56 SFC 57 SFC 58 SFC 59
SFC 59 SFC 65 SFC 67 SFC 68 SFC 69 SFC 72 SFC 73 SFC 74 SFC 90
En el caso de trabajar con estas funciones de sistema, y suponiendo que se produce una llamada a una de estas funciones por primera vez, entonces RET_VAL devuelve el código hexadecimal “7001”, pero si la función a la que se llama ya ha sido llamada previamente y aún no ha terminado, entonces el contenido devuelto por RET_VAL es “7002”. 21.3
El parámetro REQ
El parámetro REQ (request = petición) es un parámetro entrante a la función y consiste en un Bit que sirve para solicitar la puesta en marcha de la función de sistema que interesa. El valor REQ = 1 lanza la petición de puesta en marcha de la función de sistema. Caso de volverse a hacer una segunda petición sin haber finalizado la primera, ésta no se tendrá en cuenta por la función. 21.4
El parámetro BUSY
El parámetro BUSY (ocupado) es un parámetro saliente de la función de sistema. Consiste en un Bit que se pone a “1” cuando la función de sistema aún no ha terminado. 258
SFCs
21.5
Capítulo 21
La función SFC20
La función SFC 20 tiene como nombre simbólico el de “BLKMOV” (block move = mover bloque) y sirve precisamente para mover zonas de memoria de una parte a otra. Ejemplo: CALL "BLKMOV" SRCBLK :=P#M 20.0 BYTE 50 RET_VAL:=MW100 DSTBLK :=P#M 80.0 BYTE 50
(1) (2) (3) (4)
En la línea (1) se hace la llamada “CALL SFC20” que inmediatamente es cambiada por STEP-7 y aparece “CALL “BLKMOV””, así como los parámetros formales “SRCBLK” (source block), “RET_VAL” y “DSTBLK” (destination block). En la línea (2) pasamos el área de datos “P#M20.0 BYTE 50” que deseamos mover. Este área comienza en el Bit M20.0 y tiene una extensión de 50 Bytes. En la línea (3) recogemos en MW100 el posible valor de error devuelto, y le asignamos un WORD ya que RET_VAL necesita un WORD para retornar su información. En la línea (4) le decimos a SFC20 en que área de memoria queremos depositar los cincuenta (50) Bytes de marcas que hemos indicado en la línea (2), usando el mismo método también que en la línea (2), o sea comenzando desde el Bit M80.0 y ocupando una extensión de cincuenta (50) Bytes. Otro ejemplo de esta función seria el siguiente: CALL "BLKMOV" SRCBLK :=P#DB1.DBX 0.0 BYTE 10 RET_VAL:=MW100 DSTBLK :=P#M 20.0 BYTE 10 21.6
La función SFC21
La función SFC21 tiene como nombre simbólico “FILL” (llenar) y sirve precisamente para llenar áreas de memoria con un patrón determinado. Por ejemplo: CALL "FILL" BVAL :=P#M 10.0 BYTE 2 RET_VAL:=MW100 BLK :=P#M 12.0 BYTE 30
(1) (2) (3) (4)
En la línea (1) llamamos a la función SFC21. En la (2) indicamos el área de memoria que queremos que sirva como patrón a copiar. En la línea (3) recogemos en MW100 el posible error que pueda producirse y en la línea (4) indicamos el área de memoria donde queremos depositar el patrón (NOTA: el patrón se copia en el área de destino todas las veces que son necesarias hasta cubrirla totalmente). 21.7
La función SFC22
La función SFC22 tiene como nombre simbólico el de “CREAT_DB” (create data block) y sirve precisamente para crear bloques de datos en tiempo de funcionamiento (con el programa funcionando). 259
SFCs
Capítulo 21
Esta función crea un bloque de datos asignándole un número que resulta ser el menor número posible elegido entre un margen superior e inferior que nosotros le proporcionamos. Debemos decirle también que capacidad en Bytes queremos que tenga el bloque de datos creado. Como respuesta, la función nos devuelve un WORD que contiene el posible error que se haya producido así como el número del bloque de datos realmente creado. Ejemplo: CALL "CREAT_DB" LOW_LIMIT:=W#16#0 UP_LIMIT :=W#16#10 COUNT :=W#16#30 RET_VAL :=MW100 DB_NUMBER:=MW102
(1) (2) (3) (4) (5) (6)
En la línea (1) llamamos a SFC22. En la línea (2) indicamos el número mínimo que deseamos para nuestro bloque de datos (en este caso el “0”). En la línea (3) indicamos el número máximo que deseamos para nuestro bloque de datos (en este caso el “10” en hexadecimal o “16” en decimal). En la línea (4) indicamos que queremos que nuestro bloque de datos tenga capacidad para treinta (30) Bytes (“30” Bytes en hexadecimal que son “48” Bytes en decimal). En la línea (5) recogemos en MW100 el posible error que nos devuelva SFC22 y en la línea (6) recogemos el valor que finalmente tiene nuestro bloque de datos creado. 21.8
La función SFC23
La función SFC23 tiene como nombre simbólico “DEL_DB” (delete data block) o lo que es lo mismo, borrar bloque de datos. Como su mismo nombre indica, sirve para borrar un bloque de datos en tiempo de funcionamiento del programa. Ejemplo: CALL "DEL_DB" DB_NUMBER:=W#16#1 RET_VAL :=MW100
(1) (2) (3)
En la línea (1) llamamos a la función SFC23. En la línea (2) le decimos el número del DB que queremos borrar y en la línea (3) la función deposita en MW100 el posible error que se haya producido al ejecutarse. 21.9
La función SFC24
Esta función tiene como nombre simbólico “TEST_DB” (test data block) o lo que es lo mismo, comprobar un bloque de datos. Se pone en funcionamiento por programa y en tiempo de ejecución del mismo. Al llamar a esta función, nos proporciona información sobre la capacidad en Bytes del bloque de datos investigado así como si está protegido contra escritura o no lo está. Ejemplo: CALL "TEST_DB" DB_NUMBER :=W#16#1 RET_VAL :=MW100 DB_LENGTH :=MW102 WRITE_PROT:=M20.0
(1) (2) (3) (4) (5) 260
SFCs
Capítulo 21
En la línea (1) es donde hacemos la llamada a la función. En la línea (2) le indicamos el número del bloque de datos que queremos investigar. En la línea (3) recogemos el posible error que nos devuelve la función. En la línea (4) recogemos la capacidad en Bytes del bloque de datos investigado y en (5) recogemos en M20.0 (M20.0 en este ejemplo) el valor del Bit que nos dice si el bloque de datos está protegido contra escritura o no lo está (“1” significa que SÍ lo está). 21.10 La función SFC25 Esta función tiene como nombre simbólico “COMPRESS” y sirve para comprimir en tiempo de ejecución del programa, la memoria de carga y la memoria interna del autómata. Esta función puede ser útil en casos de borrar y crear bloques de datos con frecuencia y en general allí donde haya mucho movimiento de entrada/salida de datos en el autómata. Ejemplo: CALL "COMPRESS" RET_VAL:=MW100 BUSY :=M20.0 DONE :=M20.1
(1) (2) (3) (4)
En la línea (1) llamamos a SFC25. En la línea (2) la función nos devuelve en MW100 (MW100 en este ejemplo) el posible error que se haya producido en su ejecución. En la línea (3) nos indica en M20.0 (M20.0 en este ejemplo) si la función ha terminado o no (valor “1” significa que aún no ha terminado) y en la línea (4) nos indica en M20.1 (M20.1 en este ejemplo) si el proceso de compresión ha terminado con éxito (valor “1” quiere decir que ha terminado con éxito). 21.11 La función SFC46 La función SFC46 tiene como nombre simbólico “STP” (stop) y puede emplearse en caso de que se desee parar el programa del autómata en tiempo de ejecución. Ejemplo: CALL "STP"
(1)
Como se puede ver en el ejemplo, esta función no tiene parámetros formales, por lo que basta con hacer una llamada a esta función. 21.12 La función SFC47 La función SFC47 tiene como nombre simbólico “WAIT” (esperar) por lo que su uso parece bastante evidente. El uso de SFC47 permite introducir en el programa del usuario tiempos de espera de hasta un valor máximo de 32767 ms. (aparte de otros tiempos propios del autómata). Ejemplo: CALL "WAIT" WT:=100
(1) (2)
La línea (1) hace la llamada a SFC47 mientras que la línea (2) le indica a SFC47 que deseamos esperar en esta operación (sin pasar a la siguiente) durante 100 ms.
261
SFCs
Capítulo 21
21.13 La función SFC0 Esta función de nombre simbólico “SET_CLK” (set clock = poner en hora) permite ajustar la hora y la fecha del reloj del autómata. Ejemplo: AUF "BloqueDeDatos_1" CALL SFC 0 PDT :="BloqueDeDatos_1".Fecha_Hora RET_VAL:=MW100
//Abrir DB1 //Llamar a SFC0 //Pasar la fecha y la hora que deseamos introducir //Obtener posible error de retorno.
Para el funcionamiento de este ejemplo es necesario haber creado previamente un bloque de datos global, por ejemplo DB1, y haberle puesto un nombre simbólico con el Editor de Símbolos, por ejemplo “BloqueDeDatos_1”. Una vez creado DB1 y haberle asignado un nombre simbólico, tendremos lo siguiente:
Una vez creado DB1, introduciremos un dato del tipo “DATE_AND_TIME” y le pondremos un nombre como por ejemplo “Fecha_Hora”. Con estos preámbulos, el programa anterior introducirá la fecha y la hora que hayamos depositado en DB1 en el reloj del autómata. 21.14 La función SFC1 La función SFC1 de nombre simbólico “READ_CLK” (read clock = leer reloj) es complementaria de la SFC0, por cuanto nos permite conocer en tiempo de ejecución la fecha y la hora del reloj del autómata. Ejemplo: AUF "BloqueDeDatos_1"
//Abrir DB1
CALL "READ_CLK" //Llamar a SFC1 RET_VAL:=MW100 //Guardar posible error de retorno CDT :="BloqueDeDatos_1".Fecha_Hora //Guardar en Fecha_Hora, la fecha y hora actuales. 262
SFCs
Capítulo 21
Sobre esta función, únicamente advertir que la devolución que hace de la fecha y la hora en “CDT” es un dato compuesto del tipo “DATE_AND_TIME”, por lo que si estamos interesados en conocer únicamente la fecha o únicamente la hora, es preciso recurrir a otros métodos que nos permitan extraer la fecha o la hora del dato anterior. 21.15 La función SFC2 Esta función de nombre simbólico “SET_RTM” (set run time meter = ajustar el medidor de horas de funcionamiento) permite reajustar el contador de horas de funcionamiento del autómata. Ejemplo: CALL "SET_RTM" NR :=B#16#0 PV :=0 RET_VAL:=MW100
(1) (2) (3) (4)
La línea (1) llama a SFC2. La línea (2) nos sirve para decirle a SFC2 cual es el contador que queremos ajustar (en este caso el contador cero (0)). En la línea (3) le indicamos que queremos depositar el número cero (0) en el contador (o lo que es lo mismo, queremos partir de cero (0)), y en la línea (4) recogemos en MW100 el posible error que se haya producido en la llamada. 21.16 La función SFC3 La función SFC3 de nombre simbólico “CTRL_RTM” (control run time meter) permite poner en marcha o parar un contador de horas de funcionamiento. Ejemplo: CALL "CTRL_RTM" NR :=B#16#0 S :=TRUE RET_VAL:=MW100
(1) (2) (3) (4)
La línea (1) llama a SFC3. La línea (2) le indica que queremos acceder al contador cero (0). La línea (3) le indica que queremos poner en marcha el contador (TRUE = poner en marcha, FALSE = parar) y en (4) recogemos el posible error de la llamada. 21.17 La función SFC4 Esta función tiene nombre simbólico “READ_RTM” (read run time meter) que nos permite leer las horas de funcionamiento almacenadas en un determinado contador. Ejemplo: CALL "READ_RTM" NR :=B#16#0 RET_VAL:=MW100 CQ :=M10.0 CV :=MW102
(1) (2) (3) (4) (5)
La línea (1) llama a la función SFC4. La línea (2) le indica que queremos acceder al contador cero (0). La (3) nos devuelve el posible error de la llamada. La línea (4) nos devuelve un Bit (que en este ejemplo almacenamos en M10.0) indicándonos si el contador está en funcionamien263
SFCs
Capítulo 21
to (valor TRUE) o está parado (valor FALSE). La línea (5) nos devuelve un entero con el número de horas de funcionamiento almacenadas en el contador. 21.18 Resumen de las funciones SFC Las funciones tipo SFC que hemos visto en este capítulo son solo una breve exposición de las muchas funciones existentes, pero dado que aún siendo importante este tema se considera excesivo para lo que son las pretensiones de este libro, se recomienda al lector interesado en ampliar sus conocimientos consulte la BIBLIOGRAFÍA que se encuentra al final del libro, y muy especialmente los libros que al efecto ha editado la casa SIEMENS.
264
Cajón de sastre
Capítulo 22
CAPÍTULO 22
Índice
Cajón de sastre 22.1
El editor de símbolos
Hasta aquí hemos estado trabajando con las direcciones de memoria tal como son y se nombran en los autómatas SIMATIC S7-300/400. Así, cuando hemos tenido que referirnos a un Bit de la memoria de marcas hemos puesto por ejemplo M10.0, y si hemos tenido que referirnos a una entrada digital procedente de algún final de carrera, hemos puesto por ejemplo E124.0, y así sucesivamente. Veamos un breve listado con operaciones típicas de STEP-7: U U =
E124.0 E124.1 A124.0
//Si el final de carrera FC1 está cerrado y //el final de carrera FC2 también está cerrado, //hacer que se encienda la lámpara piloto L1.
Y veamos ahora el siguiente listado: U U =
“FinalDeCarreraFC1” “FinalDeCarreraFC2” “LamparaPilotoL1”
Es evidente que el segundo listado es más explicativo que el primero, por cuanto nos permite centrarnos en las señales físicas del proceso y manejarlas por su nombre en lugar de manejar las señales del proceso por la dirección de entrada o salida que tengan en el autómata. Para conseguir el segundo listado anterior a partir del primero, STEP-7 dispone del Editor de Símbolos, que permite asignar nombres cualquiera (con algunas restricciones ortográficas) a las direcciones de las variables que estemos manejando en nuestro programa. Para acceder al editor de símbolos, deberemos ir primeramente al administrador de STEP-7 y después hacer clic sobre el icono de nuestro proyecto titulado “Programa S7 (1)” (NOTA: Este nombre es el nombre que pone por defecto STEP-7 a este objeto, pero puede tener otro nombre si alguien lo ha cambiado). Aparece entonces la siguiente imagen:
Fig.22.1 265
Cajón de sastre
Capítulo 22
Deberemos hacer clic sobre el icono “Símbolos” y aparece entonces la siguiente imagen:
Fig.22.2
Donde ya hemos introducido los nombres simbólicos de nuestras direcciones anteriores E124.0, E124.1 y A124.0 respectivamente (NOTA: Debe pulsar el icono “Guardar” una vez haya terminado de introducir datos en la tabla, para que los nombres simbólicos sean tenidos en cuenta por STEP-7). Vayamos ahora a OB1 e introduzcamos el programa listado al principio del capítulo y que volvemos a repetir aquí: U U =
E124.0 E124.1 A124.0
//Si el final de carrera FC1 está cerrado y //el final de carrera FC2 también está cerrado, //hacer que se encienda la lámpara piloto L1.
Y observe como STEP-7 conforme usted va introduciendo los datos anteriores, se los va cambiando por los nombres simbólicos que hemos introducido en la tabla de símbolos, quedando finalmente: U U =
“FinalDeCarreraFC1” “FinalDeCarreraFC2” “LamparaPilotoL1”
//Si el final de carrera FC1 está cerrado y //el final de carrera FC2 también está cerrado, //hacer que se encienda la lámpara piloto L1.
Bien, esta técnica de trabajar con nombre simbólicos en lugar de trabajar con direcciones, es interesante y puede servirle para hacer programas más intuitivos y comprensibles que si utiliza direcciones de memoria o nombres de objetos. Por ejemplo, imagine que tenemos un bloque de datos de instancia DB1 donde hemos guardado los valores por defecto de los parámetros formales del bloque de función correspondiente FB1 asociado. Veamos el siguiente ejemplo. Supongamos que hemos creado un bloque de función FB1 con los siguientes parámetros formales: Temporizador Tiempo ArrancarMotor VelocidadAlcanzada
TIMER S5TIME BOOL BOOL
S5T#5S FALSE FALSE 266
Cajón de sastre
Capítulo 22
Y que en OB1 hemos hecho la siguiente llamada: CALL FB1 , DB1 Temporizador Tiempo ArrancarMotor VelocidadAlcanzada
:= := := :=
Si ahora introducimos en la tabla de símbolos los siguientes valores: Símbolo
Dirección
Tipo de datos
Arrancar Motor_1
FB1 DB1
FB1 FB1
Comentario
STEP-7 nos cambiará lo escrito y nos pondrá: CALL “Arrancar” , “Motor_1” Temporizador := Tiempo := ArrancarMotor := VelocidadAlcanzada := Que sin duda es mucho más explicativo que trabajar con direcciones. 22.2
Clases de OBs
Los OBs o bloques de organización son objetos usados en STEP-7 que igual que otros objetos que ya hemos visto en este libro como las funciones y bloques de función, pueden contener operaciones que deben ser ejecutadas por el autómata cuando se activan determinados eventos, tales como: • El pasar el autómata de STOP a RUN • Al iniciarse un nuevo ciclo de scan • En horas concretas prefijadas • Pasado un tiempo prefijado • Cuando se produce un error • Cuando surgen alarmas de proceso Un evento que ya conocemos es el ciclo de scan del autómata. Este evento (el hecho de empezar un nuevo ciclo es considerado por el autómata como un evento) es el que pone en funcionamiento el bloque de organización OB1, y es por esta razón que se ejecutan las operaciones que hayamos depositado en OB1 cada vez que se inicia un nuevo ciclo de scan. Los eventos que hemos listado antes son los causantes de que el autómata ejecute determinados OBs y procese los programas allí depositados. Ahora bien, no todos los eventos activan a todos los OBs, sino que estos eventos actúan de forma selectiva sobre los OBs de tal forma que podemos decir que cuando ocurre determinado evento, se ejecuta el contenido de determinados OBs. También decir que no todos los OBs están disponibles en todos los modelos de autómatas, y así determinadas funcionalidades sólo están disponibles en modelos concretos. Por ejemplo, la posibilidad de detectar un fallo de tensión, sólo esta disponible en los modelos S7-400, y no en los S7-300, por lo que el usuario debe conocer de antemano estas circunstancias antes de decidirse por la compra de un modelo en particular.
267
Cajón de sastre
Capítulo 22
Veamos una tabla donde se muestran los distintos tipos de OBs: OB OB1 OB10 OB11 OB12 OB13 OB14 OB15 OB16 OB17 OB20 OB21 OB22 OB23 OB30 OB31 OB32 OB33 OB34 OB35 OB36 OB37 OB38 OB40 OB41 OB42 OB43 OB44 OB45 OB46 OB47 OB60 OB70 OB72 OB80 OB81 OB82 OB83 OB84 OB85 OB86 OB87 OB90
Evento que arranca al OB considerado Final de OB1 Alarma horaria 0 Alarma horaria 1 Alarma horaria 2 Alarma horaria 3 Alarma horaria 4 Alarma horaria 5 Alarma horaria 6 Alarma horaria 7 Alarma de retardo 0 Alarma de retardo 1 Alarma de retardo 2 Alarma de retardo 3 Alarma cíclica cada 5 seg. (valor prefijado) Alarma cíclica cada 2 seg. (valor prefijado) Alarma cíclica cada 1 seg. (valor prefijado) Alarma cíclica cada 0,5 seg. (valor prefijado) Alarma cíclica cada 0,2 seg. (valor prefijado) Alarma cíclica cada 0,1 seg. (valor prefijado) Alarma cíclica cada 50 mseg. (valor prefijado) Alarma cíclica cada 20 mseg. (valor prefijado) Alarma cíclica cada 10 mseg. (valor prefijado) Alarma de proceso 0 Alarma de proceso 1 Alarma de proceso 2 Alarma de proceso 3 Alarma de proceso 4 Alarma de proceso 5 Alarma de proceso 6 Alarma de proceso 7 Llamada desde SFC35 “MP_ALM”
Error de redundancia en periferia (sólo en CPUs tipo H) Error de redundancia en CPU (sólo en CPUs tipo H)
Error de tiempo Fallo en alimentación Alarma de diagnóstico Alarma de extraer/insertar módulo Avería en CPU Error de programa Error en aparato de ampliación Error de comunicación Rearranque completo
Prioridad 1 2 2 2 2 2 2 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 25 25 28 26,28(1) 26,28(1) 26,28(1) 26,28(1) 26,28(1) 26,28(1) 26,28(1) 26,28(1) 29(2)
Comentarios Ciclo de trabajo
No tiene valores por defecto
No tiene valores por defecto
Alarmas cíclicas
Alarmas de proceso
Alarma de multiprocesamiento
Alarmas de errores de redundancia
Alarmas de error asíncrono
Ciclo de tarea no prioritaria
OB100 Rearranque completo en caliente 27(1) Arranque OB101 Rearranque 27(1) OB102 Arranque en frío 27(1) (3) OB121 Error de programación Alarmas de error asíncro(3) no OB122 Error de acceso a periferia (1) Las prioridades 27 y 28 se pueden seleccionar desde el modelo de prioridades de arranque. (2) Esta prioridad corresponde realmente al número 0.29 y por tanto tiene menos prioridad que OB1. (3) La prioridad de OB121 y OB122 es la misma que la del OB que causa el error.
268
Cajón de sastre
Capítulo 22
En cuanto al número de prioridad asignado a cada OB hay que decir que aquellos que tengan mayor número asignado, tienen también mayor prioridad, que quiere decir en términos de STEP-7 que si se está ejecutando un OB digamos con prioridad “N” y en ese momento se presenta un evento que pone en marcha otro OB con prioridad “M”, se ejecutará aquel que tenga mayor prioridad, quedando el otro en suspenso. Vamos a empezar aquí a hacer un estudio del funcionamiento de los OBs listados anteriormente, en el buen entendido que no se intenta hacer un estudio exhaustivo ni total del comportamiento de estos OBs, sino únicamente una introducción al tema, que el lector puede ampliar en otros libros especializados. 22.3
OB1
OB1 es el que tiene la prioridad de ejecución más baja (prioridad “1”), excepto OB90 que como excepción tiene prioridad aun menor que OB1. OB1 se ejecuta cíclicamente al final de cada scan y su tiempo de ejecución (la de todo el programa realmente) se compara con el preestablecido por defecto, que es de 150 mseg. Si se supera este tiempo, el programa salta a OB80 (error de tiempo) donde se ejecutará el programa que tengamos allí depositado. En caso de que OB80 no esté programado, el proceso pasa a STOP. El tiempo máximo de funcionamiento de OB1 puede cambiarse con STEP-7, editando el icono “Hardware” y después haciendo doble clic en el spot dos “2” donde se encuentra la CPU. Aparece entonces la ficha “Propiedades” de la que elegiremos la opción “Ciclo/Marca de ciclo” tal como aparece en la siguiente imagen:
Fig.22.3
Aquí podremos variar el tiempo máximo permitido para la ejecución de OB1. 269
Cajón de sastre
22.4
Capítulo 22
OB10 hasta OB17
Los OBs desde OB10 hasta OB17 se dedican a alarmas horarias, y tienen la propiedad de ejecutar el programa que hayamos depositado en su interior según los intervalos de tiempo siguientes: • Una sola vez • Una vez por minuto • Un vez cada hora • Una vez al día • Una vez por semana • Una vez al mes • Una vez al año Para que funcionen estos OBs, hay que ajustar primero su funcionamiento. Este ajuste se puede hacer desde STEP-7, tal como indica la imagen:
Fig.22.4
Vemos como no todas las alarmas horarias están disponibles para todos los tipos de autómatas. Aquí por ejemplo, para el modelo 314 tenemos disponible el OB10 únicamente, donde podemos elegir entre las opciones “Ninguna”, “Una vez”, “Cada minuto”, etc. A la derecha tenemos dos (2) casillas donde podemos concretar la fecha y hora de arranque de la alarma. Las alarmas horarias también se pueden ajustar por programa con la SFC28 y activarlas con la SFC30. 270
Cajón de sastre
22.5
Capítulo 22
OB20 hasta OB23
Desde OB20 hasta OB23 tenemos las alarmas de retardo, que ejecutan el programa que tengamos depositado en su interior, después de esperar un tiempo (parametrizable). Los OBs de retardo se arrancan mediante la función SFC32, a la que en la llamada de la misma hay que pasarle el número del OB de retardo que deseamos activar y el tiempo de retardo que deseamos introducir. Lo mismo que SFC32 permite activar un OB de retardo, las funciones SFC39, 40, 41 y 42 permiten bloquear estas llamadas, retardarlas o volverlas a habilitar de nuevo. 22.6
OB30 hasta OB38
Los OBs del 30 al 38 pertenecen al grupo de OBs de alarma cíclica, y se caracterizan por ejecutar el programa que pongamos en su interior, de forma periódica: OB de alarma cíclica
Tiempo prefijado
Prioridad
OB30 OB31 OB32 OB33 OB34 OB35 OB36 OB37 OB38
5 seg 2 seg 1 seg 500 mseg 200 mseg 100 mseg 50 mseg 20 mseg 10 mseg
7 8 9 10 11 12 13 14 15
Los OBs de alarma cíclica los podemos parametrizar desde STEP-7 tal y como indica la figura siguiente:
Fig.22.5 271
Cajón de sastre
Capítulo 22
Nuevamente obsérvese como no todos los OBs están disponibles en todos los modelos de autómatas. Las SFCs de la 39 a la 42 permiten por programa bloquear, retardar o habilitar de nuevo las alarmas cíclicas. 22.7
OB40 hasta OB47
Estos OBs corresponden a las alarmas de proceso que generan determinados módulos añadidos al autómata. Es el caso de módulos de comunicaciones CPs o módulos de función FMs. Al adosar uno de estos módulos al autómata, previamente se ha tenido que parametrizar el modulo por medio de STEP-7. Veamos un ejemplo en la imagen siguiente:
Fig.22.6
Se trata del módulo FM 356-4, que a través de su ficha nos permite indicar a STEP-7 que este módulo generará una alarma en caso de que su método de diagnóstico de fallos detecte algún error. En este caso el OB por defecto que atenderá esta alarma será el OB40 (OB por defecto).
272
Cajón de sastre
22.8
Capítulo 22
OB80
El OB80 es el que se ejecuta en caso de que se supere el tiempo máximo asignado a OB1, así como otros tipos de errores de tiempo, tales como adelanto de la hora o en caso de rellamada a un OB de alarma cíclica caso de que este OB auú no haya concluido su ejecución. Si se produce un error de este tipo y OB80 no se ha programado, la CPU del autómata pasa a STOP. 22.9
OB82
Este OB detecta los errores por alarma de diagnostico, en aquellos módulos que tengan esta opción. Veamos la imagen siguiente:
Fig.22.7
En este caso se trata del módulo FM 355 C PID que tiene capacidad de autodiagnóstico y puede informar a la CPU por medio del OB82 que se ha generado un error de diagnostico en dicho módulo. 22.10 OB84 El OB84 ejecuta el programa depositado en su interior cuando la CPU detecta un error asíncrono en la interfase de conexión MPI, el bus interno de comunicaciones K o en la interfase hacia la periferia descentralizada. Si este OB no contiene programa y se produce algún tipo de error como los mencionados, la CPU pasa a STOP. 273
Cajón de sastre
Capítulo 22
22.11 OB100 El OB100 se ejecuta cuando el autómata se conmuta con el selector del panel frontal de la posición STOP a RUN o RUN-P o también cuando el autómata que se encontraba en RUN o RUNP ha sufrido un corte de corriente y nuevamente se reanuda la corriente. Al OB100 se le conoce también como “rearranque completo o arranque en caliente” distinguiéndose del llamado “arranque en frío” OB102. En el rearranque completo (en caliente) se vuelve a ejecutar el programa desde el principio con un "ajuste básico" de los datos del sistema y de las áreas de operandos de usuario (se inicializan los temporizadores, contadores y marcas no remanentes). En el arranque en frío se lee la imagen de proceso de las entradas y el programa de usuario STEP 7 se ejecuta comenzando por la primera instrucción del OB 1, esto rige también para el rearranque completo (en caliente). *
*
Se borran los bloques de datos creados mediante SFCs (funciones del sistema) en la memoria de trabajo, en tanto que los demás bloques de datos adoptan el valor estándar de la memoria de carga. La imagen del proceso, así como todos los temporizadores, contadores y marcas se ponen a cero, independientemente de que se hayan parametrizado como remanentes o no.
274
Operandos y operaciones de Step-7 para S7-300
Apéndice
Apéndice
Índice
Operandos y operaciones de STEP-7 para S7-300 Operandos: Operando 2# A AB < Número > AD < Número > AW < Número > B#16# B(b1,b2) B(b1,b2,b3,b4) C#< N1 N2 N3> D# DB < Número > DBB < Número > DBD < Número > DBW < Número > DBX DI < Número > DIB < Número > DID < Número > DIW < Número > DIX
Ejemplo 2#11110000110 A 124.0 AB124 AD16 AW100 B#16#EF B(3,4) B(3,4,6,7) C#234 D#2004-2-10 DB 1 DBB 2 DBD 16 DBW 4 DBX 14.0 DI 4 DIB 6 DID 8 DIW 4 DIX 2.6
DW#16#
DW#16#1234ABCD
E EB < Número > ED < Número > EW < Número > L L# LB < Número > LD < Número > LW < Número > M MB < Número > MD < Número > MW < Número > P# PAB < Número > PAD < Número > PAW < Número > PEB < Número > PED < Número > PEW < Número >
E124.2 EB8 ED20 EW10 L 10.2 L#123456 LB 2 LD 4 LW 4 M 10.0 MB20 MD40 MW14 P#M10.0 PAB11 PAD8 PAW8 PEB4 PED20 PEW2 S5T#1H12M15S 500MS T2 T#14D23H5M2 S500MS TOD#14:16:2.50 0 W#16#120B Z10
S5T#HMSMS
T < Número >
T#DHM SMS TOD#
W#16# Z < Número >
Comentario Constante binaria: 11110000110 Bit “0” del Byte “124” de salida digital Byte “124” de salida digital Double Word “16” de salida digital Word “100” de salida digital Cifras hexadecimales “EF” Una pareja de Bytes: “3,4” Dos parejas de Bytes:”3,4,6,7” Constante BCD: “234” Fecha 2004-2-10 Bloque de datos número “1” Byte “2” de un bloque de datos Double Word “16” de un bloque de datos Word “4” de un bloque de datos Bit “0” del Byte “14” de un bloque de datos Bloque de datos de instancia número “4” Byte “6” de un bloque de datos de instancia Double Word “8” de bloque datos instancia. Word “4” de un bloque de datos de instancia. Bit “6” del Byte “2” de bloque datos instancia Cifras hex. “1234ABCD” Bit “2” del Byte “124” de entrada digital Byte “8” de entrada digital Double Word “20” de entrada digital Word “10” de entrada digital Bit “2” del Byte “10” de memoria local. Constante “123456” Byte “2” de memoria local Doble Word “4” de memoria local Word “4” de memoria local Bit “0” del Byte “10” de memoria marcas Byte “20” de memoria marcas Double Word “40” de memoria marcas Word “14” de memoria marcas Puntero M10.0 Byte “14” de salida de periferia Double Word “8” de salida de periferia Word “8” de salida de periferia Byte “4” de entrada de periferia Double Word “20” de entrada de periferia Word “2” de entrada de periferia Hora S5TIME = 1 Hora, 12 Minutos,15 Segundos, 500 Milisegundos Temporizador número “2” Hora TIME = 14 Días, 23 Horas, 5 Minutos,2 Segundos, 500 Milisegundos Hora TOD = 14 Horas, 16 Minutos, 2 Segundos, 500 Milisegundos. Cifras hexadecimales “120B” Contador número “10”
275
Operandos y operaciones de Step-7 para S7-300
Apéndice
Operaciones: Operación
Operando Comentario E RLO=1 si E =1 A< Byte.Bit > RLO=1 si A =1 M< Byte.Bit > RLO=1 si M =1 L< Byte.Bit > RLO=1 si L =1 DBX< Byte.Bit > RLO=1 si DBX =1 DIX< Byte.Bit > RLO=1 si DIX =1 U AO[AR1,CP] RLO=1 si AO[AR1,CP] =1 AO[AR2,CP] RLO=1 si AO[AR2,CP] =1 [AR1,CP] RLO=1 si [AR1,CP] =1 [AR2,CP] RLO=1 si [AR2,CP] =1 T < Número> RLO=1 si T < Número> =1 Z < Número> RLO=1 si Z < Número> =1 Nota: AO=Área Operando ; CP = Constante Puntero ; G = EB, AB, PEB, MB, LB, DBB ó DIB H = EW, AW, PEW, MW, LW, DBW ó DIW ; I = ED, AD, PED, MD, LD, DBD ó DID E< Byte.Bit > RLO=1 si E =0 A< Byte.Bit > RLO=1 si A =0 M< Byte.Bit > RLO=1 si M =0 L< Byte.Bit > RLO=1 si L =0 DBX< Byte.Bit > RLO=1 si DBX =0 DIX< Byte.Bit > RLO=1 si DIX =0 UN AO[AR1,CP] RLO=1 si AO[AR1,CP] =0 AO[AR2,CP] RLO=1 si AO[AR2,CP] =0 [AR1,CP] RLO=1 si [AR1,CP] =0 [AR2,CP] RLO=1 si [AR2,CP] =0 T < Número> RLO=1 si T < Número> =0 Z < Número> RLO=1 si Z < Número> =0 E< Byte.Bit > RLO=1 si E =1 A< Byte.Bit > RLO=1 si A =1 M< Byte.Bit > RLO=1 si M =1 L< Byte.Bit > RLO=1 si L =1 DBX< Byte.Bit > RLO=1 si DBX =1 O DIX< Byte.Bit > RLO=1 si DIX =1 AO[AR1,CP] RLO=1 si AO[AR1,CP] =1 AO[AR2,CP] RLO=1 si AO[AR2,CP] =1 [AR1,CP] RLO=1 si [AR1,CP] =1 [AR2,CP] RLO=1 si [AR2,CP] =1 T < Número> RLO=1 si T < Número> =1 Z < Número> RLO=1 si Z < Número> =1 E< Byte.Bit > RLO=1 si E =0 A< Byte.Bit > RLO=1 si A =0 M< Byte.Bit > RLO=1 si M =0 L< Byte.Bit > RLO=1 si L =0 DBX< Byte.Bit > RLO=1 si DBX =0 DIX< Byte.Bit > RLO=1 si DIX =0 ON AO[AR1,CP] RLO=1 si AO[AR1,CP] =0 AO[AR2,CP] RLO=1 si AO[AR2,CP] =0 [AR1,CP] RLO=1 si [AR1,CP] =0 [AR2,CP] RLO=1 si [AR2,CP] =0 T < Número> RLO=1 si T < Número> =0 Z < Número> RLO=1 si Z < Número> =0 E< Byte.Bit > Ejemplo: XN E12.2 A< Byte.Bit > Ejemplo: XN A14.6 X M< Byte.Bit > Ejemplo: XN M12.1 L< Byte.Bit > Ejemplo: XN L30.0 DBX< Byte.Bit > Ejemplo: XN DBX2.3 DIX< Byte.Bit > Ejemplo: XN DIX10.5 276
Operandos y operaciones de Step-7 para S7-300 X
XN
UW OW XOW UD OD XOD
U UN O ON X XN
FP
FN
AO[AR1,CP] AO[AR2,CP] [AR1,CP] [AR2,CP] T < Número> Z < Número> E< Byte.Bit > A< Byte.Bit > M L DBX DIX AO[AR1,CP] AO[AR2,CP] [AR1,CP] [AR2,CP] T < Número> Z < Número> ==0 >0 <0 <>0 <=0 >=0 UO OS BIE OV E A M L DBX DIX AO[AR1,CP] AO[AR2,CP] [AR1,CP] [AR2,CP] E A M L DBX DIX
Apéndice
Ejemplo: XN E[AR1,P#2.0] Ejemplo: XN A[AR2,P#0.0] Ejemplo: XN [AR1,P#2.0] Ejemplo: XN [AR2,P#2.0] Ejemplo: XN T2 Ejemplo: XN Z0 Ejemplo: XN E12.2 Ejemplo: XN A14.6 Ejemplo: XN M12.1 Ejemplo: XN L30.0 Ejemplo: XN DBX2.3 Ejemplo: XN DIX10.5 Ejemplo: XN E[AR1,P#2.0] Ejemplo: XN A[AR2,P#0.0] Ejemplo: XN [AR1,P#2.0] Ejemplo: XN [AR2,P#2.0] Ejemplo: XN T2 Ejemplo: XN Z0 Ejemplo:UW (ACU1L = ACU1L (AND) ACU2L) Ejemplo:UW W#16#ABCD Ejemplo:OW (ACU1L = ACU1L (OR) ACU2L) Ejemplo:OW W#16#ABCD Ejemplo:XOW (ACU1L = ACU1L (XOR) ACU2L) Ejemplo:XOW W#16#ABCD Ejemplo:UD (ACU1 = ACU1 (AND) ACU2) Ejemplo:UD DW#16#1234ABCD Ejemplo:OD (ACU1 = ACU1 (OR) ACU2) Ejemplo:OD DW#16#1234ABCD Ejemplo:XOD (ACU1 = ACU1 (XOR) ACU2) Ejemplo:XOD DW#16#1234ABCD Consulta si A1=A0=0 Consulta si (A1 = 1) Y (A0 = 0) Consulta si (A1 = 0) Y (A0 = 1) Consulta si ((A1 = 1) Y (A0 = 0)) Ó ((A1 = 0) Y (A0 =1)) Consulta si ((A1 = 1) Y (A0 = 0)) Ó ((A1 = 0) Y (A0 =1))) Consulta si ((A1 = 1) Y (A0 = 0)) Ó ((A1 = 0) Y (A0 =0))) Consulta si (A1 = 1) Y (A0 = 1) Consulta si OS = 1 Consulta si RB = 1 Consulta si OV = 1 RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco ascendente RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente 277
Operandos y operaciones de Step-7 para S7-300
FN
S
R
=
CLR SET NOT SAVE SI SV SE SS SA FR R S R ZV ZR FR L
AO[AR1,CP] AO[AR2,CP] [AR1,CP] [AR2,CP] E A M L DBX DIX AO[AR1,CP] AO[AR2,CP] [AR1,CP] [AR2,CP] E A M L DBX DIX AO[AR1,CP] AO[AR2,CP] [AR1,CP] [AR2,CP] E A M L DBX DIX AO[AR1,CP] AO[AR2,CP] [AR1,CP] [AR2,CP]
T T T T T T T Z Z Z Z Z EB AB PEB MB LB DBB DIB G[AR1,CP] G[AR2,CP]
Apéndice
RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente RLO=1 durante scan de flanco descendente Pone a “1” permanentemente E Pone a “1” permanentemente A Pone a “1” permanentemente M Pone a “1” permanentemente L Pone a “1” permanentemente DBX Pone a “1” permanentemente DIX Pone a “1” permanentemente AO[AR1,CP] Pone a “1” permanentemente AO[AR2,CP] Pone a “1” permanentemente [AR1,CP] Pone a “1” permanentemente [AR2,CP] Pone a “0” permanentemente E Pone a “0” permanentemente A Pone a “0” permanentemente M Pone a “0” permanentemente L Pone a “0” permanentemente DBX Pone a “0” permanentemente DIX Pone a “0” permanentemente AO[AR1,CP] Pone a “0” permanentemente AO[AR2,CP] Pone a “0” permanentemente [AR1,CP] Pone a “0” permanentemente [AR2,CP] E = RLO A = RLO M = RLO L = RLO DBX = RLO DIX = RLO AO[AR1,CP] = RLO AO[AR2,CP] = RLO [AR1,CP] = RLO [AR2,CP] = RLO Hace RLO=0 Hace RLO=1 Hace RLO = (NOT) RLO Hace RB = RLO Arranca T como impulso Arranca T como impulso prolongado Arranca T como retardo conexión mem. Arranca T como retardo conexión mem. Arranca T como retardo desconex. mem. Libera T Pone a “0” T Carga valor preselec. en Z Pone a “0” Z Incrementa Z Decrementa Z Libera Z Carga ACU1LL con EB Carga ACU1LL con AB Carga ACU1LL con PEB Carga ACU1LL con MB Carga ACU1LL con LB Carga ACU1LL con DBB Carga ACU1LL con DIB Carga ACU1LL con G[AR1,CP] Carga ACU1LL con G[AR2,CP] 278
Operandos y operaciones de Step-7 para S7-300 L
L
B [AR1,CP] B [AR2,CP] EW AW PEW MW LW