Browse Source

1. add SignalTower for Venus System by VenusSignalTower.xml
2. SE/DEGasControl from int to float in recipe
3. fix bug in PartialPressureViewModel
4. fix DE TMLeakCheck bug while search the recorder of TMLeakCheck
5. enhance the IoMagnet
6. add chiller CoolnetTemp in AI
7. add SetSpeed/RQSpeed/StoreSpeed fpr HongHuRobot in UI/RT/Simulator
8. fix the RobotUI cannot move in DEOperation
9. add Delay for Venus Swap

zhouhr 1 year ago
parent
commit
7a07ffa5ca
31 changed files with 795 additions and 227 deletions
  1. 72 72
      Venus/Venus_Core/ProcessUnitDefine.cs
  2. 4 1
      Venus/Venus_Core/RtState.cs
  3. 2 2
      Venus/Venus_MainPages/ViewModels/DETMOperationViewModel.cs
  4. 1 0
      Venus/Venus_MainPages/ViewModels/OverVenusDEViewModel.cs
  5. 7 5
      Venus/Venus_MainPages/ViewModels/PartialPressureViewModel.cs
  6. 111 2
      Venus/Venus_MainPages/ViewModels/VenusDETMViewModel.cs
  7. 50 1
      Venus/Venus_MainPages/ViewModels/VenusDeOperationOverViewModel.cs
  8. 1 1
      Venus/Venus_MainPages/Views/OverVenusDEView.xaml
  9. 10 10
      Venus/Venus_MainPages/Views/PartialPressureView.xaml
  10. 53 3
      Venus/Venus_MainPages/Views/VenusDETMView.xaml
  11. 7 7
      Venus/Venus_MainPages/Views/VenusDeOperationOverView.xaml
  12. 7 0
      Venus/Venus_RT/Config/TM/DeviceModelVenusDE_MF.xml
  13. 18 0
      Venus/Venus_RT/Config/VenusSignalTower.xml
  14. 4 0
      Venus/Venus_RT/Devices/AdTecRF.cs
  15. 2 2
      Venus/Venus_RT/Devices/DeviceManager.cs
  16. 2 0
      Venus/Venus_RT/Devices/IODevices/IoMagnet.cs
  17. 149 45
      Venus/Venus_RT/Devices/IODevices/IoSignalTower.cs
  18. 4 3
      Venus/Venus_RT/Devices/PendulumValve.cs
  19. 7 7
      Venus/Venus_RT/Devices/SMCShareChiller.cs
  20. 4 0
      Venus/Venus_RT/Devices/TM/HongHuDETM.cs
  21. 86 6
      Venus/Venus_RT/Devices/TM/HongHuVR.cs
  22. 5 0
      Venus/Venus_RT/Devices/TM/ITransferRobot.cs
  23. 17 0
      Venus/Venus_RT/Devices/TM/SIASUNRobot.cs
  24. 15 2
      Venus/Venus_RT/Devices/TruPlasmaRF.cs
  25. 1 0
      Venus/Venus_RT/Modules/RouteManager.cs
  26. 3 1
      Venus/Venus_RT/Modules/TM/VenusEntity/SEMFSwapRoutine.cs
  27. 96 3
      Venus/Venus_RT/Modules/TM/VenusEntity/SETMEntity.cs
  28. 1 0
      Venus/Venus_RT/Modules/VCE/VceEntity.cs
  29. 3 0
      Venus/Venus_RT/Venus_RT.csproj
  30. 53 0
      Venus/Venus_Simulator/Devices/DETMSimulatorServer.cs
  31. 0 54
      Venus/Venus_UI/Config/Menu_VenusDE.json

+ 72 - 72
Venus/Venus_Core/ProcessUnitDefine.cs

@@ -377,66 +377,66 @@ namespace Venus_Core
         [IsTolerance]
         [CustomName("ToleranceDelayTime(ms)")]
         public int ToleranceDelayTime { get; set; } = 3000;
-        public int Gas1 { get; set; }
+        public float Gas1 { get; set; }
         [IsTolerance]
-        public int Gas1WarningRange { get; set; } = 5;
+        public float Gas1WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas1AlarmRange { get; set; } = 10;
-        public int Gas2 { get; set; }
+        public float Gas1AlarmRange { get; set; } = 10;
+        public float Gas2 { get; set; }
         [IsTolerance]
-        public int Gas2WarningRange { get; set; } = 5;
+        public float Gas2WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas2AlarmRange { get; set; } = 10;
-        public int Gas3 { get; set; }
+        public float Gas2AlarmRange { get; set; } = 10;
+        public float Gas3 { get; set; }
         [IsTolerance]
-        public int Gas3WarningRange { get; set; } = 5;
+        public float Gas3WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas3AlarmRange { get; set; } = 10;
-        public int Gas4 { get; set; }
+        public float Gas3AlarmRange { get; set; } = 10;
+        public float Gas4 { get; set; }
         [IsTolerance]
-        public int Gas4WarningRange { get; set; } = 5;
+        public float Gas4WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas4AlarmRange { get; set; } = 10;
-        public int Gas5 { get; set; }
+        public float Gas4AlarmRange { get; set; } = 10;
+        public float Gas5 { get; set; }
         [IsTolerance]
-        public int Gas5WarningRange { get; set; } = 5;
+        public float Gas5WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas5AlarmRange { get; set; } = 10;
-        public int Gas6 { get; set; }
+        public float Gas5AlarmRange { get; set; } = 10;
+        public float Gas6 { get; set; }
         [IsTolerance]
-        public int Gas6WarningRange { get; set; } = 5;
+        public float Gas6WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas6AlarmRange { get; set; } = 10;
-        public int Gas7 { get; set; }
+        public float Gas6AlarmRange { get; set; } = 10;
+        public float Gas7 { get; set; }
         [IsTolerance]
-        public int Gas7WarningRange { get; set; } = 5;
+        public float Gas7WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas7AlarmRange { get; set; } = 10;
-        public int Gas8 { get; set; }
+        public float Gas7AlarmRange { get; set; } = 10;
+        public float Gas8 { get; set; }
         [IsTolerance]
-        public int Gas8WarningRange { get; set; } = 5;
+        public float Gas8WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas8AlarmRange { get; set; } = 10;
-        public int Gas9 { get; set; }
+        public float Gas8AlarmRange { get; set; } = 10;
+        public float Gas9 { get; set; }
         [IsTolerance]
-        public int Gas9WarningRange { get; set; } = 5;
+        public float Gas9WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas9AlarmRange { get; set; } = 10;
-        public int Gas10 { get; set; }
+        public float Gas9AlarmRange { get; set; } = 10;
+        public float Gas10 { get; set; }
         [IsTolerance]
-        public int Gas10WarningRange { get; set; } = 5;
+        public float Gas10WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas10AlarmRange { get; set; } = 10;
-        public int Gas11 { get; set; }
+        public float Gas10AlarmRange { get; set; } = 10;
+        public float Gas11 { get; set; }
         [IsTolerance]
-        public int Gas11WarningRange { get; set; } = 5;
+        public float Gas11WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas11AlarmRange { get; set; } = 10;
-        public int Gas12 { get; set; }
+        public float Gas11AlarmRange { get; set; } = 10;
+        public float Gas12 { get; set; }
         [IsTolerance]
-        public int Gas12WarningRange { get; set; } = 5;
+        public float Gas12WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas12AlarmRange { get; set; } = 10;
+        public float Gas12AlarmRange { get; set; } = 10;
     }
     public class VenusDEGasControlUnit : ProcessUnitBase
     {
@@ -446,66 +446,66 @@ namespace Venus_Core
         [IsTolerance]
         [CustomName("ToleranceDelayTime(ms)")]
         public int ToleranceDelayTime { get; set; } = 3000;
-        public int Gas1 { get; set; }
+        public float Gas1 { get; set; }
         [IsTolerance]
-        public int Gas1WarningRange { get; set; } = 5;
+        public float Gas1WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas1AlarmRange { get; set; } = 10;
-        public int Gas2 { get; set; }
+        public float Gas1AlarmRange { get; set; } = 10;
+        public float Gas2 { get; set; }
         [IsTolerance]
-        public int Gas2WarningRange { get; set; } = 5;
+        public float Gas2WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas2AlarmRange { get; set; } = 10;
-        public int Gas3 { get; set; }
+        public float Gas2AlarmRange { get; set; } = 10;
+        public float Gas3 { get; set; }
         [IsTolerance]
-        public int Gas3WarningRange { get; set; } = 5;
+        public float Gas3WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas3AlarmRange { get; set; } = 10;
-        public int Gas4 { get; set; }
+        public float Gas3AlarmRange { get; set; } = 10;
+        public float Gas4 { get; set; }
         [IsTolerance]
-        public int Gas4WarningRange { get; set; } = 5;
+        public float Gas4WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas4AlarmRange { get; set; } = 10;
-        public int Gas5 { get; set; }
+        public float Gas4AlarmRange { get; set; } = 10;
+        public float Gas5 { get; set; }
         [IsTolerance]
-        public int Gas5WarningRange { get; set; } = 5;
+        public float Gas5WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas5AlarmRange { get; set; } = 10;
-        public int Gas6 { get; set; }
+        public float Gas5AlarmRange { get; set; } = 10;
+        public float Gas6 { get; set; }
         [IsTolerance]
-        public int Gas6WarningRange { get; set; } = 5;
+        public float Gas6WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas6AlarmRange { get; set; } = 10;
-        public int Gas7 { get; set; }
+        public float Gas6AlarmRange { get; set; } = 10;
+        public float Gas7 { get; set; }
         [IsTolerance]
-        public int Gas7WarningRange { get; set; } = 5;
+        public float Gas7WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas7AlarmRange { get; set; } = 10;
-        public int Gas8 { get; set; }
+        public float Gas7AlarmRange { get; set; } = 10;
+        public float Gas8 { get; set; }
         [IsTolerance]
-        public int Gas8WarningRange { get; set; } = 5;
+        public float Gas8WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas8AlarmRange { get; set; } = 10;
-        public int Gas9 { get; set; }
+        public float Gas8AlarmRange { get; set; } = 10;
+        public float Gas9 { get; set; }
         [IsTolerance]
-        public int Gas9WarningRange { get; set; } = 5;
+        public float Gas9WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas9AlarmRange { get; set; } = 10;
-        public int Gas10 { get; set; }
+        public float Gas9AlarmRange { get; set; } = 10;
+        public float Gas10 { get; set; }
         [IsTolerance]
-        public int Gas10WarningRange { get; set; } = 5;
+        public float Gas10WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas10AlarmRange { get; set; } = 10;
-        public int Gas11 { get; set; }
+        public float Gas10AlarmRange { get; set; } = 10;
+        public float Gas11 { get; set; }
         [IsTolerance]
-        public int Gas11WarningRange { get; set; } = 5;
+        public float Gas11WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas11AlarmRange { get; set; } = 10;
-        public int Gas12 { get; set; }
+        public float Gas11AlarmRange { get; set; } = 10;
+        public float Gas12 { get; set; }
         [IsTolerance]
-        public int Gas12WarningRange { get; set; } = 5;
+        public float Gas12WarningRange { get; set; } = 5;
         [IsTolerance]
-        public int Gas12AlarmRange { get; set; } = 10;
+        public float Gas12AlarmRange { get; set; } = 10;
     }
     public class ESCHVUnit : ProcessUnitBase
     {

+ 4 - 1
Venus/Venus_Core/RtState.cs

@@ -128,7 +128,10 @@ namespace Venus_Core
         Retracting,
         Swapping,
         Gotoing,
-        ControllingPressure
+        ControllingPressure,
+        SetSpeeding,
+        QuerySpeeding,
+        SaveSpeeding
     }
     public enum LLState
     {

+ 2 - 2
Venus/Venus_MainPages/ViewModels/DETMOperationViewModel.cs

@@ -125,7 +125,7 @@ namespace Venus_MainPages.ViewModels
                 if (m_TMCurrentState == null && !_TMCheckFlag)
                 {
                     _TMCheckFlag = true;
-                    var AllLeakCheckDa = QueryDataClient.Instance.Service.GetPMLeakCheckResult("DETM");
+                    var AllLeakCheckDa = QueryDataClient.Instance.Service.GetPMLeakCheckResult("TM");
                     if (AllLeakCheckDa != null)
                     {
                         TMLeakCheckResultList = new ObservableCollection<PMLeakCheckResult>(AllLeakCheckDa);
@@ -134,7 +134,7 @@ namespace Venus_MainPages.ViewModels
 
                 if ((m_TMCurrentState == "Leakchecking") && value == "Idle")
                 {
-                    var AllLeakCheckDa = QueryDataClient.Instance.Service.GetPMLeakCheckResult("DETM");
+                    var AllLeakCheckDa = QueryDataClient.Instance.Service.GetPMLeakCheckResult("TM");
                     if (AllLeakCheckDa != null)
                     {
                         TMLeakCheckResultList = new ObservableCollection<PMLeakCheckResult>(AllLeakCheckDa);

+ 1 - 0
Venus/Venus_MainPages/ViewModels/OverVenusDEViewModel.cs

@@ -2063,6 +2063,7 @@ namespace Venus_MainPages.ViewModels
 
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.C1");
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.C2");
+            m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.VDC");
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.DeviceData");
 
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.PendulumValve}.DeviceData");

+ 7 - 5
Venus/Venus_MainPages/ViewModels/PartialPressureViewModel.cs

@@ -23,14 +23,14 @@ namespace Venus_MainPages.ViewModels
     {
         #region 私有字段
 
-        private Dictionary<int, string> m_GasFlows = new Dictionary<int, string>();
+        private ObservableCollection<string> m_GasFlows = new ObservableCollection<string>();
         //private object[] m_GasPressures = new object[10];
 
         public string ModuleName;
         private int m_GasIndex;
         ChartValues<double> m_CurrentLineSeries= new ChartValues<double>();
         ChartValues<double> m_ReferenceLineSeries = new ChartValues<double>();
-        Dictionary<int, string> CurrentGasFlows = new Dictionary<int, string>();
+        ObservableCollection<string> CurrentGasFlows = new ObservableCollection<string>();
         DispatcherTimer timer = new DispatcherTimer();
         private int m_GasTime;
         private string m_GasName;
@@ -60,7 +60,7 @@ namespace Venus_MainPages.ViewModels
             get { return m_ReferenceFlow; }
             set { SetProperty(ref m_ReferenceFlow, value); }
         }
-        public Dictionary<int, string> GasFlows
+        public ObservableCollection<string> GasFlows
         {
             get { return m_GasFlows; }
             set { SetProperty(ref m_GasFlows, value); }
@@ -152,9 +152,10 @@ namespace Venus_MainPages.ViewModels
         public PartialPressureViewModel()
         {
             GasTime = 60;
+            m_GasIndex = 1;
             for (int i = 1; i < 11; i++)
             {
-                GasFlows.Add(i, (10 * i).ToString());
+                GasFlows.Add((10 * i).ToString());
             }
             timer.Interval = TimeSpan.FromSeconds(1);
             timer.Tick += Timer_Tick;           
@@ -174,6 +175,7 @@ namespace Venus_MainPages.ViewModels
         private void OnSelectGas(object obj)
         {
             CurrentGasFlows.Clear();
+            GasFlows.Clear();
             value = $"MfcGas{obj.ToString()}";
             maxScale= Convert.ToInt32(QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.{value}.MfcN2Scale"));
             var xishu = Convert.ToDouble(QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.{value}.MfcScaleFactor"));
@@ -181,7 +183,7 @@ namespace Venus_MainPages.ViewModels
 
             for (int i = 1; i < 11; i++)
             {
-                CurrentGasFlows.Add(i, (maxScale * xishu / 10 * i).ToString());
+                CurrentGasFlows.Add((maxScale * xishu / 10 * i).ToString());
             }
             GasFlows = CurrentGasFlows;
             m_GasIndex = Convert.ToInt32(obj);

+ 111 - 2
Venus/Venus_MainPages/ViewModels/VenusDETMViewModel.cs

@@ -34,6 +34,13 @@ namespace Venus_MainPages.ViewModels
         }
         #region 私有字段
 
+        private ObservableCollection<string> _RobotSpeedLevel = new ObservableCollection<string>();
+        private ObservableCollection<string> _RobotOption = new ObservableCollection<string>();
+        private string _RobotSelectSpeedLevel = "";
+        private string _RobotSelectOption = "";
+        private string _WithWaferSpeed = "";
+        private string _NoWaferSpeed = "";
+
         private ModuleInfo m_AlignerModuleInfo;
         private ModuleInfo m_TMModuleInfo;
 
@@ -122,6 +129,52 @@ namespace Venus_MainPages.ViewModels
         #endregion
 
         #region 属性
+        public ObservableCollection<string> RobotSpeedLevel
+        {
+            get { return _RobotSpeedLevel; }
+            set { SetProperty(ref _RobotSpeedLevel, value); }
+        }
+        public ObservableCollection<string> RobotOption
+        {
+            get { return _RobotOption; }
+            set { SetProperty(ref _RobotOption, value); }
+        }
+
+        public string RobotSelectSpeedLevel
+        {
+            get { return _RobotSelectSpeedLevel; }
+            set
+            {
+                if (_RobotSelectSpeedLevel != value)
+                    SetProperty(ref _RobotSelectSpeedLevel, value);
+            }
+        }
+        public string RobotSelectOption
+        {
+            get { return _RobotSelectOption; }
+            set
+            {
+                if (_RobotSelectOption != value)
+                    SetProperty(ref _RobotSelectOption, value);
+            }
+        }
+
+        public string WithWaferSpeed
+        {
+            get { return _WithWaferSpeed; }
+            set
+            {
+                SetProperty(ref _WithWaferSpeed, value);
+            }
+        }
+        public string NoWaferSpeed
+        {
+            get { return _NoWaferSpeed; }
+            set
+            {
+                SetProperty(ref _NoWaferSpeed, value);
+            }
+        }
         public string PMAChamberLabel
         {
             get { return m_PMAChamberLabel; }
@@ -490,7 +543,12 @@ namespace Venus_MainPages.ViewModels
 
         public DelegateCommand StopCycleCommand =>
             _StopCycleCommand ?? (_StopCycleCommand = new DelegateCommand(OnStopCycle));
-
+        private DelegateCommand<object> _RQSpeedCommand;
+        public DelegateCommand<object> RQSpeedCommand => _RQSpeedCommand ?? (_RQSpeedCommand = new DelegateCommand<object>(OnRQSpeed));
+        private DelegateCommand<object> _SetSpeedCommand;
+        public DelegateCommand<object> SetSpeedCommand => _SetSpeedCommand ?? (_SetSpeedCommand = new DelegateCommand<object>(OnSetSpeed));
+        private DelegateCommand<object> _StoreSpeedCommand;
+        public DelegateCommand<object> StoreSpeedCommand => _StoreSpeedCommand ?? (_StoreSpeedCommand = new DelegateCommand<object>(OnStoreSpeed));
 
         #region 构造函数
         public VenusDETMViewModel()
@@ -553,12 +611,30 @@ namespace Venus_MainPages.ViewModels
             timer.Tick += Timer_Tick;
             timer.Start();
 
+            RobotSpeedLevel.Add("10%");
+            RobotSpeedLevel.Add("20%");
+            RobotSpeedLevel.Add("30%");
+            RobotSpeedLevel.Add("40%");
+            RobotSpeedLevel.Add("50%");
+            RobotSpeedLevel.Add("60%");
+            RobotSpeedLevel.Add("70%");
+            RobotSpeedLevel.Add("80%");
+            RobotSpeedLevel.Add("90%");
+            RobotSpeedLevel.Add("100%");
+
+            RobotOption.Add("With Wafer");
+            RobotOption.Add("Without Wafer");
+            RobotSelectOption = "With Wafer";
+            RobotSelectSpeedLevel = "10%";
+
         }
         #endregion
 
         #region 命令方法
         private void addDataKeys()
         {
+            m_RtDataKeys.Add($"TM.WithWaferSpeed");
+            m_RtDataKeys.Add($"TM.NoWaferSpeed");
             m_RtDataKeys.Add($"TM.VCEASlitDoorClosed");
             m_RtDataKeys.Add($"TM.VCEBSlitDoorClosed");
             m_RtDataKeys.Add($"TM.PMASlitDoorClosed");
@@ -751,6 +827,37 @@ namespace Venus_MainPages.ViewModels
             InvokeClient.Instance.Service.DoOperation("System.SEAbort");
 
         }
+
+
+
+        private void OnRQSpeed(object obj)
+        {
+            InvokeClient.Instance.Service.DoOperation($"TM.QuerySpeed", obj);
+        }
+
+        private void OnSetSpeed(object obj)
+        {
+            string waferspeed;
+            if (RobotSelectOption == "With Wafer")
+                waferspeed = "WITHWAFER";
+            else
+                waferspeed = "NOWAFER";
+
+            float RobotSpeed = Convert.ToInt32(RobotSelectSpeedLevel.Replace("%", ""));
+
+            InvokeClient.Instance.Service.DoOperation($"TM.SetSpeed", waferspeed, RobotSpeed);
+        }
+
+        private void OnStoreSpeed(object obj)
+        {
+            string waferspeed;
+            if (RobotSelectOption == "With Wafer")
+                waferspeed = "WITHWAFER";
+            else
+                waferspeed = "NOWAFER";
+
+            InvokeClient.Instance.Service.DoOperation($"TM.SaveSpeed", waferspeed);
+        }
         #endregion
 
         #region 私有方法
@@ -774,10 +881,12 @@ namespace Venus_MainPages.ViewModels
             }
             if (PMDIsInstalled == true)
             {
-                ModuleInfo PMDModuleInfo = ModuleManager.ModuleInfos["PMC"];
+                ModuleInfo PMDModuleInfo = ModuleManager.ModuleInfos["PMD"];
                 PMDWafer = PMDModuleInfo.WaferManager.Wafers[0];
             }
             RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
+            WithWaferSpeed = CommonFunction.GetValue<string>(RtDataValues, "TM.WithWaferSpeed");
+            NoWaferSpeed   = CommonFunction.GetValue<string>(RtDataValues, "TM.NoWaferSpeed");
             PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMASlitDoorClosed");
             PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMBSlitDoorClosed");
             PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMCSlitDoorClosed");

+ 50 - 1
Venus/Venus_MainPages/ViewModels/VenusDeOperationOverViewModel.cs

@@ -24,6 +24,8 @@ using System.Collections.ObjectModel;
 using Aitex.Core.Util;
 using static Venus_MainPages.ViewModels.VenusDETMViewModel;
 using static Venus_Themes.CustomControls.DERobot;
+using MECF.Framework.Common.Jobs;
+using Aitex.Core.RT.Log;
 
 namespace Venus_MainPages.ViewModels
 {
@@ -193,7 +195,7 @@ namespace Venus_MainPages.ViewModels
             set
             {
                 RobotMoveInfoChanged(m_robotMoveInfo, value);
-                m_robotMoveInfo = value;
+                SetProperty(ref m_robotMoveInfo, value);
             }
         }
         public RecipeResult PMARecipeResult
@@ -753,6 +755,10 @@ namespace Venus_MainPages.ViewModels
         }
         private void OnAbortAll()
         {
+            ControlJobInfo lp1Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP1.CurrentControlJob");
+            UPdateWaferAssociation(VCEAwaferAssociation, lp1Cj);
+            ControlJobInfo lp2Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP2.CurrentControlJob");
+            UPdateWaferAssociation(VCEBwaferAssociation, lp2Cj);
             InvokeClient.Instance.Service.DoOperation("System.Abort");
         }
 
@@ -931,6 +937,41 @@ namespace Venus_MainPages.ViewModels
 
         }
 
+        private void UPdateWaferAssociation(WaferAssociationInfo info, ControlJobInfo cjInfo)
+        {
+            if (info == null)
+            {
+                return;
+            }
+            if (cjInfo != null)
+            {
+                info.LotId = cjInfo.Name;
+                info.JobID = cjInfo.Name;
+                info.JobStatus = cjInfo.State.ToString();
+                if (cjInfo.SequenceNameList != null)
+                {
+                    for (int i = 0; i < cjInfo.SequenceNameList.Length; i++)
+                    {
+                        info.ModuleData.WaferManager.Wafers[24 - i].SequenceName = cjInfo.SequenceNameList[i];
+                    }
+                }
+                info.PreCleanRecipeName = cjInfo.PreJobClean;
+                info.PostCleanRecipeName = cjInfo.PostJobClean;
+            }
+            else
+            {
+                if (!string.IsNullOrEmpty(info.JobID))
+                {
+                    info.LotId = "";
+                    info.JobID = "";
+                    info.JobStatus = "";
+                    info.PreCleanRecipeName = "";
+                    info.PostCleanRecipeName = "";
+                    AssociateSequence(info, false);
+                }
+            }
+        }
+
         private void vceHome(object obj)
         {
             InvokeClient.Instance.Service.DoOperation($"{obj}.HOME");
@@ -1047,10 +1088,18 @@ namespace Venus_MainPages.ViewModels
                 if (VCEAIsInstalled == true)
                 {
                     VCEAModuleInfo = ModuleManager.ModuleInfos["LP1"];
+                    ControlJobInfo lp1Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP1.CurrentControlJob");
+                    if (lp1Cj != null)
+                        UPdateWaferAssociation(VCEAwaferAssociation, lp1Cj);
+
                 }
                 if (VCEBIsInstalled == true)
                 {
                     VCEBModuleInfo = ModuleManager.ModuleInfos["LP2"];
+                    ControlJobInfo lp2Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP2.CurrentControlJob");
+                    if (lp2Cj != null)
+                        UPdateWaferAssociation(VCEBwaferAssociation, lp2Cj);
+
                 }
                 RobotMoveInfo = (RobotMoveInfo)QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction");
 

+ 1 - 1
Venus/Venus_MainPages/Views/OverVenusDEView.xaml

@@ -1652,7 +1652,7 @@
             <TextBlock Grid.Row="2" Grid.Column="1" Width="Auto" Height="Auto" Text="{Binding BRFData.ReflectPower,StringFormat='F1'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center" Grid.ColumnSpan="2"/>
             <TextBlock Grid.Row="3" Grid.Column="2" Width="Auto" Height="Auto" Text="{Binding BiasMatchC1,StringFormat='F1'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>
             <TextBlock Grid.Row="4" Grid.Column="2" Width="Auto" Height="Auto" Text="{Binding BiasMatchC2,StringFormat='F1'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>
-            <TextBlock Grid.Row="5" Grid.Column="2" Width="Auto" Height="Auto" Text="{Binding BiasMatchVDC,StringFormat='F1'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>
+            <TextBlock Grid.Row="5" Grid.Column="2" Width="Auto" Height="Auto" Text="{Binding BiasMatchVDC,StringFormat='F2'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>
             <!--<TextBlock Grid.Row="10" Grid.Column="2" Width="Auto" Height="Auto" Text="0.0"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>-->
 
         </Grid>

+ 10 - 10
Venus/Venus_MainPages/Views/PartialPressureView.xaml

@@ -185,16 +185,16 @@
                 <TextBlock Text="Flow"     Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                 <TextBlock Text="Pressure" Grid.Row="1" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
 
-                <TextBlock Text="{Binding Path=GasFlows[1], Mode=TwoWay}" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[2], Mode=TwoWay}" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[3], Mode=TwoWay}" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[4], Mode=TwoWay}" Grid.Row="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[5], Mode=TwoWay}" Grid.Row="6" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[6], Mode=TwoWay}" Grid.Row="7" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[7], Mode=TwoWay}"  Grid.Row="8" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[8], Mode=TwoWay}"  Grid.Row="9" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[9], Mode=TwoWay}"  Grid.Row="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-                <TextBlock Text="{Binding Path=GasFlows[10], Mode=TwoWay}" Grid.Row="11" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[0], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[1], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[2], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[3], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[4], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="6" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[5], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="7" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[6], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Grid.Row="8" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[7], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Grid.Row="9" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[8], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Grid.Row="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                <TextBlock Text="{Binding Path=GasFlows[9], Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="11" HorizontalAlignment="Center" VerticalAlignment="Center"/>
 
                 <TextBlock Text="{Binding CurrentLineSeries[0]}" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                 <TextBlock Text="{Binding CurrentLineSeries[1]}" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>

+ 53 - 3
Venus/Venus_MainPages/Views/VenusDETMView.xaml

@@ -24,6 +24,9 @@
             <Grid.RowDefinitions>
                 <RowDefinition Height="30"/>
                 <RowDefinition Height="Auto"/>
+                <RowDefinition Height="30"/>
+                <RowDefinition Height="30"/>
+                <RowDefinition Height="Auto"/>
             </Grid.RowDefinitions>
             <Border  BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_FirstTitle}" Padding="5,1">
                 <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
@@ -37,7 +40,7 @@
                             </TransformGroup>
                         </Path.RenderTransform>
                     </Path>
-                    <TextBlock  Margin="5,0,0,0" Text="DETM Robot Operation" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_White}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                    <TextBlock  Margin="5,0,0,0" Text="TM Robot Operation" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_White}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                 </StackPanel>
             </Border>
             <Grid unity:GridOptions.ShowBorder="True" unity:GridOptions.LineBrush="Black" Grid.Row="1" Background="{DynamicResource Table_BG_Content}">
@@ -117,8 +120,55 @@
                 <Button     Grid.Row="5" Grid.Column="3"  Margin="5" Height="25"  Content="Goto" IsEnabled="{Binding Path=IsManualMode}" Command="{Binding GotoCommand}"/>
                 <Button Grid.Row="6" Grid.Column="3"  Margin="5" Height="25" Content="Robot Home" Command="{Binding RobotHomeCommand}" />
             </Grid>
+            <Border  BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_FirstTitle}" Padding="5,1" Grid.Row="3">
+                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" >
+                    <Path Data="M0,0 L5,0 5,5 z" Fill="White" HorizontalAlignment="Left" Grid.Row="1" RenderTransformOrigin="0.5,0.5" Stretch="Fill" Width="5" Height="5">
+                        <Path.RenderTransform>
+                            <TransformGroup>
+                                <ScaleTransform/>
+                                <SkewTransform/>
+                                <RotateTransform Angle="45"/>
+                                <TranslateTransform/>
+                            </TransformGroup>
+                        </Path.RenderTransform>
+                    </Path>
+                    <TextBlock  Margin="5,0,0,0" Text="TM Robot Speed" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_White}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                </StackPanel>
+            </Border>
+
+            <Grid unity:GridOptions.ShowBorder="True" unity:GridOptions.LineBrush="Black" Grid.Row="4" Background="{DynamicResource Table_BG_Content}">
+                <!--行数列数设置-->
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="25"/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                </Grid.RowDefinitions>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                </Grid.ColumnDefinitions>
+                <TextBlock Text="P:Wafer" Grid.Column="0"      HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14"/>
+                <TextBlock Text="P:Speed" Grid.Column="1"      HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14"/>
+                <TextBlock Text=""    Grid.Column="3"      HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14"/>
+                <TextBlock Text=""   Grid.Column="4"      HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14"/>
+                <!--第1行-->
+                <ComboBox Grid.Row="1" Grid.Column="0"   Margin="5"  SelectedItem="{Binding RobotSelectOption}"     ItemsSource="{Binding RobotOption}"/>
+                <ComboBox Grid.Row="1" Grid.Column="1"   Margin="5"  SelectedItem="{Binding RobotSelectSpeedLevel}" ItemsSource="{Binding RobotSpeedLevel}"/>
+                <Button   Grid.Row="1" Grid.Column="2"   Margin="5"  Content="Save" Height="25" Command="{Binding SetSpeedCommand}"/>
+                <Button   Grid.Row="1" Grid.Column="3"   Margin="5"  Content="Store" Height="25" Command="{Binding StoreSpeedCommand}"/>
+
+                <TextBlock Grid.Row="2" Grid.Column="0"  Margin="10">WithWaferSpeed:</TextBlock>
+                <TextBlock Grid.Row="2" Grid.Column="1"  Margin="10" Text="{Binding WithWaferSpeed}"></TextBlock>
+                <Button    Grid.Row="2" Grid.Column="3"  Margin="5" Content="Query WaferON"  Command="{Binding RQSpeedCommand}" CommandParameter="WITHWAFER"/>
+                <TextBlock Grid.Row="3" Grid.Column="0"  Margin="10">NoWaferSpeed:</TextBlock>
+                <TextBlock Grid.Row="3" Grid.Column="1"  Margin="10" Text="{Binding NoWaferSpeed}"></TextBlock>
+                <Button    Grid.Row="3" Grid.Column="3"  Margin="5" Content="Query WaferOFF" Command="{Binding RQSpeedCommand}" CommandParameter="NOWAFER"/>
+            </Grid>
         </Grid>
-        <StackPanel Canvas.Top="360" Canvas.Right="40" Width="550">
+        <!--<StackPanel Canvas.Top="360" Canvas.Right="40" Width="550" >
             <Grid>
                 <Grid.RowDefinitions>
                     <RowDefinition Height="30"/>
@@ -217,7 +267,7 @@
                     </Grid>
                 </Border>
             </Grid>
-        </StackPanel>
+        </StackPanel>-->
 
         <!--Vce PM Aligner-->
         <Canvas Canvas.Top="-250" Canvas.Left="-100">

File diff suppressed because it is too large
+ 7 - 7
Venus/Venus_MainPages/Views/VenusDeOperationOverView.xaml


+ 7 - 0
Venus/Venus_RT/Config/TM/DeviceModelVenusDE_MF.xml

@@ -67,6 +67,13 @@
                 doON="DO_PMD_SlitDoor_Open" doOFF="DO_PMD_SlitDoor_Close" diON="DI_PMD_SlitDoor_Open_POS" diOFF="DI_PMD_SlitDoor_Close_POS" />
 	</IoCylinders>
 
+
+	<IoSignalTowers assembly="Venus_RT" classType="Venus_RT.Devices.IoSignalTower">
+		<IoSignalTower  id="SignalTower" display="SignalTower" schematicId="SignalTower" unit=""
+                   doRed="DO_RED" doYellow="DO_ORANGE" doGreen="DO_GREEN" doBlue="DO_BLUE" doWhite="" doBuzzer1="DO_BUZZER1"
+                   doBuzzer2="DO_BUZZER2"/>
+	</IoSignalTowers>
+
 	<IoPressureMeters assembly="Venus_RT" classType="Venus_RT.Devices.IODevices.IoPressureMeter">
 		<IoPressureMeter id="TMPressure" display="TM Pressure" schematicId="" unit="mTorr"
 						    aiValue="AI_TM_Pressure" diGaugeFail="" scPrecision="" scOffset=""/>

+ 18 - 0
Venus/Venus_RT/Config/VenusSignalTower.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<STEvents>
+	<STEvent name ="TM.IsAlarm"         Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+	<STEvent name ="VCEA.IsAlarm"       Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+	<STEvent name ="VCEB.IsAlarm"       Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+	<STEvent name ="System.IsAlarm"     Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+
+	<STEvent name ="System.IsBusy"                   Red="Off"      Yellow="Off"       Green="On"  Blue="Off"  Buzzer1="Off" Buzzer2="Off"/>
+	<STEvent name ="System.IsIdle"                   Red="Off"      Yellow="On"        Green="Off" Blue="Off"  Buzzer1="Off" Buzzer2="Off"/>
+	<STEvent name ="System.IsWaitUnload"             Red="Off"      Yellow="Blinking"  Green="Off" Blue="Off"  Buzzer1="On"  Buzzer2="Off"/>
+	<STEvent name ="System.IsAutoRunning"            Red="Off"      Yellow="Off"       Green="On"  Blue="Off"  Buzzer1="Off" Buzzer2="Off"/>
+
+	<STEvent name ="PMA.IsAlarm"        Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+	<STEvent name ="PMB.IsAlarm"        Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+	<STEvent name ="PMC.IsAlarm"        Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+	<STEvent name ="PMD.IsAlarm"        Red="On"       Yellow="Off"  Green="Off" Blue="Off"  Buzzer1="On" Buzzer2="Off"/>
+
+</STEvents>

+ 4 - 0
Venus/Venus_RT/Devices/AdTecRF.cs

@@ -721,6 +721,7 @@ namespace Venus_RT.Devices
 
         //[Subscription("VPP")]
         public ushort VPP { get; set; }
+        public float VDC { get; set; }
         public new AITMatchData DeviceData
         {
             get
@@ -798,6 +799,7 @@ namespace Venus_RT.Devices
 
             DATA.Subscribe($"{Module}.{Name}.C1", () => TunePosition1);
             DATA.Subscribe($"{Module}.{Name}.C2", () => TunePosition2);
+            DATA.Subscribe($"{Module}.{Name}.VDC", () => VDC);
             DATA.Subscribe($"{Module}.{Name}.WorkMode", () => WorkMode.ToString());
 
 
@@ -934,6 +936,8 @@ namespace Venus_RT.Devices
 
                     string sVpp = sItem1.Substring(42 + S3_HEAD_LENGTH, 3);
                     this.VPP = Convert.ToUInt16(sVpp, 16);
+                    string sVDC = sItem1.Substring(39 + S3_HEAD_LENGTH, 3);
+                    this.VDC = Convert.ToUInt16(sVDC, 16);
                 }
                 else if (sItem1.Contains(AdTecMatchMessage.READ_POS))
                 {

+ 2 - 2
Venus/Venus_RT/Devices/DeviceManager.cs

@@ -168,8 +168,8 @@ namespace Venus_RT.Instances
                 }
             }
 
-
-            AddCustomModuleDevice(new KeplerSignalTower("System", "SignalTower"));
+            if(RtInstance.ConfigType != ConfigType.VenusDE && RtInstance.ConfigType != ConfigType.VenusSE)
+                AddCustomModuleDevice(new KeplerSignalTower("System", "SignalTower"));
 
 
             OP.Subscribe("DeviceOperation", this.Invoke);

+ 2 - 0
Venus/Venus_RT/Devices/IODevices/IoMagnet.cs

@@ -142,6 +142,8 @@ namespace Venus_RT.Devices.IODevices
             Setpoint(_ao1Boutput, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnet_1B_output_full_scale").Value));
             Setpoint(_ao2Aoutput, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnet_2A_output_full_scale").Value));
             Setpoint(_ao2Boutput, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnet_2B_output_full_scale").Value));
+            if(_aoMagnetCycle.Value!= Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnetcycleperiod").Value))
+                _SetRealFloat(_aoMagnetCycle, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnetcycleperiod").Value));
             //Setpoint(_aoMagnetCycle, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnetcycleperiod").Value));
             //Setpoint(_aoMagnetWaveForm, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnetwareform").Value));
         }

+ 149 - 45
Venus/Venus_RT/Devices/IODevices/IoSignalTower.cs

@@ -4,6 +4,7 @@ using System.Diagnostics;
 using System.IO;
 using System.Xml;
 using System.Xml.Serialization;
+using Aitex.Common.Util;
 using Aitex.Core.Common.DeviceData;
 using Aitex.Core.RT.DataCenter;
 using Aitex.Core.RT.Device;
@@ -86,6 +87,8 @@ namespace Venus_RT.Devices
         public bool HostControl { get; set; }
         private bool _buzzerSwitchOff = false;
         private bool _buzzerAndRed = false;
+        private bool _buzzer1SwitchOff = false;
+        private bool _buzzer2SwitchOff = false;
 
         private RfPowerBase _Generator;
         public DeviceTimer _timerBuzzerBlinking = new DeviceTimer();
@@ -107,6 +110,7 @@ namespace Venus_RT.Devices
                     IsBlueLightOn = _blue != null && _blue.Value,
 
                     IsBuzzerOn = (_buzzer1 != null && _buzzer1.Value) || (_buzzer2 != null && _buzzer2.Value),
+                    IsBuzzerOff = !((_buzzer1 != null && _buzzer1.Value) || (_buzzer2 != null && _buzzer2.Value)),
                 };
 
                 return data;
@@ -119,6 +123,7 @@ namespace Venus_RT.Devices
             new Dictionary<string, Dictionary<IoSignalLight, TowerLightStatus>>();
 
         private Dictionary<IoSignalLight, TowerLightStatus> _cmdSetPoint = new Dictionary<IoSignalLight, TowerLightStatus>();
+        private Dictionary<IoSignalLight, TowerLightStatus> dicState = new Dictionary<IoSignalLight, TowerLightStatus>();
 
         public IoSignalTower(string module, XmlElement node, string ioModule = "")
         {
@@ -172,7 +177,7 @@ namespace Venus_RT.Devices
 
         public bool Initialize()
         {
-            OP.Subscribe($"{Module}.{Name}.{AITSignalTowerOperation.SwitchOffBuzzer}", SwitchOffBuzzer);
+            OP.Subscribe($"System.{AITSignalTowerOperation.SwitchOffBuzzer}", SwitchOffBuzzer);
 
             OP.Subscribe($"{Module}.{Name}.{AITSignalTowerOperation.SwitchOnBuzzerAndRed}", SwitchOnBuzzerAndRed);
 
@@ -183,6 +188,9 @@ namespace Venus_RT.Devices
             DATA.Subscribe($"{Module}.{Name}.IsGreenLightOn", () => _green != null && _green.Value);
             DATA.Subscribe($"{Module}.{Name}.IsBlueLightOn", () => _blue != null && _blue.Value);
             DATA.Subscribe($"{Module}.{Name}.IsBuzzerOn", () => (_buzzer1 != null && _buzzer1.Value) || (_buzzer2 != null && _buzzer2.Value));
+
+            CustomSignalTower();
+
             return true;
         }
 
@@ -239,6 +247,17 @@ namespace Venus_RT.Devices
 
         }
 
+
+        public bool CustomSignalTower()
+        {
+            string pathFile = PathManager.GetCfgDir() + "_VenusSignalTower.xml";
+            if (!File.Exists(pathFile))
+            {
+                pathFile = PathManager.GetCfgDir() + "VenusSignalTower.xml";
+            }
+            return CustomSignalTower(pathFile);
+        }
+
         public bool CustomSignalTower(string configPathFile)
         {
             try
@@ -266,6 +285,8 @@ namespace Venus_RT.Devices
 
                         if (_buzzer1 != null)
                             _config[e.Name][_buzzer1] = ParseLight(e.Buzzer1);
+                        if (_buzzer2 != null)
+                            _config[e.Name][_buzzer2] = ParseLight(e.Buzzer2);
                     }
                 }
             }
@@ -290,54 +311,77 @@ namespace Venus_RT.Devices
 
         public void Monitor()
         {
-            if (DATA.Poll(Module, StateData.PMState.ToString()) != null)
-                state = (PMState)DATA.Poll(Module, StateData.PMState.ToString());
-            List<IoValve> valves = DEVICE.GetDevice<IoValve>();
-            //if (DEVICE.GetDevice<IoRf>() != null)
-            //{
-            //    _Generator = DEVICE.GetDevice<IoRf>($"{Module}.{VenusDevice.Rf}");
-            //}
-            //else
-            if (DEVICE.GetDevice<AdTecGenerator>() != null)
-            {
-                _Generator = DEVICE.GetDevice<AdTecGenerator>($"{Module}.{VenusDevice.Rf}");
-            }
-            else
-            {
-                _Generator = null;
-            }
-            //pumping valve开,vent purge valve开,Gas valve开,RF开,只要有其中之一处于开的状态,就是绿灯
-            if (state == PMState.Error || _buzzerAndRed)
-            {
-                SetLight(LightType.GREEN, LightState.Off);
-                SetLight(LightType.RED, LightState.On);
-                SetLight(LightType.YELLOW, LightState.Off);
-                SetLight(LightType.BUZZER1, _buzzerSwitchOff ? LightState.Off : LightState.On);
-            }
-            else if ((_Generator != null && _Generator.IsPowerOn) || valves.Exists(v => v.Status))
-            {
-                SetLight(LightType.GREEN, LightState.On);
-                SetLight(LightType.RED, LightState.Off);
-                SetLight(LightType.YELLOW, LightState.Off);
-                SetLight(LightType.BUZZER1, LightState.Off);
-            }
-            else if (state == PMState.PreProcess || state == PMState.Processing || state == PMState.PostProcess)
+            if (_red != null)
+                dicState[_red] = TowerLightStatus.Off;
+            if (_yellow != null)
+                dicState[_yellow] = TowerLightStatus.Off;
+            if (_green != null)
+                dicState[_green] = TowerLightStatus.Off;
+            if (_blue != null)
+                dicState[_blue] = TowerLightStatus.Off;
+            if (_white != null)
+                dicState[_white] = TowerLightStatus.Off;
+            if (_buzzer1 != null)
+                dicState[_buzzer1] = TowerLightStatus.Off;
+            if (_buzzer2 != null)
+                dicState[_buzzer2] = TowerLightStatus.Off;
+
+            foreach (var trigCondition in _config)
             {
-                SetLight(LightType.GREEN, LightState.On);
-                SetLight(LightType.RED, LightState.Off);
-                SetLight(LightType.YELLOW, LightState.Off);
-                SetLight(LightType.BUZZER1, LightState.Off);
+                var conditionValue = DATA.Poll(trigCondition.Key);
+                if (conditionValue == null)
+                    continue;
+
+                bool isTrig = (bool)conditionValue;
+                if (isTrig)
+                {
+                    if (_red != null)
+                    {
+                        dicState[_red] = MergeCondition(dicState[_red], trigCondition.Value[_red]);
+                    }
+
+                    if (_yellow != null)
+                    {
+                        dicState[_yellow] = MergeCondition(dicState[_yellow], trigCondition.Value[_yellow]);
+                    }
+
+                    if (_green != null)
+                    {
+                        dicState[_green] = MergeCondition(dicState[_green], trigCondition.Value[_green]);
+                    }
+
+                    if (_white != null)
+                    {
+                        dicState[_white] = MergeCondition(dicState[_white], trigCondition.Value[_white]);
+                    }
+
+                    if (_blue != null)
+                    {
+                        dicState[_blue] = MergeCondition(dicState[_blue], trigCondition.Value[_blue]);
+                    }
+
+                    if (_buzzer1 != null)
+                    {
+                        dicState[_buzzer1] = _buzzer1SwitchOff ? TowerLightStatus.Off : MergeCondition(dicState[_buzzer1], trigCondition.Value[_buzzer1]);
+                    }
+                    if (_buzzer2 != null)
+                    {
+                        dicState[_buzzer2] = _buzzer2SwitchOff ? TowerLightStatus.Off : MergeCondition(dicState[_buzzer2], trigCondition.Value[_buzzer2]);
+                    }
+                }
             }
-            else
+
+            if (_config.Count > 0 && !HostControl)
             {
-                SetLight(LightType.GREEN, LightState.Off);
-                SetLight(LightType.RED, LightState.Off);
-                SetLight(LightType.YELLOW, LightState.On);
-                SetLight(LightType.BUZZER1, LightState.Off);
+                SetLight(_red, dicState);
+                SetLight(_blue, dicState);
+                SetLight(_yellow, dicState);
+                SetLight(_green, dicState);
+                SetLight(_white, dicState);
+                SetLight(_buzzer1, dicState);
+                SetLight(_buzzer2, dicState);
             }
 
-            if (!_timerBuzzerBlinking.IsIdle() && !_timerBuzzerBlinking.IsTimeout())
-                SetLight(LightType.BUZZER1, LightState.Blink);
 
             MonitorLight(_red);
             MonitorLight(_blue);
@@ -346,6 +390,62 @@ namespace Venus_RT.Devices
             MonitorLight(_white);
             MonitorLight(_buzzer1);
             MonitorLight(_buzzer2);
+            //if (DATA.Poll(Module, StateData.PMState.ToString()) != null)
+            //    state = (PMState)DATA.Poll(Module, StateData.PMState.ToString());
+            //List<IoValve> valves = DEVICE.GetDevice<IoValve>();
+            //if (DEVICE.GetDevice<IoRf>() != null)
+            //{
+            //    _Generator = DEVICE.GetDevice<IoRf>($"{Module}.{VenusDevice.Rf}");
+            //}
+            //else
+            //if (DEVICE.GetDevice<AdTecGenerator>() != null)
+            //{
+            //    _Generator = DEVICE.GetDevice<AdTecGenerator>($"{Module}.{VenusDevice.Rf}");
+            //}
+            //else
+            //{
+            //    _Generator = null;
+            //}
+            ////pumping valve开,vent purge valve开,Gas valve开,RF开,只要有其中之一处于开的状态,就是绿灯
+            //if (state == PMState.Error || _buzzerAndRed)
+            //{
+            //    SetLight(LightType.GREEN, LightState.Off);
+            //    SetLight(LightType.RED, LightState.On);
+            //    SetLight(LightType.YELLOW, LightState.Off);
+            //    SetLight(LightType.BUZZER1, _buzzerSwitchOff ? LightState.Off : LightState.On);
+            //}
+            //else if ((_Generator != null && _Generator.IsPowerOn) || valves.Exists(v => v.Status))
+            //{
+            //    SetLight(LightType.GREEN, LightState.On);
+            //    SetLight(LightType.RED, LightState.Off);
+            //    SetLight(LightType.YELLOW, LightState.Off);
+            //    SetLight(LightType.BUZZER1, LightState.Off);
+            //}
+            //else if (state == PMState.PreProcess || state == PMState.Processing || state == PMState.PostProcess)
+            //{
+            //    SetLight(LightType.GREEN, LightState.On);
+            //    SetLight(LightType.RED, LightState.Off);
+            //    SetLight(LightType.YELLOW, LightState.Off);
+            //    SetLight(LightType.BUZZER1, LightState.Off);
+            //}
+            //else
+            //{
+            //    SetLight(LightType.GREEN, LightState.Off);
+            //    SetLight(LightType.RED, LightState.Off);
+            //    SetLight(LightType.YELLOW, LightState.On);
+            //    SetLight(LightType.BUZZER1, LightState.Off);
+            //}
+            //
+            //if (!_timerBuzzerBlinking.IsIdle() && !_timerBuzzerBlinking.IsTimeout())
+            //    SetLight(LightType.BUZZER1, LightState.Blink);
+            //
+            //MonitorLight(_red);
+            //MonitorLight(_blue);
+            //MonitorLight(_yellow);
+            //MonitorLight(_green);
+            //MonitorLight(_white);
+            //MonitorLight(_buzzer1);
+            //MonitorLight(_buzzer2);
         }
 
         public void Reset()
@@ -360,13 +460,17 @@ namespace Venus_RT.Devices
             ResetLight(_buzzer2);
             _buzzerAndRed = false;
             _buzzerSwitchOff = false;
+            _buzzer1SwitchOff = false;
+            _buzzer2SwitchOff = false;
         }
 
         public bool SwitchOffBuzzer(string cmd, object[] objs)
         {
-            if (cmd == $"{ Module}.{ Name}.{ AITSignalTowerOperation.SwitchOffBuzzer}" && _buzzer1 != null && _buzzer1.StateSetPoint != TowerLightStatus.Off)
+            if (cmd == $"System.{ AITSignalTowerOperation.SwitchOffBuzzer}" && _buzzer1 != null && _buzzer1.StateSetPoint != TowerLightStatus.Off)
             {
                 _buzzerSwitchOff = true;
+                _buzzer1SwitchOff = true;
+                _buzzer2SwitchOff = true;
             }
             return true;
         }

+ 4 - 3
Venus/Venus_RT/Devices/PendulumValve.cs

@@ -312,6 +312,7 @@ namespace Venus_RT.Devices
                             if (Double.TryParse(data[1], out pressure))
                             {
                                 Pressure = Convert.ToSingle(pressure) * _pressure_ful_range / 1000000;
+                                //LOG.Write(eEvent.EV_DEVICE_INFO, Module, $" Pressure Raw:{Convert.ToSingle(pressure)} Trans:{Pressure}");
                                 //if ((m_JetChamber == JetChamber.Kepler2200A || m_JetChamber == JetChamber.Kepler2200B))
                                 //{
                                 //    //Pressure = Convert.ToSingle(ConvertPressureUnit.ConvertmTorrToPa(pressure * _pressure_ful_range / 1000000));
@@ -517,10 +518,10 @@ namespace Venus_RT.Devices
 
             if (_CheckStatus(true))
             {
-                TurnValve(true);
+                //TurnValve(true);
                 m_PositionSetPoint = postion;
                 float setPosition = (float)Math.Round(postion, 1);
-
+                //LOG.Write(eEvent.ERR_PENDULUM_VALVE,Module,$"Set Position : {(int)(setPosition * _position_unit)}");
                 return SendCommand(Operation.SetPosition, (int)(setPosition * _position_unit));
             }
 
@@ -531,7 +532,7 @@ namespace Venus_RT.Devices
         {
             if (_CheckStatus(true))
             {
-                TurnValve(true);
+                //TurnValve(true);
                 m_PressureSetPoint = pressure;
                 return SendCommand(Operation.SetPressure, Convert.ToInt32(pressure * 1000000 / _pressure_ful_range));
 

+ 7 - 7
Venus/Venus_RT/Devices/SMCShareChiller.cs

@@ -126,14 +126,14 @@ namespace Venus_RT.Devices
         {
             get
             {
-                if (jetChamber == JetChamber.VenusSE)
-                {
-                    return GetAiValue($"{Module}.AI_Coolant_Outlet_Temp");
-
-                }
-                else
+                switch (jetChamber)
                 {
-                    return 0;
+                    case JetChamber.VenusSE:
+                        return GetAiValue($"{Module}.AI_Coolant_Outlet_Temp");
+                    case JetChamber.VenusDE:
+                        return GetAiValue($"{Module}.AI_ESC_Coolant_Outlet_Temp");
+                    default:
+                        return 0;
                 }
             }
         }

+ 4 - 0
Venus/Venus_RT/Devices/TM/HongHuDETM.cs

@@ -87,6 +87,8 @@ namespace Venus_RT.Devices.TM
         private readonly PumpBase _TMPump;
         private readonly PumpBase _VCEPump;
 
+        private readonly IoSignalTower _SignalTower;
+
         //控压
         private readonly IoHongHuControl _PressureControl;
 
@@ -407,8 +409,10 @@ namespace Venus_RT.Devices.TM
             }
 
 
+            _SignalTower = DEVICE.GetDevice<IoSignalTower>($"{Module}.SignalTower");
             _PressureControl = DEVICE.GetDevice<IoHongHuControl>($"{Module}.PressureControl");
 
+            DATA.Subscribe("System.SignalTower.DeviceData", () => _SignalTower.DeviceData);
             DATA.Subscribe($"{Module}.VCEASlitDoorClosed", () => VCEASlitDoorClosed);
             DATA.Subscribe($"{Module}.VCEBSlitDoorClosed", () => VCEBSlitDoorClosed);
             DATA.Subscribe($"{Module}.PMASlitDoorClosed", () => PMASlitDoorClosed);

+ 86 - 6
Venus/Venus_RT/Devices/TM/HongHuVR.cs

@@ -42,6 +42,9 @@ namespace Venus_RT.Devices.VCE
         SetLoad,
         ReQueryLoadA,
         ReQueryLoadB,
+        SetSpeed,
+        SaveSpeed,
+        RQSpeed
     }
     public class HongHuVR : ITransferRobot
     {
@@ -59,8 +62,13 @@ namespace Venus_RT.Devices.VCE
         private readonly Regex _rex_check_load = new Regex(@"CHECK LOAD\s*");
         private readonly Regex _rex_rq_load_A = new Regex(@"LOAD\sA\s.*");
         private readonly Regex _rex_rq_load_B = new Regex(@"LOAD\sB\s.*");
-        private readonly Regex _rex_error_code = new Regex(@"_ERR\s+(\d+)\s*");
+        private readonly Regex _rex_error_code = new Regex(@"_ERR\s+(\d+)\s*"); 
+        private readonly Regex _rex_rq_speed = new Regex(@"MOTIONPARA.*");
         private RobotMoveInfo _robotMoveInfo = new RobotMoveInfo();
+        private string _WithWaferSpeed = "";
+        private string _NoWaferSpeed = "";
+        public string WithWaferSpeed => _WithWaferSpeed;
+        public string NoWaferSpeed => _NoWaferSpeed;
         public RobotMoveInfo TMRobotMoveInfo { get { return _robotMoveInfo; } }
 
         public double Offset_X => 0;
@@ -149,7 +157,7 @@ namespace Venus_RT.Devices.VCE
                     _robotMoveInfo.Action = data.Action;
                     _robotMoveInfo.ArmTarget = data.Hand == Hand.Blade1 ? RobotArm.ArmA : (data.Hand == Hand.Both ? RobotArm.Both : RobotArm.ArmB);
                     _robotMoveInfo.BladeTarget = $"{_robotMoveInfo.ArmTarget}.{data.Target}";
-                    System.Threading.Thread.Sleep(300);
+                    System.Threading.Thread.Sleep(600);
                 }
             });
         }
@@ -305,6 +313,40 @@ namespace Venus_RT.Devices.VCE
             _status = RState.Running;
             return _SendCommand($"RQ LOAD ARM B");
         }
+
+        public bool SetSpeed(string withwafer, float speed)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.SetSpeed;
+            _status = RState.Running;
+            int setspeed = (int)Math.Floor(speed * 10);
+            return _SendCommand($"SET MOTIONPARA {withwafer} SPDPCT ALL {setspeed.ToString().PadLeft(4, '0')}");
+        }
+
+        public bool SaveSpeed(string withwafer)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.SaveSpeed;
+            _status = RState.Running;
+            return _SendCommand($"STORE MOTIONPARA {withwafer} SPDPCT ALL");
+        }
+
+        public bool QuerySpeed(string withwafer)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.RQSpeed;
+            _status = RState.Running;
+            //MOTIONPARA {} SPDPCT all x t z
+            return _SendCommand($"RQ MOTIONPARA {withwafer} SPDPCT ALL");
+        }
+
+
         private bool _SendCommand(string cmd)
         {
             LOG.WriteSingeLine(eEvent.INFO_TM_ROBOT, ModuleName.TMRobot, $"Send Command to TMRobot: {cmd},Connect:{_socket.IsConnected}");
@@ -356,6 +398,8 @@ namespace Venus_RT.Devices.VCE
                     case VRStep.Halt:
                     case VRStep.Move:
                     case VRStep.Xfer:
+                    case VRStep.SetSpeed:
+                    case VRStep.SaveSpeed:
                     case VRStep.Pick:
                     case VRStep.PickExtend:
                     case VRStep.PickRetract:
@@ -386,7 +430,7 @@ namespace Venus_RT.Devices.VCE
                                 _currentStep = VRStep.Idle;
                                 _status = RState.End;
                                 _IsHomed = true;
-                                SetRobotMovingInfo(RobotAction.Homing, Hand.Both, ModuleName.TM);
+                                SetRobotMovingInfo(RobotAction.Homing, Hand.Both, ModuleName.TMRobot);
                             }
                             else
                                 ReportWrongMsg(RevMsg);
@@ -484,6 +528,41 @@ namespace Venus_RT.Devices.VCE
                             }
                         }
                         break;
+                    case VRStep.RQSpeed:
+                        //MOTIONPARA {} SPDPCT all r t z
+                        if (_rex_rq_speed.IsMatch(RevMsg))
+                        {
+
+                            string[] _msgs = RevMsg.Split(' ');
+                            if (_msgs[1] == "WITHWAFER")
+                            {
+                                _WithWaferSpeed = _msgs[4];
+                            }
+
+                            if (_msgs[1] == "NOWAFER")
+                            {
+                                _NoWaferSpeed = _msgs[4];
+                            }
+
+                            if (_msgs[1] == "MIDDLE")
+                            {
+                                _WithWaferSpeed = _msgs[4];
+                            }
+
+                        }
+                        else
+                        {
+                            if (RevMsg.Trim() == "_RDY" || (RevMsg.Contains("_RDY") && !RevMsg.Contains("_ERR")))
+                            {
+                                _currentStep = VRStep.Idle;
+                                _status = RState.End;
+                            }
+                            else
+                            {
+                                ReportWrongMsg(RevMsg);
+                            }
+                        }
+                        break;
                     default:
                         if (!RevMsg.Contains("_EVENT"))
                             ReportWrongMsg(RevMsg);
@@ -535,9 +614,10 @@ namespace Venus_RT.Devices.VCE
 
         public void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target)
         {
-            _robotMoveInfo.Action = action;
-            _robotMoveInfo.ArmTarget = hand == Hand.Blade1 ? RobotArm.ArmA : (hand == Hand.Both ? RobotArm.Both : RobotArm.ArmB);
-            _robotMoveInfo.BladeTarget = $"{_robotMoveInfo.ArmTarget}.{target}";
+            //_robotMoveInfo.Action = action;
+            //_robotMoveInfo.ArmTarget = hand == Hand.Blade1 ? RobotArm.ArmA : (hand == Hand.Both ? RobotArm.Both : RobotArm.ArmB);
+            //_robotMoveInfo.BladeTarget = $"{_robotMoveInfo.ArmTarget}.{target}";
+            blockingCollection.Add(new RobotAnimationData(action, hand, target));
         }
 
     }

+ 5 - 0
Venus/Venus_RT/Devices/TM/ITransferRobot.cs

@@ -15,6 +15,8 @@ namespace Venus_RT.Devices
         double Offset_Y { get; }
 
         double Offset_D { get; }
+        string WithWaferSpeed { get; }
+        string NoWaferSpeed { get; }
         bool Home();
         bool Halt();
         bool CheckLoad(Hand hand = Hand.Blade1);
@@ -30,6 +32,9 @@ namespace Venus_RT.Devices
         bool Pick(ModuleName station, int slot, Hand hand);
         bool PickWithOffset(ModuleName station, int slot, Hand hand,int Roffset, int Toffset);
         bool Place(ModuleName station, int slot, Hand hand);
+        bool SetSpeed(string withwafer, float speed);
+        bool SaveSpeed(string withwafer);
+        bool QuerySpeed(string withwafer);
         void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target);
     }
 }

+ 17 - 0
Venus/Venus_RT/Devices/TM/SIASUNRobot.cs

@@ -49,6 +49,8 @@ namespace Venus_RT.Devices
         public double Offset_D => Math.Round(Math.Sqrt(Math.Pow(offset_x, 2) + Math.Pow(offset_y, 2)), 2);//欧式距离 保留后两位
 
         public RobotMoveInfo TMRobotMoveInfo { get { return _robotMoveInfo; } }
+        public string WithWaferSpeed => "";
+        public string NoWaferSpeed => "";
 
         private readonly AsyncSocket _socket;
         private OPStep _currentOP = OPStep.Idle;
@@ -772,6 +774,21 @@ namespace Venus_RT.Devices
         {
             return true;
         }
+
+        public bool SetSpeed(string withwafer, float speed)
+        {
+            return true;
+        }
+
+        public bool SaveSpeed(string withwafer)
+        {
+            return true;
+        }
+
+        public bool QuerySpeed(string withwafer)
+        {
+            return true;
+        }
     }
     
 }

+ 15 - 2
Venus/Venus_RT/Devices/TruPlasmaRF.cs

@@ -389,6 +389,7 @@ namespace Venus_RT.Devices
 
         //[Subscription("VPP")]
         public ushort VPP { get; set; }
+        public float VDC { get; set; }
         public new AITMatchData DeviceData
         {
             get
@@ -437,6 +438,7 @@ namespace Venus_RT.Devices
 
             DATA.Subscribe($"{Module}.{Name}.C1", () => TunePosition1);
             DATA.Subscribe($"{Module}.{Name}.C2", () => TunePosition2);
+            DATA.Subscribe($"{Module}.{Name}.VDC", () => VDC);
             DATA.Subscribe($"{Module}.{Name}.WorkMode", () => WorkMode.ToString());
 
 
@@ -484,11 +486,17 @@ namespace Venus_RT.Devices
             byte[] readc1 = new byte[] { 0x0C, 0xF3, 0x00, 0x02, 0x00, 0x01, 0x61, 0x42, 0x79, 0x19, 0x01, 0x38 };
             _serial.Write(readc1.ToArray());
         }
+        public void readVDC()
+        {
+            byte[] readvdc = new byte[] { 0x0C, 0xF3, 0x00, 0x02, 0x00, 0x00, 0x61, 0x42, 0x79, 0x1E, 0x01, 0x3C };
+            _serial.Write(readvdc.ToArray());
+        }
         public override void Monitor()
         {
             //ReadPosition(50,50);//0x10 (present mode)CMD 可实现任意模式下只读不设值,0x08(auto then manual)在auto模式下可实现相同功能
             readc1();
             readc2();
+            //readVDC();
         }
 
         public override void Terminate()
@@ -512,6 +520,7 @@ namespace Venus_RT.Devices
         }
         public override void SetMatchPosition(float c1, float c2, out string reason)
         {
+            //preset(c1, c2);
             executeMatchPostion(c1, c2);
 
             reason = "";
@@ -572,10 +581,14 @@ namespace Venus_RT.Devices
                             if (ReceiveBytes18[10] == 0x79 && ReceiveBytes18[11] == 0x18)
                             {
                                 TunePosition1 = BitConverter.ToSingle(new byte[] { ReceiveBytes18[12], ReceiveBytes18[13], ReceiveBytes18[14], ReceiveBytes18[15] }, 0) * 100;
-                            }else if (ReceiveBytes18[10] == 0x79 && ReceiveBytes18[11] == 0x19)
+                            } else if (ReceiveBytes18[10] == 0x79 && ReceiveBytes18[11] == 0x19)
                             {
                                 TunePosition2 = BitConverter.ToSingle(new byte[] { ReceiveBytes18[12], ReceiveBytes18[13], ReceiveBytes18[14], ReceiveBytes18[15] }, 0) * 100;
-                            }                            
+                            }
+                            else if (ReceiveBytes18[10] == 0x79 && ReceiveBytes18[11] == 0x1E)
+                            {
+                                VDC = BitConverter.ToSingle(new byte[] { ReceiveBytes18[12], ReceiveBytes18[13], ReceiveBytes18[14], ReceiveBytes18[15] }, 0);
+                            }
                             buffer.RemoveRange(0, 18);
                         }
                         else //帧头不正确时,记得清除

+ 1 - 0
Venus/Venus_RT/Modules/RouteManager.cs

@@ -276,6 +276,7 @@ namespace Venus_RT.Modules
             DATA.Subscribe("System.IsBusy", () => IsRunning, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe("System.IsWaitUnload", () => _isWaitUnload && IsAutoMode, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             //DATA.Subscribe("System.IsConnectedWithHost", () => Singleton<SecGemApplication>.Instance., SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe("System.IsAutoRunning", () => fsm.State == (int)RtState.AutoRunning, SubscriptionAttribute.FLAG.IgnoreSaveDB);
 
             DATA.Subscribe("EquipmentMode", () => IsAutoMode ? 0 : 1, SubscriptionAttribute.FLAG.IgnoreSaveDB);
 

+ 3 - 1
Venus/Venus_RT/Modules/TM/VenusEntity/SEMFSwapRoutine.cs

@@ -30,6 +30,7 @@ namespace Venus_RT.Modules.TM.VenusEntity
             MoveWafer,
             VCEGoto,
             CheckStatus,
+            DelayForPLC,
             CloseSlitDoor,
             NotifyDone,
         }
@@ -109,7 +110,8 @@ namespace Venus_RT.Modules.TM.VenusEntity
                 .RunIf(SwapStep.SEDoorOpen,                     ModuleHelper.IsLoadPort(_targetModule), VCEDoorOpen,        CheckVCEDoorOpen)
                 .LoopStart(SwapStep.VCEGoto,                    loopName(),                         _actionList.Count,      VCEGoto,         VCEGoReady)
                 .LoopRun(SwapStep.CheckStatus,                  CheckStatus,                        CheckSlotOk,            _delay_10s)
-                .LoopEnd(SwapStep.MoveWafer,                    MoveWafer,                          WaitWaferMoved)
+                .LoopRun(SwapStep.MoveWafer,                    MoveWafer,                          WaitWaferMoved)
+                .LoopEnd(SwapStep.DelayForPLC,                  NullFun,                            100)
                 .End(SwapStep.NotifyDone,                       NullFun,                            _delay_50ms);
 
             return Runner.Status;

+ 96 - 3
Venus/Venus_RT/Modules/TM/VenusEntity/SETMEntity.cs

@@ -51,8 +51,9 @@ namespace Venus_RT.Modules.TM.VenusEntity
             Retracting,
             Swapping,
             Gotoing,
-            ControllingPressure,
-
+            SetSpeeding,
+            QuerySpeeding,
+            SaveSpeeding
         }
 
         public enum MSG
@@ -86,6 +87,9 @@ namespace Venus_RT.Modules.TM.VenusEntity
             CreateJob,
             StartJob,
 			Goto,
+            SetSpeed,
+            QuerySpeed,
+            SaveSpeed
         }
 
 
@@ -290,6 +294,9 @@ namespace Venus_RT.Modules.TM.VenusEntity
             DATA.Subscribe($"{_module}.RobotMoveAction.RobotAction", () => _robot.TMRobotMoveInfo.Action.ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{_module}.IsOnline", () => IsOnline, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{_module}.IsOffline", () => !IsOnline, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{_module}.WithWaferSpeed", () => _robot.WithWaferSpeed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{_module}.NoWaferSpeed", () => _robot.NoWaferSpeed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{_module}.IsAlarm", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
 
             OP.Subscribe($"{_module}.Goto", (cmd, args) => RobotGoto(args));
             OP.Subscribe($"{_module}.Home", (cmd, args) => { PostMsg(MSG.Home, args); return true; });
@@ -298,7 +305,6 @@ namespace Venus_RT.Modules.TM.VenusEntity
             OP.Subscribe($"{_module}.Place", (cmd, args) => { PostMsg(MSG.Place, args); return true; });
             OP.Subscribe($"{_module}.Extend", (cmd, args) => { PostMsg(MSG.Extend, args); return true; });
             OP.Subscribe($"{_module}.Retract", (cmd, args) => { PostMsg(MSG.Retract, args); return true; });
-            
             OP.Subscribe($"{_module}.PMPick", (cmd, args) => { PostMsg(MSG.PMPick, args); return true; });
             OP.Subscribe($"{_module}.PMPlace", (cmd, args) => { PostMsg(MSG.PMPlace, args); return true; });
             OP.Subscribe($"{_module}.PumpDown", (cmd, args) => { PostMsg(MSG.Pump); return true; });
@@ -318,6 +324,11 @@ namespace Venus_RT.Modules.TM.VenusEntity
                 _IsOnline = false;
                 return true;
             });
+
+            OP.Subscribe($"{_module}.SetSpeed", (cmd, args) => { PostMsg(MSG.SetSpeed, args); return true; });
+            OP.Subscribe($"{_module}.QuerySpeed", (cmd, args) => { PostMsg(MSG.QuerySpeed, args); return true; });
+            OP.Subscribe($"{_module}.SaveSpeed", (cmd, args) => { PostMsg(MSG.SaveSpeed, args); return true; });
+
             return true;
         }
 
@@ -395,6 +406,22 @@ namespace Venus_RT.Modules.TM.VenusEntity
             Transition(STATE.Leakchecking,      MSG.Abort,          FnAbortLeakCheck,   STATE.Idle);
 
 
+            //setspeed
+            Transition(STATE.Idle,              MSG.SetSpeed,       fnSetSpeed,         STATE.SetSpeeding);
+            Transition(STATE.SetSpeeding,       FSM_MSG.TIMER,      fnSetSpeedTimeout,  STATE.Idle);
+            Transition(STATE.SetSpeeding,       MSG.Abort,          fnAbortSetSpeed,    STATE.Idle);
+
+            //RQspeed
+            Transition(STATE.Idle,              MSG.QuerySpeed,     fnRQSpeed,          STATE.QuerySpeeding);
+            Transition(STATE.QuerySpeeding,     FSM_MSG.TIMER,      fnRQSpeedTimeout,   STATE.Idle);
+            Transition(STATE.QuerySpeeding,     MSG.Abort,          fnAbortRQSpeed,     STATE.Idle);
+
+            //save speed
+            Transition(STATE.Idle,              MSG.SaveSpeed,      fnSaveSpeed,        STATE.SaveSpeeding);
+            Transition(STATE.SaveSpeeding,      FSM_MSG.TIMER,      fnSaveSpeedTimeout, STATE.Idle);
+            Transition(STATE.SaveSpeeding,      MSG.Abort,          fnAbortSaveSpeed,   STATE.Idle);
+
+
             //Control Pressure
             AnyStateTransition(FSM_MSG.TIMER, ControlPressureTimer_Elapsed, FSM_STATE.SAME);
             Running = true;
@@ -708,6 +735,72 @@ namespace Venus_RT.Modules.TM.VenusEntity
             return ret == RState.End;
         }
 
+        private bool fnSetSpeed(object[] param)
+        {
+            return _robot.SetSpeed(param[0].ToString(), float.Parse(param[1].ToString()));
+        }
+
+        private bool fnSaveSpeed(object[] param)
+        {
+            return _robot.SaveSpeed(param[0].ToString());
+        }
+
+        private bool fnRQSpeed(object[] param)
+        {
+            return _robot.QuerySpeed(param[0].ToString());
+        }
+
+        private bool fnSetSpeedTimeout(object[] param)
+        {
+            RState ret = _robot.Status;
+            if (ret == RState.Failed || ret == RState.Timeout)
+            {
+                PostMsg(MSG.Error);
+                return false;
+            }
+
+            return ret == RState.End;
+        }
+
+        private bool fnSaveSpeedTimeout(object[] param)
+        {
+            RState ret = _robot.Status;
+            if (ret == RState.Failed || ret == RState.Timeout)
+            {
+                PostMsg(MSG.Error);
+                return false;
+            }
+
+            return ret == RState.End;
+        }
+
+        private bool fnAbortSaveSpeed(object[] param)
+        {
+            return true;
+        }
+
+        private bool fnRQSpeedTimeout(object[] param)
+        {
+            RState ret = _robot.Status;
+            if (ret == RState.Failed || ret == RState.Timeout)
+            {
+                PostMsg(MSG.Error);
+                return false;
+            }
+
+            return ret == RState.End;
+        }
+
+        private bool fnAbortRQSpeed(object[] param)
+        {
+            return true;
+        }
+
+        private bool fnAbortSetSpeed(object[] param)
+        {
+            return true;
+        }
+
         private bool fnOffline(object[] param)
         {
             //IsOnline = false;

+ 1 - 0
Venus/Venus_RT/Modules/VCE/VceEntity.cs

@@ -179,6 +179,7 @@ namespace Venus_RT.Modules.VCE
             DATA.Subscribe($"{_modulename}.CassetteArrive", () => CassetteArrive);
             DATA.Subscribe($"{_modulename}.IsOnline", () => IsOnline, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{_modulename}.IsOffline", () => !IsOnline, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{_modulename}.IsAlarm", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
 
             OP.Subscribe($"{_modulename}.HOME", (cmd, args) => { PostMsg(VceMSG.Home); return true; });
             OP.Subscribe($"{_modulename}.DoorOpen", (cmd, args) => { PostMsg(VceMSG.DoorOpen); return true; });

+ 3 - 0
Venus/Venus_RT/Venus_RT.csproj

@@ -461,6 +461,9 @@
     <Content Include="Config\TM\_ioDefineVenus_MF.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <Content Include="Config\VenusSignalTower.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
     <Resource Include="RT2.ico" />
     <Resource Include="defaultrt.ico" />
     <EmbeddedResource Include="Properties\Resources.resx">

+ 53 - 0
Venus/Venus_Simulator/Devices/DETMSimulatorServer.cs

@@ -3,6 +3,7 @@ using MECF.Framework.Simulator.Core.Driver;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net.Http.Headers;
 using System.Text;
 using System.Text.RegularExpressions;
 using System.Threading;
@@ -17,7 +18,12 @@ namespace Venus_Simulator.Devices
         private readonly Regex _move_arm = new Regex(@"(PLACE|PICK)\s+(\d+)\s+ARM\s+(A|B)\s+(\w{4})\s*");
         private readonly Regex _move_wafer = new Regex(@"(PLACE|PICK)\s+(\d+)\s+ARM\s+(A|B)\s*");
         private readonly Regex _rq_arm = new Regex(@"(RQ)\s+(LOAD)\s+(ARM)\s*");
+        private readonly Regex _rq_speed = new Regex(@"(RQ)\s+(MOTIONPARA)\s*");
+        private readonly Regex _set_speed = new Regex(@"(SET)\s+(MOTIONPARA)\s*");
+        private readonly Regex _store_speed = new Regex(@"(STORE)\s+(MOTIONPARA)\s*");
         private PeriodicJob _HwThread;
+        private string WithWaferSpeed = "0300";
+        private string NoWaferSpeed = "0300";
         public DETMSimulatorServer() : base(1103, -1, "\n", ' ')
         {
             _HwThread = new PeriodicJob(500, OnSendEvent, "honghuRobot", true);
@@ -34,6 +40,53 @@ namespace Venus_Simulator.Devices
             {
                 OnWriteMessage("_RDY");
             }
+
+            if (_rq_speed.IsMatch(str))
+            {
+                switch (str.Split(' ')[2])
+                {
+                    case "WITHWAFER":
+                        OnWriteMessage($"MOTIONPARA WITHWAFER SPDPCT ALL {WithWaferSpeed} 0100 0100");
+                        OnWriteMessage("_RDY");
+                        break;
+                    case "NOWAFER":
+                        OnWriteMessage($"MOTIONPARA NOWAFER SPDPCT ALL {NoWaferSpeed} 0100 0100");
+                        OnWriteMessage("_RDY");
+                        break;
+                    default:
+                        OnWriteMessage(str);
+                        OnWriteMessage($"_ERR 350");
+                        break;
+                }
+            }
+
+            if (_set_speed.IsMatch(str))
+            {
+                switch (str.Split(' ')[2])
+                {
+                    case "WITHWAFER":
+                        WithWaferSpeed = str.Split(' ')[5];
+                        OnWriteMessage(str);
+                        OnWriteMessage("_RDY");
+                        break;
+                    case "NOWAFER":
+                        NoWaferSpeed = str.Split(' ')[5];
+                        OnWriteMessage(str);
+                        OnWriteMessage("_RDY");
+                        break;
+                    default:
+                        OnWriteMessage(str);
+                        OnWriteMessage($"_ERR 350");
+                        break;
+                }
+            }
+
+            if (_store_speed.IsMatch(str))
+            {
+                OnWriteMessage(str);
+                OnWriteMessage("_RDY");
+            }
+
             if (_rq_arm.IsMatch(str))
             {
                 //OnWriteMessage(string.Format($"LOAD {arm} OFF"));

+ 0 - 54
Venus/Venus_UI/Config/Menu_VenusDE.json

@@ -140,60 +140,6 @@
         "View": "StatisticsView"
       },
       {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Operation",
-        "View": null
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "IO",
-        "View": "IOView"
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Recipe",
-        "View": "RecipeView"
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Gas&LeakCheck",
-        "View": "GasLeakCheckView"
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "MFC Verification",
-        "View": "MFCVerificationView"
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Partial Pressure",
-        "View": "PartialPressureView"
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "VAT Performance",
-        "View": "VATPerformanceView"
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "RF Calibration",
-        "View": "RFCalibrationView"
-      },
-      {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Statistics",
-        "View": "StatisticsView"
-      },
-      {
         "FirstMenu": "PMC",
         "Permission": 2,
         "SecondMenu": "Operation",