Busca en nuestro Blog. Encontrarás múltiples aplicaciones, soluciones, ejemplos de código. Navega utilizando la nube de etiquetas o busca utilizando criterios específicos

Librería Modbus RTU Master para automatización industrial

Introducción


En el área de automatización de Arduino, el protocolo Modbus RTU es un medio de comunicación que permite el intercambio de datos entre controladores lógicos programables (controlador PLC Arduino) y computadoras. Los dispositivos electrónicos pueden intercambiar información a través de líneas en serie utilizando el protocolo Modbus.

En esta publicación, hablaremos sobre cómo usar Modbus RTU con nuestras bibliotecas. Primero, sería interesante que revisaras esta otra publicación para obtener la información sobre lo que es, su conexión y características. 

Comunicación mediante MODBUS RTU a través de una interfaz serial RS485 (módulo Seneca Z-D-in)

Es importante decir que este tipo de comunicación tiene algunas limitaciones:

  • Los objetos binarios grandes no son compatibles.

  • No existe una forma estándar para que un node encuentre la descripción de un objeto de datos.

  • No hay forma (excepto Ethernet TCP-IP) de saber si hay un cambio en uno de nuestros dispositivos periféricos. La única forma de obtener esta información es preguntar constantemente y buscar cambios en los datos, pero esto consume ancho de banda y tiempo de red en aplicaciones donde el ancho de banda puede ser costoso, como en un enlace de radio de baja velocidad de bits.

  • Restricción para direccionar 254 dispositivos en un enlace de datos, lo que limita la cantidad de dispositivos de campo que podemos conectar a nuestro maestro (una vez más con Ethernet TCP / IP podemos resolver este problema).

  • Las transmisiones deben ser contiguas, lo que limita los tipos de dispositivos de comunicaciones remotas a los que pueden almacenar datos en el búfer para evitar espacios en la transmisión.

  • Este protocolo no proporciona seguridad contra comandos no autorizados o interceptación de datos, pero no es habitual encontrar esos hechos en la industria.

En resumen, Modbus RTU se utiliza en la comunicación en serie y utiliza una representación compacta y binaria de los datos para la comunicación del protocolo. El formato RTU sigue los datos con una suma de verificación cíclica de verificación de redundancia como un mecanismo de prueba de errores para garantizar la fiabilidad de los datos. Modbus RTU es la implementación más común disponible para Modbus. Este mensaje de protocolo debe transmitirse continuamente sin dudas entre caracteres. Los mensajes Modbus están separados por períodos inactivos.

Tipos de objeto Modbus

Comunicaciones 

Cada dispositivo en una comunicación Modbus tiene una dirección única.

El Modbus RTU funciona mediante RS-485, que es una red multipunto de un solo cable, solo el nodo asignado como maestro puede iniciar un comando. Todos los demás dispositivos son esclavos y responden a solicitudes y comandos.

Hay muchos módems y puertas de enlace que admiten Modbus, ya que es un protocolo muy simple y a menudo copiado. Algunos de ellos fueron diseñados específicamente para este protocolo. Las diferentes implementaciones usan comunicación por cable, inalámbrica, como en la banda ISM, e incluso SMS o GPRS. Uno de los diseños más comunes de redes inalámbricas utiliza redes de malla. 

Un comando Modbus contiene la dirección Modbus del dispositivo para el que está destinado (1 a 247). Solo el dispositivo direccionado responderá y actuará según el comando, aunque otros dispositivos puedan recibirlo (una excepción son los comandos específicos de broadcastable enviados al nodo 0, que se actúan pero no se reconocen). También es importante decir que todos los comandos Modbus contienen información de suma de verificación para permitir que el destinatario detecte errores de transmisión.

 

Marco de formato Modbus RTU

 

Funciones disponibles / códigos de comandos 

Lectura, escritura y otras operaciones se clasifican de la siguiente manera. Las entidades prominentes dentro de un esclavo Modbus son:

  • Bobinas: legibles y grabables, 1 bit (encendido/apagado)

  • Entradas digitales: legible, 1 bit (encendido-apagado)

  • Registros de entradas: legibles, 16 bits (0 a 65.535), esencialmente mediciones y estados

  • Registros de retención: legible y grabable, 16 bits (0 a 65.535), esencialmente valores de configuración


Códigos de función Modbus


Formato de datos de solicitudes y respuestas para códigos de funciones principales

Aquí encontrarás los detalles de los formatos de datos de los códigos de función más utilizados.

*Código de función 1 (leer bobinas) y código de función 2 (leer entradas digitales) 

Solicitud:

  • Dirección de la primera bobina/entrada digital para leer (16 bits)

  • Número de bobinas/entradas digitales para leer (16 bits)

