Просмотр исходного кода

Simulator PMC update

# Conflicts:
#	Venus/Venus_Simulator/Instances/SimulatorSystem.cs
Intern01 1 год назад
Родитель
Сommit
b1f52bbe8a

+ 156 - 1
Venus/Venus_RT/Config/PM/Kepler2200A/Kepler2200AInterlock.xml

@@ -34,7 +34,7 @@
     <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
   </Action>
 
-  <Action do="DO_PV12" value="true" tip="PV21" tip.zh-CN="" tip.en-US="DO-04" >
+  <Action do="DO_PV21" value="true" tip="PV21" tip.zh-CN="" tip.en-US="DO-04" >
     <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
     <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
     <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
@@ -57,4 +57,159 @@
     <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
     <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
   </Action>
+  
+  <Action do="DO_PV32" value="true" tip="PV32" tip.zh-CN="" tip.en-US="DO-07" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  <Action do="DO_PV41" value="true" tip="PV41" tip.zh-CN="" tip.en-US="DO-08" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  <Action do="DO_PV42" value="true" tip="PV42" tip.zh-CN="" tip.en-US="DO-09" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  <Action do="DO_N2_Valve" value="true" tip="N2 Valve" tip.zh-CN="" tip.en-US="DO-10" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+    <Limit do="DO_Soft_Pumping_Valve"		value="false" tip="Soft Pumping Valve"		tip.zh-CN="" tip.en-US="DO-22" />
+    <Limit do="DO_Fast_Pumping_Valve"	value="false" tip="Fast Pumping Valve"	tip.zh-CN="" tip.en-US="DO-23" />
+  </Action>
+
+  <Action do="DO_MFC1_Valve" value="true" tip="MFC1 Valve" tip.zh-CN="" tip.en-US="DO-11" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+  
+  <Action do="DO_MFC2_Valve" value="true" tip="MFC2 Valve" tip.zh-CN="" tip.en-US="DO-12" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  <Action do="DO_MFC3_Valve" value="true" tip="MFC3 Valve" tip.zh-CN="" tip.en-US="DO-13" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  <Action do="DO_MFC4_Valve" value="true" tip="MFC4 Valve" tip.zh-CN="" tip.en-US="DO-14" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  <Action do="DO_MFC5_Valve" value="true" tip="MFC5 Valve" tip.zh-CN="" tip.en-US="DO-15" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+  
+  <Action do="DO_MFC6_Valve" value="true" tip="MFC6 Valve" tip.zh-CN="" tip.en-US="DO-16" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+  
+  <Action do="DO_MFC7_Valve" value="true" tip="MFC7 Valve" tip.zh-CN="" tip.en-US="DO-17" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  <Action do="DO_MFC8_Valve" value="true" tip="MFC8 Valve" tip.zh-CN="" tip.en-US="DO-18" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+  </Action>
+
+  
+  <Action do="DO_Gas_Final_Valve" value="true" tip="Gas final valve" tip.zh-CN="" tip.en-US="DO-21" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+  </Action>
+
+  <Action do="DO_Soft_Pumping_Valve" value="true" tip="Soft Pumping Valve" tip.zh-CN="" tip.en-US="DO-22">
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit do="DO_N2_Valve"			value="false" tip="N2 Valve"			tip.zh-CN="" tip.en-US="DO-10" />
+  </Action>
+  
+  <Action do="DO_Fast_Pumping_Valve" value="true" tip="Fast Pumping Valve" tip.zh-CN="" tip.en-US="DO-23" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit do="DO_N2_Valve"			value="false" tip="N2 Valve"			tip.zh-CN="" tip.en-US="DO-10" />
+  </Action>
+
+  <Action do="DO_Slit_Door_Open" value="true" tip="Slit Door Open" tip.zh-CN="" tip.en-US="DO-24" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+    <Limit di="DI_Arm_Not_Extend_to_PM"	value="true" tip="Arm Not Extend  to PM"	tip.zh-CN="" tip.en-US="DI-76" />
+
+  </Action>
+
+  
+  <Action do="DO_Slit_Door_Close" value="true" tip="Slit Door Close" tip.zh-CN="" tip.en-US="DO-25" >
+    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
+    <Limit di="DI_Arm_Not_Extend_to_PM"	value="true" tip="Arm Not Extend  to PM"	tip.zh-CN="" tip.en-US="DI-76" />
+  </Action>
+
+  <Action do="DO_Turbo_Pump_Pumping_Valve" value="true" tip="Turbo Pump Pumping Valve" tip.zh-CN="" tip.en-US="DO-29" >
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
+  </Action>
+
+  <Action do="DO_Turbo_Pump_Pumping_Valve" value="true" tip="Turbo Pump Purge Valve" tip.zh-CN="" tip.en-US="DO-30" >
+    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
+  </Action>
+
+
+  <Action do="DO_S_Valve_Heater_On" value="true" tip="S-Valve Heater On" tip.zh-CN="" tip.en-US="DO-33" >
+    <Limit di="DI_S_Valve_OT_Switch_Alarm"			value="false" tip="S_Valve OT Switch Alarm"			tip.zh-CN="" tip.en-US="DI-66"/> 
+  </Action>
+
+
+  <Action do="DO_Lid_Up" value="true" tip="Lid UP" tip.zh-CN="" tip.en-US="DO-50">
+    <Limit di="DI_Lid_Up_Limit_Pos_SW"			value="false" tip="Lid Up Limit Pos SW"			tip.zh-CN="" tip.en-US="DI-74"/>
+  </Action>
+
+  <Action do="DO_Lid_Down" value="true" tip="Lid Down" tip.zh-CN="" tip.en-US="DO-51">
+    <Limit di="DI_Lid_Down_Limit_Pos_SW"			value="false" tip="Lid Down Limit Pos SW"			tip.zh-CN="" tip.en-US="DI-75"/>
+  </Action>
 </Interlock>

