Compare commits

...

23 Commits

Author SHA1 Message Date
2d3f534a71 Common ResourceID and IsViewerFile
Enable process-data-standard-format for HgCV and Tencor

Re-enable write for .txt files
2025-06-16 10:12:55 -07:00
f6ba173f47 removed value mark from key to prevent locks piling up 2025-06-13 11:28:27 -07:00
98e02f8c40 Added count metric endpoint 2025-06-11 09:45:26 -07:00
de6296b1d3 Merged PR 18416: Added in additional fields to response. Expected wafer map and a check for to...
Added in additional fields to response. Expected wafer map and a check for tool being down, as well as logging to API Endpoints

Related work items: #137427
2025-06-10 18:55:24 +02:00
ebd8b36d13 smart scanner metrics 2025-06-10 08:57:13 -07:00
803f946c7e removed dead code 2025-06-09 16:44:03 -07:00
16c7bc6926 fixed query to not look for an asterisk to match new data 2025-06-09 16:08:06 -07:00
216df9b4ef corrected TencorRunData path 2025-06-10 00:45:02 +02:00
5eec9386c2 Updated solution to support merging of ABORT_ALARM and INTRUSIVE_MAINT
orders
2025-06-09 12:26:36 -07:00
f3ad7adfa8 Move MonIn calls to background 2025-06-09 18:58:02 +02:00
c4fbf7c1d9 modified proc queue system to retry up to three times before moving the request to the PROC_QUEUE_FAILED table and notifying OI admins
added service to clean PROC_QUEUE_FAILED table
2025-06-09 18:23:24 +02:00
2a28c4b743 Added a condition that Wafer type for metrology reading is not null to determine if a test wafer is required. 2025-06-07 22:04:48 -07:00
e5f0e9b7f1 modified passdown commuter module to clear form on successful entry post 2025-06-05 13:07:21 -07:00
869787e0f3 Added logging to proc queue processing. Refactored code to delete request on failures. Restored MCP call in Service_Manager_Events to avoid issues calling certain procedures. 2025-06-04 17:05:06 -07:00
38fc89dac6 Updated service manager debugger intercept to also send notes (emails). Refactored Service_Manager_Events so that the call stack is not hidden behind MCP.
updated debugger intercept distribution group
2025-06-04 11:21:30 -07:00
614da8ad3b Merged PR 18112: Changed faulty call to LotEventServices -> CreateLotEvent to correct call
Changed faulty call to LotEventServices -> CreateLotEvent to correct call
2025-06-04 18:22:08 +02:00
dcb61e220c added production supervisors to MET DEPT popup so that calibration reminders are sent to them 2025-06-03 13:03:40 -07:00
117e5c8b4b Merged PR 18016: Added a new notification group and added group to get notifications on return...
Added a new notification group and added group to get notifications on return to fab
2025-06-02 21:00:34 +02:00
25c608c9a6 added a check for status of VOID within WO_MAT_ACTIONS to prevent creating MAKEUP_WAFERS record if lot is voided 2025-06-02 09:35:26 -07:00
31632e28aa fixed typo preventing location of calibration from being inserted into reminder email 2025-05-28 12:04:08 -07:00
03b0c8f606 re-enabling code temporarily turned off to populate REACT_ITEM<CURR_STATUS_STATIC> 2025-05-28 10:37:06 -07:00
6cfb6e521e Added new metric to track for reactor maintenance. Fixed a bug in DecrementWfrMetrics service.
added in equate changes
2025-05-28 01:29:32 +02:00
481f083804 added JFUENTE1 to MET DEPT so that MET type calibration notifications are also sent to her 2025-05-27 16:18:10 -07:00
47 changed files with 5344 additions and 2286 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -423,7 +423,7 @@
"<1,31>": "", "<1,31>": "",
"<1,32>": "", "<1,32>": "",
"<1,33>": "", "<1,33>": "",
"<1,34>": "", "<1,34>": "LSL2*IMAGE*ICO*INFINEON",
"<1,35>": "", "<1,35>": "",
"<1,36>": "", "<1,36>": "",
"<1,37>": { "<1,37>": {

View File

@ -40,7 +40,7 @@
"<8,2>": { "<8,2>": {
"<8,2,1>": "MET", "<8,2,1>": "MET",
"<8,2,2>": "Metrology", "<8,2,2>": "Metrology",
"<8,2,3>": "TODD_C, JEANNE_M" "<8,2,3>": "TODD_C, JEANNE_M, JFUENTE1, JUSTIN_H, JONATHON_S, MARROQUINBRA, TIFFANY_M"
}, },
"<8,3>": { "<8,3>": {
"<8,3,1>": "MTC", "<8,3,1>": "MTC",

View File

@ -235,7 +235,7 @@ Service SendReminders()
IF CLType = 'E' THEN IF CLType = 'E' THEN
Desc = CLRec<CALIB_LIST_EQ_DESC$> Desc = CLRec<CALIB_LIST_EQ_DESC$>
SN = CLRec<CALIB_LIST_EQ_SN$> SN = CLRec<CALIB_LIST_EQ_SN$>
Loc = CLRec<CALIB_LIST_EQ_LOC$ Loc = CLRec<CALIB_LIST_EQ_LOC$>
NewLine = Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$ NewLine = Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$
END END
IF CLType = 'S' THEN IF CLType = 'S' THEN

View File

@ -50,109 +50,112 @@ RETURN Result
* * * * * * * * * * * * * *
Create: Create:
* * * * * * * * * * * * * *
obj_AppWindow('Create') obj_AppWindow('Create')
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX') Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
GOSUB Refresh GOSUB Refresh
RETURN RETURN
* * * * * * * * * * * * * *
Refresh: Refresh:
* * * * * * * * * * * * * *
RETURN RETURN
* * * * * * * * * * * * * *
ReactNoGF: ReactNoGF:
* * * * * * * * * * * * * *
* Don't add a return here * Don't add a return here
* * * * * * * * * * * * * *
LUReactor: LUReactor:
* * * * * * * * * * * * * *
IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1 IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1
IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2 IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2
Set_Status(0) Set_Status(0)
TypeOver = '' TypeOver = ''
TypeOver<PSELECT$> = '2' ;* Multiple Select TypeOver<PSELECT$> = '2' ;* Multiple Select
TypeOver<PTYPE$> = 'E' ;* Return entire row TypeOver<PTYPE$> = 'E' ;* Return entire row
ReactData = Popup(@WINDOW,TypeOver,'REACTORS') ReactData = Popup(@WINDOW,TypeOver,'REACTORS')
IF ReactData = '' THEN RETURN IF ReactData = '' THEN RETURN
Set_Property(@WINDOW:'.REACT_NO','LIST',ReactData) Set_Property(@WINDOW:'.REACT_NO','LIST',ReactData)
LineCnt = COUNT(ReactData,@FM) + (ReactData NE '') LineCnt = COUNT(ReactData,@FM) + (ReactData NE '')
ColCnt = 7 ColCnt = 7
FOR Line = 1 TO LineCnt FOR Line = 1 TO LineCnt
FOR Column = 2 TO ColCnt FOR Column = 2 TO ColCnt
stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$) stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$)
NEXT Column NEXT Column
NEXT Line NEXT Line
RETURN RETURN
* * * * * * * * * * * * * *
Cancel: Cancel:
* * * * * * * * * * * * * *
End_Dialog(@WINDOW,'') End_Dialog(@WINDOW,'')
RETURN RETURN
* * * * * * * * * * * * * *
PostEntries: PostEntries:
* * * * * * * * * * * * * *
ReactNos = Get_Property(@WINDOW:'.REACT_NO','ARRAY')<COL$REACT_NO>
Comment = Get_Property(@WINDOW:'.COMMENT','DEFPROP')
LOOP
TestChar = ReactNos[-1,1]
UNTIL TestChar NE @VM OR ReactNos = ''
ReactNos[-1,1] = ''
REPEAT
EventKeys = '' ;* Keys to return to the REACT_EVENT window for a browse of the newly created records
IF ReactNos NE '' AND Comment NE '' THEN
EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ;* Same DTM for all new records
EventType = 'PD' ;* Passdown
LoggedBy = @USER4
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '') ReactNos = Get_Property(@WINDOW:'.REACT_NO','ARRAY')<COL$REACT_NO>
Comment = Get_Property(@WINDOW:'.COMMENT','DEFPROP')
FOR I = 1 TO ReactCnt LOOP
ReactNo = ReactNos<1,I> TestChar = ReactNos[-1,1]
CurrMode = XLATE('REACTOR',ReactNo,'CURR_MODE','X') UNTIL TestChar NE @VM OR ReactNos = ''
ReactNos[-1,1] = ''
REPEAT
EventKeys = '' ;* Keys to return to the REACT_EVENT window for a browse of the newly created records
IF ReactNos NE '' AND Comment NE '' THEN
obj_React_Event('Create',ReactNo:@RM:EventDTM:@RM:EventType:@RM:LoggedBy:@RM:Comment:@RM:@RM:CurrMode) EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ;* Same DTM for all new records
EventKeys<I> = ReactNo:'*':ICONV(EventDTM,'DT') EventType = 'PD' ;* Passdown
NEXT I LoggedBy = @USER4
END ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
End_Dialog(@WINDOW,EventKeys) FOR I = 1 TO ReactCnt
ReactNo = ReactNos<1,I>
CurrMode = XLATE('REACTOR',ReactNo,'CURR_MODE','X')
obj_React_Event('Create',ReactNo:@RM:EventDTM:@RM:EventType:@RM:LoggedBy:@RM:Comment:@RM:@RM:CurrMode)
ErrCode = ''
If Get_Status(ErrCode) then
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'Error posting entries. ':ErrCode)
end else
Set_Property(@Window:'.REACT_NO', 'LIST', '')
Set_Property(@Window:'.COMMENT', 'TEXT', '')
end
EventKeys<I> = ReactNo:'*':ICONV(EventDTM,'DT')
NEXT I
END else
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'React No(s) and Comment must not be null!')
end
RETURN RETURN

View File

@ -581,171 +581,131 @@ Refresh:
// RDS_UNLOAD // RDS_UNLOAD
If @WINDOW EQ 'RDS_UNLOAD' then If @WINDOW EQ 'RDS_UNLOAD' then
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') CtrlName = @WINDOW:'.EDT_QA_MET'
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
Set_Property(CtrlName, 'VISIBLE', True$)
MetList = Get_Property(CtrlName,'LIST')
ThickOutOfSpec = False$
CresOutOfSpec = False$
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
MetResult = MetList<Line,COL$UL_MET_RESULT>
MetMin = MetList<Line,COL$UL_MET_MIN>
MetMax = MetList<Line,COL$UL_MET_MAX>
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
PSN = Get_Property(@Window : '.PSN', 'TEXT')
PRSStageKey = PSN:'*UNLOAD'
MetTest = MetList<Line,COL$UL_MET_TEST>
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
SpecRecipe = ''
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
Begin Case
Case MetTest EQ 'THICK_ONLY'
// Check each point to see if any are out of spec
For each DataPoint in DataPoints using @SVM setting ThickIndex
Until DataPoint EQ ''
Begin Case
Case ThickIndex GT 10
Null
Case (DataPoint EQ '')
ThickOutOfSpec = True$
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
ThickOutOfSpec = True$
End Case
Next DataPoint
Case MetTest EQ 'CRES'
// Check critical points to see if any are out of spec (both HgCV and Phase)
CriticalPoints = '1,2,5,6,9'
For each DataPoint in DataPoints using @SVM setting CresIndex
Until DataPoint EQ ''
HgCVDataPoint = DataPoint[1, 'F':@TM]
PhaseDataPoint = DataPoint[-1, 'B':@TM]
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
Begin Case
Case (HgCVDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
CresOutOfSpec = True$
End Case
Next DataPoint
End Case
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
Locate MetTest in SpecTests using @VM setting vPos then
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
end
NoError = True$
If (DevelopmentFlag EQ True$) then If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
Color = YELLOW$
CtrlName = @WINDOW:'.EDT_QA_MET' stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$) NoError = False$
Set_Property(CtrlName, 'VISIBLE', True$) end
MetList = Get_Property(CtrlName,'LIST')
ThickOutOfSpec = False$ If QAMetOutofSpec EQ True$ then
CresOutOfSpec = False$ Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
MLCnt = COUNT(MetList,@FM) + (MetList NE '') stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
FOR Line = 1 TO MLCnt NoError = False$
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN end
MetResult = MetList<Line,COL$UL_MET_RESULT>
MetMin = MetList<Line,COL$UL_MET_MIN> If (MetResult LT MetMin) then
MetMax = MetList<Line,COL$UL_MET_MAX> Color = RED$:@FM:'':@FM:BRED$:@FM:''
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN> stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT> NoError = False$
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE> end
PSN = Get_Property(@Window : '.PSN', 'TEXT')
PRSStageKey = PSN:'*UNLOAD' If (MetResult GT MetMax) then
MetTest = MetList<Line,COL$UL_MET_TEST> Color = RED$:@FM:'':@FM:BRED$:@FM:''
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey) stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$> NoError = False$
SpecRecipe = '' end
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') If (PhaseResult LT PhaseMin) then
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey) Color = RED$:@FM:'':@FM:BRED$:@FM:''
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line> stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
Begin Case NoError = False$
Case MetTest EQ 'THICK_ONLY' end
// Check each point to see if any are out of spec
For each DataPoint in DataPoints using @SVM setting ThickIndex QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
Until DataPoint EQ '' DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
Begin Case If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Case ThickIndex GT 10 Color = RED$:@FM:'':@FM:BRED$:@FM:''
Null stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
Case (DataPoint EQ '') NoError = False$
ThickOutOfSpec = True$ end
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
ThickOutOfSpec = True$ If (NoError EQ True$) then
End Case Color = GREEN$
Next DataPoint stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
Case MetTest EQ 'CRES'
// Check critical points to see if any are out of spec (both HgCV and Phase) END ELSE
CriticalPoints = '1,2,5,6,9' Color = GREEN$
For each DataPoint in DataPoints using @SVM setting CresIndex stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
Until DataPoint EQ '' END
HgCVDataPoint = DataPoint[1, 'F':@TM]
PhaseDataPoint = DataPoint[-1, 'B':@TM] NEXT Line
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
Begin Case Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
Case (HgCVDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$ IF MemberOf(@USER4, 'OI_ADMIN') THEN
Case (PhaseDataPoint EQ '') and CriticalPoint Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
CresOutOfSpec = True$ END ELSE
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
CresOutOfSpec = True$ END
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint end
CresOutOfSpec = True$
End Case
Next DataPoint
End Case
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
Locate MetTest in SpecTests using @VM setting vPos then
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
end
NoError = True$
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
Color = YELLOW$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If QAMetOutofSpec EQ True$ then
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult LT MetMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult GT MetMax) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (PhaseResult LT PhaseMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
NoError = False$
end
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
NoError = False$
end
If (NoError EQ True$) then
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
END ELSE
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
END
NEXT Line
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
IF MemberOf(@USER4, 'OI_ADMIN') THEN
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
END
end else
CtrlName = @WINDOW:'.MET_TEST'
Set_Property(@Window : '.EDT_QA_MET', 'VISIBLE', False$)
Set_Property(CtrlName, 'VISIBLE', True$)
MetList = Get_Property(CtrlName,'LIST')
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
IF MetList<Line,COL$MET_TEST> NE '' THEN
BEGIN CASE
CASE MetList<Line,COL$MET_RESULT> = ''
Color = YELLOW$
CASE MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN> OR MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>
Color = RED$
CASE 1
Color = GREEN$
END CASE
END ELSE
Color = GREEN$
END;* End of check for Met Test on the current line
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
NEXT Line
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
IF MemberOf(@USER4, 'OI_ADMIN') THEN
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
END
end
end
* End of check for Unload OR Post_Epi windows * End of check for Unload OR Post_Epi windows
**************************************************************************************************************************************** ****************************************************************************************************************************************
@ -2669,9 +2629,8 @@ MetTestDC:
Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST') Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST')
TestLine = Lines<CurrRow> TestLine = Lines<CurrRow>
LWRHOTest = Indexc(TestLine, 'LW_RHO', 1) LWRHOTest = Indexc(TestLine, 'LW_RHO', 1)
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) and (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then If (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then
Ctrls := @WINDOW:'.EDT_QA_MET':@RM ; Props := 'SELPOS':@RM Ctrls := @WINDOW:'.EDT_QA_MET':@RM ; Props := 'SELPOS':@RM
Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST' Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST'
end else end else
@ -2708,8 +2667,7 @@ MetTestDC:
BEGIN CASE BEGIN CASE
CASE MetTest EQ '' CASE MetTest EQ ''
Null Null
CASE (@WINDOW = 'RDS_UNLOAD') and (LWRHOTest EQ False$)
CASE (@WINDOW = 'RDS_UNLOAD') and (DevelopmentFlag EQ True$) and (LWRHOTest EQ False$)
ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID) ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID)
Send_Event(@Window, "READ") Send_Event(@Window, "READ")
CASE Otherwise$ CASE Otherwise$
@ -2863,57 +2821,47 @@ return
RefreshWaferCounterData: RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X') Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
If WCCheckEnabled then Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$) If RDSNo NE '' then
QtyBackColor = GREEN$ FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP') WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
If RDSNo NE '' then Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA') WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$> Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
***************************************** *****************************************
* WaferCounter - Wafers Quantity Section * * WaferCounter - Wafers Quantity Section *
***************************************** *****************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$ If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
end else end else
QtyBackColor = ORANGE$ QtyBackColor = ORANGE$
end end
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X') WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1) WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA') WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then If Error_Services('NoError') then
WCCurrMode = '' WCCurrMode = ''
If RowExists('TOOL', WCToolID) then If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X') WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X') WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD')) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
end else
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end
end else end else
ErrMsg(Error_Services('GetMessage')) ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end end
end else end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".') ErrMsg(Error_Services('GetMessage'))
end end
end end else
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor) ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
end
end else end
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
end
return return

View File

@ -1107,29 +1107,25 @@ SignSupVer:
END END
END END
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X') ****************************************
If WCCheckEnabled then * Verify the Wafer Counter information *
****************************************
****************************************
* Verify the Wafer Counter information *
****************************************
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
************************************ ************************************
* Wafer Counter - Quantity Section * * Wafer Counter - Quantity Section *
************************************ ************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then If (WaferCounterQty NE WafersOut) then
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.') ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
RETURN 0 RETURN 0
end end
end else end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.') ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0 RETURN 0
end end
end
************************** **************************
* Verify user's password * * Verify user's password *
@ -2293,58 +2289,50 @@ return
RefreshWaferCounterData: RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$) Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$ QtyBackColor = GREEN$
WONo = Get_Property(@Window : '.WO_NO', 'TEXT') WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT') Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
WMOKey = WONo:'*1*':Cassette WMOKey = WONo:'*1*':Cassette
If WMOKey NE '*1*' then If WMOKey NE '*1*' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA') FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$> WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty) Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
************************************ ************************************
* Wafer Counter - Quantity Section * * Wafer Counter - Quantity Section *
************************************ ************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$ If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
end else end else
QtyBackColor = ORANGE$ QtyBackColor = ORANGE$
end end
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X') WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1) WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA') WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then If Error_Services('NoError') then
WCCurrMode = '' WCCurrMode = ''
If RowExists('TOOL', WCToolID) then If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X') WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X') WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD')) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
end else
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end
end else end else
ErrMsg(Error_Services('GetMessage')) ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end end
end else end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".') ErrMsg(Error_Services('GetMessage'))
end end
end end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".')
end
end
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
end else
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
end
return return

View File

@ -881,24 +881,19 @@ Event SIGN_BUTTON.CLICK()
****************************************** ******************************************
* Verify Unload Stage QA Metrology Tests * * Verify Unload Stage QA Metrology Tests *
****************************************** ******************************************
WOMatQAKey = WONo : '*' : CassNo
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
If (DevelopmentFlag EQ True$) then OutOfSpec = Sum(OutOfSpec)
WOMatQAKey = WONo : '*' : CassNo If OutOfSpec GT 0 then
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$> ErrorMsg = 'Process Error':@SVM
OutOfSpec = Sum(OutOfSpec) For each FailReason in FailReasons using @VM
If OutOfSpec GT 0 then ErrorMsg := FailReason:CRLF$
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$> Next FailReason
ErrorMsg = 'Process Error':@SVM ErrMsg(ErrorMsg)
For each FailReason in FailReasons using @VM Return
ErrorMsg := FailReason:CRLF$ end
Next FailReason
ErrMsg(ErrorMsg)
Return
end
end
******************************************* *******************************************
* Verify if all steps have been completed * * Verify if all steps have been completed *
@ -1965,7 +1960,3 @@ ClearForm:
return return

View File

@ -259,7 +259,7 @@ end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetWaferMapProductionPath() Service GetWaferMapProductionPath()
ProductionPath = '\\mesfs.infineon.com\EC_Metrology_Si\MetrologyAttachments\TencorRunData' ProductionPath = '\\mesfs.infineon.com\EC_Metrology_Si\MetrologyAttachments\TencorRunData_'
Response = ProductionPath Response = ProductionPath
end service end service

View File

