|
|
#include "TransformerExport.h"
|
|
|
|
|
|
|
|
|
|
|
|
TransformerExport::TransformerExport()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
|
|
|
TransformerExport::~TransformerExport()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
bool TransformerExport::InitDahuanTransformer()
|
|
|
{
|
|
|
//清除告警
|
|
|
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);
|
|
|
}
|
|
|
//执行回原指令
|
|
|
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);
|
|
|
|
|
|
//查询所有电缸是否全部回原
|
|
|
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);
|
|
|
|
|
|
//读取实时位置
|
|
|
for (int i = 0; i < 30; i++)
|
|
|
{
|
|
|
//下发查询指令
|
|
|
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);
|
|
|
|
|
|
//获取数据
|
|
|
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;
|
|
|
|
|
|
// 将 short 类型的数据拆分成两个字节
|
|
|
byteValue.bytes[0] = (distance >> 8) & 0xFF; // 高字节
|
|
|
byteValue.bytes[1] = distance & 0xFF; // 低字节
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
//判断是否存在错误信息
|
|
|
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寄存器
|
|
|
|
|
|
for (uint8_t num = 0; num < usDataLen; num++) {
|
|
|
uCRC = (*puchMsg++) ^ uCRC;//把数据与16位的CRC寄存器的低8位相异或,结果存放于CRC寄存器。
|
|
|
for (uint8_t x = 0; x < 8; x++) { //循环8次
|
|
|
if (uCRC & 0x0001) { //判断最低位为:“1”
|
|
|
uCRC = uCRC >> 1; //先右移
|
|
|
uCRC = uCRC ^ 0xA001; //再与0xA001异或
|
|
|
}
|
|
|
else { //判断最低位为:“0”
|
|
|
uCRC = uCRC >> 1; //右移
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return uCRC;//返回CRC校验值
|
|
|
}
|
|
|
|
|
|
bool TransformerExport::QueryOneIsReturn(int comm)
|
|
|
{
|
|
|
//查询回原结果
|
|
|
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)
|
|
|
{
|
|
|
//校验成功
|
|
|
if (readBuf[5] == 0xB8 && readBuf[6] == 0x44)
|
|
|
{
|
|
|
Sleep(3000);
|
|
|
continue;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|