+ 8 - 3
Venus/Venus_Simulator/Config/UILayout.xml

@@ -51,9 +51,14 @@
 
 	<Navigation Id="PMC" Name="PMC" >
 
-		<SubView Id="io3" Name="IO-PMC" ViewClass="Venus_Simulator.Views.SimulatorIo3View" Assembly="Venus_Simulator"/>		
-
-	</Navigation>
+		<SubView Id="io3" Name="IO-PMC" ViewClass="Venus_Simulator.Views.SimulatorIo3View" Assembly="Venus_Simulator"/>
+    <SubView Id="SkyPumpPMC" Name="SkyPumpPMC" ViewClass="Venus_Simulator.Views.SimuSkyPumpPMCView" Assembly="Venus_Simulator" />
+    <SubView Id="EdwardsPumpPMC" Name="EdwardsPumpPMC" ViewClass="Venus_Simulator.Views.SimuEdwardsPumpPMCView" Assembly="Venus_Simulator"/>
+    <SubView Id="AdTecRFGPMC" Name="AdTecRFGPMC" ViewClass="Venus_Simulator.Views.SimuAdTecGeneratorPMCView" Assembly="Venus_Simulator"/>
+    <SubView Id="AdTecMatchPMC" Name="AdTecMatchPMC" ViewClass="Venus_Simulator.Views.SimuAdTecMatchPMCView" Assembly="Venus_Simulator" />
+    <SubView Id="SMCChillerPMC" Name="SMCChillerPMC" ViewClass="Venus_Simulator.Views.SimuSMCChillerPMCView" Assembly="Venus_Simulator" />
+    <SubView Id="SMCChillerGridPMC" Name="Grid Chiller" ViewClass="Venus_Simulator.Views.SimuSMCChillerGridPMCView" Assembly="Venus_Simulator"/>
+  </Navigation>
 
 
 	<Navigation Id="TM" Name="TM">

+ 72 - 0
Venus/Venus_Simulator/Devices/AdTecGeneratorMockPMC.cs

@@ -0,0 +1,72 @@
+using System;
+using System.Threading;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class AdTecGeneratorMockPMC : SerialPortDeviceSimulator
+    {
+        public enum GeneratorStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        public static GeneratorStatus _simGeneratorStatus;
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM93";
+
+        public AdTecGeneratorMockPMC() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simGeneratorStatus = GeneratorStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string sRes = string.Empty;
+
+            if (message.Contains(EOF))
+            {
+                message = message.Remove(message.Length - 1);
+            }
+
+            switch (message)
+            {
+                case "Q":
+                    if (_simGeneratorStatus == GeneratorStatus.ON)
+                    {
+                        sRes = "2010000 12345 00900 00100 45678\r";
+                    }
+                    else if (_simGeneratorStatus == GeneratorStatus.OFF)
+                    {
+                        sRes = "2000000 12345 00000 00000 45678\r";
+                    }
+                    break;
+                case "G":
+                    _simGeneratorStatus = GeneratorStatus.ON;
+                    sRes = "\r";
+                    break;
+                case "S":
+                    _simGeneratorStatus = GeneratorStatus.OFF;
+                    sRes = "\r";
+                    break;
+                default:
+                    break;
+            }
+
+
+            //string[] strs = message.Split(MSG_DELIMITER);
+
+            //Thread.Sleep(2 * 1000);
+
+            sRes += "\r";
+            OnWriteMessage(sRes);
+        }
+    }
+}

+ 41 - 0
Venus/Venus_Simulator/Devices/AdTecMatchMockPMC.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Threading;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class AdTecMatchMockPMC : SerialPortDeviceSimulator
+    {
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '\r';
+        private const string MOCKUP_PORT = "COM94";
+
+        public AdTecMatchMockPMC() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            message = message.TrimEnd('\r');
+
+            string[] strs = message.Split(MSG_DELIMITER);
+
+            string sRes = string.Empty;
+
+            if (message.Contains("$APRR"))
+            {
+                sRes = "$APRR10E1D5";
+            }
+            else
+            {
+                sRes = "S34000C0000000000000080020015A273B00700700400005C095210";
+            }
+
+            Thread.Sleep(2 * 1000);
+            OnWriteMessage(sRes + "\r");
+        }
+    }
+}

+ 78 - 0
Venus/Venus_Simulator/Devices/EdwardsPumpMockPMC.cs

@@ -0,0 +1,78 @@
+using System;
+using System.Threading;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class EdwardsPumpMockPMC : SerialPortDeviceSimulator
+    {
+        public enum SimEdwardsPumpStatus
+        {
+            Open,
+            Close,
+            OnLine,
+            OffLine,
+        }
+
+        public static SimEdwardsPumpStatus _simPumpStatus;
+        private const string EOF = "\r\n";
+        private const char MSG_DELIMITER = ' ';
+        private const string MOCKUP_PORT = "COM90";
+
+        public EdwardsPumpMockPMC() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simPumpStatus = SimEdwardsPumpStatus.Close;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string[] strs = message.Split('\r');
+
+            string sRes = string.Empty;
+
+            foreach (var s2 in strs)
+            {
+                if (s2.Length < 1) continue;
+
+                switch (s2)
+                {
+                    case "/":
+                        strs = null;
+                        sRes = string.Empty;
+                        break;
+                    case "!C1":
+                        _simPumpStatus = SimEdwardsPumpStatus.OnLine;
+                        sRes = "ERR 0" + "\r\n";
+                        break;
+                    case "!C0":
+                        _simPumpStatus = SimEdwardsPumpStatus.OffLine;
+                        sRes = "ERR 0" + "\r\n";
+                        break;
+                    case "!P1":
+                        _simPumpStatus = SimEdwardsPumpStatus.Open;
+                        sRes = "ERR 0" + "\r\n";
+                        break;
+                    case "!P2":
+                        _simPumpStatus = SimEdwardsPumpStatus.Close;
+                        sRes = "ERR 0" + "\r\n";
+                        break;
+                    case "?P":
+                        if (_simPumpStatus == SimEdwardsPumpStatus.Open)
+                            sRes = "4" + "\r\n";
+                        else if (_simPumpStatus == SimEdwardsPumpStatus.Close)
+                            sRes = "0" + "\r\n";
+                        else
+                            sRes = "0" + "\r\n";
+                        break;
+                    default:
+                        break;
+                }
+
+                OnWriteMessage(sRes);
+            }
+        }
+    }
+}

