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.

355 lines
8.6 KiB
C++

#include "JelExcecute.h"
JelExcecute::JelExcecute()
{
}
JelExcecute::~JelExcecute()
{
}
bool JelExcecute::InitJelRobot(int serialPort, int baudRate)
{
m_nPort = serialPort;
m_nBaud = baudRate;
m_RobotComm.SetWorkMode(FALSE, 100);
std::string strCom = std::to_string(m_nBaud) + ",N,8,1";
m_nPort = 2;
if (m_RobotComm.Open(m_nPort, (char*)strCom.c_str()))
{
//m_RobotComm.SetWnd(gChildPCS_WaferTransfer->GetSafeHwnd());
m_RobotComm.SetNotify(std::bind(&JelExcecute::OnRobotCommRecv, this));
CRobotCmdInfo RobotCmd;
RobotCmd.m_RobotCmdType = _RobotCmd_ResetErr;
SendRobotCmd(RobotCmd);
Sleep(1000);
RobotCmd.m_RobotCmdType = _RobotCmd_Org;
RobotCmd.m_WaitCmdTime = 60;
bool issuccess = SendRobotCmd(RobotCmd);
if (!issuccess)
{
return false;
}
Sleep(500);
//<2F><>ʼ<EFBFBD><CABC>׼ֱ<D7BC><D6B1>
RobotCmd.m_RobotCmdType = _RobotCmd_Init_Align;
issuccess = SendRobotCmd(RobotCmd);
if (!issuccess)
{
return false;
}
}
else
{
return false;
}
return true;
}
bool JelExcecute::SendRobotCmd(CRobotCmdInfo& RobotCmd)
{
eGlobalVariableType AlarmType = _GlobalVar_NULL;
{
//<2F>ȰѴ<C8B0><D1B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD><C8A1>
char Buf[256];
memset(Buf, 0, 256);
m_RobotComm.ReadBuf(Buf, 256);
}
m_IsbJelCommRecv = false;//<2F>Ƿ<EFBFBD><C7B7>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//<2F><>ȡ<EFBFBD><C8A1>Ҫִ<D2AA>е<EFBFBD>ָ<EFBFBD><D6B8>
RobotJel_GetSendCmd(RobotCmd);
AlarmType = RobotJel_SendCmdToRobotExt(RobotCmd);
if (AlarmType != _GlobalVar_NULL)
{
return false;
}
return true;
}
void JelExcecute::OnRobotCommRecv()
{
m_IsbJelCommRecv = true;//<2F>Ƿ<EFBFBD><C7B7>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
}
void JelExcecute::RobotJel_GetSendCmd(CRobotCmdInfo& RobotCmd)
{
RobotCmd.m_WaitCmdTime = m_nWaitTime;
if (RobotCmd.m_RobotCmdType == _RobotCmd_Check_ARM_EXIST_WAFER)
{
if (RobotCmd.m_armPos == "up")
{
RobotCmd.m_SendCmdStr = "$1CS4";
}
else if (RobotCmd.m_armPos == "down")
{
RobotCmd.m_SendCmdStr = "$1CS8";
}
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_ImmediateReadFeedback;
RobotCmd.m_WaitCmdTime = m_nWaitTime;
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_ResetErr) //<2F><>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$1RD $2RD<52><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼ֱ<D7BC><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
RobotCmd.m_SendCmdStr = "$1RD";
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_SendOnly;
}
else if(RobotCmd.m_RobotCmdType == _RobotCmd_Org)
{
RobotCmd.m_SendCmdStr = "$1G2";
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_RunToCassMappingPoint)
{
std::string smdStr = "$1G";
if (RobotCmd.LoadportId == POS_CASS_LEFT)
{
smdStr.append(std::to_string(SCRIPT_X_RUN_TO_MAPPING_POS_INDEX + 4 * 0));
}
if (RobotCmd.LoadportId == POS_CASS_CENTER)
{
smdStr.append(std::to_string(SCRIPT_X_RUN_TO_MAPPING_POS_INDEX + 4 * 1));
}
if (RobotCmd.LoadportId == POS_CASS_RIGHT)
{
smdStr.append(std::to_string(SCRIPT_X_RUN_TO_MAPPING_POS_INDEX + 4 * 2));
}
RobotCmd.m_SendCmdStr = smdStr;
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_Mapping)
{
std::string smdStr = "$1G";
if (RobotCmd.LoadportId == POS_CASS_LEFT)
{
smdStr.append(std::to_string(SCRIPT_MAPPING_INDEX + 0));
}
if (RobotCmd.LoadportId == POS_CASS_CENTER)
{
smdStr.append(std::to_string(SCRIPT_MAPPING_INDEX + 1));
}
if (RobotCmd.LoadportId == POS_CASS_RIGHT)
{
smdStr.append(std::to_string(SCRIPT_MAPPING_INDEX + 2));
}
RobotCmd.m_SendCmdStr = smdStr;
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_ReadMappingData)
{
RobotCmd.m_SendCmdStr = "$1G274";
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_ImmediateReadFeedback;//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
}
else if (RobotCmd.m_RobotCmdType == _RObotCmd_Switch_bank)
{
std::string cmdStr = "$1G";
cmdStr.append(std::to_string(SCRIPT_BANK_INDEX + RobotCmd.m_bankIndex));
RobotCmd.m_SendCmdStr = cmdStr;
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_SelectCass)
{
std::string cmdStr = "$1G";
cmdStr.append(std::to_string(SCRIPT_CASS_START_INDEX + (RobotCmd.m_cassIndex - 1)));
RobotCmd.m_SendCmdStr = cmdStr;
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_SelectSlot)
{
std::string cmdStr = "$1G";
if (RobotCmd.m_cassIndex <= 3)
{
cmdStr.append(std::to_string(SCRIPT_SLOT_START_INDEX + (RobotCmd.m_Slot - 1)));
}
else
{
cmdStr.append(std::to_string(SCRIPT_SLOT_START_INDEX));
}
RobotCmd.m_SendCmdStr = cmdStr;
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_X_Move)
{
std::string cmdStr = "$1G";
int xMoveIndex = SCRIPT_X_MOVE_INDEX;
if (RobotCmd.m_dealWaferType == DEAL_WAFER_TAKE)
{
if (RobotCmd.m_bankIndex == BANK_WAFER)
{
xMoveIndex = xMoveIndex + 4 * (RobotCmd.m_cassIndex - 1) + 2;
}
else if (RobotCmd.m_bankIndex == BANK_RING)
{
xMoveIndex = xMoveIndex + 4 * (RobotCmd.m_cassIndex - 1) + 0;
}
}
else if(RobotCmd.m_dealWaferType == DEAL_WAFER_RETURN)
{
if (RobotCmd.m_bankIndex == BANK_WAFER)
{
xMoveIndex = xMoveIndex + 4 * (RobotCmd.m_cassIndex - 1) + 3;
}
else if (RobotCmd.m_bankIndex == BANK_RING)
{
xMoveIndex = xMoveIndex + 4 * (RobotCmd.m_cassIndex - 1) + 1;
}
}
cmdStr.append(std::to_string(xMoveIndex));
RobotCmd.m_SendCmdStr = cmdStr;
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;
}
else if (RobotCmd.m_RobotCmdType == _RobotCmd_TakeWafer)
{
if (RobotCmd.m_dealWaferType == DEAL_WAFER_TAKE)
{
if (RobotCmd.m_bankIndex == BANK_WAFER)
{
RobotCmd.m_SendCmdStr = "1G52";
}
else if (RobotCmd.m_bankIndex == BANK_RING)
{
RobotCmd.m_SendCmdStr = "1G50";
}
}
else if (RobotCmd.m_dealWaferType == DEAL_WAFER_RETURN)
{
if (RobotCmd.m_bankIndex == BANK_WAFER)
{
RobotCmd.m_SendCmdStr = "1G53";
}
else if (RobotCmd.m_bankIndex == BANK_RING)
{
RobotCmd.m_SendCmdStr = "1G51";
}
}
RobotCmd.m_RobotCmdSendType = _RobotCmdSendType_WaitCmdEnd;
}
}
eGlobalVariableType JelExcecute::RobotJel_SendCmdToRobotExt(CRobotCmdInfo &RobotCmd)
{
std::string RetStr;
std::string SendCmd = RobotCmd.m_SendCmdStr;
bool bOvertime = false;
std::string ErrMsg;
{
int len = SendCmd.length();
SendCmd += " ";//<2F><><EFBFBD><EFBFBD>2 <20>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CR><LF>
char *pStr = (char*)SendCmd.c_str();
pStr[len++] = 0x0d;//<CR>
pStr[len++] = 0x0a;//<LF>
char Buf[COM_BUF_LEN];
memset(Buf, 0, COM_BUF_LEN);
memcpy(Buf, pStr, len);
m_RobotComm.WriteBuf(Buf, len);
if (RobotCmd.m_RobotCmdSendType == _RobotCmdSendType_SendOnly)//ֻ<><D6BB><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
{
return _GlobalVar_NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if (RobotCmd.m_RobotCmdSendType == _RobotCmdSendType_ImmediateReadFeedback)
{
m_armIsExistWafer = false;
Sleep(2000);
m_IsbJelCommRecv = false;//<2F><><EFBFBD><EFBFBD>
memset(Buf, 0, COM_BUF_LEN);
m_RobotComm.ReadBuf(Buf, COM_BUF_LEN);
std::string RetStr(Buf);
//>$10<31><30>ʾ<EFBFBD><CABE><EFBFBD>ϣ<EFBFBD>>$11<31><31>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
int findIndex = 0;
findIndex = RetStr.find(">$11");
findIndex >= 0 ? m_armIsExistWafer = true : m_armIsExistWafer = false;
if (RetStr.find(">") != -1)//<2F><><EFBFBD><EFBFBD>">"<22><>ʾִ<CABE><D6B4><EFBFBD><EFBFBD>
{
RobotCmd.m_RevStr = RetStr;
}
else
{
ErrMsg = "Read Feed back Err";
}
}
else//<2F>첽<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ȡ
{
int WaitDelay = RobotCmd.m_WaitCmdTime * 1000;//<2F>ܹ<EFBFBD><DCB9>ȴ<EFBFBD><C8B4><EFBFBD>ʱ<EFBFBD><CAB1>ms
int CheckDelay = 200;//ÿ<><C3BF>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ʱ
int CurDelay = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
bOvertime = false;
ErrMsg = "";
while (1)
{
if (m_IsbJelCommRecv)//<2F>յ<EFBFBD><D5B5>µ<EFBFBD><C2B5><EFBFBD>Ϣʱ<CFA2><CAB1>ȥ<EFBFBD><C8A5>ȡ
{
Sleep(CheckDelay);
m_IsbJelCommRecv = false;//<2F><><EFBFBD><EFBFBD>
memset(Buf, 0, COM_BUF_LEN);
m_RobotComm.ReadBuf(Buf, COM_BUF_LEN);
std::string RetStr(Buf);
if (RetStr.find(">") != -1)//<2F><><EFBFBD><EFBFBD>">"<22><>ʾִ<CABE><D6B4><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ͺ<EFBFBD>ֻ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><
if (RobotCmd.m_RobotCmdSendType == _RobotCmdSendType_WaitFeedback)
{
RobotCmd.m_RevStr = RetStr;
break;
}
}
if (RetStr.find(RobotCmd.m_SendCmdStr) != -1)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd<6D><64>ʾִ<CABE>н<EFBFBD><D0BD><EFBFBD>
{
break;
}
else if (RetStr.find("ERROR") != -1)
{
ErrMsg = "<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
break;
}
}
CurDelay += CheckDelay;
if (CurDelay > WaitDelay)
{
bOvertime = true;
break;
}
Sleep(CheckDelay);
}
}
}
if (bOvertime)//<2F><><EFBFBD>ⳬʱ
{
std::string AddInfo;
AddInfo = "Cmd Over Time:";
AddInfo += RobotCmd.m_SendCmdStr;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>Ϣ
{
RobotCmd.m_ErrStr = AddInfo;
return _GlobalVar_Alarm_Robot_CmdOverTime;
}
}
//ERR:code:Description
if (ErrMsg != "")//ִ<>д<EFBFBD><D0B4><EFBFBD>
{
std::string AddInfo = RobotCmd.m_SendCmdStr;
AddInfo += "Cmd Execute Error:";
AddInfo += ErrMsg;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>Ϣ
{
RobotCmd.m_ErrStr = AddInfo;
return _GlobalVar_Alarm_Robot_StateErr;
}
}
return _GlobalVar_NULL;
}