Thông báo

Collapse
No announcement yet.

Crc

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Crc

    Đọc một lượt tất cả các thread, chưa thấy các bác viết về CRC(Cyclic Redundancy check). Em đang đọc một tip của Siemens về ghép nối PLC với máy tính qua Modbus nhưng có số chỗ không hiểu.Đây là đoạn chương trình:

    SBR 51
    LD SM0.0
    MOVW VW3300, AC0 // get buffer length
    MOVD &VB3302, AC1 // get buffer address for CRC check
    CALL 63 // calculate CRC

    // Subroutine 63
    //
    // This subroutine calculates the CRC value for the message using the faster
    // table lookup method.
    //
    // Inputs : AC0 message length
    // AC1 pointer to message
    //
    // Outputs: AC2 CRC value in LSWord

    SBR 63
    LD SM0.0
    WDR // reset the watchdog timer
    MOVD 16#08000000, AC3 // clear temporary register
    MOVD 16#0000FFFF, AC2 // initialize the CRC value to 0xFFFF

    FOR VW3560, 1, AC0 // for all bytes in the message
    MOVB *AC1, AC3 // get the message byte
    XORW AC2, AC3 // XOR data with CRC
    ANDW 16#00FF, AC3 // keep only the LSByte
    SLW AC3, 1 // convert to an index into word table
    +I 3580, AC3 // add start of table address (VB3580)
    SWAP AC2 // swap bytes of CRC
    ANDW 16#00FF, AC2 // keep only the LSByte
    XORW *AC3, AC2 // OR table value with CRC
    INCW AC1 // point to the next message byte
    NEXT // end for

    SWAP AC2 // swap bytes in CRC before returning
    WDR // reset the watchdog timer
    RET

    Theo em hiểu thì CRC thực chất chỉ là thực hiện XOR giữa dãy bit nhận và một dãy bit qui ước.
    Thứ nhất, em không hiểu sao lại chọn đa thức phát là 0xFFFF. Tức là sao lại chọn nó là 4 byte mà không phải là 2 hay 1 byte. Mặt khác trong sách của thầy Hoang Minh Sơn nói là sử dụng đa thức phát G = 1010 0000 0000 0001.
    Thứ hai, theo tiêu chuẩn DIN 19 244 quan hệ giữa chiều dài của dãy bit mang thông tin và bậc của đa thức phát có dạng mã(8i+8,8i). không hiểu chiều dài của dãy bít ở đây là bao nhiêu. Có thể chọn được không.

  • #2
    Crc16

    Chương trình e post lên là cụ thể hóa cách tính mã CRC theo giao thức modbus.
    E đọc lại tài liệu hd về cách tính.CRC là phương pháp chia đa thức với đa thức chia ở đây là A001.Khi thực hiện bằng phần mềm thì nó sẽ cụ thể hóa việc chia bằng các vòng lặp và phép Xor (trong các tài liệu modbus viết rất kĩ, có cả chương trình mẫu viết bằng C). Theo modbus kết quả của phép tính này cho mã CRC là 16 bit nên ban đầu khởi tạo thanh ghi lưu dữ liệu là 16 bit và gán mặc định là 0xFFFF (chỉ rõ trong hướng dẫn lập trình tính CRC), cứ tính xong 1 byte nó lại lưu chèn vào thanh ghi này và tiếp tục với byte tiếp theo cho đến khi hết chiều dài khung dữ liệu.
    Mã CRC dùng trong chế độ truyền Modbus RTU
    Càng biết nhiều càng thấy mình biết ít.

    Comment


    • #3
      #include <inttypes.h>
      #include <stdio.h>

      static const uint16_t crc_itu16_table[] =
      {
      0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
      0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
      0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
      0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
      0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
      0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
      0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
      0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
      0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
      0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
      0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
      0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
      0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
      0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
      0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
      0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
      0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
      0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
      0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
      0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
      0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
      0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
      0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
      0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
      0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
      0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
      0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
      0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
      0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
      0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
      0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
      0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
      };

      int crc_16(const uint8_t *buf, int len)
      {
      uint16_t crc;
      int i;

      crc = 0xFFFF;
      for (i = 0; i < len; i++)
      crc = (crc >> 8) ^ crc_itu16_table[(crc ^ buf[i]) & 0xFF];
      return (crc & 0xFFFF) == 0xF0B8;
      }
      main()
      {
      const uint8_t *arr; int leng,crc_code;
      char i;
      printf("\n nhap vao chieu dai du lieu tinh theo byte:");
      scanf("%i",&leng);
      for(i=0;i<leng;i++)
      {
      printf("\n arr[%d]=",i);
      scanf("%x",arr[i]);
      }
      crc_code=crc_16(arr,leng);
      printf("\n ma crc la: %x",crc_code);

      }

      Comment


      • #4
        #include <inttypes.h>
        #include <stdio.h>
        typedef uint16_t crc;
        #define WIDTH (8 * sizeof(crc))
        static const uint16_t crc16_table[] =
        {
        0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
        0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
        0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
        0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
        0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
        0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
        0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
        0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
        0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
        0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
        0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
        0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
        0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
        0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
        0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
        0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
        0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
        0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
        0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
        0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
        0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
        0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
        0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
        0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
        0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
        0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
        0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
        0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
        0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
        0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
        0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
        0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
        };

        /*uint16_t crcFast(uint8_t const message[], int nBytes)
        {
        uint8_t data;
        uint16_t remainder = 0xFFFF;
        int byte;
        for (byte = 0; byte < nBytes; ++byte)
        {
        data = message[byte] ^ (remainder >> (WIDTH - 8));
        remainder = crc16_table[data] ^ (remainder << 8);
        }


        return (remainder);

        }*/

        uint16_t crcFast(uint8_t const buf[], int len)
        {
        uint16_t crc;
        int i;

        crc = 0xFFFF;
        for (i = 0; i < len; i++)
        crc = (crc >> 8) ^ crc16_table[(crc ^ buf[i]) & 0xFF];
        return (crc & 0xFFFF) == 0xF0B8;
        //return (crc);
        }


        main()
        {
        uint16_t c;
        uint8_t const arr[20];
        int len,i;
        printf("\n kich thuoc uint16 %i",sizeof(uint16_t));
        printf("\n nhap len:");scanf("%i",&len);
        for(i=0;i<len;i++)
        {
        printf("\n arr[%i]= ",i);
        scanf("%x",&arr[i]);
        }
        for(i=0;i<len;i++)
        {
        printf("\n arr[%i]= %i",i,arr[i]);
        }
        for(i=0;i<len;i++)
        {
        printf("\n arr[%i]= %x",i,arr[i]);
        }
        c=crcFast(arr,len);
        printf("\n ket qua= %x",c);
        }

        Comment


        • #5
          -Cho mình hỏi về CRC của modbus :Trong sách Hoang Minh Sơn thấy đa thức phát trong chế độ RTU là G=1010 0000 0000 0001
          Mình tìm trên cách diễn đàn thì thấy các loại mã CRC :
          CRC-16 0x8005 x16 + x15 + x2 + 1 (=1000 0000 0000 0101) ngược với G ?
          CRC16 dùng đến 17 bit sao?

          -Ai có code tạo CRC trên VB6 hoặc bít về thuật toán tạo CRC trên VB6 thì chỉ mình với !!!!
          Thanks a lot.....................
          Last edited by killua142; 04-11-2010, 10:35.

          Comment

          Về tác giả

          Collapse

          hh2 Tìm hiểu thêm về hh2

          Bài viết mới nhất

          Collapse

          Đang tải...
          X