Browse Source

1. Add WaferProtrusion Alarm;
2. Add WaferProtrusion Simulator;

niuyx 1 week ago
parent
commit
9b7aa90185

+ 24 - 8
Jet/Jet_001_2P_Jet/EfemRT/Devices/LoadPorts/Hirata/HirataLoadPort.cs

@@ -361,7 +361,9 @@ namespace EfemRT.Devices.LoadPorts.Hirata
                             switch (param[1])
                             {
                                 case '0': reason = "Wafer drop"; break;
-                                case '1': reason = "Wafer protrusion"; break;
+                                case '1': reason = "Wafer protrusion";
+                                    IsWaferProtrude = true; 
+                                    break;
                                 case '2': reason = "FOUP mount error"; break;
                                 case '3': reason = "FOUP mount error"; break;
                                 case '5': reason = "Air pressure drop"; break;
@@ -395,11 +397,11 @@ namespace EfemRT.Devices.LoadPorts.Hirata
                     }
                     if (string.IsNullOrEmpty(reason))
                     {
-                        LOG.Error($"[{_lpname}] MOV:{catch_command.Match(ReceiveMsg).Value} failed for the Unknown error {param}");
+                        EV.PostAlarmLog("System",$"[{_lpname}] MOV:{catch_command.Match(ReceiveMsg).Value} failed for the Unknown error {param}");
                     }
                     else
                     {
-                        LOG.Error($"[{_lpname}] MOV:{catch_command.Match(ReceiveMsg).Value} failed for the error {param}:{reason}");
+                        EV.PostAlarmLog("System", $"[{_lpname}] MOV:{catch_command.Match(ReceiveMsg).Value} failed for the error {param}:{reason}");
                     }
                 }
                 
@@ -605,11 +607,10 @@ namespace EfemRT.Devices.LoadPorts.Hirata
             }
         }
 
-
-
+       
         private void OnStasRead(string command_parameter)
         {
-            _isLoaded = false;
+            //_isLoaded = false;
             switch (command_parameter[6])//Continer Status
             {
                 case '0':
@@ -666,13 +667,16 @@ namespace EfemRT.Devices.LoadPorts.Hirata
                     break;
             }
 
-            switch (command_parameter[11])//Wafer protrusion sensor(2025.4.18 +)
+            switch (command_parameter[11])//Wafer protrusion sensor
             {
                 case '0':
                     ProtrusionState = "Shading";
+                    IsWaferProtrude = true;
+                    CheckToPostMessage(LoadPortMsg.Error);
                     break;
                 case '1':
                     ProtrusionState = "Lighting";
+                    IsWaferProtrude = false;
                     break;
             }
 
@@ -696,7 +700,7 @@ namespace EfemRT.Devices.LoadPorts.Hirata
                 param += command_parameter[4];
                 param += command_parameter[5];
                 FindErrorReason(param, out reason);
-                LOG.Error($"[{_lpname}] reason");
+                EV.PostAlarmLog("System", $"[{_lpname}] reason:{reason}");
                 CheckToPostMessage(LoadPortMsg.Error);
             }
 
@@ -915,6 +919,7 @@ namespace EfemRT.Devices.LoadPorts.Hirata
             //收到消息进入initilizing状态 需要先下发
             //初始化逻辑MOV:ORGN
             IsHomed = false;
+            IsWaferProtrude = false;
             SendMessage("MOV:ORGN;");
             _initStartTime = DateTime.Now;
             return true;
@@ -928,6 +933,7 @@ namespace EfemRT.Devices.LoadPorts.Hirata
             {
                 SendMessage("GET:STAS;");
             }
+            _isLoaded = false;
             return true;
         }
 