@ -2,9 +2,9 @@ Compile function Lot_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
Declare function TEST_WAFER_PROD_SERVICES, SRP_Datetime, Datetime, Database_Services, Lot_Services, Error_Services, RTI_CREATEGUID Declare function TEST_WAFER_PROD_SERVICES, SRP_Datetime, Datetime, Database_Services, Lot_Services, Error_Services, RTI_CREATEGUID
Declare function SRP_Array, SRP_Json, Environment_Services, Logging_Services, MemberOf, Lot_Event_Services Declare function SRP_Array, SRP_Json, Environment_Services, Logging_Services, MemberOf, Lot_Event_Services, GetTickCount
Declare subroutine Database_Services, Btree.Extract, Lot_Services, Error_Services, Labeling_Services, SRP_Json, Logging_Services Declare subroutine Database_Services, Btree.Extract, Lot_Services, Error_Services, Labeling_Services, SRP_Json, Logging_Services
Declare subroutine SRP_Run_Command, Service_Services, obj_notes, Lot_Event_Services Declare subroutine SRP_Run_Command, Service_Services, obj_notes, Lot_Event_Services, Mona_Services
$insert APP_INSERTS $insert APP_INSERTS
$Insert LOT_EQUATES $Insert LOT_EQUATES
$Insert TEST_WAFER_PROD_EQUATES $Insert TEST_WAFER_PROD_EQUATES
@ -38,6 +38,13 @@ objLotClosureLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',',
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE' Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE'
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT' Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT'
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_LOTSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_LOTSERVICES'
end
GoToService GoToService
Return Response or "" Return Response or ""
@ -113,6 +120,9 @@ Service GenerateNewLotId(LotType)
end service end service
Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType) Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType)
StartTick = GetTickCount()
MetricName = 'GetLotIdByLegacyLotIdAndType'
Open 'DICT.LOT' to DictLot then Open 'DICT.LOT' to DictLot then
SearchString = '' SearchString = ''
@ -130,10 +140,16 @@ Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType)
end else end else
ErrorMsg = 'Error in ':Service:' service. Error opening LOT dictionary.' ErrorMsg = 'Error in ':Service:' service. Error opening LOT dictionary.'
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId) Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId)
StartTick = GetTickCount()
MetricName = 'CreateNewLot'
CreatedLotNumber = '' CreatedLotNumber = ''
ErrorMessage = '' ErrorMessage = ''
Begin Case Begin Case
@ -279,6 +295,8 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo
end end
Response = CreatedLotNumber Response = CreatedLotNumber
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service End Service
@ -484,6 +502,9 @@ end service
//Returns a @FM delimited list of operations in sequence //Returns a @FM delimited list of operations in sequence
Service GetLotOperationSequence(LotId) Service GetLotOperationSequence(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotOperationSequence'
LotOperationsInSequence = '' LotOperationsInSequence = ''
If LotID NE '' then If LotID NE '' then
//Get Operations //Get Operations
@ -496,9 +517,15 @@ Service GetLotOperationSequence(LotId)
//error: lot id was null //error: lot id was null
end end
Response = LotOperationsInSequence Response = LotOperationsInSequence
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetLotCurrOperationId(LotId) Service GetLotCurrOperationId(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotCurrOperationId'
CurrOperation = '' CurrOperation = ''
If LotID NE '' then If LotID NE '' then
//Get them in sequence first //Get them in sequence first
@ -515,9 +542,15 @@ Service GetLotCurrOperationId(LotId)
//error: lot id was null //error: lot id was null
end end
Response = CurrOperation Response = CurrOperation
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetLotCurrOperationName(LotId) Service GetLotCurrOperationName(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotCurrOperationName'
CurrOperationId = '' CurrOperationId = ''
CurrOperationName = '' CurrOperationName = ''
If LotID NE '' then If LotID NE '' then
@ -536,6 +569,9 @@ Service GetLotCurrOperationName(LotId)
//error: lot id was null //error: lot id was null
end end
Response = CurrOperationName Response = CurrOperationName
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework) Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
@ -591,6 +627,9 @@ Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
end service end service
Service IsLotMovedIn(LotId) Service IsLotMovedIn(LotId)
StartTick = GetTickCount()
MetricName = 'IsLotMovedIn'
Response = '' Response = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
CurrOperId = Lot_Services('GetLotCurrOperationId', LotId) CurrOperId = Lot_Services('GetLotCurrOperationId', LotId)
@ -601,6 +640,9 @@ Service IsLotMovedIn(LotId)
Response = False$ Response = False$
end end
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service IsOperationCompleted(LotOperationId) Service IsOperationCompleted(LotOperationId)
@ -619,6 +661,8 @@ Service IsOperationCompleted(LotOperationId)
end service end service
Service MoveInLot(LotID, Operator) Service MoveInLot(LotID, Operator)
StartTick = GetTickCount()
MetricName = 'MoveInLot'
ErrorMessage = '' ErrorMessage = ''
ThisLotCurrOperationID = '' ThisLotCurrOperationID = ''
@ -667,9 +711,15 @@ Service MoveInLot(LotID, Operator)
Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service MoveOutLot(LotID, Operator) Service MoveOutLot(LotID, Operator)
StartTick = GetTickCount()
MetricName = 'MoveOutLot'
ErrorMessage = '' ErrorMessage = ''
ThisLotCurrOperationID = '' ThisLotCurrOperationID = ''
If LotId NE '' then If LotId NE '' then
@ -729,6 +779,9 @@ Service MoveOutLot(LotID, Operator)
Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN) Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN)
@ -855,6 +908,9 @@ Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN)
end service end service
Service OpenLot(LotId) Service OpenLot(LotId)
StartTick = GetTickCount()
MetricName = 'OpenLot'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -871,9 +927,15 @@ Service OpenLot(LotId)
If ErrorMessage NE '' then If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CloseLot(LotId) Service CloseLot(LotId)
StartTick = GetTickCount()
MetricName = 'CloseLot'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -890,6 +952,9 @@ Service CloseLot(LotId)
If ErrorMessage NE '' then If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service AutoCloseTestWaferLot(LotId, CloseUserId) Service AutoCloseTestWaferLot(LotId, CloseUserId)
@ -989,15 +1054,26 @@ Service AutoCloseTestWaferLot(LotId, CloseUserId)
end service end service
Service HoldLot(LotId, OperatorId) Service HoldLot(LotId, OperatorId)
StartTick = GetTickCount()
MetricName = 'HoldLot'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service UnholdLot(LotId, OperatorId) Service UnholdLot(LotId, OperatorId)
StartTick = GetTickCount()
MetricName = 'UnholdLot'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId) Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
StartTick = GetTickCount()
MetricName = 'ReduceLotWaferCount'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -1043,9 +1119,15 @@ Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
if ErrorMessage NE '' then if ErrorMessage NE '' then
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId) Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId)
StartTick = GetTickCount()
MetricName = 'IncreaseLotWaferCount'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -1087,6 +1169,8 @@ Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service OpenOIWizardCreateTWLotInBrowser() Service OpenOIWizardCreateTWLotInBrowser()
@ -1095,6 +1179,9 @@ Service OpenOIWizardCreateTWLotInBrowser()
end service end service
Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username) Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username)
StartTick = GetTickCount()
MetricName = 'CreateNewVoidedLotRecord'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LSL_USERS', Username) then If RowExists('LSL_USERS', Username) then
If LotType NE '' then If LotType NE '' then
@ -1165,16 +1252,8 @@ Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username
If ErrorMessage NE '' then If ErrorMessage NE '' then
//Todo Log Error Message //Todo Log Error Message
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,7 @@ Parm3:
-For Metric updates this represents the numeric data that you wish to send. -For Metric updates this represents the numeric data that you wish to send.
***************************************************************/ ***************************************************************/
Declare Subroutine Errmsg, Error_Services, Delay, Mona_Services Declare Subroutine Errmsg, Error_Services, Delay, Mona_Services, Service_Services
Declare function Get_Status, SRP_Datetime, Environment_Services, Httpclient_Services Declare function Get_Status, SRP_Datetime, Environment_Services, Httpclient_Services
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
@ -44,17 +44,31 @@ Options STATES = 'OK', 'WARNING', 'CRITICAL'
Service SendStatus(MonitorName=MONITORS, StatusName, CurrentState=STATES) Service SendStatus(MonitorName=MONITORS, StatusName, CurrentState=STATES)
Mona_Services("SendBufferedStatus", MonitorName, StatusName, CurrentState) Mona_Services("PostStatus", MonitorName, StatusName, CurrentState)
end service end service
Service PostStatus(MonitorName, StatusName, CurrentState=STATES)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedStatus':@VM:MonitorName:@VM:StatusName:@VM:CurrentState)
end service
Service SendMetric(MonitorName=MONITORS, MetricName, Number) Service SendMetric(MonitorName=MONITORS, MetricName, Number)
Mona_Services("SendBufferedAverageMetric", MonitorName, MetricName, Number) Mona_Services("PostAverageMetric", MonitorName, MetricName, Number)
end Service end Service
Service PostAverageMetric(MonitorName, MetricName, Number)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedAverageMetric':@VM:MonitorName:@VM:MetricName:@VM:Number)
end service
Service SendCountMetric(MonitorName=MONITORS, MetricName, Number)
Mona_Services("PostCountMetric", MonitorName, MetricName, Number)
end Service
Service PostCountMetric(MonitorName, MetricName, Number)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedCountMetric':@VM:MonitorName:@VM:MetricName:@VM:Number)
end service
Service SendBufferedStatus(MonaResource, StatusName, StatusValue) Service SendBufferedStatus(MonaResource, StatusName, StatusValue)
@ -172,6 +186,67 @@ Service SendBufferedAverageMetric(MonaResource, MetricName, MetricValue)
end service end service
Service SendBufferedCountMetric(MonaResource, MetricName, MetricValue)
If MonaResource EQ '' then
MonaResource = Environment_Services("GetMonaResource")
end
DateTime = SRP_DateTime('Now')
Year = SRP_Datetime("Year", DateTime)
Month = SRP_Datetime("Month", DateTime)
If Len(Month) EQ 1 then
Month = '0':Month
end
Day = SRP_Datetime("Day", DateTime)
If Len(Day) EQ 1 then
Day = '0':Day
end
Hour = SRP_Datetime("Hour", DateTime)
If Len(Hour) EQ 1 then
Hour = '0':Hour
end
Minute = SRP_Datetime("Minute", DateTime)
If Len(Minute) EQ 1 then
Minute = '0':Minute
end
Second = SRP_Datetime("Second", DateTime)
If Len(Second) EQ 1 then
Second = '0':Second
end
RequestBodyJson = '{ "resource": "':MonaResource:'"'
RequestBodyJson = RequestBodyJson:', "dateTime": "':Year:'-':Month:'-':Day:'T':Hour:':':Minute:':':Second:'Z"'
RequestBodyJson = RequestBodyJson:', "metricName": "':MetricName:'"'
RequestBodyJson = RequestBodyJson:', "metricValue": "':MetricValue:'" }'
ApiUrl = Environment_Services("GetMonInBufferedWorkerApiUrl"):'/count'
retries = 3
backoffSeconds = 1
isSuccessful = False$
Loop
while (isSuccessful EQ False$ and retries GT 0)
waitSeconds = (3 - retries) * backoffSeconds
Delay(waitSeconds)
retries = retries - 1
response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, False$, '')
If response EQ '"Request queued for processing"' then
isSuccessful = True$
end
Repeat
end service
Service QueueLatencyAndCountMetrics(MonaResource, MetricName, StartTick, EndTick)
Diff = EndTick - StartTick
Mona_Services('SendMetric', MonaResource, MetricName:'_LATENCY', Diff)
Mona_Services('SendCountMetric', MonaResource, MetricName:'_COUNT', 1)
end service
SwapResourceNames: SwapResourceNames:
@ -195,3 +270,4 @@ SwapResourceNames:
return return

View File

