updated schedule related services to account for voided cassettes
This commit is contained in:
@ -1221,7 +1221,6 @@ Event PUB_REM_CASS.CLICK()
|
|||||||
WmInKeys = ''
|
WmInKeys = ''
|
||||||
for each CassetteToVoid in CassettesToVoid using @FM
|
for each CassetteToVoid in CassettesToVoid using @FM
|
||||||
WmInKeys<1, -1> = CassetteToVoid<1,4>
|
WmInKeys<1, -1> = CassetteToVoid<1,4>
|
||||||
//Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
|
|
||||||
Next CassetteToVoid
|
Next CassetteToVoid
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
@ -1240,7 +1239,6 @@ Event PUB_REM_CASS.CLICK()
|
|||||||
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
|
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
|
||||||
WOMatKey = WONo : '*' : CassNo
|
WOMatKey = WONo : '*' : CassNo
|
||||||
WoMatKeyList<1, -1> = WoMatKey
|
WoMatKeyList<1, -1> = WoMatKey
|
||||||
//Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
|
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrorMessage = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
@ -1332,7 +1330,7 @@ Event PUB_REM_WM_OUT.CLICK()
|
|||||||
WmOutKeys<1, -1> = CassetteToVoid<1,3>
|
WmOutKeys<1, -1> = CassetteToVoid<1,3>
|
||||||
Until ErrorMessage NE ''
|
Until ErrorMessage NE ''
|
||||||
Next CassetteToVoid
|
Next CassetteToVoid
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmOutKeys:SD$:WoNo:SD$:@USER4)
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrorMessage = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
|
@ -30,22 +30,23 @@ Function Schedule_Services(@Service, @Params)
|
|||||||
|
|
||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
$insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
$insert SERVICE_SETUP
|
$Insert SERVICE_SETUP
|
||||||
$insert RLIST_EQUATES
|
$Insert RLIST_EQUATES
|
||||||
$insert REACTOR_EQUATES
|
$Insert REACTOR_EQUATES
|
||||||
$insert SCHED_DET_NG_EQUATES
|
$Insert SCHED_DET_NG_EQUATES
|
||||||
$insert WO_LOG_EQUATES
|
$Insert WO_LOG_EQUATES
|
||||||
$Insert WO_MAT_EQUATES
|
$Insert WO_MAT_EQUATES
|
||||||
$insert WO_SCHEDULE_NG_EQUATES
|
$Insert WO_SCHEDULE_NG_EQUATES
|
||||||
$insert COMPANY_EQUATES
|
$Insert COMPANY_EQUATES
|
||||||
$insert PROD_VER_EQUATES
|
$Insert PROD_VER_EQUATES
|
||||||
$insert PRS_LAYER_EQU
|
$Insert PRS_LAYER_EQU
|
||||||
$insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
$Insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
||||||
$insert EPI_PART_EQUATES
|
$Insert EPI_PART_EQUATES
|
||||||
$insert PROD_SPEC_EQUATES
|
$Insert PROD_SPEC_EQUATES
|
||||||
$insert SCHED_HIST_EQUATES
|
$Insert SCHED_HIST_EQUATES
|
||||||
$Insert RDS_EQUATES
|
$Insert RDS_EQUATES
|
||||||
|
$Insert WM_IN_EQUATES
|
||||||
|
|
||||||
Equ new_exist$ To 0 ; * Reduce Mode 0
|
Equ new_exist$ To 0 ; * Reduce Mode 0
|
||||||
Equ next_cur$ To 1
|
Equ next_cur$ To 1
|
||||||
@ -59,7 +60,7 @@ Declare subroutine Mona_Services
|
|||||||
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
|
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
|
||||||
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
|
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
|
||||||
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
|
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
|
||||||
Declare function SRP_Time, Lsl_Users_Services, GetTickCount
|
Declare function SRP_Time, Lsl_Users_Services, GetTickCount, obj_WO_Mat
|
||||||
|
|
||||||
Date = Oconv(Date(), 'D4/')
|
Date = Oconv(Date(), 'D4/')
|
||||||
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
|
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
|
||||||
@ -1245,14 +1246,59 @@ Service AdjustScheduleEvents(ReactNo)
|
|||||||
LogData<3> = 'Event quantity: ':EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
LogData<3> = 'Event quantity: ':EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
|
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
|
||||||
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
|
LogData<3> = 'Event unprocessed cassettes: ':EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
|
LogData<3> = 'Event processed cassettes: ':EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
|
|
||||||
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
|
||||||
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||||
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||||
EventComp = (UnprocessedCass EQ '')
|
|
||||||
|
// Check each cassette to see if it was voided
|
||||||
|
VoidedQty = 0
|
||||||
|
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
||||||
|
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||||
|
VoidedCassList = ''
|
||||||
|
VoidedWfrQty = 0
|
||||||
|
For each CassNo in AllCassList using @VM
|
||||||
|
If Epipro then
|
||||||
|
WmInKey = WoNo:'*1*':CassNo
|
||||||
|
Voided = Xlate('WM_IN', WmInKey, 'VOID', 'X')
|
||||||
|
CassQty = Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||||
|
end else
|
||||||
|
WOMatKey = WoNo:'*':CassNo
|
||||||
|
Voided = Xlate('WO_MAT', WOMatKey, 'VOID', 'X')
|
||||||
|
CassQty = Xlate('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
|
||||||
|
end
|
||||||
|
If Voided then
|
||||||
|
VoidedCassList<0, -1> = CassNo
|
||||||
|
VoidedWfrQty += CassQty
|
||||||
|
end
|
||||||
|
Next CassNo
|
||||||
|
UnprocessedCass = SRP_Array('Join', UnprocessedCass, VoidedCassList, 'NOT', @VM)
|
||||||
|
ProcessedCass = SRP_Array('Join', ProcessedCass, VoidedCassList, 'NOT', @VM)
|
||||||
|
AllCassList = SRP_Array('Join', AllCassList, VoidedCassList, 'NOT', @VM)
|
||||||
|
EventWfrs -= VoidedWfrQty
|
||||||
|
EventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCass
|
||||||
|
EventRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCass
|
||||||
|
EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = EventWfrs
|
||||||
|
Database_Services('WriteDataRow', 'SCHED_DET_NG', EventKey, EventRec, True$, False$, True$)
|
||||||
|
|
||||||
|
// Check each unprocessed cassette to ensure it does not need to be moved to the processed column
|
||||||
|
For each CassNo in UnprocessedCass using @VM
|
||||||
|
Schedule_Services('MarkCassProcessed', WONo, CassNo, Datetime())
|
||||||
|
Next CassNo
|
||||||
|
|
||||||
|
EventRec = Schedule_Services('GetScheduleDetail', EventKey)
|
||||||
|
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
|
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
|
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||||
|
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||||
|
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
||||||
|
EventComp = (UnprocessedCass EQ '')
|
||||||
|
|
||||||
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
|
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
|
||||||
LogData = ''
|
LogData = ''
|
||||||
@ -1263,9 +1309,7 @@ Service AdjustScheduleEvents(ReactNo)
|
|||||||
end
|
end
|
||||||
|
|
||||||
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||||
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
|
||||||
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
|
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
|
||||||
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
|
||||||
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
|
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
|
||||||
// If work order event is engaged then set start DTM to first cassette DTM in.
|
// If work order event is engaged then set start DTM to first cassette DTM in.
|
||||||
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
|
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
|
||||||
@ -2256,8 +2300,9 @@ end service
|
|||||||
// Saves the event to the database.
|
// Saves the event to the database.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
|
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
|
||||||
|
|
||||||
// Create a unique key ID for the new event
|
// Create a unique key ID for the new event
|
||||||
|
ErrorMsg = ''
|
||||||
NewEventKeyID = RTI_CreateGUID()
|
NewEventKeyID = RTI_CreateGUID()
|
||||||
NewEventRec = ''
|
NewEventRec = ''
|
||||||
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
|
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
|
||||||
@ -2267,16 +2312,17 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
NewEventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = WaferQty
|
NewEventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = WaferQty
|
||||||
EpiPro = (Xlate('WO_LOG', WorkOrderNo, 'REACT_TYPE', 'X') EQ 'EPP')
|
EpiPro = (Xlate('WO_LOG', WorkOrderNo, 'REACT_TYPE', 'X') EQ 'EPP')
|
||||||
CurrDTM = Datetime()
|
CurrDTM = Datetime()
|
||||||
EventProcCassList = ''
|
EventProcCassList = ''
|
||||||
EventUnprocCassList = ''
|
EventUnprocCassList = ''
|
||||||
LastLoadedRDS = ''
|
LastLoadedRDS = ''
|
||||||
LastUnloadedRDS = ''
|
LastUnloadedRDS = ''
|
||||||
// Determine start cassette and slot number
|
// Determine start cassette and slot number
|
||||||
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
||||||
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + 1) / 25))
|
VoidedQty = Work_Order_Services('GetVoidedWaferCount', WorkOrderNo)
|
||||||
If StartCass EQ 0 then StartCass = 1
|
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + VoidedQty + 1) / 25))
|
||||||
|
If StartCass EQ 0 then StartCass = 1
|
||||||
StartSlot = Mod(PrevSchedQty, 25) + 1
|
StartSlot = Mod(PrevSchedQty, 25) + 1
|
||||||
TotalSchedQty = PrevSchedQty + WaferQty
|
TotalSchedQty = PrevSchedQty + WaferQty + VoidedQty
|
||||||
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
|
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
|
||||||
StopSlot = Mod(TotalSchedQty, 25)
|
StopSlot = Mod(TotalSchedQty, 25)
|
||||||
If StopSlot EQ 0 then StopSlot = 25
|
If StopSlot EQ 0 then StopSlot = 25
|
||||||
@ -2284,128 +2330,179 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
RDSKeys = ''
|
RDSKeys = ''
|
||||||
If EpiPro then
|
If EpiPro then
|
||||||
For CassNo = StartCass to StopCass
|
For CassNo = StartCass to StopCass
|
||||||
WMIKey = WorkOrderNo:'*1*':CassNo
|
WMIKey = WorkOrderNo:'*1*':CassNo
|
||||||
WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X')
|
WMIRec = Database_Services('ReadDataRow', 'WM_IN', WMIKey)
|
||||||
If WMIRdsList NE '' then
|
If Error_Services('NoError') then
|
||||||
Begin Case
|
Voided = WMIRec<WM_IN_VOID$>
|
||||||
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
If Not(Voided) then
|
||||||
StartIndex = StartSlot
|
WMIRdsList = WMIRec<WM_IN_RDS_NO$>
|
||||||
StopIndex = StopSlot
|
If WMIRdsList NE '' then
|
||||||
Case CassNo EQ StartCass
|
Begin Case
|
||||||
StartIndex = StartSlot
|
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
||||||
StopIndex = 25
|
StartIndex = StartSlot
|
||||||
Case CassNo EQ StopCass
|
StopIndex = StopSlot
|
||||||
StartIndex = 1
|
Case CassNo EQ StartCass
|
||||||
StopIndex = StopSlot
|
StartIndex = StartSlot
|
||||||
Case Otherwise$
|
StopIndex = 25
|
||||||
StartIndex = 1
|
Case CassNo EQ StopCass
|
||||||
StopIndex = 25
|
StartIndex = 1
|
||||||
End Case
|
StopIndex = StopSlot
|
||||||
For SlotIndex = StartIndex to StopIndex
|
Case Otherwise$
|
||||||
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
|
StartIndex = 1
|
||||||
Next SlotIndex
|
StopIndex = 25
|
||||||
|
End Case
|
||||||
|
For SlotIndex = StartIndex to StopIndex
|
||||||
|
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
|
||||||
|
Next SlotIndex
|
||||||
|
end else
|
||||||
|
// No RDS keys exist for this cassette yet, so it's unprocessed
|
||||||
|
EventUnprocCassList<0, -1> = CassNo
|
||||||
|
end
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
// No RDS keys exist for this cassette yet, so it's unprocessed
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
EventUnprocCassList<0, -1> = CassNo
|
|
||||||
end
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
Next CassNo
|
Next CassNo
|
||||||
|
|
||||||
If RDSKeys NE '' then
|
If (ErrorMsg EQ '') then
|
||||||
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
If RDSKeys NE '' then
|
||||||
For each RDSKey in RDSKeys using @VM setting vPos
|
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
||||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
For each RDSKey in RDSKeys using @VM setting vPos
|
||||||
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||||
For each WMIKey in WMIKeys using @VM
|
If Error_Services('NoError') then
|
||||||
CassNo = Field(WMIKey, '*', 3)
|
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||||
If DtmOut NE '' then
|
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||||
LastUnloadedRDS = RDSKey
|
TimeOut = TimeOut/86400
|
||||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||||
EventProcCassList<0, -1> = CassNo
|
TimeOut = TimeOut[2, 6]
|
||||||
end
|
DtmOut = DateOut:TimeOut
|
||||||
end else
|
end else
|
||||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
EventUnprocCassList<0, -1> = CassNo
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
Next WMIKey
|
If (ErrorMsg EQ '' ) then
|
||||||
Next RDSKey
|
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
||||||
|
For each WMIKey in WMIKeys using @VM
|
||||||
|
CassNo = Field(WMIKey, '*', 3)
|
||||||
|
If DtmOut NE '' then
|
||||||
|
LastUnloadedRDS = RDSKey
|
||||||
|
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||||
|
EventProcCassList<0, -1> = CassNo
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||||
|
EventUnprocCassList<0, -1> = CassNo
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Next WMIKey
|
||||||
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
|
Next RDSKey
|
||||||
|
end
|
||||||
|
|
||||||
|
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
||||||
|
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
||||||
|
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
||||||
end
|
end
|
||||||
|
|
||||||
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
|
||||||
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
|
||||||
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
|
||||||
|
|
||||||
end else
|
end else
|
||||||
|
|
||||||
For CassNo = StartCass to StopCass
|
For CassNo = StartCass to StopCass
|
||||||
WOMatKey = WorkOrderNo:'*':CassNo
|
WOMatKey = WorkOrderNo:'*':CassNo
|
||||||
RDSKey = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
If Error_Services('NoError') then
|
||||||
If DtmOut NE '' then
|
Voided = WOMatRec<WO_MAT_VOID$>
|
||||||
LastUnloadedRDS = RDSKey
|
If Not(Voided) then
|
||||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
RDSKey = WOMatRec<WO_MAT_RDS_NO$>
|
||||||
EventProcCassList<0, -1> = CassNo
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||||
|
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||||
|
TimeOut = TimeOut/86400
|
||||||
|
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||||
|
TimeOut = TimeOut[2, 6]
|
||||||
|
DtmOut = DateOut:TimeOut
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
EventUnprocCassList<0, -1> = CassNo
|
end
|
||||||
|
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
|
If DtmOut NE '' then
|
||||||
|
LastUnloadedRDS = RDSKey
|
||||||
|
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||||
|
EventProcCassList<0, -1> = CassNo
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||||
|
EventUnprocCassList<0, -1> = CassNo
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
Next CassNo
|
Next CassNo
|
||||||
end
|
end
|
||||||
|
|
||||||
EventComp = (EventUnprocCassList EQ '')
|
If (ErrorMsg EQ '') then
|
||||||
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
|
||||||
|
|
||||||
// Update event
|
EventComp = (EventUnprocCassList EQ '')
|
||||||
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
||||||
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
|
|
||||||
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
|
|
||||||
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
|
|
||||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
|
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
|
||||||
// Determine where to insert the event in the REACTOR record linked list
|
|
||||||
// Add the event to the REACTOR record event list
|
|
||||||
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
|
|
||||||
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
|
|
||||||
CurrNumEvents = DCount(ReactSchedEvents, @VM)
|
|
||||||
// Add our new event key ID to the reactor event list
|
|
||||||
NewNumEvents = CurrNumEvents + 1
|
|
||||||
InsertPos = ''
|
|
||||||
For EventIndex = 1 to CurrNumEvents Step 1
|
|
||||||
ThisEventKey = ReactSchedEvents<0, EventIndex>
|
|
||||||
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
|
|
||||||
IF ThisStartDTM GT StartDTM then
|
|
||||||
// We found our location
|
|
||||||
InsertPos = EventIndex
|
|
||||||
end
|
|
||||||
Until InsertPos NE ''
|
|
||||||
Next EventIndex
|
|
||||||
If InsertPos EQ '' then InsertPos = NewNumEvents
|
|
||||||
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
|
|
||||||
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
|
|
||||||
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
|
|
||||||
|
|
||||||
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
|
// Update event
|
||||||
// start DTM.
|
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||||
If NewNumEvents GT 1 then
|
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
|
||||||
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
|
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
|
||||||
If PrevEventKey NE '' then
|
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
|
||||||
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
|
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
|
||||||
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
|
|
||||||
If PrevEventStopDTM GT StartDTM then
|
If Error_Services('NoError') then
|
||||||
PrevEventStopDTM = StartDTM
|
// Determine where to insert the event in the REACTOR record linked list
|
||||||
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
|
// Add the event to the REACTOR record event list
|
||||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
|
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
|
||||||
|
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
|
||||||
|
CurrNumEvents = DCount(ReactSchedEvents, @VM)
|
||||||
|
// Add our new event key ID to the reactor event list
|
||||||
|
NewNumEvents = CurrNumEvents + 1
|
||||||
|
InsertPos = ''
|
||||||
|
For EventIndex = 1 to CurrNumEvents Step 1
|
||||||
|
ThisEventKey = ReactSchedEvents<0, EventIndex>
|
||||||
|
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
|
||||||
|
IF ThisStartDTM GT StartDTM then
|
||||||
|
// We found our location
|
||||||
|
InsertPos = EventIndex
|
||||||
|
end
|
||||||
|
Until InsertPos NE ''
|
||||||
|
Next EventIndex
|
||||||
|
If InsertPos EQ '' then InsertPos = NewNumEvents
|
||||||
|
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
|
||||||
|
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
|
||||||
|
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
|
||||||
|
|
||||||
|
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
|
||||||
|
// start DTM.
|
||||||
|
If NewNumEvents GT 1 then
|
||||||
|
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
|
||||||
|
If PrevEventKey NE '' then
|
||||||
|
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
|
||||||
|
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
|
||||||
|
If PrevEventStopDTM GT StartDTM then
|
||||||
|
PrevEventStopDTM = StartDTM
|
||||||
|
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
|
||||||
|
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
// Record schedule change in SCHED_HIST table
|
||||||
|
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
||||||
|
Response = NewEventKeyID
|
||||||
end
|
end
|
||||||
// Record schedule change in SCHED_HIST table
|
|
||||||
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
|
||||||
Response = NewEventKeyID
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -3152,7 +3249,7 @@ end service
|
|||||||
|
|
||||||
|
|
||||||
Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
||||||
|
|
||||||
If ((WONo NE '') and (CassNo NE '') and (ProcessedDTM NE '') ) then
|
If ((WONo NE '') and (CassNo NE '') and (ProcessedDTM NE '') ) then
|
||||||
If Num(ProcessedDTM) then ProcessedDTM = OConv(ProcessedDTM, 'DT2/^H')
|
If Num(ProcessedDTM) then ProcessedDTM = OConv(ProcessedDTM, 'DT2/^H')
|
||||||
// Find the SCHED_DET_NG event record that contains the cassette number
|
// Find the SCHED_DET_NG event record that contains the cassette number
|
||||||
@ -3200,19 +3297,33 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
|||||||
CassComp = True$
|
CassComp = True$
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
CassComp = True$
|
WOMatKey = WoNo:'*':CassNo
|
||||||
|
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKey)
|
||||||
|
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
||||||
|
DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X')
|
||||||
|
CassComp = ( (CurrWaferCount EQ 0) or (DateOut NE '') )
|
||||||
end
|
end
|
||||||
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
|
||||||
If CassComp then
|
If CassComp then
|
||||||
|
RecChanged = False$
|
||||||
|
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
|
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
|
||||||
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
||||||
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
RecChanged = True$
|
||||||
ProcessedCassettes<0, -1> = CassNo
|
end
|
||||||
|
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
|
Locate CassNo in ProcessedCassettes using @VM setting vPos else
|
||||||
|
ProcessedCassettes<0, -1> = CassNo
|
||||||
|
ProcessedCassettes = SRP_Array('Clean', ProcessedCassettes, 'TrimAndMakeUnique', @VM)
|
||||||
|
ProcessedCassettes = SRP_Array('SortSimpleList', ProcessedCassettes, 'AscendingNumbers', @VM)
|
||||||
|
RecChanged = True$
|
||||||
|
end
|
||||||
|
If RecChanged then
|
||||||
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
|
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
|
||||||
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
|
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
|
||||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
|
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
|
||||||
Done = True$
|
|
||||||
end
|
end
|
||||||
|
Done = True$
|
||||||
end
|
end
|
||||||
Until Done EQ True$
|
Until Done EQ True$
|
||||||
Repeat
|
Repeat
|
||||||
|
@ -2579,6 +2579,56 @@ Service GetWoLogZpl(WoNo)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetVoidedWaferCount(WorkOrderNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
VoidedWaferCount = 0
|
||||||
|
If WorkOrderNo NE '' then
|
||||||
|
If RowExists('WO_LOG', WorkOrderNo) then
|
||||||
|
ReactorType = Xlate('WO_LOG', WorkOrderNo, 'PS_REACTOR_TYPE', 'X')
|
||||||
|
If ReactorType EQ 'EPP' then
|
||||||
|
Query = 'SELECT WM_IN WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||||
|
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||||
|
ErrCode = ''
|
||||||
|
If Not(Get_Status(ErrCode)) then
|
||||||
|
EOF = False$
|
||||||
|
Loop
|
||||||
|
Readnext WmInKey else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
VoidedWaferCount += Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||||
|
Repeat
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Query = 'SELECT WO_MAT WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||||
|
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||||
|
ErrCode = ''
|
||||||
|
If Not(Get_Status(ErrCode)) then
|
||||||
|
EOF = False$
|
||||||
|
Loop
|
||||||
|
Readnext WoMatKey else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
VoidedWaferCount += Xlate('WO_MAT', WoMatKey, 'WAFER_QTY', 'X')
|
||||||
|
Repeat
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. WO_LOG ':WorkOrderNo:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. Null WorkOrderNo passed into service.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = VoidedWaferCount
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
Reference in New Issue
Block a user