From e2e8c2a7bc9b2c942de5b61052e3411c5e5dd126 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 2 Sep 2024 19:57:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DVID(=E5=B7=A5=E8=89=BARecipe?= =?UTF-8?q?=5FBody)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LaiPuLaser/LaiPuLaser/CommonFlowMgr.cpp | 7 + LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp | 137 ++++++++++++++++++ LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h | 65 +++++++++ LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.cpp | 3 + LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.h | 2 + 5 files changed, 214 insertions(+) diff --git a/LaiPuLaser/LaiPuLaser/CommonFlowMgr.cpp b/LaiPuLaser/LaiPuLaser/CommonFlowMgr.cpp index 6d9ee4e..2011c0b 100644 --- a/LaiPuLaser/LaiPuLaser/CommonFlowMgr.cpp +++ b/LaiPuLaser/LaiPuLaser/CommonFlowMgr.cpp @@ -4155,6 +4155,13 @@ void CCommonFlowMgr::CreatSubRecipeAnnealScanCmd(CWorkCmdInvoker &CmdInvoker,CW pCmd->NotShowLog(); CmdInvoker.AddCmd(pCmd); } + //设置wafer 的RecipeRecord + { + CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction(); + pCmd->SetExcuteAction(_ExcuteAction_UpdateWaferRecipeRecord); + pCmd->BindingPar(pWafer); + CmdInvoker.AddCmd(pCmd); + } //发送eap 事件 { CSecsEventInfo EventInfo; diff --git a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp index a1afbd5..9f0796e 100644 --- a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp +++ b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.cpp @@ -979,6 +979,113 @@ CString CSemiSecsCommMgr::GetEquipMDLN() { return m_SecsCommPar.m_EquipMDLN; } +void CSemiSecsCommMgr::UpDataCEIDRecipeRecord(CWafer * pWafer) +{ + CRecipe Recipe = pWafer->m_WaferRecipe; + m_CurCEIDRecipeRecord.Recipe_Name = Recipe.m_RecipeName; + m_CurCEIDRecipeRecord.Sub_Recipe_Name = Recipe.GetCurSubRecipeName(); + CRecipeParameter RecipePar; + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_FRE); + m_CurCEIDRecipeRecord.Laser1Frequency = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER2_FRE); + m_CurCEIDRecipeRecord.Laser2Frequency = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_PRF2_DELAY); + m_CurCEIDRecipeRecord.TwoPulseDelay = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_CURR_1); + m_CurCEIDRecipeRecord.Laser1Current = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_CURR_2); + m_CurCEIDRecipeRecord.Laser2Current = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_EDI_1); + m_CurCEIDRecipeRecord.Laser1Edi = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_EDI_2); + m_CurCEIDRecipeRecord.Laser2Edi = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_EDI_CHECK_SCOPE); + m_CurCEIDRecipeRecord.EdiCheckScope = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_OVERLAP_RATIO_X); + m_CurCEIDRecipeRecord.OverlapX = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_OVERLAP_RATIO_Y); + m_CurCEIDRecipeRecord.OverlapY = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_FOCUS_ADJUST_VAL); + m_CurCEIDRecipeRecord.FoucsAdjustVal = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_FIX_SCAN_SPEED); + m_CurCEIDRecipeRecord.FixScanSpeed = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_FIX_SCAN_LINE_GAP); + m_CurCEIDRecipeRecord.FixScanLineGap = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_SCAN_AREA); + m_CurCEIDRecipeRecord.ScanArea = RecipePar.m_ParStrVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_AREA_IDX); + m_CurCEIDRecipeRecord.AreaIdx = Int2CString(RecipePar.m_ParIntVal); + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_N2_STATE); + m_CurCEIDRecipeRecord.N2 = RecipePar.m_ParBoolVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_EDI_OFFSET_1); + m_CurCEIDRecipeRecord.Laser1EdiOffset = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_EDI_OFFSET_2); + m_CurCEIDRecipeRecord.Laser2EdiOffset = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_SCAN_LINE_START_IDX); + m_CurCEIDRecipeRecord.StartScanLineIdx = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_ALIGNER_ANG); + m_CurCEIDRecipeRecord.WaferAlignerAngle = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_OFFSET_TAB); + m_CurCEIDRecipeRecord.OffsetTable = RecipePar.m_ParStrVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_RUNTIMES); + m_CurCEIDRecipeRecord.RunTimes = RecipePar.m_ParIntVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_N2_VAL); + m_CurCEIDRecipeRecord.N2VAL = RecipePar.m_ParDoubleVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_USE_CUR_N2VAL); + m_CurCEIDRecipeRecord.USECURN2VAL = RecipePar.m_ParBoolVal; + } + { + RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_CASSETTE_TIER_COUNT); + m_CurCEIDRecipeRecord.CassetteTierCout = RecipePar.m_ParIntVal; + } +} #endif #if 1 //初始化变量svid @@ -1735,6 +1842,36 @@ const char* CSemiSecsCommMgr::OnSecsGetVidVarValue(int varID) result = gTransferArmMgr->IsCurCassetteLayer(_LoadPortType_Port2) ? ("13") : ("25"); } break; + //当前工艺Recipe + case 50201:result = m_CurCEIDRecipeRecord.Recipe_Name; break; + case 50202:result = m_CurCEIDRecipeRecord.Sub_Recipe_Name; break; + case 50203:result = Db2CString(m_CurCEIDRecipeRecord.Laser1Frequency); break; + case 50204:result = Db2CString(m_CurCEIDRecipeRecord.Laser2Frequency); break; + case 50205:result = Db2CString(m_CurCEIDRecipeRecord.TwoPulseDelay); break; + case 50206:result = Db2CString(m_CurCEIDRecipeRecord.Laser1Current); break; + case 50207:result = Db2CString(m_CurCEIDRecipeRecord.Laser2Current); break; + case 50208:result = Db2CString(m_CurCEIDRecipeRecord.Laser1Edi); break; + case 50209:result = Db2CString(m_CurCEIDRecipeRecord.Laser2Edi); break; + case 50210:result = Db2CString(m_CurCEIDRecipeRecord.EdiCheckScope); break; + case 50211:result = Db2CString(m_CurCEIDRecipeRecord.OverlapX); break; + case 50212:result = Db2CString(m_CurCEIDRecipeRecord.OverlapY); break; + case 50213:result = Db2CString(m_CurCEIDRecipeRecord.FoucsAdjustVal); break; + case 50214:result = Db2CString(m_CurCEIDRecipeRecord.FixScanSpeed); break; + case 50215:result = Db2CString(m_CurCEIDRecipeRecord.FixScanLineGap); break; + case 50216:result = m_CurCEIDRecipeRecord.ScanArea; break; + case 50217:result = m_CurCEIDRecipeRecord.AreaIdx; break; + case 50218:result = Bool2CStringOnOff(m_CurCEIDRecipeRecord.N2); break; + case 50219:result = Db2CString(m_CurCEIDRecipeRecord.Laser1EdiOffset); break; + case 50220:result = Db2CString(m_CurCEIDRecipeRecord.Laser2EdiOffset); break; + case 50221:result = Int2CString(m_CurCEIDRecipeRecord.StartScanLineIdx); break; + case 50222:result = Db2CString(m_CurCEIDRecipeRecord.WaferAlignerAngle); break; + case 50223:result = m_CurCEIDRecipeRecord.OffsetTable; break; + case 50224:result = Int2CString(m_CurCEIDRecipeRecord.RunTimes); break; + case 50225:result = Db2CString(m_CurCEIDRecipeRecord.N2VAL); break; + case 50226:result = Bool2CStringOnOff(m_CurCEIDRecipeRecord.USECURN2VAL); break; + case 50227:result = Int2CString(m_CurCEIDRecipeRecord.CassetteTierCout); break; + + #endif//给Event Report 用的值------------END default:result.Format("error variable %d, please contact the engineer", varID);//未定义的id } diff --git a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h index 1896d1e..94abc0d 100644 --- a/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h +++ b/LaiPuLaser/LaiPuLaser/SemiSecsCommMgr.h @@ -304,7 +304,69 @@ public: double m_Beam_Check_Dt_Y_865_Count; }; +class CEIDRecipeRecord +{ +public: + CEIDRecipeRecord() + { + Recipe_Name = "";//Recipe名称 + Sub_Recipe_Name = "";//SubRecipe名称 + Laser1Frequency = 0.0;//Laser1脉冲频率 + Laser2Frequency = 0.0;//Laser2脉冲频率 + TwoPulseDelay = 0.0;//双脉冲延时 + Laser1Current = 0.0;//Laser1电流值 + Laser2Current = 0.0;//Laser2电流值 + Laser1Edi = 0.0;//Laser1功率密度 + Laser2Edi = 0.0;//Laser2功率密度 + EdiCheckScope = 0.0;//功率密度卡控精度(设置为0时使用config中的默认值) + OverlapX = 0.0;//重叠率X + OverlapY = 0.0;//重叠率Y + FoucsAdjustVal = 0.0;//焦距微调值 + FixScanSpeed = 0.0;//固定扫描速度(大于0时不使用重叠率X计算的扫描速度) + FixScanLineGap = 0.0;//固定扫描间隔(大于0时不使用重叠率Y计算的扫描间隔) + ScanArea = "";//扫描区域文件名称 + AreaIdx = "";//扫描区域编号 + N2 = true;//是否打开氮气 + Laser1EdiOffset = 0.0;//Laser1功率密度补偿 + Laser2EdiOffset = 0.0;//Laser2功率密度补偿 + StartScanLineIdx = 0;//开始扫描线段编号 + WaferAlignerAngle = 270;//Rcp wafer准直角度 + OffsetTable = "Empty";//OffsetTable文件名称 + RunTimes = 1;//Cyclic run的次数 + N2VAL = 0;//MFC控制的N2流量值 + USECURN2VAL = false;//是否使用Recipe N2流量值 + CassetteTierCout = 13;//料盒层数 + }; +public: + CString Recipe_Name;//Recipe名称 + CString Sub_Recipe_Name;//SubRecipe名称 + double Laser1Frequency;//Laser1脉冲频率 + double Laser2Frequency;//Laser2脉冲频率 + double TwoPulseDelay;//双脉冲延时 + double Laser1Current;//Laser1电流值 + double Laser2Current;//Laser2电流值 + double Laser1Edi;//Laser1功率密度 + double Laser2Edi;//Laser2功率密度 + double EdiCheckScope;//功率密度卡控精度(设置为0时使用config中的默认值) + double OverlapX;//重叠率X + double OverlapY;//重叠率Y + double FoucsAdjustVal;//焦距微调值 + double FixScanSpeed;//固定扫描速度(大于0时不使用重叠率X计算的扫描速度) + double FixScanLineGap;//固定扫描间隔(大于0时不使用重叠率Y计算的扫描间隔) + CString ScanArea;//扫描区域文件名称 + CString AreaIdx;//扫描区域编号 + bool N2;//是否打开氮气 + double Laser1EdiOffset;//Laser1功率密度补偿 + double Laser2EdiOffset;//Laser2功率密度补偿 + int StartScanLineIdx;//开始扫描线段编号 + double WaferAlignerAngle;//Rcp wafer准直角度 + CString OffsetTable;//OffsetTable文件名称 + int RunTimes;//Cyclic run的次数 + double N2VAL;//MFC控制的N2流量值 + bool USECURN2VAL;//是否使用Recipe N2流量值 + int CassetteTierCout;//料盒层数 +}; //半导体SEMI 通信协议管理 @@ -372,6 +434,7 @@ public: CFDCKeepPar &GetFDCKeepPar(){return m_FDCKeepPar;}; void SecsPPCtrl(PP_HANDLE_DATA* pPpHandle); CString GetEquipMDLN(); + void UpDataCEIDRecipeRecord(CWafer *pWafer); private: void SemiSecsCommInit(); void InitSecsVar(); @@ -461,6 +524,8 @@ private: CWafer *m_ReportWafer;//当前事件report 的wafer eWaferLoadPortType m_ReportPortType;//当前事件report 的PortType + + CEIDRecipeRecord m_CurCEIDRecipeRecord; }; diff --git a/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.cpp b/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.cpp index 1d5e8ca..09c2b5d 100644 --- a/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.cpp +++ b/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.cpp @@ -474,6 +474,9 @@ bool CWorkCmdExcuteAction::Excute() case _ExcuteAction_UpdateWaferAnnealState: gTransferArmMgr->UpdateWaferAnnealState(*pWafer); break; + case _ExcuteAction_UpdateWaferRecipeRecord: + gSemiSecsCommMgr->UpDataCEIDRecipeRecord(pWafer); + break; case _ExcuteAction_CheckManualOnPlatWafer: gTransferArmMgr->CheckManualOnPlatWafer(); break; diff --git a/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.h b/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.h index 9be24b0..4b6f212 100644 --- a/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.h +++ b/LaiPuLaser/LaiPuLaser/WorkCmdExcuteAction.h @@ -82,6 +82,8 @@ enum ExcuteAction _ExcuteAction_UpdateWaferAnnealState,//更新退火完成状态 + _ExcuteAction_UpdateWaferRecipeRecord,//更新wafer工艺RecipeRecord + _ExcuteAction_CheckManualOnPlatWafer,//检测手动放到载盘上的wafer