Red MODBUS RTU con Raspberry Pi
Red MODBUS RTU con Raspberry Pi
INFORME FINAL DE
Versión 03
TRABAJO DE GRADO Fecha 2015-01-27
Ingeniería Mecatrónica
RESUMEN
DIMETRON S.A.S es una empresa dedicada a la implementación de la tecnología a los
procesos industriales, con servicios de automatización industrial, eficiencia energética,
montajes eléctricos y proyectos especializados en minería. Están a la vanguardia de los
grandes retos del siglo XXI y la nueva revolución industrial.
Dentro de DIMETRON S.A.S se determina crear una nueva área de Innovación y Desarrollo,
para ofertar nuevos servicios y para esto se empezó elaborando un algoritmo que
comunicara todos los sensores, actuadores y controladores en la etapa de final de un
proceso de clasificación industrial, además accediera igualmente a las variables energéticas
de toda la planta; de igual manera clasificara y ordenara esta información para
posteriormente ser enviada a una base de datos no relacional. En la elaboración se
resolvieron algunos interrogantes importantes, como cuál sería el dispositivo a
implementar y qué protocolo de comunicación implementar.
2
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
RECONOCIMIENTOS
Tengo mucho que agradecer a muchas personas y no quisiera olvidar a ninguna por esa
razón primero que todo agradezco a todas las personas que de una u otra manera me
ayudaron a crecer y aprender, compañeros, amigos, profesores y sobre todo a mi familia a
todos ellos gracias, pero a la persona que quiero darle todas mis gratitudes es a mi querido
abuelo ya que gracias a él y su ejemplo me encuentro hoy alcanzando esta meta muchas
gracias, también quiero agradecer a mi asesor Juan Gonzalo Ardila Marín por la ayuda y por
sus lecciones.
3
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
TABLA DE CONTENIDO
1. INTRODUCCIÓN ................................................................................................ 7
Objetivo general .................................................................................................................... 7
Objetivos específicos......................................................................................................... 7
2. MARCO TEÓRICO .............................................................................................. 9
Modelo OSI ............................................................................................................................ 9
Estándar ISA /SP50. ............................................................................................................. 10
Modbus RTU ........................................................................................................................ 11
3. METODOLOGÍA............................................................................................... 14
Diseño de la red y tecnologías empleadas. ...................................................................... 14
Comprobación de errores ............................................................................................... 29
Raspberry ........................................................................................................................ 34
Conversor USB a RS-485.................................................................................................. 37
PM-PA/PM-PAC POWER ANALYZER ............................................................................... 38
PLC XINJE: ........................................................................................................................ 38
Instalación de las bibliotecas que soportan los módulos MODBUS .............................. 39
Codificación del maestro y los esclavos ......................................................................... 40
Implementación .............................................................................................................. 41
Implementación y Puesta a punto.................................................................................. 46
4. RESULTADOS Y DISCUSIÓN............................................................................. 48
5. CONCLUSIONES, RECOMENDACIONES Y TRABAJO FUTURO ......................... 53
REFERENCIAS ......................................................................................................... 55
(Tinoco, 2016) ........................................................................................................ 55
TABLA DE IMAGENES
Imagen 1-trasmision diferencial ........................................................................................... 15
Imagen 2-DIAGRAMA DE RED RS-485 .................................................................................. 16
4
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
5
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
INDICE DE TABLAS
6
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
1. INTRODUCCIÓN
Objetivo general
– Desarrollar un algoritmo que permita comunicar e implementar un sistema de
adquisición y monitoreo de las variables físicas implícitas en un proceso industrial.
Objetivos específicos
– Diseñar los módulos
– Cuantificar todas las variables físicas implícitas en el proceso.
– Clasificar, ordenar las variables y enviar la información a una base de datos.
– Crear una base de datos interna como soporte.
7
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
8
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
2. MARCO TEÓRICO
Dada la creciente demanda de industria en obtener cada vez más información proveniente
las redes de comunicación en sistemas de automatización dispuestos en campo, se hace
necesario establecer un número de reglas y estándares con el fin de garantizar una eficiente
utilización de las arquitecturas y flujos de información, este ha sido uno de los trabajos
liderados por algunas organizaciones tales como ISO e ISA entre otras. A continuación no
solo detallaremos un poco sobre dichas organizaciones sino también en otra clase de
aportes en cuanto a arquitecturas de comunicación refiere, todo esto con el fin de estudiar
sus contribuciones a lo que hoy se conoce como comunicación inalámbrica industrial. (G.,
2011)
Modelo OSI
El modelo OSI propone una estructura muy amplia la cual es adoptada por cada red en
diferentes formas (ciertos niveles son adoptados y otros no). El estándar final fue publicado
en 1984, como ISO 7498, donde se destacan una arquitectura de 7 niveles o capas. Los
cuales suponen una comunicación entre niveles y entre locutores. El Sistema de niveles o
capas OSI busca especificar el sistema de transmisión, el método de acceso a la red y todo
lo referente a cómo realizar un intercambio de información eficiente entre dos o más
interlocutores. Para el caso del sistema a implementar con protocolo Modbus RTU donde
solo se usan 3 de los 7 niveles propuestos, como se muestra en la figura. (G., 2011)
9
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
A pesar de que el modelo OSI es muy completo, casi todos los buses de campo ofrecen
grandes problemas para poder satisfacer los niveles intermedios, del 3 al 6, dado que los
fabricantes no previeron la conexión con otros buses. Para completar el paquete de
protocolo propuesto por el modelo OSI, la sociedad para instrumentación, sistemas y
automatización, ISA, propone una serie de complementos o mejoras bajo la denominación
ISA-SP50, donde se trata de desarrollar las normas necesarias para definir las características
que deben cumplir las señales (analógicas y digitales) usadas en medidas de proceso y
control, y transmitir las información entre subsistemas o elementos separados de sistemas.
10
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Modbus RTU
11
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Modbus usa una topología Maestro-Esclavo, donde la comunicación es manejada solo por
el maestro mediante el envío y recepción de mensajes a solicitud del aplicativo. Bajo el
funcionamiento de solicitud-respuesta se ofrecen servicios especificados en los códigos de
función (método en el cual se solicitan acciones a cliente desde un servidor). Los códigos de
función MODBUS son elementos de la solicitud, claramente visibles en la trama de solicitud
y respuesta. (G., 2011)
Existen dos variantes del protocolo Modbus: ASCII y RTU; siendo este último especialmente
escogido para las aplicaciones industriales. La modalidad RTU, nace de la aplicación de esta
en comunicaciones con estaciones remotas, de allí deriva su nombre. Este modo es eficiente
en cuanto ocupa por menor tiempo el medio en trasmisión y recepción. (G., 2011)
La modalidad ASCII básicamente usa caracteres ASCII para la codificación de sus caracteres
junto caracteres espaciales para el final de trama permitiendo al dispositivo conocer con
certeza el final de esta, con esto se evita hacer vigilancia a las tramas con el uso de
temporizadores. Esta modalidad es menos eficiente que la RTU. Para esta implementación
se ha escogido la modalidad RTU, la cual ha sido ampliamente adoptada en el medio
industrial. En la actualidad existen varias formas de implementación de este protocolo (G.,
2011):
12
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
– Se encuentran una alta variedad de fabricantes que respetan las reglas en la forma
como se programa y se manejan las variables.
Las ventajas mencionadas que pertenecen a Modbus lo convierte, en una gran solución para
ser implementada en entornos industriales.
13
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
3. METODOLOGÍA
Para implementar la red de comunicación MODBUS RTU se usó una placa Raspberry como
maestro, un PLC y un analizador de redes como esclavos. Iniciando por la capa física se
emplearon pares trenzados de cable para conexiones ya que son los más económicos, para
la comunicación física se usó el estándar RS-485.
En los esclavos se implementan diferentes sensores, estos al tomar sus respectivas medidas
guardan esta información en sus registros MODBUS. Información que será leída
constantemente por el maestro logrando de esta manera centralizar la monitorización en
el dispositivo maestro tal como hacen los sistemas SCADA en entornos industriales. Es ya
tarea del maestro tomar, clasificar y procesar esta información leída de los sensores. En
este caso estos datos clasificados y procesados son y enviados a una base de datos en
Internet y otra base de datos es guardada en el procesador como soporte para los
momentos en que no esté disponible la conexión a internet, brindando así acceso remoto y
local a toda la información del estado de todo el proceso y de esta forma entregando
información valiosa para la toma de decisiones.
14
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Transmisión física
La transmisión física establece la forma en que los bits se convierten en señales apropiadas
para ser enviadas por el medio físico también distinguido como canal. Dependiendo de cuál
sea el medio, el canal tendrá ciertos dominios que hacen que haya señales que sean más o
menos fuertes a la atenuación del canal.
RS-485
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
15
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
16
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Protocolo MODBUS
En este apartado se hará una descripción del protocolo MODBUS sobre línea serie basada
en las Especificaciones que se pueden descargar de www.modbus.org.
La topología del protocolo es maestro-esclavo, pudiendo existir uno o varios esclavos que
responderán las peticiones del maestro, ya que sólo éste puede iniciar la comunicación.
Teniendo en cuenta lo anterior se puede decir que los esclavos son por analogía servidores
y el maestro actúa como cliente.
MODBUS serie tiene dos modos de funcionamiento que se detallarán posteriormente; ASCII
o RTU dependiendo del formato en que se codifique la información dentro de la trama ya
sea en ASCII o en binario. (Barastegui, Diseño y desarrollo de una red MODBUS RTU, 2017)
17
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Modelo de datos
Según su tamaño podemos clasificar en dos los tipos de datos que maneja el protocolo: bits
individuales y registros de 2 Bytes. Los bits individuales para entradas y salidas digitales y
los registros para variables que requieran mayor tamaño. En la siguiente tabla se muestran
los tipos de datos disponibles:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Modelo de direccionamiento
Las direcciones de memoria en una red MODBUS están arregladas por los tipos de datos:
18
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Como se ve en la figura poseen cuatro bloques que corresponden al tipo de datos. Todas
las direcciones están referenciadas a cero de manera que si queremos leer el elemento N
de un determinado bloque, éste será direccionado como N-1.
El esquema de las direcciones MODBUS con las direcciones reales del dispositivo es
independiente del estándar MODBUS, dependiendo totalmente del fabricante. (Barastegui,
Diseño y desarrollo de una red MODBUS RTU, 2017)
19
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Formato de la trama
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Address Field: Sirve para indicar la dirección del esclavo al que va dirigida la trama.
El rango válido va desde 0 a 247, siendo el 0 la dirección de Broadcast y quedan
reservadas las direcciones 248 a 255. Cuando el esclavo recibe una trama dirigida a
él; construye la respuesta y pone su propia dirección en este campo, para que el
maestro sepa de qué esclavo viene la respuesta.
Función Code: Indica el código de la operación que el maestro solicita al esclavo; por
ejemplo, leer un determinado registro.
Data: Lleva la información que se necesite para realizar determinada función; por
ejemplo, escribir un valor en el registro indicado.
CRC o LRC: Chequeo de redundancia cíclica o chequeo de redundancia longitudinal:
sirve para asegurarse de que la información llega sin errores.
20
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Existen 5 estados: “Idle” es el estado inicial de reposo, sólo se pueden enviar solicitudes
desde este estado y no se sale de él a no ser que se envíe una solicitud en modo broadcast
(dirigida a todos los esclavos) o unicast (dirigida a un único esclavo). Cuando se manda una
solicitud en modo broadcast se activa una espera “turnaround” y permanece en estado de
“Espera turnaround” para que los esclavos tengan tiempo de atender la solicitud antes de
volver al estado de reposo desde el cuál se podría lanzar una solicitud nueva. Si se manda
una solicitud en modo unicast se activa un temporizador y se pasa al estado “Esperando
respuesta”. De este estado se sale si: expira el temporizador; pasando al estado “Procesar
error”, o si se recibe una respuesta; deteniendo el temporizador y pasando al estado
“Procesar respuesta”. Por último tras procesar la respuesta vuelve al estado de reposo en
caso de que la respuesta fuese correcta (no se detectaron errores de paridad ni de CRC/LRC)
o pasa al estado “Procesar error” tras el cual vuelve de nuevo al estado de reposo desde el
cuál se realizaría un reintento. El número de reintentos depende de la configuración del
21
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
maestro. Los errores de trama consisten en: Comprobación de paridad de cada carácter y
comprobación de redundancia de la trama completa. (Barastegui, Diseño y desarrollo de
una red MODBUS RTU, 2017)
En este diagrama se pueden ver tres posibilidades de intercambio de información maestro / esclavo:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
El primer intercambio (el primero empezando por la izquierda) es una solicitud en modo
unicast que el esclavo 1 completa sin errores y envía la respuesta al maestro. Se pueden ver
en gris los tiempos de espera del maestro y de procesamiento de la solicitud del esclavo. El
segundo intercambio es una solicitud en modo broadcast. Se puede ver como los esclavos
una vez la reciben la ejecutan en paralelo y como el maestro permanece a la espera un
“Turnaround delay” antes de volver a enviar otra solicitud. El tercer y último intercambio es
22
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
23
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Con este precedente se da claridad acerca de cómo se envían los Bytes de información de
cada campo y es preciso enfatizar que para transmitir un Byte de información en modo RTU
se necesitan enviar 11 bits y la trama se puede observar en la siguiente figura:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
La siguiente figura muestra cómo se identifica el inicio y final de una trama; gracias a unos
intervalos de silencio de al menos 3.5 veces el tiempo que se tarda en enviar un carácter
que llamaremos a partir de ahora t3.5:
24
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Es preciso aclarar que entre dos tramas consecutivas no se suma el t3.5 de fin de una trama con el
t3.5 de inicio de la siguiente. Esto queda reflejado en la siguiente figura:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Tal como representa la siguiente figura dentro de cada trama los Bytes se tienen que
transmitir de manera continua. Si entre dos Bytes se produce un silencio de más de 1.5
veces el tiempo de carácter se considera errónea la trama y se descarta.
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
25
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
La gran desventaja del modo de transmisión ASCII estriba en que un byte de información se
codifica en dos caracteres ASCII, ocupando cada carácter ASCII 7 bits, más los bits extra que
se necesitan de alineación y paridad de forma que un carácter ASCII ocuparía en total 10
bits. Si esto se compara con el modo RTU podría interpretarse erróneamente que el modo
ASCII fuese más eficiente que el modo RTU que ocupa 11 bits por byte, nada más lejos de
la realidad puesto que ASCII necesita enviar dos caracteres para transmitir un byte de
Información, lo que hace en total 20 bits, sin embargo, en modo RTU el byte se envía con
11 bits.
26
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
El hecho de que se use el modo ASCII responde a cuestiones relacionadas con los medios
físicos y la capacidad de los dispositivos usados, de manera que no sean compatibles con
las especificaciones de los temporizadores definidos para MODBUS RTU.
A diferencia del modo RTU, en modo ASCII se permiten intervalos de hasta un segundo entre
caracteres. A no ser que el usuario haya configurado un temporizador mayor, se considerará
erróneo un intervalo de más de un segundo entre caracteres. En algunas aplicaciones de
red de área extensa se usan intervalos de entre 4 o 5 segundos.
En modo ASCII las tramas se delimitan con caracteres en lugar de silencios: el carácter de
inicio es “dos puntos” (:); en ASCII (0x3A) y los de final de trama el “retorno de carro” (CR)
y “salto de línea” (LF); en ASCII (0x0D y 0x0A).
Los caracteres permitidos en todos los campos de la trama son hexadecimales 0-9, A-F
codificados en ASCII. Los dispositivos monitorizan el bus continuamente hasta que
encuentran el carácter “:”. Entonces decodifican los caracteres siguientes hasta que
detectan el fin de trama. (Barastegui, Diseño y desarrollo de una red MODBUS RTU, 2017)
A continuación se muestra una trama MODBUS ASCII:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Esta tabla expone la misma trama enviada en cada modo y la diferencia en bits entre cada
uno de ellos:
27
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
28
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Comprobación de errores
Chequeo de paridad: Dentro de la trama, se aplica a cada byte que se transmite de manera
que el transmisor calcula para cada byte el bit de paridad y lo adjunta al mensaje. El receptor
cuando lo recibe calculará la paridad del mensaje y comprobará que coincida con el bit de
paridad que el transmisor adjuntó al mensaje. En caso contrario ignora el mensaje. El
esclavo no responderá al maestro y el temporizador del maestro expirará.
Este tipo de verificación sólo es eficaz en caso de que el número de bits erróneos sea impar
ya que si fuese par no cambiaría la paridad del mensaje.
Si el modo seleccionado es el de no paridad, no se comprueba, lógicamente, y se sustituye
dicho bit por otro bit de stop. (Barastegui, Diseño y desarrollo de una red MODBUS RTU,
2017)
Chequeo de CRC / LRC: Se aplica a la trama completa. Es un algoritmo que aplicado por el
transmisor a la trama (sin incluir delimitadores) da como resultado un campo de dos bytes
que se incluye en la trama antes de enviarla, de esta manera el receptor aplica el mismo
algoritmo y comprueba si el resultado coincide con el campo de CRC / LRC que el transmisor
incluyó en la trama. En caso contrario se ignora el mensaje. El esclavo no respondería al
maestro y es el maestro el que tomará la decisión oportuna cuando expire su temporizador.
(Barastegui, Diseño y desarrollo de una red MODBUS RTU, 2017)
Códigos de función
Ya que el campo de código de función mide un byte y el bit de mayor peso se usa para que
el esclavo indique si ha habido error; devolviendo el mismo código que se le solicitó con el
bit de mayor peso a “1” y un byte en el campo de datos indicando el código de error que ha
tenido lugar, quedan disponibles 127 códigos de función. Cada código de función se
29
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
corresponde con una operación diferente. (Barastegui, Diseño y desarrollo de una red
MODBUS RTU, 2017)
Existen tres categorías de códigos de función:
– Definidos por el usuario: Son implementaciones específicas que un usuario crea para
su aplicación y que no está soportada por el estándar.
– Reservados: Algunas compañías tienen funciones reservadas para sus productos que
no son accesibles públicamente.
Según el tipo de operación que se desea realizar sobre el esclavo se distinguen dos tipos:
– Lectura / escritura: Sirven para consultar o escribir datos en la memoria del esclavo.
– Control: Permiten realizar algunas acciones sobre el esclavo. Por ejemplo, ponerlo
en modo de sólo escucha.
La siguiente tabla muestra las funciones más usadas:
TABLA 5-FUNCIONES MODBUS MÁS USADAS.
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
30
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
A continuación se van a describir las funciones a través de ejemplos que hagan más clara la
explicación. Las funciones de lectura se pueden agrupar dos a dos ya que son
completamente equivalentes, la única diferencia estriba en el tipo de dato leído; uno se
puede también escribir y otro no, pero el tamaño es el mismo. (Barastegui, Diseño y
desarrollo de una red MODBUS RTU, 2017)
Estas dos funciones sirven para que el maestro pueda consultar el estado de una cantidad,
que se pasa como dato en la trama, determinada de coils o entradas contiguas en el esclavo.
Pongamos como ejemplo la siguiente trama codificada en hexadecimal para ahorrar
espacio, donde el maestro consulta el estado de los 10 primeros coils del esclavo con
dirección 16:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
31
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
En la respuesta se envía el código del esclavo para que el maestro sepa de quién es la
respuesta y el mismo código de función. Si hubiese ocurrido algún error el código de función
sería 0x81, esto es, 0x01 + 0x80 ya que 0x80=10000000b, que como se dijo, poner el MSB a
“1” es la forma de indicar que ha habido un error.
En el campo bytes de respuesta se indica la cantidad de bytes que se han leído; si el número
de bits solicitados no es múltiplo de 8 sobrarán bits que se rellenarán con ceros hacia el
MSB. Esto se entiende mejor a través del ejemplo: en nuestro caso se pidieron 10 bits,
vamos a suponer que el estado de esas diez entradas es “1”, los dos bytes tomarían los
valores hexadecimales 0xFF03, que en binario serían:
11111111 00000011
Se han marcado en negrita los bits que se corresponden con el estado de las entradas,
quedando los ceros de relleno para completar el segundo byte. (Barastegui, Diseño y
desarrollo de una red MODBUS RTU, 2017)
Estas dos funciones son totalmente análogas a las anteriores pero en lugar de leer entradas
de un bit, leen registros de dos bytes. Un ejemplo:
32
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
En este caso la dirección de inicio indicada es la misma que en el caso anterior, y al ser
diferente el tipo de dato que queremos leer podría parecer erróneo el hecho de que
hagamos referencia a la misma dirección de memoria para intentar leer datos diferentes.
Esto no es así porque el código de función lleva implícita la información que el dispositivo
necesita para conocer a qué tipo de dato nos estamos refiriendo y como se puede ver en la
Figura 3; para cada tipo de dato hay un rango de direcciones aunque todas empiezan en
cero.
La respuesta del esclavo es evidente por analogía con la función explicada anteriormente.
(Barastegui, Diseño y desarrollo de una red MODBUS RTU, 2017)
Esta función se usa para modificar el estado de una salida tipo coil. Se pasa la dirección que se quiere
modificar, seguida del estado: 0x0000 para “0” y 0xFF00h para “1”. Por ejemplo:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
33
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Como ya se ha explicado en el apartado anterior se usa la misma dirección para el coil (el
primero), no queriendo decir esto que ocupe la misma dirección de memoria que los datos
leídos con las funciones anteriormente descritas, ya que estamos haciendo referencia al
bloque de memoria de los coils.
La respuesta del esclavo sería un eco de la solicitud, esto es, idéntica si se ha escrito sin
errores para confirmar esclavo, dirección y valor escrito. En caso de error se suma 0x80 al
código de función, como ya se explicó anteriormente, resultando el código de la respuesta
0x85. (Barastegui, Diseño y desarrollo de una red MODBUS RTU, 2017)
Esta función es análoga a la anterior pero en lugar de escribir un bit escribe un registro, es
decir, 2 bytes. Un posible ejemplo:
Fuente: http://bibing.us.es/proyectos/abreproy/91400/fichero/Memoria+TFG+JJRB.pdf
La respuesta del esclavo en caso de que todo haya ido bien sería un eco de la solicitud igual
que en el caso anterior.
Raspberry
Raspberry PI es una placa computadora (SBC) de bajo coste, se podría decir que es un
ordenador de tamaño reducido, del orden de una tarjeta de crédito, desarrollado en el
Reino Unido por la Fundación Raspberry PI (Universidad de Cambridge) en 2011, con el
34
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: https://histinf.blogs.upv.es/2013/12/18/raspberry-pi/
35
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: https://histinf.blogs.upv.es/2013/12/18/raspberry-pi/
36
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Se implementó este Conversor por que no necesita de fuente externa y con conexión
directa a un puerto USB, compatible con USB 2.0 y 1.1 y también porque tanto el PLC como
el analizador de redes cuentan con puertos RS-485 y la Raspberry con puertos USB
facilitando así el emparejamiento de estos componentes, este conversor contiene las
siguientes especificaciones:
– No necesita energía externa, accionado por el puerto USB
– Totalmente compatible con los estándares USB 2.0 y USB 1.1
– Sistema Operativo: Windows XP, Vista, Windows 7, Linux, MacOS, y unidad
WinCE5.0
– Soporta rata de baudios rango: 75 - 115200 bps, hasta 6Mbps
– Plug, Play y hot-swap (USB-side);
– Comunicación a distancia hasta de 1.2Km, con baja interferencia.
– Rango de temperatura de trabajo: -40 ° C ~ + 85 ° C
Fuente: https://www.didacticaselectronicas.com/index.php/comunicaciones/conversores/usb-
rs232-rs485/conversor-usb-a-rs-485-detail
37
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Se implementó este dispositivo porque es ideal para medir y monitorear todos los
parámetros eléctricos de un sistema. Por medio de sus cuatro filas de visualización, todos
los parámetros son leídos fácilmente desde la pantalla principal. El dispositivo es aplicable
para sistemas mono, bifásicos y trifásicos. Puede medir y mostrar 123 parámetros
eléctricos y cuenta con RS 485 para la comunicación a través del protocolo Modbus.
Fuente: propia
PLC XINJE:
Se implementó este PLC porque posee Capacidad de programa: 8000 Pasos tiene 18
entradas
Con tipo de entrada: Contacto libre de voltaje o NPN, voltaje Señal de entrada: 24VDC +/-
10 %
Y un número de 14 salidas también, tiene salidas tipo Relé 3A 250V AC / 30VDC, carga
resistiva y 80VA de carga Inductiva también cuenta con máximos Puntos de Entrada y Salida:
38
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: propia
En la Raspberry se instaló un sistema operativo Rasbian el cual no es más que una derivación
de LINUX para Raspberry esta viene con el lenguaje de programación Python instalado y con
sus librerías estándar, pero para este desarrollo necesitaremos instalar una librería externa
llamada PyModBus para facilitar la comunicación por medio del protocolo MODBUS y otra
llamada PyMongo para el manejo y envió de los datos una base de datos no relacional
llamada MongoDB.
Para esto solo se necesita abrir la terminal del sistema y escribir, para MoDbus lo siguiente:
39
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Debido a que la Raspberry es la encargada de procesar y enviar los datos, esta fue usada
como maestro, y tanto el PLC como el analizador de redes fueron usados como esclavos.
El PLC fue el encargado de tomar toda la información de un proceso de clasificación a este
se le fue otorgada la dirección de esclavo 2 para atreves de esta poder acceder a sus
registros. Se trabajó sobre un proceso de selección y clasificación de piezas metálicas en el
cual se crearon las siguientes variables:
– contador_de_Piezas: Esta era la encargada del conteo de cada pieza que entraba en
el proceso sea metálica o no y se le asignó el registro 49281.
– Piezas Desechadas: Esta se encargaba de contar el número de piezas que no
cumplían los estándares en este caso ser metálica y se le asignó el registro 49282.
– piezas_Metelicas: Este tomaba medida de todas las piezas aceptas como metálicas
y se le asignó el registro 49283.
– Interrupciones: Variable que contaba el número de veces que el proceso sufría una
interrupción se le asignó el registro 49285.
– tiempo_de_motores: Variable en donde se tenía una medida de tiempo de
funcionamiento de los motores se le asignó el registro 50369.
– velocidad_de_banda: Esta variable era la encargada de medir la velocidad a la que
trabajaba la banda trasportadora del proceso se le asignó el registro 50378.
– Tiempo_de_matenimiento: En esta variable se acumulaba la cantidad de tiempo en
ejecución de trabajo para tener un estándar en relación a cada cantidad de tiempo
se debe hacer un mantenimiento y se le asignó el registro 50428.
40
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Implementación
41
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Se empezó creando una función que tomara los datos del PLC y retornara su valor llamada
Read_Registers_plc, esta función llama otra función de la biblioteca pymodbus llamada
ModbusClient en la cual se define el método, el puerto, los baudios y el tiempo de espera,
y también se usa el método connect para conectar el sistema, luego se usa el método
read_holding_registers el cual es el encargado de leer los registros por lo tanto en primer
lugar se le debe ingresar la dirección del registro, en segundo lugar se le indica si el dato
está fraccionado en dos bits o solo en uno y por último se le indica a cual esclavo debe
ingresar posteriormente se guarda en la variable en la posición 1 que en Python siempre es
la numero 0 y finalmente todas las variables son guardadas en una lista llamada lecturas
para ser retornadas cuando se haga uso de la función Read_Registers_plc.
En este no sé tuvo mayores complicaciones porque al poder decidir qué tipo de dato
entregar desde el plc, se facilitó el proceso enviando el valor como entero directamente
como lo podemos ver a continuación:
Fuente: propia
42
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Para la lectura de los registros del analizador se tuvo que implementar una función auxiliar
que tomara los valores encontrados y los pasara de binarios a flotantes ya que los
analizadores no entregaban estos datos de manera flotante si no de manera binaria y en
dos particiones, para solucionar este problema se desarrolló una función llamada
convertirFloat a la cual se le entregaba como parámetro un numero binario y esta lo
guardaba en una variable llamada f que convertía en entero partido en 2, luego se creó la
variable dato la cual hacia uso de la biblioteca struct y su método unpack al cual en primer
lugar se le indica que tipo de dato debe retornar , en segundo lugar se usa el método pack
que en su primer parámetro se le indica que integre y en el segundo se le pasa el valor a
Integrar el cual es f, para el final ser guardado en la posición 0 y por último se retorna la
variable dato, a continuación se podrá ver la forma en que este problema fue resuelto:
Fuente: propia
43
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
format donde se hace de igual manera solo cambiando el primer parámetro por LB que es
el bit menos representativo y luego en una variable se usa la función convertirFloat
pasándole como parámetro la variable binario y por último se guarda en una lista todas las
variables requeridas a este dispositivo para retornar sus valores como podemos ver a
continuación:
Fuente: propia
Fuente: propia
Y por último se crea una función para que se encargue de gestionar el envió de los datos a
la base de datos no relacional Mongodb, a esta se le entrega como parámetro la
información procesada previamente en una estructura de diccionario, esta función en
primera instancia abre la base de datos usando la función pymongo.MongoClient de la
librería pymongo, a pymongo.MongoClient se le pasa como parámetro el cliente de la base
de datos luego se crea la variable db y se igual al cliente y por último se crea el post y el id
como se puede apreciar en la siguiente imagen:
44
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: propia
Después de crear las funciones necesarias para las lecturas de los registros, se procede a
crear un algoritmo que se ejecute en el mismo instante que se le dé inicio al proceso de
selección piezas metálicas y que inmediatamente comience a tomar estos registros, los
guarde en una lista y luego los convierta en un diccionario para ser enviados a una base de
datos en internet y otra base de datos interna, que no es más que un archivo .csv. A
continuación, se presenta un diagrama de flujo que explica el funcionamiento del código
encargado de leer, procesar, clasificar y enviar la información a una base de datos no
relacional en red y de igual manera a una base de datos local:
Fuente: propia
45
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: propia
46
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: propia
47
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
4. RESULTADOS Y DISCUSIÓN
Fuente: propia
48
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: propia
Fuente: propia
49
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Con los datos de voltaje y corriente se crearon también las gráficas de consumo total de
energía un gráfico de torta y consumo de energía por día en todo el pabellón azul un gráfico
de barras:
50
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
Fuente: propia
También se creó un informe del proceso en tiempo real donde podías ver todas las variables
implicadas en el proceso tales como voltaje, corriente, consumo, piezas aceptadas, numero
de mantenimientos, interrupciones y número de piezas en el proceso de la siguiente forma:
51
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
IMAGEN 37-INFORME.
DIAGRAMAS DE VOLTAJE Y CORRIENTE VS TIEMPO DE L1, L2 DONDE L SIMBOLIZA LA LÍNEA DE FASE, EN EL EJE X
TIEMPO Y EN EL EJE Y VOLTAJE Y CORRIENTE, CON UN DIAGRAMA DE TORTA DONDE SE MUESTRA EN PORCENTAJES
LAS PIEZAS ACEPTADAS, METÁLICAS Y OPACAS Y CON UN PANEL DONDE SE PUEDE VISUALIZAR EL NÚMERO DE
Fuente: propia
Esta parte es el plus de este trabajo ya que como muestra la imagen se puede ver toda
información acerca del proceso, se tiene acceso a información de consumo energético por
pieza permitiendo también saber el costo energético de cada pieza y de esta manera, no
solo saber el costo de material y mano de obra si no también el costo energético además
se puede saber el estado de la producción permitiendo a un gerente o encargado tomar
decisiones con base a toda la información tomada del proceso.
52
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
5. CONCLUSIONES, RECOMENDACIONES Y
TRABAJO FUTURO
En este proyecto se creó e implemento una red MODBUS RTU maestro-esclavos. Para esto
se buscaron los dispositivos comerciales más adecuados para su integración en el proyecto;
se eligió la tarjeta de desarrollo Raspberry con un conversor USB a RS-485 para la facilitación
en la conexión con un PLC y una analizador de redes, tras desarrollar todos los módulos e
instalar todas las librerías a nivel software, conectarlos a nivel hardware, se ha logrado la
comunicación entre el maestro y los esclavos por lo que podemos dar por exitosos los
objetivos de este trabajo.
54
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
REFERENCIAS
(Tinoco, 2016)
(s.f.). Obtenido de https://histinf.blogs.upv.es/2013/12/18/raspberry-pi/
Barastegui, J. J. (2017). Diseño y desarrollo de una red MODBUS RTU. Sevilla: Escuela Técnica Superior
de Ingeniería.
G., R. D. (2011). Implementación de una red Modbus RTU. Cartagena: UNIVERSIDAD TECNOLÓGICA DE
BOLÍVAR.
Leonardo Barrera D., C. C. (2016). Sistema domótico básico utilizando la tarjeta Raspberry pi. Bogota:
Universidad Distrital Francisco José de Caldas.
Ramírez, L. I. (2018). Análisis, diseño e implementación de una plataforma triada integrada por
Raspberry Pi, Arduino y dispositivos móviles con conectividad en red local, para la enseñanza de
las ciencias naturales: estudio de caso en Física. Medellin: Univercidad Nacional De Colombia .
Tinoco, M. H. (2016). Desarrollo e implementación de una red de datos basada en Modbus y Ethernet
para autómatas industriales. Sevilla: Universidad de Sevilla.
55
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
56
Código FDE 089
INFORME FINAL DE Versión 03
TRABAJO DE GRADO
Fecha 2015-01-22
FIRMA ESTUDIANTES
FIRMA ASESOR
ACTA NO._____________
ACTA NO._____________
57