Protocolo de Comunicación Modbus

Modbus
Información sobre la plantilla
Protocolo de Comunicación.jpg
Protocolo de comunicación situado en el nivel 7 del Modelo OSI
DesarrolladorMODICON
Lanzamiento inicial1979

Protocolo de comunicación Modbus. Fue desarrollado en 1979 por la empresa norteamericana MODICON para su gama de controladores lógicos programables (PLCs) y debido a que es público, relativamente sencillo de implementar y flexible se ha convertido en uno de los protocolos de comunicaciones más populares en sistemas de automatización y control. Se encuentra situado en el nivel 7 del Modelo OSI.

Modbus especifica el procedimiento que el controlador y el esclavo utilizan para intercambiar datos, el formato de estos datos, y como se tratan los errores. No especifica estrictamente el el tipo de red de comunicaciones a utilizar, por lo que se puede implementar sobre redes basadas en Ethernet , RS-485, RS-232 etc.

Descripción general

Modbus funciona siempre en modo maestro - esclavo (cliente - servidor), siendo el maestro (cliente) quien controla en todo momento las comunicaciones con los esclavos que pueden ser hasta 247 (@1d a @247d ) . Los esclavos (servidores) se limitan a retornar los datos solicitados o a ejecutar la acción indicada por el maestro. La comunicación del maestro hacia los esclavos puede ser de dos tipos:

  • Peer to peer: Se establece comunicación “maestro - esclavo” , el maestro solicita información y el esclavo responde ( se envía el comando a un dispositivo comprendido entre las direcciones 1d i 247d ).
  • Broadcast: Se establece comunicación “maestro - todos los esclavos” , el maestro envía un comando a todos los esclavos de la red sin esperar respuesta (se envía a la dirección @0d).

La secuencia básica en las comunicaciones Modbus consiste siempre en una trama de pregunta, seguida de su correspondiente trama de respuesta:

  • Pregunta: con el código de función que indica al esclavo que operación ha de realizar, y los bytes necesarios (datos, comprobación) para su ejecución.
  • Respuesta: con la confirmación o datos resultantes de la ejecución de la función.

Las comunicaciones Modbus se pueden realizar, además, en modo ASCII o en modo RTU. En modo ASCII los bytes se envían codificados en ASCII, es decir, que por cada byte a transmitir se envian dos caracteres ASCII ( 2 bytes ) con su representación hexadecimal ( esto permite leer las tramas con un simple editor de texto ). En modo RTU se envían en binario, tal cual. En el modo ASCII las tramas comienzan por 3AH (carácter ':'), y terminan en 0DH-0AH (CR LF Carrier Return Line Feed) y cada byte se envía como dos caracteres ASCII. En modo RTU no se utiliza indicador de inicio y final de trama.

Principales Características

  • Control de acceso al medio tipo Maestro/Esclavo.
  • El protocolo especifica: formato de trama, secuencias y control de errores.
  • Existen dos variantes en el formato: ASCII y RTU
  • Solo especifica la capa de enlace del modelo ISO/OSI.
  • A cada esclavo se le asigna una direcci ´on fija y ´unica en el rango de 1 a 247.
  • La dirección 0 esta reservada para mensajes de difusión sin respuesta.

Formato General de las Tramas

Formato General de las Tramas del Protocolo Modbus

Campos de las tramas Modbus

El número de campos de las tramas Modbus varía ligeramente dependiendo de si se utiliza la codificación ASCII o RTU:

Codificación ASCII ( formato texto ):

  • Inicio de trama: 2 caracteres ASCII ( que representan 1 byte ) codificando el caracter “:” (0x3A).
  • Número Esclavo: 2 caracteres ASCII ( que representan 1 byte ) codificando la dirección del esclavo destino ( o origen ) de la trama.
  • Código Operación: 2 caracteres ASCII ( que representan 1 byte ) con el código de operación.
  • Dirección, datos y subfunciones Datos: con los parámetros necesarios para realizar la operación.
  • LRC(16): H L.
  • Final de trama: 4 caracteres ASCII ( que representan 2 bytes ) con los caracteres CR (0x0D) - LF (0x0A).

Codificación RTU (en el formato binario, el inicio de trama debería ser tras 3.5 tiempo de carácter):

  • Número Esclavo: 1 byte con la dirección del esclavo destino ( o origen ) de la trama.
  • Código Operación: 1 byte con el código de operación
  • Subfunciones Datos: con los parámetros necesarios para realizar la operación.
  • CRC(16): H L

Descripción de los campos de las tramas Modbus

