Download - Creando un SCADA con Python y HTML5
Creando un SCADA con Python y HTML5
Defosse Nahuel
PyConAr 2012
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
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)
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.
Esquema General de un Sistema SCADA
Dispositivos de Control
Son conocidos con varios nombres1. RTU Remote Terminal Unit2. IED Inteligent Electronic Device3. PLC Programable Logical Unit
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
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
¿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).
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.
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
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
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)
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).
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
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()
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
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")
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);
Desarrollo del sistema
Capturas de pantalla (1)
Capturas de pantalla (1)
Capturas de pantalla (1)
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?
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
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/
The End
Muchas Gracias!