open-insight/LSL2/STPROC/OBJ_RDS2.txt
Stieber Daniel (CSC FI SPS MESLEO) 87d79edef8 Merged PR 11670: Fixed min row limit issue causing cells to be colored incorrectly. Fixed shee...
Fixed min row limit issue causing cells to be colored incorrectly. Fixed sheet rho units in rds test modules
2025-02-27 00:22:27 +01:00

1678 lines
44 KiB
Plaintext

COMPILE FUNCTION obj_RDS2(Method,Parms)
#pragma precomp SRP_PreCompiler
/*
Methods for RDS table ;Original object (obj_RDS) is full with methods for original data structures
05/12/2005 JCH - Initial Coding
Properties:
Methods:
Find() ;* Lookup RDS record
Delete(RdsNos) ;* Delete RDS records (@VM'd list of keys)
LockSet(RdsNos) ;* Returns TableVar if all records were locked
UnlockSet(RdsNos,TableVar) ;* Uses TableVar returned from LockSet call
ChangeWOStepProps(RSNos,CommitDts,HotLots,MUBoxes) ;* Changes RDS stuff 'en-mass' from WOStep window
AdjStepWafersIn(
GetMetKeys(
MetConversion(
LoadEpi(
ReloadEpi(
RemovePocketNCR(
*/
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Dialog_Box, obj_RDS_Test
DECLARE FUNCTION obj_React_Status, Logging_Services, Environment_Services, Database_Services, Error_Services
DECLARE FUNCTION Material_Services, SRP_Array
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_React_Status, obj_WO_Wfr
DECLARE SUBROUTINE RDS_React_Run, obj_WM_Out, obj_WM_In, ErrMsg, Send_Info, obj_Clean_Insp, Database_Services
DECLARE SUBROUTINE Logging_Services
$INSERT MSG_EQUATES
$INSERT WO_VERIFY_EQU
$INSERT WO_LOG_EQU
$INSERT RDS_EQUATES
$INSERT RDS_MAKEUP_EQU
$INSERT RDS_LAYER_EQUATES
$INSERT RDS_TEST_EQUATES
$INSERT RDS_LAYER_INFO_EQU
$INSERT QUOTE_SPEC_EQU
$INSERT PROD_SPEC_EQUATES
$INSERT SCHEDULE_EQU
$INSERT WO_STEP_EQU
$INSERT REACT_RUN_EQUATES
$INSERT DICT_EQUATES
$INSERT LOGICAL
$INSERT PRS_LAYER_EQU ;* Used to return obj_Prod_Spec values
EQU SHEETRHO_SPEC_UNITS$ TO \EA2FDC\
EQU RES_SPEC_UNITS$ TO \EA2D636D\
* Equates used with LoadEpi and UnloadEpi (EpiPRO wafers)
EQU COL$POCKET TO 1
EQU COL$USAGE TO 2
EQU COL$ZONE TO 3
EQU COL$IN_CASS TO 4
EQU COL$IN_SLOT TO 5
EQU COL$WAFER_TYPE TO 6
EQU COL$OUT_CASS TO 7
EQU COL$OUT_SLOT TO 8
EQU COL$OUT_NCR TO 9
equ RDS_TW_PPLUS$ to 102
equ RDS_TW_PMINUS$ to 103
equ RDS_TW_NPLUS$ to 104
equ RDS_TW_NMINUS$ to 105
equ RDS_TW_PPLUS_CODE$ to 106
equ RDS_TW_PMINUS_CODE$ to 107
equ RDS_TW_NPLUS_CODE$ to 108
equ RDS_TW_NMINUS_CODE$ to 109
equ RDS_TW_PPLUS_CNT$ to 110
equ RDS_TW_PMINUS_CNT$ to 111
equ RDS_TW_NPLUS_CNT$ to 112
equ RDS_TW_NMINUS_CNT$ to 113
equ RDS_TW_PROD_CODE$ to 164
equ RDS_TW_PROD_CNT$ to 165
equ RDS_TW_PPLUS_TOOL$ to 166
equ RDS_TW_PMINUS_TOOL$ to 167
equ RDS_TW_NPLUS_TOOL$ to 168
equ RDS_TW_NMINUS_TOOL$ to 169
equ RDS_TW_PROD_TOOL$ to 170
equ RDS_TW_PPLUS_THICK$ to 171
equ RDS_TW_PMINUS_THICK$ to 172
equ RDS_TW_NPLUS_THICK$ to 173
equ RDS_TW_NMINUS_THICK$ to 174
equ RDS_TW_PROD_THICK$ to 175
equ RDS_TW_PPLUS_RES$ to 176
equ RDS_TW_PMINUS_RES$ to 177
equ RDS_TW_NPLUS_RES$ to 178
equ RDS_TW_NMINUS_RES$ to 179
equ RDS_TW_PROD_RES$ to 180
equ RDS_TW_PPLUS_CON$ to 181
equ RDS_TW_PMINUS_CON$ to 182
equ RDS_TW_NPLUS_CON$ to 183
equ RDS_TW_NMINUS_CON$ to 184
equ RDS_TW_PROD_CON$ to 185
equ RDS_TW_PPLUS_STRESS$ to 186
equ RDS_TW_PMINUS_STRESS$ to 187
equ RDS_TW_NPLUS_STRESS$ to 188
equ RDS_TW_NMINUS_STRESS$ to 189
equ RDS_TW_RECLAIM$ to 240
equ RDS_TW_RECLAIM_CODE$ to 241
equ RDS_TW_RECLAIM_CNT$ to 242
equ RDS_TW_RECLAIM_CON$ to 243
equ RDS_TW_RECLAIM_RES$ to 244
equ RDS_TW_RECLAIM_RHO$ to 245
equ RDS_TW_RECLAIM_STRESS$ to 246
equ RDS_TW_RECLAIM_THICK$ TO 247
equ RDS_TW_RECLAIM_TOOL$ to 248
equ RDS_TW_RECLAIM_TRANS$ to 249
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\EpiPro'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Unload Log.csv'
Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Error'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
ErrTitle = 'Error in Stored Procedure "obj_RDS2"'
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 = 'Find' ; GOSUB Find
CASE Method = 'Delete' ; GOSUB Delete
CASE Method = 'LockSet' ; GOSUB LockSet
CASE Method = 'UnlockSet' ; GOSUB UnlockSet
CASE Method = 'ChangeWOStepProps' ; GOSUB ChangeWOStepProps
CASE Method = 'AdjStepWafersIn' ; GOSUB AdjStepWafersIn
CASE Method = 'GetMetKeys' ; GOSUB GetMetKeys
CASE Method = 'MetConversion' ; GOSUB MetConversion
CASE Method = 'UnloadEpi' ; GOSUB UnloadEpi
CASE Method = 'ReloadEpi' ; GOSUB ReloadEpi
CASE Method = 'ClearEpiUnload' ; GOSUB ClearEpiUnload
CASE Method = 'LoadMat' ; GOSUB LoadMat
CASE Method = 'ReturnMat' ; GOSUB ReturnMat
CASE Method = 'RemovePocketNCR' ; GOSUB RemovePocketNCR
CASE Method = 'SetPartNo' ; GOSUB SetPartNo
CASE Method = 'FieldsUsed' ; GOSUB FieldsUsed
CASE 1
END CASE
IF ErrorMsg NE '' THEN
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
END
RETURN Result
* * * * * * *
FieldsUsed:
* * * * * * *
RDSNo = Parms[1,@RM]
RDSRec = Parms[COL2()+1,@RM]
Fields = XLATE('DICT.RDS','%FIELDS%','','X')
KList = 2:@VM:3:@VM:4:@VM:6:@VM:8:@VM:9:@VM:10:@VM:12:@VM:14:@VM:34:@VM:31:@VM:35:@VM:36:@VM:37:@VM:38:@VM:39:@VM:40
Ans = ''
FOR I = 1 TO 278
IF RDSRec<I> NE '' THEN
LOCATE I IN KList USING @VM SETTING Dummy ELSE
LOCATE I IN Fields<FIELDS_FIELD_NO$> USING @VM SETTING Pos THEN
Ans<1,-1> = I:' ':Fields<FIELDS_NAME$,Pos>
END
END
END ;* End of check for field null
NEXT I
Result = Ans
RETURN
* * * * * * *
Find:
* * * * * * *
RDSKeys = Dialog_Box('DIALOG_RDS_QUERY',@WINDOW,'')
Result = RDSKeys
RETURN
* * * * * * *
Delete:
* * * * * * *
RdsNos = Parms[1,@RM]
TableVar = Parms[COL2()+1,@RM]
IF RdsNos = '' THEN RETURN
IF TableVar = '' THEN
* This section of code should be removed after all calls to obj_RDS('Delete'....) have been checked
Set_Status(0)
RTParms = 'RDS'
LockedRDSNos = ''
FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '')
RdsNo = RdsNos<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
obj_Tables('LockRec',RTParms)
IF Get_Status(errCode) THEN
FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>)
obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
NEXT N
ErrorMsg = 'Unable to lock RDS ':QUOTE(RdsNo):' for delete.'
RETURN
END ELSE
LockedRDSNos<1,I> = RdsNo
END
NEXT I
TableVar = FIELD(RTParms,@RM,3,1)
END
FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '')
RdsNo = RdsNos<1,I>
RDSRec = XLATE('RDS',RdsNo,'','X')
LSKeys = RDSRec<RDS_RDS_LAYER_KEYS$>
NCRKeys = RDSRec<RDS_NCR_KEYS$>
SurfScanKeys = RDSRec<RDS_SURFSCAN_KEYS$>
CIKeys = XLATE('REACT_RUN',RdsNo,REACT_RUN_CI_NO$,'X')
MetKeys = XLATE('RDS_LAYER',LSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X')
RTParms = 'RDS':@RM:RdsNo:@RM:TableVar:@RM
obj_Tables('UnlockRec',RTParms)
IF NCRKeys NE '' THEN
OPEN 'NCR' TO NCRFile THEN
NCRCnt = COUNT(NCRKeys,@VM)
FOR NCR = 1 TO NCRCnt
DELETE NCRFile,NCRKeys<1,NCR>
NEXT NCR
END
END ;* End of NCR section
IF SurfScanKeys NE '' THEN
OPEN 'SURFACE_SCAN' TO SurfScanTable THEN
ScanCnt = COUNT(SurfScanKeys,@VM) + (SurfScanKeys NE '')
FOR Scan = 1 TO ScanCnt
DELETE SurfScanTable,SurfScanKeys<1,Scan>
NEXT Scan
END ;* End of SURFACE_SCAN open
END ;* End of SurfScan sectioin
obj_RDS_Test('Delete',MetKeys)
obj_RDS_Layer('Delete',LSKeys)
obj_Clean_Insp('Delete',CIKeys)
obj_Tables('DeleteRec','RDS':RTParms) ;* Deletes and removes the lock
NEXT I
RETURN
* * * * * * *
LockSet:
* * * * * * *
RdsNos = Parms[1,@RM]
IF RdsNos = '' THEN RETURN
Set_Status(0)
RTParms = 'RDS'
LockedRDSNos = ''
FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '')
RdsNo = RdsNos<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
obj_Tables('LockRec',RTParms)
IF Get_Status(errCode) THEN
FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>)
obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
NEXT N
ErrorMsg = 'Unable to lock RDS ':QUOTE(RdsNo):'.'
RETURN
END ELSE
LockedRDSNos<1,I> = RdsNo
END
NEXT I
TableVar = FIELD(RTParms,@RM,3,1)
Result = TableVar
RETURN
* * * * * * *
UnlockSet:
* * * * * * *
RdsNos = Parms[1,@RM]
TableVar = Parms[COL2()+1,@RM]
IF RdsNos = '' THEN RETURN
IF TableVar = '' THEN RETURN
Set_Status(0)
RTParms = 'RDS':@RM:@RM:TableVar
LockedRDSNos = ''
FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '')
RdsNo = RdsNos<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
obj_Tables('UnlockRec',RTParms)
NEXT I
RETURN
* * * * * * *
ChangeWOStepProps:
* * * * * * *
RDSNos = Parms[1,@RM]
CommitDts = Parms[COL2()+1,@RM]
HotLots = Parms[COL2()+1,@RM]
MUBoxes = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(RDSNos)) THEN ErrorMsg = 'Unassigned Parm "RDSNos" passed to routine. (':Method:')'
IF NOT(ASSIGNED(CommitDts)) THEN CommitDts = ''
IF NOT(ASSIGNED(HotLots)) THEN HotLots = ''
IF NOT(ASSIGNED(MUBoxes)) THEN MUBoxes = ''
IF ErrorMsg NE '' THEN RETURN
IF RDSNos = '' THEN RETURN
Set_Status(0)
RTParms = 'RDS'
LockedRDSNos = ''
FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '')
RdsNo = RdsNos<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
obj_Tables('LockRec',RTParms)
IF Get_Status(errCode) THEN
FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>)
obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
NEXT N
ErrorMsg = 'Unable to lock RDS ':QUOTE(RdsNo):' for update.'
RETURN
END ELSE
LockedRDSNos<1,I> = RdsNo
END
NEXT I
CommitDts = ICONV(CommitDts,'D') ;* Move to internal format
HotLots = ICONV(HotLots,'B')
MUBoxes = ICONV(MUBoxes,'B')
RDSTableVar = FIELD(RTParms,@RM,3)
FOR I = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
LockedRDSNo = LockedRDSNos<1,I>
READ RDSRec FROM RDSTableVar,LockedRDSNo THEN
CommitDt = CommitDts<1,I>
HotLot = HotLots<1,I>
MUBox = MUBoxes<1,I>
IF CommitDt NE RDSRec<RDS_COMMIT_DATE_FINAL$> THEN RDSRec<RDS_COMMIT_DATE_FINAL$> = CommitDt
*IF HotLot NE RDSRec<RDS_HOT_LOT$> THEN RDSRec<RDS_HOT_LOT$> = HotLot ;* No longer used
*IF MUBox NE RDSRec<RDS_MAKEUP_BOX$> THEN RDSRec<RDS_MAKEUP_BOX$> = MUBox ;* No longer used
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNo)
RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
obj_Tables('WriteRec',RTParms) ;* Write and unlock RDS records
END
NEXT I
RETURN
* * * * * * *
AdjStepWafersIn:
* * * * * * *
RETURN
* Dead as of 11/5/2008 JCH
StepCompRdsNos = Parms[1,@RM]
AdjRdsNos = Parms[COL2()+1,@RM]
IF StepCompRdsNos = '' THEN ErrorMsg = 'Null parameter "StepCompRdsNos" passed to routine. (':Method:')'
IF AdjRdsNos = '' THEN ErrorMsg = 'Null parameter "AdjRdsNos" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
Set_Status(0)
RTParms = 'RDS'
LockedRDSNos = ''
FOR I = 1 TO COUNT(AdjRdsNos,@VM) + (AdjRdsNos NE '')
AdjRdsNo = AdjRdsNos<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, AdjRdsNo)
obj_Tables('LockRec',RTParms)
IF Get_Status(errCode) THEN
FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>)
obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
NEXT N
ErrorMsg = 'Unable to lock RDS ':QUOTE(AdjRdsNo):' for update.'
RETURN
END ELSE
LockedRDSNos<1,I> = AdjRdsNo
END
NEXT I
RDSTableVar = FIELD(RTParms,@RM,3)
FOR I = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
LockedRDSNo = LockedRDSNos<1,I>
READ RDSRec FROM RDSTableVar,LockedRDSNo THEN
SCRdsNo = StepCompRdsNos<1,I>
SCWafersOut = XLATE('RDS',SCRdsNo,'WFRS_OUT','X') ;* Wafers out from previous step
RDSRec<RDS_CASS_WAFER_QTY$> = SCWafersOut
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNo)
RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
obj_Tables('WriteRec',RTParms) ;* Write and unlock RDS records
END ELSE
status = Set_FSError()
FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>)
obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
NEXT N
END
NEXT I
RETURN
* * * * * * *
GetMetKeys:
* * * * * * *
* Returns data structure of 'LSID*ZONE' - @VM in first column associated RDS_TEST numbers in 2nd Column.
RdsNo = Parms[1,@RM]
IF RdsNo = '' THEN RETURN
SortedLSKeys = XLATE('RDS',RdsNo,'RDS_LS_SORTED','X')
CONVERT @VM TO @FM IN SortedLSKeys
IF SortedLSKeys NE '' THEN
LSMetKeys = XLATE('RDS_LAYER',SortedLSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X')
RDSMetZones = XLATE('RDS_TEST',LSMetKeys,RDS_TEST_ZONE$,'X')
ResultLine = 0
FOR I = 1 TO COUNT(SortedLSKeys,@FM) + (SortedLSKeys NE '')
SortedLSKey = SortedLSKeys<I>
LSMetKey = LSMetKeys<I>
FOR N = 1 TO COUNT(LSMetKey,@VM) + (LSMetKey NE '')
ResultLine += 1
Result<1,ResultLine> = FIELD(SortedLSKey,'*',2):'*':RDSMetZones<I,N>
Result<2,ResultLine> = LSMetKeys<I,N>
NEXT N
NEXT I
END
RETURN
* * * * * * *
UnloadEpi:
* * * * * * *
RdsNo = Parms[1,@RM]
ReactorList = Parms[COL2()+1,@RM]
AvailSlotKeys = Parms[COL2()+1,@RM]
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.'
IF AvailSlotKeys = '' THEN ErrorMsg = 'Null parameter "AvailSlotKeys" passeed to routine.'
IF ErrorMsg NE '' THEN RETURN
Send_Info('Reading RDS ':RdsNo:'...')
Set_Status(0)
RTParms = 'RDS':@RM:RdsNo
* RDSRec = obj_Tables('ReadRec',RTParms)
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for UnloadEpi update.'
RETURN
END
Reactor = RDSRec<RDS_REACTOR$>
RLCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
LoadFailed = 0
LoadCnt = 0
OutCassettes = ''
CassIDs = ''
OutSlotNos = ''
RDSNos = ''
PocketNos = ''
Zones = ''
InCassNos = ''
InSlotNos = ''
Send_Info('Building WM_OUT Load Data ...')
FOR I = 1 TO RLCnt
IF ReactorList<I,COL$WAFER_TYPE> = 'PROD' AND ReactorList<I,COL$USAGE> = '' AND ReactorList<I,COL$OUT_CASS> = '' THEN
AvailSlotKey = AvailSlotKeys[1,@VM]
AvailSlotKeys[1,COL2()] = ''
WONo = AvailSlotKey[1,'*']
WOStep = AvailSlotKey[COL2()+1,'*']
OutCassNo = AvailSlotKey[COL2()+1,'*']
OutSlotNo = AvailSlotKey[COL2()+1,'*']
PocketNo = ReactorList<I,COL$POCKET>
Zone = ReactorList<I,COL$ZONE>
InCass = ReactorList<I,COL$IN_CASS>
InSlot = ReactorList<I,COL$IN_SLOT>
LOCATE OutCassNo IN OutCassettes USING @VM SETTING Pos ELSE
OutCassettes = INSERT(OutCassettes,1,Pos,0,OutCassNo)
END
CassID = WONo:'*':WOStep:'*':OutCassNo
LOCATE CassID IN CassIDs USING @FM SETTING Pos THEN
OutSlotNos = INSERT(OutSlotNos,Pos,-1,0,OutSlotNo)
RDSNos = INSERT(RDSNos,Pos,-1,0,RDSNo)
PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo)
Zones = INSERT(Zones,Pos,-1,0,Zone)
InCassNos = INSERT(InCassNos,Pos,-1,0,InCass)
InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot)
END ELSE
CassIDs = INSERT(CassIDs,Pos,0,0,CassID)
OutSlotNos = INSERT(OutSlotNos,Pos,-1,0,OutSlotNo)
RDSNos = INSERT(RDSNos,Pos,-1,0,RDSNo)
PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo)
Zones = INSERT(Zones,Pos,-1,0,Zone)
InCassNos = INSERT(InCassNos,Pos,-1,0,InCass)
InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot)
END
RDSRec<RDS_OUT_CASS_NO$,I> = OutCassNo
RDSRec<RDS_OUT_SLOT_NO$,I> = OutSlotNo
IF RDSRec<RDS_WAFER_CHAR$,I> = 'PROD' THEN LoadCnt += 1
END
UNTIL LoadFailed
NEXT I
* RDSRec<RDS_OPERATOR_OUT$> = @USER4
* RDSRec<RDS_DATE_OUT$> = Date()
* RDSRec<RDS_TIME_OUT$> = Time()
UnloadDTM = OCONV(RDSRec<RDS_DATE_OUT$>, 'D4/' ):' ':OCONV( RDSRec<RDS_TIME_OUT$>, 'MTH' )
RemCassIDs = ''
RemOutSlotNos = ''
UnloadFailed = 0
CassCnt = COUNT(CassIDs,@FM) + (CassIDs NE '')
Def = ""
Def<MCAPTION$> = "Unloading material... Please, do not interupt this process. This may take a while!"
Def<MTYPE$> = "G"
Def<MEXTENT$> = CassCnt
Def<MTEXTWIDTH$> = 600
MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message
FOR N = 1 TO CassCnt
CassID = CassIDs<N>
Send_Info('Adding Wafers to WM_OUT ':CassID:'...')
WONo = CassID[1,'*']
WOStep = CassID[COL2()+1,'*']
OutCass = CassID[COL2()+1,'*']
owParms = WONo:@RM
owParms := WOStep:@RM
owParms := OutCass:@RM
owParms := OutSlotNos<N>:@RM
owParms := RDSNos<N>:@RM
owParms := PocketNos<N>:@RM
owParms := Zones<N>:@RM
owParms := InCassNos<N>:@RM
owParms := InSlotNos<N>
Set_Status(0)
obj_WM_Out('AddWafer',owParms)
ErrorMessage = ''
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
Status = Get_Status(errCode)
IF (Error_Services('HasError') or Get_Status(errCode) ) THEN
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = RDSNo
LogData<4> = 'Epi Unload Error. Error code: ':errCode:'.'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
UnloadFailed = 1
RemCnt = COUNT(RemCassIDs,@FM) + (RemCassIDs NE '')
FOR R = 1 TO RemCnt
RemCassID = RemCassIDs<R>
Send_Info('Epi Unload Error - Clearing Partial Unload data ':RemCassID:'...')
WONo = RemCassID[1,'*']
WOStep = RemCassID[COL2()+1,'*']
OutCass = RemCassID[COL2()+1,'*']
OutSlotNos = RemOutSlotNos<R>
Set_Status(0)
obj_WM_Out('RemoveWafer',WONo:@RM:WOStep:@RM:OutCass:@RM:OutSlotNos)
NEXT R
END ELSE
RemCassIDs<-1> = CassID
RemOutSlotNos<-1> = OutSlotNos<N>
END
Running = Msg(@WINDOW, MsgUp, N, MSGINSTUPDATE$) ;* Update message
UNTIL UnloadFailed
NEXT N
IF NOT(UnloadFailed) THEN
Send_Info('Saving Updated RDS ':RdsNo:'...')
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
If Error_Services('HasError') then
UnloadFailed = True$
ErrorMsg = Error_Services('GetMessage')
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = RDSNo
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
ErrMsg(ErrorMsg)
end
* Update Reactor Status with load data
If UnloadFailed EQ False$ then
* Send_Info('Updating Reactor ':Reactor:' Status...')
* InCassettes = SRP_Array('Clean', InCassNos, 'TrimAndMakeUnique', @VM)
* obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)
IF Get_Status(errCode) THEN ErrMsg(errCode)
Send_Info('Updating REACT_RUN record...')
RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH *******
end
// Verify RDS, REACT_RUN, and WM_OUT cassette & slot data match.
DataMatch = Material_Services('VerifyEPPUnload', RDSNo)
// If data does not match, then back out all changes and log the error.
If ( (DataMatch EQ False$) or (UnloadFailed EQ True$) ) then
ErrorMsg = Error_Services('GetMessage')
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = RDSNo
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
// Clear WM_OUT data
UnloadFailed = 1
RemCnt = COUNT(RemCassIDs,@FM) + (RemCassIDs NE '')
FOR R = 1 TO RemCnt
RemCassID = RemCassIDs<R>
Send_Info('Epi Unload Error - Clearing Partial Unload data ':RemCassID:'...')
WONo = RemCassID[1,'*']
WOStep = RemCassID[COL2()+1,'*']
OutCass = RemCassID[COL2()+1,'*']
OutSlotNos = RemOutSlotNos<R>
Set_Status(0)
obj_WM_Out('RemoveWafer',WONo:@RM:WOStep:@RM:OutCass:@RM:OutSlotNos)
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = WONo:'*':WOStep:'*':OutCass
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end
NEXT R
// Clear RDS Data
RDSRec<RDS_OPERATOR_OUT$> = ''
RDSRec<RDS_DATE_OUT$> = ''
RDSRec<RDS_TIME_OUT$> = ''
RDSRec<RDS_OUT_CASS_NO$> = ''
RDSRec<RDS_OUT_SLOT_NO$> = ''
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, False$)
// Clear REACT_RUN data (copy cleared RDS data to REACT_RUN)
RDS_React_Run(RDSNo)
end
END ELSE
obj_Tables('UnlockRec',RTParms)
END
Msg(@WINDOW,MsgUp) ;* Take message down
RETURN
* * * * * * *
ReloadEpi:
* * * * * * *
RdsNo = Parms[1,@RM]
IF RdsNo = '' THEN
ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
RETURN
END
Send_Info('Reading RDS ':RdsNo:'...')
LocalLockFlag = 1
Set_Status(0)
RTParms = 'RDS':@RM:RdsNo
RDSRec = obj_Tables('ReadRec',RTParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReloadEpi update.'
RETURN
END
WONo = RDSRec<RDS_WO$>
WOStep = RDSRec<RDS_WO_STEP_KEY$>[-1,'B*']
ReactNo = RDSRec<RDS_REACTOR$>
ToolID = 'R':ReactNo
RLCnt = COUNT(RDSRec<RDS_POCKET$>,@VM) + (RDSRec<RDS_POCKET$> NE '')
ReloadFailed = 0
LoadCnt = 0
RLWaferIDs = ''
OutCassIDs = ''
PocketNos = ''
Zones = ''
WaferChars = ''
PocketChars = ''
InCassNos = ''
InSlotNos = ''
OutSlots = ''
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
Send_Info('Building WM_OUT Reload Data ...')
WfrIDs = '' ;* Added 9/7/2016 JCH
RunLocs = '' ;* Added 9/7/2016 JCH
CurrSlotIDs = '' ;* Added 9/7/2016 JCH
FOR I = 1 TO RLCnt
PocketNo = RDSRec<RDS_POCKET$,I>
Zone = RDSRec<RDS_ZONE$,I>
WaferChar = RDSRec<RDS_WAFER_CHAR$,I>
PocketChar = RDSRec<RDS_POCKET_CHAR$,I>
InCass = RDSRec<RDS_IN_CASS_NO$,I>
InSlot = RDSRec<RDS_IN_SLOT_NO$,I>
OutCass = RDSRec<RDS_OUT_CASS_NO$,I>
OutSlot = RDSRec<RDS_OUT_SLOT_NO$,I>
IF WaferChar = 'PROD' AND PocketChar = '' AND OutCass NE '' THEN
WfrIDs<1,-1> = WONo:'*':InCass:'*':InSlot ;* Added 9/7/2016 JCH
RunLocs<1,-1> = RDSNo:'*':PocketNo:'*':Zone ;* Added 9/7/2016 JCH
CurrSlotIDs<1,-1> = WONo:'*':OutCass:'*':Outslot ;* Added 9/7/2016 JCH
* * * * Added 3/22/2016 JCH - wafer history * * * *
Parms = WONo:'*':InCass:'*':InSlot:@RM ;* WfrID
Parms := CurrDTM:@RM ;* EventDtm
Parms := @USER4:@RM ;* EventBy
Parms := 'RELOAD':@RM ;* Event
Parms := '':@RM ;* NewSlotID
Parms := RDSNo:'*':PocketNo:'*':Zone:@RM ;* RunLoc
Parms := '':@RM ;* NCRNo
Parms := '':@RM ;* TWUse
Parms := WONo:'*':OutCass:'*':Outslot:@RM ;* CurrSlotID
Parms := ToolID:@RM ;* NewToolID (Load Tool)
Parms := '':@RM ;* CurrToolID (Unload Tool)
Parms := '':@RM ;* NewInvLoc
Parms := '':@RM ;* CurrInvLoc
Parms := 'O' ;* Wfr Side
obj_WO_Wfr('AddEvent',Parms)
OutCassID = WONo:'*':WOStep:'*':OutCass
LOCATE OutCassID IN OutCassIDs USING @FM SETTING Pos THEN
PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo)
Zones = INSERT(Zones,Pos,-1,0,Zone)
WaferChars = INSERT(WaferChars,Pos,-1,0,WaferChar)
PocketChars = INSERT(PocketChars,Pos,-1,0,PocketChar)
InCassNos = INSERT(InCassNos,Pos,-1,0,InCass)
InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot)
OutSlots = INSERT(OutSlots,Pos,-1,0,OutSlot)
END ELSE
OutCassIDs = INSERT(OutCassIDs,Pos,0,0,OutCassID)
PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo)
Zones = INSERT(Zones,Pos,-1,0,Zone)
WaferChars = INSERT(WaferChars,Pos,-1,0,WaferChar)
PocketChars = INSERT(PocketChars,Pos,-1,0,PocketChar)
InCassNos = INSERT(InCassNos,Pos,-1,0,InCass)
InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot)
OutSlots = INSERT(OutSlots,Pos,-1,0,OutSlot)
END
RDSRec<RDS_OUT_CASS_NO$,I> = ''
RDSRec<RDS_OUT_SLOT_NO$,I> = ''
END
UNTIL ReloadFailed
NEXT I
/*
* * * * Added 9/7/2016 JCH - wafer history * * * *
IF WfrIDs NE '' THEN
Parms = WfrIDs:@RM ;* WfrIDs
Parms := CurrDTM:@RM ;* EventDtm
Parms := @USER4:@RM ;* EventBy
Parms := 'RELOAD':@RM ;* Event
Parms := '':@RM ;* NewSlotIDs
Parms := RunLocs:@RM ;* RunLocs
Parms := '':@RM ;* NCRNo
Parms := '':@RM ;* TWUse
Parms := CurrSlotIDs:@RM ;* CurrSlotIDs
Parms := ToolID:@RM ;* NewToolID (Load Tool)
Parms := '':@RM ;* CurrToolID (Unload Tool)
Parms := '':@RM ;* NewInvLoc
Parms := '':@RM ;* CurrInvLoc
Parms := 'O' ;* Wfr Side
obj_WO_Wfr('AddEvent',Parms)
END
*/
RepCassIDs = ''
RepOutSlotNos = ''
RepRDSNos = ''
RepPocketNos = ''
RepZones = ''
RepInCassNos = ''
RepInSlotNos = ''
ReloadFailed = 0
CassCnt = COUNT(OutCassIDs,@FM) + (OutCassIDs NE '')
FOR I = 1 TO CassCnt
OutCassID = OutCassIDs<I>
Send_Info('Removing Run Data from WM_OUT ':OutCassID:'...')
WONo = OutCassID[1,'*']
WOStep = OutCassID[COL2()+1,'*']
OutCass = OutCassID[COL2()+1,'*']
owParms = WONo:@RM
owParms := WOStep:@RM
owParms := OutCass:@RM
owParms := OutSlots<I>
Set_Status(0)
obj_WM_Out('RemoveWafer',owParms)
IF Get_Status(ErrCode) THEN
ReloadFailed = 1
RepCnt = COUNT(RepCassIDs,@FM) + (RepCassIDs NE '')
FOR N = 1 TO RepCnt
RepCassID = RepCassIDs<N>
Send_Info('Epi Reload Error - Restoring Unload Data ':RepCassID:'...')
WONo = RepCassID[1,'*']
WOStep = RepCassID[COL2()+1,'*']
OutCass = RepCassID[COL2()+1,'*']
owParms = WONo:@RM
owParms := WOStep:@RM
owParms := OutCass:@RM
owParms := RepOutSlotNos<N>:@RM
owParms := RepRDSNos<N>:@RM
owParms := RepPocketNos<N>:@RM
owParms := RepZones<N>:@RM
owParms := RepInCassNos<N>:@RM
owParms := RepInSlotNos<N>
Set_Status(0)
obj_WM_Out('AddWafer',owParms)
NEXT N
END ELSE
RepCassIDs<-1> = OutCassID
RepOutSlotNos<-1> = OutSlots<I>
RepRDSNos<-1> = RDSNo
RepPocketNos<-1> = PocketNos<I>
RepZones<-1> = Zones<I>
RepInCassNos<-1> = InCassNos<I>
RepInSlotNos<-1> = InSlotNos<I>
END
UNTIL ReloadFailed
NEXT I
IF NOT(ReloadFailed) THEN
Send_Info('Saving RDS record ':RdsNo:'...')
RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
obj_Tables('WriteRec',RTParms)
Send_Info('Updating REACT_RUN record...')
RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH **********************************************
END ELSE
obj_Tables('UnlockRec',RTParms)
END
RETURN
* * * * * * *
ClearEpiUnload:
* * * * * * *
* Clears unload destination data - used when RDS & WM_OUT get completely out of sync
RdsNo = Parms[1,@RM]
IF RdsNo = '' THEN
ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
RETURN
END
Send_Info('Reading RDS ':RdsNo:'...')
Set_Status(0)
RTParms = 'RDS':@RM:RdsNo
RDSRec = obj_Tables('ReadRec',RTParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ClearEpiUnload process.'
RETURN
END
RLCnt = COUNT(RDSRec<RDS_POCKET$>,@VM) + (RDSRec<RDS_POCKET$> NE '')
FOR I = 1 TO RLCnt
RDSRec<RDS_OUT_CASS_NO$,I> = ''
RDSRec<RDS_OUT_SLOT_NO$,I> = ''
NEXT I
RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
obj_Tables('WriteRec',RTParms)
Send_Info('Updating REACT_RUN record...')
RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH **********************************************
RETURN
* * * * * * *
LoadMat:
* * * * * * *
RdsNo = Parms[1,@RM]
ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration
WMIKeys = Parms[COL2()+1,@RM] ;* Contains list of locked WMI slots to use
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.'
IF WMIKeys = '' THEN ErrorMsg = 'Null parameter "AvailSlotKeys" passeed to routine.'
IF ErrorMsg NE '' THEN RETURN
Send_Info('Reading RDS ':RdsNo:'...')
Set_Status(0)
RTParms = 'RDS':@RM:RdsNo
RDSRec = obj_Tables('ReadRec',RTParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for UnloadEpi update.'
RETURN
END
// Set BLOCK_LOAD flag until the process completes
RDSRec<RDS_BLOCK_LOAD$> = True$
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Reactor = RDSRec<RDS_REACTOR$>
RLCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
LOOP
LastLine = ReactorList[-1,'B':@FM]
UNTIL LastLine<1,COL$POCKET> NE '' OR ReactorList = ''
ReactorList[COL1(),99] = ''
RLCnt -= 1
REPEAT
LoadFailed = 0
LoadCnt = 0
InCassettes = ''
CassIDs = ''
CassSlots = ''
CassSlotRDSNos = ''
CassSlotPkts = ''
CassSlotZones = ''
Send_Info('Building Cassette Unload Data ...')
FOR I = 1 TO RLCnt
IF ReactorList<I,COL$IN_CASS> = '' AND ReactorList<I,COL$WAFER_TYPE> = '' AND ReactorList<I,COL$USAGE> NE 'DUMMY' THEN
WMIKey = WMIKeys[1,@VM]
WMIKeys[1,COL2()] = ''
WONo = WMIKey[1,'*']
WOStep = WMIKey[COL2()+1,'*']
InCass = WMIKey[COL2()+1,'*']
InSlot = WMIKey[COL2()+1,'*']
PocketNo = ReactorList<I,COL$POCKET>
Usage = ReactorList<I,COL$USAGE>
Zone = ReactorList<I,COL$ZONE>
CassID = WONo:'*':WOStep:'*':InCass
LOCATE CassID IN CassIDs USING @FM SETTING Pos THEN
CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot)
CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RDSNo)
CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo)
CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone)
END ELSE
CassIDs = INSERT(CassIDs,Pos,0,0,CassID)
CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot)
CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RDSNo)
CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo)
CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone)
END
RDSRec<RDS_POCKET$,I> = PocketNo
RDSRec<RDS_ZONE$,I> = Zone
RDSRec<RDS_POCKET_CHAR$,I> = Usage
RDSRec<RDS_IN_CASS_NO$,I> = InCass
RDSRec<RDS_IN_SLOT_NO$,I> = InSlot
RDSRec<RDS_WAFER_CHAR$,I> = 'PROD'
LoadCnt += 1
LOCATE InCass IN InCassettes USING @VM SETTING Pos ELSE
InCassettes = INSERT(InCassettes,1,Pos,0,InCass)
END
END ELSE
RDSRec<RDS_POCKET$,I> = ReactorList<I,COL$POCKET>
RDSRec<RDS_ZONE$,I> = ReactorList<I,COL$ZONE>
RDSRec<RDS_POCKET_CHAR$,I> = ReactorList<I,COL$USAGE>
RDSRec<RDS_WAFER_CHAR$,I> = ReactorList<I,COL$WAFER_TYPE>
END
UNTIL LoadFailed
NEXT I
LoadFailed = 0
CassIDCnt = COUNT(CassIDs,@FM) + (CassIDs NE '')
RepCassIDs = ''
RepCassSlots = ''
Def = ""
Def<MCAPTION$> = "Loading material... Please, do not interupt this process. This may take a while!"
Def<MTYPE$> = "G"
Def<MEXTENT$> = CassIDCnt
Def<MTEXTWIDTH$> = 600
MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message
FOR I = 1 TO CassIDCnt
CassID = CassIDs<I>
Send_Info('Pulling Material from WM_IN ':CassID:'...')
WONo = CassID[1,'*']
WOStep = CassID[COL2()+1,'*']
InCass = CassID[COL2()+1,'*']
owParms = WONo:@RM
owParms := WOStep:@RM
owParms := InCass:@RM
owParms := CassSlots<I>:@RM
owParms := CassSlotRDSNos<I>:@RM
owParms := CassSlotPkts<I>:@RM
owParms := CassSlotZones<I>:@RM
Set_Status(0)
obj_WM_In('RemoveWafer',owParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for UnloadEpi update.'
LoadFailed = 1
RepCnt = COUNT(RepCassIDs,@FM) + (RepCassIDs NE '')
FOR N = 1 TO RepCnt
RepCassID = RepCassIDs<N>
Send_Info('Replacing Material in WM_IN ':RepCassID:'...')
WONo = RepCassID[1,'*']
WOStep = RepCassID[COL2()+1,'*']
InCass = RepCassID[COL2()+1,'*']
owParms = WONo:@RM
owParms := WOStep:@RM
owParms := InCass:@RM
owParms := RepCassSlots<N>:@RM
obj_WM_In('ReplaceWafer',owParms)
NEXT N
END ELSE
RepCassIDs<-1> = CassID
RepCassSlots<-1> = CassSlots<I>
END
Running = Msg(@WINDOW, MsgUp, I, MSGINSTUPDATE$) ;* Update message
UNTIL LoadFailed
NEXT I
IF NOT(LoadFailed) THEN
* Update Reactor Status with load data
*Send_Info('Updating Reactor ':Reactor:' status...')
LoadDTM = OCONV( Date(), 'D2/' ):' ':OCONV( Time(), 'MTH' )
*IdleTime = obj_React_Status('ReactorLoad',Reactor:@RM:WONo:@RM:InCassettes:@RM:LoadDTM)
IF Get_Status(errCode) THEN ErrMsg(errCode)
RDSRec<RDS_WAFERS_IN$> = LoadCnt
RDSRec<RDS_VERIFY_QTY$> = LoadCnt
RDSRec<RDS_CASS_WAFER_QTY$> = LoadCnt
*RDSRec<RDS_REACT_IDLE_TIME$> = ICONV(IdleTime,'MD2') ;* hours to 2 decimal places
Send_Info('Saving Updated RDS ':RDSNo:'...')
* RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
// Remove BLOCK_LOAD flag since the process has completed
RDSRec<RDS_BLOCK_LOAD$> = False$
* obj_Tables('WriteRec',RTParms)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Database_Services('ReleaseKeyIDLock', 'RDS', RDSNo)
Send_Info('Updating REACT_RUN record...')
RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH **********************************************
END ELSE
RDSRec = obj_Tables('UnlockRec',RTParms)
END
Msg(@WINDOW,MsgUp) ;* Take message down
RETURN
* * * * * * *
ReturnMat:
* * * * * * *
RdsNo = Parms[1,@RM]
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
IF ErrorMsg NE '' THEN RETURN
Send_Info('Reading RDS Record ':RdsNo:'...')
Set_Status(0)
RTParms = 'RDS':@RM:RdsNo
RDSRec = obj_Tables('ReadRec',RTParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.'
RETURN
END
WONo = RDSRec<RDS_WO$>
WOStep = RDSRec<RDS_WO_STEP_KEY$>[-1,'B*']
RLCnt = COUNT(RDSRec<RDS_POCKET$>,@VM) + (RDSRec<RDS_POCKET$> NE '')
ReloadFailed = 0
LoadCnt = 0
RLWaferData = ''
CassIDs = ''
CassSlots = ''
CassSlotRDSNos = ''
CassSlotPkts = ''
CassSlotZones = ''
Send_Info('Building Cassette Material Return data...')
FOR I = 1 TO RLCnt
PocketNo = RDSRec<RDS_POCKET$,I>
Zone = RDSRec<RDS_ZONE$,I>
WaferChar = RDSRec<RDS_WAFER_CHAR$,I>
PocketChar = RDSRec<RDS_POCKET_CHAR$,I>
InCass = RDSRec<RDS_IN_CASS_NO$,I>
InSlot = RDSRec<RDS_IN_SLOT_NO$,I>
OutCass = RDSRec<RDS_OUT_CASS_NO$,I>
OutSlot = RDSRec<RDS_OUT_SLOT_NO$,I>
IF WaferChar = 'PROD' AND InCass NE '' THEN
CassID = WONo:'*':WOStep:'*':InCass
LOCATE CassID IN CassIDs USING @FM SETTING Pos THEN
CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot)
CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RdsNo)
CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo)
CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone)
END ELSE
CassIDs = INSERT(CassIDs,Pos,0,0,CassID)
CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot)
CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RDSNo)
CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo)
CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone)
END
RDSRec<RDS_IN_CASS_NO$,I> = ''
RDSRec<RDS_IN_SLOT_NO$,I> = ''
RDSRec<RDS_POCKET_CHAR$,I> = ''
RDSRec<RDS_WAFER_CHAR$,I> = ''
END ;* End of test for PROD wafers
UNTIL ReloadFailed
NEXT I
RepCassIDs = ''
RepCassSlots = ''
RepCassSlotRDSNos = ''
RepCassSlotPkts = ''
RepCassSlotZones = ''
ReloadFailed = 0
CassIDCnt = COUNT(CassIDs,@FM) + (CassIDs NE '')
FOR I = 1 TO CassIDCnt
CassID = CassIDs<I>
Send_Info('Returning Material to WM_IN ':CassID:'...')
WONo = CassID[1,'*']
WOStep = CassID[COL2()+1,'*']
InCass = CassID[COL2()+1,'*']
owParms = WONo:@RM
owParms := WOStep:@RM
owParms := InCass:@RM
owParms := CassSlots<I>
Set_Status(0)
obj_WM_In('ReplaceWafer',owParms) ;* Puts wafer back in the WM_IN record
IF Get_Status(errCode) THEN
ReloadFailed = 1
RepCnt = COUNT(RepCassIDs,@FM) + (RepCassIDs NE '')
FOR N = 1 TO RepCnt
RepCassID = RepCassIDs<N>
Send_Info('Restoring WM_IN record ':RepCassID:'...')
WONo = RepCassID[1,'*']
WOStep = RepCassID[COL2()+1,'*']
InCass = RepCassID[COL2()+1,'*']
owParms = WONo:@RM
owParms := WOStep:@RM
owParms := InCass:@RM
owParms := RepCassSlots<N>
owParms := RepCassSlotRDSNos<N>
owParms := RepCassSlotPkts<N>
owParms := RepCassSlotZones<N>
obj_WM_In('ReplaceWafer',owParms)
NEXT N
END ELSE
RepCassIDs<-1> = CassIDs<I>
RepCassSlots<-1> = CassSlots<I>
RepCassSlotRDSNos<-1> = CassSlotRDSNos<I>
RepCassSlotPkts<-1> = CassSlotPkts<I>
RepCassSlotZones<-1> = CassSlotZones<I>
END
UNTIL ReloadFailed
NEXT I
IF NOT(ReloadFailed) THEN
Send_Info('Saving RDS record ':RdsNo:'...')
RDSRec<RDS_WAFERS_IN$> = 0
RDSRec<RDS_VERIFY_QTY$> = 0
RDSRec<RDS_CASS_WAFER_QTY$> = 0
RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
obj_Tables('WriteRec',RTParms)
Send_Info('Updating REACT_RUN record...')
RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH **********************************************
END ELSE
obj_Tables('UnlockRec',RTParms)
END
RETURN
* * * * * * *
RemovePocketNCR:
* * * * * * *
RDSNo = Parms[1,@RM]
NCRNo = Parms[COL2()+1,@RM]
IF RDSNo = '' THEN RETURN
IF NCRNo = '' THEN RETURN
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')'
IF NCRNo = '' THEN ErrorMsg = 'Null parameter "NCRNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
Set_Status(0)
RTParms = 'RDS':@RM:RdsNo
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
* RDSRec = obj_Tables('ReadRec',RTParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for LoadEpi update.'
RETURN
END
OutNCRs = RDSRec<RDS_OUT_NCR$>
Done = 0
LOOP
LOCATE NCRNo IN RDSRec<RDS_OUT_NCR$> USING @VM SETTING Pos THEN
RDSRec<RDS_OUT_NCR$,Pos> = ''
END ELSE
Done = 1
END
UNTIL Done
REPEAT
* RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
* obj_Tables('WriteRec',RTParms)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
RETURN
* * * * * * *
MetConversion:
* * * * * * *
* Updates entered data into RDS_LAYER and RDS_TEST records from RDS record
RETURN ;* Dead 4/16/2006 with installation of metrology and NCR updates
* * * * * * *
LoadTestWafers:
* * * * * * *
TWLine = 0
RDSTestRec = ''
IF RDSRec<RDS_TW_NMINUS_CNT$> NE '' THEN
TWType = 'N-'
FOR T = 1 TO COUNT(RDSRec<RDS_TW_NMINUS_CODE$>,@VM) + (RDSRec<RDS_TW_NMINUS_CODE$> NE '')
TWTool = RDSRec<RDS_TW_NMINUS_TOOL$,T>
TWCode = RDSRec<RDS_TW_NMINUS_CODE$,T>
TWTrans = RDSRec<RDS_TW_NMINUS_TRANS$,T>
TWCnt = RDSRec<RDS_TW_NMINUS_CNT$,T>
TWCon = RDSRec<RDS_TW_NMINUS_CON$,T>
TWRes = RDSRec<RDS_TW_NMINUS_RES$,T>
TWRho = RDSRec<RDS_TW_NMINUS_RHO$,T>
TWStress = RDSRec<RDS_TW_NMINUS_STRESS$,T>
TWThick = RDSRec<RDS_TW_NMINUS_THICK$,T>
GOSUB LoadTWLine
NEXT T
END
IF RDSRec<RDS_TW_NPLUS_CNT$> NE '' THEN
TWType = 'N+'
FOR T = 1 TO COUNT(RDSRec<RDS_TW_NPLUS_CODE$>,@VM) + (RDSRec<RDS_TW_NPLUS_CODE$> NE '')
TWTool = RDSRec<RDS_TW_NPLUS_TOOL$,T>
TWCode = RDSRec<RDS_TW_NPLUS_CODE$,T>
TWTrans = RDSRec<RDS_TW_NPLUS_TRANS$,T>
TWCnt = RDSRec<RDS_TW_NPLUS_CNT$,T>
TWCon = RDSRec<RDS_TW_NPLUS_CON$,T>
TWRes = RDSRec<RDS_TW_NPLUS_RES$,T>
TWRho = RDSRec<RDS_TW_NPLUS_RHO$,T>
TWStress = RDSRec<RDS_TW_NPLUS_STRESS$,T>
TWThick = RDSRec<RDS_TW_NPLUS_THICK$,T>
GOSUB LoadTWLine
NEXT T
END
IF RDSRec<RDS_TW_PMINUS_CNT$> NE '' THEN
TWType = 'P-'
FOR T = 1 TO COUNT(RDSRec<RDS_TW_PMINUS_CODE$>,@VM) + (RDSRec<RDS_TW_PMINUS_CODE$> NE '')
TWTool = RDSRec<RDS_TW_PMINUS_TOOL$,T>
TWCode = RDSRec<RDS_TW_PMINUS_CODE$,T>
TWTrans = RDSRec<RDS_TW_PMINUS_TRANS$,T>
TWCnt = RDSRec<RDS_TW_PMINUS_CNT$,T>
TWCon = RDSRec<RDS_TW_PMINUS_CON$,T>
TWRes = RDSRec<RDS_TW_PMINUS_RES$,T>
TWRho = RDSRec<RDS_TW_PMINUS_RHO$,T>
TWStress = RDSRec<RDS_TW_PMINUS_STRESS$,T>
TWThick = RDSRec<RDS_TW_PMINUS_THICK$,T>
GOSUB LoadTWLine
NEXT T
END
IF RDSRec<RDS_TW_PPLUS_CNT$> NE '' THEN
TWType = 'P+'
FOR T = 1 TO COUNT(RDSRec<RDS_TW_PPLUS_CODE$>,@VM) + (RDSRec<RDS_TW_PPLUS_CODE$> NE '')
TWTool = RDSRec<RDS_TW_PPLUS_TOOL$,T>
TWCode = RDSRec<RDS_TW_PPLUS_CODE$,T>
TWTrans = RDSRec<RDS_TW_PPLUS_TRANS$,T>
TWCnt = RDSRec<RDS_TW_PPLUS_CNT$,T>
TWCon = RDSRec<RDS_TW_PPLUS_CON$,T>
TWRes = RDSRec<RDS_TW_PPLUS_RES$,T>
TWRho = RDSRec<RDS_TW_PPLUS_RHO$,T>
TWStress = RDSRec<RDS_TW_PPLUS_STRESS$,T>
TWThick = RDSRec<RDS_TW_PPLUS_THICK$,T>
GOSUB LoadTWLine
NEXT T
END
IF RDSRec<RDS_TW_PROD_CNT$> NE '' THEN
TWType = 'Prod'
FOR T = 1 TO COUNT(RDSRec<RDS_TW_PROD_CODE$>,@VM) + (RDSRec<RDS_TW_PROD_CODE$> NE '')
TWTool = RDSRec<RDS_TW_PROD_TOOL$,T>
TWCode = RDSRec<RDS_TW_PROD_CODE$,T>
TWTrans = RDSRec<RDS_TW_PROD_TRANS$,T>
TWCnt = RDSRec<RDS_TW_PROD_CNT$,T>
TWCon = RDSRec<RDS_TW_PROD_CON$,T>
TWRes = RDSRec<RDS_TW_PROD_RES$,T>
TWRho = RDSRec<RDS_TW_PROD_RHO$,T>
TWStress = RDSRec<RDS_TW_PROD_STRESS$,T>
TWThick = RDSRec<RDS_TW_PROD_THICK$,T>
GOSUB LoadTWLine
NEXT T
END
IF RDSRec<RDS_TW_RECLAIM_CNT$> NE '' THEN
TWType = 'Reclaim'
FOR T = 1 TO COUNT(RDSRec<RDS_TW_RECLAIM_CODE$>,@VM) + (RDSRec<RDS_TW_RECLAIM_CODE$> NE '')
TWTool = RDSRec<RDS_TW_RECLAIM_TOOL$,T>
TWCode = RDSRec<RDS_TW_RECLAIM_CODE$,T>
TWTrans = RDSRec<RDS_TW_RECLAIM_TRANS$,T>
TWCnt = RDSRec<RDS_TW_RECLAIM_CNT$,T>
TWCon = RDSRec<RDS_TW_RECLAIM_CON$,T>
TWRes = RDSRec<RDS_TW_RECLAIM_RES$,T>
TWRho = RDSRec<RDS_TW_RECLAIM_RHO$,T>
TWStress = RDSRec<RDS_TW_RECLAIM_STRESS$,T>
TWThick = RDSRec<RDS_TW_RECLAIM_THICK$,T>
GOSUB LoadTWLine
NEXT T
END
RETURN
* * * * * * *
LoadTWLine:
* * * * * * *
TWLine += 1
RDSTestRec<RDS_TEST_TW_TYPE$,TWLine> = TWType
RDSTestRec<RDS_TEST_TW_TOOL$,TWLine> = TWTool
RDSTestRec<RDS_TEST_TW_CODE$,TWLine> = TWCode
RDSTestRec<RDS_TEST_TW_TRANS$,TWLine> = TWTrans
RDSTestRec<RDS_TEST_TW_CNT$,TWLine> = TWCnt
RDSTestRec<RDS_TEST_TW_CON$,TWLine> = TWCon
RDSTestRec<RDS_TEST_TW_RES$,TWLine> = TWRes
RDSTestRec<RDS_TEST_TW_RHO$,TWLine> = TWRho
RDSTestRec<RDS_TEST_TW_STRESS$,TWLine> = TWStress
RDSTestRec<RDS_TEST_TW_THICK$,TWLine> = TWThick
RETURN
* * * * * * *
SetPartNo:
* * * * * * *
RdsNos = Parms[1,@RM]
NewPartNo = Parms[COL2()+1,@RM]
RDSTableVar = Parms[COL2()+1,@RM]
IF RDSNos = '' THEN ErrorMsg = 'Null parameter "RDSNos" passed to routine. (':Method:')'
IF NewPartNo = '' THEN ErrorMsg = 'Null parameter "NewPartNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF RDSTableVar = '' THEN
rtParms = 'RDS':@RM:RdsNos
RDSTableVar = obj_Tables('LockSet',rtParms)
IF Get_Status(errCode) THEN RETURN
END
RdsCnt = COUNT(RdsNos,@VM) + (RdsNos NE '')
FOR I = 1 TO RdsCnt
RdsNo = RdsNos<1,I>
READ RDSRec FROM RDSTableVar,RdsNo THEN
RDSRec<RDS_PART_NUM$> = NewPartNo
rtParms = 'RDS':@RM:RDSNo:@RM:RDSTableVar:@RM:RDSRec
obj_Tables('WriteRec',rtParms) ;* Writes and unlocks the RDS records
Send_Info(' RDS record ':RDSNo:' Updated. ':I:'/':RdsCnt)
END
NEXT I
RETURN