#include "TransformerExport.h" TransformerExport::TransformerExport() { } TransformerExport::~TransformerExport() { } bool TransformerExport::InitDahuanTransformer() { //清除告警 std::vector 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(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; }