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:
Stieber Daniel (CSC FI SPS MESLEO)
2025-07-23 15:40:25 +00:00
parent 84da66ccd5
commit de2e6af5f7
26 changed files with 53999 additions and 14791 deletions

View File

@ -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