CHAPTER 2: MODBUS PROTOCOL
MODBUS PROTOCOL
745 TRANSFORMER PROTECTION SYSTEM – COMMUNICATIONS GUIDE
2–3
•
CRC
: This is a two byte error checking code. The RTU version of Modbus includes a
two-byte CRC-16 (16-bit cyclic redundancy check) with every message. The CRC-16
algorithm essentially treats the entire data stream (data bits only; start, stop and
parity ignored) as one continuous binary number. This number is first shifted left 16
bits and then divided by a characteristic polynomial (11000000000000101B). The 16
bit remainder of the division is appended to the end of the message, MSByte first. The
resulting message including CRC, when divided by the same polynomial at the
receiver will give a zero remainder if no transmission errors have occurred. If a GE
Multilin Modbus slave device receives a message in which an error is indicated by the
CRC-16 calculation, the slave device will not respond to the message. A CRC-16 error
indicates that one or more bytes of the message were received incorrectly and thus
the entire message should be ignored in order to avoid the slave device performing
any incorrect operation. The CRC-16 calculation is an industry standard method used
for error detection.
CRC-16 algorithm
Once the following algorithm is completed, the working register “A” will contain the CRC
value to be transmitted. Note that this algorithm requires the characteristic polynomial to
be reverse bit ordered. The most significant bit of the characteristic polynomial is dropped,
since it does not affect the value of the remainder. The following symbols are used in the
algorithm:
•
—>
: data transfer
•
A
: 16 bit working register
•
AL
: low order byte of A
•
AH
: high order byte of A
•
CRC
: 16-bit CRC-16 value
•
i
,
j
: loop counters
•
(+)
: logical exclusive or operator
•
Di
: i-th data byte (i = 0 to N-1)
•
G
: 16 bit characteristic polynomial = 1010000000000001 with the most significant bit
dropped and bit order reversed
•
shr(x)
: shift right (the least significant bit of the low order byte of x shifts into a carry
flag, a '0' is shifted into the most significant bit of the high order byte of x, all other bits
shift right one location
The algorithm is:
1. FFFF hex —> A
2. 0 —> i
3. 0 —> j
4. Di (+) AL —> AL
5. j + 1 —> j
6. shr(A)
7. is there a carry? If No, go to 8; If Yes, G (+) A —> A
8. is j = 8? If No, go to 5; If Yes, go to 9.
9. i + 1 —> i
10. is i = N? If No, go to 3; If Yes, go to 11.
11. A —> CRC