2 de marzo de 2012

Comunicación por puerto serie a través de DeviceNet: ArmorPoint RS-232 ASCII

En la entrada anterior programé la comunicación serie de un lector de códigos de barras con un PLC CompactLogix a través de su puerto serie integrado. Ahora la aplicación ha cambiado y debo hacer la comunicación utilizando una tarjeta ArmorPoint RS-232 ASCII a través de DeviceNet.

Los ArmorPoint de Rockwell son módulos de periferia distribuida disponibles para buses de campo DeviceNet, ControlNet, EtherNet/IP o Profibus DP. A la cabecera DeviceNet que tengo disponible, referencia 1738-ADN18, le voy a acoplar una tarjeta de comunicaciones 1738-232ASCM12, que es una versión más robusta de una tarjeta 1734-232ASC, compartiendo la misma electrónica, por ello la documentación de referencia será la de esta última tarjeta: POINT I/O ASCII Modules 1734-232ASC, 1734-485ASC (PDF). El conjunto ensamblado de la cabecera ArmorPoint con mi tarjeta de comunicación serie tiene el siguiente aspecto:

Cabecera ArmorPoint con inteface serie sobre mi mesa, lista para hacer pruebas
(disculpad la calidad de las conexiones, a pesar del mal aspecto el conjunto funcionó sin problemas).
En conjunto, para hacer mis pruebas, tengo conectado un PLC CompactLogix L35E con una tarjeta escáner de DeviceNet. Entre esta última y la cabecera ArmorPoint coloco un PowerTap referencia 1485T-P2T5-T5, que me servirá para alimentar la red. Conecto el cable DeviceNet y en los extremos, entre los cables blanco y azul pondré sendas resistencias de cierre. Para conectar el lector de códigos de barras a la tarjeta de comunicaciones he fabricado chapuceramente un adaptador como el siguiente:


El conjunto completo y alimentado sobre mi mesa presenta el siguiente aspecto:

PLC + PowerTap + ArmorPoint + Lector de códigos de barras
Ahora toca configurar la tarjeta de comunicaciones, para ello abrimos el software de redes RSNetWorx for DeviceNet y buscamos la tarjeta 1738-232ASCM12:




Los parámetros de comunicación serie deben ser coherentes con los indicados el la configuración hecha en el lector de códigos de barras. También deberemos ampliar los buffers de comunicación y especificar el caracter terminador. No olvidemos mapear en el escáner las áreas de entradas y salidas necesarias.

Configuro mi PLC en un proyecto de RSLogix5000, con la red DeviceNet del escáner y la subred del ArmorPoint. Con la herramienta DeviceNet Tag Generator Tool genero en mi proyecto los tags necesarios para no tener que direccionarlos a mano.

A la hora de realizar la programación, lo primero a tener en cuenta es que las instrucciones para manejo del puerto serie integrado en el PLC no son aplicables a un puerto serie en DeviceNet. Además tenemos una limitación adicional: el tamaño de buffer máximo es de 128 bytes. Si vamos a hacer comunicaciones de menor tamaño no habría ningún problema, pero en mi caso necesito recibir tramas de unos 200 bytes. La solución para mi aplicación consiste en programa el lector de códigos de barras para que cada 80 bytes (por ejemplo) inserte un carácter de terminación. Así que para leer una trama de 200 bytes voy a tener que hacer tres lecturas sucesivas y reunirlas en mi PLC.

Para manejar las tramas de comunicación voy a definir un tipo de string de 256 caracteres:


Los tags que voy a necesitar los voy a agrupar en un UDT:


Para saber que tenemos datos disponibles en el buffer de comunicación serie tenemos el tag DNET_N01_S01_COS_I.ReceiveRecordNumber (creado automáticamente por el DeviceNet Tag Generator), que se irá incrementando con cada recepción. Como cada trama viene troceada en varias recepciones, para saber que he leído todos los datos, el lector de código de barras lo he configurado para que me dé en los primeros cuatro bytes la longitud total de la trama. Así que tendré que ir sumando la longitud de cada recepción hasta que coincida con lo que me diga el lector. Si tuviese una longitud de trama fija la programación sería más sencilla.

Mi rutina de recepción de datos es la siguiente:










Para activar una recepción de datos hay que setear el tag SERIE_DNET.ORDEN_LECTURA. Cuando la trama haya sido completamente leída el mismo tag se pondrá a cero, con lo podremos leer en SERIE_DNET.LECTURA la trama buscada.

Su funcionamiento es el siguiente: cuando se activa la orden de lectura se borra la trama anterior y se vigilan cambios en DNET_N01_S01_COS_I.ReceiveRecordNumber. Cuando este cambio se detecta se comprueba que su longitud esté dentro unos límites y se copian los datos recibidos en un string. Si estamos en el primer trozo se sacan los cuatro primeros bytes y se lee la longitud total de la trama. Vamos concatenando lecturas sucesivas hasta obtener la longitud buscada o que pase un tiempo máximo desde haber recibido el primer trozo.

El proyecto de RSLogix5000 con el que he realizado las pruebas te lo puedes descargar aquí.

Solo he hecho pruebas para la recepción de datos, puesto que para mi aplicación es suficiente. La programación del envío de datos debería seguir una filosofía similar.

Y hasta aquí esta entrada. Como siempre cualquier comentario será bienvenido.

5 comentarios:

  1. Son excelentes publicaciones...y toda la información que puedan compartir se los agradeceré. Saludos y nuevamente felicitaciones

    ResponderEliminar
  2. Como siempre muy bien explicado.
    Gracias por compartirlo

    ResponderEliminar
  3. El lector que usas es un Datalogic??? de ser así que modelo? Gracias

    ResponderEliminar
  4. gracias por la informacion para conectarlo por ethernet es igual?

    ResponderEliminar
  5. gracias por la informacion para conectarlo por ethernet es igual?

    ResponderEliminar

Por favor, no pidas copias de programas comerciales, licencias o números de serie.