Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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:
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.
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.
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.
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:
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
LRC ( 2
Error Check CRC (16 bits)
caracteres )
Nombre del campo Ejemplo (HEX) Caracteres ASCII 8bits modo RTU
Cabecera : Ninguno
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.
Nº Esclavo
CRC (16): H
CRC (16):
Nº Esclavo
CRC (16): H
CRC (16): L
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)
Nº Esclavo
CRC (16): H L
Nº Esclavo
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
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]
00 00 23 28 mA 1, en decimal 9000 mA
00 00 0F A0 W 1, en decimal 4000 W
CB 2E CRC
Ej 3:
P:[01][03][00][30][00][10][44][09]
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]
03 Función de lectura
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 CRC H L
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.
Nº Esclavo
Byte a 0x00
CRC (16): H L
Nº Esclavo
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]
Nº Esclavo
CRC (16): H L
Nº Esclavo
CRC (16): H L
Ej:
P: [01][06][01][F1][00][02][58][04]
R: [01][06][01][F1][00][02][58][04]
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):
Nº Esclavo
Código Operación: 0x07
CRC (16): H L
Nº Esclavo
CRC (16): H L
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.
Nº Esclavo
...
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
Nº Esclavo
CRC (16): H L
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)
Nº Esclavo
Código Operación: 0x10
CRC (16): H L
Nº Esclavo
CRC (16): H L
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:
Function 0x14
Function 0x14
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:
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.
Function 0x5
Function 0x15
Ejemplos
Request
Response
11 01 05 CD6BB20E1B 45E6
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.
Request
This command is requesting the ON/OFF status of discrete inputs # 10197 to 10218
from the slave device with address 17.
Response
11 02 03 ACDB35 2018
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.
Request
This command is requesting the content of analog output holding registers # 40108 to
40110 from the slave device with address 17.
Response
Request
Response
11 04 02 000A F8F4
Response
The normal response is an echo of the query, returned after the coil has been written.
Request
This command is writing the contents of analog output holding register # 40002
to the slave device with address 17.
Response
The normal response is an echo of the query, returned after the register contents have been written.
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.
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
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
Response
DATA TYPES
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
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
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
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
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
FUNCTION
ADDRESS
ADDRESS
CODE
CODE
CRC
CRC
L L
HI LO HI O HI LO HI O
FUNCTION
ADDRESS
ADDRESS
CODE
CODE
CRC
CRC
L L
HI LO HI O HI LO HI O
FUNCTION FUNCTION
CODE DESCRIPTION CODE DESCRIPTION
FUNCTION
ADDRESS
ADDRESS
CODE
CODE
CRC
CRC
L L
HI LO HI O HI LO HI O
FUNCTION
ADDRESS
ADDRESS
CODE
CODE
CRC
L L CRC
HI LO HI O HI LO HI O