Browse Source

1.修改PMA PMB显示工艺过程中表格高度
2.修改PMA PMB气体小数点格式

JET-YDB\JET-YANGDB 5 days ago
parent
commit
c40f896759

+ 1 - 0
VirgoRT/Config/System.sccfg

@@ -80,6 +80,7 @@
 
 		<config default="false" name="IgnoreWaterFlowError" nameView="Ignore Water Flow Alarm" description="Ignore water flow alarm" max="" min="" paramter="" tag="" unit="" type="Bool" />
     <config default="false" name="IgnoreIonizerError" nameView="Ignore Ionizer Alarm" description="Ignore Ionizer alarm" max="" min="" paramter="" tag="" unit="" type="Bool" />
+    <config default="false" name="IgnoreN2Error" nameView="Ignore N2 Alarm" description="Ignore N2 Alarm" max="" min="" paramter="" tag="" unit="" type="Bool" />
 		<config default="false" name ="VerifyWaferExistenceAtferRetract" nameView="Auto Verify Wafer existance after retract robot arm" description="Auto Verify Wafer existance after retract robot arm" max="" min="" paramter="" tag="" unit="" type="Bool" visible="false"/>
 
 		<config default="40" name="DelayTimeBeforeLiftDown" nameView="Delay Time before lift down" description="Delay Time before lift down" max="600" min="0" paramter="" tag="" unit="second" type="Integer" visible="false"/>

+ 12 - 1
VirgoRT/Devices/EFEM/Efem.cs

@@ -128,6 +128,7 @@ namespace VirgoRT.Devices.EFEM
         private string EFEMCommunicationError = "EFEMCommunicationError";
         private string WaferTransferFailed = "WaferTransferFailed";
         private string EFEMError = "EFEMError";
+        private string EFEMN2Alarm = "EFEMN2Alarm";
 
         // Constructor
         //
@@ -261,6 +262,7 @@ namespace VirgoRT.Devices.EFEM
             EV.Subscribe(new EventItem("Event", EFEMCommunicationError, "EFEM Communication error", EventLevel.Alarm, EventType.HostNotification));
             EV.Subscribe(new EventItem("Event", WaferTransferFailed, "Wafer Transfer Failed", EventLevel.Alarm, EventType.HostNotification));
             EV.Subscribe(new EventItem("Event", EFEMError, "EFEM Error", EventLevel.Alarm, EventType.HostNotification));
+            EV.Subscribe(new EventItem("Event", EFEMN2Alarm, "EFEM N2 Alarm", EventLevel.Alarm, EventType.HostNotification));
         }
 
         // Methods
@@ -273,7 +275,7 @@ namespace VirgoRT.Devices.EFEM
             if (SC.GetValue<int>($"EFEM.OpenN2ByHomeOption") > 1)
             {
                 AddAction(new SetN2Action(this, ModuleName.EFEM));
-                AddAction(new QueryN2Action(this, ModuleName.EFEM));
+                //AddAction(new QueryN2Action(this, ModuleName.EFEM));
             }
             AddAction(new TrackAction(this, ModuleName.EFEM));
             AddAction(new SIGSTATModuleAction(this, ModuleName.LP1, string.Empty));
@@ -736,6 +738,15 @@ namespace VirgoRT.Devices.EFEM
                             EV.PostAlarmLog(Module.ToString(), "EFEM switch to Maintain mode, HomeAll to recover");
                             //Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.ToInit);
                         }
+                        if(!baData1[27])
+                        {
+                            if (!SC.ContainsItem("EFEM.IgnoreN2Error") ||
+                               !SC.GetValue<bool>("EFEM.IgnoreN2Error"))
+                            {
+                                EV.Notify(EFEMN2Alarm);
+                                EV.PostAlarmLog(Module.ToString(), "EFEM N2 alarm");
+                            }
+                        }
                         // DATA2
                         _signalT.ChangeLightStatus(LightType.RED, baData2[0] ? LightStatus.ON : baData2[5] ? LightStatus.BLINK : LightStatus.OFF);
                         _signalT.ChangeLightStatus(LightType.GREEN, baData2[1] ? LightStatus.ON : baData2[6] ? LightStatus.BLINK : LightStatus.OFF);

