Laboratorio Protocolo ModBus
Comprender la utilización del protocolo ModBus, poder entender la conexion de los dispositivos y las tramas que se envian/reciben en la comunicación.
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 |