@ -3,25 +3,27 @@ Compile function NDW_WAFER_COUNTS_EVENTS(CtrlEntId, Event, @PARAMS)
#window NDW_WAFER_COUNTS #window NDW_WAFER_COUNTS
Declare function Reactor_Services, Database_Services, Get_Property, Error_Services, Environment_Services Declare function Reactor_Services, Database_Services, Get_Property, Error_Services, Environment_Services
Declare function SRP_Array, Logging_Services Declare function SRP_Array, Logging_Services
Declare subroutine Set_Property, Logging_Services Declare subroutine Set_Property, Logging_Services, PlaceDialog
$Insert EVENT_SETUP $Insert EVENT_SETUP
$Insert APP_INSERTS $Insert APP_INSERTS
$Insert REACTOR_EQUATES $Insert REACTOR_EQUATES
EQU DATA_ASM_REACT_ID$ to 1 EQU DATA_ASM_REACT_ID$ to 1
EQU DATA_ASM_SUSC_CNT$ to 2 EQU DATA_ASM_SUSC_CNT$ to 2
EQU DATA_ASM_SUSC_THK$ to 3 EQU DATA_ASM_SUSC_THK$ to 3
EQU DATA_ASM_TUBE_CNT$ to 4 EQU DATA_ASM_TUBE_CNT$ to 4
EQU DATA_ASM_TUBE_THK$ to 5 EQU DATA_ASM_TUBE_THK$ to 5
EQU DATA_ASM_ARM_CNT$ to 6 EQU DATA_ASM_ARM_CNT$ to 6
EQU DATA_ASM_EXHAUST_THK$ to 7
EQU DATA_HTR_REACT_ID$ to 1 EQU DATA_HTR_REACT_ID$ to 1
EQU DATA_HTR_SUSC_CNT$ TO 2 EQU DATA_HTR_SUSC_CNT$ TO 2
EQU DATA_HTR_SUSC_THK$ TO 3 EQU DATA_HTR_SUSC_THK$ TO 3
EQU DATA_HTR_TUBE_CNT$ TO 4 EQU DATA_HTR_TUBE_CNT$ TO 4
EQU DATA_HTR_TUBE_THK$ TO 5 EQU DATA_HTR_TUBE_THK$ TO 5
EQU DATA_HTR_ARM_CNT$ TO 6 EQU DATA_HTR_ARM_CNT$ TO 6
EQU DATA_HTR_EXHAUST_THK$ TO 7
EQU DATA_EPP_REACT_ID$ to 1 EQU DATA_EPP_REACT_ID$ to 1
EQU DATA_EPP_SUSC_CNT$ TO 2 EQU DATA_EPP_SUSC_CNT$ TO 2
@ -30,6 +32,7 @@ EQU DATA_EPP_BELL_JAR_CNT$ TO 4
EQU DATA_EPP_BELL_JAR_THK$ TO 5 EQU DATA_EPP_BELL_JAR_THK$ TO 5
EQU DATA_EPP_LOWER_QUARTZ_CNT$ TO 6 EQU DATA_EPP_LOWER_QUARTZ_CNT$ TO 6
EQU DATA_EPP_LOWER_QUARTZ_THK$ TO 7 EQU DATA_EPP_LOWER_QUARTZ_THK$ TO 7
EQU DATA_EPP_EXHAUST_THK$ TO 8
ASMDataTable = @Window : '.OLE_DATA_ASM' ASMDataTable = @Window : '.OLE_DATA_ASM'
HTRDataTable = @Window : '.OLE_DATA_HTR' HTRDataTable = @Window : '.OLE_DATA_HTR'
@ -49,11 +52,11 @@ If Event EQ 'OLE' then
Transfer Param1 to Event Transfer Param1 to Event
Transfer Param2 to Param1 Transfer Param2 to Param1
Transfer Param3 to Param2 Transfer Param3 to Param2
* Transfer Param4 to Param3 Transfer Param4 to Param3
* Transfer Param5 to Param4 Transfer Param5 to Param4
* Transfer Param6 to Param5 Transfer Param6 to Param5
* Transfer Param7 to Param6 Transfer Param7 to Param6
* Transfer Param8 to Param7 Transfer Param8 to Param7
end end
GoToEvent Event for CtrlEntId else GoToEvent Event for CtrlEntId else
@ -67,17 +70,25 @@ Return EventFlow or 1
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam) Event WINDOW.CREATE(CreateParam)
GoSub SetupOLEControls GoSub SetupOLEControls
GoSub GetReactorMetrics GoSub GetReactorMetrics
End Event End Event
Event TABCONTROL_1.CLICK() Event TABCONTROL_1.CLICK()
Page = Get_Property(@Window : '.TABCONTROL_1', 'VALUE') Page = Get_Property(@Window : '.TABCONTROL_1', 'VALUE')
Set_Property(@WINDOW,'VPOSITION', Page) Set_Property(@WINDOW,'VPOSITION', Page)
end event end event
Event PUB_REFRESH_DATA.CLICK() Event PUB_REFRESH_DATA.CLICK()
GoSub GetReactorMetrics GoSub GetReactorMetrics
end event end event
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -85,6 +96,7 @@ end event
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
GetReactorMetrics: GetReactorMetrics:
ReactorRec = '' ReactorRec = ''
ASMData = '' ASMData = ''
HTRData = '' HTRData = ''
@ -105,12 +117,13 @@ GetReactorMetrics:
for each Reactor in ASMList using @FM setting rPos for each Reactor in ASMList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor) MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then if Error_Services('NoError') then
ASMData<rPos, DATA_ASM_REACT_ID$> = MetricData<1, DATA_ASM_REACT_ID$> ASMData<rPos, DATA_ASM_REACT_ID$> = MetricData<1, DATA_ASM_REACT_ID$>
ASMData<rPos, DATA_ASM_SUSC_CNT$> = MetricData<1, DATA_ASM_SUSC_CNT$> ASMData<rPos, DATA_ASM_SUSC_CNT$> = MetricData<1, DATA_ASM_SUSC_CNT$>
ASMData<rPos, DATA_ASM_SUSC_THK$> = MetricData<1, DATA_ASM_SUSC_THK$> ASMData<rPos, DATA_ASM_SUSC_THK$> = MetricData<1, DATA_ASM_SUSC_THK$>
ASMData<rPos, DATA_ASM_TUBE_CNT$> = MetricData<1, DATA_ASM_TUBE_CNT$> ASMData<rPos, DATA_ASM_TUBE_CNT$> = MetricData<1, DATA_ASM_TUBE_CNT$>
ASMData<rPos, DATA_ASM_TUBE_THK$> = MetricData<1, DATA_ASM_TUBE_THK$> ASMData<rPos, DATA_ASM_TUBE_THK$> = MetricData<1, DATA_ASM_TUBE_THK$>
ASMData<rPos, DATA_ASM_ARM_CNT$> = MetricData<1, DATA_ASM_ARM_CNT$> ASMData<rPos, DATA_ASM_ARM_CNT$> = MetricData<1, DATA_ASM_ARM_CNT$>
ASMData<rPos, DATA_ASM_EXHAUST_THK$> = MetricData<1, DATA_ASM_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -123,12 +136,13 @@ GetReactorMetrics:
for each Reactor in HTRList using @FM setting rPos for each Reactor in HTRList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor) MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then if Error_Services('NoError') then
HTRData<rPos, DATA_HTR_REACT_ID$> = MetricData <1, DATA_HTR_REACT_ID$> HTRData<rPos, DATA_HTR_REACT_ID$> = MetricData <1, DATA_HTR_REACT_ID$>
HTRData<rPos, DATA_HTR_SUSC_CNT$> = MetricData<1, DATA_HTR_SUSC_CNT$> HTRData<rPos, DATA_HTR_SUSC_CNT$> = MetricData<1, DATA_HTR_SUSC_CNT$>
HTRData<rPos, DATA_HTR_SUSC_THK$> = MetricData<1, DATA_HTR_SUSC_THK$> HTRData<rPos, DATA_HTR_SUSC_THK$> = MetricData<1, DATA_HTR_SUSC_THK$>
HTRData<rPos, DATA_HTR_TUBE_CNT$> = MetricData<1, DATA_HTR_TUBE_CNT$> HTRData<rPos, DATA_HTR_TUBE_CNT$> = MetricData<1, DATA_HTR_TUBE_CNT$>
HTRData<rPos, DATA_HTR_TUBE_THK$> = MetricData<1, DATA_HTR_TUBE_THK$> HTRData<rPos, DATA_HTR_TUBE_THK$> = MetricData<1, DATA_HTR_TUBE_THK$>
HTRData<rPos, DATA_HTR_ARM_CNT$> = MetricData<1, DATA_HTR_ARM_CNT$> HTRData<rPos, DATA_HTR_ARM_CNT$> = MetricData<1, DATA_HTR_ARM_CNT$>
HTRData<rPos, DATA_HTR_EXHAUST_THK$> = MetricData<1, DATA_HTR_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -149,6 +163,7 @@ GetReactorMetrics:
EPPData<rPos, DATA_EPP_BELL_JAR_THK$> = MetricData<1, DATA_EPP_BELL_JAR_THK$> EPPData<rPos, DATA_EPP_BELL_JAR_THK$> = MetricData<1, DATA_EPP_BELL_JAR_THK$>
EPPData<rPos, DATA_EPP_LOWER_QUARTZ_CNT$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_CNT$> EPPData<rPos, DATA_EPP_LOWER_QUARTZ_CNT$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_CNT$>
EPPData<rPos, DATA_EPP_LOWER_QUARTZ_THK$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_THK$> EPPData<rPos, DATA_EPP_LOWER_QUARTZ_THK$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_THK$>
EPPData<rPos, DATA_EPP_EXHAUST_THK$> = MetricData<1, DATA_EPP_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -159,36 +174,55 @@ GetReactorMetrics:
return return
SetupOLEControls: SetupOLEControls:
//Set Row Headers to invisible // Set Row Headers to invisible
Set_Property(ASMDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(ASMDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(HTRDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(HTRDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(EPPDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(EPPDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
//Set Number of columns for each table // Set Number of columns for each table
Set_Property(ASMDataTable, "OLE.Dimension", 6);*6 columns for ASM Data Table Set_Property(ASMDataTable, "OLE.Dimension", 7);*6 columns for ASM Data Table
Set_Property(HTRDataTable, "OLE.Dimension", 6);*6 columns for HTR Data Table Set_Property(HTRDataTable, "OLE.Dimension", 7);*6 columns for HTR Data Table
Set_Property(EPPDataTable, "OLE.Dimension", 7);*7 columns for EPP Data Table Set_Property(EPPDataTable, "OLE.Dimension", 8);*7 columns for EPP Data Table
//Set size of columns // Set size of all columns
ColSizeArray = '' ColSizeArray = ''
ColSizeArray<1> = 100 ColSizeArray<1> = 115
Set_Property(ASMDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(ASMDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(HTRDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(EPPDataTable, "OLE.DataColumn[All]", ColSizeArray)
// Shrink size of column 1
ColSizeArray<1> = 60
Set_Property(ASMDataTable, "OLE.DataColumn[1]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[1]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[1]", ColSizeArray)
// Set size of all columns
ColSizeArray = ''
ColSizeArray<1> = 125
Set_Property(EPPDataTable, "OLE.DataColumn[6]", ColSizeArray)
// Set autosize last column to true to fill out table width
ColSizeArray<1> = 125
ColSizeArray<4> = True$
Set_Property(ASMDataTable, "OLE.DataColumn[7]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[7]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[8]", ColSizeArray)
//Set ASM Table Col. Headers //Set ASM Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Wfr. Cnt.':@VM:'Susc. Thk':@VM:'Tube Wfr. Cnt.':@VM:'Tube Wfr. Thk':@VM:'Arm Wfr. Cnt.' HeaderTitles = 'Reactor#':@VM:'Susc. Wfr. Cnt.':@VM:'Susc. Thk':@VM:'Tube Wfr. Cnt.':@VM:'Tube Wfr. Thk':@VM:'Arm Wfr. Cnt.':@VM:'Exhaust Chamber Thk.'
Set_Property(ASMDataTable, "OLE.TitleList", HeaderTitles) Set_Property(ASMDataTable, "OLE.TitleList", HeaderTitles)
//Set HTR Table Col. Headers //Set HTR Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Tube Run Cnt.':@VM:'Tube Thk':@VM:'Arm Wfr. Cnt.' HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Tube Run Cnt.':@VM:'Tube Thk':@VM:'Arm Wfr. Cnt.':@VM:'Exhaust Chamber Thk.'
Set_Property(HTRDataTable, "OLE.TitleList", HeaderTitles) Set_Property(HTRDataTable, "OLE.TitleList", HeaderTitles)
//Set EPP Table Col. Headers //Set EPP Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Bell Jar Run Cnt.':@VM:'Bell Jar Thk':@VM:'Lower Quartz Run Cnt.':@VM:'Lower Quartz thk.' HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Bell Jar Run Cnt.':@VM:'Bell Jar Thk':@VM:'Lower Quartz Run Cnt.':@VM:'Lower Quartz thk.':@VM:'Exhaust Chamber Thk.'
Set_Property(EPPDataTable, "OLE.TitleList", HeaderTitles) Set_Property(EPPDataTable, "OLE.TitleList", HeaderTitles)
return return

View File

@ -50,11 +50,13 @@ Return Response or ""
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options // Service Parameter Options
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$ Options BOOLEAN = True$, False$
Options ENTITY_TYPES = 'REACTOR','REACTOR_LOG' Options ENTITY_TYPES = 'REACTOR','REACTOR_LOG'
Options ORDER_TYPES = 'INTRUSIVE_MAINT','CHANGEOVER','INITIATE_IDLE','IDLE','ASM_HTR_TUBE_CHANGE','ASM_HTR_ANNUAL_PM','ASM_HTR_SEMIANNUAL_PM','ASM_HTR_FIVE_AND_TEN_YEAR_PM','IQS_HGCV_ALARM','ABORT_ALARM' Options ORDER_TYPES = 'INTRUSIVE_MAINT','CHANGEOVER','INITIATE_IDLE','IDLE','ASM_HTR_TUBE_CHANGE','ASM_HTR_ANNUAL_PM','ASM_HTR_SEMIANNUAL_PM','ASM_HTR_FIVE_AND_TEN_YEAR_PM','IQS_HGCV_ALARM','ABORT_ALARM'
Options ORDER_STATUSES = 'new','creating','not-started','in-progress','cancelled','done' Options ORDER_STATUSES = 'new','in-edit','creating','not-started','in-progress','cancelled','done'
Options REACTOR_TYPES = 'ASM','ASM+','HTR','EPP' Options REACTOR_TYPES = 'ASM','ASM+','HTR','EPP'
Options ORDER_CHECKLIST_STATUSES = 'not-started','in-progress','paused','done'
Options NICA_CHECKLISTS = 'PROCESS_INTERRUPTION_FLOW_C_PRE','PROCESS_INTERRUPTION_FLOW_A_PRE','PROCESS_INTERRUPTION_FLOW_B_PRE','PROCESS_INTERRUPTION_LAST_KNOWN_PRODUCT_THICKNESS_SHEETRHO','PROCESS_INTERRUPTION_LAST_KNOWN_PRODUCT_VISUAL_INSPECTION','PROCESS_INTERRUPTION_TEST_WAFER','PROCESS_INTERRUPTION_ASM_PARTICLE_QUAL_VISUAL_INSPECTION','PROCESS_INTERRUPTION_HTR_PARTICLE_QUAL_VISUAL_INSPECTION','SUSCEPTOR_PREP','1_PCRC','2_PCRC','BD','INTRINSIC','SPV-FE','CLEANUP','TEST_WAFER_VERIFICATION','PARTICLE_QUAL_ASM','PARTICLE_QUAL_HTR','FIRST_PRODUCT_RUN_HGCV','FIRST_PRODUCT_RUN_THICK','PROCESS_INTERRUPTION_FLOW_B_POST'
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SERVICES // SERVICES
@ -85,6 +87,7 @@ Service GetOrderIds(EntityType=ENTITY_TYPES, EntityID, OrderTypes=ORDER_TYPES, O
For each Val in IsComplete using @VM For each Val in IsComplete using @VM
Query := @VM : Val Query := @VM : Val
Next Val Next Val
Query := @FM
end end
Btree.Extract(Query, Table, hDict, OrderKeys, Option, Flag) Btree.Extract(Query, Table, hDict, OrderKeys, Option, Flag)
If Flag NE 0 then If Flag NE 0 then
@ -106,6 +109,64 @@ Service GetOrderIds(EntityType=ENTITY_TYPES, EntityID, OrderTypes=ORDER_TYPES, O
End Service End Service
Service GetOrderChecklistIds(NicaOrdersIds, NicaChecklistIds=NICA_CHECKLISTS, IsComplete=BOOLEAN, ChecklistOrderStates=ORDER_CHECKLIST_STATUSES)
OrderChecklistIds = ''
ErrorMsg = ''
If ( (NicaOrdersIds NE '') or (IsComplete NE '') or (ChecklistOrderStates NE '') ) then
Open 'DICT.NICA_ORDERS_CHECKLISTS' to hDict then
Query = ''
Table = 'NICA_ORDERS_CHECKLISTS'
Option = 'E'
Flag = ''
If (NicaOrdersIds NE '') then
Query := 'NICA_ORDERS_ID'
For each NicaOrderId in NicaOrdersIds using @VM
Query := @VM : NicaOrderId
Next NicaOrderId
Query := @FM
end
If (NicaChecklistIds NE '') then
Query := 'NICA_CHECKLISTS_ID'
For each NicaChecklistId in NicaChecklistIds using @VM
Query := @VM : NicaChecklistId
Next NicaChecklistId
Query := @FM
end
If (IsComplete NE '') then
Query := 'IS_COMPLETE'
For each Val in IsComplete using @VM
Query := @VM : Val
Next Val
Query := @FM
end
If (ChecklistOrderStates NE '') then
Query := 'STATE'
For each ChecklistOrderState in ChecklistOrderStates using @VM
Query := @VM : ChecklistOrderState
Next ChecklistOrderState
Query := @FM
end
Btree.Extract(Query, Table, hDict, OrderChecklistIds, Option, Flag)
If Flag NE 0 then
ErrorMsg = 'Error in ':Service:' service. Btree.Extract call failed.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Failed to open DICT.NICA_ORDERS_CHECKLISTS.'
end
end else
ErrorMsg = 'Error in ':Service:' service. At least one search parameter must be provided.'
end
If ErrorMsg EQ '' then
Response = OrderChecklistIds
end else
Error_Services('Add', ErrorMsg)
end
end service
Service GetOrderUpdates() Service GetOrderUpdates()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
@ -188,13 +249,15 @@ end service
Service GetActiveOrders(EntityType=ENTITY_TYPES, EntityId, OrderTypes=ORDER_TYPES) Service GetActiveOrders(EntityType=ENTITY_TYPES, EntityId, OrderTypes=ORDER_TYPES)
Response = Nica_Orders_Services('GetOrderIds', EntityType, EntityID, OrderTypes, '#cancelled', False$:@VM:'') Response = Nica_Orders_Services('GetOrderIds', EntityType, EntityID, OrderTypes, '#cancelled', False$:@VM:'')
end service end service
Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES, OrderFlows, OrderResponseLevel, ChecklistIds) Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES, OrderFlows, OrderResponseLevel, ChecklistIds, Intrusive=BOOLEAN)
If Intrusive NE True$ then Intrusive = False$
ErrorMsg = '' ErrorMsg = ''
EntityTypes = 'REACTOR,REACTOR_LOG' EntityTypes = 'REACTOR,REACTOR_LOG'
@ -229,7 +292,39 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
LogData<3> = 'Attempting to create NICA order for entity ':EntityType:' ' :EntityID:' of type ':OrderType LogData<3> = 'Attempting to create NICA order for entity ':EntityType:' ' :EntityID:' of type ':OrderType
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderType) Begin Case
Case OrderType _EQC 'ABORT_ALARM'
OrderTypes = OrderType:@VM:'INTRUSIVE_MAINT'
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderTypes)
If CurrActiveOrders NE '' then
// If any active ABORT_ALARM orders are marked as intrusive (i.e., they were merged
// with an INTRUSIVE_MAINT order then mark the new order as intrusive).
ActiveOrdersIntrusive = Sum(Xlate('NICA_ORDERS', CurrActiveOrders, 'INTRUSIVE', 'X'))
If ActiveOrdersIntrusive then Intrusive = True$
end
Case OrderType _EQC 'INTRUSIVE_MAINT'
Intrusive = True$
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderType)
CurrActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, 'ABORT_ALARM')
If CurrActiveAbortAlarmOrders NE '' then
CurrActiveOrders<-1> = CurrActiveAbortAlarmOrders
// Merge INTRUSIVE_MAINT and ABORT_ALARM orders into one ABORT_ALARM order.
// Preserve ABORT_ALARM order flow ids for Reactor mode change logic that relies on these
// to determine whether or not to trigger a new ABORT/ALARM order when changing ABORT/ALARM sub modes.
OrderType = 'ABORT_ALARM'
OrderFlows = Xlate('NICA_ORDERS', CurrActiveAbortAlarmOrders, 'ORDER_FLOW_IDS', 'X')
OrderFlows = SRP_Array('Clean', OrderFlows, 'TrimAndMakeUnique', @VM)
end
Case Otherwise$
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderType)
End Case
OrderTypeAlreadyActive = (CurrActiveOrders NE '') OrderTypeAlreadyActive = (CurrActiveOrders NE '')
If ( (OrderTypeAlreadyActive EQ False$) or (OrderType EQ 'INTRUSIVE_MAINT') or (OrderType EQ 'ABORT_ALARM') ) then If ( (OrderTypeAlreadyActive EQ False$) or (OrderType EQ 'INTRUSIVE_MAINT') or (OrderType EQ 'ABORT_ALARM') ) then
@ -300,6 +395,17 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
end end
NewChecklistIds = SRP_Array('Clean', NewChecklistIds, 'TrimAndMakeUnique', @VM) NewChecklistIds = SRP_Array('Clean', NewChecklistIds, 'TrimAndMakeUnique', @VM)
If Intrusive then
// Remove checklist ids with REMOVE_IF_INRUSIVE flag set to True$
ChecklistIdsToRemove = Nica_Orders_Services('GetChecklistIds', '', '', '', '', '', '', True$)
If ChecklistIdsToRemove NE '' then
For each ChecklistIdToRemove in ChecklistIdsToRemove using @VM
Locate ChecklistIdToRemove in NewChecklistIds using @VM setting vPos then
NewChecklistIds = Delete(NewChecklistIds, 0, vPos, 0)
end
Next ChecklistIdToRemove
end
end
NewChecklistPriorities = Xlate('NICA_CHECKLISTS', NewChecklistIds, 'PRIORITY', 'X') NewChecklistPriorities = Xlate('NICA_CHECKLISTS', NewChecklistIds, 'PRIORITY', 'X')
ChecklistArray = NewChecklistIds:@FM:NewChecklistPriorities ChecklistArray = NewChecklistIds:@FM:NewChecklistPriorities
ChecklistArray = SRP_Array('SortRows', ChecklistArray, 'AR2', 'ARRAY', @FM, @VM) ChecklistArray = SRP_Array('SortRows', ChecklistArray, 'AR2', 'ARRAY', @FM, @VM)
@ -369,6 +475,7 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
end end
NicaOrderRec<NICA_ORDERS.ORDER_FLOW_IDS$> = OrderFlows NicaOrderRec<NICA_ORDERS.ORDER_FLOW_IDS$> = OrderFlows
NicaOrderRec<NICA_ORDERS.ORDER_RESPONSE_LEVEL$> = OrderResponseLevel NicaOrderRec<NICA_ORDERS.ORDER_RESPONSE_LEVEL$> = OrderResponseLevel
NicaOrderRec<NICA_ORDERS.INTRUSIVE$> = Intrusive
LogNicaOrderRec = NicaOrderRec LogNicaOrderRec = NicaOrderRec
Swap @FM with ',' in LogNicaOrderRec Swap @FM with ',' in LogNicaOrderRec
LogData = '' LogData = ''
@ -900,6 +1007,119 @@ Service GetAvailableFlowIds(NicaOrderType=ORDER_TYPES)
end service end service
Service AbortAlarmFromIntrusiveMaintRequired(ReactNo)
ErrorMsg = ''
AbortAlarmFromIntrusiveMaintRequired = ''
If ReactNo NE '' then
If RowExists('REACTOR', ReactNo) then
ActiveIntrusiveMaintOrderIds = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'INTRUSIVE_MAINT')
IntrusiveMaintOrderActive = (ActiveIntrusiveMaintOrderIds NE '')
If IntrusiveMaintOrderActive then
// If any FIRST_PRODUCT_RUN_THICK or FIRST_PRODUCT_RUN_HGCV associated with active INTRUSIVE_MAINT
// orders have been started or completed, then an ABORT/ALARM order should be triggerd.
ChecklistIdsToSearch = 'FIRST_PRODUCT_RUN_THICK':@VM:'FIRST_PRODUCT_RUN_HGCV'
InProcessOrCompleteOrderChecklistIds = Nica_Orders_Services('GetOrderChecklistIds', ActiveIntrusiveMaintOrderIds, ChecklistIdsToSearch, '', '#not-started')
AbortAlarmFromIntrusiveMaintRequired = (InProcessOrCompleteOrderChecklistIds NE '')
end else
AbortAlarmFromIntrusiveMaintRequired = False$
end
end else
ErrorMsg = 'Error in ':Service:' service. REACTOR ':ReactNo:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null ReactNo passed into service.'
end
If ErrorMsg EQ '' then
Response = AbortAlarmFromIntrusiveMaintRequired
end else
Error_Services('Add', ErrorMsg)
end
end service
Service GetChecklistIds(Priorities, NicaBaseInstructionIds, NicaOrderFlowIds, NicaOrderFlowTypes, ReactorTypes, RemoveIfComplete=BOOLEAN, RemoveIfIntrusive=BOOLEAN)
ChecklistIds = ''
ErrorMsg = ''
If ( (Priorities NE '') or (NicaBaseInstructionIds NE '') or (NicaOrderFlowIds NE '') or (NicaOrderFlowTypes NE '') |
or (ReactorTypes NE '') or (RemoveIfComplete NE '') or (RemoveIfIntrusive NE '') ) then
Open 'DICT.NICA_CHECKLISTS' to hDict then
Query = ''
Table = 'NICA_CHECKLISTS'
Option = 'E'
Flag = ''
If (Priorities NE '') then
Query := 'PRIORITY'
For each Priority in Priorities using @VM
Query := @VM : Priority
Next Priority
Query := @FM
end
If (NicaBaseInstructionIds NE '') then
Query := 'NICA_BASE_INSTRUCTION_ID'
For each NicaBaseInstructionId in NicaBaseInstructionIds using @VM
Query := @VM : NicaBaseInstructionId
Next NicaBaseInstructionId
Query := @FM
end
If (NicaOrderFlowIds NE '') then
Query := 'NICA_ORDER_FLOW_IDS'
For each NicaOrderFlowId in NicaOrderFlowIds using @VM
Query := @VM : NicaOrderFlowId
Next NicaOrderFlowId
Query := @FM
end
If (NicaOrderFlowTypes NE '') then
Query := 'NICA_ORDER_FLOW_TYPE'
For each NicaOrderFlowType in NicaOrderFlowTypes using @VM
Query := @VM : NicaOrderFlowType
Next NicaOrderFlowTypes
Query := @FM
end
If (ReactorTypes NE '') then
Query := 'REACTOR_TYPES'
For each NicaOrderFlowType in NicaOrderFlowTypes using @VM
Query := @VM : NicaOrderFlowType
Next NicaOrderFlowTypes
Query := @FM
end
If (RemoveIfComplete NE '') then
Query := 'REMOVE_IF_COMPLETE'
For each Val in RemoveIfComplete using @VM
Query := @VM : Val
Next RemoveIfComplete
Query := @FM
end
If (RemoveIfIntrusive NE '') then
Query := 'REMOVE_IF_INTRUSIVE'
For each Val in RemoveIfIntrusive using @VM
Query := @VM : Val
Next Val
Query := @FM
end
Btree.Extract(Query, Table, hDict, ChecklistIds, Option, Flag)
If Flag NE 0 then
ErrorMsg = 'Error in ':Service:' service. Btree.Extract call failed.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Failed to open DICT.NICA_CHECKLISTS.'
end
end else
ErrorMsg = 'Error in ':Service:' service. At least one search parameter must be provided.'
end
If ErrorMsg EQ '' then
Response = ChecklistIds
end else
Error_Services('Add', ErrorMsg)
end
end service
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -20,7 +20,7 @@ COMPILE FUNCTION obj_Post_Log(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services
@ -42,6 +42,13 @@ Headers = 'Logging DTM' : @FM : 'WOMatKey' : @FM : ' SAPBatchNo' : @FM : 'Fa
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJPOSTLOG'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJPOSTLOG'
end
ErrTitle = 'Error in Stored Procedure "obj_Post_Log"' ErrTitle = 'Error in Stored Procedure "obj_Post_Log"'
ErrorMsg = '' ErrorMsg = ''
@ -115,7 +122,10 @@ RETURN
* * * * * * * * * * * * * *
Post: Post:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'Post'
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
ServiceKeyID = 'Obj_Post_Log*Post' ServiceKeyID = 'Obj_Post_Log*Post'
Lock hSysLists, ServiceKeyID then Lock hSysLists, ServiceKeyID then
@ -228,6 +238,10 @@ Post:
Unlock hSysLists, ServiceKeyID else Null Unlock hSysLists, ServiceKeyID else Null
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -18,8 +18,8 @@ COMPILE FUNCTION obj_Reactor(Method,Parms)
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Mona_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Environment_Services, GetTickCount
$INSERT REACTOR_EQUATES $INSERT REACTOR_EQUATES
@ -28,6 +28,14 @@ $INSERT REACT_STATE_EQUATES
$INSERT REACT_ITEM_EQUATES $INSERT REACT_ITEM_EQUATES
$INSERT MSG_EQUATES $INSERT MSG_EQUATES
$insert REACTOR_CHILD_KEY_IDS_EQUATES $insert REACTOR_CHILD_KEY_IDS_EQUATES
$Insert LOGICAL
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJREACTOR'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJREACTOR'
end
ErrTitle = 'Error in Stored Procedure "obj_Reactor"' ErrTitle = 'Error in Stored Procedure "obj_Reactor"'
ErrorMsg = '' ErrorMsg = ''
@ -66,6 +74,9 @@ RETURN Result
CurrItem: CurrItem:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrItem'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
ItemType = Parms[COL2()+1,@RM] ItemType = Parms[COL2()+1,@RM]
ReactRec = Parms[COL2()+1,@RM] ReactRec = Parms[COL2()+1,@RM]
@ -96,6 +107,9 @@ LOCATE ItemType IN CurrInstTypes USING @VM SETTING Pos THEN
Result = FIELD(CurrInstItems<1,Pos>,'*',2) Result = FIELD(CurrInstItems<1,Pos>,'*',2)
END END
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -103,6 +117,9 @@ RETURN
CurrGraphite: CurrGraphite:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrGraphite'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
ReactRec = Parms[COL2()+1,@RM] ReactRec = Parms[COL2()+1,@RM]
@ -135,6 +152,9 @@ FOR I = 1 TO ciCnt
END END
NEXT I NEXT I
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -15,10 +15,10 @@ COMPILE FUNCTION obj_React_State(Method,Parms)
*/ */
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Database_Services DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Database_Services, Mona_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, Send_Dyn, Database_Services, Error_Services DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, Send_Dyn, Database_Services, Error_Services
Declare function Environment_Services, GetTickCount
$INSERT REACT_STATE_EQUATES $INSERT REACT_STATE_EQUATES
$INSERT PROD_SPEC_EQUATES $INSERT PROD_SPEC_EQUATES
@ -28,6 +28,12 @@ $INSERT LOGICAL
EQU CRLF$ TO \0D0A\ EQU CRLF$ TO \0D0A\
EQU TAB$ TO \09\ EQU TAB$ TO \09\
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJREACTSTATE'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJREACTSTATE'
end
ErrTitle = 'Error in Stored Procedure "obj_React_State"' ErrTitle = 'Error in Stored Procedure "obj_React_State"'
ErrorMsg = '' ErrorMsg = ''
@ -62,6 +68,9 @@ RETURN Result
ReactRunUnload: ReactRunUnload:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactRunUnload'
* Upadate all parameters set at Reactor Unload signature * * Upadate all parameters set at Reactor Unload signature *
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
@ -115,6 +124,9 @@ end
* otParms = FieldStore(otParms,@RM,4,0,RSRec) * otParms = FieldStore(otParms,@RM,4,0,RSRec)
* obj_Tables('WriteRec',otParms) * obj_Tables('WriteRec',otParms)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -20,9 +20,9 @@ COMPILE FUNCTION obj_React_Status(Method,Parms)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, Database_Services DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, Database_Services
DECLARE FUNCTION Error_Services, Environment_Services, Logging_Services, Override_Log_Services DECLARE FUNCTION Error_Services, Environment_Services, Logging_Services, Override_Log_Services, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Database_Services, Rlist DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Database_Services, Rlist
DECLARE SUBROUTINE Logging_Services DECLARE SUBROUTINE Logging_Services, Mona_Services
$INSERT LOGICAL $INSERT LOGICAL
$INSERT MSG_EQUATES $INSERT MSG_EQUATES
@ -43,6 +43,13 @@ LogFilename = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] :
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassNo' : @FM : 'RDSNo' : @FM : 'Load DTM' : @FM : 'Service' : @FM : 'Notes' Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassNo' : @FM : 'RDSNo' : @FM : 'Load DTM' : @FM : 'Service' : @FM : 'Notes'
objReactStatusLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) objReactStatusLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJREACTSTATUS'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJREACTSTATUS'
end
ErrTitle = 'Error in Stored Procedure "obj_React_Status"' ErrTitle = 'Error in Stored Procedure "obj_React_Status"'
ErrorMsg = '' ErrorMsg = ''
@ -125,6 +132,9 @@ RETURN
CassLoad: CassLoad:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CassLoad'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
WONo = Parms[COL2()+1,@RM] WONo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM] CassNo = Parms[COL2()+1,@RM]
@ -202,6 +212,9 @@ CassLoad:
IdleTime = OCONV(ICONV(IdleTime*24,'MD2'),'MD2,') IdleTime = OCONV(ICONV(IdleTime*24,'MD2'),'MD2,')
Result = IdleTime Result = IdleTime
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -209,7 +222,9 @@ RETURN
* * * * * * * * * * * * * *
CassUnload: CassUnload:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CassUnload'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
WONo = Parms[COL2()+1,@RM] WONo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM] CassNo = Parms[COL2()+1,@RM]
@ -270,6 +285,9 @@ CassUnload:
If Error_Services('HasError') then If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -277,7 +295,9 @@ RETURN
* * * * * * * * * * * * * *
ReactorLoad: ReactorLoad:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactorLoad'
* EpiPro Reactor Load * EpiPro Reactor Load
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
@ -361,13 +381,18 @@ ReactorLoad:
end else end else
ErrorMsg = 'Unable to read REACT_STATUS record ':ReactNo:' for update (':Method:').' ErrorMsg = 'Unable to read REACT_STATUS record ':ReactNo:' for update (':Method:').'
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
* * * * * * * * * * * * * *
ReactorUnload: ReactorUnload:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactorUnload'
* EpiPro Reactor Unload * EpiPro Reactor Unload
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
@ -431,6 +456,9 @@ ReactorUnload:
end else end else
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -28,11 +28,12 @@ Compile Function obj_WO_Mat(Method,Parms)
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
Declare Function Error_Services, Memberof, Datetime Declare Function Error_Services, Memberof, Datetime, GetTickCount
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
Declare Subroutine Logging_Services, Set_Property, Delete, Database_Services, SRP_Stopwatch, Material_Services Declare Subroutine Logging_Services, Set_Property, Delete, Database_Services, SRP_Stopwatch, Material_Services
Declare subroutine Mona_Services
$Insert MSG_EQUATES $Insert MSG_EQUATES
$Insert WO_MAT_EQUATES $Insert WO_MAT_EQUATES
@ -120,6 +121,13 @@ SAPFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SetS
SAPHeaders = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'SAPBatchNo' SAPHeaders = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'SAPBatchNo'
objSAPLog = Logging_Services('NewLog', SAPLogPath, SAPFileName, CRLF$, Comma$, SAPHeaders, '', False$, False$) objSAPLog = Logging_Services('NewLog', SAPLogPath, SAPFileName, CRLF$, Comma$, SAPHeaders, '', False$, False$)
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJWOMAT'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJWOMAT'
end
IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine' IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
IF NOT(ASSIGNED(Parms)) THEN Parms = '' IF NOT(ASSIGNED(Parms)) THEN Parms = ''
@ -633,6 +641,9 @@ RETURN
* * * * * * * * * * * * * *
CurrStatus: CurrStatus:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrStatus'
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM] IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM] IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
@ -894,6 +905,9 @@ CurrStatus:
IF Result = 'RTS' AND WOMatRec<WO_MAT_SHIP_HOLD$> = 1 THEN Result = 'SHOLD' IF Result = 'RTS' AND WOMatRec<WO_MAT_SHIP_HOLD$> = 1 THEN Result = 'SHOLD'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -5566,3 +5580,4 @@ ExpCOA:
RETURN RETURN

View File