+ 12 - 1
VirgoRT/Modules/AutoTransfer_T.cs

@@ -634,6 +634,11 @@ namespace VirgoRT.Modules
                     GetWaferSequenceAlignTime(_curAction.targetModule, 0, out float time);
                     _efemRobot.Align(_curAction.targetModule, time);
                 }
+                else if(ModuleHelper.IsBuffer(_curAction.targetModule))
+                {
+                    GetWaferSequenceAlignTime(_curAction.targetModule, _curAction.targetSlot, out float time);
+                    dictSchedulers[_curAction.targetModule].Cooling((int)time, _curAction.targetSlot, false);
+                }
                 else if (ModuleHelper.IsCooling(_curAction.targetModule))
                 {
                     GetWaferSequenceAlignTime(_curAction.targetModule, 0, out float time);
@@ -679,7 +684,8 @@ namespace VirgoRT.Modules
             if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(ModuleName.Aligner1)
                 && !wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(ModuleName.Aligner2)
                 && !wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(ModuleName.Cooling1)
-                && !wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(ModuleName.Cooling2))
+                && !wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(ModuleName.Cooling2)
+                && !wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(ModuleName.Buffer))
                 return false;
 
             if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepParameter.ContainsKey("CoolingTime"))
@@ -2309,6 +2315,11 @@ namespace VirgoRT.Modules
             queMoveAction.Clear();
             _curAction.state = ActionState.Done;
         }
+
+        public int GetCoolingTime(int slot)
+        {
+            return _buffer.GetCoolingTime(slot);
+        }
         #endregion
     }
 }

+ 19 - 4
VirgoRT/Modules/ManualTransfer.cs

@@ -140,7 +140,7 @@ namespace VirgoRT.Modules
                 }
 
                 _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(source, ss, cooling, slot, coolingTime, blade)));
-                _moveTaskQueue.Enqueue(new BufferRoutine(cooling.ToString(), coolingTime));
+                _moveTaskQueue.Enqueue(new BufferRoutine(cooling.ToString(), coolingTime,slot));
                 _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(cooling, slot, target, ds, 0, blade)));
             }
             else
@@ -187,6 +187,15 @@ namespace VirgoRT.Modules
             _moveTaskQueue.Clear();
             _activeTask = null;
         }
+
+        public int GetCoolingTime(int slot)
+        {
+            if(_activeTask != null && _activeTask is BufferRoutine)
+            {
+                return ((BufferRoutine)_activeTask).GetCoolingTime(slot);
+            }
+            return 0;
+        }
     }
 
 
@@ -509,17 +518,18 @@ namespace VirgoRT.Modules
     {
         private SchedulerBuffer _cooling;
         private int _coolingTimeS;
+        private int _slot;
 
-        public BufferRoutine(string module, int coolingTimeS)
+        public BufferRoutine(string module, int coolingTimeS, int slot)
         {
             _cooling = GetModule(module) as SchedulerBuffer;
             _coolingTimeS = coolingTimeS;
-
+            _slot = slot;
         }
 
         public Result Start(params object[] objs)
         {
-            _cooling.Cooling(_coolingTimeS);
+            _cooling.Cooling(_coolingTimeS, _slot);
 
             return Result.RUN;
         }
@@ -536,5 +546,10 @@ namespace VirgoRT.Modules
         {
 
         }
+
+        public int GetCoolingTime(int slot)
+        {
+            return _buffer.GetCoolingTime(slot);
+        }
     }
 }

+ 19 - 8
VirgoRT/Modules/ReturnAllWafer.cs

@@ -215,21 +215,23 @@ namespace VirgoRT.Modules
             {
                 ModuleName cooling = ModuleName.Buffer;
                 int slot = -1;
-                if (WaferManager.Instance.CheckNoWafer(ModuleName.Buffer, 0))
+                var slotCnt = SC.GetValue<int>("EFEM.Buffer.SlotNumber");
+                for(int i = 0; i < slotCnt; i++)
                 {
-                    slot = 0;
-                }
-                else if (WaferManager.Instance.CheckNoWafer(ModuleName.Cooling2, 0))
-                {
-                    slot = 1;
+                    if (WaferManager.Instance.CheckNoWafer(ModuleName.Buffer, i))
+                    {
+                        slot = i;
+                        break;
+                    }
                 }
-                else
+
+                if(slot == -1)
                 {
                     EV.PostWarningLog("System", "No valid cooling station for auto cooling");
                     return Result.FAIL;
                 }
                 _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(transferModule, transferSlot, cooling, slot, _coolingTime, hand)));
