27
Creando un SCADA con Python y HTML5 Defoss´ e Nahuel PyConAr 2012

Creando un SCADA con Python y HTML5

Embed Size (px)

DESCRIPTION

Breve descripción del proyecto txscada como prueba de concepto de P

Citation preview

Page 1: Creando un SCADA con Python y HTML5

Creando un SCADA con Python y HTML5

Defosse Nahuel

PyConAr 2012

Page 2: Creando un SCADA con Python y HTML5

Quien soy yo?

$ whoami

I Licenciado en Informatica de UNPSJBI Integrante del grupo de investigacion Microcontroladores

e InternetI Evangelizador Python en la universidad hace 5 anosI Co-desarrollador de PrymatexI Desarrollador web en Machinalis

Donde encontrarmeI @D3f0I nahuel (punto) defosse (at) gmail (dot) comI d3f0 en #freenode

Page 3: Creando un SCADA con Python y HTML5

Por que deberıas estar en esta charla

1. Sos un hobbista electronico y queres aprender a usarPython para integrar y aprovechar tu hardware

2. Tenes un Ardruino, Raspbbery Pi, BeageBone o algunaotra computadora pequena y queres aprender sobrecomunicaciones

3. Tenes conocimiento de SCADAs en el ambito industrial yestas buscando una alternativa libre, robusta y adaptable.

4. Te gustarıa saber como automatizar tu casa de maneraescalable y abierta (domotica)

5. Te interesa brindar un servicio basado en lo anterior SaaS(SCADA as a Service)

Page 4: Creando un SCADA con Python y HTML5

Que es un SCADA

Segun la Wikipedia... es un software que permite controlar ysupervisar procesos industriales a distancia. Facilitaretroalimentacion en tiempo real con los dispositivos de campo(sensores y actuadores) y controlando el procesoautomaticamente. Provee de toda la informacion que segenera en el proceso productivo (supervision, control calidad,control de produccion, almacenamiento de datos, etc.) ypermite su gestion e intervencion.

Page 5: Creando un SCADA con Python y HTML5

Esquema General de un Sistema SCADA

Page 6: Creando un SCADA con Python y HTML5

Dispositivos de Control

Son conocidos con varios nombres1. RTU Remote Terminal Unit2. IED Inteligent Electronic Device3. PLC Programable Logical Unit

Page 7: Creando un SCADA con Python y HTML5

IED/RTU/PLC

I Son dispositivos electronicos que atienden un proceso, yque toman decisiones con tiempos cortos.

I A diferencia de un sistema asilado se comunican mediantealgun protocolo y enviar y recibir mensajes que en generalestan orientados a:

1. Consultar el estado de valores analogicos y/o digitales2. Envıo de alertas (eventos) con bastante precision

temporal dependiendo del caso3. Comandos de configuracion

Page 8: Creando un SCADA con Python y HTML5

Protocolos SCADA

1. RS-485 (serial con inmunidad al ruido y pensado para usoM/S)

2. Modbus3. DNP (Distributed Network Protocol) Link4. MOSCAD (Propietario motorola, deprecated)5. IEC 61850

5.1 ANS15.2 GOOSE

Page 9: Creando un SCADA con Python y HTML5

¿Que hicimos?

En el contexto del proyecto de investigacionI Sistema SCADA con dispositivos de bajo costo (PIC)I Protocolo de comunicaciones basado en RS485I Software de adquisicion de datos basado en Twisted

Como actividad de extensionI Desarrollo de sistema de control de semaforosI Desarrollo de sistema de control de variables electricas

(en desarrollo).

Page 10: Creando un SCADA con Python y HTML5

Protocolo Mara

El protocolo Mara es un protocolo abierto especializado enaprovechar dispositivos de bajo coste (en un principio PIC).

Cada comando puede o no llevar payload. El checksum y elnumero de secuencia permiten cierto control de integridad.

Page 11: Creando un SCADA con Python y HTML5

Estructura de Mara Basica 1.0

I CabeceraUn byte que identifica el comienzo de un mensaje

I LengthEl largo total del mensaje en bytes

I SourceLa direccion del emisor del mensaje, suele usarse 0 para elSCADA

I DestinationEl destino del mensaje. Al estar basado en RS485, nosuele superar

I SequenceEl numero de secuencia del mensaje

Page 12: Creando un SCADA con Python y HTML5

Comandos de MaraI Actualmente Mara esta siendo utilizado mediante polling