@ -17,9 +17,9 @@ COMPILE FUNCTION obj_WO_Mat_Log(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, NextKey, Popup, Get_Property, obj_RDS, Database_Services DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, NextKey, Popup, Get_Property, obj_RDS, Database_Services
Declare function Logging_Services, Environment_Services, RTI_CreateGUID, Error_Services, Datetime Declare function Logging_Services, Environment_Services, RTI_CreateGUID, Error_Services, Datetime, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, Logging_Services, Database_Services, Lot_Event_Services DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, Logging_Services, Database_Services, Lot_Event_Services, Mona_Services
$INSERT MSG_EQUATES $INSERT MSG_EQUATES
$INSERT WO_MAT_LOG_EQUATES $INSERT WO_MAT_LOG_EQUATES
@ -49,6 +49,13 @@ Headers = 'Logging DTM'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJWOMATLOG'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJWOMATLOG'
end
ErrTitle = 'Error in Stored Procedure "obj_WO_Mat_Log"' ErrTitle = 'Error in Stored Procedure "obj_WO_Mat_Log"'
ErrorMsg = '' ErrorMsg = ''
@ -77,7 +84,9 @@ RETURN Result
* * * * * * * * * * * * * *
Create: Create:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'Create'
LogFile = Parms[1,@RM] LogFile = Parms[1,@RM]
TransDTM = Parms[COL2()+1,@RM] TransDTM = Parms[COL2()+1,@RM]
Action = Parms[COL2()+1,@RM] Action = Parms[COL2()+1,@RM]
@ -233,6 +242,8 @@ Create:
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -364,3 +375,4 @@ Post:
RETURN RETURN

View File

@ -15,8 +15,9 @@ COMPILE FUNCTION obj_WO_React(Method,Parms)
*/ */
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA Declare function Environment_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
$INSERT MSG_EQUATES $INSERT MSG_EQUATES
$INSERT WO_REACT_EQUATES $INSERT WO_REACT_EQUATES
@ -24,6 +25,7 @@ $INSERT PRS_STAGE_EQUATES
$INSERT WO_MAT_EQUATES $INSERT WO_MAT_EQUATES
$INSERT RDS_EQUATES $INSERT RDS_EQUATES
$INSERT QA_MET_EQUATES ;* Used in GetQAMet data structure return variable $INSERT QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
$Insert LOGICAL
ErrTitle = 'Error in Stored Procedure "obj_PRS_Prop"' ErrTitle = 'Error in Stored Procedure "obj_PRS_Prop"'
@ -40,6 +42,13 @@ END
Result = '' Result = ''
Log = '' Log = ''
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJWOREACT'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJWOREACT'
end
BEGIN CASE BEGIN CASE
CASE Method = 'AddRdsNo' ; GOSUB AddRdsNo CASE Method = 'AddRdsNo' ; GOSUB AddRdsNo
CASE Method = 'RemRdsNo' ; GOSUB RemRdsNo CASE Method = 'RemRdsNo' ; GOSUB RemRdsNo
@ -59,7 +68,10 @@ RETURN Result
* * * * * * * * * * * * * *
AddRdsNo: AddRdsNo:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'AddRdsNo'
WONo = Parms[1,@RM] WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM] StepNo = Parms[COL2()+1,@RM]
@ -135,13 +147,19 @@ obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REA
Result = Log Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
* * * * * * * * * * * * * *
RemRDSNo: RemRDSNo:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'RemRDSNo'
WONo = Parms[1,@RM] WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM] StepNo = Parms[COL2()+1,@RM]
@ -218,6 +236,9 @@ obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REA
Result = Log Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -1,7 +1,8 @@
Compile function Override_Log_Services(@Service, @Params) Compile function Override_Log_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert LOGICAL $Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert OVERRIDE_LOG_EQUATES $Insert OVERRIDE_LOG_EQUATES
Declare function Datetime, NextKey, Error_Services, SRP_Datetime Declare function Datetime, NextKey, Error_Services, SRP_Datetime
@ -22,9 +23,10 @@ Options OVERRIDE_TYPES = 'ROTR_BLOCK,UNSIGN,CLEAN_INSP,REACTOR_PROVE_IN,REAC
Service Create(Table, Key, OverrideUser, OverrideComment, OverrideType=OVERRIDE_TYPES, OverrideCause='') Service Create(Table, Key, OverrideUser, OverrideComment, OverrideType=OVERRIDE_TYPES, OverrideCause='')
RecKey = '' ErrorMsg = ''
RecKey = ''
for each TableName in Table using @VM setting TablePos for each TableName in Table using @VM setting TablePos
RecKey<1,-1> = Nextkey('OVERRIDE_LOG') RecKey = Nextkey('OVERRIDE_LOG')
orRec = '' orRec = ''
orRec<OVERRIDE_LOG_TABLE$> = Table<1, TablePos> orRec<OVERRIDE_LOG_TABLE$> = Table<1, TablePos>
orRec<OVERRIDE_LOG_KEY$> = Key<1, TablePos> orRec<OVERRIDE_LOG_KEY$> = Key<1, TablePos>
@ -45,6 +47,7 @@ Service Create(Table, Key, OverrideUser, OverrideComment, OverrideType=OVERRIDE_
End Service End Service
Service GetOverrideLogKeys(EntityId, Table, Type, User, DateTimeFrom, DateTimeTo) Service GetOverrideLogKeys(EntityId, Table, Type, User, DateTimeFrom, DateTimeTo)
If DateTimeFrom EQ '' OR Not(Num(DateTimeFrom)) Or DateTimeFrom GT DateTimeTo then If DateTimeFrom EQ '' OR Not(Num(DateTimeFrom)) Or DateTimeFrom GT DateTimeTo then
@ -77,7 +80,6 @@ Service GetOverrideLogKeys(EntityId, Table, Type, User, DateTimeFrom, DateTimeTo
Error_Services('Add', 'Error in ' : service : ' unable to open OVERRIDE_LOG dictionary.') Error_Services('Add', 'Error in ' : service : ' unable to open OVERRIDE_LOG dictionary.')
end end
Response = keylist Response = keylist
end service end service

View File

@ -143,7 +143,7 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
Declare subroutine Override_Services, Reactor_Services, Lot_Services Declare subroutine Override_Services, Reactor_Services, Lot_Services, Mona_Services
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
Declare function Min, Max, SRPSendMail, Btree.Extract, GetTickCount, HTTPClient_Services, Obj_RDS, SQL_Services Declare function Min, Max, SRPSendMail, Btree.Extract, GetTickCount, HTTPClient_Services, Obj_RDS, SQL_Services
@ -177,6 +177,13 @@ LogFilename = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] :
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassNo' : @FM : 'RDSNo' : @FM : 'Load DTM' : @FM : 'Service' : @FM : 'Notes' Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassNo' : @FM : 'RDSNo' : @FM : 'Load DTM' : @FM : 'Service' : @FM : 'Notes'
objReactStatusLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) objReactStatusLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_QASERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_QASERVICES'
end
GoToService else GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end end
@ -229,12 +236,6 @@ Service CalculateHgCVData(Datapoints)
Min = Min(Min, DataPoint) Min = Min(Min, DataPoint)
Max = Max(Max, DataPoint) Max = Max(Max, DataPoint)
// Edge Mean Delta // Edge Mean Delta
* If Index GE 6 AND Index LE 9 then
* Delta1 = Delta1 + DataPoint
* end
* If Index GE 2 AND Index LE 5 then
* Delta2 = Delta2 + DataPoint
* end
end end
// Range % // Range %
Locate Index in RangePoints using ',' setting unusedIndex then Locate Index in RangePoints using ',' setting unusedIndex then
@ -256,25 +257,15 @@ Service CalculateHgCVData(Datapoints)
EdgeMean4mm = Edge4mmSum / 4 EdgeMean4mm = Edge4mmSum / 4
EdgeMean10mm = Edge10mmSum / 4 EdgeMean10mm = Edge10mmSum / 4
If EdgeMean10mm GT 0 then If EdgeMean10mm GT 0 then
* Delta1Avg = Delta1/4
* Delta2Avg = Delta2/4
EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS
// Range % // Range %
Range = RangeMax - RangeMin Range = RangeMax - RangeMin
NumRangePoints = DCount(RangePoints, ',') NumRangePoints = DCount(RangePoints, ',')
RangeAvg = RangeAvg / NumRangePoints RangeAvg = RangeAvg / NumRangePoints
RangePct = (Range / RangeAvg) * 100 RangePct = (Range / RangeAvg) * 100
* EdgeMeanDelta = OConv(IConv(EdgeMeanDelta, 'MD3L'), 'MD3L')
* RangePct = OConv(IConv(RangePct, 'MD3L'), 'MD3L')
end end
// Average
Average = Sum / NumDataPoints Average = Sum / NumDataPoints
* Average = OConv(IConv(Average, 'MD3L'), 'MD3L')
* Min = OConv(IConv(Min, 'MD3L'), 'MD3L')
* Max = OConv(IConv(Max, 'MD3L'), 'MD3L')
FullAvg = '' FullAvg = ''
TotalDataPoints = DCount(DataPoints, @VM) TotalDataPoints = DCount(DataPoints, @VM)
If TotalDataPoints GT 0 then FullAvg = Sum(DataPoints)/DCount(DataPoints, @VM) If TotalDataPoints GT 0 then FullAvg = Sum(DataPoints)/DCount(DataPoints, @VM)
@ -361,25 +352,18 @@ Service PostROTRRequest(RDSNo)
If Flag EQ 0 then If Flag EQ 0 then
If RequestKeyID EQ '' then If RequestKeyID EQ '' then
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
FinalSigComp = False$ RequestDate = Date()
* FinalSigComp = Signature_Services('FinalSigComp', WOMatKey) RequestTime = Time()
If FinalSigComp NE True$ then RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
// This is a new request RequestRow = ''
RequestDate = Date() Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
RequestTime = Time() If Error_Services('NoError') then
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime // Log success
RequestRow = '' LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$) Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
If Error_Services('NoError') then end else
// Log success ErrorMessage = Error_Services('GetMessage')
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.' end
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'FQA signed for RDS ':RDSNo:' ignoring ROTR request.'
end
end else end else
ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.' ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.'
end end
@ -509,14 +493,7 @@ Service ProcessROTRRequest(RDSNo)
ResponseCopy = Response ResponseCopy = Response
Swap @FM with ',' in ResponseCopy Swap @FM with ',' in ResponseCopy
LogData<3> = 'ROTR Status response: ':Response LogData<3> = 'ROTR Status response: ':Response
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM) Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
* ROTRRec = ''
* ROTRRec<ROTR.REACTOR_STATUS$> = Response<1>
* ROTRRec<ROTR.REACTOR_STATUS_REASON$> = Response<2>
* ROTRRec<ROTR.REACTOR_NCR_COUNT$> = Response<3>
* ROTRRec<ROTR.REACTOR_ZERO_NCR_RUN_COUNT$> = Response<4>
* ROTRRec<ROTR.REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
* Database_Services('WriteDataRow', 'ROTR', LWICINo, ROTRRec, True$, False$, True$)
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS$> = Response<1> CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS$> = Response<1>
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2> CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2>
CIRec<CLEAN_INSP_ROTR_REACTOR_NCR_COUNT$> = Response<3> CIRec<CLEAN_INSP_ROTR_REACTOR_NCR_COUNT$> = Response<3>
@ -524,7 +501,6 @@ Service ProcessROTRRequest(RDSNo)
CIRec<CLEAN_INSP_ROTR_REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5> CIRec<CLEAN_INSP_ROTR_REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
// Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS). // Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS).
// That routine will recalculate the final ROTR status. // That routine will recalculate the final ROTR status.
* CIRec<CLEAN_INSP_ROTR_UPDATE_FLAG$> = True$
Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$) Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$)
end else end else
ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage') ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage')
@ -569,6 +545,7 @@ end service
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetROTRStatus(RDSKey) Service GetROTRStatus(RDSKey)
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
WONo = RDSRec<RDS_WO$> WONo = RDSRec<RDS_WO$>
RDSCassNo = RDSRec<RDS_CASS_NO$> RDSCassNo = RDSRec<RDS_CASS_NO$>
@ -1187,7 +1164,7 @@ return
Service ProcessWaferImageRequests() Service ProcessWaferImageRequests()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then Lock hSysLists, ServiceKeyID then
hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS') hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS')
@ -1218,12 +1195,7 @@ Service ProcessWaferImageRequests()
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X') Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X') PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
// Format Wafer Number for SQL Query // Format Wafer Number for SQL Query
WaferNo = TrimF(WaferNo) WaferNo = Fmt(TrimF(WaferNo), 'R(0)#2')
If WaferNo < 10 then
WaferNo = '*0' : WaferNo
end else
WaferNo = '*' : WaferNo
end
Query = "DECLARE @RDS varchar(10) " | Query = "DECLARE @RDS varchar(10) " |
: "DECLARE @RECIPE varchar(30) " | : "DECLARE @RECIPE varchar(30) " |
: "DECLARE @WFRID varchar(10) " | : "DECLARE @WFRID varchar(10) " |
@ -1245,7 +1217,7 @@ Service ProcessWaferImageRequests()
InsertDate = InsertDTM[1, 'F '] InsertDate = InsertDTM[1, 'F ']
Year = Field(InsertDate, '/', 3, 1) Year = Field(InsertDate, '/', 3, 1)
WorkWeek = 'WW':Date_Services('GetWeekNum', InsertDate) WorkWeek = 'WW':Date_Services('GetWeekNum', InsertDate)
PDFPath = WaferMapRoot:'_\':Year:'\':WorkWeek:'\':AttachmentID:'\image.pdf' PDFPath = WaferMapRoot:'\':Year:'\':WorkWeek:'\':AttachmentID:'\image.pdf'
Set_Status(0) Set_Status(0)
PDFFile = '' PDFFile = ''
OSRead PDFFile from PDFPath then OSRead PDFFile from PDFPath then
@ -1292,100 +1264,6 @@ Service ProcessWaferImageRequests()
end service end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessWaferImageRequests
//
// Service that attempts to process all wafer map image requests. These requests are queued in the
// WAFER_IMAGE_REQUESTS table.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessWaferImageRequestsOld()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS')
If Error_Services('NoError') then
Sentence = 'SELECT WAFER_IMAGE_REQUESTS WITH RESPONSE_DATE EQ "" BY REQUEST_DATE BY REQUEST_TIME'
Set_Status(0)
RList(Sentence, TARGET_ACTIVELIST$, '', '', '')
EOF = False$
Loop
ReadNext RequestKeyID else EOF = True$
Until EOF
RequestDate = Field(RequestKeyID, '*', 1)
RequestTime = Field(RequestKeyID, '*', 2)
RequestTime = RequestTime / 86400
RequestTime = RequestTime[3, 5]
RequestDTM = RequestDate:'.':RequestTime
CurrDTM = Datetime()
TimeInQueue = CurrDTM - RequestDTM
If TimeInQueue LT 1 then
Lock hWaferImageRequests, RequestKeyID then
EncodedPDF = ''
ResponseBody = ''
RequestRow = Database_Services('ReadDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID)
RDSNo = RequestRow<WAFER_IMAGE_REQUESTS.RDS_NO$>
WaferNo = RequestRow<WAFER_IMAGE_REQUESTS.WAFER_NO$>
TencorRecipe = RequestRow<WAFER_IMAGE_REQUESTS.TENCOR_RECIPE$>
ReturnPDF = RequestRow<WAFER_IMAGE_REQUESTS.RETURN_PDF$>
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
// Format Wafer Number for SQL Query
WaferNo = TrimF(WaferNo)
If WaferNo < 10 then
WaferNo = '*0' : WaferNo
end else
WaferNo = '*' : WaferNo
end
Query = "DECLARE @RDS varchar(10) " |
: "DECLARE @RECIPE varchar(30) " |
: "DECLARE @WFRID varchar(10) " |
: "SET @RDS = '":RDSNo:"' " |
: "SET @RECIPE = '":TencorRecipe:"' " |
: "SET @WFRID = '":WaferNo:"' " |
: "SELECT child.AttachmentID " |
: "FROM Metrology.dbo.TencorRunHeader header " |
: "INNER JOIN Metrology.dbo.TencorRunData child on header.id = child.headerid " |
: "WHERE header.rds = @RDS and header.recipe like @RECIPE + '%' and child.slot = @WFRID " |
: "ORDER BY header.insertDate DESC, child.slot ASC"
WaferMapDB = Environment_Services('GetMetrologyProductionPath')
AttachmentID = SQL_Services('GetDataRows', 'SPC', Query)
AttachmentID = SRP_Trim(AttachmentID, 'FB', '{}')
WaferMapRoot = Environment_Services('GetWaferMapProductionPath')
PDFPath = WaferMapRoot:'\':AttachmentID:'\image.pdf'
Set_Status(0)
PDFFile = ''
OSRead PDFFile from PDFPath then
// "Cache" PDF on app server
QA_Services('PostToWaferImageQueue', RDSNo, WaferNo, TencorRecipe, PDFFile)
If ReturnPDF EQ True$ then
ResponseBody = SRP_Encode(PDFFile)
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_BODY$> = ResponseBody
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_DATE$> = Date()
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_TIME$> = Time()
Database_Services('WriteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, RequestRow, True$)
end else
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
end
end else
ErrorCode = Status()
Error_Services('Add', 'Error retrieving wafer map image for AttachmentID ':AttachmentID)
end
Unlock hWaferImageRequests, RequestKeyID else Null
end
end else
// Delete request because wafer image may never become available.
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
end
Repeat
end
Unlock hSysLists, ServiceKeyID else Null
end
end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// PostToWaferImageQueue // PostToWaferImageQueue
// //
@ -1753,9 +1631,7 @@ Service ROTRImpactReport()
column = OleGetProperty( xlSht, 'Range' , 'K:K' ) column = OleGetProperty( xlSht, 'Range' , 'K:K' )
OlePutProperty( column , 'ColumnWidth' , '15' ) OlePutProperty( column , 'ColumnWidth' , '15' )
OlePutProperty( column , 'NumberFormat' , '0.0%' ) OlePutProperty( column , 'NumberFormat' , '0.0%' )
end end
end end
end service end service
@ -1802,6 +1678,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor) Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor)
StartTick = GetTickCount()
MetricName = 'PreEpiSignatureReady'
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then
ErrorMessage = 'RDSNo, Username, WaferQty, or Reactor not supplied in the ':Service:' service.' ErrorMessage = 'RDSNo, Username, WaferQty, or Reactor not supplied in the ':Service:' service.'
@ -1900,6 +1778,8 @@ Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -1916,6 +1796,8 @@ end service
// Reponse - True$ if PRE stage was successfully signed, False$ otherwise. // Reponse - True$ if PRE stage was successfully signed, False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry) Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignPreEpiStage'
Error_Services('Clear') Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then
@ -1967,71 +1849,66 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
PreEpiSig = RDSRec<RDS_PRE_EPI_SIG$> PreEpiSig = RDSRec<RDS_PRE_EPI_SIG$>
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X') ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
// Removing OI_SUPERUSER wrappers to alleviate signature issues. 11/18/19 djs
* IF MemberOf(Username, 'OI_SUPERUSER') THEN
IF ReactorType NE 'EPP' THEN IF ReactorType NE 'EPP' THEN
WOMatKey = WONo:'*':CassNo WOMatKey = WONo:'*':CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$> WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
SigAction = WOStep:'VER' SigAction = WOStep:'VER'
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos> WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS') CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
END ELSE END ELSE
WOMatSig = '' WOMatSig = ''
END END
RDSSig = PreEpiSig RDSSig = PreEpiSig
BEGIN CASE BEGIN CASE
CASE (WOMatSig EQ '') AND (RDSSig NE '') CASE (WOMatSig EQ '') AND (RDSSig NE '')
* Signature missing on WO_MAT * Signature missing on WO_MAT
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$> SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$> SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
* Sets VER signature * Sets VER signature
* obj_WO_Mat('SetSignature',owmParms) errCode = ''
errCode = '' IF Get_Status(errCode) THEN
IF Get_Status(errCode) THEN ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode Error_Services('Set', ErrorMsg)
Error_Services('Set', ErrorMsg) Response = False$
Response = False$ END else
END else Response = True$
Response = True$ end
end return
return
CASE (RDSSig = '') AND (WOMatSig NE '')
CASE (RDSSig = '') AND (WOMatSig NE '')
* Signature missing on RDS
* Signature missing on RDS CurrDate = CurrDTM[1,' ']
CurrDate = CurrDTM[1,' '] CurrTime = CurrDTM[COL2()+1,' ']
CurrTime = CurrDTM[COL2()+1,' '] RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D') RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT') Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) Response = True$
Response = True$ return
return
CASE RDSSig NE '' AND WOMatSig NE ''
CASE RDSSig NE '' AND WOMatSig NE ''
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.' Error_Services('Set', ErrorMessage)
Error_Services('Set', ErrorMessage) Response = False$
Response = False$ return
return
CASE Otherwise$
CASE Otherwise$ Null
Null
END CASE
END CASE
END ;* End of check for Reactor Type
END ;* End of check for Reactor Type
* END
SigDate = OCONV( Date(), 'D2/' ) SigDate = OCONV( Date(), 'D2/' )
SigTime = OCONV( Time(), 'MTS' ) SigTime = OCONV( Time(), 'MTS' )
@ -2045,7 +1922,6 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:Username:@RM:SigDate:' ':SigTime ;* Sets VER signature owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:Username:@RM:SigDate:' ':SigTime ;* Sets VER signature
* obj_WO_Mat('SetSignature',owmParms)
IF Get_Status(errCode) THEN IF Get_Status(errCode) THEN
ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMessage)
@ -2099,6 +1975,8 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -2118,6 +1996,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt) Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
StartTick = GetTickCount()
MetricName = 'LoadSignatureReady'
Error_Services('Clear') Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
@ -2188,7 +2068,7 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
return return
end end
end end
// Ensure recipe parameters (RDS Layer parameters) have been manually entered or automatically applied. // Ensure recipe parameters (RDS Layer parameters) have been manually entered or automatically applied.
LSParmsComp = Xlate('RDS', RDSNo, 'LS_PARMS_COMP', 'X') LSParmsComp = Xlate('RDS', RDSNo, 'LS_PARMS_COMP', 'X')
Buf1 = DCount(LSParmsComp, @VM) Buf1 = DCount(LSParmsComp, @VM)
@ -2210,16 +2090,8 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
return return
end end
//Added 8/18/2021 JRO - checks to make sure recipe limits aren't oos
* IF ParamOutOfSpec then
* IF Supplement NE True$ then
* ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* return
* end
* end
Locate True$ in ParamOutOfSpec using @VM setting oPos then Locate True$ in ParamOutOfSpec using @VM setting oPos then
IF Supplement NE True$ then IF Supplement NE True$ then
ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.' ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
Error_Services('Set', ErrorMsg) Error_Services('Set', ErrorMsg)
@ -2233,13 +2105,6 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
return return
end end
* IF (ReactorType = 'ASM+' OR ReactorType = 'HTR') AND (LoadLockVal EQ '') THEN
* ErrorMsg = 'Process Error: Load Lock Side must be set to either Left or Right before signing.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* return
* END
//Added JRO 3/16/2021 //Added JRO 3/16/2021
//Load Lock Required Check //Load Lock Required Check
@ -2313,50 +2178,27 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
Return Return
END END
If PreFlag EQ True$ then
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor
// using the barcode scanner, which attempts to sign both stages at once to save time.
Stage = 'VER'
end else
Stage = 'LOAD'
end
* IF ReactorType NE 'EPP' THEN If ReactorType EQ 'EPP' then
WOMatKey = ''
If PreFlag EQ True$ then end else
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor WOMatKey = WONo:'*':CassNo
// using the barcode scanner, which attempts to sign both stages at once to save time. end
Stage = 'VER'
end else Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
Stage = 'LOAD'
end If Error_Services('HasError') then
Response = False$
If ReactorType EQ 'EPP' then Return
WOMatKey = '' end
end else
WOMatKey = WONo:'*':CassNo
end
Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
If Error_Services('HasError') then
Response = False$
Return
end
! Deprecated 11/20/2019
* Set_Status(0)
* obj_WO_Mat('CheckSigOrder',WONo:'*':CassNo:@RM:WOStep:'LOAD')
* IF Get_Status(errCode) THEN
* ErrorMsg = 'Process Error: Error calling obj_WO_Mat("CheckSigOrder"). Error code: ':errCode
* Error_Services('Set', ErrorMsg)
* Response = False$
* RETURN
* END
* END ;* End of check for Epi Pro
// Deprecated in favor of stage specific supplements
* SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
* IF (SupplAckReq EQ True$) then
* ErrorMsg = 'The RDS Supplement must be acknowledged before the load operation can be signed.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* Return
* END
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$> SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$> SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$>
@ -2402,9 +2244,13 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service LoadExtra1stReady(RDSNo) Service LoadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2416,9 +2262,12 @@ Service LoadExtra1stReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnsignLoadExtra1stReady(RDSNo) Service UnsignLoadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2435,7 +2284,9 @@ Service UnsignLoadExtra1stReady(RDSNo)
end service end service
Service LoadExtra2ndReady(RDSNo) Service LoadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2447,9 +2298,12 @@ Service LoadExtra2ndReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnsignLoadExtra2ndReady(RDSNo) Service UnsignLoadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2463,8 +2317,10 @@ Service UnsignLoadExtra2ndReady(RDSNo)
Response = True$ Response = True$
end end
end end
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// SignLoadStage // SignLoadStage
// //
@ -2478,6 +2334,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry) Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignLoadStage'
Error_Services('Clear') Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
@ -2685,6 +2543,8 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -2700,6 +2560,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service UnloadSignatureReady(RDSNo, Username, Reactor) Service UnloadSignatureReady(RDSNo, Username, Reactor)
StartTick = GetTickCount()
MetricName = 'UnloadSignatureReady'
If (RDSNo EQ '') or (Username EQ '') or (Reactor EQ '') then If (RDSNo EQ '') or (Username EQ '') or (Reactor EQ '') then
ErrorMsg = 'RDSNo or Username or Reactor not supplied in the ':Service:' service.' ErrorMsg = 'RDSNo or Username or Reactor not supplied in the ':Service:' service.'
@ -2749,39 +2611,17 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
end end
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X') ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
If ReactorType EQ 'EPP' then
* IF ReactorType NE 'EPP' THEN WOMatKey = ''
end else
WOMatKey = WONo:'*':CassNo
If ReactorType EQ 'EPP' then end
WOMatKey = ''
end else Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
WOMatKey = WONo:'*':CassNo If Error_Services('HasError') then
end Response = False$
return
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo) end
If Error_Services('HasError') then
Response = False$
return
end
* END ELSE
*
* ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
* LOCATE 'LWI' IN ReactRunRec<REACT_RUN_CI_STAGE$> USING @VM SETTING Pos THEN
* CINo = ReactRunRec<REACT_RUN_CI_NO$>
* Actions = obj_Clean_Insp('GetActions',CINo)
* LOCATE 'Inspection' IN Actions<ACTION$ACTIONS> USING @FM SETTING Pos THEN
* IF Actions<ACTION$SIGS,1> = '' THEN
* ErrorMsg = 'Process Error: A Wafer Inspection is required and has not been completed.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* return
* END
* END
* END
*
* END ;* End of check for EpiPRO (EPP) reactor type
LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X') LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X')
If LWIInstAckReq EQ True$ then If LWIInstAckReq EQ True$ then
@ -2799,7 +2639,6 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
return return
end end
! Todo: We will have to define special logic for the barcode application to handle extra loads and unloads.
* Check for extra unloads without corresponding extra load * Check for extra unloads without corresponding extra load
IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN
IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN
@ -2869,9 +2708,13 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service UnloadExtra1stReady(RDSNo) Service UnloadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2883,9 +2726,12 @@ Service UnloadExtra1stReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature EQ '' AND LoadExtra1Signature EQ '' AND UnloadExtra2Signature EQ '' And LoadExtra2Signature eq '' and StandardUnloadSignature EQ '' then If StandardLoadSignature NE '' AND UnloadExtra1Signature EQ '' AND LoadExtra1Signature EQ '' AND UnloadExtra2Signature EQ '' And LoadExtra2Signature eq '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnloadExtra2ndReady(RDSNo) Service UnloadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2897,9 +2743,12 @@ Service UnloadExtra2ndReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnsignUnloadExtra1stReady(RDSNo) Service UnsignUnloadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2916,7 +2765,9 @@ Service UnsignUnloadExtra1stReady(RDSNo)
end service end service
Service UnsignUnloadExtra2ndReady(RDSNo) Service UnsignUnloadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2930,6 +2781,7 @@ Service UnsignUnloadExtra2ndReady(RDSNo)
Response = True$ Response = True$
end end
end end
end service end service
@ -2944,6 +2796,9 @@ end service
// Response - True$ if UNLOAD stage was successfully signed , False$ otherwise. // Response - True$ if UNLOAD stage was successfully signed , False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SignUnloadStage(RDSNo, Username, ScanEntry) Service SignUnloadStage(RDSNo, Username, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignUnloadStage'
If (RDSNo EQ '') or (Username EQ '') then If (RDSNo EQ '') or (Username EQ '') then
ErrorMsg = 'RDSNo or Username not supplied in the ':Service:' service.' ErrorMsg = 'RDSNo or Username not supplied in the ':Service:' service.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
@ -3016,7 +2871,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
* 4/30/2013 JCH added parms for merging of two methods * 4/30/2013 JCH added parms for merging of two methods
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'UNLOAD':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ReactID:@RM:ReactWH:@RM:ReactLoc:@RM:Tag owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'UNLOAD':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ReactID:@RM:ReactWH:@RM:ReactLoc:@RM:Tag
* obj_WO_Mat('SetSignature',owmParms)
IF Get_Status(errCode) THEN IF Get_Status(errCode) THEN
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within the ':Service:' service' ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within the ':Service:' service'
@ -3050,9 +2904,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
obj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo) obj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo)
IF Get_Status(errCode) THEN IF Get_Status(errCode) THEN
* ErrorMsg = 'Process Error: Error calling Obj_React_Status("CassUnload") within the ':Service:' service'
* Error_Services('Add', ErrorMsg)
* Response = False$
LogData = '' LogData = ''
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = @User4 LogData<2> = @User4
@ -3068,7 +2919,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
InCassettes = RDSRec<RDS_IN_CASS_NO$> InCassettes = RDSRec<RDS_IN_CASS_NO$>
InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM) InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)
obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo) obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)
//Reactor_Services('IncrementWfrMetrics', RDSNo)
end end
RDSRec<RDS_OPERATOR_OUT$> = SigBy RDSRec<RDS_OPERATOR_OUT$> = SigBy
@ -3141,6 +2991,8 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -3474,98 +3326,10 @@ Service SignFQAStage(RDSNo, Username)
END END
NEXT Index NEXT Index
END END
**********************************************
* Verify the FlatFinder information *
**********************************************
EpiPartNo = {EPI_PART_NO}
WaferSize = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X')
WaferSizeInch = Field(WaferSize, ' ', 3, 1)
CustNo = {CUST_NO}
CompanyRow = Xlate('COMPANY', CustNo, '', 'X')
WafersOut = {WFRS_OUT}
Begin Case
Case WaferSizeInch = '6'
WaferFlatSizeInches = CompanyRow<COMPANY_WAFER_FLAT_WAFER_SIZE_INCH$>
WaferFlatLengthMins = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MIN$>, 'MD1')
WaferFlatLengthMaxes = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MAX$>, 'MD1')
Locate WaferSizeInch in WaferFlatSizeInches using @VM setting vPos then
WaferFlatLengthMin = WaferFlatLengthMins<0, vPos>
WaferFlatLengthMax = WaferFlatLengthMaxes<0, vPos>
end else
WaferFlatLengthMin = ''
WaferFlatLengthMax = ''
end
// Get FlatFinder Read Value
* FlatFinderWafersQty = {FLATFINDER_WAFER_CNT}
FlatFinderWaferLength = {FLATFINDER_FLAT_LENGTH}
***************************************
* FlatFinder - Wafers Quatity Section *
***************************************
* If (FlatFinderWafersQty NE '') then
* If (FlatFinderWafersQty NE WafersOut) then
* ErrorMsg = 'Unable to sign FQA because Flat Finder and Wafers Out quantities do not match.'
* Error_Services('Add', ErrorMsg)
* return
* end
* end else
* ErrorMsg = 'Unable to sign FQA because the Flat Finder quantity is missing.'
* Error_Services('Add', ErrorMsg)
* return
* end
************************************
* FlatFinder - Flat Length Section *
************************************
If (WaferFlatLengthMin NE '') AND (WaferFlatLengthMax NE '') then
If (FlatFinderWaferLength NE '') then
If (FlatFinderWaferLength GE WaferFlatLengthMin) AND (FlatFinderWaferLength LE WaferFlatLengthMax) then
end else
ErrorMsg = 'Unable to sign FQA because Flat Finder wafer lengths are out of bounds.'
Error_Services('Add', ErrorMsg)
return
end
end else
ErrorMsg = 'Unable to sign FQA because the Flat Finder wafer length is missing.'
Error_Services('Add', ErrorMsg)
return
end
end
Case WaferSizeInch = '8'
// Get NotchFinder Read Value
* NotchFinderWafersQty = {FLATFINDER_WAFER_CNT}
*
* ***************************************
* * NotchFinder - Wafers Quatity Section *
* ***************************************
* If (NotchFinderWafersQty NE '') then
* If (NotchFinderWafersQty NE WafersOut) then
* ErrorMsg = 'Unable to sign FQA because Notch Finder and Wafers Out quantities do not match.'
* Error_Services('Add', ErrorMsg)
* return
* end
* end else
* ErrorMsg = 'Unable to sign FQA because the Notch Finder quantity is missing.'
* Error_Services('Add', ErrorMsg)
* return
* end
Case 1
End Case
************************* *************************
* Verify Wafer Quantity * * Verify Wafer Quantity *
************************* *************************
! The barcode application will need to inform the user that an override is required. We will return an error for
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan.
CassSchedWafers = {CASS_SHIP_QTY} CassSchedWafers = {CASS_SHIP_QTY}
WafersOut = {WFRS_OUT} WafersOut = {WFRS_OUT}
@ -3585,23 +3349,18 @@ Service SignFQAStage(RDSNo, Username)
end end
********************************* *********************************
* Verify NCR total >= USL Fails * * Verify NCR total >= USL Fails *
********************************* *********************************
! The barcode application will need to inform the user that an override is required. We will return an error for NCRStatus = QA_Services('GetNCRStatus', RDSNo)
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan. If NCRStatus EQ False$ then
If Username EQ 'FRANCOIS_R' then If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
NCRStatus = QA_Services('GetNCRStatus', RDSNo) ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
If NCRStatus EQ False$ then : 'number of wafers above the USL threshold. A lead or supervisor must override.'
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then Error_Services('Add', ErrorMsg)
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '| return
: 'number of wafers above the USL threshold. A lead or supervisor must override.' end
Error_Services('Add', ErrorMsg) end
return
end
end
end
************************* *************************
* Verify if Shift exist * * Verify if Shift exist *
@ -3663,21 +3422,19 @@ Service SignFQAStage(RDSNo, Username)
Next Test Next Test
****************************************** ******************************************
* Verify Unload Stage QA Metrology Tests * On hold until approved for release to production * Verify Unload Stage QA Metrology Tests *
****************************************** ******************************************
If Username EQ 'FRANCOIS_R' then WONo = {WO}
WONo = {WO} CassNo = {CASS_NO}
CassNo = {CASS_NO} WOMatQAKey = WONo : '*' : CassNo
WOMatQAKey = WONo : '*' : CassNo WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$> OutOfSpec = Sum(OutOfSpec)
OutOfSpec = Sum(OutOfSpec) If OutOfSpec GT 0 then
If OutOfSpec GT 0 then ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.' Error_Services('Add', ErrorMsg)
Error_Services('Add', ErrorMsg) return
return end
end
end
******************************************* *******************************************
* Verify if all steps have been completed * * Verify if all steps have been completed *
@ -3750,8 +3507,6 @@ Service SignFQAStage(RDSNo, Username)
;* 4/30/2013 JCH added parms for merging of two methods ;* 4/30/2013 JCH added parms for merging of two methods
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'QA':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ToolID:@RM:WHCd:@RM:LocCd:@RM:Tag owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'QA':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ToolID:@RM:WHCd:@RM:LocCd:@RM:Tag
* obj_WO_Mat('SetSignature',owmParms) ; * * * * * S I G N A T U R E * * * * * *
IF Get_Status(errCode) THEN IF Get_Status(errCode) THEN
ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
@ -3888,3 +3643,4 @@ ClearCursors:
return return

