Sunteți pe pagina 1din 44

ENTRAMADO DEL PAQUETE MODBUS

En el modo RTU, un mensaje empieza después de un silencio de al menos 3.5 caracteres, lo cual se
implementa como 4 tiempos de carácter a la velocidad de transmisión empleada. En este modo los
dispositivos en red monitorean el bus continuamente inclusive en los intervalos de silencio. Un nuevo
mensaje como ya se dijo, empieza después de este intervalo de 3.5 caracteres.

El mensaje o “frame” debe ser enviado como un flujo continuo de datos, si un intervalo de 3.5 caracteres
o más, se produce antes de que el “frame” se complete, se elimina el mensaje recibido y se espera que el
nuevo carácter que se reciba sea la dirección de un nuevo mensaje.

Si un carácter llega antes de un intervalo de 3.5 caracteres después de que se terminó de recibir el frame,
se toma como una continuación del mensaje anterior. Esto dará un error al momento de chequear el CRC.
Un mensaje típico en RTU se ve a continuación.

De este punto en adelante el análisis se realiza en torno al modo RTU.

EL CHEQUEO DE ERROR CRC

Este campo de 16 bits es el resultado del cálculo de un Chequeo de Redundancia Cíclica. Este se usa para
rellenar los últimos dos bytes de un mensaje, pero se rellena con el byte menos significativo en primer lugar.
El chequeo de error CRC, se aplica sin importar la paridad que se use, o si no se está usando alguna. El CRC
se calcula en el dispositivo que transmite y es recalculado y comparado en el dispositivo que recibe. Este
valor está compuesto por dos bytes que se calculan de la siguiente forma:

PASO 1
Se carga un registro de 16 bits (llamado CRC) con unos.
PASO 2
Se hace XOR del primer byte del mensaje almacenado en un registro temporal con el byte menos
significativo del registro CRC, poniendo el resultado en un registro de trabajo.
PASO 3
Se desplaza el registro CRC hacia la derecha, o sea hacia el LSB y se llena con un cero el MSB.
Paso 4
Se hace una AND entre el registro de trabajo y el valor 01 hex.
PASO 5
Si el resultado de la operación AND es 0 hex, se hace una XOR entre el registro CRC y el valor A001 hex, y
el resultado se guarda en el registro CRC. Si el resultado de la operación AND es 1 hex se hace el paso 6.
Paso 6
Se desplaza a la derecha el registro temporal el cual contiene el dato del mensaje.
Paso 7
Se repiten los pasos del 2 al 6 hasta que el registro temporal se haya desplazado 8 veces a la derecha.
Paso 8
Se repiten los pasos del 2 al 7 para el próximo byte y todos los subsecuentes bytes del campo de datos.
Resultado
El contenido del registro es el valor CRC.
Paso 9
Cuando se ponen el CRC en el mensaje se debe hacer con el byte menos significativo de primero, por
ejemplo si el valor CRC es 1241 hex (000100100100 0001), se envía 4112 hex.

Como se transmiten serialmente los datos


En todo mensaje, cada byte se envía con el LSB (bit menos significativo) de primero y el MSB (bit más
significativo) de último, a continuación puede verse esta secuencia en la figura 2.3

Respuestas de excepción
Existen cuatro posibles situaciones que se pueden presentar durante el proceso de comunicación entre
un dispositivo maestro y otro esclavo. Estas son:
El esclavo recibe el mensaje sin errores y ejecuta la orden sin problema, en cuyo caso su respuesta de
retorno es normal. El esclavo no recibe el mensaje por un error de comunicación, y por consiguiente no
retorna ninguna respuesta. El dispositivo maestro detectará el error al acabarse el tiempo de espera
(timeout) de la repuesta.
El esclavo recibe el mensaje, pero detecta un error de integridad en los datos (paridad o CRC), lo que
provoca que no retorne un mensaje de respuesta. El maestro se enterará del error al acabarse el tiempo
de espera de la respuesta.
El esclavo recibe el mensaje sin errores pero no puede ejecutar la orden. En este caso el esclavo retorna
un mensaje de excepción informándole al maestro la naturaleza del error.
Una respuesta normal del esclavo incluirá su dirección, un campo para la función y un campo para datos.
La función retornada es la misma que la función ejecutada y los datos corresponden a cualquier
información solicitada.
Un mensaje de excepción incluye los mismos campos de una respuesta normal. La función retornada es
la misma que recibió en el mensaje, pero con el valor “1” en el MSB 1.
Esta diferencia permite detectar que hubo un error, e indica que en el campo de datos se encuentra un
código de excepción (código de error). Existen ocho códigos de excepción diferentes:
01 Función ilegal: El código de función recibido no es reconocido por el esclavo.
02 Dirección de datos ilegal: la dirección para los datos es inválida para el esclavo.
03 Valor de dato ilegal: el valor del dato no es permitido por el esclavo.
04 Fallo en el dispositivo esclavo: un error incorregible ocurrió cuando el esclavo intentó ejecutar la
acción pedida.
05 Reconocimiento: el esclavo aceptó la consulta y está procesándola, pero la acción tomará mucho
tiempo en completarse.
06 Dispositivo esclavo ocupado: el esclavo está inmerso en el procesamiento de un comando de larga
duración en su ejecución.
07 Reconocimiento negativo: el esclavo no pudo ejecutar las funciones 13 o 14.
08 Error de paridad en la memoria: error de paridad en la lectura de los datos en la memoria extendida.

La codificación de datos dentro de la trama puede hacerse en modo ASCII o puramente binario, según el
estándar RTU (Remote Transmission Unit). En cualquiera de los dos casos, cada mensaje obedece a una
trama que contiene cuatro campos principales, según se muestra en la figura 1. La única diferencia estriba
en que la trama ASCII incluye un carácter de encabezamiento («:»=3ª) y los caracteres CR y LF al final del
mensaje.
Pueden existir también diferencias en la forma de calcular el CRC, puesto que el H formato RTU emplea una
fórmula polinómica en vez de la simple suma en módulo 16.
Con independencia de estos pequeños detalles, a continuación se da una breve descripción de cada uno de
los campos del mensaje:

Figura 1. Trama genérica del mensaje según el código empleado

Número de esclavo (1 byte):


Permite direccionar un máximo de 63 esclavos con direcciones que van del 01
Hasta 3F se reserva para los mensajes difundidos.
H
. El número 00
Código de operación o función (1 byte):
Cada función permite transmitir datos u órdenes al esclavo. Existen dos tipos básicos de órdenes:
 Ordenes de lectura/escritura de datos en los registros o en la memoria del esclavo.
 Ordenes de control del esclavo y el propio sistema de comunicaciones
