Está en la página 1de 6

1-Introduccin

El protocolo de comunicaciones industriales MODBUS fue desarrollado en 1979 por la empresa norteamericana
MODICON y debido a que es pblico, relativamente sencillo de implementar y flexible se ha convertido en uno de los
protocolos de comunicaciones ms populares en sistemas de automatizacin y control. A parte de que muchos
fabricantes utilizan este protocolo en sus dispositivos, existen tambin versiones con pequeas modificaciones o
adaptadas para otros entornos ( como p.ej JBUS o MODBUS II )
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.
Este documento explica la especificacin MODBUS de forma general, sin entrar en mucho detalle en algunas de sus
particularidades, no obstante su contenido ha de ser ms que suficiente para aquellos que deseen comprender el
funcionamiento general de este estndar. Por otro lado, quien desee realizar una implementacin precisa de
MODBUS deber recurrir a la documentacin oficial de MODICON o a la documentacin especifica del fabricante de
los equipos con los que va a comunicar.

2-Descripcin 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 accin indicada por el maestro. La
comunicacin del maestro hacia los esclavos puede ser de dos tipos:
- peer to peer: en que se establece comunicacin maestro - esclavo , el maestro solicita informacin y el esclavo
responde ( se enva el comando a un dispositivo comprendido entre las direcciones 1d i 247d ).
-broadcast: en que se establece comunicacin maestro - todos los esclavos , el maestro enva un comando a
todos los esclavos de la red sin esperar respuesta ( se enva a la direccin @0d ).
Como se puede ver, la secuencia bsica en las comunicaciones MODBUS consiste siempre en una trama de
pregunta, seguida de su correspondiente trama de respuesta:
- Pregunta: con el cdigo de funcin que indica al esclavo que operacin ha de realizar, y los bytes necesarios
( datos, comprobacin ) para su ejecucin.
- Respuesta: con la confirmacin o datos resultantes de la ejecucin de la funcin.
Existe algn caso concreto, en que hay ms de una trama de respuesta para una trama de pregunta, como p.ej.
cuando el maestro enva una operacin cuya respuesta puede llevar al esclavo un tiempo elaborar. En estas
situaciones el esclavo enva una primera respuesta indicando que an no tiene los datos y tardar un tiempo en
disponer de ellos, y otra segunda con los datos o confirmacin de la operacin.
Adems las comunicaciones MODBUS se pueden realizar en modo ASCII o en modo RTU. En modo ASCII los bytes
se envan codificados en ASCII, es decir, que por cada byte a transmitir se envian dos caracteres ASCII ( 2 bytes )
con su representacin hexadecimal ( esto permite leer las tramas con un simple editor de texto ). En modo RTU se
envan en binario, tal cual. En el modo ASCII las tramas comienzan por 3AH (carcter ':'), y terminan en 0DH-0AH
(CR LF Carrier Return Line Feed) y cada byte se enva como dos caracteres ASCII. En modo RTU no se utiliza
indicador de inicio y final de trama.

Carcteres
Comprob. Error

Modo ASCII
ASCII 09,A.F
LRC Longitudinal Redundancy check

Modo RTU
Binario 0255
CRC Cyclic Redundancy Check

Inicio de trama
Final de trama
Distancia max. entre caracteres
Bit de inicio
Bits de datos
Paridad
Bits de parada

Carater :
Character CR/CL
1 seg
1
7
Par / Impar / Ninguna
1 si hay paridad 2 si ninguna

3.5 veces t de carcter


3.5 veces t de carcter
1.5 veces t de carcter
1
8
Par / Impar / Ninguna
1 si hay paridad 2 si ninguna

3-Campos de las tramas MODBUS


