4. Trama RTU Serial

Analisis de trama RTU

 Recordando la trama para RTU tenemos los siguiente campos:

Las funciones más comunes utilizadas pueden ser las siguientes:

Para la lista completa y descripción de cada una así como el manejo de respuestas de errores. referirse a Modbus Application Protocol, que se encuentra disponible además en el Aula Virtual

 

Como ejemplo vamos a analizar la siguiente trama enviada:

0A 06 00 11 AA 00 14 A6

Analizando tenemos, que va dirigida al esclavo 0A (Esclavo 10)

La función es la 06 (Escribir 1 registro). Con este dato ya podemos segmentar los bytes de la trama para identificar cada parte. Si vamos al manual del protocolo tenemos que los próximos 2 bytes serán la dirección en cuestión del registro que vamos a escribir, seguido de 2 bytes con el valor que queremos que tome el registro.

ESCLAVO FUNC REGISTRO VALORES CRC
0x0A 0x06 0x00 0x11 0xAA 0x00 0x14 0xA6

entonces lo que se quiere hacer es: escribir AA00 ( 43520 en decimal) en el registro 0011 (Registro 17)

Por ultimo siguiendo la trama del protocolo, tenemos que los últimos 2 bytes corresponden al CRC calculado en base al algoritmo CRC-16/MODBUS. Para comprobar el mismo podemos ir a este sitio

Si el registro fue modificado correctamente vamos a recibir como respuesta la misma trama enviada (de acuerdo a lo especificado en el protocolo para dicha función). De otra forma recibiremos un código de error.

 

Ahora analicemos una trama algo más compleja:

0A 10 00 05 00 02 04 00 01 00 02 B5 C6

Nuevamente la petición va dirigida al esclavo 10. La función ahora es la 0x10 (Función 16) Escribir en múltiples registros. Cabe aclarar que estos registros deben ser contiguos.

Teniendo esta información ya podemos segmentar la trama:

ESCLAVO FUNC REG IN NRO REG N BYTES VALORES CRC
0x0A 0x10 0x00 0x05 0x00 0x02 0x04 0x00 0x01 0x00 0x02 0xB5 0xC6

Según el protocolo tenemos 2 bytes que indican la dirección del primer registro a escribir (0x0005) registro 5. Los próximos 2 bytes serán la cantidad de registros a escribir (0x0002) 2 registros

Luego tenemos la cantidad de bytes de datos que vamos a escribir. En este caso si vamos a modificar 2 registros tenemos 2 x 2 =4, a modo general este campo será entonces N registros x 2.

Luego vienen los valores de los registros en paquetes de 2 bytes.

Entonces tendremos que

el registro 0x0005 tomará el valor 0x0001 y el registro 0x0006 tomará el valor 0x0002

Como parte final tenemos nuevamente el CRC calculado.

En este caso si todo sale correcto la respuesta recibida será la siguiente

ESCLAVO FUNC REG IN NRO REG CRC
0x0A 0x10 0x00 0x05 0x00 0x02 0xB2 0x50