COMPILE FUNCTION obj_React_Run(Method,Parms) #pragma precomp SRP_PreCompiler /* Methods for REACT_RUN table 02/20/2004 JCH - Initial Coding Properties: Methods: Create(DataStruct) ;* Create new record */ DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In DECLARE SUBROUTINE obj_Clean_Insp, Btree.Extract, Send_Info, obj_WO_Wfr, ErrMsg, obj_Post_Log, Logging_Services DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn, obj_Clean_Insp DECLARE FUNCTION obj_RDS_Test, obj_Test_Point_Map, obj_Popup, obj_WO_Wfr, Logging_Services, Environment_Services $INSERT APP_INSERTS $INSERT REACT_RUN_EQUATES $INSERT REACTOR_EQUATES $INSERT MSG_EQUATES $INSERT WO_VERIFY_EQU $INSERT WO_LOG_EQUATES $INSERT WO_WFR_EQUATES $INSERT RDS_LAYER_EQUATES $INSERT RDS_TEST_EQUATES $INSERT RUN_STAGE_EQUATES $INSERT RUN_STAGE_WFR_EQUATES $INSERT TOOL_EQUATES $INSERT TOOL_CLASS_EQUATES $INSERT POPUP_EQUATES $INSERT LOGICAL $INSERT QUOTE_SPEC_EQU $INSERT PROD_SPEC_EQUATES $INSERT WO_STEP_EQU $INSERT WO_MAT_EQUATES EQU COL$POCKET TO 1 ;* Susceptor Load columns EQU COL$USAGE TO 2 EQU COL$ZONE TO 3 EQU COL$SAT_ID TO 4 EQU COL$WAFER_TYPE TO 5 EQU COL$IN_SLOT_ID TO 6 EQU COL$WFR_ID TO 7 EQU COL$OUT_SLOT_ID TO 8 EQU COL$WO_NO TO 1 ;* Data structure equates for EpiMetData EQU COL$RDS_NO TO 2 EQU COL$REACTOR TO 3 EQU COL$Z1_MET_NO TO 4 EQU COL$Z1_THICKNESS TO 5 EQU COL$Z1_4PP_SHEET_RHO TO 6 EQU COL$Z1_HGCV_RESL1 TO 7 EQU COL$Z1_HGCV_RESL2 TO 8 EQU COL$Z2_MET_NO TO 9 EQU COL$Z2_THICKNESS TO 10 EQU COL$Z2_4PP_SHEET_RHO TO 11 EQU COL$Z2_HGCV_RESL1 TO 12 EQU COL$Z2_HGCV_RESL2 TO 13 EQU GWS$STAGE TO 1 ;* Used to extract data from 'GAN_WFR_STAGE' popup EQU GWS$DESC TO 2 EQU GWS$CHAR TO 3 EQU GWS$TOOL_CLASS TO 4 $INSERT PRS_LAYER_EQU ;* Used to return obj_Prod_Spec values LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\REACT_RUN' LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' LOAD_WFR_CNT.csv' Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'LOAD_WFR_CNT' objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM ErrTitle = 'Error in Stored Procedure "obj_React_Run"' 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 = 'RunStatus' ; GOSUB RunStatus CASE Method = 'Create' ; GOSUB Create CASE Method = 'GetMetKeys' ; GOSUB GetMetKeys CASE Method = 'Delete' ; GOSUB Delete CASE Method = 'ChangeFlag' ; GOSUB ChangeFlag CASE Method = 'EpiMetData' ; GOSUB EpiMetData CASE Method = 'SetSchedQty' ; GOSUB SetSchedQty CASE Method = 'WafersUnloaded' ; GOSUB WafersUnloaded CASE Method = 'Zone' ; GOSUB Zone CASE Method = 'SigProfile' ; GOSUB SigProfile CASE Method = 'SigBy' ; GOSUB SigBy CASE Method = 'SigDTM' ; GOSUB SigDTM CASE Method = 'WfrsUnloadedDt' ; GOSUB WfrsUnloadedDt CASE Method = 'AddCI' ; GOSUB AddCI CASE Method = 'GetCINo' ; GOSUB GetCINo CASE Method = 'LoadMat' ; GOSUB LoadMat CASE Method = 'ReturnMat' ; GOSUB ReturnMat CASE Method = 'UnloadMat' ; GOSUB UnloadMat CASE Method = 'ReloadMat' ; GOSUB ReloadMat CASE Method = 'UnloadGan' ; GOSUB UnloadGan CASE Method = 'ReloadGan' ; GOSUB ReloadGan CASE Method = 'SplitWfr' ; GOSUB SplitWfr CASE Method = 'UnSplitWfr' ; GOSUB UnSplitWfr CASE Method = 'GetWfrSigKeys' ; GOSUB GetWfrSigKeys CASE Method = 'NextWfrStage' ; GOSUB NextWfrStage CASE Method = 'ShipGANWfrs' ; GOSUB ShipGANWfrs CASE Method = 'UnShipGANWfrs' ; GOSUB UnShipGANWfrs CASE Method = 'CharWfrDest' ; GOSUB CharWfrDest CASE Method = 'CharWfrStatus' ; GOSUB CharWfrStatus CASE Method = 'ClearCarrNCR' ; GOSUB ClearCarrNCR CASE Method = 'GaNDispStatus' ; GOSUB GaNDispStatus Case Method = 'WfrStageUnloadQ' ; Gosub WfrStageUnloadQ CASE Method = 'StageUnloadQ' ; GOSUB StageUnloadQ CASE 1 END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * Create: * * * * * * * WONo = Parms[1,@RM] WOStep = Parms[COL2()+1,@RM] CassNo = Parms[COL2()+1,@RM] PSNo = Parms[COL2()+1,@RM] IF WONo = '' THEN ErrorMsg = 'Null Parameter "WONo" passed to routine. (':Method:')' IF WOStep = '' THEN ErrorMsg = 'Null Parameter "WOStep" passed to routine. (':Method:')' IF CassNo = '' THEN ErrorMsg = 'Null Parameter "CassNo" passed to routine. (':Method:')' IF PSNo = '' THEN ErrorMsg = 'Null Parameter "PSNo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN RunNo = NextKey('REACT_RUN') RunRec = '' RunRec = WONo RunRec = WOStep RunRec = CassNo RunRec = @USER4 RunRec = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MT'),'DT') PSRec = XLATE('PROD_SPEC',PSNo,'','X') ReactorType = PSRec RunRec = PSRec LayerSpecs = obj_Prod_Spec('GetLayerProp',PSNo:@RM:@RM:1) ;* Returns specs for all layers in internal format * LayerSpecs is @RM between layers, @FM between fields, LayerSet ID is in the first Field and needs to peeled off * before the equates match up correctly * Prod_Spec table has layer specs all in one field * RDS has First layer stuff in individual fields and then has 2 and 3 shoved into Field 33 (Layer Info) LayerSpec = FIELD(LayerSpecs,@RM,1) ;* Take the first Layer LayerSet = FIELD(LayerSpec,@FM,1) ;* Not used here but shown for clarity LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet RecipeNo = LayerSpec RecipeRec = XLATE('RECIPE',RecipeNo,'','X') ;* This used in 2nd and 3rd layer stuff (in error it appears) FOR I = 1 TO COUNT(LayerSpecs,@RM) + (LayerSpecs NE '') LayerSpec = FIELD(LayerSpecs,@RM,I) ;* Take the Ith Layer LayerSet = FIELD(LayerSpec,@FM,1) LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet obj_RDS_Layer('Create',RunNo:@RM:LayerSet:@RM:PSNo) RunRec = RunNo:'*':LayerSet obj_RDS_Test('Create',RunNo:@RM:LayerSet:@RM:PSNo) NEXT I ************************ psCnt = COUNT(PRSStageKeys,@VM) + (PRSStageKeys NE '') FOR N = 1 TO psCnt Stage = FIELD(PRSStageKey<1,N>,'*',2) IF Stage = 'PRE' AND ReactorType NE 'EPP' THEN CINo = obj_Clean_Insp('Create',RunNo:@RM:Stage:@RM:PSNo:@RM:PSRec) ;* This is a new CLEAN_INSP record RunRec = INSERT(RunRec,REACT_RUN_CI_NO$,Pos,0,CINo) RunRec = INSERT(RunRec,REACT_RUN_CI_STAGE$,Pos,0,Stage) END ;* End of check for EpiPRO reactor IF INDEX(PRSStageKeys,'WI',1) THEN WfrCINo = obj_Clean_Insp('Create',RunNo:@RM:'WFR':@RM:PSNo:@RM:PSRec) ;* This is a new CLEAN_INSP record RunRec = WfrCINo END IF ReactorType NE 'EPP' THEN IF INDEX(PRSStageKeys,'POST',1) THEN PostCINo = obj_Clean_Insp('Create',RunNo:@RM:'POST':@RM:PSNo:@RM:PSRec) ;* This is a new CLEAN_INSP record RunRec = PostCINo END END ;* End of check for EpiPRO reactor NEXT N obj_Tables('WriteRec','REACT_RUN':@RM:RunNo:@RM:@RM:RunRec) Result = RunNo RETURN * * * * * * * RunStatus: * * * * * * * IF NOT(ASSIGNED(RDSNo)) THEN RDSNo = Parms[1,@RM] ReactRunRec = Parms[COL2()+1,@RM] END IF RDSNo = '' THEN RETURN IF ReactRunRec = '' THEN ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X') END LSKeys = ReactRunRec MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH IF MetOutOfSpec > 0 THEN Result = 'SPEC' RETURN END ReactType = XLATE('REACTOR',ReactRunRec,REACTOR_REACT_TYPE$,'X') IF ReactType = 'EPP' THEN PocketChars = ReactRunRec InCassNos = ReactRunRec OutCassNos = ReactRunRec WaferChars = ReactRunRec UnloadSig = ReactRunRec TestFlag = 0 ProdTestFlag = 0 ProductionWafersLoaded = 0 ProductionWafersUnloaded = 0 FOR I = 1 TO COUNT(InCassNos,@VM) + (InCassNos NE '') PocketChar = PocketChars<1,I> WaferChar = WaferChars<1,I> IF PocketChar = 'TEST' THEN IF WaferChar = 'PROD' THEN ProdTestFlag = 1 IF WaferChar = 'TEST' THEN TestFlag = 1 END ELSE IF PocketChar = '' THEN IF InCassNos<1,I> NE '' THEN ProductionWafersLoaded += 1 IF OutCassNos<1,I> NE '' THEN ProductionWafersUnloaded += 1 END END NEXT I MetEntered = XLATE('RDS_LAYER',LSKeys,'TEST_MET_ENTERED','X') IF INDEX(MetEntered,'0',1) THEN MetComplete = 0 END ELSE MetComplete = 1 END BEGIN CASE CASE ProductionWafersLoaded = 0 AND (TestFlag = 1 OR ProdTestFlag = 1) AND UnloadSig = '' ; Result = 'TLOAD' CASE ProductionWafersLoaded = 0 AND (TestFlag = 1 OR ProdTestFlag = 1) AND UnloadSig NE '' ; Result = 'TULOAD' CASE ProductionWafersLoaded = 0 AND TestFlag = 0 ; Result = 'RLOAD' CASE ProductionWafersLoaded > 0 AND ProductionWafersUnloaded = 0 ; Result = 'LOAD' CASE ProductionWafersLoaded = ProductionWafersUnloaded AND MetComplete = 1 ; Result = 'ULOAD' CASE ProductionWafersLoaded = ProductionWafersUnloaded AND MetComplete = 0 ; Result = 'ULMET' CASE 1 ; *Result = 'UNK' END CASE END ELSE WONo = ReactRunRec CassNo = ReactRunRec WOStep = ReactRunRec WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X') RDSKeys = '' RSCnt = 0 RunSigProfs = '' RunSignatures = '' RunSigDTMs = '' AllSigs = WOMatRec asCnt = COUNT(AllSigs,@VM) + (AllSigs NE '') FOR I = 1 TO asCnt IF AllSigs<1,I>[1,1] = WOStep THEN RSCnt += 1 RunSigProfs<1,RSCnt> = AllSigs<1,I> RunSignatures<1,RSCnt> = WOMatRec RunSigDTMs<1,RSCnt> = WOMatRec END NEXT I ProcessStart = 0 ProcessComp = 0 LOOP RunSignature = RunSignatures<1,1> RunSigProf = RunSigProfs<1,1> UNTIL RunSignature = '' ProcessStart = 1 RunSignatures = DELETE(RunSignatures,1,1,0) RunSigProfs = DELETE(RunSigProfs,1,1,0) REPEAT IF RunSignature = '' AND RunSigProf = '' AND ProcessStart = 1 THEN Result = 'COMP' RETURN END ELSE Result = RunSigProf[2,20] RETURN END END // ROTR inspection failure check -> Set status to PSTC (PostCleans) If Result EQ 'ULOAD' then RotrAction = XLATE('REACT_RUN',RDSNo,'ROTR_ACTION','X') IF RotrAction = 'F' Then ;* Drive the CURR_STATUS to PostEpi Clean if the ROTR fails Result = 'PSTC' RETURN END end 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('REACT_RUN',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 LSMetKey = LSMetKeys FOR N = 1 TO COUNT(LSMetKey,@VM) + (LSMetKey NE '') ResultLine += 1 Result<1,ResultLine> = FIELD(SortedLSKey,'*',2):'*':RDSMetZones Result<2,ResultLine> = LSMetKeys NEXT N NEXT I END RETURN * * * * * * * Delete: * * * * * * * RdsNos = Parms[1,@RM] TableVar = Parms[COL2()+1,@RM] IF RdsNos = '' THEN RETURN IF TableVar = '' THEN RETURN ;* Lock set should be called just prior to this to lock all the RDS's for deletion RdsDTMs = XLATE('REACT_RUN',RdsNos,REACT_RUN_VER_SIG_DTM$,'X') CONVERT @FM TO @VM IN RdsDTMs TestString = RdsDTMs CONVERT @VM TO '' IN TestString IF TestString NE '' THEN FOR I = 1 TO COUNT(RdsDTMs,@VM) + (RdsDTMs NE '') IF RdsDTMs<1,I> NE '' THEN Result<1,-1> = RdsNos<1,I> ;* Return list of RdsNos that have started processing and cannot be deleted END NEXT I ErrorMsg = 'Production started on one or more RDS No(s).' RETURN END FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '') RdsNo = RdsNos<1,I> ReactRunRec = XLATE('REACT_RUN',RdsNo,'','X') LSKeys = ReactRunRec MetKeys = XLATE('RDS_LAYER',LSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X') RTParms = 'REACT_RUN':@RM:RdsNo:@RM:TableVar:@RM obj_Tables('UnlockRec',RTParms) IF ReactRunRec NE '' THEN obj_Clean_Insp('Delete',ReactRunRec) END IF ReactRunRec NE '' THEN obj_Clean_Insp('Delete',ReactRunRec) END IF ReactRunRec NE '' THEN obj_Clean_Insp('Delete',ReactRunRec) END obj_RDS_Test('Delete',MetKeys) obj_RDS_Layer('Delete',LSKeys) obj_Tables('DeleteRec','REACT_RUN':RTParms) ;* Deletes and removes the lock NEXT I RETURN * * * * * * * ChangeFlag: * * * * * * * RDSNo = Parms[1,@RM] FieldNo = Parms[COL2()+1,@RM] Value = Parms[COL2()+1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')' IF FieldNo = '' THEN ErrorMsg = 'Null parameter "Property" passed to routine. (':Method:')' IF Value = '' OR Value = '0' OR Value = '1' ELSE ErrorMsg = 'Invalid Flag ':QUOTE(Value):' passed to routine. (':Method:')' END IF ErrorMsg NE '' THEN RETURN otParms = 'REACT_RUN':@RM:RDSNo ReactRunRec = obj_Tables('ReadRec',otParms) IF Get_Status(errCode) THEN RETURN ;* Probably locked -> return ReactRunRec = Value otParms = FieldStore(OtParms,@RM,4,0,ReactRunRec) ;* Put record in 4th field of OtParms obj_Tables('WriteRec',otParms) RETURN * * * * * * * SetSchedQty: * * * * * * * * This looks like it isn't finished JCH 1/6/2009 JCH ************************** RDSNo = Parms[1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN otParms = 'REACT_RUN':@RM:RDSNo ReactRunRec = obj_Tables('ReadRec',otParms) IF Get_Status(errCode) THEN RETURN ;* Probably locked -> return IF ReactRunRec = 1 OR ReactRunRec NE '' THEN obj_Tables('UnlockRec',otParms) RETURN END WONo = ReactRunRec CassNo = ReactRunRec WOMatRec = '' otParms = FieldStore(OtParms,@RM,4,0,ReactRunRec) ;* Put record in 4th field of OtParms obj_Tables('WriteRec',otParms) RETURN * * * * * * * EpiMetData: * * * * * * * RDSNo = Parms[1,@RM] ReactRunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF ReactRunRec = '' THEN ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X') END IF ReactRunRec = '' THEN RETURN Reactor = ReactRunRec ReactType = XLATE('REACTOR',Reactor,1,'X') IF ReactType NE 'EPP' THEN RETURN DataArray = '' DataArray<1,COL$WO_NO> = 'WO No' DataArray<1,COL$RDS_NO> = 'RDS No' DataArray<1,COL$REACTOR> = 'Reactor' DataArray<1,COL$Z1_MET_NO> = 'Z1 Met No' DataArray<1,COL$Z1_THICKNESS> = 'Z1 Thickness' DataArray<1,COL$Z1_4PP_SHEET_RHO> = 'Z1 4PP Sheet Rho' DataArray<1,COL$Z1_HGCV_RESL1> = 'Z1 HgCV Res L1' DataArray<1,COL$Z1_HGCV_RESL2> = 'Z1 HgCV Res L2' DataArray<1,COL$Z2_MET_NO> = 'Z2 Met No' DataArray<1,COL$Z2_THICKNESS> = 'Z2 Thickness' DataArray<1,COL$Z2_4PP_SHEET_RHO> = 'Z2 4PP Sheet Rho' DataArray<1,COL$Z2_HGCV_RESL1> = 'Z2 HgCV Res L1' DataArray<1,COL$Z2_HGCV_RESL2> = 'Z2 HgCV Res L2' NextLine = 2 WONo = ReactRunRec WOStep = ReactRunRec LSKeys = ReactRunRec Z1MetKeys = {MET_KEYS_Z1} Z2MetKeys = {MET_KEYS_Z2} Z1MetNo = Z1MetKeys[-1,'B':@VM] Z2MetNo = Z2MetKeys[-1,'B':@VM] Z1MetRec = XLATE('RDS_TEST',Z1MetNo,'','X') Z2MetRec = XLATE('RDS_TEST',Z2MetNo,'','X') Z1TestPointMap = Z1MetRec Z2TestPointMap = Z2MetRec Z1MetReadings = '' Z2MetReadings = '' Z1Results = '' Z2Results = '' Z1MetKeyCnt = COUNT(Z1MetKeys,@VM) + (Z1MetKeys NE '') FOR I = 1 TO Z1MetKeyCnt Z1MetKey = Z1MetKeys<1,I> Z1LMetReadings = obj_RDS_Test('GetReadSet',Z1MetKey) IF I = 1 THEN Z1MetReadings<1> = Z1LMetReadings<1> ;* Line Numbers Z1MetReadings<3> = Z1LMetReadings<3> ;* SheetRho Z1MetReadings<4> = Z1LMetReadings<4> ;* Hgcv END IF Z1MetKeyCnt = 1 THEN Z1MetReadings<2> = Z1LMetReadings<2> ;* Thickness readings END ELSE IF I = 2 THEN Z1MetReadings<5> = Z1LMetReadings<4> ;* Hgcv IF I = 3 THEN Z1MetReadings<2> = Z1LMetReadings<2> ;* Thickness readings END NEXT I IF Z1MetReadings<1> NE '' THEN CONVERT @FM TO @RM IN Z1MetReadings oTPM_Parms = Z1TestPointMap:@RM:Z1MetReadings Z1Results = obj_Test_Point_Map('PointToResult',oTPM_Parms) END Z2MetKeyCnt = COUNT(Z2MetKeys,@VM) + (Z2MetKeys NE '') FOR I = 1 TO Z2MetKeyCnt Z2MetKey = Z2MetKeys<1,I> Z2LMetReadings = obj_RDS_Test('GetReadSet',Z2MetKey) IF I = 1 THEN Z2MetReadings<1> = Z2LMetReadings<1> ;* Line Numbers Z2MetReadings<3> = Z2LMetReadings<3> ;* SheetRho Z2MetReadings<4> = Z2LMetReadings<4> ;* Hgcv END IF Z2MetKeyCnt = 1 THEN Z2MetReadings<2> = Z2LMetReadings<2> ;* Thickness readings END ELSE IF I = 2 THEN Z2MetReadings<5> = Z2LMetReadings<4> ;* Hgcv IF I = 3 THEN Z2MetReadings<2> = Z2LMetReadings<2> ;* Thickness readings END NEXT I IF Z2MetReadings<1> NE '' THEN CONVERT @FM TO @RM IN Z2MetReadings oTPM_Parms = Z2TestPointMap:@RM:Z2MetReadings Z2Results = obj_Test_Point_Map('PointToResult',oTPM_Parms) END Z1Cnt = COUNT(Z1Results<1>,@VM) + (Z1Results<1> NE '') Z2Cnt = COUNT(Z2Results<1>,@VM) + (Z2Results<1> NE '') ResultCnt = Z1Cnt IF Z2Cnt > ResultCnt THEN ResultCnt = Z2Cnt IF ResultCnt = 0 THEN DataArray = WONo DataArray = Reactor DataArray = @ID DataArray = Z1MetNo DataArray = Z2MetNo NextLine += 1 END FOR N = 1 TO ResultCnt IF N = 1 THEN DataArray = WONo DataArray = Reactor DataArray = @ID DataArray = Z1MetNo DataArray = Z2MetNo END DataArray = Z1Results<2,N> DataArray = Z1Results<3,N> DataArray = Z1Results<4,N> DataArray = Z1Results<5,N> DataArray = Z2Results<2,N> DataArray = Z2Results<3,N> DataArray = Z2Results<4,N> DataArray = Z2Results<5,N> NextLine += 1 NEXT N Result = DataArray RETURN * * * * * * * WafersUnloaded: * * * * * * * IF NOT(ASSIGNED(RDSNo)) THEN RDSNo = Parms[1,@RM] IF NOT(ASSIGNED(ReactRunRec)) THEN ReactRunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF ReactRunRec = '' THEN ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X') ReactNo = ReactRunRec ReactType = XLATE('REACTOR',ReactNo,REACTOR_REACT_TYPE$,'X') IF ReactType = 'EPP' THEN * EpiPro run OutCassNos = ReactRunRec OutCassCnt = COUNT(OutCassNos,@VM) + (OutCassNos NE '') UnloadQty = '' FOR I = 1 TO OutCassCnt IF OutCassNos<1,I> NE '' THEN UnloadQty += 1 NEXT I Result = UnloadQty ;* Qty unloaded into WMO cassette (no product test wafers) END ELSE * ASM run WafersIn = ReactRunRec ;* Operator verified wafer qty loaded into reactor If Not(Num(WafersIn)) then // Log the WafersIn value LogData = '' LogData<1> = LoggingDTM LogData<2> = RDSNo LogData<3> = WafersIn Logging_Services('AppendLog', objLog, LogData, @RM, @FM) WafersIn = WafersIn<1, 1, 1> end TestKeys = XLATE('RDS_LAYER',ReactRunRec,3,'X') TWProd = obj_RDS_Test('ProdTestCount',TestKeys) IF WafersIn > 0 AND TWProd <= WafersIn THEN Result = WafersIn - TWProd END ELSE Result = '' END END RETURN * * * * * * * Zone: * * * * * * * RunIDs = Parms[1,@RM] IF RunIDs = '' THEN RETURN ItemCnt = Count(RunIDs,@VM) + (RunIDs NE '') PrevRDS = '' Ans = '' FOR I = 1 TO ItemCnt RunID = RunIDs<1,I> RDSNo = RunID[1,'.'] Pocket = RunID[COL2()+1,'.'] IF RDSNo NE PrevRDS THEN PreRDS = RDSNo ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X') END ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X') LOCATE Pocket IN ReactRunRec USING @VM SETTING Pos THEN Result<1,I> = ReactRunRec END NEXT I RETURN * * * * * * * SigProfile: * * * * * * * RDSNo = Parms[1,@RM] RRunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RRunRec = '' THEN RRunRec = XLATE('REACT_RUN',RDSNo,'','X') END IF RRunRec = '' THEN RETURN ReactType = XLATE('REACT_RUN',RDSNo,'PS_REACT_TYPE_CODE','X') WONo = RRunRec WOStep = RRunRec IF ReactType = 'GAN' THEN SigProfile = RRunRec SWAP RDSNo:'*' WITH '' IN SigProfile END ELSE CassNo = RRunRec AllSigProfile = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_PROFILE$,'X') SigProfile = '' ASigCnt = COUNT(AllSigProfile,@VM) + (AllSigProfile NE '') FOR I = 1 TO ASigCnt IF AllSigProfile<1,I>[1,1] = WOStep THEN SigProfile<1,-1> = AllSigProfile<1,I> END NEXT I END ;* End of check for ReactType Result = SigProfile RETURN * * * * * * * SigBy: * * * * * * * RDSNo = Parms[1,@RM] RRunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RRunRec = '' THEN RRunRec = XLATE('REACT_RUN',RDSNo,'','X') END IF RRunRec = '' THEN RETURN ReactType = XLATE('REACT_RUN',RDSNo,'PS_REACT_TYPE_CODE','X') WONo = RRunRec WOStep = RRunRec IF ReactType = 'GAN' THEN StageKeys = RRunRec SigBys = XLATE('RUN_STAGE',StageKeys,RUN_STAGE_COMP_BY$,'X') END ELSE CassNo = RRunRec AllSigProfile = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_PROFILE$,'X') AllSigBys = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIGNATURE$,'X') SigBys = '' ASigCnt = COUNT(AllSigProfile,@VM) + (AllSigProfile NE '') FOR I = 1 TO ASigCnt IF AllSigProfile<1,I>[1,1] = WOStep THEN SigBys<1,-1> = AllSigBys<1,I> END NEXT I END ;* End of check for ReactType Result = SigBys RETURN * * * * * * * SigDTM: * * * * * * * RDSNo = Parms[1,@RM] RRunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RRunRec = '' THEN RRunRec = XLATE('REACT_RUN',RDSNo,'','X') END IF RRunRec = '' THEN RETURN ReactType = XLATE('REACT_RUN',RDSNo,'PS_REACT_TYPE_CODE','X') WONo = RRunRec WOStep = RRunRec IF ReactType = 'GAN' THEN StageKeys = RRunRec SigDTMs = XLATE('RUN_STAGE',StageKeys,RUN_STAGE_COMP_DTM$,'X') END ELSE CassNo = RRunRec AllSigProfile = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_PROFILE$,'X') AllSigDtms = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_DTM$,'X') SigDtms = '' ASigCnt = COUNT(AllSigProfile,@VM) + (AllSigProfile NE '') FOR I = 1 TO ASigCnt IF AllSigProfile<1,I>[1,1] = WOStep THEN SigDTMs<1,-1> = AllSigDTMs<1,I> END NEXT I END ;* End of check for ReactType Result = SigDTMs RETURN * * * * * * * WfrsUnloadedDt: * * * * * * * ReactNo = Parms[1,@RM] UnloadDt = Parms[COL2()+1,@RM] IF ReactNo = '' THEN RETURN IF UnloadDt = '' THEN UnloadDt = OCONV(Date(),'D4/') ;* Default to today's date thisUnloadDt = ICONV(UnloadDt,'D') IF thisUnloadDt = '' THEN RETURN END OPEN 'DICT.REACT_RUN' TO DictVar ELSE ErrorMsg = 'Unable to open "DICT.REACT_RUN" for lookup' RETURN END SearchString = 'REACT_NO_UNLOAD_DT':@VM:ReactNo:'.':thisUnloadDt:@FM Option = '' Flag = '' Btree.Extract(SearchString,'REACT_RUN',DictVar,ReactRunKeys,Option,Flag) RunCnt = COUNT(ReactRunKeys,@VM) + (ReactRunKeys NE '') TotWfrsUnloaded = 0 FOR RKPos = 1 TO RunCnt RDSNo = ReactRunKeys<1,RKPos> ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X') GOSUB WafersUnloaded TotWfrsUnloaded += Result Result = '' NEXT RKPos Result = TotWfrsUnloaded RETURN * * * * * * * AddCI: * * * * * * * RDSNo = Parms[1,@RM] Stage = Parms[COL2()+1,@RM] CINo = Parms[COL2()+1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')' IF Stage = '' THEN ErrorMsg = 'Null parameter "Stage" passed to routine. (':Method:')' IF CINo = '' THEN ErrorMsg = 'Null parameter "CINo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN otParms = 'REACT_RUN':@RM:RDSNo RunRec = obj_Tables('ReadRec',otParms) IF Get_Status(errCode) THEN RETURN RunRec = INSERT(RunRec,REACT_RUN_CI_NO$,1,0,CINo) RunRec = INSERT(RunRec,REACT_RUN_CI_STAGE$,1,0,Stage) otParms = FieldStore(OtParms,@RM,4,0,RunRec) ;* Put record in 4th field of OtParms obj_Tables('WriteRec',otParms) RETURN * * * * * * * GetCINo: * * * * * * * RDSNo = Parms[1,@RM] ReactRunRec = Parms[COL2()+1,@RM] Stage = Parms[COL2()+1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')' IF Stage = '' THEN ErrorMsg = 'Null parameter "Stage" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN IF ReactRunRec = '' THEN ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X') END IF ReactRunRec = '' THEN RETURN LOCATE Stage IN ReactRunRec USING @VM SETTING Pos THEN Result = ReactRunRec END RETURN * * * * * * * LoadMat: * * * * * * * RdsNo = Parms[1,@RM] ToolID = Parms[COL2()+1,@RM] ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration SlotWfrKeys = Parms[COL2()+1,@RM] ;* Contains SlotInID:@VM:WfrID:@VM:Scribe on each line IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.' IF SlotWfrKeys = '' THEN ErrorMsg = 'Null parameter "SlotWfrKeys" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Send_Info('Reading REACT_RUN ':RdsNo:'...') lCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') FOR I = lCnt TO 1 STEP -1 TestVal = ReactorList UNTIL TestVal NE '' ReactorList = DELETE(ReactorList,I,0,0) ;* Strip empty lines from the user interface edit table NEXT I Set_Status(0) RTParms = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.' RETURN END CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') rCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') WfrIDs = '' RunLocs = '' CurrSlotIDS = '' Scribes = '' swPointer = 1 FOR I = 1 TO rCnt IF ReactorList = '' AND ReactorList = '' AND ReactorList NE 'DUMMY' THEN * Empty Pocket and needs a wafer CurrSlot = SlotWfrKeys WfrID = SlotWfrKeys Scribe = SlotWfrKeys NewSlot = '' RunLoc = RDSNo:'.':ReactorList:'.':ReactorList WfrIDs<1,-1> = WfrID RunLocs<1,-1> = RunLoc CurrSlotIDs<1,-1> = CurrSlot Scribes<1,-1> = Scribe owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'LOAD':@RM ;* Event owwParms := '':@RM ;* New Slot ID owwParms := RunLoc:@RM ;* RPZ (RDSNo*Pocket*Zone) owwParms := '':@RM ;* NCRNo owwParms := '':@RM ;* TWUse ID owwParms := CurrSlot:@RM ;* Current Slot ID owwParms := ToolID:@RM ;* New ToolID owwParms := '':@RM ;* Curr Tool ID owwParms := '':@RM ;* NewInvLoc owwParms := '':@RM ;* CurrInvLoc owwParms := 'I':@RM ;* Wfr Side owwParms := '':@RM ;* NewCarrLocs owwParms := '':@RM ;* CurrCarrLocs owwParms := Scribe ;* Scribe ;* Added 9/7/2016 JCH obj_WO_Wfr('AddEvent',owwParms) RR_Rec = CurrSlot RR_Rec = WfrID RR_Rec = 'PROD' swPointer += 1 END ELSE RR_Rec = '' RR_Rec = '' RR_Rec = ReactorList END RR_Rec = ReactorList RR_Rec = ReactorList RR_Rec = ReactorList RR_Rec = ReactorList RR_Rec = '' NEXT I ReactNo = ToolID[2,20] RR_Rec = ReactNo RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * * * ReturnMat: * * * * * * * RdsNo = Parms[1,@RM] ToolID = Parms[COL2()+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 = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.' RETURN END WONo = RR_Rec WOStep = RR_Rec RLCnt = COUNT(RR_Rec,@VM) + (RR_Rec NE '') CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') FOR I = 1 TO RLCnt WfrID = RR_Rec NewSlot = RR_Rec IF WfrID NE '' THEN owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'REPLACE':@RM ;* Event owwParms := NewSlot:@RM ;* New Slot ID owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone) owwParms := '':@RM ;* NCRNo owwParms := '':@RM ;* TWUse ID owwParms := '':@RM ;* Current Slot ID owwParms := '':@RM ;* NewToolID (Load Tool) owwParms := ToolID:@RM ;* CurrToolD (Unload Tool) owwParms := '':@RM ;* NewInvLoc owwParms := '':@RM ;* CurrInvLoc owwParms := 'I' ;* Wfr Side obj_WO_Wfr('AddEvent',owwParms) END RR_Rec = '' RR_Rec = '' RR_Rec = '' RR_Rec = '' RR_Rec = '' RR_Rec = '' RR_Rec = '' NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * * * UnloadMat: * * * * * * * RdsNo = Parms[1,@RM] ToolID = Parms[COL2()+1,@RM] ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration UnloadSlots = Parms[COL2()+1,@RM] ;* Contains SlotInID:@VM:WfrID:@VM:Scribe on each line IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.' IF UnloadSlots = '' THEN ErrorMsg = 'Null parameter "UnloadSlots" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Send_Info('Reading REACT_RUN ':RdsNo:'...') lCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') FOR I = lCnt TO 1 STEP -1 TestVal = ReactorList UNTIL TestVal NE '' ReactorList = DELETE(ReactorList,I,0,0) ;* Strip empty lines from the user interface edit table NEXT I Set_Status(0) RTParms = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.' RETURN END CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') rCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') ulPointer = 1 FOR I = 1 TO rCnt IF ReactorList = '' AND ReactorList = 'PROD' AND ReactorList = '' THEN * Empty Pocket and needs a wafer NewSlot = UnloadSlots WfrID = ReactorList owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'UNLOAD':@RM ;* Event owwParms := NewSlot:@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 := ToolID:@RM ;* Curr Tool ID owwParms := '':@RM ;* NewInvLoc owwParms := '':@RM ;* CurrInvLoc owwParms := 'O' ;* Wfr Side obj_WO_Wfr('AddEvent',owwParms) RR_Rec = NewSlot ulPointer += 1 END NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * * * ShipGANWfrs: * * * * * * * RDSNo = Parms[1,@RM] ShipSlots = Parms[COL2()+1,@RM] ShipWfrs = Parms[COL2()+1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ShipSlots = '' THEN ErrorMsg = 'Null parameter "ShipSlots" passeed to routine.' IF ShipWfrs = '' THEN ErrorMsg = 'Null parameter "ShipWfrs" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Set_Status(0) RTParms = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.' RETURN END CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') wCnt = COUNT(ShipWfrs,@VM) + (ShipWfrs NE '') FOR I = 1 TO wCnt WfrID = ShipWfrs<1,I> NewSlot = ShipSlots<1,I> LOCATE WfrID IN RR_Rec USING @VM SETTING Pos THEN RR_Rec = ShipSlots<1,I> END LOCATE WfrID IN RR_Rec USING @VM SETTING cPos THEN CurrCarrSlot = RR_Rec END ELSE CurrCarrSlot = '' END CurrInvLoc = obj_WO_Wfr('CurrLoc',WfrID)<1,4> owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'DISP':@RM ;* Event owwParms := NewSlot:@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 := CurrInvLoc:@RM ;* CurrInvLoc ;* GaN Disposition Queue owwParms := 'O':@RM ;* Wfr Side owwParms := '':@RM ;* New Carrier Loc owwParms := CurrCarrSlot ;* Curr Carrier Loc obj_WO_Wfr('AddEvent',owwParms) NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * * * UnShipGANWfrs: * * * * * * * RDSNo = Parms[1,@RM] ShipSlots = Parms[COL2()+1,@RM] ShipWfrs = Parms[COL2()+1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ShipSlots = '' THEN ErrorMsg = 'Null parameter "ShipSlots" passeed to routine.' IF ShipWfrs = '' THEN ErrorMsg = 'Null parameter "ShipWfrs" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Set_Status(0) RTParms = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.' RETURN END CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') wCnt = COUNT(ShipWfrs,@VM) + (ShipWfrs NE '') FOR I = 1 TO wCnt WfrID = ShipWfrs<1,I> CurrSlot = ShipSlots<1,I> LOCATE WfrID IN RR_Rec USING @VM SETTING Pos THEN RR_Rec = '' END CurrCarrSlot = '' owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'DISP':@RM ;* Event owwParms := '':@RM ;* New Slot ID owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone) owwParms := '':@RM ;* NCRNo owwParms := '':@RM ;* TWUse ID owwParms := CurrSlot:@RM ;* Current Slot ID owwParms := '':@RM ;* New ToolID owwParms := '':@RM ;* Curr Tool ID owwParms := 'GCH*Q_PACK':@RM ;* NewInvLoc ;* GaN Disposition Queue owwParms := '':@RM ;* CurrInvLoc owwParms := 'O':@RM ;* Wfr Side owwParms := '':@RM ;* New Carrier Loc owwParms := CurrCarrSlot ;* Curr Carrier Loc obj_WO_Wfr('AddEvent',owwParms) NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * * * ReloadMat: * * * * * * * RdsNo = Parms[1,@RM] ToolID = Parms[COL2()+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 = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) *RR_Rec = XLATE('REACT_RUN',RDSNo,'','X') IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.' RETURN END RLCnt = COUNT(RR_Rec,@VM) + (RR_Rec NE '') CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') FOR I = 1 TO RLCnt WfrID = RR_Rec OutSlotID = RR_Rec RunLoc = RDSNo:'.':RR_Rec:'.':RR_Rec IF OutSlotID NE '' THEN owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'RELOAD':@RM ;* Event owwParms := '':@RM ;* New Slot ID owwParms := RunLoc:@RM ;* RPZ (RDSNo*Pocket*Zone) owwParms := '':@RM ;* NCRNo owwParms := '':@RM ;* TWUse ID owwParms := OutSlotID:@RM ;* Current Slot ID owwParms := ToolID:@RM ;* NewToolID (Load Tool) owwParms := '':@RM ;* CurrToolD (Unload Tool) owwParms := '':@RM ;* NewInvLoc owwParms := '':@RM ;* CurrInvLoc owwParms := 'O' ;* Wfr Side obj_WO_Wfr('AddEvent',owwParms) END RR_Rec = '' NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * These CarrWfrID methods are not used. Leave until done with development * * * * * * * * * * * * * * SetCarrWfrID: * * * * * * * RDSNo = Parms[1,@RM] WfrID = Parms[COL2()+1,@RM] If RDSNol = '' THEN ErrorMsg = 'Null Parameter "RDSNo" passed to routine. (':Method:')' If WfrID = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')' If ErrorMsg NE '' Then Return otParms = 'REACT_RUN':@RM:RDSNo RRunRec = obj_Tables('ReadRec',otParms) Locate WfrID In RRunRec USING @VM SETTING Pos Then obj_Tables('UnlockRec',otParms) End Else RRunRec = Insert(RRunRec,REACT_RUN_CARR_WFR_ID$ ,-1,0, WfrID) ;* Wafer ID is added to the END of the list i.e. no sort order otParms = FieldStore(otParms,@RM,4,0,RRunRec) obj_Tables('WriteRec',otParms) END RETURN * * * * * * * ClearCarrWfrID: * * * * * * * RDSNo = Parms[1,@RM] WfrID = Parms[COL2()+1,@RM] If RDSNo = '' THEN ErrorMsg = 'Null Parameter "RDSNo" passed to routine. (':Method:')' If WfrID = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')' If ErrorMsg NE '' Then Return otParms = 'REACT_RUN':@RM:RDSNo RRunRec = obj_Tables('ReadRec',otParms) Locate WfrID In RRunRec USING @VM SETTING Pos Then RRunRec = Delete(RRunRec,REACT_RUN_CARR_WFR_ID$,Pos,0) otParms = FieldStore(otParms,@RM,4,0,RRunRec) obj_Tables('WriteRec',otParms) End Else obj_Tables('UnlockRec',otParms) END RETURN * * * * * * * ClearCarrNCR: * * * * * * * ! deprecated 2/24/20 - djs - do not use ! RDSNo = Parms[1,@RM] NCRNo = Parms[COL2()+1,@RM] 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 otParms = 'REACT_RUN':@RM:RDSNo RRunRec = obj_Tables('ReadRec',otParms) sCnt = COUNT(RRunRec,@VM) + (RRunRec NE '') WriteFlag = '' FOR I = 1 TO sCnt IF RRunRec = NCRNo THEN WriteFlag = 1 RRunRec = RRunRec RRunRec = '' END NEXT I IF WriteFlag = 1 THEN otParms = FieldStore(otParms,@RM,4,0,RRunRec) obj_Tables('WriteRec',otParms) END ELSE obj_Tables('UnlockRec',otParms) END RETURN * * * * * End of CarrWfrID methods. * * * * * * * * * * * * * * UnloadGan: * * * * * * * RdsNo = Parms[1,@RM] ToolID = Parms[COL2()+1,@RM] ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration UnloadSlots = Parms[COL2()+1,@RM] ;* Contains CarrSlotNo:@FM:RDSNo:'.':CarrSlotNo for each wafer being "unloaded" IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.' IF UnloadSlots = '' THEN ErrorMsg = 'Null parameter "UnloadSlots" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Send_Info('Reading REACT_RUN ':RdsNo:'...') lCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') FOR I = lCnt TO 1 STEP -1 TestVal = ReactorList UNTIL TestVal NE '' ReactorList = DELETE(ReactorList,I,0,0) ;* Strip empty lines from the user interface edit table NEXT I Set_Status(0) RTParms = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.' RETURN END ToolRec = XLATE('TOOL',ToolID,'','X') * Get QOutKey for Reactor or Reactor Class QOutKey = '' WHCd = ToolRec LocCd = ToolRec IF WHCd NE '' AND LocCd NE '' THEN QOutKey = WHCd:'*':LocCd END ELSE ToolClassRec = XLATE('TOOL_CLASS',ToolRec,'','X') WHCd = ToolClassRec LocCd = ToolClassRec IF WHCd NE '' AND LocCd NE '' THEN QOutKey = WHCd:'*':LocCd END END CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') rCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') FOR I = 1 TO rCnt IF ReactorList = '' AND ReactorList = 'PROD' AND ReactorList = '' THEN * Empty Pocket and needs a wafer * Wafers are "placed" into a carrier slot AND into the Dispo Queue CarrSlotID = UnloadSlots CarrSlotNo = UnloadSlots WfrID = ReactorList owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'UNLOAD':@RM ;* Event owwParms := '':@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 := ToolID:@RM ;* Curr Tool ID owwParms := QOutKey:@RM ;* NewInvLoc ;* Outbound Que for tool owwParms := '':@RM ;* CurrInvLoc owwParms := 'O':@RM ;* Wfr Side owwParms := CarrSlotID:@RM ;* New Carrier Slot owwParms := '' ;* Curr Carrier Slot obj_WO_Wfr('AddEvent',owwParms) LOCATE WfrID IN RR_Rec USING @VM SETTING Pos THEN RR_Rec = CarrSlotID END RR_Rec = WfrID RR_Rec = CarrSlotNo END NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * * * ReloadGan: * * * * * * * RdsNo = Parms[1,@RM] ToolID = Parms[COL2()+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 = 'REACT_RUN':@RM:RdsNo RR_Rec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.' RETURN END RLCnt = COUNT(RR_Rec,@VM) + (RR_Rec NE '') CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') FOR I = 1 TO RLCnt WfrID = RR_Rec CurrCarrSlotID = RR_Rec RunLoc = RDSNo:'.':RR_Rec:'.':RR_Rec IF CurrCarrSlotID NE '' THEN owwParms = WfrID:@RM ;* WfrID owwParms := CurrDTM:@RM ;* EventDtm owwParms := @USER4:@RM ;* EventBy owwParms := 'RELOAD':@RM ;* Event owwParms := '':@RM ;* New Slot ID owwParms := RunLoc:@RM ;* RPZ (RDSNo*Pocket*Zone) owwParms := '':@RM ;* NCRNo owwParms := '':@RM ;* TWUse ID owwParms := '':@RM ;* Current Slot ID owwParms := ToolID:@RM ;* NewToolID (Load Tool) owwParms := '':@RM ;* CurrToolD (Unload Tool) owwParms := '':@RM ;* NewInvLoc owwParms := '':@RM ;* CurrInvLoc owwParms := 'O':@RM ;* Wfr Side owwParms := '':@RM ;* New Carrier Slot owwParms := CurrCarrSlotID ;* Curr Carrier Slot obj_WO_Wfr('AddEvent',owwParms) END RR_Rec = '' RR_Rec = '' NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec) obj_Tables('WriteRec',RTParms) RETURN * * * * * * * SplitWfr: * * * * * * * ! Deprecated 11/06/2019 DJS * RDSNo = Parms[1,@RM] * WfrID = Parms[COL2()+1,@RM] * * IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')' * IF WfrID = '' THEN ErrorMsg = 'Null parameter "WfrID" passed to routine. (':Method:')' * * IF ErrorMsg NE '' THEN RETURN * * otParms = 'REACT_RUN':@RM:RDSNo * * RunRec = obj_Tables('ReadRec',otParms) * * IF Get_Status(errCode) THEN RETURN * * LOCATE WfrID IN RunRec USING @VM SETTING Pos THEN * * RunRec = WfrID * RunRec = '' * * * chCnt = COUNT(RunRec,@VM) + (RunRec NE '') * NextLine = chCnt + 1 * * SplitBy = @USER4 * * IF SplitBy = '' THEN SplitBy = 'UNKNOWN' * * SplitDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT') * * RunRec = WfrID * RunRec = SplitBy * RunRec = SplitDTM * * otParms = FieldStore(OtParms,@RM,4,0,RunRec) ;* Put record in 4th field of OtParms * obj_Tables('WriteRec',otParms) * * END ELSE * obj_Tables('UnlockRec',otParms) * END * RETURN * * * * * * * UnSplitWfr: * * * * * * * ! Deprecated 11/06/2019 DJS * RDSNo = Parms[1,@RM] * WfrID = Parms[COL2()+1,@RM] * * IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')' * IF WfrID = '' THEN ErrorMsg = 'Null parameter "WfrID" passed to routine. (':Method:')' * * IF ErrorMsg NE '' THEN RETURN * * otParms = 'REACT_RUN':@RM:RDSNo * * RunRec = obj_Tables('ReadRec',otParms) * * IF Get_Status(errCode) THEN RETURN * * LOCATE WfrID IN RunRec USING @VM SETTING Pos THEN * * RunRec = '' * RunRec = WfrID * * LOCATE WfrID IN RunRec USING @VM SETTING cPos THEN * * UnSplitBy = @USER4 * * IF UnSplitBy = '' THEN UnSplitBy = 'UNKNOWN' * * UnSplitDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT') * * RunRec = UnSplitBy * RunRec = UnSplitDTM * * END * * otParms = FieldStore(OtParms,@RM,4,0,RunRec) ;* Put record in 4th field of OtParms * obj_Tables('WriteRec',otParms) * * END ELSE * obj_Tables('UnlockRec',otParms) * END RETURN * * * * * * * GetWfrSigKeys: * * * * * * * IF NOT(Assigned(RDSNo)) THEN RDSNo = Parms[1,@RM] IF NOT(Assigned(WfrIDs)) THEN WfrIDs = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF WfrIDs = '' THEN RETURN FirstWfrID = WfrIDs<1,1> WONo = FirstWfrID<1,1>[1,'*'] WOMatKey = FIELD(FirstWfrID,'*',1,2) SigProfile = XLATE('REACT_RUN',RDSNo, REACT_RUN_WFR_STAGE$,'X') spCnt = COUNT(SigProfile,@VM) + (SigProfile NE '') WfrSigKeys = '' wfrCnt = COUNT(WfrIDs,@VM) + (WfrIDs NE '') FOR W = 1 TO wfrCnt WfrID = WfrIDs<1,W> IF WfrID NE '' THEN FOR I = 1 TO spCnt Stage = SigProfile<1,I> WfrKID = WfrID CONVERT '*' TO '.' IN WfrKID WfrSigKeys = RDSNo:'*':Stage:'*':WfrKID NEXT I END NEXT W Result = WfrSigKeys RETURN * * * * * * * NextWfrStage: * * * * * * * RDSNo = Parms[1,@RM] RunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RunRec = '' THEN RunRec = XLATE('REACT_RUN',RDSNo,'','X') IF RunRec = '' THEN RETURN END WfrIDs = RunRec GOSUB GetWfrSigKeys AllWfrStageKeys = Result Result = '' WfrCnt = COUNT(AllWfrStageKeys,@FM) + (AllWfrStageKeys NE '') FOR I = 1 TO WfrCnt WfrStageKeys = AllWfrStageKeys StageCompSigs = XLATE('RUN_STAGE_WFR',WfrStageKeys,RUN_STAGE_WFR_COMP_BY$,'X') scCnt = COUNT(StageCompSigs,@VM) + (StageCompSigs NE '') NextWfrStage = '' FOR S = scCnt TO 1 STEP -1 UNTIL StageCompSigs<1,S> NE '' NextWfrStage = WfrStageKeys<1,S> NEXT S IF NextWfrStage = '' THEN Result<1,I> = '-' END ELSE Result<1,I> = FIELD(NextWfrStage,'*',2) END NEXT I RETURN * * * * * * * CharWfrDest: * * * * * * * RDSNo = Parms[1,@RM] RunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RunRec = '' THEN RunRec = XLATE('REACT_RUN',RDSNo,'','X') IF RunRec = '' THEN RETURN END WfrIDs = RunRec GOSUB GetWfrSigKeys AllWfrStageKeys = Result Result = '' WfrCnt = COUNT(AllWfrStageKeys,@FM) + (AllWfrStageKeys NE '') FOR I = 1 TO WfrCnt WfrStageKeys = AllWfrStageKeys StageDestTests = XLATE('RUN_STAGE_WFR',WfrStageKeys,'DEST_TEST','X') StageCompSigs = XLATE('RUN_STAGE_WFR',WfrStageKeys,RUN_STAGE_WFR_COMP_BY$,'X') scCnt = COUNT(StageCompSigs,@VM) + (StageCompSigs NE '') Destroyed = '' FOR S = scCnt TO 1 STEP -1 IF StageDestTests<1,S> = 1 AND StageCompSigs<1,S> NE '' THEN Destroyed = 1 END UNTIL Destroyed NEXT S Result<1,I> = Destroyed NEXT I RETURN * * * * * * * CharWfrStatus: * * * * * * * RDSNo = Parms[1,@RM] RunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RunRec = '' THEN RunRec = XLATE('REACT_RUN',RDSNo,'','X') IF RunRec = '' THEN RETURN END WfrIDs = RunRec wCnt = COUNT( WfrIDs,@VM) + (WfrIDs NE '') WfrStatuses = '' GOSUB NextWfrStage NextWfrStages = Result Result = '' FOR M = 1 TO wCnt WfrID = WfrIDs<1,M> NextWfrStage = NextWfrStages<1,M> IF NextWfrStage NE '-' THEN CONVERT '*' TO '.' IN WfrID NextWfrStageKey = RDSNo:'*':NextWfrStage:'*':WfrID WfrStatuses<1,M> = XLATE('RUN_STAGE_WFR',NextWfrStageKey,'CURR_STATUS','X') END ELSE WfrStatuses<1,M> = 'COMP' END NEXT I Result = WfrStatuses Return * * * * * * * WfrStageUnloadQ: * * * * * * * ErrMsg('Notify FI TEAM if you get this message') RETURN RDSNo = Parms[1,@RM] RunRec = Parms[COL2()+1,@RM] StageID = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RunRec = '' THEN RunRec = XLATE('REACT_RUN',RDSNo,'','X') IF RunRec = '' THEN RETURN End * Get Next Stages and Add 'DISP' stage to the end RunWfrStages = RunRec ValidStages = obj_Popup('AllCodes','GAN_WIP_STAGES') ;* List of all valid GaN WIP Stage codes from the popup WfrStages = '' InLocIDs = '' rwsCnt = COUNT(RunWfrStages,@VM) + (RunWfrStages NE '') ResCnt = 0 FOR I = 1 TO rwsCnt LOCATE RunWfrStages<1,I> IN ValidStages USING @VM Setting Pos THEN NextStage = RunWfrStages<1,I+1> ColToReturn = 4 ToolClass = obj_Popup('CodeDesc','GAN_WIP_STAGES':@RM:NextStage:@RM:ColToReturn) TCRec = XLATE('TOOL_CLASS',ToolClass,'','X') QInWH = TCRec QInLoc = TCRec IF QInWH NE '' AND QInLoc NE '' THEN ResCnt += 1 InLocIDs<1,ResCnt> = QInWH:'*':QInLoc ;* * Have a good location to unload into WfrStages<1,ResCnt> = RunWfrStages<1,I> END ELSE ResCnt += 1 WfrStages<1,ResCnt> = RunWfrStages<1,I> ;* Disposition Stage InLocIDs<1,ResCnt> = 'GGR*Q_DISP' ;* Unload into DISP(osition) Queue END END NEXT I IF StageID NE '' THEN LOCATE StageID IN WfrStages USING @VM SETTING RetPos THEN Result = InLocIDs<1,RetPos> END END ELSE Result = InLocIDs END RETURN * * * * * * * StageUnloadQ: * * * * * * * * * Returns Unload Location for GaN Run or Wfr processing stage code * * RDSNo = Parms[1,@RM] RunRec = Parms[COL2()+1,@RM] StageID = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF StageID = '' THEN RETURN IF RunRec = '' THEN RunRec = XLATE('REACT_RUN',RDSNo,'','X') IF RunRec = '' THEN RETURN End AllStageData = Xlate('SYSREPOSPOPUPS','LSL2**GAN_WIP_STAGES',PDISPLAY$,'X') ;* Raw Data from Popup CONVERT @VM:@SVM TO @FM:@VM IN AllStageData AllStages = '' AllChars = '' AllToolClasses = '' aCnt = 0 LOOP StageLine = AllStageData[1,@FM] AllStageData[1,COL2()] = '' UNTIL StageLine = '' IF StageLine<1,GWS$STAGE> NE '' AND StageLine<1,GWS$TOOL_CLASS> NE '' THEN aCnt += 1 AllStages<1,aCnt> = StageLine<1,GWS$STAGE> AllChars<1,aCnt> = StageLine<1,GWS$CHAR> AllToolClasses<1,aCnt> = StageLine<1,GWS$TOOL_CLASS> END REPEAT NextQ = '' LOCATE StageID IN AllStages USING @VM SETTING Pos THEN IF AllChars<1,Pos> = 1 THEN ReactRunStages = RunRec END ELSE ReactRunStages = RunRec SWAP RDSNo:'*' WITH '' IN ReactRunStages ;* Strips "RDSNo*" from keys leaving just the stage END END ELSE RETURN ;* No material movements specified END rrCnt = COUNT(ReactRunStages,@VM) + (ReactRunStages NE '') IReactRunStages = '' IReactRunToolClasses = '' iCnt = 0 FOR I = 1 TO rrCnt ReactRunStage = ReactRunStages<1,I> LOCATE ReactRunStage IN AllStages USING @VM SETTING Pos THEN IF AllToolClasses<1,I> NE '' THEN iCnt += 1 IReactRunStages<1,iCnt> = ReactRunStage IReactRunToolClasses<1,iCnt> = AllToolClasses<1,Pos> END END NEXT I LOCATE StageID IN IReactRunStages USING @VM SETTING RPos THEN NextStage = IReactRunStages<1,RPos+1> NextToolClass = IReactRunToolClasses<1,RPos+1> IF NextStage = '' THEN NextQ = 'GGR*Q_DISP' END ELSE TCRec = XLATE('TOOL_CLASS',NextToolClass,'','X') NextQ = TCRec:'*':TCRec END END Result = NextQ RETURN * * * * * * * GaNDispStatus: * * * * * * * RDSNo = Parms[1,@RM] RunRec = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF RunRec = '' THEN RunRec = XLATE('REACT_RUN',RDSNo,'','X') IF RunRec = '' THEN RETURN END RETURN