@@ -943,6 +949,7 @@ namespace EfemRT.Devices.LoadPorts.Hirata
         protected override bool fStartReset(object[] param)
         {
             //SET:RSET
+            IsWaferProtrude = false;
             lock (_locker)
             {
                 SendMessage("SET:RSET;");
@@ -983,6 +990,10 @@ namespace EfemRT.Devices.LoadPorts.Hirata
             base.DockState = FoupDockState.Docked;
             base.ClampState = FoupClampState.Close;
             base.DoorState = FoupDoorState.Open;
+            lock (_locker)
+            {
+                SendMessage("GET:STAS;");
+            }
             //if (Name == "LP1")
             //    DeviceModel.TrigSafetytoSMIF1.SetTrigger(true, out _);
             //if (Name == "LP2")
@@ -1006,6 +1017,10 @@ namespace EfemRT.Devices.LoadPorts.Hirata
             base.DockState = FoupDockState.Undocked;
             base.ClampState = FoupClampState.Close;
             base.DoorState = FoupDoorState.Close;
+            lock (_locker)
+            {
+                SendMessage("GET:STAS;");
+            }
             //if (Name == "LP1")
             //    DeviceModel.TrigSafetytoSMIF1.SetTrigger(false, out _);
             //if (Name == "LP2")
@@ -1088,6 +1103,7 @@ namespace EfemRT.Devices.LoadPorts.Hirata
         public override bool ClearError(out string reason)
         {
             reason = "";
+            IsWaferProtrude = false;
             CheckToPostMessage(LoadPortMsg.Reset);
             return true;
         }

+ 113 - 6
Jet/Jet_001_2P_Jet/EfemSimulator/Device/LoadPorts/Hirata/HirataSimulator.cs

@@ -2,13 +2,40 @@
 using MECF.Framework.Simulator.Core.LoadPorts;
 using System;
 using System.Collections.ObjectModel;
+using System.Linq;
 using System.Threading;
 
 namespace EfemSimulator.LoadPort.Hirata
 {
+    /// <summary>
+    /// STAS位
+    /// </summary>
+    public enum HirataStas
+    {
+        ErrorStatus,
+        Mode,
+        DeviceStatus,
+        OperatingState,
+        ErrorCodeUpper,
+        ErrorCodeLower,
+        ContainerStatus,
+        ClampPosition,
+        DoorLatchPosition,
+        AdsorptionState,
+        DoorPositon,
+        WaferProtrusion,
+        ElevatorAxisPositon,
+        DockPosition,
+        Reserve,
+        MappingWaitingPosition,
+        Reserve2,
+        MappingStatus,
+        Type,
+        Reserve3
+    }
     public class HirataSimulator : SerialPortDeviceSimulator
     {
-
+        private bool _isWaferProtrusion= false;
         private const string EOF = "\r";
         private const char MSG_DELIMITER = ' ';
         private object _lock = new object();
@@ -18,11 +45,41 @@ namespace EfemSimulator.LoadPort.Hirata
         }
 
         private string[] _slotMap = new string[25];
-        public HirataSimulator(string portname) : base(portname, -1, EOF, MSG_DELIMITER)
+
+        public string Stas
         {
-          
+            get { return string.Join("", _stas); }
         }
 
+        private string[] _stas = new string[20];
+        public HirataSimulator(string portname) : base(portname, -1, EOF, MSG_DELIMITER)
+        {
+            InitStas();
+        }
+        /// <summary>
+        /// 初始化STAS
+        /// </summary>
+        private void InitStas()
+        {
+            for(int i = 0;i < 20; i++)
+            {
+                _stas[i] = "0";
+            }
+            _stas[2] = "1";
+            _stas[6] = "1";
+            _stas[8] = "1";
+            _stas[10] = "1";
+            _stas[11] = "1";
+        }
+        /// <summary>
+        /// 设置STAS
+        /// </summary>
+        /// <param name="targetStas"></param>
+        /// <param name="value"></param>
+        public void SetStas(HirataStas targetStas,string value)
+        {
+            _stas[(int)targetStas] = value;
+        }
         public override bool IsEnabled => base.IsEnabled;
 
         public override bool IsConnected => base.IsConnected;
@@ -57,7 +114,9 @@ namespace EfemSimulator.LoadPort.Hirata
                 {
                     if (command.Contains("STAS"))
                     {
-                        OnWriteMessage("0000GET:STAS/00100010101000000000;**"+ EOF);////00100010100001000000
+                        // 00100010101100000000(Normal)
+                        // 0010A110101000000000(WaferProtrusion Event)
+                        OnWriteMessage($"0000GET:STAS/{Stas};**"+ EOF);
                     }
                     if (command.Contains("MAPR"))
                     {
@@ -71,8 +130,18 @@ namespace EfemSimulator.LoadPort.Hirata
                 if (command.Contains("MOV:"))
                 {
                     OnWriteMessage(command);
+                    ProcessSTAS(command);
                     Thread.Sleep(6000);
-                    OnWriteMessage(command.Replace("MOV", "INF"));
+                    
+                    if ((command.Contains("FPMU") || command.Contains("FPML")) && _isWaferProtrusion)
+                    {
+                        if(command.Contains("FPMU")) OnWriteMessage(command.Replace("MOV:FPMU", "ABS:FPMU/A1"));
+                        if(command.Contains("FPML")) OnWriteMessage(command.Replace("MOV:FPML", "ABS:FPML/A1"));
+                    } 
+                    else
+                    {
+                        OnWriteMessage(command.Replace("MOV", "INF"));
+                    }                   
                 }
             }
             
@@ -111,7 +180,7 @@ namespace EfemSimulator.LoadPort.Hirata
 
                     if (command.Contains("MOV"))
                     {
-                        OnWriteMessage(command);
+                        OnWriteMessage(command);                        
                         command.Replace("MOV","INF");
                         Thread.Sleep(6000);
                         OnWriteMessage(command);
@@ -210,5 +279,43 @@ namespace EfemSimulator.LoadPort.Hirata
             }
             return waferList;
         }
+        /// <summary>
+        /// 设置ErrorCode
+        /// </summary>
+        /// <param name="codeid"></param>
+        public void ReportError(string codeid)
+        {
+            SetStas(HirataStas.ErrorCodeLower, codeid.Substring(1,1));
+            SetStas(HirataStas.ErrorCodeUpper, codeid.Substring(0,1));
+            if (codeid.Equals("A1")) _isWaferProtrusion = true;
+        }
+        /// <summary>
+        /// 重置STAS
+        /// </summary>
+        public void ResetEvent()
+        {
+            InitStas();
+            _isWaferProtrusion = false;
+        }
+        /// <summary>
+        /// 按接收指令设置STAS
+        /// </summary>
+        /// <param name="command"></param>
+        private void ProcessSTAS(string command)
+        {
+            if (command.Contains("FPML"))
+            {
+                SetStas(HirataStas.DockPosition, "1");
+            }
+            else if (command.Contains("FPMU"))
+            {
+                SetStas(HirataStas.DockPosition, "0");
+            }
+            else if (command.Contains("ORGN"))
+            {
+                SetStas(HirataStas.DockPosition, "0");
+            }
+  
+        }
     }
 }

+ 6 - 2
Jet/Jet_001_2P_Jet/EfemSimulator/Device/LoadPorts/Hirata/HirataView.xaml

@@ -39,8 +39,10 @@
 
             <Button Content="Place" Visibility="Hidden" Width="100" Height="35"   Command="{Binding PlaceCommand}" Canvas.Left="10" Margin="0" Canvas.Top="136"></Button>
             <Button Content="Remove" Visibility="Hidden" Width="100" Height="35"   Command="{Binding RemoveCommand}" Canvas.Left="141" Margin="0" Canvas.Top="136"></Button>
-            <Button Content="Report Error" Width="110" Height="35"   Command="{Binding ReportCommand}" Canvas.Left="230" Margin="0" Canvas.Top="260"></Button>
-            <ComboBox  SelectedValue="{Binding codeid}"  ItemsSource="{Binding ErrorCode}" IsReadOnly ="False" Width="90"  Height="38"  Margin="0" RenderTransformOrigin="0.471,-0.188" Canvas.Left="82" Canvas.Top="258"></ComboBox>
+            <Button Content="Wafer Protrusion" Width="148" Height="39"   Command="{Binding WaferProtrusionCommand}" Canvas.Left="285" Canvas.Top="268" HorizontalAlignment="Left"/>
+            <Button Content="Report Error" Width="110" Height="39"   Command="{Binding ReportCommand}" Canvas.Left="320" Canvas.Top="191" HorizontalAlignment="Left"/>
+            <TextBlock Text="ErrorCode:" FontSize="18" Canvas.Left="85" Canvas.Top="204" Height="26" Width="103" HorizontalAlignment="Left"/>
+            <ComboBox  SelectedValue="{Binding codeid}"  ItemsSource="{Binding ErrorCode}" IsReadOnly ="False" Width="105"  Height="39" RenderTransformOrigin="0.471,-0.188" Canvas.Left="190" Canvas.Top="197" HorizontalAlignment="Left" VerticalAlignment="Center"/>
             <ItemsControl Padding="0,5,0,0" Width="300" Height="390" HorizontalContentAlignment="Center" Background="LightGray" Canvas.Left="576" ItemsSource="{Binding WaferList}" ItemTemplate="{DynamicResource DataTemplate1}" HorizontalAlignment="Center" VerticalAlignment="Top" >
 
             </ItemsControl>
@@ -48,6 +50,8 @@
             <Button Content="SetAll" Width="100" Height="35"   Command="{Binding SetAllCommand}" Canvas.Left="72" Margin="0" Canvas.Top="115"></Button>
             <Button Content="Random" Width="100" Height="35"   Command="{Binding RandomCommand}" Canvas.Left="225" Canvas.Top="109" HorizontalAlignment="Left"/>
             <Button Content="Clear" Width="100" Height="35"   Command="{Binding ClearCommand}" Canvas.Left="385" Canvas.Top="108" HorizontalAlignment="Left"/>
+            <Button Content="Reset Event" Width="105" Height="39"   Command="{Binding ResetEventCommand}" Canvas.Top="268" HorizontalAlignment="Left" Canvas.Left="150"/>
+            <TextBlock Text="Event:" FontSize="18" Canvas.Top="281" Height="26" Width="60" Canvas.Left="85" VerticalAlignment="Top"/>
 
         </Canvas>
 

+ 23 - 4
Jet/Jet_001_2P_Jet/EfemSimulator/Device/LoadPorts/Hirata/HirataView.xaml.cs

@@ -65,6 +65,8 @@ namespace EfemSimulator.Device.LoadPorts.Hirata
             //    (DataContext as TimerViewModelBase).Start();
             //}
         }
