You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

332 lines
6.6 KiB
C++

#include "TransformerExport.h"
TransformerExport::TransformerExport()
{
}
TransformerExport::~TransformerExport()
{
}
bool TransformerExport::InitDahuanTransformer()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>澯
std::vector<int> saparateCommVec = { m_leftTopComm , m_rightTopComm , m_leftButtomComm , m_rightButtomComm };
for (auto& iter : saparateCommVec)
{
m_transformer.SetWorkMode(FALSE, 100);
std::string strCom = std::to_string(m_nComBaduRate);
strCom += ",N,8,1";
bool bComOpen = m_transformer.Open(iter, (char*)strCom.c_str());
if (!bComOpen)
{
return false;
}
unsigned char Buf[21] = { 0 };
Buf[0] = 0x01;
Buf[1] = 0x10;
Buf[2] = 0x16;
Buf[3] = 0x00;
Buf[4] = 0x00;
Buf[5] = 0x06;
Buf[6] = 0x0C;
Buf[7] = 0x00;
Buf[8] = 0x00;
Buf[9] = 0x00;
Buf[10] = 0x00;
Buf[11] = 0x00;
Buf[12] = 0x00;
Buf[13] = 0x00;
Buf[14] = 0x00;
Buf[15] = 0x00;
Buf[16] = 0x00;
Buf[17] = 0x00;
Buf[18] = 0x30;
Buf[19] = 0xE4;
Buf[20] = 0xA7;
m_transformer.WriteBuf(Buf, 21);
}
//ִ<>л<EFBFBD>ԭָ<D4AD><D6B8>
for (auto& iter : saparateCommVec)
{
m_transformer.SetWorkMode(FALSE, 100);
std::string strCom = std::to_string(m_nComBaduRate);
strCom += ",N,8,1";
bool bComOpen = m_transformer.Open(iter, (char*)strCom.c_str());
unsigned char Buf[8] = { 0 };
Buf[0] = 0x01;
Buf[1] = 0x06;
Buf[2] = 0x01;
Buf[3] = 0x00;
Buf[4] = 0x00;
Buf[5] = 0x01;
Buf[6] = 0x49;
Buf[7] = 0xF6;
m_transformer.WriteBuf(Buf, 8);
}
Sleep(10000);
//<2F><>ѯ<EFBFBD><D1AF><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>Ƿ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>ԭ
for (auto& iter : saparateCommVec)
{
m_transformer.SetWorkMode(FALSE, 100);
std::string strCom = std::to_string(m_nComBaduRate);
strCom += ",N,8,1";
bool bComOpen = m_transformer.Open(iter, (char*)strCom.c_str());
bool isReturnFlag = QueryOneIsReturn(iter);
if (!isReturnFlag)
{
return false;
}
}
return true;
}
bool TransformerExport::TransformerAbsMove(TransformerPos transformerType, double distance)
{
int comm = GetCommNum(transformerType);
m_transformer.SetWorkMode(FALSE, 100);
std::string strCom = std::to_string(m_nComBaduRate);
strCom += ",N,8,1";
bool bComOpen = m_transformer.Open(comm, (char*)strCom.c_str());
if (transformerType == PT_TRANSFORMER || transformerType == SAPARATE_PT_TRANSFORMER)
{
return CommonOperator(distance);
}
if (transformerType == LEFT_TOP_TRANSFORMER || transformerType == RIGHT_TOP_TRANSFORMER ||
transformerType == LEFT_BUTTOM_TRANSFORMER || transformerType == RIGHT_BUTTOM_TRANSFORMER)
{
short moveDis = static_cast<short>(distance);
unsigned char Buf[8] = { 0 };
Buf[0] = 0x01;
Buf[1] = 0x06;
Buf[2] = 0x01;
Buf[3] = 0x03;
Buf[4] = (moveDis >> 8) & 0xFF;
Buf[5] = moveDis & 0xFF;
uint16_t crcData = CRC16_MudBus(Buf, 6);
Buf[6] = crcData & 0xFF;
Buf[7] = crcData >> 8;
m_transformer.WriteBuf(Buf, 8);
//<2F><>ȡʵʱλ<CAB1><CEBB>
for (int i = 0; i < 30; i++)
{
//<2F>·<EFBFBD><C2B7><EFBFBD>ѯָ<D1AF><D6B8>
Buf[0] = 0x01;
Buf[1] = 0x03;
Buf[2] = 0x02;
Buf[3] = 0x02;
Buf[4] = 0x00;
Buf[5] = 0x01;
Buf[6] = 0x24;
Buf[7] = 0x72;
m_transformer.WriteBuf(Buf, 8);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
unsigned char readBuf[8];
memset(readBuf, 0, 22);
int length = m_transformer.ReadBuf((char*)readBuf, 8);
if (readBuf[0] == 0x01 && readBuf[1] == 0x03 && readBuf[2] == 0x02)
{
short getPos = (readBuf[4] << 8) | readBuf[5];
if (abs(getPos - moveDis) <= 5)
{
return true;
}
}
Sleep(1000);
}
}
return false;
}
bool TransformerExport::CommonOperator(short distance)
{
TwoBytes byteValue;
// <20><> short <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ֳ<EFBFBD><D6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
byteValue.bytes[0] = (distance >> 8) & 0xFF; // <20><><EFBFBD>ֽ<EFBFBD>
byteValue.bytes[1] = distance & 0xFF; // <20><><EFBFBD>ֽ<EFBFBD>
unsigned char Buf[9] = { 0 };
Buf[0] = 0x55;
Buf[1] = 0xAA;
Buf[2] = 0x04;
Buf[3] = 0x01;
Buf[4] = 0x21;
Buf[5] = 0x37;
Buf[6] = byteValue.bytes[1];
Buf[7] = byteValue.bytes[0];
Buf[8] = GetCheckSum(Buf, 8);
short targetPos = (Buf[7] << 8) | Buf[6];
if (m_transformer.WriteBuf(Buf, 9) < 1)
{
return false;
}
Sleep(500);
unsigned char readBuf[22];
memset(readBuf, 0, 22);
int length = m_transformer.ReadBuf((char*)readBuf, 22);
for (int i = 0; i < 20; i++)
{
unsigned char Buf[8] = { 0 };
Buf[0] = 0x55;
Buf[1] = 0xAA;
Buf[2] = 0x03;
Buf[3] = 0x01;
Buf[4] = 0x04;
Buf[5] = 0x00;
Buf[6] = 0x22;
Buf[7] = 0x2A;
m_transformer.WriteBuf(Buf, 8);
Sleep(200);
unsigned char readBuf[22];
memset(readBuf, 0, 22);
int length = m_transformer.ReadBuf((char*)readBuf, 22);
if (readBuf[0] == 0xAA && readBuf[1] == 0x55)
{
short targetPos = (readBuf[8] << 8) | readBuf[7];
short nowPos = (readBuf[10] << 8) | readBuf[9];
if (abs(targetPos - nowPos) <= 3)
{
return true;
}
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (readBuf[15] != 0x00)
{
return false;
}
}
Sleep(250);
}
return false;
}
unsigned char TransformerExport::GetCheckSum(unsigned char* buf, int len)
{
unsigned char checksum = 0;
for (int i = 2; i < len; ++i)
{
checksum += buf[i];
}
return checksum;
}
int TransformerExport::GetCommNum(TransformerPos transformerType)
{
int comm = -1;
switch (transformerType)
{
case PT_TRANSFORMER:
{
comm = m_debondingPTComm;
break;
}
case SAPARATE_PT_TRANSFORMER:
{
comm = m_saparatePTComm;
break;
}
case LEFT_TOP_TRANSFORMER:
{
comm = m_leftTopComm;
break;
}
case RIGHT_TOP_TRANSFORMER:
{
comm = m_rightTopComm;
break;
}
case LEFT_BUTTOM_TRANSFORMER:
{
comm = m_leftButtomComm;
break;
}
case RIGHT_BUTTOM_TRANSFORMER:
{
comm = m_rightButtomComm;
break;
}
default:
break;
}
return comm;
}
uint16_t TransformerExport::CRC16_MudBus(uint8_t *puchMsg, uint8_t usDataLen)
{
uint16_t uCRC = 0xffff;//CRC<52>Ĵ<EFBFBD><C4B4><EFBFBD>
for (uint8_t num = 0; num < usDataLen; num++) {
uCRC = (*puchMsg++) ^ uCRC;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB>CRC<52>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĵ<EFBFBD>8λ<38><CEBB><EFBFBD><EFBFBD><EFBFBD>򣬽<EFBFBD><F2A3ACBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRC<52>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
for (uint8_t x = 0; x < 8; x++) { //ѭ<><D1AD>8<EFBFBD><38>
if (uCRC & 0x0001) { //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>λΪ<CEBB><CEAA><EFBFBD><EFBFBD>1<EFBFBD><31>
uCRC = uCRC >> 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uCRC = uCRC ^ 0xA001; //<2F><><EFBFBD><EFBFBD>0xA001<30><31><EFBFBD><EFBFBD>
}
else { //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>λΪ<CEBB><CEAA><EFBFBD><EFBFBD>0<EFBFBD><30>
uCRC = uCRC >> 1; //<2F><><EFBFBD><EFBFBD>
}
}
}
return uCRC;//<2F><><EFBFBD><EFBFBD>CRCУ<43><D0A3>ֵ
}
bool TransformerExport::QueryOneIsReturn(int comm)
{
//<2F><>ѯ<EFBFBD><D1AF>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>
for (int i = 0; i < 10; i++)
{
unsigned char Buf[8] = { 0 };
Buf[0] = 0x01;
Buf[1] = 0x03;
Buf[2] = 0x02;
Buf[3] = 0x00;
Buf[4] = 0x00;
Buf[5] = 0x01;
Buf[6] = 0x8F;
Buf[7] = 0xB2;
m_transformer.WriteBuf(Buf, 8);
Sleep(1000);
unsigned char readBuf[8];
memset(readBuf, 0, 22);
int length = m_transformer.ReadBuf((char*)readBuf, 8);
if (readBuf[0] == 0x01 && readBuf[1] == 0x03 && readBuf[2] == 0x02)
{
//У<><D0A3><EFBFBD>ɹ<EFBFBD>
if (readBuf[5] == 0xB8 && readBuf[6] == 0x44)
{
Sleep(3000);
continue;
}
else
{
return true;
}
}
else
{
return false;
}
}
return false;
}