Browse Source

1.Add simulator read RF ConfigType function
2.StatisticsViewModel complement

hecl 11 months ago
parent
commit
f814cf53a8

+ 183 - 154
Venus/Venus_MainPages/ViewModels/StatisticsViewModel.cs

@@ -7,16 +7,20 @@ using System.Windows;
 using System.Windows.Data;
 using Aitex.Core.RT.Log;
 using Aitex.Core.Util;
+using Prism.Commands;
+using Prism.Mvvm;
 using MECF.Framework.Common.CommonData;
 using MECF.Framework.Common.DataCenter;
 using MECF.Framework.Common.OperationCenter;
 using OpenSEMI.ClientBase;
+using Venus_Core;
 //using SciChart.Core.Extensions;
 //using VirgoUI.Client.Models.Sys;
 
 namespace Venus_MainPages.ViewModels
 {
-    public class StatsDataListItem : NotifiableItem
+    
+    public class StatsDataListItem 
     {
         public string Name { get; set; }
         public string Value { get; set; }
@@ -37,7 +41,7 @@ namespace Venus_MainPages.ViewModels
         public bool IsVisible { get; set; }
     }
 
-    public class StatsDataListItemRFAndPump : NotifiableItem
+    public class StatsDataListItemRFAndPump 
     {
         public string Name { get; set; }
         public string Description { get; set; }
@@ -51,8 +55,19 @@ namespace Venus_MainPages.ViewModels
         public bool PMIntervalTextSaved { get; set; }
     }
 
-    public class StatisticsViewModel : Binding
+    public class StatisticsViewModel : BindableBase
     {
+        public ObservableCollection<StatsDataListItem> _StatData;
+        public ObservableCollection<StatsDataListItemRFAndPump> _StatDataRFAndPump;
+        public StatisticsViewModel()
+        {
+            
+            StatData = new ObservableCollection<StatsDataListItem>();
+            StatDataRFAndPump = new ObservableCollection<StatsDataListItemRFAndPump>();
+            PollData();
+            _timer = new PeriodicJob(200, this.OnTimer, "Database cleaner", true);
+            _timer.Start();
+                } 
         private int MenuPermission
         {
             //get
@@ -61,19 +76,31 @@ namespace Venus_MainPages.ViewModels
             //}
             get; set;
         }
+        protected  bool OnTimer()
+        {
+            try
+            {
+                //PollData();
+            }
+            catch (Exception ex)
+            {
+                LOG.Error(ex.Message);
+            }
 
+            return true;
+        }
         public ObservableCollection<StatsDataListItem> StatData
         {
-            get;
-            set;
+            get { return _StatData; }
+            set { SetProperty(ref _StatData, value); }
         }
 
         public ObservableCollection<StatsDataListItemRFAndPump> StatDataRFAndPump
         {
-            get;
-            set;
+            get { return _StatDataRFAndPump; }
+            set { SetProperty(ref _StatDataRFAndPump, value); }
         }
-
+        private PeriodicJob _timer;
         //protected override void OnInitialize()
         //{
         //    StatData = new ObservableCollection<StatsDataListItem>();
@@ -93,159 +120,161 @@ namespace Venus_MainPages.ViewModels
         //    base.OnDeactivate(close);
         //}
 
-        //protected override void Poll()
-        //{
-        //    try
-        //    {
-                
+        public void PollData()
+        {
+            try
+            {
 
-        //        string sql = $"SELECT * FROM \"stats_data\" order by \"name\" ASC;";
+                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+                {
+                    StatData.Clear();
+                    StatDataRFAndPump.Clear();
+                }));
+                string sql = $"SELECT * FROM \"stats_data\" order by \"name\" ASC;";
 
-        //        DataTable dbData = QueryDataClient.Instance.Service.QueryData(sql);
+                DataTable dbData = QueryDataClient.Instance.Service.QueryData(sql);
 
-        //        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
-        //        {
-        //            if (dbData == null || dbData.Rows.Count == 0)
-        //                return;
+                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+                {
+                    if (dbData == null || dbData.Rows.Count == 0)
+                        return;
 
-        //            string[] clearedNameList = Array.ConvertAll<StatsDataListItem, string>(StatData.ToArray(), x => x.Name);
+                   // string[] clearedNameList = Array.ConvertAll<StatsDataListItem, string>(StatData.ToArray(), x => x.Name);
 
-        //            List<string> removableList = new List<string>();
+                    List<string> removableList = new List<string>();
 
-        //            if (clearedNameList.Length > 0)
-        //                removableList = clearedNameList.ToList();
+                    //if (clearedNameList.Length > 0)
+                    //    removableList = clearedNameList.ToList();
 
-        //            for (int i = 0; i < dbData.Rows.Count; i++)
-        //            {
-        //                if (!dbData.Rows[i]["is_visible"].Equals(DBNull.Value) && !Convert.ToBoolean(dbData.Rows[i]["is_visible"].ToString()))
-        //                    continue;
+                    for (int i = 0; i < dbData.Rows.Count; i++)
+                    {
+                        if (!dbData.Rows[i]["is_visible"].Equals(DBNull.Value) && !Convert.ToBoolean(dbData.Rows[i]["is_visible"].ToString()))
+                            continue;
 
-        //                string name = dbData.Rows[i]["name"].ToString();
-        //                //removableList.RemoveIfContains(name);
+                        string name = dbData.Rows[i]["name"].ToString();
+                        //removableList.RemoveIfContains(name);
 
-        //                StatsDataListItem item = StatData.FirstOrDefault(x => x.Name == name);
-        //                if (item == null)
-        //                {
-        //                    item = new StatsDataListItem();
-        //                    item.Name = dbData.Rows[i]["name"].ToString();
-        //                    item.AlarmEnable = false;
-        //                    item.WarningEnable = false;
-        //                    item.IsVisible = true;
-        //                    item.AlarmTextSaved = true;
-        //                    item.WarningTextSaved = true;
-        //                    item.AlarmValueSetPoint = dbData.Rows[i]["alarm_value"].ToString();
-        //                    item.WarningValueSetPoint = dbData.Rows[i]["warning_value"].ToString();
-        //                    StatData.Add(item);
-        //                }
-                        
-        //                item.Description = dbData.Rows[i]["description"].ToString();
-        //                item.Value = dbData.Rows[i]["value"].ToString();
-        //                item.Total = dbData.Rows[i]["total"].ToString();
-
-        //                if (!dbData.Rows[i]["enable_warning"].Equals(DBNull.Value))
-        //                    item.WarningEnable = Convert.ToBoolean(dbData.Rows[i]["enable_warning"].ToString());
-
-        //                item.WarningValue = dbData.Rows[i]["warning_value"].ToString();
-
-        //                if (!dbData.Rows[i]["enable_alarm"].Equals(DBNull.Value))
-        //                    item.AlarmEnable = Convert.ToBoolean(dbData.Rows[i]["enable_alarm"].ToString());
-
-        //                item.AlarmValue = dbData.Rows[i]["alarm_value"].ToString();  
-
-        //                if (!dbData.Rows[i]["last_update_time"].Equals(DBNull.Value))
-        //                    item.LastUpdateTime = ((DateTime)dbData.Rows[i]["last_update_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
-
-        //                if (!dbData.Rows[i]["last_reset_time"].Equals(DBNull.Value))
-        //                    item.LastResetTime = ((DateTime)dbData.Rows[i]["last_reset_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
-
-        //                if (!dbData.Rows[i]["last_total_reset_time"].Equals(DBNull.Value))
-        //                    item.LastResetTotalTime = ((DateTime)dbData.Rows[i]["last_total_reset_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
-
-        //                item.InvokePropertyChanged(nameof(item.AlarmValue));
-        //                item.InvokePropertyChanged(nameof(item.WarningValue));
-        //                item.InvokePropertyChanged(nameof(item.Value));
-        //                item.InvokePropertyChanged(nameof(item.Total));
-        //                item.InvokePropertyChanged(nameof(item.LastUpdateTime));
-        //                item.InvokePropertyChanged(nameof(item.LastResetTime));
-        //                item.InvokePropertyChanged(nameof(item.LastResetTotalTime));
-        //            }
-
-        //            foreach (var name in removableList)
-        //            {
-        //                StatsDataListItem item = StatData.FirstOrDefault(x => x.Name == name);
-        //                if (item != null)
-        //                    StatData.Remove(item);
-        //            }
-
-        //        }));
-
-
-        //        string sqlrfpump = $"SELECT * FROM \"stats_data_rf_pump\" order by \"name\" ASC;";
-
-        //        DataTable dbDataRFPump = QueryDataClient.Instance.Service.QueryData(sqlrfpump);
-
-        //        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
-        //        {
-        //            if (dbDataRFPump == null || dbDataRFPump.Rows.Count == 0)
-        //                return;
-
-        //            string[] clearedNameList = Array.ConvertAll<StatsDataListItemRFAndPump, string>(StatDataRFAndPump.ToArray(), x => x.Name);
-
-        //            List<string> removableList = new List<string>();
-
-        //            if (clearedNameList.Length > 0)
-        //                removableList = clearedNameList.ToList();
-
-        //            for (int i = 0; i < dbDataRFPump.Rows.Count; i++)
-        //            {
-
-        //                string name = dbDataRFPump.Rows[i]["name"].ToString();
-        //                //removableList.RemoveIfContains(name);
-
-        //                StatsDataListItemRFAndPump item = StatDataRFAndPump.FirstOrDefault(x => x.Name == name);
-        //                if (item == null)
-        //                {
-        //                    item = new StatsDataListItemRFAndPump();
-        //                    item.Name = dbDataRFPump.Rows[i]["name"].ToString();
-        //                    item.AlarmEnable = false;
-        //                    item.PMIntervalTextSaved = true;
-        //                    item.PMIntervalSetPoint = dbDataRFPump.Rows[i]["pm_interval"].ToString();
-        //                    StatDataRFAndPump.Add(item);
-        //                }
-
-        //                item.Description = dbDataRFPump.Rows[i]["description"].ToString();
-        //                if (!dbDataRFPump.Rows[i]["enable_alarm"].Equals(DBNull.Value))
-        //                    item.AlarmEnable = Convert.ToBoolean(dbDataRFPump.Rows[i]["enable_alarm"].ToString());
-
-        //                item.fromLastPM = dbDataRFPump.Rows[i]["from_last_pm"].ToString();
-        //                item.PMInterval = dbDataRFPump.Rows[i]["pm_interval"].ToString();
-        //                item.Total = dbDataRFPump.Rows[i]["total"].ToString();
-
-        //                if (!dbDataRFPump.Rows[i]["last_pm_time"].Equals(DBNull.Value))
-        //                    item.LastPMTime = ((DateTime)dbDataRFPump.Rows[i]["last_pm_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
-
-        //                item.InvokePropertyChanged(nameof(item.Name));
-        //                item.InvokePropertyChanged(nameof(item.AlarmEnable));
-        //                item.InvokePropertyChanged(nameof(item.Description));
-        //                item.InvokePropertyChanged(nameof(item.Total));
-        //                item.InvokePropertyChanged(nameof(item.fromLastPM));
-        //                item.InvokePropertyChanged(nameof(item.PMInterval));
-        //                item.InvokePropertyChanged(nameof(item.LastPMTime));
-        //            }
-
-        //            foreach (var name in removableList)
-        //            {
-        //                StatsDataListItemRFAndPump item = StatDataRFAndPump.FirstOrDefault(x => x.Name == name);
-        //                if (item != null)
-        //                    StatDataRFAndPump.Remove(item);
-        //            }
+                        StatsDataListItem item = StatData.FirstOrDefault(x => x.Name == name);
+                        if (item == null)
+                        {
+                            item = new StatsDataListItem();
+                            item.Name = dbData.Rows[i]["name"].ToString();
+                            item.AlarmEnable = false;
+                            item.WarningEnable = false;
+                            item.IsVisible = true;
+                            item.AlarmTextSaved = true;
+                            item.WarningTextSaved = true;
+                            item.AlarmValueSetPoint = dbData.Rows[i]["alarm_value"].ToString();
+                            item.WarningValueSetPoint = dbData.Rows[i]["warning_value"].ToString();
+                            StatData.Add(item);
+                        }
 
-        //        }));
-        //    }
-        //    catch (Exception e)
-        //    {
-        //    }
-        //}
+                        item.Description = dbData.Rows[i]["description"].ToString();
+                        item.Value = dbData.Rows[i]["value"].ToString();
+                        item.Total = dbData.Rows[i]["total"].ToString();
+
+                        if (!dbData.Rows[i]["enable_warning"].Equals(DBNull.Value))
+                            item.WarningEnable = Convert.ToBoolean(dbData.Rows[i]["enable_warning"].ToString());
+
+                        item.WarningValue = dbData.Rows[i]["warning_value"].ToString();
+
+                        if (!dbData.Rows[i]["enable_alarm"].Equals(DBNull.Value))
+                            item.AlarmEnable = Convert.ToBoolean(dbData.Rows[i]["enable_alarm"].ToString());
+
+                        item.AlarmValue = dbData.Rows[i]["alarm_value"].ToString();
+
+                        if (!dbData.Rows[i]["last_update_time"].Equals(DBNull.Value))
+                            item.LastUpdateTime = ((DateTime)dbData.Rows[i]["last_update_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
+
+                        if (!dbData.Rows[i]["last_reset_time"].Equals(DBNull.Value))
+                            item.LastResetTime = ((DateTime)dbData.Rows[i]["last_reset_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
+
+                        if (!dbData.Rows[i]["last_total_reset_time"].Equals(DBNull.Value))
+                            item.LastResetTotalTime = ((DateTime)dbData.Rows[i]["last_total_reset_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
+
+                        //item.InvokePropertyChanged(nameof(item.AlarmValue));
+                        //item.InvokePropertyChanged(nameof(item.WarningValue));
+                        //item.InvokePropertyChanged(nameof(item.Value));
+                        //item.InvokePropertyChanged(nameof(item.Total));
+                        //item.InvokePropertyChanged(nameof(item.LastUpdateTime));
+                        //item.InvokePropertyChanged(nameof(item.LastResetTime));
+                        //item.InvokePropertyChanged(nameof(item.LastResetTotalTime));
+                    }
+
+                    //foreach (var name in removableList)
+                    //{
+                    //    StatsDataListItem item = StatData.FirstOrDefault(x => x.Name == name);
+                    //    if (item != null)
+                    //        StatData.Remove(item); 
+                    //}
+
+                }));
+
+                
+                string sqlrfpump = $"SELECT * FROM \"stats_data_rf_pump\" order by \"name\" ASC;";
+
+                DataTable dbDataRFPump = QueryDataClient.Instance.Service.QueryData(sqlrfpump);
+
+                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+                {
+                    if (dbDataRFPump == null || dbDataRFPump.Rows.Count == 0)
+                        return;
+                    //string[] clearedNameList = Array.ConvertAll<StatsDataListItemRFAndPump, string>(StatDataRFAndPump.ToArray(), x => x.Name);
+
+                    //List<string> removableList = new List<string>();
+                    //if (clearedNameList.Length > 0)
+                    //    removableList = clearedNameList.ToList();
+
+                    for (int i = 0; i < dbDataRFPump.Rows.Count; i++)
+                    {
+
+                        string name = dbDataRFPump.Rows[i]["name"].ToString();
+                        //removableList.RemoveIfContains(name);
+
+                        StatsDataListItemRFAndPump item = StatDataRFAndPump.FirstOrDefault(x => x.Name == name);
+                        if (item == null)
+                        {
+                            item = new StatsDataListItemRFAndPump();
+                            item.Name = dbDataRFPump.Rows[i]["name"].ToString();
+                            item.AlarmEnable = false;
+                            item.PMIntervalTextSaved = true;
+                            item.PMIntervalSetPoint = dbDataRFPump.Rows[i]["pm_interval"].ToString();
+                            StatDataRFAndPump.Add(item);
+                        }
+
+                        item.Description = dbDataRFPump.Rows[i]["description"].ToString();
+                        if (!dbDataRFPump.Rows[i]["enable_alarm"].Equals(DBNull.Value))
+                            item.AlarmEnable = Convert.ToBoolean(dbDataRFPump.Rows[i]["enable_alarm"].ToString());
+
+                        item.fromLastPM = dbDataRFPump.Rows[i]["from_last_pm"].ToString();
+                        item.PMInterval = dbDataRFPump.Rows[i]["pm_interval"].ToString();
+                        item.Total = dbDataRFPump.Rows[i]["total"].ToString();
+
+                        if (!dbDataRFPump.Rows[i]["last_pm_time"].Equals(DBNull.Value))
+                            item.LastPMTime = ((DateTime)dbDataRFPump.Rows[i]["last_pm_time"]).ToString("yyyy-MM-dd HH:mm:ss.fff");
+
+                        //item.InvokePropertyChanged(nameof(item.Name));
+                        //item.InvokePropertyChanged(nameof(item.AlarmEnable));
+                        //item.InvokePropertyChanged(nameof(item.Description));
+                        //item.InvokePropertyChanged(nameof(item.Total));
+                        //item.InvokePropertyChanged(nameof(item.fromLastPM));
+                        //item.InvokePropertyChanged(nameof(item.PMInterval));
+                        //item.InvokePropertyChanged(nameof(item.LastPMTime));
+                    }
+
+                    //foreach (var name in removableList)
+                    //{
+                    //    StatsDataListItemRFAndPump item = StatDataRFAndPump.FirstOrDefault(x => x.Name == name);
+                    //    if (item != null)
+                    //        StatDataRFAndPump.Remove(item);
+                    //}
+
+                }));
+            }
+            catch (Exception e)
+            {
+            }
+        }
 
         public void ResetValue(StatsDataListItem item)
         {
@@ -278,7 +307,7 @@ namespace Venus_MainPages.ViewModels
             InvokeClient.Instance.Service.DoOperation("System.Stats.SetAlarmValue", item.Name, setValue);
 
             item.AlarmTextSaved = true;
-            item.InvokePropertyChanged(nameof(item.AlarmTextSaved));
+            //item.InvokePropertyChanged(nameof(item.AlarmTextSaved));
         }
 
         public void SetWarningValue(StatsDataListItem item)
@@ -294,7 +323,7 @@ namespace Venus_MainPages.ViewModels
             InvokeClient.Instance.Service.DoOperation("System.Stats.SetWarningValue", item.Name, setValue);
 
             item.WarningTextSaved = true;
-            item.InvokePropertyChanged(nameof(item.WarningTextSaved));
+            //item.InvokePropertyChanged(nameof(item.WarningTextSaved));
         }
         
         public void ResetTotalValue(StatsDataListItem item)
@@ -328,7 +357,7 @@ namespace Venus_MainPages.ViewModels
             InvokeClient.Instance.Service.DoOperation("System.StatsRFAndPump.SetPMIntervalValue", item.Name, setValue);
 
             item.PMIntervalTextSaved = true;
-            item.InvokePropertyChanged(nameof(item.PMIntervalTextSaved));
+            //item.InvokePropertyChanged(nameof(item.PMIntervalTextSaved));
         }
     }
 }