+
+
     }
 
     class HirataViewModel : SerialPortDeviceViewModel
@@ -88,8 +90,8 @@ namespace EfemSimulator.Device.LoadPorts.Hirata
         [IgnorePropertyChange]
         public string InfoPadSet { get; set; }
 
-        public ObservableCollection<int> ErrorCode { get; set; }
-        public int codeid { get; set; }
+        public ObservableCollection<string> ErrorCode { get; set; }
+        public string codeid { get; set; }
 
         public ObservableCollection<WaferItem> WaferList { get; set; }
 
@@ -100,6 +102,8 @@ namespace EfemSimulator.Device.LoadPorts.Hirata
         public ICommand SetAllCommand { get; set; }
         public ICommand RandomCommand { get; set; }
         public ICommand SetTargetCommand { get; set; }
+        public ICommand WaferProtrusionCommand { get; set; }
+        public ICommand ResetEventCommand { get; set; }
 
         public ICommand SetInfoPadCommand { get; set; }
 
@@ -116,7 +120,10 @@ namespace EfemSimulator.Device.LoadPorts.Hirata
             SetTargetCommand = new DelegateCommand<object>(SetTarget);
             RandomCommand = new DelegateCommand<string>(RandomGenerateWafer);
             SetInfoPadCommand = new DelegateCommand<string>(SetInfoPadStatus);
