Đọ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.
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.
Comment