Respuesta normal:

  • Número de bytes de bobina/valores de entrada discretos a seguir (8 bits) 

  • Bobina/valores de entrada discretos (8 bobinas/entradas digitales por byte)

Tenemos que saber que el valor de cada bobina/entrada digital es binario (0-off, 1-on). La primera entrada digital/bobina solicitada se almacena como bit menos significativo o primer byte en respuesta. En caso de que el número de bobinas/entradas digitales no sea un múltiplo de 8, el bit más significativo del último byte se rellenará con ceros. Debido a que el recuento de bytes devuelto en el mensaje de respuesta tiene solo 8 bits de ancho y la sobrecarga del protocolo es de 5 bytes, se puede leer un máximo de 2008 (251 x 8) entradas digitales o bobinas a la vez.


* Código de unión 5 (fuerza/escritura de bobina simple)

Solicitud:

  • Dirección de la bobina (16 bits)

  • Valor para forza /escribir: 0 para apagado y 65.280 (FF00 en hexadecimal) para encendido 


Respuesta normal: la misma que la solicitud.

* Código de función 15 (forza /escribir múltiples bobinas) 

Solicitud:

  • Dirección de la primera bobina para forzar/escribir (16 bits)

  • Número de bobinas para forzar / escribir (16 bits)

  • Número de bytes de valores de bobina a seguir (8 bits)

  • Valores de bobina (8 valores de bobina por byte)

El valor de cada bobina es binario (0 apagado, 1 encendido). La primera bobina solicitada se almacena como el bit menos significativo del primer byte en la solicitud. Si el número de bobinas no es un múltiplo de 8, el bit más significativo del último byte debe rellenarse con ceros. 

Respuesta normal: 

  • Dirección de la primera bobina (16 bits)

  • Número de bobinas (16 bits) 

    * Código de función 4 (leer registros de entrada) y código de función 3 (leer registros de retención)

Solicitud:

  • Dirección del primer registro para leer (16 bits)

  • Número de registros para leer (16 bits)

Respuesta normal:

  • Número de bytes de registro para leer (16 bits)

  • Valores de registro (16 bits por registro)

Debido a que el número de bytes para los valores de registro es de 8 bits de ancho y el tamaño máximo del mensaje Modbus es de 256 bytes, solo 125 registros para Modbus RTU y 123.


* Código de función 6 (preestablecer/escribir registro de retención único)

Solicitud:

  • Número de bytes de registro para leer (16 bits)

  • Nuevo valor del registro de retención (16 bits)

Respuesta normal: igual que la solicitud 

* Código de función 16 (preestablecer / escribir múltiples registros de retención)

Solicitud:

  • Dirección del primer registro de retención para preestablecer / escribir (16 bits)

  • Número de registros de espera para preestablecer / escribir (16 bits)

  • Número de bytes de valores de registro a seguir (8 bits)

  • Nuevos valores de registros de retención (16 bits por registro)

Debido a que los valores de los registros tienen un ancho de 2 bytes y solo se pueden enviar 127 bytes de valores, solo se pueden preestablecer/escribir 63 registros de retención a la vez.


Respuesta normal:

  • Dirección del primer registro de espera preestablecido/escrito (16 bits)

  • Número de registros de retención presentes/escritos (16 bits)



Principales códigos de excepción Modbus


Bobina, entrada discreta, registro de entrada, retención de números de registro y direcciones

Los números de entidad combinan el tipo de entidad y la ubicación de la entidad dentro de su tabla de descripción.

La dirección de la entidad es la dirección inicial, como valor de 16 bits en la parte de datos de la trama Modbus. Como tal, su rango va de 0 a 65.535

En el estándar tradicional, los números para esas entidades comienzan con un dígito, seguido de un número de 4 dígitos en el rango 1-9.999:
  • Los números de bobinas comienzan con 0 y abarcan desde 00001 hasta 09999

  • Los números de entrada discretos comienzan con 1 y abarcan desde 10001 hasta 19999

  • Los números de registro de entrada comienzan con 3 y abarcan desde 30001 hasta 39999

  • Los números de registro de retención comienzan con 4 y abarcan desde 40001 hasta 49999 

Esto da como resultado direcciones entre 0 y 9.999 en marcos de datos. Por ejemplo, para leer registros de retención, comenzando en el número 40001, la dirección correspondiente en el marco de datos será 0 con un código de función de (como se ve arriba). Para mantener registros que comienzan en el número 40100, la dirección será 99, etc.

Esto limita el número de direcciones a 9.999 para cada entidad. Una referencia de facto extiende esto al máximo de 65.536. Bassically consiste en agregar un dígito a la lista anterior:

  • Los números de bobina abarcan de 000001 a 065536

  • Los números de entrada discretos abarcan desde 100001 hasta 165536

  • Los números de registro de entrada abarcan desde 300001 hasta 365536

  • Los números de registro de espera abarcan desde 400001 hasta 465536

