|
|
|
@ -3598,18 +3598,18 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
{
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_OVERLAP_RATIO_Y);
|
|
|
|
|
double OverlapY = RecipePar.m_ParDoubleVal;
|
|
|
|
|
pWafer->m_ScanLineGapY = gLaser->GetScanIntervals(OverlapY,true);
|
|
|
|
|
pWafer->m_ScanLineGapY = gLaser->GetScanIntervals(OverlapY, true);
|
|
|
|
|
}
|
|
|
|
|
//当前pJob recipe edi 相关参数是否变化(会记录当前值)
|
|
|
|
|
bool bPluseWidthChanged1 = false;
|
|
|
|
|
bool bPluseWidthChanged2 = false;
|
|
|
|
|
bool bLaser1RecipeEdiChange = gAnnealMonitoringMgr->CheckEdiRecipeChange(_LaserDeviceType_MainLaser1,Recipe);
|
|
|
|
|
bool bLaser2RecipeEdiChange = gAnnealMonitoringMgr->CheckEdiRecipeChange(_LaserDeviceType_MainLaser2,Recipe);
|
|
|
|
|
bool bLaser1RecipeEdiChange = gAnnealMonitoringMgr->CheckEdiRecipeChange(_LaserDeviceType_MainLaser1, Recipe);
|
|
|
|
|
bool bLaser2RecipeEdiChange = gAnnealMonitoringMgr->CheckEdiRecipeChange(_LaserDeviceType_MainLaser2, Recipe);
|
|
|
|
|
//功率密度复检参数是否发生变化(LD1或者LD2)
|
|
|
|
|
bool bRcpEdiParChange = (bLaser1RecipeEdiChange||bLaser2RecipeEdiChange);
|
|
|
|
|
bool bRcpEdiParChange = (bLaser1RecipeEdiChange || bLaser2RecipeEdiChange);
|
|
|
|
|
CString Log;
|
|
|
|
|
Log.Format("->SubRecipeIdx = %d",SubRecipeIdx);
|
|
|
|
|
LogInfo.m_LogMsg = Recipe.m_RecipeName+Log;
|
|
|
|
|
Log.Format("->SubRecipeIdx = %d", SubRecipeIdx);
|
|
|
|
|
LogInfo.m_LogMsg = Recipe.m_RecipeName + Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
|
|
|
|
|
m_bSubRecipeEdiEqualZero = false;//当前SubRcp 的Edi是否设置为0(用来控制退火时是否出激光)
|
|
|
|
@ -3622,7 +3622,7 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
double lfPluseWidth = 0;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
double Laser1Edi,Laser2Edi,Laser1Curr,Laser2Curr;
|
|
|
|
|
double Laser1Edi, Laser2Edi, Laser1Curr, Laser2Curr;
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_EDI_1);
|
|
|
|
|
Laser1Edi = RecipePar.m_ParDoubleVal;
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_LASER_EDI_2);
|
|
|
|
@ -3641,7 +3641,7 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
bLaser1CurrZero = IsDbEqualZero(Laser1Curr);
|
|
|
|
|
bLaser2CurrZero = IsDbEqualZero(Laser2Curr);
|
|
|
|
|
//edi都为0 表示SubRecipeEdiEqualZero
|
|
|
|
|
if(bLaser1EdiZero&&bLaser2EdiZero)
|
|
|
|
|
if (bLaser1EdiZero&&bLaser2EdiZero)
|
|
|
|
|
{
|
|
|
|
|
LogInfo.m_LogMsg = "Sub Recipe Edi Equal Zero";
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
@ -3653,14 +3653,14 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
}
|
|
|
|
|
//功率密度为0 的时候要重置FDC 的stage 功率
|
|
|
|
|
CFDCKeepPar &FDCKeepPar = gSemiSecsCommMgr->GetFDCKeepPar();
|
|
|
|
|
if(bLaser1EdiZero)
|
|
|
|
|
if (bLaser1EdiZero)
|
|
|
|
|
{
|
|
|
|
|
LogInfo.m_LogMsg = "StageLaser1Powermeter-->Zero";
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
FDCKeepPar.m_StageLaser1Powermeter = 0;
|
|
|
|
|
FDCKeepPar.m_StageLaser1Edi = 0;
|
|
|
|
|
}
|
|
|
|
|
if(bLaser2EdiZero)
|
|
|
|
|
if (bLaser2EdiZero)
|
|
|
|
|
{
|
|
|
|
|
LogInfo.m_LogMsg = "StageLaser2Powermeter-->Zero";
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
@ -3675,9 +3675,9 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
//检查LDD 状态
|
|
|
|
|
if(gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserDeviceCtrl))
|
|
|
|
|
if (gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserDeviceCtrl))
|
|
|
|
|
{
|
|
|
|
|
if(!bLaser1EdiZero)//Edi 不为0 时才检查LDD 是否打开
|
|
|
|
|
if (!bLaser1EdiZero)//Edi 不为0 时才检查LDD 是否打开
|
|
|
|
|
{
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
@ -3686,7 +3686,7 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
pCmd->SetExcuteActionPar(ActionPar);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
if(!bLaser2EdiZero)
|
|
|
|
|
if (!bLaser2EdiZero)
|
|
|
|
|
{
|
|
|
|
|
CWorkCmdExcuteAction *pCmd = new CWorkCmdExcuteAction();
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
@ -3713,10 +3713,10 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool bCreatRecipeEdiCheckCmd = false;//是否创建功率密度检测cmd
|
|
|
|
|
if(gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserDeviceCtrl)//屏蔽激光
|
|
|
|
|
if (gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserDeviceCtrl)//屏蔽激光
|
|
|
|
|
&& (!m_bSubRecipeEdiEqualZero)//rcp Edi1和 Edi2都设置为0 的时候不要检测
|
|
|
|
|
&& gAnnealMonitoringMgr->IsbRecipeEdiCheckOnJobStart()//可以选择不检测
|
|
|
|
|
&& gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserPowerMeter_Surface,false))//屏蔽功率计
|
|
|
|
|
&& gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserPowerMeter_Surface, false))//屏蔽功率计
|
|
|
|
|
{
|
|
|
|
|
bCreatRecipeEdiCheckCmd = true;
|
|
|
|
|
}
|
|
|
|
@ -3770,7 +3770,7 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
//设置SubRecipe 的激光参数(频率电流和延时)
|
|
|
|
|
//Rcp 电流是0的时候也需要把电流设置为0
|
|
|
|
|
//参数不变的时候这个步骤不会消耗时间
|
|
|
|
|
if(gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserDeviceCtrl))
|
|
|
|
|
if (gDeviceStateMgr->QueryUsedFunc(_EUsedFunc_LaserDeviceCtrl))
|
|
|
|
|
{
|
|
|
|
|
CSetMainLaserPar SetLaserPar;
|
|
|
|
|
{
|
|
|
|
@ -3802,7 +3802,7 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
//在改变激光电流后等待指定的延时m_WaitCurrChangeDelay
|
|
|
|
|
SetLaserPar.m_bWaitCurrChangeDelay = true;
|
|
|
|
|
//双脉冲延时
|
|
|
|
|
if(gLaserDevice->IsbTwoLaserLddMode())
|
|
|
|
|
if (gLaserDevice->IsbTwoLaserLddMode())
|
|
|
|
|
{
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_PRF2_DELAY);
|
|
|
|
|
SetLaserPar.m_PRF2Delay = RecipePar.m_ParDoubleVal;//双脉冲延时
|
|
|
|
@ -3817,36 +3817,13 @@ 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;//表示使用之前的角度
|
|
|
|
|
//功率密度参数有变化的时候
|
|
|
|
|
//或者不复检的时候
|
|
|
|
|
//使用rcp 的计算角度
|
|
|
|
|
if(bLaser1RecipeEdiChange||!bCreatRecipeEdiCheckCmd)
|
|
|
|
|
if (bLaser1RecipeEdiChange || !bCreatRecipeEdiCheckCmd)
|
|
|
|
|
{
|
|
|
|
|
//转到recipe 设置角度(这个角度是用点检结果功率和EDI计算出来的)
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_ROTATO_DIMMER_ANG);
|
|
|
|
@ -3854,11 +3831,10 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
}
|
|
|
|
|
//log
|
|
|
|
|
{
|
|
|
|
|
Log.Format("->RotatoDimmer1Ang = %lf",RotatoDimmer1Ang);
|
|
|
|
|
Log.Format("->RotatoDimmer1Ang = %lf", RotatoDimmer1Ang);
|
|
|
|
|
LogInfo.m_LogMsg = Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
|
//if(RotatoDimmer1Ang>=0)
|
|
|
|
|
{
|
|
|
|
|
CExcuteActionPar ActionPar;
|
|
|
|
|
ActionPar.m_ExcuteAction = _ExcuteAction_RotatoDimmer_ToAngle;
|
|
|
|
@ -3869,44 +3845,21 @@ 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 的角度上
|
|
|
|
|
if(bLaser2RecipeEdiChange||!bCreatRecipeEdiCheckCmd)
|
|
|
|
|
//功率密度参数有变化的时候
|
|
|
|
|
//或者不复检的时候
|
|
|
|
|
//使用rcp 的计算角度
|
|
|
|
|
if (bLaser2RecipeEdiChange || !bCreatRecipeEdiCheckCmd)
|
|
|
|
|
{
|
|
|
|
|
//转到recipe 设置角度(这个角度是用点检结果功率和EDI计算出来的)
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_ROTATO_DIMMER_ANG2);
|
|
|
|
|
RotatoDimmer2Ang = RecipePar.m_ParDoubleVal;
|
|
|
|
|
}
|
|
|
|
|
//log
|
|
|
|
|
{
|
|
|
|
|
Log.Format("->RotatoDimmer2Ang = %lf",RotatoDimmer2Ang);
|
|
|
|
|
Log.Format("->RotatoDimmer2Ang = %lf", RotatoDimmer2Ang);
|
|
|
|
|
LogInfo.m_LogMsg = Log;
|
|
|
|
|
gLogMgr->WriteLogInfo(LogInfo);
|
|
|
|
|
}
|
|
|
|
@ -3922,20 +3875,20 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
}
|
|
|
|
|
//SubRecipe功率密度复检
|
|
|
|
|
//这个时候的激光参数已经设置为recipe 的参数
|
|
|
|
|
if(bCreatRecipeEdiCheckCmd)//创建cmd 不一定会执行
|
|
|
|
|
if (bCreatRecipeEdiCheckCmd)//创建cmd 不一定会执行
|
|
|
|
|
{
|
|
|
|
|
//XY移动到功率计位置
|
|
|
|
|
{
|
|
|
|
|
CWorkCmdAsixXYMove *pCmd = new CWorkCmdAsixXYMove();
|
|
|
|
|
Dbxy MovePt = gPlatSpecialPosMgr->GetSpecialPosXY(_ESpecialPosType_SufacePower);
|
|
|
|
|
pCmd->MoveToTargetPt(MovePt,LaserPt);
|
|
|
|
|
pCmd->MoveToTargetPt(MovePt, LaserPt);
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
//调整Z 轴位置到功率测量坐标
|
|
|
|
|
{
|
|
|
|
|
double TargetCoord = gPlatSpecialPosMgr->GetSpecialPosZ(_ESpecialPosType_SufacePower);//目标焦距位置
|
|
|
|
|
CWorkCmdMoveMotor *pCmd = new CWorkCmdMoveMotor(MotorZ,TargetCoord);
|
|
|
|
|
CWorkCmdMoveMotor *pCmd = new CWorkCmdMoveMotor(MotorZ, TargetCoord);
|
|
|
|
|
pCmd->SetMoveFlg(false);//移动到坐标
|
|
|
|
|
pCmd->SetbEdiCheckCmd(true);//标记为edi check cmd
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
@ -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();
|
|
|
|
@ -4200,9 +3979,9 @@ void CCommonFlowMgr::CreatSubRecipeAnnealPrepareCmd(CWorkCmdInvoker &CmdInvoker
|
|
|
|
|
RecipePar = Recipe.GetRecipePar(RECIPE_PAR_NAME_FOCUS_ADJUST_VAL);
|
|
|
|
|
double FoucsZAdjustVal = RecipePar.m_ParDoubleVal;
|
|
|
|
|
CMotor &MotorZ = *(CMotor::GetMotor(MOTOR_Z));
|
|
|
|
|
CWorkCmdMoveMotor *pCmd = new CWorkCmdMoveMotor(MotorZ,0);
|
|
|
|
|
CWorkCmdMoveMotor *pCmd = new CWorkCmdMoveMotor(MotorZ, 0);
|
|
|
|
|
pCmd->SetMoveFlg(false);//移动到坐标
|
|
|
|
|
pCmd->SetbMoveToLaserFoucsZ(true,FoucsZAdjustVal);
|
|
|
|
|
pCmd->SetbMoveToLaserFoucsZ(true, FoucsZAdjustVal);
|
|
|
|
|
CmdInvoker.AddCmd(pCmd);
|
|
|
|
|
}
|
|
|
|
|
//打开气帘
|
|
|
|
|