(RUN/STOP, carga y descarga de programas, verificación de contadores de intercambio, etc.)
La tabla 1 muestra la lista de funciones disponibles en el protocolo MODBUS con sus correspondientes
códigos de operación.
Campo de subfunciones/datos (n bytes):
Este campo suele contener, en primer lugar, los parámetros necesarios para ejecutar la función indicada
por el byte anterior. Estos parámetros podrán ser códigos de) o direcciones del primer
H subfunciones en el caso de órdenes de control (función 00 bit o byte, número de bits o palabras a leer o
escribir, valor del bit o palabra en caso de escritura, etc.
ESPECIFICACIONES DEL PROTOCOLO INDUSTRIAL MODBUS.
El protocolo MODBUS define una estructura de mensajes que puede ser reconocida por diferentes
dispositivos independientemente del tipo de red de comunicaciones utilizada. El protocolo describe el
proceso para acceder a información de un dispositivo, cómo debe responder éste, i como se notifican las
situaciones de error. El protocolo MODBUS define una red digital de comunicaciones con un solo master y
uno o más dispositivos Slave.
Modo de transmisión
El modo de transmisión es la estructura de las unidades de información contenidas en un mensaje. El
protocolo MODBUS define dos modos de transmisión: ASCII (American Standard Code for Information
Interchange) y RTU (Remote Terminal Unit). En una red de dispositivos conectados mediante el protocolo
MODBUS NO se pueden compartir dispositivos utilizando diferentes modos de transmisión.
Formato general de las tramas
Un mensaje consiste en una secuencia de caracteres que puedan ser interpretados por el receptor, como
se muestra en la figura 18. Esta secuencia de caracteres define la trama, tal como se ilustran en las tablas 1
y 2. Para sincronizar la trama, los dispositivos receptores monitorizan el intervalo de tiempo transcurrido
entre caracteres recibidos. Si se detecta un intervalo mayor que tres veces y medio el tiempo necesario
para transmitir un carácter, el dispositivo receptor ignora la trama y asume que el siguiente carácter que
recibirá será una dirección.

Figura 1. Comunicación MODBUS

Tabla 1. Modo ASCII


Tabla 2. Modo RTU

Dirección
El campo dirección es el primero de la trama después del tiempo de sincronización. Indica el dispositivo al
que va dirigido el mensaje. Cada dispositivo de la red debe tener asignada una dirección única, diferente de
cero.
Igualmente, cuando un dispositivo responde a un mensaje, debe enviar en primer lugar su dirección para
que el master reconozca la procedencia del mensaje.
MODBUS permite enviar mensajes a todos los dispositivos a la vez (broadcast) utilizando para ello la
dirección cero.
Función
El campo función indica al dispositivo direccionado qué tipo de función ha de Realizar. Estas funciones están
definidas en la tabla 3.

Código Función
01 o 02 Leer N bits (máximo 255)
03 o 04 Leer N registros (máx 52)
05 Escribir 1 bit
06 Escribir 1 registro
Tabla 3. Funciones MODBUS
Datos
El campo datos contiene la información necesaria para que los dispositivos puedan ejecutar las funciones
solicitadas, o la información enviada por los dispositivos al master como respuesta a una función.
Control de Errores
El campo de control de errores es el último de la trama y permite al master y a los dispositivos detectar
errores de transmisión. Ocasionalmente, debido a ruido eléctrico o a interferencias de otra naturaleza, se
puede producir alguna modificación en el mensaje mientras se está transmitiendo. El control de errores
asegura que los dispositivos receptores o el master no efectuarán acciones incorrectas debido a una
modificación accidental del mensaje. El formato RTU utiliza el control de redundancia cíclica (CRC), mientras
que el ASCII utiliza el control de redundancia longitudinal (CRL) para finalizar la trama de comunicación.

Funciones MODBUS
Leer N bits (Código de función 01 o 02)
Esta función permite al usuario obtener los valores lógicos (ON/OFF) de los bits del dispositivo direccionado.
Los datos de respuesta van empaquetados en bytes de manera que el primer bit solicitado ocupa el bit de
menos peso del primer byte de datos. Los siguientes van a continuación de manera que si no son un número
múltiplo de 8, el último byte se completa con ceros. Esta comunicación se ilustra en las tablas 4 y 5.

Tabla 4. Interrogación de lectura binaria

Tabla 5. Respuesta a lectura binaria


Leer N Registros (Código de función 03 o 04)
Esta función permite al usuario obtener los valores de los registros del dispositivo direccionado. Estos
registros almacenan los valores numéricos de los parámetros y variables del controlador. El rango de los
datos varía de 0 a 65536. Los datos correspondientes a direcciones de registros que pasan de la última
dirección válida de parámetros se asignan a cero (00 00). Las tramas de comunicación para esta función
están definidos en las tablas 6 y 7.

Tabla 6. Interrogación para la lectura de registros


Tabla 7. Respuesta a lectura de registros
Función para escribir 1 bit (Código de función 05)
Esta función permite al usuario escribir los valores lógicos (ON/OFF) de los bits del dispositivo direccionado.
Para desactivar el bit se debe enviar 00h, y para activarlo se debe enviar 01h o FFh. Éste valor se debe
escribir en el byte más significativo. Como se muestra en las tablas 8 y 9.

Tabla 8. Comando para escritura de bit

Tabla 9. Reporte de escritura de bit


Función para escribir un registro (Código de función 06)
Esta función permite al usuario modificar el contenido de los parámetros del dispositivo direccionado. Los
valores se envían escalados según el factor de escala correspondiente a cada parámetro, en un rango entre
0000h y FFFFh. Las tramas de comunicación para esta función están ilustradas en las tablas 10 y 11.

Tabla 10. Comando para escritura de registro.

Tabla 11. Reporte de escritura de registro


Códigos de error
Comúnmente, los errores que aparecen durante las operaciones de acceso y programación de dispositivos
tienen relación con datos no válidos en la trama, tal como se ve en la tabla 12. Cuando un dispositivo detecta
un error de esta naturaleza, la respuesta al master consiste en la dirección del dispositivo, el código de la
función, el código de error y el CRC. Para indicar que la respuesta es una notificación de error, el bit de más
peso del código de la función está activado a 1.
Código Tipo de Error Significado
01 Función inválida La función recibida no está permitida en el esclavo.
02 Dirección inválida La dirección está fuera del rango permitido.
03 Dato inválido El dato contiene un valor no válido.
04 Falla en el dispositivo El controlador no responde o ha ocurrido un error.
05 Reconocimiento (ACK) Se ha aceptado la función y se está procesando.
06 Ocupado El mensaje ha sido recibido sin error, pero el dispositivo no
puede procesarlo en este momento.
07 Reconocimiento Negativo La función solicitada no puede realizarse en este momento.
(ACK)
Tabla 4. Códigos de error
Introducción al Protocolo Modbus
La solicitud (Query)
El código de función en la solicitud le dice al dispositivo direccionado, qué tipo de acción tomar. Los bits
de datos contienen la información adicional que el esclavo necesite. El campo de error hace fácil revisar la
integridad de los datos.
La respuesta (Response)
Si el esclavo brinda una respuesta normal, el código de función de las respuestas es un eco del código de
operación de la solicitud. Los bytes de datos contienen los datos recolectados por el esclavo, como valores
de registros o estados.
Si un error ocurre, la respuesta cambia para reflejar que ha ocurrido un error. En caso de error, el código
de operación de la respuesta tiene el MSB (bit más significativo) como 1 en vez de cero como es normal,
de modo que el código con error es 80 hex mayor que el código sin error. El chequeo de error le permite
al maestro confirmar que el contenido del mensaje fue válido.
Como se transmiten serialmente los datos
En todo mensaje, cada byte se envía con el LSB (bit menos significativo) de primero y el MSB (bit más
significativo) de último, a continuación puede verse esta secuencia en la figura 2.3

Tabla 5. Modo RTU

Dirección
El campo dirección es el primero de la trama después del tiempo de sincronización. Indica el dispositivo al
que va dirigido el mensaje. Cada dispositivo de la red debe tener asignada una dirección única, diferente de
cero.
Igualmente, cuando un dispositivo responde a un mensaje, debe enviar en primer lugar su dirección para
que el master reconozca la procedencia del mensaje.
MODBUS permite enviar mensajes a todos los dispositivos a la vez (broadcast) utilizando para ello la
dirección cero.
Función
El campo función indica al dispositivo direccionado qué tipo de función ha de Realizar. Estas funciones están
definidas en la tabla 3.
Código Función
01 o 02 Leer N bits (máximo 255)
03 o 04 Leer N registros (máx 52)
05 Escribir 1 bit
06 Escribir 1 registro
Tabla 6. Funciones MODBUS
Datos
El campo datos contiene la información necesaria para que los dispositivos puedan ejecutar las funciones
solicitadas, o la información enviada por los dispositivos al master como respuesta a una función.

Control de Errores
El campo de control de errores es el último de la trama y permite al master y a los dispositivos detectar
errores de transmisión. Ocasionalmente, debido a ruido eléctrico o a interferencias de otra naturaleza, se
puede producir alguna modificación en el mensaje mientras se está transmitiendo. El control de errores
asegura que los dispositivos receptores o el master no efectuarán acciones incorrectas debido a una
modificación accidental del mensaje. El formato RTU utiliza el control de redundancia cíclica (CRC), mientras
que el ASCII utiliza el control de redundancia longitudinal (CRL) para finalizar la trama de comunicación.
Funciones MODBUS
Leer N bits (Código de función 01 o 02)
Esta función permite al usuario obtener los valores lógicos (ON/OFF) de los bits del dispositivo direccionado.
Los datos de respuesta van empaquetados en bytes de manera que el primer bit solicitado ocupa el bit de
menos peso del primer byte de datos. Los siguientes van a continuación de manera que si no son un número
múltiplo de 8, el último byte se completa con ceros. Esta comunicación se ilustra en las tablas 4 y 5.

Tabla 4. Interrogación de lectura binaria

Tabla 5. Respuesta a lectura binaria


Leer N Registros (Código de función 03 o 04)
Esta función permite al usuario obtener los valores de los registros del dispositivo direccionado. Estos
registros almacenan los valores numéricos de los parámetros y variables del controlador. El rango de los
datos varía de 0 a 65536. Los datos correspondientes a direcciones de registros que pasan de la última
dirección válida de parámetros se asignan a cero (00 00). Las tramas de comunicación para esta función
están definido en las tablas 6 y 7.

Tabla 6. Interrogación para la lectura de registros

Tabla 7. Respuesta a lectura de registros


Función para escribir 1 bit (Código de función 05)
Esta función permite al usuario escribir los valores lógicos (ON/OFF) de los bits del dispositivo direccionado.
Para desactivar el bit se debe enviar 00h, y para activarlo se debe enviar 01h o FFh. Éste valor se debe
escribir en el byte más significativo. Como se muestra en las tablas 8 y 9.

Tabla 7. Comando para escritura de bit

Tabla 9. Reporte de escritura de bit


Función para escribir un registro (Código de función 06)
Esta función permite al usuario modificar el contenido de los parámetros del dispositivo direccionado. Los
valores se envían escalados según el factor de escala correspondiente a cada parámetro, en un rango entre
0000h y FFFFh. Las tramas de comunicación para esta función están ilustradas en las tablas 10 y 11.

Tabla 10. Comando para escritura de registro.

Tabla 11. Reporte de escritura de registro


Respuestas de excepción
Existen cuatro posibles situaciones que se pueden presentar durante el proceso de comunicación entre un
dispositivo maestro y otro esclavo. Estas son:
El esclavo recibe el mensaje sin errores y ejecuta la orden sin problema, en cuyo caso su respuesta de
retorno es normal.
El esclavo no recibe el mensaje por un error de comunicación, y por consiguiente no retorna ninguna
respuesta. El dispositivo maestro detectará el error al acabarse el tiempo de espera (timeout) de la
respuesta.
El esclavo recibe el mensaje, pero detecta un error de integridad en los datos (paridad o CRC), lo que
provoca que no retorne un mensaje de respuesta. El maestro se enterará del error al acabarse el tiempo de
espera de la respuesta.
El esclavo recibe el mensaje sin errores pero no puede ejecutar la orden. En este caso el esclavo retorna un
mensaje de excepción informándole al maestro la naturaleza del error.
Una respuesta normal del esclavo incluirá su dirección, un campo para la función y un campo para datos.
La función retornada es la misma que la función ejecutada y los datos corresponden a cualquier información
solicitada.
Un mensaje de excepción incluye los mismos campos de una respuesta normal. La función retornada es la
misma que recibió en el mensaje, pero con el valor “1” en el MSB 1.
Esta diferencia permite detectar que hubo un error, e indica que en el campo de datos se encuentra un
código de excepción (código de error). Existen ocho códigos de excepción diferentes:
Códigos de error
Comúnmente, los errores que aparecen durante las operaciones de acceso y programación de dispositivos
tienen relación con datos no válidos en la trama, tal como se ve en la tabla 12. Cuando un dispositivo detecta
un error de esta naturaleza, la respuesta al master consiste en la dirección del dispositivo, el código de la
función, el código de error y el CRC. Para indicar que la respuesta es una notificación de error, el bit de más
peso del código de la función está activado a 1.
Código Tipo de Error Significado
01 Función inválida La función recibida no está permitida en el esclavo.
02 Dirección inválida La dirección está fuera del rango permitido.
03 Dato inválido El dato contiene un valor no válido.
04 Falla en el dispositivo El controlador no responde o ha ocurrido un error.
05 Reconocimiento (ACK) Se ha aceptado la función y se está procesando.
06 Ocupado El mensaje ha sido recibido sin error, pero el dispositivo no puede
procesarlo en este momento.
07 Reconocimiento Negativo (ACK) La función solicitada no puede realizarse en este momento.

Tabla 8. Códigos de error


01 Función inválida: Corresponde a una función ilegal. El código de función recibido no es reconocido por
el esclavo.

02 Dirección de datos ilegal: la dirección para los datos es inválida para el esclavo.
03 Valor de dato ilegal: el valor del dato no es permitido por el esclavo.
04 Fallo en el dispositivo esclavo: un error incorregible ocurrió cuando el esclavo intentó ejecutar la acción
pedida.
05 Reconocimiento: el esclavo aceptó la consulta y está procesándola, pero la acción tomará mucho tiempo
en completarse.
06 Dispositivo esclavo ocupado: el esclavo está inmerso en el procesamiento de un comando de larga
duración en su ejecución.
07 Reconocimiento negativo: el esclavo no pudo ejecutar las funciones 13 o 14.
08 Error de paridad en la memoria: error de paridad en la lectura de los datos en la memoria extendida.
El chequeo de error CRC
Este campo de 16 bits es el resultado del cálculo de un Chequeo de Redundancia Cíclica. Este se usa para
rellenar los últimos dos bytes de un mensaje, pero se rellena con el byte menos significativo en primer lugar.
El chequeo de error CRC, se aplica sin importar la paridad que se use, o si no se está usando alguna. El CRC
se calcula en el dispositivo que transmite y es recalculado y comparado en el dispositivo que recibe. Este
valor está compuesto por dos bytes que se calculan de la siguiente forma:
Paso 1
Se carga un registro de 16 bits (llamado CRC) con unos.
Paso 2
Se hace XOR del primer byte del mensaje almacenado en un registro temporal con el byte menos
significativo del registro CRC, poniendo el resultado en un registro de trabajo.
Paso 3
Se desplaza el registro CRC hacia la derecha, o sea hacia el LSB y se llena con un cero el MSB.
Paso 4
Se hace una AND entre el registro de trabajo y el valor 01 hex.
Paso 5
Si el resultado de la operación AND es 0 hex, se hace una XOR entre el registro CRC y el valor A001 hex, y el
resultado se guarda en el registro CRC. Si el resultado de la operación AND es 1 hex se hace el paso 6.
Paso 6
Se desplaza a la derecha el registro temporal el cual contiene el dato del mensaje.
Paso 7
Se repiten los pasos del 2 al 6 hasta que el registro temporal se haya desplazado 8 veces a la derecha.
Paso 8
Se repiten los pasos del 2 al 7 para el próximo byte y todos los subsecuentes bytes del campo de datos.
Resultado
El contenido del registro es el valor CRC.
Paso 9
Cuando se ponen el CRC en el mensaje se debe hacer con el byte menos significativo de primero, por
ejemplo si el valor CRC es 1241 hex (000100100100 0001), se envía 4112 hex.
Estructura de la red
El medio físico de conexión puede ser un bus semidúplex (half duplex) (RS-485 o fibra
Medio Físico óptica) o dúplex (full duplex) (RS-422, BC 0-20mA o fibra óptica).
La comunicación es asíncrona y las velocidades de transmisión previstas van desde los
75 baudios a 19.200 baudios. La máxima distancia entre estaciones depende del nivel físico, pudiendo
alcanzar hasta 1200 m sin repetidores.
Acceso al Medio
La estructura lógica es del tipo maestro-esclavo, con acceso al medio controlado por el maestro. El número
máximo de estaciones previsto es de 63 esclavos más una estación maestra.
Los intercambios de mensajes pueden ser de dos tipos:
 Intercambios punto a punto, que comportan siempre dos mensajes: una demanda del maestro y
una respuesta del esclavo (puede ser simplemente un reconocimiento («acknowledge»).
 Mensajes difundidos. Estos consisten en una comunicación unidireccional del maestro a todos los
esclavos. Este tipo de mensajes no tiene respuesta por parte de los esclavos y se suelen emplear para
mandar datos comunes de configuración, reset, etc.
Transacciones en redes Modbus
Los puertos Standard Modbus usan una interfaz serial RS-232 que define las distribuciones de pines de los
conectores, el cableado, nivel de señales, velocidad de transmisión y chequeo de paridad. Los dispositivos
pueden ser puestos en red por medio de modems. Estos usan una técnica maestro - esclavo en la cual sólo
un dispositivo (el maestro) puede iniciar transacciones. Los otros dispositivos (esclavos) responden
supliendo los datos requeridos o ejecutando las acciones solicitadas.
El maestro puede direccionar esclavos individuales o iniciar un mensaje transmitido a todos ellos lo cual se
denomina modo ”broadcast” o transmisión pública. Las respuestas de los esclavos a los direccionamientos
individuales se dan de una manera específica. Para los mensajes en modo “broadcast” no hay respuestas
por parte de los esclavos. El protocolo establece el formato para la solicitud del maestro poniendo en ella
la dirección del esclavo, el código de la función, cualquier dato a ser enviado y un campo de chequeo de
error. La respuesta del esclavo está compuesta en Modbus y contiene campos que confirman la función
solicitada, los datos y el chequeo de error. Si ocurre un error recibiendo un mensaje, el esclavo construye
un mensaje de error que se envía como respuesta. Esto se aprecia en la figura 2.1.
Campos de las tramas MODBUS
El número de campos de las tramas MODBUS varía ligeramente dependiendo de si utilizamos la codificación
ASCII o RTU:
Codificación ASCII (formato texto):
- Inicio de trama: 2 caracteres ASCII (que representan 1 byte) codificando el carácter “:” (0x3A)
- Nº Esclavo: 2 caracteres ASCII (que representan 1 byte) codificando la dirección del esclavo destino (u
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º Esclavo: 1 byte con la dirección del esclavo destino (u 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 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.

 Ordenes 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”.
Es también mediante el código de función que el esclavo confirma si la operación se ha ejecutado
correctamente o no. Si ha ido bien responde con el mismo código de operación que se le ha enviado,
mientras que si se ha producido algún error, responde también con el mismo código de operación pero con
su bit de más peso a 1 ( 0x80 ) y un byte en el campo de datos indicando el código de error que ha tenido
lugar.
- 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.
Al establecer la dirección de una variable u otro elemento en el mapa de direcciones MODBUS,
direccionamos con 1 unidad menos a la del registro al que queremos acceder, de manera que si p.ej.
quisiéramos acceder al relé @ 127d, lo haríamos situando el valor 126d en el byte del campo de dirección.
Otros ejemplos:
 El relé número 1 de un controlador se direccionaría con el valor 0000 en el campo de dirección de
un mensaje MODBUS.
 El relé 0x007F (127d) de un controlador se direccionaría con el valor 0x007E ( 126d ) en el campo
de dirección de un mensaje MODBUS.
 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 )
Generalmente en MODBUS cada tipo de dato se mapea en un rango de memoria concreto:
@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).
Algunos fabricantes expresan la dirección de forma compuesta, separando la dirección de palabra y la
dirección de bit: p.ej word 0x30 bit 1
Como se cita en el apartado de “Código de Operación o Función”, cuando se produce un error en la
ejecución de un comando en el esclavo, este responde poniendo a 1 el bit de más peso del código de función
(0x80). Con este bit el maestro sabe que se ha producido un error, pero para obtener más detalle sobre el
tipo de error, ha de comprobar el campo de datos:

Código Nombre Significado


ILLEGAL
01 El código de función recibido no se corresponde a ningún comando disponible en el esclavo
FUNCTION

ILEGAL DATA
02 La dirección indicada en la trama no se corresponde a ninguna dirección válida del esclavo
ADRESS

ILLEGAL DATA
03 El valor enviado al esclavo no es válido
VALUE

SLAVE DEVICE El esclavo ha recibido la trama y la ha comenzado a procesar, pero se ha producido algún error y no ha podido
04
FAILURE termina la tarea.

El esclavo ha recibido la trama y la está procesando pero esto le llevará un periodo un poco largo. Mediante
05 ACKNOWLEDGE esta respuesta se evita que el máster considere un error de timeout. El máster podrá enviar más tarde una
trama una trama de tipo Poll Program Complete para verificar si ha completado el comando

SLAVE DEVICE El esclavo está ocupado realizando otra tarea y no puede atender a esa petición en ese instante por lo que el
06
BUSY 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 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. La siguiente es una implementación en C de la función de cálculo del CRC (modo
RTU):
“…
#definePOLY0xA001
unsignedcrc16(char*buf,intlen)
{
char i;
unsigned crc;

for(crc=0xFFFF;len!=0;len--){
crc^=*buf++;
for(i=0;i<8;i++){
if(crc&0x0001){
crc=(crc>>1)^POLY;
}else{
crc>>=1;
}
}
}
return(crc);
}
…”
En C#:

“…
uint crc16(byte [ ] buf , uint len)
{
uint POLY=0xA001;
int crc;
uint i;
uint j;

j = 0;
for (crc = 0xFFFF; len != 0; len --){
crc ^= buf[j];
j++;
for (i = 0; i < 8; i ++){
if ((crc & 0x0001)>0){
crc = (crc >> 1) ^ POLY;
}else{
crc >>= 1;
}
}
}
return (crc);
}
…”

El siguiente es un ejemplo en modo ASCII y RTU de petición de lectura de 3 registros del esclavo y la
correspondiente respuesta:

 PETICION de 3 datos:

8bits modo
Nombre del campo Ejemplo ( HEX ) Caracteres ASCII
RTU

Cabecera : Ninguno

Dirección esclavo 06 “06” 0000 0110

Función 03 “03” 0000 0011

Dirección inicio Hi 00 “00” 0000 0000

Dirección inicio Lo 6B “6B” 0110 1011

Núm. de Registros Hi 00 “00” 0000 0000

Núm. de Registros Lo 03 “03” 0000 0011

LRC ( 2
Error Check CRC (16 bits)
caracteres )

Fin de trama CR LF Ninguno

Total: 17 bytes 8 bytes


 RESPUESTA con los 3 datos:

Nombre del campo Ejemplo (HEX) Caracteres ASCII 8bits modo RTU

Cabecera : Ninguno

Dirección esclavo 06 “06” 0000 0110

Función 03 “03” 0000 0011

Numero de bytes de datos 06 “06” 0000 0110

Dato 0 Hi 02 “02” 0000 0010

Dato 0 Lo 2B “2B” 0010 1011

Dato 1 Hi 00 “00” 0000 0000

Dato 1 Lo 00 “00” 0000 0000

Dato 2 Hi 00 “00” 0000 0000

Dato 2 Lo 63 “63” 0110 0011

Error Check LRC (2 caracteres ) CRC (16 bits)

Fin de trama CR LF Ninguno

Total: 23 bytes 11 bytes

Descripción de los códigos de operación o función más frecuentes

Los siguientes códigos son algunos de los códigos de función MODBUS más extendidos, soportados por
todos los dispositivos que cumplen con las especificaciones del estándar (controladores de MODICON):
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 de 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.

Petición del máster (modo RTU):

Nº Esclavo

Código Operación: 0x01 o 0x02

Dirección del registro (de 1 bit) a leer H

Dirección del registro (de 1 bit) a leer L

Nº de bits que se desea leer H

Nº de bits que se desea leer L

CRC (16): H

CRC (16):

Respuesta del esclavo (modo RTU):

Nº Esclavo

Código Operación: 0x01 o 0x02

Nº bytes leidos: 1 byte

Octetos: max 256 bytes

CRC (16): H

CRC (16): L

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)

Petición del máster (modo RTU):

Nº Esclavo

Código Operación: 0x03 o 0x04

Dirección del registro:

Nº de datos que se desea leer: Max 128 datos

CRC (16): H L

Respuesta del esclavo (modo RTU):

Nº Esclavo

Código Operación: 0x03 o 0x04

Nº de bytes leidos: 1 byte

Datos: ¿Max 128 datos?

CRC (16): H L

Ej 1:

P: [01][03][01][00][00][06][C4][34]

R:[01][03][0C][20][81][00][00][00][00][00][00][00][00][1C][01][76][F1]

Ej 2:

P: [0A][04][00][00][00][0A][71][76]

0A numero de periférico

04 funciones de lectura

00 00 registro donde se va a comenzar la lectura

00 0A número de registros a leer: 10


71 76 CRC

R:[0A][04][14][00][00][08][4D][00][00][23][28][00][00][0F][A0][00][00][00][90][00][00][00][60][CB][2E]

0A Número del periférico que responde, 10 en decimal

04 Función de lectura - la que se ha utilizado en la pregunta

14 Número de bytes recibidos (20).

00 00 08 4D V1x 10 (registro 00 Hex) con valor en decimal 212,5 V

00 00 23 28 mA 1, en decimal 9000 mA

00 00 0F A0 W 1, en decimal 4000 W

00 00 00 90 varL 1, en decimal 144 varL

00 00 00 60 PF1 x 100, en decimal 96

CB 2E CRC

Ej 3:

P:[01][03][00][30][00][10][44][09]

Lectura en el esclavo @1 de 16 registros a partir de la dirección 0x0030

R:[01][03][20][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]

[27][0F][16][18][00][00][2E][DF][00][00][42][CF]

01 dirección del esclavo que responde

03 Función de lectura

20 Numero de bytes recibidos

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 27 0F 16 18 00 00 2E DF 00 00

Respuesta (32 bytes a 2 bytes por registro: 16 registros)

42 CF CRC H L

Función 5 ( Force Single Coil ):

Permite modificar el estado de una DO del esclavo (mando o relé) . Es decir mediante este comando
podemos 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.

Petición del máster (modo RTU):

Nº Esclavo

Código Operación: 0x05

Dirección del bit:

Estado para el bit: 0xXX (0x00: 0, 0xFF: 1)

Byte a 0x00

CRC (16): H L

Respuesta del esclavo (modo RTU):

Nº Esclavo

Código Operación: 0x05

Dirección del bit:

Estado para el bit: 0xXX (0x00: 0, 0xFF: 1)

Byte a 0x00

CRC (16): H L

Ej 1:

P:[01][05][00][01][FF][00] [DD][FA]

R:[01][05][00][00][FF][00][8C][3A]

Ej 2:

P:[01][05][00][00][00][00][CD][CA]

R:[01][05][00][01][00][00] [9C][0A]

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). Deberemos indicar la dirección del valor que queremos
modificar y la magnitud que queremos asignarle. 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)

