INTRODUCCIÓN
SCADA se trata de la supervisión de procesos automáticos de una forma tan completa y clara como sea posible con SCADA TCP/IP Modbus
SCADA ya se aplica al nivel más bajo de automatización. Por ejemplo, los datos se recopilan por medio de sensores y dispositivos de medición, se solicita la configuración.
Para la comunicación con distintas máquinas, dispositivos y productos de software, los sistemas SCADA deben dominar una gama de tecnologías. Desde conexiones de serie sencillas a sistemas de campo de bus a construcciones de red redundante complejas.
Modbus es un protocolo industrial que fue desarrollado en 1979 para hacer posible la comunicación entre dispositivos de automatización. Originalmente implementado como un protocolo al nivel de la aplicación con la finalidad de transferir datos por una capa serial, Modbus se ha expandido para incluir implementaciones a través de protocolo serial, TCP/IP y el User Datagram Protocol (UDP). Este documento ofrece una perspectiva detallada de la implementación del protocolo.
DIAGRAMA de la comunicación
El presente diagrama muestra la comunicación que se utiliza en esta practica. Donde se tiene un raspberry en un sitio y a través de una VPN se conecta al sistema SCADA.
PREREQUISITOS EN RASPBERRY
Antes de correr el codigo en python, se debe instalar los paquetes para la funcion correcta de python.
sudo apt-get install python-pymodbus python-twisted-conch
CÓDIGO en python
Este codigo se debe correr en python dentro de una raspberry.
**************************************************
from pymodbus.server.async import StartTcpServer
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from twisted.internet.task import LoopingCall
import RPi.GPIO as GPIO
LED=26
BZ=19
SW=21
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(LED,GPIO.OUT)
GPIO.setup(BZ,GPIO.OUT)
GPIO.setup(SW, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.output(LED, GPIO.LOW)
GPIO.output(BZ, GPIO.HIGH)
store = ModbusSlaveContext(
di = ModbusSequentialDataBlock(0, [0]*100),
co = ModbusSequentialDataBlock(0, [0]*100),
hr = ModbusSequentialDataBlock(0, [0]*100),
ir = ModbusSequentialDataBlock(0, [0]*100))
context = ModbusServerContext(slaves=store, single=True)
def updating_writer(a):
context = a[0]
register = 3
slave_id = 0
address = 0
values = [1]
if GPIO.input(SW):values = [0]
context[slave_id].setValues(register,address,values)
print values
def read_context(a):
context = a[0]
register = 3
slave_id = 0
address = 10
value = context[slave_id].getValues(register,address,10)
if value[0]==0:GPIO.output(LED, GPIO.LOW)
if value[0]==1:GPIO.output(LED, GPIO.HIGH)
if value[1]==0:GPIO.output(BZ, GPIO.LOW)
if value[1]==1:GPIO.output(BZ, GPIO.HIGH)
print value[0]
print value[1]
read = LoopingCall(f=read_context, a=(context,))
read.start(.2)
write = LoopingCall(f=updating_writer, a=(context,))
write.start(.2)
StartTcpServer(context)
Impresiones de pantalla de READ and Write
Cuando El sistema está conectado, marca un mensaje de read = OK
Cuando El sistma esta conectado, marca un mensaje de write = OK
Cuando existe un error en la conexión , el sistema marcara un mensaje llamado “ERROR”
TRAFICO CAPTURADO CON WIRESHARK para SCADA TCP/IP Modbus
Se tienen los siguientes paquetes capturados con wireshark. Estos paquetes nos muestran el trafico que existe entre SCADA y la raspberry.
Si abrimos a detalle un paquete podemos ver que dentro del paquete TCP/IP , solo una pequeña parte contiene datos.
CONCLUSIONES
El protocolo Modbus es un sistema maestro-esclavo; que tiene todas las ventajas de un sistema informatico denominado Cliente-Servidor.
Esto genera una gran ventaja ya que permite monitorear y dar control a sistemas mediante servicios remotos. Sumando las ventajas del protocolo SCADA TCP/IP Modbus nos permite aun mas llevar estos servicios a aplicaciones o tableros con mejor desempeño.
Gracias cris por tu desmadre
REFERENCIAS
https://paradiso-fp7.eu/scada/