View File

@ -254,26 +254,23 @@ Event SIGN_BUTTON.CLICK()
end end
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP') RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X') ****************************************
If WCCheckEnabled then * Verify the Wafer Counter information *
**************************************** ****************************************
* Verify the Wafer Counter information * WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
**************************************** WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') *************************************
* Wafer Counter - Quantity Section *
************************************* *************************************
* Wafer Counter - Quantity Section * If (WaferCounterQty NE '') then
************************************* If (WaferCounterQty NE WafersOut) then
If (WaferCounterQty NE '') then ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
If (WaferCounterQty NE WafersOut) then
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
RETURN 0
end
end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0 RETURN 0
end end
end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0
end end
*********************************** ***********************************
@ -446,26 +443,21 @@ Event SIGN_BUTTON.CLICK()
****************************************** ******************************************
* Verify Unload Stage QA Metrology Tests * * Verify Unload Stage QA Metrology Tests *
****************************************** ******************************************
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
WOMatQAKey = WONo : '*' : CassNo
If (DevelopmentFlag EQ True$) then WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
WONo = Get_Property(@WINDOW:'.WO','DEFPROP') OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP') OutOfSpec = Sum(OutOfSpec)
WOMatQAKey = WONo : '*' : CassNo If OutOfSpec GT 0 then
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$> ErrorMsg = 'Process Error':@SVM
OutOfSpec = Sum(OutOfSpec) For each FailReason in FailReasons using @VM
If OutOfSpec GT 0 then ErrorMsg := FailReason:CRLF$
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$> Next FailReason
ErrorMsg = 'Process Error':@SVM ErrMsg(ErrorMsg)
For each FailReason in FailReasons using @VM Return
ErrorMsg := FailReason:CRLF$ end
Next FailReason
ErrMsg(ErrorMsg)
Return
end
end
******************************************* *******************************************
* Verify if all steps have been completed * * Verify if all steps have been completed *

View File

@ -115,7 +115,7 @@ AutoDisplayErrors = FALSE$ ; // Set this to True$ when debugging so all erro
Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON, Logging_Services Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON, Logging_Services
Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_SI_Keys, Obj_WO_Mat, Obj_WO_Mat_Log Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_SI_Keys, Obj_WO_Mat, Obj_WO_Mat_Log
Declare subroutine Dialog_Box, Obj_Notes, RList, Set_Status, Errmsg, Obj_React_Status , Reactor_Services Declare subroutine Dialog_Box, Obj_Notes, RList, Set_Status, Errmsg, Obj_React_Status , Reactor_Services
Declare subroutine Rds_Services, Obj_Post_Log Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
Declare function Memberof, Obj_WO_Mat, Obj_WO_Mat_Log, SRP_Array, DateTime, Dialog_Box, obj_Prod_Spec Declare function Memberof, Obj_WO_Mat, Obj_WO_Mat_Log, SRP_Array, DateTime, Dialog_Box, obj_Prod_Spec
@ -131,6 +131,13 @@ Headers = 'Logging DTM':@FM:'Ctrl':@FM:'Load/Calculate Time'
objCtrlLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$) objCtrlLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_RDSSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_RDSSERVICES'
end
GoToService else GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end end
@ -226,6 +233,8 @@ End Service
// to an RDS record. // to an RDS record.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service AddComment(RDSNo, Comment, UsernameOpt) Service AddComment(RDSNo, Comment, UsernameOpt)
StartTick = GetTickCount()
MetricName = 'AddComment'
RDSRow = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRow = Database_Services('ReadDataRow', 'RDS', RDSNo)
Username = @USER4 Username = @USER4
@ -247,7 +256,9 @@ Service AddComment(RDSNo, Comment, UsernameOpt)
oblParms := Values:@RM oblParms := Values:@RM
oblParms := "TOP" :@VM: "TOP" :@VM: "TOP" oblParms := "TOP" :@VM: "TOP" :@VM: "TOP"
obj_Post_Log('Create',oblParms) obj_Post_Log('Create',oblParms)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service End Service
@ -750,6 +761,9 @@ Service IsValidSubLot(RDSNo, RDSType, SupplierLot)
end service end service
Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO) Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
StartTick = GetTickCount()
MetricName = 'GetRDSRunHistoryByReactorAndWO'
table = "RDS" table = "RDS"
ErrorMessage = '' ErrorMessage = ''
RDSRecords = '' RDSRecords = ''
@ -783,10 +797,16 @@ Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
end end
Next RDS Next RDS
Response = FinalRDSSortedByAssignmentDTM<1> Response = FinalRDSSortedByAssignmentDTM<1>
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service IsTWLoggingReqd(RDSNo) Service IsTWLoggingReqd(RDSNo)
StartTick = GetTickCount()
MetricName = 'IsTWLoggingReqd'
IsTWReqd = False$ IsTWReqd = False$
ExistingTWRuns = Test_Run_Services('GetTestRunKeysByRDS', RDSNo) ExistingTWRuns = Test_Run_Services('GetTestRunKeysByRDS', RDSNo)
If ExistingTWRuns EQ '' then If ExistingTWRuns EQ '' then
@ -809,7 +829,7 @@ Service IsTWLoggingReqd(RDSNo)
Layer = Field(PRSPropKey, '*', 2) Layer = Field(PRSPropKey, '*', 2)
MeasureFreq = PRSPropRec<PRS_PROP_FREQ$> MeasureFreq = PRSPropRec<PRS_PROP_FREQ$>
Start = PRSPropRec<PRS_PROP_MET_START$> Start = PRSPropRec<PRS_PROP_MET_START$>
If WaferType NE 'Product' AND WaferType NE 'Prod' then If WaferType NE 'Product' AND WaferType NE 'Prod' AND WaferType NE '' then
BEGIN CASE BEGIN CASE
CASE MeasureFreq = 'F' AND ThisReactorRunOrder = 1 ; IsTWReqd = 1 CASE MeasureFreq = 'F' AND ThisReactorRunOrder = 1 ; IsTWReqd = 1
CASE ThisReactorRunOrder = Start ; IsTWReqd = 1 CASE ThisReactorRunOrder = Start ; IsTWReqd = 1
@ -847,6 +867,9 @@ Service IsTWLoggingReqd(RDSNo)
IsTWReqd = False$ IsTWReqd = False$
end end
Response = IsTWReqd Response = IsTWReqd
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service TestWaferRanAfterLoad(RDSNo) Service TestWaferRanAfterLoad(RDSNo)
@ -1099,6 +1122,8 @@ end service
Service CopyRDSLayerParameters(RDSNo) Service CopyRDSLayerParameters(RDSNo)
StartTick = GetTickCount()
MetricName = 'CopyRDSLayerParameters'
If (RDSNo NE '') then If (RDSNo NE '') then
RunOrderNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X') RunOrderNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
@ -1151,6 +1176,8 @@ Service CopyRDSLayerParameters(RDSNo)
Error_Services('Add', 'RDSNo not supplied in ':Service:' service.') Error_Services('Add', 'RDSNo not supplied in ':Service:' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -1828,3 +1855,5 @@ return

View File

@ -78,7 +78,7 @@ Declare function SRP_Math, SRP_Hash, SRP_JSON, Epi_Part_Services, Schedule_Se
Declare function Logging_Services, GetCommandLine, NextKey, Reactor_Log_Services, SRP_DateTime, ole_getwebpage Declare function Logging_Services, GetCommandLine, NextKey, Reactor_Log_Services, SRP_DateTime, ole_getwebpage
Declare function Datetime, Reactor_Modes_Services, Work_Order_Services, React_Mode_NG_Services, Lsl_Users_Services Declare function Datetime, Reactor_Modes_Services, Work_Order_Services, React_Mode_NG_Services, Lsl_Users_Services
Declare function SRP_Time, Rds_Services, SRP_Fastarray, Httpclient_Services, SRP_List, Utility, Memberof, Error_Services Declare function SRP_Time, Rds_Services, SRP_Fastarray, Httpclient_Services, SRP_List, Utility, Memberof, Error_Services
Declare function Nica_Orders_Services, Max, RTI_CreateGUID Declare function Nica_Orders_Services, Max, RTI_CreateGUID, GetTickCount
// Report paths for various performance report services. // Report paths for various performance report services.
TemplatesFolder = Environment_Services('GetApplicationRootPath') : '\Reports\Scheduler\Templates\' TemplatesFolder = Environment_Services('GetApplicationRootPath') : '\Reports\Scheduler\Templates\'
@ -91,6 +91,13 @@ LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_REACTORSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_REACTORSERVICES'
end
GoToService else GoToService else
end end
@ -101,7 +108,7 @@ Return Response else ''
// Service Parameter Options // Service Parameter Options
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$ Options BOOLEAN = True$, False$
Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT' Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT', 'EXHAUST_CHAMBER_THK'
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services // Services
@ -116,6 +123,8 @@ Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK'
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service IncrementWfrMetrics(RDSNo) Service IncrementWfrMetrics(RDSNo)
StartTick = GetTickCount()
MetricName = 'IncrementWfrMetrics'
// Get Reactor and run count details // Get Reactor and run count details
RDSRec = Xlate('RDS', RDSNo, '', 'X', '') RDSRec = Xlate('RDS', RDSNo, '', 'X', '')
@ -136,6 +145,7 @@ Service IncrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -150,6 +160,7 @@ Service IncrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -161,6 +172,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -176,6 +188,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -192,6 +205,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -206,11 +220,14 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec, 1, 0, 0) Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec, 1, 0, 0)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -229,6 +246,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$> ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$>
ResponseData<1, 7> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -236,6 +254,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount' ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness' ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount' ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'HTR' Case ReactorType EQ 'HTR'
ResponseData<1, 1> = ReactorID ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$> ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$>
@ -243,6 +262,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$> ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$>
ResponseData<1, 7> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -250,6 +270,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount' ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness' ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount' ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'EPP' Case ReactorType EQ 'EPP'
ResponseData<1, 1> = ReactorID ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$> ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$>
@ -258,6 +279,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_LOWER_QUARTZ_WFR$> ResponseData<1, 6> = ReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
ResponseData<1, 7> = ReactorRec<REACTOR_LOWER_QUARTZ_THK$> ResponseData<1, 7> = ReactorRec<REACTOR_LOWER_QUARTZ_THK$>
ResponseData<1, 8> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -266,6 +288,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 5> = 'BellJarThickness' ResponseData<2, 5> = 'BellJarThickness'
ResponseData<2, 6> = 'LowerQuartzWaferCount' ResponseData<2, 6> = 'LowerQuartzWaferCount'
ResponseData<2, 7> = 'LowerQuartzThickness' ResponseData<2, 7> = 'LowerQuartzThickness'
ResponseData<2, 8> = 'ExhuastChamberThickness'
End Case End Case
Response = ResponseData Response = ResponseData
end else end else
@ -307,6 +330,7 @@ Service DecrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -321,6 +345,7 @@ Service DecrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -332,6 +357,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -342,11 +368,12 @@ Service DecrementWfrMetrics(RDSNo)
ThkAddition = (WaferCount / 5) * TargetThickness ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk + ThkAddition NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk - ThkAddition
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -363,6 +390,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -377,6 +405,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -410,6 +439,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -435,6 +465,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -450,6 +481,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -466,6 +498,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -480,6 +513,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -513,6 +547,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -527,6 +562,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -538,6 +574,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -548,11 +585,12 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
ThkAddition = (WaferCount / 5) * TargetThickness ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk + ThkAddition NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk - ThkAddition
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -569,6 +607,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -583,6 +622,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -596,7 +636,7 @@ end service
// ResetWfrMetric // ResetWfrMetric
// //
// RDSNo. - [Required] // RDSNo. - [Required]
// MetricType - [Required]('TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT') // MetricType - [Required]('TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT', EXHAUST_CHAMBER_THK)
// //
// Reset a specified REACTOR metric to 0. // Reset a specified REACTOR metric to 0.
// //
@ -628,6 +668,9 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
Case MetricType = 'ARMS_WFR_CNT' Case MetricType = 'ARMS_WFR_CNT'
ReactorRec<REACTOR_ARMS_WFR_CNT$> = 0 ReactorRec<REACTOR_ARMS_WFR_CNT$> = 0
Case MetricType = 'EXHAUST_CHAMBER_THK'
ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = 0
End Case End Case
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec, 1, 0, 0) Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec, 1, 0, 0)
@ -1999,16 +2042,35 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
If ErrorMsg EQ '' then If ErrorMsg EQ '' then
AbortAlarmFeatureFlag = Xlate('FEATURE_FLAGS', 'NICA_ABORT_ALARM', FEATURE_FLAGS.ENABLED$, 'X') AbortAlarmFeatureFlag = Xlate('FEATURE_FLAGS', 'NICA_ABORT_ALARM', FEATURE_FLAGS.ENABLED$, 'X')
If AbortAlarmFeatureFlag EQ True$ then If AbortAlarmFeatureFlag EQ True$ then
If IntrMaintFeatureFlag EQ True$ then
AbortAlarmFromIntrusiveMaintRequired = Nica_Orders_Services('AbortAlarmFromIntrusiveMaintRequired', ReactNo)
ActiveIntrusiveMaintChecklists = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'INTRUSIVE_MAINT')
IntrusiveMaintChecklistActive = (ActiveIntrusiveMaintChecklists NE '')
end else
AbortAlarmFromIntrusiveMaintRequired = False$
IntrusiveMaintChecklistActive = False$
end
ModeSubCatFlowId = Xlate('REACT_PROB_CAT', ModeSubCatId, REACT_PROB_CAT_ABORT_ALARM_FLOW_ID$, 'X') ModeSubCatFlowId = Xlate('REACT_PROB_CAT', ModeSubCatId, REACT_PROB_CAT_ABORT_ALARM_FLOW_ID$, 'X')
ModeSubCatRespLvl = Xlate('REACT_PROB_CAT', ModeSubCatId, REACT_PROB_CAT_ABORT_ALARM_RESPONSE_LEVEL$, 'X') ModeSubCatRespLvl = Xlate('REACT_PROB_CAT', ModeSubCatId, REACT_PROB_CAT_ABORT_ALARM_RESPONSE_LEVEL$, 'X')
AbortAlarmComp = Xlate('REACTOR', ReactNo, REACTOR_ABORT_ALARM_COMPLETE$, 'X') AbortAlarmComp = Xlate('REACTOR', ReactNo, REACTOR_ABORT_ALARM_COMPLETE$, 'X')
ActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM') ActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM')
AbortAlarmOrderActive = (ActiveAbortAlarmOrders NE '') AbortAlarmOrderActive = (ActiveAbortAlarmOrders NE '')
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', ModeSubCatFlowId, 'ABORT_ALARM', ReactorType)
CreateAbortAlarmOrder = False$
Intrusive = False$
Begin Case Begin Case
Case ( AbortAlarmOrderActive and (SelE10State _EQC 'Productive') ) Case ( AbortAlarmOrderActive and (SelE10State _EQC 'Productive') )
ErrorMsg = "An ABORT/ALARM Checklist is active for this reactor and must be completed or overridden in order to change to a productive state." ErrorMsg = "An ABORT/ALARM Checklist is active for this reactor and must be completed or overridden in order to change to a productive state."
Case ( AbortAlarmOrderActive and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') ) Case ( AbortAlarmFromIntrusiveMaintRequired and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') and (ChecklistIds NE '') )
// INTRUSIVE_MAINT FIRST_PRODUCT_RUN_THICK or FIRST_PRODUCT_RUN_HGCV checklist started and
// ABORT/ALARM mode entered, so create an ABORT/ALARM order to contain product in reactor.
CreateAbortAlarmOrder = True$
Intrusive = True$
Case ( Not(IntrusiveMaintChecklistActive) and AbortAlarmOrderActive and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') )
// If there is an active ABORT/ALARM NICA order, then we need to check if the new sub mode is different than the sub mode entered when the ABORT/ALARM // If there is an active ABORT/ALARM NICA order, then we need to check if the new sub mode is different than the sub mode entered when the ABORT/ALARM
// NICA order was created and is of a higher response level or the new mode is WAITING_FOR_OPERATOR and the sub mode has changed. This means the maintenance // NICA order was created and is of a higher response level or the new mode is WAITING_FOR_OPERATOR and the sub mode has changed. This means the maintenance
// team deemed the true ABORT/ALARM root cause was different than the cause the operators selected. // team deemed the true ABORT/ALARM root cause was different than the cause the operators selected.
@ -2020,26 +2082,26 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
Next ActiveAbortAlarmRespLvl Next ActiveAbortAlarmRespLvl
If ( (Mode _EQC 'WAITING_FOR_OPERATOR') and (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) ) | If ( (Mode _EQC 'WAITING_FOR_OPERATOR') and (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) ) |
or ( (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) and (ModeSubCatRespLvl GT MaxActiveRespLvl) ) then or ( (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) and (ModeSubCatRespLvl GT MaxActiveRespLvl) ) then
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', ModeSubCatFlowId, 'ABORT_ALARM', ReactorType)
If ChecklistIds NE '' then If ChecklistIds NE '' then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds) CreateAbortAlarmOrder = True$
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
end end
end end
Case ( Not(AbortAlarmComp) and Not(AbortAlarmOrderActive) and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') ) Case ( Not(IntrusiveMaintChecklistActive) and Not(AbortAlarmComp) and Not(AbortAlarmOrderActive) and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') and (ChecklistIds NE '') )
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X') // Typical ABORT/ALARM case
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', ModeSubCatFlowId, 'ABORT_ALARM', ReactorType) CreateAbortAlarmOrder = True$
If ChecklistIds NE '' then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds)
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
end
Case Otherwise$ Case Otherwise$
// Don't create an ABORT/ALARM NICA order // Don't create an ABORT/ALARM NICA order
Null Null
End Case End Case
If CreateAbortAlarmOrder then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds, Intrusive)
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
end
end end
end end
@ -3552,6 +3614,8 @@ end service
Service GetReactorAvailChamberCount(ReactNo) Service GetReactorAvailChamberCount(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetReactorAvailChamberCount'
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ' ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
AvailableChamberCount = 0 AvailableChamberCount = 0
@ -3571,6 +3635,8 @@ Service GetReactorAvailChamberCount(ReactNo)
end end
Response = AvailableChamberCount Response = AvailableChamberCount
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -4289,3 +4355,4 @@ ClearCursors:
return return

View File

@ -140,7 +140,7 @@ WRITE_RECORD_PRE:
// Req'd parameter checks // Req'd parameter checks
ItemType = {RI_TYPE} ItemType = {RI_TYPE}
* If ItemType EQ '' then ErrMsg := 'Item Type was not specified. ' If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
If ErrMsg NE '' then If ErrMsg NE '' then
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg) Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)

