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<5> = ToolLoc
|
||||||
LogData<6> = @Window:'.CREATE'
|
LogData<6> = @Window:'.CREATE'
|
||||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
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
|
Convert '.' to '*' in CassID
|
||||||
ExpectedQty = ''
|
ExpectedQty = ''
|
||||||
ExpectedWfrMap = ''
|
ExpectedWfrMap = ''
|
||||||
@ -115,8 +105,6 @@ Event WINDOW.CREATE(CreateParam)
|
|||||||
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
|
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
|
||||||
|
|
||||||
Begin Case
|
Begin Case
|
||||||
Case (CassID NE '' AND QAMetComplete EQ False$)
|
|
||||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
|
||||||
Case ( (CassID EQ '') and (ToolLoc EQ '') )
|
Case ( (CassID EQ '') and (ToolLoc EQ '') )
|
||||||
// Alternate workflow
|
// Alternate workflow
|
||||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
|
||||||
@ -333,42 +321,32 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
|||||||
Begin Case
|
Begin Case
|
||||||
Case RowExists('RDS', CassetteID)
|
Case RowExists('RDS', CassetteID)
|
||||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||||
If QAMetComplete EQ True$ then
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||||
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)
|
||||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
If Error_Services('NoError') then
|
||||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
ExpectedWfrMap = CurrWfrMap
|
||||||
If Error_Services('NoError') then
|
|
||||||
ExpectedWfrMap = CurrWfrMap
|
|
||||||
end else
|
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
|
||||||
end
|
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
|
|
||||||
Case RowExists('WM_OUT', CassetteID)
|
Case RowExists('WM_OUT', CassetteID)
|
||||||
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||||
If QAMetComplete EQ True$ then
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||||
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
|
||||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
ExpectedWfrMap = CurrWfrMap
|
||||||
If Error_Services('NoError') then
|
|
||||||
ExpectedWfrMap = CurrWfrMap
|
|
||||||
end else
|
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
|
||||||
end
|
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
End Case
|
End Case
|
||||||
|
|
||||||
If ErrorMsg EQ '' then
|
If ErrorMsg EQ '' then
|
||||||
@ -423,7 +401,7 @@ end event
|
|||||||
|
|
||||||
|
|
||||||
Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||||
|
|
||||||
If Flag EQ 1 then
|
If Flag EQ 1 then
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
ScanData = Get_Property(CtrlEntID, 'TEXT')
|
ScanData = Get_Property(CtrlEntID, 'TEXT')
|
||||||
@ -438,110 +416,155 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
|||||||
Cnt = DCount(ScanData, '|')
|
Cnt = DCount(ScanData, '|')
|
||||||
If Cnt EQ 2 then
|
If Cnt EQ 2 then
|
||||||
WaferSize = Field(ScanData, '|', 1)
|
WaferSize = Field(ScanData, '|', 1)
|
||||||
Area = Field(ScanData, '|', 2)
|
Area = Field(ScanData, '|', 2) ; // This is a proxy for the operation being performed
|
||||||
Def = ""
|
|
||||||
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
If Area EQ 'FQA' then
|
||||||
Def<MTYPE$> = "U"
|
CassetteID = Get_Property(@Window:'.EDL_CASS_ID', 'TEXT')
|
||||||
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
|
Begin Case
|
||||||
MsgUp = Msg(@window, Def) ;* display the processing message
|
Case RowExists('RDS', CassetteID)
|
||||||
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
|
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
Msg(@window, MsgUp) ;* take down the processing message
|
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||||
If Error_Services('NoError') then
|
If QAMetComplete EQ True$ then
|
||||||
objJSON = ''
|
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||||
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||||
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
|
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||||
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
|
|
||||||
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
|
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
SRP_JSON(objJSON, 'Release')
|
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||||
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
|
If Error_Services('NoError') then
|
||||||
If Error_Services('NoError') then
|
ExpectedWfrMap = CurrWfrMap
|
||||||
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
|
end else
|
||||||
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
|
end
|
||||||
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
|
end else
|
||||||
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
|
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||||
RowIndex = 1
|
end
|
||||||
ResultArray = ''
|
Case RowExists('WM_OUT', CassetteID)
|
||||||
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
|
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
|
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||||
For SlotIndex = 1 to 25
|
If QAMetComplete EQ True$ then
|
||||||
SlotFilled = SlotMap[SlotIndex, 1]
|
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||||
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||||
ResultArray<1, SlotIndex> = 26 - SlotIndex
|
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||||
If SlotFilled EQ ExpectedVal then
|
|
||||||
ResultArray<2, SlotIndex> = ''
|
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||||
end else
|
If Error_Services('NoError') then
|
||||||
ResultArray<2, SlotIndex> = 'Error'
|
ExpectedWfrMap = CurrWfrMap
|
||||||
end
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
RowIndex += 1
|
end
|
||||||
Next SlotIndex
|
end else
|
||||||
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
|
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||||
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
|
end
|
||||||
|
End Case
|
||||||
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
|
||||||
|
|
||||||
|
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
|
end else
|
||||||
ErrorMsg = 'Invalid Tool Barcode Scan.'
|
ErrorMsg = 'Invalid Tool Barcode Scan.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
|
|
||||||
LogData = ''
|
LogData = ''
|
||||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||||
LogData<2> = @User4
|
LogData<2> = @User4
|
||||||
LogData<3> = 'Verification process canceled'
|
LogData<3> = 'Verification process canceled'
|
||||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||||
|
|
||||||
End_Dialog(@Window, False$)
|
End_Dialog(@Window, False$)
|
||||||
end
|
end
|
||||||
If ErrorMsg NE '' then
|
If ErrorMsg NE '' then
|
||||||
@ -624,9 +647,3 @@ ClearForm:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user