+ 24 - 1
Venus/Venus_RT/Config/DBModel.sql

@@ -178,6 +178,8 @@ begin
 					  "last_reset_time" timestamp without time zone,
 					  "last_total_reset_time" timestamp without time zone,		
 					  "is_visible" boolean,
+					  "enable_warning" boolean,
+					  "warning_value" integer,
 					  "enable_alarm" boolean,
 					  "alarm_value" integer,
 					  CONSTRAINT "stats_data_pkey" PRIMARY KEY ("name" )
@@ -190,7 +192,28 @@ begin
 					GRANT SELECT ON TABLE "stats_data" TO postgres;
  
     end if; 
-
+		 ------------------------------------------------------------------------------------------------
+	    if not exists(select * from information_schema.COLUMNS
+	        where 	
+			table_catalog = CURRENT_CATALOG and table_schema = CURRENT_SCHEMA 
+			and table_name = 'stats_data' and column_name = 'enable_warning') 
+            then
+            ALTER TABLE "stats_data" ADD COLUMN "enable_warning" TEXT;
+			ALTER TABLE "stats_data"
+			OWNER TO postgres;
+			GRANT SELECT ON TABLE "stats_data" TO postgres;
+    end if ;
+			 ------------------------------------------------------------------------------------------------
+	    if not exists(select * from information_schema.COLUMNS
+	        where 	
+			table_catalog = CURRENT_CATALOG and table_schema = CURRENT_SCHEMA 
+			and table_name = 'stats_data' and column_name = 'warning_value') 
+            then
+            ALTER TABLE "stats_data" ADD COLUMN "warning_value" TEXT;
+			ALTER TABLE "stats_data"
+			OWNER TO postgres;
+			GRANT SELECT ON TABLE "stats_data" TO postgres;
+    end if ;
 	 ------------------------------------------------------------------------------------------------
  --	
 	    if not exists(select * from information_schema.tables  

+ 1 - 0
Venus/Venus_RT/Config/PM/VenusDE/VenusDEDeviceModel.xml

@@ -298,6 +298,7 @@
   <IoMagnets assembly="Venus_RT" classType="Venus_RT.Devices.IODevices.IoMagnet">
     <IoMagnet id="AIoMagnet" display="Valve IoMagnet" schematicId="" unit="A"
            diPowerOn="DI_Magnets_Coils_ON_FB"
+           doMagnetsContactOn="DO_Magnets_Contact_ON"
            doMagnets1A="DO_Magnets_1A_coil_ON"
            doMagnets1B="DO_Magnets_1B_coil_ON"
            doMagnets2A="DO_Magnets_2A_coil_ON"

+ 0 - 2
Venus/Venus_RT/Config/PM/VenusDE/VenusDEInterlock.xml

@@ -354,14 +354,12 @@
     <Limit di="DI_CDA_Pressure_Switch"				value="true" tip="DI CDA Pressure"				tip.zh-CN="" tip.en-US="DI-12" />
     <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
     <Limit di="DI_TM_ROB_NOT_EXTEND_TO_PM"				value="true" tip="TM ARM NOT EXTEND TO PM"				tip.zh-CN="" tip.en-US="DI-58" />
-    <Limit di="DI_Lid_Closed"		value="true" tip="TM Slit Door Closed"			tip.zh-CN="" tip.en-US="DI-0" />
   </Action>
 
   <Action do="DO_PM_Liner_Door_Close" value="true" tip="Slit Door Open" tip.zh-CN="" tip.en-US="DO-25" >
     <Limit di="DI_CDA_Pressure_Switch"				value="true" tip="DI CDA Pressure"				tip.zh-CN="" tip.en-US="DI-12" />
     <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
     <Limit di="DI_TM_ROB_NOT_EXTEND_TO_PM"				value="true" tip="TM ARM NOT EXTEND TO PM"				tip.zh-CN="" tip.en-US="DI-58" />
-    <Limit di="DI_Lid_Closed"		value="true" tip="TM Slit Door Closed"			tip.zh-CN="" tip.en-US="DI-0" />
   </Action>
   
   <Action do="DO_Lift_Pin_Up" value="true" tip="Lift Pin Up" tip.zh-CN="" tip.en-US="DO-26" >

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

@@ -39,6 +39,7 @@ namespace Venus_RT.Devices.IODevices
             base.Display = node.GetAttribute("display");
             base.DeviceID = node.GetAttribute("schematicId");
             this.Status = MagnetStatus.Unknown;
+            _doMagnetOpen = ParseDoNode("doMagnetsContactOn", node, ioModule);
             _aiMagnet1U = ParseAiNode("aiMagnet1U", node, ioModule);
             _aiMagnet1V = ParseAiNode("aiMagnet1V", node, ioModule);
             _aiMagnet1W = ParseAiNode("aiMagnet1W", node, ioModule);
@@ -73,10 +74,12 @@ namespace Venus_RT.Devices.IODevices
         private readonly AOAccessor _ao1Boutput;
         private readonly AOAccessor _ao2Aoutput;
         private readonly AOAccessor _ao2Boutput;
+        private DOAccessor _doMagnetOpen;
         private ToleranceChecker _toleranceChecker = new ToleranceChecker();
         public bool Initialize()
         {
             DATA.Subscribe($"{Module}.AIoMagnet.DeviceData", () => DeviceData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            
             _SetRealFloat(_aoMagnetWaveForm, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnetwareform").Value));          
             _SetRealFloat(_aoMagnetCycle, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Magnetcycleperiod").Value));
             _SetRealFloat(_aoMinMagnet, Convert.ToSingle(SC.GetConfigItem($"{Module}.Magnet.Min_Magnet_Coil_Current").Value));
@@ -211,6 +214,7 @@ namespace Venus_RT.Devices.IODevices
         }
         public void Reset()
         {
+            _doMagnetOpen.SetValue(true, out string reason);
             _SetRealFloat(_aoMagnetintensity, 0);
         }
 

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

@@ -237,6 +237,10 @@ namespace Venus_RT.Devices
         {
             return _pendulumValve.IsOpen;
         }
+        public override bool IsBiasRFAble()
+        {
+            return false;
+        }
 
         #region 构造函数
         public JetKepler2200APM(ModuleName moduleName) : base(moduleName)

+ 4 - 1
Venus/Venus_RT/Devices/JetKepler2200BPM.cs

@@ -256,7 +256,10 @@ namespace Venus_RT.Devices
         {
             return _slitDoor.State == CylinderState.Close;
         }
-
+        public override bool IsBiasRFAble()
+        {
+            return false;
+        }
         //public override bool CheckLiftUp()
         //{
         //    return _LiftPin.State == CylinderState.Open;

+ 8 - 1
Venus/Venus_RT/Devices/JetPMBase.cs

@@ -446,7 +446,14 @@ namespace Venus_RT.Devices
         {
             return false;
         }
-
+        public virtual bool IsRFAble()
+        {
+            return true;
+        }
+        public virtual bool IsBiasRFAble()
+        {
+            return true;
+        }
         public abstract bool SetWallTCTemperature(float value);
         protected abstract void CheckPermanentInterlock();
 

+ 53 - 54
Venus/Venus_RT/Devices/JetVenusDEPM.cs

@@ -421,7 +421,7 @@ namespace Venus_RT.Devices
 
             }
         }
-        public override bool IsLinerDoorClosed => !_linerDoor.ONFeedback && _linerDoor.OFFFeedback;
+        public override bool IsLinerDoorClosed => !_linerDoor.ONFeedback;
         public override bool IsPumpRunning => _MainPump.IsRunning;
 
         public override bool IsISOOpen => _TurboPumpPumpingValve.Status;
@@ -815,6 +815,11 @@ namespace Venus_RT.Devices
             }
             return false;
         }
