Você está na página 1de 19

El protocolo MODBUS Jordi Bartolom 1-2011 1-Introduccin 2-Descripcin general 3-Los campos de las tramas MODBUS 4-Descripcin de los

campos de las tramas MODBUS - Nmero de Esclavo - Cdigo de Operacin o Funcin - Direccin, datos y subfunciones - Control de errores LRC o CRC 5-Descripcin de los cdigos de operacin o funcin ms frecuentes - Funcin 1 o 2 ( 1 Read Coil Status - 2 Read Input Status ) - Funcin 3 o 4 ( 3 Read Holding Registers 4 Read Input Registers ) - Funcin 5 ( Force Single Coil ) - Funcin 6 ( Preset Single Register ) - Funcin 7 ( Read Exception Status ) - Funcin 15 ( Force Multiple Coils ) - Funcin 16 ( Preset multiple registers ) - Funcin 20 ( Read General Reference ) - Funcin 21 ( Write General Reference ) 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, compro bacin ) 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.

Modo ASCII Carcteres Comprob. Error Inicio de trama Final de trama Distancia max. entre caracteres Bit de inicio Bits de datos Paridad Bits de parada ASCII 09,A.F LRC Longitudinal Redundancy check Carater : Character CR/CL 1 seg 1 7 Par / Impar / Ninguna 1 si hay paridad 2 si ninguna

Modo RTU Binario 0255 CRC Cyclic Redundancy Check 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 Significado

01 02 03 04 05 06

ILLEGAL FUNCTION ILEGAL DATA ADRESS ILLEGAL DATA VALUE SLAVE DEVICE FAILURE ACKNOWLEDGE SLAVE DEVICE BUSY

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 Ejemplo ( HEX ) Caracteres ASCII : 8bits modo RTU Ninguno

Direccin esclavo Funcin Direccion inicio Hi Direccion inicio Lo Num de Registros Hi Num de Registros Lo Error Check Fin de trama Total:

06 03 00 6B 00 03

06 03 00 6B 00 03 LRC ( 2 caracteres ) CR LF 17 bytes

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

-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 Total: 06 03 06 02 2B 00 00 00 63 Ejemplo (HEX) Caracteres ASCII : 06 03 06 02 2B 00 00 00 63 8bits modo RTU Ninguno 0000 0110 0000 0011 0000 0110 0000 0010 0010 1011 0000 0000 0000 0000 0000 0000 0110 0011

LRC (2 caracteres ) CRC (16 bits) CR LF 23 bytes ninguno 11 bytes

5-Descripcin de los cdigos de operacin o funcin ms frecuentes Los siguientes cdigos son algunos de los cdigos de funcin MODBUS ms extendidos, soportados por todos los dispositivos que cumplen con las especificaciones del estndar ( controladores de MODICON ):

- Funcin 1 Read Coil Status - Funcin 2 Read Input Status - Funcin 3 Read Holding Registers - Funcin 4 Read Input Registers - Funcin 5 Force Single Coil - Funcin 6 Preset Single Register - Funcin 7 Read Exception Status - Funcin 8 Diagnostics - Funcin 9 Program 484 - Funcin 10 Poll 484 - Funcin 11 Fetch Communication Event Counter - Funcin 12 Fetch Communication Event Log - Funcin 13 Program Controller - Funcin 14 Poll Controller - Funcin 15 Force Multiple Coils - Funcin 16 Preset Multiple Registers - Funcin 17 Report Slave ID - Funcin 18 Program 884/M84 - Funcin 19 Reset Comm. Link - Funcin 20 Read General Reference - Funcin 21 Write General Reference - Funcin 22 Mask Write 4X Register - Funcin 23 Read/Write 4X Registers - Funcin 24 Read FIFO Queue Funcin 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 nmero de bits que desea leer a partir de una determinada direccin. Cada direccin se corresponde con un registro de 1 bit con el estado del la entrada digital. El esclavo responde indicando el nmero 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.

Peticin del mster (modo RTU): NEsclavo Cdigo Operacin: 0x01 o 0x02 Direccin del registro ( de 1 bit ) a leer H Direccin 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): NEsclavo Cdigo Operacin: 0x01 o 0x02 N bytes leidos: 1 byte Octetos: max 256 bytes CRC(16): H CRC(16): L Funcin 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 mster indica la direccin base y nmero de palabras a leer a partir de esta, mientras que el esclavo indica en la respuesta el nmero bytes retornados, seguido de estos valores. Aunque en realidad se est escribiendo en el rango de registros o valores numricos , los registros son direccionados a partir de la direccin 0 ( as el registro @40001 se direcciona 0 ) Peticin del mster (modo RTU): NEsclavo Cdigo Operacin: 0x03 o 0x04 Direccin del registro : N de datos que se desea leer: max 128 datos

