open-insight/LSL2/STPROC/LABELING_SERVICES.txt
Infineon\Mitchem 507c6bffba Commit to save progress.
Feature complete. Ready for UAT.

Minor changes to ZPL Hold header and darkness.

Implement post UAT changes.

fixed small bug in WMO reprint event logic

formatted code and removed commented out code
2025-03-26 14:49:02 -07:00

407 lines
16 KiB
Plaintext

Compile function Labeling_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
Declare Function Database_Services, Environment_Services, Set_Printer, Direct_Print, Printer_Select, Error_Services
Declare Function Logging_Services, Datetime
Declare subroutine Error_Services, Labeling_Services, Lot_Services, SRP_Set_Clipboard
$insert LOGICAL
$Insert LOT_EQUATES
$Insert TEST_WAFER_PROD_EQUATES
$Insert RETURN_TO_FAB_LOTS_EQUATES
$Insert LSL_USERS_EQUATES
$Insert WO_MAT_EQUATES
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\LabelPrinting'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' TestWaferLabelPrinting.csv'
Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Username' : @FM : 'PrinterID' : @FM : 'Message'
objTWLabelPrinting = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
GoToService
Return Response or ""
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options LOAD_LOCK_SIDE = 'Left', 'Right', 'Both'
Options STAGES = 'PRE', 'POST'
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service PrintLabel(ZPLString, PrinterId)
SuccessfulPrint = False$
ErrorMessage = ''
If PrinterId EQ '' then
PrinterId = Printer_Select(PrinterID)
end
If PrinterID NE '' then
stat = Direct_Print('START', PrinterId, '', '')
If Stat GE 0 then
stat = Direct_Print('PRINT', ZPLString)
If Stat GE 0 then
stat = Direct_Print('STOP')
end
end
If Stat LT 0 then
Begin Case
Case Stat EQ -1
ErrorMessage = "A subsequent START message was sent prior to a previous report's STOP message was invoked."
Case Stat EQ -2
ErrorMessage = 'Unable to initialize printer. The printer name may be incorrect or the printer is not avaible'
Case Stat EQ -3 OR Stat EQ -4
ErrorMessage = 'Problems starting the report.'
Case Stat EQ -5 OR Stat EQ -6
ErrorMessage = 'Problems stopping the report.'
Case Stat EQ -7
ErrorMessage = 'Error with printing data - fatal error sending data to the printer.'
Case Stat EQ -8
ErrorMessage = 'Error with printing data - wrong number of bytes sent to the printer.'
Case Stat EQ -9 OR Stat EQ -10
ErrorMessage = 'Error occurred sending the PAGE message'
Case Stat EQ -11
ErrorMessage = 'Problems aborting the report.'
Case Stat EQ -12
ErrorMessage = 'The Direct_Print function was called prior to the START message being invoked.'
End Case
end
end
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
end service
Service ReprintHoldLabel(EntityType, LotID)
WOMatKey = ''
Begin Case
Case EntityType EQ 'RDS'
WOMatKey = Xlate('RDS', LotID, 'WO_MAT_KEY', 'X')
Reactor = Xlate('RDS', LotID, 'REACTOR', 'X')
PSN = Xlate('RDS', LotID, 'PROD_SPEC_ID', 'X')
Case EntityType EQ 'WM_IN'
WOMatKey = Xlate('WM_IN', LotID, 'WO_MAT_KEY', 'X')
Reactor = 'EPP'
PSN = Xlate('WM_IN', LotID, 'PS_NO', 'X')
Case EntityType EQ 'WM_OUT'
WOMatKey = Xlate('WM_OUT', LotID, 'WO_MAT_KEY', 'X')
Reactor = 'EPP'
PSN = Xlate('WM_OUT', LotID, 'PS_NO', 'X')
End Case
WOMatRec = Xlate('WO_MAT', WOMatKey, '', 'X')
Stage = WOMatRec<WO_MAT_HOLD_STAGE$>
Reason = WOMatRec<WO_MAT_HOLD_START_REASON$,1>
HoldBy = WOMatRec<WO_MAT_HOLD_START_USER$,1>
DTM = WOMatRec<WO_MAT_HOLD_START_DTM$,1>
Interrupted = WOMatRec<WO_MAT_HOLD_INTERRUPTED$>
If (Stage NE '') AND (Reason NE '') AND (HoldBy NE '') AND (DTM NE '') then
Labeling_Services('PrintHoldLabel', EntityType, LotID, Stage, Reason, HoldBy, DTM, PSN, Reactor, Interrupted)
end else
Error_Services('Add', 'Error reprinting label.')
end
end service
Service PrintHoldLabel(EntityType, LotID, Stage=STAGES, Reason, HoldBy, DTM, PSN, Reactor, Interrupted, PrinterSelect)
If (EntityType NE '') AND (LotID NE '') AND (Stage NE '') AND (Reason NE '') AND (HoldBy NE '') AND (DTM NE '') then
ZPLString = ''
// Print Params
ZPLString := '^XA'
ZPLString := '^LH0,0'
ZPLString := '^PR1'
ZPLString := '^LL406'
ZPLString := '^PW900'
ZPLString := '^MD22'
ZPLString := '^MMT'
// Hold Header
ZPLString := '^FO350,24,2^FWN^A050,50^FDHold^FS'
// Lot ID
ZPLString := '^FO40,80,2^FWN^A035,35^FDLot ID:^FS'
ZPLString := '^FO140,80,2^FWN^A035,35^FD<LotVal>^FS'
// Reactor
ZPLString := '^FO450,80,2^FWN^A035,35^FDReactor:^FS'
ZPLString := '^FO570,80,2^FWN^A035,35^FD<ReactorVal>^FS'
// PSN
ZPLString := '^FO640,80,2^FWN^A035,35^FDPSN:^FS'
ZPLString := '^FO715,80,2^FWN^A035,35^FD<PSNVal>^FS'
// Pre box and X
ZPLString := '^FO40,125,2^FWN^A035,35^FDPre:^FS'
ZPLString := '^FO120,120^GB35,35,2^FS'
ZPLString := '^FO127,125,2^FWN^A035,35^FD<PreX>^FS'
// Post box and X
ZPLString := '^FO170,125,2^FWN^A035,35^FDPost:^FS'
ZPLString := '^FO252,120^GB35,35,2^FS'
ZPLString := '^FO259,125,2^FWN^A035,35^FD<PostX>^FS'
// Process interrupted box and X
ZPLString := '^FO465,125,2^FWN^A035,35^FDProcess Interrupted:^FS'
ZPLString := '^FO760,120^GB35,35,2^FS'
ZPLString := '^FO767,125,2^FWN^A035,35^FD<InterruptX>^FS'
// Reason
ZPLString := '^FO40,175,2^FWN^A035,35^FDReason:^FS'
ZPLString := '^FO160,175,2^FWN^A035,35^FD<ReasonVal1>^FS'
ZPLString := '^FO40,220,2^FWN^A035,35^FD<ReasonVal2>^FS'
ZPLString := '^FO40,265,2^FWN^A035,35^FD<ReasonVal3>^FS'
// Hold By
ZPLString := '^FO40,310,2^FWN^A035,35^FDOn Hold By:^FS'
ZPLString := '^FO210,310,2^FWN^A035,35^FD<HoldByVal>^FS'
// Date/Time
ZPLString := '^FO40,355,2^FWN^A035,35^FDDate/Time:^FS'
ZPLString := '^FO195,355,2^FWN^A035,35^FD<DTMVal>^FS'
// End
ZPLString := '^XZ'
Begin Case
Case EntityType EQ 'WM_IN'
EntityType = 'WMI'
Case EntityType EQ 'WM_OUT'
EntityType = 'WMO'
Case Otherwise$
End Case
EntityString = EntityType :'-': LotID
UserRec = Database_Services('ReadDataRow', 'LSL_USERS', HoldBy)
FullName = UserRec<LSL_USERS_FIRST$> : ' ' : UserRec<LSL_USERS_LAST$>
DTM = Oconv(DTM, 'DT2/^H')
If Len(Reason) GE 45 then
// Breaks the reason up to fit the lines
Dummy = Reason[45, 'B':' ']
ReasonLine1 = Reason[1, Col1()]
Reason = Reason[Col1() + 1, 999]
Dummy = Reason[55, 'B':' ']
ReasonLine2 = Reason[1, Col1()]
Reason = Reason[Col1() + 1, 999]
Dummy = Reason[55, 'B':' ']
ReasonLine3 = Reason[1, Col1()]
end else
ReasonLine1 = Reason
ReasonLine2 = ''
ReasonLine3 = ''
end
Swap '<LotVal>' With EntityString in ZPLString
Swap '<PSNVal>' With PSN in ZPLString
Swap '<ReactorVal>' With Reactor in ZPLString
If Stage EQ 'PRE' then
Swap '<PreX>' With 'X' in ZPLString
Swap '<PostX>' With '' in ZPLString
end else
Swap '<PreX>' With '' in ZPLString
Swap '<PostX>' With 'X' in ZPLString
end
If Interrupted EQ True$ then
Swap '<InterruptX>'with 'X' in ZPLString
end else
Swap '<InterruptX>'with '' in ZPLString
end
Swap '<ReasonVal1>' With ReasonLine1 in ZPLString
Swap '<ReasonVal2>' With ReasonLine2 in ZPLString
Swap '<ReasonVal3>' With ReasonLine3 in ZPLString
Swap '<HoldByVal>' With FullName in ZPLString
Swap '<DTMVal>' With DTM in ZPLString
If PrinterSelect NE '' then
Labeling_Services('PrintLabel', ZPLString, PrinterSelect)
end else
Labeling_Services('PrintLabel', ZPLString, Printer)
end
end else
Error_Services('Add', 'Missing parameter. EntityType, LotID, Stage, Reason, HoldBy, DTM, PSN, Reactor, and Interrupted are required fields.')
end
end service
Service PrintTestWaferLotLabel(LotId, Username, PrinterId)
ErrorMessage = ''
If Username EQ '' then
Username = @User4
If Username EQ '' then Username = @USERNAME
end
If RowExists('LOT', LotId) then
ZPLStringLabel = ''
LotRec = Database_Services('ReadDataRow', 'LOT', LotId)
PartNoId = LotRec<LOT_PROD_ID$>
PartNo = Xlate('TEST_WAFER_PROD', PartNoId, TEST_WAFER_PROD_PART_NAME$, 'X')
VendorPartNo = LotRec<LOT_VENDOR_PART_NO$>
VendorLotNo = LotRec<LOT_VENDOR_LOT_NO$>
VendorCode = LotRec<LOT_VENDOR_CODE$>
LotQty = LotRec<LOT_WAFER_QTY$>
For LabelCnt = 1 to 2
ZPLStringLabel := '^XA'
ZPLStringLabel := '^LH0,0'
ZPLStringLabel := '^PR1'
ZPLStringLabel := '^LL406'
ZPLStringLabel := '^PW900'
ZPLStringLabel := '^MD22'
ZPLStringLabel := '^MMT'
ZPLStringLabel := '^FO25,25^A045,70,40^FD(1T)Lot Number: ^FS^FX(Lot Number Title)^FS'
ZPLStringLabel := '^FO320,25^A045,70,40^FD':LotId:'^FS^FX(Lot Number Text)^FS'
ZPLStringLabel := '^FO25,200^A070,40^FD':PartNo:'^FS^FX(Part Number Text)^FS'
ZPLStringLabel := '^FO60,300^BY7^B3,,50,N^FD1T':LotId:'^FS^FX(Lot Number 1D Barcode)^FS'
ZPLStringLabel := "^FO25,370^A045,28^FDWe do what we promise. That's quality made by Infineon.^FS^FX(Infineon Quality Statement)^FS"
ZPLStringLabel := '^FO500,105^CI28'
ZPLStringLabel := '^BXN,5,200^FDP':PartNo:'|S':VendorPartNo:'|1T':LotId:'|2T':VendorLotNo:'|(PSN)|Q':LotQty:'|1V':VendorCode:'|SEQ':LabelCnt:'^FS^FX(2DBarcode)^FS'
ZPLStringLabel := '^XZ'
Next LabelCnt
If ZPLStringLabel NE '' then
Labeling_Services('PrintLabel', ZPLStringLabel, PrinterId)
If Error_Services('NoError') then
//Log Event for lot.
end else
//Log Error for lot
ErrorMessage = Error_Services('GetMessage')
end
end
end else
ErrorMessage = 'Error printing label for lot ' : LotId : '. LotId was null or did not exist in database.'
end
If ErrorMessage EQ '' then
Lot_Services('CreateLotEvent', LotId, 'TW', Datetime(), 'COMMENT', 'Lot Labels Printed', '', 0, 0, '', Username)
end else
Error_Services('Add', ErrorMessage)
end
End Service
Service GetTestWaferLotZPL(LotId, Username)
ZPLStringLabel = ''
LotRec = Database_Services('ReadDataRow', 'LOT', LotId)
PartNoId = LotRec<LOT_PROD_ID$>
PartNo = Xlate('TEST_WAFER_PROD', PartNoId, TEST_WAFER_PROD_PART_NAME$, 'X')
VendorPartNo = LotRec<LOT_VENDOR_PART_NO$>
VendorLotNo = LotRec<LOT_VENDOR_LOT_NO$>
VendorCode = LotRec<LOT_VENDOR_CODE$>
LotQty = LotRec<LOT_WAFER_QTY$>
For LabelCnt = 1 to 2
ZPLStringLabel := '^XA'
ZPLStringLabel := '^LH0,0'
ZPLStringLabel := '^PR1'
ZPLStringLabel := '^LL406'
ZPLStringLabel := '^PW900'
ZPLStringLabel := '^MD22'
ZPLStringLabel := '^MMT'
ZPLStringLabel := '^FO25,25^A045,70,40^FD(1T)Lot Number: ^FS^FX(Lot Number Title)^FS'
ZPLStringLabel := '^FO320,25^A045,70,40^FD':LotId:'^FS^FX(Lot Number Text)^FS'
ZPLStringLabel := '^FO25,175^A070,75^FD':PartNo:'^FS^FX(Part Number Text)^FS'
ZPLStringLabel := '^FO60,300^BY2^B3,,50,N^FD1T':LotId:'^FS^FX(Lot Number 1D Barcode)^FS'
ZPLStringLabel := "^FO25,370^A045,28^FDWe do what we promise. That's quality made by Infineon.^FS^FX(Infineon Quality Statement)^FS"
ZPLStringLabel := '^FO500,105^CI28'
ZPLStringLabel := '^XZ'
Next LabelCnt
Response = ZPLStringLabel
end service
Service GetAllZebraPrinters()
Server = Environment_Services('GetServer')
ZebraPrinterList = ''
ZebraPrinterList<1> = 'MESZBRPRT002' : @VM : '10.95.30.247' : @VM : 9100
ZebraPrinterList<2> = 'MESZBRPRT003' : @VM : '10.95.1.27' : @VM : 9100
ZebraPrinterList<3> = 'MESZBRPRT004' : @VM : '10.95.15.252' : @VM : 9100
ZebraPrinterList<4> = 'MESZBRPRT005' : @VM : '10.95.30.42' : @VM : 9100
ZebraPrinterList<5> = 'MESZBRPRT006' : @VM : '10.95.25.25' : @VM : 9100
ZebraPrinterList<6> = 'MESZBRPRT007' : @VM : '10.95.1.13' : @VM : 9100
ZebraPrinterList<7> = 'MESZBRPRT008' : @VM : '10.95.164.24' : @VM : 9100
ZebraPrinterList<8> = 'MESZBRPRT0011' : @VM : '10.95.15.33' : @VM : 6101
ZebraPrinterList<9> = 'FI_ZEBRA_PRINTER' : @VM : '10.95.164.55' : @VM : 9100
If Server EQ 'MESTSA01EC' OR Server EQ 'MESSA01EC' or Server EQ 'MESTSA09EC' |
or Server EQ 'MESTSA010EC' or Server EQ 'MESTSA011EC' or Server EQ 'MESTSA012EC' then
ZebraPrinterList<10> = 'JONATHAN_HOME_TEST' : @VM : '192.168.0.123' : @VM : 9100
end
Response = ZebraPrinterList
end service
Service PrintReactorLabel(ReactNo, LoadLockSide=LOAD_LOCK_SIDE)
If ( (ReactNo NE '') and (LoadLockSide NE '') ) then
BaseZpl = '^XA^LH10,10^FO35,5^BY2^B3N,,80,N^FD10SR{ReactNo}.{LoadLockSidePrefix}^FS^FO10,105^A045,90^FB400,1,,C^FDR{ReactNo} {LoadLockSide}^FS^XZ'
Convert 'R' to '' in ReactNo
If LoadLockSide _EQC 'Both' then
LoadLockSidePrefix = 'L'
ZplLeft = BaseZpl
Swap '{ReactNo}' with ReactNo in ZplLeft
Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in ZplLeft
Swap '{LoadLockSide}' with 'Left' in ZplLeft
ZplRight = BaseZpl
LoadLockSidePrefix = 'R'
Swap '{ReactNo}' with ReactNo in ZplRight
Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in ZplRight
Swap '{LoadLockSide}' with 'Right' in ZplRight
Zpl = ZplLeft:ZplRight
end else
LoadLockSidePrefix = LoadLockSide[1, 1]
Zpl = BaseZpl
Swap '{ReactNo}' with ReactNo in Zpl
Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in Zpl
Swap '{LoadLockSide}' with LoadLockSide in Zpl
end
Labeling_Services('PrintLabel', Zpl, '\\messp1003.infineon.com\MESZBRPRT008')
end else
Error_Services('Add', 'Error in ':Service:' service. Null ReactNo or LoadLockSide passed in.')
end
end service
Service GetReturnToFabLabelZPL(RTFId)
ZPLStringLabel = ''
LotRec = Database_Services('ReadDataRow', 'RETURN_TO_FAB_LOTS', RTFId)
CassId = LotRec<RETURN_TO_FAB_LOTS_CASS_ID$>
CassType = LotRec<RETURN_TO_FAB_LOTS_LOT_TYPE$>
ReturnToFabReason = LotRec<RETURN_TO_FAB_LOTS_REASON$>
CassIdText = CassId
BarcodeText = ""
Begin Case
Case CassType EQ 'RDS'
BarcodeText = '1T' : CassId
Case CassType EQ 'WM_OUT'
swap '*' with '.' in CassId
CassIdText = CassId
BarcodeText = 'O' : CassId
End Case
ZPLStringLabel := '^XA'
ZPLStringLabel := '^LH0,0'
ZPLStringLabel := '^PR1'
ZPLStringLabel := '^LL406'
ZPLStringLabel := '^PW900'
ZPLStringLabel := '^MD22'
ZPLStringLabel := '^MMT'
ZPLStringLabel := '^FO25,25^A070,75^FDReturn To Fab^FS^FX(Title)^FS'
ZPLStringLabel := '^FO25,100^A045,70,40^FD(1T)Lot Number:':CassIdText:' ^FS^FX(Lot Number Title)^FS'
ZPLStringLabel := '^FB780,5,0,L^FO25,180^A045,30,30^FD':ReturnToFabReason:'^FS'
ZPLStringLabel := '^FO60,325^BY2^B3,,50,N^FD':BarcodeText:'^FS^FX(Lot Number 1D Barcode)^FS'
ZPLStringLabel := '^FO500,105^CI28'
ZPLStringLabel := '^XZ'
Response = ZPLStringLabel
end service