GrpcPrint/PrintC/Communication/ServoCommand.cpp

333 lines
7.6 KiB
C++

#include "ServoCommand.h"
#include "stdio.h"
#include <string.h>
#include <bitset>
#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;
}