Chive Posted March 22, 2011 Report Share Posted March 22, 2011 I have Unitronics V560 and EZi servo from http://www.fastech.c...unction_Eng.pdf I make communication with EZi over RS485, and always i receive error. For example, i send simply command: AA CC 00 05 [crc] AA EE and always i receive error AA CC 00 05 82 [crc] AA EE 82 is dec 130 Received Frame Error : Frame data received is out of this specification. I think the problem is the configuration of the CRC. I testing several other configurations and always nothing. How i have make configuration of CRC for good communication with EZi drive ??? Thanks for help. This is C++ algorithm for CRC calc: //============================================================================== // System Name: // // File Name: CRC_Checksum.c // // Description: CRC calculation function // // // Originator: // //########################################################################### // // Ver | dd mmmm yyyy | Who | Description of changes // =====|==============|======|=============================================== // 0.01| xx xxxx xxxx | A.A. | // 0.02| 25 June 2009 | JH | added CRC computation by algorithm. // 0.03| 25 June 2009 | JH | changed CRC computation by table to 2bytes base. //########################################################################### /* Table Of CRC Values */ const unsigned short TABLE_CRCVALUE[] = { 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 }; unsigned short CalcCRC(unsigned char* pDataBuffer, unsigned long usDataLen) { unsigned char nTemp; unsigned short wCRCWord = 0xFFFF; while (usDataLen--) { nTemp = wCRCWord ^ *(pDataBuffer++); wCRCWord >>= 8; wCRCWord ^= TABLE_CRCVALUE[nTemp]; } return wCRCWord; } unsigned short CalcCRCbyAlgorithm(unsigned char* pDataBuffer, unsigned long usDataLen) { // Use the Modbus algorithm as detailed in the Watlow comms guide const unsigned short POLYNOMIAL = 0xA001; unsigned short wCrc; int iByte, iBit; /* Initialize CRC */ wCrc = 0xffff; for (iByte = 0; iByte < usDataLen; iByte++) { /* Exclusive-OR the byte with the CRC */ wCrc ^= *(pDataBuffer + iByte); /* Loop through all 8 data bits */ for (iBit = 0; iBit <= 7; iBit++) { /* If the LSB is 1, shift the CRC and XOR the polynomial mask with the CRC */ // Note - the bit test is performed before the rotation, so can't move the << here if (wCrc & 0x0001) { wCrc >>= 1; wCrc ^= POLYNOMIAL; } else { // Just rotate it wCrc >>= 1; } } } return wCrc; } //=========================================================================== // end of file //=========================================================================== Quote Link to comment Share on other sites More sharing options...
Chive Posted April 8, 2011 Author Report Share Posted April 8, 2011 Już zrobiłem. napisałem funkcję obliczania CRC dla tego napędu i działa. Already done. I wrote a function for calculating the CRC for the drive and it works. Quote Link to comment Share on other sites More sharing options...
bostjan Posted November 17, 2011 Report Share Posted November 17, 2011 Hi , can you share the function with us ? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.