removed dead code

This commit is contained in:
Infineon\StieberD 2025-06-09 16:39:46 -07:00
parent 16c7bc6926
commit 803f946c7e
7 changed files with 432 additions and 802 deletions

View File

@ -581,171 +581,131 @@ Refresh:
// RDS_UNLOAD // RDS_UNLOAD
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
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$
If (DevelopmentFlag EQ True$) then If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
Color = YELLOW$
CtrlName = @WINDOW:'.EDT_QA_MET' stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$) NoError = False$
Set_Property(CtrlName, 'VISIBLE', True$) end
MetList = Get_Property(CtrlName,'LIST')
ThickOutOfSpec = False$ If QAMetOutofSpec EQ True$ then
CresOutOfSpec = False$ Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
MLCnt = COUNT(MetList,@FM) + (MetList NE '') stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
FOR Line = 1 TO MLCnt NoError = False$
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN end
MetResult = MetList<Line,COL$UL_MET_RESULT>
MetMin = MetList<Line,COL$UL_MET_MIN> If (MetResult LT MetMin) then
MetMax = MetList<Line,COL$UL_MET_MAX> Color = RED$:@FM:'':@FM:BRED$:@FM:''
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN> stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT> NoError = False$
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE> end
PSN = Get_Property(@Window : '.PSN', 'TEXT')
PRSStageKey = PSN:'*UNLOAD' If (MetResult GT MetMax) then
MetTest = MetList<Line,COL$UL_MET_TEST> Color = RED$:@FM:'':@FM:BRED$:@FM:''
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey) stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$> NoError = False$
SpecRecipe = '' end
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') If (PhaseResult LT PhaseMin) then
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey) Color = RED$:@FM:'':@FM:BRED$:@FM:''
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line> stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
Begin Case NoError = False$
Case MetTest EQ 'THICK_ONLY' end
// Check each point to see if any are out of spec
For each DataPoint in DataPoints using @SVM setting ThickIndex QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
Until DataPoint EQ '' DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
Begin Case If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Case ThickIndex GT 10 Color = RED$:@FM:'':@FM:BRED$:@FM:''
Null stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
Case (DataPoint EQ '') NoError = False$
ThickOutOfSpec = True$ end
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
ThickOutOfSpec = True$ If (NoError EQ True$) then
End Case Color = GREEN$
Next DataPoint stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
Case MetTest EQ 'CRES'
// Check critical points to see if any are out of spec (both HgCV and Phase) END ELSE
CriticalPoints = '1,2,5,6,9' Color = GREEN$
For each DataPoint in DataPoints using @SVM setting CresIndex stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
Until DataPoint EQ '' END
HgCVDataPoint = DataPoint[1, 'F':@TM]
PhaseDataPoint = DataPoint[-1, 'B':@TM] NEXT Line
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
Begin Case Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
Case (HgCVDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$ IF MemberOf(@USER4, 'OI_ADMIN') THEN
Case (PhaseDataPoint EQ '') and CriticalPoint Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
CresOutOfSpec = True$ END ELSE
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
CresOutOfSpec = True$ END
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint end
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
Color = YELLOW$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If QAMetOutofSpec EQ True$ then
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult LT MetMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult GT MetMax) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (PhaseResult LT PhaseMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
NoError = False$
end
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
NoError = False$
end
If (NoError EQ True$) then
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
END ELSE
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
END
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 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$
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$) If RDSNo NE '' then
QtyBackColor = GREEN$ FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP') WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
If RDSNo NE '' then Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA') WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$> Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
***************************************** *****************************************
* WaferCounter - Wafers Quantity Section * * WaferCounter - Wafers Quantity Section *
***************************************** *****************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$ If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
end else end else
QtyBackColor = ORANGE$ QtyBackColor = ORANGE$
end end
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X') WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1) WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA') WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then If Error_Services('NoError') then
WCCurrMode = '' WCCurrMode = ''
If RowExists('TOOL', WCToolID) then If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X') WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X') WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD')) 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 end else
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor) ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
end
end else end
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
end
return return

