User manual
6 MODBUS RTU, ASCII, TCP
English
TCP mode
Bit per byte: 1 Start, 7 Bit, Even, 2 Stop (7E2)
Name Length Function
TRANSACTION ID 2 bytes For synchronization between messages of server & client
PROTOCOL ID 2 bytes Zero for MODBUS TCP
BYTE COUNT 2 bytes Number of remaining bytes in this frame
UNIT ID 1 byte Slave address (255 if not used)
FUNCTION CODE 1 byte Function code ($01 / $04 / $10)
DATA BYTES n bytes Data as response or command
1.1 LRC generation
The Longitudinal Redundancy Check (LRC) field is one byte, containing an 8–bit binary value. The LRC
value is calculated by the transmitting device, which appends the LRC to the message. The receiving
device recalculates an LRC during receipt of the message, and compares the calculated value to the
actual value it received in the LRC field. If the two values are not equal, an error results. The LRC is
calculated by adding together successive 8–bit bytes in the message, discarding any carries, and then
two’s complementing the result. The LRC is an 8–bit field, therefore each new addition of a character
that would result in a value higher than 255 decimal simply ‘rolls over’ the field’s value through zero.
Because there is no ninth bit, the carry is discarded automatically.
A procedure for generating an LRC is:
1. Add all bytes in the message, excluding the starting ‘colon’ and ending CR LF. Add them into an 8–bit
field, so that carries will be discarded.
2. Subtract the final field value from $FF, to produce the ones–complement.
3. Add 1 to produce the twos–complement.
PLACING THE LRC INTO THE MESSAGE
When the the 8–bit LRC (2 ASCII characters) is transmitted in the message, the high–order character
will be transmitted first, followed by the low–order character. For example, if the LRC value is $52 (0101
0010):
Colon
‘:’
Addr Func Data
Count
Data Data …. Data LRC
Hi ‘5’
LRC
Lo‘2’
CR LF
C-FUNCTION TO CALCULATE LRC
*pucFrame – pointer on “Addr” of message
usLen – length message from “Addr” to end “Data”
UCHAR prvucMBLRC( UCHAR * pucFrame, USHORT usLen )
{
UCHAR ucLRC = 0; /* LRC char initialized */
while( usLen-- )
{
ucLRC += *pucFrame++; /* Add buffer byte without carry */
}
/* Return twos complement */
ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) );
return ucLRC;
}