ソースを参照

add VenusSEPM class and IODefine && Set the pressure value in the simulation to always be no less than 0

zhouhr 1 年間 前
コミット
56f7c900fe

+ 53 - 53
Venus/Venus_Core/ValveType.cs

@@ -4,58 +4,58 @@ namespace Venus_Core
 {
    public enum ValveType
     {
-        PVN21,
-        PVN22,
-        PV11,
-        PV12,
-        PV21,
-        PV22,
-        PV31,
-        PV32,
-        PV41,
-        PV42,
-        N2,
-        Mfc1,
-        Mfc2,
-        Mfc3,
-        Mfc4,
-        Mfc5,
-        Mfc6,
-        Mfc7,
-        Mfc8,
-        PVHe1,
-        PVHe2,
-        GasFinal,
-        SoftPump,
-        FastPump,
-        CHBPurge,
-        TurboPumpPumping,
-        TurboPumpPurge,
-        Guage,
-        LoadlockVent,
-        LoadlockPumping,
-        PVHe3,
-        HeISO,
-        MainPurge,
-        PV51,
-        PV52,
-        PV61,
-        PV62,
-        PV71,
-        PV72,
-        PV81,
-        PV82,
-        PV91,
-        PV92,
-        PVA1,
-        PVA2,
-        PVB1,
-        PVB2,
-        PVC1,
-        PVC2,
-        Mfc9,
-        Mfc10,
-        Mfc11,
-        Mfc12,
+      PVN21,
+      PVN22,
+      PV11,
+      PV12,
+      PV21,
+      PV22,
+      PV31,
+      PV32,
+      PV41,
+      PV42,
+      N2,
+      Mfc1,
+      Mfc2,
+      Mfc3,
+      Mfc4,
+      Mfc5,
+      Mfc6,
+      Mfc7,
+      Mfc8,
+      PVHe1,
+      PVHe2,
+      GasFinal,
+      SoftPump,
+      FastPump,
+      CHBPurge,
+      TurboPumpPumping,
+      TurboPumpPurge,
+      Guage,
+      LoadlockVent,
+      LoadlockPumping,
+      PVHe3,
+      HeISO,
+      MainPurge,
+      PV51,
+      PV52,
+      PV61,
+      PV62,
+      PV71,
+      PV72,
+      PV81,
+      PV82,
+      PV91,
+      PV92,
+      PVA1,
+      PVA2,
+      PVB1,
+      PVB2,
+      PVC1,
+      PVC2,
+      Mfc9,
+      Mfc10,
+      Mfc11,
+      Mfc12,
     }
 }

+ 338 - 0
Venus/Venus_RT/Config/PM/VenusSE/VenusSEIoDefine.xml

@@ -0,0 +1,338 @@
+<?xml version="1.0"?>
+<IO_DEFINE xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
+
+	<!--文件根据IO LIST_PM_VNS_SE 20230905.xlsx生成-->
+	<!--生成时间:09/06/2023 10:44:54-->
+	<Dig_In>
+		<DI_ITEM Index="0"   Name="DI_Lid_Closed" Device="" Addr="w20.00" />
+		<DI_ITEM Index="1"   Name="DI_ATM_Switch" Device="ATM_SW" Addr="w20.01" />
+		<DI_ITEM Index="2"   Name="DI_PM_VAC_Switch" Device="" Addr="w20.02" />
+		<DI_ITEM Index="3"   Name="DI_Plate_Water_Flow_Switch" Device="" Addr="w20.03" />
+		<DI_ITEM Index="4"   Name="DI_Water_Leak_Sensor" Device="" Addr="w20.04" />
+		<DI_ITEM Index="5"   Name="DI_Lift_Pin_Up_Position" Device="" Addr="w20.05" />
+		<DI_ITEM Index="6"   Name="DI_Lift_Pin_Down_Position" Device="" Addr="w20.06" />
+		<DI_ITEM Index="7"   Name="DI_RF_HV_Interlock_OK" Device="Lid_VAC_Slit_Door_MATCH_INT_OK." Addr="w20.07" />
+		<DI_ITEM Index="8"   Name="" />
+		<DI_ITEM Index="9"   Name="DI_Turbo_Pump_Interlock" Device="Q7.12同步" Addr="w20.09" />
+		<DI_ITEM Index="10"  Name="DI_Slit_Door_Open_Position" Device="" Addr="w20.10" />
+		<DI_ITEM Index="11"  Name="DI_Slit_Door_Close_Position" Device="" Addr="w20.11" />
+		<DI_ITEM Index="12"  Name="DI_CDA_Pressure_Switch" Device="" Addr="w20.12" />
+		<DI_ITEM Index="13"  Name="DI_Coolant_Inlet_TC_Broken_Alarm" Device="TC模块信号" Addr="w20.13" />
+		<DI_ITEM Index="14"  Name="DI_Coolant_Outlet_TC_Broken_Alarm" Device="TC模块信号" Addr="w20.14" />
+		<DI_ITEM Index="15"  Name="DI_Chamber_Pressure_10t_Gauge_Alarm" Device="VG_PPH_真空值比较" Addr="w20.15" />
+		<DI_ITEM Index="16"  Name="DI_GASLINE_TC_Deviation_out_of_range" Device="值比较" Addr="w21.00" />
+		<DI_ITEM Index="17"  Name="DI_GASLINE_Control_TC_Broken_Alarm" Device="TC模块信号" Addr="w21.01" />
+		<DI_ITEM Index="18"  Name="DI_GASLINE_Monitor_TC_Broken_Alarm" Device="TC模块信号" Addr="w21.02" />
+		<DI_ITEM Index="19"  Name="DI_GASLINE_Heater_On_FB" Device="Q7.10同步" Addr="w21.03" />
+		<DI_ITEM Index="20"  Name="" />
+		<DI_ITEM Index="21"  Name="DI_Valve_Control_TC_Broken_Alarm" Device="" Addr="w21.05" />
+		<DI_ITEM Index="22"  Name="" />
+		<DI_ITEM Index="23"  Name="DI_Valve_Heater_On_FB" Device="Q7.13同步" Addr="w21.07" />
+		<DI_ITEM Index="24"  Name="" />
+		<DI_ITEM Index="25"  Name="DI_Foreline_Control_TC_Broken_Alarm" Device="TC模块信号" Addr="w21.09" />
+		<DI_ITEM Index="26"  Name="" />
+		<DI_ITEM Index="27"  Name="DI_Foreline_Heater_On_FB" Device="Q7.14同步" Addr="w21.11" />
+		<DI_ITEM Index="28"  Name="DI_CHB_Wall_TC_Deviation_out_of_range" Device="值比较" Addr="w21.12" />
+		<DI_ITEM Index="29"  Name="DI_CHB_Wall_Control_TC_Broken_Alarm" Device="TC模块信号" Addr="w21.13" />
+		<DI_ITEM Index="30"  Name="DI_CHB_Wall_Monitor_TC_Broken_Alarm" Device="TC模块信号" Addr="w21.14" />
+		<DI_ITEM Index="31"  Name="DI_CHB_Wall_Heater_On_FB" Device="Q7.15同步" Addr="w21.15" />
+		<DI_ITEM Index="32"  Name="DI_CHB_Wall_OT_Switch_Alarm" Device="" Addr="w22.00" />
+		<DI_ITEM Index="33"  Name=""/>
+		<DI_ITEM Index="34"  Name="DI_PN2_Pressure_Switch" Device="PGN2" Addr="w22.02" Note="Gas Box" />
+		<DI_ITEM Index="35"  Name="DI_MFC1_Pressure_Switch" Device="PG1" Addr="w22.03" Note="Gas Box" />
+		<DI_ITEM Index="36"  Name="DI_MFC2_Pressure_Switch" Device="PG2" Addr="w22.04" Note="Gas Box" />
+		<DI_ITEM Index="37"  Name="DI_MFC3_Pressure_Switch" Device="PG3" Addr="w22.05" Note="Gas Box" />
+		<DI_ITEM Index="38"  Name="DI_MFC4_Pressure_Switch" Device="PG4" Addr="w22.06" Note="Gas Box" />
+		<DI_ITEM Index="39"  Name="DI_MFC5_Pressure_Switch" Device="PG5" Addr="w22.07" Note="Gas Box" />
+		<DI_ITEM Index="40"  Name="DI_MFC6_Pressure_Switch" Device="PG6" Addr="w22.08" Note="Gas Box" />
+		<DI_ITEM Index="41"  Name="DI_MFC7_Pressure_Switch" Device="PG7" Addr="w22.09" Note="Gas Box" />
+		<DI_ITEM Index="42"  Name="DI_MFC8_Pressure_Switch" Device="PG8" Addr="w22.10" Note="Gas Box" />
+		<DI_ITEM Index="43"  Name="DI_He_Pressure_Switch" Device="PGHe" Addr="w22.11" Note="Gas Box" />
+		<DI_ITEM Index="44"  Name="" />
+		<DI_ITEM Index="45"  Name="" />
+		<DI_ITEM Index="46"  Name="" />
+		<DI_ITEM Index="47"  Name="" />
+		<DI_ITEM Index="48"  Name="" />
+		<DI_ITEM Index="49"  Name="" />
+		<DI_ITEM Index="50"  Name="" />
+		<DI_ITEM Index="51"  Name="DI_Gas_Box_Door_Switch" Device="" Addr="w23.03" />
+		<DI_ITEM Index="52"  Name="DI_Gas_Box_Pressure_Switch" Device="" Addr="w23.04" />
+		<DI_ITEM Index="53"  Name="DI_Turbo_Pump_Water_Flow_Switch" Device="" Addr="w23.05" />
+		<DI_ITEM Index="54"  Name="" />
+		<DI_ITEM Index="55"  Name="DI_SOURCE_RF_Water_Flow_Switch" Device="" Addr="w23.07" />
+		<DI_ITEM Index="56"  Name="" />
+		<DI_ITEM Index="57"  Name="" />
+		<DI_ITEM Index="58"  Name="" />
+		<DI_ITEM Index="59"  Name="DI_TM_Slit_Door_Closed" Device="" Addr="w23.11" />
+		<DI_ITEM Index="60"  Name="" />
+		<DI_ITEM Index="61"  Name="" />
+		<DI_ITEM Index="62"  Name="DI_Source_Match_interlock_ok" Device="" Addr="w23.14" />
+		<DI_ITEM Index="63"  Name="DI_Bias_Match_interlock_ok" Device="" Addr="w23.15" />
+		<DI_ITEM Index="64"  Name="" />
+		<DI_ITEM Index="65"  Name="" />
+		<DI_ITEM Index="66"  Name="DI_MFC9_Pressure_Switch" Device="PG9" Addr="w24.02" Note="Gas Box" />
+		<DI_ITEM Index="67"  Name="DI_MFC10_Pressure_Switch" Device="PG10" Addr="w24.03" Note="Gas Box" />
+		<DI_ITEM Index="68"  Name="DI_MFC11_Pressure_Switch" Device="PG11_SPARE_" Addr="w24.04" Note="Gas Box" />
+		<DI_ITEM Index="69"  Name="DI_MFC12_Pressure_Switch" Device="PG12" Addr="w24.05" Note="Gas Box" />
+		<DI_ITEM Index="70"  Name="" />
+		<DI_ITEM Index="71"  Name="" />
+		<DI_ITEM Index="72"  Name="" />
+		<DI_ITEM Index="73"  Name="" />
+		<DI_ITEM Index="74"  Name="" />
+		<DI_ITEM Index="75"  Name="" />
+		<DI_ITEM Index="76"  Name="" />
+		<DI_ITEM Index="77"  Name="" />
+		<DI_ITEM Index="78"  Name="" />
+		<DI_ITEM Index="79"  Name="" />
+		<DI_ITEM Index="80"  Name="" />
+		<DI_ITEM Index="81"  Name="" />
+		<DI_ITEM Index="82"  Name="" />
+		<DI_ITEM Index="83"  Name="" />
+		<DI_ITEM Index="84"  Name="" />
+		<DI_ITEM Index="85"  Name="" />
+		<DI_ITEM Index="86"  Name="" />
+		<DI_ITEM Index="87"  Name="" />
+		<DI_ITEM Index="88"  Name="" />
+		<DI_ITEM Index="89"  Name="" />
+		<DI_ITEM Index="90"  Name="" />
+		<DI_ITEM Index="91"  Name="" />
+		<DI_ITEM Index="92"  Name="" />
+		<DI_ITEM Index="93"  Name="" />
+		<DI_ITEM Index="94"  Name="" />
+		<DI_ITEM Index="95"  Name="" />
+		<DI_ITEM Index="96"  Name="" />
+		<DI_ITEM Index="97"  Name="" />
+		<DI_ITEM Index="98"  Name="" />
+		<DI_ITEM Index="99"  Name="" />
+		<DI_ITEM Index="100" Name="" />
+		<DI_ITEM Index="101" Name="" />
+		<DI_ITEM Index="102" Name="" />
+		<DI_ITEM Index="103" Name="" />
+		<DI_ITEM Index="104" Name="" />
+		<DI_ITEM Index="105" Name="" />
+		<DI_ITEM Index="106" Name="" />
+		<DI_ITEM Index="107" Name="" />
+		<DI_ITEM Index="108" Name="" />
+		<DI_ITEM Index="109" Name="" />
+		<DI_ITEM Index="110" Name="" />
+		<DI_ITEM Index="111" Name="" />
+	</Dig_In>
+	<Dig_Out>
+		<DO_ITEM Index="0" Name="DO_PVN21" Device="GPVN21" Addr="w0.00" Note="Gas Box" />
+		<DO_ITEM Index="1" Name="DO_PVN22" Device="GPVN22" Addr="w0.01" Note="Gas Box" />
+		<DO_ITEM Index="2" Name="DO_PV11" Device="GPV11" Addr="w0.02" Note="Gas Box" />
+		<DO_ITEM Index="3" Name="DO_PV12" Device="GPV12" Addr="w0.03" Note="Gas Box" />
+		<DO_ITEM Index="4" Name="DO_PV21" Device="GPV21" Addr="w0.04" Note="Gas Box" />
+		<DO_ITEM Index="5" Name="DO_PV22" Device="GPV22" Addr="w0.05" Note="Gas Box" />
+		<DO_ITEM Index="6" Name="DO_PV31" Device="GPV31" Addr="w0.06" Note="Gas Box" />
+		<DO_ITEM Index="7" Name="DO_PV32" Device="GPV32" Addr="w0.07" Note="Gas Box" />
+		<DO_ITEM Index="8" Name="DO_PV41" Device="GPV41" Addr="w0.08" Note="Gas Box" />
+		<DO_ITEM Index="9" Name="DO_PV42" Device="GPV42" Addr="w0.09" Note="Gas Box" />
+		<DO_ITEM Index="10" Name="DO_N2_Valve" Device="GPVN2" Addr="w0.10" Note="Gas Box" />
+		<DO_ITEM Index="11" Name="DO_MFC1_Valve" Device="GPV1" Addr="w0.11" Note="Gas Box" />
+		<DO_ITEM Index="12" Name="DO_MFC2_Valve" Device="GPV2" Addr="w0.12" Note="Gas Box" />
+		<DO_ITEM Index="13" Name="DO_MFC3_Valve" Device="GPV3" Addr="w0.13" Note="Gas Box" />
+		<DO_ITEM Index="14" Name="DO_MFC4_Valve" Device="GPV4" Addr="w0.14" Note="Gas Box" />
+		<DO_ITEM Index="15" Name="DO_MFC5_Valve" Device="GPV5" Addr="w0.15" Note="Gas Box" />
+		<DO_ITEM Index="16" Name="DO_MFC6_Valve" Device="GPV6" Addr="w1.00" Note="Gas Box" />
+		<DO_ITEM Index="17" Name="DO_MFC7_Valve" Device="GPV7" Addr="w1.01" Note="Gas Box" />
+		<DO_ITEM Index="18" Name="DO_MFC8_Valve" Device="GPV8" Addr="w1.02" Note="Gas Box" />
+		<DO_ITEM Index="19" Name="DO_PVHe1" Device="GPVHe1" Addr="w1.03" />
+		<DO_ITEM Index="20" Name="DO_PVHe2" Device="GPVHe2" Addr="w1.04" />
+		<DO_ITEM Index="21" Name="DO_Gas_Final_Valve" Device="PV1" Addr="w1.05" />
+		<DO_ITEM Index="22" Name="DO_Soft_Pumping_Valve" Device="PV2" Addr="w1.06" />
+		<DO_ITEM Index="23" Name="DO_Fast_Pumping_Valve" Device="PV3" Addr="w1.07" />
+		<DO_ITEM Index="24" Name=""/>
+		<DO_ITEM Index="25" Name=""/>
+		<DO_ITEM Index="26" Name="DO_Lift_Pin_Up" Device="PV5" Addr="w1.10" />
+		<DO_ITEM Index="27" Name="DO_Lift_Pin_Down" Device="PV5" Addr="w1.11" />
+		<DO_ITEM Index="28" Name="" />
+		<DO_ITEM Index="29" Name="DO_Turbo_Pump_Pumping_Valve" Device="PV6" Addr="w1.13" />
+		<DO_ITEM Index="30" Name="DO_Turbo_Pump_Purge_Valve" Device="PV7" Addr="w1.14" />
+		<DO_ITEM Index="31" Name="DO_Gauge_Valve" Device="PV8" Addr="w1.15" />
+		<DO_ITEM Index="32" Name="DO_Reset_Signal" Device="" Addr="w2.00" />
+		<DO_ITEM Index="33" Name="DO_Valve_Heater_On" Device="" Addr="w2.01" />
+		<DO_ITEM Index="34" Name="DO_Foreline_Heater_On" Device="" Addr="w2.02" />
+		<DO_ITEM Index="35" Name="DO_CHB_Wall_Heater_On" Device="" Addr="w2.03" />
+		<DO_ITEM Index="36" Name=""/>
+		<DO_ITEM Index="37" Name=""/>
+		<DO_ITEM Index="38" Name=""/>
+		<DO_ITEM Index="39" Name=""/>
+		<DO_ITEM Index="40" Name=""/>
+		<DO_ITEM Index="41" Name=""/>
+		<DO_ITEM Index="42" Name=""/>
+		<DO_ITEM Index="43" Name=""/>
+		<DO_ITEM Index="44" Name=""/>
+		<DO_ITEM Index="45" Name=""/>
+		<DO_ITEM Index="46" Name="DO_Gasline_Heater_On" Device="" Addr="w2.14" />
+		<DO_ITEM Index="47" Name="" />
+		<DO_ITEM Index="48" Name="DO_PVHe3" Device="GPVHe3" Addr="w3.00" />
+		<DO_ITEM Index="49" Name="DO_He_ISO" Device="PV9" Addr="w3.01" />
+		<DO_ITEM Index="50" Name="" />
+		<DO_ITEM Index="51" Name="" />
+		<DO_ITEM Index="52" Name="DO_MFC9_Valve" Device="GPV9" Addr="w3.04" />
+		<DO_ITEM Index="53" Name="DO_MFC10_Valve" Device="GPV10" Addr="w3.05" />
+		<DO_ITEM Index="54" Name="DO_MFC11_Valve" Device="GPV11" Addr="w3.06" />
+		<DO_ITEM Index="55" Name="DO_MFC12_Valve" Device="GPV12" Addr="w3.07" />
+		<DO_ITEM Index="56" Name="DO_Main_Purge_Valve" Device="GPVM" Addr="w3.08" />
+		<DO_ITEM Index="57" Name="DO_PV51" Device="GPV51" Addr="w3.09" />
+		<DO_ITEM Index="58" Name="DO_PV52" Device="GPV52" Addr="w3.10" />
+		<DO_ITEM Index="59" Name="DO_PV61" Device="GPV61" Addr="w3.11" />
+		<DO_ITEM Index="60" Name="DO_PV62" Device="GPV62" Addr="w3.12" />
+		<DO_ITEM Index="61" Name="DO_PV71" Device="GPV71" Addr="w3.13" />
+		<DO_ITEM Index="62" Name="DO_PV72" Device="GPV72" Addr="w3.14" />
+		<DO_ITEM Index="63" Name="DO_PV81" Device="GPV81" Addr="w3.15" />
+		<DO_ITEM Index="64" Name="DO_PV82" Device="GPV82" Addr="w4.00" />
+		<DO_ITEM Index="65" Name="DO_PV91" Device="GPV91" Addr="w4.01" />
+		<DO_ITEM Index="66" Name="DO_PV92" Device="GPV92" Addr="w4.02" />
+		<DO_ITEM Index="67" Name="DO_PVA1" Device="GPVA1" Addr="w4.03" />
+		<DO_ITEM Index="68" Name="DO_PVA2" Device="GPVA2" Addr="w4.04" />
+		<DO_ITEM Index="69" Name="DO_PVB1" Device="GPVB1" Addr="w4.05" />
+		<DO_ITEM Index="70" Name="DO_PVB2" Device="GPVB2" Addr="w4.06" />
+		<DO_ITEM Index="71" Name="DO_PVC1" Device="GPVC1" Addr="w4.07" />
+		<DO_ITEM Index="72" Name="DO_PVC2" Device="GPVC2" Addr="w4.08" />
+		<DO_ITEM Index="73" Name="" />
+		<DO_ITEM Index="74" Name="" />
+		<DO_ITEM Index="75" Name="" />
+		<DO_ITEM Index="76" Name="" />
+		<DO_ITEM Index="77" Name="" />
+		<DO_ITEM Index="78" Name="" />
+		<DO_ITEM Index="79" Name="" />
+		<DO_ITEM Index="80" Name="" />
+		<DO_ITEM Index="81" Name="" />
+		<DO_ITEM Index="82" Name="" />
+		<DO_ITEM Index="83" Name="" />
+		<DO_ITEM Index="84" Name="" />
+		<DO_ITEM Index="85" Name="" />
+		<DO_ITEM Index="86" Name="" />
+		<DO_ITEM Index="87" Name="" />
+		<DO_ITEM Index="88" Name="" />
+		<DO_ITEM Index="89" Name="" />
+		<DO_ITEM Index="90" Name="" />
+		<DO_ITEM Index="91" Name="" />
+		<DO_ITEM Index="92" Name="" />
+		<DO_ITEM Index="93" Name="" />
+		<DO_ITEM Index="94" Name="" />
+		<DO_ITEM Index="95" Name="" />
+		<DO_ITEM Index="96" Name="" />
+		<DO_ITEM Index="97" Name="" />
+		<DO_ITEM Index="98" Name="" />
+		<DO_ITEM Index="99" Name="" />
+		<DO_ITEM Index="100" Name="" />
+		<DO_ITEM Index="101" Name="" />
+		<DO_ITEM Index="102" Name="" />
+		<DO_ITEM Index="103" Name="" />
+		<DO_ITEM Index="104" Name="" />
+		<DO_ITEM Index="105" Name="" />
+		<DO_ITEM Index="106" Name="" />
+		<DO_ITEM Index="107" Name="" />
+		<DO_ITEM Index="108" Name="" />
+		<DO_ITEM Index="109" Name="" />
+		<DO_ITEM Index="110" Name="" />
+		<DO_ITEM Index="111" Name="" />
+	</Dig_Out>
+	<Ana_Out>
+		<AO_ITEM Index="0"  Name="AO_MFC1_Flow_Setpoint" Device="" Addr="d1000" Note="MFC" />
+		<AO_ITEM Index="1"  Name="AO_MFC2_Flow_Setpoint" Device="" Addr="d1002" Note="MFC" />
+		<AO_ITEM Index="2"  Name="AO_MFC3_Flow_Setpoint" Device="" Addr="d1004" Note="MFC" />
+		<AO_ITEM Index="3"  Name="AO_MFC4_Flow_Setpoint" Device="" Addr="d1006" Note="MFC" />
+		<AO_ITEM Index="4"  Name="AO_MFC5_Flow_Setpoint" Device="" Addr="d1008" Note="MFC" />
+		<AO_ITEM Index="5"  Name="AO_MFC6_Flow_Setpoint" Device="" Addr="d1010" Note="MFC" />
+		<AO_ITEM Index="6"  Name="AO_MFC7_Flow_Setpoint" Device="" Addr="d1012" Note="MFC" />
+		<AO_ITEM Index="7"  Name="AO_MFC8_Flow_Setpoint" Device="" Addr="d1014" Note="MFC" />
+		<AO_ITEM Index="8"  Name="AO_He_Pressure_Setpoint" Device="" Addr="d1016" Note="He MFC" />
+		<AO_ITEM Index="9"  Name=""/>
+		<AO_ITEM Index="10" Name="AO_Valve_Temperature_Setpoint" Device="" Addr="d1020" Note="阀门加热设定温度" />
+		<AO_ITEM Index="11" Name="AO_Valve_Temp_Limit_Setpoint" Device="" Addr="d1022" Note="Temp Limit" />
+		<AO_ITEM Index="12" Name="AO_Foreline_Temperature_Setpoint" Device="" Addr="d1024" Note="前级管道设定温度" />
+		<AO_ITEM Index="13" Name="AO_Foreline_Temp_Limit_Setpoint" Device="" Addr="d1026" Note="Temp Limit" />
+		<AO_ITEM Index="14" Name="AO_CHB_Wall_Temperature_Setpoint" Device="" Addr="d1028" Note="腔体壁设定温度" />
+		<AO_ITEM Index="15" Name="AO_CHB_Wall_Temp_Limit_Setpoint" Device="" Addr="d1030" Note="Temp Limit" />
+		<AO_ITEM Index="16" Name="AO_Heartbeat" Device="" Addr="d1032" Note="PC to PLC" />
+		<AO_ITEM Index="17" Name=""/>
+		<AO_ITEM Index="18" Name=""/>
+		<AO_ITEM Index="19" Name="" />
+		<AO_ITEM Index="20" Name="" />
+		<AO_ITEM Index="21" Name="" />
+		<AO_ITEM Index="22" Name="" />
+		<AO_ITEM Index="23" Name="" />
+		<AO_ITEM Index="24" Name="" />
+		<AO_ITEM Index="25" Name="AO_MFC9_Flow_Setpoint" Device="" Addr="d1050" Note="MFC" />
+		<AO_ITEM Index="26" Name="AO_MFC10_Flow_Setpoint" Device="" Addr="d1052" Note="MFC" />
+		<AO_ITEM Index="27" Name="" />
+		<AO_ITEM Index="28" Name="AO_MFC12_Flow_Setpoint" Device="" Addr="d1056" Note="MFC" />
+		<AO_ITEM Index="29" Name="" />
+		<AO_ITEM Index="30" Name="AO_GASLINE_Temperature_Setpoint" Device="" Addr="d1060" Note="GASLINE 加热设定温度" />
+		<AO_ITEM Index="31" Name="AO_GASLINE_Temp_Limit_Setpoint" Device="" Addr="d1062" Note="Temp Limit" />
+		<AO_ITEM Index="32" Name="" />
+		<AO_ITEM Index="33" Name="" />
+		<AO_ITEM Index="34" Name="" />
+		<AO_ITEM Index="35" Name="" />
+		<AO_ITEM Index="36" Name="" />
+		<AO_ITEM Index="37" Name="" />
+		<AO_ITEM Index="38" Name="" />
+		<AO_ITEM Index="39" Name="" />
+		<AO_ITEM Index="40" Name="" />
+		<AO_ITEM Index="41" Name="" />
+		<AO_ITEM Index="42" Name="" />
+		<AO_ITEM Index="43" Name="" />
+		<AO_ITEM Index="44" Name="" />
+		<AO_ITEM Index="45" Name="" />
+		<AO_ITEM Index="46" Name="" />
+		<AO_ITEM Index="47" Name="" />
+		<AO_ITEM Index="48" Name="" />
+		<AO_ITEM Index="49" Name="" />
+	</Ana_Out>
+	<Ana_In>
+		<AI_ITEM Index="0"  Name="AI_Chamber_Pressure_10t" Device="" Addr="d2000" Note="float" />
+		<AI_ITEM Index="1"  Name=""/>
+		<AI_ITEM Index="2"  Name="AI_Foreline_Pressure_10t" Device="" Addr="d2004" Note="float" />
+		<AI_ITEM Index="3"  Name="AI_He_Pressure_100t" Device="" Addr="d2006" Note="float" />
+		<AI_ITEM Index="4"  Name="AI_MFC1_Flow" Device="" Addr="d2008" Note="float" />
+		<AI_ITEM Index="5"  Name="AI_MFC2_Flow" Device="" Addr="d2010" Note="float" />
+		<AI_ITEM Index="6"  Name="AI_MFC3_Flow" Device="" Addr="d2012" Note="float" />
+		<AI_ITEM Index="7"  Name="AI_MFC4_Flow" Device="" Addr="d2014" Note="float" />
+		<AI_ITEM Index="8"  Name="AI_MFC5_Flow" Device="" Addr="d2016" Note="float" />
+		<AI_ITEM Index="9"  Name="AI_MFC6_Flow" Device="" Addr="d2018" Note="float" />
+		<AI_ITEM Index="10" Name="AI_MFC7_Flow" Device="" Addr="d2020" Note="float" />
+		<AI_ITEM Index="11" Name="AI_MFC8_Flow" Device="" Addr="d2022" Note="float" />
+		<AI_ITEM Index="12" Name="AI_He_Flow" Device="" Addr="d2024" Note="float" />
+		<AI_ITEM Index="13" />
+		<AI_ITEM Index="14" Name="AI_Valve_Control_TC_Temp" Device="" Addr="d2028" Note="float" />
+		<AI_ITEM Index="15" Name="AI_Gasline_Control_TC_Temp" Device="" Addr="d2030" Note="float" />
+		<AI_ITEM Index="16" Name="AI_Fline_Control_TC_Temp" Device="" Addr="d2032" Note="float" />
+		<AI_ITEM Index="17" Name="AI_Gasline_Monitor_TC_Temp" Device="" Addr="d2034" Note="float" />
+		<AI_ITEM Index="18" Name="AI_CHB_Wall_Control_TC_Temp" Device="" Addr="d2036" Note="float" />
+		<AI_ITEM Index="19" Name="AI_CHB_Wall_Monitor_TC_Temp" Device="" Addr="d2038" Note="float" />
+		<AI_ITEM Index="20" Name="AI_Coolant_Inlet_Temp" Device="" Addr="d2040" Note="float" />
+		<AI_ITEM Index="21" Name="AI_Coolant_Outlet_Temp" Device="" Addr="d2042" Note="float" />
+		<AI_ITEM Index="22" Name="AI_Heartbeat_FB" Device="" Addr="d2044" Note="float" />
+		<AI_ITEM Index="23" Name="AI_Second" Device="" Addr="d2046" Note="float" />
+		<AI_ITEM Index="24" Name="AI_Minute" Device="" Addr="d2048" Note="float" />
+		<AI_ITEM Index="25" Name="AI_Time" Device="" Addr="d2050" Note="float" />
+		<AI_ITEM Index="26" Name="AI_Day" Device="" Addr="d2052" Note="float" />
+		<AI_ITEM Index="27" Name="AI_Month" Device="" Addr="d2054" Note="float" />
+		<AI_ITEM Index="28" Name="AI_Year" Device="" Addr="d2056" Note="float" />
+		<AI_ITEM Index="29" Name="" />
+		<AI_ITEM Index="30" Name="" />
+		<AI_ITEM Index="31" Name="" />
+		<AI_ITEM Index="32" Name="" />
+		<AI_ITEM Index="33" Name="" />
+		<AI_ITEM Index="34" Name="" />
+		<AI_ITEM Index="35" Name="AI_MFC9Flow" Device="" Addr="d2070" Note="float" />
+		<AI_ITEM Index="36" Name="AI_MFC10Flow" Device="" Addr="d2072" Note="float" />
+		<AI_ITEM Index="37" Name="AI_MFC11Flow" Device="" Addr="d2074" Note="float" />
+		<AI_ITEM Index="38" Name="AI_MFC12Flow" Device="" Addr="d2076" Note="float" />
+		<AI_ITEM Index="39" Name="" />
+		<AI_ITEM Index="40" Name="AI_He_Pressure" Device="" Addr="d2080" Note="float" />
+		<AI_ITEM Index="41" Name="" />
+		<AI_ITEM Index="42" Name="" />
+		<AI_ITEM Index="43" Name="" />
+		<AI_ITEM Index="44" Name="" />
+		<AI_ITEM Index="45" Name="" />
+		<AI_ITEM Index="46" Name="" />
+		<AI_ITEM Index="47" Name="" />
+		<AI_ITEM Index="48" Name="" />
+		<AI_ITEM Index="49" Name="" />
+	</Ana_In>
+</IO_DEFINE>

+ 902 - 0
Venus/Venus_RT/Devices/JetVenusSEPM.cs

@@ -0,0 +1,902 @@
+using Aitex.Core.Common.DeviceData;
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Device.Unit;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.SCCore;
+using MECF.Framework.Common.Device.Bases;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.SubstrateTrackings;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Venus_Core;
+using Venus_RT.Devices.IODevices;
+using IoMfc = Venus_RT.Devices.IODevices.IoMfc;
+
+namespace Venus_RT.Devices
+{
+    class JetVenusSEPM : JetVenusSEPMBase
+    {
+        #region io变量定义
+        private readonly IoLid _Lid;
+
+        private readonly IoCylinder _slitDoor;
+        private readonly IoCylinder _LiftPin;
+
+        private readonly IoValve _PVN21Valve;
+        private readonly IoValve _PVN22Valve;
+        private readonly IoValve _PV11Valve;
+        private readonly IoValve _PV12Valve;
+        private readonly IoValve _PV21Valve;
+        private readonly IoValve _PV22Valve;
+        private readonly IoValve _PV31Valve;
+        private readonly IoValve _PV32Valve;
+        private readonly IoValve _PV41Valve;
+        private readonly IoValve _PV42Valve;
+        private readonly IoValve _PV51Valve;//新增
+        private readonly IoValve _PV52Valve;//新增
+        private readonly IoValve _PV61Valve;//新增
+        private readonly IoValve _PV62Valve;//新增
+        private readonly IoValve _PV71Valve;//新增
+        private readonly IoValve _PV72Valve;//新增
+        private readonly IoValve _PV81Valve;//新增
+        private readonly IoValve _PV82Valve;//新增
+        private readonly IoValve _PV91Valve;//新增
+        private readonly IoValve _PV92Valve;//新增
+        private readonly IoValve _PVA1Valve;//新增
+        private readonly IoValve _PVA2Valve;//新增
+        private readonly IoValve _PVB1Valve;//新增
+        private readonly IoValve _PVB2Valve;//新增
+        private readonly IoValve _PVC1Valve;//新增
+        private readonly IoValve _PVC2Valve;//新增
+        private readonly IoValve _N2Valve;
+        private readonly IoValve _Mfc1Valve;
+        private readonly IoValve _Mfc2Valve;
+        private readonly IoValve _Mfc3Valve;
+        private readonly IoValve _Mfc4Valve;
+        private readonly IoValve _Mfc5Valve;
+        private readonly IoValve _Mfc6Valve;
+        private readonly IoValve _Mfc7Valve;
+        private readonly IoValve _Mfc8Valve;
+        private readonly IoValve _Mfc9Valve; //新增
+        private readonly IoValve _Mfc10Valve;//新增
+        private readonly IoValve _Mfc11Valve;//新增 空的
+        private readonly IoValve _Mfc12Valve;//新增
+        private readonly IoValve _PVHe1Valve;
+        private readonly IoValve _PVHe2Valve;
+        private readonly IoValve _GasFinalValve;
+        private readonly IoValve _SoftPumpValve;
+        private readonly IoValve _FastPumpValve;
+        private readonly IoValve _TurboPumpPumpingValve;
+        private readonly IoValve _TurboPumpPurgeValve;
+        private readonly IoValve _GuageValve;
+        private readonly IoValve _PVHe3Valve;
+        private readonly IoValve _HeISOValve;
+        private readonly IoValve _MainPurgeValve;//新增
+
+        private readonly IoSensor _ATM_sw;
+        private readonly IoSensor _CDAPressure;
+        private readonly IoSensor _N2Pressure_sw;
+        private readonly IoSensor _VAC_sw;
+        private readonly IoSensor _WLK_sw;
+        private readonly IoSensor _Water_Flow;
+        private readonly IoSensor _RFG_Interlock;
+        private readonly IoSensor _PM_Lid_Closed;
+        private readonly IoSensor _Source_RF_Fan;
+        private readonly IoSensor _TurboPumpInterlock;
+        private readonly IoSensor _GasBoxDoor;
+        private readonly IoSensor _GasBoxPressure;
+
+        private readonly PumpBase _MainPump;
+        private readonly ESC5HighVoltage _ESCHV;
+        private readonly AdixenTurboPump _TurboPump;
+        private readonly PendulumValve _pendulumValve;
+
+        private readonly ChillerBase _Chiller;
+
+        private readonly RfPowerBase _Generator;//srf=>AdTecGenerator
+        private readonly RfPowerBase _GeneratorBias;//brf=>CometRF
+        private readonly RfMatchBase _Match;
+        private readonly RfMatchBase _BiasMatch;
+
+        private readonly IoHeater _ForelineTC;
+        private readonly IoHeater _WallTC;
+
+        private readonly IoPressureControl _pressureController;
+
+        private readonly IoGasStick[] _gasLines;
+        private readonly IoGasStick _gasLineN2;
+        private readonly IoBacksideHe _backsideHe;
+
+        private readonly IoMfc _heMfc;
+
+        private readonly double _foreline_interlock_pressure = 750;
+
+        private readonly Dictionary<ValveType, IoValve> Valve2IO;
+        #endregion
+
+        #region 构造函数
+        public JetVenusSEPM(ModuleName moduleName) : base(moduleName)
+        {
+            Module = moduleName;
+            _Lid = DEVICE.GetDevice<IoLid>($"{Module}.{VenusDevice.Lid}");
+            _slitDoor = DEVICE.GetDevice<IoCylinder>($"{Module}.{VenusDevice.SlitDoor}");
+            _LiftPin = DEVICE.GetDevice<IoCylinder>($"{Module}.{VenusDevice.LiftPin}");
+
+            _PVN21Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVN21}");
+            _PVN22Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVN22}");
+            _PV11Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV11}");
+            _PV12Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV12}");
+            _PV21Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV21}");
+            _PV22Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV22}");
+            _PV31Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV31}");
+            _PV32Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV32}");
+            _PV41Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV41}");
+            _PV42Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV42}");
+            _PV51Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV51}");
+            _PV52Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV52}");
+            _PV61Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV61}");
+            _PV62Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV62}");
+            _PV71Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV71}");
+            _PV72Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV72}");
+            _PV81Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV81}");
+            _PV82Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV82}");
+            _PV91Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV91}");
+            _PV92Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV92}");
+            _PVA1Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVA1}");
+            _PVA2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVA2}");
+            _PVB1Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVB1}");
+            _PVB2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVB2}");
+            _PVC1Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVC1}");
+            _PVC2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVC2}");
+
+            _N2Valve   = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveN2}");
+            _Mfc1Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc1}");
+            _Mfc2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc2}");
+            _Mfc3Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc3}");
+            _Mfc4Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc4}");
+            _Mfc5Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc5}");
+            _Mfc6Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc6}");
+            _Mfc7Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc7}");
+            _Mfc8Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc8}");
+            _Mfc9Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc9}");
+            _Mfc10Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc10}");
+            _Mfc11Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc11}");
+            _Mfc12Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc12}");
+            _PVHe1Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVHe1}");
+            _PVHe2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVHe2}");
+            _GasFinalValve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveGasFinal}");
+            _SoftPumpValve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveSoftPump}");
+            _FastPumpValve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveFastPump}");
+            _TurboPumpPumpingValve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveTurboPumpPumping}");
+            _TurboPumpPurgeValve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveTurboPumpPurge}");
+            _GuageValve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveGuage}");
+            _PVHe3Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVHe3}");
+            _HeISOValve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveHeISO}");
+
+            _heMfc = DEVICE.GetDevice<IoMfc>($"{Module}.MfcHe");
+            _ATM_sw = DEVICE.GetDevice<IoSensor>($"{Module}.SensorATMSwitch");
+            _N2Pressure_sw = DEVICE.GetDevice<IoSensor>($"{Module}.N2PressureOk");
+            _VAC_sw = DEVICE.GetDevice<IoSensor>($"{Module}.SensorVacSwitch");
+            _Water_Flow = DEVICE.GetDevice<IoSensor>($"{Module}.SensorWaterFlowOk");
+            _WLK_sw = DEVICE.GetDevice<IoSensor>($"{Module}.SensorWaterLeakOk");
+            _CDAPressure = DEVICE.GetDevice<IoSensor>($"{Module}.SensorCDAPressureOk");
+            _RFG_Interlock = DEVICE.GetDevice<IoSensor>($"{Module}.GeneratorInterlock");
+
+            _PM_Lid_Closed = DEVICE.GetDevice<IoSensor>($"{Module}.SensorPMLidClosed");
+            _Source_RF_Fan = DEVICE.GetDevice<IoSensor>($"{Module}.SensorSourceRFFan");
+            _TurboPumpInterlock = DEVICE.GetDevice<IoSensor>($"{Module}.TurboPumpInterlock");
+            _GasBoxDoor = DEVICE.GetDevice<IoSensor>($"{Module}.GasBoxDoorSW");
+            _GasBoxPressure = DEVICE.GetDevice<IoSensor>($"{Module}.GasBoxPressureSW");
+
+
+            _ForelineTC = DEVICE.GetDevice<IoHeater>($"{Module}.ForelineHeater");
+            _WallTC = DEVICE.GetDevice<IoHeater>($"{Module}.WallHeater");
+
+
+            _CDAPressure = DEVICE.GetDevice<IoSensor>($"{Module}.SensorCDAPressureOk");
+            _pressureController = DEVICE.GetDevice<IoPressureControl>($"{Module}.{VenusDevice.PressureControl}");
+
+            _gasLines = new IoGasStick[8];
+            for (int index = 0; index < 8; index++)
+            {
+                _gasLines[index] = DEVICE.GetDevice<IoGasStick>($"{Module}.GasStick{index + 1}");
+            }
+
+            _gasLineN2 = DEVICE.GetDevice<IoGasStick>($"{Module}.GasStickN2");
+            _backsideHe = DEVICE.GetDevice<IoBacksideHe>($"{Module}.BacksideHelium");
+
+            _MainPump = DEVICE.GetDevice<PumpBase>($"{Module}.{VenusDevice.MainPump}");
+            // RS232 Dry pump, SKY
+            if (SC.GetValue<int>($"{Module}.DryPump.CommunicationType") == (int)CommunicationType.RS232)
+            {
+                if (SC.GetValue<int>($"{Module}.DryPump.MFG") == (int)DryPumpMFG.SKY)
+                {
+                    _MainPump = DEVICE.GetDevice<SkyPump>($"{Module}.{VenusDevice.MainPump}");
+                }
+                else if (SC.GetValue<int>($"{Module}.DryPump.MFG") == (int)DryPumpMFG.Edwards)
+                {
+                    _MainPump = DEVICE.GetDevice<EdwardsPump>($"{Module}.{VenusDevice.MainPump}");
+                }
+            }
+
+            _ESCHV = DEVICE.GetDevice<ESC5HighVoltage>($"{Module}.{VenusDevice.ESCHV}");
+            _TurboPump = DEVICE.GetDevice<AdixenTurboPump>($"{Module}.{VenusDevice.TurboPump}");
+            _pendulumValve = DEVICE.GetDevice<PendulumValve>($"{Module}.{VenusDevice.PendulumValve}");
+
+            if (SC.GetValue<bool>($"{Module}.Chiller.EnableChiller") &&
+                SC.GetValue<int>($"{Module}.Chiller.CommunicationType") == (int)CommunicationType.RS232)
+            {
+                if (SC.GetValue<int>($"{Module}.Chiller.MFG") == (int)ChillerMFG.SMC)
+                {
+                    _Chiller = DEVICE.GetDevice<SMCChiller>($"{Module}.{VenusDevice.Chiller}");
+                }
+                else if (SC.GetValue<int>($"{Module}.Chiller.MFG") == (int)ChillerMFG.AIRSYS)
+                {
+                    _Chiller = DEVICE.GetDevice<AIRSYSChiller>($"{Module}.{VenusDevice.Chiller}");
+                }
+            }
+
+
+            // RS223 AdTec Generator
+            if (SC.GetValue<int>($"{Module}.Rf.CommunicationType") == (int)CommunicationType.RS232 &&
+                SC.GetValue<int>($"{Module}.Rf.MFG") == (int)GeneratorMFG.AdTec)
+            {
+                _Generator = DEVICE.GetDevice<AdTecGenerator>($"{Module}.{VenusDevice.Rf}");
+            }
+
+            // Ethernet Comet Generator Bias
+            if (SC.GetValue<bool>($"{Module}.BiasRf.EnableBiasRF"))
+            {
+                if (SC.GetValue<int>($"{Module}.BiasRf.CommunicationType") == (int)CommunicationType.Ethernet &&
+                    SC.GetValue<int>($"{Module}.BiasRf.MFG") == (int)GeneratorMFG.Comet)
+                {
+                    _GeneratorBias = DEVICE.GetDevice<CometRF>($"{Module}.{VenusDevice.BiasRf}");
+                }
+                else if (SC.GetValue<int>($"{Module}.BiasRf.MFG") == (int)GeneratorMFG.AdTec)
+                {
+                    _GeneratorBias = DEVICE.GetDevice<AdTecGenerator>($"{Module}.{VenusDevice.BiasRf}");
+                }
+            }
+
+            // RS232 AdTec match
+            if (SC.GetValue<int>($"{Module}.Match.CommunicationType") == (int)CommunicationType.RS232 &&
+                SC.GetValue<int>($"{Module}.Match.MFG") == (int)MatchMFG.AdTec)
+            {
+                _Match = DEVICE.GetDevice<AdTecMatch>($"{Module}.{VenusDevice.Match}");
+            }
+
+            // Bias Match
+            if (SC.GetValue<bool>($"{Module}.BiasMatch.EnableBiasMatch") &&
+                SC.GetValue<int>($"{Module}.BiasMatch.CommunicationType") == (int)CommunicationType.RS232 &&
+                SC.GetValue<int>($"{Module}.BiasMatch.MFG") == (int)MatchMFG.AdTec)
+            {
+                _BiasMatch = DEVICE.GetDevice<AdTecMatch>($"{Module}.{VenusDevice.BiasMatch}");
+            }
+
+
+            _foreline_interlock_pressure = SC.GetValue<double>($"{Module}.ForelineInterlockPressure");
+            Valve2IO = new Dictionary<ValveType, IoValve>()
+            {
+                { ValveType.PVN21, _PVN21Valve },
+                { ValveType.PVN22, _PVN22Valve },
+                { ValveType.PV11,  _PV11Valve  },
+                { ValveType.PV12,  _PV12Valve  },
+                { ValveType.PV21,  _PV21Valve  },
+                { ValveType.PV22,  _PV22Valve  },
+                { ValveType.PV31,  _PV31Valve  },
+                { ValveType.PV32,  _PV32Valve  },
+                { ValveType.PV41,  _PV41Valve  },
+                { ValveType.PV42,  _PV42Valve  },
+                { ValveType.PV51,  _PV51Valve  },
+                { ValveType.PV52,  _PV52Valve  },
+                { ValveType.PV61,  _PV61Valve  },
+                { ValveType.PV62,  _PV62Valve  },
+                { ValveType.PV71,  _PV71Valve  },
+                { ValveType.PV72,  _PV72Valve  },
+                { ValveType.PV81,  _PV81Valve  },
+                { ValveType.PV82,  _PV82Valve  },
+                { ValveType.PV91,  _PV91Valve  },
+                { ValveType.PV92,  _PV92Valve  },
+                { ValveType.PVA1,  _PVA1Valve  },
+                { ValveType.PVA2,  _PVA2Valve  },
+                { ValveType.PVB1,  _PVB1Valve  },
+                { ValveType.PVB2,  _PVB2Valve  },
+                { ValveType.PVC1,  _PVC1Valve  },
+                { ValveType.PVC2,  _PVC2Valve  },
+                { ValveType.N2,    _N2Valve    },
+                { ValveType.Mfc1,  _Mfc1Valve  },
+                { ValveType.Mfc2,  _Mfc2Valve  },
+                { ValveType.Mfc3,  _Mfc3Valve  },
+                { ValveType.Mfc4,  _Mfc4Valve  },
+                { ValveType.Mfc5,  _Mfc5Valve  },
+                { ValveType.Mfc6,  _Mfc6Valve  },
+                { ValveType.Mfc7,  _Mfc7Valve  },
+                { ValveType.Mfc8,  _Mfc8Valve  },
+                { ValveType.Mfc9,  _Mfc9Valve  },
+                { ValveType.Mfc10, _Mfc10Valve },
+                { ValveType.Mfc11, _Mfc11Valve },
+                { ValveType.Mfc12, _Mfc12Valve },
+                { ValveType.PVHe1, _PVHe1Valve },
+                { ValveType.PVHe3, _PVHe3Valve },
+                { ValveType.PVHe2, _PVHe2Valve },
+                { ValveType.GasFinal,  _GasFinalValve},
+                { ValveType.SoftPump,  _SoftPumpValve},
+                { ValveType.FastPump,  _FastPumpValve},
+                { ValveType.TurboPumpPumping,  _TurboPumpPumpingValve},
+                { ValveType.TurboPumpPurge,  _TurboPumpPurgeValve},
+                { ValveType.Guage,  _GuageValve},
+                { ValveType.HeISO,  _HeISOValve},
+                { ValveType.MainPurge,_MainPurgeValve}
+            };
+        }
+        #endregion
+
+        #region 暴露变量
+        public override bool IsLidClosed => _Lid.OFFFeedback;
+
+        public override bool IsSlitDoorClosed => !_slitDoor.ONFeedback && _slitDoor.OFFFeedback;
+
+        public override bool IsPumpRunning => _MainPump.IsRunning;
+
+        public override bool IsTurboPumpRunning => _TurboPump.IsRunning;
+
+        public override bool IsTurboPumpAtSpeed => _TurboPump.AtSpeed;
+
+        public override float TurboPumpSpeed => _TurboPump.Speed;
+
+        public override bool HasPumpError => _MainPump.IsError || !_MainPump.IsRunning;
+
+        public override bool HasTurboPumpError => _TurboPump.IsError || !_TurboPump.IsRunning;
+
+        public override bool IsCDA_OK => _CDAPressure.Value;
+
+        public override bool IsFastPumpOpened => _FastPumpValve.Status;
+
+        public override bool IsSoftPumpOpened => _SoftPumpValve.Status;
+
+        public override bool IsMfc1ValveOpened => _Mfc1Valve.Status;
+
+        public override bool IsMfc2ValveOpened => _Mfc2Valve.Status;
+
+        public override bool IsMfc3ValveOpened => _Mfc3Valve.Status;
+
+        public override bool IsMfc4ValveOpened => _Mfc4Valve.Status;
+
+        public override bool IsMfc5ValveOpened => _Mfc5Valve.Status;
+
+        public override bool IsMfc6ValveOpened => _Mfc6Valve.Status;
+
+        public override bool IsMfc7ValveOpened => _Mfc7Valve.Status;
+
+        public override bool IsMfc8ValveOpened => _Mfc8Valve.Status;
+
+        public override bool IsMfc9ValveOpened => _Mfc9Valve.Status;
+
+        public override bool IsMfc10ValveOpened => _Mfc10Valve.Status;
+
+        public override bool IsMfc11ValveOpened => _Mfc11Valve.Status;
+
+        public override bool IsMfc12ValveOpened => _Mfc12Valve.Status;
+
+        public override bool IsGuageValveOpened => _GuageValve.Status;
+
+        public override bool IsATM => _ATM_sw.Value;
+
+        public override bool PVN22ValveIsOpen => _PVN22Valve.Status;
+
+        public override bool LiftPinIsDown => _LiftPin.OFFFeedback;
+
+        public override bool LiftPinIsUp => _LiftPin.ONFeedback;
+
+        public override bool IsVAC => _VAC_sw.Value;
+
+        public override bool IsWaterFlowOk => _Water_Flow.Value;
+
+        public override bool IsWLK => _WLK_sw.Value;
+
+        public override bool IsRFGInterlockOn => _RFG_Interlock.Value;
+
+        public override bool PMLidClosed => _PM_Lid_Closed.Value;
+
+        public override bool TurboPumpInterlock => _TurboPumpInterlock.Value;
+
+        public override bool SourceRFFanInterlock => _Source_RF_Fan.Value;
+
+        public override bool SlitDoorClosed => !_slitDoor.ONFeedback && _slitDoor.OFFFeedback;
+
+        public override double ProcessLowPressure => _pressureController.ProcessLow.Value;
+
+        public override double ProcessHighPressure => _pressureController.ProcessHigh.Value;
+
+        public override double ProcessPressure => _pressureController.ProcessGauge.Value;
+
+        public override double ChamberPressure => _pressureController.PressureGauge.Value;
+
+        public override double ForelinePressure => _pressureController.ForelineGauge.Value;
+
+        public override double TargetPressure => _pressureController.TargetPressure;
+
+        public override double ESCHePressure => _pressureController.ESCHeGauge.Value;
+
+        public override int ESCOutputVoltage => _ESCHV.OutputVoltage;
+
+        public override double ESCPositiveOutputCurrent => _ESCHV.PositiveOutputCurrent;
+
+        public override double ESCNegativeOutputCurrent => _ESCHV.NegativeOutputCurrent;
+
+        public override bool IsHVOn => _ESCHV.IsOn;
+
+        public override float CoolantInletTempFB => _Chiller.CoolantInletTcFeedback;
+
+        public override float CoolantOutletTempFB => _Chiller.CoolantOutletTcFeedback;
+
+        public override bool ChillerIsRunning => _Chiller.IsRunning;
+
+        public override float ReflectPower => _Generator.ReflectPower;
+
+        public override float BiasReflectPower => _GeneratorBias.ReflectPower;
+
+        public override bool BackSideHeOutOfRange => _backsideHe.OutOfRange;
+
+        public override MovementPosition LiftPinPosition
+        {
+            get
+            {
+                MovementPosition pos = MovementPosition.Unknown;
+                if (_LiftPin.ONFeedback && !_LiftPin.OFFFeedback)
+                {
+                    pos = MovementPosition.Up;
+                }
+                else if (!_LiftPin.ONFeedback && _LiftPin.OFFFeedback)
+                {
+                    pos = MovementPosition.Down;
+                }
+                return pos;
+            }
+        }
+
+        public override double TotalGasSetpoint
+        {
+            get
+            {
+                double sum = 0;
+                foreach (var gas in _gasLines)
+                {
+                    sum += gas.FlowSP;
+                }
+                return sum;
+            }
+        }
+
+        public override bool HasGasOutOfRange 
+        {
+            get
+            {
+                foreach (var gas in _gasLines)
+                {
+                    if (!gas.IsOutOfRange)
+                        return false;
+                }
+                return true;
+            }
+        }
+        #endregion
+
+        #region 公共方法
+        public override bool CheckAtm()
+        {
+            //检查是否是ATM模式
+            return _ATM_sw.Value && ChamberPressure > 700000;
+        }
+
+        public override bool CheckChillerStatus()
+        {
+            return _Chiller != null /*&& _Chiller.IsRunning*/ && !_Chiller.IsError;
+        }
+
+        public override bool CheckGeneratorAndHVInterlock(VenusDevice device)
+        {
+            eEvent evt = device == VenusDevice.Rf ? eEvent.ERR_RF : eEvent.ERR_ESC_HV;
+            if (!PMLidClosed)
+            {
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as PM Lid is Open.");
+                return false;
+            }
+
+            if (!IsVAC)
+            {
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as PM is not Vacuum.");
+                return false;
+            }
+
+            if (!IsWaterFlowOk)
+            {
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Water Flow is OFF.");
+                return false;
+            }
+
+            if (!IsRFGInterlockOn)
+            {
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Generator Interlock is OFF.");
+                return false;
+            }
+
+            if (!SourceRFFanInterlock)
+            {
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Source RF Fan is OFF.");
+                return false;
+            }
+
+            if (!SlitDoorClosed)
+            {
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Slit Door is open.");
+                return false;
+            }
+
+            if ((device == VenusDevice.ESCHV || device == VenusDevice.BiasRf) && WaferManager.Instance.CheckNoWafer(Module, 0))
+            {
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as {Module} has no wafer");
+                return false;
+            }
+
+            return true;
+        }
+
+        public override void CheckIdleInterlock()
+        {
+            if (ForelinePressure > _foreline_interlock_pressure)
+            {
+                if (_TurboPumpPumpingValve.SetPoint || _TurboPumpPurgeValve.SetPoint || _pendulumValve.IsOpen)
+                {
+                    _pendulumValve.TurnValve(false);
+                    _TurboPumpPurgeValve.TurnValve(false, out _);
+                    _TurboPumpPumpingValve.TurnValve(false, out _);
+
+                    LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Foreline pressure:{ForelinePressure} exceed {_foreline_interlock_pressure} mtorr, Pendulum valve & PV6 & PV7 closed automaticlly.");
+                }
+            }
+        }
+
+        public override bool CheckLiftDown()
+        {
+            return _LiftPin.State == CylinderState.Close;
+        }
+
+        public override bool CheckLiftUp()
+        {
+            return _LiftPin.State == CylinderState.Open;
+        }
+
+        public override bool CheckSlitDoorClose()
+        => IsSlitDoorClosed;
+
+        public override bool CheckSlitDoorOpen()
+        => !IsSlitDoorClosed;
+
+        public override void CloseValves()
+        {
+            _PVN21Valve.TurnValve(false, out _);
+            //_PVN22Valve.TurnValve(false, out _);
+            _PV11Valve.TurnValve(false, out _);
+            _PV12Valve.TurnValve(false, out _);
+            _PV21Valve.TurnValve(false, out _);
+            _PV22Valve.TurnValve(false, out _);
+            _PV31Valve.TurnValve(false, out _);
+            _PV32Valve.TurnValve(false, out _);
+            _PV41Valve.TurnValve(false, out _);
+            _PV42Valve.TurnValve(false, out _);
+            
+            _PVHe1Valve.TurnValve(false, out _);
+            _PVHe2Valve.TurnValve(false, out _);
+            _GasFinalValve.TurnValve(false, out _);
+            _SoftPumpValve.TurnValve(false, out _);
+            _FastPumpValve.TurnValve(false, out _);
+            _TurboPumpPumpingValve.TurnValve(false, out _);
+            _TurboPumpPurgeValve.TurnValve(false, out _);
+            _GuageValve.TurnValve(false, out _);
+
+            _N2Valve.TurnValve(false, out _);
+            _FastPumpValve.TurnValve(false, out _);
+
+            _PVHe3Valve.TurnValve(false, out _);
+            _HeISOValve.TurnValve(false, out _);
+
+            //新增
+            _Mfc1Valve.TurnValve(false, out _);
+            _Mfc2Valve.TurnValve(false, out _);
+            _Mfc3Valve.TurnValve(false, out _);
+            _Mfc4Valve.TurnValve(false, out _);
+            _Mfc5Valve.TurnValve(false, out _);
+            _Mfc6Valve.TurnValve(false, out _);
+            _Mfc7Valve.TurnValve(false, out _);
+            _Mfc8Valve.TurnValve(false, out _);
+            _Mfc9Valve.TurnValve(false, out _);
+            _Mfc10Valve.TurnValve(false, out _);
+            _Mfc11Valve.TurnValve(false, out _);
+            _Mfc12Valve.TurnValve(false, out _);
+            _PV51Valve.TurnValve(false, out _);
+            _PV52Valve.TurnValve(false, out _);
+            _PV61Valve.TurnValve(false, out _);
+            _PV62Valve.TurnValve(false, out _);
+            _PV71Valve.TurnValve(false, out _);
+            _PV72Valve.TurnValve(false, out _);
+            _PV81Valve.TurnValve(false, out _);
+            _PV82Valve.TurnValve(false, out _);
+            _PV91Valve.TurnValve(false, out _);
+            _PV92Valve.TurnValve(false, out _);
+            _PVA1Valve.TurnValve(false, out _);
+            _PVA2Valve.TurnValve(false, out _);
+            _PVB1Valve.TurnValve(false, out _);
+            _PVB2Valve.TurnValve(false, out _);
+            _PVC1Valve.TurnValve(false, out _);
+            _PVC2Valve.TurnValve(false, out _);
+
+            foreach (var stick in _gasLines)
+            {
+                stick.Stop();
+            }
+        }
+
+        public override bool FlowGas(int gasNum, double val)
+        {
+            if (_gasLines.Length <= gasNum)
+                return false;
+
+
+            _gasLines[gasNum].Flow(val);
+            return true;
+        }
+
+        public override bool FlowN2(double val)
+        {
+            _gasLineN2.Flow(val);
+            return true;
+        }
+
+        public override bool GeneratorBiasPowerOn(bool on)
+        {
+            if (_GeneratorBias == null) return false;
+
+            if (on && !IsRFGInterlockOn)
+            {
+                LOG.Write(eEvent.ERR_RF, Module, "Bias射频电源 Interlock条件不满足");
+                return false;
+            }
+
+            return _GeneratorBias.SetPowerOnOff(on, out _);
+        }
+
+        public override bool GeneratorBiasSetMatchMode(bool val)
+        {
+            if (_GeneratorBias == null) return false;
+            string reason = string.Empty;
+            _GeneratorBias.SetMatchingAutoMode(val, out reason);
+            return true;
+        }
+
+        public override bool GeneratorBiasSetpower(float val)
+        {
+            if (_GeneratorBias == null) return false;
+
+            if (Math.Abs(val) > 0.01)
+                _GeneratorBias.SetPower((ushort)val);
+            return true;
+        }
+
+        public override bool GeneratorPowerOn(bool on)
+        {
+            if (_Generator == null) return false;
+
+            if (on && !IsRFGInterlockOn)
+            {
+                LOG.Write(eEvent.ERR_RF, Module, "射频电源 Interlock条件不满足");
+                return false;
+            }
+
+            return _Generator.SetPowerOnOff(on, out _);
+        }
+
+        public override bool GeneratorSetpower(float val)
+        {
+            if (_Generator == null) return false;
+
+            if (Math.Abs(val) > 0.01)
+                _Generator.SetPower((ushort)val);
+            return true;
+        }
+
+        public override int GetPVPosition()
+        {
+            return _pendulumValve.Position;
+        }
+
+        public override async void HeatChiller(ChillerType chillerType, double value, double offset)
+        {
+            _Chiller?.SetChillerTemp((float)value, (float)offset);
+            await Task.Delay(1000);
+            _Chiller?.SetChillerOnOff(true);
+        }
+
+        public override void Home()
+        {
+            SetLiftPin(MovementPosition.Down, out _);
+            //转交TM
+            //if (!_PM_SlitDoor_Closed.Value)
+            //{
+            //    SetSlitDoor(true, out _);
+            //}
+            //else
+            //{
+            //    SetSlitDoor(false, out _);
+            //}
+            //
+            //SetSlitDoor(false, out _);
+            OpenValve(ValveType.PVN22, true);
+        }
+
+        public override void OnOffChiller(ChillerType chillerType, bool onoff)
+        => _Chiller?.SetChillerOnOff(onoff);
+
+        public override bool OnOffSetESCHV(bool on)
+        => _ESCHV.SetPowerOnOff(on);
+
+        public override void OpenValve(ValveType vlvType, bool on)
+        {
+            if (Valve2IO.ContainsKey(vlvType))
+            {
+                Valve2IO[vlvType].TurnValve(on, out _);
+                LOG.Write(eEvent.EV_DEVICE_INFO, Module, $"{(on ? "打开" : "关闭")} 阀 {vlvType.ToString()}");
+            }
+            else
+            {
+                throw new ArgumentOutOfRangeException($"Argument error {vlvType}-{on}");
+            }
+        }
+
+        public override bool PendulumValveIsOpen()
+        {
+            return _pendulumValve.IsOpen;
+        }
+
+        public override void SetBacksideHeFlow(double flow)
+        {
+            if (_backsideHe == null) return;
+            _backsideHe.Flow(flow);
+        }
+
+        public override bool SetBacksideHePressure(float mTorr)
+        {
+            if (_backsideHe == null) return false;
+            return _backsideHe.SetBacksideHelium(mTorr);
+        }
+
+        public override bool SetBacksideHeThreshold(int nMin, int nMax)
+        {
+            if (_backsideHe == null) return false;
+            return _backsideHe.SetFlowThreshold(nMin, nMax);
+        }
+
+        public override bool SetBiasMatchPosition(float c1, float c2)
+        {
+            if (_BiasMatch == null) return false;
+            string reason = string.Empty;
+            _BiasMatch.SetMatchPosition(c1, c2, out reason);
+            return true;
+        }
+
+        public override bool SetBiasPulseMode(bool on)
+        {
+            if (_GeneratorBias == null) return false;
+            _GeneratorBias.SetPulseMode(on);
+            return true;
+        }
+
+        public override bool SetBiasPulseRateFreq(int nFreq)
+        {
+            if (_GeneratorBias == null) return false;
+            _GeneratorBias.SetPulseRateFreq(nFreq);
+            return true;
+        }
+
+        public override bool SetDiasPulseDutyCycle(int percentage)
+        {
+            if (_GeneratorBias == null) return false;
+            _GeneratorBias.SetPulseDutyCycle(percentage);
+            return true;
+        }
+
+        public override bool SetESCClampVoltage(int nVoltage)
+        {
+            if (_ESCHV == null) return false;
+            return _ESCHV.SetOutputVoltage(nVoltage);
+        }
+
+        public override void SetGeneratorCommunicationMode(int mode)
+        => _Generator?.SetCommunicationMode(mode);
+
+        public override bool SetLiftPin(MovementPosition dirt, out string reason)
+        {
+            reason = string.Empty;
+
+            switch (dirt)
+            {
+                case MovementPosition.Down:
+                    return _LiftPin.SetCylinder(false, out reason);
+                case MovementPosition.Up:
+                    return _LiftPin.SetCylinder(true, out reason);
+                case MovementPosition.Left:
+                case MovementPosition.Right:
+                case MovementPosition.Middle:
+                    throw new ArgumentException("Movement argument error");
+            }
+
+            return true;
+        }
+
+        public override bool SetMatchPosition(float c1, float c2)
+        {
+            if (_Match == null) return false;
+            string reason = string.Empty;
+            _Match.SetMatchPosition(c1, c2, out reason);
+            return true;
+        }
+
+        public override bool SetPVPostion(int position)
+        => _pendulumValve.SetPosition(position);
+
+        public override bool SetPVPressure(int pressure)
+        => _pendulumValve.SetPressure(pressure);
+
+        public override bool SetWallTCTemperature(float value)
+        => _WallTC.RampTemp(value);
+
+        public override void StopAllGases()
+        {
+            foreach (var line in _gasLines)
+            {
+                line.Stop();
+            }
+        }
+
+        public override bool StopGas(int gasNum)
+        {
+            if (_gasLines.Length <= gasNum)
+                return false;
+
+            _gasLines[gasNum].Stop();
+            return true;
+        }
+
+        public override bool StopN2()
+        {
+            _gasLineN2.Stop();
+            return true;
+        }
+
+        public override void TurnDryPump(bool on)
+        => _MainPump?.SetPumpOnOff(on);
+
+        public override bool TurnPendulumValve(bool on)
+        => _pendulumValve.TurnValve(on);
+
+        public override void TurnTurboPump(bool on)
+        {
+            _TurboPump?.SetPumpOnOff(on);
+        }
+
+        #endregion
+
+        protected override void CheckPermanentInterlock()
+        {
+            if (ProcessPressure > 100 && _GuageValve.SetPoint)
+            {
+                _GuageValve.TurnValve(false, out _);
+                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Process pressure:{ProcessPressure} exceed 100 mtorr, Guage Valve (DO-31) closed automaticlly.");
+            }
+        }
+
+    }
+}