View File

@ -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 *
****************************************
****************************************
* Verify the Wafer Counter information *
****************************************
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') 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 Filled quantities do not match.') ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
RETURN 0 RETURN 0
end end
end else end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.') ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0 RETURN 0
end end
end
************************** **************************
* Verify user's password * * Verify user's password *
@ -2293,58 +2289,50 @@ return
RefreshWaferCounterData: RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$) Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$ QtyBackColor = GREEN$
WONo = Get_Property(@Window : '.WO_NO', 'TEXT') WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT') Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
WMOKey = WONo:'*1*':Cassette WMOKey = WONo:'*1*':Cassette
If WMOKey NE '*1*' then If WMOKey NE '*1*' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA') FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$> WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty) Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
************************************ ************************************
* Wafer Counter - Quantity Section * * Wafer Counter - Quantity Section *
************************************ ************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$ If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
end else end else
QtyBackColor = ORANGE$ QtyBackColor = ORANGE$
end end
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X') WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1) WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA') WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then If Error_Services('NoError') then
WCCurrMode = '' WCCurrMode = ''
If RowExists('TOOL', WCToolID) then If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X') WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X') WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD')) 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

View File

@ -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

View File

@ -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
@ -1288,14 +1283,9 @@ Service ImportCDEData(RunData, FileName)
RDSNo@ = RDSKeyID RDSNo@ = RDSKeyID
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

View File

@ -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 = Sum / NumDataPoints
* Average = OConv(IConv(Average, 'MD3L'), 'MD3L')
* Min = OConv(IConv(Min, 'MD3L'), 'MD3L')
* Max = OConv(IConv(Max, 'MD3L'), 'MD3L')
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
@ -509,14 +486,7 @@ Service ProcessROTRRequest(RDSNo)
ResponseCopy = Response ResponseCopy = Response
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$
@ -2229,13 +2088,6 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
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
@ -2309,50 +2161,27 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
Return Return
END END
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 ReactorType NE 'EPP' THEN If ReactorType EQ 'EPP' then
WOMatKey = ''
If PreFlag EQ True$ then end else
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor WOMatKey = WONo:'*':CassNo
// using the barcode scanner, which attempts to sign both stages at once to save time. end
Stage = 'VER'
end else Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
Stage = 'LOAD'
end 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, Stage, False$, RDSNo)
If Error_Services('HasError') then
Response = False$
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
* IF ReactorType NE 'EPP' THEN WOMatKey = ''
end else
WOMatKey = WONo:'*':CassNo
If ReactorType EQ 'EPP' then end
WOMatKey = ''
end else Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
WOMatKey = WONo:'*':CassNo If Error_Services('HasError') then
end Response = False$
return
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo) end
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
@ -3470,98 +3294,10 @@ Service SignFQAStage(RDSNo, Username)
END END
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)

View File

@ -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 WafersOut) then
If (WaferCounterQty NE '') then ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
If (WaferCounterQty NE WafersOut) then
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 *

View File

@ -114,7 +114,7 @@ end service
Service CheckQALabelStatus(WOMatKey) Service CheckQALabelStatus(WOMatKey)
rec = Xlate('WO_MAT', WoMatKey,'', '') rec = Xlate('WO_MAT', WoMatKey,'', '')
locRec = rec<WO_MAT_INV_LOCATION$> locRec = rec<WO_MAT_INV_LOCATION$>
actionRec = rec<WO_MAT_INV_ACTION$> actionRec = rec<WO_MAT_INV_ACTION$>
@ -282,7 +282,7 @@ end service
Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo) Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo)
If UseCaching EQ '' then UseCaching = True$ If UseCaching EQ '' then UseCaching = True$
Signature = '' Signature = ''
SigDTM = '' SigDTM = ''
@ -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