Componentes de UWServer

Proyecto UWS (2)

He terminado la fastidiosa tarea de documentar el Proyecto UWS. Y de camino me ha servido para corregir un par de errores. Como comentaba, el UWS es un esbozo de SCADA muy en pañales. Corre en Python (yo uso concretamente la versión 3.5) y la interfaz es HTML estándar. De momento sólo comunica por Modbus TCP, pero todo se andará.
Los módulos y clases de los que se compone son los siguientes:

  • PLCModule:
    • PLC: Representación de un controlador genérico.
    • Memory: Representación de una de las zonas de memoria de un PLC. En el caso de un equipo Modbus, van a ser bobinas, entradas digitales, registros de retención y registros de entradas. Pero otros controladores exigirán otra distribución.
    • Area: Segmento de memoria. Su uso es interno, normalmente no va a requerir que el programador la ataque.
    • Poll: Conjunto de áreas (información) que se piden con una misma frecuencia de muestreo. Por ejemplo, valores que cambian muy rápido o son críticos requieren refresco con intervalo reducido.
  • MBPLCModule:
    • MBPLC: Controlador con comunicación Modbus. Deriva de la clase PLC.
  • EnsembleModule:
    • Ensemble: Vendría a ser una red de controladores. Pero en realidad no hay exigencia real de que se encuentren en la misma red. En el fondo es un conjunto de controladores y de grupos de muestreo.
  • UWServerModule:
    • UWServer: El SCADA propiamente dicho. En principio sólo integra los componentes.
    • WebServer: El servidor web.

Me va a perdonar el lector por el revuelto de idiomas: clases, atributos, métodos, etc. están nombrados usando el inglés, pero tengo poca soltura y mucha pereza para usar la misma lengua para los docstrings, de modo que los he redactado en español.
El siguiente gráfico muestra los componentes de un proyecto:

Componentes de UWServer
Componentes de UWServer

En la otra entrada puse un ejemplo de cómo se llevaría a cabo un proyecto, sin apenas dar explicaciones. Me gustaría repasarlo de nuevo, explicando más en detalle los pasos. Básicamente el desarrollo se realiza en dos espacios. En Python se define la estructura del proyecto (controladores, conexiones, muestreos…) y en HTML se compone la interfaz del SCADA. Comencemos por la primera, que nos va a llevar el resto de la entrada. Por lo usual, en primer lugar debemos instanciar un Ensemble, es decir, una red de controladores.

En nuestro ejemplo sólo vamos a requerir que el ensemble tenga un controlador, al que vamos a llamar plc1. Como comunicamos con él en Modbus TCP, hay que indicarle su dirección IP. También cuánto ocupan sus distintas áreas de memoria (coils, inputs, holdings y registers). La clase nos permite aportar más parámetros, como puerto de conexión (típicamente 502), método, unidad (número de esclavo), reintentos caso de fallo de comunicación. También atributos para saber si se ha establecido la comunicación, métodos para leer o escribir datos, e incluso podríamos definir áreas adicionales de memoria con un sentido algo peregrino. Pero para nuestro ejemplo no nos vamos a complicar: la longitud de todas sus áreas de memoria va a ser de 20 elementos y el resto de parámetros quedan por defecto. También aprovechamos para agregarlo al ensemble en el mismo paso:

Ahora vendría la tarea fastidiosa de definir diferentes muestreos, según periodo de refresco, y las áreas que se leen. Un ejemplo de cómo se crearía uno de estos grupos es el siguiente:

Hago notar que propiamente hablando, el tiempo de muestreo es «entre muestreos». Es decir, el código espera a que se hayan completado las comunicaciones (o hayan devuelto error) antes de empezar a contar para las siguientes peticiones. Estamos hablando comunicación desde un SCADA, no en un bus de campo, con lo que podemos ser algo laxos en este sentido. Se evita así además saturar las comunicaciones por solapamientos. Para continuar con el ejemplo, ahora habría que iniciar las comunicaciones con cada uno de los grupos de muestreos definidos.

Aunque de esta forma se controla de forma fina cómo se van a llevar a cabo las comunicaciones, he querido incorporar un método más ágil. fast_deploy crea un único grupo de muestreo con el tiempo por defecto, añade todas las áreas de memoria al completo de todos los PLC que posea el ensemble, e inicia sus comunicaciones de una tacada:

En este momento tenemos el motor de comunicación en marcha, y podemos leer y escribir de la forma siguiente:

En estas circunstancias, tan solo nos falta lanzar el servidor web. Lo normal sería usar el puerto 80, pero se puede usar cualquier otro disponible, como el 8080. Por supuesto, tenemos libertad para emplear más de un puerto con diferentes servidores, y el mismo ensemble. Puede ser interesante conjugado con otro de los parámetros, la ruta relativa de los ficheros HTML, que por defecto es www.

Queda discutir la segunda parte, donde entraremos en el desarrollo de la interfaz web. Eso será en una próxima entrega.
Esta entrada continúa en Proyecto UWS (3).
Recursos asociados:
SCADA UWS (versión 1.0) y código de ejemplo.

Facebooktwitterlinkedin