Implemented ReceiveRelease_API.

Added OI Wizard Webview form to launch into OI Wizard from OI and
auto-login the user.

Added menu items to NDW_MAIN to launch the OI Wizard webview form and
navigated to the appropriate page.
This commit is contained in:
Infineon\StieberD
2025-09-08 15:31:25 -07:00
parent 4b7417c1a8
commit 261880fab8
25 changed files with 5292 additions and 1856 deletions

View File

@ -52,12 +52,10 @@ Function RDS_Services(@Service, @Params)
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert SERVICE_SETUP
$Insert APP_INSERTS
$Insert MSG_EQUATES
$Insert RTI_DEBUG_COMMON
$Insert SRPMail_Inserts
$Insert LOGICAL
$Insert SERVICE_SETUP
$Insert RDS_EQUATES
$Insert PROD_SPEC_EQUATES
$Insert RDS_LAYER_EQUATES
@ -85,6 +83,11 @@ $Insert DICT_EQUATES
$Insert COMPANY_EQUATES
$Insert RETURN_TO_FAB_LOTS_EQUATES
$Insert TEST_RUN_EQUATES
$Insert RDS_LAYER_INFO_EQU
$Insert EPI_PART_EQUATES
$Insert CUST_EPI_PART_EQUATES
$Insert UNIT_EQUATES
$Insert QUOTE_SPEC_EQU
EQU COL$LSID TO 1
EQU COL$RECIPE TO 2
@ -108,6 +111,20 @@ EQU COL$MET_TWSIG TO 19
EQU COL$MET_TWSIG_Z1 TO 20
EQU COL$MET_TWSIG_Z2 TO 21
EQU PI$LEFT TO 1
EQU PI$TOP TO 2
EQU PI$RIGHT TO 3
EQU PI$BOTTOM TO 4
EQU PI$WIDTH TO 5
EQU PI$HEIGHT TO 6
EQU PI$SIZE TO 7
EQU PS$TOOL TO 1
EQU PS$TYPE TO 2
EQU PS$RECIPE TO 3
EQU PS$FREQ TO 4
EQU PS$PATTERN TO 11
EQU COMMA$ to ','
EQU NEW_EXIST$ To 0 ; * Reduce Mode 0
@ -119,13 +136,14 @@ AutoDisplayErrors = FALSE$ ; // Set this to True$ when debugging so all erro
Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON, Logging_Services
Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_SI_Keys, Obj_WO_Mat, Obj_WO_Mat_Log
Declare subroutine Dialog_Box, Obj_Notes, RList, Set_Status, Errmsg, Obj_React_Status, Reactor_Services
Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services, Transaction_Services, Reduce
Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services, Transaction_Services, Reduce, Update_Index
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
Declare function Memberof, Obj_WO_Mat, Obj_WO_Mat_Log, SRP_Array, DateTime, Dialog_Box, obj_Prod_Spec
Declare function RDS_Services, RTI_DistinctList, GetTickCount, Clean_Insp_Services, WO_Mat_QA_Services
Declare function PSN_Services, Rds_Layer_Services, SRP_Rotate_Array, Qa_Services, SRP_Date, SRP_Time, SRP_Datetime
Declare function Reactor_Services, Signature_Services, obj_rds, Test_Run_Services, Return_To_Fab_Services
Declare function obj_Vendor_Code
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
LogDate = Oconv(Date(), 'D4/')
@ -2559,6 +2577,797 @@ Service UnsignPreEpiSignature(RDSNo, UserId)
end service
Service GetRdsZpl(RdsKey)
ZPL = ''
ErrorMsg = ''
If RdsKey NE '' then
If RowExists('RDS', RdsKey) then
Update_Index ("RDS", "WO", "")
UniqueWOs = ''
CustNos = ''
CompositeKeys = ''
WONo = XLATE('RDS',RdsKey,RDS_WO$,'X')
WOStepKey = Xlate('RDS', RdsKey, 'WO_STEP_KEY', 'X')
CustNo = XLATE('WO_LOG',WONo,WO_LOG_CUST_NO$,'X')
WOLogRec = XLATE('WO_LOG',WONo,'','X')
CassNo = XLATE('RDS',RdsKey,'CASS_NO','X')
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
ReShipCustNo = WOMatRec<WO_MAT_RESHIP_CUST_NO$>
ReShipDate = WOMatRec<WO_MAT_RESHIP_DT$>
ReShipCustEpiPartNo = WOMatRec<WO_MAT_RESHIP_CUST_EPI_PART_NO$>
ReShipCustPO = WOMatRec<WO_MAT_RESHIP_CUST_PO$>
ReShipCustPartNo = WOMatRec<WO_MAT_RESHIP_CUST_PART_NO$>
If ReShipCustNo EQ '' then
CustNo = WOLogRec<WO_LOG_CUST_NO$>
CustName = XLATE( 'RDS', RdsKey, 'ABBREV_OR_CO_NAME', 'X' )
CustName = XLATE( 'COMPANY', CustNo, 'ABBREV_OR_CO_NAME', 'X' )
end else
CustNo = ReShipCustNo
CompRec = XLATE('COMPANY',CustNo,'','X')
CustName = CompRec<COMPANY_ABBREV$>
end
If ReShipCustEpiPartNo EQ '' then
EpiPartNo = WOLogRec<WO_LOG_EPI_PART_NO$>
end else
EpiPartNo = ReShipCustEpiPartNo
end
EpiPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
CustEpiPartSpecNo = CustEpiPartRec<CUST_EPI_PART_SPEC_NO$>[-1,'B':@VM] ;* Last (current) Customer Spec Number
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
If ReShipDate EQ '' then
ReqShipDate = OCONV( XLATE( 'WO_LOG', WO, WO_LOG_PROMISE_SHIP_DT$, 'X' ), 'D2/' )
end else
ReqShipDate = ReShipDate
end
If ReShipCustPO EQ '' then
IF CustNo = '7108' THEN
PO = '' ;* Changed for "Foundry" customer additions 8/28/2012 JCH **********
END ELSE
PO = XLATE( 'RDS', RdsKey, rds_po$, 'X' )
END
end else
PO = ReShipCustPO
end
If ReShipCustPartNo EQ '' then
PartNum = XLATE( 'RDS', RdsKey, rds_part_num$, 'X' )
end else
PartNum = ReShipCustPartNo
end
ThickTarget = OCONV( XLATE( 'RDS', RdsKey, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
ThickUnit = XLATE( 'RDS', RdsKey, 'THICK_UNITS_ALL', 'X' )
Dopant = XLATE( 'RDS', RdsKey, 'DOPANT_L1', 'X' )
ResTarget = OCONV( XLATE( 'RDS', RdsKey, 'RES_TARGET_ALL', 'X' ), 'MD3' )
ResUnit = XLATE( 'RDS', RdsKey, 'RES_UNITS_ALL', 'X' )
RecipeIDS = XLATE( 'RDS', RdsKey, 'RECIPE_NO', 'X' )
LotNum = XLATE( 'RDS', RdsKey, rds_lot_num$, 'X' )
RONum = XLATE( 'RDS', RdsKey, 'RUN_ORDER_NUM', 'X' )
PSNo = XLATE( 'RDS', RdsKey, rds_prod_spec_id$, 'X' )
SpecType = OCONV( XLATE( 'RDS', RdsKey, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
SubPartNum = XLATE( 'RDS', RdsKey, 'SUB_PART_NUM', 'X' )
RecipeInfo = XLATE( 'RECIPE', RecipeIDS, 'RECIPE_NAME_NO', 'X' )
ThickVar = XLATE( 'PROD_SPEC', PSNo, 'THICK_MEASURE_L1', 'X' )
ResVar = XLATE( 'PROD_SPEC', PSNo, 'RES_MEASURE_L1', 'X' )
ConVar = XLATE( 'PROD_SPEC', PSNo, 'CON_MEASURE_L1', 'X' )
StressVar = XLATE( 'PROD_SPEC', PSNo, 'STRESS_MEASURE', 'X' )
TransVar = XLATE( 'PROD_SPEC', PSNo, 'TRANS_MEASURE', 'X' )
ReactTypes = OCONV( XLATE( 'PROD_SPEC', PSNo, 'REACTOR_TYPE', 'X' ), '[REACT_TYPE_CONV,CODE]')
SubOxide = OCONV(EpiPartRec<EPI_PART_SUB_OXIDE$>,'B')
SubPreCleans = ''
SubPostCleans = ''
PreAkrionRecipes = ''
PostAkrionRecipes = ''
SubPreCleans = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
SubPostCleans = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
PreAkrionRecipes = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
PostAkrionRecipes = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
SWAP 'AKRION' WITH 'Akr' IN SubPreCleans
SWAP 'AKRION' WITH 'Akr' IN SubPostCleans
SWAP ' or ' WITH '/' IN SubPreCleans
SWAP ' or ' WITH '/' IN SubPostCleans ;* To wide for field on small label "squeezed" data to fit JCH
SubPartNum = XLATE( 'RDS', RdsKey, 'SUB_PART_NUM', 'X' )
WOStepKeys = XLATE( 'RDS',RdsKey,RDS_WO_STEP_KEY$,'X' ) ;* 05/21/2005 - JCH - Added for Order Entry/Vision upgrade
IF CustNo = '7108' THEN
CustPNDescs = '' ;* 8/28/2012 - JCH Added for new "Foundry" customer ******************
END ELSE
CustPNDescs = XLATE('EPI_PART',EpiPartNo,EPI_PART_EPI_PART_DESC$,'X') ;* 12/2/2011 - JCH Added for SAP interface
END
************************************
PreSurfscan = XLATE( 'PRS_STAGE', PSNo:'*PRE' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
FirstSurfscan = XLATE( 'PRS_STAGE', PSNo:'*FWI' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
PostCleanSurfscan = XLATE( 'PRS_STAGE', PSNo:'*POST' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
CleaningReqs = ''
SRPFlag = XLATE( 'PROD_SPEC', PSNo, 'SRP_REQ', 'X' ) ;* Updated in PROD_SPEC dictionary JCH 4/21/2015
Qtys = XLATE( 'RDS', RdsKey, 'WAFERS_SCHEDULED', 'X' )
MultilayVar = XLATE( 'RDS', RdsKey, 'MULTI_LAYER', 'X' )
* Lets break out thick and res and see if it gets measured based on frequency
* Thickness
ThickPrintVar = ''
ResPrintVar = ''
SRPPrintVar = ''
SRPTypePrintVar = ''
ThisThickVar = ThickVar
ThisResVar = ResVar
ThisConVar = ConVar
ThisStressVar = StressVar
ThisTransVar = TransVar
ThisRunOrdNum = RONum
ThisWO = WONo
ThisWOStepKey = WOStepKey ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
MultiStep = 0
IF MultiStep > 0 THEN ThisWO = ThisWOStepKey[1,'*'] ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
ThickTool = field( ThisThickVar, '~', 1 )
ThickType = field( ThisThickVar, '~', 2 )
ThickRecipe = field( ThisThickVar, '~', 3 )
ThickFreq = field( ThisThickVar, '~', 4 )
ThickFirst = field( ThisThickVar, '~', 6 )
ThickLast = field( ThisThickVar, '~', 7 )
ResTool = field( ThisResVar, '~', 1 )
ResType = field( ThisResVar, '~', 2 )
ResRecipe = field( ThisResVar, '~', 3 )
ResFreq = field( ThisResVar, '~', 4 )
ResFirst = field( ThisResVar, '~', 6 )
ResLast = field( ThisResVar, '~', 7 )
ConTool = field( ThisConVar, '~', 1 )
ConType = field( ThisConVar, '~', 2 )
ConRecipe = field( ThisConVar, '~', 3 )
ConFreq = field( ThisConVar, '~', 4 )
ConFirst = field( ThisConVar, '~', 6 )
ConLast = field( ThisConVar, '~', 7 )
StressTool = field( ThisStressVar, '~', 1 )
StressType = field( ThisStressVar, '~', 2 )
StressRecipe = field( ThisStressVar, '~', 3 )
StressFreq = field( ThisStressVar, '~', 4 )
StressFirst = field( ThisStressVar, '~', 6 )
StressLast = field( ThisStressVar, '~', 7 )
TransTool = field( ThisTransVar, '~', 1 )
TransType = field( ThisTransVar, '~', 2 )
TransRecipe = field( ThisTransVar, '~', 3 )
TransFreq = field( ThisTransVar, '~', 4 )
TransFirst = field( ThisTransVar, '~', 6 )
TransLast = field( ThisTransVar, '~', 7 )
IF MultiStep > 0 THEN
WOBoxCnt = COUNT(XLATE('WO_STEP',ThisWOStepKey,6,'X'),@VM) ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
END ELSE
EXTRACT_SI_KEYS( 'RDS', 'WO', ThisWO, RDSsInWO ) ;* Original Code
WOBoxCnt = FIELDCOUNT( RDSsInWO, @VM ) ;* Original Code
END
* First check thickness
PrintThickness = false$
IF ( ThisRunOrdNum = 1 ) AND ( ThickFirst ) THEN PrintThickness = true$
IF ( ThisRunOrdNum = WOBoxCnt ) AND ( ThickLast ) THEN PrintThickness = true$
IF ThickFreq THEN
* Need to check run order and see if it needs to be printed
IF ThickFreq = 1 THEN
PrintThickness = true$
END ELSE
* Generate @FM delim of runs that should print
RoPrintFlag = str( @FM, WOBoxCnt-1 )
FOR J = 1 TO WOBoxCnt step ThickFreq
RoPrintFlag<J> = 1
NEXT J
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintThickness = true$
END
END
IF PrintThickness THEN
PSNRec = XLATE( 'PROD_SPEC', PSNo, '', 'X' )
SpecSub = PSNRec<prod_spec_spec_substrate$>
TOrient = SpecSub<1,QSSubOrientation$>
convert '<' TO '' in TOrient
convert '>' TO '' in TOrient
Orient = TOrient
ThickPrintVar = ThickTool:'~':ThickType:'~':Orient:'~':ThickRecipe
END ELSE
ThickPrintVar = ''
END
* Now check resistivity
PrintResistivity = false$
IF ( ThisRunOrdNum = 1 ) and ( ResFirst ) THEN PrintResistivity = true$
IF ( ThisRunOrdNum = WOBoxCnt ) and ( ResLast ) THEN PrintResistivity = true$
IF ResFreq THEN
* NEED TO CHECK RUN ORDER AND SEE IF IT NEEDS TO BE PRINTED
IF ResFreq = 1 THEN
PrintResistivity = true$
END ELSE
* Generate @FM delim of runs that should print
RoPrintFlag = str( @FM, WOBoxCnt-1 )
FOR J = 1 TO WOBoxCnt step ResFreq
RoPrintFlag<J> = 1
NEXT J
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintResistivity = true$
END
END
IF PrintResistivity THEN
PSNRec = XLATE( 'PROD_SPEC', PSNo, '', 'X' )
SpecSub = PSNRec<prod_spec_spec_substrate$> ;******* Moved to EPI_PART
TOrient = SpecSub<1,QSSubOrientation$>
convert '<' TO '' in TOrient
convert '>' TO '' in TOrient
Orient = TOrient
ResPrintVar = ResTool:'~':ResType:'~':Orient:'~':ResRecipe
END ELSE
ResPrintVar = ''
END
PrintSRP = false$
SRPType = ''
IF SRPFlag THEN
* We know that SRP is one of the tools
IF PrintThickness THEN
IF ThickTool = 'SRP' THEN
PrintSRP = true$
SRPType = ThickType
END
END
IF PrintResistivity THEN
IF ResTool = 'SRP' THEN
PrintSRP = true$
SRPType = ResType
END
END
IF NOT(PrintSRP) THEN
* Now need to check concentration
IF ConTool = 'SRP' THEN
IF ( ThisRunOrdNum = 1 ) and ( ConFirst ) THEN PrintSRP = true$
IF ( ThisRunOrdNum = WOBoxCnt ) and ( ConLast ) THEN PrintSRP = true$
IF ConFreq THEN
* Need to check run order and see if it needs to be printed
IF ConFreq = 1 THEN
PrintSRP = true$
END ELSE
* Generate fm delim of runs that should print
RoPrintFlag = str( @FM, WOBoxCnt-1 )
FOR J = 1 TO WOBoxCnt step ConFreq
RoPrintFlag<J> = 1
NEXT J
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintSRP = true$
END
END
END
IF PrintSRP THEN SRPType = ConType
END
IF NOT(PrintSRP) THEN
* Now need to check stress
IF StressTool = 'SRP' THEN
IF ( ThisRunOrdNum = 1 ) AND ( StressFirst ) THEN PrintSRP = true$
IF ( ThisRunOrdNum = WOBoxCnt ) AND ( StressLast ) THEN PrintSRP = true$
IF StressFreq THEN
* Need to check run order and see if it needs to be printed
IF StressFreq = 1 THEN
PrintSRP = true$
END ELSE
* Generate @FM delim of runs that should print
RoPrintFlag = str( @FM, WOBoxCnt-1 )
FOR J = 1 TO WOBoxCnt step StressFreq
RoPrintFlag<J> = 1
NEXT J
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintSRP = true$
END
END
END
IF PrintSRP THEN SRPType = StressType
END
IF NOT(PrintSRP) THEN
* Now need to check transition
IF TransTool = 'SRP' THEN
IF ( ThisRunOrdNum = 1 ) AND ( TransFirst ) THEN PrintSRP = true$
IF ( ThisRunOrdNum = WOBoxCnt ) AND ( TransLast ) THEN PrintSRP = true$
IF TransFreq THEN
* Need to check run order and see if it needs to be printed
IF TransFreq = 1 THEN
PrintSRP = true$
END ELSE
* Generate fm delim of runs that should print
RoPrintFlag = str( @FM, WOBoxCnt-1 )
FOR J = 1 TO WOBoxCnt step TransFreq
RoPrintFlag<J> = 1
NEXT J
IF ( ROPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintSRP = true$
END
IF PrintSRP THEN SRPType = TransType
END
END
END
IF PrintSRP THEN
SRPPrintVar = true$
SRPTypePrintVar = SRPType
END ELSE
SRPPrintVar = false$
SRPTypePrintVar = ''
END
END ELSE
SRPPrintVar = false$
SRPTypePrintVar = ''
END
* Got all data now we can print
PrintCustName = CustName
IF MultiStep > 0 THEN
WONo = WONo:'.':MultiStep ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
WONo = WOStepKeys
CONVERT '*' TO '.' IN WONo
END
PrintWO = WoNo ;* 5/21/2005 - JCH - Changed for Order Entry/Vision upgrade
PrintPSNNo = PSNo ;* 6/10/2005 - JCH - Added per manufacturing manager request
PrintLotNum = LotNum
PrintRecipeInfo = RecipeInfo
PrintSpecType = SpecType
PrintRONum = RONum
PrintRdsId = RdsKey
PrintThickPrintVar = ThickPrintVar
PrintResPrintVar = ResPrintVar
PrintMultiLayVar = MultiLayVar
PrintSRPPrintVar = SRPPrintVar
PrintSRPTypePrintVar = SRPTypePrintVar
PrintQty = Qtys
PrintThickTargets = ''
PrintThickTargets = ThickTarget:ThickUnit
PrintResTargets = ''
IF ResTarget[1,1] = '.' THEN
TargetVal = '0':ResTarget
END ELSE
TargetVal = ResTarget
END
PrintResTargets = TargetVal:ResUnit
PrintPO = PO
PrintPartNum = PartNum:' ':CustPNDescs
PrintPartNo = PartNum
PrintSubPartNum = SubPartNum
SubSupplier = obj_Vendor_Code('SemiToEpi',WOMatRec<WO_MAT_SUB_VEND_CD$>)
VendCd = XLATE('COMPANY',CustNo,COMPANY_VEND_CD$,'X')
PrintCompany = XLATE('COMPANY', CustNo, COMPANY_CO_NAME$, 'X')
IF VendCd NE '' THEN
SubSupplier = VendCd ;* Substrate supplier code found in the EPI_PART window. 12/9/2011 for cust 7067
END
PrintSuppCd = SubSupplier
PrintDopant = Dopant
PrintShipBagReq = ShipBagReq ;* Changed to single value ShipBagReq 9/27/2012 JCH
PrintReqShipDate = ReqShipDate
PrintSubOxide = SubOxide
PrintReactType = ReactTypes
PrintSubPreClean = SubPreCleans
PrintSubPostClean = SubPostCleans
PrintPreAkrionRecipe = PreAkrionRecipes
PrintPostAkrionRecipe = PostAkrionRecipes
APreRec = ''
APostRec = ''
IF ( PreAkrionRecipes <> '' ) THEN
APreRec = ' ':PreAkrionRecipes<I>:' '
SubOxide = 'No' ;* IF AKRION THEN NO OXIDE STRIP
END
IF ( PostAkrionRecipes <> '' ) THEN
APostRec = ' ':PostAkrionRecipes
END
swap '~' with fmt( ' ', 'L#2' ) in PrintThickPrintVar
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
swap UNIT_A$ with 'A' in PrintThickTargets
swap '~' with fmt( ' ', 'L#2' ) in PrintResPrintVar
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
swap UNIT_A$ with 'A' in PrintResTargets
//only print cheat sheet label on cassette #1
IF CassNo EQ 1 then
PsnRec = XLATE('PROD_SPEC', PSNo, '', 'X')
SpecEpi = PsnRec<prod_spec_spec_epi$>
SpecSub = PsnRec<PROD_SPEC_SPEC_SUBSTRATE$>
ThkSmile = PsnRec<PROD_SPEC_THICK_SMILE_REQ$>
ThkShift = Field(PsnRec, @FM, PROD_SPEC_THICK_LIMIT_SHIFT$)
ResShift = Field(PsnRec, @FM, PROD_SPEC_RES_LIMIT_SHIFT$)
SSRecipe = XLATE('PRS_STAGE', PSNo:'*LWI', 5, 'X')
PCRecipe = XLATE('PRS_STAGE', PSNo, 'POST_CLEAN_SURFSCAN_RECIPE', 'X')
CustPart = PsnRec<PROD_SPEC_CUST_PART_NO$>
WaferSize = XLATE('EPI_PART', CustPart, EPI_PART_SUB_WAFER_SIZE$, 'X')
*Field(SpecSub, @VM, QSSubWafersize$)
convert char(248) to @fm in SpecEpi ;* char(248) is used to separate layers
layerCount = fieldcount( SpecEpi, @fm )
layerInfo = SpecEpi<layerCount>
//if this is just 1 layer, we're returning that info, if 3 layers, we're returning layer 3 (combo)
ThkData = Field(layerInfo, @VM, QSEpiThickMeasure$)
ResData = Field(layerInfo, @VM, QSEpiResMeasure$)
ConData = Field(layerInfo, @VM, QSEpiConcMeasure$)
CResData = Field(layerInfo, @VM, QSEpiCresMeasure$)
ThkMin = OCONV(Field(layerInfo, @VM, QSEpiMinThick$), 'MD3')
ThkMax = OCONV(Field(layerInfo, @VM, QSEpiMaxThick$), 'MD3')
ThkTarg = ''
If ThkMin NE '' Then ThkTarg = oConv(iconv((ThkMin+ThkMax)/2, 'MD3'), 'MD3')
ResMin = OCONV(Field(layerInfo, @VM, QSEpiResMinThick$), 'MD3')
ResMax = OCONV(Field(layerInfo, @VM, QSEpiResMaxThick$), 'MD3')
ResTarg = ''
If ResMin NE '' Then ResTarg = oConv(iconv((ResMin+ResMax)/2, 'MD3'), 'MD3')
ConMin = OCONV(Field(layerInfo, @VM, QSEpiConcMinThick$), 'MD3')
ConMax = OCONV(Field(layerInfo, @VM, QSEpiConcMaxThick$), 'MD3')
ConTarg = ''
If ConMin NE '' Then ConTarg = oConv(iconv((ConMin+ConMax)/2, 'MD3'), 'MD3')
CResMin = OCONV(Field(layerInfo, @VM, QSEpiCresMin$), 'MD3')
CResMax = OCONV(Field(layerInfo, @VM, QSEpiCresMax$), 'MD3')
CResTarg = ''
If CResMin NE '' Then CResTarg = oConv(iconv((CResMin+CResMax)/2, 'MD3'), 'MD3')
ThkTool = Field(ThkData, '~', PS$TOOL)
ThkType = Field(ThkData, '~', PS$TYPE)
ThkRecipe = Field(ThkData, '~', PS$RECIPE)
ThkFreq = Field(ThkData, '~', PS$FREQ)
ThkPattern = Field(ThkData, '~', PS$PATTERN)
ResTool = Field(ResData, '~', PS$TOOL)
ResType = Field(ResData, '~', PS$TYPE)
ResRecipe = Field(ResData, '~', PS$RECIPE)
ResFreq = Field(ResData, '~', PS$FREQ)
ResPattern = Field(ResData, '~', PS$PATTERN)
ConTool = Field(ConData, '~', PS$TOOL)
ConType = Field(ConData, '~', PS$TYPE)
ConRecipe = Field(ConData, '~', PS$RECIPE)
ConFreq = Field(ConData, '~', PS$FREQ)
ConPattern = Field(ConData, '~', PS$PATTERN)
CResTool = Field(CResData, '~', PS$TOOL)
CResType = Field(CResData, '~', PS$TYPE)
CResRecipe = Field(CResData, '~', PS$RECIPE)
CResFreq = Field(CResData, '~', PS$FREQ)
CResPattern = Field(CResData, '~', PS$PATTERN)
IF ThkMin EQ '' THEN ThkMin = '--'
IF ThkMax EQ '' THEN ThkMax = '--'
IF ThkTarg EQ '' THEN ThkTarg = '--'
IF ThkTool EQ '' THEN ThkTool = '--'
IF ThkType EQ '' THEN ThkType = '--'
IF ThkRecipe EQ '' THEN ThkRecipe = '--'
IF ThkPattern EQ '' THEN ThkPattern = '--'
IF ThkFreq EQ '' THEN ThkFreq = '--'
IF ResMin EQ '' THEN ResMin = '--'
IF ResMax EQ '' THEN ResMax = '--'
IF ResTarg EQ '' THEN ResTarg = '--'
IF ResTool EQ '' THEN ResTool = '--'
IF ResType EQ '' THEN ResType = '--'
IF ResRecipe EQ '' THEN ResRecipe = '--'
IF ResPattern EQ '' THEN ResPattern = '--'
IF ResFreq EQ '' THEN ResFreq = '--'
IF ConMin EQ '' THEN ConMin = '--'
IF ConMax EQ '' THEN ConMax = '--'
IF ConTarg EQ '' THEN ConTarg = '--'
IF ConTool EQ '' THEN ConTool = '--'
IF ConType EQ '' THEN ConType = '--'
IF ConRecipe EQ '' THEN ConRecipe = '--'
IF ConPattern EQ '' THEN ConPattern = '--'
IF ConFreq EQ '' THEN ConFreq = '--'
IF CResMin EQ '' THEN CResMin = '--'
IF CResMax EQ '' THEN CResMax = '--'
IF CResTarg EQ '' THEN CResTarg = '--'
IF CResTool EQ '' THEN CResTool = '--'
IF CResType EQ '' THEN CResType = '--'
IF CResRecipe EQ '' THEN CResRecipe = '--'
IF CResPattern EQ '' THEN CResPattern = '--'
IF CResFreq EQ '' THEN CResFreq = '--'
Swap @VM with ' / ' in SSRecipe
IF PCRecipe EQ '' Then PCRecipe = '--'
If ThkSmile EQ '' OR ThkSmile EQ '0' then
ThkSmile = 'N'
end else
ThkSmile = 'Y'
end
If ThkShift EQ '' OR ThkShift EQ '0' then
ThkShift = 'N'
end else
ThkShift = 'Y'
end
If ResShift EQ '' OR ResShift EQ '0' then
ResShift = 'N'
end else
ResShift = 'Y'
end
if Len(ThkMin) > 6 then
ThkMin = ThkMin[1,6]
end
if Len(ThkMax) > 6 then
ThkMax = ThkMax[1,6]
end
if Len(ThkTarg) > 6 then
ThkTarg = ThkTarg[1,6]
end
if Len(ResMin) > 6 then
ResMin = ResMin[1,6]
end
if Len(ResMax) > 6 then
ResMax = ResMax[1,6]
end
if Len(ResTarg) > 6 then
ResTarg = ResTarg[1,6]
end
if Len(ConMin) > 6 then
ConMin = ConMin[1,6]
end
if Len(ConMax) > 6 then
ConMax = ConMax[1,6]
end
if Len(ConTarg) > 6 then
ConTarg = ConTarg[1,6]
end
if Len(CResMin) > 6 then
CResMin = CResMin[1,6]
end
if Len(CResMax) > 6 then
CResMax = CResMax[1,6]
end
if Len(CResTarg) > 6 then
CResTarg = CResTarg[1,6]
end
****** Begin ZPL
ZPL := '^XA'
ZPL := '^LH10,0'
ZPL := '^PR2' ;* Print speed 2 inches per second
ZPL := '^LL406' ;* Label length @203 dpi
ZPL := '^PW900'
ZPL := '^MD0' ;* Media darkness
ZPL := '^MMT' ;* Media mode t=tear off mode
****** 1st/2nd Line
ZPL := '^FO30,20^A0,,40^FDWO ':PrintWO:'^FS'
ZPL := '^FO590,10^A050,30^FDPSN ':PrintPSNNo:'^FS'
ZPL := '^FO555,40^A050,30^FDDopant ':PrintDopant:'^FS'
****** 3rd Line - headers
ZPL := '^FO85,100^A050,23^FDMin^FS'
ZPL := '^FO145,100^A050,23^FDTarg^FS'
ZPL := '^FO210,100^A050,23^FDMax^FS'
ZPL := '^FO280,100^A050,23^FDTool^FS'
ZPL := '^FO330,100^A050,23^FDType^FS'
ZPL := '^FO470,100^A050,23^FDRecipe^FS'
ZPL := '^FO600,100^A050,23^FDPattern^FS'
ZPL := '^FO740,100^A050,23^FDFreq^FS'
****** 4th Line - Thickness (Thk)
ZPL := '^FO70,130^GB720,0,3^FS'
ZPL := '^FO70,130^GB0,160,3^FS'
ZPL := '^FO10,140^A050,23^FDThk:^FS'
ZPL := '^FO80,140^A050,23^FD':ThkMin:'^FS'
ZPL := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
ZPL := '^FO210,140^A050,23^FD':ThkMax:'^FS'
ZPL := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
ZPL := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
ZPL := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
ZPL := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
ZPL := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
****** 5th Line - Resistivity (Res)
ZPL := '^FO10,170^GB780,0,3^FS'
ZPL := '^FO10,180^A050,23^FDRes:^FS'
ZPL := '^FO80,180^A050,23^FD':ResMin:'^FS'
ZPL := '^FO145,180^A050,23^FD':ResTarg:'^FS'
ZPL := '^FO210,180^A050,23^FD':ResMax:'^FS'
ZPL := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
ZPL := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
ZPL := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
ZPL := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
ZPL := '^FO750,180^A050,23^FD':ResFreq:'^FS'
****** 6th Line - Contact (Con)
ZPL := '^FX***LINE 4'
ZPL := '^FO10,210^GB780,0,3^FS'
ZPL := '^FO10,220^A050,23^FDCon:^FS'
ZPL := '^FO80,220^A050,23^FD':ConMin:'^FS'
ZPL := '^FO145,220^A050,23^FD':ConTarg:'^FS'
ZPL := '^FO210,220^A050,23^FD':ConMax:'^FS'
ZPL := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
ZPL := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
ZPL := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
ZPL := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
ZPL := '^FO750,220^A050,23^FD':ConFreq:'^FS'
****** 7th Line - Contact Resistance (CRes)
ZPL := '^FO10,250^GB780,0,3^FS'
ZPL := '^FO10,260^A050,23^FDCRes:^FS'
ZPL := '^FO80,260^A050,23^FD':CResMin:'^FS'
ZPL := '^FO145,260^A050,23^FD':CResTarg:'^FS'
ZPL := '^FO210,260^A050,23^FD':CResMax:'^FS'
ZPL := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
ZPL := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
ZPL := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
ZPL := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
ZPL := '^FO750,260^A050,23^FD':CResFreq:'^FS'
ZPL := '^FO10,290^GB780,0,3^FS'
****** 8th Line - Special Instructions
ZPL := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
ZPL := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
ZPL := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
ZPL := '^FO560,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
ZPL := '^FO560,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
ZPL := '^FO560,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
ZPL:= '^XZ':CRLF$
****** End ZPL
end
* Standard RDS Label print method
IF PrintSpecType EQ 'Production' THEN PrintSpecType = 'Prod'
IF PrintSpecType EQ 'Pre-Production' THEN PrintSpecType = 'Pre'
EpiPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
IsExportControl = EpiPartRec<EPI_PART_EXPORT_CONTROL$>
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
CustEpiPartSpecNo = CustEpiPartRec<CUST_EPI_PART_SPEC_NO$>[-1,'B':@VM] ;* Last (current) Customer Spec Number
PrintPSN = XLATE('RDS',PrintRDSId,'PROD_SPEC_ID', 'X')
PrintRecipe = ''
PSStageKey = PrintPSN:'*QA'
PrintRecipe = XLATE('PRS_STAGE',PSStageKey,'MET_RECIPE','X')
PrintQARecipe = FIELD(PrintRecipe, @VM, 1)
PrintCompany = PrintCompany[1,32]
// Looping instead of using ^PQ2 since I have to set sequential key in 2D barcode
For cnt = 1 to 2
ZPL := '^XA'
ZPL := '^LH0,0'
ZPL := '^PR1' ;* Print speed 2 inches per second
ZPL := '^LL406' ;* Label length @203 dpi
ZPL := '^PW900'
ZPL := '^MD5' ;* Media darkness
ZPL := '^MMT' ;* Media mode t=tear off mode
****** First Line, Cust, WO and RO
ZPL := '^FO25,25^AC,18^FDCust: ^FS':CRLF$
ZPL := '^FO95,14^A045,35^FD':PrintCompany:'^FS':CRLF$
ZPL := '^FO570,25^AC18^FDWO: ^FS':CRLF$
ZPL := '^FO610,14^A045,35^FD':PrintWO:'^FS':CRLF$
ZPL := '^FO730,25^AC18^FDRO: ^FS':CRLF$
ZPL := '^FO770,14^A045,35^FD':PrintRONum:'^FS':CRLF$
****** Second Line, Cust Spec, PSN and Type
ZPL := '^FO25,75^AC18^FD(P)Cust Spec: ^FS':CRLF$
ZPL := '^FO185,65^A045,35^FD':CustEpiPartSpecNo:'^FS':CRLF$
ZPL := '^FO25,95^BY2,2.0^B3,,50,N^FDP':CustEpiPartSpecNo:'^FS':CRLF$
ZPL := '^FO640,75^AC18^FDPSN:^FS':CRLF$
ZPL := '^FO690,65^A045,35^FD':PrintPSN:'^FS':CRLF$
ZPL := '^FO630,125^AC18^FDType:^FS':CRLF$
ZPL := '^FO690,115^A045,30^FD':PrintSpecType:'^FS':CRLF$
****** Third Line, Sub Lot, Qty and RDS
ZPL := '^FO25,175^AC18^FD(2T)Sub Lot:^FS':CRLF$
ZPL := '^FO175,165^A045,35^FD':PrintLotNum:'^FS':CRLF$
ZPL := '^FO25,195^BY1,3.0^B3,,50,N^FD2T':PrintLotNum:'^FS':CRLF$
ZPL := '^FO400,175^AC18^FD(Q)Qty:^FS':CRLF$
ZPL := '^FO500,165^A045,35^FD':PrintQty:'^FS':CRLF$
ZPL := '^FO400,195^B3,,50,N^FDQ':PrintQty:'^FS':CRLF$
ZPL := '^FO590,175^AC18^FD(1T)RDS: ^FS':CRLF$
ZPL := '^FO690,165^A045,35^FD':PrintRDSId:'^FS':CRLF$
ZPL := '^FO630,195^B3,,50,N^FD1T':PrintRDSId:'^FS':CRLF$
****** Fourth Line, SubPN, Vendor and QA Metrology recipe
ZPL := '^FO25,275^AC18^FD(S)Sub PN:^FS':CRLF$
ZPL := '^FO145,265^A045,35^FD':PrintSubPartNum:'^FS':CRLF$
ZPL := '^FO25,295^B3,,50,N^FDS':PrintSubPartNum:'^FS':CRLF$
ZPL := '^FO400,275^AC18^FD(1V)Vend:^FS':CRLF$
ZPL := '^FO510,265^A045,35^FD':PrintSuppCd:'^FS':CRLF$
ZPL := '^FO400,295^B3,,50,N^FD1V':PrintSuppCd:'^FS':CRLF$
ZPL := '^FO590,275^AC18^FD':PrintQARecipe:'^FS':CRLF$
****** Fifth Line, Motto and Data Matrix barcode
ZPL := '^FO25,370^A045,28':CRLF$
ZPL := "^FDWe do what we promise. That's quality made by Infineon.^FS":CRLF$
ZPL := '^FO725,320^CI28':CRLF$
ZPL := '^BXN,2,200^FDP':CustEpiPartSpecNo:'|S':PrintSubPartNum:'|1T':PrintRDSId:'|2T':PrintLotNum:'|':PrintPSN:'|Q':PrintQty:'|1V':PrintSuppCd:'|SEQ':cnt:'^FS':CRLF$
****** End the print job (ZPL script)
ZPL:= '^XZ'
Next
end else
ErrorMsg = 'Error in ':Service:' service. RDS ':RdsKey:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null RdsKey passed in.'
end
If ErrorMsg EQ '' then
Response = ZPL
end else
Error_Services('Add', ErrorMsg)
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -2571,3 +3380,4 @@ ClearCursors:
return