|
|
|
@ -1287,10 +1287,8 @@ Service AdjustScheduleEvents(ReactNo)
|
|
|
|
|
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
|
|
|
|
|
// Check each cassette in the event to see if it is now processed or unprocessed (i.e., unload un-signed)
|
|
|
|
|
Schedule_Services('UpdateEventCassLists', EventKey)
|
|
|
|
|
|
|
|
|
|
EventRec = Schedule_Services('GetScheduleDetail', EventKey)
|
|
|
|
|
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
|
|
|
@ -3261,24 +3259,51 @@ Service GetAvailableWorkOrders(ReactorType, SusceptorSize, ReactorNo)
|
|
|
|
|
end service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
|
|
|
|
Service UpdateCassProcStatus(WONo, CassNo, ProcessedDTM)
|
|
|
|
|
|
|
|
|
|
ErrorMsg = ''
|
|
|
|
|
If ((WONo NE '') and (CassNo NE '') and (ProcessedDTM NE '') ) then
|
|
|
|
|
If Num(ProcessedDTM) then ProcessedDTM = OConv(ProcessedDTM, 'DT2/^H')
|
|
|
|
|
// Find the SCHED_DET_NG event record that contains the cassette number
|
|
|
|
|
Query = 'SELECT SCHED_DET_NG WITH WO_NO EQ ':WONo:' AND WITH START_DTM LE "':ProcessedDTM:'" '
|
|
|
|
|
Query := 'AND WITH UNPROCESSED_CASS EQ ':CassNo:' BY START_DTM'
|
|
|
|
|
Query := 'AND WITH UNPROCESSED_CASS EQ ':CassNo:' OR WITH PROCESSED_CASS EQ ':CassNo:' BY START_DTM'
|
|
|
|
|
GoSub ClearCursors
|
|
|
|
|
RList(Query, TARGET_ACTIVELIST$, '', '', '')
|
|
|
|
|
EOF = False$
|
|
|
|
|
Done = False$
|
|
|
|
|
Loop
|
|
|
|
|
Readnext SchedDetNGKey else EOF = True$
|
|
|
|
|
Until EOF = True$
|
|
|
|
|
Until EOF
|
|
|
|
|
Schedule_Services('UpdateEventCassProcStatus', WONo, CassNo, SchedDetNGKey)
|
|
|
|
|
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
|
|
|
|
Done = True$
|
|
|
|
|
Until Done
|
|
|
|
|
Repeat
|
|
|
|
|
end else
|
|
|
|
|
ErrorMsg = 'Error in ':Service:' service. WONo, CassNo, and ProcessedDTM cannot be null'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
|
|
|
|
|
|
|
|
|
end service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Service UpdateEventCassProcStatus(WONo, CassNo, SchedDetNGKey)
|
|
|
|
|
|
|
|
|
|
ErrorMsg = ''
|
|
|
|
|
If ( (WONo NE '') and (CassNo NE '') and (SchedDetNGKey NE '') ) then
|
|
|
|
|
SchedDetNGRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetNGKey)
|
|
|
|
|
If Error_Services('NoError') then
|
|
|
|
|
RecChanged = False$
|
|
|
|
|
CassComp = False$
|
|
|
|
|
UnprocCassList = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
|
|
|
|
ProcCassList = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
|
|
|
|
AllSchedCass = SRP_Array('Join', UnprocCassList, ProcCassList, 'OR', @VM)
|
|
|
|
|
AllSchedCass = SRP_Array('SortSimpleList', AllSchedCass, 'AscendingNumbers', @VM)
|
|
|
|
|
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
|
|
|
|
If ReactType EQ 'EPP' then
|
|
|
|
|
WMIKey = WONo:'*1*':CassNo
|
|
|
|
|
If RowExists('WM_IN', WMIKey) then
|
|
|
|
|
// Since EpiPro splits WM_IN cassettes out into RDS runs, we need to determine if the
|
|
|
|
|
// cassette has been emptied out or if enough wafers have been consumed such that
|
|
|
|
|
// the wafer count equals the split work order event quantity.
|
|
|
|
@ -3288,15 +3313,10 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
|
|
|
|
// cassettes that should be marked as complete when the event ends in the middle of the cassette.
|
|
|
|
|
// That is, the EpiPro work order events should end on an RDS when they are split around block
|
|
|
|
|
// out events.
|
|
|
|
|
UnprocCassList = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
|
|
|
|
ProcCassList = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
|
|
|
|
AllSchedCass = SRP_Array('Join', UnprocCassList, ProcCassList, 'OR', @VM)
|
|
|
|
|
AllSchedCass = SRP_Array('SortSimpleList', AllSchedCass, 'AscendingNumbers', @VM)
|
|
|
|
|
NumSchedCass = DCount(AllSchedCass, @VM)
|
|
|
|
|
EndCassNo = AllSchedCass<0, NumSchedCass>
|
|
|
|
|
EndSlotNo = Mod(SchedWfrQty, 25)
|
|
|
|
|
If EndSlotNo EQ 0 then EndSlotNo = 25
|
|
|
|
|
WMIKey = WONo:'*1*':CassNo
|
|
|
|
|
WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X')
|
|
|
|
|
UnloadDtms = Xlate('RDS', WMIRdsList, 'DATETIME_OUT', 'X')
|
|
|
|
|
NumUnloadedWfrs = 0
|
|
|
|
@ -3309,38 +3329,84 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
|
|
|
|
If ( (NumUnloadedWfrs EQ 25) or ( (CassNo EQ EndCassNo) and (NumUnloadedWfrs GE EndSlotNo) ) or (CassRemWfrs EQ 0) ) then
|
|
|
|
|
CassComp = True$
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end else
|
|
|
|
|
WOMatKey = WoNo:'*':CassNo
|
|
|
|
|
If RowExists('WO_MAT', WOMatKey) then
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
If CassComp then
|
|
|
|
|
RecChanged = False$
|
|
|
|
|
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
|
|
|
|
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
|
|
|
|
|
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
|
|
|
|
Locate CassNo in UnprocCassList using @VM setting vPos then
|
|
|
|
|
UnprocCassList = Delete(UnprocCassList, 0, vPos, 0)
|
|
|
|
|
RecChanged = True$
|
|
|
|
|
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)
|
|
|
|
|
Locate CassNo in ProcCassList using @VM setting vPos else
|
|
|
|
|
ProcCassList<0, -1> = CassNo
|
|
|
|
|
ProcCassList = SRP_Array('Clean', ProcCassList, 'TrimAndMakeUnique', @VM)
|
|
|
|
|
ProcCassList = SRP_Array('SortSimpleList', ProcCassList, 'AscendingNumbers', @VM)
|
|
|
|
|
RecChanged = True$
|
|
|
|
|
end
|
|
|
|
|
end else
|
|
|
|
|
Locate CassNo in ProcCassList using @VM setting vPos then
|
|
|
|
|
ProcCassList = Delete(ProcCassList, 0, vPos, 0)
|
|
|
|
|
RecChanged = True$
|
|
|
|
|
end
|
|
|
|
|
Locate CassNo in UnprocCassList using @VM setting vPos else
|
|
|
|
|
UnprocCassList<0, -1> = CassNo
|
|
|
|
|
UnprocCassList = SRP_Array('Clean', UnprocCassList, 'TrimAndMakeUnique', @VM)
|
|
|
|
|
UnprocCassList = SRP_Array('SortSimpleList', UnprocCassList, 'AscendingNumbers', @VM)
|
|
|
|
|
RecChanged = True$
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end else
|
|
|
|
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
|
|
|
|
end
|
|
|
|
|
If RecChanged then
|
|
|
|
|
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
|
|
|
|
|
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
|
|
|
|
|
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocCassList
|
|
|
|
|
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcCassList
|
|
|
|
|
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
|
|
|
|
|
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
|
|
|
|
end
|
|
|
|
|
Done = True$
|
|
|
|
|
end
|
|
|
|
|
Until Done EQ True$
|
|
|
|
|
Repeat
|
|
|
|
|
|
|
|
|
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
|
|
|
|
|
|
|
|
|
end service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Service UpdateEventCassLists(SchedDetNGKey)
|
|
|
|
|
|
|
|
|
|
ErrorMsg = ''
|
|
|
|
|
If (SchedDetNGKey NE '') then
|
|
|
|
|
If RowExists('SCHED_DET_NG', SchedDetNGKey) then
|
|
|
|
|
SchedDetNGRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetNGKey)
|
|
|
|
|
If Error_Services('NoError') then
|
|
|
|
|
UnprocCassList = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
|
|
|
|
ProcCassList = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
|
|
|
|
AllSchedCass = SRP_Array('Join', UnprocCassList, ProcCassList, 'OR', @VM)
|
|
|
|
|
AllSchedCass = SRP_Array('SortSimpleList', AllSchedCass, 'AscendingNumbers', @VM)
|
|
|
|
|
WONo = SchedDetNGRec<SCHED_DET_NG.WO_NO$>
|
|
|
|
|
For each CassNo in AllSchedCass using @VM
|
|
|
|
|
Schedule_Services('UpdateEventCassProcStatus', WONo, CassNo, SchedDetNGKey)
|
|
|
|
|
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
|
|
|
|
Until (ErrorMsg NE '')
|
|
|
|
|
Next CassNo
|
|
|
|
|
end else
|
|
|
|
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
|
|
|
|
end
|
|
|
|
|
end else
|
|
|
|
|
ErrorMsg = 'Error in ':Service:' service. SCHED_DET_NG ':SchedDetNGKey:' does not exist.'
|
|
|
|
|
end
|
|
|
|
|
end else
|
|
|
|
|
ErrorMsg = 'Error in ':Service:' service. SchedDetNGKey cannot be null.'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
|
|
|
|
|
|
|
|
|
end service
|
|
|
|
|
|
|
|
|
|