+        public override bool IsRFAble()
+        {
+            return false;
+
+        }
         public override bool StartControlPressure(int pressureSetpoint, int flowSetpoint)
         {
             OpenValve(ValveType.TurboPumpPumping, true);
@@ -869,18 +874,18 @@ namespace Venus_RT.Devices
         }
         public override bool CheckLinerDoorOpen()
         {
-            return _linerDoor.State == CylinderState.Open;
+            return !IsLinerDoorClosed;
         }
 
         public override bool CheckLinerDoorClose()
         {
-            return _linerDoor.State == CylinderState.Close;
+            return IsLinerDoorClosed;
         }
         public override bool CheckSlitDoorClose()
-        => IsSlitDoorClosed && IsLinerDoorClosed;
+        => IsSlitDoorClosed;
 
         public override bool CheckSlitDoorOpen()
-        => !IsSlitDoorClosed && !IsLinerDoorClosed;
+        => !IsSlitDoorClosed;// !IsLinerDoorClosed
 
         public override void CloseValves(int? delayTime = null)
         {
@@ -1067,24 +1072,14 @@ namespace Venus_RT.Devices
             //转交TM
             if (!IsSlitDoorClosed)
             {
-                SetSlitDoor(true, out _);
-            }
-            else
-            {
                 SetSlitDoor(false, out _);
             }
 
-            if (_linerDoor.State == CylinderState.Open)
-            {
-                SetLinerDoor(true, out _);
-            }
-            else
+            if (!IsLinerDoorClosed) //
             {
                 SetLinerDoor(false, out _);
             }
-
             SetLinerDoor(false, out _);
-            //SetSlitDoor(false, out _);
             OpenValve(ValveType.PVN22, false);
             _GeneratorBias?.ReConnect();
             _BiasMatch?.ReConnect();
@@ -1093,6 +1088,7 @@ namespace Venus_RT.Devices
             _pendulumValve?.ReConnect();
             _GeneratorBias?.Reset();
             _BiasMatch?.Reset();
+            _Magnet?.Reset();
         }
 
         public override void OnOffChiller(ChillerType chillerType, bool onoff)