View File

@ -79,6 +79,7 @@ Service CreateReturnToFabRecord(CassId, UserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = UserId Recipients<1, -1> = UserId
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Created' Subject = 'Return To Fab Form Created'
@ -475,6 +476,7 @@ Service SetBinToBin(RTFId, MHUserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFOrigUser Recipients<1, -1> = RTFOrigUser
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Updated' Subject = 'Return To Fab Form Updated'
@ -549,6 +551,7 @@ Service SetRTFCompleted(RTFId, CompleteUserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$> Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$>
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Completed' Subject = 'Return To Fab Form Completed'
@ -623,6 +626,7 @@ Service SetEvalInfo(RTFId, EvalUserId, ResultId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$> Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$>
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Updated' Subject = 'Return To Fab Form Updated'
@ -822,3 +826,4 @@ end service

View File

@ -45,9 +45,9 @@ $insert RDS_EQUATES
$insert SCAN_SETUP $insert SCAN_SETUP
Declare Function Scan_Services, Database_Services, QA_Services, Datetime, RDS_Services, SRP_Array, SRP_Stopwatch Declare Function Scan_Services, Database_Services, QA_Services, Datetime, RDS_Services, SRP_Array, SRP_Stopwatch
Declare function Logging_Services, Environment_Services Declare function Logging_Services, Environment_Services, GetTickCount
Declare Subroutine Scan_Services, Database_Services, QA_Services, obj_WO_Mat_Log, SRP_Stopwatch Declare Subroutine Scan_Services, Database_Services, QA_Services, obj_WO_Mat_Log, SRP_Stopwatch
Declare Subroutine Logging_Services Declare Subroutine Logging_Services, Mona_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ScanAPI\APIResponseTime'; //Define the directory where the log will be saved to. This happens the first time of the day that the log is written to. LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ScanAPI\APIResponseTime'; //Define the directory where the log will be saved to. This happens the first time of the day that the log is written to.
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -57,6 +57,13 @@ LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ScanAPIResponseTimes.csv'; //Define the file name that will get created. LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ScanAPIResponseTimes.csv'; //Define the file name that will get created.
Headers = 'Logging DTM' : @FM : 'API' : @FM : 'ResponseTime' : @FM : 'ScanID' : @FM : 'ScanData' : @VM : 'StatusCode' ; //Define the column names in the log file, delimited by a Field Mark. Headers = 'Logging DTM' : @FM : 'API' : @FM : 'ResponseTime' : @FM : 'ScanID' : @FM : 'ScanData' : @VM : 'StatusCode' ; //Define the column names in the log file, delimited by a Field Mark.
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$); //Actually creates the log. objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$); //Actually creates the log.
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SCANAPI'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SCANAPI'
end
GoToAPI else GoToAPI else
// The specific resource endpoint doesn't have a API handler yet. // The specific resource endpoint doesn't have a API handler yet.
@ -72,16 +79,25 @@ Return Response OR ''
API scan.POST API scan.POST
StartTick = GetTickCount()
MetricName = 'SCAN_POST'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_POST_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_POST_RESPONSE_TIME')
ScanID = Scan_Services('CreateScansRow') ScanID = Scan_Services('CreateScansRow')
If Error_Services('NoError') then If Error_Services('NoError') then
StatusCode = 201 StatusCode = 201
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_POST_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_POST_RESPONSE_TIME')
TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_POST_RESPONSE_TIME') TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_POST_RESPONSE_TIME')
LogData = '' LogData = ''
@ -100,6 +116,9 @@ end api
API scan.ID.POST API scan.ID.POST
StartTick = GetTickCount()
MetricName = 'SCAN_ID_POST'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_POST_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_ID_POST_RESPONSE_TIME')
ScanID = EndpointSegment ScanID = EndpointSegment
@ -112,13 +131,20 @@ API scan.ID.POST
If Error_Services('NoError') then If Error_Services('NoError') then
StatusCode = 200 StatusCode = 200
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 400, Message) HTTP_Services('SetResponseStatus', 400, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
end else end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.') HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
end Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME')
TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_POST_RESPONSE_TIME') TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_POST_RESPONSE_TIME')
LogData = '' LogData = ''
@ -143,11 +169,19 @@ end api
API scan.ID.HEAD API scan.ID.HEAD
API scan.ID.GET API scan.ID.GET
StartTick = GetTickCount()
MetricName = 'SCAN_ID_GET'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_GET_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_ID_GET_RESPONSE_TIME')
ScanID = EndpointSegment ScanID = EndpointSegment
StatusCode = 200 StatusCode = 200
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME')
TotalGetResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_GET_RESPONSE_TIME') TotalGetResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_GET_RESPONSE_TIME')
LogData = '' LogData = ''
@ -166,6 +200,9 @@ end api
API scan.ID.DELETE API scan.ID.DELETE
StartTick = GetTickCount()
MetricName = 'SCAN_ID_DELETE'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_DELETE_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_ID_DELETE_RESPONSE_TIME')
ScanID = EndpointSegment ScanID = EndpointSegment
@ -176,17 +213,25 @@ API scan.ID.DELETE
Database_Services('DeleteDataRow', 'SCANS', ScanID, True$, False$) Database_Services('DeleteDataRow', 'SCANS', ScanID, True$, False$)
If Error_Services('NoError') then If Error_Services('NoError') then
HTTP_Services('SetResponseStatus', 200) HTTP_Services('SetResponseStatus', 200)
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
end else end else
HTTP_Services('SetResponseStatus', 403, 'This scan is already accepted and cannot be deleted.') HTTP_Services('SetResponseStatus', 403, 'This scan is already accepted and cannot be deleted.')
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end end
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 404, Message) HTTP_Services('SetResponseStatus', 404, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_DELETE_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_DELETE_RESPONSE_TIME')
TotalDeleteResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_DELETE_RESPONSE_TIME') TotalDeleteResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_DELETE_RESPONSE_TIME')
LogData = '' LogData = ''
@ -205,7 +250,9 @@ end api
API scan.ID.PATCH API scan.ID.PATCH
StartTick = GetTickCount()
MetricName = 'SCAN_ID_PATCH'
// This is where scans are ultimately accepted for final processing. We will need to determine which type // This is where scans are ultimately accepted for final processing. We will need to determine which type
// of scan this is (i.e. Location, Pre-Epi + Load, or Unload). This will be determined by the data coming in and the // of scan this is (i.e. Location, Pre-Epi + Load, or Unload). This will be determined by the data coming in and the
// current status of the lot. For example a Location scan would only have an RDS, location code, and username. // current status of the lot. For example a Location scan would only have an RDS, location code, and username.
@ -232,14 +279,17 @@ API scan.ID.PATCH
If Error_Services('NoError') then If Error_Services('NoError') then
StatusCode = 200 StatusCode = 200
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
SRP_JSON(hBody, 'Release') SRP_JSON(hBody, 'Release')
end else end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.') HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
end else end else
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason') ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
@ -249,11 +299,17 @@ API scan.ID.PATCH
end else end else
Message = 'Unable to parse the JSON scan resource.' Message = 'Unable to parse the JSON scan resource.'
HTTP_Services('SetResponseStatus', 400, Message) HTTP_Services('SetResponseStatus', 400, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 404, Message) HTTP_Services('SetResponseStatus', 404, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_PATCH_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_PATCH_RESPONSE_TIME')
TotalPatchResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PATCH_RESPONSE_TIME') TotalPatchResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PATCH_RESPONSE_TIME')
LogData = '' LogData = ''
@ -272,6 +328,8 @@ end api
API scan.ID.PUT API scan.ID.PUT
StartTick = GetTickCount()
MetricName = 'SCAN_ID_PUT'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_PUT_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_ID_PUT_RESPONSE_TIME')
@ -314,17 +372,25 @@ API scan.ID.PUT
Database_Services('WriteDataRow', 'SCANS', ScanID, ScanRow, True$, False$, True$) Database_Services('WriteDataRow', 'SCANS', ScanID, ScanRow, True$, False$, True$)
If Error_Services('NoError') then If Error_Services('NoError') then
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
SRP_JSON(hBody, 'Release') SRP_JSON(hBody, 'Release')
end else end else
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the scanData JSON.') HTTP_Services('SetResponseStatus', 400, 'Unable to parse the scanData JSON.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
end else end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.') HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_PUT_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_PUT_RESPONSE_TIME')
TotalPutResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PUT_RESPONSE_TIME') TotalPutResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PUT_RESPONSE_TIME')
LogData = '' LogData = ''
@ -339,7 +405,6 @@ API scan.ID.PUT
end end
LogData<6> = ResponseStatusCode LogData<6> = ResponseStatusCode
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end api end api
@ -378,3 +443,4 @@ CreateHALItem:
end end
return return

View File

@ -47,9 +47,10 @@ Declare Function Scan_Services, Memory_Services, Database_Services, SRP_JSON,
Declare Function QA_Services, Error_Services, Security_Services, SRP_Array, obj_WO_Mat, Memberof, Override_Log_Services Declare Function QA_Services, Error_Services, Security_Services, SRP_Array, obj_WO_Mat, Memberof, Override_Log_Services
Declare Function Keyboard_Sim_Services, Environment_Services, Logging_Services, Reactor_Services, Supplement_Services Declare Function Keyboard_Sim_Services, Environment_Services, Logging_Services, Reactor_Services, Supplement_Services
Declare function Test_Run_Services, Lot_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services Declare function Test_Run_Services, Lot_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services
Declare function GetTickCount
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services, Mona_Services
Equ CRLF$ to \0D0A\ Equ CRLF$ to \0D0A\
@ -61,6 +62,13 @@ Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'User' : @FM : 'CurrSta
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SCANSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SCANSERVICES'
end
GoToService else GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
end end
@ -200,6 +208,8 @@ end service
// Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue. // Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetScansRow(ScanID, ReturnJSON) Service GetScansRow(ScanID, ReturnJSON)
StartTick = GetTickCount()
MetricName = 'GetScansRow'
ScansRow = '' ScansRow = ''
@ -214,6 +224,8 @@ Service GetScansRow(ScanID, ReturnJSON)
Response = ScansRow Response = ScansRow
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -223,6 +235,8 @@ end service
// Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue. // Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SetScansRow(ScanID, ScansRow) Service SetScansRow(ScanID, ScansRow)
StartTick = GetTickCount()
MetricName = 'SetScansRow'
If (ScanID NE '') AND (ScansRow NE '') then If (ScanID NE '') AND (ScansRow NE '') then
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow) Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow)
@ -230,6 +244,8 @@ Service SetScansRow(ScanID, ScansRow)
Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.') Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -242,6 +258,8 @@ end service
// evaluated on a case by case basis. // evaluated on a case by case basis.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service ProcessScanData(ScanID, ScanJSON) Service ProcessScanData(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'ProcessScanData'
If ( (ScanID NE '') AND (ScanJSON NE '') ) then If ( (ScanID NE '') AND (ScanJSON NE '') ) then
hScanJSON = '' hScanJSON = ''
@ -1285,8 +1303,10 @@ Service ProcessScanData(ScanID, ScanJSON)
SRP_JSON(hScanJSON, 'Release') SRP_JSON(hScanJSON, 'Release')
end else end else
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.') Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -1295,6 +1315,9 @@ end service
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service AcceptScan(ScanID, ScanJSON) Service AcceptScan(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'AcceptScan'
If ( (ScanID NE '') and (ScanJSON NE '') ) then If ( (ScanID NE '') and (ScanJSON NE '') ) then
hBody = '' hBody = ''
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON) ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
@ -1649,6 +1672,8 @@ Service AcceptScan(ScanID, ScanJSON)
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.') Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -1659,6 +1684,8 @@ end service
// HAL+JSON properties will be added to the JSON object. // HAL+JSON properties will be added to the JSON object.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service ConvertMVScanToJSON(ScanID, mvScan, itemURL) Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
StartTick = GetTickCount()
MetricName = 'ConvertMVScanToJSON'
jsonScan = '' jsonScan = ''
@ -2160,6 +2187,8 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
Response = jsonScan Response = jsonScan
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -2396,9 +2425,3 @@ ClearCursors:
return return

View File