Petición del máster (modo RTU):

Nº Esclavo

Código Operación: 0x06

Dirección del dato:

Valor del dato:

CRC (16): H L

Respuesta del esclavo (modo RTU):

Nº Esclavo

Código Operación: 0x06

Dirección del dato:

Valor del dato:

CRC (16): H L

Ej:

P: [01][06][01][F1][00][02][58][04]

R: [01][06][01][F1][00][02][58][04]

Función 7 (Read Exception Status):

Permite la lectura rápida de un byte fijo 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):

Petición del master (modo RTU):

Nº Esclavo
Código Operación: 0x07

CRC (16): H L

Respuesta del esclavo (modo RTU):

Nº Esclavo

Código Operación: 0x07

Valor del octeto:

CRC (16): H L

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.

Petición del máster (modo RTU):

Nº Esclavo

Código Operación: 0x0F

Dirección inicial de los mandos (bits) H

Dirección inicial de los mandos (bits) L

Cantidad de mandos (bits) H

Cantidad de mandos (bits) L

Cantidad de bytes enviados con el estado de los mandos (bits)

Estado de los 8 primeros mandos (bits) a modificar

Estado de los 8 siguientes mandos (bits) a modificar

...
Estado de los 8 últimos mandos (bits) a modificar

CRC (16): H L