El nmero de campos de las tramas MODBUS vara ligeramente dependiendo de si utilizamos la codificacin ASCII o
RTU:
Codificacin ASCII ( formato texto ):
-Inicio de trama: 2 caracteres ASCII ( que representan 1 byte ) codificando el caracter : (0x3A)
-NEsclavo: 2 caracteres ASCII ( que representan 1 byte ) codificando la direccin del esclavo destino ( o origen ) de
la trama
-Cdigo Operacin: 2 caracteres ASCII ( que representan 1 byte ) con el cdigo de operacin
-Direccin, datos y subfunciones Datos: con los parmetros necesarios para realizar la operacin.
-LRC(16): H L
-Final de trama: 4 caracteres ASCII ( que representan 2 bytes ) con los caracteres CR (0x0D) - LF (0x0A)
Codificacin RTU (en el formato binario, el inicio de trama debera ser tras 3.5 tiempo de carcter):
-NEsclavo: 1 byte con la direccin del esclavo destino ( o origen ) de la trama
-Cdigo Operacin: 1 byte con el cdigo de operacin
-Subfunciones Datos: con los parmetros necesarios para realizar la operacin.
-CRC(16): H L.

4-Descripcin de los campos de las tramas MODBUS


- Nmero de Esclavo (1byte): En el caso de las tramas enviadas por el mster, el campo de nmero de esclavo
indica la direccin 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 direccin 1
( de 1 a 247 ). En el caso de las tramas enviadas por los esclavos, este byte sirve para indicar al mster a quin
pertenece la respuesta. Es decir, cada vez que un esclavo responde, sita su propia direccin en el byte de direccin
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.
- Cdigo de Operacin o Funcin ( 1byte): Indica el tipo de operacin 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 actuacin sobre el esclavo.
El cdigo de operacin puede tomar cualquier valor comprendido entre el 0 y el 127 ( el bit de ms peso se reserva
para indicar error ). Cada cdigo se corresponde con una determinada operacin. Algunos de estos cdigos se
consideran estndar y son aceptados e interpretados por igual por todos los dispositivos que dicen ser compatibles
con MODBUS, mientras que otros cdigos son implementaciones propias de cada fabricante. Es decir que algunos
fabricantes realizan implementaciones propias de estos cdigos no estndar.
Es tambin mediante el cdigo de funcin que el esclavo confirma si la operacin se ha ejecutado correctamente o

no. Si ha ido bien responde con el mismo cdigo de operacin que se le ha enviado, mientras que si se ha producido
algn error, responde tambin con el mismo cdigo de operacin pero con su bit de ms peso a 1 ( 0x80 ) y un byte
en el campo de datos indicando el cdigo de error que ha tenido lugar.
- Direccin, datos y subfunciones (n bytes): Este campo contiene la informacin necesaria para realizar la
operacin indicada en el cdigo de operacin. Cada operacin necesitar de unos parmetros u otros, por lo que el
nmero de bytes de este campo variar segn la operacin a realizar. En el caso del esclavo, este puede responder
con tramas con o sin campo de datos dependiendo de la operacin. En los casos en que se produzca algn error es
posible que el esclavo responda con un byte extra para especificar el cdigo de error.
Al establecer la direccin 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. quisiramos acceder al rel @ 127d,
lo haramos situando el valor 126d en el byte del campo de direccin. Otros ejemplos:
- El rel nmero 1 de un controlador se direccionara con el valor 0000 en el campo de direccin de un mensaje
MODBUS.
- El rel 0x007F (127d ) de un controlador se direccionara con el valor 0x007E ( 126d ) en el campo de direccin de
un mensaje MODBUS.
- El Holding Register 40001 se accedera situando el valor 0000 en el campo de direccin del mensaje. Como se
puede ver el cdigo de funcin de acceso a los Holding Registers lleva implcito el acceso a la direccin 4XXXX.
- El Holding Register 40108 es accedido leiendo de la direccin 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 direccin 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 mltiple).
@10001-20000 (DIs - digital inputs): 1 bit por direccin para leer el estado de una entrada digital ( 0 desactivada, 1
activada ) tambin denominadas DIs ( Digital Inputs ). Las direcciones de este rango se suelen acceder con la funcin
2 (lectura) y llevan implcita la direccin 10001 como direccin base ( para acceder a una direccin bastar con
especificar la distancia entre esta y la direccin base ).
@20001-30000: el protocolo MODBUS estndar no hace uso de este rango de direcciones.
@30001-40000 (AIs - analog inputs): 16 bits por direccin con el estado de las medidas o entradas analgicas
tambin denominadas AIs ( Analog Inputs ). Dependiendo del dispositivo este puede hacer uso de ms de un registro
para almacenar la informacin de la medida, as con 2 registros consecutivos podramos almacenar medidas de 32
bits. Las direcciones de este rango se acceden mediante la funcin 4 (lectura) y llevan implcita la direccin 30001
como direccin base ( para acceder a una direccin bastar con especificar la distancia entre esta y la direccin base
).
@40001-50000 (AOs - analog outputs): 16 bits con los registros de salidas analgicas o de propsito general
( Output Registers Holding Registers). Se acceden con las funciones 3 ( lectura ), 6 ( escritura ) o 16 ( escritura
mltiple ) y llevan implcita la direccin 40001 como direccin base ( para acceder a una direccin bastar con
especificar la distancia entre esta y la direccin base ).
Algunos fabricantes expresan la direccin de forma compuesta, separando la direccin de palabra y la direccin de
bit: p.ej word 0x30 bit 1