CRC(16): H L Respuesta del esclavo (modo RTU): NEsclavo Cdigo Operacin: 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 perifrico 04 funcin de lectura 00 00 registro donde se va a comenzar la lectura 00 0A numero 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 Nmero del perifrico que responde, 10 en decimal 04 Funcin de lectura - la que se ha utilizado en la pregunta 14 Nmero 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 paritir de la direccion 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 direccion del esclavo que responde 03 Funcin 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 Funcin 5 ( Force Single Coil ): Permite modificar el estado de una DO del esclavo ( mando o rel ) . Es decir mediante este comando podemos modificar algn bit de alguna de las variables internas del esclavo u ordenar la ejecucin o activacin de un mando. Acta sobre la zona de memoria de los DOs @0XXXX . El Maestro especifica la direccin 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 direccin que ha modificado y el valor que ha establecido en el bit o mando. Peticin del mster (modo RTU): NEsclavo Cdigo Operacin: 0x05 Direccin del bit: Estado para el bit: 0xXX ( 0x00 : 0 , 0xFF : 1 ) Byte a 0x00 CRC(16): H L Respuesta del esclavo (modo RTU): NEsclavo Cdigo Operacin: 0x05 Direccin 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] Funcin 6 ( Preset Single Register ) : Permite la escritura en las AOs del esclavo ( ya sea una seal o valor interno del equipo ), y por tanto acta sobre la zona de memoria de las AOs ( @4XXXX ). Deberemos indicar la direccin del valor que queremos modificar y la magnitud que queremos asignarle. Luego el esclavo debera responder con la direccin del dato que ha modificado y el valor que le ha asignado, que debera coincidir con el enviado. Aunque en realidad se est escribiendo en el rango de AOs , los registros son direccionados a partir de la direccin 0 ( as el registro @40001 se direcciona 0 ) Peticin del mster (modo RTU): NEsclavo Cdigo Operacin: 0x06 Direccin del dato: Valor del dato: CRC(16): H L Respuesta del esclavo (modo RTU): NEsclavo Cdigo Operacin: 0x06 Direccin 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] Funcin 7 ( Read Exception Status ) : Permite la lectura rpida de un byte fjo de un esclavo, que generalmente es el de excepcin y que informa del estado del equipo. No tiene direccin del byte debido a que siempre se lee el mismo byte ( determinado por el propio dispositivo esclavo) : Peticin del master (modo RTU): NEsclavo Cdigo Operacin: 0x07 CRC(16): H L Respuesta del esclavo (modo RTU): NEsclavo Cdigo Operacin: 0x07 Valor del octeto: CRC(16): H L Funcin 15 ( Force Multiple Coils ): Permite la modificacin simultanea de varios bits de DOs en el esclavo, pasndolos a OFF ( 0 ) o a ON ( 1) segn convenga. Acta sobre la zona de memoria de las DOs ( @0XXXX ). As en el comando se pasan la direccin inicial ( direccin del primer bit o mando a modificar ) y la cantidad y estado de cada uno de los sucesivos mandos ( bits ) a modificar. Peticin del mster (modo RTU): NEsclavo Cdigo Operacin: 0x0F Direccin inicial de los mandos ( bits ) H Direccin 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 debera hacer caso a los bits sobrantes, es decir, no debera considerar los que queden por encima del ltimo bit indicado en el campo cantidad de mandos a modificar. As, si quisiramos modificar 12 mandos o rels a partir de la direccin 7, indicaramos como direccin origen la direccin 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): NEsclavo Cdigo Operacin: 0x0F Direccin inicial de los mandos o bits consecutivos H Direccin del mando o bit L Cantidad de mandos o bits H Cantidad de mandos o bits L CRC(16): H L Funcin 16 ( Preset multiple registers ): Permite realizar la escritura en un grupo de AOs, y por tanto acta sobre la zona de AOs ( @4XXXX ). Se debe especificar la direccin a partir de la que queremos comenzar a actualizar valores, el nmero 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 numricos , los registros son direccionados a partir de la direccin 0 ( es decir el registro @40001 se direcciona 0 )