Aunque el estado de las DOs se especifica bit a bit, las tramas se componen de bytes, y esto obliga a enviar
los estados en grupos de 8. El esclavo no debería hacer caso a los bits sobrantes, es decir, no debería
considerar los que queden por encima del último bit indicado en el campo “cantidad de mandos a
modificar”. Así, si quisiéramos modificar 12 mandos o relés a partir de la dirección 7, indicaríamos como
dirección origen la dirección 7, como cantidad de mandos a modificar 12, y en el campo de estado de
mandos: 0x3C , 0x0B ( el esclavo no considerará los que queden por encima del 12o bit )

Relé: 14 13 12 11 10 09 08 07 - 22 21 20 19 18 17 16 15

Bits: 0 1 1 1 1 0 0 0 X X X X 1 0 1 1

Respuesta del esclavo (modo RTU):

Nº Esclavo

Código Operación: 0x0F

Dirección inicial de los mandos o bits consecutivos H

Dirección del mando o bit L

Cantidad de mandos o bits H

Cantidad de mandos o bits L

CRC (16): H L

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 queremos comenzar a actualizar valores, el número de valores que
queremos actualizar, y la lista de valores que queremos 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)

Petición del máster (modo RTU):

Nº Esclavo
Código Operación: 0x10

Dirección base de los datos: 2 bytes