-                _moveTaskQueue.Enqueue(new BufferRoutine(cooling.ToString(), _coolingTime));
+                _moveTaskQueue.Enqueue(new BufferRoutine(cooling.ToString(), _coolingTime, slot));
                 _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(cooling, slot, (ModuleName)wafer.OriginStation, wafer.OriginSlot, 0, hand)));
             }
             else if (_aligning)
@@ -294,6 +296,15 @@ namespace VirgoRT.Modules
             else
                 return Hand.Both;
         }
+
+        public int GetCoolingTime(int slot)
+        {
+            if (_activeTask != null && _activeTask is BufferRoutine)
+            {
+                return ((BufferRoutine)_activeTask).GetCoolingTime(slot);
+            }
+            return 0;
+        }
     }
 
 }

+ 24 - 0
VirgoRT/Modules/RouteManager.cs

@@ -228,6 +228,9 @@ namespace VirgoRT.Modules
         {
             DATA.Subscribe("Rt.Status", () => ((RtState)fsm.State).ToString());
 
+            DATA.Subscribe("Scheduler.BufferSlot1Time", () => GetCoolingTime(0), SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe("Scheduler.BufferSlot2Time", () => GetCoolingTime(1), SubscriptionAttribute.FLAG.IgnoreSaveDB);
+
             DATA.Subscribe(ModuleName.System.ToString(), "AlarmEvent", EV.GetAlarmEvent);
 
             DATA.Subscribe("System.IsAutoMode", () => IsAutoMode);
@@ -270,6 +273,27 @@ namespace VirgoRT.Modules
             return false;
         }
 
+        private int GetCoolingTime(int slot)
+        {
+            if(((RtState)fsm.State) == RtState.Transfer)
+            {
+                return _manualTransfer.GetCoolingTime(slot);
+            }
+            else if(((RtState)fsm.State) == RtState.ReturnWafer)
+            {
+                return _returnWafer.GetCoolingTime(slot);
+            }
+            else if(((RtState)fsm.State) == RtState.AutoIdle ||
+                ((RtState)fsm.State) == RtState.AutoRunning)
+            {
+                if(_auto is AutoTransfer_T)
+                {
+                    return ((AutoTransfer_T)_auto).GetCoolingTime(slot);
+                }
+            }
+            return 0;
+        }
+
         void SubscribeOperation()
         {
             OP.Subscribe("CreateWafer", InvokeCreateWafer);

+ 72 - 0
VirgoRT/Modules/Schedulers/SchedulerBuffer.cs

@@ -10,6 +10,7 @@ using MECF.Framework.Common.Schedulers;
 using MECF.Framework.Common.SubstrateTrackings;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
+using Aitex.Core.RT.DataCenter;
 
 namespace VirgoRT.Modules.Schedulers
 {
@@ -50,6 +51,47 @@ namespace VirgoRT.Modules.Schedulers
             return true;
         }
 
+        private DeviceTimer _timerCooling1 = new DeviceTimer();
+        private int _paramCoolingTime1 = 0;
+        private DeviceTimer _timerCooling2 = new DeviceTimer();
+        private int _paramCoolingTime2 = 0;
+        public override bool Cooling(int coolingTime, int slot, bool isType = true)
+        {
+            LogTaskStart(_task, $"Cooling {coolingTime} seconds by slot {slot + 1}");
+            if(slot == 0)
+            {
+                if(isType)
+                    _task = TaskType.Cooling1;
+                _paramCoolingTime1 = coolingTime;
+                _timerCooling1.Start(_paramCoolingTime1 * 1000);
+            }
+            else
+            {
+                if(isType)
+                    _task = TaskType.Cooling2;
+                _paramCoolingTime2 = coolingTime;
+                _timerCooling2.Start(_paramCoolingTime2 * 1000);
+            }
+            return true;
+        }
+
+        public override int GetCoolingTime(int slot)
+        {
+            if(slot == 0)
+            {
+                var ms = _paramCoolingTime1 * 1000 - _timerCooling1.GetElapseTime();
+                if (ms < 0) ms = 0;
+                return (int)ms / 1000;
+            }
+            else if(slot == 1)
+            {
+                var ms = _paramCoolingTime2 * 1000 - _timerCooling2.GetElapseTime();
+                if (ms < 0) ms = 0;
+                return (int)ms / 1000;
+            }
+            return 0;
+        }
+
         public bool CheckTaskDone()
         {
             bool ret = false;
@@ -61,6 +103,12 @@ namespace VirgoRT.Modules.Schedulers
                 case TaskType.Cooling:
                     ret = _timerCooling.IsTimeout();
                     break;
+                case TaskType.Cooling1:
+                    ret = _timerCooling1.IsTimeout();
+                    break;
+                case TaskType.Cooling2:
+                    ret = _timerCooling2.IsTimeout();
+                    break;
             }
 
             if (ret && _task != TaskType.None)
@@ -88,6 +136,30 @@ namespace VirgoRT.Modules.Schedulers
                 if (wafer.IsEmpty || wafer.NextSequenceStep > wafer.ProcessJob.Sequence.Steps.Count)  // wafer.NextSequenceStep already increased after wafer arrive
                     continue;
 
+                if(i == 0)
+                {
+                    if (_timerCooling1.IsTimeout())
+                    {
+                        item.Module = Module;
+                        item.Slot = i;
+                        return item;
+                    }
+                    else
+                        continue;
+                }
+
+                if (i == 1)
+                {
+                    if (_timerCooling2.IsTimeout())
+                    {
+                        item.Module = Module;
+                        item.Slot = i;
+                        return item;
+                    }
+                    else
+                        continue;
+                }
+
                 if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep - 1].StepParameter.ContainsKey("CoolingTime")) // parameter name may change
                     continue;
 