y en cascada.I El centro de control envıa un mensaje con un comando de

consulta 0x10I Un RTU especial llamado concentrador responde con los

valores de todos sus esclavos

Page 13: Creando un SCADA con Python y HTML5

Que variables recoge mara?

I Digitales (DIS)I Variables de sistema y diagnostico (VarSys)I Analogicas 16 bits sigandas (AIS)I Eventos con precision de 1/32K segundos (Eventos)

Page 14: Creando un SCADA con Python y HTML5

Que es un concentrador?

En nuestro caso, una placa de desarrollo llamada Explorer 16con un shield de comunicaciones Ethernet. Se programa en C(Stack TCP/IP).

Page 15: Creando un SCADA con Python y HTML5

Scada con Python

¿Como escribimos el centro de control para dialogar con losconcentradores?

I Elegimos Twisted como framework de red debido a que yase han implementado algunos protocolos como ModBus

I Utilizamos el paquete bitfield para manejar bits como sifuesen arreglos

I Mediante Construct obtenemos un DSL para describirmara o cualquier otro portocolo.

I Metemos diccionarios y sacamos tramasI Metemos tramas y obtenemos diccionarios

I Peewee como mapeador objeto-relacional por simplicidadI Flask como presentacion web

Page 16: Creando un SCADA con Python y HTML5

Base de Datos

Mediante Peewee podemos definir de manera sencilla laestructura de los datosclass Concentrador(peewee.Model):

direccion_ip = models.CharField()activada = models.BooleanField()

class IED(peewee.Models):concentrador = models.ForeignKey(Concentrador)nombre = peewee.CharField()

class DI(peewee.Model):ied = peewee.ForeignKey(IED)valor = peewee.IntegerField()

Page 17: Creando un SCADA con Python y HTML5

Recoleccion de datos

I El concentrador brinda un socket TCP, sobre el cual noscomunicamos con mara.

I Creamos una sub-clase de Protocol en Twisted que utilicenuestro Construct de mara para enviar y recibir datos

I Por cada concentrador establecer una conexion atendidapor una instancia del protocolo

I Cuando la comunicacion es compleja, el automata seconcentra en los derivados de Protocol

class MaraProtocol(Protocol):def dataReceived(self, data):

TramaMara.parse(data)# Guarda en base de datos

Page 18: Creando un SCADA con Python y HTML5

Estructura de HMI

I El HMI es la GUI con el usuario.I Permite la supervision, configuracion y controlI Implementada con Flask por sencillezI Utilizando Jinja2 como motor de templates

@app.route("/")def index():

return render_template("index.html")

Page 19: Creando un SCADA con Python y HTML5

HMI como aplicacion del cliente

I jQuery + jQueryUIGUI general del HMI

I jQuery DataTableGrids de datos

I HighChartsGraficos bonitos

I jQuerySVGHace que el manejo de SVG sea tan sencillo como el delDOM de una pagina$(’.interruptor’).style(’background’:’red’)

.click(mostrarDialogo);

Page 20: Creando un SCADA con Python y HTML5

Desarrollo del sistema

Page 21: Creando un SCADA con Python y HTML5

Capturas de pantalla (1)

Page 22: Creando un SCADA con Python y HTML5

Capturas de pantalla (1)

Page 23: Creando un SCADA con Python y HTML5

Capturas de pantalla (1)

Page 24: Creando un SCADA con Python y HTML5

Futuro

I Servidor IEC 16850 (normalizacion)I Utilizar socket.io de alguna manera para evitar polling

(Tornado / Node.JS)I Fortalcer el client side con Backbone.JSI Mejorar la implementacion de comandosI Generacion de reportes (relatorio)I Cambiar de event-loop?

Page 25: Creando un SCADA con Python y HTML5

El codigo fuente

https://github.com/D3f0/txscadaI Estas invitado a fokear el proyecto y adaptarlo a tus

necesidades!I El codigo fuente de la aplicacion del Explorer 16 no es

libre, pero serıa interesante realizar ports sobre openhardware

Page 26: Creando un SCADA con Python y HTML5

Otros sitios donde chusmear

I LinkidokyUn scada hecho en Pythonhttp://www.likindoy.org/es/Inicio

I youSCADAUn scada hecho con NodeJS con un concepto muyparecido a txscadahttp://isolasoftware.it/2012/09/14/youscada-presented-at-graphical-web-2012/

Page 27: Creando un SCADA con Python y HTML5

The End

Muchas Gracias!