Introducción
En este post, verás cómo es el protocolo RS-485, la relación maestro-esclavo y profundizarás en cómo configurar esta comunicación de la mejor manera posible.
RS-485
Este protocolo es común en los sistemas de control industrial y en este tipo de aplicaciones. Se utiliza en PLCs (Controladores Lógicos Programables) y en fábricas entre otras aplicaciones. Se aplica como la capa física que subyace a muchos protocolos de automatización estándar y patentados que se utilizan para implementar sistemas de control industrial como el Modbus.
Comunicación por MODBUS RTU a través de una interfaz serie RS485 (módulo Seneca Z-D-in).
RS485 Guía sobre incidencias
Leer publicación >>>
Maestro-Esclavo
Normalmente, cuando hablamos de una red maestro-esclavo, el dispositivo maestro inicia toda la actividad de comunicación. Hay muchas comunicaciones diferentes pero, en esta, el maestro está típicamente ubicado en el centro a lo largo del conjunto de cables RS-485 y dos esclavos están ubicados en el extremo físico de los cables, haciendo las terminaciones.
Hay tres tipos de relaciones entre el maestro y el esclavo desde el punto de vista de la Tx y Rx (Transmisor y Receptor); el Simplex, el Full Duplex y el Half Duplex..
El Simplex es un tipo de transmisión unidireccional en el que el Rx no puede responder al Rx.
El Half Duplex permite la transmisión en ambas direcciones. Aunque Tx y Rx comparten la misma frecuencia, Tx sólo puede ocurrir de manera simultánea.
El Full Duplex permite la transmisión en ambas direcciones y para el mismo canal de forma simultánea, utilizando dos frecuencias diferentes; una para Tx y otra para Rx.
Configuración
Para explicar la configuración del RS-485, tomaremos un ejemplo: el Sinamics V20 Converter de Siemens.
Un PLC maestro puede conectar un máximo de 31 convertidores (esclavos) a través de una interfaz serie y controlarlos con el protocolo de bus serie USS. Un esclavo no puede transmitir si no ha sido iniciado por el maestro antes, por lo que la transmisión directa de información entre los diferentes esclavos no es posible.
En el caso de la comunicación Half-Duplex, los mensajes se envían siempre en el mismo formato:
Y, en la configuración de Arduino IDE para Serial, puedes ver que tienes que seguir la siguiente Sintaxis y Parámetros (la configuración tiene que ser establecida en la sección de configuración y puedes inicializar tantos puertos seriales como tenga su dispositivo de trabajo):
Si se juntan ambas imágenes, en primer lugar, puedes ver que hay que establecer la velocidad de baudios, que es la velocidad de comunicación del puerto, y tiene que ser la misma en el Tx y Rx si tienen que comunicarse a través del mismo canal de frecuencia. Después de eso, tienes que establecer los parámetros de configuración:
8 bits de datos: aquí tienes que establecer con cuántos bits de datos tienes que trabajar.
1 Bit de Paridad: aquí tienes que escribir e (para par), o (para impar) o n (para nada). Es importante establecer esto correctamente porque el bit de paridad es un bit binario que indica si el número de bits con el valor 1 en un grupo de bits es par, impar o ninguno. Este es un importante método de detección de errores (compara los 1 con el bit de paridad para comprobar si la transmisión tiene éxito).
1/2 Bits de Parada: es importante establecer 1 o 2 bits de parada. Es importante saber que con 1 bit, la eficiencia es del 80%, y con 2 bits baja a 72,7%; pero, a veces, este bit extra puede ser una forma útil de añadir un poco de tiempo extra, especialmente a altas velocidades de baudios y/o usando UART suave, donde se requiere tiempo para procesar el byte recibido.
Si no se establecen los parámetros de configuración del Serial aparte de la velocidad de la tasa de baudios que siempre se requiere, se establecerá la configuración de los parámetros por defecto, que es SERIAL_8N1 (8 -> bits de datos, N -> ninguno, sin paridad, 1 -> bit de parada). En lo que respecta a la velocidad en baudios, es importante ajustar siempre la velocidad correcta según el dispositivo de trabajo (puede consultar las velocidades en baudios soportadas por cada pantalla o dispositivo en sus propias hojas de datos).
Ejemplo de código
/*
Copyright (c) 2019 Boot&Work Corp., S.L. All rights reserved
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// Arduino Mega using all four of its Serial ports
// (Serial, Serial1, Serial2, Serial3),
// with different baud rates and configurations:
void setup() {
Serial.begin(9600,SERIAL_8N1); //the default configuration
Serial1.begin(38400,SERIAL_5E1); //even parity
Serial2.begin(19200, SERIAL_5O1); //odd parity
Serial3.begin(4800);
Serial.println("This is Serial");
Serial1.println("This is Serial 1");
Serial2.println("This is Serial 2");
Serial3.println("This is Serial 3");
}
void loop() {
// put your main code here, to run repeatedly:
}