Mostrando entradas con la etiqueta OMRON. Mostrar todas las entradas
Mostrando entradas con la etiqueta OMRON. Mostrar todas las entradas

martes, 15 de enero de 2013

Configurar la dirección IP en automátas Omron

Al trabajar con los modelos de autómatas Omron cuyas CPUs utilizan Ethernet como puerto de programación, lo primero que hay que hacer es establecer la configuración de red necesaria para nuestro entorno. Al crear el programa nuevo desde el entorno de CX-Programmer y añadir nuestro PLC, este se añade con la dirección por defecto con la que viene de casa, en el caso nuestro ejemplo se trata de un PLC CJ2M con CPU 32 (la versión 3x son las que incorporan Ethernet en la CPU) y su dirección por defecto es 192.168.250.1.  Una vez configurado el PLC con una dirección de red de esta subred (por ejemplo 192.168.250.10, es posible conectar con el dispositivo.

Una vez establecida la conexión, se puede modificar la dirección de red haciendo doble clic en el ítem “Configurar tabla de E/S y unidad” dentro del árbol de elementos de la izquierda. Una vez hecho esto, aparecerá la tabla de entradas/salidas del PLC donde se puede ver las diferentes tarjetas del sistema. La primera de ellas (Puerto integrado/Tarjeta interna) es la que nos interesa, ya que se refiere a la tarjeta del puerto Ehternet ya integrada en la CPU. Al desplegar el ítem aparecen dos nuevos y uno de ellos es el que se refiere a la configuración de la unidad Ethernet. Pulsando doble clic nuevamente en este último, es posible realizar la configuración de diferentes detalles del puerto como la dirección IP o la conexión FTP.


La ventana de configuración del puerto Ethernet, consta de múltiples pestañas. La primera de ellas nos permite modificar la dirección IP del  dispositivo. Para ello hay que seguir los siguientes pasos:

  1. Establecer el PLC en modo programación.
  2. Pulsar doble clic en el ítem Configurar tabla de E/S y unidad en el árbol de elementos de la izquierda.
  3. Dentro de la Tabla de E/S hacer doble clic en el ítem que representa la configuración del puerto Ethernet (dirección 1500 para los autómatas de  la serie CJ)
  4. Establecer la nueva dirección, mascara de red y puerta de enlace.
  5. Pulsar en el botón Transf. [de PC a unid.]
  6. Una vez realizada la transferencia pedirá reiniciar el PLC (si no se reinicia, el PLC no cargará la nueva configuración).


Una vez seguidos estos pasos, la dirección del PLC se habrá modificado, y aparecerá el siguiente mensaje en la parte inferior del CX-Programmer:


Este problema es normal ya que la nueva dirección del dispositivo ya no es la dirección con la que habíamos conectado. Para conectar nuevamente, hay que desconectar del dispositivo, modificar la dirección a la que se desea conectar y conectar nuevamente. Para ello hay que pulsar botón derecho en el ítem del PLC, y seleccionar la opción Cambiar…


Hecho esto, aparecerá el cuadro de configuración del PLC y en este cuadro hay que pulsar en Configuraciones… dentro del recuadro Tipo de red y modificar la dirección IP que había por defecto en el dispositivo por la nueva dirección IP que se envió en la configuración.


Por último, se debe observar que el PLC se encuentra en estado de error, para solucionar esto, hay que modificar los dos switch rotatorio inferiores que incorpora el PLC y que deben coincidir con el valor hexadecimal del último byte de la dirección IP. Por ejemplo, la nueva dirección IP de nuestro dispositivo es 192.168.1.90, por lo tanto hay que pasar el valor 90 a hexadecimal que será 5A esto aparece como mensaje en la CPU del autómata. En los switch rotatorios hay uno con el texto 10x16^2 (10 por 16 elevado a 2) donde habrá que seleccionar el valor del dígito de mayor peso (en el caso de ejemplo será el valor 5) y el otro tiene el texto 10x16^1 donde habrá que seleccionar el valor de menor peso (en el caso del ejemplo A). Una vez hecho esto, se reinicia el PLC y listo, ya es posible seguir trabajando utilizando la nueva dirección IP del dispositivo.





domingo, 6 de enero de 2013

Herramienta Multiway Omron - Debug Comunicaciones

En primer lugar desearos a todos un feliz año 2013 y como regalo de reyes os traigo una herramienta que a a aquellos que les gusten los trabajos con comunicaciones seguro que les va a ser muy interesante.

Cuando se desarrolla una aplicación que requiere del uso de comunicaciones entre diferentes equipos, ya sea modbus, hostlink, OPC o similares. Siempre es recomendable hacer pruebas en simulación para comprobar el funcionamiento independiente de los diferentes elementos. Esto es especialmente recomendable cuando se van a emplear una gran cantidad de equipos en la comunicación, ya que si se intenta hacer funcionar todo el sistema al mismo tiempo, se corre el riesgo de que alguno de los elementos provoque un error, y el coste de detectar que equipo ha provocado el error aumenta de forma exponencial según el número de equipos conectados.

Por este motivo, es muy interesante conocer Multiway, una potente herramienta gratuita por cortesía de Omron para realizar pruebas de comunicaciones, que permite entre otras cosas:
  • Envío y recepción de tramas SYSMAWAY
  • Protocolo FINS y HostLink
  • Modbus como Maestro y también puede funcionar como esclavo
  • Como terminal avanzado de telnet
  • Compoway
  • Sniffer
  • Cliente OPC
Es una herramienta muy recomendable para casi cualquier trabajo que uno necesite realizar con comunicaciones industriales tipo serie.

martes, 4 de diciembre de 2012

Algunos detalles de implementación con Omron

Relacionado con las clases en Sistemas de Control Automático de el Máster en Automática y Robótica, la práctica consiste en realizar la programación de un grupo de presión de cuatro bombas. A raíz de esto se han comentado algunas estructuras de programación en clase para gestionar ciertas cosas. A continuación expongo unos ejemplos de como gestionar estas estructuras.

Registro de desplazamiento, con este registro se apunta a la bomba a encender, con otro igual a la siguiente bomba a apagar y por último habrá otro para gestionar la bomba que deberá arrancar por variador en el siguiente ciclo de trabajo.


Respecto a la gestión de tareas, muchos tienen aún dudas de como funcionan estas estructuras. Los bloques TKOF y TKON lo que hacen es activar y desactivar unos registros especiales (marcas) llamadas TK00, TK01 y así sucesivamente. Cada una de ellas está asociada al estado de un "programa" y cuando digo programa me refiero a lo que en CX-Programmer se considera programa (ver árbol de proyecto a la izquierda de CX-Programmer). De manera que estas mismas marcas pueden ser empleadas para activar una determinada sección de código como en el ejemplo que se muestra a continuación:


En este ejemplo, la marca TK01 (es decir cuando el programa con tarea de prioridad 1 está en ejecución), se activa una sección de código donde se detiene el programa con tarea de prioridad 0 y se ejecuta el programa con tarea de prioridad 3.

Sobre la gestión de arranques y paradas de bombas, mi consejo es emplear un biestable RS utilizando la función KEEP. Como se muestra en en la figura, la linea de la primera conexión del biestable contiene la condidicón de arranque de un contactor de la bomba 1, y la segunda linea contiene la condición de parada del mismo contactor. (No es necesario tener las mismas condiciones, sólo son a nivel ilustrativo, no deben tomarse al pie de la letra).




lunes, 3 de diciembre de 2012

Comunicaciones Modbus RTU con Automatas OMRON CP1L

En este articulo, se pretende dar una guía de como montar un sistema de gestión de comunicaciones con autómatas CP1L, que permita gestionar el envío y recepción de información a través de protocolo modbus RTU, de forma sencilla y estandarizada. Permite la gestión de las comunicaciones de una forma centralizada y extensible, por lo que sin mucha complicación es posible extender el uso para nuevos tipos de tramas. En este enlace se puede encontrar un documento sobre como realizar las comunicaciones modbus RTU de forma sencilla con un autómata CP1L. Este documento es un extracto de la guía completa de dicho autómata. Aquí veremos los conceptos más importantes y como aplicarlos a un caso particular.

En primer lugar comenzaremos viendo como configurar el puerto de comunicaciones del autómata. Si se realiza un doble click en el menú de la izquierda sobre el ítem del árbol de proyecto "Configuración" aparecerá el cuadro de dialogo de configuraciones generales del autómata. Una vez ahí, se elige la pestaña "Configuración de entrada Puerto Serie 1" ó "Configuración de entrada Puerto Serie 2" según corresponda y se selecciona la opción Configuración Personalizada. Una vez ahí, hay que configura la velocidad del puerto, y el formato de trama (el más común es 8,1,N - 8 bits, 1 de parada y sin control de flujo). En la casilla Modo, hay que seleccionar el sistema que interese, en el caso que nos atañe seleccionaremos Puerta de enlace serie.


Una vez configurado el puerto de configuraciones hay que cargarla al autómata, seleccionando que envíe la configuración (hay que activar la casilla correspondiente en el dialogo de carga de programa). Y a continuación es preciso reiniciar el autómata para que cargue la nueva configuración. 

Una vez configurado, se puede comenzar a comunicar, pero primero veamos los detalles básicos a tener en cuenta. La configuración de la trama modbus, se almacena en direcciones de memoria DM (que dependen del puerto y de la CPU utilizada). Los autómatas CP1L-M incorporan dos puertos de comunicaciones, y la trama se almacena entre la dirección D32200 y 32249 para el puerto 1 y entre la D32300 y 32349 para el puerto 2. Sin embargo para la CPU CP1L-L sólo hay un puerto de comunicaciones y se emplean los últimos (D32300 y 32349), cuidado con esto último.

De igual modo, la respuesta recibida se almacena en las direcciones entre D32250 y 32299 para el puerto 1 y entre la D32350 y 32399 para el puerto 2 en las CPUs CP1L-M. Y entre las D32350 y D32399 en las versiones CP1L-L de la CPU.

En las siguientes figuras se muestra el formato que debe tener la trama para poder ser enviada y para poder procesar adecuadamente la respuesta recibida. En primer lugar se puede ver que utilizando como dirección base 32300 ó 32200 según corresponda, se tiene que en la primera palabra base+0 se debe escribir la dirección de esclavo modbus al que se desea mandar el comando. Para ello se escribirá en la parte baja de la palabra y no en la parte alta  (que queda reservada para trabajos del sistema). De igual modo ocurre en la segunda palabra con dirección base+1, en la que se escribe la función de modbus a emplear. Esto no coincide con la definición estandar de modbus. Según el protocolo modbus, estos dos datos estarían incluidos en los primeros 16 bits enviados, a modo de cabecera, por lo que no hay que confundir una cosa con la otra. A continuación se escribe en base+2 el número de bytes a enviar a partir de esta palabra, es decir si el comando completo tiene una longitud de 6 bytes en total (1 dirección de esclavo, 1 byte del código de función y 4 del resto del comando), habrá que escribir un 4 en esta dirección. A continuación de aquí, se debe escribir normalmente el resto del comando, utilizando adecuadamente la parte alta y baja de los registros.

Veamos un ejemplo practico:

Si hay que enviar un comando Run a un variador de frecuencia MX2 que actúe como esclavo con dirección 1, el comando a enviar sería 01-05-00-00-FF-00  (para conocer mas detalles sobre este mensaje puedes consultar aquí la referencia de aplicación del protocolo modbus en modbus.org). Los dos primeros bytes correspondería como se ha dicho con la dirección de esclavo modbus y código de función, mientras que los cuatro siguientes son la dirección de memoria donde se desea escribir y el valor (FF00 en bobinas ó Coils representa que se desea escribir un 1). También como curiosidad, si se observa el Apendice B (página 279) manual del variador MX2 referenciado antes, se puede observar que la dirección de memoria para el comando Run indicada en el manual es 0001 y en el comando se escribe la 0000, esto se debe a que en Modbus para direccionar la posición N de memoria hay que escribir la N-1. Por tanto habría que escribir un 0000 en la dirección base+3 y un FF00 en la dirección base+4.
.

El formato de las respuestas es el mismo desplazado a las direcciones comentadas antes. En la parte baja del registro con dirección base+50 se tiene la dirección del esclavo que ha respondido y en la parte baja de la dirección base+51 se tiene el código de función del comando al que se está respondiendo. En la dirección base+52 el código de error (si es el caso) y en la posición base+53 se tiene el número de bytes recibidos, los cuales se encontrarán en las direcciones siguientes.


Una vez que se tiene configurada la función a enviar, si se desea enviar el comando a través del puerto serie, se utiliza la palabra de función A640  para las CPUs CP1L-L en el puerto 1 ó bien para las CPUs CP1L-M en el puerto 2. Lo mismo que se explica a continuación, se realiza con la palabra A641 para el puerto 1 en las CPUs CP1L-M. En nusetro caso utilizamos una CPU CP1L tipo L, por lo que para enviar se activa la bobina A640.0 y cuando se reciba una respuesta correcta la bobina A640.1 se activará automáticamente. Si por el contrariop se recibe una respuesta errónea o si se produce un problema de comunicación se activará la bobina A640.2. Para gestionar esto se propone crear un programa (tarea con una prioridad 1,2 ó 3) en el que se creará una sección llamada comunicaciones_common y que contendrá la gestión común de las comunicaciones. Esta sección contendrá el siguiente código:


Comenzaremos explicando este código desde el centro, ya que todo el código se sustenta en la variable com_EnviandoTrama. Se trata de una variable con enclavamiento, que se activa con la señal set_EnviandoTrama y se desactiva con reset_EnviandoTrama. Esta señal es la que activa el bit A640.0 que indica el inicio de la comunicación. Además se emplean dos temporizadores para gestionar el envío automático de una trama en caso de error del envío.  La parte interesante de este sistema es que se centraliza la comunicación en variables independientes que habrá que ir añadiendo a las dos últimos diagramas, en la activación de set_EnviandoTrama, se añade el flanco de subida de las variables de comunicación según la trama que se desea enviar y en la de reset se añade el flanco de bajada de la misma variable. Es decir, cada vez que se desea añadir un nuevo comando a utilizar, se crea una variable asociada que gestione dicho comando (en el ejemplo com_LeerConsigna) que en su flanco de subida activa set_EnviandoTrama y en su flanco de bajada activa reset_EnviandoTrama.

Después se crea una sección común llamada, por ejemplo, comun_escribirDireccion. En ella se debe realizar la escritura en las direcciones base+(lo que toque) de aquellas cosas comunes en todos los comandos configurados. Esto no es obligatorio pero permite ahorrar algo de memoria. En este caso todos los comandos configurados se dirigen al esclavo 4 y tienen una longitud de 6 bytes (4 excluyendo la dirección de esclavo y la función de modbus) por lo que se añade el código correspondiente en esa sección:


A continuación se aconseja utilizar una sección nueva por cada comando donde se configurará la trama de envio. En nuestro caso _COM_LecturaConsigna. Esta escritura requerirá que se encuentren activas la señal com_EnviandoTrama y la variable de control de comunicaciones del comando correspondiente, tal como se puede ver a continuación:

Como se ve en el caso anterior, aquí se configura el resto del comando a enviar. En la parte final de esta sección, se tiene un control de set y reset de dicha variable, de forma que no se actúa nunca directamente sobre la variable sino a través de señales de ser y reset. De forma que si se requiere activar dicho comando desde diferentes sitios del código se puede añadir señales de set y reset según sea necesario, evitando así escribir varias veces sobre la misma variable.

Para el tratamiento de la respuesta hay que extraer los datos de las direcciones comentadas anteriormente (esto será común en muchos casos) y por último se moverá el resultado de la extracción a una dirección (configurada adecuadamente). Esto último como puede verse si que depende directamente de que sea un comando u otro el que se esté configurando, por este motivo se añade la nueva condición a dicha acción, en concreto en este caso se realiza una división del valor (adecuación del mismo a la escala deseada) y un movimiento final a la variable donde lo podremos consultar cuando lo deseemos a partir de este momento (a modo de variable temporal en un registro DM). Por último se puede observar que se utiliza una señal com_Realizada para indicar que la comunicación ha terminado (y se ha extraído la información de la respuesta recibida). Esta señal se activa con la señal set_EnviandoTrama de manera que se activa en el instante en que se va a iniciar una comunicación.

Por último, el uso de este sistema para la realización de una comunicación se puede resumir en tres estados. Un primer estado que activa la señal de envío a través de set_LeerConsigna. Un segundo estado que espera a que la comunicación se realice satisfactoriamente (tiene como condición un flanco de subida de la señal com_Realizada) y por último un estado que realiza el reset de la variable activando la señal reset_LeerConsigna. Este último habrá de esperar a que se desactive la variable com_EnviandoTrama para activar un flag que permite salir de dicho estado. Dichas condiciones y activaciones se deben realizar en las secciones correspondientes según la metodología que se esté empleando. La programación si se emplean las guías recomendadas es muy sencilla aplicando este sistema a cualquiera de ellas. Aquí un extracto de como quedaría el uso comentado:


Como ventajas de este mecanismo, es que permite ampliar fácilmente el uso de nuevos comandos modbus, permite el uso de estos desde diferentes puntos del código de forma sencilla y eficiente a nivel de espacio. Además su diseño modular permite su uso a través de infinidad de modos de programación aunque se recomienda su uso junto a las guías generales de programación de autómatas OMRON publicadas en este blog.

miércoles, 28 de noviembre de 2012

GUÍA ESTÁNDAR DE PROGRAMACIÓN DE AUTOMATISMOS NO SECUENCIALES APLICADA A AUTOMATAS OMRON EN LENGUAJE LADDER (GEPNAS)


Cómo último ejemplo de programación de diagramas de estados con autómatas Omron, en este articulo se presenta una guía sencilla para implementar sistemas no secuenciales. Es importante tener en cuenta que siempre que sea posible es recomendable aproximar el problema a una solución secuencial, y sólo en el caso de que esto no sea posible hay que recurrir a diagramas de estados no secuenciales. Por simplicidad se emplea el mismo ejemplo que en el caso secuencial, aunque como ya se ha explicado un problema secuencial habría que resolverlo con la guía GEPAS.

En este caso, el esquema de contactos se divide en tres zonas, la zona de Trigger y condiciones de sensorización, establecimiento de estados y salidas o acciones de estado. 

El primero de estos, al igual que en la guía GEPAS se tiene que dado un estado se espera una determinada combinación de señales (condición de transición) para que el sistema pase a un nuevo estado. Para realizar esto, se utiliza una variable de memoria DX para almacenar el valor del estado que se modifica con la función MOV en los casos que sea necesario.


Para el caso del establecimiento de estado, lo único que se debe realizar es establecer el estado a través de un bloque de comparación que activa el flag correspondiente a dicho estado como se muestra a continuación:


Lo expuesto en el caso de establecimiento de estado permite poder utilizar la condición de estar en un determinado estado en cualquier momento del programa, mientras que si cada vez que fuese necesario utilizar esto como condición se utilizase el comparador se consumiría más memoria que con esta opción.

Por último, el bloque de salidas es el mismo que se daba en la guía GEPAG.


Cualquier duda, será contestada a través de los comentarios así queda para futuras consultas y otras personas podrán beneficiarse de la aportación.

martes, 27 de noviembre de 2012

GUÍA ESTÁNDAR DE PROGRAMACIÓN DE AUTOMATISMOS SECUENCIALES APLICADA A AUTOMATAS OMRON EN LENGUAJE LADDER (GEPAS)

En la anterior entrada de esta serie, se propone como plantear la solución general a un problema dado utilizando los recursos que CX-Programer proporciona para los autómatas incluso de la gama más baja. En esta ocasión se va a abordar como solucionar el caso de la programación de los subestados derivados del caso anterior. Al abordar el problema que se plantea en uno de estos subestados, pueden darse dos casos, el primero es que dicho subestado sea una maquina secuencial o que no lo sea. En este articulo se pretende mostrar una de las formas más eficaces de programar un sistema secuencial, que además es aplicable a la mayoría de los autómatas del mercado ya que no emplea ninguna característica propia de Omron ni de ningún otro sistema.

En principio como siempre lo ideal es plantear el problema como un diagrama de estados secuencial con los diferentes pasos desarrollados:

E1-->E2-->E3-->E1

A partir de aquí hay que definir 5 zonas en nuestro programa, las condiciones de sensorización, el reset de control, el contador, el establecimiento del estado y las salidas.

Las condiciones de sensorización tienen la finalidad de lanzar un trigger que es utilizado como señal para cambiar de estado, esto se consigue a través del contador que utiliza esta señal para realizar una cuenta. Para evitar que esté contando permanentemente, el trigger se desactiva a sí mismo de manera que sólo se produce un pulso de un ciclo, (también podría emplearse una operación DIFU).

El reset de control es el encargado de activar la señal de RESET en caso que no estar en ninguno de los estados definidos en el sistema.



La zona del contador contiene el contador y las señales de cuenta y de RESET que realizan las acciones comentadas anteriormente.


El establecimiento del estado realiza una comparación con el número de contador y establece la marca del estado correspondiente a la cuenta actual (esta marca es la empleada en los casos anteriores como indicador que de se está en un determinado estado y también se utiliza en el control).



Por último la sección de control, básicamente contiene el código correspondiente a cada estado, en base a si está activa o no la marca correspondiente a dicho estado. Esto debería contener las señales a activar en cada estado o en un sistema muy sencillo podrían ser las salidas aunque no se recomienda activar las salidas directamente, es mejor tener una sección donde se gestionen las salidas y emplear alguna señal intermedia para activar la salida a través de un contacto.


Evidentemente este método habrá que adaptarlo a la solución concreta. Siguiendo esta guía en la implementación de diagramas de secuencia para resolver los problemas de automatización secuenciales dejará clara sus ventajas frente a otros métodos, a pesar de que no es el más eficiente a nivel de memoria utilizada, es fácilmente extensible, trazable y muy claro.

domingo, 18 de noviembre de 2012

GUÍA ESTÁNDAR DE PROGRAMAÓN DE AUTOMATISMOS GENERAL APLICADA A AUTOMATAS OMRON EN LENGUAJE LADDER (GEPAG)


Cuando realizamos un proyecto de automatización, lo ideal siempre es realizar un análisis previo en el que se debería incluir un diagrama de estados del funcionamiento del sistema. Si el sistema es muy sencillo quizá con solo un diagrama sea suficiente para plasmar todo los estados. En cambio, si el sistema no es suficientemente sencillo lo aconsejable es dividir el problema en subproblemas más pequeños de manera que se aíslen unas partes del problema de otras. Esto además de facilitar la trazabilidad del código y reducir enormemente los errores que se cometerán en la programación, también evitará generar diagramas de estados demasiado grandes y que muchas veces en lugar de permitir manejar mejor el problema (como es su finalidad) acaban consiguiendo todo lo contrario. De esta forma lo que se obtendría es un autómata general más grande que corresponde al diagrama de estados principal y en cada uno de los estados de este diagrama se tendrá un nuevo pequeño automatismo para gestionar cada uno de estos estados.

A continuación se va a mostrar un ejemplo de esto en el caso de autómatas Omron y utilizando lenguaje Ladder, ya que por ejemplo en el caso de autómatas de bajo coste como es la familia CP1 es el único lenguaje que en el que se puede desarrollar. El ejemplo empleado corresponde al de una práctica de la asignatura Sistemas de Control Automático del Máster en Automática y Robótica de la Universidad de Alicante. En este caso tenemos que controlar la gestión de 4 bombas que dan suministro para conseguir una presión estable en la impulsión. Dejando a un lado las particularidades del sistema, el funcionamiento se puede dividir en los siguientes tres estados según la guía Gemma que a su vez pueden ser tratar como cuatro estados en los que no entraremos en detalles:

Diagrama de estados que representa el funcionamiento del sistema General de la práctica


 Cuando se desarrolla software, lo mismo se puede programar de infinitas formas y se tiende a pensar que cualquiera de ellas es igual de buena si realiza su función. Para empezar la eficiencia de los diferentes programas tanto espacial como temporal no es la misma, pero dejando al margen este detalle que puede no ser decisivo existe un motivo más importante para hacer las cosas correctamente. Un código debe ser mantenible, fácilmente trazable, orientado a la extensión y no al cambio y lo más estándar que sea posible, es decir hay que establecer una metodología para la creación de código. El objetivo es que la parte de ingeniería resida en el análisis del problema y en el diseño de la solución en papel (a través de un diagrama de estados grafcet o similar) pero no en el código que se escribe. Para conseguir esto, se debe utilizar una guía de implementación, que dado un análisis del problema siempre termine generando el mismo código sea quien sea el programador, por lo menos en lo esencial. Este tutorial pretende ser una pequeña guía introductoria de cómo hacer esto en autómatas Omron, para una pequeña parte de los programas. En futuras guías, se mostrará como explotar estos estados y realizar pequeñas máquinas de estados secuenciales para cada caso aplicando nuevos métodos.

 Para implementar esto con autómatas Omron, hay muchas formas pero sin duda alguna la forma más eficiente es desactivar completamente la ejecución de los estados que no se estén utilizando. Esto permite ahorrar tiempo y evita que posibles casos no contemplados en estos estados (cuando no deberían estar siendo ejecutados) afecten al correcto comportamiento del sistema. Para conseguir esto hay que dividir la solución en programas diferentes, en la parte izquierda del entorno de CX-Programer se puede ver que en la última opción (programas) permite crear diferentes bloques de código a los que CX-Programer llama programas. Al añadir un nuevo programa se obtienen una pantalla donde se muestran las opciones de Nombre, Tipo de tarea y una opción de chequeo llamada Inicio de operación. El nombre es tan solo un identificador, y el tipo de tarea debería estar ordenado según el orden de ejecución que queramos, por ejemplo, en el caso expuesto tendríamos 5 programas. Un primer programa que gestionará el cambio de estados entre programas. Y cuatro programas más, uno por cada estado de la máquina de estados. Por tanto el orden de tareas que yo recomendarías sería el programa que gestiona el cambio de estados como el de mayor prioridad (por ejemplo tarea 3) y el resto consecutivamente según el orden en que entran en funcionamiento: PARO tarea 4, MARCHA tarea 5, etc.  Nótese que el estado de mayor prioridad se le asigna la tarea 3, esto es porque previo a este programa se han añadido otra serie de programas para realizar la gestión de otras características como comunicaciones, inicialización de variables u otros detalles comunes a todos los estados.


Para realizar el cambio entre estados lo que se debe hacer es detener la ejecución de los programas que no correspondan al estado que está en el instante actual en ejecución. Para ello hay que deshabilitar la casilla de chequeo de las ventanas de propiedades de los programas correspondientes a las tareas 4, 5, 6 y 7 (PARO, REPOSO, SERVICIO y PARANDO). Esto se hace así, porque así los programas permanecerán detenidos a no ser que sean activados de forma explícita utilizando la función TKON, de lo contrario en cada estado habría que apagar todos los que no estuviesen activos ya que por defecto estarían en ejecución. 
                 
                    

De esta manera, el código de cambio de estados se puede expresar de forma muy simple como una variable entera que almacena el estado entre 0 y 3 y que según el estado si se cumple la señal de transición cambia el valor de la variable por el valor del estado siguiente como se muestra a continuación:


Existe un mecanismo  óptimo para los sistemas secuenciales puros que se verá en nuevas guías. Sin embargo para sistemas que contienen transiciones cruzadas entre estados, este es el mecanismo que yo recomiendo.
Como se comentaba anteriormente, utilizando la función TKON es posible habilitar el código (programa) correspondiente al estado en que se encuentra el sistema como se muestra en la imagen. En caso de no haber desactivado la casilla Inicio de operación en los programas que contienen el código de los estados, todos estarían inactivos y habría que desactivar todos aquellos no correspondientes al estado activo utilizando la función TKOF. Esta solución es menos intuitiva y más complicada de gestionar, porque en la mayoría de casos habría que detenerlos en más de un lugar del código lo que complicaría la gestión del sistema y aumentaría la probabilidad de cometer un error. Lo que se propone en esta práctica es que cuando se produce una transición se active el nuevo estado y se desactive el estado o estados de los que se pueda proceder, este no es el único modo de hacer esto, ya que según el caso podría haber formas más optimas de hacer lo mismo.

Es importante tener en cuenta que TKOF congela el programa en el estado exacto en que se quedó, esto quiere decir que sus salidas quedan activas y su estado al salir es el último estado que se ejecutó. Por lo tanto es conveniente, reiniciar el estado en la sección de control de la máquina anterior, como se muestra en la figura. Es decir, si se va a un nuevo estado cuyo subestado depende de una variable que almacena el estado es conveniente reiniciar el valor de esta variable (iniciarlo a cero) para que el subestado se ejecute correctamente.

Un detalle a tener en cuenta es utilizar como memoria para almacenar el estado (variable Estado) una palabra del área DM ya que esta memoria está reservada para datos y es posible escribirla desde diferentes partes del código sin que el programa se queje. En caso de emplear una dirección de memoria normal, se obtendría una advertencia diciendo que la escritura de las bobinas está duplicada.

Este sistema es fácilmente extensible a diagramas generales de muchos más estados y permite la aplicación GEMMA de una forma cómoda y sencilla. En este ejemplo como sólo se pretende implementar tres estados GEMMA (diagrama MARCHA/PARO) se ha incluido en el ejemplo el desglose de dos subestados del estado F1. Esto no deja de ser una particularidad del problema concreto, pero suele ser una buena costumbre dividir F1 en entre 2 y 5 macroestados según la complejidad del problema y gestionar este nivel de F1 con este mismo método, de esta manera se simplificará la definición de los subestados del problema principal (F1).


Referencias: