Переглянути джерело

Merge branch 'master' of http://git.jetplasma-oa.com/JetPlasma/CyberX8

chenkui 2 місяців тому
батько
коміт
2d8d4b7f42

+ 48 - 5
CyberX8_MainPages/ViewModels/SRDHomePageViewModel.cs

@@ -1,9 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Data;
 using System.Windows.Input;
 using System.Windows.Threading;
 using MECF.Framework.Common.OperationCenter;
@@ -37,6 +33,8 @@ namespace CyberX8_MainPages.ViewModels
         private const double ARM_UI_HOME_POSITION = 25.682;
         private const double ARM_UI_CENTER_POSITION = -15;
         private const double ROTATION_UI_HOME_POSITION = 0;
+        private const double FLIPPER_IN_POSITION = 41;
+        private const double FLIPPER_OUT_POSITION = 0;
         #endregion
 
         #region 内部变量
@@ -203,6 +201,18 @@ namespace CyberX8_MainPages.ViewModels
         /// Arm UI位置比例
         /// </summary>
         private double _armUIRatio;
+        /// <summary>
+        /// Flipper200 UI位置
+        /// </summary>
+        private ObservableCollection<double> _flipper200UIPosition = new ObservableCollection<double>(new double[3]);
+        /// <summary>
+        /// Flipper150 UI位置
+        /// </summary>
+        private ObservableCollection<double> _flipper150UIPosition = new ObservableCollection<double>(new double[3]);
+        /// <summary>
+        /// Flipper100 UI位置
+        /// </summary>
+        private ObservableCollection<double> _flipper100UIPosition = new ObservableCollection<double>(new double[3]);
         #endregion
         #endregion
 
@@ -451,7 +461,30 @@ namespace CyberX8_MainPages.ViewModels
             get { return _srdRotationUIPosition; }
             set { SetProperty(ref _srdRotationUIPosition, value); }
         }
-        
+        /// <summary>
+        /// Flipper200 UI位置
+        /// </summary>
+        public ObservableCollection<double> Flipper200UIPosition
+        {
+            get { return _flipper200UIPosition; }
+            set { SetProperty(ref _flipper200UIPosition, value); }
+        }
+        /// <summary>
+        /// Flipper150 UI位置
+        /// </summary>
+        public ObservableCollection<double> Flipper150UIPosition
+        {
+            get { return _flipper150UIPosition; }
+            set { SetProperty(ref _flipper150UIPosition, value); }
+        }
+        /// <summary>
+        /// Flipper100 UI位置
+        /// </summary>
+        public ObservableCollection<double> Flipper100UIPosition
+        {
+            get { return _flipper100UIPosition; }
+            set { SetProperty(ref _flipper100UIPosition, value); }
+        }
         #endregion
 
         #endregion
@@ -613,6 +646,16 @@ namespace CyberX8_MainPages.ViewModels
                     {
                         TimeRemaining = 0;
                     }
+                    //Flipper Position
+                    Flipper200UIPosition[0] = SRDCommonData.Flipper1Out200Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper200UIPosition[1] = SRDCommonData.Flipper2Out200Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper200UIPosition[2] = SRDCommonData.Flipper3Out200Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper150UIPosition[0] = SRDCommonData.Flipper1Out150Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper150UIPosition[1] = SRDCommonData.Flipper2Out150Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    Flipper150UIPosition[2] = SRDCommonData.Flipper3Out150Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    //Flipper100UIPosition[0] = SRDCommonData.Flipper1Out100Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    //Flipper100UIPosition[1] = SRDCommonData.Flipper2Out100Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
+                    //Flipper100UIPosition[2] = SRDCommonData.Flipper3Out100Status ? FLIPPER_OUT_POSITION : FLIPPER_IN_POSITION;
                 }
             }
         }

+ 4 - 2
CyberX8_MainPages/Views/SRDHomePageView.xaml

@@ -51,7 +51,7 @@
                             RecipeType="{Binding RecipeType}"
                             SelectedRecipeNode="{Binding SelectedRecipeNode,Mode=TwoWay}"
                             CurrentOperationMode="{Binding SRDPersistent.OperatingMode}"
-                            AchievedCycleTimes="{Binding AchievedRunRecipeCycle}" Loaded="RecipeControl_Loaded"
+                            AchievedCycleTimes="{Binding AchievedRunRecipeCycle}" 
                             RecipeModeValue ="{Binding SRDPersistent.RecipeOperatingMode}"
                             />
         </Grid>
@@ -116,7 +116,9 @@
 
         <Grid Grid.Row="3" Grid.Column="1" Grid.RowSpan="2" Grid.ColumnSpan="2">
             <UserControls:SRDUIControl HorizontalAlignment="Left" ArmUIPosition="{Binding SRDArmUIPosition}" RotationUIPosition="{Binding SRDRotationUIPosition}" 
-                                       WaferInfo="{Binding WaferInfo}" CommonData="{Binding SRDCommonData}" IsEnabled="{Binding IsEnabled}"/>
+                                       WaferInfo="{Binding WaferInfo}" CommonData="{Binding SRDCommonData}" IsEnabled="{Binding IsEnabled}"
+                                       Flipper1UIPosition200="{Binding Flipper200UIPosition[0]}" Flipper2UIPosition200="{Binding Flipper200UIPosition[1]}" Flipper3UIPosition200="{Binding Flipper200UIPosition[2]}"
+                                       Flipper1UIPosition150="{Binding Flipper150UIPosition[0]}" Flipper2UIPosition150="{Binding Flipper150UIPosition[1]}" Flipper3UIPosition150="{Binding Flipper150UIPosition[2]}"/>
         </Grid>
 
         <Grid Grid.Row="4" Grid.Column="0">

+ 1 - 20
CyberX8_MainPages/Views/SRDHomePageView.xaml.cs

@@ -1,18 +1,4 @@
-using CyberX8_MainPages.ViewModels;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Navigation;
-using System.Windows.Shapes;
+using System.Windows.Controls;
 
 namespace CyberX8_MainPages.Views
 {
@@ -25,10 +11,5 @@ namespace CyberX8_MainPages.Views
         {
             InitializeComponent();
         }
-
-        private void RecipeControl_Loaded(object sender, RoutedEventArgs e)
-        {
-
-        }
     }
 }

+ 1 - 5
CyberX8_RT/Devices/SRD/SrdCommonDevice.cs

@@ -851,11 +851,7 @@ namespace CyberX8_RT.Devices.SRD
                 {
                     LOG.WriteLog(eEvent.INFO_SRD, Module, "EnterError: Water Off is failed");
                 }
-            }
-            
-            //停电机
-            JetAxisBase _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
-            if (_rotationAxis != null && _rotationAxis.IsRun) _rotationAxis.StopPositionOperation();
+            }           
 
         }
         #endregion

+ 156 - 0
CyberX8_RT/Modules/Metal/MetalEntity.cs

@@ -448,6 +448,10 @@ namespace CyberX8_RT.Modules.Metal
                 LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), "Reservoir is not initialized");
                 return false;
             }
+            if (!MetalUsageMointor(Module.ToString()))
+            {
+                return false;
+            }
             if ("Auto".Equals(_persistentValue.OperatingMode))
             {
                 if (!CheckReservoirIsAuto())
@@ -1121,7 +1125,159 @@ namespace CyberX8_RT.Modules.Metal
             }
             return (int)FSM_MSG.NONE;
         }
+
+        /// <summary>
+        /// 监控 PM Counter Metal用量
+        /// </summary>
+        private bool MetalUsageMointor(string Module)
+        {
+            MetalUsage metalUsage = MetalUsageManager.Instance.GetMetalUsage(Module);
+            if (metalUsage != null)
+            {
+                //TotalAUsage
+                if (metalUsage.TotalUsage > SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit") != 0)
+                {
+                    if (metalUsage.TotalUsage > SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit")}");
+                    }
+                }
+                //AnodeAUsage
+                if (metalUsage.AnodeAUsage > SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit") != 0)
+                {
+                    if (metalUsage.AnodeAUsage > SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit")}");
+                    }
+                }
+                //AnodeBUsage
+                if (metalUsage.AnodeBUsage > SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit") != 0)
+                {
+                    if (metalUsage.AnodeBUsage > SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit")}");
+                    }
+                }
+
+                //MembraneAUsage
+                if (metalUsage.MembranceAUsage > SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit") != 0)
+                {
+                    if (metalUsage.MembranceAUsage > SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit")}");
+                    }
+                }
+
+                //MembraneBUsage
+                if (metalUsage.MembranceBUsage > SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit") != 0)
+                {
+                    if (metalUsage.MembranceBUsage > SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit")}");
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit")}");
+                    }
+                }
+
+                //TotalWafer
+                if (metalUsage.TotalWafers > SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit") != 0)
+                {
+                    if (metalUsage.TotalWafers > SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit")}");
+                    }
+                }
+
+                //AnodeAWafer
+                if (metalUsage.AnodeAWafers > SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit") != 0)
+                {
+                    if (metalUsage.AnodeAWafers > SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit")}");
+                    }
+                }
+
+                //AnodeBWafer
+                if (metalUsage.AnodeBWafers > SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit") != 0)
+                {
+                    if (metalUsage.AnodeBWafers > SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit")}");
+                    }
+                }
+
+                //AnodeAbathUsage
+                if (metalUsage.AnodeABathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit") != 0)
+                {
+                    if (metalUsage.AnodeABathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit")}");
+                    }
+                }
+
+                //AnodeBbathUsage
+                if (metalUsage.AnodeBBathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit") != 0)
+                {
+                    if (metalUsage.AnodeBBathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit")}");
+                        return false;
+                    }
+                    else
+                    {
+                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit")}");
+                    }
+                }
+            }
+            return true;
+        }
+
+
+
     }
+
     public enum MetalMsg
     {
         NONE,

+ 1 - 2
CyberX8_RT/Modules/Prewet/PrewetKeepWetRoutine.cs

@@ -59,7 +59,7 @@ namespace CyberX8_RT.Modules.Prewet
         {
             Runner.Run(KeepwetStep.Idle_KeepwetPrepare, ResetLinmot, _delay_1ms)
                 .WaitWithStopCondition(KeepwetStep.Idle_KeepwetPrepareWait, CheckResetLinmotEndStatus, CheckResetLinmotStopStatus)
-                .Run(KeepwetStep.Idle_KeepWetStart, ExecuteWetScan, _delay_1ms)
+                .Run(KeepwetStep.Idle_KeepWetStart, ExecuteWetScan, _delay_1s)
                 .WaitWithStopCondition(KeepwetStep.Idle_KeepWetScan,CheckLinmotScanEndStatus,CheckLinmotScanStopStatus)
                 .Run(KeepwetStep.Idle_KeepWetPause, KeepWetComplete, _delay_1ms)
                 .End(KeepwetStep.End, NullFun, _delay_1ms);
@@ -141,7 +141,6 @@ namespace CyberX8_RT.Modules.Prewet
             bool result=_linMotAxis.Status==RState.Failed||_linMotAxis.Status==RState.Timeout;
             if(!result)
             {
-
                 //Pressure
                 if (_prewetDevice.PrewetPumpData.PumpPressureData.IsError)
                 {

+ 3 - 4
CyberX8_RT/Modules/Prewet/PrewetLotTrackUtil.cs

@@ -88,8 +88,8 @@ namespace CyberX8_RT.Modules.Prewet
                         sw.WriteLine($"SingleWafer:{headerData.IsSingleWafe}");
                         sw.WriteLine($"ProcessTime:{headerData.ProcessTime}");
                         sw.Write(CVS_SPLIT_CHAR);
-                        string str = $"TimeStamp{CVS_SPLIT_CHAR}StateMachine{CVS_SPLIT_CHAR}Pressure{CVS_SPLIT_CHAR}Flow{CVS_SPLIT_CHAR}PumpMode{CVS_SPLIT_CHAR}" +
-                            $"CurrentScan{CVS_SPLIT_CHAR}ScanOn{CVS_SPLIT_CHAR}PressureTarget{CVS_SPLIT_CHAR}ValveState{CVS_SPLIT_CHAR}PumpSpeed{CVS_SPLIT_CHAR}PumpControlCurrent";
+                        string str = $"TimeStamp{CVS_SPLIT_CHAR}StateMachine{CVS_SPLIT_CHAR}Pressure{CVS_SPLIT_CHAR}Flow{CVS_SPLIT_CHAR}" +
+                            $"CurrentScan{CVS_SPLIT_CHAR}ScanOn{CVS_SPLIT_CHAR}ValveState";
                         sw.WriteLine(str);
                     }
                         
@@ -97,8 +97,7 @@ namespace CyberX8_RT.Modules.Prewet
                     {
                         PrewetLotTrackData data = datas[i];
                         string tmp = $"{CVS_SPLIT_CHAR}{data.TimeStamp.ToString("HH:mm:ss")}{CVS_SPLIT_CHAR}{data.StateMachine}{CVS_SPLIT_CHAR}{data.Pressure.ToString("F3")}{CVS_SPLIT_CHAR}{data.Flow.ToString("F3")}" +
-                            $"{CVS_SPLIT_CHAR}{data.PumpMode}{CVS_SPLIT_CHAR}{data.CurrentScan}{CVS_SPLIT_CHAR}{data.ScanOn}{CVS_SPLIT_CHAR}{data.PressureTarget.ToString("F3")}{CVS_SPLIT_CHAR}" +
-                            $"{data.ValveState}{CVS_SPLIT_CHAR}{data.PumpSpeed}{CVS_SPLIT_CHAR}{data.PumpControlCurrent.ToString("F3")}";
+                            $"{CVS_SPLIT_CHAR}{data.CurrentScan}{CVS_SPLIT_CHAR}{data.ScanOn}{CVS_SPLIT_CHAR}{data.ValveState}";
                         sw.WriteLine(tmp);
                     }
                     sw.WriteLine("");

+ 154 - 0
CyberX8_RT/Modules/Reservoir/ReservoirEntity.cs

@@ -390,6 +390,10 @@ namespace CyberX8_RT.Modules.Reservoir
                 LOG.WriteLog(eEvent.ERR_RESERVOIR, Module.ToString(), "persistent is null");
                 return false;
             }
+            if (!ReservoirUsageMonitor(Module.ToString()))
+            {
+                return false;
+            }
             if (_reservoirItem.SubType == STRATUS)
             {
                 return _shInitializeRoutine.Start(_metalDevices, _powerSupplier, _temperatureController) == RState.Running;
@@ -457,5 +461,155 @@ namespace CyberX8_RT.Modules.Reservoir
             return (int)FSM_MSG.NONE;
         }
 
+        /// <summary>
+        /// 监控PM Counter Reservoir Usage
+        /// </summary>
+        public bool ReservoirUsageMonitor(string Module)
+        {
+            ReservoirUsage reservoirUsage = ReservoirUsageManager.Instance.GetReservoirUsage(Module);
+            ReservoirEntity reservoirEntity = Singleton<RouteManager>.Instance.GetModule<ReservoirEntity>(Module);
+            if (reservoirUsage == null || reservoirEntity == null) return true;
+            //reservoirTotalAmpHours Check
+            double reservoirTotalAmpHoursWarningLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalAmpHoursWarningLimit"))
+            {
+                reservoirTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.ReservoirTotalAmpHoursWarningLimit");
+            }
+            double reservoirTotalAmpHoursFaultLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalAmpHoursFaultLimit"))
+            {
+                reservoirTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.ReservoirTotalAmpHoursFaultLimit");
+            }
+            if (reservoirUsage.TotalUsage > reservoirTotalAmpHoursFaultLimit && reservoirTotalAmpHoursFaultLimit != 0)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Total Usage(AHr):{reservoirUsage.TotalUsage} is over config item ReservoirTotalAmpHoursFaultLimit:{reservoirTotalAmpHoursFaultLimit}");
+                return false;
+            }
+            else if (reservoirUsage.TotalUsage > reservoirTotalAmpHoursWarningLimit && reservoirTotalAmpHoursWarningLimit != 0)
+            {
+                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Total Usage(AHr):{reservoirUsage.TotalUsage} is over config item ReservoirTotalAmpHoursWarningLimit:{reservoirTotalAmpHoursWarningLimit}");
+            }
+            //MembraneTotalAmpHoursCheck
+            double membraneTotalAmpHoursWarningLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.MembraneTotalAmpHoursWarningLimit"))
+            {
+                membraneTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.MembraneTotalAmpHoursWarningLimit");
+            }
+            double membraneTotalAmpHoursFaultLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.MembraneTotalAmpHoursFaultLimit"))
+            {
+                membraneTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.MembraneTotalAmpHoursFaultLimit");
+            }
+            if (reservoirUsage.MembranceUsage > membraneTotalAmpHoursFaultLimit && membraneTotalAmpHoursFaultLimit != 0)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Membrane Usage(AHr):{reservoirUsage.MembranceUsage} is over config item MembraneTotalAmpHoursFaultLimit:{membraneTotalAmpHoursFaultLimit}");
+                return false;
+            }
+            else if (reservoirUsage.MembranceUsage > membraneTotalAmpHoursWarningLimit && membraneTotalAmpHoursWarningLimit != 0)
+            {
+                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Membrane Usage(AHr):{reservoirUsage.MembranceUsage} is over config item MembraneTotalAmpHoursWarningLimit:{membraneTotalAmpHoursWarningLimit}");
+            }
+            double bathTotalAmpHoursWarningLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalAmpHoursWarningLimit"))
+            {
+                bathTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.BathTotalAmpHoursWarningLimit");
+            }
+            double bathTotalAmpHoursFaultLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalAmpHoursFaultLimit"))
+            {
+                bathTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.BathTotalAmpHoursFaultLimit");
+            }
+            if (reservoirUsage.BathUsage > bathTotalAmpHoursFaultLimit && bathTotalAmpHoursFaultLimit != 0)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Bath Usage(AHr):{reservoirUsage.BathUsage} is over config item BathTotalAmpHoursFaultLimit:{bathTotalAmpHoursFaultLimit}");
+                return false;
+            }
+            else if (reservoirUsage.BathUsage > bathTotalAmpHoursWarningLimit && bathTotalAmpHoursWarningLimit != 0)
+            {
+                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Bath Usage(AHr):{reservoirUsage.BathUsage} is over config item BathTotalAmpHoursWarningLimit:{bathTotalAmpHoursWarningLimit}");
+            }
+            //BathTotalDaysCheck
+            int bathTotalDaysWarningLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalDaysWarningLimit"))
+            {
+                bathTotalDaysWarningLimit = SC.GetValue<int>($"Reservoir.{Module}.BathTotalDaysWarningLimit");
+            }
+            int bathTotalDaysFaultLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalDaysFaultLimit"))
+            {
+                bathTotalDaysFaultLimit = SC.GetValue<int>($"Reservoir.{Module}.BathTotalDaysFaultLimit");
+            }
+            if (reservoirUsage.BathUsageDays > bathTotalDaysFaultLimit && bathTotalDaysFaultLimit != 0)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Bath Usage(Days):{reservoirUsage.BathUsageDays} is over config item BathTotalDaysFaultLimit:{bathTotalDaysFaultLimit}");
+                return false;
+            }
+            else if (reservoirUsage.BathUsageDays > bathTotalDaysWarningLimit && bathTotalDaysWarningLimit != 0)
+            {
+                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Bath Usage(Days):{reservoirUsage.BathUsageDays} is over config item BathTotalDaysWarningLimit:{bathTotalDaysWarningLimit}");
+            }
+            //ReservoirTotalWafersCheck
+            int reservoirTotalWafersWarningLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalWafersWarningLimit"))
+            {
+                reservoirTotalWafersWarningLimit = SC.GetValue<int>($"Reservoir.{Module}.ReservoirTotalWafersWarningLimit");
+            }
+            int reservoirTotalWafersFaultLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalWafersFaultLimit"))
+            {
+                reservoirTotalWafersFaultLimit = SC.GetValue<int>($"Reservoir.{Module}.ReservoirTotalWafersFaultLimit");
+            }
+            if (reservoirUsage.TotalWafers > reservoirTotalWafersFaultLimit && reservoirTotalWafersFaultLimit != 0)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Total Wafers:{reservoirUsage.TotalWafers} is over config item ReservoirTotalWafersFaultLimit:{reservoirTotalWafersFaultLimit}");
+                return false;
+            }
+            else if (reservoirUsage.TotalWafers > reservoirTotalWafersWarningLimit && reservoirTotalWafersWarningLimit != 0)
+            {
+                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Total Wafers:{reservoirUsage.TotalWafers} is over config item ReservoirTotalWafersWarningLimit:{reservoirTotalWafersWarningLimit}");
+            }
+            //CMMAnodeTotalAmpHoursCheck
+            double cmmAnodeTotalAmpHoursWarningLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.CMMAnodeTotalAmpHoursWarningLimit"))
+            {
+                cmmAnodeTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMAnodeTotalAmpHoursWarningLimit");
+            }
+            double cmmAnodeTotalAmpHoursFaultLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.CMMAnodeTotalAmpHoursFaultLimit"))
+            {
+                cmmAnodeTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMAnodeTotalAmpHoursFaultLimit");
+            }
+            if (reservoirUsage.CMMAnodeUsage > cmmAnodeTotalAmpHoursFaultLimit && cmmAnodeTotalAmpHoursFaultLimit != 0)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} CMM Anode Usage(AHr):{reservoirUsage.CMMAnodeUsage} is over config item CMMAnodeTotalAmpHoursFaultLimit:{cmmAnodeTotalAmpHoursFaultLimit}");
+                return false;
+            }
+            else if (reservoirUsage.CMMAnodeUsage > cmmAnodeTotalAmpHoursWarningLimit && cmmAnodeTotalAmpHoursWarningLimit != 0)
+            {
+                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} CMM Anode Usage(AHr):{reservoirUsage.CMMAnodeUsage} is over config item CMMAnodeTotalAmpHoursWarningLimit:{cmmAnodeTotalAmpHoursWarningLimit}");
+            }
+            //CMMCathodeTotalAmpHoursCheck
+            double cmmCathodeTotalAmpHoursWarningLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.CMMCathodeTotalAmpHoursWarningLimit"))
+            {
+                cmmCathodeTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMCathodeTotalAmpHoursWarningLimit");
+            }
+            double cmmCathodeTotalAmpHoursFaultLimit = 0;
+            if (SC.ContainsItem($"Reservoir.{Module}.CMMCathodeTotalAmpHoursFaultLimit"))
+            {
+                cmmCathodeTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMCathodeTotalAmpHoursFaultLimit");
+            }
+            if (reservoirUsage.CMMMembranceUsage > cmmCathodeTotalAmpHoursFaultLimit && cmmCathodeTotalAmpHoursFaultLimit != 0)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} CMM Cathode Usage(AHr):{reservoirUsage.CMMMembranceUsage} is over config item CMMCathodeTotalAmpHoursFaultLimit:{cmmCathodeTotalAmpHoursFaultLimit}");
+                return false;
+            }
+            else if (reservoirUsage.CMMMembranceUsage > cmmCathodeTotalAmpHoursWarningLimit && cmmCathodeTotalAmpHoursWarningLimit != 0)
+            {
+                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} CMM Cathode Usage(AHr):{reservoirUsage.CMMMembranceUsage} is over config item CMMCathodeTotalAmpHoursWarningLimit:{cmmCathodeTotalAmpHoursWarningLimit}");
+            }
+            return true;
+        }
+
     }
 }

+ 1 - 328
CyberX8_RT/Modules/RouteManager.cs

@@ -970,38 +970,8 @@ namespace CyberX8_RT.Modules
 
         private bool FsmStartJob(object[] objs)
         {
-            bool result = CheckPMCounter();
-            if (!result)
-            {
-                return false;
-            }
             return _jobCycle.StartJob((string)objs[0],out string reason);
         }
-        /// <summary>
-        /// 检查PM counter
-        /// </summary>
-        /// <returns></returns>
-        private bool CheckPMCounter()
-        {
-            bool result = false;
-            foreach (string item in ReservoirItemManager.Instance.InstalledModules)
-            {
-                result = ReservoirUsageMonitor(item);
-                if (!result)
-                {
-                    return false;
-                }
-            }
-            foreach (string item in MetalItemManager.Instance.InstalledModules)
-            {
-                result = MetalUsageMointor(item);
-                if (!result)
-                {
-                    return false;
-                }
-            }
-            return true;
-        }
         private bool FsmPauseJob(object[] objs)
         {
             return _jobCycle.PauseJob((string)objs[0],out string reason);
@@ -1100,303 +1070,6 @@ namespace CyberX8_RT.Modules
         public List<IModuleEntity> GetModulesByModuleType(ModuleType type)
         {
             return _modultTypeEntitiesDic.ContainsKey(type) ? _modultTypeEntitiesDic[type] : new List<IModuleEntity>();
-        }
-
-        /// <summary>
-        /// 监控PM Counter Reservoir Usage
-        /// </summary>
-        public bool ReservoirUsageMonitor(string Module)
-        {
-            ReservoirUsage reservoirUsage = ReservoirUsageManager.Instance.GetReservoirUsage(Module);
-            ReservoirEntity reservoirEntity = Singleton<RouteManager>.Instance.GetModule<ReservoirEntity>(Module);
-            if (reservoirUsage == null || reservoirEntity == null) return true;
-            //reservoirTotalAmpHours Check
-            double reservoirTotalAmpHoursWarningLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalAmpHoursWarningLimit"))
-            {
-                reservoirTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.ReservoirTotalAmpHoursWarningLimit");
-            }
-            double reservoirTotalAmpHoursFaultLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalAmpHoursFaultLimit"))
-            {
-                reservoirTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.ReservoirTotalAmpHoursFaultLimit");
-            }
-            if (reservoirUsage.TotalUsage > reservoirTotalAmpHoursFaultLimit && reservoirTotalAmpHoursFaultLimit != 0)
-            {
-                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Total Usage(AHr):{reservoirUsage.TotalUsage} is over config item ReservoirTotalAmpHoursFaultLimit:{reservoirTotalAmpHoursFaultLimit}");
-                return false;
-            }
-            else if (reservoirUsage.TotalUsage > reservoirTotalAmpHoursWarningLimit && reservoirTotalAmpHoursWarningLimit != 0)
-            {
-                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Total Usage(AHr):{reservoirUsage.TotalUsage} is over config item ReservoirTotalAmpHoursWarningLimit:{reservoirTotalAmpHoursWarningLimit}");
-            }
-            //MembraneTotalAmpHoursCheck
-            double membraneTotalAmpHoursWarningLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.MembraneTotalAmpHoursWarningLimit"))
-            {
-                membraneTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.MembraneTotalAmpHoursWarningLimit");
-            }
-            double membraneTotalAmpHoursFaultLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.MembraneTotalAmpHoursFaultLimit"))
-            {
-                membraneTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.MembraneTotalAmpHoursFaultLimit");
-            }
-            if (reservoirUsage.MembranceUsage > membraneTotalAmpHoursFaultLimit && membraneTotalAmpHoursFaultLimit != 0)
-            {
-                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Membrane Usage(AHr):{reservoirUsage.MembranceUsage} is over config item MembraneTotalAmpHoursFaultLimit:{membraneTotalAmpHoursFaultLimit}");
-                return false;
-            }
-            else if (reservoirUsage.MembranceUsage > membraneTotalAmpHoursWarningLimit && membraneTotalAmpHoursWarningLimit != 0)
-            {
-                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Membrane Usage(AHr):{reservoirUsage.MembranceUsage} is over config item MembraneTotalAmpHoursWarningLimit:{membraneTotalAmpHoursWarningLimit}");
-            }
-            double bathTotalAmpHoursWarningLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalAmpHoursWarningLimit"))
-            {
-                bathTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.BathTotalAmpHoursWarningLimit");
-            }
-            double bathTotalAmpHoursFaultLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalAmpHoursFaultLimit"))
-            {
-                bathTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.BathTotalAmpHoursFaultLimit");
-            }
-            if (reservoirUsage.BathUsage > bathTotalAmpHoursFaultLimit && bathTotalAmpHoursFaultLimit != 0)
-            {
-                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Bath Usage(AHr):{reservoirUsage.BathUsage} is over config item BathTotalAmpHoursFaultLimit:{bathTotalAmpHoursFaultLimit}");
-                return false;
-            }
-            else if (reservoirUsage.BathUsage > bathTotalAmpHoursWarningLimit && bathTotalAmpHoursWarningLimit != 0)
-            {
-                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Bath Usage(AHr):{reservoirUsage.BathUsage} is over config item BathTotalAmpHoursWarningLimit:{bathTotalAmpHoursWarningLimit}");
-            }
-            //BathTotalDaysCheck
-            int bathTotalDaysWarningLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalDaysWarningLimit"))
-            {
-                bathTotalDaysWarningLimit = SC.GetValue<int>($"Reservoir.{Module}.BathTotalDaysWarningLimit");
-            }
-            int bathTotalDaysFaultLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.BathTotalDaysFaultLimit"))
-            {
-                bathTotalDaysFaultLimit = SC.GetValue<int>($"Reservoir.{Module}.BathTotalDaysFaultLimit");
-            }
-            if (reservoirUsage.BathUsageDays > bathTotalDaysFaultLimit && bathTotalDaysFaultLimit != 0)
-            {
-                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Bath Usage(Days):{reservoirUsage.BathUsageDays} is over config item BathTotalDaysFaultLimit:{bathTotalDaysFaultLimit}");
-                return false;
-            }
-            else if (reservoirUsage.BathUsageDays > bathTotalDaysWarningLimit && bathTotalDaysWarningLimit != 0)
-            {
-                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Bath Usage(Days):{reservoirUsage.BathUsageDays} is over config item BathTotalDaysWarningLimit:{bathTotalDaysWarningLimit}");
-            }
-            //ReservoirTotalWafersCheck
-            int reservoirTotalWafersWarningLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalWafersWarningLimit"))
-            {
-                reservoirTotalWafersWarningLimit = SC.GetValue<int>($"Reservoir.{Module}.ReservoirTotalWafersWarningLimit");
-            }
-            int reservoirTotalWafersFaultLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.ReservoirTotalWafersFaultLimit"))
-            {
-                reservoirTotalWafersFaultLimit = SC.GetValue<int>($"Reservoir.{Module}.ReservoirTotalWafersFaultLimit");
-            }
-            if (reservoirUsage.TotalWafers > reservoirTotalWafersFaultLimit && reservoirTotalWafersFaultLimit != 0)
-            {
-                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} Total Wafers:{reservoirUsage.TotalWafers} is over config item ReservoirTotalWafersFaultLimit:{reservoirTotalWafersFaultLimit}");
-                return false;
-            }
-            else if (reservoirUsage.TotalWafers > reservoirTotalWafersWarningLimit && reservoirTotalWafersWarningLimit != 0)
-            {
-                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} Total Wafers:{reservoirUsage.TotalWafers} is over config item ReservoirTotalWafersWarningLimit:{reservoirTotalWafersWarningLimit}");
-            }
-            //CMMAnodeTotalAmpHoursCheck
-            double cmmAnodeTotalAmpHoursWarningLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.CMMAnodeTotalAmpHoursWarningLimit"))
-            {
-                cmmAnodeTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMAnodeTotalAmpHoursWarningLimit");
-            }
-            double cmmAnodeTotalAmpHoursFaultLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.CMMAnodeTotalAmpHoursFaultLimit"))
-            {
-                cmmAnodeTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMAnodeTotalAmpHoursFaultLimit");
-            }
-            if (reservoirUsage.CMMAnodeUsage > cmmAnodeTotalAmpHoursFaultLimit && cmmAnodeTotalAmpHoursFaultLimit != 0)
-            {
-                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} CMM Anode Usage(AHr):{reservoirUsage.CMMAnodeUsage} is over config item CMMAnodeTotalAmpHoursFaultLimit:{cmmAnodeTotalAmpHoursFaultLimit}");
-                return false;
-            }
-            else if (reservoirUsage.CMMAnodeUsage > cmmAnodeTotalAmpHoursWarningLimit && cmmAnodeTotalAmpHoursWarningLimit != 0)
-            {
-                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} CMM Anode Usage(AHr):{reservoirUsage.CMMAnodeUsage} is over config item CMMAnodeTotalAmpHoursWarningLimit:{cmmAnodeTotalAmpHoursWarningLimit}");
-            }
-            //CMMCathodeTotalAmpHoursCheck
-            double cmmCathodeTotalAmpHoursWarningLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.CMMCathodeTotalAmpHoursWarningLimit"))
-            {
-                cmmCathodeTotalAmpHoursWarningLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMCathodeTotalAmpHoursWarningLimit");
-            }
-            double cmmCathodeTotalAmpHoursFaultLimit = 0;
-            if (SC.ContainsItem($"Reservoir.{Module}.CMMCathodeTotalAmpHoursFaultLimit"))
-            {
-                cmmCathodeTotalAmpHoursFaultLimit = (double)SC.GetValue<double>($"Reservoir.{Module}.CMMCathodeTotalAmpHoursFaultLimit");
-            }
-            if (reservoirUsage.CMMMembranceUsage > cmmCathodeTotalAmpHoursFaultLimit && cmmCathodeTotalAmpHoursFaultLimit != 0)
-            {
-                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{Module} CMM Cathode Usage(AHr):{reservoirUsage.CMMMembranceUsage} is over config item CMMCathodeTotalAmpHoursFaultLimit:{cmmCathodeTotalAmpHoursFaultLimit}");
-                return false;
-            }
-            else if (reservoirUsage.CMMMembranceUsage > cmmCathodeTotalAmpHoursWarningLimit && cmmCathodeTotalAmpHoursWarningLimit != 0)
-            {
-                LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{Module} CMM Cathode Usage(AHr):{reservoirUsage.CMMMembranceUsage} is over config item CMMCathodeTotalAmpHoursWarningLimit:{cmmCathodeTotalAmpHoursWarningLimit}");
-            }
-            return true;
-        }
-        /// <summary>
-        /// 监控 PM Counter Metal用量
-        /// </summary>
-        private bool MetalUsageMointor(string Module)
-        {
-            MetalUsage metalUsage = MetalUsageManager.Instance.GetMetalUsage(Module);
-            if (metalUsage != null)
-            {
-                //TotalAUsage
-                if (metalUsage.TotalUsage > SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit") != 0)
-                {
-                    if (metalUsage.TotalUsage > SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit")}");
-                    }
-                }
-                //AnodeAUsage
-                if (metalUsage.AnodeAUsage > SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit") != 0)
-                {
-                    if (metalUsage.AnodeAUsage > SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit")}");
-                    }
-                }
-                //AnodeBUsage
-                if (metalUsage.AnodeBUsage > SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit") != 0)
-                {
-                    if (metalUsage.AnodeBUsage > SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit")}");
-                        return false ;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit")}");
-                    }
-                }
-
-                //MembraneAUsage
-                if (metalUsage.MembranceAUsage > SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit") != 0)
-                {
-                    if (metalUsage.MembranceAUsage > SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit")}");
-                    }
-                }
-
-                //MembraneBUsage
-                if (metalUsage.MembranceBUsage > SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit") != 0)
-                {
-                    if (metalUsage.MembranceBUsage > SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit")}");
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit")}");
-                    }
-                }
-
-                //TotalWafer
-                if (metalUsage.TotalWafers > SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit") != 0)
-                {
-                    if (metalUsage.TotalWafers > SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit")}");
-                    }
-                }
-
-                //AnodeAWafer
-                if (metalUsage.AnodeAWafers > SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit") != 0)
-                {
-                    if (metalUsage.AnodeAWafers > SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit")}");
-                    }
-                }
-
-                //AnodeBWafer
-                if (metalUsage.AnodeBWafers > SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit") != 0)
-                {
-                    if (metalUsage.AnodeBWafers > SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit")}");
-                    }
-                }
-
-                //AnodeAbathUsage
-                if (metalUsage.AnodeABathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit") != 0)
-                {
-                    if (metalUsage.AnodeABathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit")}");
-                    }
-                }
-
-                //AnodeBbathUsage
-                if (metalUsage.AnodeBBathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit") != 0)
-                {
-                    if (metalUsage.AnodeBBathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit"))
-                    {
-                        LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit")}");
-                        return false;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.WARN_METAL, Module, $"{Module} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit")}");
-                    }
-                }
-            }
-            return true;
-        }
+        } 
     }
 }

+ 6 - 0
CyberX8_RT/Modules/SRD/SRDHomeRoutine.cs

@@ -122,6 +122,12 @@ namespace CyberX8_RT.Modules.Transporter
                 LOG.WriteLog(eEvent.ERR_SRD, Module, $"CDA or N2 is not enabled");
                 return false;
             }
+            //Check LoadDI
+            if (!systemFacilities.LoaderDiEnable)
+            {
+                LOG.WriteLog(eEvent.ERR_SRD, Module, "Load DI is Disable");
+                return false;
+            }
             return true;
         }
         /// <summary>

+ 14 - 14
CyberX8_RT/Modules/SRD/SRDLoaderRoutine.cs

@@ -16,13 +16,13 @@ namespace CyberX8_RT.Modules.SRD
     {
         private enum SRDLoaderStep 
         {
-            Loader_LiftUpOff,
-            Loader_FlippersIn,
-            Loader_N2On,
-            Loader_Delay,
-            Loader_N2Off,
-            Loader_ChuckVacuumOn,
-            Loader_FlippersOut,
+            Load_LiftUpOff,
+            Load_FlippersIn,
+            Load_N2On,
+            Load_Delay,
+            Load_N2Off,
+            Load_ChuckVacuumOn,
+            Load_FlippersOut,
             End
         }
         #region 常量 
@@ -74,13 +74,13 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         public RState Monitor()
         {
-            Runner.Run(SRDLoaderStep.Loader_LiftUpOff, LiftUpOff, CheckLiftUpOffEndStatus, CheckLiftUpOffStopStatus)
-                .Run(SRDLoaderStep.Loader_FlippersIn, FlippersIn, CheckFlippersInEndStatus, CheckFlippersInStopStatus)
-                .Run(SRDLoaderStep.Loader_N2On, N2On, _delay_1ms)
-                .Delay(SRDLoaderStep.Loader_Delay, 500)
-                .Run(SRDLoaderStep.Loader_N2Off, N2Off, _delay_1ms)
-                .Run(SRDLoaderStep.Loader_ChuckVacuumOn, ChuckVacuumOn, CheckChuckVacuumOnEndStatus, CheckChuckVacuumOnStopStatus)
-                .Run(SRDLoaderStep.Loader_FlippersOut, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
+            Runner.Run(SRDLoaderStep.Load_LiftUpOff, LiftUpOff, CheckLiftUpOffEndStatus, CheckLiftUpOffStopStatus)
+                .Run(SRDLoaderStep.Load_FlippersIn, FlippersIn, CheckFlippersInEndStatus, CheckFlippersInStopStatus)
+                .Run(SRDLoaderStep.Load_N2On, N2On, _delay_1ms)
+                .Delay(SRDLoaderStep.Load_Delay, 500)
+                .Run(SRDLoaderStep.Load_N2Off, N2Off, _delay_1ms)
+                .Run(SRDLoaderStep.Load_ChuckVacuumOn, ChuckVacuumOn, CheckChuckVacuumOnEndStatus, CheckChuckVacuumOnStopStatus)
+                .Run(SRDLoaderStep.Load_FlippersOut, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
                 .End(SRDLoaderStep.End, NullFun, _delay_1ms);
             return Runner.Status;
         }

+ 23 - 23
CyberX8_RT/Modules/SRD/SRDProcessRecipeRoutine.cs

@@ -14,8 +14,6 @@ using Aitex.Core.RT.SCCore;
 using Aitex.Core.RT.Device;
 using CyberX8_RT.Devices.Facilities;
 using Aitex.Core.Util;
-using CyberX8_RT.Modules.Transporter;
-using MECF.Framework.Common.WaferHolder;
 using MECF.Framework.Common.Persistent.SRD;
 
 namespace CyberX8_RT.Modules.SRD
@@ -29,11 +27,11 @@ namespace CyberX8_RT.Modules.SRD
         private enum SRDProcessState
         {
             Ready,    
-            StartLoader,
+            StartLoad,
             Loading,
             StartRunRecipe,
             RunReciping,
-            StartUnloader,
+            StartUnload,
             Unloading,
             CycleEnd,
             End
@@ -51,7 +49,7 @@ namespace CyberX8_RT.Modules.SRD
         /// <summary>
         /// Arm Axis
         /// </summary>
-        private JetAxisBase _armAxis;
+        //private JetAxisBase _armAxis;
         /// <summary>
         /// SRD Recipe
         /// </summary>
@@ -127,7 +125,7 @@ namespace CyberX8_RT.Modules.SRD
         public SRDProcessRecipeRoutine(string module, JetAxisBase rotationAxis, JetAxisBase armAxis, SrdCommonDevice srdCommon) : base(module)
         {
             _rotationAxis = rotationAxis;
-            _armAxis = armAxis;
+            //_armAxis = armAxis;
             _srdCommonDevice = srdCommon;
             _runRecipeRoutine = new SRDRunRecipeRoutine(module);
             _unloaderRoutine= new SRDUnloaderRoutine(module);
@@ -155,6 +153,8 @@ namespace CyberX8_RT.Modules.SRD
             {
                 _srdCommonDevice.EnterErrorOperation();
             }
+            //停电机
+            if (_rotationAxis != null && _rotationAxis.IsRun) _rotationAxis.StopPositionOperation();
         }
         /// <summary>
         /// 监控
@@ -166,13 +166,13 @@ namespace CyberX8_RT.Modules.SRD
             LottrackRecord();
             Runner.LoopStart(SRDProcessState.Ready, "Process Recipe Start", _cycleCount, NullFun, _delay_1ms)
 
-                .LoopRunIf(SRDProcessState.StartLoader, !_isManual,() => { return StartLoader(); }, _delay_1ms)
+                .LoopRunIf(SRDProcessState.StartLoad, !_isManual,() => { return StartLoad(); }, _delay_1ms)
                 .LoopRunIfWithStopStatus(SRDProcessState.Loading, !_isManual, CheckLoaderEndStatus, CheckLoaderErrorStatus)
 
                 .LoopRun(SRDProcessState.StartRunRecipe, () => { return StartRunRecipe(); }, _delay_1ms)
                 .LoopRunWithStopStatus(SRDProcessState.RunReciping, CheckRunRecipeEndStatus, CheckRunRecipeErrorStatus)
 
-                .LoopRunIf(SRDProcessState.StartUnloader, !_isManual, () => { return StartUnloader(); }, _delay_1ms)
+                .LoopRunIf(SRDProcessState.StartUnload, !_isManual, () => { return StartUnload(); }, _delay_1ms)
                 .LoopRunIfWithStopStatus(SRDProcessState.Unloading, !_isManual, CheckUnloaderEndStatus, CheckUnloaderErrorStatus)
 
                 .LoopEnd(SRDProcessState.CycleEnd, NullFun, _delay_1ms)             
@@ -230,7 +230,7 @@ namespace CyberX8_RT.Modules.SRD
         /// </summary>
         /// <param name="recipe"></param>
         /// <returns></returns>
-        private bool StartLoader()
+        private bool StartLoad()
         {
             bool result = _loaderRoutine.Start() == RState.Running;
             if (!result)
@@ -322,7 +322,7 @@ namespace CyberX8_RT.Modules.SRD
         /// </summary>
         /// <param name="recipe"></param>
         /// <returns></returns>
-        private bool StartUnloader()
+        private bool StartUnload()
         {
             bool result= _unloaderRoutine.Start(false) == RState.Running;
             if (!result)
@@ -362,9 +362,9 @@ namespace CyberX8_RT.Modules.SRD
         private string GetCurrentStateMachine()
         {
             string result;
-            if(Runner.CurrentStep.ToString() == "Ready")
+            if (Runner.CurrentStep.ToString().Contains("Loading"))
             {
-                result = "Ready";
+                result = _loaderRoutine.CurrentStep;
             }
             else if(Runner.CurrentStep.ToString().Contains("RunReciping"))
             {
@@ -376,7 +376,7 @@ namespace CyberX8_RT.Modules.SRD
             }
             else
             {
-                result = "End";
+                result = Runner.CurrentStep.ToString();
             }
             return result;
         }
@@ -429,16 +429,16 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         public bool CheckCompleteCondition(int index)
         {
-            if (_armAxis.IsRun)
-            {
-                NotifyError(eEvent.ERR_SRD, "Arm axis is run", 0);
-                return false;
-            }
-            if (!_armAxis.IsHomed)
-            {
-                NotifyError(eEvent.ERR_SRD, "Arm axis is not homed", 0);
-                return false;
-            }
+            //if (_armAxis.IsRun)
+            //{
+            //    NotifyError(eEvent.ERR_SRD, "Arm axis is run", 0);
+            //    return false;
+            //}
+            //if (!_armAxis.IsHomed)
+            //{
+            //    NotifyError(eEvent.ERR_SRD, "Arm axis is not homed", 0);
+            //    return false;
+            //}
             if (_rotationAxis.IsRun)
             {
                 NotifyError(eEvent.ERR_SRD, "Rotation axis is run", 0);

+ 14 - 17
CyberX8_RT/Modules/SRD/SRDUnloaderRoutine.cs

@@ -8,11 +8,8 @@ using CyberX8_RT.Devices.AXIS;
 using CyberX8_RT.Devices.Facilities;
 using CyberX8_RT.Devices.SRD;
 using MECF.Framework.Common.Equipment;
-using MECF.Framework.Common.RecipeCenter;
 using MECF.Framework.Common.Routine;
 using MECF.Framework.Common.SubstrateTrackings;
-using System;
-using System.Windows.Input;
 
 namespace CyberX8_RT.Modules.SRD
 {
@@ -20,13 +17,13 @@ namespace CyberX8_RT.Modules.SRD
     {         
         private enum SRDUnloaderStep
         {
-            Unloader_FlippersOut,
-            Unloader_ChuckVacuumOff,
-            Unloader_ChuckATMOn,
-            Unloader_CheckVacuum,
-            Unloader_LiftUpOn,
-            Unloader_CheckWaferPresent,
-            Unloader_OpenDoor,
+            Unload_FlippersOut,
+            Unload_ChuckVacuumOff,
+            Unload_ChuckATMOn,
+            Unload_CheckVacuum,
+            Unload_LiftUpOn,
+            Unload_CheckWaferPresent,
+            Unload_OpenDoor,
             End
         }
         #region 常量 
@@ -91,13 +88,13 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         public RState Monitor()
         {
-            Runner.RunIf(SRDUnloaderStep.Unloader_FlippersOut, _isProcessError, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
-                .Run(SRDUnloaderStep.Unloader_ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus)
-                .Run(SRDUnloaderStep.Unloader_ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus)
-                .WaitWithStopCondition(SRDUnloaderStep.Unloader_CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus)
-                .Run(SRDUnloaderStep.Unloader_LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus)
-                .Run(SRDUnloaderStep.Unloader_CheckWaferPresent, CheckWaferPresent, _delay_1ms)
-                .Run(SRDUnloaderStep.Unloader_OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus)
+            Runner.RunIf(SRDUnloaderStep.Unload_FlippersOut, _isProcessError, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
+                .Run(SRDUnloaderStep.Unload_ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus)
+                .Run(SRDUnloaderStep.Unload_ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus)
+                .WaitWithStopCondition(SRDUnloaderStep.Unload_CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus)
+                .Run(SRDUnloaderStep.Unload_LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus)
+                .Run(SRDUnloaderStep.Unload_CheckWaferPresent, CheckWaferPresent, _delay_1ms)
+                .Run(SRDUnloaderStep.Unload_OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus)
                 .End(SRDUnloaderStep.End, NullFun, _delay_1ms);
             return Runner.Status;
         }

+ 1 - 0
CyberX8_Themes/CyberX8_Themes.csproj

@@ -1232,6 +1232,7 @@
     <Content Include="Themes\Images\parts\doorunknown.png" />
     <Content Include="Themes\Images\parts\efem.png" />
     <Content Include="Themes\Images\parts\efemtrack.png" />
+    <Resource Include="Themes\Images\parts\Flipper.png" />
     <Content Include="Themes\Images\parts\loadlock.png" />
     <Content Include="Themes\Images\parts\loadport.png" />
     <Resource Include="Themes\Images\parts\serobot\SERobot1.png" />

BIN
CyberX8_Themes/Themes/Images/parts/Flipper.png


+ 2 - 2
CyberX8_Themes/UserControls/PrewetLeftSideControl.xaml

@@ -170,9 +170,9 @@
                            IsError="{Binding ElementName=self,Path=PumpData.PumpFlowData.IsError}" 
                            IsWarning="{Binding ElementName=self,Path=PumpData.PumpFlowData.IsWarning}"/>
         <TextBlock Grid.Row="5" Grid.Column="5"  VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="18" Width="60" Background="LightGray" Foreground="White" 
-                   Text="{Binding ElementName=self,Path=PumpData.PumpFlowData.MaxError}"></TextBlock>
-        <TextBlock Grid.Row="5" Grid.Column="6" VerticalAlignment="Center"  HorizontalAlignment="Center" FontSize="18" Width="60" Background="LightGray" Foreground="White" 
                    Text="{Binding ElementName=self,Path=PumpData.PumpFlowData.MaxWarning}"></TextBlock>
+        <TextBlock Grid.Row="5" Grid.Column="6" VerticalAlignment="Center"  HorizontalAlignment="Center" FontSize="18" Width="60" Background="LightGray" Foreground="White" 
+                   Text="{Binding ElementName=self,Path=PumpData.PumpFlowData.MaxError}"></TextBlock>
         <TextBlock Grid.Row="5" Grid.Column="7" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="12" Background="Transparent">L/min</TextBlock>
         <!--<Grid Grid.Row="11" Grid.Column="0">
             <Label  Content="Pressure Target" FontSize="16" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>

+ 160 - 2
CyberX8_Themes/UserControls/SRDUIControl.xaml

@@ -34,7 +34,7 @@
     <Viewbox>
         <Canvas Width="480" Height="450" RenderTransformOrigin="0.5,0.533">
             <!--Exhaust-->
-            <local:Blower IsPowerOn="{Binding ElementName=self,Path=CommonData.ExhaustOn}" HorizontalAlignment="Center" Canvas.Left="165" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Height="94" Canvas.Top="-50" >
+            <local:Blower IsPowerOn="{Binding ElementName=self,Path=CommonData.N2On}" HorizontalAlignment="Center" Canvas.Left="165" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Height="94" Canvas.Top="-50" >
                 <local:Blower.RenderTransform>
                     <TransformGroup>
                         <ScaleTransform/>
@@ -62,7 +62,7 @@
                 </Canvas.RenderTransform>
 
                 <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/SRDChuck.png" HorizontalAlignment="Center" VerticalAlignment="Center" Canvas.Left="68.7" Canvas.Top="68.1" />
-                <Viewbox Width="156" Height="156"  Canvas.Left="27" Canvas.Top="26.5" HorizontalAlignment="Left" VerticalAlignment="Top" >
+                <Viewbox Width="140" Height="140"  Canvas.Left="35.5" Canvas.Top="35" HorizontalAlignment="Left" VerticalAlignment="Top" >
                     <local:WaferCtrl WaferData="{Binding ElementName=self, Path=WaferInfo}"/>
                 </Viewbox>
             </Canvas>
@@ -136,6 +136,164 @@
                     </LinearGradientBrush>
                 </Rectangle.Fill>
             </Rectangle>
+            <!--Flipper 动画-->
+            <!--Flipper1_200-->
+            <Canvas Canvas.Left="177" Canvas.Top="278" RenderTransformOrigin="1.133,1.083" Height="55" Width="20">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper1UIPosition200}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Top" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="15" Canvas.Top="15">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="-50"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="200" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="25" RenderTransformOrigin="0.56,0.738" Canvas.Top="-22" Canvas.Left="58">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-145.026"/>
+                            <TranslateTransform X="-61.999" Y="52.237"/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper2_200-->
+            <Canvas Canvas.Left="167" Canvas.Top="190" RenderTransformOrigin="0.123,-0.241" Height="56" Width="20" HorizontalAlignment="Left" VerticalAlignment="Center">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper2UIPosition200}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Top="-60" Canvas.Left="-5">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="60"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="200" FontSize="7" FontWeight="Normal" HorizontalAlignment="Center" Height="20" VerticalAlignment="Center" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-33" Canvas.Left="3">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-34.79"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper3_200-->
+            <Canvas Canvas.Left="303" Canvas.Top="270" RenderTransformOrigin="1.661,-0.902" Height="55" Width="20" HorizontalAlignment="Left" VerticalAlignment="Center">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper3UIPosition200}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Center" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="25" Canvas.Top="-95">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="-179"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="200" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Center" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-42" Canvas.Left="22">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="86.257"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper1_150-->
+            <Canvas Canvas.Left="300" Canvas.Top="246" RenderTransformOrigin="1.048,1.101" Height="54" Width="20" HorizontalAlignment="Center" VerticalAlignment="Top">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper1UIPosition150}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Top" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="15" Canvas.Top="15">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="-130"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="150" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="25" RenderTransformOrigin="0.56,0.738" Canvas.Top="2" Canvas.Left="53">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-225.213"/>
+                            <TranslateTransform X="-61.999" Y="52.237"/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper2_150-->
+            <Canvas Canvas.Left="139" Canvas.Top="273" RenderTransformOrigin="0.147,-0.262" Height="55" Width="20">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper2UIPosition150}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Left" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Top="-60" Canvas.Left="-5">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="8"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="150" FontSize="7" FontWeight="Normal" HorizontalAlignment="Left" Height="20" VerticalAlignment="Center" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-42" Canvas.Left="-9">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="-88.507"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--Flipper3_150-->
+            <Canvas Canvas.Left="253" Canvas.Top="208" RenderTransformOrigin="1.661,-0.902" Height="55" Width="20" HorizontalAlignment="Center" VerticalAlignment="Center">
+                <Canvas.RenderTransform>
+                    <TransformGroup>
+                        <ScaleTransform/>
+                        <SkewTransform/>
+                        <RotateTransform Angle="{Binding ElementName=self,Path=Flipper3UIPosition150}"/>
+                        <TranslateTransform/>
+                    </TransformGroup>
+                </Canvas.RenderTransform>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/Flipper.png" HorizontalAlignment="Center" VerticalAlignment="Center" Height="63" Width="30" RenderTransformOrigin="0.266,0.719" Canvas.Left="25" Canvas.Top="-95">
+                    <Image.RenderTransform>
+                        <RotateTransform Angle="132"/>
+                    </Image.RenderTransform>
+                </Image>
+                <Label Content="150" FontSize="7" FontWeight="Normal" HorizontalAlignment="Center" Height="20" VerticalAlignment="Top" Width="25" RenderTransformOrigin="0.5,0.5" Canvas.Top="-49" Canvas.Left="35">
+                    <Label.RenderTransform>
+                        <TransformGroup>
+                            <ScaleTransform/>
+                            <SkewTransform/>
+                            <RotateTransform Angle="38.728"/>
+                            <TranslateTransform/>
+                        </TransformGroup>
+                    </Label.RenderTransform>
+                </Label>
+            </Canvas>
+            <!--<Ellipse Width="200" Height="200" Canvas.Left="140" Canvas.Top="146" HorizontalAlignment="Left" VerticalAlignment="Top" Stroke="Black"/>-->
         </Canvas>
     </Viewbox>
 </UserControl>

+ 144 - 9
CyberX8_Themes/UserControls/SRDUIControl.xaml.cs

@@ -3,17 +3,8 @@ using OpenSEMI.ClientBase;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Navigation;
-using System.Windows.Shapes;
 
 namespace CyberX8_Themes.UserControls
 {
@@ -59,6 +50,150 @@ namespace CyberX8_Themes.UserControls
                 this.SetValue(RotationUIPositionProperty, value);
             }
         }
+        public static readonly DependencyProperty Flipper1UIPosition200Property = DependencyProperty.Register(
+        "Flipper1UIPosition200", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper1UIPosition200 (degree)
+        /// </summary>
+        public double Flipper1UIPosition200
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper1UIPosition200Property);
+            }
+            set
+            {
+                this.SetValue(Flipper1UIPosition200Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper2UIPosition200Property = DependencyProperty.Register(
+        "Flipper2UIPosition200", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper2UIPosition200 (degree)
+        /// </summary>
+        public double Flipper2UIPosition200
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper2UIPosition200Property);
+            }
+            set
+            {
+                this.SetValue(Flipper2UIPosition200Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper3UIPosition200Property = DependencyProperty.Register(
+        "Flipper3UIPosition200", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper3UIPosition200 (degree)
+        /// </summary>
+        public double Flipper3UIPosition200
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper3UIPosition200Property);
+            }
+            set
+            {
+                this.SetValue(Flipper3UIPosition200Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper1UIPosition150Property = DependencyProperty.Register(
+        "Flipper1UIPosition150", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper1UIPosition150 (degree)
+        /// </summary>
+        public double Flipper1UIPosition150
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper1UIPosition150Property);
+            }
+            set
+            {
+                this.SetValue(Flipper1UIPosition150Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper2UIPosition150Property = DependencyProperty.Register(
+        "Flipper2UIPosition150", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper2UIPosition150 (degree)
+        /// </summary>
+        public double Flipper2UIPosition150
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper2UIPosition150Property);
+            }
+            set
+            {
+                this.SetValue(Flipper2UIPosition150Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper3UIPosition150Property = DependencyProperty.Register(
+        "Flipper3UIPosition150", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper3UIPosition150 (degree)
+        /// </summary>
+        public double Flipper3UIPosition150
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper3UIPosition150Property);
+            }
+            set
+            {
+                this.SetValue(Flipper3UIPosition150Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper1UIPosition100Property = DependencyProperty.Register(
+        "Flipper1UIPosition100", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper1UIPosition100 (degree)
+        /// </summary>
+        public double Flipper1UIPosition100
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper1UIPosition100Property);
+            }
+            set
+            {
+                this.SetValue(Flipper1UIPosition100Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper2UIPosition100Property = DependencyProperty.Register(
+        "Flipper2UIPosition100", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper2UIPosition100 (degree)
+        /// </summary>
+        public double Flipper2UIPosition100
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper2UIPosition100Property);
+            }
+            set
+            {
+                this.SetValue(Flipper2UIPosition100Property, value);
+            }
+        }
+        public static readonly DependencyProperty Flipper3UIPosition100Property = DependencyProperty.Register(
+        "Flipper3UIPosition100", typeof(double), typeof(SRDUIControl), new FrameworkPropertyMetadata((double)0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Flipper3UIPosition100 (degree)
+        /// </summary>
+        public double Flipper3UIPosition100
+        {
+            get
+            {
+                return (double)this.GetValue(Flipper3UIPosition100Property);
+            }
+            set
+            {
+                this.SetValue(Flipper3UIPosition100Property, value);
+            }
+        }
         public static readonly DependencyProperty WaferInfoProperty = DependencyProperty.Register(
         "WaferInfo", typeof(WaferInfo), typeof(SRDUIControl));
         /// <summary>