+ 399 - 0
Venus/Venus_RT/Devices/JetVenusSEPMBase.cs

@@ -0,0 +1,399 @@
+using Aitex.Core.RT.DataCenter;
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.OperationCenter;
+using Aitex.Core.Util;
+using MECF.Framework.Common.Equipment;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Venus_Core;
+using Venus_RT.Modules;
+
+namespace Venus_RT.Devices
+{
+    /// <summary>
+    /// 变量及类型说明
+    /// bool类型变量 Is开头代表DI 其余代表DO
+    /// double类型变量 代表AI AO
+    /// </summary>
+    abstract class JetVenusSEPMBase : BaseDevice, IDevice
+    {
+        #region DI DO
+        public abstract bool IsLidClosed { get; }
+        public abstract bool IsSlitDoorClosed { get; }
+        public abstract bool IsPumpRunning { get; }
+        public abstract bool IsTurboPumpRunning { get; } 
+        public abstract bool IsTurboPumpAtSpeed { get; }
+        public abstract float TurboPumpSpeed { get; }
+        public abstract bool HasPumpError { get; }
+        public abstract bool HasTurboPumpError { get; }
+        public abstract bool IsCDA_OK { get; }
+        public abstract bool IsFastPumpOpened { get; }
+        public abstract bool IsSoftPumpOpened { get; }
+        public abstract bool IsMfc1ValveOpened { get; }
+        public abstract bool IsMfc2ValveOpened { get; }
+        public abstract bool IsMfc3ValveOpened { get; }
+        public abstract bool IsMfc4ValveOpened { get; }
+        public abstract bool IsMfc5ValveOpened { get; }
+        public abstract bool IsMfc6ValveOpened { get; }
+        public abstract bool IsMfc7ValveOpened { get; }
+        public abstract bool IsMfc8ValveOpened { get; }
+
+        public abstract bool IsMfc9ValveOpened { get; }
+        public abstract bool IsMfc10ValveOpened { get; }
+        public abstract bool IsMfc11ValveOpened { get; }
+        public abstract bool IsMfc12ValveOpened { get; }
+
+        public abstract bool IsGuageValveOpened { get; }
+
+        public abstract bool IsATM { get; }
+
+        public abstract bool PVN22ValveIsOpen { get; }
+        public abstract bool LiftPinIsDown { get; }
+        public abstract bool LiftPinIsUp { get; }
+        public abstract bool IsVAC { get; }
+        public abstract bool IsWaterFlowOk { get; }
+        public abstract bool IsWLK { get; }
+        public abstract bool IsRFGInterlockOn { get; }
+
+        public abstract bool PMLidClosed { get; }
+        public abstract bool TurboPumpInterlock { get; }
+        public abstract bool SourceRFFanInterlock { get; }
+        public abstract bool SlitDoorClosed { get; } //PM slite door closed
+        #endregion
+
+        #region AI AO
+        //AI AO
+        public abstract double ProcessLowPressure { get; }
+        public abstract double ProcessHighPressure { get; }
+        public abstract double ProcessPressure { get; }
+        public abstract double ChamberPressure { get; }
+        public abstract double ForelinePressure { get; }
+        public abstract double TargetPressure { get; }
+        public abstract double ESCHePressure { get; }
+
+        public abstract int ESCOutputVoltage { get; }
+        public abstract double ESCPositiveOutputCurrent { get; }//R+
+        public abstract double ESCNegativeOutputCurrent { get; }//R-
+
+        public abstract bool IsHVOn { get; }
+
+        public abstract float CoolantInletTempFB { get; }
+        public abstract float CoolantOutletTempFB { get; }
+        public abstract bool ChillerIsRunning { get; }
+
+        public abstract float ReflectPower { get; }
+        public abstract float BiasReflectPower { get; }
+        #endregion
+
+        public abstract bool BackSideHeOutOfRange { get; }
+
+        public new ModuleName Module;
+
+        public abstract MovementPosition LiftPinPosition { get; }
+
+        public abstract bool CheckAtm();
+        public abstract bool CheckSlitDoorOpen();
+
+        public abstract bool CheckSlitDoorClose();
+
+        public abstract bool CheckLiftUp();
+
+        public abstract bool CheckLiftDown();
+        public abstract double TotalGasSetpoint { get; }
+
+        public abstract bool HasGasOutOfRange { get; }
+        public abstract bool PendulumValveIsOpen();
+
+        public double TMPressure { get { return Singleton<RouteManager>.Instance.TM.TMPressure; } }
+
+        public bool IsTMATM { get { return Singleton<RouteManager>.Instance.TM.IsTMATM; } }
+
+        public bool IsTMVAC { get { return Singleton<RouteManager>.Instance.TM.IsTMVac; } }
+
+        // EndPoint 
+        private readonly JetEPDBase _epdClient;
+        public List<string> EPDCfgList => _epdClient?.CFGFileList;
+        public bool EPDCaptured => _epdClient.Captured;
+        public bool EPDConnected => _epdClient.IsEPDConnected;
+
+        public JetVenusSEPMBase(ModuleName module) : base(module.ToString(), module.ToString(), module.ToString(), module.ToString()) 
+        {
+            Module = module;
+
+            _epdClient = DEVICE.GetDevice<JetEPDBase>($"{Module}.{VenusDevice.EndPoint}");
+
+            DATA.Subscribe($"{Name}.ForelinePressure", () => ForelinePressure);
+            DATA.Subscribe($"{Name}.ProcessHighPressure", () => ProcessHighPressure);
+            DATA.Subscribe($"{Name}.ProcessLowPressure", () => ProcessLowPressure);
+            DATA.Subscribe($"{Name}.ESCHePressure", () => ESCHePressure);
+
+            DATA.Subscribe($"{Name}.IsATM", () => IsATM);
+            DATA.Subscribe($"{Name}.IsVAC", () => IsVAC);
+            DATA.Subscribe($"{Name}.LiftPinIsUp", () => LiftPinIsUp);
+            DATA.Subscribe($"{Name}.LiftPinIsDown", () => LiftPinIsDown);
+            DATA.Subscribe($"{Name}.PumpIsRunning", () => IsPumpRunning);
+            DATA.Subscribe($"{Name}.TurboPumpIsRunning", () => IsTurboPumpRunning);
+            DATA.Subscribe($"{Name}.IsSlitDoorClosed", () => IsSlitDoorClosed);
+            DATA.Subscribe($"{Name}.IsLidClosed", () => IsLidClosed);
+
+            DATA.Subscribe($"{Name}.TurboPumpRotationalSpeed", () => TurboPumpSpeed);
+
+            DATA.Subscribe($"{Name}.IsWaterFlowOk", () => IsWaterFlowOk);
+            DATA.Subscribe($"{Name}.IsWLK", () => IsWLK);
+            DATA.Subscribe($"{Name}.IsCDA_OK", () => IsCDA_OK);
+            DATA.Subscribe($"{Name}.SourceRFFanInterlock", () => SourceRFFanInterlock);
+            DATA.Subscribe($"{Name}.IsTurboPumpInterlock", () => TurboPumpInterlock);
+
+
+            DATA.Subscribe($"{Name}.GetPVPosition", () => GetPVPosition());
+
+            DATA.Subscribe($"{Name}.ESCHV.Temp", () => CoolantOutletTempFB);
+            DATA.Subscribe($"{Name}.Chiller.Temp", () => CoolantInletTempFB);
+
+            DATA.Subscribe($"{Name}.Chiller.IsOn", () => ChillerIsRunning);
+            DATA.Subscribe($"{Name}.IsTurboPumpAtSpeed", () => IsTurboPumpAtSpeed);
+            DATA.Subscribe($"{Name}.EPDCfgList", () => EPDCfgList);
+
+
+
+            OP.Subscribe($"{Module}.SetLiftPin", (cmd, args) => {
+                if ((bool)args[0] == true)
+                {
+                    return SetLiftPin(MovementPosition.Up, out _);
+                }
+                else
+                {
+                    return SetLiftPin(MovementPosition.Down, out _);
+                }
+
+            });
+
+            OP.Subscribe($"{Module}.SetSRf", (cmd, args) =>
+            {
+                var ison = (bool)args[1];
+                if (ison == true)
+                {
+                    GeneratorPowerOn(true);
+
+                    GeneratorSetpower((float)args[0]);
+
+
+                }
+                else
+                {
+                    GeneratorPowerOn(false);
+                }
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.SetBRf", (cmd, args) => {
+
+                var ison = (bool)args[1];
+                if (ison == true)
+                {
+                    GeneratorBiasPowerOn(true);
+
+                    GeneratorBiasSetpower((float)args[0]);
+                }
+                else
+                {
+                    GeneratorBiasPowerOn(false);
+                }
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.SetESCHVIsOn", (cmd, args) => {
+                OnOffSetESCHV((bool)args[0]);
+                return true;
+            });
+            OP.Subscribe($"{Module}.SetESCHV", (cmd, args) => {
+                SetESCClampVoltage((int)args[0]);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.SetPVPostion", (cmd, args) => {
+                SetPVPostion((int)args[0]);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.SetPVPressure", (cmd, args) => {
+                SetPVPressure((int)args[0]);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.ClosePump", (cmd, args) => {
+                TurnDryPump(false);
+                return true;
+            });
+            OP.Subscribe($"{Module}.ControlValve", (cmd, args) => {
+                OpenValve((ValveType)((int)args[0]), (bool)args[1]);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.TurnPendulumValve", (cmd, args) => {
+                TurnPendulumValve((bool)args[0]);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.HeatChiller", (cmd, args) => {
+                var chillerType = (ChillerType)Enum.Parse(typeof(ChillerType), args[0].ToString());
+                HeatChiller(chillerType, (float)args[1], (float)args[2]);
+                return true;
+            });
+            OP.Subscribe($"{Module}.OnOffChiller", (cmd, args) => {
+                var chillerType = (ChillerType)Enum.Parse(typeof(ChillerType), args[0].ToString());
+
+                OnOffChiller(chillerType, (bool)args[1]);
+                return true;
+            });
+            OP.Subscribe($"{Module}.WallChiller", (cmd, args) => {
+                float value;
+                float.TryParse(args[0].ToString(), out value);
+                SetWallTCTemperature(value);
+                return true;
+            });
+            OP.Subscribe($"{Module}.SetBacksideHeFlow", (cmd, args) => {
+                double value;
+                double.TryParse(args[0].ToString(), out value);
+                SetBacksideHeFlow(value);
+                return true;
+            });
+            OP.Subscribe($"{Module}.SetBacksideHePressure", (cmd, args) =>
+            {
+                float value;
+                float.TryParse(args[0].ToString(), out value);
+                SetBacksideHePressure(value);
+                return true;
+            });
+            OP.Subscribe($"{Module}.EndPoint.SearchCfg", (cmd, args) =>
+            {
+                _epdClient?.QueryConfigList();
+                return true;
+            });
+        }
+
+        public virtual void Monitor()
+        {
+
+        }
+        public virtual bool Initialize()
+        {
+            return true;
+        }
+        public virtual void Terminate()
+        {
+
+        }
+
+        public virtual void Reset()
+        {
+
+        }
+
+        public abstract void CloseValves();
+
+
+        public abstract void TurnDryPump(bool on);
+
+        public abstract void TurnTurboPump(bool on);
+
+        public abstract void OpenValve(ValveType vlvType, bool on);
+
+        public abstract bool OnOffSetESCHV(bool on);
+
+        public abstract bool SetWallTCTemperature(float value);
+        protected abstract void CheckPermanentInterlock();
+
+        public abstract void CheckIdleInterlock();
+
+
+
+        public abstract void Home();
+
+        public abstract bool SetLiftPin(MovementPosition dirt, out string reason);
+
+        public abstract bool FlowGas(int gasNum, double val);
+
+        public abstract bool StopGas(int gasNum);
+
+        public abstract bool FlowN2(double val);
+
+        public abstract bool StopN2();
+
+        public abstract void StopAllGases();
+
+        public abstract bool TurnPendulumValve(bool on);
+
+        public abstract bool SetPVPressure(int pressure);
+
+        public abstract bool SetPVPostion(int position);
+
+        public abstract int GetPVPosition();
+
+        public abstract void HeatChiller(ChillerType chillerType, double value, double offset);
+
+        public abstract void OnOffChiller(ChillerType chillerType, bool onoff);
+
+        public abstract bool CheckChillerStatus();
+
+
+        public abstract void SetGeneratorCommunicationMode(int mode);
+
+        public abstract bool GeneratorPowerOn(bool on);
+
+        public abstract bool GeneratorSetpower(float val);
+
+        public abstract bool GeneratorBiasPowerOn(bool on);
+
+        public abstract bool GeneratorBiasSetpower(float val);
+
+        public abstract bool GeneratorBiasSetMatchMode(bool val);
+
+        public abstract bool SetMatchPosition(float c1, float c2);
+
+        public abstract bool SetBiasMatchPosition(float c1, float c2);
+
+        public abstract bool SetBiasPulseMode(bool on);
+        public abstract bool SetBiasPulseRateFreq(int nFreq);
+
+        public abstract bool SetDiasPulseDutyCycle(int percentage);
+
+        public abstract bool SetESCClampVoltage(int nVoltage);
+
+        public abstract bool CheckGeneratorAndHVInterlock(VenusDevice device);
+
+
+
+        #region EndPoint
+        public void EPDRecipeStart(string recipe)
+        {
+            _epdClient.RecipeStart(recipe);
+        }
+
+        public void EPDRecipeStop()
+        {
+            _epdClient.RecipeStop();
+        }
+
+        public void EPDStepStart(string cfgName, int step)
+        {
+            _epdClient.StepStart(cfgName, step);
+        }
+
+        public void EPDStepStop()
+        {
+            _epdClient.StepStop();
+        }
+
+        #endregion
+
+        public abstract void SetBacksideHeFlow(double flow);
+
+        public abstract bool SetBacksideHePressure(float mTorr);
+
+        public abstract bool SetBacksideHeThreshold(int nMin, int nMax);
+    }
+}

+ 3 - 0
Venus/Venus_RT/Venus_RT.csproj

@@ -150,6 +150,8 @@
     <Compile Include="Devices\JetEPDBase.cs" />
     <Compile Include="Devices\JetKepler2200APM.cs" />
     <Compile Include="Devices\JetPMBase.cs" />
+    <Compile Include="Devices\JetVenusSEPM.cs" />
+    <Compile Include="Devices\JetVenusSEPMBase.cs" />
     <Compile Include="Devices\JetVenusPM.cs" />
     <Compile Include="Devices\JetKepler2300PM.cs" />
     <Compile Include="Devices\PendulumValve.cs" />
@@ -281,6 +283,7 @@
     <Content Include="Config\PM\Kepler2300\Kepler2300DeviceModel.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <Resource Include="Config\PM\VenusSE\VenusSEIoDefine.xml" />
     <Content Include="Config\TM\DeviceModelVenus_MF.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>

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

@@ -778,69 +778,77 @@ namespace Venus_Simulator.Instances
 
             if (fast_pump_vlv.Value || soft_pump_vlv.Value || turbo_pump_vlv.Value)
             {
+                //任意泵打开
+                float getAiValue_ChamberPressure = GetAiValue($"{mod}.{sAI_ChamberPressure}");
+                float getAiValue_ProcessPressure = GetAiValue($"{mod}.{sAI_ProcessPressure}");
                 if (fast_pump_vlv.Value && soft_pump_vlv.Value)
-                {
-                    float getAiValue_ChamberPressure = GetAiValue($"{mod}.{sAI_ChamberPressure}");
-                    float getAiValue_ProcessPressure = GetAiValue($"{mod}.{sAI_ProcessPressure}");
+                {//开双泵
                     if (getAiValue_ProcessPressure <= 10000 && getAiValue_ChamberPressure > 10000)
                     {
-                        SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ChamberPressure}") - 30000);
+                        float targetChamberPressure = getAiValue_ChamberPressure - 30000 > 0 ? getAiValue_ChamberPressure - 30000 : 0;
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", targetChamberPressure);
                         //SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 150);
                     }
                     else if (getAiValue_ProcessPressure <= 10000 && getAiValue_ChamberPressure <= 10000)
                     {
-                        getAiValue_ProcessPressure = getAiValue_ChamberPressure;
-                        SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 1500);
-                        SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 1500);
+                        float targetChamberPressure = getAiValue_ProcessPressure - 1500 > 0 ? getAiValue_ProcessPressure - 1500 : 0;
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", targetChamberPressure);
+                        SetAiValue($"{mod}.{sAI_ProcessPressure}", targetChamberPressure);
                     }
 
                     //SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ChamberPressure}") - _rd.Next(15000, 16000));
                     //SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - _rd.Next(150, 160));
                 }