Como se cita en el apartado de Cdigo de Operacin o Funcin, cuando se produce un error en la ejecucin de un
comando en el esclavo, este responde poniendo a 1 el bit de ms peso del codigo de funcin ( 0x80 ). Con este bit el
maestro sabe que se ha producido un error, pero para obtener mas detalle sobre el tipo de error, ha de comprobar el
campo de datos:
Codigo Nombre
ILLEGAL
01
FUNCTION
ILEGAL DATA
02
ADRESS
ILLEGAL DATA
03
VALUE
SLAVE DEVICE
04
FAILURE
05

ACKNOWLEDGE

06

SLAVE DEVICE
BUSY

Significado
El cdigo de funcin recibido no se corresponde a ningn comando disponible en el esclavo
La direccin indicada en la trama no se corresponde a ninguna direccin vlida del esclavo
El valor enviado al esclavo no es vlido
El esclavo ha recibido la trama y la ha comenzado a procesar, pero se ha producido algn error y no
ha podido termina la tarea.
El esclavo ha recibido la trama y la est procesando pero esto le llevar un periodo un poco largo.
Mediante esta respuesta se evita que el mster considere un error de timeout. El mster podr
enviar ms tarde una trama una trama de tipo Poll Program Complete para verificar si ha completado
el comando
El esclavo est ocupado realizando otra tarea y no puede atender a esa peticin en ese instante por
lo que el mster tendr que reintentarlo ms adelante.

- Control de errores LRC o CRC: Se utiliza un sistema de deteccin de errores diferente dependiendo del tipo de
codificacin utilizado ( ASCII o RTU ) . En el caso de la codificacin ASCII es el checksum ( o Longitud Redundancy
Check LRC ) en mdulo 16 expresado en ASCII ( 2 caracteres representan 1 byte ), sin considerar el ":" ni el CR LF
de la trama. En la codificacin RTU se utiliza el mtodo 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 posicin 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 implementacin en C de la funcin de clculo 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 peticin de lectura de 3 registros del esclavo y la
correspondiente respuesta :
-PETICION de 3 datos:
Nombre del campo
Cabecera
Direccin esclavo
Funcin
Direccion inicio Hi
Direccion inicio Lo
Num de Registros Hi
Num de Registros Lo
Error Check

Ejemplo ( HEX )

Caracteres ASCII
:
06
03
00
6B
00
03
LRC ( 2 caracteres )

8bits modo RTU


Ninguno
0000 0110
0000 0011
0000 0000
0110 1011
0000 0000
0000 0011
CRC (16 bits)

Fin de trama

CR LF

Ninguno

Total:

17 bytes

8 bytes

06
03
00
6B
00
03

-RESPUESTA con los 3 datos:


Nombre del campo
Cabecera
Direccin esclavo
Funcin
Numero de bytes de datos
Dato 0 Hi
Dato 0 Lo
Dato 1 Hi
Dato 1 Lo
Dato 2 Hi
Dato 2 Lo
Error Check
Fin de trama

Ejemplo (HEX)
06
03
06
02
2B
00
00
00
63

Caracteres ASCII
:
06
03
06
02
2B
00
00
00
63
LRC (2 caracteres )

8bits modo RTU


Ninguno
0000 0110
0000 0011
0000 0110
0000 0010
0010 1011
0000 0000
0000 0000
0000 0000
0110 0011
CRC (16 bits)

CR LF

ninguno

Total:

23 bytes

11 bytes

También podría gustarte