If you are working on MODBUS or worked on MODBUS then you should know the below difference between RTU and ASCII which is common interview question for MODBUS.
MODBUS RTU VS ASCII FRAMES:
MODBUS - CHECKSUM Sample Code:
BYTE LRC (BYTE *aData, WORD wLen)
{
BYTE nLRC = 0 ; // LRC initialized
for (int i = 0; i < wLen; i++)
nLRC += *aData++;
return (BYTE)(-nLRC);
}
COMPARISON TABLE:
Sr. No
|
MODBUS RTU
|
MODBUS ASCII
|
1
|
It uses CRC16 method for checksum calculation. There are two bytes for checksum. More complex than LRC checksum calculation.
|
It uses LRC checksum calculation method which is of 1 byte. Less complex than CRC16.
|
2
|
It comparison to ASCII mode, it requires less data length (total number of bytes) – half of ASCII mode which result in more speed.
|
It requires almost double length data as compare to RTU due to ASCII mode of transmission, which results in less speed of transmission.
|
3
|
Data is transmitted in hex format.
Example: 13: 0x0D
|
Data transmitted in ASCII format.
Example: 13 – 0x31, 0x33.
|
4
|
Not much reliable as compare to ASCII mode of transmission.
|
Much reliable than RTU mode of transmission of data.
|
5
|
It uses 3.5 character space as a silent frame timing requirement to indicate the end of the frame. Any deviation in this timing can result in error.
|
It uses ASCII character to indicate begin and end of the frame, which make it more reliable than RTU.
|
6
|
No such dedicated character to indicate the end of frame.
|
CR LF – End of the Frame
|
7
|
No such dedicated character to indicate the start of frame.
|
Character: is used to indicate the start of the frame.
|
MODBUS RTU VS ASCII FRAMES:
MODBUS - CHECKSUM Sample Code:
LRC Example Code
BYTE LRC (BYTE *aData, WORD wLen)
{
BYTE nLRC = 0 ; // LRC initialized
for (int i = 0; i < wLen; i++)
nLRC += *aData++;
return (BYTE)(-nLRC);
}
CRC Example Code
WORD CRC16 (const BYTE *nData, WORD wLen)
{
static const WORD wCRC_Table[] = {
0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,
0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,
0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,
0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,
0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840,
0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,
0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,
0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,
0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,
0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,
0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,
0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,
0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,
0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,
0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,
0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,
0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,
0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,
0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,
0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,
0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,
0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,
0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,
0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,
0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040
};
BYTE temp;
WORD wCRC = 0xFFFF;
while (wLen--)
{
temp = *nData++ ^ wCRC;
wCRC >>= 8;
wCRC ^= wCRC_Table[nTemp];
}
return wCRC;
}
Visit below reference page for more details:
Ref: http://www.modbustools.com/modbus.html/
Visit below reference page for more details:
Ref: http://www.modbustools.com/modbus.html/
0 comments :
Post a Comment