barcode. Implemented 2D barcode verification in PTI and FQA Label Check Operations. Bug fixes Changed WMI 2D barcode to have 8 fields to keep code base simpler minor changes to error message verbiage Refactored code to use post log. Refactored code to not use multiple returns. Modfield input form fields to force upper case only. changed LSL password verification to be case insensitive to avoid barcode scanning issues when caps lock is on temporary change to allow 1D WMI scans at PTI while we exhaust current supply
		
			
				
	
	
		
			1086 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1086 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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
 | |
| $INSERT UNIT_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
 | |
| 
 | |
| Main:
 | |
| 
 | |
| 	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 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 GE 0 THEN 
 | |
| 		
 | |
| 			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
 | |
| 		end
 | |
| 		
 | |
| 		GoSub EndPrint
 | |
| 		
 | |
| 	end
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * *
 | |
| EndPrint:
 | |
| * * * * * *
 | |
| 
 | |
| 	If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
 | |
| 		stat = Set_Printer("TERM")
 | |
| 	end else
 | |
| 		stat = Direct_Print('STOP')
 | |
| 	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 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
 | |
| 			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 := '^MD5'		;* 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
 | |
| 
 |