Merged PR 21598: Refactored receive and release codebase.
Refactored receive and release codebase. bug fixes and performance improvements modified WO_REC form to use the same receive and same release dtm for all cassettes released in a given batch Related work items: #259878
This commit is contained in:
@ -132,7 +132,6 @@ CurrStatus:
|
||||
|
||||
ReturnVals = ''
|
||||
|
||||
|
||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||
FOR R = 1 TO RDSCnt
|
||||
|
||||
@ -147,13 +146,11 @@ CurrStatus:
|
||||
|
||||
RotrAction = XLATE('RDS',RDSNos,'ROTR_ACTION','X')
|
||||
|
||||
|
||||
IF RotrAction = 'F' Then ;* Drive the CURR_STATUS to PostEpi Clean if the ROTR fails
|
||||
ReturnVals<1,R> = 'PSTC'
|
||||
GOTO StatusHere
|
||||
END
|
||||
|
||||
|
||||
* Check for out of spec
|
||||
|
||||
OutOfSpec = 0 ;
|
||||
@ -178,9 +175,6 @@ CurrStatus:
|
||||
GOTO StatusHere
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
WOStepKey = RDSRec<RDS_WO_STEP_KEY$>
|
||||
@ -241,7 +235,6 @@ CurrStatus:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Create:
|
||||
* * * * * * *
|
||||
@ -291,85 +284,6 @@ Create:
|
||||
return
|
||||
end
|
||||
|
||||
// Delete old instance of this RDS if it exists ------------------------------------------------------------------------
|
||||
If RowExists('RDS', RDSNo) then
|
||||
Database_Services('DeleteDataRow', 'RDS', RDSNo, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'RDS ' : RDSNo : ' deleted'
|
||||
end else
|
||||
Results = 'RDS ' : RDSNo : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Delete related RDS_LAYER records ------------------------------------------------------------------------------------
|
||||
Layers = 'L1,L2,2'
|
||||
For each Layer in Layers using ','
|
||||
RDSLayerKey = RDSNo:'*':Layer
|
||||
If RowExists('RDS_LAYER', RDSLayerKey) then
|
||||
// Look for related RDS_TEST records and delete them first
|
||||
RDSTestKeys = Xlate('RDS_LAYER', RDSLayerKey, 'RDS_TEST_KEYS', 'X')
|
||||
If RDSTestKeys NE '' then
|
||||
For each RDSTestKey in RDSTestKeys using @VM
|
||||
// Look for related TW_USE records and delete them first
|
||||
TWKeys = Xlate('RDS_TEST', RDSTestKey, 'TW_USE_ID', 'X')
|
||||
If TWKeys NE '' then
|
||||
For each TWKey in TWKeys using @VM
|
||||
Database_Services('DeleteDataRow', 'TW_USE', TWKey, True$, True$)
|
||||
Next TWKey
|
||||
end
|
||||
Database_Services('DeleteDataRow', 'RDS_TEST', RDSTestKey, True$, True$)
|
||||
If Error_Services('NoError') then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = RDSTestKey
|
||||
LogData<3> = 'RDS_Test record deleted without error.'
|
||||
Logging_Services('AppendLog', objRDSTestDeleteLog , LogData, @RM, @FM, False$)
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = ErrorMessage
|
||||
Logging_Services('AppendLog', objRDSTestDeleteLog , LogData, @RM, @FM, False$)
|
||||
end
|
||||
Next RDSTestKey
|
||||
end
|
||||
Database_Services('DeleteDataRow', 'RDS_LAYER', RDSLayerKey, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'RDS_LAYER ' : RDSLayerKey : ' deleted'
|
||||
end else
|
||||
Results = 'RDS_LAYER ' : RDSLayerKey : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
Next Layer
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Delete old REACT_RUN record if it exists ----------------------------------------------------------------------------
|
||||
If RowExists('REACT_RUN', RDSNo) then
|
||||
// Delete old CLEAN_INSP record(s) if they exist
|
||||
CIKeys = Xlate('REACT_RUN', RDSNo, 'CI_NO', 'X')
|
||||
For each CIKey in CIKeys using @VM
|
||||
If RowExists('CLEAN_INSP', CIKey) then
|
||||
Database_Services('DeleteDataRow', 'CLEAN_INSP', CIKey, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'CLEAN_INSP ' : CIKey : ' deleted'
|
||||
end else
|
||||
Results = 'CLEAN_INSP ' : CIKey : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
Next CIKey
|
||||
Database_Services('DeleteDataRow', 'REACT_RUN', RDSNo, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'REACT_RUN ' : RDSNo : ' deleted'
|
||||
end else
|
||||
Results = 'REACT_RUN ' : RDSNo : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Create new record
|
||||
RDSRec = ''
|
||||
RDSRec<RDS_ENTRY_ID$> = @USER4
|
||||
@ -388,7 +302,6 @@ Create:
|
||||
RDSRec<RDS_COMMIT_DATE_FINAL$> = SchedDt
|
||||
RDSRec<RDS_LOT_NUM$> = LotNo
|
||||
RDSRec<RDS_PART_NUM$> = CustPartNo
|
||||
|
||||
RDSRec<RDS_CASS_WAFER_QTY$> = WaferQty
|
||||
RDSRec<RDS_SUB_PART_NO$> = SubPartNo
|
||||
RDSRec<RDS_LAST_STEP$> = LastStep
|
||||
@ -396,8 +309,7 @@ Create:
|
||||
RDSRec<RDS_SUB_PRE_CLEAN$> = SubPreClean
|
||||
RDSRec<RDS_SUB_POST_CLEAN$> = SubPostClean
|
||||
|
||||
|
||||
IF CassNo = 1 THEN
|
||||
IF CassNo EQ 1 THEN
|
||||
WOVStatus = 'O' ;* Open status (?)
|
||||
WOVNotes = ''
|
||||
WOVNo = obj_WO_Verify('Create',RDSNo:@RM:WOVStatus:@RM:WOVNotes) ;* Create a WO_Verify record on 1st run order
|
||||
@ -407,18 +319,13 @@ Create:
|
||||
end
|
||||
End
|
||||
|
||||
|
||||
PSRec = XLATE('PROD_SPEC',PS_No,'','X')
|
||||
|
||||
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$> ;* This isn't used anwhere in the program 8/27/2014 JCH
|
||||
PSRec = XLATE('PROD_SPEC',PS_No,'','X')
|
||||
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$> ;* This isn't used anwhere in the program 8/27/2014 JCH
|
||||
RDSRec<RDS_SPECIAL_INST$> = PSRec<PROD_SPEC_SPEC_INST$> ;* 3/25/2013 jch
|
||||
RDSRec<RDS_SPEC_TYPE_ORIG$> = XLATE('PROD_SPEC',PS_No,'SPEC_TYPE','X')
|
||||
|
||||
Send_Info('Retrieving PSN Layer Properties...')
|
||||
|
||||
LayerSpecs = obj_Prod_Spec('GetLayerProp',PS_No:@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
|
||||
|
||||
@ -434,7 +341,6 @@ Create:
|
||||
|
||||
RDSRec<RDS_OVERGROW_REQ$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,9> ;* JCH 2/27/2006
|
||||
|
||||
|
||||
IF QXJFlag THEN
|
||||
RDSRec<RDS_QXJ_POST$> = 0 ;* And here a couple of minor cluster operations
|
||||
END
|
||||
@ -448,27 +354,12 @@ Create:
|
||||
LayerSpec = FIELD(LayerSpecs,@RM,I) ;* Take the Ith Layer
|
||||
LayerSet = FIELD(LayerSpec,@FM,1)
|
||||
LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet
|
||||
|
||||
IF LayerSet = I THEN NoCombinedLayerFlag = 1 ELSE NoCombinedLayerFlag = 0
|
||||
|
||||
Send_Info('Creating RDS Layer ':LayerSet:'...')
|
||||
|
||||
obj_RDS_Layer('Create',RDSNo:@RM:LayerSet:@RM:PS_No:@RM:NoCombinedLayerFlag)
|
||||
|
||||
RDSRec<RDS_RDS_LAYER_KEYS$,I> = RDSNo:'*':LayerSet ;* Added 4/17/2006 JCH
|
||||
|
||||
Send_Info('Creating Metrology for Layer Set ':LayerSet:'...')
|
||||
|
||||
obj_RDS_Test('Create',RDSNo:@RM:LayerSet:@RM:PS_No)
|
||||
|
||||
NEXT I
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Send_Info('Saving RDS record...')
|
||||
|
||||
obj_Tables('WriteRec','RDS':@RM:RDSNo:@RM:@RM:RDSRec)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
@ -485,15 +376,14 @@ Create:
|
||||
Lot_Services('AddLotOperationIntoSequence', NewLotId, 'POST_EPI', 4, False$)
|
||||
Lot_Services('AddLotOperationIntoSequence', NewLotId, 'RDS_CLOSE', 5, False$)
|
||||
|
||||
Lot_Services('StartLot', NewLotId, @User4) ; // LOT_START event and move in to RDS_CREATE operation
|
||||
Lot_Services('StartLot', NewLotId, @User4) ; // LOT_START event and move in to RDS_CREATE operation
|
||||
Lot_Services('MoveOutLot', NewLotId, @User4) ; // Move out of RDS_CREATE operation
|
||||
Lot_Services('MoveInLot', NewLotId, @User4) ; // Move in to PRE_EPI operation
|
||||
end
|
||||
|
||||
Result = RDSNo
|
||||
********************************
|
||||
*Automatically Apply Supplement*
|
||||
********************************
|
||||
|
||||
// Automatically Apply Supplement
|
||||
// If first cassette in work order, then there is no supplement in place, therefore skip this step.
|
||||
If RDSRec<RDS_CASS_NO$> GT 1 then
|
||||
WoStepKey = RDSRec<RDS_WO_STEP_KEY$>
|
||||
@ -516,11 +406,7 @@ Create:
|
||||
end
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
|
||||
Send_Info('Conversion to REACT_RUN record...')
|
||||
|
||||
RDS_React_Run(RDSNo) ;********************************** Conversion stuff JCH 9/26/2008 *********************
|
||||
RDS_React_Run(RDSNo)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -558,9 +444,6 @@ VerifySpecInfo:
|
||||
|
||||
ErrNum = 1
|
||||
|
||||
* IF RDSRec<RDS_RECIPE_NO$> NE RecipeNo THEN ErrNum = -11
|
||||
|
||||
|
||||
* This section is here because the targets calculated in the existing SCHEDULE*WRITE event are not done correctly
|
||||
* There is a last decimal point difference in the calculation that causes a mismatch whenever a remainder of .5
|
||||
* is generated during the division by 2. WRITE event code doesn't drop the remainder like it should
|
||||
@ -653,138 +536,6 @@ VerifySpecInfo:
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
* Update:
|
||||
* * * * * * *
|
||||
*
|
||||
* RDSNo = Parms[1,@RM]
|
||||
*
|
||||
* IF NOT(ASSIGNED(RDSNo)) THEN ErrorMsg = 'Unassigned Parm "RDSNo" passed to routine. (':Method:')'
|
||||
*
|
||||
* IF ErrorMsg NE '' THEN RETURN
|
||||
*
|
||||
* IF RDSNo = '' THEN ErrorMsg = 'Null Parameter "RDSNo" passed to routine. (':Method:')'
|
||||
*
|
||||
* IF ErrorMsg NE '' THEN RETURN
|
||||
*
|
||||
* RDSRec<RDS_ENTRY_ID$> = @USER4
|
||||
* RDSRec<RDS_ENTRY_DATE$> = Date()
|
||||
* RDSRec<RDS_ENTRY_TIME$> = Time()
|
||||
* RDSRec<RDS_SCHEDULE_NO$> = SchedNo
|
||||
* RDSRec<RDS_WO$> = WONo
|
||||
*
|
||||
* WO Run Order number is not stored in the RDS
|
||||
*
|
||||
* RDSRec<RDS_QUOTE_NO$> = QuoteNo
|
||||
* RDSRec<RDS_ORDER_NO$> = OrderNo
|
||||
* RDSRec<RDS_CUST_NO$> = CustNo
|
||||
* RDSRec<RDS_PO$> = PONo
|
||||
* RDSRec<RDS_PROD_SPEC_ID$> = PS_No
|
||||
* RDSRec<RDS_STATUS$> = RDSStatus ;* Usually passed as 'C' - Received
|
||||
* RDSRec<RDS_COMMIT_DATE_FINAL$> = SchedDt
|
||||
* RDSRec<RDS_LOT_NUM$> = LotNo
|
||||
* RDSRec<RDS_PART_NUM$> = PartNo
|
||||
*
|
||||
* IF CassNo = 1 THEN
|
||||
* WOVStatus = 'O' ;* Open status (?)
|
||||
* WOVNotes = ''
|
||||
* WOVNo = obj_WO_Verify('Create',RDSNo:@RM:WOVStatus:@RM:WOVNotes) ;* Create a WO_Verify record on 1st run order
|
||||
* RDSRec<RDS_WO_VERIFY_ID$> = WOVNo ;* Add pointer to RDS record
|
||||
* END
|
||||
*
|
||||
* PSRec = XLATE('PROD_SPEC',PS_No,'','X')
|
||||
*
|
||||
* RDSRec<RDS_SPECIAL_INST$> = PSRec<PROD_SPEC_SPEC_INST$>
|
||||
* RDSRec<RDS_SPEC_TYPE_ORIG$> = XLATE('PROD_SPEC',PS_No,'SPEC_TYPE','X')
|
||||
*
|
||||
* LayerSpecs = obj_Prod_Spec('GetLayerProp',PS_No:@RM:@RM:1) ;* Returns specs for all layers without output conversion
|
||||
*
|
||||
* 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<PRS_LAYER_RECIPE$>
|
||||
* RecipeRec = XLATE('RECIPE',RecipeNo,'','X') ;* This used in 2nd and 3rd layer stuff (in error it appears)
|
||||
*
|
||||
* RDSRec<RDS_RECIPE_NO$> = RecipeNo
|
||||
* RDSRec<RDS_CON_MIN$> = LayerSpec<PRS_LAYER_CONC_MIN$>
|
||||
* RDSRec<RDS_CON_MAX$> = LayerSpec<PRS_LAYER_CONC_MAX$>
|
||||
* RDSRec<RDS_CON_UNITS$> = LayerSpec<PRS_LAYER_CONC_UNITS$>
|
||||
* RDSRec<RDS_CON_TARGET$> = LayerSpec<PRS_LAYER_CONC_TARGET$>
|
||||
*
|
||||
* RDSRec<RDS_RES_MIN$> = LayerSpec<PRS_LAYER_RES_MIN$>
|
||||
* RDSRec<RDS_RES_MAX$> = LayerSpec<PRS_LAYER_RES_MAX$>
|
||||
* RDSRec<RDS_RES_UNITS$> = LayerSpec<PRS_LAYER_RES_UNITS$>
|
||||
* RDSRec<RDS_RES_TARGET$> = LayerSpec<PRS_LAYER_RES_TARGET$>
|
||||
*
|
||||
* RDSRec<RDS_THICK_MIN$> = LayerSpec<PRS_LAYER_THICK_MIN$>
|
||||
* RDSRec<RDS_THICK_MAX$> = LayerSpec<PRS_LAYER_THICK_MAX$>
|
||||
* RDSRec<RDS_THICK_UNITS$> = LayerSpec<PRS_LAYER_THICK_UNITS$>
|
||||
* RDSRec<RDS_THICK_TARGET$> = LayerSpec<PRS_LAYER_THICK_TARGET$>
|
||||
*
|
||||
* LayerInfo = ''
|
||||
*
|
||||
* FOR I = 2 TO COUNT(LayerSpecs,@RM) + (LayerSpecs NE '')
|
||||
* LayerSpec = FIELD(LayerSpecs,@RM,I) ;* Take the Ith Layer
|
||||
* LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet
|
||||
*
|
||||
* thisLayerInfo = '' ;* Empty bucket to parse into
|
||||
*
|
||||
* thisLayerInfo<1,RLConMin$> = LayerSpec<PRS_LAYER_CONC_MIN$>
|
||||
* thisLayerInfo<1,RLConMax$> = LayerSpec<PRS_LAYER_CONC_MAX$>
|
||||
* thisLayerInfo<1,RLConUnits$> = LayerSpec<PRS_LAYER_CONC_UNITS$>
|
||||
* thisLayerInfo<1,RLConTarget$> = LayerSpec<PRS_LAYER_CONC_TARGET$>
|
||||
*
|
||||
* thisLayerInfo<1,RLRecipeNo$> = RecipeNo ;* Copied from the original in the WRITE event of the Schedule window
|
||||
* thisLayerInfo<1,RLThickRead$> = STR(@SVM,16)
|
||||
* thisLayerInfo<1,RLSheetRhoRead$> = STR(@SVM,16)
|
||||
*
|
||||
* thisLayerInfo<1,RLResMin$> = LayerSpec<PRS_LAYER_RES_MIN$>
|
||||
* thisLayerInfo<1,RLResMax$> = LayerSpec<PRS_LAYER_RES_MAX$>
|
||||
* thisLayerInfo<1,RLResUnits$> = LayerSpec<PRS_LAYER_RES_UNITS$>
|
||||
* thisLayerInfo<1,RLResTarget$> = LayerSpec<PRS_LAYER_RES_TARGET$>
|
||||
*
|
||||
* thisLayerInfo<1,RLThickMin$> = LayerSpec<PRS_LAYER_THICK_MIN$>
|
||||
* thisLayerInfo<1,RLThickMax$> = LayerSpec<PRS_LAYER_THICK_MAX$>
|
||||
* thisLayerInfo<1,RLThickUnits$> = LayerSpec<PRS_LAYER_THICK_UNITS$>
|
||||
* thisLayerInfo<1,RLThickTarget$> = LayerSpec<PRS_LAYER_THICK_TARGET$>
|
||||
*
|
||||
* LayerInfo := thisLayerInfo:CHAR(248)
|
||||
*
|
||||
* NEXT I
|
||||
*
|
||||
* LayerInfo[-1,1] = '' ;* Strip trailing CHAR(248)
|
||||
*
|
||||
*
|
||||
* RDSRec<RDS_LAYER_INFO$> = LayerInfo ;* End of the great Layer cluster function
|
||||
*
|
||||
* IF QXJFlag THEN
|
||||
* RDSRec<RDS_QXJ_POST$> = 0 ;* And here a couple of minor cluster operations
|
||||
* END
|
||||
*
|
||||
* IF CustNo = '621' AND CassNo = 1 THEN
|
||||
* RDSRec<RDS_QXJ_POST$> = 0
|
||||
* END
|
||||
*
|
||||
* obj_Tables('WriteRec','RDS':@RM:RDSKey:@RM:@RM:RDSRec)
|
||||
*
|
||||
* IF Get_Status(errCode) THEN
|
||||
* Result = ''
|
||||
* END ELSE
|
||||
* Result = RDSKey
|
||||
* END
|
||||
*
|
||||
*
|
||||
*
|
||||
* RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
SchedWfrQty:
|
||||
* * * * * * *
|
||||
@ -1473,6 +1224,7 @@ CalcResTarget:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
CalcThickTarget:
|
||||
* * * * * * *
|
||||
@ -1490,5 +1242,3 @@ CalcThickTarget:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user