@ -55,15 +55,23 @@ EQU NOTIFICATION_PERIOD$ TO 12
Declare subroutine Error_Services, Schedule_Services, Memory_Services, RList, Database_Services, Logging_Services Declare subroutine Error_Services, Schedule_Services, Memory_Services, RList, Database_Services, Logging_Services
Declare subroutine Btree.Extract, Set_Status, Reduce, FSMsg, Messaging_Services, obj_Notes, Make.List Declare subroutine Btree.Extract, Set_Status, Reduce, FSMsg, Messaging_Services, obj_Notes, Make.List
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 Declare function SRP_Time, Lsl_Users_Services, GetTickCount
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'
Headers = 'Logging DTM' : @FM : 'Service Step' : @FM : 'Service Notes' Headers = 'Logging DTM' : @FM : 'Service Step' : @FM : 'Service Notes'
ColumnWidths = 20 : @FM : 30 : @FM : 150 ColumnWidths = 20 : @FM : 30 : @FM : 150
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SCHEDULESERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SCHEDULESERVICES'
end
GoToService else GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
@ -795,6 +803,8 @@ end service
Service GetCurrentEvent(ReactNo) Service GetCurrentEvent(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetCurrentEvent'
SchedDetKey = '' SchedDetKey = ''
If ReactNo NE '' then If ReactNo NE '' then
@ -814,9 +824,14 @@ Service GetCurrentEvent(ReactNo)
GoSub ClearCursors GoSub ClearCursors
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CurrentEventIsBlock(ReactNo) Service CurrentEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'CurrentEventIsBlock'
If ReactNo NE '' then If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -838,9 +853,15 @@ Service CurrentEventIsBlock(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetNextEvent(ReactNo) Service GetNextEvent(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetNextEvent'
SchedDetKey = '' SchedDetKey = ''
If ReactNo NE '' then If ReactNo NE '' then
CurrDTM = Datetime() CurrDTM = Datetime()
@ -870,6 +891,9 @@ Service GetNextEvent(ReactNo)
end end
GoSub ClearCursors GoSub ClearCursors
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetEngagedEvent(ReactNo) Service GetEngagedEvent(ReactNo)
@ -919,6 +943,9 @@ Service GetLastEngagedEvent(ReactNo)
end service end service
Service NextEventIsSamePsn(ReactNo) Service NextEventIsSamePsn(ReactNo)
StartTick = GetTickCount()
MetricName = 'NextEventIsSamePsn'
Response = False$ Response = False$
If ReactNo NE '' then If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -962,9 +989,15 @@ Service NextEventIsSamePsn(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service NextEventIsBlock(ReactNo) Service NextEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'NextEventIsBlock'
If ReactNo NE '' then If ReactNo NE '' then
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo) NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
@ -986,6 +1019,9 @@ Service NextEventIsBlock(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -3561,3 +3597,4 @@ CreateScheduleChangeNotification:
return return

View File

@ -16,7 +16,8 @@ Subroutine Service_Manager_Debugger_Intercept(Void)
Metadata : Metadata :
History : (Date, Initials, Notes) History : (Date, Initials, Notes)
07/25/23 djs Original programmer. 07/25/23 djs Original programmer.
06/04/25 djs Added LSL note creation (and email forwarding) to notify OI_ADMIN users when invoked.
***********************************************************************************************************************/ ***********************************************************************************************************************/
@ -24,24 +25,58 @@ Subroutine Service_Manager_Debugger_Intercept(Void)
$insert APP_INSERTS $insert APP_INSERTS
$insert RTI_DEBUG_COMMON $insert RTI_DEBUG_COMMON
$insert ENVIRON_CONSTANTS
Declare function Environment_Services, Logging_Services Declare function Environment_Services, Logging_Services, Environment_Services, GetCommandLine, Datetime
Declare subroutine Logging_Services Declare subroutine Logging_Services, obj_Notes, Set_Env
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager' Main:
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') // Log event in .\LogFiles\ServiceManager\<Date> OEngine Log.csv
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager'
Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM : 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack' LogDate = Oconv(Date(), 'D4/')
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) LogTime = Oconv(Time(), 'MTS')
LogData = '' LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv'
LogData<1> = SPStatus@ Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM
LogData<2> = SPStatCode@ Headers := 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack'
LogData<3> = Curr_Program@ objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogData<4> = CallDepth@ LogData = ''
LogData<5> = LineNo@ LogData<1> = spStatus@
LogData<6> = CallStack@ LogData<2> = spStatCode@
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '') LogData<3> = curr_Program@
LogData<4> = callDepth@
LogData<5> = lineNo@
LogData<6> = callStack@
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
// Send an LSL message to FI admins to alert them. This is forward to their email address if configured in
// their LSL_USERS record.
CmdLine = GetCommandLine()
EngIndex = Index(CmdLine, '/S=', 1)
EngNo = CmdLine[EngIndex + 3, 'F ']
Server = Environment_Services('GetServer')
Recipients = ''
SentFrom = 'SYSTEM'
Subject = 'Service Manager Debugger Intercept Invoked'
Message = OConv(Datetime(), 'DT2/^H')
Message<2> = 'RevEngineHost (OEngine) ':EngNo:' encountered a runtime error on server ':Server
Message<3> = 'Stored Procedure Status: ':spStatus@
StatCodes = spStatCode@
Swap Char(0) with ',' in StatCodes
Swap Char(23) with '' in StatCodes
Message<4> = 'Stored Procedure Status Code: ':StatCodes
Message<5> = 'Current Program: ':curr_Program@
Message<6> = 'Call Depth: ':callDepth@
Message<7> = 'Line No: ':lineNo@
Message<8> = 'Call Stack: ':\0D0A\:callStack@
Swap @FM with \0D0A\ in Message
Swap @VM with ',' in Message
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Return Return

View File

@ -27,19 +27,30 @@ Function Service_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert LOGICAL $Insert APP_INSERTS
$insert SERVICE_SETUP $Insert SERVICE_SETUP
$insert SERVICES_EQUATES $Insert SERVICES_EQUATES
$insert RLIST_EQUATES $Insert RLIST_EQUATES
$insert SQL_REQUESTS_EQUATES $Insert SQL_REQUESTS_EQUATES
$Insert PROC_QUEUE_EQUATES $Insert PROC_QUEUE_EQUATES
$Insert PROC_QUEUE_FAILED_EQUATES
Equ Comma$ to ','
Common /ServiceServices/ Unused1@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@, Unused9@, Unused10@ Common /ServiceServices/ Unused1@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@, Unused9@, Unused10@
Declare function Service_Services, Memory_Services, SRP_List, SRP_FastArray, SRP_Array, Database_Services, Datetime Declare function Service_Services, Memory_Services, SRP_List, SRP_FastArray, SRP_Array, Database_Services, Datetime
Declare Function GetTickCount, SRP_Decode, RTI_CREATEGUID Declare function GetTickCount, SRP_Decode, RTI_CreateGuid, UCase, Environment_services, Logging_Services
Declare subroutine Service_Services, Memory_Services, SRP_List, SRP_FastArray, RList, Set_Status, Database_Services Declare subroutine Service_Services, Memory_Services, SRP_List, SRP_FastArray, RList, Set_Status, Database_Services
Declare Subroutine Yield, WinYield, Sleepery, Btree.Extract Declare Subroutine Yield, WinYield, Sleepery, Btree.Extract, Logging_Services, obj_Notes
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ProcQueue'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Procedure Queue Log.csv'
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'RequestKeyId' : @FM : 'Procedure' : @FM : 'Params' : @FM : 'Result' : @FM : 'Error Message'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService else GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
@ -165,18 +176,22 @@ Service ProcessProcedureQueue()
ReadNext RequestKeyID else EOF = True$ ReadNext RequestKeyID else EOF = True$
Until EOF or Done Until EOF or Done
Lock hProcQueue, RequestKeyID then Lock hProcQueue, RequestKeyID then
Done = True$ DeleteRequest = True$
Server = Environment_Services('GetServer')
Done = True$
Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId) Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId)
RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID) RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID)
If RequestRow NE '' then If RequestRow NE '' then
Procedure = RequestRow<PROC_QUEUE.PROC_NAME$> Procedure = RequestRow<PROC_QUEUE.PROC_NAME$>
Procedure = UCase(Procedure)
Params = RequestRow<PROC_QUEUE.PARAMS$> Params = RequestRow<PROC_QUEUE.PARAMS$>
If Procedure NE '' then If Procedure NE '' then
Dim ProcParams(11) Dim ProcParams(12)
For each Param in Params using @VM setting pPos For each Param in Params using @VM setting pPos
ProcParams(pPos) = Param ProcParams(pPos) = Param
Next Param Next Param
NumArguments = DCount(Params, @VM) NumArguments = DCount(Params, @VM)
Begin Case Begin Case
Case NumArguments EQ 0 ; Call @Procedure() Case NumArguments EQ 0 ; Call @Procedure()
Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1)) Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1))
@ -194,17 +209,58 @@ Service ProcessProcedureQueue()
Error_Services('Add', 'Error in ':Service:' service. More than 11 arguments are not currently supported.') Error_Services('Add', 'Error in ':Service:' service. More than 11 arguments are not currently supported.')
End Case End Case
end end
If Error_Services('NoError') then
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call will release the lock Swap @VM with ',' in Params
LogData = LoggingDTM
LogData<2> = Server
LogData<3> = RequestKeyId
LogData<4> = Procedure
LogData<5> = Params
ErrCode = ''
If ( Get_Status(ErrCode) or Error_Services('HasError') ) then
NumAttempts = RequestRow<PROC_QUEUE.NUM_ATTEMPTS$> + 1
ErrorMessage = Error_Services('GetMessage')
If NumAttempts LT 3 then
DeleteRequest = False$
RequestRow<PROC_QUEUE.NUM_ATTEMPTS$> = NumAttempts
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = Datetime()
RequestRow<PROC_QUEUE.ERROR$> = 'Error_Services error message: ':ErrorMessage:' Get_Status error code: ':ErrCode
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyId, RequestRow, True$, False$, False$)
end else
// Notify OI_SYSADMIN group
Recipients = ''
SentFrom = 'SYSTEM'
Subject = 'Background Procedure Queue Error'
Message = OConv(Datetime(), 'DT2/^H')
Message<2> = 'Error on server ':Server
Message<3> = 'Stored Procedure: ':Procedure
StatCodes = 'Parameters: ':Params
Message<4> = 'Error_Services error message: ':ErrorMessage
Message<5> = 'Get_Status error code: ':ErrCode
Swap @FM with \0D0A\ in Message
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
// Move request to PROC_QUEUE_FAILED
RequestRow<PROC_QUEUE.NUM_ATTEMPTS$> = NumAttempts
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = Datetime()
RequestRow<PROC_QUEUE.ERROR$> = 'Error_Services error message: ':ErrorMessage:'Get_Status error code: ':ErrCode
Database_Services('WriteDataRow', 'PROC_QUEUE_FAILED', RequestKeyId, RequestRow, True$, False$, False$)
end
LogData<6> = 'Failed'
LogData<7> = 'Error_Services error message: ':ErrorMessage:' Get_Status error code: ':ErrCode
end else end else
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = DateTime() LogData<6> = 'Success'
RequestRow<PROC_QUEUE.ERROR$> = Error_Services('GetMessage')
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$) ; // This call will release the lock
end end
end else Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
// Empty request, so delete it from the queue
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call will release the lock
end end
If DeleteRequest then
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$)
end
Unlock hProcQueue, RequestKeyID else Null
end end
Repeat Repeat
end end
@ -217,36 +273,32 @@ Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
If Critical EQ '' then Critical = True$ If Critical EQ '' then Critical = True$
PostToQueue = True$ PostToQueue = True$
If (ProcedureName NE '') then If (ProcedureName NE '') then
If (Params NE '') then If Not(Critical) then
If Not(Critical) then // Check if there is already a matching request in the queue before posting another one.
// Check if there is already a matching request in the queue before posting another one. Query = 'PROC_NAME':@VM:ProcedureName:@FM
Query = 'PROC_NAME':@VM:ProcedureName:@FM Query := 'PARAMS':@VM:Params:@FM
Query := 'PARAMS':@VM:Params:@FM Open 'DICT.PROC_QUEUE' to hDict then
Open 'DICT.PROC_QUEUE' to hDict then Keys = ''
Keys = '' Option = 'E'
Option = 'E' Flag = ''
Flag = '' Btree.Extract(Query, 'PROC_QUEUE', hDict, Keys, Option, Flag)
Btree.Extract(Query, 'PROC_QUEUE', hDict, Keys, Option, Flag) If Flag EQ 0 then
If Flag EQ 0 then If Keys NE '' then PostToQueue = False$
If Keys NE '' then PostToQueue = False$
end else
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract.')
end
end else end else
Error_Services('Add', 'Error in ':Service:' service. Error opening DICT.PROC_QUEUE.') Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract.')
end end
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening DICT.PROC_QUEUE.')
end end
If PostToQueue then end
RequestKeyID = RTI_CreateGUID() If PostToQueue then
RequestRow = '' RequestKeyID = RTI_CreateGUID()
RequestRow<PROC_QUEUE.PROC_NAME$> = ProcedureName RequestRow = ''
RequestRow<PROC_QUEUE.PARAMS$> = Params RequestRow<PROC_QUEUE.PROC_NAME$> = ProcedureName
RequestRow<PROC_QUEUE.ENTRY_DTM$> = Datetime() RequestRow<PROC_QUEUE.PARAMS$> = Params
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$) RequestRow<PROC_QUEUE.ENTRY_DTM$> = Datetime()
end Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$)
end else end
Error_Services('Add', 'Error in ':Service:' service. Null Params passed in.')
end
end else end else
Error_Services('Add', 'Error in ':Service:' service. Null ProcedureName passed in.') Error_Services('Add', 'Error in ':Service:' service. Null ProcedureName passed in.')
end end
@ -254,8 +306,98 @@ Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
return return
Service CleanFailedProcQueue(DaysToRetain)
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ProcQueue'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' CleanFailedProcQueue Log.csv'
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'RequestKeyId' : @FM : 'Procedure' : @FM : 'Params'
Headers := @FM : 'Result' : @FM : 'Error Message'
objFailedProcQueueLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
Server = Environment_Services('GetServer')
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<6> = 'Begin CleanFailedProcQueue'
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
ErrorMsg = ''
If (DaysToRetain NE '') then
If Num(DaysToRetain) then
Open 'PROC_QUEUE_FAILED' to hTable then
Cutoff = Datetime() - DaysToRetain
Select hTable
EOF = False$
Loop
Readnext Key else EOF = True$
Until EOF
Read Rec from hTable, Key then
EntryDtm = Rec<PROC_QUEUE_FAILED.ENTRY_DTM$>
If (EntryDtm LT Cutoff) then
Delete hTable, Key then
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<3> = Key
LogData<4> = Rec<PROC_QUEUE_FAILED.PROC_NAME$>
ProcFailedParams = Rec<PROC_QUEUE_FAILED.PARAMS$>
Convert @VM to '|' in ProcFailedParams
LogData<5> = ProcFailedParams
LogData<6> = 'Removed PROC_QUEUE_FAILED record.'
LogData<7> = Rec<PROC_QUEUE_FAILED.ERROR$>
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
end else
ErrorMsg = 'Error in ':Service:' service. Error deleting PROC_QUEUE_FAILED record ':Key:'.'
end
end else
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<3> = Key
LogData<4> = Rec<PROC_QUEUE_FAILED.PROC_NAME$>
ProcFailedParams = Rec<PROC_QUEUE_FAILED.PARAMS$>
Convert @VM to '|' in ProcFailedParams
LogData<5> = ProcFailedParams
LogData<6> = 'Retaining PROC_QUEUE_FAILED record.'
LogData<7> = Rec<PROC_QUEUE_FAILED.ERROR$>
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
end
end else
ErrorMsg = 'Error in ':Service:' service. Error reading PROC_QUEUE_FAILED record ':Key:'.'
end
Repeat
end else
ErrorMsg = 'Error in ':Service:' service. Error opening PROC_QUEUE_FAILED table.'
end
end else
ErrorMsg = 'Error in ':Service:' service. DaysToRetain must be a number.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null DaysToRetain value passed in.'
end
If ErrorMsg NE '' then
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<6> = ErrorMsg
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
end
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<6> = 'End CleanFailedProcQueue'
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
Unlock hSysLists, ServiceKeyID else Null
end
end service
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Internal GoSubs /// Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -63,12 +63,20 @@ Equ COL$TOOL_ID to 10
Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test
Declare function Database_Services, obj_WO_Mat, Dialog_Box, MemberOf, Msg, QA_Services, Datetime, Supplement_Services Declare function Database_Services, obj_WO_Mat, Dialog_Box, MemberOf, Msg, QA_Services, Datetime, Supplement_Services
Declare function Environment_Services, GetTickCount
Declare subroutine Error_Services, Popup, Memory_Services, SRP_Stopwatch, Set_Status, Database_Services, obj_WO_Mat Declare subroutine Error_Services, Popup, Memory_Services, SRP_Stopwatch, Set_Status, Database_Services, obj_WO_Mat
Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg, Mona_Services
PSNKey = ServiceKeyID PSNKey = ServiceKeyID
ReactorKey = ServiceKeyID ReactorKey = ServiceKeyID
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SIGNATURESERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SIGNATURESERVICES'
end
GoToService GoToService
Return Response or "" Return Response or ""
@ -114,7 +122,7 @@ end service
Service CheckQALabelStatus(WOMatKey) Service CheckQALabelStatus(WOMatKey)
rec = Xlate('WO_MAT', WoMatKey,'', '') rec = Xlate('WO_MAT', WoMatKey,'', '')
locRec = rec<WO_MAT_INV_LOCATION$> locRec = rec<WO_MAT_INV_LOCATION$>
actionRec = rec<WO_MAT_INV_ACTION$> actionRec = rec<WO_MAT_INV_ACTION$>
@ -135,6 +143,8 @@ end service
Service GetSigProfile(WOMatKey, UseCaching, RDSNo) Service GetSigProfile(WOMatKey, UseCaching, RDSNo)
StartTick = GetTickCount()
MetricName = 'GetSigProfile'
If UseCaching EQ '' then UseCaching = True$ If UseCaching EQ '' then UseCaching = True$
@ -175,6 +185,8 @@ Service GetSigProfile(WOMatKey, UseCaching, RDSNo)
SigDTMs = OCONV(SigDTMs,'DT4/^S') SigDTMs = OCONV(SigDTMs,'DT4/^S')
Response = SigProfile:@FM:Signatures:@FM:SigDTMs Response = SigProfile:@FM:Signatures:@FM:SigDTMs
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -211,6 +223,9 @@ end service
Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo) Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
StartTick = GetTickCount()
MetricName = 'CheckSigOrder'
If UseCaching EQ '' then UseCachine = True$ If UseCaching EQ '' then UseCachine = True$
Response = False$ Response = False$
If RDSNo NE '' then If RDSNo NE '' then
@ -264,6 +279,8 @@ Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
Response = True$ Response = True$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service End Service
@ -282,7 +299,7 @@ end service
Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo) Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo)
If UseCaching EQ '' then UseCaching = True$ If UseCaching EQ '' then UseCaching = True$
Signature = '' Signature = ''
SigDTM = '' SigDTM = ''
@ -2010,20 +2027,17 @@ Service QASigReady(RDSNo)
* Verify Unload Stage QA Metrology Tests * * Verify Unload Stage QA Metrology Tests *
****************************************** ******************************************
If ErrorMessage EQ '' then If ErrorMessage EQ '' then
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') WOMatQAKey = WOMatKey
If (DevelopmentFlag EQ True$) then WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
WOMatQAKey = WOMatKey OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) OutOfSpec = Sum(OutOfSpec)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$> If OutOfSpec GT 0 then
OutOfSpec = Sum(OutOfSpec) FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
If OutOfSpec GT 0 then ErrorMessage = 'Error in ':Service:' service. '
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$> For each FailReason in FailReasons using @VM
ErrorMessage = 'Error in ':Service:' service. ' ErrorMessage := FailReason:' '
For each FailReason in FailReasons using @VM Next FailReason
ErrorMessage := FailReason:' ' end
Next FailReason
end
end
end end
************************************************************************ ************************************************************************
@ -2844,4 +2858,3 @@ GetMostRecentSig:
return return

View File

@ -56,9 +56,16 @@ $Insert NOTIFICATION_EQUATES
Equ COMMA$ to ',' Equ COMMA$ to ','
Declare function Database_Services, Supplement_Services, Rti_Createguid, SRP_Array, Datetime, Signature_Services Declare function Database_Services, Supplement_Services, Rti_Createguid, SRP_Array, Datetime, Signature_Services
Declare function Environment_Services, Logging_Services, Select_Into Declare function Environment_Services, Logging_Services, Select_Into, GetTickCount
Declare subroutine Database_Services, Rds_Services, Supplement_Services, Logging_Services, Set_Status, SRP_Stopwatch Declare subroutine Database_Services, Rds_Services, Supplement_Services, Logging_Services, Set_Status, SRP_Stopwatch
Declare subroutine Btree.Extract, obj_Notes Declare subroutine Btree.Extract, obj_Notes, Mona_Services
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SUPPLEMENTSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SUPPLEMENTSERVICES'
end
GoToService else GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
@ -408,6 +415,8 @@ end service
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service AcknowledgeSupplement(SupplID, EntryUser) Service AcknowledgeSupplement(SupplID, EntryUser)
StartTick = GetTickCount()
MetricName = 'AcknowledgeSupplement'
If ( (SupplID NE '') and (EntryUser NE '') ) then If ( (SupplID NE '') and (EntryUser NE '') ) then
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '') OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
@ -433,6 +442,8 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
Error_Services('Add', 'SupplID or EntryUser was missing in the ' : Service : ' service.') Error_Services('Add', 'SupplID or EntryUser was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -447,6 +458,8 @@ end service
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES) Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
StartTick = GetTickCount()
MetricName = 'UnacknowledgedSupplementCheck'
UnackList = '' UnackList = ''
Response = False$ Response = False$
@ -482,6 +495,8 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
If UnackList NE '' then Response = UnackList If UnackList NE '' then Response = UnackList
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -496,6 +511,8 @@ end service
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service LogSupplementChange(SupplementRec, EditEvent, EntryUser) Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
StartTick = GetTickCount()
MetricName = 'LogSupplementChange'
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$> SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
@ -513,6 +530,8 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.') Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -613,3 +632,4 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
end service end service

View File