+ 20 - 1
Venus/Venus_Simulator/Devices/SMCChillerMockPMB.cs

@@ -56,7 +56,26 @@ namespace Venus_Simulator.Devices
 
         void SetTemp(int temp)
         {
-            string module = PortName == "COM43" ? "PMA" : "PMB";
+            string module;//= PortName == "COM43" ? "PMA" : "PMB";
+            switch (PortName)
+            {
+                case "COM43":
+                case "COM53":
+                    module = "PMA";
+                    break;
+                case "COM45":
+                case "COM55":
+                    module = "PMB";
+                     break;
+                case "COM97":
+                case "COM57":
+                    module = "PMC";
+                    break;     
+                default:
+                    module = "PMB";
+                    break;
+            }
+               
             double _OffsetTemp = SystemConfig.Instance.GetValue<double>($"{module}.Chiller.ChillerTemperatureOffset");
             SimulatorSystem.Instance.SetCoolantOutletTemp(module, temp / 10 + (int)_OffsetTemp);
         }

+ 62 - 0
Venus/Venus_Simulator/Devices/SkyPumpMockPMC.cs

@@ -0,0 +1,62 @@
+using System;
+using System.Threading;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class SkyPumpMockPMC : SerialPortDeviceSimulator
+    {
+        public enum SimPumpStatus
+        {
+            Open,
+            Close,
+        }
+
+        public static SimPumpStatus _simPumpStatus;
+        private const string EOF = "\r\n";
+        private const char MSG_DELIMITER = ' ';
+        private const string MOCKUP_PORT = "COM71";
+
+        public SkyPumpMockPMC() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simPumpStatus = SimPumpStatus.Open;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string[] strs = message.Split('\r');
+
+            string sRes = string.Empty;
+
+            foreach (var s2 in strs)
+            {
+                if (s2.Length < 1) continue;
+
+                switch (s2)
+                {
+                    case "@00READ_RUN_PARA":
+                        if (_simPumpStatus == SimPumpStatus.Open)
+                            sRes = "@00RUN_PARA050308804314101000003\0\0hh\0\0\r\n";
+                        else if (_simPumpStatus == SimPumpStatus.Close)
+                            sRes = "@00RUN_PARA050308804314101000003\0\0??\0\0\r\n";
+                        break;
+                    case "@00CON_FDP_ON":
+                        _simPumpStatus = SimPumpStatus.Open;
+                        sRes = "@00FDP_ONOK" + "\0\r\n";
+                        break;
+                    case "@00CON_FDP_OFF":
+                        _simPumpStatus = SimPumpStatus.Close;
+                        sRes = "@00FDP_OFFOK" + "\0\r\n";
+                        break;
+                    default:
+                        break;
+                }
+
+                OnWriteMessage(sRes);
+            }
+        }
+    }
+}

+ 232 - 159
Venus/Venus_Simulator/Instances/SimulatorSystem.cs

@@ -54,7 +54,8 @@ namespace Venus_Simulator.Instances
     
                 SetDefaultValue(ModuleName.PMA, SimulatorJetChamber.CurrentPMAChamber);
                 SetDefaultValue(ModuleName.PMB, SimulatorJetChamber.CurrentPMBChamber);
-                SetTMDefaultValue();
+                SetDefaultValue(ModuleName.PMC, SimulatorJetChamber.CurrentPMCChamber);
+            SetTMDefaultValue();
             
           
 