-            ErrorCode = new ObservableCollection<int>() { 1, 2, 38, 39, 40, 41, 43, 44, 45, 49 };
+            WaferProtrusionCommand = new DelegateCommand<string>(SetWaferProtrusion);
+            ResetEventCommand = new DelegateCommand<string>(ResetEvent);
+            //ErrorCode = new ObservableCollection<int>() { 1, 2, 38, 39, 40, 41, 43, 44, 45, 49 };
+            ErrorCode = new ObservableCollection<string>() { "00","A1","A2" };
             _sim = new HirataSimulator(port);
             _sim.Enable();
             _simulator = new SerialPortDeviceSimulator($"{port}0", 0, "\r", '\r');
@@ -126,7 +133,7 @@ namespace EfemSimulator.Device.LoadPorts.Hirata
         }
         public void ReportError(string obj)
         {
-            //_sim.ReportError(codeid);
+            _sim.ReportError(codeid);
         }
 
         private void SetInfoPadStatus(string obj)
@@ -166,5 +173,17 @@ namespace EfemSimulator.Device.LoadPorts.Hirata
         {
             //_sim.PlaceCarrier();
         }
+
+        #region Error trigger
+        private void SetWaferProtrusion(string obj)
+        {
+            _sim.SetStas(HirataStas.WaferProtrusion, "0");
+            _sim.ReportError("A1");
+        }
+        private void ResetEvent(string obj)
+        {
+            _sim.ResetEvent();
+        }
+        #endregion
     }
 }