
FC410 with Modbus
Operating Instructions, 02/2016, A5E33120874-AC
145
CRC calculation
D
The Cyclical Redundancy Checking (CRC) field is two bytes, containing a 16–bit binary
value. The CRC value is first generated by the transmitting device, which appends the CRC
to the message. The receiving device recalculates a CRC during receipt of the message,
and compares the calculated value to the actual value it received in the CRC field. If the two
values are not equal an error occurs.
In the following a short text description of how the CRC is calculated is provided. This
description is then followed by a C programming example.
CRC calculation
1.
Load a 16–bit register with FFFF hex (all 1’s). Call this the CRC register.
2.
Exclusive OR the first 8–bit byte of the message with the low–order byte of the 16–bit
CRC register, putting the result in the CRC register.
3.
Shift the CRC register one bit to the right (toward the LSB), zero–filling the MSB. Extract
and examine the LSB.
4.
(If the LSB was 0): Repeat Step 3 (another shift). (If the LSB was 1): Exclusive OR the
CRC register with the polynomial value 0xA001 (1010 0000 0000 0001).
5.
Repeat Steps 3 and 4 until 8 shifts have been performed. When this is done, a complete
8–bit byte will have been processed.
6.
Repeat Steps 2 through 5 for the next 8–bit byte of the message. Continue doing this until
all bytes have been processed.
7.
The final content of the CRC register is the CRC value.
8.
When the CRC is placed into the message, its upper and lower bytes must be swapped
as described below.
Placing the CRC into the Message
When the 16–bit CRC (two 8–bit bytes) is transmitted in the message, the low-order byte will
be transmitted first, followed by the high-order byte.
For example, if the CRC value is 1241 hex (0001 0010 0100 0001):
Addr
Func
Data count Data n
Data n+1
Data n+2
Data n+x
CRC LO
CRC HI
0x41
0x12
CRC programming example
/* Table of CRC values for high-order byte */
static __flash unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80,
0x41, 0x00, 0xC1, 0x81,