@@ -66,194 +67,266 @@ namespace Venus_Simulator.Instances
         private void SetDefaultValue(ModuleName mod,JetChamber jetChamber)
         {
 
-            if (jetChamber == JetChamber.Venus)
+            switch (jetChamber)
             {
-                // chamber
-                IO.DI[$"{mod}.DI_PM_Lid_Closed"].Value = true;
-                IO.DI[$"{mod}.DI_PM_ATM_SW"].Value = true;
-                IO.DI[$"{mod}.DI_PM_VAC_SW"].Value = false;
-                IO.DI[$"{mod}.DI_PCW_Flow_SW"].Value = true;
-                IO.DI[$"{mod}.DI_Water_Leak_Sensor"].Value = true;
-
-                IO.DI[$"{mod}.DI_Lift_Pin_Up_POS"].Value = false;
-                IO.DI[$"{mod}.DI_Lift_Pin_Down_POS"].Value = true;
-                IO.DI[$"{mod}.DI_RF_Generator_Interlock"].Value = true;
-                IO.DI[$"{mod}.DI_Source_RF_Fan"].Value = true;
-                IO.DI[$"{mod}.DI_Turbo_Pump_Interlock"].Value = true;
+                case JetChamber.Venus:
+                    IO.DI[$"{mod}.DI_PM_Lid_Closed"].Value = true;
+                    IO.DI[$"{mod}.DI_PM_ATM_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_PM_VAC_SW"].Value = false;
+                    IO.DI[$"{mod}.DI_PCW_Flow_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_Water_Leak_Sensor"].Value = true;
+
+                    IO.DI[$"{mod}.DI_Lift_Pin_Up_POS"].Value = false;
+                    IO.DI[$"{mod}.DI_Lift_Pin_Down_POS"].Value = true;
+                    IO.DI[$"{mod}.DI_RF_Generator_Interlock"].Value = true;
+                    IO.DI[$"{mod}.DI_Source_RF_Fan"].Value = true;
+                    IO.DI[$"{mod}.DI_Turbo_Pump_Interlock"].Value = true;
+
+                    IO.DI[$"{mod}.DI_Slit_Door_Open_POS"].Value = false;
+                    IO.DI[$"{mod}.DI_Slit_Door_Close_POS"].Value = true;
+                    IO.DI[$"{mod}.DI_CDA_Pressure"].Value = true;
+                    IO.DI[$"{mod}.DI_Coolant_Inlet_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Coolant_Outlet_TC_Broken_Alarm"].Value = true;
+
+                    IO.DI[$"{mod}.DI_Chamber_Pressure_10t_Gauge_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Process_Pressure_100mt_Gauge_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Chamber_Pressure_760t_Gauge_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Pressure_760t_Gauge_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_LL_Pressure_760t_Gauge_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_ESC_He_Pressure_100t_Gauge_Alarm"].Value = false;
+
+                    IO.DI[$"{mod}.DI_Valve_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_Valve_Control_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Valve_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Valve_Heater_On_FB"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_TC_Deviation_out_of_range"].Value = false;
+
+                    IO.DI[$"{mod}.DI_Foreline_Control_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Heater_On_FB"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_Control_TC_Broken_Alarm"].Value = false;
+
+                    IO.DI[$"{mod}.DI_CHB_Wall_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_Heater_On_FB"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_OT_SW_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_PN2_Pressure_SW"].Value = true;
+
+                    IO.DI[$"{mod}.DI_MFC1_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC2_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC3_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC4_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC5_Pressure_SW"].Value = true;
+
+                    IO.DI[$"{mod}.DI_MFC6_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC7_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC8_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_He_Pressure_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_ESC_He_Pressure_100t_Gauge_Alarm"].Value = false;
+
+                    IO.DI[$"{mod}.DI_Loadlock_Lid_Closed"].Value = true;
+                    IO.DI[$"{mod}.DI_Loadlock_Arm_Extend_POS"].Value = false;
+                    IO.DI[$"{mod}.DI_Loadlock_Arm_Retract_POS"].Value = true;
+                    IO.DI[$"{mod}.DI_Small_Wafer_In_POS"].Value = false;
+                    IO.DI[$"{mod}.DI_Big_Wafer_In_POS"].Value = false;
+
+                    IO.DI[$"{mod}.DI_Loadlock_ATM_SW"].Value = false;
+                    IO.DI[$"{mod}.DI_Gas_Box_Door_SW"].Value = true;
+                    IO.DI[$"{mod}.DI_Gas_Box_Pressure_SW"].Value = true;
+
 
-                IO.DI[$"{mod}.DI_Slit_Door_Open_POS"].Value = false;
-                IO.DI[$"{mod}.DI_Slit_Door_Close_POS"].Value = true;
-                IO.DI[$"{mod}.DI_CDA_Pressure"].Value = true;
-                IO.DI[$"{mod}.DI_Coolant_Inlet_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Coolant_Outlet_TC_Broken_Alarm"].Value = true;
-
-                IO.DI[$"{mod}.DI_Chamber_Pressure_10t_Gauge_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Process_Pressure_100mt_Gauge_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Chamber_Pressure_760t_Gauge_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Foreline_Pressure_760t_Gauge_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_LL_Pressure_760t_Gauge_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_ESC_He_Pressure_100t_Gauge_Alarm"].Value = false;
-
-                IO.DI[$"{mod}.DI_Valve_TC_Deviation_out_of_range"].Value = false;
-                IO.DI[$"{mod}.DI_Valve_Control_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Valve_Monitor_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Valve_Heater_On_FB"].Value = false;
-                IO.DI[$"{mod}.DI_Foreline_TC_Deviation_out_of_range"].Value = false;
-
-                IO.DI[$"{mod}.DI_Foreline_Control_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Foreline_Monitor_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Foreline_Heater_On_FB"].Value = false;
-                IO.DI[$"{mod}.DI_CHB_Wall_TC_Deviation_out_of_range"].Value = false;
-                IO.DI[$"{mod}.DI_CHB_Wall_Control_TC_Broken_Alarm"].Value = false;
-
-                IO.DI[$"{mod}.DI_CHB_Wall_Monitor_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_CHB_Wall_Heater_On_FB"].Value = false;
-                IO.DI[$"{mod}.DI_CHB_Wall_OT_SW_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_PN2_Pressure_SW"].Value = true;
-
-                IO.DI[$"{mod}.DI_MFC1_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_MFC2_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_MFC3_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_MFC4_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_MFC5_Pressure_SW"].Value = true;
-
-                IO.DI[$"{mod}.DI_MFC6_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_MFC7_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_MFC8_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_He_Pressure_SW"].Value = true;
-                IO.DI[$"{mod}.DI_ESC_He_Pressure_100t_Gauge_Alarm"].Value = false;
-
-                IO.DI[$"{mod}.DI_Loadlock_Lid_Closed"].Value = true;
-                IO.DI[$"{mod}.DI_Loadlock_Arm_Extend_POS"].Value = false;
-                IO.DI[$"{mod}.DI_Loadlock_Arm_Retract_POS"].Value = true;
-                IO.DI[$"{mod}.DI_Small_Wafer_In_POS"].Value = false;
-                IO.DI[$"{mod}.DI_Big_Wafer_In_POS"].Value = false;
 
-                IO.DI[$"{mod}.DI_Loadlock_ATM_SW"].Value = false;
-                IO.DI[$"{mod}.DI_Gas_Box_Door_SW"].Value = true;
-                IO.DI[$"{mod}.DI_Gas_Box_Pressure_SW"].Value = true;
+                    //// pressure
+                    SetAiValue($"{mod}.AI_Foreline_Pressure_760t", 5001);
+                    //SetAiValue($"{mod}.AI_Chamber_Pressure_10t", 5000);
+                    SetAiValue($"{mod}.AI_Process_Pressure_100mt", 1000);
+                    //SetAiValue($"{mod}.AI_Chamber_Pressure_10t", ATM_PRESSURE);
+                    SetAiValue($"{mod}.AI_Chamber_Pressure_Virtual", PROCESS_GAUGE);
 
+                    SetAiValue($"{mod}.AI_Chamber_Pressure_10t", 5000);
+                    SetAiValue($"{mod}.AI_LL_Pressure_760t", ATM_LoadLock_PRESSURE);
 
+                    //// Temperature
 
-                //// pressure
-                SetAiValue($"{mod}.AI_Foreline_Pressure_760t", 5001);
-                //SetAiValue($"{mod}.AI_Chamber_Pressure_10t", 5000);
-                SetAiValue($"{mod}.AI_Process_Pressure_100mt", 1000);
-                //SetAiValue($"{mod}.AI_Chamber_Pressure_10t", ATM_PRESSURE);
-                SetAiValue($"{mod}.AI_Chamber_Pressure_Virtual", PROCESS_GAUGE);
+                    SetAiValue($"{mod}.AI_Valve_Control_TC_Temp", 28);
+                    SetAiValue($"{mod}.AI_Valve_Monitor_TC_Temp", 27);
+                    SetAiValue($"{mod}.AI_Fline_Control_TC_Temp", 28);
+                    SetAiValue($"{mod}.AI_Fline_Monitor_TC_Temp", 27);
+                    SetAiValue($"{mod}.AI_CHB_Wall_Control_TC_Temp", 28);
+                    SetAiValue($"{mod}.AI_CHB_Wall_Monitor_TC_Temp", 27);
+                    SetAiValue($"{mod}.AI_Coolant_Inlet_Temp", 28);
+                    //if (mod == ModuleName.PMA)
+                    //{
+                    //    SetAiValue($"{mod}.AI_Coolant_Outlet_Temp", 29);
+                    //}
+                    //else if (mod == ModuleName.PMB)
+                    //{
+                    //    SetAiValue($"{mod}.AI_Coolant_Outlet_Temp", 30);
+                    //}
 
-                SetAiValue($"{mod}.AI_Chamber_Pressure_10t", 5000);
-                SetAiValue($"{mod}.AI_LL_Pressure_760t", ATM_LoadLock_PRESSURE);
-
-                //// Temperature
-
-                SetAiValue($"{mod}.AI_Valve_Control_TC_Temp", 28);
-                SetAiValue($"{mod}.AI_Valve_Monitor_TC_Temp", 27);
-                SetAiValue($"{mod}.AI_Fline_Control_TC_Temp", 28);
-                SetAiValue($"{mod}.AI_Fline_Monitor_TC_Temp", 27);
-                SetAiValue($"{mod}.AI_CHB_Wall_Control_TC_Temp", 28);
-                SetAiValue($"{mod}.AI_CHB_Wall_Monitor_TC_Temp", 27);
-                SetAiValue($"{mod}.AI_Coolant_Inlet_Temp", 28);
-                //if (mod == ModuleName.PMA)
-                //{
-                //    SetAiValue($"{mod}.AI_Coolant_Outlet_Temp", 29);
-                //}
-                //else if (mod == ModuleName.PMB)
-                //{
-                //    SetAiValue($"{mod}.AI_Coolant_Outlet_Temp", 30);
-                //}
-
-                // Datetime
-                SetAiValue($"{mod}.AI_Year", DateTime.Today.Year);
-                SetAiValue($"{mod}.AI_Month", DateTime.Today.Month);
-                SetAiValue($"{mod}.AI_Day", DateTime.Today.Day);
-                SetAiValue($"{mod}.AI_Time", DateTime.Now.Hour);
-                SetAiValue($"{mod}.AI_Minute", DateTime.Now.Minute);
-                SetAiValue($"{mod}.AI_Second", DateTime.Now.Second);
-            }
-            else
-            {
-                // chamber
-                IO.DI[$"{mod}.DI_Lid_Closed"].Value = true;
-                IO.DI[$"{mod}.DI_ATM_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_VAC_Switch"].Value = false;
+                    // Datetime
+                    SetAiValue($"{mod}.AI_Year", DateTime.Today.Year);
+                    SetAiValue($"{mod}.AI_Month", DateTime.Today.Month);
+                    SetAiValue($"{mod}.AI_Day", DateTime.Today.Day);
+                    SetAiValue($"{mod}.AI_Time", DateTime.Now.Hour);
+                    SetAiValue($"{mod}.AI_Minute", DateTime.Now.Minute);
+                    SetAiValue($"{mod}.AI_Second", DateTime.Now.Second);
+                    break;
+               case JetChamber.Kepler2300:
+                    // chamber
+                    IO.DI[$"{mod}.DI_Lid_Closed"].Value = true;
+                    IO.DI[$"{mod}.DI_ATM_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_VAC_Switch"].Value = false;
 
-                IO.DI[$"{mod}.DI_Water_Leak_Sensor"].Value = true;
+                    IO.DI[$"{mod}.DI_Water_Leak_Sensor"].Value = true;
 
-                IO.DI[$"{mod}.DI_Lift_Pin_Up_POS"].Value = false;
-                IO.DI[$"{mod}.DI_Lift_Pin_Down_POS"].Value = true;
-                IO.DI[$"{mod}.DI_Source_RF_Generator_Interlock"].Value = true;
-                IO.DI[$"{mod}.DI_Source_RF_Fan"].Value = true;
-                IO.DI[$"{mod}.DI_Turbo_Pump_Interlock"].Value = true;
+                    IO.DI[$"{mod}.DI_Lift_Pin_Up_POS"].Value = false;
+                    IO.DI[$"{mod}.DI_Lift_Pin_Down_POS"].Value = true;
+                    IO.DI[$"{mod}.DI_Source_RF_Generator_Interlock"].Value = true;
+                    IO.DI[$"{mod}.DI_Source_RF_Fan"].Value = true;
+                    IO.DI[$"{mod}.DI_Turbo_Pump_Interlock"].Value = true;
 
-                IO.DI[$"{mod}.DI_Slit_Door_Open_POS"].Value = false;
-                IO.DI[$"{mod}.DI_Slit_Door_Close_POS"].Value = true;
-                IO.DI[$"{mod}.DI_CDA_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_Slit_Door_Open_POS"].Value = false;
+                    IO.DI[$"{mod}.DI_Slit_Door_Close_POS"].Value = true;
+                    IO.DI[$"{mod}.DI_CDA_Pressure_Switch"].Value = true;
 
 
-                
-               
 
-                IO.DI[$"{mod}.DI_S_Valve_TC_Deviation_out_of_range"].Value = false;
-                IO.DI[$"{mod}.DI_S_Valve_Control_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_S_Valve_Monitor_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_S_Valve_Heater_On_FB"].Value = false;
 
-                IO.DI[$"{mod}.DI_Foreline_TC_Deviation_out_of_range"].Value = false;
-                IO.DI[$"{mod}.DI_Foreline_Control_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Foreline_Monitor_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_Foreline_Heater_On_FB"].Value = false;
 
-                IO.DI[$"{mod}.DI_CHB_Wall_TC_Deviation_out_of_range"].Value = false;
-                IO.DI[$"{mod}.DI_CHB_Wall_Control_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_S_Valve_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_S_Valve_Control_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_S_Valve_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_S_Valve_Heater_On_FB"].Value = false;
 
-                IO.DI[$"{mod}.DI_CHB_Wall_Monitor_TC_Broken_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_CHB_Wall_Heater_On_FB"].Value = false;
-                IO.DI[$"{mod}.DI_CHB_Wall_OT_Switch_Alarm"].Value = false;
-                IO.DI[$"{mod}.DI_PN2_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_Foreline_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Control_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Heater_On_FB"].Value = false;
 
-                IO.DI[$"{mod}.DI_MFC1_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_MFC2_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_MFC3_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_MFC4_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_MFC5_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_CHB_Wall_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_Control_TC_Broken_Alarm"].Value = false;
 
-                IO.DI[$"{mod}.DI_MFC6_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_MFC7_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_MFC8_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_ESC_He_Pressure_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_ESC_He_Pressure_100t_Guage_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_Heater_On_FB"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_Wall_OT_Switch_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_PN2_Pressure_Switch"].Value = true;
 
-                IO.DI[$"{mod}.DI_Gas_Box_Door_Switch"].Value = true;
-                IO.DI[$"{mod}.DI_Gas_Box_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC1_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC2_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC3_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC4_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC5_Pressure_Switch"].Value = true;
 
+                    IO.DI[$"{mod}.DI_MFC6_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC7_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC8_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_ESC_He_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_ESC_He_Pressure_100t_Guage_Alarm"].Value = false;
 
+                    IO.DI[$"{mod}.DI_Gas_Box_Door_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_Gas_Box_Pressure_Switch"].Value = true;
 
-                //// pressure
-                SetAiValue($"{mod}.AI_Foreline_Pressure_10t", 5001);
-                //SetAiValue($"{mod}.AI_Chamber_Pressure_10t", 5000);
-                SetAiValue($"{mod}.AI_Process_Pressure_100mt", 1000);
-                //SetAiValue($"{mod}.AI_Chamber_Pressure_760t", ATM_PRESSURE);
-                SetAiValue($"{mod}.AI_Chamber_Pressure_Virtual", PROCESS_GAUGE);
 
 
+                    //// pressure
+                    SetAiValue($"{mod}.AI_Foreline_Pressure_10t", 5001);
+                    //SetAiValue($"{mod}.AI_Chamber_Pressure_10t", 5000);
+                    SetAiValue($"{mod}.AI_Process_Pressure_100mt", 1000);
+                    //SetAiValue($"{mod}.AI_Chamber_Pressure_760t", ATM_PRESSURE);
+                    SetAiValue($"{mod}.AI_Chamber_Pressure_Virtual", PROCESS_GAUGE);
+
+
+
+                    //// Temperature
+
+                    SetAiValue($"{mod}.AI_S_Valve_Control_TC_Temp", 28);
+
+                    SetAiValue($"{mod}.AI_Foreline_Control_TC_Temp", 28);
+
+                    SetAiValue($"{mod}.AI_CHB_Wall_Control_TC_Temp", 28);
+
+
+                    // Datetime
+                    SetAiValue($"{mod}.AI_Year", DateTime.Today.Year);
+                    SetAiValue($"{mod}.AI_Month", DateTime.Today.Month);
+                    SetAiValue($"{mod}.AI_Day", DateTime.Today.Day);
+                    SetAiValue($"{mod}.AI_Time", DateTime.Now.Hour);
+                    SetAiValue($"{mod}.AI_Minute", DateTime.Now.Minute);
+                    SetAiValue($"{mod}.AI_Second", DateTime.Now.Second);
+                    break;
+
+                case JetChamber.Kepler2200A:
+                    IO.DI[$"{mod}.DI_Lid_Closed"].Value = true;
+                    IO.DI[$"{mod}.DI_ATM_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_VAC_Switch"].Value = false;
+
+                    IO.DI[$"{mod}.DI_Water_Leak_Sensor"].Value = true;
+
+                    IO.DI[$"{mod}.DI_Lift_Pin_Up_Position"].Value = false;
+                    IO.DI[$"{mod}.DI_Lift_Pin_Down_Position"].Value = true;
+                    IO.DI[$"{mod}.DI_Source_RF_Generator_Interlock"].Value = true;
+                    IO.DI[$"{mod}.DI_Source_RF_Fan"].Value = true;
+                    IO.DI[$"{mod}.DI_Turbo_Pump_Interlock"].Value = true;
+
+                    IO.DI[$"{mod}.DI_Slit_Door_Open_Position"].Value = false;
+                    IO.DI[$"{mod}.DI_Slit_Door_Close_Position"].Value = true;
+                    IO.DI[$"{mod}.DI_CDA_Pressure_Switch"].Value = true;
+
+                    IO.DI[$"{mod}.DI_S_Valve_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_S_Valve_Control_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_S_Valve_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_S_Valve_Heater_On_FB"].Value = false;
+
+                    IO.DI[$"{mod}.DI_Foreline_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Control_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_Foreline_Heater_On_FB"].Value = false;
+
+                    IO.DI[$"{mod}.DI_CHB_Wall_TC_Deviation_out_of_range"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_H-HT_Control_TC_Broken_Alarm"].Value = false;
+
+                    IO.DI[$"{mod}.DI_CHB_Wall_Monitor_TC_Broken_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_H-HT_Heater_On_FB"].Value = false;
+                    IO.DI[$"{mod}.DI_CHB_H-HT_OT_Switch_Alarm"].Value = false;
+                    IO.DI[$"{mod}.DI_PN2_Pressure_Switch"].Value = true;
+
+                    IO.DI[$"{mod}.DI_MFC1_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC2_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC3_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC4_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC5_Pressure_Switch"].Value = true;
+
+                    IO.DI[$"{mod}.DI_MFC6_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC7_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_MFC8_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_N2_Purge_Pressure_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_ESC_He_Pressure_100t_Guage_Alarm"].Value = false;
+
+                    IO.DI[$"{mod}.DI_Gas_Box_Door_Switch"].Value = true;
+                    IO.DI[$"{mod}.DI_Gas_Box_Pressure_Switch"].Value = true;
 
-                //// Temperature
+                    //// pressure
+                    SetAiValue($"{mod}.AI_Foreline_Pressure_10t", 5001);
+                    SetAiValue($"{mod}.AI_Process_Pressure_100mt", 1000);
+                    SetAiValue($"{mod}.AI_Chamber_Pressure_Virtual", PROCESS_GAUGE);
 
-                SetAiValue($"{mod}.AI_S_Valve_Control_TC_Temp", 28);
+                    //// Temperature
 
-                SetAiValue($"{mod}.AI_Foreline_Control_TC_Temp", 28);
+                    SetAiValue($"{mod}.AI_S_Valve_Control_TC_Temp", 28);
 
-                SetAiValue($"{mod}.AI_CHB_Wall_Control_TC_Temp", 28);
+                    SetAiValue($"{mod}.AI_Foreline_Control_TC_Temp", 28);
 
+                    SetAiValue($"{mod}.AI_CHB_H-HT_Control_TC_Temp", 28);
 
-                // Datetime
-                SetAiValue($"{mod}.AI_Year", DateTime.Today.Year);
-                SetAiValue($"{mod}.AI_Month", DateTime.Today.Month);
-                SetAiValue($"{mod}.AI_Day", DateTime.Today.Day);
-                SetAiValue($"{mod}.AI_Time", DateTime.Now.Hour);
-                SetAiValue($"{mod}.AI_Minute", DateTime.Now.Minute);
-                SetAiValue($"{mod}.AI_Second", DateTime.Now.Second);
+                    // Datetime
+                    SetAiValue($"{mod}.AI_Year", DateTime.Today.Year);
+                    SetAiValue($"{mod}.AI_Month", DateTime.Today.Month);
+                    SetAiValue($"{mod}.AI_Day", DateTime.Today.Day);
+                    SetAiValue($"{mod}.AI_Time", DateTime.Now.Hour);
+                    SetAiValue($"{mod}.AI_Minute", DateTime.Now.Minute);
+                    SetAiValue($"{mod}.AI_Second", DateTime.Now.Second);
+                    break;
             }
                
         }

+ 46 - 0
Venus/Venus_Simulator/Venus_Simulator.csproj

@@ -78,12 +78,16 @@
       <DependentUpon>App.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Devices\AdTecGeneratorMockPMC.cs" />
+    <Compile Include="Devices\AdTecMatchMockPMC.cs" />
     <Compile Include="Devices\AIRSYSChillerMock.cs" />
     <Compile Include="Devices\EdwardsPumpMockLL.cs" />
+    <Compile Include="Devices\EdwardsPumpMockPMC.cs" />
     <Compile Include="Devices\EdwardsPumpMockTM.cs" />
     <Compile Include="Devices\ESCHVMockPMA.cs" />
     <Compile Include="Devices\PendulumValveMockPMA.cs" />
     <Compile Include="Devices\SkyPumpMockLL.cs" />
+    <Compile Include="Devices\SkyPumpMockPMC.cs" />
     <Compile Include="Devices\SkyPumpMockTM.cs" />
     <Compile Include="Devices\TMSimulatorServer.cs" />
     <Compile Include="Devices\TurboPumpMockPMA.cs" />
@@ -98,12 +102,18 @@
     <Compile Include="Views\SimuAdTecGeneratorPMBView.xaml.cs">
       <DependentUpon>SimuAdTecGeneratorPMBView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuAdTecGeneratorPMCView.xaml.cs">
+      <DependentUpon>SimuAdTecGeneratorPMCView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuAdTecGeneratorView.xaml.cs">
       <DependentUpon>SimuAdTecGeneratorView.xaml</DependentUpon>
     </Compile>
     <Compile Include="Views\SimuAdTecMatchPMAView.xaml.cs">
       <DependentUpon>SimuAdTecMatchPMAView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuAdTecMatchPMCView.xaml.cs">
+      <DependentUpon>SimuAdTecMatchPMCView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuAdTecMatchPMBView.xaml.cs">
       <DependentUpon>SimuAdTecMatchPMBView.xaml</DependentUpon>
     </Compile>
@@ -119,6 +129,9 @@
     <Compile Include="Views\SimuEdwardsPumpLLView.xaml.cs">
       <DependentUpon>SimuEdwardsPumpLLView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuEdwardsPumpPMCView.xaml.cs">
+      <DependentUpon>SimuEdwardsPumpPMCView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuEdwardsPumpTMView.xaml.cs">
       <DependentUpon>SimuEdwardsPumpTMView.xaml</DependentUpon>
     </Compile>
@@ -149,6 +162,9 @@
     <Compile Include="Views\SimuSkyPumpLLView.xaml.cs">
       <DependentUpon>SimuSkyPumpLLView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuSkyPumpPMCView.xaml.cs">
+      <DependentUpon>SimuSkyPumpPMCView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuSkyPumpTMView.xaml.cs">
       <DependentUpon>SimuSkyPumpTMView.xaml</DependentUpon>
     </Compile>
@@ -164,12 +180,18 @@
     <Compile Include="Views\SimuSMCChillerGridPMAView.xaml.cs">
       <DependentUpon>SimuSMCChillerGridPMAView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuSMCChillerGridPMCView.xaml.cs">
+      <DependentUpon>SimuSMCChillerGridPMCView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuSMCChillerGridPMBView.xaml.cs">
       <DependentUpon>SimuSMCChillerGridPMBView.xaml</DependentUpon>
     </Compile>
     <Compile Include="Views\SimuSMCChillerPMAView.xaml.cs">
       <DependentUpon>SimuSMCChillerPMAView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuSMCChillerPMCView.xaml.cs">
+      <DependentUpon>SimuSMCChillerPMCView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuSMCChillerPMBView.xaml.cs">
       <DependentUpon>SimuSMCChillerPMBView.xaml</DependentUpon>
     </Compile>
@@ -268,6 +290,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuAdTecGeneratorPMCView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuAdTecGeneratorView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -276,6 +302,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuAdTecMatchPMCView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuAdTecMatchPMBView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -296,6 +326,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuEdwardsPumpPMCView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuEdwardsPumpTMView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -336,6 +370,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuSkyPumpPMCView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuSkyPumpTMView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -356,6 +394,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuSMCChillerGridPMCView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuSMCChillerGridPMBView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -364,6 +406,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuSMCChillerPMCView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuSMCChillerPMBView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>

+ 53 - 0
Venus/Venus_Simulator/Views/SimuAdTecGeneratorPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuAdTecGeneratorPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="1200">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuAdTecGeneratorPMCView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// Interaction logic for SimuAdTecGeneratorView.xaml
+    /// </summary>
+    public partial class SimuAdTecGeneratorPMCView : UserControl
+    {
+        public SimuAdTecGeneratorPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockAdTecGeneratorViewModelPMC();
+        }
+    }
+
+    class MockAdTecGeneratorViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "AdTec RFG PMB simulator"; }
+        }
+
+        public MockAdTecGeneratorViewModelPMC() : base("AdTecPMCRFG")
+        {
+            Init(new AdTecGeneratorMockPMC());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuAdTecMatchPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuAdTecMatchPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="800">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuAdTecMatchPMCView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// Interaction logic for SimuAdTecMatchView.xaml
+    /// </summary>
+    public partial class SimuAdTecMatchPMCView : UserControl
+    {
+        public SimuAdTecMatchPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockAdTecMatchViewModelPMC();
+        }
+    }
+
+    class MockAdTecMatchViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "AdTEC match PMB simulator"; }
+        }
+
+        public MockAdTecMatchViewModelPMC() : base("AdTecMatchPMBSimulator")
+        {
+            Init(new AdTecMatchMockPMC());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuEdwardsPumpPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuEdwardsPumpPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuEdwardsPumpPMCView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// SimuEdwardsPumpView.xaml 的交互逻辑
+    /// </summary>
+    public partial class SimuEdwardsPumpPMCView : UserControl
+    {
+        public SimuEdwardsPumpPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockEdwardsPumpViewModelPMC();
+        }
+    }
+
+    class MockEdwardsPumpViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Edwards pump PMC simulator"; }
+        }
+
+        public MockEdwardsPumpViewModelPMC() : base("EdwardsPumpPMCSimulator")
+        {
+            Init(new EdwardsPumpMockPMC());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuSMCChillerGridPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuSMCChillerGridPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuSMCChillerGridPMCView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// SimuSMCChillerPMBView.xaml 的交互逻辑
+    /// </summary>
+    public partial class SimuSMCChillerGridPMCView : UserControl
+    {
+        public SimuSMCChillerGridPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockSMCChillerGridViewModelPMC();
+        }
+    }
+
+    class MockSMCChillerGridViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "SMC Chiller PMC simulator"; }
+        }
+
+        public MockSMCChillerGridViewModelPMC() : base("SkyPumpPMCSimulator")
+        {
+            Init(new SMCChillerMock("COM57"));
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuSMCChillerPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuSMCChillerPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuSMCChillerPMCView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// SimuSMCChillerPMCView.xaml 的交互逻辑
+    /// </summary>
+    public partial class SimuSMCChillerPMCView : UserControl
+    {
+        public SimuSMCChillerPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockSMCChillerViewModelPMC();
+        }
+    }
+
+    class MockSMCChillerViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "SMC Chiller PMC simulator"; }
+        }
+
+        public MockSMCChillerViewModelPMC() : base("SMCChillerPMCSimulator")
+        {
+            Init(new SMCChillerMock("COM97"));
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuSkyPumpPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuSkyPumpPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuSkyPumpPMCView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// Interaction logic for SimuAdTecMatchView.xaml
+    /// </summary>
+    public partial class SimuSkyPumpPMCView : UserControl
+    {
+        public SimuSkyPumpPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockSkyPumpViewModelPMC();
+        }
+    }
+
+    class MockSkyPumpViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Sky pump PMC simulator"; }
+        }
+
+        public MockSkyPumpViewModelPMC() : base("SkyPumpPMCSimulator")
+        {
+            Init(new SkyPumpMockPMC());
+        }
+    }
+}