27 de enero de 2010

Remanencia de datos en un Beckhoff CX9010

El Beckhoff CX9010 es en realidad un PC embebido con procesador ARM que ejecuta Windows CE. Esta configuración le otorga ventajas frente a un PLC convencional, entre las que destacan una mayor conectividad y accesibilidad. Sin embargo también existen inconvenientes. Cuando apagamos un PLC no nos preocupa qué pasará si hay un corte de corriente, es algo con lo que se cuenta en su diseño. Sin embargo un PC requiere un apagado de forma controlada, para evitar pérdida de datos. Si el CX9010 sufre un corte de alimentación puede que los últimos datos que estemos manejando se pierdan... si no tomamos las precauciones adecuadas.

Para realizar la remanencia de datos en el CX9010, Beckhoff nos ofrece dos alternativas. La primera es escribir en la memoria flash que usa a modo de disco duro. Mediante el bloque de función FB_WritePersistentData podremos almacenar nuestras variables. El inconveniente es que si se produce una caída de tensión en medio de un proceso de escritura puede haber corrupción de datos, además de tener en cuenta que no podemos abusar de la escritura en memoria flash ya que puede sufrir desgaste por machacar demasiado la misma zona de memoria. La segunda alternativa, que será la que desarrolle a continuación, consiste en usar el dispositivo NOV/DP-RAM que viene integrado en el CX9010.

Cuando hacemos la configuración del PLC, al auto detectar los componentes que tiene conectados con el TwinCAT System Manager, aparece un dispositivo NOV/DP-RAM. Este dispositivo consiste en una memoria flash ROM que no tiene limitación de ciclos de escritura, y está asistido por un condensador integrado en el chip NOVRAM que garantiza la energía suficiente para hacer una escritura de los datos remanentes, aunque se corte la alimentación.

La dirección de memoria y la longitud de la NOVRAM aparecen en la pestaña 'DPRAM genérico', y para el CX9010 tiene un tamaño de 131 072 bytes (128 kbytes).

El primer paso es crear las variables que se almacenarán en la NOVRAM, las cuales hay que declararlas como salidas, como ejemplo voy a crear el entero doble POSICION_NO_VOLATIL. Se pueden declarar estructuras de datos si es necesario.

En mi aplicación no necesito que se realice una escritura de datos en cada ciclo de autómata, así que voy a crear un programa vacío en el TwinCAT PLC Control (si se hace en lenguaje ST poner simplemente un ';') que se ejecutará en una tarea con un tiempo de ejecución largo, y al que le asignaré la escritura de las variables remanentes en la NOVRAM. Creo el programa vacío llamado 'SECUNDARIO':

Ahora vamos a añadir una tarea adicional al PLC, vamos a la pestaña Resources del PLC Control y abrimos la Task configuration. En el árbol de tareas, sobre Task configuration pulsamos el botón derecho del ratón y seleccionamos Append Task.

Le damos un nombre a la tarea, en mi caso la he llamado SECUNDARIA y le asignamos un tiempo de ejecución. Para mi aplicación 1 segundo (1000 ms) es suficiente.

En el árbol de tareas, sobre la tarea recién creada, con el botón derecho del ratón seleccionaremos 'Append Program Call'.

Y seleccionamos el programa vacío creado anteriormente.

Ya tenemos la tarea secundaria configurada. Compilamos el programa para que el System Manager actualice la configuración del programa.

Ahora vamos al TwinCAT System Manager y bajo PLC - Configuración vemos que aparece nuestro programa y las dos tareas.

Si desplegamos las tareas se observa que la variable POSICION_NO_VOLATIL está asignada a la tarea Standard.

Pinchamos sobre la variable POSICION_NO_VOLATIL y la arrastramos sobre las salidas de la tarea SECUNDARIA.

Con esto conseguimos que la escritura en la variable POSICION_NO_VOLATIL esté asignada al ciclo de la tarea SECUNDARIA. Ahora tenemos que vincular la variable remanente con una salida asignada al dispositivo NOVRAM, así que lo desplegamos, pulsamos con el botón derecho sobre las salidas y seleccionamos 'Insertar variable...'

Le damos un nombre cualquiera y es importante especificarle el mismo tipo de variable que deseamos vincularle. Como POSICION_NO_VOLATIL es un DINT selecciono INT32 (puede confundir un poco que las denominaciones de los tipos de datos no sean idénticas al que tienen las variables en su declaración).

Ahora hay que vincular la variable que acabamos de crear para ello pulsamos el botón 'Vinculado a...' y seleccionamos la variable POSICION_NO_VOLATIL.

Ya están las variables vinculadas.

Ahora solo falta un detalle más. Es necesario marcar la casilla 'Auto Init linked PLC Outputs' para que al arrancar el PLC lea el valor almacenado previamente (sincronización).

Activamos la configuración recién creada y listo, cuando asignemos un valor a POSICION_NO_VOLATIL estaremos seguros de que sobrevivirá a una pérdida de alimentación.

NOTA: podemos utilizar la variable POSICION_NO_VOLATIL desde la tarea Standard o cualquier otra tarea, aunque no la tenga asignada, es un proceso transparente para el programador.

Una advertencia final: no está permitido declarar las variables remanentes que guardemos en la NOVRAM como VAR_PERSISTENT o VAR_RETAIN.

Antes de acabar quiero agradecer al técnico de Beckhoff sus pacientes explicaciones.

Como siempre, agradeceré cualquier crítica, sugerencia o comentario.

4 comentarios:

  1. Muchas gracias por tu aportación.
    Tienes un blog muy bueno que suelo utilizar bastante.

    Acabo de hacerlo y funciona perfectamente, lo unico que he cambiado es la utilización de una estructura para evitar tener que mover muchas variables de un task a otro.

    Un saludo,
    Alberto

    ResponderEliminar
  2. De igual manera agradezco tu aportación.

    Tengo que realizar algo parecido en una computadora industrial.
    Sabes si podría ser posible?

    Saludos!

    ResponderEliminar
  3. Si la computadora industrial es de Beckhoff y tiene implementado el dispositivo NOV/DP-RAM supongo que sí podrás, aunque nunca he trabajado con uno.

    Un saludo.

    ResponderEliminar
  4. Estoy empezando un proyecto con este tipo de autómatas. Muchas gracias por la información y por tu esfuerzo en mantener el blog.

    ResponderEliminar

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