@@ -1266,30 +1262,30 @@ namespace Venus_RT.Devices
         }
         public override bool SetLinerDoor(bool open, out string reason)
         {
-            if (open)
-            {
-                if (RouteManager.IsATMMode)
-                {
-                    if (!IsATM)
-                    {
-                        reason = $"{Module} is not ATM, can not open slit door";
-                        LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason);
-                        return false;
-                    }
-                }
-                //else
-                //{
-
-                //    double maxPressureDifference = SC.GetValue<double>("System.PMTMMaxPressureDifference");
-                //    if (Math.Abs(TMPressure - ChamberPressure) > maxPressureDifference)
-                //    {
-                //        reason = $"{Module} and TM pressure difference exceeds the max limit {maxPressureDifference}, TMPressure:{TMPressure}, {Module}Pressure:{ChamberPressure}";
-                //        LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason);
-                //        return false;
-                //    }
-                //}
+            //if (open)
+            //{
+            //    if (RouteManager.IsATMMode)
+            //    {
+            //        if (!IsATM)
+            //        {
+            //            reason = $"{Module} is not ATM, can not open liner door";
+            //            LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason);
+            //            return false;
+            //        }
+            //    }
+            //    //else
+            //    //{
+
+            //    //    double maxPressureDifference = SC.GetValue<double>("System.PMTMMaxPressureDifference");
+            //    //    if (Math.Abs(TMPressure - ChamberPressure) > maxPressureDifference)
+            //    //    {
+            //    //        reason = $"{Module} and TM pressure difference exceeds the max limit {maxPressureDifference}, TMPressure:{TMPressure}, {Module}Pressure:{ChamberPressure}";
+            //    //        LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason);
+            //    //        return false;
+            //    //    }
+            //    //}
 
-            }
+            //}
 
             return _linerDoor.SetCylinder(open, out reason);
         }
@@ -1345,19 +1341,20 @@ namespace Venus_RT.Devices
 
         public override bool PreparePlace()
         {
-            if (!SetSlitDoor(true, out string reason))
+
+            if (!SetLinerDoor(true, out string reason))
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Open failed:{reason}");
                 return false;
 
             }
-            //
-            if (!SetLinerDoor(true, out reason))
+
+            if (!SetSlitDoor(true, out reason))
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Open failed:{reason}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
                 return false;
-
             }
+            //
             if (!SetLiftPin(MovementPosition.Down, out reason))
             {
                 LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
@@ -1367,14 +1364,14 @@ namespace Venus_RT.Devices
         }
         public override bool PreparePick()
         {
-            if (!SetSlitDoor(true, out string reason))
+            if (!SetLinerDoor(true, out string reason))
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Open failed:{reason}");
                 return false;
             }
-            if (!SetLinerDoor(true, out reason))
+            if (!SetSlitDoor(true, out reason))
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Open failed:{reason}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
                 return false;
             }
             if (!SetLiftPin(MovementPosition.Up, out reason))
@@ -1400,14 +1397,15 @@ namespace Venus_RT.Devices
                 return false;
             }
 
-            if (!SetSlitDoor(false, out reason))
+            if (!SetLinerDoor(false, out reason))
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Close failed:{reason}");
                 return false;
             }
-            if (!SetLinerDoor(false, out reason))
+
+            if (!SetSlitDoor(false, out reason))
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Close failed:{reason}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
                 return false;
             }
             return true;
@@ -1429,7 +1427,8 @@ namespace Venus_RT.Devices
         }
         private void ALARM_Notify()
         {
-            Singleton<RouteManager>.Instance.GetPM(Module).PostMsg(FSM_MSG.ALARM);
+            if (Singleton<RouteManager>.Instance.GetPM(Module).IsProcessing)
+                Singleton<RouteManager>.Instance.GetPM(Module).PostMsg(FSM_MSG.ALARM);
         }
 
         private void SensorWithAlarm()

+ 2 - 1
Venus/Venus_RT/Devices/JetVenusSEPM.cs

@@ -1377,7 +1377,8 @@ namespace Venus_RT.Devices
         }
         private void ALARM_Notify()
         {
-            Singleton<RouteManager>.Instance.GetPM(Module).PostMsg(FSM_MSG.ALARM);
+            if (Singleton<RouteManager>.Instance.GetPM(Module).IsProcessing)
+                Singleton<RouteManager>.Instance.GetPM(Module).PostMsg(FSM_MSG.ALARM);
         }
 
         private void SensorWithAlarm()

+ 26 - 1
Venus/Venus_RT/Modules/PMs/PMEntity.cs

@@ -16,6 +16,7 @@ using Venus_Core;
 using Venus_RT.Devices;
 using Aitex.Core.RT.Log;
 using Aitex.Core.UI.DeviceControl;
+using MECF.Framework.Common.DataCenter;
 
 namespace Venus_RT.Modules.PMs
 {
@@ -118,7 +119,10 @@ namespace Venus_RT.Modules.PMs
 
         public ModuleName Module { get; }
         public PMStatus Status { get; private set; }
-
+        private StatsDataItem _statProcessedWafer;
+        private StatsDataItemRFAndPump _statRfOnTime;
+        private StatsDataItemRFAndPump _statBiasRfOnTime;
+        private StatsDataItemRFAndPump _statPumpOnTime;
         private readonly PMHomeRoutine _home;
         private readonly StartDryPumpRoutine _startDryPumpRoutine;
         private readonly StartTurboPumpRoutine _startTurboPumpRoutine;
@@ -718,6 +722,26 @@ namespace Venus_RT.Modules.PMs
             OP.Subscribe($"{Module}.{RtOperation.Include}", (cmd, args) => FnSetInclude());
             OP.Subscribe($"{Module}.{RtOperation.Exclude}", (cmd, args) => FnSetExclude());
 
+            StatsDataManager.Instance.Subscribe($"{Module}.ProcessedWaferCount", "Processed Wafer Count", 0);
+            if (_chamber.IsRFAble())
+                StatsDataManager.Instance.Subscribe($"{Module}.RfOnTime", "Rf On Time");
+            if (_chamber.IsBiasRFAble())
+                StatsDataManager.Instance.Subscribe($"{Module}.BiasRfOnTime", "Bias  Rf On Time");
+            StatsDataManager.Instance.Subscribe($"{Module}.PumpOnTime", "Pump On Time");
+
+            _statProcessedWafer = StatsDataManager.Instance.GetItem($"{Module}.ProcessedWaferCount");
+            _statRfOnTime = StatsDataManager.Instance.GetItemRFAndPump($"{Module}.RfOnTime");
+            if (_chamber.IsBiasRFAble())
+                _statBiasRfOnTime = StatsDataManager.Instance.GetItemRFAndPump($"{Module}.BiasRfOnTime");
+            _statPumpOnTime = StatsDataManager.Instance.GetItemRFAndPump($"{Module}.PumpOnTime");
+
+
+            DATA.Subscribe($"{Module}.ProcessedWaferCount", () => _statProcessedWafer.Value);
+            if (_chamber.IsRFAble())
+                DATA.Subscribe($"{Module}.RfOnTime", () => _statRfOnTime.fromLastPM);
+            if (_chamber.IsBiasRFAble())
+                DATA.Subscribe($"{Module}.BiasRfOnTime", () => _statBiasRfOnTime.fromLastPM);
+            DATA.Subscribe($"{Module}.PumpOnTime", () => _statPumpOnTime.fromLastPM);
 
             if (ChamberType == JetChamber.Kepler2200A && ChamberType == JetChamber.Kepler2200B)
             {
@@ -1280,6 +1304,7 @@ namespace Venus_RT.Modules.PMs
         }
         private bool FnAbortProcess(object[] param)
         {
+            StatsDataManager.Instance.Increase(_statProcessedWafer.Name);
             _processRoutine.Abort();
             return true;
         }

+ 2 - 1
Venus/Venus_RT/Modules/TM/VenusEntity/SEMFPMPickRoutine.cs

@@ -36,6 +36,7 @@ namespace Venus_RT.Modules.TM.VenusEntity
             QueryAWC,
             DropDownWafer,
             PickDelay,
+            PickDelay2,
             ArmRetract,
             SavePickeData,
             NotifyDone,
@@ -141,7 +142,7 @@ namespace Venus_RT.Modules.TM.VenusEntity
                         .Run(PickStep.ArmRetract, ArmRetract, WaitRobotRetractDone, _RetractTimeout)
                         .Run(PickStep.SavePickeData, RecordAWCData, NullFun)
                         .Run(PickStep.NotifyDone, NotifyPMDone, _delay_50ms)
-                        .Delay(PickStep.PickDelay, _delay_50ms)
+                        .Delay(PickStep.PickDelay2, _delay_50ms)
                         .Run(PickStep.CloseSlitDoor, PMDoorClose, WaitPMDoorClose)
                         .RunIf(PickStep.CloseLinerDoor, havelinerdoor, PMLinerDoorClose, WaitPMLinerDoorClose)
                         .End(PickStep.EndDelay, NullFun, _delay_50ms);

+ 2 - 1
Venus/Venus_RT/Modules/TM/VenusEntity/SEMFPMPlaceRoutine.cs

@@ -32,6 +32,7 @@ namespace Venus_RT.Modules.TM.VenusEntity
             QueryAWC,
             LiftUpWafer,
             PlaceDelay,
+            PlaceDelay2,
             ArmRetract,
             SavePlaceData,
             NotifyDone,
@@ -120,7 +121,7 @@ namespace Venus_RT.Modules.TM.VenusEntity
                 .Run(PlaceStep.ArmRetract, ArmRetract, WaitRobotRetractDone, _RetractTimeout)
                 .Run(PlaceStep.SavePlaceData, RecordAWCData, NullFun)
                 .Run(PlaceStep.NotifyDone, NotifyPMDone, _delay_50ms)
-                .Delay(PlaceStep.PlaceDelay, _delay_50ms)
+                .Delay(PlaceStep.PlaceDelay2, _delay_50ms)
                 .Run(PlaceStep.CloseDoor, PMDoorClose, WaitPMDoorClose)
                 .End(PlaceStep.EndDelay, NullFun, _delay_50ms);
 

+ 32 - 0
Venus/Venus_Simulator/App.config

@@ -3,4 +3,36 @@
     <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
     </startup>
+  <system.serviceModel>
+    <bindings>
+      <netTcpBinding>
+
+        <binding name="Aitex_netTcpBinding" maxReceivedMessageSize="2147483647" openTimeout="00:00:05" closeTimeout="00:03:00" receiveTimeout="00:30:00" sendTimeout="00:30:00">
+          <readerQuotas maxDepth="132" maxStringContentLength="1048576" maxArrayLength="163840000" maxBytesPerRead="14096" maxNameTableCharCount="116384"/>
+          <security mode="None"/>
+        </binding>
+      </netTcpBinding>
+    </bindings>
+    <behaviors>
+      <endpointBehaviors>
+        <behavior name="EndpointBehavior">
+          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
+        </behavior>
+      </endpointBehaviors>
+    </behaviors>
+    <client>
+      <endpoint address="net.tcp://localhost:8751/InvokeService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="MECF.Framework.Common.OperationCenter.IInvokeService" name="Client_IInvokeService"/>
+      <endpoint address="net.tcp://localhost:8752/EventService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="Aitex.Core.WCF.Interface.IEventService" name="Client_IEventService"/>
+
+      <endpoint address="net.tcp://localhost:8771/QueryDataService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="MECF.Framework.Common.DataCenter.IQueryDataService" name="Client_IQueryDataService"/>
+      <endpoint address="net.tcp://localhost:8773/RecipeService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="MECF.Framework.Common.RecipeCenter.IRecipeService" name="Client_IRecipeService"/>
+      <endpoint address="net.tcp://localhost:8775/AccountService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="Aitex.Core.Account.IAccountService" name="Client_IAccountService"/>
+
+
+      <endpoint address="net.tcp://localhost:9002/PMService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="ClusterInterface.IPmService" name="Client_IPECVDService"/>
+      <endpoint address="net.tcp://localhost:9004/PMService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="ClusterInterface.IPmService" name="Client_IIBEService"/>
+      <endpoint address="net.tcp://localhost:9006/PMService" behaviorConfiguration="EndpointBehavior" binding="netTcpBinding" bindingConfiguration="Aitex_netTcpBinding" contract="ClusterInterface.IPmService" name="Client_IICPService"/>
+
+    </client>
+  </system.serviceModel>
 </configuration>

+ 32 - 12
Venus/Venus_Simulator/Instances/SimulatorSystem.cs

@@ -11,6 +11,8 @@ using System.Threading;
 using Venus_Core;
 using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
 using System.Diagnostics.Eventing.Reader;
+using MECF.Framework.Common.CommonData;
+using MECF.Framework.Common.DataCenter;
 
 namespace Venus_Simulator.Instances
 {
@@ -19,7 +21,7 @@ namespace Venus_Simulator.Instances
         private PeriodicJob _thread;
 
         private Random _rd = new Random();
-
+        ConfigType type;
         private RD_TRIG _trigATM = new RD_TRIG();
         private RD_TRIG _trigVAC = new RD_TRIG();
 
@@ -43,6 +45,7 @@ namespace Venus_Simulator.Instances
             //_MockDevices.Add(ModuleName.PMB, new AdTecMatchMock());
 
             // TODO
+            type = (ConfigType)QueryDataClient.Instance.Service.GetData("System.ConfigType");
             jetChambers.Add(ModuleName.PMA, SimulatorJetChamber.CurrentPMAChamber);
             jetChambers.Add(ModuleName.PMB, SimulatorJetChamber.CurrentPMBChamber);
             jetChambers.Add(ModuleName.PMC, SimulatorJetChamber.CurrentPMCChamber);
@@ -62,12 +65,20 @@ namespace Venus_Simulator.Instances
             SetDefaultValue(ModuleName.PMB, SimulatorJetChamber.CurrentPMBChamber);
             SetDefaultValue(ModuleName.PMC, SimulatorJetChamber.CurrentPMCChamber);
             SetDefaultValue(ModuleName.PMD, SimulatorJetChamber.CurrentPMDChamber);
-            SetTMDefaultValue();
-            SetSETMDefaultValue();
-            SetDETMDefaultValue();
-
-
+            if (type == ConfigType.Kepler2200 || type == ConfigType.Kepler2300 || type == ConfigType.Other)
+            {
+                SetTMDefaultValue();
+            }
+            else if (type == ConfigType.VenusSE)
+            {
+                SetSETMDefaultValue();
+            }
+            else if (type == ConfigType.VenusDE)
+            {
+                SetDETMDefaultValue();
+            }
 
+                    
             Singleton<DataManager>.Instance.Initialize(false);
 
             _thread = new PeriodicJob(500, OnMonitor, nameof(SimulatorSystem), true);
@@ -727,12 +738,21 @@ namespace Venus_Simulator.Instances
 
                 ChangeTime(ModuleName.TM);
 
-                MonitorMFSlitDoor();
-                MonitorSEMFSlitDoor();
-                MonitorDEMFSlitDoor();
-                MonitorMFPressure();
-                MonitorSEMFPressure();
-                MonitorDEMFPressure();
+                if (type == ConfigType.Kepler2200 || type == ConfigType.Kepler2300 || type == ConfigType.Other)
+                {
+                    MonitorMFSlitDoor();
+                    MonitorMFPressure();
+                }
+                else if (type == ConfigType.VenusSE)
+                {
+                    MonitorSEMFSlitDoor();
+                    MonitorSEMFPressure();
+                }
+                else if (type == ConfigType.VenusDE)
+                {
+                    MonitorDEMFSlitDoor();
+                    MonitorDEMFPressure();
+                }
 
             }
             catch (Exception e)

+ 24 - 0
Venus/Venus_UI/Config/Menu_Kepler.json

@@ -283,6 +283,12 @@
         "Permission": 2,
         "SecondMenu": "Data History",
         "View": "DataHistoryView"
+      },
+      {
+        "FirstMenu": "DataLog",
+        "Permission": 2,
+        "SecondMenu": "Statistics",
+        "View": "StatisticsView"
       }
     ],
     "RoleName": "Manager",
