1172 lines
31 KiB
Plaintext
1172 lines
31 KiB
Plaintext
COMPILE FUNCTION obj_WO_Wfr(Method,Parms)
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
/*
|
|
Methods for the WO_WFR (Wafer) Tables
|
|
3/1/2016 JCH - Initial coding
|
|
*/
|
|
|
|
DECLARE FUNCTION Get_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, obj_Tables, Reconcile_Epi_WO, obj_WO_Mat_Wfr, RetStack
|
|
DECLARE SUBROUTINE ErrMsg, Set_Status, Send_Dyn, FieldStore, obj_Tables, obj_WO_Wfr, Clear_Table, obj_WO_Mat_Wfr, Set_Property
|
|
DECLARE SUBROUTINE Rlist, obj_Tool_Wfr, obj_Location, obj_Notes
|
|
|
|
DECLARE FUNCTION Environment_Services
|
|
|
|
$INSERT WO_LOG_EQUATES
|
|
$INSERT WO_MAT_EQUATES
|
|
$INSERT WM_IN_EQUATES
|
|
$INSERT WM_OUT_EQUATES
|
|
$INSERT RDS_EQUATES
|
|
$INSERT WO_WFR_EQUATES
|
|
$Insert WO_MAT_WFR_EQUATES
|
|
$Insert TW_USE_EQUATES
|
|
$Insert NCR_EQUATES
|
|
$Insert RLIST_Equates
|
|
|
|
EQU CRLF$ TO \0D0A\
|
|
EQU TAB$ TO \09\
|
|
|
|
EQU WAFER_ID$ TO 1 ;* Columns in data structure returned by Reconcile_Epi_Pro
|
|
EQU LOT_NO$ TO 2
|
|
EQU LOADED_INTO$ TO 3
|
|
EQU RAN_IN$ TO 4
|
|
EQU POCKET_CHAR$ TO 5
|
|
EQU UNLOADED_INTO$ TO 6
|
|
EQU WAFER_DISP$ TO 7
|
|
|
|
EQU TRACE_DTM$ TO 1
|
|
EQU TRACE_BY$ TO 2
|
|
EQU TRACE_EVENT$ TO 3
|
|
EQU TRACE_SLOT_ID$ TO 4
|
|
EQU TRACE_RUN_LOC$ TO 5
|
|
EQU TRACE_CARR_SLOT$ TO 6
|
|
EQU TRACE_INV_LOC$ TO 7
|
|
EQU TRACE_TOOL_ID$ TO 8
|
|
EQU TRACE_TW_USE$ TO 9
|
|
EQU TRACE_NCR_NO$ TO 10
|
|
|
|
|
|
ErrTitle = 'Error in Stored Procedure "obj_WO_Wfr"'
|
|
ErrorMsg = ''
|
|
ErrCode = ''
|
|
|
|
IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
|
|
IF NOT(ASSIGNED(Parms)) THEN Parms = ''
|
|
|
|
IF ErrorMsg NE '' THEN
|
|
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
|
RETURN ''
|
|
END
|
|
|
|
Result = ''
|
|
|
|
BEGIN CASE
|
|
CASE Method = 'SetProp' ; Gosub SetProp
|
|
CASE Method = 'CassRel' ; Gosub CassRel
|
|
Case Method = 'AddEvent' ; Gosub AddEvent
|
|
Case Method = 'RemEvent' ; Gosub RemEvent
|
|
Case Method = 'CurrLoc' ; Gosub CurrLoc
|
|
Case Method = 'GetET' ; Gosub GetET
|
|
CASE Method = 'Convert' ; Gosub Convert
|
|
CASE Method = 'Disp' ; Gosub Disp
|
|
Case Method = 'CassDel' ; Gosub CassDel
|
|
CASE Method = 'LoadFromSlot' ; Gosub LoadFromSlot
|
|
CASE Method = 'UnloadIntoSlot' ; Gosub UnloadIntoSlot
|
|
CASE Method = 'InSlotDisp' ; Gosub InSlotDisp
|
|
CASE Method = 'OutSlotDisp' ; Gosub OutSlotDisp
|
|
CASE Method = 'TestAddEvent' ; Gosub TestAddEvent
|
|
CASE Method = 'TraceData' ; Gosub TraceData
|
|
CASE 1
|
|
NULL
|
|
END CASE
|
|
|
|
IF ErrorMsg NE '' THEN
|
|
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
|
END
|
|
|
|
RETURN Result
|
|
|
|
|
|
* * * * * * *
|
|
SetProp:
|
|
* * * * * * *
|
|
|
|
**** NO MULTIVALUE FIELDS HERE ****
|
|
|
|
WOWfrKey = Parms[1,@RM]
|
|
FieldNos = Parms[COL2()+1,@RM]
|
|
FieldValues = Parms[COL2()+1,@RM]
|
|
|
|
IF WOWfrKey = '' THEN ErrorMsg = 'Null parameter "WOMWfrKey" passed to routine. (':Method:')'
|
|
IF FieldNos = '' THEN ErrorMsg = 'Null parameter "FieldNos" passed to routine. (':Method:')'
|
|
|
|
If ErrorMsg NE '' Then RETURN
|
|
|
|
otParms = 'WO_WFR':@RM:WOWfrKey
|
|
WOWfrRec = obj_Tables('ReadRec',otParms)
|
|
|
|
fCnt = COUNT(FieldNos,@VM) + (FieldNos NE '')
|
|
|
|
FOR I = 1 TO fCnt
|
|
FieldNo = FieldNos<1,I>
|
|
FieldValue = FieldValues<1,I>
|
|
WOWfrRec<FieldNo> = FieldValue ;* No check for any ICONV stuff so pass it in converted
|
|
NEXT I
|
|
|
|
otParms = FIELDSTORE(otParms,@RM,4,0,WOWfrRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
CassRel:
|
|
* * * * * * *
|
|
|
|
WOMatKey = Parms[1,@RM]
|
|
|
|
If WOMatKey = '' Then Return
|
|
|
|
WfrQty = Xlate('WO_MAT',WOMatKey,WO_MAT_WAFER_QTY$,'X')
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
WfrIDs = '' ;* Added 9/7/2016 JCH
|
|
NewSlotIDs = '' ;* Added 9/7/2016 JCH
|
|
|
|
For I = 1 To WfrQty
|
|
|
|
WfrIDs<1,-1> = WOMatKey:'*':I ;* Added 9/7/2016 JCH
|
|
NewSlotIDs<1,-1> = WOMatKey:'*':I ;* Added 9/7/2016 JCH
|
|
|
|
owwParms = WOMatKey:'*':I:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'REL':@RM ;* Event
|
|
owwParms := WOMatKey:'*':I:@RM ;* New Slot ID
|
|
owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := '':@RM ;* Current Slot ID
|
|
owwParms := '':@RM ;* New ToolID
|
|
owwParms := '':@RM ;* Curr Tool ID
|
|
owwParms := '':@RM ;* NewInvLoc
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'I' ;* Wfr Side
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
Next I
|
|
|
|
|
|
Return
|
|
|
|
|
|
* * * * * * *
|
|
AddEvent:
|
|
* * * * * * *
|
|
|
|
WfrID = Parms[1,@RM] ;* mv
|
|
EventDtm = Parms[COL2()+1,@RM]
|
|
EventBy = Parms[COL2()+1,@RM]
|
|
Event = Parms[COL2()+1,@RM]
|
|
NewSlotID = Parms[COL2()+1,@RM] ;* mv
|
|
RunLoc = Parms[COL2()+1,@RM] ;* mv
|
|
NCRNo = Parms[COL2()+1,@RM]
|
|
TWUse = Parms[COL2()+1,@RM]
|
|
CurrSlotID = Parms[COL2()+1,@RM] ;* mv
|
|
NewToolID = Parms[COL2()+1,@RM]
|
|
CurrToolID = Parms[COL2()+1,@RM]
|
|
NewInvLoc = Parms[COL2()+1,@RM]
|
|
CurrInvLoc = Parms[COL2()+1,@RM]
|
|
WfrSide = Parms[COL2()+1,@RM]
|
|
NewCarrLoc = Parms[COL2()+1,@RM] ;* mv Added 6/20/2016 JCH
|
|
CurrCarrLoc = Parms[COL2()+1,@RM] ;* mv Added 6/20/2016 JCH
|
|
Scribe = Parms[COL2()+1,@RM] ;* mv Added 6/20/2016 JCH
|
|
|
|
If WfrID = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')'
|
|
If Event = '' THEN ErrorMsg = 'Null Parameter "EventEvent" passed to routine. (':Method:')'
|
|
|
|
If EventDTM NE '' THEN
|
|
thisEventDTM = ICONV(EventDTM,'DT')
|
|
If thisEventDTM = '' THEN ErrorMsg = 'Invalid Parameter EventDTM ':Quote(EventDTM):' passed to routine. (':Method:')'
|
|
|
|
If ErrorMsg NE '' Then RETURN
|
|
End
|
|
|
|
* REL - Release is the initial entry into the Wafer history so no check for a Current location
|
|
|
|
IF Event NE 'REL' THEN
|
|
IF CurrSlotID = '' AND CurrToolID = '' AND CurrInvLoc = '' AND CurrCarrLoc = '' AND TWUse = '' AND NCRNo = '' THEN
|
|
ErrorMsg = 'Wafer has been dispositioned.'
|
|
|
|
Recipients = Xlate('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
|
|
SentFrom = @USER4
|
|
Subject = 'Wafer has been dispositioned.'
|
|
Message = "WfrID":TAB$:WfrID:CRLF$
|
|
Message := 'EventDTM:':TAB$:EventDTM:CRLF$
|
|
Message := 'Event:':TAB$:Event:CRLF$
|
|
Message := 'NewSlotID:':TAB$:NewSlotID:CRLF$
|
|
Message := 'RunLoc:':TAB$:RunLoc:CRLF$
|
|
Message := 'NCRNo:':TAB$:NCRNo:CRLF$
|
|
Message := 'TWUse:':TAB$:TWUse:CRLF$
|
|
Message := 'CurrSlotID:':TAB$:CurrSlotID:CRLF$
|
|
Message := 'NewToolID:':TAB$:NewToolID:CRLF$
|
|
Message := 'CurrToolID:':TAB$:CurrToolID:CRLF$
|
|
Message := 'NewInvLoc:':TAB$:NewInvLoc:CRLF$
|
|
Message := 'CurrInvLoc:':TAB$:CurrInvLoc:CRLF$
|
|
Message := 'WfrSide:':TAB$:WfrSide:CRLF$
|
|
Message := 'NewCarrLoc:':TAB$:NewCarrLoc:CRLF$
|
|
Message := 'CurrCarrLoc:':TAB$:CurrCarrLoc:CRLF$
|
|
Message := 'Scribe:':TAB$:Scribe:CRLF$
|
|
|
|
AttachWindow = ''
|
|
AttachKey = ''
|
|
SendToGroup = ''
|
|
|
|
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
|
obj_Notes('Create',Parms)
|
|
RETURN
|
|
END
|
|
END
|
|
|
|
|
|
* * * Added 9/21/2016 JCH * * * - Troubleshooting WIP problem "%$((!"
|
|
|
|
AuditWfrID = WfrID
|
|
CONVERT '*' TO '.' IN AuditWfrID
|
|
|
|
AuditDTM = ICONV(EventDTM,'DT')
|
|
|
|
AuditKey = AuditWfrID:'*':AuditDTM:'*':EventBy:'*':Event
|
|
AuditRec = NewSlotID:@FM
|
|
AuditRec := RunLoc:@FM
|
|
AuditRec := NCRNo:@FM
|
|
AuditRec := TWUse:@FM
|
|
AuditRec := CurrSlotID:@FM
|
|
AuditRec := NewToolID:@FM
|
|
AuditRec := CurrToolID:@FM
|
|
AuditRec := NewInvLoc:@FM
|
|
AuditRec := CurrInvLoc:@FM
|
|
AuditRec := WfrSide:@FM
|
|
AuditRec := NewCarrLoc:@FM
|
|
AuditRec := CurrCarrLoc:@FM
|
|
AuditRec := Scribe
|
|
|
|
aotParms = 'WO_WFR_AUDIT':@RM:AuditKey:@RM:'':@RM:AuditRec
|
|
obj_Tables('WriteRec',aotParms)
|
|
|
|
* * * * * * *
|
|
|
|
CONVERT '.' TO '*' IN WfrID
|
|
CONVERT '.' TO '*' IN NewSlotID
|
|
CONVERT '.' TO '*' IN CurrSlotID
|
|
|
|
IF NewSlotID NE '' THEN
|
|
NewSlotIDCassNo = FIELD(NewSlotID,'*',2)
|
|
|
|
IF NewSlotIDCassNo = '' THEN
|
|
RETURN
|
|
END
|
|
END
|
|
|
|
|
|
otParms = 'WO_WFR':@RM:WfrID
|
|
WfrRec = obj_Tables('ReadRec',otParms)
|
|
IF Get_Status(errCode) THEN
|
|
ErrMsg(errCode)
|
|
RETURN
|
|
END
|
|
|
|
If EventDTM = '' Then
|
|
|
|
ExistDTMs = WfrRec<WO_WFR_LOC_DTM$>
|
|
|
|
IF ExistDTMs = '' THEN
|
|
|
|
thisEventDTM = ICONV( OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT' )
|
|
|
|
END ELSE
|
|
Loop
|
|
TestChar = ExistDTMs[-1,1]
|
|
Until TestChar NE @VM Or ExistDTMs = ''
|
|
ExistDTMs[-1,1] = ''
|
|
Repeat
|
|
LastDTM = ExistDTMs[-1,'B':@VM]
|
|
thisEventDTM = LastDTM + ( 1/24 ) ;* Fake a time for this 1 hour after last transaction.
|
|
|
|
END ;* End check for Existing DTMs
|
|
|
|
End
|
|
|
|
If EventBy = '' Then
|
|
EventBy = 'OI' ;* Admin user
|
|
End
|
|
|
|
Locate thisEventDTM In WfrRec<WO_WFR_LOC_DTM$> BY 'AR' SETTING Pos THEN
|
|
obj_Tables('UnlockRec',otParms)
|
|
|
|
IF Get_Status(ErrCode) THEN
|
|
ErrMsg(errCode)
|
|
END
|
|
|
|
END ELSE
|
|
* IF Scribe NE '' AND WfrRec<WO_WFR_SCRIBE$> = '' THEN
|
|
* WfrRec<WO_WFR_SCRIBE$> = Scribe ;* Added 9/7/2016 JCH
|
|
* END
|
|
|
|
DestTest = XLATE('TOOL',NewToolID,'DEST_TEST','X') ;* Tool Start on destructive test
|
|
|
|
IF DestTest AND WfrRec<WO_WFR_BROKEN$> = '' THEN
|
|
WfrRec<WO_WFR_BROKEN$> = 1
|
|
END
|
|
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_DTM$,Pos,0,thisEventDTM)
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_BY$,Pos,0,EventBy)
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_EVENT$,Pos,0,Event)
|
|
WfrRec = Insert(WfrRec,WO_WFR_SLOT_ID$,Pos,0,NewSlotID)
|
|
WfrRec = Insert(WfrRec,WO_WFR_RUN_LOC$,Pos,0,RunLoc)
|
|
WfrRec = Insert(WfrRec,WO_WFR_WMI_NCR_NO$,Pos,0,NCRNo)
|
|
WfrRec = Insert(WfrRec,WO_WFR_TW_USE$,Pos,0,TWUse)
|
|
WfrRec = Insert(WfrRec,WO_WFR_TOOL_ID$,Pos,0,NewToolID)
|
|
WfrRec = Insert(WfrRec,WO_WFR_INV_LOC$,Pos,0,NewInvLoc)
|
|
WfrRec = Insert(WfrRec,WO_WFR_WFR_SIDE$,Pos,0,WfrSide) ;* Added 5/28/2016 JCH
|
|
WfrRec = Insert(WfrRec,WO_WFR_CARR_SLOT$,Pos,0,NewCarrLoc) ;* Added 6/20/2016 JCH
|
|
|
|
otParms = FieldStore(otParms,@RM,4,0,WfrRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
IF Get_Status(ErrCode) THEN
|
|
ErrMsg(errCode)
|
|
END
|
|
|
|
BEGIN CASE
|
|
CASE NewSlotID = '' AND CurrSlotID NE ''
|
|
obj_WO_Mat_Wfr('ClearWfrID',CurrSlotID:@RM:@RM:WfrSide) ;* Removes wafer from slot in WO_MAT_WFR record
|
|
|
|
CASE NewSlotID NE '' AND CurrSlotID NE ''
|
|
obj_WO_Mat_Wfr('SetWfrID',NewSlotID:@RM:WfrID:@RM:WfrSide) ;* Adds Wafer ID to NewSlotID in WO_MAT_WFR table
|
|
obj_WO_Mat_Wfr('ClearWfrID',CurrSlotID:@RM:@RM:WfrSide) ;* Removes wafer from CurrSlotIDin WO_MAT_WFR record
|
|
|
|
CASE NewSlotID NE '' AND CurrSlotID = ''
|
|
obj_WO_Mat_Wfr('SetWfrID',NewSlotID:@RM:WfrID:@RM:WfrSide) ;* Adds Wafer ID to NewSlotID in WO_MAT_WFR table
|
|
|
|
CASE 1
|
|
NULL
|
|
|
|
END Case
|
|
|
|
|
|
BEGIN CASE
|
|
CASE NewToolID = '' AND CurrToolID NE ''
|
|
obj_Tool_Wfr('ClearWfrID',CurrToolID:@RM:WfrID) ;* Removes wafer from Tool_WFR record
|
|
|
|
CASE NewToolID NE '' AND CurrToolID NE ''
|
|
obj_Tool_Wfr('SetWfrID',NewToolID:@RM:WfrID) ;* Adds Wafer ID to NewToolID IN TOOL_WFR table
|
|
obj_Tool_Wfr('ClearWfrID',CurrToolID) ;* Removes wafer from CurrToolID in TOOL_WFR record
|
|
|
|
CASE NewToolID NE '' AND CurrToolID = ''
|
|
obj_Tool_Wfr('SetWfrID',NewToolID:@RM:WfrID) ;* Adds Wafer ID to NewTOOLID IN TOOL_WFR table
|
|
|
|
CASE 1
|
|
NULL
|
|
|
|
END Case
|
|
|
|
BEGIN CASE
|
|
CASE NewInvLoc = '' AND CurrInvLoc NE ''
|
|
obj_Location('ClearWfrID',CurrInvLoc:@RM:WfrID) ;* Removes wafer from Location record
|
|
|
|
CASE NewInvLoc NE '' AND CurrInvLoc NE ''
|
|
obj_Location('SetWfrID',NewInvLoc:@RM:WfrID) ;* Adds Wafer ID to WFR_ID field IN LOCATION table
|
|
obj_Location('ClearWfrID',CurrInvLoc:@RM:WfrID) ;* Removes wafer from WFR_ID field in LOCATION record
|
|
|
|
CASE NewInvLoc NE '' AND CurrInvLoc = ''
|
|
obj_Location('SetWfrID',NewInvLoc:@RM:WfrID) ;* Adds Wafer ID to WFR_ID field IN LOCATION table
|
|
|
|
CASE 1
|
|
NULL
|
|
|
|
END Case
|
|
|
|
END
|
|
|
|
Return
|
|
|
|
**********************************************************************************************************************
|
|
|
|
* * * * * * *
|
|
TestAddEvent:
|
|
* * * * * * *
|
|
|
|
WfrIDs = Parms[1,@RM] ;* mv
|
|
EventDtm = Parms[COL2()+1,@RM]
|
|
EventBy = Parms[COL2()+1,@RM]
|
|
Event = Parms[COL2()+1,@RM]
|
|
NewSlotIDs = Parms[COL2()+1,@RM] ;* mv
|
|
RunLocs = Parms[COL2()+1,@RM] ;* mv
|
|
NCRNo = Parms[COL2()+1,@RM]
|
|
TWUse = Parms[COL2()+1,@RM]
|
|
CurrSlotIDs = Parms[COL2()+1,@RM] ;* mv
|
|
NewToolID = Parms[COL2()+1,@RM]
|
|
CurrToolID = Parms[COL2()+1,@RM]
|
|
NewInvLoc = Parms[COL2()+1,@RM]
|
|
CurrInvLoc = Parms[COL2()+1,@RM]
|
|
WfrSide = Parms[COL2()+1,@RM]
|
|
NewCarrLocs = Parms[COL2()+1,@RM] ;* mv Added 6/20/2016 JCH
|
|
CurrCarrLocs = Parms[COL2()+1,@RM] ;* mv Added 6/20/2016 JCH
|
|
Scribes = Parms[COL2()+1,@RM] ;* Added 6/20/2016 JCH
|
|
|
|
If WfrIDs = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')'
|
|
If Event = '' THEN ErrorMsg = 'Null Parameter "EventEvent" passed to routine. (':Method:')'
|
|
|
|
If EventDTM NE '' THEN
|
|
thisEventDTM = ICONV(EventDTM,'DT')
|
|
If thisEventDTM = '' THEN ErrorMsg = 'Invalid Parameter EventDTM ':Quote(EventDTM):' passed to routine. (':Method:')'
|
|
|
|
If ErrorMsg NE '' Then RETURN
|
|
End
|
|
|
|
CONVERT '.' TO '*' IN WfrIDs
|
|
CONVERT '.' TO '*' IN NewSlotIDs
|
|
CONVERT '.' TO '*' IN CurrSlotIDs
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrMsg(errCode)
|
|
RETURN
|
|
END
|
|
|
|
|
|
* * * Added 9/21/2016 JCH * * * - Troubleshooting WIP problem "%$((!"
|
|
|
|
OPEN 'WO_WFR_AUDIT' TO AuditFile THEN
|
|
|
|
AuditWfrID = WfrIDs<1,1>
|
|
CONVERT '*' TO '.' IN AuditWfrID
|
|
|
|
AuditDTM = ICONV(EventDTM,'DT')
|
|
|
|
AuditKey = AuditWfrID:'*':AuditDTM:'*':EventBy:'*':Event
|
|
AuditRec = NewSlotIDs:@FM
|
|
AuditRec := RunLocs:@FM
|
|
AuditRec := NCRNo:@FM
|
|
AuditRec := TWUse:@FM
|
|
AuditRec := CurrSlotIDs:@FM
|
|
AuditRec := NewToolID:@FM
|
|
AuditRec := CurrToolID:@FM
|
|
AuditRec := NewInvLoc:@FM
|
|
AuditRec := CurrInvLoc:@FM
|
|
AuditRec := WfrSide:@FM
|
|
AuditRec := NewCarrLocs:@FM
|
|
AuditRec := CurrCarrLocs:@FM
|
|
AuditRec := Scribes:@FM
|
|
AuditRec := WfrIDs
|
|
|
|
WRITE AuditRec ON AuditFile,AuditKey ELSE
|
|
ErrMsg(ErrCode)
|
|
END
|
|
END
|
|
|
|
* * * * * * *
|
|
|
|
If EventDTM = '' Then
|
|
|
|
ExistDTMs = WfrRec<WO_WFR_LOC_DTM$>
|
|
|
|
IF ExistDTMs = '' THEN
|
|
|
|
thisEventDTM = ICONV( OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT' )
|
|
|
|
END ELSE
|
|
Loop
|
|
TestChar = ExistDTMs[-1,1]
|
|
Until TestChar NE @VM Or ExistDTMs = ''
|
|
ExistDTMs[-1,1] = ''
|
|
Repeat
|
|
LastDTM = ExistDTMs[-1,'B':@VM]
|
|
thisEventDTM = LastDTM + ( 1/24 ) ;* Fake a time for this 1 hour after last transaction.
|
|
|
|
END ;* End check for Existing DTMs
|
|
|
|
End
|
|
|
|
If EventBy = '' Then
|
|
EventBy = 'OI' ;* Admin user
|
|
End
|
|
|
|
* * * * * Process Wafers * * * * *
|
|
|
|
WOMatWfrKeys = ''
|
|
WOMatWfrIDs = ''
|
|
WOMatWfrCnts = ''
|
|
WOMatNewSlotIDs = ''
|
|
WOMatCurrSlotIDs = ''
|
|
|
|
ToolNewWfrIDs = ''
|
|
ToolCurrWfrIDs = ''
|
|
|
|
LocNewWfrIDs = ''
|
|
LocCurrWfrIDs = ''
|
|
|
|
wCnt = COUNT(WfrIDs,@VM) + (WfrIDs NE '')
|
|
|
|
* * * * * Build Key Lists for calls to obj_WO_Mat_Wfr('SetWfrIDs' and 'ClearWfrIDs'
|
|
|
|
FOR I = 1 TO wCnt
|
|
|
|
WfrID = WfrIDs<1,I>
|
|
NewSlotID = NewSlotIDs<1,I>
|
|
CurrSlotID = CurrSlotIDs<1,I>
|
|
RunLoc = RunLocs<1,I>
|
|
NewCarrLoc = NewCarrLocs<1,I> ;* Doesn't seem to be used!
|
|
CurrCarrLoc = CurrCarrLocs<1,I> ;* Doesn't seem to be used!
|
|
Scribe = Scribes<1,I>
|
|
|
|
IF NewSlotID NE '' OR CurrSlotID NE '' THEN
|
|
|
|
WOMatKey = FIELD(WfrID,'*',1,2)
|
|
|
|
LOCATE WOMatKey IN WOMatWfrKeys USING @FM SETTING Pos THEN
|
|
LineCnt = WOMatWfrCnts<Pos> + 1
|
|
WOMatWfrCnts<Pos> = LineCnt
|
|
|
|
WOMatWfrIDs = INSERT(WOMatWfrIDs,Pos,LineCnt,0,WfrID)
|
|
|
|
IF NewSlotID NE '' THEN
|
|
WOMatNewSlotIDs = INSERT(WOMatNewSlotIDs,Pos,-1,0,NewSlotID)
|
|
END
|
|
|
|
IF CurrSlotID NE '' THEN
|
|
WOMatCurrSlotIDs = INSERT(WOMatCurrSlotIDs,Pos,-1,0,CurrSlotID)
|
|
END
|
|
|
|
END ELSE
|
|
WOMatWfrKeys = INSERT(WOMatWfrKeys,Pos,0,0,WOMatKey)
|
|
WOMatWfrIDs = INSERT(WOMatWfrIDs,Pos,1,0,WfrID)
|
|
WOMatWfrCnts = INSERT(WOMatWfrCnts,Pos,0,0,1)
|
|
|
|
IF NewSlotId NE '' THEN
|
|
WOMatNewSlotIDs = INSERT(WOMatNewSlotIDs,Pos,-1,0,NewSlotID)
|
|
END
|
|
|
|
IF CurrSlotId NE '' THEN
|
|
WOMatCurrSlotIDs = INSERT(WOMatCurrSlotIDs,Pos,-1,0,CurrSlotID)
|
|
END
|
|
END
|
|
|
|
END ;* End of check for slot changes
|
|
|
|
|
|
IF NewToolID NE '' THEN ToolNewWfrIds<1,-1> = WfrID
|
|
IF CurrToolID NE '' THEN ToolCurrWfrIDs<1,-1> = WfrID
|
|
|
|
IF NewInvLoc NE '' THEN LocNewWfrIDs<1,-1> = WfrID
|
|
IF CurrInvLoc NE '' THEN LocCurrWfrIDs<1,-1> = WfrID
|
|
|
|
* Update individual WO_WFR records
|
|
|
|
otParms = 'WO_WFR':@RM:WfrID
|
|
WfrRec = obj_Tables('ReadRec',otParms)
|
|
|
|
LOCATE thisEventDTM In WfrRec<WO_WFR_LOC_DTM$> BY 'AR' SETTING Pos ELSE
|
|
|
|
NULL
|
|
|
|
END
|
|
|
|
* IF Scribe NE '' AND WfrRec<WO_WFR_SCRIBE$> = '' THEN
|
|
* WfrRec<WO_WFR_SCRIBE$> = Scribe ;* Added 9/7/2016 JCH
|
|
* END
|
|
|
|
DestTest = XLATE('TOOl',NewToolID,'DEST_TEST','X') ;* Tool Start on destructive test
|
|
|
|
IF DestTest THEN
|
|
|
|
IF WfrRec<WO_WFR_BROKEN$> = 1 THEN
|
|
|
|
obj_Tables('UnlockRec',otParms) ;* Wafer already flagged as broken
|
|
|
|
END ELSE
|
|
|
|
WfrRec<WO_WFR_BROKEN$> = 1 ;* Flag the wafer as broken
|
|
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_DTM$,Pos,0,thisEventDTM)
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_BY$,Pos,0,EventBy)
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_EVENT$,Pos,0,'DEST') ;* Wafer flagged as destroyed
|
|
WfrRec = Insert(WfrRec,WO_WFR_SLOT_ID$,Pos,0,NewSlotID)
|
|
WfrRec = Insert(WfrRec,WO_WFR_RUN_LOC$,Pos,0,RunLoc)
|
|
WfrRec = Insert(WfrRec,WO_WFR_WMI_NCR_NO$,Pos,0,NCRNo)
|
|
WfrRec = Insert(WfrRec,WO_WFR_TW_USE$,Pos,0,TWUse)
|
|
WfrRec = Insert(WfrRec,WO_WFR_TOOL_ID$,Pos,0,'') ;* Wafer not logged
|
|
WfrRec = Insert(WfrRec,WO_WFR_INV_LOC$,Pos,0,NewInvLoc) ;* This is blank in this case
|
|
WfrRec = Insert(WfrRec,WO_WFR_WFR_SIDE$,Pos,0,WfrSide) ;* Added 5/28/2016 JCH
|
|
WfrRec = Insert(WfrRec,WO_WFR_CARR_SLOT$,Pos,0,NewCarrLoc) ;* Added 6/20/2016 JCH
|
|
|
|
otParms = FieldStore(otParms,@RM,4,0,WfrRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
IF Get_Status(ErrCode) THEN
|
|
ErrMsg(errCode)
|
|
END
|
|
|
|
END
|
|
|
|
END ELSE
|
|
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_DTM$,Pos,0,thisEventDTM)
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_BY$,Pos,0,EventBy)
|
|
WfrRec = Insert(WfrRec,WO_WFR_LOC_EVENT$,Pos,0,Event)
|
|
WfrRec = Insert(WfrRec,WO_WFR_SLOT_ID$,Pos,0,NewSlotID)
|
|
WfrRec = Insert(WfrRec,WO_WFR_RUN_LOC$,Pos,0,RunLoc)
|
|
WfrRec = Insert(WfrRec,WO_WFR_WMI_NCR_NO$,Pos,0,NCRNo)
|
|
WfrRec = Insert(WfrRec,WO_WFR_TW_USE$,Pos,0,TWUse)
|
|
WfrRec = Insert(WfrRec,WO_WFR_TOOL_ID$,Pos,0,NewToolID)
|
|
WfrRec = Insert(WfrRec,WO_WFR_INV_LOC$,Pos,0,NewInvLoc)
|
|
WfrRec = Insert(WfrRec,WO_WFR_WFR_SIDE$,Pos,0,WfrSide) ;* Added 5/28/2016 JCH
|
|
WfrRec = Insert(WfrRec,WO_WFR_CARR_SLOT$,Pos,0,NewCarrLoc) ;* Added 6/20/2016 JCH
|
|
|
|
otParms = FieldStore(otParms,@RM,4,0,WfrRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
IF Get_Status(ErrCode) THEN
|
|
ErrMsg(errCode)
|
|
END
|
|
|
|
END ; * end of check for destructive test
|
|
|
|
NEXT I
|
|
|
|
IF WOMatWfrKeys NE '' THEN
|
|
|
|
wmCnt = COUNT(WOMatWfrKeys,@FM) + (WOMatWfrKeys NE '')
|
|
|
|
FOR I = 1 TO wmCnt
|
|
WOMatKey = WOMatWfrKeys<I>
|
|
WfrIDs = WOMatWfrIDs<I>
|
|
NewSlotIDs = WOMatNewSlotIDs<I>
|
|
CurrSlotIDs = WOMatCurrSlotIDs<I>
|
|
|
|
IF CurrSlotIDs NE '' THEN obj_WO_Mat_Wfr('ClearWfrIDS',WOMatKey:@RM:CurrSlotIDs:@RMWfrIDs:@RM:WfrSide)
|
|
IF NewSlotIDs NE '' THEN obj_WO_Mat_Wfr('SetWfrIDS',WOMatKey:@RM:NewSlotIDs:@RMWfrIDs:@RM:WfrSide)
|
|
|
|
NEXT I
|
|
|
|
END ;* End of check for WO_Mat keys
|
|
|
|
IF ToolCurrWfrIDs NE '' THEN obj_Tool_Wfr('ClearWfrID',CurrToolID:@RM:ToolCurrWfrIDs)
|
|
IF ToolNewWfrIDs NE '' THEN obj_Tool_Wfr('SetWfrID',NewToolID:@RM:ToolNewWfrIDs)
|
|
|
|
IF LocCurrWfrIDs NE '' THEN obj_Location('ClearWfrID',CurrInvLoc:@RM:LocCurrWfrIDs)
|
|
IF LocNewWfrIDs NE '' THEN obj_Location('SetWfrID',NewInvLoc:@RM:LocNewWfrIDs)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
RemEvent:
|
|
* * * * * * *
|
|
|
|
* * * Removes NCR or TEST from history if they are the last event recorded * * *
|
|
|
|
WfrID = Parms[1,@RM]
|
|
Event = Parms[COL2()+1,@RM]
|
|
EventID = Parms[COL2()+1,@RM]
|
|
|
|
If WfrID = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')'
|
|
If Event = '' THEN ErrorMsg = 'Null Parameter "Event" passed to routine. (':Method:')'
|
|
|
|
If ErrorMsg NE '' Then Return
|
|
|
|
If Event NE 'NCR' And Event NE 'TEST' Then
|
|
ErrorMsg = 'Only NCR or TEST events may be removed. Event = ':QUOTE(Event)
|
|
Return
|
|
END
|
|
|
|
otParms = 'WO_WFR':@RM:WfrID
|
|
WfrRec = obj_Tables('ReadRec',otParms)
|
|
|
|
IF WfrRec = '' THEN
|
|
obj_Tables('UnlockRec',otParms)
|
|
RETURN
|
|
END
|
|
|
|
BEGIN CASE
|
|
|
|
CASE Event = 'NCR' ; EventFieldNo = WO_WFR_WMI_NCR_NO$
|
|
CASE Event = 'TEST' ; EventFieldNo = WO_WFR_TW_USE$
|
|
CASE Event = ''
|
|
obj_Tables('UnlockRec',otParms)
|
|
RETURN
|
|
|
|
END CASE
|
|
|
|
Locate EventID In WfrRec<EventFieldNo> USING @VM SETTING Pos Then
|
|
|
|
NewSlotID = WfrRec<WO_WFR_SLOT_ID$,Pos - 1>
|
|
|
|
If NewSlotID NE '' THEN
|
|
obj_WO_Mat_Wfr('SetWfrID',NewSlotID:@RM:WfrID) ;* Adds Wafer ID to NewSlotID in WO_MAT_WFR table
|
|
End
|
|
|
|
WfrRec = Delete(WfrRec,WO_WFR_LOC_DTM$,Pos,0)
|
|
WfrRec = Delete(WfrRec,WO_WFR_LOC_BY$,Pos,0)
|
|
WfrRec = Delete(WfrRec,WO_WFR_LOC_EVENT$,Pos,0)
|
|
WfrRec = Delete(WfrRec,WO_WFR_SLOT_ID$,Pos,0)
|
|
WfrRec = Delete(WfrRec,WO_WFR_RUN_LOC$,Pos,0)
|
|
WfrRec = Delete(WfrRec,WO_WFR_WMI_NCR_NO$,Pos,0)
|
|
WfrRec = Delete(WfrRec,WO_WFR_TW_USE$,Pos,0)
|
|
|
|
otParms = FieldStore(otParms,@RM,4,1,WfrRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
End Else
|
|
|
|
obj_Tables('UnlockRec',otParms)
|
|
|
|
End
|
|
|
|
Return
|
|
|
|
|
|
* * * * * * *
|
|
CurrLoc:
|
|
* * * * * * *
|
|
|
|
IF NOT(ASSIGNED(WfrID)) THEN WfrID = Parms[1,@RM]
|
|
IF NOT(ASSIGNED(WfrRec)) THEN WfrRec = Parms[COL2()+1,@RM]
|
|
|
|
IF WfrID = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
|
|
|
IF WfrRec = '' THEN WfrRec = XLATE('WO_WFR',WfrID,'','X')
|
|
|
|
NcrNos = WfrRec<WO_WFR_WMI_NCR_NO$>
|
|
TWNos = WfrRec<WO_WFR_TW_USE$>
|
|
|
|
CONVERT @VM TO '' IN NcrNos
|
|
CONVERT @VM TO '' IN TWNos
|
|
|
|
IF NcrNos NE '' OR TWNos NE '' THEN RETURN ;* Wafer is no longer in the active tracking system
|
|
|
|
WfrEvents = WfrRec<WO_WFR_LOC_EVENT$>
|
|
|
|
CurrLoc = ''
|
|
weCnt = Count(WfrEvents,@VM) + (WfrEvents NE '')
|
|
|
|
For M = WeCnt To 1 STEP -1
|
|
|
|
WfrEvent = WfrEvents<1,M>
|
|
SlotLoc = WfrRec<WO_WFR_SLOT_ID$,M>
|
|
CassID = FIELD(SlotLoc,'*',1,2)
|
|
ToolLoc = WfrRec<WO_WFR_TOOL_ID$,M>
|
|
InvIDLoc = WfrRec<WO_WFR_INV_LOC$,M>
|
|
|
|
If CassID NE '' Then CurrLoc<1,1> = CassID
|
|
IF SlotLoc NE '' Then CurrLoc<1,2> = SlotLoc
|
|
If ToolLoc NE '' Then CurrLoc<1,3> = ToolLoc
|
|
If InvIDLoc NE '' Then CurrLoc<1,4> = InvIDLoc
|
|
|
|
While CurrLoc = ''
|
|
Next M
|
|
|
|
Result = CurrLoc
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
GetET:
|
|
* * * * * * *
|
|
|
|
* Returns time in Hours since last event happened
|
|
|
|
WfrID = Parms[1,@RM]
|
|
WfrRec = Parms[COL2()+1,@RM]
|
|
|
|
IF WfrID = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
|
IF WfrRec = '' THEN WfrRec = XLATE('WO_WFR',WfrID,'','X')
|
|
|
|
LocDTMs = WfrRec<WO_WFR_LOC_DTM$>
|
|
LocCnt = COUNT(LocDTMs,@VM) + (LocDTMs NE '')
|
|
LastDTM = LocDTMs<1,LocCnt>
|
|
|
|
IF LastDTM = '' THEN RETURN ;* Bail
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTH')
|
|
CurrDTM = ICONV(CurrDTM , 'DT' )
|
|
|
|
IF CurrDTM > LastDTM THEN
|
|
Result = OCONV(ICONV( (CurrDTM - LastDTM)*24 , 'MD1'), 'MD1') ;* Elapsed time in hours to 1 decimal precision
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
Disp:
|
|
* * * * * * *
|
|
|
|
IF NOT(ASSIGNED(WfrID)) THEN WfrID = Parms[1,@RM]
|
|
IF NOT(ASSIGNED(WfrRec)) THEN WfrRec = Parms[COL2()+1,@RM]
|
|
|
|
IF WfrID = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
|
|
|
IF WfrRec = '' THEN WfrRec = XLATE('WO_WFR',WfrID,'','X')
|
|
|
|
WfrEvents = WfrRec<WO_WFR_LOC_EVENT$>
|
|
|
|
evCnt = COUNT(WfrEvents,@VM) + ( WfrEvents NE '' )
|
|
|
|
|
|
Loaded = INDEX(WfrEvents,'LOAD',1)
|
|
Unloaded = INDEX(WfrEvents,'UNLOAD',1)
|
|
|
|
BEGIN CASE
|
|
CASE NOT(Loaded)
|
|
EpiStage = 'Pre'
|
|
CASE Loaded AND NOT(Unloaded)
|
|
EpiStage ='React'
|
|
CASE Loaded AND Unloaded
|
|
EpiStage = 'Post'
|
|
END CASE
|
|
|
|
LastEvent = WfrRec<WO_WFR_LOC_EVENT$,evCnt>
|
|
|
|
BEGIN CASE
|
|
CASE LastEvent = 'TEST'
|
|
TWKey = WfrRec<WO_WFR_TW_USE$,evCnt>
|
|
IF TWKey = '' THEN TWKey = '***'
|
|
Disp = 'TEST -> ':TWKey
|
|
CASE LastEvent = 'NCR'
|
|
Disp = 'NCR':' - ':WfrRec<WO_WFR_WMI_NCR_NO$,evCnt>:' ':WfrRec<WO_WFR_SLOT_ID$,evCnt-1>
|
|
CASE LastEvent = 'UNLOAD'
|
|
Disp = 'UNLOAD -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
|
|
CASE LastEvent = 'LOAD'
|
|
Disp = 'LOAD -> ':WfrRec<WO_WFR_RUN_LOC$,evCnt>
|
|
CASE LastEvent = 'MKUP'
|
|
Disp = 'MKUP -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
|
|
CASE LastEvent = 'MOVE'
|
|
Disp = 'MOVE -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
|
|
CASE LastEvent = 'REPLACE'
|
|
Disp = 'REPLACE -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
|
|
CASE LastEvent = 'RETURN'
|
|
Disp = 'RETURN -> ':WfrRec<WO_WFR_RUN_LOC$,evCnt>
|
|
CASE 1
|
|
Disp = 'PROD - ':WfrID
|
|
END CASE
|
|
|
|
Result = Disp
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
CassDel:
|
|
* * * * * * *
|
|
|
|
WOMatKey = Parms[1,@RM]
|
|
|
|
If WOMatKey = '' Then Return
|
|
|
|
WfrQty = Xlate('WO_MAT',WOMatKey,WO_MAT_WAFER_QTY$,'X')
|
|
|
|
otParms = 'WO_MAT_WFR':@RM:WOMatKey
|
|
obj_Tables('DeleteRec',otParms)
|
|
|
|
For I = 1 To WfrQty
|
|
otParms = 'WO_WFR':@RM:WOMatKey:'*':I
|
|
obj_Tables('DeleteRec',otParms)
|
|
Next I
|
|
|
|
Return
|
|
|
|
|
|
* * * * * * *
|
|
InSlotDisp:
|
|
* * * * * * *
|
|
|
|
WOWfrKey = Parms[1,@RM]
|
|
WOWfrRec = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF WOWfrKey = '' THEN RETURN ;* Called from dictionary -> no messages
|
|
|
|
IF WOWfrRec = '' THEN
|
|
WOWfrRec = XLATE('WO_WFR',WOWfrKey,'','X')
|
|
END
|
|
|
|
IF WOWfrRec = '' THEN RETURN
|
|
|
|
eCnt = COUNT(WOWfrRec<WO_WFR_LOC_EVENT$>,@VM) + (WOWfrRec<WO_WFR_LOC_EVENT$> NE '')
|
|
|
|
LoadPOs = ''
|
|
NCRPos = ''
|
|
TestPos = ''
|
|
UnloadPos = ''
|
|
|
|
FOR I = eCnt TO 1 STEP -1
|
|
|
|
Event = WOWfrRec<WO_WFR_LOC_EVENT$,I>
|
|
IF Event = 'LOAD' AND LoadPos = '' THEN LoadPos = I
|
|
IF Event = 'NCR' AND NCRPos = '' THEN NCRPos = I
|
|
IF Event = 'TEST' AND TestPos = '' THEN TestPos = I
|
|
IF Event = 'UNLOAD' AND UnloadPos = '' THEN UnloadPos = I
|
|
|
|
UNTIL LoadPos AND NCRPos AND TestPos AND UnloadPos
|
|
|
|
NEXT I
|
|
|
|
BEGIN CASE
|
|
CASE NCRPos AND LoadPos = '' ; Result = 'PreEpi NCR - ':WOWfrRec<WO_WFR_WMI_NCR_NO$,NCRPos>
|
|
CASE TestPos NE '' ; Result = 'Prod Test - ':WOWfrRec<WO_WFR_TW_USE$,TestPos>
|
|
CASE LoadPos NE '' ; Result = 'Load - ':WOWfrREc<WO_WFR_TOOL_ID$,LoadPos>:' ':WOWfrRec<WO_WFR_RUN_LOC$,LoadPos>
|
|
CASE 1
|
|
NULL
|
|
END CASE
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
OutSlotDisp:
|
|
* * * * * * *
|
|
|
|
WOWfrKey = Parms[1,@RM]
|
|
WOWfrRec = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF WOWfrKey = '' THEN RETURN ;* Called from dictionary -> no messages
|
|
|
|
IF WOWfrRec = '' THEN
|
|
WOWfrRec = XLATE('WO_WFR',WOWfrKey,'','X')
|
|
END
|
|
|
|
IF WOWfrRec = '' THEN RETURN
|
|
|
|
eCnt = COUNT(WOWfrRec<WO_WFR_LOC_EVENT$>,@VM) + (WOWfrRec<WO_WFR_LOC_EVENT$> NE '')
|
|
|
|
MkupPos = ''
|
|
NCRPos = ''
|
|
UnloadPos = ''
|
|
|
|
FOR I = eCnt TO 1 STEP -1
|
|
|
|
Event = WOWfrRec<WO_WFR_LOC_EVENT$,I>
|
|
IF Event = 'MKUP' AND MkupPos = '' THEN MkupPos = I
|
|
IF Event = 'NCR' AND NCRPos = '' THEN NCRPos = I
|
|
IF Event = 'UNLOAD' AND UnloadPos = '' THEN UnloadPos = I
|
|
|
|
UNTIL UnloadPos AND NCRPos AND MkupPos
|
|
|
|
NEXT I
|
|
|
|
BEGIN CASE
|
|
CASE NCRPos AND UnLoadPos NE '' ; Result = 'NCR Post Epi - ':WOWfrRec<WO_WFR_WMI_NCR_NO$,NCRPos>
|
|
CASE MkupPos NE '' ; Result = 'UMW - ':WOWfrRec<WO_WFR_SLOT_ID$,MkupPos>
|
|
CASE 1
|
|
NULL
|
|
END CASE
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
TraceData:
|
|
* * * * * * *
|
|
|
|
WOWfrKey = Parms[1,@RM]
|
|
WOWfrRec = Parms[COL2()+1,@RM]
|
|
|
|
IF WOWfrKey = '' THEN RETURN ;* Called from dictionary -> no messages
|
|
|
|
IF WOWfrRec = '' THEN
|
|
WOWfrRec = XLATE('WO_WFR',WOWfrKey,'','X')
|
|
END
|
|
|
|
IF WOWfrRec = '' THEN RETURN
|
|
|
|
|
|
|
|
lCnt = COUNT(WOWfrRec<WO_WFR_LOC_DTM$>,@VM) + (WOWfrRec<WO_WFR_LOC_DTM$> NE '')
|
|
|
|
FOR I = 1 to lCnt
|
|
Result<1,I,TRACE_DTM$> = OCONV(WOWfrRec<WO_WFR_LOC_DTM$,I>,'DT4/^S')
|
|
Result<1,I,TRACE_BY$> = WOWfrRec<WO_WFR_LOC_BY$,I>
|
|
Result<1,I,TRACE_EVENT$> = WOWfrRec<WO_WFR_LOC_EVENT$,I>
|
|
Result<1,I,TRACE_SLOT_ID$> = WOWfrRec<WO_WFR_SLOT_ID$,I>
|
|
Result<1,I,TRACE_RUN_LOC$> = WOWfrRec<WO_WFR_RUN_LOC$,I>
|
|
Result<1,I,TRACE_CARR_SLOT$> = WOWfrRec<WO_WFR_CARR_SLOT$,I>
|
|
Result<1,I,TRACE_INV_LOC$> = WOWfrRec<WO_WFR_INV_LOC$,I>
|
|
Result<1,I,TRACE_TOOL_ID$> = WOWfrRec<WO_WFR_TOOL_ID$,I>
|
|
Result<1,I,TRACE_TW_USE$> = WOWfrRec<WO_WFR_TW_USE$,I>
|
|
Result<1,I,TRACE_NCR_NO$> = WOWfrRec<WO_WFR_WMI_NCR_NO$,I>
|
|
NEXT I
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
Convert:
|
|
* * * * * * *
|
|
|
|
*CLEAR_TABLE('WO_WFR')
|
|
*CLEAR_TABLE('WO_MAT_WFR')
|
|
|
|
WONos = '161854'
|
|
|
|
|
|
wCnt = COUNT(WONos,@VM) + (WONos NE '')
|
|
|
|
FOR I = 1 TO wCnt
|
|
WONo = WONos<1,I>
|
|
EpiProFlag = Xlate('WO_LOG',WONo,'EPI_PRO_FLAG','X')
|
|
|
|
If EpiProFlag THEN
|
|
CALL Convert_Epi_WO(WONo)
|
|
End Else
|
|
Gosub ConvertASM
|
|
End
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ConvertASM:
|
|
* * * * * * *
|
|
|
|
|
|
* * * * * NOT setup for calls to obj_wo_Wfr with MV'd paramters
|
|
|
|
Open 'WO_MAT' To WOMatTable Else
|
|
ErrMsg(ErrorMsg)
|
|
Return
|
|
End
|
|
|
|
SelectSent = 'SELECT WO_MAT WITH WO_NO = ':QUOTE(WONo):' BY CASS_NO'
|
|
|
|
Set_Status(0)
|
|
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
|
IF Get_Status(errCode) THEN
|
|
ErrMsg(errCode)
|
|
Return
|
|
END
|
|
|
|
Done = 0
|
|
LOOP
|
|
READNEXT WOMatKey ELSE Done = 1
|
|
UNTIL Done
|
|
|
|
WOMatRec = Xlate('WO_MAT',WOMatKey,'','X')
|
|
|
|
WONo = WOMatKey[1,'*']
|
|
CassNo = WOMatKey[COL2()+1,'*']
|
|
|
|
SlotNos = WOMatRec<WO_MAT_SLOT_NO$>
|
|
sCnt = Count( SlotNos,@VM ) + ( SlotNos NE '' )
|
|
|
|
For I = 1 To sCnt
|
|
SlotNo = SlotNos<1,I>
|
|
NCRNo = WOMatRec<WO_MAT_SLOT_NCR$,I>
|
|
TWUseKey = WOMatRec<WO_MAT_SLOT_MET_NO$,I>
|
|
RepWfrID = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I>
|
|
|
|
WfrID = WONo:'*':CassNo:'*':SlotNo
|
|
CurrWfrRec = Xlate('WO_WFR',WfrID,'','X')
|
|
|
|
If NCRNo NE '' Then
|
|
|
|
Locate NCRNo In WOMatRec<WO_MAT_NCR_KEYS$> BY 'AR' SETTING NPos Then
|
|
|
|
NCRBy = WOMatRec<WO_MAT_NCR_FINAL_SIG$,NPos>
|
|
NCRDTM = WOMatRec<WO_MAT_NCR_FINAL_SIG_DTM$,NPos>
|
|
|
|
CurrWfrRec = XLATE('WO_WFR',WfrID,'','X')
|
|
|
|
LOCATE NCRNo IN CurrWfrRec<WO_WFR_WMI_NCR_NO$> SETTING cwPos ELSE
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := Oconv(NCRDtm,'DT4/^S'):@RM ;* Event Dtm
|
|
owwParms := NCRBy:@RM ;* Event By
|
|
owwParms := 'NCR':@RM ;* Event
|
|
owwParms := '':@RM ;* NewSlotID
|
|
owwParms := '':@RM ;* RunID (RPZ)
|
|
owwParms := NCRNo:@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TwID
|
|
owwParms := WfrID ;* CurrSlotID
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
END ;* End of check for NCRNo already in WO_WFR record
|
|
|
|
End ;* End of locating NCRNo IN WOMatRec field
|
|
|
|
End ;* End of check for NCR No
|
|
|
|
If TWUseKey NE '' Then
|
|
|
|
LOCATE 'TEST' IN CurrWfrRec<WO_WFR_LOC_EVENT$> SETTING twPos ELSE
|
|
|
|
TWUseRec = XLATE('TW_USE',TWUseKey,'','X')
|
|
|
|
TWSig = TWUseRec<TW_USE_SIGNATURE$>
|
|
TWSigDtm = TWUseRec<TW_USE_SIG_DTM$>
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := Oconv(TWSigDTM,'DT4/^S'):@RM ;* Event Dtm
|
|
owwParms := TWSig:@RM ;* Event By
|
|
owwParms := 'TEST':@RM ;* Event
|
|
owwParms := '':@RM ;* NewSlotID
|
|
owwParms := '':@RM ;* RunID (RPZ)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := TWUseKey:@RM ;* TWUseKey
|
|
owwParms := WfrID ;* CurrSlotID
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
END ;* End of check for 'TEST' Event already in WO_WFR Record
|
|
End ;* End of check for TWUseKey
|
|
|
|
If RepWfrID NE '' Then
|
|
Convert '.' To '*' In RepWfrID
|
|
|
|
LOCATE WfrID IN CurrWfrRec<WO_WFR_SLOT_ID$> SETTING Dummy ELSE
|
|
|
|
owwParms = RepWfrID:@RM ;* WfrID
|
|
owwParms := '':@RM ;* Event Dtm
|
|
owwParms := '':@RM ;* Event By
|
|
owwParms := 'MKUP':@RM ;* Event
|
|
owwParms := WfrID:@RM ;* NewSlotID
|
|
owwParms := '':@RM ;* RunID (RPZ)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TwID
|
|
owwParms := RepWfrID ;* CurrSlotID
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
END ;* End of new Slot ID already in the existing WO_WFR Rec
|
|
|
|
End ;* End of check for RepWfrID
|
|
|
|
Next I
|
|
|
|
REPEAT
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
LoadFromSlot:
|
|
* * * * * * *
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
UnloadIntoSlot:
|
|
* * * * * * *
|
|
|
|
RETURN
|
|
|