Refactored verify barcode logic to work for WM_IN lots. Fixed a bug in CLEAN_INSP_ACTIONS causing all WM_OUT tencor scans to have a failed ROTR result.

This commit is contained in:
Infineon\StieberD
2025-11-13 17:21:35 -07:00
parent 6067d14419
commit 2d58c47c93
3 changed files with 33 additions and 139 deletions

View File

@ -200,7 +200,7 @@ return
WRITE_RECORD_PRE: WRITE_RECORD_PRE:
OrigRecCopy = OrigRecord OrigRecCopy = OrigRecord
RecCopy = Record RecCopy = Record
Convert @VM to '' in OrigRecCopy Convert @VM to '' in OrigRecCopy
@ -321,7 +321,13 @@ WRITE_RECORD_PRE:
end else end else
Stage = Record<CLEAN_INSP_STAGE$> Stage = Record<CLEAN_INSP_STAGE$>
IsEpiPro = Rds_Services('IsEpiPro', RDSKeyID) If RDSKeyID NE '' then
IsEpiPro = Rds_Services('IsEpiPro', RDSKeyID)
IsWmOut = False$
end else
IsEpiPro = True$
IsWmOut = True$
end
// This ROTR logic is only applicable to LWI clean & inspection rows. // This ROTR logic is only applicable to LWI clean & inspection rows.
CleanInspKeyID = Name CleanInspKeyID = Name
@ -436,14 +442,16 @@ WRITE_RECORD_PRE:
If (UCL EQ '') or (UCL EQ 0) then If (UCL EQ '') or (UCL EQ 0) then
// The UCL has not yet been retrieved from SPC or an error could have // The UCL has not yet been retrieved from SPC or an error could have
// occurred when the last attempt to retrieve it, so try to get it now. // occurred when the last attempt to retrieve it, so try to get it now.
UCL = QA_Services('PostUCLRequest', RDSKey, ScanRecipeName) If (RDSKey NE '') then
If (UCL NE '') and (UCL NE 0) then UCL = QA_Services('PostUCLRequest', RDSKey, ScanRecipeName)
Record<CLEAN_INSP_SPEC_SUM_OF_DEF_AVG$, SpecRecipeIndex> = UCL If (UCL NE '') and (UCL NE 0) then
end else Record<CLEAN_INSP_SPEC_SUM_OF_DEF_AVG$, SpecRecipeIndex> = UCL
ErrorMessage = 'Error retrieving UCL value from QA_Services in CLEAN_INSP_ACTIONS' end else
Error_Services('Add', ErrorMessage) ErrorMessage = 'Error retrieving UCL value from QA_Services in CLEAN_INSP_ACTIONS'
Error_Services('Add', ErrorMessage)
end
end end
end end
SpecDefect = Oconv(SpecDefects<0, SpecRecipeIndex>, 'MD0') SpecDefect = Oconv(SpecDefects<0, SpecRecipeIndex>, 'MD0')
SpecHaze = Oconv(SpecHazes<0, SpecRecipeIndex>, 'MD2') SpecHaze = Oconv(SpecHazes<0, SpecRecipeIndex>, 'MD2')
SpecQty = SpecQuantities<0, SpecRecipeIndex> SpecQty = SpecQuantities<0, SpecRecipeIndex>
@ -692,7 +700,10 @@ WRITE_RECORD_PRE:
Case (SigRequired EQ True$) AND (ScanSig EQ '') Case (SigRequired EQ True$) AND (ScanSig EQ '')
ROTRAction = 'F' ROTRAction = 'F'
ROTRActionReason = 'SurfScan signature is missing.' ROTRActionReason = 'SurfScan signature is missing.'
Case (ScanDefect GT SpecDefect) or (NumFailedWafers GE ROTRFailLimit) Case (ScanDefect GT SpecDefect)
ROTRAction = 'F'
ROTRActionReason = 'SurfScan data out of bounds.'
Case ROTREnabled and (NumFailedWafers GE ROTRFailLimit)
ROTRAction = 'F' ROTRAction = 'F'
ROTRActionReason = 'SurfScan data out of bounds.' ROTRActionReason = 'SurfScan data out of bounds.'
Case (ScanHaze GT SpecHaze) Case (ScanHaze GT SpecHaze)

View File