@ -10,9 +10,10 @@ $Insert TEST_RUN_OBJ_EQUATES
$Insert LOT_EQUATES $Insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES $Insert LOT_OPERATION_EQUATES
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf
Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
Declare subroutine Mona_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\TEST_RUN_SERVICES\TestWaferProduct' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\TEST_RUN_SERVICES\TestWaferProduct'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -30,6 +31,13 @@ objLogTR = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, He
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_TESTRUNSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_TESTRUNSERVICES'
end
GoToService GoToService
Return Response or "" Return Response or ""
@ -280,6 +288,9 @@ Service UpdateTWProdSortOrder(TWProdKey, NewOrder)
end service end service
Service GetAllTestRunTypes() Service GetAllTestRunTypes()
StartTick = GetTickCount()
MetricName = 'GetAllTestRunTypes'
keylist = '' keylist = ''
rtList = '' rtList = ''
RList('SELECT TEST_RUN_TYPE BY RUN_TYPE', 5, '', '', '') RList('SELECT TEST_RUN_TYPE BY RUN_TYPE', 5, '', '', '')
@ -297,6 +308,9 @@ Service GetAllTestRunTypes()
end end
Next ProdKey Next ProdKey
Response = rtList Response = rtList
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetTestWaferLots(ShowOnlyOpenLots) Service GetTestWaferLots(ShowOnlyOpenLots)
@ -318,6 +332,9 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
end service end service
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys) Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys)
StartTick = GetTickCount()
MetricName = 'CreateTestRunRecord'
TWRunKey = '' TWRunKey = ''
Response = '' Response = ''
ErrorMessage = '' ErrorMessage = ''
@ -490,9 +507,15 @@ Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLo
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
Response = '' Response = ''
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId, Username) Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId, Username)
StartTick = GetTickCount()
MetricName = 'CreateTestRunWaferRecord'
ErrorMessage = '' ErrorMessage = ''
If TestRunID NE '' AND TWPartID NE '' then If TestRunID NE '' AND TWPartID NE '' then
If RowExists('TEST_RUN', TestRunID) then If RowExists('TEST_RUN', TestRunID) then
@ -537,6 +560,9 @@ Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
Error_Services('Add', 'Error creating new test run record: ' : ErrorMessage) Error_Services('Add', 'Error creating new test run record: ' : ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service UseTWFromLot(LotId, UsageQty, Username) Service UseTWFromLot(LotId, UsageQty, Username)
@ -706,6 +732,9 @@ Service GetTestRunKeysByPSN(PSNo)
end service end service
Service GetTestRunKeysByRDS(RDSNo) Service GetTestRunKeysByRDS(RDSNo)
StartTick = GetTickCount()
MetricName = 'GetTestRunKeysByRDS'
table = "TEST_RUN" table = "TEST_RUN"
Open "DICT ":table To @DICT Else Open "DICT ":table To @DICT Else
Error_Services('Add', 'Error opening TEST_RUN dictionary') Error_Services('Add', 'Error opening TEST_RUN dictionary')
@ -718,6 +747,9 @@ Service GetTestRunKeysByRDS(RDSNo)
Btree.Extract(srch_strng, table, @DICT, keylist, option, flag) Btree.Extract(srch_strng, table, @DICT, keylist, option, flag)
Response = keylist Response = keylist
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetTestRunWaferByID(TRWaferID) Service GetTestRunWaferByID(TRWaferID)
@ -799,3 +831,4 @@ end service

View File

@ -0,0 +1,309 @@
Function Wafercounter_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Wafercounter_API
Description : API logic for the Wafercounter resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Wafercounter[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Wafercounter.POST
- Wafercounter.ID.PUT
- Wafercounter.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
06/04/25 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function OI_Wizard_Services, Wafer_Counter_Services, Database_Services, Datetime, Wo_Mat_Services
Declare function Logging_Services, Environment_Services
Declare subroutine Logging_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
$insert WAFER_COUNTER_EQUATES
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\WaferCounter';
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' WaferCounter.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'OI Wizard ID' : @FM : 'Message'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
LogData = ''
LogData<1> = LoggingDTM;//Defined at entry of subroutine
LogData<2> = ''
LogData<3> = ''
LogData<4> = 'Web API not found.'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API wafercounter.startnewwafercount.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
UserId = ''
CassId = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
CassBarcodeData = ''
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
DecodedJSON = HTTP_Services('DecodePercentString', Body)
//Log Entry into API -
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction started.'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
CassBarcodeData = SRP_JSON(objBody, 'GetValue', 'CassBarcodeData')
If CassBarcodeData NE '' then
CassData = Wafer_Counter_Services('ProcessCass2DBarcode', CassBarcodeData)
CassId = CassData<1,1>
ExpectedWfrQty = CassData<1,2>
CassType = CassData<1,3>
WoMatKey = ''
Begin Case
Case CassType EQ 'RDS'
WONo = XLATE('RDS', CassId, 'WO', 'X')
CassNo = XLATE('RDS', CassId, 'CASS_NO', 'X')
WoMatKey = WONo : '*' : CassNo
Case CassType EQ 'WM_OUT' OR CassType EQ 'WM_IN'
swap '.' with '*' in CassId
WONo = Field(CassId, '*', 1)
CassNo = Field(CassId, '*', 3)
WoMatKey = WONo : '*' : CassNo
End Case
ExpectedWfrMap = Wo_Mat_Services('GetWaferMap', WoMatKey)
ExpectedCassetteArray = ''
for i = 25 to 1 step -1
Slot = i
WaferPresent = ExpectedWfrMap<1, i>
ExpectedCassetteArray<-1, 1> = Slot : @VM : WaferPresent
Next i
If Error_Services('NoError') then
SRP_Json(objBody, 'SetValue', 'CassId', CassId, 'String')
SRP_Json(objBody, 'SetValue', 'CassType', CassType, 'String')
SRP_Json(objBody, 'SetValue', 'ExpectedQty', ExpectedWfrQty, 'Number')
SRP_Json(objBody, 'SetValue', 'ScanDtm', OConv(Datetime(), 'DT4/'), 'String')
objExpCassArray = ''
IF SRP_Json(objExpCassArray, 'New', 'Array') then
for each SlotData in ExpectedCassetteArray using @FM setting sPos
Slot = SlotData<1, 1>
WaferPresent = SlotData<1, 2>
objSlot = ''
If SRP_Json(objSlot, 'New', 'Object') then
SRP_Json(objSlot, 'SetValue', 'SlotNo', Slot, 'Number')
SRP_Json(objSlot, 'SetValue', 'WaferPresent', WaferPresent, 'Boolean')
SRP_Json(objExpCassArray, 'Add', objSlot)
SRP_Json(objSlot, 'Release')
end
Next SlotData
SRP_Json(objBody, 'Set', 'ExpectedWaferArray', objExpCassArray)
SRP_Json(objExpCassArray, 'Release')
end
ResponseJson = SRP_Json(objBody, 'Stringify', 'Styled')
HTTP_Services('SetResponseBody', ResponseJson)
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Cassette ID Barcode data not detected.'
ResponseCode = 500
end
SRP_Json(objBody, 'Release')
end
If ErrorMessage EQ '' then
//Log Success
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction started successfully. Barcode Data: ' : CassBarcodeData : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end else
//Log Failure
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction finished with errors. Response Code: ' : ResponseCode : '. Error Message: ' : ErrorMessage : '. Barcode Data: ' : CassBarcodeData : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API wafercounter.completewafercount.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
WaferCounterId = ''
CassId = ''
Body = ''
OIWizardID = ''
UserId = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
CassBarcodeData = ''
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
DecodedJSON = HTTP_Services('DecodePercentString', Body)
//Log Entry into API -
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'Complete wafer counter transaction started.'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
CassId = SRP_JSON(objBody, 'GetValue', 'CassId')
CassType = SRP_Json(objBody, 'GetValue', 'CassType')
ToolBarcodeData = SRP_JSON(objBody, 'GetValue', 'ToolBarcodeData')
ExpectedQty = SRP_JSON(objBody, 'GetValue', 'ExpectedQty')
If CassId NE '' then
WaferCounterId = Wafer_Counter_Services('ProcessTool2DBarcode', ToolBarcodeData, CassId, CassType, UserId)
If Error_Services('NoError') then
WaferCounterRec = Database_Services('ReadDataRow', 'WAFER_COUNTER', WaferCounterId, True$, 0, False$)
ScanDtm = OConv(WaferCounterRec<WAFER_COUNTER.SCAN_DTM$>, 'DT4/')
ToolId = WaferCounterRec<WAFER_COUNTER.SCAN_TOOL$>
WaferCount = WaferCounterRec<WAFER_COUNTER.SCAN_QTY$>
MatchingWfrCount = ExpectedQty EQ WaferCount
WaferCountData = WaferCounterRec<WAFER_COUNTER.SCAN_WAFER_MAP$>
swap 1 with 1:@FM in WaferCountData
swap 0 with 0:@FM in WaferCountData
WaferCountData[-1, -1] = ''
CassetteArray = ''
for i = 25 to 1 step -1
Slot = i
WaferPresent = WaferCountData<i>
CassetteArray<-1, 1> = Slot : @VM : WaferPresent
Next i
WaferCountArray = ''
SRP_Json(objBody, 'SetValue', 'WaferCounterId', WaferCounterId, 'String')
SRP_Json(objBody, 'SetValue', 'ScanDtm', ScanDtm, 'String')
SRP_Json(objBody, 'SetValue', 'WaferCount', WaferCount, 'Number')
SRP_Json(objBody, 'SetValue', 'ToolId', ToolId, 'String')
SRP_Json(objBody, 'SetValue', 'MatchingWaferCount', MatchingWfrCount, 'Boolean')
SRP_Json(objBody, 'SetValue', 'WaferCounterId', WaferCounterId, 'String')
objCassArray = ''
IF SRP_Json(objCassArray, 'New', 'Array') then
for each SlotData in CassetteArray using @FM setting sPos
Slot = SlotData<1, 1>
WaferPresent = SlotData<1, 2>
objSlot = ''
If SRP_Json(objSlot, 'New', 'Object') then
SRP_Json(objSlot, 'SetValue', 'SlotNo', Slot, 'Number')
SRP_Json(objSlot, 'SetValue', 'WaferPresent', WaferPresent, 'Boolean')
SRP_Json(objCassArray, 'Add', objSlot)
SRP_Json(objSlot, 'Release')
end
Next SlotData
SRP_Json(objBody, 'Set', 'WaferArray', objCassArray)
SRP_Json(objCassArray, 'Release')
end
ResponseJson = SRP_Json(objBody, 'Stringify', 'Styled')
HTTP_Services('SetResponseBody', ResponseJson)
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Cassette ID Barcode data not detected.'
ResponseCode = 500
end
SRP_Json(objBody, 'Release')
end
If ErrorMessage EQ '' then
//Log Success
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'Completed wafer counter transaction finished successfully. Barcode Data: ' : CassBarcodeData : '. WAFER_COUNTER Id: ' : WaferCounterId : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end else
//Log Failure
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction finished with errors. Response Code: ' : ResponseCode : '. Error Message: ' : ErrorMessage : '. Barcode Data: ' : CassBarcodeData : '. Wafer Counter Id: ' : WaferCounterId : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api

View File

@ -32,6 +32,8 @@ $Insert WO_LOG_EQUATES
$Insert WM_OUT_EQUATES $Insert WM_OUT_EQUATES
$Insert RLIST_EQUATES $Insert RLIST_EQUATES
$Insert WAFER_COUNTER_EQUATES $Insert WAFER_COUNTER_EQUATES
$Insert TOOL_EQUATES
$Insert TOOL_LOG_EQUATES
Equ Tab$ to \09\ Equ Tab$ to \09\
Equ CRLF$ to \0D0A\ Equ CRLF$ to \0D0A\
@ -43,8 +45,9 @@ Equ next_cur$ To 1
Equ add_exist$ to 2 Equ add_exist$ to 2
Declare subroutine Error_Services, Database_Services, Logging_Services, Httpclient_Services, Reduce, SRP_JSON Declare subroutine Error_Services, Database_Services, Logging_Services, Httpclient_Services, Reduce, SRP_JSON
Declare function Database_Services, Environment_Services, Logging_Services, Httpclient_Services Declare subroutine Wafer_Counter_Services, Lot_Event_Services
Declare function RTI_CreateGuid, SRP_JSON Declare function Database_Services, Environment_Services, Logging_Services, Httpclient_Services, OConv
Declare function RTI_CreateGuid, SRP_JSON, WO_Mat_Services, WM_Out_Services, Wafer_Counter_Services, Datetime
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WaferCounter' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WaferCounter'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -263,6 +266,8 @@ Service AddScan(LotID, ScanQty, ScanDtm, ScanTool, ScanUser, ScanLocation, Wafer
Record<WAFER_COUNTER.SCAN_WAFER_MAP$> = WaferMap Record<WAFER_COUNTER.SCAN_WAFER_MAP$> = WaferMap
Database_Services('WriteDataRow', 'WAFER_COUNTER', KeyID, Record) Database_Services('WriteDataRow', 'WAFER_COUNTER', KeyID, Record)
Response = KeyId
end service end service
@ -393,6 +398,161 @@ Service GetWaferCounterToolID(WaferSize=WAFER_SIZES, Location=LOCATIONS)
end service end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessCass2DBarcode
//
// Takes in the raw barcode data for a 2D Cassette label. Returns a single field array with 3 field delimited by @VM
// CassId, Expected Qty, and Cass Type
//----------------------------------------------------------------------------------------------------------------------
Service ProcessCass2DBarcode(BarcodeText)
ErrorMessage = ''
ExpectedSlotWaferMap = ''
ExpectedQty = ''
CassId = ''
CassType = ''
If BarcodeText NE '' then
DelimCnt = DCount(BarcodeText, '|')
If DelimCnt EQ 8 then
CassId = Field(BarcodeText, '|', 3)
If CassId NE '' then
If CassId[1, 2] EQ '1T' then
CassId[1, 2] = ''
Begin Case
Case CassId[1, 1] EQ 'O'
CassId[1, 1] = ''
CassType = 'WM_OUT'
Case (CassId[1, 1] EQ 'I')
CassId[1, 1] = ''
CassType = 'WM_IN'
Case Otherwise$
CassType = 'RDS'
End Case
Convert '.' to '*' in CassId
Begin Case
Case RowExists('RDS', CassId)
ExpectedQty = Xlate('RDS', CassId, 'WFRS_OUT', 'X')
Case RowExists('WM_OUT', CassId)
ExpectedQty = Xlate('WM_OUT', CassId, 'WAFER_CNT', 'X')
End Case
end
end else
ErrorMessage = 'Invalid Lot Label Scan. Unable to determine Cass Id'
end
end else
ErrorMessage = 'Invalid Lot Label Scan.'
end
end else
ErrorMessage = 'Scan data was null.'
end
If ErrorMessage EQ '' then
Response = CassId : @VM: ExpectedQty : @VM : CassType
end else
Error_Services('Add', ErrorMessage)
end
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessTool2DBarcode
//
// Takes in the raw barcode data for a wafer counter label, Cassette Id, Cassette Type, and UserId(Optional)
// Returns a key ID for a completed WAFER_COUNTER record.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessTool2DBarcode(BarcodeText, CassId, CassType, UserId)
ErrorMessage = ''
If BarcodeText NE '' then
DelimCnt = DCount(BarcodeText, '|')
If DelimCnt EQ 2 then
WaferSize = Field(BarcodeText, '|', 1)
Area = Field(BarcodeText, '|', 2)
If Environment_Services('IsProd') then
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
end else
WcJson = Wafer_Counter_Services('GetWaferCounterJSONTestData', WaferSize, Area, CassID)
end
If Error_Services('NoError') then
objJSON = ''
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
SRP_JSON(objJSON, 'Release')
ToolCurrModeKey = Database_Services('ReadDataColumn', 'TOOL', ToolId, TOOL_CURR_MODE_KEY$, True$, 0, False$)
ToolCurrMode = Database_Services('ReadDataColumn', 'TOOL_LOG', ToolCurrModeKey, TOOL_LOG_TOOL_MODE$, True$, 0, False$)
If ToolCurrMode EQ 'PROD' OR ToolCurrMode EQ 'LIM' then
WaferCounterId = Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, UserId, Area, SlotMap)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', CassId, ScanDtm, 'WAFER_COUNTER', 'Wafer counter data received for lot. ' : WaferCount : ' wafers found.', ToolId, UserId, True$, CassType)
end
end else
ErrorMessage = 'Wafer counter is currently down and cannot be used to log wafer counts.'
end
end else
ErrorMessage = 'Error parsing response from wafer counter.'
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Invalid tool scan.'
end
end else
ErrorMessage = 'Scan data was null.'
end
If ErrorMessage EQ '' then
Response = WaferCounterId
end else
Error_Services('Add', ErrorMessage)
end
end service
//----------------------------------------------------------------------------------------------------------------------
// GetWaferCounterJSONTestData
//
// Emulates GetWaferCounterJson service.
//----------------------------------------------------------------------------------------------------------------------
Service GetWaferCounterJSONTestData(WaferSize, ToolLocation, CassID)
If ( (WaferSize NE '') and (ToolLocation NE '') and (CassID NE '') ) then
Response = ''
objJson = ''
If SRP_JSON(objJson, 'New', 'Object') then
SRP_JSON(objJson, 'SetValue', 'dateTimeFormatted', Datetime(), 'String')
SRP_JSON(objJson, 'SetValue', 'equipmentId', 'WC8INCH1', 'String')
SRP_JSON(objJson, 'SetValue', 'total', 24, 'Number')
SRP_JSON(objJson, 'SetValue', 'slotMap', '1111111110111111111111111', 'String')
Response = SRP_Json(objJson, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end
If Error_Services('NoError') then
StatusCode = 200
If StatusCode NE 200 then
Begin Case
Case Response EQ ''
ErrorMsg = 'Unexpected server error.'
Case Response EQ 'No files!'
ErrorMsg = 'No data. Please re-seat cassette and try again.'
Case Otherwise$
// Use message in response body to populate error services
ErrorMsg = Response
End Case
Error_Services('Add', ErrorMsg)
end
end
end
end service
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -405,3 +565,4 @@ ClearCursors:
return return

View File

@ -1231,19 +1231,23 @@ Service SignVoidNonEpp(WOMatKey, Username)
Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo) Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' LotEventParams<1,1> = 'CreateLotEvent' ; //Service Module
LotEventParams<1,4> = DateTime() LotEventParams<1,2> = ''; //Legacy Lot Id, set below
LotEventParams<1,5> = 'VOID' LotEventParams<1,3> = DateTime(); //Datetime
LotEventParams<1,6> = 'Lot voided by ' : Username LotEventParams<1,4> = 'VOID'; //Event Type
LotEventParams<1,11> = Username LotEventParams<1,5> = 'Lot voided by ' : Username; //Event Note
LotEventParams<1,6> = ''; //Equipment id
LotEventParams<1,7> = Username ;//User Id
LotEventParams<1,8> = True$; //IsLegacyLotId
LotEventParams<1,9> = ''; //Legacy Lot Type, set below
If RDSNo NE '' then If RDSNo NE '' then
LotEventParams<1,2> = RDSNo LotEventParams<1,2> = RDSNo
LotEventParams<1,3> = 'RDS' LotEventParams<1,9> = 'RDS'; //Legacy Lot Type
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end else end else
LotEventParams<1,2> = WoMatKey LotEventParams<1,2> = WoMatKey
LotEventParams<1,3> = 'WO_MAT' LotEventParams<1,9> = 'WO_MAT'
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end end
If Error_Services('NoError') then If Error_Services('NoError') then
//Add inventory transaction //Add inventory transaction
@ -1311,13 +1315,15 @@ Service SignVoidWMI(WMInKey, Username)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,4> = DateTime()
LotEventParams<1,5> = 'VOID'
LotEventParams<1,6> = 'Lot voided by ' : Username
LotEventParams<1,11> = Username
LotEventParams<1,2> = WMInKey LotEventParams<1,2> = WMInKey
LotEventParams<1,3> = 'WM_IN' LotEventParams<1,3> = DateTime()
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_IN'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
If Error_Services('NoError') then If Error_Services('NoError') then
//Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record //Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey
@ -1386,13 +1392,15 @@ Service SignVoidWMO(WMOutKey, Username)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,4> = DateTime()
LotEventParams<1,5> = 'VOID'
LotEventParams<1,6> = 'Lot voided by ' : Username
LotEventParams<1,11> = Username
LotEventParams<1,2> = WMOutKey LotEventParams<1,2> = WMOutKey
LotEventParams<1,3> = 'WM_OUT' LotEventParams<1,3> = DateTime()
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_OUT'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
If Error_Services('NoError') then If Error_Services('NoError') then
//Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record //Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey
@ -1558,3 +1566,4 @@ ClearCursors:
return return

View File

@ -573,15 +573,16 @@ return
WRITE_RECORD: WRITE_RECORD:
WONo = Field(Name, '*', 1) WONo = Field(Name, '*', 1)
CassNo = Field(Name, '*', 2) CassNo = Field(Name, '*', 2)
WOMatKeyID = Name WOMatKeyID = Name
If {REACTOR_TYPE} NE 'EPP' then If {REACTOR_TYPE} NE 'EPP' then
If {MAKEUP_BOX} then If {MAKEUP_BOX} then
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID) CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
If CurrWaferCount GT 0 then CurrStatus = {CURR_STATUS}
If ( (CurrWaferCount GT 0) and (CurrStatus NE 'VOID') ) then
// Populate MAKEUP_WAFERS table // Populate MAKEUP_WAFERS table
// Add/update cassette data to the MAKEUP_WAFERS table // Add/update cassette data to the MAKEUP_WAFERS table
If RowExists('MAKEUP_WAFERS', WOMatKeyID) then If RowExists('MAKEUP_WAFERS', WOMatKeyID) then
@ -600,7 +601,7 @@ WRITE_RECORD:
MUWfrRec<MAKEUP_WAFERS.PROD_VER_NO$> = {PROD_VER_NO} MUWfrRec<MAKEUP_WAFERS.PROD_VER_NO$> = {PROD_VER_NO}
MUWfrRec<MAKEUP_WAFERS.CUST_PART_NO$> = {CUST_PART_NO} MUWfrRec<MAKEUP_WAFERS.CUST_PART_NO$> = {CUST_PART_NO}
MUWfrRec<MAKEUP_WAFERS.REACT_TYPE$> = {REACTOR_TYPE} MUWfrRec<MAKEUP_WAFERS.REACT_TYPE$> = {REACTOR_TYPE}
MUWfrRec<MAKEUP_WAFERS.CURR_STATUS_STATIC$> = {CURR_STATUS} MUWfrRec<MAKEUP_WAFERS.CURR_STATUS_STATIC$> = CurrStatus
MUWfrRec<MAKEUP_WAFERS.WFR_QTY$> = CurrWaferCount MUWfrRec<MAKEUP_WAFERS.WFR_QTY$> = CurrWaferCount
DateOut = Xlate('RDS', {RDS_NO}, 'DATE_OUT', 'X') DateOut = Xlate('RDS', {RDS_NO}, 'DATE_OUT', 'X')
TimeOut = Xlate('RDS', {RDS_NO}, 'TIME_OUT', 'X') / 86400 TimeOut = Xlate('RDS', {RDS_NO}, 'TIME_OUT', 'X') / 86400

View File

@ -2,9 +2,9 @@ Compile function WO_MAT_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
Declare function Datetime Declare function Datetime, GetTickCount
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
Declare subroutine obj_wo_mat_log, Set_Status Declare subroutine obj_wo_mat_log, Set_Status, Mona_Services
$insert LOGICAL $insert LOGICAL
$Insert APP_INSERTS $Insert APP_INSERTS
@ -20,6 +20,13 @@ Headers = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'Missing Signature' : @FM :
objSyncLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) objSyncLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_WOMATSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_WOMATSERVICES'
end
GoToService else GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end end
@ -379,6 +386,9 @@ Service SyncWOMatInvActionsAndSigProfile(WOMatKey)
end service end service
Service CassetteIsLastInWo(WoMatKey) Service CassetteIsLastInWo(WoMatKey)
StartTick = GetTickCount()
MetricName = 'CassetteIsLastInWo'
IsLastInWo = False$ IsLastInWo = False$
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
@ -424,6 +434,9 @@ Service CassetteIsLastInWo(WoMatKey)
end end
Response = IsLastInWo Response = IsLastInWo
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service SetWoMatVoidFlag(WoMatKey, Username) Service SetWoMatVoidFlag(WoMatKey, Username)
@ -473,3 +486,4 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
end service end service

View File

@ -1,7 +1,7 @@
compile insert NICA_CHECKLISTS_EQUATES compile insert NICA_CHECKLISTS_EQUATES
/*---------------------------------------- /*----------------------------------------
Author : Table Create Insert Routine Author : Table Create Insert Routine
Written : 05/03/2025 Written : 03/06/2025
Description : Insert for Table NICA_CHECKLISTS Description : Insert for Table NICA_CHECKLISTS
----------------------------------------*/ ----------------------------------------*/
#ifndef __NICA_CHECKLISTS_EQUATES__ #ifndef __NICA_CHECKLISTS_EQUATES__
@ -13,6 +13,6 @@ compile insert NICA_CHECKLISTS_EQUATES
equ NICA_CHECKLISTS.NICA_ORDER_FLOW_TYPE$ to 4 equ NICA_CHECKLISTS.NICA_ORDER_FLOW_TYPE$ to 4
equ NICA_CHECKLISTS.REACTOR_TYPES$ to 5 equ NICA_CHECKLISTS.REACTOR_TYPES$ to 5
equ NICA_CHECKLISTS.REMOVE_IF_COMPLETE$ to 6 equ NICA_CHECKLISTS.REMOVE_IF_COMPLETE$ to 6
equ NICA_CHECKLISTS.REMOVE_IF_INTRUSIVE$ to 7
#endif
#endif

View File

@ -1,7 +1,7 @@
compile insert NICA_ORDERS_EQUATES compile insert NICA_ORDERS_EQUATES
/*---------------------------------------- /*----------------------------------------
Author : Table Create Insert Routine Author : Table Create Insert Routine
Written : 05/12/2024 Written : 28/05/2025
Description : Insert for Table NICA_ORDERS Description : Insert for Table NICA_ORDERS
----------------------------------------*/ ----------------------------------------*/
#ifndef __NICA_ORDERS_EQUATES__ #ifndef __NICA_ORDERS_EQUATES__
@ -16,9 +16,8 @@ compile insert NICA_ORDERS_EQUATES
equ NICA_ORDERS.ORDER_CHECKLIST_IDS$ to 7 equ NICA_ORDERS.ORDER_CHECKLIST_IDS$ to 7
equ NICA_ORDERS.ORDER_FLOW_IDS$ to 8 equ NICA_ORDERS.ORDER_FLOW_IDS$ to 8
equ NICA_ORDERS.ORDER_RESPONSE_LEVEL$ to 9 equ NICA_ORDERS.ORDER_RESPONSE_LEVEL$ to 9
equ NICA_ORDERS.CREATED_DTM$ to 10 equ NICA_ORDERS.CREATED_DTM$ to 10
equ NICA_ORDERS.CLOSED_DTM$ to 11 equ NICA_ORDERS.CLOSED_DTM$ to 11
equ NICA_ORDERS.INTRUSIVE$ to 12
#endif #endif

View File

@ -12,6 +12,8 @@ compile insert PROC_QUEUE_EQUATES
equ PROC_QUEUE.LAST_ATTEMPT_DTM$ to 3 equ PROC_QUEUE.LAST_ATTEMPT_DTM$ to 3
equ PROC_QUEUE.ERROR$ to 4 equ PROC_QUEUE.ERROR$ to 4
equ PROC_QUEUE.ENTRY_DTM$ to 5 equ PROC_QUEUE.ENTRY_DTM$ to 5
equ PROC_QUEUE.NUM_ATTEMPTS$ to 6
#endif #endif

View File

@ -0,0 +1,17 @@
compile insert PROC_QUEUE_FAILED_EQUATES
/*----------------------------------------
Author : Table Create Insert Routine
Written : 06/06/2025
Description : Insert for Table PROC_QUEUE_FAILED
----------------------------------------*/
#ifndef __PROC_QUEUE_FAILED_EQUATES__
#define __PROC_QUEUE_FAILED_EQUATES__
equ PROC_QUEUE_FAILED.PROC_NAME$ to 1
equ PROC_QUEUE_FAILED.PARAMS$ to 2
equ PROC_QUEUE_FAILED.COMP_DTM$ to 3
equ PROC_QUEUE_FAILED.ERROR$ to 4
equ PROC_QUEUE_FAILED.ENTRY_DTM$ to 5
equ PROC_QUEUE_FAILED.NUM_ATTEMPTS$ to 6
#endif

View File

@ -83,4 +83,5 @@ Equ REACTOR_HGCV_CHECKLIST_ACTIVE$ To 71
Equ REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ To 72 Equ REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ To 72
Equ REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ To 73 Equ REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ To 73
Equ REACTOR_ABORT_ALARM_COMPLETE$ To 74 Equ REACTOR_ABORT_ALARM_COMPLETE$ To 74
Equ REACTOR_EXHAUST_CHAMBER_THK$ To 75