From c323f0c18cf7964980823e0bc05a8ed1a5eb8ff3 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 23 Aug 2024 09:19:37 +0800 Subject: [PATCH] =?UTF-8?q?EAP=E6=8E=A7=E5=88=B6=E6=96=99=E7=9B=92?= =?UTF-8?q?=E5=B1=82=E6=95=B013/25=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp | 132 +++++++++++++++++++++- LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h | 4 + LaiPuLaser/LaiPuLaser/TransferArmMgr.cpp | 14 +++ 3 files changed, 144 insertions(+), 6 deletions(-) diff --git a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp index 29c5394..a1afbd5 100644 --- a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp +++ b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp @@ -41,7 +41,8 @@ #include #include #include "ThorlabsKCubeMotorCtrlMgr.h" - +#include "FoupLoadPortMgr.h" +#include @@ -1723,6 +1724,17 @@ const char* CSemiSecsCommMgr::OnSecsGetVidVarValue(int varID) case 50006: {if (m_ReportWafer) { result = m_ReportWafer->m_FoupID; }}break; case 50007: {if (m_ReportWafer) { result = m_ReportWafer->m_ProcessJobID; }}break; case 50008: {if (m_ReportWafer) { result = m_ReportWafer->m_ControlJobID; }}break; + + case 50101: + { + result = gTransferArmMgr->IsCurCassetteLayer(_LoadPortType_Port1) ? ("13") : ("25"); + } + break; + case 50102: + { + result = gTransferArmMgr->IsCurCassetteLayer(_LoadPortType_Port2) ? ("13") : ("25"); + } + break; #endif//给Event Report 用的值------------END default:result.Format("error variable %d, please contact the engineer", varID);//未定义的id } @@ -3515,6 +3527,9 @@ void CSemiSecsCommMgr::UpdateEventReportVar(CSecsEventInfo &EventInfo) CString ReportInfo; switch(EventInfo.m_EventType) { + case _SecsEvent_Port1_CarrierLayer_Change: + case _SecsEvent_Port2_CarrierLayer_Change: + break; case _SecsEvent_FoupLoadMap_Start: case _SecsEvent_FoupLoadMap_End: case _SecsEvent_FoupUnload_Start: @@ -3553,7 +3568,7 @@ void CSemiSecsCommMgr::UpdateEventReportVar(CSecsEventInfo &EventInfo) case _SecsEvent_Wafer_Anneal_Start: case _SecsEvent_Wafer_Anneal_End: case _SecsEvent_Beam_Check_Start: - case _SecsEvent_Beam_Check_End: + case _SecsEvent_Beam_Check_End: { if(EventInfo.m_Wafer) { @@ -3613,7 +3628,8 @@ void CSemiSecsCommMgr::GetEventInfo(eSecsEquipEvent SecsEvent,int &EventId,CStri case _SecsEvent_Wafer_Anneal_End:{EventId=1100034;EventName="Wafer_Anneal_End";}break; case _SecsEvent_Beam_Check_Start:{EventId=1100035;EventName="_SecsEvent_Beam_Check_Start";}break; case _SecsEvent_Beam_Check_End:{EventId=1100036;EventName="_SecsEvent_Beam_Check_End";}break; - + case _SecsEvent_Port1_CarrierLayer_Change: {EventId = 1200001; EventName = "_SecsEvent_Port1_CarrierLayer_Change"; }break; + case _SecsEvent_Port2_CarrierLayer_Change: {EventId = 1200002; EventName = "_SecsEvent_Port2_CarrierLayer_Change"; }break; default: break; } @@ -3720,12 +3736,18 @@ REMOTE_REPLY CSemiSecsCommMgr::OnRemoteCmd(REMOTE_DATA RemoteData) set CmdSet; CmdSet.insert("CANCEL"); CmdSet.insert("STOP"); + CmdSet.insert("CARRIERLAYERCHANGE"); if(CmdSet.count(RemoteData.pRCMD)==false) return eCOMMAND_NOT_EXIST;//命令不存在 - if(RemoteData.pRCMD=="CANCEL"||RemoteData.pRCMD=="STOP") - return OnRemoteCmd_Cancel(RemoteData); - + if (RemoteData.pRCMD == "CANCEL" || RemoteData.pRCMD == "STOP") + { + return OnRemoteCmd_Cancel(RemoteData); + } + else if("CARRIERLAYERCHANGE"==RemoteData.pRCMD) + { + return OnRemoteCmd_CarrierLayerChange(RemoteData); + } return eCOMMAND_NOT_EXIST;//命令不存在 } @@ -3763,6 +3785,104 @@ REMOTE_REPLY CSemiSecsCommMgr::OnRemoteCmd_Start(REMOTE_DATA RemoteData) return eCOMMAND_PERFORMED;//执行 } +REMOTE_REPLY CSemiSecsCommMgr::OnRemoteCmd_CarrierLayerChange(REMOTE_DATA RemoteData) +{ + CLogInfo LogInfo; + LogInfo.m_ClassName = "CSemiSecsCommMgr"; + LogInfo.m_FuncName = "OnRemoteCmd_CarrierLayerChange"; + gLogMgr->WriteLogInfo(LogInfo); + + std::string sPar1 = RemoteData.mapParam["CP-PORT"];//"1 or 2" + std::string sPar2 = RemoteData.mapParam["CP-CARRIERLAYER"]; + + //转换为CString + CString CMD = RemoteData.pRCMD.c_str(); + CString PORT = sPar1.c_str(); + CString CARRIERLAYER = sPar2.c_str(); + + CString log; + log = CMD; + log += " PORT:["; + log += PORT; + log += "]CARRIERLAYER:["; + log += CARRIERLAYER; + log += "]"; + + gLogMgr->WriteDebugLog(log); + gLogMgr->InsertPromptList(log); + + eWaferLoadPortType CurPort = "1" == PORT ? _LoadPortType_Port1 : _LoadPortType_Port2; + + //Port 只能是1或者2 + if (PORT != "1" && PORT != "2") + { + CString ErrInfo = "Secs--->eCOMMAND_PARAMETER_IS_INVALID:PORT"; + gLogMgr->WriteDebugLog(ErrInfo); + gLogMgr->InsertPromptList(ErrInfo); + return eCOMMAND_PARAMETER_IS_INVALID;//参数错误 + } + //CARRIERLAYER 只能是13或者25 + if (CARRIERLAYER != "13" && CARRIERLAYER != "25") + { + CString ErrInfo = "Secs--->eCOMMAND_PARAMETER_IS_INVALID:CARRIERLAYER"; + gLogMgr->WriteDebugLog(ErrInfo); + gLogMgr->InsertPromptList(ErrInfo); + return eCOMMAND_PARAMETER_IS_INVALID;//参数错误 + } + if (gCommonFlowMgr->IsbAutoRunning()) + { + CString ErrInfo = "Secs--->COMMAND_REFUSAL_EXECUTE:CURRENT_DEVICE_STATUS_IS_AUTO_RUN"; + gLogMgr->WriteDebugLog(ErrInfo); + gLogMgr->InsertPromptList(ErrInfo); + return eCOMMAND_CANNOT_PERFORM_NOW;//命令现在不能执行 + } + if (gJobQueueMgr->HasJob()) + { + CString ErrInfo = "Secs--->COMMAND_REFUSAL_EXECUTE:DEVICE_HAS_JOB"; + gLogMgr->WriteDebugLog(ErrInfo); + gLogMgr->InsertPromptList(ErrInfo); + return eCOMMAND_CANNOT_PERFORM_NOW;//命令现在不能执行 + } + CFoupLoadPort &CurFoupLoadPort = gFoupLoadPortMgr->GetFoupLoadPort(CurPort); + if (CurFoupLoadPort.m_bFoupInEquip) + { + CString ErrInfo = "Secs--->COMMAND_REFUSAL_EXECUTE:FOUP_IN_EQUIP"; + gLogMgr->WriteDebugLog(ErrInfo); + gLogMgr->InsertPromptList(ErrInfo); + return eCOMMAND_CANNOT_PERFORM_NOW;//命令现在不能执行 + } + if ("13" == CARRIERLAYER && !gTransferArmMgr->IsCurCassetteLayer(CurPort)) + { + gTransferArmMgr->SwitchCassetteLayer(CurPort); + } + else if ("25" == CARRIERLAYER && gTransferArmMgr->IsCurCassetteLayer(CurPort)) + { + gTransferArmMgr->SwitchCassetteLayer(CurPort); + } + else + { + //CString ErrInfo = "Secs--->INVALID OPERATION:PORT"+ PORT +"CARRIERLAYER IS ALREADY"+ CARRIERLAYER; + //gLogMgr->WriteDebugLog(ErrInfo); + //gLogMgr->InsertPromptList(ErrInfo); + //return eCOMMAND_REJECTED;//拒绝,虽然已经满足命令所需状态 + auto EventFun = [&](eWaferLoadPortType PortType) + { + Sleep(500); + //Eap 事件 + { + CSecsEventInfo EventInfo; + EventInfo.m_EventType = _LoadPortType_Port1 == PortType ? _SecsEvent_Port1_CarrierLayer_Change : _SecsEvent_Port2_CarrierLayer_Change; + EventInfo.m_LoadPortType = PortType; + gSemiSecsCommMgr->SendEventToEap(EventInfo); + } + }; + thread tSend(EventFun,CurPort); + tSend.detach(); + } + + return eCOMMAND_PERFORMED;//执行 +} + #endif #if 1 diff --git a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h index 9574e28..1896d1e 100644 --- a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h +++ b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h @@ -53,6 +53,9 @@ enum eSecsEquipEvent _SecsEvent_Wafer_Anneal_End, _SecsEvent_Beam_Check_Start, _SecsEvent_Beam_Check_End, + //1200001 + _SecsEvent_Port1_CarrierLayer_Change, + _SecsEvent_Port2_CarrierLayer_Change, _SecsEvent_Max, @@ -381,6 +384,7 @@ private: REMOTE_REPLY OnRemoteCmd_Cancel(REMOTE_DATA RemoteData); REMOTE_REPLY OnRemoteCmd_CassetteClose(REMOTE_DATA RemoteData); REMOTE_REPLY OnRemoteCmd_Start(REMOTE_DATA RemoteData); + REMOTE_REPLY OnRemoteCmd_CarrierLayerChange(REMOTE_DATA RemoteData); void UpdateEventReportVar(CSecsEventInfo &EventInfo); bool EnableGem300(); void InitCMS(); diff --git a/LaiPuLaser/LaiPuLaser/TransferArmMgr.cpp b/LaiPuLaser/LaiPuLaser/TransferArmMgr.cpp index 689b271..ab927b9 100644 --- a/LaiPuLaser/LaiPuLaser/TransferArmMgr.cpp +++ b/LaiPuLaser/LaiPuLaser/TransferArmMgr.cpp @@ -37,6 +37,7 @@ #include "JobQueueMgr.h" #include "OtherMonitorDevMgr.h" #include "ThimbleMgr.h" +#include #define ArmInSmifMaxDis 44 @@ -3786,6 +3787,19 @@ void CTransferArmMgr::SwitchCassetteLayer(eWaferLoadPortType LoadPortType) int PortSlotCnt = bChange ? (int)13 : (int)25; m_Port2SlotCnt = PortSlotCnt; } + auto EventFun = [&](eWaferLoadPortType PortType) + { + Sleep(500); + //Eap 事件 + { + CSecsEventInfo EventInfo; + EventInfo.m_EventType = _LoadPortType_Port1 == PortType ? _SecsEvent_Port1_CarrierLayer_Change : _SecsEvent_Port2_CarrierLayer_Change; + EventInfo.m_LoadPortType = PortType; + gSemiSecsCommMgr->SendEventToEap(EventInfo); + } + }; + thread tSend(EventFun, LoadPortType); + tSend.detach(); } bool CTransferArmMgr::CheckCassetteLayerChange(eWaferLoadPortType LoadPortType)