Browse Source

1.修改名称 2.增加unload

JET-YDB\JET-YANGDB 3 days ago
parent
commit
1fb2217bb6

BIN
VirgoRT/Config/DeviceModelVirgo.xml


+ 1 - 3
VirgoRT/Config/SequenceFormat.xml

@@ -5,9 +5,7 @@
       <Item Name="Position" DisplayName="Position" InputType="ReadOnlySelection"   >
         <Selection Name="Aligner" DisplayName="Aligner" Parameter="" />
         <Selection Name="PM" DisplayName="PM" Parameter="PMSelection,PMARecipe,PMBRecipe" />
-		<Selection Name="Flipper" DisplayName="Fliper" Parameter="Flipper" />
-		<Selection Name="Buffer" DisplayName="Buffer" Parameter="CoolingTime" />
-		<Selection Name="Cooling" DisplayName="Cooling" Parameter="CoolingTime" />
+		<Selection Name="Buffer" DisplayName="Cooling" Parameter="CoolingTime" />
       </Item>
     </Catalog>
 

+ 1 - 1
VirgoRT/Config/System.sccfg

@@ -102,7 +102,7 @@
 			<config default="0" name="WaferPlacementParityFlag" nameView="Parity Flag for wafer placement" description="0: all slot; 1:Odd slot; 2: Even slot。"  max="10" min="0" paramter="" tag="" unit="" type="Integer" />
       <config default="true" name="HasMapFunction" nameView="HasMapFunction" description="Has map function" max="0" min="0" paramter="" tag="" unit="" visible="true"  type="Bool" />
       <config default="true" name="HasLoadFunction" nameView="HasLoadFunction" description="Has load/unload function" max="0" min="0" paramter="" tag="" unit="" visible="true"  type="Bool" />
-
+      <config default="false" name="EnableAutoUnloadFoup" nameView="EnableAutoUnloadFoup" description="Enable Auto Unload Foup" max="0" min="0" paramter="" tag="" unit="" visible="true"  type="Bool" />
 		</configs>
 	</configs>
 

+ 1 - 1
VirgoRT/Devices/EdwardsPump.cs

@@ -254,7 +254,7 @@ namespace VirgoRT.Devices
 
         private void OnErrorOccurred(string obj)
         {
-            StatusDry = EdwardsPumpState.ERROR;
+            //StatusDry = EdwardsPumpState.ERROR;
             LOG.Error($"[{Module}] edwards pump error: [{obj}]");
         }
 

+ 1 - 1
VirgoRT/Devices/JetPM.cs

