CONFIGURACIÓN DEL PROTOCOLO MODBUS
10
un byte de ocho bits completo.
Paso 6
Repetir los pasos 2...5 para el siguiente byte de ocho bits del mensaje. Repetir el mismo
procedimiento hasta que todos los bytes estén procesados.
Resultado
El contenido final del registro es el valor del CRC.
Paso 7
Cuando el CRC se sitúa en el mensaje, sus bytes de orden alto y bajo deben intercambiarse como
se describe a continuación.
Situar el CRC en el mensaje
Cuando el CRC de 16 bits (dos bytes de ocho bits) es transmitido en el mensaje, el byte de orden
bajo será transmitido en primer lugar, seguido por el byte de orden alto, por ej. si el valor de
CRC es 1241 hex 0001 0010 0100 0001):
Figura 9 Secuencia de byte CRC
Direcc.
Ejemplo
A continuación se muestra un ejemplo de una función de lenguaje C que genera el CRC. Todos
los valores del CRC posibles se precargan en dos matrices que son simplemente indexadas a
medida que la función incrementa a lo largo del buffer de mensaje. Una de las matrices contiene
todos los 256 valores posibles de CRC para el byte de orden alto del campo CRC de 16 bits, la
otra matriz contiene todos los valores para el byte de orden bajo.
Indexando el CRC de esta manera se obtiene una ejecución más rápida que la que se obtendría
calculando un nuevo valor del CRC con cada nuevo carácter del buffer de mensaje.
Nota: esta función no intercambia internamente los bytes alto/bajo del CRC. Los bytes ya se han
intercambiado en el valor del CRC devuelto por la función. Por tanto, el valor del CRC devuelto
por la función puede situarse directamente en el mensaje para ser transmitido.
La función considera dos argumentos:
unsigned char *puchMsg ; A pointer to the message buffer containing binary data to be used for
generating the CRC
unsigned short usDataLen ; The quantity of bytes in the message buffer.
La función devuelve el CRC como un tipo unsigned short.
CRC Generation Function
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ; /* message to calculate CRC upon */
unsigned short usDataLen ; /* quantity of bytes in message */
{
unsigned char uchCRCHi = 0xFF ; /* high CRC byte initialized */
unsigned char uchCRCLo = 0xFF ; /* low CRC byte initialized */
unsigned uIndex ; /* will index into CRC lookup table */
while (usDataLen--) /* pass through message buffer */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* calculate the CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
High Order Byte Table
/* Table of CRC values for high-order byte */
static unsigned char auchCRCHi[] = {
324
Fc.
Recuento
Datos
datos
Datos
Datos
www.krohne.com
ALTOSONIC 5
Datos
CRC Lo
41
06/2018 - 4004473501 - MA ALTOSONIC 5 es R04
CRC Hi
12