@@ -572,6 +578,12 @@
         "Permission": 2,
         "SecondMenu": "Data History",
         "View": "DataHistoryView"
+      },
+      {
+        "FirstMenu": "DataLog",
+        "Permission": 2,
+        "SecondMenu": "Statistics",
+        "View": "StatisticsView"
       }
     ],
     "RoleName": "Engineer",
@@ -861,6 +873,12 @@
         "Permission": 2,
         "SecondMenu": "Data History",
         "View": "DataHistoryView"
+      },
+      {
+        "FirstMenu": "DataLog",
+        "Permission": 2,
+        "SecondMenu": "Statistics",
+        "View": "StatisticsView"
       }
     ],
     "RoleName": "Technician",
@@ -1150,6 +1168,12 @@
         "Permission": 2,
         "SecondMenu": "Data History",
         "View": "DataHistoryView"
+      },
+      {
+        "FirstMenu": "DataLog",
+        "Permission": 2,
+        "SecondMenu": "Statistics",
+        "View": "StatisticsView"
       }
     ],
     "RoleName": "Operator",

+ 19 - 37
Venus/Venus_UI/Config/Menu_VenusSE.json

@@ -17,7 +17,7 @@
         "FirstMenu": "Operation",
         "Permission": 2,
         "SecondMenu": "TM",
-        "View": "DETMOperationView"
+        "View": "SETMOperationView"
       },
       {
         "FirstMenu": "Operation",
@@ -86,12 +86,6 @@
         "View": "RFCalibrationView"
       },
       {
-        "FirstMenu": "PMA",
-        "Permission": 2,
-        "SecondMenu": "Statistics",
-        "View": "StatisticsView"
-      },
-      {
         "FirstMenu": "PMB",
         "Permission": 2,
         "SecondMenu": "Operation",
@@ -140,12 +134,6 @@
         "View": "RFCalibrationView"
       },
       {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Statistics",
-        "View": "StatisticsView"
-      },
-      {
         "FirstMenu": "Configuration",
         "Permission": 2,
         "SecondMenu": "System Config",
@@ -186,6 +174,12 @@
         "Permission": 2,
         "SecondMenu": "Data History",
         "View": "DataHistoryView"
+      },
+      {
+        "FirstMenu": "DataLog",
+        "Permission": 2,
+        "SecondMenu": "Statistics",
+        "View": "StatisticsView"
       }
     ],
     "RoleName": "Manager",
@@ -279,12 +273,6 @@
         "View": "RFCalibrationView"
       },
       {
-        "FirstMenu": "PMA",
-        "Permission": 2,
-        "SecondMenu": "Statistics",
-        "View": "StatisticsView"
-      },
-      {
         "FirstMenu": "PMB",
         "Permission": 2,
         "SecondMenu": "Operation",
@@ -333,12 +321,6 @@
         "View": "RFCalibrationView"
       },
       {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Statistics",
-        "View": "StatisticsView"
-      },
-      {
         "FirstMenu": "Configuration",
         "Permission": 2,
         "SecondMenu": "System Config",
@@ -379,6 +361,12 @@
         "Permission": 2,
         "SecondMenu": "Data History",
         "View": "DataHistoryView"
+      },
+      {
+        "FirstMenu": "DataLog",
+        "Permission": 2,
+        "SecondMenu": "Statistics",
+        "View": "StatisticsView"
       }
     ],
     "RoleName": "Engineer",
@@ -472,12 +460,6 @@
         "View": "RFCalibrationView"
       },
       {
-        "FirstMenu": "PMA",
-        "Permission": 2,
-        "SecondMenu": "Statistics",
-        "View": "StatisticsView"
-      },
-      {
         "FirstMenu": "PMB",
         "Permission": 2,
         "SecondMenu": "Operation",
@@ -526,12 +508,6 @@
         "View": "RFCalibrationView"
       },
       {
-        "FirstMenu": "PMB",
-        "Permission": 2,
-        "SecondMenu": "Statistics",
-        "View": "StatisticsView"
-      },
-      {
         "FirstMenu": "Configuration",
         "Permission": 2,
         "SecondMenu": "System Config",
@@ -572,6 +548,12 @@
         "Permission": 2,
         "SecondMenu": "Data History",
         "View": "DataHistoryView"
+      },
+      {
+        "FirstMenu": "DataLog",
+        "Permission": 2,
+        "SecondMenu": "Statistics",
+        "View": "StatisticsView"
       }
     ],
     "RoleName": "Technician",