@@ -636,7 +636,7 @@ namespace VirgoRT.Devices
                 if (_trigWaterLeak.Q)
                 {
                     IO.DO[$"{ModuleName.PMA}.DO_EV5_Water_Valve"].Value = false;
-                    EV.PostMessage(Module.ToString(), EventEnum.DefaultAlarm, $"{Module} water leak");
+                    EV.PostMessage(Module.ToString(), EventEnum.DefaultAlarm, $"PM water leak");
                 }
                 if (IsWLK && !IO.DO[$"{ModuleName.PMA}.DO_EV5_Water_Valve"].Value)
                 {

+ 1 - 1
VirgoRT/Devices/SkyPump.cs

@@ -358,7 +358,7 @@ namespace VirgoRT.Devices
 
         private void OnErrorOccurred(string obj)
         {
-            StatusDry = SkyPumpState.ERROR;
+            //StatusDry = SkyPumpState.ERROR;
             LOG.Error($"[{Module}] sky pump error: [{obj}]");
         }
 

+ 87 - 0
VirgoRT/Modules/AutoTransfer_T.cs

@@ -26,6 +26,7 @@ using Aitex.Core.RT.Device;
 using Aitex.Core.RT.Log;
 using Aitex.Core.RT.RecipeCenter;
 using Aitex.Core.RT.DataCenter;
+using Aitex.Core.Util;
 
 namespace VirgoRT.Modules
 {
@@ -1719,14 +1720,100 @@ namespace VirgoRT.Modules
 
         #region public interface
 
+        private R_TRIG _trigLp1JobComplete = new R_TRIG();
+        private R_TRIG _trigLp2JobComplete = new R_TRIG();
+        private bool _isAutoUnloadFoup
+        {
+            get
+            {
+                return SC.GetValue<bool>("EFEM.LoadPort.EnableAutoUnloadFoup");
+            }
+        }
+
         public bool CheckAllJobDone()
         {
+            foreach (var moduleKey in dictSchedulers.Keys)
+            {
+                if (!ModuleHelper.IsLoadPort(moduleKey)) continue;
+                var lp = dictSchedulers[moduleKey] as SchedulerLoadPort;
+                if (lp != null && lp.IsAvailable)
+                {
+                    var trigLP = lp.Module == ModuleName.LP1 ? _trigLp1JobComplete : _trigLp2JobComplete;
+                    trigLP.CLK = CheckJobComplete(lp.Module.ToString());
+                    if (trigLP.Q)
+                    {
+                        if (_isAutoUnloadFoup)
+                        {
+                            lp.Unload(lp.Module);
+                        }
+
+                    }
+                }
+            }
+
             foreach (var cj in _lstControlJobs)
             {
                 if (cj.State == EnumControlJobState.Executing || cj.State == EnumControlJobState.Paused)
                     return false;
             }
 
+            return dictSchedulers.Where(p=>ModuleHelper.IsLoadPort(p.Key)).Select(p=>p.Value).All(p => p.IsAvailable);
+            //foreach (var cj in _lstControlJobs)
+            //{
+            //    if (cj.State == EnumControlJobState.Executing || cj.State == EnumControlJobState.Paused)
+            //        return false;
+            //}
+
+            //return true;
+        }
+
+        private bool CheckJobComplete(string lp = null)
+        {
+            if (_lstProcessJobs.Count == 0)
+                return false;
+
+            if (_lstControlJobs.Count == 0)
+                return false;
+
+            if (_isCycleMode && _cycledCount < _cycleSetPoint)
+                return false;
+
+            if (lp != null)
+            {
+                var cj = _lstControlJobs.Find(x => x.Module == lp);
+                if (cj == null)
+                    return false;
+            }
+
+            foreach (var pj in _lstProcessJobs)
+            {
+                if (lp == null)
+                {
+                    if (pj.State != EnumProcessJobState.ProcessingComplete)
+                    {
+                        return false;
+                    }
+                }
+            }
+
+            foreach (var cj in _lstControlJobs)
+            {
+                if (lp == null)
+                {
+                    if (cj.State != EnumControlJobState.Completed)
+                    {
+                        return false;
+                    }
+                }
+                else
+                {
+                    if (cj.Module == lp && cj.State != EnumControlJobState.Completed)
+                    {
+                        return false;
+                    }
+                }
+            }
+
             return true;
         }
 

+ 11 - 0
VirgoRT/Modules/EFEMs/EfemEntity.cs

@@ -142,6 +142,17 @@ namespace VirgoRT.Modules
 
             //_lpms[mod - ModuleName.LP1]..OnError();
         }
+
+        public void NotifyLP(ModuleName mod, LoadPortModule.MSG msg)
+        {
+            _lpms[mod - ModuleName.LP1].PostMsg(msg);
+        }
+
+        public bool IsLPIdle(ModuleName mod)
+        {
+            return _lpms[mod - ModuleName.LP1].IsReady;
+        }
+
         protected override bool Init()
         {
             _lpms[0] = new LoadPortModule(ModuleName.LP1, _efem);

+ 12 - 4
VirgoRT/Modules/Schedulers/SchedulerLoadPort.cs

@@ -8,6 +8,7 @@ using Aitex.Sorter.Common;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Schedulers;
 using MECF.Framework.Common.SubstrateTrackings;
+using VirgoRT.Modules.LPs;
 using VirgoRT.Scheduler;
 
 namespace VirgoRT.Modules.Schedulers
@@ -46,11 +47,15 @@ namespace VirgoRT.Modules.Schedulers
             //_entity.Load(_chamber);
             return true;
         }
-
-        public bool Unload()
+        private ModuleName _curLP;
+        public bool Unload(ModuleName lp)
         {
-            //_busy = true;
-            //_entity.Unloaded(_chamber);
+            ////_busy = true;
+            ////_entity.Unloaded(_chamber);
+            //return true;
+            _task = TaskType.Unload;
+            _curLP = lp;
+            _entity.NotifyLP(lp, LoadPortModule.MSG.Unload);
             return true;
         }
 
@@ -82,6 +87,9 @@ namespace VirgoRT.Modules.Schedulers
                 case TaskType.None:
                     ret = true;
                     break;
+                case TaskType.Unload:
+                    ret = !ModuleHelper.IsLoadPort(_curLP) || _entity.IsLPIdle(_curLP);
+                    break;
                 case TaskType.PrepareTransfer:
                     ret = _entity.IsPrepareTransferReady(ModuleName.EfemRobot, EnumTransferType.Pick, 0);
                     break;

+ 2 - 2
VirgoUI/Controls/Parts/Efem.xaml

@@ -110,8 +110,8 @@
 
 
         <TextBlock x:Name="lblFlipper" Text="Flipper" Canvas.Left="105" Canvas.Top="268"  Visibility="{Binding IsFlipperInstalled, Converter={StaticResource bool2VisibilityConvert}}" />
-        <TextBlock x:Name="lblBuffer" Text="Buffer" Canvas.Left="690" Canvas.Top="225"  Visibility="{Binding IsBufferIntalled, Converter={StaticResource bool2VisibilityConvert}}"/>
-        <TextBlock x:Name="lblAligner1" Text="Aligner1" Canvas.Left="690" Canvas.Top="325" Visibility="{Binding IsAligner1Installed, Converter={StaticResource bool2VisibilityConvert}}" />
+        <TextBlock x:Name="lblBuffer" Text="Cooling" Canvas.Left="690" Canvas.Top="225"  Visibility="{Binding IsBufferIntalled, Converter={StaticResource bool2VisibilityConvert}}"/>
+        <TextBlock x:Name="lblAligner1" Text="Aligner" Canvas.Left="690" Canvas.Top="325" Visibility="{Binding IsAligner1Installed, Converter={StaticResource bool2VisibilityConvert}}" />
         <TextBlock x:Name="lblAligner2" Text="Aligner2" Canvas.Left="690" Canvas.Top="225" Visibility="{Binding IsAligner2Installed, Converter={StaticResource bool2VisibilityConvert}}" />
         <TextBlock x:Name="lblCooler1" Text="Cooling1" Canvas.Left="105" Canvas.Top="325" Visibility="{Binding IsCooling1Installed, Converter={StaticResource bool2VisibilityConvert}}" />
         <TextBlock x:Name="lblCooler2" Text="Cooling2" Canvas.Left="105" Canvas.Top="225" Visibility="{Binding IsCooling2Installed, Converter={StaticResource bool2VisibilityConvert}}" />

+ 2 - 1
VirgoUI/Models/Controls/FOUPFrontView.xaml

@@ -10,11 +10,12 @@
              mc:Ignorable="d" >
     <UserControl.Resources>
         <converter:FOUPStatusConverter x:Key="FOUPStatusConverter"/>
+        <converter:FOUPNameConverter x:Key="FOUPNameConverter"/>
     </UserControl.Resources>
     
     <Grid>
         <StackPanel>
-            <TextBlock Text="{Binding UnitData.ModuleID, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" FontFamily="Arial" Width="90" Height="16" TextAlignment="Center" FontSize="14" 
+            <TextBlock Text="{Binding UnitData.ModuleID, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Converter={StaticResource FOUPNameConverter}}" FontFamily="Arial" Width="90" Height="16" TextAlignment="Center" FontSize="14" 
                        TextWrapping="Wrap" FontWeight="{Binding UnitData.UnitFontWeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 
                        Foreground="{Binding UnitData.UnitNameForeground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" HorizontalAlignment="Center" VerticalAlignment="Center">             
             </TextBlock>

+ 20 - 0
VirgoUI/Models/Converter/CommonConverter.cs

@@ -31,4 +31,24 @@ namespace VirgoUI.Client.Models.Converter
             throw new NotImplementedException();
         }
     }
+
+    public class FOUPNameConverter : IValueConverter
+    {
+        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+        {
+            if (value == null)
+                return string.Empty;
+
+            if(value.ToString() == "Buffer")
+            {
+                return "Cooling";
+            }
+            return value.ToString();
+        }
+
+        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+        {
+            throw new NotImplementedException();
+        }
+    }
 }