open-insight/LSL2/STPROC/PRINT_CASS_LABELS.txt
2024-03-25 14:46:21 -07:00

1084 lines
36 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

COMPILE SUBROUTINE PRINT_CASS_LABELS( RdsIds , MultiStep )
#pragma precomp SRP_PreCompiler
$INSERT LOGICAL
$INSERT MSG_EQUATES
$INSERT RDS_EQUATES
$INSERT RDS_LAYER_INFO_EQU
$INSERT OIPRINT_EQUATES
$INSERT PROD_SPEC_EQUATES
$INSERT QUOTE_SPEC_EQU
$INSERT WO_LOG_EQUATES
$INSERT WO_MAT_EQUATES
$INSERT ORDER_DET_EQU
$INSERT EPI_PART_EQUATES
$INSERT COMPANY_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$INSERT PRS_STAGE_EQUATES
DECLARE FUNCTION FIELDCOUNT, MSG, Key_Sort, Get_Printer, SRP_Math, Set_Printer, Utility, obj_Install, Printer_Select, obj_Vendor_Code, Direct_Print, Environment_Services
DECLARE SUBROUTINE Extract_Si_Keys, Update_Index, ErrMsg
/*
* 269203 Medtronic with long Lot No
* 281102 IR with longwinded Part/Substrate part Number
* 228212 IR Multilayerd
* * * * * *
* added 9/10/2003 - J.C. Henry, changed printdriver to generic
* eliminated port capture to print, changed printing OI Print Interface
*
* added 10/18/2005 - J.C. Henry - changed label size to 2" x 4" for Akrion Bar Codes and general rearrangement
* 10/26/20 DPC added CheatSheatLabel routine
* 10/01/21 DPC changed PrintLabel routine - instead of just printing 2 labels (^PQ2), now loop in order
* to print label number identifier in datamatrix barcode (e.g., SEQ1, SEQ2)
*/
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
IF NOT(ASSIGNED(RdsIds)) THEN RdsIds = '' ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
IF NOT(ASSIGNED(MultiStep)) THEN MultiStep = '' ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
IF RdsIds = '' THEN RETURN 0 ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
IF MultiStep = '' THEN MultiStep = 0 ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
FileName = "Printing Label"
Title = "Printing Label"
PageInfo = ''
PageInfo<PI$LEFT> = 0.1
PageInfo<PI$TOP> = 0.1
PageInfo<PI$RIGHT> = 0.1
PageInfo<PI$BOTTOM> = 0.1
PageSetup = '1' ;* Landscape
PrintSetup = '' ;* Preview
PrinterID = ''
PrintPath = Printer_Select(PrinterID) ;* Popup is skipped IF Printer ID is passed
//If @UserName EQ 'DAN_CR' then
// Ensure Zebra printer paths are formatted correctly. Remote desktop services is returning printer paths
// differently than the 2008 Terminal Server and the Windows 2016 Server.
// If PrintPath[1, 11] EQ 'MESZBRPRT00' then
// PrintPath = Environment_Services('GetPrintServerPath') : PrintPath
// end
// Msg(@Window, '', 'OK', '', 'PrintPath':@FM:PrintPath)
//end
If PrintPath NE '' then
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
stat = Set_Printer("INIT",FileName,Title,PageInfo,PageSetup,PrintSetup,PrintPath)
end else
stat = Direct_Print('START', PrintPath<1>, '', '')
end
IF stat < 0 THEN GOTO OIPrint_Error
EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch
CLOrientation = '' ;* used for printing on cleanroom labels
IF RdsIds THEN
Update_Index ("RDS", "WO", "")
Void = utility( 'CURSOR', 'H' )
IdCnt = fieldcount( RdsIds, @FM )
* sort by run order number
IF IdCnt > 1 THEN
RdsIds = key_sort( RdsIds, 'RDS', 'WO':@FM:'RUN_ORDER_NUM', 1, '', '' )
END
// To work around the design flaws in the label printing logic regarding multiple RDS Key IDs
// while still preserving the variable names, the RdsIds values will be transferred to AllRdsIds
// and then each RDS Key ID will be parsed in a loop and passed into the RdsIds variable.
Transfer RdsIds to AllRdsIds
For Each RdsIds in AllRdsIds using @FM
IdCnt = fieldcount( RdsIds, @FM )
GOSUB PrintCleanRoomLabels
Next RdsIds
// Restore RdsIds variable for other processes that need it to be intact.
Transfer AllRdsIds to RdsIds
UniqueWOs = ''
CustNos = ''
CompositeKeys = ''
IdCnt = fieldcount( RdsIds, @FM )
IF MultiStep > 0 THEN
WOStepKeys = XLATE('RDS',RdsIds,RDS_WO_STEP_KEY$,'X') ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
FOR I = 1 TO IdCnt
ThisWO = WOStepKeys<I>
CONVERT '*' TO '.' IN ThisWO
CassNo = XLATE('RDS',RdsIds<I>,'CASS_NO','X')
WOMatRec = XLATE('WO_MAT',ThisWO:'*':CassNo,'','X')
ReShipCustNo = WOMatRec<WO_MAT_RESHIP_CUST_NO$>
If ReShipCustNo EQ '' then
CustNo = XLATE( 'WO_LOG', ThisWO, wo_log_cust_no$, 'X' )
end else
CustNo = ReShipCustNo
end
LOCATE ThisWO : '*' : CustNo IN CompositeKeys USING @VM SETTING FPos ELSE
UniqueWOs<1,-1> = ThisWO
CustNos<1,-1> = CustNo
CompositeKeys<1,-1> = ThisWO : '*' : CustNo
END
NEXT I
END ELSE
AllWOs = XLATE( 'RDS', RdsIds, rds_wo$, 'X' )
FOR I = 1 TO IdCnt
ThisWO = AllWOs<I>
CassNo = XLATE('RDS',RdsIds<I>,'CASS_NO','X')
WOMatRec = XLATE('WO_MAT',ThisWO:'*':CassNo,'','X')
ReShipCustNo = WOMatRec<WO_MAT_RESHIP_CUST_NO$>
If ReShipCustNo EQ '' then
CustNo = XLATE( 'WO_LOG', ThisWO, wo_log_cust_no$, 'X' )
end else
CustNo = ReShipCustNo
end
LOCATE ThisWO : '*' : CustNo IN CompositeKeys USING @VM SETTING Fpos ELSE
UniqueWOs<1,-1> = ThisWO
CustNos<1,-1> = CustNo
CompositeKeys<1,-1> = ThisWO : '*' : CustNo
END
NEXT I
END
GOSUB PrintWOLabels ;* Activated WO label printing again -dkk 12/3/14
WONo = XLATE('RDS',RdsIds<1>,RDS_WO$,'X')
CustNo = XLATE('WO_LOG',WONo,WO_LOG_CUST_NO$,'X')
Void = UTILITY( 'CURSOR', 'A' )
END
* * * * * *
OIPrint_Error:
* * * * * *
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
stat = Set_Printer("TERM")
end else
stat = Direct_Print('STOP')
end
end
RETURN
* * * * * * * * * * * * Local Subroutines * * * * * * * * * * * *
* * * * * * *
PrintCleanRoomLabels:
* * * * * * *
// Note: Due to code changes in the calling logic for this gosub, the RdsIds variable actually only
// contains one RDS Key ID at a time.
WO = XLATE( 'RDS', RdsIds, rds_wo$, 'X' )
WOLogRec = XLATE('WO_LOG',WO,'','X')
CassNos = XLATE('RDS',RdsIds,'CASS_NO','X')
CassNo = CassNos<1>
WOMatRec = XLATE('WO_MAT',WO:'*':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', RdsIds, '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', RdsIds, rds_po$, 'X' )
END
end else
PO = ReShipCustPO
end
If ReShipCustPartNo EQ '' then
PartNum = XLATE( 'RDS', RdsIds, rds_part_num$, 'X' )
end else
PartNum = ReShipCustPartNo
end
ThickTarget = OCONV( XLATE( 'RDS', RdsIds, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
ThickUnit = XLATE( 'RDS', RdsIds, 'THICK_UNITS_ALL', 'X' )
Dopant = XLATE( 'RDS', RdsIds, 'DOPANT_L1', 'X' )
ResTarget = OCONV( XLATE( 'RDS', RdsIds, 'RES_TARGET_ALL', 'X' ), 'MD3' )
ResUnit = XLATE( 'RDS', RdsIds, 'RES_UNITS_ALL', 'X' )
RecipeIDS = XLATE( 'RDS', RdsIds, 'RECIPE_NO', 'X' )
LotNum = XLATE( 'RDS', RdsIds, rds_lot_num$, 'X' )
RONum = XLATE( 'RDS', RdsIds, 'RUN_ORDER_NUM', 'X' )
PSNIds = XLATE( 'RDS', RdsIds, rds_prod_spec_id$, 'X' )
SpecType = OCONV( XLATE( 'RDS', RdsIds, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
SubPartNum = XLATE( 'RDS', RdsIds, 'SUB_PART_NUM', 'X' )
RecipeInfo = XLATE( 'RECIPE', RecipeIDS, 'RECIPE_NAME_NO', 'X' )
ThickVar = XLATE( 'PROD_SPEC', PSNIds, 'THICK_MEASURE_L1', 'X' )
ResVar = XLATE( 'PROD_SPEC', PSNIds, 'RES_MEASURE_L1', 'X' )
ConVar = XLATE( 'PROD_SPEC', PSNIds, 'CON_MEASURE_L1', 'X' )
StressVar = XLATE( 'PROD_SPEC', PSNIds, 'STRESS_MEASURE', 'X' )
TransVar = XLATE( 'PROD_SPEC', PSNIds, 'TRANS_MEASURE', 'X' )
ReactTypes = OCONV( XLATE( 'PROD_SPEC', PSNIds, 'REACTOR_TYPE', 'X' ), '[REACT_TYPE_CONV,CODE]')
SubOxide = OCONV(EpiPartRec<EPI_PART_SUB_OXIDE$>,'B')
SubPreCleans = ''
SubPostCleans = ''
PreAkrionRecipes = ''
PostAkrionRecipes = ''
PSNCnt = COUNT(PSNIds,@FM) + (PSNIds NE '')
FOR I = 1 TO PSNCnt
PSNId = PSNIds<I>
SubPreCleans<I> = XLATE('PRS_STAGE',PSNId:'*PRE','TOOL_DISPLAY','X')
SubPostCleans<I> = XLATE('PRS_STAGE',PSNId:'*POST','TOOL_DISPLAY','X')
PreAkrionRecipes<I> = XLATE('PRS_STAGE',PSNId:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
PostAkrionRecipes<I> = XLATE('PRS_STAGE',PSNId:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
NEXT I
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', RdsIds, 'SUB_PART_NUM', 'X' )
WOStepKeys = XLATE( 'RDS',RdsIds,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', PSNIds<1>:'*PRE' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
FirstSurfscan = XLATE( 'PRS_STAGE', PSNIds<1>:'*FWI' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
PostCleanSurfscan = XLATE( 'PRS_STAGE', PSNIds<1>:'*POST' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
CleaningReqs = ''
SRPFlag = XLATE( 'PROD_SPEC', PSNIds, 'SRP_REQ', 'X' ) ;* Updated in PROD_SPEC dictionary JCH 4/21/2015
Qtys = XLATE( 'RDS', RdsIds, 'WAFERS_SCHEDULED', 'X' )
MultilayVar = XLATE( 'RDS', RdsIds, 'MULTI_LAYER', 'X' )
* Lets break out thick and res and see if it gets measured based on frequency
* Thickness
ThickPrintVar = ''
ResPrintVar = ''
SRPPrintVar = ''
SRPTypePrintVar = ''
FOR I = 1 TO IdCnt
ThisThickVar = ThickVar<I>
ThisResVar = ResVar<I>
ThisConVar = ConVar<I>
ThisStressVar = StressVar<I>
ThisTransVar = TransVar<I>
ThisRunOrdNum = RONum<I>
ThisWO = WO<I>
ThisWOStepKey = WOStepKeys<I> ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
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', PSNIds<I>, '', 'X' )
SpecSub = PSNRec<prod_spec_spec_substrate$>
TOrient = SpecSub<1,QSSubOrientation$>
convert '<' TO '' in TOrient
convert '>' TO '' in TOrient
Orient = TOrient
ThickPrintVar<I> = ThickTool:'~':ThickType:'~':Orient:'~':ThickRecipe
END ELSE
ThickPrintVar<I> = ''
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', PSNIds<I>, '', '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<I> = ResTool:'~':ResType:'~':Orient:'~':ResRecipe
END ELSE
ResPrintVar<I> = ''
END
PrintSRP = false$
SRPType = ''
IF SRPFlag<I> 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<I> = true$
SRPTypePrintVar<I> = SRPType
END ELSE
SRPPrintVar<I> = false$
SRPTypePrintVar<I> = ''
END
END ELSE
SRPPrintVar<I> = false$
SRPTypePrintVar<I> = ''
END
NEXT I
* Got all data now we can print
FOR I = 1 TO IdCnt
PrintCustName = CustName<I>
IF MultiStep > 0 THEN
WONo = WO<I>:'.':MultiStep ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
WONo = WOStepKeys<I>
CONVERT '*' TO '.' IN WONo
END ELSE
WoNo = WO<I>
END
PrintWO = WoNo ;* 5/21/2005 - JCH - Changed for Order Entry/Vision upgrade
PrintPSNNo = PSNIds<I> ;* 6/10/2005 - JCH - Added per manufacturing manager request
PrintLotNum = LotNum<I>
PrintRecipeInfo = RecipeInfo<I>
PrintSpecType = SpecType<I>
PrintRONum = RONum<I>
PrintRdsId = RdsIds<I>
PrintThickPrintVar = ThickPrintVar<I>
PrintResPrintVar = ResPrintVar<I>
PrintMultiLayVar = MultiLayVar<I>
PrintSRPPrintVar = SRPPrintVar<I>
PrintSRPTypePrintVar = SRPTypePrintVar<I>
PrintQty = Qtys<I>
ThickCnt = FIELDCOUNT( ThickTarget<I>, @VM )
PrintThickTargets = ''
FOR J = 1 TO ThickCnt
PrintThickTargets<1,J> = ThickTarget<i,j>:ThickUnit<i,j>
NEXT J
ResCnt = FIELDCOUNT( ResTarget<I>, @VM )
PrintResTargets = ''
FOR J = 1 TO ResCnt
IF ResTarget<I,J>[1,1] = '.' THEN
TargetVal = '0':ResTarget<I,J>
END ELSE
TargetVal = ResTarget<I,J>
END
PrintResTargets<1,J> = TargetVal:ResUnit<I,J>
NEXT J
PrintPO = PO<I>
PrintPartNum = PartNum<I>:' ':CustPNDescs<I>
PrintPartNo = PartNum<I>
PrintSubPartNum = SubPartNum<I>
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<I>
PrintShipBagReq = ShipBagReq ;* Changed to single value ShipBagReq 9/27/2012 JCH
PrintReqShipDate = ReqShipDate<I>
PrintSubOxide = SubOxide<I>
PrintReactType = ReactTypes<I>
PrintSubPreClean = SubPreCleans<I>
PrintSubPostClean = SubPostCleans<I>
PrintPreAkrionRecipe = PreAkrionRecipes<I>
PrintPostAkrionRecipe = PostAkrionRecipes<I>
APreRec = ''
APostRec = ''
IF ( PreAkrionRecipes<I> <> '' ) THEN
APreRec = ' ':PreAkrionRecipes<I>:' '
SubOxide<I> = 'No' ;* IF AKRION THEN NO OXIDE STRIP
END
IF ( PostAkrionRecipes<I> <> '' ) THEN
APostRec = ' ':PostAkrionRecipes<I>
END
swap '~' with fmt( ' ', 'L#2' ) in PrintThickPrintVar
swap 'æm' with 'um' in PrintThickTargets
swap 'ê-cm' with 'ohm.cm' in PrintThickTargets
swap 'ê/Ü' with 'ohm/sq' in PrintThickTargets
swap '' with 'A' in PrintThickTargets
swap '~' with fmt( ' ', 'L#2' ) in PrintResPrintVar
swap 'æm' with 'um' in PrintResTargets
swap 'ê-cm' with 'ohm.cm' in PrintResTargets
swap 'ê/Ü' with 'ohm/sq' in PrintResTargets
swap '' with 'A' in PrintResTargets
//only print cheat sheet label on cassette #1
IF CassNo EQ 1 then
GOSUB PrintCheatSheetLabel
end
GOSUB PrintLabel
NEXT I
RETURN
* * * * * * *
PrintLabel:
* * * * * * *
* 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
Str = ''
For cnt = 1 to 2
Str := '^XA'
Str := '^LH0,0'
Str := '^PR1' ;* Print speed 2 inches per second
Str := '^LL406' ;* Label length @203 dpi
Str := '^PW900'
Str := '^MD0' ;* Media darkness
Str := '^MMT' ;* Media mode t=tear off mode
*Str := '^PQ2' ;* Print 2 labels for each pass through here
****** First Line, Cust, WO and RO
Str := '^FO25,25^AC,18^FDCust: ^FS':CRLF$
Str := '^FO95,14^A045,35^FD':PrintCompany:'^FS':CRLF$
Str := '^FO570,25^AC18^FDWO: ^FS':CRLF$
Str := '^FO610,14^A045,35^FD':PrintWO:'^FS':CRLF$
Str := '^FO730,25^AC18^FDRO: ^FS':CRLF$
Str := '^FO770,14^A045,35^FD':PrintRONum:'^FS':CRLF$
****** Second Line, Cust Spec, PSN and Type
Str := '^FO25,75^AC18^FD(P)Cust Spec: ^FS':CRLF$
Str := '^FO185,65^A045,35^FD':CustEpiPartSpecNo:'^FS':CRLF$
Str := '^FO25,95^BY2,2.0^B3,,50,N^FDP':CustEpiPartSpecNo:'^FS':CRLF$
Str := '^FO640,75^AC18^FDPSN:^FS':CRLF$
Str := '^FO690,65^A045,35^FD':PrintPSN:'^FS':CRLF$
Str := '^FO630,125^AC18^FDType:^FS':CRLF$
Str := '^FO690,115^A045,30^FD':PrintSpecType:'^FS':CRLF$
****** Third Line, Sub Lot, Qty and RDS
Str := '^FO25,175^AC18^FD(2T)Sub Lot:^FS':CRLF$
Str := '^FO175,165^A045,35^FD':PrintLotNum:'^FS':CRLF$
Str := '^FO25,195^BY1,3.0^B3,,50,N^FD2T':PrintLotNum:'^FS':CRLF$
Str := '^FO400,175^AC18^FD(Q)Qty:^FS':CRLF$
Str := '^FO500,165^A045,35^FD':PrintQty:'^FS':CRLF$
Str := '^FO400,195^B3,,50,N^FDQ':PrintQty:'^FS':CRLF$
Str := '^FO590,175^AC18^FD(1T)RDS: ^FS':CRLF$
Str := '^FO690,165^A045,35^FD':PrintRDSId:'^FS':CRLF$
Str := '^FO630,195^B3,,50,N^FD1T':PrintRDSId:'^FS':CRLF$
****** Fourth Line, SubPN, Vendor and QA Metrology recipe
Str := '^FO25,275^AC18^FD(S)Sub PN:^FS':CRLF$
Str := '^FO145,265^A045,35^FD':PrintSubPartNum:'^FS':CRLF$
Str := '^FO25,295^B3,,50,N^FDS':PrintSubPartNum:'^FS':CRLF$
Str := '^FO400,275^AC18^FD(1V)Vend:^FS':CRLF$
Str := '^FO510,265^A045,35^FD':PrintSuppCd:'^FS':CRLF$
Str := '^FO400,295^B3,,50,N^FD1V':PrintSuppCd:'^FS':CRLF$
Str := '^FO590,275^AC18^FD':PrintQARecipe:'^FS':CRLF$
****** Fifth Line, Motto and Data Matrix barcode
Str := '^FO25,370^A045,28':CRLF$
Str := "^FDWe do what we promise. That's quality made by Infineon.^FS":CRLF$
Str := '^FO725,320^CI28':CRLF$
Str := '^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)
Str:= '^XZ'
Next
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
stat = Set_Printer('TEXT',Str)
end else
stat = Direct_Print('PRINT', Str)
end
RETURN
* * * * * * *
PrintWOLabels:
* * * * * * *
* Got all data now we can print
RDSCnt = COUNT(RdsIds,@FM) + (RdsIds NE '')
ShelfCnt = INT(RDSCnt/28) + (MOD(RDSCnt,28) NE 0) ;* Come back TO this later JCH 7/27/2005
NewUniqueWOs = ''
NewCustNos = ''
UWOCnt = fieldcount( UniqueWOs, @VM )
FOR I = 1 TO UWOCnt
NewUniqueWOs<1,-1> = UniqueWOs<1,I>:@VM:UniqueWOs<1,I>
NewCustNos<1,-1> = CustNos<1,I>:@VM:CustNos<1,I>
NEXT I
TRANSFER NewUniqueWOs TO UniqueWOs
TRANSFER NewCustNos to CustNos
UWOCnt += UWOCnt
* So we print two sets of labels
FOR I = 1 TO UWOCnt step 2
PrintUniqueWO = UniqueWOs<1,i>
PrintSAPOrder = XLATE('WO_LOG', WO, 'PROD_ORD_NO', 'X') ; * Xlate WO # into SAP Production Order # dkk 6/18/15
CustNo = CustNos<1,i>
GOSUB PrintWOLabel
PrintUniqueWO = UniqueWOs<1,i+1> ; * Prints a 2nd WO label
CustNo = CustNos<1,i+1>
GOSUB PrintWOLabel
NEXT I
RETURN
* * * * * * *
PrintWOLabel:
* * * * * * *
Str = '^XA' ;* start ZPL script
Str:= '^CFD' ;* change default font to D
Str:= '^LH0,0' ;* label home
Str:= '^PR2' ;* PRINT SPEED 2 INCHES PER SECOND
Str:= '^LL325' ;* LABEL LENGTH IN DOTS
Str:= '^MD15' ;* MEDIA DARKNESS
Str:= '^MMT':CRLF$ ;* MEDIA MODE T=TEAR OFF MODE
IF MultiStep > 0 THEN
Str:= '^FO10,30^A0220,210^FD':PrintUniqueWO:'^FS':CRLF$
END ELSE
Str:= '^FO70,30^A0220,210^FD':PrintUniqueWO:'^FS':CRLF$
END
CustName = XLATE( 'COMPANY', CustNo, 'ABBREV_OR_CO_NAME', 'X' )
CharCnt = LEN(CustName)
NameLength = CharCnt*72
WhiteSpace = INT(((2103 - NameLength)/2103) * 806)
StartingXPos = INT(WhiteSpace/2)
Str:= '^FO':StartingXPos:',230^A0,75,72^FD':CustName:'^FS':CRLF$
Str:= '^FO150,320^A080,50^FD':'Commit Date: ':OCONV( XLATE( 'WO_LOG', PrintUniqueWO[1,'.'], wo_log_commit_date$, 'X' ), 'D2/' ):'^FS':CRLF$
Str:= '^XZ'
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
stat = Set_Printer('TEXT',Str)
end else
stat = Direct_Print('PRINT', Str)
end
RETURN
* * * * *
PrintCheatSheetLabel:
* * * * *
//DPC 9/1/2020 - label printed with WO labels (first cassette) gives
//operators ability to see specs on label that doesn't leave FAB
PsnRec = XLATE('PROD_SPEC', PSNIDs, '', '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', PSNIDs:'*LWI', 5, 'X')
PCRecipe = XLATE('PRS_STAGE', PSNIDs, '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
Str = '^XA'
Str := '^LH10,0'
Str := '^PR2' ;* Print speed 2 inches per second
Str := '^LL406' ;* Label length @203 dpi
Str := '^PW900'
Str := '^MD0' ;* Media darkness
Str := '^MMT' ;* Media mode t=tear off mode
****** 1st/2nd Line
Str := '^FO30,20^A0,,40^FDWO ':PrintWO:'^FS'
Str := '^FO590,10^A050,30^FDPSN ':PrintPSNNo:'^FS'
Str := '^FO555,40^A050,30^FDDopant ':PrintDopant:'^FS'
****** 3rd Line - headers
Str := '^FO85,100^A050,23^FDMin^FS'
Str := '^FO145,100^A050,23^FDTarg^FS'
Str := '^FO210,100^A050,23^FDMax^FS'
Str := '^FO280,100^A050,23^FDTool^FS'
Str := '^FO330,100^A050,23^FDType^FS'
Str := '^FO470,100^A050,23^FDRecipe^FS'
Str := '^FO600,100^A050,23^FDPattern^FS'
Str := '^FO740,100^A050,23^FDFreq^FS'
****** 4th Line - Thickness (Thk)
Str := '^FO70,130^GB720,0,3^FS'
Str := '^FO70,130^GB0,160,3^FS'
Str := '^FO10,140^A050,23^FDThk:^FS'
Str := '^FO80,140^A050,23^FD':ThkMin:'^FS'
Str := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
Str := '^FO210,140^A050,23^FD':ThkMax:'^FS'
Str := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
Str := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
Str := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
Str := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
Str := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
****** 5th Line - Resistivity (Res)
Str := '^FO10,170^GB780,0,3^FS'
Str := '^FO10,180^A050,23^FDRes:^FS'
Str := '^FO80,180^A050,23^FD':ResMin:'^FS'
Str := '^FO145,180^A050,23^FD':ResTarg:'^FS'
Str := '^FO210,180^A050,23^FD':ResMax:'^FS'
Str := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
Str := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
Str := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
Str := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
Str := '^FO750,180^A050,23^FD':ResFreq:'^FS'
****** 6th Line - Contact (Con)
Str := '^FX***LINE 4'
Str := '^FO10,210^GB780,0,3^FS'
Str := '^FO10,220^A050,23^FDCon:^FS'
Str := '^FO80,220^A050,23^FD':ConMin:'^FS'
Str := '^FO145,220^A050,23^FD':ConTarg:'^FS'
Str := '^FO210,220^A050,23^FD':ConMax:'^FS'
Str := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
Str := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
Str := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
Str := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
Str := '^FO750,220^A050,23^FD':ConFreq:'^FS'
****** 7th Line - Contact Resistance (CRes)
Str := '^FO10,250^GB780,0,3^FS'
Str := '^FO10,260^A050,23^FDCRes:^FS'
Str := '^FO80,260^A050,23^FD':CResMin:'^FS'
Str := '^FO145,260^A050,23^FD':CResTarg:'^FS'
Str := '^FO210,260^A050,23^FD':CResMax:'^FS'
Str := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
Str := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
Str := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
Str := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
Str := '^FO750,260^A050,23^FD':CResFreq:'^FS'
Str := '^FO10,290^GB780,0,3^FS'
****** 8th Line - Special Instructions
Str := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
Str := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
Str := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
Str := '^FO560,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
Str := '^FO560,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
Str := '^FO560,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
Str:= '^XZ'
****** End ZPL
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
stat = Set_Printer('TEXT',Str)
end else
stat = Direct_Print('PRINT', Str)
end
return