function recipe_browse_comm(Branch, CurParam) declare function set_property, fieldcount, get_property, msg, dialog_box declare function send_message, utility, key_sort, start_window, entid, repository declare function relational_call, send_event declare subroutine extract_si_keys, update_Index, end_dialog, make.list, btree.extract $insert msg_equates $insert lsl_users_equ $insert rds_equ $insert rds_layer_info_equ $insert logical $insert popup_equates $insert recipe_equ $insert recipe_layer_info_equ $insert recipe_info_array_equ $INSERT RDS_LAYER_EQUATES equ Hidden$ to 32 equ CrLf$ to char(13):char(10) RecipeControls = 'EPI_DOPANT/EPI_TIME/EPI_TEMP/EPI_H2_FLOW/EPI_DOPANT_FLOW/EPI_DILUENT/TCS_FLOW/DCS_FLOW/' RecipeControls:= 'AUX1/AUX2/EPI_GASES/EPI_GAS_RATE/EPI_GASUNITS/BAKE_TIME/ETCH_TIME/HCL_FLOW/ADJ_DILUENT' equ Dopant$ to 1 equ DepTime$ to 2 equ Temp$ to 3 equ H2Flow$ to 4 equ DopantFlow$ to 5 equ Diluent$ to 6 equ TCS$ to 7 equ DCS$ to 8 equ Aux1$ to 9 equ Aux2$ to 10 equ Gases$ to 11 equ GasRate$ to 12 equ GasUnit$ to 13 equ BakeTime$ to 14 equ EtchTime$ to 15 equ HCLFlow$ to 16 equ AdjDiluent$ to 17 TemperatureControls = 'F_OFFSET/S_OFFSET/R_OFFSET/INJECTORS' MainControls = 'REACTOR/RECIPE_NO/RECIPE_NAME/PSN/WO/RDS_NO/RUN_ORDER' swap '/' with @rm:@window:'.' In TemperatureControls TemperatureControls = @window:'.':TemperatureControls swap '/' with @rm:@window:'.' In RecipeControls RecipeControls = @window:'.':RecipeControls swap '/' with @rm:@window:'.' In MainControls MainControls = @window:'.':MainControls AllControls = MainControls:@rm:RecipeControls:@rm:TemperatureControls * open 'DICT.RDS' to DictRDSTable else Void = msg( '', 'Unable to open DICT.RDS...' ) return 0 end * ReturnVar = 0 Branches = 'REACT_REC_ON_CHANGE,CLEAR,SEARCH,CHANGE_WO,CHANGE_BOX,CHANGE_LAYER,SET_ADJUST_PARAMS' convert ',' to @fm in Branches locate Branch in Branches using @fm setting Bpos then on Bpos gosub REACT_REC_ON_CHANGE, CLEAR, SEARCH, CHANGE_WO, CHANGE_BOX, CHANGE_LAYER, SET_ADJUST_PARAMS end else Void = msg( '', 'Invalid Branch ':Bpos:' passed to recipe_browse_comm' ) end return ReturnVar *============================================================================* REACT_REC_ON_CHANGE: * CurParam null if ( get_property( @window:'.REACTOR', 'TEXT' ) <> '' ) and ( (get_property( @window:'.PSN', 'TEXT') <> '') OR (get_property( @window:'.RECIPE_NO', 'TEXT' ) <> '') ) then Void = set_property( @window:'.SEARCH', 'VISIBLE', 1 ) end else Void = set_property( @window:'.SEARCH', 'VISIBLE', 0 ) end return *============================================================================* CLEAR: Void = set_property( AllControls, 'TEXT', '' ) Void = set_property( @window:'.REACTOR', 'ENABLED', 1 ) Void = set_property( @window:'.RECIPE_NO', 'ENABLED', 1 ) Void = set_property( @window:'.PSN', 'ENABLED', 1 ) Void = send_event( @window:'.REACTOR', 'GOT_FOCUS' ) Void = set_property( 'SYSTEM', 'FOCUS', @window:'.REACTOR' ) Void = set_property( @window:'.WO_BEG', 'ENABLED', 0 ) Void = set_property( @window:'.WO_PREV', 'ENABLED', 0 ) Void = set_property( @window:'.WO_NEXT', 'ENABLED', 0 ) Void = set_property( @window:'.WO_END', 'ENABLED', 0 ) Void = set_property( @window:'.RO_BEG', 'ENABLED', 0 ) Void = set_property( @window:'.RO_PREV', 'ENABLED', 0 ) Void = set_property( @window:'.RO_NEXT', 'ENABLED', 0 ) Void = set_property( @window:'.RO_END', 'ENABLED', 0 ) Void = set_property( @window:'.LAY_BEG', 'ENABLED', 0 ) Void = set_property( @window:'.LAY_PREV', 'ENABLED', 0 ) Void = set_property( @window:'.LAY_NEXT', 'ENABLED', 0 ) Void = set_property( @window:'.LAY_END', 'ENABLED', 0 ) Void = set_property( @window:'.GOTO_RDS', 'VISIBLE', 0 ) Void = set_property( @window:'.PRINT', 'VISIBLE', 0 ) Void = set_property( @window:'.INST_REC_BUTTON', 'VISIBLE', 0 ) Void = set_property( @window:'.WO_BOX_LABEL', 'TEXT', '' ) Void = set_property( @window:'.BOX_LABEL', 'TEXT', '' ) Void = set_property( @window:'.WO_LABEL', 'TEXT', '' ) Void = set_property( @window:'.LAYER_LABEL', 'TEXT', '' ) Void = set_property( @window, '@WOCnt', '' ) Void = set_property( @window, '@WOCurPos', '' ) Void = set_property( @window, '@WOS', '' ) Void = set_property( @window, '@RDSCnt', '' ) Void = set_property( @window, '@RDSCurPos', '' ) Void = set_property( @window, '@RDSS', '' ) Void = set_property( @window, '@LayCnt', '' ) Void = set_property( @window, '@LayCurPos', '' ) Void = set_property( @window, '@Layers', '' ) Void = set_property( @window, '@TemperatureData', '' ) return *============================================================================* SEARCH: *CurParam is null Reactor = get_property( @window:'.REACTOR', 'TEXT' ) RecipeNo = get_property( @window:'.RECIPE_NO', 'TEXT' ) PSN = get_property( @window:'.PSN', 'TEXT' ) SearchStr = '' if Reactor <> '' then SearchStr<-1> = 'REACTOR':@vm:Reactor end if RecipeNo <> '' then SearchStr<-1> = 'RECIPE_NO':@vm:RecipeNo end if PSN <> '' then SearchStr<-1> = 'PROD_SPEC_ID':@vm:PSN end SearchStr := @fm Void = utility( 'CURSOR', 'H' ) * do a btree.extract * POSSIBLY ONLY EXTRACT RECORDS WITH DATE OUT btree.extract( SearchStr, 'RDS', DictRDSTable, Keys, '', Flag ) if Flag <> 0 then Void = msg( '', 'Error while extracting RDS records...' ) return 0 end if Keys then convert @vm to @fm in Keys Keys = key_sort( Keys, 'RDS', 'WO':@fm:'RUN_ORDER_NUM', 0 ) TWos = xlate( 'RDS', Keys, rds_wo$, 'X' ) Kcnt = fieldcount( Keys, @fm ) Wos = '' for i = 1 to Kcnt WoToFind = TWos locate WoToFind in Wos using @fm setting Fpos else Wos := WoToFind:@fm end next i Wos[-1,1] = '' NWos = fieldcount( Wos, @fm ) Void = set_property( @window, '@Wos', Wos ) Void = set_property( @window, '@WoCnt', NWos ) Void = set_property( @window, '@WOCurPos', '' ) CurParam = NWos ;* set it to the last work order (last one used) gosub CHANGE_WO Void = set_property( @window:'.SEARCH', 'VISIBLE', 0 ) Void = set_property( @window:'.WO_BEG', 'ENABLED', 1 ) Void = set_property( @window:'.WO_PREV', 'ENABLED', 1 ) Void = set_property( @window:'.WO_NEXT', 'ENABLED', 1 ) Void = set_property( @window:'.WO_END', 'ENABLED', 1 ) Void = set_property( @window:'.RO_BEG', 'ENABLED', 1 ) Void = set_property( @window:'.RO_PREV', 'ENABLED', 1 ) Void = set_property( @window:'.RO_NEXT', 'ENABLED', 1 ) Void = set_property( @window:'.RO_END', 'ENABLED', 1 ) Void = set_property( @window:'.LAY_BEG', 'ENABLED', 1 ) Void = set_property( @window:'.LAY_PREV', 'ENABLED', 1 ) Void = set_property( @window:'.LAY_NEXT', 'ENABLED', 1 ) Void = set_property( @window:'.LAY_END', 'ENABLED', 1 ) Void = set_property( @window:'.GOTO_RDS', 'VISIBLE', 1 ) Void = set_property( @window:'.PRINT', 'VISIBLE', 1 ) Void = set_property( @window:'.INST_REC_BUTTON', 'VISIBLE', 1 ) Void = set_property( @window:'.REACTOR', 'ENABLED', 0 ) Void = set_property( @window:'.RECIPE_NO', 'ENABLED', 0 ) Void = set_property( @window:'.PSN', 'ENABLED', 0 ) end else MsgInfo = '' MsgInfo = 'No records found meeting your criteria...' MsgInfo = '!' Void = msg( '', MsgInfo ) end Void = utility( 'CURSOR', 'A' ) return 0 *============================================================================* CHANGE_WO: * CurParam will be an integer representing the first or the last work order * or it will either be PREVIOUS or NEXT ProcessWo = true$ if num(CurParam) then ;* called from search will have the last wo * no need to check to see if in range if CurParam = 1 and get_property( @window, '@WoCurPos' ) = 1 then MsgInfo = '' MsgInfo = 'You are on the first Work Order...' MsgInfo = 'H' ProcessWo = false$ Void = msg( '', MsgInfo ) end else if CurParam = get_property( @window, '@WoCurPos' ) then MsgInfo = '' MsgInfo = 'You are on the last Work Order...' MsgInfo = 'H' ProcessWo = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@WoCurPos', CurParam ) WoToUse = get_property( @window, '@Wos' ) end end end else if CurParam = 'NEXT' then if get_property( @window, '@WoCurPos' ) = get_property( @window, '@WoCnt' ) then MsgInfo = '' MsgInfo = 'You are on the last Work Order...' MsgInfo = 'H' ProcessWo = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@WoCurPos', get_property( @window, '@WoCurPos' ) + 1 ) WoToUse = get_property( @window, '@Wos' ) end end else if CurParam = 'PREVIOUS' then if get_property( @window, '@WoCurPos' ) = 1 then MsgInfo = '' MsgInfo = 'You are on the first Work Order...' MsgInfo = 'H' ProcessWo = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@WoCurPos', get_property( @window, '@WoCurPos' ) - 1 ) WoToUse = get_property( @window, '@Wos' ) end end end end if ProcessWo then SearchStr = '' SearchStr<-1> = 'WO':@vm:WoToUse SearchStr := @fm Void = utility( 'CURSOR', 'H' ) * do a btree.extract btree.extract( SearchStr, 'RDS', DictRDSTable, Keys, '', Flag ) if Flag <> 0 then Void = msg( '', 'Error while extracting RDS records...' ) return 0 end if Keys then convert @vm to @fm in Keys Keys = key_sort( Keys, 'RDS', 'RUN_ORDER_NUM', 0 ) for i = 2 to 999 Found = index( Keys, '.':i, 1 ) until Found = 0 next i i - = 1 Tcnt = fieldcount( Keys, @fm ) *TLabel = get_property( @window:'.WO_BOX_LABEL', 'TEXT' ) *convert 1234567890 to '' in TLabel *convert ' ' to '' in TLabel TLabel = Tcnt/i:' Boxes' Void = set_property( @window:'.WO_BOX_LABEL', 'TEXT', TLabel ) Void = set_property( @window:'.WO', 'TEXT', WoToUse ) WoBoxLabel = get_property( @window, '@WoCurPos' ):' of ':get_property( @window, '@WoCnt' ) Void = set_property( @window:'.WO_LABEL', 'TEXT', WoBoxLabel ) * now setup rds common var - meaning choose boxes that actually ran * on that reactor and that recipe; cause the work order may have been * split SearchStr = '' SearchStr<-1> = 'WO':@vm:WoToUse SearchStr<-1> = 'REACTOR':@vm:get_property( @window:'.REACTOR', 'TEXT' ) RecipeNo = get_property( @window:'.RECIPE_NO', 'TEXT' ) PSN = get_property( @window:'.PSN', 'TEXT' ) if RecipeNo <> '' then SearchStr<-1> = 'RECIPE_NO':@vm:RecipeNo end if PSN <> '' then SearchStr<-1> = 'PROD_SPEC_ID':@vm:PSN end SearchStr := @fm * do a btree.extract btree.extract( SearchStr, 'RDS', DictRDSTable, Keys, '', Flag ) if Flag <> 0 then Void = msg( '', 'Error while extracting RDS records...' ) return 0 end convert @vm to @fm in Keys Keys = key_sort( Keys, 'RDS', 'RUN_ORDER_NUM', 0 ) NRdss = fieldcount( Keys, @fm ) Void = set_property( @window, '@RDSS', Keys ) Void = set_property( @window, '@RDSCnt', NRdss ) Void = set_property( @window, '@RDSCurPos', '' ) CurParam = 1 ;* set it to the first run order that was run on ;* that reactor and recipe gosub CHANGE_BOX end Void = utility( 'CURSOR', 'A' ) end return *============================================================================* CHANGE_BOX: * CurParam will be an integer representing the first or the last BOX RUN * or it will either be PREVIOUS or NEXT ProcessBox = true$ if num(CurParam) then * no need to check to see if in range if CurParam = 1 and get_property( @window, '@RDSCurPos' ) = 1 then MsgInfo = '' MsgInfo = 'You are on the first first box that was run...' MsgInfo = 'H' ProcessBox = false$ Void = msg( '', MsgInfo ) end else if CurParam = get_property( @window, '@RDSCurPos' ) then MsgInfo = '' MsgInfo = 'You are on the last box that was run...' MsgInfo = 'H' ProcessBox = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@RDSCurPos', CurParam ) RdsToUse = get_property( @window, '@RDSS' ) end end end else if CurParam = 'NEXT' then if get_property( @window, '@RDSCurPos' ) = get_property( @window, '@RDSCnt' ) then MsgInfo = '' MsgInfo = 'You are on the last box that was run...' MsgInfo = 'H' ProcessBox = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@RDSCurPos', get_property( @window, '@RDSCurPos' ) + 1 ) RDSToUse = get_property( @window, '@RDSS' ) end end else if CurParam = 'PREVIOUS' then if get_property( @window, '@RDSCurPos' ) = 1 then MsgInfo = '' MsgInfo = 'You are on the first box that was run...' MsgInfo = 'H' ProcessBox = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@RDSCurPos', get_property( @window, '@RDSCurPos' ) - 1 ) RDSToUse = get_property( @window, '@RDSS' ) end end end end if ProcessBox then Void = set_property( @window:'.RDS_NO', 'TEXT', RDSToUse ) RunOrderNo = xlate( 'RDS', RDSToUse, 'RUN_ORDER_NUM', 'X' ) Void = set_property( @window:'.RUN_ORDER', 'TEXT', RunOrderNo ) TLabel = 'Box ':get_property( @window, '@RDSCurPos' ):' of ':get_property( @window, '@RDSCnt' ) Void = set_property( @window:'.BOX_LABEL', 'TEXT', TLabel ) ThisRdsRec = xlate( 'RDS', RDSToUse, '', 'X' ) RDSLayerKeys = XLATE('RDS',RDSToUse,'RDS_LS_SORTED','X') ;* Sorted Layer Set Keys LayerCnt = COUNT(RDSLayerKeys,@VM) + (RDSLayerKeys NE '') TData = '' Layers = '' FOR L = 1 TO LayerCnt RDSLayerKey = RDSLayerKeys<1,L> RDSLayerRec = XLATE('RDS_LAYER',RDSLayerKey,'','X') Layers = RDSLayerRec Layers = RDSLayerRec Layers = XLATE('RECIPE',RDSLayerRec,'EPI_TEMP','X') Layers = RDSLayerRec Layers = RDSLayerRec Layers = RDSLayerRec Layers = RDSLayerRec Layers = RDSLayerRec Layers = RDSLayerRec Layers = RDSLayerRec Layers = XLATE('RECIPE',RDSLayerRec,'EPI_GASES','X') Layers = XLATE('RECIPE',RDSLayerRec,'EPI_GAS_RATE', 'X' ) Layers = XLATE('RECIPE',RDSLayerRec,'EPI_GASES_UNIT', 'X' ) Layers = RDSLayerRec Layers = XLATE('RECIPE',RDSLayerRec,'ETCH_TIME', 'X' ) Layers = RDSLayerRec Layers = RDSLayerRec IF L = 1 THEN TData = RDSLayerRec:@RM TData := RDSLayerRec:@RM TData := RDSLayerRec:@RM TData := ThisRdsRec END NEXT L /* * now get layer information...start with base layer and then * on layers 2-nnn only put in the DEPOSIT_TIME AND THE DOPANT_FLOW, DOPANT, DILUENT Layers = '' Layers<1,Dopant$> = xlate('RDS',RDSToUse,'DOPANT_L1', 'X' ) Layers<1,DepTime$> = XLATE('RDS',RDSToUse,'EPI_TIME','X') ;* ThisRdsRec Layers<1,Temp$> = xlate('RDS',RDSToUse,'TEMP', 'X' ) Layers<1,H2Flow$> = XLATE('RDS',RDSToUse,'EPI_H2_FLOW','X') ;* ThisRdsRec Layers<1,DopantFlow$> = XLATE('RDS',RDSToUse,'DOPANT_FLOW','X') ;* ThisRdsRec Layers<1,Diluent$> = xlate('RDS',RDSToUse,'DILUENT_L1', 'X' ) Layers<1,TCS$> = XLATE('RDS',RDSToUse,'TCS_FLOW','X') ;* ThisRDSREc Layers<1,DCS$> = XLATE('RDS',RDSToUse,'DCS_FLOW','X') ;* ThisRDSRec Layers<1,Aux1$> = XLATE('RDS',RDSToUse,'AUX1','X') ;* ThisRDSRec Layers<1,Aux2$> = XLATE('RDS',RDSToUse,'AUX2','X') ;* ThisRDSRec Layers<1,Gases$> = xlate('RDS',RDSToUse,'GASES', 'X' ) Layers<1,GasRate$> = xlate('RDS',RDSToUse,'GAS_RATE', 'X' ) Layers<1,GasUnit$> = xlate('RDS',RDSToUse,'GAS_UNIT', 'X' ) Layers<1,BakeTime$> = XLATE('RDS',RDSToUse,'BAKE_TIME','X') ;* ThisRdsRec Layers<1,EtchTime$> = xlate('RDS',RDSToUse,'ETCH_TIME', 'X' ) Layers<1,HCLFlow$> = XLATE('RDS',RDSToUse,'HCL_FLOW','X') ;* ThisRDSRec Layers<1,AdjDiluent$> = XLATE('RDS',RDSToUse,'DILUENT_ADJ_PARAM','X') ;* ThisRDSRec * THIS IS LAYER ONE SO DISPLAY TEMPERATURE OFFSETS AND INJECTORS FOffset = XLATE('RDS',RDSToUse,'F_OFFSET','X') SOffset = XLATE('RDS',RDSToUse,'S_OFFSET','X') ROffset = XLATE('RDS',RDSToUse,'R_OFFSET','X') TData = FOffset:@fm:SOffset:@fm:ROffset:@fm:ThisRdsRec convert @fm to @rm in TData */ Void = set_property( TemperatureControls, 'TEXT', TData ) Void = set_property( @window, '@TemperatureData', TData ) /* * LayerInfo = ThisRdsRec convert char(248) to @fm in LayerInfo Lcnt = fieldcount( LayerInfo, @fm ) DopantAll = xlate( 'RDS', RDSToUse, 'DOPANT_ALL', 'X' ) DiluentAll = xlate( 'RDS', RDSToUse, 'DILUENT_ALL', 'X' ) * DELETE LAYER ONE CAUSE IT HAS ALREDY BEEN USED ABOVE DopantAll = delete( DopantAll, 1, 1, 0 ) DiluentAll = delete( DiluentAll, 1, 1, 0 ) for i = 1 to Lcnt *Layers := char(248):ThisRdsRec ThisLayer = LayerInfo TLayer = '' * TLayer<1,Dopant$> = DopantAll<1,i> TLayer<1,DepTime$> = ThisLayer<1,RLEpiTime$> TLayer<1,Temp$> = '' TLayer<1,H2Flow$> = '' TLayer<1,DopantFlow$> = ThisLayer<1,RLDopantFlow$> TLayer<1,Diluent$> = DiluentAll<1,i> TLayer<1,TCS$> = '' TLayer<1,DCS$> = '' TLayer<1,Aux1$> = '' TLayer<1,Aux2$> = '' TLayer<1,Gases$> = '' TLayer<1,GasRate$> = '' TLayer<1,GasUnit$> = '' TLayer<1,BakeTime$> = '' TLayer<1,EtchTime$> = '' Layers := char(248):TLayer next i */ CONVERT @FM TO CHAR(248) IN Layers Void = set_property( @window, '@Layers', Layers ) Void = set_property( @window, '@LayCnt', LayerCnt ) Void = set_property( @window, '@LayCurPos', '' ) CurParam = 1 ;* set it to the first layer GOSUB CHANGE_LAYER END RETURN *============================================================================* CHANGE_LAYER: * CurParam will be an integer representing the first or the last SAME * REACTOR LAYER...first layer will be the recipe specific fields in RDS and * layer 2-999 will come out of the rds_layer_info field with each layer * delimited by char(248) or it will either be PREVIOUS or NEXT ProcessLayer = true$ if num(CurParam) then * no need to check to see if in range if CurParam = 1 and get_property( @window, '@LayCurPos' ) = 1 then MsgInfo = '' MsgInfo = 'You are on the first layer...' MsgInfo = 'H' ProcessLayer = false$ Void = msg( '', MsgInfo ) end else if CurParam = get_property( @window, '@LayCurPos' ) then MsgInfo = '' MsgInfo = 'You are on the last layer...' MsgInfo = 'H' ProcessLayer = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@LayCurPos', CurParam ) LayToUse = get_property( @window, '@Layers' ) end end end else if CurParam = 'NEXT' then if get_property( @window, '@LayCurPos' ) = get_property( @window, '@LayCnt' ) then MsgInfo = '' MsgInfo = 'You are on the last layer...' MsgInfo = 'H' ProcessLayer = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@LayCurPos', get_property( @window, '@LayCurPos' ) + 1 ) LayToUse = get_property( @window, '@Layers' ) end end else if CurParam = 'PREVIOUS' then if get_property( @window, '@LayCurPos' ) = 1 then MsgInfo = '' MsgInfo = 'You are on the first layer...' MsgInfo = 'H' ProcessLayer = false$ Void = msg( '', MsgInfo ) end else Void = set_property( @window, '@LayCurPos', get_property( @window, '@LayCurPos' ) - 1 ) LayToUse = get_property( @window, '@Layers' ) end end end end if ProcessLayer then CurLayer = field( get_property( @window, '@Layers' ), char(248), get_property( @window, '@LayCurPos' ) ) CurLayer<1,DepTime$> = oconv( CurLayer<1,DepTime$>, 'MD1' ) CurLayer<1,DopantFlow$> = oconv( CurLayer<1,DopantFlow$>, 'MD2' ) CurLayer<1,Diluent$> = oconv( CurLayer<1,Diluent$>, 'MD2' ) CurLayer<1,TCS$> = oconv( CurLayer<1,TCS$>, 'MD1' ) CurLayer<1,Aux1$> = oconv( CurLayer<1,Aux1$>, 'MD2' ) CurLayer<1,Aux2$> = oconv( CurLayer<1,Aux2$>, 'MD2' ) CurLayer<1,GasRate$> = oconv( CurLayer<1,GasRate$>, 'MD2' ) CurLayer<1,BakeTime$> = oconv( CurLayer<1,BakeTime$>, '[SECONDS_CONV]' ) CurLayer<1,EtchTime$> = oconv( CurLayer<1,EtchTime$>, '[SECONDS_CONV]' ) CurLayer<1,HCLFlow$> = oconv( CurLayer<1,HCLFlow$>, 'MD2' ) CurLayer<1,AdjDiluent$> = oconv( CurLayer<1,AdjDiluent$>, 'MD2' ) DataToLoad = field( CurLayer, @vm, 1, fieldcount( RecipeControls, @rm ) ) convert @vm to @rm in DataToLoad Void = set_property( RecipeControls, 'TEXT', DataToLoad ) TLabel = 'Layer ':get_property( @window, '@LayCurPos' ):' of ':get_property( @window, '@LayCnt' ) Void = set_property( @window:'.LAYER_LABEL', 'TEXT', TLabel ) if get_property( @window, '@LayCurPos' ) > 1 then * IF WE ARE NOT ON THE FIRST LAYER THEN SHOW NOTHIN IN THE TEMPERATURE AND INJECTOR SETTINGS Void = set_property( TemperatureControls, 'TEXT', '' ) end else TempData = get_property( @window, '@TemperatureData' ) Void = set_property( TemperatureControls, 'TEXT', TempData ) end end return *============================================================================* SET_ADJUST_PARAMS: * THIS SUBROUTINE IS CALLED FROM THE RECIPE_BROWSE2 WINDOW ONLY PSNId = CurParam RDSId = get_property( 'RECIPE_BROWSE.RDS_NO', 'TEXT' ) IdToUse = xlate( 'RDS', RDSId, 'RECIPE_NO', 'X' ) ;* 4/14/2006 JCH RecipeRec = xlate( 'RECIPE', IdToUse, '', 'X' ) PSNs = RecipeRec locate PSNId in PSNs using @vm setting Rpos else * THE PSN IS NOT FOUND IN THE RECIPE SO USE THE TOP ROW LIMITS Rpos = 1 end DepMin = RecipeRec DepMax = RecipeRec DiluentFlowMin = RecipeRec DiluentFlowMax = RecipeRec DopantFlowMin = RecipeRec DopantFlowMax = RecipeRec HCLFlowMin = RecipeRec HCLFlowMax = RecipeRec BakeMin = RecipeRec BakeMax = RecipeRec H2Min = RecipeRec H2Max = RecipeRec TCSMin = RecipeRec TCSMax = RecipeRec DCSMin = RecipeRec DCSMax = RecipeRec Aux1Min = RecipeRec Aux1Max = RecipeRec Aux2Min = RecipeRec Aux2Max = RecipeRec FOffsetMin = RecipeRec FOffsetMax = RecipeRec SOffsetMin = RecipeRec SOffsetMax = RecipeRec ROffsetMin = RecipeRec ROffsetMax = RecipeRec LayerInfo = RecipeRec LimitStyles = send_message( @window:'.RECIPE_LIMITS', "COLSTYLE", 0, '' ) CurArray = get_property( @window:'.RECIPE_LIMITS', 'ARRAY' ) CurLArray = get_property( @window:'.RECIPE_LAYER_LIMTS', 'ARRAY' ) convert char(248) to @fm in LayerInfo LACnt = fieldcount( LayerInfo, @fm ) for i = 1 to LACnt CurLArray<1,i> = i+1 CurLArray<2,i> = oconv( LayerInfo, 'MD1' ):'~':oconv( LayerInfo, 'MD1' ) CurLArray<3,i> = oconv( LayerInfo, 'MD2' ):'~':oconv( LayerInfo, 'MD2' ) next i Void = set_property( 'RECIPE_BROWSE2.RECIPE_LAYER_LIMITS', 'ARRAY', CurLArray ) if ( DepMin = '' ) and ( DepMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( DepMin, 'MD1' ):'~':oconv( DepMax, 'MD1' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( DiluentFlowMin = '' ) and ( DiluentFlowMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( DiluentFlowMin, 'MD2' ):'~':oconv( DiluentFlowMax, 'MD2' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( DopantFlowMin = '' ) and ( DopantFlowMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( DopantFlowMin, 'MD2' ):'~':oconv( DopantFlowMax, 'MD2' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( HCLFlowMin = '' ) and ( HCLFlowMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( HCLFlowMin, 'MD2' ):'~':oconv( HCLFlowMax, 'MD2' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( BakeMin = '' ) and ( BakeMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( BakeMin, '[SECONDS_CONV]' ):'~':oconv( BakeMax, '[SECONDS_CONV]' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( H2Min = '' ) and ( H2Max = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( H2Min, 'MD0' ):'~':oconv( H2Max, 'MD0' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( TCSMin = '' ) and ( TCSMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( TCSMin, 'MD1' ):'~':oconv( TCSMax, 'MD1' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( DCSMin = '' ) and ( DCSMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( DCSMin, 'MD0' ):'~':oconv( DCSMax, 'MD0' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( Aux1Min = '' ) and ( Aux1Max = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( Aux1Min, 'MD2' ):'~':oconv( Aux1Max, 'MD2' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( Aux2Min = '' ) and ( Aux2Max = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = oconv( Aux2Min, 'MD2' ):'~':oconv( Aux2Max, 'MD2' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( FOffsetMin = '' ) and ( FOffsetMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = iconv( FOffsetMin, 'MD0' ):'~':iconv( FOffsetMax, 'MD0' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( SOffsetMin = '' ) and ( SOffsetMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = iconv( SOffsetMin, 'MD0' ):'~':iconv( SOffsetMax, 'MD0' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end if ( ROffsetMin = '' ) and ( ROffsetMax = '' ) then LimitStyles = bitor( LimitStyles, Hidden$ ) end else CurArray = iconv( ROffsetMin, 'MD0' ):'~':iconv( ROffsetMax, 'MD0' ) LimitStyles = bitand( LimitStyles, bitnot(Hidden$) ) end LimitStyles = send_message( @window:'.RECIPE_LIMITS', "COLSTYLE", 0, LimitStyles ) Void = set_property( @window:'.RECIPE_LIMITS', "AUTOSIZECOL", 14 ) Void = set_property( @window:'.RECIPE_LIMITS', 'ARRAY', CurArray ) return *============================================================================*