Si está utilizando la referencia extendida, todas las referencias de números deben tener exactamente 6 dígitos. Esto evita la confusión entre bobinas y otras entidades. Por ejemplo, para saber la diferencia entre mantener el registro # 40001 y la bobina # 40001 es el objetivo, debe aparecer como # 040001


Usos 

Algunos de los usos más comunes:

Tipos de datos:

  • Número de coma flotante IEEE

  • Entero de 32 bits 

  • Datos de 8 bits

  • Tipos de datos mixtos

  • Campos de bits enteros

  • Multiplicadores para cambiar datos a / desde entero. 10, 100, 1000, 256...

Extensiones de protocolo:

  • Direcciones esclavas de 16 bits

  • Tamaño de datos de 32 bits (1 dirección = 32 bits de datos devueltos)

  • Datos intercambiados de palabras 


Software

Modbus RTU Master con Arduino IDE

El Modbus RTU Master Module implementa las capacidades de Modbus RTU Master. 

#include <ModbusRTUMaster.h>


Es posible utilizar cualquier secuencia de hardware Serial Arduino:

  • RS-485

#include <RS485.h>

ModbusRTUMaster master(RS485);


  • RS-232

#include <RS232.h>

ModbusRTUMaster master(RS232);


Antes de usarlo, es necesario llamar a la función de inicio en la configuración tanto para la variable serial como para la variable Modbus. Es una buena práctica establecer la velocidad de transmisión (valor predeterminado: 19200 bps) también en la variable Modbus para definir los tiempos de espera internos de Modbus.

RS485.begin(9600, HALFDUPLEX, SERIAL_8E1);
master.begin(9600);


Las funciones para leer y escribir valores esclavos son:

readCoils(slave_address, address, quantity);
readDiscreteInputs(slave_address, address, quantity);
readHoldingRegisters(slave_address, address, quantity);
readInputRegisters(slave_address, address, quantity);
writeSingleCoil(slave_address, address, value);
writeSingleRegister(slave_address, address, value);
writeMultipleCoils(slave_address, address, values, quantity);
writeMultipleRegisters(slave_address, address, values, quantity);


Donde:

  • slave_address es la dirección del esclavo Modbus RTU.

  • address es la bobina, entrada digital, registro de retención o dirección de registro de entrada. Por lo general, esta dirección es la bobina, la entrada digital, el registro de retención o el número de registro de entrada menos 1: el número de registro de retención  40009 tiene la dirección 8.
    quantity es el número de bobinas, digitales, registros de retención o registros de entrada para leer / escribir.
  • value es el valor dado de la bobina o los registros de retención en una operación de escritura. Dependiendo de la función, el tipo de datos cambia. Una bobina está representada por un valor bool y un registro de retención está representado por un valor uint16_t.

En una función de lectura/escritura múltiple, el argumento de address es la primera dirección. En una función de escritura múltiple, el argumento values es una matriz de valores para escribir.

Es importante decir que esas funciones no bloquean, por lo que no devuelven el valor de lectura. Devuelven verdadero o falso dependiendo del estado actual del módulo. Si hay una solicitud Modbus pendiente, devuelven false.  

// Read 5 holding registers from address 0x24 of slave with address 0x10
if (master.readHoldingRegisters(0x10, 0x24, 5)) {
	// OK, the request is being processed
} else {
	// ERROR, the master is not in an IDLE state
}

Existe la función vailable() para verificar las respuestas del esclavo:

ModbusResponse response = master.available();
if (response) {
	// Process response
}


ModbusResponse implementa algunas funciones para obtener la información de respuesta:

hasError();
getErrorCode();
getSlave();
getFC();
isCoilSet(offset);
isDiscreteInputSet(offset);
isDiscreteSet(offset);
getRegister(offset);
ModbusResponse response = master.available();
if (response) {
	if (response.hasError()) {
		// There is an error. You can get the error code with response.getErrorCode()
	} else {
		// Response ready: print the read holding registers
		for (int i = 0; i < 5; ++i) {
			Serial.println(response.getRegister(i);
		}
	}
}

 

Los posibles códigos de error son:

0x01 ILLEGAL FUNCTION
0x02 ILLEGAL DATA ADDRESS
0x03 ILLEGAL DATA VALUE
0x04 SERVER DEVICE FAILURE


¿Quieres más información?

Con la tecnología Open Source, puedes ejecutar tus propias instalaciones.

Rellena el formulario y contactaremos contigo lo más pronto posible.

Enviar  Por favor, completa el formulario correctamente.