Número de datos: 2 bytes

Valor del dato 0: 2 bytes

Valor del dato 1: 2 bytes

Valor del dato n: 2 bytes

CRC (16): H L

Respuesta del esclavo (modo RTU):

Nº Esclavo

Código Operación: 10H

Dirección base de los datos: 2 bytes

Número de datos: 2 bytes

CRC (16): H L

Función 20 (Read General Reference):

Retorna el contenido de los registros 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 dirección del "fichero" a partir de la que queremos comenzar a leer: 2 bytes

- La cantidad de registros a leer: 2 bytes


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

Petición del máster (modo RTU):

Slave Address 0x11

Function 0x14

Byte Count 0x0E

Sub–Req 1, Reference Type 0x06


Sub–Req 1, File Number Hi 0x00
Sub–Req 1, File Number Lo 0x04
Sub–Req 1, Starting Addr Hi 0x00
Sub–Req 1, Starting Addr Lo 0x01
Sub–Req 1, Register Count Hi 0x00
Sub–Req 1, Register Count Lo 0x02
Sub–Req 2, Reference Type 0x06
Sub–Req 2, File Number Hi 0x00
Sub–Req 2, File Number Lo 0x03
Sub–Req 2, Starting Addr Hi 0x00
Sub–Req 2, Starting Addr Lo 0x09
Sub–Req 2, Register Count Hi 0x00
Sub–Req 2, Register Count Lo 0x02
Error Check (LRC or CRC)--

