Modbus CRC16 Algorithm in C# and VB.Net

Applications, examples, and sample programs using products from Comfile Technology

Modbus CRC16 Algorithm in C# and VB.Net

Postby Mike » Wed Dec 07, 2011 12:01 am

VB.Net Version:
Code: Select all
    Public Class Crc16
       Private Shared CrcTable As UShort() = {&H0, &Hc0c1, &Hc181, &H140, &Hc301, &H3c0, _
          &H280, &Hc241, &Hc601, &H6c0, &H780, &Hc741, _
          &H500, &Hc5c1, &Hc481, &H440, &Hcc01, &Hcc0, _
          &Hd80, &Hcd41, &Hf00, &Hcfc1, &Hce81, &He40, _
          &Ha00, &Hcac1, &Hcb81, &Hb40, &Hc901, &H9c0, _
          &H880, &Hc841, &Hd801, &H18c0, &H1980, &Hd941, _
          &H1b00, &Hdbc1, &Hda81, &H1a40, &H1e00, &Hdec1, _
          &Hdf81, &H1f40, &Hdd01, &H1dc0, &H1c80, &Hdc41, _
          &H1400, &Hd4c1, &Hd581, &H1540, &Hd701, &H17c0, _
          &H1680, &Hd641, &Hd201, &H12c0, &H1380, &Hd341, _
          &H1100, &Hd1c1, &Hd081, &H1040, &Hf001, &H30c0, _
          &H3180, &Hf141, &H3300, &Hf3c1, &Hf281, &H3240, _
          &H3600, &Hf6c1, &Hf781, &H3740, &Hf501, &H35c0, _
          &H3480, &Hf441, &H3c00, &Hfcc1, &Hfd81, &H3d40, _
          &Hff01, &H3fc0, &H3e80, &Hfe41, &Hfa01, &H3ac0, _
          &H3b80, &Hfb41, &H3900, &Hf9c1, &Hf881, &H3840, _
          &H2800, &He8c1, &He981, &H2940, &Heb01, &H2bc0, _
          &H2a80, &Hea41, &Hee01, &H2ec0, &H2f80, &Hef41, _
          &H2d00, &Hedc1, &Hec81, &H2c40, &He401, &H24c0, _
          &H2580, &He541, &H2700, &He7c1, &He681, &H2640, _
          &H2200, &He2c1, &He381, &H2340, &He101, &H21c0, _
          &H2080, &He041, &Ha001, &H60c0, &H6180, &Ha141, _
          &H6300, &Ha3c1, &Ha281, &H6240, &H6600, &Ha6c1, _
          &Ha781, &H6740, &Ha501, &H65c0, &H6480, &Ha441, _
          &H6c00, &Hacc1, &Had81, &H6d40, &Haf01, &H6fc0, _
          &H6e80, &Hae41, &Haa01, &H6ac0, &H6b80, &Hab41, _
          &H6900, &Ha9c1, &Ha881, &H6840, &H7800, &Hb8c1, _
          &Hb981, &H7940, &Hbb01, &H7bc0, &H7a80, &Hba41, _
          &Hbe01, &H7ec0, &H7f80, &Hbf41, &H7d00, &Hbdc1, _
          &Hbc81, &H7c40, &Hb401, &H74c0, &H7580, &Hb541, _
          &H7700, &Hb7c1, &Hb681, &H7640, &H7200, &Hb2c1, _
          &Hb381, &H7340, &Hb101, &H71c0, &H7080, &Hb041, _
          &H5000, &H90c1, &H9181, &H5140, &H9301, &H53c0, _
          &H5280, &H9241, &H9601, &H56c0, &H5780, &H9741, _
          &H5500, &H95c1, &H9481, &H5440, &H9c01, &H5cc0, _
          &H5d80, &H9d41, &H5f00, &H9fc1, &H9e81, &H5e40, _
          &H5a00, &H9ac1, &H9b81, &H5b40, &H9901, &H59c0, _
          &H5880, &H9841, &H8801, &H48c0, &H4980, &H8941, _
          &H4b00, &H8bc1, &H8a81, &H4a40, &H4e00, &H8ec1, _
          &H8f81, &H4f40, &H8d01, &H4dc0, &H4c80, &H8c41, _
          &H4400, &H84c1, &H8581, &H4540, &H8701, &H47c0, _
          &H4680, &H8641, &H8201, &H42c0, &H4380, &H8341, _
          &H4100, &H81c1, &H8081, &H4040}

       Public Shared Function ComputeCrc(data As Byte()) As UInt16
          Dim crc As UShort = &Hffff

          For Each datum As Byte In data
             crc = CUShort((crc >> 8) Xor CrcTable((crc Xor datum) And &Hff))
          Next

          Return crc
       End Function
    End Class


C# Version:
Code: Select all
public class Crc16
    {
        private static ushort[] CrcTable = {
            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 };

        public static UInt16 ComputeCrc(byte[] data)
        {
            ushort crc = 0xFFFF;

            foreach (byte datum in data)
            {
                crc = (ushort)((crc >> 8) ^ CrcTable[(crc ^ datum) & 0xFF]);
            }

            return crc;
        }
    }
Mike
Mike
SuperDuperDuper
 
Posts: 551
Joined: Thu Mar 17, 2011 3:54 pm
Location: Seoul, South Korea

Re: Modbus CRC16 Algorithm in C# and VB.Net

Postby aandraz » Fri Oct 19, 2012 4:28 am

Hi Mike,
Can you please help me with CRC calculation? I am new to C# and everything is still new..
I want to calc a array of :
modbus_bytes[0]=0x02;
modbus_bytes[1]=0x03;
modbus_bytes[2]=0x02;
modbus_bytes[3]=0x00;
modbus_bytes[4]=0xDE;
hex data with your program.

I can execute, but get a wrong calculation. My main is:

UInt16 crc_resoult = newcrc.newCrc16.ComputeCrc(modbus_bytes);
Consol.Writeline(modbus_bytes);
aandraz
MasterGoo
 
Posts: 1
Joined: Fri Oct 19, 2012 4:18 am

Re: Modbus CRC16 Algorithm in C# and VB.Net

Postby Mike » Mon Oct 22, 2012 3:03 pm

What value are you expecting? And what value are you getting?

Verify that you are considering the correct byte order (i.e. little endian or big endian). For example are you expecting 0xABCD and getting 0xCDAB instead?
Mike
Mike
SuperDuperDuper
 
Posts: 551
Joined: Thu Mar 17, 2011 3:54 pm
Location: Seoul, South Korea


Return to Applications and Examples

Who is online

Users browsing this forum: No registered users and 2 guests

cron