Según altos estándares industriales

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

Índice

  1. Introducción

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

  3. Tipos de objetos Modbus

  4. Comunicaciones de Modbus RTU

  5. Marco de formato Modbus RTU

  6. Códigos de función Modbus

  7. El formato de datos de solicitudes y respuestas para códigos de función principales Modbus RTU

  8. Códigos de excepción principales de Modbus

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

  10. Usos

  11. Software


Introducción de 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 este post, hablaremos sobre cómo utilizar Modbus RTU con nuestras librerías.

En primer lugar, estaría bien que echaras un vistazo a este otro post para que puedas obtener información sobre qué es, su conexión y sus 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:

  • No se admiten objetos binarios grandes.

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

  • No es posible saber (excepto para Ethernet TCP-IP) 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 este hecho consume ancho de banda y tiempo de red en aplicaciones donde el ancho de banda puede ser caro, por ejemplo, en un enlace de radio de baja tasa de bits.

  • Limitación en el direccionamiento de 254 dispositivos en un enlace de datos, lo que restringe la cantidad de dispositivos de campo que podemos conectar a nuestro maestro (podemos resolver este problema con Ethernet TCP/IP).

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

  • Este protocolo no brinda 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 hace uso de una representación binaria compacta de los datos para la comunicación de protocolo.

El formato RTU sigue los datos con una suma de verificación de verificación de redundancia cíclica como un mecanismo de prueba de error para garantizar la confiabilidad de los datos. Modbus RTU es la implementación más común disponible para Modbus. Este mensaje de protocolo debe transmitirse constantemente sin vacilaciones entre caracteres. Los mensajes Modbus se dividen por períodos inactivos.

Tipos de objetos Modbus

Tipos de objeto Modbus
Communications of Modbus RTU Master library

Comunicaciones de Modbus RTU

Cada dispositivo de 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 utilizan comunicaciones inalámbricas y alámbricas, como en la banda ISM, e incluso SMS o GPRS. Uno de los diseños más comunes de redes inalámbricas hace uso de redes de malla.

Un comando Modbus contiene la dirección Modbus del dispositivo al que está destinado (1 a 247). Solo el dispositivo direccionado responderá y actuará en el comando, aunque otros dispositivos puedan recibirlo (una excepción son los comandos de transmisión específicos enviados al nodo 0, sobre los cuales se actúa pero no se reconoce).

También, es importante decir que todos los comandos Modbus contienen información de suma de comprobación para permitir que el destinatario detecte errores de transmisión.

Marco de formato Modbus RTU

Modbus RTU format frame 

Funciones / códigos de comando disponibles

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

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

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

  • Entradas Registros: Entradas Registros: legibles, 16 bits (0 a 65.535), esencialmente medidas y estados.

  • Holding Registers: legibles y escribibles, 16 bits (0 a 65.535), esencialmente valores de configuración.

Códigos de función Modbus

Códigos de función Modbus 


El formato de datos de solicitudes y respuestas para códigos de función principales Modbus RTU

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 discretas)

Petición

  • Dirección de la primera bobina / entrada discreta a leer (16 bits)

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

Respuesta normal

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

  • Bobina / valores de entrada discreta (8 bobinas / entradas discretas 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 función 5 (forzar / escribir bobina simple)

Petición

  • Dirección de la bobina (16 bits)

  • Valor para forzar / escribir: 0 para apagado y 65280 (FF00 en hexadecimal) para encendido.

Respuesta normal

Lo mismo que Petición.


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

Petición

  • Dirección de la primera bobina a 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 desactivado, 1 activado). La primera bobina solicitada se almacena como el bit menos significativo del primer byte de 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)

  • El 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).

Petición

  • Dirección del primer registro a 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 tiene un ancho de 8 bits 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)

Petición

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

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

Respuesta normal

Lo mismo que Petición.


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

Petición

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

  • Número de registros de retención 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 registro tienen 2 bytes de ancho 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 retención preestablecido / escrito (16 bits)

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

Códigos de excepción principales de Modbus

 


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

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

  • HLos 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 de Modbus RTU

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 is the number of coils, digital, holding registers or input registers to read/write.
  • 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


¿Estás buscando tu PLC ideal?

Echa un vistazo a esta comparación de productos con otros controladores industriales Arduino.

Comparamos entradas, salidas, comunicaciones y otras características con las de algunas de las marcas relevantes


Comparación de controladores PLC industriales >>

¿Quieres más información? 

¡Solo llena el formulario! 

¡Quiero saber más!  Por favor, llene el formulario correctamente.