-                else if (fast_pump_vlv.Value)
+                else if (fast_pump_vlv.Value)//开
                 {
-                    float getAiValue_ChamberPressure = GetAiValue($"{mod}.{sAI_ChamberPressure}");
-                    float getAiValue_ProcessPressure = GetAiValue($"{mod}.{sAI_ProcessPressure}");
                     if (getAiValue_ProcessPressure <= 10000 && getAiValue_ChamberPressure > 10000)
                     {
-                        SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ChamberPressure}") - 25000);
+                        float targetChamberPressure = getAiValue_ChamberPressure - 25000 > 0 ? getAiValue_ChamberPressure - 25000 : 0;
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", targetChamberPressure);
                         //SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 150);
                     }
                     else if (getAiValue_ProcessPressure <= 10000 && getAiValue_ChamberPressure <= 10000)
                     {
-                        getAiValue_ProcessPressure = getAiValue_ChamberPressure;
-                        SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 1300);
-                        SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 1300);
+                        float targetChamberPressure = getAiValue_ProcessPressure - 1300 > 0 ? getAiValue_ProcessPressure - 1300 : 0;
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", targetChamberPressure);
+                        SetAiValue($"{mod}.{sAI_ProcessPressure}", targetChamberPressure);
                     }
                     //SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ChamberPressure}") - _rd.Next(12000, 13000));
                     //SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - _rd.Next(120, 130));
                 }
                 else if (soft_pump_vlv.Value)
                 {
-                    float getAiValue_ChamberPressure = GetAiValue($"{mod}.{sAI_ChamberPressure}");
-                    float getAiValue_ProcessPressure = GetAiValue($"{mod}.{sAI_ProcessPressure}");
                     if (getAiValue_ProcessPressure <= 10000 && getAiValue_ChamberPressure > 10000)
                     {
-                        SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ChamberPressure}") - 22000);
+                        float targetChamberPressure = getAiValue_ChamberPressure - 10000 > 0 ? getAiValue_ChamberPressure - 10000 : 0;
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", targetChamberPressure);
                         //SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 150);
                     }
                     else if (getAiValue_ProcessPressure <= 10000 && getAiValue_ChamberPressure <= 10000)
                     {
-                        getAiValue_ProcessPressure = getAiValue_ChamberPressure;
-                        SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 1100);
-                        SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 1100);
+                        float targetChamberPressure = getAiValue_ProcessPressure - 1100 > 0 ? getAiValue_ProcessPressure - 1100 : 0;
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", targetChamberPressure);
+                        SetAiValue($"{mod}.{sAI_ProcessPressure}", targetChamberPressure);
                     }
                     //SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ChamberPressure}") - _rd.Next(13000, 14000));
                     //SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - _rd.Next(100, 110));
                 }
                 else if (turbo_pump_vlv.Value)
                 {
-                    float getAiValue_ChamberPressure = GetAiValue($"{mod}.{sAI_ChamberPressure}");
-                    float getAiValue_ProcessPressure = GetAiValue($"{mod}.{sAI_ProcessPressure}");
 
                     getAiValue_ProcessPressure = getAiValue_ChamberPressure;
-                    SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 500);
-                    SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 500);
+
+                    if ((getAiValue_ChamberPressure - 500) >= 0)
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", getAiValue_ChamberPressure - 500);
+                    else
+                        SetAiValue($"{mod}.{sAI_ChamberPressure}", 0);
+
+                    if ((getAiValue_ProcessPressure - 500) >= 0)
+                        SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 500);
+                    else
+                        SetAiValue($"{mod}.{sAI_ProcessPressure}", 0);
+                    //SetAiValue($"{mod}.{sAI_ChamberPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 500);
+                    //SetAiValue($"{mod}.{sAI_ProcessPressure}", GetAiValue($"{mod}.{sAI_ProcessPressure}") - 500);
                 }
             }