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.

martes, 20 de noviembre de 2012

Creando una Recreativa con Raspberry Pi -- Parte 1

Todavía no he comenzado con esta tarea en sí, pero ya estoy buscando información al respecto. Una vez probado Quake III con mi Raspberry, el próximo paso es instalar mame y crear mi propia recreativa (o algo parecido). Como esta semana me han llegado los pulsadores que pedí, he comenzado a buscar información sobre como empezar con el asunto, y me he encontrado con este link muy muy interesante sobre como instalar el mame en Raspberry, y configurarlo para que arranque sólo.... ya tengo trabajo para este fin de semana :)
Actualizado:  Parece que el link original ha caído :( a cambio os dejo la referencia original, el blog de SheaSilverman

Una foto de la maquinita que han hecho los autores del trabajo:




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:




sábado, 10 de noviembre de 2012

Instalando Quake III en Raspberry Pi

Hace más de tres meses que recibí mi Raspberry Pi y aún no había tenido la ocasión pero... por fin... esta semana, he pedido una tarjeta SD de 8 GB Clase 10 Extreme Pro de 95Mb/seg, un teclado y un ratón para utilizar exclusivamente en este menester. Y... ¿que mejor para probar nuestra Raspberry Pi que instalando Quake III?.

Lo único que necesitas para hacer funcionar tu Raspberry Pi, es:
  • Un transformador con salida micro USB que saque por DC al menos 700mA aunque yo recomiendo al menos 1,2A  para no quedaros cortos.
  • Una tarjeta SD, yo he pillado una de alta velocidad porque tengo entendido que la velocidad de la tarjeta es una de las cosas que más limita la potencia de Rapberry Pi.
  • Una televisión y un un conector de vídeo compuesto (RCA cable amarillo) o bien una pantalla de PC con conector hdmi.
  • Un teclado y un ratón USB.
  • Un cable de red y un router con conexión a Internet.
  • Tener puesto en la radio Rock FM o en su defecto poner una canción de los Guns and Roses.


Pero bueno, no empecemos la casa por el tejado. En primer lugar hay que instalar un SO a nuestra tarjeta SD, yo como soy un poco vago estoy en Windows y he utilizado este sistema para realizar la instalación de la imagen. En esta página podéis encontrar las diferentes imágenes preconfiguradas para instalar en la tarjeta de vuestra Raspberry Pi. Yo os recomiendo utilizar Raspbian “wheezy”que es una optimización de la versión debian para Raspberry, pero si pretendéis instalar la maquina virtual de Java, esta versión no os valdrá y tendréis que ir a la versión soft-debian pura. Bueno, en este caso nos centramos en la primera de estas, la descargáis y montáis la imagen en una tarjeta SD, aquí os dejo el enlace de la guía para principiantes. A continuación os resumo los pasos que yo seguí, en el enlace podéis encontrar varios métodos más, según las ganas que tengáis de frikear y el SO que utilicéis. Yo como ya he dicho no dispongo de mucho tiempo libre y he utilizado Windows:

  1. Descargar la imagen desde el mirror o por torrent. Cómo ya he dicho, asumo que usaremos Raspbian “wheezy” download 2012-10-28-wheezy-raspbian.zip
  2. Extraer el archivo imagen 2012-10-28-wheezy-raspbian.img del archivo .zip descargado.
  3. Insertar la tarjeta SD en tu lector de tarjetas SD y fijate bien en la letra de la unidad que le corresponde.Si la tarjeta no es nueva, deberías formatearla; de lo contrario Win32DiskImager puede fallar al grabar la imagen.
  4. Ahora descarga la herramienta Win32DiskImager. Los enlaces de descarga se encuentran al lado derecho de la página, descarga el zip con los binarios para poder ejecutarlo directamente.
  5. Extrae el ejecutable del archivo zip y ejecuta el archivo Win32DiskImager. Recuerda ejecutarlo como Administrador!
  6. Elige la imagen 2012-10-28-wheezy-raspbian.img que deberías haber extraído previamente.
  7. Selecciona la unidad correspondiente a tu tarjeta SD. Ten cuidado en seleccionar la unidad correcta ya que si te equivocas borrarás todo el contenido de la unidad que elijas ¡si te equivocas puede que pierdas toda tu información!
  8. Pincha en "Write" y espera a que termine la escritura para completar la operación.
  9. Sal del programa y extrae la tarjeta SD.
  10. Ahora puedes insertar la tarjeta en tu Raspberry Pi, ahora puedes encenderla, y si todo ha ido bien debería arrancar el sistema operativo. 




Al arrancar la Raspberry Pi hay dos cosas importantes, la primera es tener en cuenta que el usuario y contraseña por defecto para el Sistema Operativo Wheezy es usuario: pi y contraseña: raspberry, la segunda es que se debería ejecutar por defecto un script llamado raspi-config y que puede ser ejecutado en cualquier momento utilizando el comando: sudo raspi-config
En dicho script, se pueden ver las opciones mostradas a continuación entre ellas cabe destacar las siguientes:
  • Expandir la partición de memoria de tu tarjeta SD: Si estás utilizando una tarjeta de memoria de más de 4GB puedes elegir esta opción para extender la partición de memoria utilizando así toda la memoria de tu tarjeta, para ello utiliza la opción expand_rootfs
  • Para poner el teclado en español hay que elegir la opción del menú configure_keyboard y seguir las indicaciones en pantalla. Es importante tener en cuenta que hay que ir pulsando el tabulador para ir realizando las selecciones y posteriormente aceptar con la tecla enter.
  • Podéis overclockear vuestra Raspberry Pi, yo la he subido a 800Mhz para realizar estas pruebas.
  • También es importante subir la memoria dedicada a la gráfica con el comando meomry_split, os recomiendo 128Mb no pongáis los 256Mb ya que en ese caso el sistema tiende a tener parones.
Pulsando la tecla ESC se accede a la consola del SO. Lo siguiente que debéis hacer es conectar a Internet vuestra Raspberry Pi utilizando un cable Ethernet entre tu dispositivo Raspberry y un router con conexión ADSL o similar. Si todo funciona correctamente deberías poder ejecutar el comando ifconfig para comprobar que la tarjeta ha obtenido una IP válida. Para comprobar que la conexión funciona puedes ejecutar ping -c 3 www.google.es y deberías obtener respuesta de sus servidores.
Podéis encontrar más información básica sobre como hacer ciertas cosas con Linux en Raspberry Pi iniciación con raspberry.

Y ahora... vamos a comenzar con la instalación de Quake 3, os propongo la solución que a mi me función que es la que consiste en compilar Quake 3 para Raspbian, para lo que hay que seguir los pasos propuestos en este tutorial y que paso a describir a continuación:


  1. Actualiza el sistema con los siguientes comandos (el último en mi caso no se ejecutó correctamente pero sin embargo el sistema ha funcionado perfectamente):
        sudo apt-get update
        sudo apt-get dist-upgrade
        sudo rpi-update 192
    • Reinicia con el comando reboot.
  2. Instala los paquetes necesarios para realizar la compilación:
        sudo apt-get install git gcc build-essential libsdl1.2-dev
  3. Y ahora descarga el código fuente de Quake 3:
        mkdir ~/src
        cd ~/src
        git clone https://github.com/raspberrypi/quake3.git
        cd quake3
  4. Ahora hay que editar el archivo build.sh del directorio quake3 para cambiar el uso de las librerías a utilizar.
        cambia la linea 8 por:  ARM_LIBS=/opt/vc/lib
        cambia la linea 16 por: INCLUDES="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads"
        Comenta la linea usando el simbolo # 19:    #CROSS_COMPILE=bcm2708-
  5. Ahora ejecuta el script que realiza la compilación: ./build.sh
  6. Y... ahora puedes ir a hacerte un café, te o tomarte unas cervezas con tus colegas, porque esto tarda un buen rato (aproximadamente 1 hora).
  7. Ahora tienes que encontrar los archivos: pak0.pk3, pak1.pk3, pak2.pk3, pak3.pk3, pak4.pk3, pak5.pk3, pak6.pk3, pak7.pk3, pak8.pk3 y colocarlos en el directorio build/release-linux-arm/baseq3. Estos archivos los puedes encontrar en el cd original de tu Quake III
  8. Una vez compilado puedes crear un directorio limpio y mover ahí los archivos listados a continuación, puedes eliminar el resto del directorio:
quake3arena/ioq3ded.arm
quake3arena/ioquake3.arm
quake3arena/baseq3/cgamearm.so
quake3arena/baseq3/qagamearm.so
quake3arena/baseq3/uiarm.so
quake3arena/lib/libSDL.so
quake3arena/lib/libSDL-1.2.so.0
quake3arena/lib/libSDL-1.2.so.0.11.3
Ahora ya puedes entrar en la carpeta anterior y ejecutar el archivo ioquake3.arm. Usando el comando ./ioquake3.arm comenzará el juego.
    Quiero agradecer a Shea Silverman su trabajo por servirme de fuente de inspiración.


    Bueno, por último aquí os dejo un vídeo demostrativo del resultado, se que la calidad del vídeo no es muy buena, pero considero que tampoco hace falta mas. Como podéis ver el Quake III funciona más que fluido con la configuración apropiada, habrá que seguir probando cosas para comprobar los límites del Hardware. De momento la prueba de concepto ha sido un éxito!



    Cubieboard

    El mismo día que por fin instalo un sistema operativo a mi RaspBerry ya he pedido mi nuevo juguete. CubieBoard es la nueva placa de alto rendimiento y bajo coste que va a competir con RaspBerry Pi, esta vez desarrollada en Shenzhen China por lo que como no era raro, ofrece mayores prestaciones a un precio muy reducido. En este momento están organizando una campaña de crown funding para recopilar fondos y crear una alta producción consiguiendo reducir así los costes de fabricación. Las características de este dispositivo prometen, incorpora un microprocesador ARM cortex-A8 de 1Ghz de velocidad de reloj, 1Gb de RAM DDR3 y 4Gb de Nand Flash integrada. A continuación os dejo las características del sistema:
    • 1G ARM cortex-A8 processor, NEON, VFPv3, 256KB L2 cache
    • Mali400, OpenGL ES GPU
    • 1GB DDR3 @480MHz
    • HDMI 1080p Output
    • 10/100M Ethernet
    • 4GB Nand Flash
    • 2 USB Host, 1 slot para micro SD, 1 SATA, 1 puerto de Infrarrojos.
    • 96 pines de propósito general incluyendo I2C, SPI, RGB/LVDS, CSI/TS, FM-IN, ADC, CVBS, VGA, SPDIF-OUT, R-TP..
    • Sistemas Operativos probados Android, Ubuntu y otras distribuciones de Linux.
    Frente a los 700Mhz y sus 256 Mb de RAM en los modelos A y los primeros modelos B, 512 en los últimos modelos B. CubieBoard incluye memoria Nand Flash para el sistema operativo por lo que no es necesario comprar una tarjeta SD para poder instalar el sistema operativo, lo que hace que la diferencia de precio con Raspberry Pi, realmente se reduzca un poco. En tan solo unos días han recaudado 71.000 dolares de los 50.000 que pretendían conseguir, y aún quedan otros 28 días más, todavía la puedes conseguir por 59$ por correo ordinario (unas 3 semanas a partir de la fabricación) o por 69$ con envío rápido (unos pocos días a partir de la fabricación). La parte mala es que me imagino que no comenzarán con la fabricación hasta el día que termine la campaña, por o que no creo que pueda disfrutar de este juguetito antes de navidades.

    Aquí os dejo el vídeo promocional de la campaña que están realizando en Indigogo: