|
|
|
@ -3817,30 +3817,7 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
}
|
|
|
|
|
//调整SubRecipe 对应的衰减器角度
|
|
|
|
|
//不复检的时候也要调整
|
|
|
|
|
if(!m_bSubRecipeEdiEqualZero && bLaser1EdiZero)//22-12-15
|
|
|
|
|
{
|
|
|
|
|
//Edi 为0 的但是电流不为0的情况要旋转到45度,避免影响另外一路复检
|
|
|
|
|
if(!bLaser1CurrZero)
|
|
|
|
|
{
|
|
|
|
|
double RotatoDimmer1Ang = POW_ZERO_DIMMER_ANG_45;
|
|
|
|
|
//log
|
|
|
|
|
{
|
|
|
|
|
Log.Format("->RotatoDimmer1Ang = %lf",RotatoDimmer1Ang);
|
|
|
|
|
LogInfo.m_LogMsg = Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_RotatoDimmer_ToAngle;
|
|
|
|
|
ActionPar.m_DoubleParVal = RotatoDimmer1Ang;
|
|
|
|
|
ActionPar.m_IntParVal = (int)_LaserDeviceType_MainLaser1;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (!bLaser1CurrZero || !bLaser1EdiZero)//电流或Edi不为0的情况要旋转相应一路衰减器
|
|
|
|
|
{
|
|
|
|
|
double RotatoDimmer1Ang = -1;//表示使用之前的角度
|
|
|
|
|
//功率密度参数有变化的时候
|
|
|
|
@ -3858,7 +3835,6 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
LogInfo.m_LogMsg = Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
//if(RotatoDimmer1Ang>=0)
|
|
|
|
|
{
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_RotatoDimmer_ToAngle;
|
|
|
|
@ -3869,38 +3845,15 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//不复检的时候不用转动衰减器(使用之前复检的角度)
|
|
|
|
|
if(!m_bSubRecipeEdiEqualZero && bLaser2EdiZero)
|
|
|
|
|
{
|
|
|
|
|
//Edi 为0 的但是电流不为0的情况要旋转到45度,避免影响另外一路复检
|
|
|
|
|
if(!bLaser2CurrZero)
|
|
|
|
|
{
|
|
|
|
|
double RotatoDimmer2Ang = POW_ZERO_DIMMER_ANG_45;
|
|
|
|
|
//log
|
|
|
|
|
{
|
|
|
|
|
Log.Format("->RotatoDimmer2Ang = %lf",RotatoDimmer2Ang);
|
|
|
|
|
LogInfo.m_LogMsg = Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_RotatoDimmer_ToAngle;
|
|
|
|
|
ActionPar.m_DoubleParVal = RotatoDimmer2Ang;
|
|
|
|
|
ActionPar.m_IntParVal = (int)_LaserDeviceType_MainLaser2;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (!bLaser2CurrZero || !bLaser2EdiZero)//电流或Edi不为0的情况要旋转相应一路衰减器
|
|
|
|
|
{
|
|
|
|
|
double RotatoDimmer2Ang = -1;//表示使用之前的角度
|
|
|
|
|
//参数变化时转到recipe 设置角度
|
|
|
|
|
//bLaser2RecipeEdiChange没变就是之前的角度-1(不用旋转)
|
|
|
|
|
//(!bCreatRecipeEdiCheckCmd)表示不EDI复检,就需要转到rcp 的角度上
|
|
|
|
|
//功率密度参数有变化的时候
|
|
|
|
|
//或者不复检的时候
|
|
|
|
|
//使用rcp 的计算角度
|
|
|
|
|
if (bLaser2RecipeEdiChange || !bCreatRecipeEdiCheckCmd)
|
|
|
|
|
{
|
|
|
|
|
//转到recipe 设置角度(这个角度是用点检结果功率和EDI计算出来的)
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_ROTATO_DIMMER_ANG2);
|
|
|
|
|
RotatoDimmer2Ang = RecipePar.m_ParDoubleVal;
|
|
|
|
|
}
|
|
|
|
@ -3970,180 +3923,6 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#if 0
|
|
|
|
|
if(!bLaser1EdiZero)
|
|
|
|
|
{
|
|
|
|
|
//电流和角度设置之后示波器自适应
|
|
|
|
|
if (gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_TekOscilloscope))
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_BoolParVal = true;// wafer2wafer流程才需要等待 设置true
|
|
|
|
|
ActionPar.m_IntParVal = 20;//20秒超时
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_AdjustOsiiMaxAmplitudeCheckExcEnd;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
//rawata采集
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_BoolParVal = true;//是在工艺中,用于结束条件判断
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_OsiiRawDataCollect;
|
|
|
|
|
ActionPar.m_pBindingPar = pWafer;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
/*复检时波形 rawdata采集可以同步进行
|
|
|
|
|
{
|
|
|
|
|
//rawata采集
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_BoolParVal = true;//是在工艺中,用于结束条件判断
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_OsiiRawDataCollectCheckExcEnd;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
//这个时候laser2 Pow 是0 (LD12一起用的时候衰减角度2是45度)
|
|
|
|
|
//检测Laser1 功率密度(不满足rcp 条件时自动调整衰减角度)
|
|
|
|
|
//调整后的角度保存在m_Laser1RotatoDimmerAng
|
|
|
|
|
{
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetExcuteAction(_ExcuteAction_CheckRecipeEdiOnAnnealStart);
|
|
|
|
|
pCmd->BindingPar(pWafer);//绑定当前生产的wafer
|
|
|
|
|
pCmd->SetIntParVal((int)_LaserDeviceType_MainLaser1);
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(!bLaser2EdiZero)//LD2 Edi 不为0
|
|
|
|
|
{
|
|
|
|
|
if(!bLaser1EdiZero)//LD1 Edi 不为0
|
|
|
|
|
{
|
|
|
|
|
//先把laser1 的角度转到45 角度
|
|
|
|
|
//没复检不会执行这里
|
|
|
|
|
{
|
|
|
|
|
double RotatoDimmer1Ang = POW_ZERO_DIMMER_ANG_45;
|
|
|
|
|
{
|
|
|
|
|
Log.Format("->RotatoDimmer1Ang = %lf",RotatoDimmer1Ang);
|
|
|
|
|
LogInfo.m_LogMsg = Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_RotatoDimmer_ToAngle;
|
|
|
|
|
ActionPar.m_DoubleParVal = RotatoDimmer1Ang;
|
|
|
|
|
ActionPar.m_IntParVal = (int)_LaserDeviceType_MainLaser1;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
//把laser2 的衰减角度转到测量角度
|
|
|
|
|
{
|
|
|
|
|
double RotatoDimmer2Ang;
|
|
|
|
|
if(bLaser2RecipeEdiChange)//变化的时候使用Recipe 的角度
|
|
|
|
|
{
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_ROTATO_DIMMER_ANG2);
|
|
|
|
|
RotatoDimmer2Ang = RecipePar.m_ParDoubleVal;
|
|
|
|
|
//log
|
|
|
|
|
{
|
|
|
|
|
Log.Format("->RotatoDimmer2Ang = %lf",RotatoDimmer2Ang);
|
|
|
|
|
LogInfo.m_LogMsg = Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else//没有变化的时候使用上一次复检调整的角度
|
|
|
|
|
{
|
|
|
|
|
RotatoDimmer2Ang = -2;
|
|
|
|
|
{
|
|
|
|
|
LogInfo.m_LogMsg = "->RotatoDimmer2Ang = AdjustAng";
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_RotatoDimmer_ToAngle;
|
|
|
|
|
ActionPar.m_DoubleParVal = RotatoDimmer2Ang;
|
|
|
|
|
ActionPar.m_IntParVal = (int)_LaserDeviceType_MainLaser2;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//电流和角度设置之后示波器自适应
|
|
|
|
|
if (gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_TekOscilloscope))
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_BoolParVal = true;// wafer2wafer流程才需要等待 设置true
|
|
|
|
|
ActionPar.m_IntParVal = 20;//20秒超时
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_AdjustOsiiMaxAmplitudeCheckExcEnd;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
//rawata采集
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_BoolParVal = true;//是在工艺中,用于结束条件判断
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_OsiiRawDataCollect;
|
|
|
|
|
ActionPar.m_pBindingPar = pWafer;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
/*复检时波形 rawdata采集可以同步进行
|
|
|
|
|
{
|
|
|
|
|
//rawata采集
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_BoolParVal = true;//是在工艺中,用于结束条件判断
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_OsiiRawDataCollectCheckExcEnd;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
//检测Laser2 功率密度(不满足rcp 条件时自动调整)
|
|
|
|
|
//调整后的角度保存在m_Laser2RotatoDimmerAng
|
|
|
|
|
{
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetExcuteAction(_ExcuteAction_CheckRecipeEdiOnAnnealStart);
|
|
|
|
|
pCmd->BindingPar(pWafer);//绑定当前生产的wafer
|
|
|
|
|
pCmd->SetIntParVal((int)_LaserDeviceType_MainLaser2);
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
//Laser2 检测好了再把laser1 衰减角度转到之前laser 复合后的角度值
|
|
|
|
|
//保存在LastCheckPar中
|
|
|
|
|
if(!bLaser1EdiZero)
|
|
|
|
|
{
|
|
|
|
|
//(Val<0的情况设置为m_LaserRotatoDimmerAng)
|
|
|
|
|
double RotatoDimmer1Ang = -2;
|
|
|
|
|
{
|
|
|
|
|
LogInfo.m_LogMsg = "->RotatoDimmer1Ang = AdjustAng";
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_RotatoDimmer_ToAngle;
|
|
|
|
|
ActionPar.m_DoubleParVal = RotatoDimmer1Ang;
|
|
|
|
|
ActionPar.m_IntParVal = (int)_LaserDeviceType_MainLaser1;
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
//执行edi 复检
|
|
|
|
|
{
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|