Respuesta del esclavo (modo RTU):

Slave Address 0x11

Function 0x14

Byte Count 0x0C

Sub–Res 1, Byte Count 0x05


Sub–Res 1, Reference Type 0x06
Sub–Res 1, Register Data Hi 0x0D
Sub–Res 1, Register Data Lo 0xFE
Sub–Res 1, Register Data Hi 0x00
Sub–Res 1, Register Data Lo 0x20
Sub–Res 2, Byte Count 0x05
Sub–Res 2, Reference Type 0x06
Sub–Res 2, Register Data Hi 0x33
Sub–Res 2, Register Data Lo 0xCD
Sub–Res 2, Register Data Hi 0x00
Sub–Res 2, Register Data Lo 0x40
Error Check (LRC or CRC)
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 por qué 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 dirección del "fichero" a partir de la que queremos comenzar a leer: 2 bytes
 La cantidad de registros a leer: 2 bytes

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

Petición del máster (modo RTU):

Slave Address 0x11

Function 0x5

Byte Count 0x0D

Sub–Req 1, Reference Type 0x06


Sub–Req 1, File Number Hi 0x00
Sub–Req 1, File Number Lo 0x04
Sub–Req 1, Starting Addr Hi 0x00
Sub–Req 1, Starting Addr Lo 0x07
Sub–Req 1, Register Count Hi 0x00
Sub–Req 1, Register Count Lo 0x03
Sub–Req 1, Register Data Hi 0x06
Sub–Req 1, Register Data Lo 0xAF
Sub–Req 1, Register Data Hi 0x04
Sub–Req 1, Register Data Lo 0xBE
Sub–Req 1, Register Data Hi 0x10
Sub–Req 1, Register Data Lo 0x0D
Error Check (LRC or CRC) ––

Respuesta del esclavo (modo RTU):

Slave Address 0x11

Function 0x15

Byte Count 0x0D

Sub–Req 1, Reference Type 0x06


