优化工艺中衰减器调整逻辑

main
wyj 3 months ago
parent 3426eccdf3
commit baec0a5dca

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

Loading…
Cancel
Save