Modified QA met complete check before wafer counter to only apply to FQA location scans
This commit is contained in:
committed by
Stieber Daniel (CSC FI SPS MESLEO)
parent
9d6c4c154f
commit
c183da951a
@ -97,17 +97,7 @@ Event WINDOW.CREATE(CreateParam)
|
||||
LogData<5> = ToolLoc
|
||||
LogData<6> = @Window:'.CREATE'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
QAMetComplete = ''
|
||||
|
||||
If CassID NE '' then
|
||||
If RowExists('WM_OUT', CassID) then
|
||||
WOMatKey = Xlate('WM_OUT', CassID, 'WO_MAT_KEY', 'X')
|
||||
end else
|
||||
WOMatKey = Xlate('RDS', CassID, 'WO_MAT_KEY', 'X')
|
||||
end
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
end
|
||||
|
||||
|
||||
Convert '.' to '*' in CassID
|
||||
ExpectedQty = ''
|
||||
ExpectedWfrMap = ''
|
||||
@ -115,8 +105,6 @@ Event WINDOW.CREATE(CreateParam)
|
||||
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
|
||||
|
||||
Begin Case
|
||||
Case (CassID NE '' AND QAMetComplete EQ False$)
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
Case ( (CassID EQ '') and (ToolLoc EQ '') )
|
||||
// Alternate workflow
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
|
||||
@ -333,42 +321,32 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
Begin Case
|
||||
Case RowExists('RDS', CassetteID)
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
Case RowExists('WM_OUT', CassetteID)
|
||||
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
end
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
@ -423,7 +401,7 @@ end event
|
||||
|
||||
|
||||
Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
|
||||
|
||||
If Flag EQ 1 then
|
||||
ErrorMsg = ''
|
||||
ScanData = Get_Property(CtrlEntID, 'TEXT')
|
||||
@ -438,110 +416,155 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
Cnt = DCount(ScanData, '|')
|
||||
If Cnt EQ 2 then
|
||||
WaferSize = Field(ScanData, '|', 1)
|
||||
Area = Field(ScanData, '|', 2)
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
||||
Def<MTYPE$> = "U"
|
||||
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
|
||||
MsgUp = Msg(@window, Def) ;* display the processing message
|
||||
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
|
||||
Msg(@window, MsgUp) ;* take down the processing message
|
||||
If Error_Services('NoError') then
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
|
||||
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
|
||||
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
|
||||
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
|
||||
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
|
||||
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
|
||||
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
|
||||
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
|
||||
RowIndex = 1
|
||||
ResultArray = ''
|
||||
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
|
||||
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
|
||||
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
|
||||
ResultArray<1, SlotIndex> = 26 - SlotIndex
|
||||
If SlotFilled EQ ExpectedVal then
|
||||
ResultArray<2, SlotIndex> = ''
|
||||
end else
|
||||
ResultArray<2, SlotIndex> = 'Error'
|
||||
end
|
||||
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
|
||||
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
|
||||
|
||||
RowIndex = 1
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
If SlotFilled then
|
||||
CellColorArray = FilledColorArray
|
||||
end else
|
||||
CellColorArray = EmptyColorArray
|
||||
end
|
||||
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
|
||||
Begin Case
|
||||
Case WaferCount NE ExpectedQty
|
||||
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
|
||||
Case SlotMap NE ExpectedWfrMap
|
||||
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
|
||||
Case Otherwise$
|
||||
SuccessMessage = 'Wafer count verification complete!'
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = SuccessMessage
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
MsgStruct = ""
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
MsgStruct<MCOL$> = -300
|
||||
MsgStruct<MROW$> = 500
|
||||
MsgStruct<MTYPE$> = "T4"
|
||||
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
|
||||
|
||||
AltFlow = Get_Property(@Window, '@ALTERNATE')
|
||||
If AltFlow then
|
||||
GoSub ClearForm
|
||||
end else
|
||||
End_Dialog(@Window, True$)
|
||||
end
|
||||
End Case
|
||||
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error parsing tool scan data.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Area = Field(ScanData, '|', 2) ; // This is a proxy for the operation being performed
|
||||
|
||||
If Area EQ 'FQA' then
|
||||
CassetteID = Get_Property(@Window:'.EDL_CASS_ID', 'TEXT')
|
||||
Begin Case
|
||||
Case RowExists('RDS', CassetteID)
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||
end
|
||||
Case RowExists('WM_OUT', CassetteID)
|
||||
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
end
|
||||
End Case
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
||||
Def<MTYPE$> = "U"
|
||||
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
|
||||
MsgUp = Msg(@window, Def) ;* display the processing message
|
||||
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
|
||||
Msg(@window, MsgUp) ;* take down the processing message
|
||||
If Error_Services('NoError') then
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
|
||||
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
|
||||
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
|
||||
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
|
||||
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
|
||||
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
|
||||
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
|
||||
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
|
||||
RowIndex = 1
|
||||
ResultArray = ''
|
||||
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
|
||||
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
|
||||
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
|
||||
ResultArray<1, SlotIndex> = 26 - SlotIndex
|
||||
If SlotFilled EQ ExpectedVal then
|
||||
ResultArray<2, SlotIndex> = ''
|
||||
end else
|
||||
ResultArray<2, SlotIndex> = 'Error'
|
||||
end
|
||||
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
|
||||
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
|
||||
|
||||
RowIndex = 1
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
If SlotFilled then
|
||||
CellColorArray = FilledColorArray
|
||||
end else
|
||||
CellColorArray = EmptyColorArray
|
||||
end
|
||||
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
|
||||
Begin Case
|
||||
Case WaferCount NE ExpectedQty
|
||||
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
|
||||
Case SlotMap NE ExpectedWfrMap
|
||||
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
|
||||
Case Otherwise$
|
||||
SuccessMessage = 'Wafer count verification complete!'
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = SuccessMessage
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
MsgStruct = ""
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
MsgStruct<MCOL$> = -300
|
||||
MsgStruct<MROW$> = 500
|
||||
MsgStruct<MTYPE$> = "T4"
|
||||
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
|
||||
|
||||
AltFlow = Get_Property(@Window, '@ALTERNATE')
|
||||
If AltFlow then
|
||||
GoSub ClearForm
|
||||
end else
|
||||
End_Dialog(@Window, True$)
|
||||
end
|
||||
End Case
|
||||
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error parsing tool scan data.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Invalid Tool Barcode Scan.'
|
||||
end
|
||||
end else
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = 'Verification process canceled'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
End_Dialog(@Window, False$)
|
||||
end
|
||||
If ErrorMsg NE '' then
|
||||
@ -624,9 +647,3 @@ ClearForm:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user