#include "ServoCommand.h" #include "stdio.h" #include #include #include "CRC16.h" MitsubishiCommand::MitsubishiCommand(unsigned char addr) :m_addr(addr) { } MitsubishiCommand::~MitsubishiCommand() { } int MitsubishiCommand::GetRequestSequence( unsigned char* buffer) { buffer[0] = 0x01; buffer[1] = m_addr; buffer[2] = 0x30; buffer[3] = 0x32; buffer[4] = 0x02; buffer[5] = 0x39; buffer[6] = 0x31; buffer[7] = 0x03; unsigned short sum = 0; for (int i = 1; i < 8;++i) { sum += buffer[i]; } sum = sum % 0x100; char sbuffer[10]; sprintf_s(sbuffer, sizeof(sbuffer), "%02X", sum); buffer[8] = sbuffer[0]; buffer[9] = sbuffer[1]; return 10; } bool MitsubishiCommand::Verify(unsigned char* buffer, int len) { if (len != 14)return false; if (buffer[0] != 0x02)return false; if (buffer[1] != m_addr )return false; if (buffer[2] != 'A')return false; if (buffer[len - 3] != 0x03)return false; unsigned short sum = 0; for (int i = 1; i < len-2; ++i) { sum += buffer[i]; } sum = sum % 0x100; char sbuffer[10]; sprintf_s(sbuffer, sizeof(sbuffer), "%02X", sum); if (buffer[len - 2] != sbuffer[0]) return false; if (buffer[len - 1] != sbuffer[1])return false; unsigned char tempb[8]; for (int i = 0; i < 8;++i) { if (buffer[3 + i]>='0' && buffer[3 + i]<='9') { tempb[i] = buffer[3 + i] - '0'; } else if (buffer[3 + i] >= 'A' && buffer[3 + i] <= 'Z') { tempb[i] = buffer[3 + i] - 'A'+10; } } MitsubishiValue sv; for (int i = 0; i < 4;i++) { sv.bvalue[3 - i] = tempb[i * 2] * 16 + tempb[i * 2 + 1]; } m_value = sv.ivalue; return true; } SanyoCommand::SanyoCommand(unsigned char addr, std::string ctrl, std::string code, std::string group, std::string param) :m_addr(addr) ,m_ctrl(ctrl) ,m_code(code) ,m_group(group) ,m_param(param) { } SanyoCommand::~SanyoCommand() { } int SanyoCommand::ConstReturnSize() { return m_ResponseLength; } int SanyoCommand::GetRequestSequence(unsigned char* buffer) { buffer[0] = 0x02; buffer[1] = m_addr; buffer[2] = m_ctrl[0]; buffer[3] = m_ctrl[1]; buffer[4] = m_code[0]; buffer[5] = m_code[1]; buffer[6] = m_group[0]; buffer[7] = m_group[1]; buffer[8] = m_param[0]; buffer[9] = m_param[1]; buffer[10] = 0x03; unsigned char rel = 0; for (int i = 1; i < 11; ++i) { rel = rel^buffer[i]; } buffer[11] = rel; return 12; } SanyoReadEncoderPosCommand::SanyoReadEncoderPosCommand(unsigned char addr, std::string ctrl, std::string code, std::string group, std::string param) :SanyoCommand(addr,ctrl,code,group,param) { m_ResponseLength = 24; } SanyoReadEncoderPosCommand::~SanyoReadEncoderPosCommand() { } bool SanyoReadEncoderPosCommand::Verify(unsigned char* buffer, int len) { if (len != m_ResponseLength)return false; if (buffer[0] != 0x02)return false; if (buffer[1] != m_addr)return false; if (buffer[2] != 0x38)return false; if (buffer[3] != 0x30)return false; if (buffer[4] != m_code[0] || buffer[5] != m_code[1])return false; if (buffer[22] != 0x03)return false; unsigned char rel = 0; for (int i = 1; i < m_ResponseLength-1; ++i) { rel = rel^buffer[i]; } if (buffer[m_ResponseLength - 1] != rel)return false; unsigned char tempa[16]; for (int i = 0; i < 16; ++i) { if (buffer[6 + i] >= '0' && buffer[6 + i] <= '9') { tempa[i] = buffer[6 + i] - '0'; } else if (buffer[6 + i] >= 'A' && buffer[6 + i] <= 'Z') { tempa[i] = buffer[6 + i] - 'A' + 10; } } unsigned char tempb[8] = { tempa[0] * 16 + tempa[1] , tempa[2] * 16 + tempa[3] , tempa[4] * 16 + tempa[5] , tempa[6] * 16 + tempa[7] , tempa[8] * 16 + tempa[9] , tempa[10] * 16 + tempa[11] , tempa[12] * 16 + tempa[13] , tempa[14] * 16 + tempa[15] }; SanyoValue_Int64 value; for (int i = 0; i < 8; i++) { value.bvalue[7 - i] = tempb[i]; } int64_t realValue = value.lvalue; std::bitset<64> bitValut(realValue); std::bitset<16> bitcyc; std::bitset<17> bitsin; for (int i = 0; i < 16;i++) { bitcyc[i] = bitValut[17 + i]; } for (int i = 0; i < 17; i++) { bitsin[i] = bitValut[i]; } m_cycles =(short) bitcyc.to_ulong(); m_singal = (int)bitsin.to_ulong(); m_value =(long) m_cycles * ABS_CYCLE + m_singal; return true; } SanyoReadLoadTorqueCommand::SanyoReadLoadTorqueCommand(unsigned char addr, std::string ctrl, std::string code, std::string group, std::string param) :SanyoCommand(addr, ctrl, code, group, param) { m_ResponseLength = 12; } SanyoReadLoadTorqueCommand::~SanyoReadLoadTorqueCommand() { } bool SanyoReadLoadTorqueCommand::Verify(unsigned char* buffer, int len) { if (len != m_ResponseLength)return false; if (buffer[0] != 0x02)return false; if (buffer[1] != m_addr)return false; if (buffer[2] != 0x38)return false; if (buffer[3] != 0x30)return false; if (buffer[4] != m_code[0] || buffer[5] != m_code[1])return false; if (buffer[10] != 0x03)return false; unsigned char rel = 0; for (int i = 1; i < m_ResponseLength-1; ++i) { rel = rel^buffer[i]; } if (buffer[m_ResponseLength-1] != rel)return false; unsigned char tempa[4]; for (int i = 0; i < 4; ++i) { if (buffer[6 + i] >= '0' && buffer[6 + i] <= '9') { tempa[i] = buffer[6 + i] - '0'; } else if (buffer[6 + i] >= 'A' && buffer[6 + i] <= 'Z') { tempa[i] = buffer[6 + i] - 'A' + 10; } } unsigned char tempb[2] = { tempa[0] * 16 + tempa[1] , tempa[2] * 16 + tempa[3] }; SanyoValue_Short value; for (int i = 0; i < 2; i++) { value.bvalue[1 - i] = tempb[i]; } m_Value= value.svalue; return true; } SanyoReadAlarmCommand::SanyoReadAlarmCommand(unsigned char addr, std::string ctrl, std::string code) :SanyoCommand(addr, ctrl, code, " ", " ") { m_ResponseLength = 10; } SanyoReadAlarmCommand::~SanyoReadAlarmCommand() { } bool SanyoReadAlarmCommand::Verify(unsigned char* buffer, int len) { if (len != m_ResponseLength)return false; if (buffer[0] != 0x02)return false; if (buffer[1] != m_addr)return false; if (buffer[2] != 0x38)return false; if (buffer[3] != 0x30)return false; if (buffer[4] != m_code[0] || buffer[5] != m_code[1])return false; if (buffer[8] != 0x03)return false; unsigned char rel = 0; for (int i = 1; i < m_ResponseLength - 1; ++i) { rel = rel^buffer[i]; } if (buffer[m_ResponseLength - 1] != rel)return false; unsigned char tempa[2]; for (int i = 0; i < 2; ++i) { if (buffer[6 + i] >= '0' && buffer[6 + i] <= '9') { tempa[i] = buffer[6 + i] - '0'; } else if (buffer[6 + i] >= 'A' && buffer[6 + i] <= 'Z') { tempa[i] = buffer[6 + i] - 'A' + 10; } } unsigned char tempb = tempa[0] * 16 + tempa[1]; m_Value = tempb; return true; } int SanyoReadAlarmCommand::GetRequestSequence(unsigned char* buffer) { buffer[0] = 0x02; buffer[1] = m_addr; buffer[2] = m_ctrl[0]; buffer[3] = m_ctrl[1]; buffer[4] = m_code[0]; buffer[5] = m_code[1]; buffer[6] = 0x03; unsigned char rel = 0; for (int i = 1; i < 7; ++i) { rel = rel^buffer[i]; } buffer[7] = rel; return 8; } SiemensCommand::SiemensCommand(unsigned char addr) :m_addr(addr) { } SiemensCommand::~SiemensCommand() { } int SiemensCommand::GetRequestSequence(unsigned char* buffer) { buffer[0] = m_addr; buffer[1] = 0x03; buffer[2] = 0x01; buffer[3] = 0x5F; buffer[4] = 0x00; buffer[5] = 0x02; unsigned short crc = CRC16(buffer, 6); buffer[6] = (crc & 0xFF00) >> 8; buffer[7] = (crc & 0x00FF); return 8; } bool SiemensCommand::Verify(unsigned char* buffer, int len) { if (len != 9) return false; if (buffer[0] != m_addr) return false; if (buffer[1] != 0x03) return false; if (buffer[2] != 0x04) return false; unsigned short crc = CRC16(buffer, 7); if (((((unsigned short)buffer[7]) << 8) + buffer[8]) != crc) return false; unsigned char tmp[4]; tmp[0] = buffer[6]; tmp[1] = buffer[5]; tmp[2] = buffer[4]; tmp[3] = buffer[3]; m_value = *(long *)tmp; return true; }