B.1 MODBUS RTU PROTOCOL
FUNCTION CODE: This is one of the supported functions codes of the unit which tells the slave what action to per-
form. See the Supported Function Codes section for complete details. An exception response from the slave is indi-
cated by setting the high order bit of the function code in the response packet. See the Exception Responses section
for further details.
DATA: This will be a variable number of bytes depending on the function code. This may include actual values, set-
tings, or addresses sent by the master to the slave or by the slave to the master.
CRC: This is a two byte error checking code. The RTU version of Modbus
(CRC-16) with every packet which is an industry standard method used for error detection. If a Modbus slave device
receives a packet in which an error is indicated by the CRC, the slave device does not act upon or respond to the
packet thus preventing any erroneous operations. See the CRC-16 Algorithm section for details on calculating the
DEAD TIME: A packet is terminated when no data is received for a period of 3.5 byte transmission times (about 15 ms
at 2400 bps, 2 ms at 19200 bps, and 300 µs at 115200 bps). Consequently, the transmitting device must not allow gaps
between bytes longer than this interval. Once the dead time has expired without a new byte transmission, all slaves
start listening for a new packet from the master except for the addressed slave.
The CRC-16 algorithm essentially treats the entire data stream (data bits only; start, stop and parity ignored) as one contin-
uous 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 packet, MSByte first. The
resulting packet including CRC, when divided by the same polynomial at the receiver will give a zero remainder if no trans-
mission errors have occurred. This algorithm requires the characteristic polynomial to be reverse bit ordered. The most sig-
nificant bit of the characteristic polynomial is dropped, since it does not affect the value of the remainder.
A C programming language implementation of the CRC algorithm will be provided upon request.
Table B–2: CRC-16 ALGORITHM
16 bit working register
low order byte of A
high order byte of A
16 bit CRC-16 result
logical EXCLUSIVE-OR operator
total number of data bytes
i-th data byte (i = 0 to N-1)
16 bit characteristic polynomial = 1010000000000001 (binary) with MSbit dropped and bit order reversed
right shift operator (th LSbit of x is shifted into a carry flag, a '0' is shifted into the MSbit of x, all other bits
are shifted right one location)
FFFF (hex) --> A
0 --> i
0 --> j
Di (+) Alow --> Alow
j + 1 --> j
Is there a carry?
No: go to 8; Yes: G (+) A --> A and continue.
Is j = 8?
No: go to 5; Yes: continue
i + 1 --> i
Is i = N?
No: go to 3; Yes: continue
A --> CRC
C30 Controller System
includes a 16-bit cyclic redundancy check
B.1.4 CRC-16 ALGORITHM