@ -101,105 +101,6 @@ Service ProcessScanData(ScanData, ScanType = SCAN_TYPES, FirstCassID, OperatorID
// type of cassette ID (i.e., RDS or WMO). // type of cassette ID (i.e., RDS or WMO).
Begin Case Begin Case
Case ScanType EQ 'WM_IN_1'
ValidCassID = False$
cnt = Count(ScanData, '|')
if cnt NE 0 then
Error_Services('Add', 'Wrong label - Scan 2D Top Label')
return
end else
CassetteID = ScanData
Swap 'FDI' with '' in CassetteID
Swap '^FS' with '' in CassetteID
Swap 'I' with '' in CassetteID
Convert '.' to '*' in CassetteID
WMIRow = Database_Services('ReadDataRow', 'WM_IN', CassetteID)
If Error_Services('NoError') then
ValidCassID = True$
end
ScanData = CassetteID
If ScanData NE FirstCassID then
Error_Services('Add', 'Lot Label does not match the expected lot in OI. | Please correct this issue and then retry.')
end
end
If ValidCassID EQ False$ then
Error_Services('Add', 'Unrecognized scan data: ':ScanData)
end
Response = ScanData
Case ScanType EQ 'WM_IN_2'
ValidCassID = False$
ScanMismatch = False$
cnt = Count(ScanData, '|')
if cnt NE 0 then
Error_Services('Add', 'Wrong label - Scan 2D Bottom Label')
return
end else
CassetteID = ScanData
Swap 'FDI' with '' in CassetteID
Swap '^FS' with '' in CassetteID
Swap 'I' with '' in CassetteID
Convert '.' to '*' in CassetteID
WMIRow = Database_Services('ReadDataRow', 'WM_IN', CassetteID)
If Error_Services('NoError') then
ValidCassID = True$
end
ScanData = CassetteID
If ScanData NE FirstCassID then
ScanMismatch = True$
end
end
If ScanMismatch EQ True$ then
ValidCassID = False$
If (RowExists('WM_IN', FirstCassID) EQ True$) And (RowExists('WM_IN', CassetteID) EQ True$) then
// Place first cassette on hold
WONo = Field(FirstCassID, '*', 1, 1)
CassNo = Field(FirstCassID, '*', 3, 1)
HoldEntity = 'WM_IN'
HoldEntityID = FirstCassID
WOMatKey = WONo:'*':CassNo
CtrlEntID = 'NCR_SERVICES' ;* Control checked/unchecked
OriginFlag = '' ;* Flag to indicate a hold initiated from the packagaing form
HoldData = ''
HoldData<1> = OperatorID
HoldData<2> = 'Lot placed on hold due to NCR Barcode verification mismatch.'
HoldData<3> = False$
Hold_Services('OnHold', WOMatKey, HoldEntity, HoldEntityID, 'HOLD', HoldData, OperatorID)
// Place Second cassette on hold
WONo = Field(CassetteID, '*', 1, 1)
CassNo = Field(CassetteID, '*', 3, 1)
HoldEntity = 'WM_IN'
HoldEntityID = CassetteID
WOMatKey = WONo:'*':CassNo
CtrlEntID = 'NCR_SERVICES' ;* Control checked/unchecked
OriginFlag = '' ;* Flag to indicate a hold initiated from the packagaing form
HoldData = ''
HoldData<1> = OperatorID
HoldData<2> = 'Lot placed on hold due to NCR Barcode verification mismatch.'
HoldData<3> = False$
Hold_Services('OnHold', WOMatKey, HoldEntity, HoldEntityID, 'HOLD', HoldData, OperatorID)
Message = 'NCR Label verification failed due to mismatched barcodes. Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.':CRLF$ |
: 'WM_IN Label #1: ':FirstCassID:CRLF$ |
: 'WM_IN Label #2: ':CassetteID:CRLF$ |
: 'Operator: ':OperatorID
Error_Services('Add', Message)
end else
Error_Services('Add', 'Unrecognized scan data: ':ScanData)
end
end
If ValidCassID EQ False$ then
Error_Services('Add', 'Unrecognized scan data: ':ScanData)
end
Response = ScanData
Case ScanType EQ 'CASSETTE_1' Case ScanType EQ 'CASSETTE_1'
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a // Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
@ -226,27 +127,15 @@ Service ProcessScanData(ScanData, ScanType = SCAN_TYPES, FirstCassID, OperatorID
ValidCassID = False$ ; // Assume Cassette ID is not valid for now. ValidCassID = False$ ; // Assume Cassette ID is not valid for now.
RDSCass = Count(CassetteID, '.') EQ 0 AND Num(CassetteID) RDSCass = Count(CassetteID, '.') EQ 0 AND Num(CassetteID)
GaNCass = Count(CassetteID, '.') EQ 1 AND not(RDSCass) EPPCass = Count(CassetteID, '.') EQ 2 AND not(RDSCass)
EPPCass = Count(CassetteID, '.') EQ 2 AND not(RDSCass) AND not(GaNCass)
Begin Case Begin Case
Case GaNCass
Convert '.' to '*' in CassetteID
WOMatRow = Database_Services('ReadDataRow', 'WO_MAT', CassetteID)
If Error_Services('NoError') then
ValidCassID = True$
end
Case EPPCass Case EPPCass
Convert '.' to '*' in CassetteID Convert '.' to '*' in CassetteID
WMOutRow = Database_Services('ReadDataRow', 'WM_OUT', CassetteID) ValidcassID = RowExists('WM_IN', CassetteID) or RowExists('WM_OUT', CassetteID)
If Error_Services('NoError') then
ValidCassID = True$
end
Case RDSCass Case RDSCass
RDSRow = Database_Services('ReadDataRow', 'RDS', CassetteID) RDSRow = Database_Services('ReadDataRow', 'RDS', CassetteID)
If Error_Services('NoError') then ValidCass = RowExists('RDS', CassetteID)
ValidCassID = True$
end
End Case End Case
If ( (Seq1 EQ 'SEQ1') or (Seq1 EQ 'SEQ2') ) then If ( (Seq1 EQ 'SEQ1') or (Seq1 EQ 'SEQ2') ) then
@ -591,7 +480,9 @@ Service SendToSPC(NCRNo, RDSList, ReactorType, PSNo, DeptResp, LossCode, LossDes
end service end service
Service GetOpenNCRKeys() Service GetOpenNCRKeys()
table = "NCR" table = "NCR"
ErrorMessage = '' ErrorMessage = ''
RDSRecords = '' RDSRecords = ''
@ -611,9 +502,12 @@ Service GetOpenNCRKeys()
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
Response = RDSRecords Response = RDSRecords
end service end service
Service ConvertRecordToJson(NCRId) Service ConvertRecordToJson(NCRId)
NCRJson = '' NCRJson = ''
ErrorMessage = '' ErrorMessage = ''
If RowExists('NCR', NCRId) then If RowExists('NCR', NCRId) then
@ -662,6 +556,6 @@ Service ConvertRecordToJson(NCRId)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
Response = NCRJson Response = NCRJson
end service end service

View File

@ -85,12 +85,7 @@ Event EDL_CASS_SCAN_1.LOSTFOCUS(Flag, FocusID)
ExpectedLot = Get_Property(@Window:'.EDL_LOT_ID', 'TEXT') ExpectedLot = Get_Property(@Window:'.EDL_LOT_ID', 'TEXT')
OperatorID = @User4 OperatorID = @User4
If ScanData NE '' then If ScanData NE '' then
ScanData = NCR_Services('ProcessScanData', ScanData, 'CASSETTE_1', ExpectedLot, OperatorID)
If Parent EQ 'WM_IN' then
ScanData = NCR_Services('ProcessScanData', ScanData, 'WM_IN_1', ExpectedLot, OperatorID)
end else
ScanData = NCR_Services('ProcessScanData', ScanData, 'CASSETTE_1', ExpectedLot, OperatorID)
End
If Error_Services('NoError') then If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData) Set_Property(CtrlEntID, 'TEXT', ScanData)
Set_Property(@Window:'.EDL_CASS_SCAN_2', 'ENABLED', True$) Set_Property(@Window:'.EDL_CASS_SCAN_2', 'ENABLED', True$)
@ -118,12 +113,7 @@ Event EDL_CASS_SCAN_2.LOSTFOCUS(Flag, FocusID)
If ScanData NE '' then If ScanData NE '' then
FirstCassID = Get_Property(@Window:'.EDL_CASS_SCAN_1', 'TEXT') FirstCassID = Get_Property(@Window:'.EDL_CASS_SCAN_1', 'TEXT')
OperatorID = @User4 OperatorID = @User4
ScanData = NCR_Services('ProcessScanData', ScanData, 'CASSETTE_2', FirstCassID, OperatorID)
If Parent EQ 'WM_IN' then
ScanData = NCR_Services('ProcessScanData', ScanData, 'WM_IN_2', FirstCassID, OperatorID)
end else
ScanData = NCR_Services('ProcessScanData', ScanData, 'CASSETTE_2', FirstCassID, OperatorID)
End
If Error_Services('NoError') then If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData) Set_Property(CtrlEntID, 'TEXT', ScanData)
SuccessMessage = 'NCR verification complete!' SuccessMessage = 'NCR verification complete!'
@ -198,4 +188,3 @@ GetLotID:
return return