Número de Esclavo (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 1d a 247d (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.

Código de Operación o Función ( 1byte)

Indica el tipo de operación que se quiere 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.
  • Ordenes de control del esclavo: para realizar alguna actuación sobre el esclavo.

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.

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 menos 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ódigos de operación o función más frecuentes

Función 1 o 2 ( 1 Read Coil Status - 2 Read Input Status )

Permite realizar la lectura del estado de las DIs (@1XXXX el comando 2-Read input status) o DOs (@0XXXX el comando 1-Read Coil Status). Para ello el maestro solicita el número de bits que desea leer a partir de una determinada dirección. Cada dirección se corresponde con un registro de 1 bit con el estado del la entrada digital. El esclavo responde indicando el número de bits que retorna y sus valores. En la trama de respuesta se aprovechan todos los bits del byte, y puede haber hasta 256 bytes.

Función 3 o 4 ( 3 Read Holding Registers – 4 Read Input Registers )

Permite realizar la lectura del valor de las AIs ( @4XXXX el comando 3 Read Holding Registers ) o AOs ( @3XXXX el comando 4 Read Input Registers ) . El máster indica la dirección base y número de palabras a leer a partir de esta, mientras que el esclavo indica en la respuesta el número bytes retornados, seguido de estos valores. Aunque en realidad se está escribiendo en el rango de registros o valores numéricos , los registros son direccionados a partir de la dirección 0 ( así el registro @40001 se direcciona 0 )

Función 5 ( Force Single Coil )

Permite modificar el estado de una DO del esclavo ( mando o relé ) . Es decir mediante este comando se puede modificar algún bit de alguna de las variables internas del esclavo u ordenar la ejecución o activación de un mando. Actúa sobre la zona de memoria de los DOs @0XXXX . El Maestro especifica la dirección del bit o mando que quiere modificar seguido de 0x00 para ponerlo a 0 o 0xFF para ponerlo a 1. El esclavo responde con una trama similar indicando la dirección que ha modificado y el valor que ha establecido en el bit o mando.

Función 6 ( Preset Single Register )

Permite la escritura en las AOs del esclavo ( ya sea una señal o valor interno del equipo ), y por tanto actúa sobre la zona de memoria de las AOs ( @4XXXX ). Se debe indicar la dirección del valor que se quiere modificar y la magnitud que se le quiere asignar. Luego el esclavo debería responder con la dirección del dato que ha modificado y el valor que le ha asignado, que debería coincidir con el enviado. Aunque en realidad se está escribiendo en el rango de AOs , los registros son direccionados a partir de la dirección 0 ( así el registro @40001 se direcciona 0 )

Función 7 ( Read Exception Status )

Permite la lectura rápida de un byte fjo de un esclavo, que generalmente es el de excepción y que informa del estado del equipo. No tiene dirección del byte debido a que siempre se lee el mismo byte ( determinado por el propio dispositivo esclavo)

Función 15 ( Force Multiple Coils )

Permite la modificación simultanea de varios bits de DOs en el esclavo, pasándolos a OFF ( ‘0’ ) o a ON ( ‘1’) según convenga. Actúa sobre la zona de memoria de las DOs ( @0XXXX ). Así en el comando se pasan la dirección inicial ( dirección del primer bit o mando a modificar ) y la cantidad y estado de cada uno de los sucesivos mandos ( bits ) a modificar.

Función 16 ( Preset multiple registers )

Permite realizar la escritura en un grupo de AOs, y por tanto actúa sobre la zona de AOs ( @4XXXX ). Se debe especificar la dirección a partir de la que se quiere comenzar a actualizar valores, el número de valores que se quiere actualizar, y la lista de valores que se quiere asignar a estos registros. Aunque se está escribiendo en el rango de registros o valores numéricos , los registros son direccionados a partir de la dirección 0 ( es decir el registro @40001 se direcciona 0 )

Función 20 ( Read General Reference )

Retorna el contenido de los regitros de la Extended Memory ( @6XXXX ). En la trama se envía la dirección del esclavo, el código de función, el número de bytes que se va a leer y los bytes de comprobación de error. En los datos se establece el grupo o grupos o referencias a leer. Cada grupo se define en un campo "sub-request" que contiene:

  • Reference type: 1 byte ( debe ser 6 )
  • Extended Memory file number: 2 bytes ( 0x01 a 0x0A )
  • La direccion del fichero a partir de la que se quiere comenzar a leer: 2 bytes
  • La cantidad de registros a leer: 2 bytes

Los datos a leer seguidos de los demas campos no debe superar la longitud máxima permitida en los mensajes Modbus, es decir los 256 bytes.

Función 21 ( Write General Reference )

Modifica el contenido de los registros de la Extended Memory ( 6XXXX ). Esta función permite trabajar en grupos de registros que no tienen porque ser contiguos ( internamente sí que han de ser contiguos ). Cada grupo se define en un campo "sub-request" que contiene:

  • Reference type: 1 byte ( debe ser 6 )
  • Extended Memory file number: 2 bytes ( 0x01 a 0x0A )
  • La direccion del "fichero" a partir de la que se quiere comenzar a leer: 2 bytes
  • La cantidad de registros a leer: 2 bytes

Los datos a leer seguidos de los demas campos no debe superar la longitud máxima permitida en los mensajes Modbus, es decir los 256 bytes.

Fuente