Tendencia

Proyecto UWS (7)

Esta entrada es continuación de Proyecto UWS (6).

Entrada de datos
Entrada de datos

Mi proyecto personal de entorno de desarrollo SCADA ha tomado nuevos derroteros. Tenía pendientes bastantes temas (usuarios, otros drivers, más controles para la interfaz…) pero se ha apropiado de él una necesidad que ha orientado la nueva versión. Pongo en situación: quiero almacenar una serie de valores históricos que se van a recoger manualmente, para poder analizarlos con posterioridad: sacar tendencias, exportar tablas, hacer cálculos… Podría recurrir a una hoja de cálculo, pero no es lo ideal si la tienen que manejar varias manos y el volumen de información es grande. Lo adecuado es una base de datos, pero hay que proporcionar un método de entrada sencillo, como una página web. Y aquí es donde he pensado añadir un nuevo controlador a UWS. Puede parecer forzar algo el sentido original del SCADA, pero bien pensado, ¿qué diferencia hay entre intercambiar información con un servidor físico a hacerlo con una base de datos?
El nuevo módulo, DBPLCModule hace de driver para este tipo de comunicación. La clase derivada de PLC controla la conexión, y parece natural que una tabla se amolde a una clase Memory y cada variable Tag represente una columna. La reinterpretación de los métodos existentes es también directa. ¿Qué devuelve get()? El valor más reciente. Para eso, hay que poder ordenarlos temporalmente, y eso requiere una columna en cada tabla de tipo datetime. Es consistente con la necesidad de almacenar valores históricos. ¿Qué almacena set()? El valor actual. O uno antiguo, aprovechando el polimorfismo. ¿Qué hace el método connect() del PLC? Conectarse a la base de datos y actualizar en el motor el valor de las variables de acuerdo a su contenido. También se añade un escaneo periódico, porque otra aplicación podría estar actualizando por su cuenta la información. Aquí he añadido una funcionalidad interesante: cuando llamamos a este método, DBPLC tiene ya toda la información necesaria sobre la base de datos, tablas y columnas, así que, ¿por qué no crear la estructura si no existe previamente? Hecho, ni siquiera debemos molestarnos en levantar todo este andamiaje, basta con la clásica llamada a ensemble.deploy() para tenerlo todo funcionando.

Hasta aquí lo directo, pero sigue siendo insuficiente para responder a las necesidades iniciales. Para ello es necesario añadir algunas funciones extra:

  • Datapicker
    Datapicker

    Tenemos que insertar nuevos datos. Y no nos vale Tag.set(), porque debemos poder agregar un registro completo. Se resuelve con el método Memory.set_row(), al que se le pasa como argumento un diccionario con los valores de las columnas y, opcionalmente, la fecha y hora de registro. Esta función clama a gritos un nuevo control en la interfaz, que tiene que ser un formulario. He adoptado el mismo criterio de simplicidad que otras veces: el atributo data-table lo liga a nuestro control, y nos podemos olvidar de código extra.
    El código en j.js busca todas las variables (atributo data-dir) en su interior, actualiza los valores iniciales y añade los eventos necesarios. El campo con atributo data-datetime es opcional, y se convertirá en un calendario para seleccionar fecha y hora de inserción. Para quien se lo pregunte, no necesitamos hacer referencia a la tabla, ya que está implícita en la memoria a la que pertenecen las variables.

  • Es necesario también un método para reclamar los valores de una variable entre dos fechas. Éste es Tag.get_data(), al que se le pasan los instantes de inicio y el de fin, y devuelve un listado de pares [tiempo,valor]. Esto va a ser útil para, por ejemplo, trazar una tendencia. También va a ser sencillo para el desarrollador, basta incluir un div con las variables dentro del atributo data-trend, y UWS lo transformará en una gráfica.

    Tendencia
    Tendencia

    En este caso va a ser importante añadir un id, para en el futuro discriminar acciones sobre diferentes tendencias. Para este elemento he recurrido a la estupenda librería Flot. De momento, las tendencias de UWS están en una fase muy inicial, y necesitan controles extra para moverse, añadir y eliminar variables, ampliar y reducir, usar varias escalas, etc.

Faltan todavía más cosas. Es necesario poder exportar datos, consultar valores en una fecha determinada, quizás editar la información… Además de la gestión de usuarios. Será en próximas entregas.
Recursos asociados:
SCADA UWS (versión 1.4) y código de ejemplo.

Facebooktwitterlinkedin