1. Creando un SCADA con Python y HTML5
Defoss´ Nahuel
e
PyConAr 2012
2. Qui´n soy yo?
e
$ whoami
Licenciado en Inform´tica de UNPSJB
a
Integrante del grupo de investigaci´n Microcontroladores
o
e Internet
Evangelizador Python en la universidad hace 5 a˜os
n
Co-desarrollador de Prymatex
Desarrollador web en Machinalis
Donde encontrarme
@D3f0
nahuel (punto) defosse (at) gmail (dot) com
d3f0 en #freenode
3. Por que deber´ estar en esta charla
ıas
1. Sos un hobbista electr´nico y quer´s aprender a usar
o e
Python para integrar y aprovechar tu hardware
2. Tenes un Ardruino, Raspbbery Pi, BeageBone o alguna
otra computadora peque˜a y quer´s aprender sobre
n e
comunicaciones
3. Tenes conocimiento de SCADAs en el ´mbito industrial y
a
estas buscando una alternativa libre, robusta y adaptable.
4. Te gustar´ saber como automatizar tu casa de manera
ıa
escalable y abierta (dom´tica)
o
5. Te interesa brindar un servicio basado en lo anterior SaaS
(SCADA as a Service)
4. Que es un SCADA
Seg´n la Wikipedia... es un software que permite controlar y
u
supervisar procesos industriales a distancia. Facilita
retroalimentaci´n en tiempo real con los dispositivos de campo
o
(sensores y actuadores) y controlando el proceso
autom´ticamente. Provee de toda la informaci´n que se
a o
genera en el proceso productivo (supervisi´n, control calidad,
o
control de producci´n, almacenamiento de datos, etc.) y
o
permite su gesti´n e intervenci´n.
o o
6. Dispositivos de Control
Son conocidos con varios nombres
1. RTU Remote Terminal Unit
2. IED Inteligent Electronic Device
3. PLC Programable Logical Unit
7. IED/RTU/PLC
Son dispositivos electr´nicos que atienden un proceso, y
o
que toman decisiones con tiempos cortos.
A diferencia de un sistema asilado se comunican mediante
alg´n protocolo y enviar y recibir mensajes que en general
u
est´n orientados a:
a
1. Consultar el estado de valores anal´gicos y/o digitales
o
2. Env´ de alertas (eventos) con bastante precisi´n
ıo o
temporal dependiendo del caso
3. Comandos de configuraci´n o
8. Protocolos SCADA
1. RS-485 (serial con inmunidad al ruido y pensado para uso
M/S)
2. Modbus
3. DNP (Distributed Network Protocol) Link
4. MOSCAD (Propietario motorola, deprecated)
5. IEC 61850
5.1 ANS1
5.2 GOOSE
9. ¿Qu´ hicimos?
e
En el contexto del proyecto de investigaci´n
o
Sistema SCADA con dispositivos de bajo costo (PIC)
Protocolo de comunicaciones basado en RS485
Software de adquisici´n de datos basado en Twisted
o
Como actividad de extensi´n
o
Desarrollo de sistema de control de sem´foros
a
Desarrollo de sistema de control de variables el´ctricas
e
(en desarrollo).
10. Protocolo Mara
El protocolo Mara es un protocolo abierto especializado en
aprovechar dispositivos de bajo coste (en un principio PIC).
Cada comando puede o no llevar payload. El checksum y el
n´mero de secuencia permiten cierto control de integridad.
u
11. Estructura de Mara Basica 1.0
Cabecera
Un byte que identifica el comienzo de un mensaje
Length
El largo total del mensaje en bytes
Source
La direcci´n del emisor del mensaje, suele usarse 0 para el
o
SCADA
Destination
El destino del mensaje. Al estar basado en RS485, no
suele superar
Sequence
El n´mero de secuencia del mensaje
u
12. Comandos de Mara
Actualmente Mara est´ siendo utilizado mediante polling
a
y en cascada.
El centro de control env´ un mensaje con un comando de
ıa
consulta 0x10
Un RTU especial llamado concentrador responde con los
valores de todos sus esclavos
13. Que variables recoge mara?
Digitales (DIS)
Variables de sistema y diagn´stico (VarSys)
o
Anal´gicas 16 bits sigandas (AIS)
o
Eventos con precisi´n de 1/32K segundos (Eventos)
o
14. Que es un concentrador?
En nuestro caso, una placa de desarrollo llamada Explorer 16
con un shield de comunicaciones Ethernet. Se programa en C
(Stack TCP/IP).
15. Scada con Python
¿Como escribimos el centro de control para dialogar con los
concentradores?
Elegimos Twisted como framework de red debido a que ya
se han implementado algunos protocolos como ModBus
Utilizamos el paquete bitfield para manejar bits como si
fuesen arreglos
Mediante Construct obtenemos un DSL para describir
mara o cualquier otro portocolo.
Metemos diccionarios y sacamos tramas
Metemos tramas y obtenemos diccionarios
Peewee como mapeador objeto-relacional por simplicidad
Flask como presentaci´n web
o
16. Base de Datos
Mediante Peewee podemos definir de manera sencilla la
estructura de los datos
class 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()
17. Recolecci´n de datos
o
El concentrador brinda un socket TCP, sobre el cual nos
comunicamos con mara.
Creamos una sub-clase de Protocol en Twisted que utilice
nuestro Construct de mara para enviar y recibir datos
Por cada concentrador establecer una conexi´n atendida
o
por una instancia del protocolo
Cuando la comunicaci´n es compleja, el aut´mata se
o o
concentra en los derivados de Protocol
class MaraProtocol(Protocol):
def dataReceived(self, data):
TramaMara.parse(data)
# Guarda en base de datos
18. Estructura de HMI
El HMI es la GUI con el usuario.
Permite la supervisi´n, configuraci´n y control
o o
Implementada con Flask por sencillez
Utilizando Jinja2 como motor de templates
@app.route("/")
def index():
return render_template("index.html")
19. HMI como aplicaci´n del cliente
o
jQuery + jQueryUI
GUI general del HMI
jQuery DataTable
Grids de datos
HighCharts
Gr´ficos bonitos
a
jQuerySVG
Hace que el manejo de SVG sea tan sencillo como el del
DOM de una p´gina
a
$(’.interruptor’).style(’background’:’red’)
.click(mostrarDialogo);
24. Futuro
Servidor IEC 16850 (normalizaci´n)
o
Utilizar socket.io de alguna manera para evitar polling
(Tornado / Node.JS)
Fortalcer el client side con Backbone.JS
Mejorar la implementaci´n de comandos
o
Generaci´n de reportes (relatorio)
o
Cambiar de event-loop?
25. El c´digo fuente
o
https://github.com/D3f0/txscada
Est´s invitado a fokear el proyecto y adaptarlo a tus
a
necesidades!
El c´digo fuente de la aplicaci´n del Explorer 16 no es
o o
libre, pero ser´ interesante realizar ports sobre open
ıa
hardware
26. Otros sitios donde chusmear
Linkidoky
Un scada hecho en Python
http://www.likindoy.org/es/Inicio
youSCADA
Un scada hecho con NodeJS con un concepto muy
parecido a txscada
http://isolasoftware.it/2012/09/14/youscada-presented-
at-graphical-web-2012/