+ 13 - 1
VirgoRT/Modules/Schedulers/SchedulerModule.cs

@@ -80,6 +80,8 @@ namespace VirgoRT.Scheduler
             TransferTarget,
 
             Cooling,
+            Cooling1,
+            Cooling2,
 
             Heating,
 
@@ -237,6 +239,16 @@ namespace VirgoRT.Scheduler
             return true;
         }
 
+        public virtual bool Cooling(int coolingTime, int slot, bool isType = true)
+        {
+            return true;
+        }
+
+        public virtual int GetCoolingTime(int slot)
+        {
+            return 0;
+        }
+
         #region Virgo_T
         // 传片序列
         // 1. 每个槽(Slot)具有三种状态, 根据槽的状态, 决定wafer是否可以 前行
@@ -245,7 +257,7 @@ namespace VirgoRT.Scheduler
         // preheat 序列
         // prepare transfer 序列
         // flipper 序列
-        
+
         public enum SlotStatus
         {
             ReadyIn,

+ 10 - 6
VirgoUI/Models/Operate/Overview/OverView.xaml

@@ -61,7 +61,7 @@
 
                             <local:EFEMFrontView UnitData="{Binding EFEM}" Canvas.Top="242" Canvas.Left="48"  />
 
-                            <Grid x:Name="PMA_Info" Canvas.Top="3" Canvas.Left="-4">
+                            <Grid x:Name="PMA_Info" Canvas.Top="-60" Canvas.Left="-4">
                                 <Grid.ColumnDefinitions>
                                     <ColumnDefinition Width="120"/>
                                     <ColumnDefinition Width="150"/>
@@ -69,9 +69,9 @@
                                 <Grid.RowDefinitions>
                                     <RowDefinition Height="Auto"/>
                                     <RowDefinition Height="24"/>
+                                    <RowDefinition Height="Auto"/>
                                     <RowDefinition Height="24"/>
-                                    <RowDefinition Height="24"/>
-                                    <RowDefinition Height="24"/>
+                                    <RowDefinition Height="Auto"/>
                                     <RowDefinition Height="24"/>
                                     <RowDefinition Height="24"/>
                                     <RowDefinition Height="24"/>
@@ -124,7 +124,7 @@
                                     <TextBlock Text="{Binding PMAChillerTemperature, StringFormat={}{0:F1}}" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="14" FontFamily="Arial" VerticalAlignment="Center"/>
                                 </Border>
                             </Grid>
-                            <Grid x:Name="PMB_Info" Canvas.Top="3" Canvas.Left="693">
+                            <Grid x:Name="PMB_Info" Canvas.Top="-60" Canvas.Left="693">
                                 <Grid.ColumnDefinitions>
                                     <ColumnDefinition Width="120"/>
                                     <ColumnDefinition Width="150"/>
@@ -132,9 +132,9 @@
                                 <Grid.RowDefinitions>
                                     <RowDefinition Height="Auto"/>
                                     <RowDefinition Height="24"/>
+                                    <RowDefinition Height="Auto"/>
                                     <RowDefinition Height="24"/>
-                                    <RowDefinition Height="24"/>
-                                    <RowDefinition Height="24"/>
+                                    <RowDefinition Height="Auto"/>
                                     <RowDefinition Height="24"/>
                                     <RowDefinition Height="24"/>
                                     <RowDefinition Height="24"/>
@@ -190,6 +190,10 @@
 
 
                             <local:FOUPFrontView UnitData="{Binding Buffer}" Visibility="{Binding Path=IsBufferIntalled, Converter={StaticResource bool2VisibilityConvert}}" VerticalAlignment="Top" Canvas.Left="777" Canvas.Top="247"></local:FOUPFrontView>
+                            <TextBlock x:Name="Buffer1CoolingTime" Canvas.Left="920" Canvas.Top="275" HorizontalAlignment="Center" TextWrapping="Wrap" Text="{Binding BufferSlot2Time, StringFormat={}{0:F0}}" Background="{DynamicResource Table_BG_Content}" Foreground="Red" Width="50" VerticalAlignment="Bottom" FontFamily="Arial" TextAlignment="Center">
+                            </TextBlock>
+                            <TextBlock x:Name="Buffer2CoolingTime" Canvas.Left="920" Canvas.Top="295" HorizontalAlignment="Center" TextWrapping="Wrap" Text="{Binding BufferSlot1Time, StringFormat={}{0:F0}}" Background="{DynamicResource Table_BG_Content}" Foreground="Red" Width="50" VerticalAlignment="Bottom" FontFamily="Arial" TextAlignment="Center">
+                            </TextBlock>
 
                             <StackPanel Canvas.Left="361" Canvas.Top="571" Visibility="{Binding Foup1Visibility}">
                                 <!--<Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1" Background="{DynamicResource Table_BG_Title}" Padding="5,1">

+ 6 - 0
VirgoUI/Models/Operate/Overview/OverViewModel.cs

@@ -717,6 +717,12 @@ namespace VirgoUI.Client.Models.Operate
         [Subscription("LP2.JobLotName")]
         public string LP2JobLotName { get; set; }
 
+        [Subscription("Scheduler.BufferSlot1Time")]
+        public int BufferSlot1Time { get; set; }
+
+        [Subscription("Scheduler.BufferSlot2Time")]
+        public int BufferSlot2Time { get; set; }
+
         public bool IsPauseAllEnable => LP1JobStatus == "Executing" || LP2JobStatus == "Executing";
 
         #endregion Scheduler

+ 2 - 2
VirgoUI/Models/Platform/EFEM/EFEMView.xaml

@@ -128,7 +128,7 @@
 
                     </Grid>-->
 
-                    <Grid Canvas.Left="965" Canvas.Top="360" Width="230" HorizontalAlignment="Left">
+                    <Grid Canvas.Left="965" Canvas.Top="360" Width="230" HorizontalAlignment="Left" Visibility="Collapsed">
                         <Grid.RowDefinitions>
                             <RowDefinition Height="24"/>
                             <RowDefinition Height="0"/>
@@ -909,7 +909,7 @@
                                 </Button>
                             </StackPanel>
 
-                            <StackPanel Orientation="Horizontal" Width="360"  Height="34">
+                            <StackPanel Orientation="Horizontal" Width="360"  Height="34" Visibility="Collapsed">
                                 <ComboBox x:Name="cbMapModules"  Height="25" Width="90" ItemsSource="{Binding MapModules}"  SelectedItem="{Binding MapSelectedModule}" />
                                 <Button Content="Map" Width="80"  Height="24" Margin="5,5,0,5">
                                     <i:Interaction.Triggers>