ServoDriveBS.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "stdafx.h"
  2. #include "ServoDriveBS.h"
  3. using namespace DIOS::Dev::Detail::MachineryECOM;
  4. const unsigned char RS485_COMMAND_WRITE_ADDRESS = 0x06;
  5. const USHORT crctalbeabs[] = {
  6. 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
  7. 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
  8. };
  9. static USHORT crc16tablefast(const unsigned char *ptr, size_t len)
  10. {
  11. USHORT crc = 0xffff;
  12. USHORT i;
  13. UCHAR ch;
  14. for (i = 0; i < len; i++) {
  15. ch = *ptr++;
  16. crc = crctalbeabs[(ch ^ crc) & 15] ^ (crc >> 4);
  17. crc = crctalbeabs[((ch >> 4) ^ crc) & 15] ^ (crc >> 4);
  18. }
  19. return crc;
  20. }
  21. ServoDriveBS::ServoDriveBS() :m_driveNumbre(-1)
  22. {
  23. }
  24. ServoDriveBS::~ServoDriveBS()
  25. {
  26. }
  27. void ServoDriveBS::Initialize(int driveNumber)
  28. {
  29. m_driveNumbre = driveNumber;
  30. }
  31. bool ServoDriveBS::MakeServoOnEnablePacket(std::basic_string<unsigned char> &outbuffer)
  32. {
  33. return MakeRequest(RS485_COMMAND_WRITE_ADDRESS, 0x0005, 0x0001, outbuffer);
  34. }
  35. bool ServoDriveBS::MakeServoOnPacket(BOOL servoon, std::basic_string<unsigned char> &outbuffer)
  36. {
  37. unsigned short servoOn = servoon ? 0x01 : 0x0;
  38. return MakeRequest(RS485_COMMAND_WRITE_ADDRESS, 0x0004, servoOn, outbuffer);
  39. }
  40. bool ServoDriveBS::MakePulseOnCirclePacket(unsigned short pulsenumber, std::basic_string<unsigned char> &outbuffer)
  41. {
  42. return MakeRequest(RS485_COMMAND_WRITE_ADDRESS, 0x0155, pulsenumber, outbuffer);
  43. }
  44. bool ServoDriveBS::MakeRequest(UCHAR Cmd, USHORT Addr, USHORT Context, std::basic_string<unsigned char> &outbuffer)
  45. {
  46. if (m_driveNumbre < 0)
  47. {
  48. return false;
  49. }
  50. outbuffer.clear();
  51. unsigned char target = (unsigned char)m_driveNumbre;
  52. outbuffer.push_back(target);
  53. outbuffer.push_back(Cmd);
  54. SHORTDATA data;
  55. data.ShortPart = Addr;
  56. outbuffer.push_back(data.High);
  57. outbuffer.push_back(data.Low);
  58. data.ShortPart = Context;
  59. outbuffer.push_back(data.High);
  60. outbuffer.push_back(data.Low);
  61. USHORT Crc16 = crc16tablefast(outbuffer.data(), outbuffer.length());
  62. unsigned char tmp[2] = {0};
  63. memcpy(&tmp[0], &Crc16, sizeof(USHORT));
  64. outbuffer.push_back(tmp[0]);
  65. outbuffer.push_back(tmp[1]);
  66. return true;
  67. }