diff --git a/LSL2/STPROC/COMM_RDS.txt b/LSL2/STPROC/COMM_RDS.txt index 662183b..fb0ad84 100644 --- a/LSL2/STPROC/COMM_RDS.txt +++ b/LSL2/STPROC/COMM_RDS.txt @@ -581,171 +581,131 @@ Refresh: // RDS_UNLOAD 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 NE '' THEN + MetResult = MetList + MetMin = MetList + MetMax = MetList + PhaseMin = MetList + PhaseResult = MetList + ScanRecipe = MetList + PSN = Get_Property(@Window : '.PSN', 'TEXT') + PRSStageKey = PSN:'*UNLOAD' + MetTest = MetList + PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey) + SpecTests = PRSStageRec + 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 + 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 + end + NoError = True$ - If (DevelopmentFlag EQ True$) then - - 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 NE '' THEN - MetResult = MetList - MetMin = MetList - MetMax = MetList - PhaseMin = MetList - PhaseResult = MetList - ScanRecipe = MetList - PSN = Get_Property(@Window : '.PSN', 'TEXT') - PRSStageKey = PSN:'*UNLOAD' - MetTest = MetList - PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey) - SpecTests = PRSStageRec - 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 - 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 - end - NoError = True$ - - If (MetList 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 - 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 NE '' THEN - BEGIN CASE - CASE MetList = '' - Color = YELLOW$ - CASE MetList < MetList OR MetList > MetList - 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 + If (MetList 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 + 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 * End of check for Unload OR Post_Epi windows **************************************************************************************************************************************** @@ -2669,9 +2629,8 @@ MetTestDC: Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST') TestLine = Lines 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' ; Props := 'LIST' end else @@ -2708,8 +2667,7 @@ MetTestDC: BEGIN CASE CASE MetTest EQ '' Null - - CASE (@WINDOW = 'RDS_UNLOAD') and (DevelopmentFlag EQ True$) and (LWRHOTest EQ False$) + CASE (@WINDOW = 'RDS_UNLOAD') and (LWRHOTest EQ False$) ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID) Send_Event(@Window, "READ") CASE Otherwise$ @@ -2863,57 +2821,47 @@ return RefreshWaferCounterData: - WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X') - If WCCheckEnabled then - - Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) - 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 - 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$) + QtyBackColor = GREEN$ + RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP') + If RDSNo NE '' then + FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA') + WaferCounterQty = FqaWcRec + 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 * - ***************************************** - If (WaferCounterQty NE '') then - If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$ - end else - QtyBackColor = ORANGE$ - end - - WaferSize = Xlate('RDS', RDSNo, '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 + ***************************************** + * WaferCounter - Wafers Quantity Section * + ***************************************** + If (WaferCounterQty NE '') then + If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$ + end else + QtyBackColor = ORANGE$ + end + + WaferSize = Xlate('RDS', RDSNo, '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(Error_Services('GetMessage')) + ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".') 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 else - Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$) - Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$) - end + ErrMsg(Error_Services('GetMessage')) + 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) return - - diff --git a/LSL2/STPROC/COMM_WM_OUT.txt b/LSL2/STPROC/COMM_WM_OUT.txt index 037409f..642de4d 100644 --- a/LSL2/STPROC/COMM_WM_OUT.txt +++ b/LSL2/STPROC/COMM_WM_OUT.txt @@ -1107,29 +1107,25 @@ SignSupVer: 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') - WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') - - ************************************ - * Wafer Counter - Quantity Section * - ************************************ - If (WaferCounterQty NE '') then - If (WaferCounterQty NE WafersOut) then - ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.') - RETURN 0 - end - end else - ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.') - RETURN 0 - end - end + WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') + WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') + + ************************************ + * Wafer Counter - Quantity Section * + ************************************ + If (WaferCounterQty NE '') then + If (WaferCounterQty NE WafersOut) then + ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.') + RETURN 0 + end + end else + ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.') + RETURN 0 + end ************************** * Verify user's password * @@ -2293,58 +2289,50 @@ return RefreshWaferCounterData: - - WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X') - If WCCheckEnabled then - Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) - 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 - Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty) - WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') - Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty) - - ************************************ - * Wafer Counter - Quantity Section * - ************************************ - If (WaferCounterQty NE '') then - If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$ - 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 + Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) + 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 + Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty) + WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') + Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty) + + ************************************ + * Wafer Counter - Quantity Section * + ************************************ + If (WaferCounterQty NE '') then + If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$ + 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(Error_Services('GetMessage')) + ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".') end end else - ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".') + ErrMsg(Error_Services('GetMessage')) 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 diff --git a/LSL2/STPROC/DBW_RDS_OVERVIEW_NEPP_EVENTS.txt b/LSL2/STPROC/DBW_RDS_OVERVIEW_NEPP_EVENTS.txt index 8c01667..b8a2f8b 100644 --- a/LSL2/STPROC/DBW_RDS_OVERVIEW_NEPP_EVENTS.txt +++ b/LSL2/STPROC/DBW_RDS_OVERVIEW_NEPP_EVENTS.txt @@ -881,24 +881,19 @@ Event SIGN_BUTTON.CLICK() ****************************************** * Verify Unload Stage QA Metrology Tests * ****************************************** - - DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') - - If (DevelopmentFlag EQ True$) then - WOMatQAKey = WONo : '*' : CassNo - WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) - OutOfSpec = WOMatQARec - OutOfSpec = Sum(OutOfSpec) - If OutOfSpec GT 0 then - FailReasons = WOMatQARec - ErrorMsg = 'Process Error':@SVM - For each FailReason in FailReasons using @VM - ErrorMsg := FailReason:CRLF$ - Next FailReason - ErrMsg(ErrorMsg) - Return - end - end + WOMatQAKey = WONo : '*' : CassNo + WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) + OutOfSpec = WOMatQARec + OutOfSpec = Sum(OutOfSpec) + If OutOfSpec GT 0 then + FailReasons = WOMatQARec + ErrorMsg = 'Process Error':@SVM + For each FailReason in FailReasons using @VM + ErrorMsg := FailReason:CRLF$ + Next FailReason + ErrMsg(ErrorMsg) + Return + end ******************************************* * Verify if all steps have been completed * @@ -1965,7 +1960,3 @@ ClearForm: return - - - - diff --git a/LSL2/STPROC/METROLOGY_SERVICES.txt b/LSL2/STPROC/METROLOGY_SERVICES.txt index 43d5adf..efc5ee8 100644 --- a/LSL2/STPROC/METROLOGY_SERVICES.txt +++ b/LSL2/STPROC/METROLOGY_SERVICES.txt @@ -388,6 +388,7 @@ end service // Looks for available Metrology files that are ready to be imported into the MES system. //---------------------------------------------------------------------------------------------------------------------- Service ImportMetrologyFiles(Machine) + If Machine NE '' then hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') Lock hSysLists, ServiceKeyID:'*':Machine then @@ -935,14 +936,8 @@ Service ImportBioRadData(RunData, FileName) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID) If Error_Services('NoError') then WorkOrderNo = RDSRec - - // HgCV Project Development Code ------------------------------------------------------------------------------- - 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 - // ------------------------------------------------------------------------------------------------------------- + IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 ) + If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe) CassNo = RDSRec WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$) GoSub ParseWorkOrder @@ -1288,14 +1283,9 @@ Service ImportCDEData(RunData, FileName) RDSNo@ = RDSKeyID RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID) If Error_Services('NoError') then - - // HgCV Project Development Code ------------------------------------------------------------------------------- - 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 - // ------------------------------------------------------------------------------------------------------------- + + IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 ) + If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe) WorkOrderNo = RDSRec CassNo = RDSRec @@ -3253,5 +3243,3 @@ LoadRunDataToDatabase: return - - diff --git a/LSL2/STPROC/QA_SERVICES.txt b/LSL2/STPROC/QA_SERVICES.txt index 8cbb1dd..e1d23c7 100644 --- a/LSL2/STPROC/QA_SERVICES.txt +++ b/LSL2/STPROC/QA_SERVICES.txt @@ -229,12 +229,6 @@ Service CalculateHgCVData(Datapoints) Min = Min(Min, DataPoint) Max = Max(Max, DataPoint) // 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 // Range % Locate Index in RangePoints using ',' setting unusedIndex then @@ -256,25 +250,15 @@ Service CalculateHgCVData(Datapoints) EdgeMean4mm = Edge4mmSum / 4 EdgeMean10mm = Edge10mmSum / 4 If EdgeMean10mm GT 0 then -* Delta1Avg = Delta1/4 -* Delta2Avg = Delta2/4 EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS - // Range % Range = RangeMax - RangeMin NumRangePoints = DCount(RangePoints, ',') RangeAvg = RangeAvg / NumRangePoints RangePct = (Range / RangeAvg) * 100 - -* EdgeMeanDelta = OConv(IConv(EdgeMeanDelta, 'MD3L'), 'MD3L') -* RangePct = OConv(IConv(RangePct, 'MD3L'), 'MD3L') 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 = '' TotalDataPoints = 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 RequestKeyID EQ '' then WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') - FinalSigComp = False$ -* FinalSigComp = Signature_Services('FinalSigComp', WOMatKey) - If FinalSigComp NE True$ then - // This is a new request - RequestDate = Date() - RequestTime = Time() - RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime - RequestRow = '' - Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$) - If Error_Services('NoError') then - // Log success - LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.' - 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 + RequestDate = Date() + RequestTime = Time() + RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime + RequestRow = '' + Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$) + If Error_Services('NoError') then + // Log success + LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.' + Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM) + end else + ErrorMessage = Error_Services('GetMessage') + end end else ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.' end @@ -509,14 +486,7 @@ Service ProcessROTRRequest(RDSNo) ResponseCopy = Response Swap @FM with ',' in ResponseCopy LogData<3> = 'ROTR Status response: ':Response - Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM) -* ROTRRec = '' -* ROTRRec = Response<1> -* ROTRRec = Response<2> -* ROTRRec = Response<3> -* ROTRRec = Response<4> -* ROTRRec = Response<5> -* Database_Services('WriteDataRow', 'ROTR', LWICINo, ROTRRec, True$, False$, True$) + Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM) CIRec = Response<1> CIRec = Response<2> CIRec = Response<3> @@ -524,7 +494,6 @@ Service ProcessROTRRequest(RDSNo) CIRec = Response<5> // Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS). // That routine will recalculate the final ROTR status. -* CIRec = True$ Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$) end else ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage') @@ -569,6 +538,7 @@ end service // //---------------------------------------------------------------------------------------------------------------------- Service GetROTRStatus(RDSKey) + RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey) WONo = RDSRec RDSCassNo = RDSRec @@ -1287,100 +1257,6 @@ Service ProcessWaferImageRequests() 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 - WaferNo = RequestRow - TencorRecipe = RequestRow - ReturnPDF = RequestRow - 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 = ResponseBody - RequestRow = Date() - RequestRow = 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 // @@ -1748,9 +1624,7 @@ Service ROTRImpactReport() column = OleGetProperty( xlSht, 'Range' , 'K:K' ) OlePutProperty( column , 'ColumnWidth' , '15' ) OlePutProperty( column , 'NumberFormat' , '0.0%' ) - end - end end service @@ -1962,71 +1836,66 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry) PreEpiSig = RDSRec 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 - - WOMatKey = WONo:'*':CassNo - WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) - WOMatSigProfile = WOMatRec - SigAction = WOStep:'VER' + IF ReactorType NE 'EPP' THEN + + WOMatKey = WONo:'*':CassNo + WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) + WOMatSigProfile = WOMatRec + SigAction = WOStep:'VER' - LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN - WOMatSig = WOMatRec - CurrDTM = OCONV(WOMatRec,'DT/4^HS') - END ELSE - WOMatSig = '' - END - - RDSSig = PreEpiSig - - BEGIN CASE - CASE (WOMatSig EQ '') AND (RDSSig NE '') - - * Signature missing on WO_MAT - SigDate = RDSRec - SigTime = RDSRec - owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime - * Sets VER signature -* obj_WO_Mat('SetSignature',owmParms) - errCode = '' - IF Get_Status(errCode) THEN - ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode - Error_Services('Set', ErrorMsg) - Response = False$ - END else - Response = True$ - end - return - - CASE (RDSSig = '') AND (WOMatSig NE '') - - * Signature missing on RDS - CurrDate = CurrDTM[1,' '] - CurrTime = CurrDTM[COL2()+1,' '] - RDSRec = WOMatSig - RDSRec = IConv(CurrDate, 'D') - RDSRec = IConv(CurrTime, 'MT') - Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) - Response = True$ - return - - CASE RDSSig NE '' AND WOMatSig NE '' - - ErrorMessage = 'Process Error: Pre Epi stage has already been signed.' - Error_Services('Set', ErrorMessage) - Response = False$ - return - - CASE Otherwise$ - Null - - END CASE - - END ;* End of check for Reactor Type - -* END + LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN + WOMatSig = WOMatRec + CurrDTM = OCONV(WOMatRec,'DT/4^HS') + END ELSE + WOMatSig = '' + END + + RDSSig = PreEpiSig + + BEGIN CASE + CASE (WOMatSig EQ '') AND (RDSSig NE '') + + * Signature missing on WO_MAT + SigDate = RDSRec + SigTime = RDSRec + owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime + * Sets VER signature + errCode = '' + IF Get_Status(errCode) THEN + ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode + Error_Services('Set', ErrorMsg) + Response = False$ + END else + Response = True$ + end + return + + CASE (RDSSig = '') AND (WOMatSig NE '') + + * Signature missing on RDS + CurrDate = CurrDTM[1,' '] + CurrTime = CurrDTM[COL2()+1,' '] + RDSRec = WOMatSig + RDSRec = IConv(CurrDate, 'D') + RDSRec = IConv(CurrTime, 'MT') + Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) + Response = True$ + return + + CASE RDSSig NE '' AND WOMatSig NE '' + + ErrorMessage = 'Process Error: Pre Epi stage has already been signed.' + Error_Services('Set', ErrorMessage) + Response = False$ + return + + CASE Otherwise$ + Null + + END CASE + + END ;* End of check for Reactor Type SigDate = OCONV( Date(), 'D2/' ) 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 -* obj_WO_Mat('SetSignature',owmParms) IF Get_Status(errCode) THEN ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode Error_Services('Set', ErrorMessage) @@ -2205,18 +2073,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp return 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 - 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.' Error_Services('Set', ErrorMsg) Response = False$ @@ -2229,13 +2088,6 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp Response = False$ return 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 //Load Lock Required Check @@ -2309,50 +2161,27 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp Response = False$ Return 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 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 EQ 'EPP' then - WOMatKey = '' - 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 + If ReactorType EQ 'EPP' then + WOMatKey = '' + end else + WOMatKey = WONo:'*':CassNo + end + + Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo) + + If Error_Services('HasError') then + Response = False$ + Return + end SigDate = RDSRec SigTime = RDSrec @@ -2400,7 +2229,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp end service + Service LoadExtra1stReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -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 Response = True$ end + end service + Service UnsignLoadExtra1stReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -2431,7 +2265,9 @@ Service UnsignLoadExtra1stReady(RDSNo) end service + Service LoadExtra2ndReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -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 Response = True$ end + end service + Service UnsignLoadExtra2ndReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -2459,8 +2298,10 @@ Service UnsignLoadExtra2ndReady(RDSNo) Response = True$ end end + end service + //---------------------------------------------------------------------------------------------------------------------- // SignLoadStage // @@ -2745,39 +2586,17 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor) end ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X') - -* IF ReactorType NE 'EPP' THEN - - - If ReactorType EQ 'EPP' then - WOMatKey = '' - 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 USING @VM SETTING Pos THEN -* CINo = ReactRunRec -* Actions = obj_Clean_Insp('GetActions',CINo) -* LOCATE 'Inspection' IN Actions USING @FM SETTING Pos THEN -* IF Actions = '' 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 + If ReactorType EQ 'EPP' then + WOMatKey = '' + end else + WOMatKey = WONo:'*':CassNo + end + + Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo) + If Error_Services('HasError') then + Response = False$ + return + end LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X') If LWIInstAckReq EQ True$ then @@ -2795,7 +2614,6 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor) return 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 IF RDSRec <> '' THEN IF RDSRec = '' THEN @@ -2867,7 +2685,9 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor) end service + Service UnloadExtra1stReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -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 Response = True$ end + end service + Service UnloadExtra2ndReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -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 Response = True$ end + end service + Service UnsignUnloadExtra1stReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -2912,7 +2738,9 @@ Service UnsignUnloadExtra1stReady(RDSNo) end service + Service UnsignUnloadExtra2ndReady(RDSNo) + Response = False$ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) StandardLoadSignature = RDSRec @@ -2926,6 +2754,7 @@ Service UnsignUnloadExtra2ndReady(RDSNo) Response = True$ end end + end service @@ -3012,7 +2841,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry) * 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 -* obj_WO_Mat('SetSignature',owmParms) IF Get_Status(errCode) THEN 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) 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<1> = LoggingDTM LogData<2> = @User4 @@ -3064,7 +2889,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry) InCassettes = RDSRec InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM) obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo) - //Reactor_Services('IncrementWfrMetrics', RDSNo) end RDSRec = SigBy @@ -3470,98 +3294,10 @@ Service SignFQAStage(RDSNo, Username) END NEXT Index 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 - WaferFlatLengthMins = Oconv(CompanyRow, 'MD1') - WaferFlatLengthMaxes = Oconv(CompanyRow, '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 * ************************* - ! 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} WafersOut = {WFRS_OUT} @@ -3581,23 +3317,18 @@ Service SignFQAStage(RDSNo, Username) end - ********************************* * 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 - ! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan. - If Username EQ 'FRANCOIS_R' then - NCRStatus = QA_Services('GetNCRStatus', RDSNo) - If NCRStatus EQ False$ then - If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then - ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '| - : 'number of wafers above the USL threshold. A lead or supervisor must override.' - Error_Services('Add', ErrorMsg) - return - end - end - end + NCRStatus = QA_Services('GetNCRStatus', RDSNo) + If NCRStatus EQ False$ then + If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then + ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '| + : 'number of wafers above the USL threshold. A lead or supervisor must override.' + Error_Services('Add', ErrorMsg) + return + end + end ************************* * Verify if Shift exist * @@ -3659,21 +3390,19 @@ Service SignFQAStage(RDSNo, Username) 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} - CassNo = {CASS_NO} - WOMatQAKey = WONo : '*' : CassNo - WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) - OutOfSpec = WOMatQARec - OutOfSpec = Sum(OutOfSpec) - If OutOfSpec GT 0 then - ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.' - Error_Services('Add', ErrorMsg) - return - end - end + WONo = {WO} + CassNo = {CASS_NO} + WOMatQAKey = WONo : '*' : CassNo + WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) + OutOfSpec = WOMatQARec + OutOfSpec = Sum(OutOfSpec) + If OutOfSpec GT 0 then + ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.' + Error_Services('Add', ErrorMsg) + return + end ******************************************* * 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 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 ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode Error_Services('Add', ErrorMsg) diff --git a/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt b/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt index 41fb44a..b9f5cf8 100644 --- a/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt +++ b/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt @@ -254,26 +254,23 @@ Event SIGN_BUTTON.CLICK() end RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP') - WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X') - If WCCheckEnabled then - **************************************** - * Verify the Wafer Counter information * - **************************************** - WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT') - WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') - - ************************************* - * Wafer Counter - Quantity Section * - ************************************* - If (WaferCounterQty NE '') then - 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.') + **************************************** + * Verify the Wafer Counter information * + **************************************** + WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT') + WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') + + ************************************* + * Wafer Counter - Quantity Section * + ************************************* + If (WaferCounterQty NE '') then + 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 end *********************************** @@ -446,26 +443,21 @@ Event SIGN_BUTTON.CLICK() ****************************************** * Verify Unload Stage QA Metrology Tests * ****************************************** - - DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') - - If (DevelopmentFlag EQ True$) then - WONo = Get_Property(@WINDOW:'.WO','DEFPROP') - CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP') - WOMatQAKey = WONo : '*' : CassNo - WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) - OutOfSpec = WOMatQARec - OutOfSpec = Sum(OutOfSpec) - If OutOfSpec GT 0 then - FailReasons = WOMatQARec - ErrorMsg = 'Process Error':@SVM - For each FailReason in FailReasons using @VM - ErrorMsg := FailReason:CRLF$ - Next FailReason - ErrMsg(ErrorMsg) - Return - end - end + WONo = Get_Property(@WINDOW:'.WO','DEFPROP') + CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP') + WOMatQAKey = WONo : '*' : CassNo + WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) + OutOfSpec = WOMatQARec + OutOfSpec = Sum(OutOfSpec) + If OutOfSpec GT 0 then + FailReasons = WOMatQARec + ErrorMsg = 'Process Error':@SVM + For each FailReason in FailReasons using @VM + ErrorMsg := FailReason:CRLF$ + Next FailReason + ErrMsg(ErrorMsg) + Return + end ******************************************* * Verify if all steps have been completed * diff --git a/LSL2/STPROC/SIGNATURE_SERVICES.txt b/LSL2/STPROC/SIGNATURE_SERVICES.txt index 2cec531..52ecb23 100644 --- a/LSL2/STPROC/SIGNATURE_SERVICES.txt +++ b/LSL2/STPROC/SIGNATURE_SERVICES.txt @@ -114,7 +114,7 @@ end service Service CheckQALabelStatus(WOMatKey) - + rec = Xlate('WO_MAT', WoMatKey,'', '') locRec = rec actionRec = rec @@ -282,7 +282,7 @@ end service Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo) - + If UseCaching EQ '' then UseCaching = True$ Signature = '' SigDTM = '' @@ -2010,20 +2010,17 @@ Service QASigReady(RDSNo) * Verify Unload Stage QA Metrology Tests * ****************************************** If ErrorMessage EQ '' then - DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') - If (DevelopmentFlag EQ True$) then - WOMatQAKey = WOMatKey - WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) - OutOfSpec = WOMatQARec - OutOfSpec = Sum(OutOfSpec) - If OutOfSpec GT 0 then - FailReasons = WOMatQARec - ErrorMessage = 'Error in ':Service:' service. ' - For each FailReason in FailReasons using @VM - ErrorMessage := FailReason:' ' - Next FailReason - end - end + WOMatQAKey = WOMatKey + WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) + OutOfSpec = WOMatQARec + OutOfSpec = Sum(OutOfSpec) + If OutOfSpec GT 0 then + FailReasons = WOMatQARec + ErrorMessage = 'Error in ':Service:' service. ' + For each FailReason in FailReasons using @VM + ErrorMessage := FailReason:' ' + Next FailReason + end end ************************************************************************ @@ -2844,4 +2841,3 @@ GetMostRecentSig: return -