본문으로 바로가기

C# Modbus RTU CRC 구하기

category C# 2019. 7. 29. 16:08
반응형

C# Modbus RTU 통신할 때 CRC 를 구하는 함수 입니다~

ModbusTCP/IP 와는 다르게 RTU는 CRC를 구해서 같이 요청을 해야 한다는..

그리고 Modbus TCP/IP 프로토콜 형식과 RTU 프로토콜 형식은 조금 다르다는 것!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  class TModbusRTU
    {
        private readonly ushort[] wCRCTable =
        {
        0X00000XC0C10XC1810X01400XC3010X03C00X02800XC2410XC6010X06C0,
        0X07800XC7410X05000XC5C10XC4810X04400XCC010X0CC00X0D800XCD41,
        0X0F000XCFC10XCE810X0E400X0A000XCAC10XCB810X0B400XC9010X09C0,
        0X08800XC8410XD8010X18C00X19800XD9410X1B000XDBC10XDA810X1A40,
        0X1E000XDEC10XDF810X1F400XDD010X1DC00X1C800XDC410X14000XD4C1,
        0XD5810X15400XD7010X17C00X16800XD6410XD2010X12C00X13800XD341,
        0X11000XD1C10XD0810X10400XF0010X30C00X31800XF1410X33000XF3C1,
        0XF2810X32400X36000XF6C10XF7810X37400XF5010X35C00X34800XF441,
        0X3C000XFCC10XFD810X3D400XFF010X3FC00X3E800XFE410XFA010X3AC0,
        0X3B800XFB410X39000XF9C10XF8810X38400X28000XE8C10XE9810X2940,
        0XEB010X2BC00X2A800XEA410XEE010X2EC00X2F800XEF410X2D000XEDC1,
        0XEC810X2C400XE4010X24C00X25800XE5410X27000XE7C10XE6810X2640,
        0X22000XE2C10XE3810X23400XE1010X21C00X20800XE0410XA0010X60C0,
        0X61800XA1410X63000XA3C10XA2810X62400X66000XA6C10XA7810X6740,
        0XA5010X65C00X64800XA4410X6C000XACC10XAD810X6D400XAF010X6FC0,
        0X6E800XAE410XAA010X6AC00X6B800XAB410X69000XA9C10XA8810X6840,
        0X78000XB8C10XB9810X79400XBB010X7BC00X7A800XBA410XBE010X7EC0,
        0X7F800XBF410X7D000XBDC10XBC810X7C400XB4010X74C00X75800XB541,
        0X77000XB7C10XB6810X76400X72000XB2C10XB3810X73400XB1010X71C0,
        0X70800XB0410X50000X90C10X91810X51400X93010X53C00X52800X9241,
        0X96010X56C00X57800X97410X55000X95C10X94810X54400X9C010X5CC0,
        0X5D800X9D410X5F000X9FC10X9E810X5E400X5A000X9AC10X9B810X5B40,
        0X99010X59C00X58800X98410X88010X48C00X49800X89410X4B000X8BC1,
        0X8A810X4A400X4E000X8EC10X8F810X4F400X8D010X4DC00X4C800X8C41,
        0X44000X84C10X85810X45400X87010X47C00X46800X86410X82010X42C0,
        0X43800X83410X41000X81C10X80810X4040
        };
 
        //==========================================================================//
 
        //=========================================================================//
        //CRC16 을 BYTE[2] 로 리턴하는 함수
        //=========================================================================//
        public byte[] fn_makeCRC16_byte(byte[] bytes, int ilen)
        {
            int icrc = 0xFFFF;
            for(int i = 0; i < ilen; i++)
            {
                icrc = (icrc >> 8 ) ^ wCRCTable[(icrc ^ bytes[i]) & 0xff];
            }
            byte[] ret = BitConverter.GetBytes(icrc);
 
            return ret;
        }
    }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs
반응형

'C#' 카테고리의 다른 글

C# 모드버스 RTU 시리얼통신 구현하기2  (2) 2019.08.06
C# 모드버스 RTU 시리얼통신 구현하기  (59) 2019.08.05
C# ini 파일 이용하기  (0) 2019.07.19
C# Byte 배열로 형변환 하기  (0) 2019.07.15
C# Postgresql 연동하기  (0) 2019.04.23