Peticin del mster (modo RTU): NEsclavo Cdigo Operacin: 0x10 Direccin base de los datos: 2 bytes Nmero 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): NEsclavo Cdigo Operacin: 10H Direccin base de los datos: 2 bytes Nmero de datos: 2 bytes CRC(16): H L Funcin 20 ( Read General Reference ): Retorna el contenido de los regitros de la Extended Memory ( @6XXXX ). En la trama se enva la direccin del esclavo, el cdigo de funcin, el nmero de bytes que se va a leer y los bytes de comprobacin de error. En los datos se establece el grupo o grupos o referencias a leer. Cada grupo se define en un campo "sub-request" que contiene: - Reference type: 1 byte ( debe ser 6 ) - Extended Memory file number: 2 bytes ( 0x01 a 0x0A ) - La direccion del "fichero" a partir de la que queremos comenzar a leer: 2 bytes - La cantidad de registros a leer: 2 bytes Los datos a leer seguidos de los demas campos no debe superar la longitud mxima permitida en los mensajes MODBUS, es decir los 256 bytes. Peticin del mster (modo RTU):

Slave Address 0x11 Function 0x14 Byte Count 0x0E SubReq 1, Reference Type 0x06 SubReq 1, File Number Hi 0x00 SubReq 1, File Number Lo 0x04 SubReq 1, Starting Addr Hi 0x00 SubReq 1, Starting Addr Lo 0x01 SubReq 1, Register Count Hi 0x00 SubReq 1, Register Count Lo 0x02 SubReq 2, Reference Type 0x06 SubReq 2, File Number Hi 0x00 SubReq 2, File Number Lo 0x03 SubReq 2, Starting Addr Hi 0x00 SubReq 2, Starting Addr Lo 0x09 SubReq 2, Register Count Hi 0x00 SubReq 2, Register Count Lo 0x02 Error Check (LRC or CRC)-Respuesta del esclavo (modo RTU): Slave Address 0x11 Function 0x14 Byte Count 0x0C SubRes 1, Byte Count 0x05 SubRes 1, Reference Type 0x06 SubRes 1, Register Data Hi 0x0D SubRes 1, Register Data Lo 0xFE SubRes 1, Register Data Hi 0x00 SubRes 1, Register Data Lo 0x20 SubRes 2, Byte Count 0x05

SubRes 2, Reference Type 0x06 SubRes 2, Register Data Hi 0x33 SubRes 2, Register Data Lo 0xCD SubRes 2, Register Data Hi 0x00 SubRes 2, Register Data Lo 0x40 Error Check (LRC or CRC) Funcin 21 ( Write General Reference ): Modifica el contenido de los registros de la Extended Memory ( 6XXXX ). Esta funcin permite trabajar en grupos de registros que no tienen porque ser contiguos ( internamente s que han de ser contiguos ). Cada grupo se define en un campo "sub-request" que contiene: - Reference type: 1 byte ( debe ser 6 ) - Extended Memory file number: 2 bytes ( 0x01 a 0x0A ) - La direccion del "fichero" a partir de la que queremos comenzar a leer: 2 bytes - La cantidad de registros a leer: 2 bytes Los datos a leer seguidos de los demas campos no debe superar la longitud mxima permitida en los mensajes MODBUS, es decir los 256 bytes. Peticin del mster (modo RTU): Slave Address 0x11 Function 0x5 Byte Count 0x0D SubReq 1, Reference Type 0x06 SubReq 1, File Number Hi 0x00 SubReq 1, File Number Lo 0x04 SubReq 1, Starting Addr Hi 0x00 SubReq 1, Starting Addr Lo 0x07 SubReq 1, Register Count Hi 0x00 SubReq 1, Register Count Lo 0x03 SubReq 1, Register Data Hi 0x06 SubReq 1, Register Data Lo 0xAF SubReq 1, Register Data Hi 0x04

SubReq 1, Register Data Lo 0xBE SubReq 1, Register Data Hi 0x10 SubReq 1, Register Data Lo 0x0D Error Check (LRC or CRC) Respuesta del esclavo (modo RTU): Slave Address 0x11 Function 0x15 Byte Count 0x0D SubReq 1, Reference Type 0x06 SubReq 1, File Number Hi 0x00 SubReq 1, File Number Lo 0x04 SubReq 1, Starting Addr Hi 0x00 SubReq 1, Starting Addr Lo 0x07 SubReq 1, Register Count Hi 0x00 SubReq 1, Register Count Lo 0x03 SubReq 1, Register Data Hi 0x06 SubReq 1, Register Data Lo 0xAF SubReq 1, Register Data Hi 0x04 SubReq 1, Register Data Lo 0xBE SubReq 1, Register Data Hi 0x10 SubReq 1, Register Data Lo 0x0D Error Check (LRC or CRC)

Você também pode gostar