LoadOTAlm_Out_b , ET=>loadottime ); LoadStage := 0 ; PodLoadRunning_b := FALSE ; LOAD_STEP_DELAY_EN:=FALSE; LOAD_STEP_NEXT:=0; END_IF ; IF NOT UnloadCmd_In_b OR ( UnloadOTAlm_Out_b AND PodSeqAlmRst_In_b ) OR StopCmd_In_b THEN UnloadOTAlm( In:= FALSE , PT:= T#60s , Q=> UnloadOTAlm_Out_b , ET=>unloadottime ); UnloadStage := 0 ; PodUnloadRunning_b := FALSE ; UNLOAD_STEP_DELAY_EN:=FALSE; UNLOAD_STEP_NEXT:=0; END_IF; IF Enable THEN //Alarm IF LoadCmd_In_b AND NOT StopCmd_In_b AND LoadStage>0 THEN LoadOTAlm( In:= TRUE , PT:= T#60s , Q=> LoadOTAlm_Out_b , ET=>loadottime ); (*ELSIF NOT LoadCmd_In_b OR ( LoadOTAlm_Out_b AND PodSeqAlmRst_In_b ) OR StopCmd_In_b THEN LoadOTAlm( In:= FALSE , PT:= T#60s , Q=> LoadOTAlm_Out_b , ET=>loadottime ); LoadStage := 0 ; PodLoadRunning_b := FALSE ;*) END_IF; IF UnloadCmd_In_b AND NOT StopCmd_In_b AND UnloadStage>0 THEN UnloadOTAlm( In:= TRUE , PT:= T#60s , Q=> UnloadOTAlm_Out_b , ET=>unloadottime ); (*ELSIF NOT UnloadCmd_In_b OR ( UnloadOTAlm_Out_b AND PodSeqAlmRst_In_b ) OR StopCmd_In_b THEN UnloadOTAlm( In:= FALSE , PT:= T#60s , Q=> UnloadOTAlm_Out_b , ET=>unloadottime ); UnloadStage := 0 ; PodUnloadRunning_b := FALSE ;*) END_IF; //Unload FIMSUnloadDlyOn.In := UnloadCmd_In_b ; FIMSUnloadDlyOn((*In:=,*) PT:=T#100MS(*, Q=>, ET=>*)); UNLOAD_STEP_DELAY(In:=UNLOAD_STEP_DELAY_EN,PT:=UNLOAD_STEP_DELAY_TIME); IF UnloadCmd_In_b THEN FIMSUnloadTrig( Clk:= FIMSUnloadDlyOn.Q ); IF FIMSUnloadTrig.Q THEN UnloadStage := 0 ; END_IF; CASE UnloadStage OF 0://门板Y轴归位 PodLoadDone_Out_b := FALSE ; PodUnloadDone_Out_b := FALSE ; PodUnloadRunning_b := TRUE ; PodDrYClsVal_Out_b := TRUE ; PodDrYOpVal_Out_b := FALSE ; (*UnloadOTAlm( In:= PodDrYClsVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*) IF PodDrYClsVal_Out_b AND PodDrYClsPos_In_b AND NOT PodDrYOpPos_In_b AND NOT UnloadOTAlm_Out_b THEN UNLOAD_STEP_DELAY_EN:=TRUE; UNLOAD_STEP_NEXT:=10; UNLOAD_STEP_DELAY_TIME:=T#200ms; UnloadStage := 200 ; END_IF; 10://Pod 门板移动 seal PodSealVal_Out_b := TRUE ; PodRealseVal_Out_b := FALSE ; (*UnloadOTAlm( In:= PodSealVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*) IF PodSealVal_Out_b AND FoupInSealPos_In_b AND NOT FoupInRlsPos_In_b AND NOT UnloadOTAlm_Out_b THEN N2PurgePodClsVal_Out_b := TRUE ; UNLOAD_STEP_DELAY_EN:=TRUE; UNLOAD_STEP_NEXT:=30; UNLOAD_STEP_DELAY_TIME:=T#200ms; UnloadStage := 200 ; END_IF; (*20://pod门板x轴避让归位 PodDrXaxisAvoidClsVal_Out_b :=TRUE ; PodDrXaxisAvoidOpVal_Out_b := FALSE ; [*UnloadOTAlm( In:= PodDrXaxisAvoidClsVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*] IF PodDrXaxisAvoidClsVal_Out_b AND PodDrXaxisAvoidInDnPos_In_b AND NOT PodDrXaxisAvoidInUpPos_In_b AND NOT UnloadOTAlm_Out_b THEN UnloadStage := 30; END_IF;*) 30://foup latch on PodFoupLatchonVal_Out_b := TRUE ; PodFoupLatchoffVal_Out_b := FALSE ; KeyStatusTON(In:=PodFoupLatchonVal_Out_b, PT:=T#1s(*, Q=>, ET=>*)); (*UnloadOTAlm( In:= PodFoupLatchonVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*) IF PodFoupLatchonVal_Out_b AND FoupLatchOnPos_In_b AND NOT FoupLatchOffPos_In_b AND NOT UnloadOTAlm_Out_b AND KeyStatusTON.Q THEN UNLOAD_STEP_DELAY_EN:=TRUE; UNLOAD_STEP_NEXT:=40; UNLOAD_STEP_DELAY_TIME:=T#200ms; UnloadStage := 200 ; END_IF; 40://Vacuum off PodVacClsVal_Out_b := TRUE ; PodVacOpVal_Out_b := FALSE ; UnloadVacOffDly(In:=PodVacClsVal_Out_b, PT:=T#1.5s(*, Q=>, ET=>*)); IF PodVacATM_In_b OR UnloadVacOffDly.Q(*PodVacClsVal_Out_b AND PodVacStatus_In_b*) THEN UNLOAD_STEP_DELAY_EN:=TRUE; UNLOAD_STEP_NEXT:=50; UNLOAD_STEP_DELAY_TIME:=T#200ms; UnloadStage := 200 ; END_IF; 50:// retract KeyStatusTON(In:=FALSE, PT:=T#1s(*, Q=>, ET=>*)); PodRetractVal_Out_b := TRUE ; PodExtendVal_Out_b := FALSE ; (*UnloadOTAlm( In:= PodRetractVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*) IF PodRetractVal_Out_b AND FoupInRetractPos_In_b AND NOT FoupInExtendPos_In_b AND NOT UnloadOTAlm_Out_b (*AND FoupInPodPos_In_b*)THEN UNLOAD_STEP_DELAY_EN:=TRUE; UNLOAD_STEP_NEXT:=100; UNLOAD_STEP_DELAY_TIME:=T#200ms; UnloadStage := 200 ; END_IF; 100://Unload done UnloadOTAlm( In:= FALSE , PT:= T#60s , Q=> UnloadOTAlm_Out_b (*, ET=>*)); PodUnloadRunning_b := FALSE ; PodUnloadDone_Out_b := TRUE ; UNLOAD_STEP_DELAY_EN:=FALSE; 200://each step delay time IF UNLOAD_STEP_DELAY.Q THEN UNLOAD_STEP_DELAY_EN:=FALSE; UnloadStage := UNLOAD_STEP_NEXT ; END_IF; END_CASE; END_IF; //Load (*FIMSTrigDleyOn.In := LoadCmd_In_b ;*) FIMSTrigDleyOn.In := LoadCmd_In_b ; FIMSTrigDleyOn((*In:= LoadCmd_In_b ,*) PT:= T#100MS (*, Q=>, ET=>*)); LOAD_STEP_DELAY(In:=LOAD_STEP_DELAY_EN,PT:=LOAD_STEP_DELAY_TIME); IF LoadCmd_In_b THEN FIMSLoadTrig( Clk:= FIMSTrigDleyOn.Q ); IF FIMSLoadTrig.Q=TRUE THEN LoadStage:= 0; END_IF; CASE LoadStage OF 0://载台上foup有无检测 PodUnloadDone_Out_b := FALSE ; PodLoadDone_Out_b := FALSE ; PodLoadRunning_b := TRUE ; (*LoadOTAlm.In := NOT PodSeqAlmRst_In_b ;*) (*LoadOTAlm([*In:=,*] PT:=T#60s, Q=>LoadOTAlm_Out_b[*, ET=>*]);*) IF FoupInPodPos_In_b AND NOT LoadOTAlm_Out_b THEN LoadOTAlm.In :=FALSE ; LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=10; LOAD_STEP_DELAY_TIME:=T#200ms; loadStage := 200 ; END_IF; 10: //dock PodExtendVal_Out_b :=TRUE; PodRetractVal_Out_b:=FALSE; (*LoadOTAlm1(In:= PodExtendVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s, Q=> LoadOTAlm_Out_b [*, ET=>*] );*) IF PodExtendVal_Out_b=TRUE AND FoupInExtendPos_In_b=TRUE AND NOT FoupInRetractPos_In_b=TRUE AND NOT LoadOTAlm_Out_b=TRUE THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=20; LOAD_STEP_DELAY_TIME:=T#200ms; loadStage := 200 ; END_IF; 20: //vacuum on PodVacOpVal_Out_b := TRUE ; PodVacClsVal_Out_b := FALSE ; IF PodVacOpVal_Out_b=TRUE (* AND PodVacStatus_In_b=TRUE *) THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=30; LOAD_STEP_DELAY_TIME:=T#200ms; loadStage := 200 ; END_IF; 30: //foup latch off PodFoupLatchoffVal_Out_b := TRUE ; PodFoupLatchonVal_Out_b := FALSE ; KeyStatusTON1(In:=PodFoupLatchoffVal_Out_b, PT:=T#1s(*, Q=>, ET=>*)); (*LoadOTAlm2( In:= PodFoupLatchoffVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> LoadOTAlm_Out_b [*, ET=>*] );*) IF PodFoupLatchoffVal_Out_b AND FoupLatchOffPos_In_b AND NOT FoupLatchOnPos_In_b AND NOT LoadOTAlm_Out_b AND KeyStatusTON1.Q THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=31; LOAD_STEP_DELAY_TIME:=T#200ms; loadStage := 200 ; END_IF; 31://N2 Purge Judge IF N2PurgeBypassEN_In_b AND O2Check_EN THEN loadStage := 40 ; ELSE loadStage := 50; END_IF; 40://pod门板x轴避让归位 N2 SEAL PodDrXaxisAvoidClsVal_Out_b :=TRUE ; PodDrXaxisAvoidOpVal_Out_b := FALSE ; (*UnloadOTAlm( In:= PodDrXaxisAvoidClsVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*) IF PodDrXaxisAvoidClsVal_Out_b AND PodDrXaxisAvoidInDnPos_In_b AND NOT PodDrXaxisAvoidInUpPos_In_b AND NOT UnloadOTAlm_Out_b THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=41; LOAD_STEP_DELAY_TIME:=T#0ms; loadStage := 41 ; END_IF; 41: //Pod 门板移动 release PodRealseVal_Out_b := TRUE ; PodSealVal_Out_b := FALSE ; (*LoadOTAlm3( In:= PodRealseVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> LoadOTAlm_Out_b [*, ET=>*] );*) IF PodRealseVal_Out_b AND FoupInRlsPos_In_b AND NOT FoupInSealPos_In_b AND NOT LoadOTAlm_Out_b THEN N2PurgePodClsVal_Out_b := TRUE ; LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=42; LOAD_STEP_DELAY_TIME:=T#0ms; loadStage := 42 ; END_IF; 42: //N2 Purge and O2 detect N2PurgePodOpVal_Out_b := TRUE ; N2PurgePodClsVal_Out_b :=FALSE ; O2CheckVal_Out_b := TRUE ; IF N2PurgePodOpVal_Out_b AND N2PurgeValOpPos_In_b AND NOT N2PurgeValClPos_In_b AND O2Check_Done_In_b AND NOT LoadOTAlm_Out_b THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=43; LOAD_STEP_DELAY_TIME:=T#0ms; loadStage := 43 ; END_IF; 43://Pod 门板移动 seal PodSealVal_Out_b := TRUE ; PodRealseVal_Out_b := FALSE ; (*UnloadOTAlm( In:= PodSealVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*) IF PodSealVal_Out_b AND FoupInSealPos_In_b AND NOT FoupInRlsPos_In_b AND NOT UnloadOTAlm_Out_b THEN N2PurgePodClsVal_Out_b := TRUE ; LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=50; LOAD_STEP_DELAY_TIME:=T#200ms; loadStage := 200 ; END_IF; 50: // X轴避让 PodDrXaxisAvoidOpVal_Out_b := TRUE ; PodDrXaxisAvoidClsVal_Out_b := FALSE ; (*LoadOTAlm4( In:= PodDrXaxisAvoidOpVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> LoadOTAlm_Out_b [*, ET=>*] );*) IF PodDrXaxisAvoidOpVal_Out_b AND PodDrXaxisAvoidInUpPos_In_b AND NOT PodDrXaxisAvoidInDnPos_In_b AND NOT LoadOTAlm_Out_b THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=51; LOAD_STEP_DELAY_TIME:=T#0ms; loadStage := 51 ; END_IF; 51: //Pod 门板移动 release PodRealseVal_Out_b := TRUE ; PodSealVal_Out_b := FALSE ; (*LoadOTAlm3( In:= PodRealseVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> LoadOTAlm_Out_b [*, ET=>*] );*) IF PodRealseVal_Out_b AND FoupInRlsPos_In_b AND NOT FoupInSealPos_In_b AND NOT LoadOTAlm_Out_b THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=52; LOAD_STEP_DELAY_TIME:=T#200ms; loadStage := 200 ; END_IF; 52://X轴避让 PodDrXaxisAvoidOpVal_Out_b := TRUE ; PodDrXaxisAvoidClsVal_Out_b := FALSE ; //LoadOTAlm4( In:= PodDrXaxisAvoidOpVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> LoadOTAlm_Out_b [*, ET=>*] ); IF PodDrXaxisAvoidOpVal_Out_b AND PodDrXaxisAvoidInUpPos_In_b AND NOT PodDrXaxisAvoidInDnPos_In_b AND NOT LoadOTAlm_Out_b THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=60; LOAD_STEP_DELAY_TIME:=T#200ms; loadStage := 200 ; END_IF; (*53://vacuum off KeyStatusTON(In:=FALSE, PT:=T#1s[*, Q=>, ET=>*]); PodVacClsVal_Out_b := TRUE ; PodVacOpVal_Out_b := FALSE ; IF PodVacClsVal_Out_b AND PodVacStatus_In_b THEN LoadStage := 60 ; END_IF; *) 60://Y轴移动 PodDrYOpVal_Out_b := TRUE ; PodDrYClsVal_Out_b := FALSE ; (*LoadOTAlm5( In:= PodDrYOpVal_Out_b AND NOT PodSeqAlmRst_In_b , PT:= T#60s , Q=> UnloadOTAlm_Out_b [*, ET=>*] );*) IF PodDrYOpVal_Out_b AND PodDrYOpPos_In_b AND NOT PodDrYClsPos_In_b AND NOT UnloadOTAlm_Out_b THEN LOAD_STEP_DELAY_EN:=TRUE; LOAD_STEP_NEXT:=100; LOAD_STEP_DELAY_TIME:=T#0ms; loadStage := 100 ; END_IF; 100://Load done LoadOTAlm( In:= FALSE , PT:= T#60s , Q=> LoadOTAlm_Out_b (*, ET=>*)); PodLoadRunning_b := FALSE ; PodLoadDone_Out_b := TRUE ; 200://each step delay time IF LOAD_STEP_DELAY.Q THEN LOAD_STEP_DELAY_EN:=FALSE; loadStage := LOAD_STEP_NEXT ; END_IF; END_CASE; END_IF; PodRunning_Out_b := PodLoadRunning_b OR PodUnloadRunning_b ; END_IF;]]>