Jump to content
Sign in to follow this  
Chive

EZ drive communication

Recommended Posts

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

//===========================================================================

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...