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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}