removed dead code
This commit is contained in:
parent
16c7bc6926
commit
803f946c7e
@ -582,170 +582,130 @@ Refresh:
|
|||||||
|
|
||||||
If @WINDOW EQ 'RDS_UNLOAD' then
|
If @WINDOW EQ 'RDS_UNLOAD' then
|
||||||
|
|
||||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
CtrlName = @WINDOW:'.EDT_QA_MET'
|
||||||
|
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
|
||||||
|
Set_Property(CtrlName, 'VISIBLE', True$)
|
||||||
|
MetList = Get_Property(CtrlName,'LIST')
|
||||||
|
ThickOutOfSpec = False$
|
||||||
|
CresOutOfSpec = False$
|
||||||
|
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
|
||||||
|
FOR Line = 1 TO MLCnt
|
||||||
|
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
|
||||||
|
MetResult = MetList<Line,COL$UL_MET_RESULT>
|
||||||
|
MetMin = MetList<Line,COL$UL_MET_MIN>
|
||||||
|
MetMax = MetList<Line,COL$UL_MET_MAX>
|
||||||
|
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
|
||||||
|
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
|
||||||
|
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
|
||||||
|
PSN = Get_Property(@Window : '.PSN', 'TEXT')
|
||||||
|
PRSStageKey = PSN:'*UNLOAD'
|
||||||
|
MetTest = MetList<Line,COL$UL_MET_TEST>
|
||||||
|
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
|
||||||
|
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
|
||||||
|
SpecRecipe = ''
|
||||||
|
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||||
|
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||||
|
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
|
||||||
|
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
|
||||||
|
Begin Case
|
||||||
|
Case MetTest EQ 'THICK_ONLY'
|
||||||
|
// Check each point to see if any are out of spec
|
||||||
|
For each DataPoint in DataPoints using @SVM setting ThickIndex
|
||||||
|
Until DataPoint EQ ''
|
||||||
|
Begin Case
|
||||||
|
Case ThickIndex GT 10
|
||||||
|
Null
|
||||||
|
Case (DataPoint EQ '')
|
||||||
|
ThickOutOfSpec = True$
|
||||||
|
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
|
||||||
|
ThickOutOfSpec = True$
|
||||||
|
End Case
|
||||||
|
Next DataPoint
|
||||||
|
|
||||||
If (DevelopmentFlag EQ True$) then
|
Case MetTest EQ 'CRES'
|
||||||
|
// Check critical points to see if any are out of spec (both HgCV and Phase)
|
||||||
|
CriticalPoints = '1,2,5,6,9'
|
||||||
|
For each DataPoint in DataPoints using @SVM setting CresIndex
|
||||||
|
Until DataPoint EQ ''
|
||||||
|
HgCVDataPoint = DataPoint[1, 'F':@TM]
|
||||||
|
PhaseDataPoint = DataPoint[-1, 'B':@TM]
|
||||||
|
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
|
||||||
|
Begin Case
|
||||||
|
Case (HgCVDataPoint EQ '') and CriticalPoint
|
||||||
|
CresOutOfSpec = True$
|
||||||
|
Case (PhaseDataPoint EQ '') and CriticalPoint
|
||||||
|
CresOutOfSpec = True$
|
||||||
|
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
|
||||||
|
CresOutOfSpec = True$
|
||||||
|
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
|
||||||
|
CresOutOfSpec = True$
|
||||||
|
End Case
|
||||||
|
Next DataPoint
|
||||||
|
End Case
|
||||||
|
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
|
||||||
|
Locate MetTest in SpecTests using @VM setting vPos then
|
||||||
|
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
|
||||||
|
end
|
||||||
|
NoError = True$
|
||||||
|
|
||||||
CtrlName = @WINDOW:'.EDT_QA_MET'
|
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
|
||||||
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
|
Color = YELLOW$
|
||||||
Set_Property(CtrlName, 'VISIBLE', True$)
|
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||||
MetList = Get_Property(CtrlName,'LIST')
|
NoError = False$
|
||||||
ThickOutOfSpec = False$
|
end
|
||||||
CresOutOfSpec = False$
|
|
||||||
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
|
|
||||||
FOR Line = 1 TO MLCnt
|
|
||||||
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
|
|
||||||
MetResult = MetList<Line,COL$UL_MET_RESULT>
|
|
||||||
MetMin = MetList<Line,COL$UL_MET_MIN>
|
|
||||||
MetMax = MetList<Line,COL$UL_MET_MAX>
|
|
||||||
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
|
|
||||||
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
|
|
||||||
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
|
|
||||||
PSN = Get_Property(@Window : '.PSN', 'TEXT')
|
|
||||||
PRSStageKey = PSN:'*UNLOAD'
|
|
||||||
MetTest = MetList<Line,COL$UL_MET_TEST>
|
|
||||||
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
|
|
||||||
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
|
|
||||||
SpecRecipe = ''
|
|
||||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
|
||||||
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
|
||||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
|
|
||||||
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
|
|
||||||
Begin Case
|
|
||||||
Case MetTest EQ 'THICK_ONLY'
|
|
||||||
// Check each point to see if any are out of spec
|
|
||||||
For each DataPoint in DataPoints using @SVM setting ThickIndex
|
|
||||||
Until DataPoint EQ ''
|
|
||||||
Begin Case
|
|
||||||
Case ThickIndex GT 10
|
|
||||||
Null
|
|
||||||
Case (DataPoint EQ '')
|
|
||||||
ThickOutOfSpec = True$
|
|
||||||
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
|
|
||||||
ThickOutOfSpec = True$
|
|
||||||
End Case
|
|
||||||
Next DataPoint
|
|
||||||
|
|
||||||
Case MetTest EQ 'CRES'
|
If QAMetOutofSpec EQ True$ then
|
||||||
// Check critical points to see if any are out of spec (both HgCV and Phase)
|
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
|
||||||
CriticalPoints = '1,2,5,6,9'
|
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||||
For each DataPoint in DataPoints using @SVM setting CresIndex
|
NoError = False$
|
||||||
Until DataPoint EQ ''
|
end
|
||||||
HgCVDataPoint = DataPoint[1, 'F':@TM]
|
|
||||||
PhaseDataPoint = DataPoint[-1, 'B':@TM]
|
|
||||||
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
|
|
||||||
Begin Case
|
|
||||||
Case (HgCVDataPoint EQ '') and CriticalPoint
|
|
||||||
CresOutOfSpec = True$
|
|
||||||
Case (PhaseDataPoint EQ '') and CriticalPoint
|
|
||||||
CresOutOfSpec = True$
|
|
||||||
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
|
|
||||||
CresOutOfSpec = True$
|
|
||||||
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
|
|
||||||
CresOutOfSpec = True$
|
|
||||||
End Case
|
|
||||||
Next DataPoint
|
|
||||||
End Case
|
|
||||||
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
|
|
||||||
Locate MetTest in SpecTests using @VM setting vPos then
|
|
||||||
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
|
|
||||||
end
|
|
||||||
NoError = True$
|
|
||||||
|
|
||||||
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
|
If (MetResult LT MetMin) then
|
||||||
Color = YELLOW$
|
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||||
NoError = False$
|
NoError = False$
|
||||||
end
|
end
|
||||||
|
|
||||||
If QAMetOutofSpec EQ True$ then
|
If (MetResult GT MetMax) then
|
||||||
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
|
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||||
NoError = False$
|
NoError = False$
|
||||||
end
|
end
|
||||||
|
|
||||||
If (MetResult LT MetMin) then
|
If (PhaseResult LT PhaseMin) then
|
||||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
|
||||||
NoError = False$
|
NoError = False$
|
||||||
end
|
end
|
||||||
|
|
||||||
If (MetResult GT MetMax) then
|
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
|
||||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
|
||||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
|
||||||
NoError = False$
|
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||||
end
|
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
|
||||||
|
NoError = False$
|
||||||
|
end
|
||||||
|
|
||||||
If (PhaseResult LT PhaseMin) then
|
If (NoError EQ True$) then
|
||||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
Color = GREEN$
|
||||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
|
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
||||||
NoError = False$
|
end
|
||||||
end
|
|
||||||
|
|
||||||
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
|
END ELSE
|
||||||
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
|
Color = GREEN$
|
||||||
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
|
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
||||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
END
|
||||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
|
|
||||||
NoError = False$
|
|
||||||
end
|
|
||||||
|
|
||||||
If (NoError EQ True$) then
|
NEXT Line
|
||||||
Color = GREEN$
|
|
||||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
|
||||||
end
|
|
||||||
|
|
||||||
END ELSE
|
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
|
||||||
Color = GREEN$
|
|
||||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
|
||||||
END
|
|
||||||
|
|
||||||
NEXT Line
|
IF MemberOf(@USER4, 'OI_ADMIN') THEN
|
||||||
|
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
|
||||||
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
|
END ELSE
|
||||||
|
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
|
||||||
IF MemberOf(@USER4, 'OI_ADMIN') THEN
|
END
|
||||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
|
end
|
||||||
END ELSE
|
|
||||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
end else
|
|
||||||
|
|
||||||
CtrlName = @WINDOW:'.MET_TEST'
|
|
||||||
Set_Property(@Window : '.EDT_QA_MET', 'VISIBLE', False$)
|
|
||||||
Set_Property(CtrlName, 'VISIBLE', True$)
|
|
||||||
MetList = Get_Property(CtrlName,'LIST')
|
|
||||||
|
|
||||||
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
|
|
||||||
FOR Line = 1 TO MLCnt
|
|
||||||
IF MetList<Line,COL$MET_TEST> NE '' THEN
|
|
||||||
BEGIN CASE
|
|
||||||
CASE MetList<Line,COL$MET_RESULT> = ''
|
|
||||||
Color = YELLOW$
|
|
||||||
CASE MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN> OR MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>
|
|
||||||
Color = RED$
|
|
||||||
CASE 1
|
|
||||||
Color = GREEN$
|
|
||||||
END CASE
|
|
||||||
|
|
||||||
END ELSE
|
|
||||||
Color = GREEN$
|
|
||||||
END;* End of check for Met Test on the current line
|
|
||||||
|
|
||||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
|
||||||
NEXT Line
|
|
||||||
|
|
||||||
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
|
|
||||||
|
|
||||||
IF MemberOf(@USER4, 'OI_ADMIN') THEN
|
|
||||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
|
|
||||||
END ELSE
|
|
||||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
|
|
||||||
END
|
|
||||||
end
|
|
||||||
end
|
|
||||||
* End of check for Unload OR Post_Epi windows
|
* End of check for Unload OR Post_Epi windows
|
||||||
|
|
||||||
****************************************************************************************************************************************
|
****************************************************************************************************************************************
|
||||||
@ -2669,9 +2629,8 @@ MetTestDC:
|
|||||||
Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST')
|
Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST')
|
||||||
TestLine = Lines<CurrRow>
|
TestLine = Lines<CurrRow>
|
||||||
LWRHOTest = Indexc(TestLine, 'LW_RHO', 1)
|
LWRHOTest = Indexc(TestLine, 'LW_RHO', 1)
|
||||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
|
||||||
|
|
||||||
If (DevelopmentFlag EQ True$) and (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then
|
If (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then
|
||||||
Ctrls := @WINDOW:'.EDT_QA_MET':@RM ; Props := 'SELPOS':@RM
|
Ctrls := @WINDOW:'.EDT_QA_MET':@RM ; Props := 'SELPOS':@RM
|
||||||
Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST'
|
Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST'
|
||||||
end else
|
end else
|
||||||
@ -2708,8 +2667,7 @@ MetTestDC:
|
|||||||
BEGIN CASE
|
BEGIN CASE
|
||||||
CASE MetTest EQ ''
|
CASE MetTest EQ ''
|
||||||
Null
|
Null
|
||||||
|
CASE (@WINDOW = 'RDS_UNLOAD') and (LWRHOTest EQ False$)
|
||||||
CASE (@WINDOW = 'RDS_UNLOAD') and (DevelopmentFlag EQ True$) and (LWRHOTest EQ False$)
|
|
||||||
ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID)
|
ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID)
|
||||||
Send_Event(@Window, "READ")
|
Send_Event(@Window, "READ")
|
||||||
CASE Otherwise$
|
CASE Otherwise$
|
||||||
@ -2863,57 +2821,47 @@ return
|
|||||||
|
|
||||||
RefreshWaferCounterData:
|
RefreshWaferCounterData:
|
||||||
|
|
||||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||||
If WCCheckEnabled then
|
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||||
|
QtyBackColor = GREEN$
|
||||||
|
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
||||||
|
If RDSNo NE '' then
|
||||||
|
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
|
||||||
|
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||||
|
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
||||||
|
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
||||||
|
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
||||||
|
|
||||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
*****************************************
|
||||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
* WaferCounter - Wafers Quantity Section *
|
||||||
QtyBackColor = GREEN$
|
*****************************************
|
||||||
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
If (WaferCounterQty NE '') then
|
||||||
If RDSNo NE '' then
|
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
|
||||||
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
|
end else
|
||||||
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
QtyBackColor = ORANGE$
|
||||||
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
end
|
||||||
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
|
||||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
|
||||||
|
|
||||||
*****************************************
|
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
|
||||||
* WaferCounter - Wafers Quantity Section *
|
WaferSize = Field(WaferSize, ' ', 3, 1)
|
||||||
*****************************************
|
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
||||||
If (WaferCounterQty NE '') then
|
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
||||||
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
|
If Error_Services('NoError') then
|
||||||
end else
|
WCCurrMode = ''
|
||||||
QtyBackColor = ORANGE$
|
If RowExists('TOOL', WCToolID) then
|
||||||
end
|
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
||||||
|
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
||||||
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
|
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
||||||
WaferSize = Field(WaferSize, ' ', 3, 1)
|
|
||||||
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
|
||||||
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
|
||||||
If Error_Services('NoError') then
|
|
||||||
WCCurrMode = ''
|
|
||||||
If RowExists('TOOL', WCToolID) then
|
|
||||||
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
|
||||||
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
|
||||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
|
||||||
end else
|
|
||||||
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
|
||||||
end
|
|
||||||
end else
|
end else
|
||||||
ErrMsg(Error_Services('GetMessage'))
|
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
|
ErrMsg(Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
|
||||||
end
|
end
|
||||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
end
|
||||||
|
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
||||||
end else
|
|
||||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
|
||||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
|
||||||
end
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1107,29 +1107,25 @@ SignSupVer:
|
|||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
****************************************
|
||||||
If WCCheckEnabled then
|
* Verify the Wafer Counter information *
|
||||||
|
****************************************
|
||||||
|
|
||||||
****************************************
|
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
||||||
* Verify the Wafer Counter information *
|
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
||||||
****************************************
|
|
||||||
|
|
||||||
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
************************************
|
||||||
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
* Wafer Counter - Quantity Section *
|
||||||
|
************************************
|
||||||
************************************
|
If (WaferCounterQty NE '') then
|
||||||
* Wafer Counter - Quantity Section *
|
If (WaferCounterQty NE WafersOut) then
|
||||||
************************************
|
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
|
||||||
If (WaferCounterQty NE '') then
|
RETURN 0
|
||||||
If (WaferCounterQty NE WafersOut) then
|
end
|
||||||
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
|
end else
|
||||||
RETURN 0
|
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
||||||
end
|
RETURN 0
|
||||||
end else
|
end
|
||||||
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
|
||||||
RETURN 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
**************************
|
**************************
|
||||||
* Verify user's password *
|
* Verify user's password *
|
||||||
@ -2294,57 +2290,49 @@ return
|
|||||||
|
|
||||||
RefreshWaferCounterData:
|
RefreshWaferCounterData:
|
||||||
|
|
||||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||||
If WCCheckEnabled then
|
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||||
|
QtyBackColor = GREEN$
|
||||||
|
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
|
||||||
|
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
|
||||||
|
WMOKey = WONo:'*1*':Cassette
|
||||||
|
If WMOKey NE '*1*' then
|
||||||
|
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
|
||||||
|
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||||
|
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
||||||
|
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
||||||
|
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
||||||
|
|
||||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
************************************
|
||||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
* Wafer Counter - Quantity Section *
|
||||||
QtyBackColor = GREEN$
|
************************************
|
||||||
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
|
If (WaferCounterQty NE '') then
|
||||||
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
|
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
|
||||||
WMOKey = WONo:'*1*':Cassette
|
end else
|
||||||
If WMOKey NE '*1*' then
|
QtyBackColor = ORANGE$
|
||||||
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
|
end
|
||||||
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
|
||||||
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
WaferSize = Field(WaferSize, ' ', 3, 1)
|
||||||
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
||||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
||||||
|
If Error_Services('NoError') then
|
||||||
************************************
|
WCCurrMode = ''
|
||||||
* Wafer Counter - Quantity Section *
|
If RowExists('TOOL', WCToolID) then
|
||||||
************************************
|
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
||||||
If (WaferCounterQty NE '') then
|
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
||||||
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
|
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
||||||
end else
|
|
||||||
QtyBackColor = ORANGE$
|
|
||||||
end
|
|
||||||
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
|
|
||||||
WaferSize = Field(WaferSize, ' ', 3, 1)
|
|
||||||
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
|
||||||
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
|
||||||
If Error_Services('NoError') then
|
|
||||||
WCCurrMode = ''
|
|
||||||
If RowExists('TOOL', WCToolID) then
|
|
||||||
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
|
||||||
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
|
||||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
|
||||||
end else
|
|
||||||
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
|
||||||
end
|
|
||||||
end else
|
end else
|
||||||
ErrMsg(Error_Services('GetMessage'))
|
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".')
|
ErrMsg(Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
end
|
end else
|
||||||
|
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
||||||
|
|
||||||
end else
|
|
||||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
|
||||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
|
||||||
end
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -881,24 +881,19 @@ Event SIGN_BUTTON.CLICK()
|
|||||||
******************************************
|
******************************************
|
||||||
* Verify Unload Stage QA Metrology Tests *
|
* Verify Unload Stage QA Metrology Tests *
|
||||||
******************************************
|
******************************************
|
||||||
|
WOMatQAKey = WONo : '*' : CassNo
|
||||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||||
|
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||||
If (DevelopmentFlag EQ True$) then
|
OutOfSpec = Sum(OutOfSpec)
|
||||||
WOMatQAKey = WONo : '*' : CassNo
|
If OutOfSpec GT 0 then
|
||||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
ErrorMsg = 'Process Error':@SVM
|
||||||
OutOfSpec = Sum(OutOfSpec)
|
For each FailReason in FailReasons using @VM
|
||||||
If OutOfSpec GT 0 then
|
ErrorMsg := FailReason:CRLF$
|
||||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
Next FailReason
|
||||||
ErrorMsg = 'Process Error':@SVM
|
ErrMsg(ErrorMsg)
|
||||||
For each FailReason in FailReasons using @VM
|
Return
|
||||||
ErrorMsg := FailReason:CRLF$
|
end
|
||||||
Next FailReason
|
|
||||||
ErrMsg(ErrorMsg)
|
|
||||||
Return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
*******************************************
|
*******************************************
|
||||||
* Verify if all steps have been completed *
|
* Verify if all steps have been completed *
|
||||||
@ -1965,7 +1960,3 @@ ClearForm:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -388,6 +388,7 @@ end service
|
|||||||
// Looks for available Metrology files that are ready to be imported into the MES system.
|
// Looks for available Metrology files that are ready to be imported into the MES system.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service ImportMetrologyFiles(Machine)
|
Service ImportMetrologyFiles(Machine)
|
||||||
|
|
||||||
If Machine NE '' then
|
If Machine NE '' then
|
||||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||||
Lock hSysLists, ServiceKeyID:'*':Machine then
|
Lock hSysLists, ServiceKeyID:'*':Machine then
|
||||||
@ -935,14 +936,8 @@ Service ImportBioRadData(RunData, FileName)
|
|||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
WorkOrderNo = RDSRec<RDS_WO$>
|
WorkOrderNo = RDSRec<RDS_WO$>
|
||||||
|
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
||||||
// HgCV Project Development Code -------------------------------------------------------------------------------
|
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
||||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
|
||||||
If (DevelopmentFlag EQ True$) then
|
|
||||||
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
|
||||||
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
|
||||||
end
|
|
||||||
// -------------------------------------------------------------------------------------------------------------
|
|
||||||
CassNo = RDSRec<RDS_CASS_NO$>
|
CassNo = RDSRec<RDS_CASS_NO$>
|
||||||
WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
|
WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
|
||||||
GoSub ParseWorkOrder
|
GoSub ParseWorkOrder
|
||||||
@ -1289,13 +1284,8 @@ Service ImportCDEData(RunData, FileName)
|
|||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
|
|
||||||
// HgCV Project Development Code -------------------------------------------------------------------------------
|
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
||||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
||||||
If (DevelopmentFlag EQ True$) then
|
|
||||||
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
|
||||||
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
|
||||||
end
|
|
||||||
// -------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
WorkOrderNo = RDSRec<RDS_WO$>
|
WorkOrderNo = RDSRec<RDS_WO$>
|
||||||
CassNo = RDSRec<RDS_CASS_NO$>
|
CassNo = RDSRec<RDS_CASS_NO$>
|
||||||
@ -3253,5 +3243,3 @@ LoadRunDataToDatabase:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -229,12 +229,6 @@ Service CalculateHgCVData(Datapoints)
|
|||||||
Min = Min(Min, DataPoint)
|
Min = Min(Min, DataPoint)
|
||||||
Max = Max(Max, DataPoint)
|
Max = Max(Max, DataPoint)
|
||||||
// Edge Mean Delta
|
// Edge Mean Delta
|
||||||
* If Index GE 6 AND Index LE 9 then
|
|
||||||
* Delta1 = Delta1 + DataPoint
|
|
||||||
* end
|
|
||||||
* If Index GE 2 AND Index LE 5 then
|
|
||||||
* Delta2 = Delta2 + DataPoint
|
|
||||||
* end
|
|
||||||
end
|
end
|
||||||
// Range %
|
// Range %
|
||||||
Locate Index in RangePoints using ',' setting unusedIndex then
|
Locate Index in RangePoints using ',' setting unusedIndex then
|
||||||
@ -256,25 +250,15 @@ Service CalculateHgCVData(Datapoints)
|
|||||||
EdgeMean4mm = Edge4mmSum / 4
|
EdgeMean4mm = Edge4mmSum / 4
|
||||||
EdgeMean10mm = Edge10mmSum / 4
|
EdgeMean10mm = Edge10mmSum / 4
|
||||||
If EdgeMean10mm GT 0 then
|
If EdgeMean10mm GT 0 then
|
||||||
* Delta1Avg = Delta1/4
|
|
||||||
* Delta2Avg = Delta2/4
|
|
||||||
EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS
|
EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS
|
||||||
|
|
||||||
// Range %
|
// Range %
|
||||||
Range = RangeMax - RangeMin
|
Range = RangeMax - RangeMin
|
||||||
NumRangePoints = DCount(RangePoints, ',')
|
NumRangePoints = DCount(RangePoints, ',')
|
||||||
RangeAvg = RangeAvg / NumRangePoints
|
RangeAvg = RangeAvg / NumRangePoints
|
||||||
RangePct = (Range / RangeAvg) * 100
|
RangePct = (Range / RangeAvg) * 100
|
||||||
|
|
||||||
* EdgeMeanDelta = OConv(IConv(EdgeMeanDelta, 'MD3L'), 'MD3L')
|
|
||||||
* RangePct = OConv(IConv(RangePct, 'MD3L'), 'MD3L')
|
|
||||||
end
|
end
|
||||||
// Average
|
|
||||||
Average = Sum / NumDataPoints
|
|
||||||
* Average = OConv(IConv(Average, 'MD3L'), 'MD3L')
|
|
||||||
* Min = OConv(IConv(Min, 'MD3L'), 'MD3L')
|
|
||||||
* Max = OConv(IConv(Max, 'MD3L'), 'MD3L')
|
|
||||||
|
|
||||||
|
Average = Sum / NumDataPoints
|
||||||
FullAvg = ''
|
FullAvg = ''
|
||||||
TotalDataPoints = DCount(DataPoints, @VM)
|
TotalDataPoints = DCount(DataPoints, @VM)
|
||||||
If TotalDataPoints GT 0 then FullAvg = Sum(DataPoints)/DCount(DataPoints, @VM)
|
If TotalDataPoints GT 0 then FullAvg = Sum(DataPoints)/DCount(DataPoints, @VM)
|
||||||
@ -361,25 +345,18 @@ Service PostROTRRequest(RDSNo)
|
|||||||
If Flag EQ 0 then
|
If Flag EQ 0 then
|
||||||
If RequestKeyID EQ '' then
|
If RequestKeyID EQ '' then
|
||||||
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||||
FinalSigComp = False$
|
RequestDate = Date()
|
||||||
* FinalSigComp = Signature_Services('FinalSigComp', WOMatKey)
|
RequestTime = Time()
|
||||||
If FinalSigComp NE True$ then
|
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
|
||||||
// This is a new request
|
RequestRow = ''
|
||||||
RequestDate = Date()
|
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
|
||||||
RequestTime = Time()
|
If Error_Services('NoError') then
|
||||||
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
|
// Log success
|
||||||
RequestRow = ''
|
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
|
||||||
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
|
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
||||||
If Error_Services('NoError') then
|
end else
|
||||||
// Log success
|
ErrorMessage = Error_Services('GetMessage')
|
||||||
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
|
end
|
||||||
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
|
||||||
end else
|
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
ErrorMessage = 'FQA signed for RDS ':RDSNo:' ignoring ROTR request.'
|
|
||||||
end
|
|
||||||
end else
|
end else
|
||||||
ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.'
|
ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.'
|
||||||
end
|
end
|
||||||
@ -510,13 +487,6 @@ Service ProcessROTRRequest(RDSNo)
|
|||||||
Swap @FM with ',' in ResponseCopy
|
Swap @FM with ',' in ResponseCopy
|
||||||
LogData<3> = 'ROTR Status response: ':Response
|
LogData<3> = 'ROTR Status response: ':Response
|
||||||
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
||||||
* ROTRRec = ''
|
|
||||||
* ROTRRec<ROTR.REACTOR_STATUS$> = Response<1>
|
|
||||||
* ROTRRec<ROTR.REACTOR_STATUS_REASON$> = Response<2>
|
|
||||||
* ROTRRec<ROTR.REACTOR_NCR_COUNT$> = Response<3>
|
|
||||||
* ROTRRec<ROTR.REACTOR_ZERO_NCR_RUN_COUNT$> = Response<4>
|
|
||||||
* ROTRRec<ROTR.REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
|
|
||||||
* Database_Services('WriteDataRow', 'ROTR', LWICINo, ROTRRec, True$, False$, True$)
|
|
||||||
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS$> = Response<1>
|
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS$> = Response<1>
|
||||||
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2>
|
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2>
|
||||||
CIRec<CLEAN_INSP_ROTR_REACTOR_NCR_COUNT$> = Response<3>
|
CIRec<CLEAN_INSP_ROTR_REACTOR_NCR_COUNT$> = Response<3>
|
||||||
@ -524,7 +494,6 @@ Service ProcessROTRRequest(RDSNo)
|
|||||||
CIRec<CLEAN_INSP_ROTR_REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
|
CIRec<CLEAN_INSP_ROTR_REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
|
||||||
// Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS).
|
// Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS).
|
||||||
// That routine will recalculate the final ROTR status.
|
// That routine will recalculate the final ROTR status.
|
||||||
* CIRec<CLEAN_INSP_ROTR_UPDATE_FLAG$> = True$
|
|
||||||
Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$)
|
Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$)
|
||||||
end else
|
end else
|
||||||
ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage')
|
ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage')
|
||||||
@ -569,6 +538,7 @@ end service
|
|||||||
//
|
//
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetROTRStatus(RDSKey)
|
Service GetROTRStatus(RDSKey)
|
||||||
|
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||||
WONo = RDSRec<RDS_WO$>
|
WONo = RDSRec<RDS_WO$>
|
||||||
RDSCassNo = RDSRec<RDS_CASS_NO$>
|
RDSCassNo = RDSRec<RDS_CASS_NO$>
|
||||||
@ -1287,100 +1257,6 @@ Service ProcessWaferImageRequests()
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
|
||||||
// ProcessWaferImageRequests
|
|
||||||
//
|
|
||||||
// Service that attempts to process all wafer map image requests. These requests are queued in the
|
|
||||||
// WAFER_IMAGE_REQUESTS table.
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
|
||||||
Service ProcessWaferImageRequestsOld()
|
|
||||||
|
|
||||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
|
||||||
Lock hSysLists, ServiceKeyID then
|
|
||||||
hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS')
|
|
||||||
If Error_Services('NoError') then
|
|
||||||
Sentence = 'SELECT WAFER_IMAGE_REQUESTS WITH RESPONSE_DATE EQ "" BY REQUEST_DATE BY REQUEST_TIME'
|
|
||||||
Set_Status(0)
|
|
||||||
RList(Sentence, TARGET_ACTIVELIST$, '', '', '')
|
|
||||||
EOF = False$
|
|
||||||
Loop
|
|
||||||
ReadNext RequestKeyID else EOF = True$
|
|
||||||
Until EOF
|
|
||||||
RequestDate = Field(RequestKeyID, '*', 1)
|
|
||||||
RequestTime = Field(RequestKeyID, '*', 2)
|
|
||||||
RequestTime = RequestTime / 86400
|
|
||||||
RequestTime = RequestTime[3, 5]
|
|
||||||
RequestDTM = RequestDate:'.':RequestTime
|
|
||||||
CurrDTM = Datetime()
|
|
||||||
TimeInQueue = CurrDTM - RequestDTM
|
|
||||||
If TimeInQueue LT 1 then
|
|
||||||
Lock hWaferImageRequests, RequestKeyID then
|
|
||||||
EncodedPDF = ''
|
|
||||||
ResponseBody = ''
|
|
||||||
RequestRow = Database_Services('ReadDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID)
|
|
||||||
RDSNo = RequestRow<WAFER_IMAGE_REQUESTS.RDS_NO$>
|
|
||||||
WaferNo = RequestRow<WAFER_IMAGE_REQUESTS.WAFER_NO$>
|
|
||||||
TencorRecipe = RequestRow<WAFER_IMAGE_REQUESTS.TENCOR_RECIPE$>
|
|
||||||
ReturnPDF = RequestRow<WAFER_IMAGE_REQUESTS.RETURN_PDF$>
|
|
||||||
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
|
|
||||||
PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
|
|
||||||
// Format Wafer Number for SQL Query
|
|
||||||
WaferNo = TrimF(WaferNo)
|
|
||||||
If WaferNo < 10 then
|
|
||||||
WaferNo = '*0' : WaferNo
|
|
||||||
end else
|
|
||||||
WaferNo = '*' : WaferNo
|
|
||||||
end
|
|
||||||
Query = "DECLARE @RDS varchar(10) " |
|
|
||||||
: "DECLARE @RECIPE varchar(30) " |
|
|
||||||
: "DECLARE @WFRID varchar(10) " |
|
|
||||||
: "SET @RDS = '":RDSNo:"' " |
|
|
||||||
: "SET @RECIPE = '":TencorRecipe:"' " |
|
|
||||||
: "SET @WFRID = '":WaferNo:"' " |
|
|
||||||
: "SELECT child.AttachmentID " |
|
|
||||||
: "FROM Metrology.dbo.TencorRunHeader header " |
|
|
||||||
: "INNER JOIN Metrology.dbo.TencorRunData child on header.id = child.headerid " |
|
|
||||||
: "WHERE header.rds = @RDS and header.recipe like @RECIPE + '%' and child.slot = @WFRID " |
|
|
||||||
: "ORDER BY header.insertDate DESC, child.slot ASC"
|
|
||||||
|
|
||||||
WaferMapDB = Environment_Services('GetMetrologyProductionPath')
|
|
||||||
AttachmentID = SQL_Services('GetDataRows', 'SPC', Query)
|
|
||||||
AttachmentID = SRP_Trim(AttachmentID, 'FB', '{}')
|
|
||||||
WaferMapRoot = Environment_Services('GetWaferMapProductionPath')
|
|
||||||
PDFPath = WaferMapRoot:'\':AttachmentID:'\image.pdf'
|
|
||||||
Set_Status(0)
|
|
||||||
PDFFile = ''
|
|
||||||
OSRead PDFFile from PDFPath then
|
|
||||||
// "Cache" PDF on app server
|
|
||||||
QA_Services('PostToWaferImageQueue', RDSNo, WaferNo, TencorRecipe, PDFFile)
|
|
||||||
If ReturnPDF EQ True$ then
|
|
||||||
ResponseBody = SRP_Encode(PDFFile)
|
|
||||||
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_BODY$> = ResponseBody
|
|
||||||
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_DATE$> = Date()
|
|
||||||
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_TIME$> = Time()
|
|
||||||
Database_Services('WriteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, RequestRow, True$)
|
|
||||||
end else
|
|
||||||
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
|
|
||||||
end
|
|
||||||
|
|
||||||
end else
|
|
||||||
ErrorCode = Status()
|
|
||||||
Error_Services('Add', 'Error retrieving wafer map image for AttachmentID ':AttachmentID)
|
|
||||||
end
|
|
||||||
Unlock hWaferImageRequests, RequestKeyID else Null
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
// Delete request because wafer image may never become available.
|
|
||||||
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
|
|
||||||
end
|
|
||||||
Repeat
|
|
||||||
end
|
|
||||||
Unlock hSysLists, ServiceKeyID else Null
|
|
||||||
end
|
|
||||||
|
|
||||||
end service
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// PostToWaferImageQueue
|
// PostToWaferImageQueue
|
||||||
//
|
//
|
||||||
@ -1748,9 +1624,7 @@ Service ROTRImpactReport()
|
|||||||
column = OleGetProperty( xlSht, 'Range' , 'K:K' )
|
column = OleGetProperty( xlSht, 'Range' , 'K:K' )
|
||||||
OlePutProperty( column , 'ColumnWidth' , '15' )
|
OlePutProperty( column , 'ColumnWidth' , '15' )
|
||||||
OlePutProperty( column , 'NumberFormat' , '0.0%' )
|
OlePutProperty( column , 'NumberFormat' , '0.0%' )
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
@ -1962,71 +1836,66 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
|
|||||||
|
|
||||||
PreEpiSig = RDSRec<RDS_PRE_EPI_SIG$>
|
PreEpiSig = RDSRec<RDS_PRE_EPI_SIG$>
|
||||||
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
|
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
|
||||||
// Removing OI_SUPERUSER wrappers to alleviate signature issues. 11/18/19 djs
|
|
||||||
* IF MemberOf(Username, 'OI_SUPERUSER') THEN
|
|
||||||
|
|
||||||
IF ReactorType NE 'EPP' THEN
|
IF ReactorType NE 'EPP' THEN
|
||||||
|
|
||||||
WOMatKey = WONo:'*':CassNo
|
WOMatKey = WONo:'*':CassNo
|
||||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
|
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||||
SigAction = WOStep:'VER'
|
SigAction = WOStep:'VER'
|
||||||
|
|
||||||
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
|
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
|
||||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
|
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
|
||||||
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
|
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
|
||||||
END ELSE
|
END ELSE
|
||||||
WOMatSig = ''
|
WOMatSig = ''
|
||||||
END
|
END
|
||||||
|
|
||||||
RDSSig = PreEpiSig
|
RDSSig = PreEpiSig
|
||||||
|
|
||||||
BEGIN CASE
|
BEGIN CASE
|
||||||
CASE (WOMatSig EQ '') AND (RDSSig NE '')
|
CASE (WOMatSig EQ '') AND (RDSSig NE '')
|
||||||
|
|
||||||
* Signature missing on WO_MAT
|
* Signature missing on WO_MAT
|
||||||
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
|
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
|
||||||
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
|
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
|
||||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
||||||
* Sets VER signature
|
* Sets VER signature
|
||||||
* obj_WO_Mat('SetSignature',owmParms)
|
errCode = ''
|
||||||
errCode = ''
|
IF Get_Status(errCode) THEN
|
||||||
IF Get_Status(errCode) THEN
|
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
|
||||||
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
|
Error_Services('Set', ErrorMsg)
|
||||||
Error_Services('Set', ErrorMsg)
|
Response = False$
|
||||||
Response = False$
|
END else
|
||||||
END else
|
Response = True$
|
||||||
Response = True$
|
end
|
||||||
end
|
return
|
||||||
return
|
|
||||||
|
|
||||||
CASE (RDSSig = '') AND (WOMatSig NE '')
|
CASE (RDSSig = '') AND (WOMatSig NE '')
|
||||||
|
|
||||||
* Signature missing on RDS
|
* Signature missing on RDS
|
||||||
CurrDate = CurrDTM[1,' ']
|
CurrDate = CurrDTM[1,' ']
|
||||||
CurrTime = CurrDTM[COL2()+1,' ']
|
CurrTime = CurrDTM[COL2()+1,' ']
|
||||||
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
|
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
|
||||||
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
|
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
|
||||||
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
|
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
|
||||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||||
Response = True$
|
Response = True$
|
||||||
return
|
return
|
||||||
|
|
||||||
CASE RDSSig NE '' AND WOMatSig NE ''
|
CASE RDSSig NE '' AND WOMatSig NE ''
|
||||||
|
|
||||||
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
|
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMessage)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
|
|
||||||
CASE Otherwise$
|
CASE Otherwise$
|
||||||
Null
|
Null
|
||||||
|
|
||||||
END CASE
|
END CASE
|
||||||
|
|
||||||
END ;* End of check for Reactor Type
|
END ;* End of check for Reactor Type
|
||||||
|
|
||||||
* END
|
|
||||||
|
|
||||||
SigDate = OCONV( Date(), 'D2/' )
|
SigDate = OCONV( Date(), 'D2/' )
|
||||||
SigTime = OCONV( Time(), 'MTS' )
|
SigTime = OCONV( Time(), 'MTS' )
|
||||||
@ -2040,7 +1909,6 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
|
|||||||
|
|
||||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:Username:@RM:SigDate:' ':SigTime ;* Sets VER signature
|
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:Username:@RM:SigDate:' ':SigTime ;* Sets VER signature
|
||||||
|
|
||||||
* obj_WO_Mat('SetSignature',owmParms)
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMessage)
|
||||||
@ -2205,18 +2073,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
//Added 8/18/2021 JRO - checks to make sure recipe limits aren't oos
|
|
||||||
* IF ParamOutOfSpec then
|
|
||||||
* IF Supplement NE True$ then
|
|
||||||
* ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
|
|
||||||
* Error_Services('Set', ErrorMsg)
|
|
||||||
* Response = False$
|
|
||||||
* return
|
|
||||||
* end
|
|
||||||
* end
|
|
||||||
Locate True$ in ParamOutOfSpec using @VM setting oPos then
|
Locate True$ in ParamOutOfSpec using @VM setting oPos then
|
||||||
|
|
||||||
IF Supplement NE True$ AND WONo NE '173485' then
|
IF Supplement NE True$ then
|
||||||
ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
|
ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
|
||||||
Error_Services('Set', ErrorMsg)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
@ -2230,13 +2089,6 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
* IF (ReactorType = 'ASM+' OR ReactorType = 'HTR') AND (LoadLockVal EQ '') THEN
|
|
||||||
* ErrorMsg = 'Process Error: Load Lock Side must be set to either Left or Right before signing.'
|
|
||||||
* Error_Services('Set', ErrorMsg)
|
|
||||||
* Response = False$
|
|
||||||
* return
|
|
||||||
* END
|
|
||||||
|
|
||||||
//Added JRO 3/16/2021
|
//Added JRO 3/16/2021
|
||||||
//Load Lock Required Check
|
//Load Lock Required Check
|
||||||
LoadLockReq = Xlate('REACTOR', Reactor, REACTOR_PICK_PLACE$, 'X');
|
LoadLockReq = Xlate('REACTOR', Reactor, REACTOR_PICK_PLACE$, 'X');
|
||||||
@ -2310,49 +2162,26 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
Return
|
Return
|
||||||
END
|
END
|
||||||
|
|
||||||
* IF ReactorType NE 'EPP' THEN
|
If PreFlag EQ True$ then
|
||||||
|
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor
|
||||||
|
// using the barcode scanner, which attempts to sign both stages at once to save time.
|
||||||
|
Stage = 'VER'
|
||||||
|
end else
|
||||||
|
Stage = 'LOAD'
|
||||||
|
end
|
||||||
|
|
||||||
If PreFlag EQ True$ then
|
If ReactorType EQ 'EPP' then
|
||||||
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor
|
WOMatKey = ''
|
||||||
// using the barcode scanner, which attempts to sign both stages at once to save time.
|
end else
|
||||||
Stage = 'VER'
|
WOMatKey = WONo:'*':CassNo
|
||||||
end else
|
end
|
||||||
Stage = 'LOAD'
|
|
||||||
end
|
|
||||||
|
|
||||||
If ReactorType EQ 'EPP' then
|
Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
|
||||||
WOMatKey = ''
|
|
||||||
end else
|
|
||||||
WOMatKey = WONo:'*':CassNo
|
|
||||||
end
|
|
||||||
|
|
||||||
Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
|
If Error_Services('HasError') then
|
||||||
|
Response = False$
|
||||||
If Error_Services('HasError') then
|
Return
|
||||||
Response = False$
|
end
|
||||||
Return
|
|
||||||
end
|
|
||||||
|
|
||||||
! Deprecated 11/20/2019
|
|
||||||
* Set_Status(0)
|
|
||||||
* obj_WO_Mat('CheckSigOrder',WONo:'*':CassNo:@RM:WOStep:'LOAD')
|
|
||||||
* IF Get_Status(errCode) THEN
|
|
||||||
* ErrorMsg = 'Process Error: Error calling obj_WO_Mat("CheckSigOrder"). Error code: ':errCode
|
|
||||||
* Error_Services('Set', ErrorMsg)
|
|
||||||
* Response = False$
|
|
||||||
* RETURN
|
|
||||||
* END
|
|
||||||
|
|
||||||
* END ;* End of check for Epi Pro
|
|
||||||
|
|
||||||
// Deprecated in favor of stage specific supplements
|
|
||||||
* SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
|
|
||||||
* IF (SupplAckReq EQ True$) then
|
|
||||||
* ErrorMsg = 'The RDS Supplement must be acknowledged before the load operation can be signed.'
|
|
||||||
* Error_Services('Set', ErrorMsg)
|
|
||||||
* Response = False$
|
|
||||||
* Return
|
|
||||||
* END
|
|
||||||
|
|
||||||
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
|
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
|
||||||
SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$>
|
SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$>
|
||||||
@ -2400,7 +2229,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service LoadExtra1stReady(RDSNo)
|
Service LoadExtra1stReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2412,9 +2243,12 @@ Service LoadExtra1stReady(RDSNo)
|
|||||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UnsignLoadExtra1stReady(RDSNo)
|
Service UnsignLoadExtra1stReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2431,7 +2265,9 @@ Service UnsignLoadExtra1stReady(RDSNo)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service LoadExtra2ndReady(RDSNo)
|
Service LoadExtra2ndReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2443,9 +2279,12 @@ Service LoadExtra2ndReady(RDSNo)
|
|||||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UnsignLoadExtra2ndReady(RDSNo)
|
Service UnsignLoadExtra2ndReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2459,8 +2298,10 @@ Service UnsignLoadExtra2ndReady(RDSNo)
|
|||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// SignLoadStage
|
// SignLoadStage
|
||||||
//
|
//
|
||||||
@ -2745,39 +2586,17 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
|
|||||||
end
|
end
|
||||||
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
|
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
|
||||||
|
|
||||||
|
If ReactorType EQ 'EPP' then
|
||||||
|
WOMatKey = ''
|
||||||
|
end else
|
||||||
|
WOMatKey = WONo:'*':CassNo
|
||||||
|
end
|
||||||
|
|
||||||
* IF ReactorType NE 'EPP' THEN
|
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
Response = False$
|
||||||
If ReactorType EQ 'EPP' then
|
return
|
||||||
WOMatKey = ''
|
end
|
||||||
end else
|
|
||||||
WOMatKey = WONo:'*':CassNo
|
|
||||||
end
|
|
||||||
|
|
||||||
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
|
|
||||||
If Error_Services('HasError') then
|
|
||||||
Response = False$
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
* END ELSE
|
|
||||||
*
|
|
||||||
* ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
||||||
* LOCATE 'LWI' IN ReactRunRec<REACT_RUN_CI_STAGE$> USING @VM SETTING Pos THEN
|
|
||||||
* CINo = ReactRunRec<REACT_RUN_CI_NO$>
|
|
||||||
* Actions = obj_Clean_Insp('GetActions',CINo)
|
|
||||||
* LOCATE 'Inspection' IN Actions<ACTION$ACTIONS> USING @FM SETTING Pos THEN
|
|
||||||
* IF Actions<ACTION$SIGS,1> = '' THEN
|
|
||||||
* ErrorMsg = 'Process Error: A Wafer Inspection is required and has not been completed.'
|
|
||||||
* Error_Services('Set', ErrorMsg)
|
|
||||||
* Response = False$
|
|
||||||
* return
|
|
||||||
* END
|
|
||||||
* END
|
|
||||||
* END
|
|
||||||
*
|
|
||||||
* END ;* End of check for EpiPRO (EPP) reactor type
|
|
||||||
|
|
||||||
LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X')
|
LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X')
|
||||||
If LWIInstAckReq EQ True$ then
|
If LWIInstAckReq EQ True$ then
|
||||||
@ -2795,7 +2614,6 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
! Todo: We will have to define special logic for the barcode application to handle extra loads and unloads.
|
|
||||||
* Check for extra unloads without corresponding extra load
|
* Check for extra unloads without corresponding extra load
|
||||||
IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN
|
IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN
|
||||||
IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN
|
IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN
|
||||||
@ -2867,7 +2685,9 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UnloadExtra1stReady(RDSNo)
|
Service UnloadExtra1stReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2879,9 +2699,12 @@ Service UnloadExtra1stReady(RDSNo)
|
|||||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature EQ '' AND LoadExtra1Signature EQ '' AND UnloadExtra2Signature EQ '' And LoadExtra2Signature eq '' and StandardUnloadSignature EQ '' then
|
If StandardLoadSignature NE '' AND UnloadExtra1Signature EQ '' AND LoadExtra1Signature EQ '' AND UnloadExtra2Signature EQ '' And LoadExtra2Signature eq '' and StandardUnloadSignature EQ '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UnloadExtra2ndReady(RDSNo)
|
Service UnloadExtra2ndReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2893,9 +2716,12 @@ Service UnloadExtra2ndReady(RDSNo)
|
|||||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UnsignUnloadExtra1stReady(RDSNo)
|
Service UnsignUnloadExtra1stReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2912,7 +2738,9 @@ Service UnsignUnloadExtra1stReady(RDSNo)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UnsignUnloadExtra2ndReady(RDSNo)
|
Service UnsignUnloadExtra2ndReady(RDSNo)
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
@ -2926,6 +2754,7 @@ Service UnsignUnloadExtra2ndReady(RDSNo)
|
|||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -3012,7 +2841,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
|
|||||||
|
|
||||||
* 4/30/2013 JCH added parms for merging of two methods
|
* 4/30/2013 JCH added parms for merging of two methods
|
||||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'UNLOAD':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ReactID:@RM:ReactWH:@RM:ReactLoc:@RM:Tag
|
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'UNLOAD':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ReactID:@RM:ReactWH:@RM:ReactLoc:@RM:Tag
|
||||||
* obj_WO_Mat('SetSignature',owmParms)
|
|
||||||
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within the ':Service:' service'
|
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within the ':Service:' service'
|
||||||
@ -3046,9 +2874,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
|
|||||||
|
|
||||||
obj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo)
|
obj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo)
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
* ErrorMsg = 'Process Error: Error calling Obj_React_Status("CassUnload") within the ':Service:' service'
|
|
||||||
* Error_Services('Add', ErrorMsg)
|
|
||||||
* Response = False$
|
|
||||||
LogData = ''
|
LogData = ''
|
||||||
LogData<1> = LoggingDTM
|
LogData<1> = LoggingDTM
|
||||||
LogData<2> = @User4
|
LogData<2> = @User4
|
||||||
@ -3064,7 +2889,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
|
|||||||
InCassettes = RDSRec<RDS_IN_CASS_NO$>
|
InCassettes = RDSRec<RDS_IN_CASS_NO$>
|
||||||
InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)
|
InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)
|
||||||
obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)
|
obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)
|
||||||
//Reactor_Services('IncrementWfrMetrics', RDSNo)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
RDSRec<RDS_OPERATOR_OUT$> = SigBy
|
RDSRec<RDS_OPERATOR_OUT$> = SigBy
|
||||||
@ -3471,97 +3295,9 @@ Service SignFQAStage(RDSNo, Username)
|
|||||||
NEXT Index
|
NEXT Index
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
**********************************************
|
|
||||||
* Verify the FlatFinder information *
|
|
||||||
**********************************************
|
|
||||||
EpiPartNo = {EPI_PART_NO}
|
|
||||||
WaferSize = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X')
|
|
||||||
WaferSizeInch = Field(WaferSize, ' ', 3, 1)
|
|
||||||
CustNo = {CUST_NO}
|
|
||||||
CompanyRow = Xlate('COMPANY', CustNo, '', 'X')
|
|
||||||
WafersOut = {WFRS_OUT}
|
|
||||||
|
|
||||||
Begin Case
|
|
||||||
|
|
||||||
Case WaferSizeInch = '6'
|
|
||||||
|
|
||||||
WaferFlatSizeInches = CompanyRow<COMPANY_WAFER_FLAT_WAFER_SIZE_INCH$>
|
|
||||||
WaferFlatLengthMins = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MIN$>, 'MD1')
|
|
||||||
WaferFlatLengthMaxes = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MAX$>, 'MD1')
|
|
||||||
|
|
||||||
Locate WaferSizeInch in WaferFlatSizeInches using @VM setting vPos then
|
|
||||||
WaferFlatLengthMin = WaferFlatLengthMins<0, vPos>
|
|
||||||
WaferFlatLengthMax = WaferFlatLengthMaxes<0, vPos>
|
|
||||||
end else
|
|
||||||
WaferFlatLengthMin = ''
|
|
||||||
WaferFlatLengthMax = ''
|
|
||||||
end
|
|
||||||
|
|
||||||
// Get FlatFinder Read Value
|
|
||||||
* FlatFinderWafersQty = {FLATFINDER_WAFER_CNT}
|
|
||||||
FlatFinderWaferLength = {FLATFINDER_FLAT_LENGTH}
|
|
||||||
|
|
||||||
***************************************
|
|
||||||
* FlatFinder - Wafers Quatity Section *
|
|
||||||
***************************************
|
|
||||||
* If (FlatFinderWafersQty NE '') then
|
|
||||||
* If (FlatFinderWafersQty NE WafersOut) then
|
|
||||||
* ErrorMsg = 'Unable to sign FQA because Flat Finder and Wafers Out quantities do not match.'
|
|
||||||
* Error_Services('Add', ErrorMsg)
|
|
||||||
* return
|
|
||||||
* end
|
|
||||||
* end else
|
|
||||||
* ErrorMsg = 'Unable to sign FQA because the Flat Finder quantity is missing.'
|
|
||||||
* Error_Services('Add', ErrorMsg)
|
|
||||||
* return
|
|
||||||
* end
|
|
||||||
************************************
|
|
||||||
* FlatFinder - Flat Length Section *
|
|
||||||
************************************
|
|
||||||
If (WaferFlatLengthMin NE '') AND (WaferFlatLengthMax NE '') then
|
|
||||||
If (FlatFinderWaferLength NE '') then
|
|
||||||
If (FlatFinderWaferLength GE WaferFlatLengthMin) AND (FlatFinderWaferLength LE WaferFlatLengthMax) then
|
|
||||||
end else
|
|
||||||
ErrorMsg = 'Unable to sign FQA because Flat Finder wafer lengths are out of bounds.'
|
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
ErrorMsg = 'Unable to sign FQA because the Flat Finder wafer length is missing.'
|
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Case WaferSizeInch = '8'
|
|
||||||
|
|
||||||
// Get NotchFinder Read Value
|
|
||||||
* NotchFinderWafersQty = {FLATFINDER_WAFER_CNT}
|
|
||||||
*
|
|
||||||
* ***************************************
|
|
||||||
* * NotchFinder - Wafers Quatity Section *
|
|
||||||
* ***************************************
|
|
||||||
* If (NotchFinderWafersQty NE '') then
|
|
||||||
* If (NotchFinderWafersQty NE WafersOut) then
|
|
||||||
* ErrorMsg = 'Unable to sign FQA because Notch Finder and Wafers Out quantities do not match.'
|
|
||||||
* Error_Services('Add', ErrorMsg)
|
|
||||||
* return
|
|
||||||
* end
|
|
||||||
* end else
|
|
||||||
* ErrorMsg = 'Unable to sign FQA because the Notch Finder quantity is missing.'
|
|
||||||
* Error_Services('Add', ErrorMsg)
|
|
||||||
* return
|
|
||||||
* end
|
|
||||||
|
|
||||||
Case 1
|
|
||||||
End Case
|
|
||||||
|
|
||||||
*************************
|
*************************
|
||||||
* Verify Wafer Quantity *
|
* Verify Wafer Quantity *
|
||||||
*************************
|
*************************
|
||||||
! The barcode application will need to inform the user that an override is required. We will return an error for
|
|
||||||
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan.
|
|
||||||
CassSchedWafers = {CASS_SHIP_QTY}
|
CassSchedWafers = {CASS_SHIP_QTY}
|
||||||
WafersOut = {WFRS_OUT}
|
WafersOut = {WFRS_OUT}
|
||||||
|
|
||||||
@ -3581,23 +3317,18 @@ Service SignFQAStage(RDSNo, Username)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
*********************************
|
*********************************
|
||||||
* Verify NCR total >= USL Fails *
|
* Verify NCR total >= USL Fails *
|
||||||
*********************************
|
*********************************
|
||||||
! The barcode application will need to inform the user that an override is required. We will return an error for
|
NCRStatus = QA_Services('GetNCRStatus', RDSNo)
|
||||||
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan.
|
If NCRStatus EQ False$ then
|
||||||
If Username EQ 'FRANCOIS_R' then
|
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
|
||||||
NCRStatus = QA_Services('GetNCRStatus', RDSNo)
|
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
|
||||||
If NCRStatus EQ False$ then
|
: 'number of wafers above the USL threshold. A lead or supervisor must override.'
|
||||||
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
|
Error_Services('Add', ErrorMsg)
|
||||||
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
|
return
|
||||||
: 'number of wafers above the USL threshold. A lead or supervisor must override.'
|
end
|
||||||
Error_Services('Add', ErrorMsg)
|
end
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
*************************
|
*************************
|
||||||
* Verify if Shift exist *
|
* Verify if Shift exist *
|
||||||
@ -3659,21 +3390,19 @@ Service SignFQAStage(RDSNo, Username)
|
|||||||
Next Test
|
Next Test
|
||||||
|
|
||||||
******************************************
|
******************************************
|
||||||
* Verify Unload Stage QA Metrology Tests * On hold until approved for release to production
|
* Verify Unload Stage QA Metrology Tests *
|
||||||
******************************************
|
******************************************
|
||||||
If Username EQ 'FRANCOIS_R' then
|
WONo = {WO}
|
||||||
WONo = {WO}
|
CassNo = {CASS_NO}
|
||||||
CassNo = {CASS_NO}
|
WOMatQAKey = WONo : '*' : CassNo
|
||||||
WOMatQAKey = WONo : '*' : CassNo
|
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
OutOfSpec = Sum(OutOfSpec)
|
||||||
OutOfSpec = Sum(OutOfSpec)
|
If OutOfSpec GT 0 then
|
||||||
If OutOfSpec GT 0 then
|
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
|
||||||
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
|
Error_Services('Add', ErrorMsg)
|
||||||
Error_Services('Add', ErrorMsg)
|
return
|
||||||
return
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
*******************************************
|
*******************************************
|
||||||
* Verify if all steps have been completed *
|
* Verify if all steps have been completed *
|
||||||
@ -3746,8 +3475,6 @@ Service SignFQAStage(RDSNo, Username)
|
|||||||
;* 4/30/2013 JCH added parms for merging of two methods
|
;* 4/30/2013 JCH added parms for merging of two methods
|
||||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'QA':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ToolID:@RM:WHCd:@RM:LocCd:@RM:Tag
|
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'QA':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ToolID:@RM:WHCd:@RM:LocCd:@RM:Tag
|
||||||
|
|
||||||
* obj_WO_Mat('SetSignature',owmParms) ; * * * * * S I G N A T U R E * * * * * *
|
|
||||||
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
|
ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
|
||||||
Error_Services('Add', ErrorMsg)
|
Error_Services('Add', ErrorMsg)
|
||||||
|
@ -254,26 +254,23 @@ Event SIGN_BUTTON.CLICK()
|
|||||||
end
|
end
|
||||||
|
|
||||||
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
||||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
****************************************
|
||||||
If WCCheckEnabled then
|
* Verify the Wafer Counter information *
|
||||||
****************************************
|
****************************************
|
||||||
* Verify the Wafer Counter information *
|
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
||||||
****************************************
|
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
||||||
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
|
||||||
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
|
||||||
|
|
||||||
*************************************
|
*************************************
|
||||||
* Wafer Counter - Quantity Section *
|
* Wafer Counter - Quantity Section *
|
||||||
*************************************
|
*************************************
|
||||||
If (WaferCounterQty NE '') then
|
If (WaferCounterQty NE '') then
|
||||||
If (WaferCounterQty NE WafersOut) then
|
If (WaferCounterQty NE WafersOut) then
|
||||||
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
|
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
|
||||||
RETURN 0
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
|
||||||
RETURN 0
|
RETURN 0
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
||||||
|
RETURN 0
|
||||||
end
|
end
|
||||||
|
|
||||||
***********************************
|
***********************************
|
||||||
@ -446,26 +443,21 @@ Event SIGN_BUTTON.CLICK()
|
|||||||
******************************************
|
******************************************
|
||||||
* Verify Unload Stage QA Metrology Tests *
|
* Verify Unload Stage QA Metrology Tests *
|
||||||
******************************************
|
******************************************
|
||||||
|
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
|
||||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
|
||||||
|
WOMatQAKey = WONo : '*' : CassNo
|
||||||
If (DevelopmentFlag EQ True$) then
|
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||||
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
|
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||||
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
|
OutOfSpec = Sum(OutOfSpec)
|
||||||
WOMatQAKey = WONo : '*' : CassNo
|
If OutOfSpec GT 0 then
|
||||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
ErrorMsg = 'Process Error':@SVM
|
||||||
OutOfSpec = Sum(OutOfSpec)
|
For each FailReason in FailReasons using @VM
|
||||||
If OutOfSpec GT 0 then
|
ErrorMsg := FailReason:CRLF$
|
||||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
Next FailReason
|
||||||
ErrorMsg = 'Process Error':@SVM
|
ErrMsg(ErrorMsg)
|
||||||
For each FailReason in FailReasons using @VM
|
Return
|
||||||
ErrorMsg := FailReason:CRLF$
|
end
|
||||||
Next FailReason
|
|
||||||
ErrMsg(ErrorMsg)
|
|
||||||
Return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
*******************************************
|
*******************************************
|
||||||
* Verify if all steps have been completed *
|
* Verify if all steps have been completed *
|
||||||
|
@ -2010,20 +2010,17 @@ Service QASigReady(RDSNo)
|
|||||||
* Verify Unload Stage QA Metrology Tests *
|
* Verify Unload Stage QA Metrology Tests *
|
||||||
******************************************
|
******************************************
|
||||||
If ErrorMessage EQ '' then
|
If ErrorMessage EQ '' then
|
||||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
WOMatQAKey = WOMatKey
|
||||||
If (DevelopmentFlag EQ True$) then
|
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||||
WOMatQAKey = WOMatKey
|
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
OutOfSpec = Sum(OutOfSpec)
|
||||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
If OutOfSpec GT 0 then
|
||||||
OutOfSpec = Sum(OutOfSpec)
|
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||||
If OutOfSpec GT 0 then
|
ErrorMessage = 'Error in ':Service:' service. '
|
||||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
For each FailReason in FailReasons using @VM
|
||||||
ErrorMessage = 'Error in ':Service:' service. '
|
ErrorMessage := FailReason:' '
|
||||||
For each FailReason in FailReasons using @VM
|
Next FailReason
|
||||||
ErrorMessage := FailReason:' '
|
end
|
||||||
Next FailReason
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
************************************************************************
|
************************************************************************
|
||||||
@ -2844,4 +2841,3 @@ GetMostRecentSig:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user