Modbus
por aprendiendoarduino | 24 julio, 2016 0 comentarios
RS485
RS-485 Es un estándar de comunicaciones en bus de la capa física del Modelo OSI. Está definido como
un sistema de bus diferencial multipunto, es ideal para transmitir a altas velocidades sobre largas
distancias (35 Mbit/s hasta 10 metros y 100 kbit/s en 1200 metros) y a través de canales ruidosos, ya
que el par trenzado reduce los ruidos que se inducen en la línea de transmisión. El medio físico de
transmisión es un par trenzado que admite 32, 128 o 254 estaciones en 1 solo par, con una longitud
máxima de 1200 metros operando entre 300 y 19200 bit/s y la comunicación half-duplex (semiduplex)
dependiendo del consumo de cada driver. La transmisión diferencial permite alcanzar mayor distancia
con una notable inmunidad al ruido, siempre que el bus de comunicación conserve las características de
bus balanceado dando la posibilidad de una configuración multipunto.
◾ https://es.wikipedia.org/wiki/RS-485
◾ https://en.wikipedia.org/wiki/RS-485
◾ http://www.lammertbies.nl/comm/info/RS-485.html
◾ Protocolo RS485: http://www.i-micro.com/pdf/articulos/rs-485.pdf
◾ Especificaciones RS485: http://www.rs485.com/rs485spec.html
Conectar Arduino a un bus de campo consiste en conectar al bus mediante un adaptador un transceiver
adecuado para el bus de campo que convierte el stream de datos de la UART al bus conectado
haciendo de pasarela entre los diferentes niveles de tensión, intensidad e impedancia. Estos
transceivers incluyen filtros y condensadores para adaptar adaptar y mejorar la señal.
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 2 de 20
Datasheet: https://www.sparkfun.com/datasheets/Components/General/sp3485CN-LTR.pdf
◾ MAX485:
◾ https://www.maximintegrated.com/en/products/interface/transceivers/MAX485.html
◾ datasheet: http://datasheets.maximintegrated.com/en/ds/MAX1487-MAX491.pdf
◾ SN75176BP:
◾ datsheet: http://www.ti.com.cn/cn/lit/ds/symlink/sn75176b.pdf
◾ https://www.sparkfun.com/products/12965
◾ http://www.dfrobot.com/wiki/index.php/RS485_Shield
◾ http://store.linksprite.com/rs485-shield-for-arduino-v2-1/
◾ https://www.sparkfun.com/products/retired/12826
◾ https://www.sparkfun.com/products/13706
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 3 de 20
También es posible conectarse a un bus modbus con un ordenador mediante USB y con un conversor
de USB a RS485. También es posible con este módulo controlar varios Arduino conectados a un bus
modbus.
Cable conversor:
http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_USB_RS485_CABLES.pdf
Ejemplo de uso:
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 4 de 20
◾ http://www.equitel.es/datos/Documentos/NotasAplicacion/RS485_NA_es_v3.pdf
◾ https://www.expertdaq.es/info/rs422-rs485-bus/
◾ http://www.alciro.org/alciro/RS-485_16/Terminacion-lineas_130.htm
Ejemplo de uso de bus de campo sobre una red RS-485 (bus serie) para comunicar con una sonda
HygroClip 2 (HC2) Probe with AirChip 3000: https://github.com/jecrespo/AirChip_3000
Protocolo Modbus
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 5 de 20
dispositivos electrónicos industriales. Las razones por las cuales el uso de Modbus es superior a otros
protocolos de comunicaciones es:
1. Es público
2. Su implementación es fácil y requiere poco desarrollo
3. Maneja bloques de datos sin suponer restricciones
Modbus permite el control de una red de dispositivos, por ejemplo un sistema de medida de
temperatura y humedad, y comunicar los resultados a un ordenador. Modbus también se usa para la
conexión de un ordenador de supervisión con una unidad remota (RTU) en sistemas de supervisión
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 6 de 20
adquisición de datos (SCADA). Existen versiones del protocolo Modbus para puerto serie y Ethernet
(Modbus/TCP).
Existen dos variantes, con diferentes representaciones numéricas de los datos y detalles del protocolo
ligeramente desiguales. Modbus RTU es una representación binaria compacta de los datos. Modbus
ASCII es una representación legible del protocolo pero menos eficiente. Ambas implementaciones del
protocolo son serie. El formato RTU finaliza la trama con una suma de control de redundancia cíclica
(CRC), mientras que el formato ASCII utiliza una suma de control de redundancia longitudinal (LRC). La
versión Modbus/TCP es muy semejante al formato RTU, pero estableciendo la transmisión mediante
paquetes TCP/IP (puerto del sistema 502, identificador asa-appl-proto).
Modbus/ASCII y Modbus/RTU:
Modbus/ASCII Modbus/RTU
Error check LRC Longitudinal Redundancy Check CRC Cyclic Redundancy Check
Start bit 1 1
Data bits 7 8
Stop bits 1 2 1 2
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 7 de 20
Más información:
◾ http://www.rtaautomation.com/technologies/modbus-rtu/
◾ http://bentz5.blogspot.com.es/2015/10/protocolo-modbus.html
Modbus Plus (Modbus+ o MB+), es una versión extendida del protocolo y privativa de Modicon. Dada la
naturaleza de la red precisa un coprocesador dedicado para el control de la misma. Con una velocidad
de 1 Mbit/s en un par trenzado sus especificaciones son muy semejantes al estándar EIA/RS-485
aunque no guarda compatibilidad con este.
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 8 de 20
Trama Modbus
La trama Modbus se transmite igual que si fuera por un puerto serie con sus características.
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 9 de 20
Dirección (1byte): En el caso de las tramas enviadas por el máster, el campo de número de esclavo
indica la dirección del destinatario de esta trama. Permite direccionar hasta 247 esclavos, con las
direcciones de 1 a 247 (0x00 a 0xF7). El 0x00 es para los mensajes de Broadcast, así el primer esclavo
comienza con la dirección 1 ( de 1 a 247 ). En el caso de las tramas enviadas por los esclavos, este byte
sirve para indicar al máster a quién pertenece la respuesta. Es decir, cada vez que un esclavo responde,
sitúa su propia dirección en el byte de dirección lo que permite saber al maestro a que equipo
corresponde cada respuesta. Las tramas broadcast, no tienen asociada respuesta, y algunas
implementaciones de MODBUS no admiten la trama de broadcast.
Cada dispositivo de la red Modbus posee una dirección única. Cualquier dispositivo puede enviar
órdenes Modbus, aunque lo habitual es permitirlo sólo a un dispositivo maestro. Cada comando
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 10 de 20
Modbus contiene la dirección del dispositivo destinatario de la orden. Todos los dispositivos reciben la
trama pero sólo el destinatario la ejecuta (salvo un modo especial denominado “Broadcast”). Cada uno
de los mensajes incluye información redundante que asegura su integridad en la recepción. Los
comandos básicos Modbus permiten controlar un dispositivo RTU para modificar el valor de alguno de
sus registros o bien solicitar el contenido de dichos registros.
Código de Operación o Función (1 byte): Indica el tipo de operación que queremos realizar sobre el
esclavo. Las operaciones se pueden clasificar en dos tipos:
◾ De lectura / escritura en memoria: para consultar o modificar el estado de los registros del mapa
de memoria del esclavo.
◾ Órdenes de control del esclavo: para realizar alguna actuación sobre el esclavo.
El código de operación puede tomar cualquier valor comprendido entre el 0 y el 127 ( el bit de más
peso se reserva para indicar error). Cada código se corresponde con una determinada operación.
Algunos de estos códigos se consideran estándar y son aceptados e interpretados por igual por todos
los dispositivos que dicen ser compatibles con MODBUS, mientras que otros códigos son
implementaciones propias de cada fabricante. Es decir que algunos fabricantes realizan
implementaciones propias de estos códigos “no estándar”.
Funciones Modbus:
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 11 de 20
Dirección, datos y subfunciones (n bytes): Este campo contiene la información necesaria para realizar
la operación indicada en el código de operación. Cada operación necesitará de unos parámetros u
otros, por lo que el número de bytes de este campo variará según la operación a realizar. En el caso del
esclavo, este puede responder con tramas con o sin campo de datos dependiendo de la operación. En
los casos en que se produzca algún error es posible que el esclavo responda con un byte extra para
especificar el código de error.
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 12 de 20
◾ El Holding Register 40001 se accedería situando el valor 0000 en el campo de dirección del
mensaje. Como se puede ver el código de función de acceso a los Holding Registers lleva
implícito el acceso a la dirección ‘4XXXX’.
◾ El Holding Register 40108 es accedido leyendo de la dirección 0x006B ( 107d )
◾ @1-10000 (DOs – digital outputs): 1 bit por dirección para indicar el estado de una salida, mando
o relé ( 0 desactivado, 1 activado ). Las direcciones de este rango se suelen acceder mediante las
funciones 1 (lectura), 5 (escritura), 15 (escritura múltiple).
◾ @10001-20000 (DIs – digital inputs): 1 bit por dirección para leer el estado de una entrada digital
( 0 desactivada, 1 activada ) también denominadas DIs ( Digital Inputs ). Las direcciones de este
rango se suelen acceder con la función 2 (lectura) y llevan implícita la dirección 10001 como
dirección base ( para acceder a una dirección bastará con especificar la distancia entre esta y la
dirección base ).
◾ @20001-30000: el protocolo MODBUS estándar no hace uso de este rango de direcciones.
◾ @30001-40000 (AIs – analog inputs): 16 bits por dirección con el estado de las medidas o
entradas analógicas también denominadas AIs ( Analog Inputs ). Dependiendo del dispositivo
este puede hacer uso de más de un registro para almacenar la información de la medida, así con 2
registros consecutivos podríamos almacenar medidas de 32 bits. Las direcciones de este rango se
acceden mediante la función 4 (lectura) y llevan implícita la dirección 30001 como dirección base
( para acceder a una dirección bastará con especificar la distancia entre esta y la dirección base ).
◾ @40001-50000 (AOs – analog outputs): 16 bits con los registros de salidas analógicas o de
propósito general ( Output Registers – Holding Registers). Se acceden con las funciones 3
( lectura ), 6 ( escritura ) o 16 ( escritura múltiple ) y llevan implícita la dirección 40001 como
dirección base ( para acceder a una dirección bastará con especificar la distancia entre esta y la
dirección base ).
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 13 de 20
06 SLAVE DEVICE El esclavo está ocupado realizando otra tarea y no puede atender a esa
BUSY petición en ese instante por lo que el máster tendrá que reintentarlo más
adelante.
Control de errores LRC o CRC: Se utiliza un sistema de detección de errores diferente dependiendo
del tipo de codificación utilizado ( ASCII o RTU ) . En el caso de la codificación ASCII es el checksum ( o
Longitud Redundancy Check LRC ) en módulo 16 expresado en ASCII ( 2 caracteres representan 1
byte ), sin considerar el “:” ni el “CR LF” de la trama. En la codificación RTU se utiliza el método de CRC
( Cyclical Redundancy Check ) codificado en 2 bytes (16 bits).
Para calcular el CRC se carga un registro de 16 bits todo con ‘1’s, se hace OR con cada uno de los
caracteres de 8 bits con el contenido de cada byte y el resultado se desplaza una bit a la izquierda
insertando un 0 en la posición de menor peso ( la de la derecha ). El de la izquierda se extrae y se
examina: si es 1 se vuelve a hacer OR con un valor prefijado, si es 0 no se hace ninguna OR… y el
proceso se repite hasta que se han hecho los 8 shifts del byte.
Cálculo CRC:
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 14 de 20
CRC:
◾ https://es.wikipedia.org/wiki/Verificaci%C3%B3n_por_redundancia_c%C3%ADclica
◾ https://en.wikipedia.org/wiki/Cyclic_redundancy_check
◾ http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html
◾ https://github.com/FrankBoesing/FastCRC
◾ https://github.com/vinmenn/Crc16
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 15 de 20
◾ https://en.wikipedia.org/wiki/Modbus
◾ http://modbus.org/
◾ Especificaciones modbus: http://www.modbus.org/specs.php
◾ Modbus RTU:http://www.rtaautomation.com/technologies/modbus-rtu/
◾ Modbus FAQ: http://www.simplymodbus.ca/FAQ.htm
◾ Modbus 101: http://www.csimn.com/CSI_pages/Modbus101.html
◾ Protocolo modbus: http://www.axongroup.com.co/protocolo_modbus.php
◾ http://www.tolaemon.com/docs/modbus.htm
◾ http://bentz5.blogspot.com.es/2015/10/protocolo-modbus.html
◾ http://www.kryoningenieria.com/modbus/
◾ Tutorial http://www.protoconvert.com/TechnicalResourses/Tutorials/Modbus.aspx
◾ Entender modbus: http://jamod.sourceforge.net/kbase/protocol.html
◾ Ejemplo de uso Modbus https://rua.ua.es/dspace/bitstream/10045/18990/1/AA-p3.pdf
Modbus reference:
◾ http://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf
◾ http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf
◾ http://www.modbus.org/docs/PI_MBUS_300.pdf
Es importante conocer el protocolo modbus, pero implementarlo en Arduino puede ser una tarea
compleja. Sin embargo, hay disponibles diversas librerías que implementa el protocolo y su uso es
generalmente sencillo.
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 16 de 20
A la hora de implementar por SW el protocolo Modbus, habrá una implementación para el master y
otra para el slave diferentes, puesto que el comportamiento en un caso y en otro es distinto.
Existen diversas librerías que implementan modbus en Arduino, tanto para maestro como esclavo y
para RTU, ASCII y TCP. Algunas son más sencillas y solo implementan unas pocas funciones y otras más
complejas y pesadas, en función de nuestro objetivo habrá que elegir una u otra.
◾ Simple-modbus: https://github.com/jecrespo/simple-modbus
◾ Version original de simple modbus: https://code.google.com/archive/p/simple-modbus/
◾ Otra versión: https://github.com/iyus/simple-modbus
◾ simplemodbusng: https://github.com/angeloc/simplemodbusng
◾ ModbusMaster: https://github.com/4-20ma/ModbusMaster
◾ ModbusXT: https://github.com/caddish12/ModbusXT
◾ ArduinoModbusSlave: https://github.com/yaacov/ArduinoModbusSlave
◾ Modbus master – slave for Arduino: https://github.com/smarmengol/Modbus-Master-Slave-for-
Arduino
◾ libmodbus: https://github.com/stephane/libmodbus
◾ Documentación: http://libmodbus.org/
◾ modbus-arduino: https://github.com/andresarmento/modbus-arduino
◾ modbusino: https://github.com/stephane/modbusino
◾ Modbus RTU/ASCII slave para PIC: http://www.opensourcepic.com/modbus.php
Más documentación:
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 17 de 20
Interesante web con drivers y librerías modbus para todo tipo de lenguajes y también herramientas:
http://www.modbusdriver.com/
El primer paso es usar transceiver RS-485 para Arduino que convierta los niveles de señal de RS-485 a
los de Arduino, para ello se puede usar un shield como:
Al Final todos los shields simplemente usan un max485 para convertir la capa física del RS485 a nivel
TTL (0-5V):
◾ MAX485: https://www.maximintegrated.com/en/products/interface/transceivers/MAX485.html
◾ Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX1487-MAX491.pdf
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 18 de 20
El segundo paso es implementar el protocolo modbus RTU en Arduino, para ello hay varias librerías
como las vistas anteriormente o implementarlo directamente programando.
Supongamos el caso de querer usar un Arduino como un esclavo modbus controlado mediante un HMI
que hace de maestro y el Arduino recibe los request del HMI. Algo similar a ejemplo:
https://www.youtube.com/watch?v=bfZh8oy-SXs
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 19 de 20
Esta librería es muy sencilla, ocupa muy poco e implementa modbus RTU slave:
https://github.com/jecrespo/simple-modbus/tree/master/Modbus%20RTU%20libraries%20for%
20Arduino/SimpleModbusSlaveV10
◾ Función 01 (01 hex): Lectura de señales discretas de salida (Discrete Output Coils)
◾ Función 02 (02 hex): Lectura de señales discretas de entradas (Discrete Input Contacts)
◾ Función 03 (03 hex): Lectura de registros analógicos (Analog Output Holding Registers)
◾ Función 04 (04 hex): Lectura de registros analógicos de entrada (Analog Input Registers)
◾ Función 05 (05 hex): Escritura de una señal discreta de salida (Simple Discrete Output Coil)
◾ Función 15 (0F hex): Escritura de múltiples señales discretas de salida (Múltiple Discrete Output
Coils)
◾ Función 06 (06 hex): Escritura de un Simple Analog Output Holding Register
◾ Función 16 (10 hex): Escritura Múltiple Analog Output Holding Registers
Para el cálculo del CRC se utilizan cada uno de los bytes que conforman la trama. El procedimiento es el
siguiente:
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018
Modbus – Curso Arduino Teinnova 2016 Página 20 de 20
Una vez recibido el mensaje hay que devolver el mensaje a HMI para finalizar la acción, en este caso la
respuesta es la misma que la recibida.
Para este caso se usó un Arduino Mega que tiene 4 puertos serie y el segundo se usó para conectar al
RS-485 shield.
◾ http://arduino-experience.blogspot.com.es/2016/01/rs-485-implementation-on-arduino.html
◾ http://arduino-experience.blogspot.com.es/2014/02/modbus-slave-example.html
◾ http://electronics.stackexchange.com/questions/49097/arduino-as-modbus-master-with-
max485-doesnt-get-any-response
Categoría: Arduino Comunicaciones Librerías modbus RS485 Etiquetas: Arduino , Buses de Campo ,
Comunicación , Librerías , Modbus , RS485 , RTU
http://teinnova.aprendiendoarduino.com/2016/07/24/modbus/ 16/03/2018