Sub–Req 1, File Number Hi 0x00
Sub–Req 1, File Number Lo 0x04
Sub–Req 1, Starting Addr Hi 0x00
Sub–Req 1, Starting Addr Lo 0x07
Sub–Req 1, Register Count Hi 0x00
Sub–Req 1, Register Count Lo 0x03
Sub–Req 1, Register Data Hi 0x06
Sub–Req 1, Register Data Lo 0xAF
Sub–Req 1, Register Data Hi 0x04
Sub–Req 1, Register Data Lo 0xBE
Sub–Req 1, Register Data Hi 0x10
Sub–Req 1, Register Data Lo 0x0D
Error Check (LRC or CRC)

Ejemplos

Read Coil Status (FC=01)

Request

This command is requesting the ON/OFF status of discrete coils # 20 to 56


from the slave device with address 17.

11 01 0013 0025 0E84

11: The Slave Address (11 hex = address17 )


01: The Function Code 1 (read Coil Status)
0013: The Data Address of the first coil to read.
( 0013 hex = 19 , + 1 offset = coil #20 )
0025: The total number of coils requested. (25 hex = 37, inputs 20 to 56 )
0E84: The CRC (cyclic redundancy check) for error checking.

Response

11 01 05 CD6BB20E1B 45E6

11: The Slave Address (11 hex = address17 )


01: The Function Code 1 (read Coil Status)
05: The number of data bytes to follow (37 Coils / 8 bits per byte = 5 bytes)
CD: Coils 27 - 20 (1100 1101)
6B: Coils 35 - 28 (0110 1011)
B2: Coils 43 - 36 (1011 0010)
0E: Coils 51 - 44 (0000 1110)
1B: 3 space holders & Coils 56 - 52 (0001 1011)
45E6: The CRC (cyclic redundancy check).

The more significant bits contain the higher coil variables. This shows that coil 36 is off (0) and 43 is on (1).
Due to the number of coils requested, the last data field1B contains the status of only 5 coils. The three
most significant bits in this data field are filled in with zeroes.

Read Input Status (FC=02)

Request

This command is requesting the ON/OFF status of discrete inputs # 10197 to 10218
from the slave device with address 17.

11 02 00C4 0016 BAA9

11: The Slave Address (11 hex = address17 )


02: The Function Code 2 (read Input Status)
00C4: The Data Address of the first input to read.
( 00C4 hex = 196 , + 10001 offset = input #10197 )
0016: The total number of coils requested. (16 hex = 22, inputs 197 to 218 )
BAA9: The CRC (cyclic redundancy check) for error checking.

Response

11 02 03 ACDB35 2018

11: The Slave Address (11 hex = address17 )


02: The Function Code 2 (read Input Status)
03: The number of data bytes to follow (22 Inputs / 8 bits per byte = 3 bytes)
AC: Discrete Inputs 10204 -10197 (1010 1100)
DB: Discrete Inputs 10212 - 10205 (1101 1011)
35: 2 space holders & Discrete Inputs 10218 - 10213 (0011 0101)
2018: The CRC (cyclic redundancy check).

The more significant bits contain the higher Discrete inputs. This shows that input 10197 is off (0) and 10204
is on (1). Due to the number of inputs requested, the last data field 35contains the status of only 6
inputs. The two most significant bits in this data field are filled in with zeroes.

Read Holding Registers (FC=03)

Request

This command is requesting the content of analog output holding registers # 40108 to
40110 from the slave device with address 17.

11 03 006B 0003 7687


11: The Slave Address (11 hex = address17 )
03: The Function Code 3 (read Analog Output Holding Registers)
006B: The Data Address of the first register requested.
(006B hex = 107 , + 40001 offset = input #40108 )
0003: The total number of registers requested. (read 3 registers 40108 to 40110)
7687: The CRC (cyclic redundancy check) for error checking.

Response

11 03 06 AE41 5652 4340 49AD

11: The Slave Address (11 hex = address 17 )


03: The Function Code 3 (read Analog Output Holding Registers)
06: The number of data bytes to follow (3 registers x 2 bytes each = 6 bytes)
AE41: The contents of register 40108
5652: The contents of register 40109
4340: The contents of register 40110
49AD: The CRC (cyclic redundancy check).

Read Input Registers (FC=04)

Request

This command is requesting the content of analog input register # 30009


from the slave device with address 17.

11 04 0008 0001 B298

11: The Slave Address (11 hex = address17 )


04: The Function Code 4 (read Analog Input Registers)
0008: The Data Address of the first register requested.
( 0008 hex = 8 , + 30001 offset = input register #30009 )
0001: The total number of registers requested. (read 1 register)
B298: The CRC (cyclic redundancy check) for error checking.

Response

11 04 02 000A F8F4

11: The Slave Address (11 hex = address17 )


04: The Function Code 4 (read Analog Input Registers)
02: The number of data bytes to follow (1 registers x 2 bytes each = 2 bytes)
000A: The contents of register 30009
F8F4: The CRC (cyclic redundancy check).

Force Single Coil (FC=05)


Request

This command is writing the contents of discrete coil # 173 to ON


in the slave device with address 17.

11 05 00AC FF00 4E8B

11: The Slave Address (11 hex = address17 )


05: The Function Code 5 (Force Single Coil)
00AC: The Data Address of the coil. (coil# 173 - 1 = 172 = AC hex).
( 00AC hex = 172 , + 1 offset = coil #173 )
FF00: The status to write ( FF00 = ON, 0000 = OFF )
4E8B: The CRC (cyclic redundancy check) for error checking.

Response

The normal response is an echo of the query, returned after the coil has been written.

11 05 00AC FF00 4E8B

11: The Slave Address (11 hex = address17 )


05: The Function Code 5 (Force Single Coil)
00AC: The Data Address of the coil. (coil# 173 - 1 = 172 = AC hex)
FF00: The status written ( FF00 = ON, 0000 = OFF )
4E8B: The CRC (cyclic redundancy check) for error checking.

Preset Single Register (FC=06)

Request

This command is writing the contents of analog output holding register # 40002
to the slave device with address 17.

11 06 0001 0003 9A9B

11: The Slave Address (11 hex = address17 )


06: The Function Code 6 (Preset Single Register)
0001: The Data Address of the register.
( 0001 hex = 1 , + 40001 offset = register #40002 )
0003: The value to write
9A9B: The CRC (cyclic redundancy check) for error checking.

Response

The normal response is an echo of the query, returned after the register contents have been written.

11 06 0001 0003 9A9B


11: The Slave Address (11 hex = address17 )
06: The Function Code 6 (Preset Single Register)
0001: The Data Address of the register. (# 40002 - 40001 = 1 )
0003: The value written
9A9B: The CRC (cyclic redundancy check) for error checking.

Force Multiple Coils (FC=15)

Request

This command is writing the contents of a series of 10 discrete coils from #20 to #29
to the slave device with address 17.

11 0F 0013 000A 02 CD01 BF0B

11: The Slave Address (11 hex = address17 )


0F: The Function Code 15 (Force Multiple Coils, 0F hex = 15 )
0013: The Data Address of the first coil.
( 0013 hex = 19 , + 1 offset = coil #20 )
000A: The number of coils to written ( 0A hex = 10 )
02: The number of data bytes to follow (10 Coils / 8 bits per byte = 2 bytes)
CD: Coils 27 - 20 (1100 1101)
01: 6 space holders & Coils 29 - 28 (0000 0001)
BF0B: The CRC (cyclic redundancy check) for error checking.

The more significant bits contain the higher coil variables. This shows that coil 20 is on (1) and 21 is off (0).
Due to the number of coils requested, the last data field01 contains the status of only 2 coils. The unused
bits in the last data byte are filled in with zeroes.

Response

11 0F 0013 000A 2699

11: The Slave Address (11 hex = address17 )


0F: The Function Code (Force Multiple Coils, 0F hex = 15 )
0013: The Data Address of the first coil.
( 0013 hex = 19 , + 1 offset = coil #20 )
000A: The number of coils to written ( 0A hex = 10 )
2699: The CRC (cyclic redundancy check) for error checking.

Preset Multiple Registers (FC=16)

Request

This command is writing the contents of two analog output holding registers # 40002 & 40003 to the slave
device with address 17.
11 10 0001 0002 04 000A 0102 C6F0

11: The Slave Address (11 hex = address17 )


10: The Function Code 16 (Preset Multiple Registers, 10 hex - 16 )
0001: The Data Address of the first register.
( 0001 hex = 1 , + 40001 offset = register #40002 )
0002: The number of registers to write
04: The number of data bytes to follow (2 registers x 2 bytes each = 4 bytes)
000A: The value to write to register 40002
0102: The value to write to register 40003
C6F0: The CRC (cyclic redundancy check) for error checking.

Response

11 10 0001 0002 1298

11: The Slave Address (17 = 11 hex)


10: The Function Code 16 (Preset Multiple Registers, 10 hex - 16 )
0001: The Data Address of the first register. (# 40002 - 40001 = 1 )
0002: The number of registers written.
1298: The CRC (cyclic redundancy check) for error checking.
PROTOCOLO MODBUS RTU

MESSAGE FRAME FORMAT

ADDRESS FIELD FUNCTION FIELD DATA FIELD ERROR CHECK FIELD

1 BYTE (1-247 UI) 1 BYTE Variable 2 BYTES

DATA TYPES

COILS SALIDAS DIGITALES


DISCRETE INPUTS ENTRADAS DIGITALES
INPUT REGISTERS ENTRADAS ANÁLOGAS
HOLDING REGISTERS POSICIONES DE MEMORIA

ADDRESSES AND FUNCTION CODES


ABSOLUTE RELATIVE FUNCTION
DATA TYPE ADDRESSES ADDRESSES CODES DESCRIPTION
COILS 00001-09999 0-9998 01 READ COIL STATUS
COILS 00001-09999 0-9998 05 FORCE SINGLE COIL
COILS 00001-09999 0-9998 15 FORCE MULTIPLE COILS
DISCRETE INPUTS 10001-19999 0-9998 02 READ INPUT STATUS
INPUT REGISTERS 30001-39999 0-9998 04 READ INPUT REGISTERS
HOLDING REGISTERS 40001-49999 0-9998 03 READ HOLDING REGISTERS
HOLDING REGISTERS 40001-49999 0-9998 06 PRESET SINGLE REGISTER
HOLDING REGISTERS 40001-49999 0-9998 16 PRESET MULTIPLE REGISTERS
- - - 07 READ EXCEPTION STATUS
- - - 08 LOOPBACK DIAGNOSTIC TEST
FUNCTION FUNCTION
CODE DESCRIPTION CODE DESCRIPTION
01 READ COIL STATUS 02 READ INPUT STATUS

REQUEST MESSAGE REQUEST MESSAGE

INITIAL COIL

INITIAL COIL
NUMBER OF

NUMBER OF
OFFSET

OFFSET
POINTS

POINTS
FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
L L
HI LO HI O HI LO HI O
0 0 0
01 01 0 0A 0 02 9D C9 01 02 0 00 00 02 F9 CB

RESPONSE FRAME RESPONSE FRAME


BYTE COUNT

BYTE COUNT
COIL DATA

COIL DATA
FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
01 01 01 03 11 89 01 02 01 02 20 49

FUNCTION FUNCTION
CODE DESCRIPTION CODE DESCRIPTION
03 READ HOLD. REGISTERS 04 READ INPUT REGISTERS

REQUEST MESSAGE REQUEST MESSAGE


REGISTER

REGISTER

REGISTER

REGISTER
STARTING

STARTING
COUNT

COUNT
FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC

L L
HI LO HI O HI LO HI O
0 0 0
01 03 0 02 0 01 25 CA 01 04 0 00 00 01 31 CA
RESPONSE FRAME RESPONSE FRAME

REGISTER

REGISTER
BYTE COUNT

BYTE COUNT
FUNCTION

FUNCTION
DATA

DATA
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
L L
HI O HI O
0
01 03 02 7 FF FA 34 01 04 02 03 FF F9 80

FUNCTIONCODE DESCRIPTION FUNCTIONCODE DESCRIPTION


05 FORCE SINGLE COIL 06 PRESET SINGLE REGISTER

REQUEST MESSAGE REQUEST MESSAGE


COIL OFFSET

REGISTER

REGISTER
NEW COIL
STATUS

OFFSET

VALUE
FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
L L
HI LO HI O HI LO HI O
0 0 0 0
01 05 0 0A 0 00 ED C8 01 06 0 02 C 00 2D 0A

RESPONSE FRAME RESPONSE FRAME


COIL OFFSET

REGISTER

REGISTER
NEW COIL
STATUS

OFFSET

VALUE
FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
L L
HI LO HI O HI LO HI O
0 0 0 0
01 05 0 0A 0 00 ED C8 01 06 0 2 C 00 2D 0A

FUNCTION FUNCTION
CODE DESCRIPTION CODE DESCRIPTION

REQUEST MESSAGE REQUEST MESSAGE


FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
L L
HI LO HI O HI LO HI O

RESPONSE FRAME RESPONSE FRAME


FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
L L
HI LO HI O HI LO HI O

FUNCTION FUNCTION
CODE DESCRIPTION CODE DESCRIPTION

REQUEST MESSAGE REQUEST MESSAGE


FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

CRC
L L
HI LO HI O HI LO HI O

RESPONSE FRAME RESPONSE FRAME


FUNCTION

FUNCTION
ADDRESS

ADDRESS
CODE

CODE
CRC

L L CRC
HI LO HI O HI LO HI O

S-ar putea să vă placă și