Browse Source

Add missing files

zhouhr 1 year ago
parent
commit
1c44773767

+ 150 - 0
Venus/Venus_MainPages/Views/VenusSeOperationOverView.xaml

@@ -0,0 +1,150 @@
+<UserControl x:Class="Venus_MainPages.Views.VenusSeOperationOverView"
+             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_MainPages.Views"
+             xmlns:unity="clr-namespace:Venus_MainPages.Unity"
+             xmlns:converters="clr-namespace:Venus_Themes.Converters;assembly=Venus_Themes"
+             xmlns:ctrls="clr-namespace:Venus_Themes.UserControls;assembly=Venus_Themes"
+             xmlns:userControls="clr-namespace:Venus_Themes.UserControls;assembly=Venus_Themes"
+             xmlns:customControls="clr-namespace:Venus_Themes.CustomControls;assembly=Venus_Themes"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <UserControl.Resources>
+        <converters:BoolToVisibility x:Key="boolToVisibility"/>
+        <converters:BoolToVisibility2 x:Key="boolToVisibility2"/>
+        <converters:BoolToBool x:Key="BoolToBool"/>
+    </UserControl.Resources>
+    <Grid>
+        <Canvas>
+            <!-- Recipe -->
+            <Grid Width="280" Height="170" Canvas.Left="240" Canvas.Top="380"  unity:GridOptions.LineBrush="#afb4db"  unity:GridOptions.ShowBorder="True" Background="#E9EDF4" Visibility="{Binding PMAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="30"/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition Height="0"/>
+                    <RowDefinition/>
+
+                </Grid.RowDefinitions>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="3*"/>
+                    <ColumnDefinition Width="2*"/>
+                </Grid.ColumnDefinitions>
+                <TextBlock Grid.Row="0" Text="PMA" Foreground="White" Grid.ColumnSpan="2"     FontSize="20"  Padding="120,2,0,0" Background="#376092"/>
+
+                <TextBlock Grid.Row="1" Text="Recipe Name"        FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="2" Text="Step Num/All"        FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="3" Text="Step Type"          FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="4" Text="Step Elpased Time"  FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="5" Text="Step Time(s)"       FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="6" Text="Next Step"       FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="7" Text="Cycle Num/All"  FontSize="15" Padding="10,2,0,0" Background="#D0D8E8"/>
+
+
+                <TextBlock Grid.Row="1" Grid.Column="1" Text="" FontSize="15" Padding="10,2,0,0" Background="#E9EDF4"/>
+                <TextBlock Grid.Row="2" Grid.Column="1"   FontSize="15" Padding="10,2,0,0" Background="#E9EDF4">
+
+                </TextBlock>
+                <TextBlock Grid.Row="3" Grid.Column="1"  FontSize="15" Padding="10,2,0,0"/>
+                <TextBlock Grid.Row="4" Grid.Column="1"  FontSize="15" Padding="10,2,0,0"/>
+                <TextBlock Grid.Row="5" Grid.Column="1"  FontSize="15" Padding="10,2,0,0"/>
+                <TextBlock Grid.Row="7" Grid.Column="1"  FontSize="15" Padding="10,2,0,0" Background="#E9EDF4">
+
+                </TextBlock>
+            </Grid>
+
+            <Grid Width="280" Height="170" Canvas.Left="730" Canvas.Top="30"  unity:GridOptions.LineBrush="#afb4db"  unity:GridOptions.ShowBorder="True" Background="#E9EDF4" Visibility="{Binding PMBIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" Cursor="">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="30"/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition/>
+                    <RowDefinition Height="0"/>
+                    <RowDefinition/>
+
+                </Grid.RowDefinitions>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="3*"/>
+                    <ColumnDefinition Width="2*"/>
+                </Grid.ColumnDefinitions>
+                <TextBlock Grid.Row="0" Text="PMB" Foreground="White" Grid.ColumnSpan="2"     FontSize="20"  Padding="120,2,0,0" Background="#376092"/>
+
+                <TextBlock Grid.Row="1" Text="Recipe Name"        FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="2" Text="Step Num/All"        FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="3" Text="Step Type"          FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="4" Text="Step Elpased Time"  FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="5" Text="Step Time(s)"       FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="6" Text="Next Step"       FontSize="15"  Padding="10,2,0,0" Background="#D0D8E8"/>
+                <TextBlock Grid.Row="7" Text="Cycle Num/All"  FontSize="15" Padding="10,2,0,0" Background="#D0D8E8"/>
+
+
+                <TextBlock Grid.Row="1" Grid.Column="1" Text="" FontSize="15" Padding="10,2,0,0" Background="#E9EDF4"/>
+                <TextBlock Grid.Row="2" Grid.Column="1"   FontSize="15" Padding="10,2,0,0" Background="#E9EDF4">
+
+                </TextBlock>
+                <TextBlock Grid.Row="3" Grid.Column="1"  FontSize="15" Padding="10,2,0,0"/>
+                <TextBlock Grid.Row="4" Grid.Column="1"  FontSize="15" Padding="10,2,0,0"/>
+                <TextBlock Grid.Row="5" Grid.Column="1"  FontSize="15" Padding="10,2,0,0"/>
+                <TextBlock Grid.Row="7" Grid.Column="1"  FontSize="15" Padding="10,2,0,0" Background="#E9EDF4">
+
+                </TextBlock>
+            </Grid>
+
+            <!-- Overview including Vce PM TM(slitDoor) Aligner -->
+            <Viewbox Height="300" Width="300" Canvas.Top="50" Canvas.Left="400">
+                <Canvas Height="400" Width="400">
+                    <userControls:VenusSETM Canvas.Top="450" Canvas.Left="500"></userControls:VenusSETM>
+                    <userControls:TMChamber ModuleName="PMB" x:Name="PMB" Canvas.Top="251"  Canvas.Left="522" Width="200" Height="200"  DoorIsOpen="{Binding RtDataValues[PMB.IsSlitDoorClosed],Converter={StaticResource BoolToBool}}" RobotWafer="{Binding PMBWafer}" PMVisibility="{Binding PMBIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" HorizontalAlignment="Center" VerticalAlignment="Top"/>
+                    <userControls:TMChamber ModuleName="PMA" x:Name="PMA" Canvas.Top="672"  Canvas.Left="301" Width="200" Height="200" RotateTransformValue="-90"  DoorIsOpen="{Binding RtDataValues[PMA.IsSlitDoorClosed],Converter={StaticResource BoolToBool}}" RobotWafer="{Binding PMAWafer}" PMVisibility="{Binding PMAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" HorizontalAlignment="Center" VerticalAlignment="Top"/>
+
+                    <TextBlock Text="Aligner" FontSize="25" Canvas.Top="535" Canvas.Left="860" FontWeight="Normal">
+                        <TextBlock.RenderTransform>
+                            <RotateTransform Angle="90" />
+                        </TextBlock.RenderTransform>
+                    </TextBlock>
+                    <TextBlock Canvas.Top="900" Canvas.Left="600" Text="Vce" FontSize="25" FontWeight="Normal"></TextBlock>
+                    <userControls:Vce Canvas.Top="743" Canvas.Left="520" Width="200" Height="180"></userControls:Vce>
+                </Canvas>
+            </Viewbox>
+            <userControls:EFEMFrontView UnitData="{Binding EFEMModuleInfo}" Title="Robot"  Canvas.Top="585" Canvas.Left="625" HorizontalAlignment="Left" VerticalAlignment="Center" />
+
+            <!--手臂 wafer情况-->
+
+            <!-- carrier 记录vce的情况 -->
+            <Canvas Canvas.Left="500">
+                <TextBlock Text="Carrier"  Canvas.Left="700"   Canvas.Top="120" Foreground="White" TextAlignment="Center" Background="#2570a1" Padding="5,3"/>
+                <TextBlock Text="Set Squence"  Canvas.Left="1000"   Canvas.Top="120" Foreground="White" TextAlignment="Center" Background="#2570a1" Padding="5,3"/>
+                <StackPanel Orientation="Horizontal" Canvas.Left="700"  Canvas.Top="140">
+                    <StackPanel>
+                        <TextBox Background="{DynamicResource Table_BG_Title}"  Text="Vce" Width="Auto" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
+                        <ctrls:FOUPFrontView UnitData="{Binding LP1ModuleInfo}" ShowTitle="False" />
+
+                        <TextBlock  HorizontalAlignment="Center" Margin="0,5,0,0" FontSize="15">
+                            <TextBlock.Text>
+                                <MultiBinding StringFormat="{}Wafer Count:{0}">
+                                    <Binding Path="LP1WaferCount"></Binding>
+                                </MultiBinding>
+                            </TextBlock.Text>
+                        </TextBlock>
+
+                        <StackPanel Orientation="Horizontal">
+                            <customControls:PathButton Content="Load"   HorizontalAlignment="Center" Margin="0,5,0,0" Width="80" Height="30" Command="{Binding LoadWaferCommand}"   CommandParameter="LP1"/>
+                            <customControls:PathButton Content="UnLoad" HorizontalAlignment="Center" Margin="0,5,0,0" Width="80" Height="30" Command="{Binding UnLoadWaferCommand}" CommandParameter="LP1"/>
+                        </StackPanel>
+
+
+                    </StackPanel>
+                </StackPanel>
+                <local:WaferAssociationUnit  Canvas.Left="1000"  Canvas.Top="140" WAInfo="{Binding VceWaferAssociation}" />
+            </Canvas>
+            <!-- OverOperation -->
+        </Canvas>
+    </Grid>
+</UserControl>

+ 28 - 0
Venus/Venus_MainPages/Views/VenusSeOperationOverView.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Venus_MainPages.Views
+{
+    /// <summary>
+    /// VenusSeOperationOverView.xaml 的交互逻辑
+    /// </summary>
+    public partial class VenusSeOperationOverView : UserControl
+    {
+        public VenusSeOperationOverView()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 4 - 0
Venus/Venus_RT/Config/PM/VenusSE/VenusSEDeviceModel.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<DeviceModelDefine type="VenusSE" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	
+</DeviceModelDefine>

+ 4 - 0
Venus/Venus_RT/Config/TM/VenusSE/DeviceModelVenus_MF.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<DeviceModelDefine type="TM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="DeviceModel.xsd">
+	
+</DeviceModelDefine>

+ 4 - 0
Venus/Venus_RT/Config/TM/VenusSE/TMInterlock.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Interlock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+	
+</Interlock>

+ 77 - 0
Venus/Venus_RT/Config/TM/VenusSE/_ioDefineVenus_MF.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<IO_DEFINE xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
+	<Dig_In>
+		<DI_ITEM Index="1"  Name="DI_SYSTEM_CDA_PRESSURE_OK" Device="" Addr="w0.00" Note="" />
+		<DI_ITEM Index="2"	Name="DI_SYSTEM_N2_PRESSURE_OK" Device="" Addr="w0.01" Note="" />
+		<DI_ITEM Index="3"	Name="DI_VCE_SLIT_DOOR_OPEN_ENABLE" Device="" Addr="w0.02" Note="" />
+		<DI_ITEM Index="4"	Name="DI_PMA_SLIT_DOOR_OPEN_ENABLE" Device="" Addr="w0.03" Note="" />
+		<DI_ITEM Index="5"	Name="DI_PMB_SLIT_DOOR_OPEN_ENABLE" Device="" Addr="w0.04" Note="" />
+		<DI_ITEM Index="6"	Name="DI_PMC_SLIT_DOOR_OPEN_ENABLE" Device="" Addr="w0.05" Note="" />
+		<DI_ITEM Index="7"	Name="DI_TM_RB_EXTEND_VCE_ENABLE" Device="" Addr="w0.06" Note="" />
+		<DI_ITEM Index="8"	Name="DI_TM_RB_EXTEND_PMA_ENABLE" Device="" Addr="w0.07" Note="" />
+		<DI_ITEM Index="9"	Name="DI_TM_RB_EXTEND_PMB_ENABLE" Device="" Addr="w0.08" Note="" />
+		<DI_ITEM Index="10"	Name="DI_TM_RB_EXTEND_PMC_ENABLE" Device="" Addr="w0.09" Note="" />
+		<DI_ITEM Index="11"	Name="DI_AC_RACK_FAN OK" Device="" Addr="w0.10" Note="" />
+		<DI_ITEM Index="12"	Name="DI_AC_RACK_SOMKE_OUT1" Device="" Addr="w0.11" Note="" />
+		<DI_ITEM Index="13"	Name="DI_AC_RACK_SOMKE_OUT2" Device="" Addr="w0.12" Note="" />
+		<DI_ITEM Index="14"	Name="DI_FAB_SOMKE_OUT" Device="" Addr="w0.13" Note="" />
+		<DI_ITEM Index="15"	Name="DI_ABNORMAL_EXHAUST_GAS" Device="" Addr="w0.14" Note="" />
+		<DI_ITEM Index="16"	Name="DI_N2_PRESSURE_SENSOR1" Device="" Addr="w0.15" Note="" />
+		<DI_ITEM Index="17"	Name="DI_VCE_TO_PA_VALVE_OPEN" Device="" Addr="w1.00" Note="" />
+		<DI_ITEM Index="18"	Name="DI_VCE_TO_PA_VALVE_CLOSE" Device="" Addr="w1.01" Note="" />
+		<DI_ITEM Index="19"	Name="DI_TM_TO_PMB_VALVE_OPEN" Device="" Addr="w1.02" Note="" />
+		<DI_ITEM Index="20"	Name="DI_TM_TO_PMB_VALVE_CLOSE" Device="" Addr="w1.03" Note="" />
+		<DI_ITEM Index="21"	Name="DI_TM_ATM_SENSOR" Device="" Addr="w1.04" Note="" />
+		<DI_ITEM Index="22"	Name="DI_VCE_ATM_SENSOR" Device="" Addr="w1.05" Note="" />
+		<DI_ITEM Index="23"	Name="DI_N2_PRESSURE_SENSOR2" Device="" Addr="w1.06" Note="" />
+		<DI_ITEM Index="24"	Name="DI_CDA_PRESSURE_SENSOR" Device="" Addr="w1.07" Note="" />
+		<DI_ITEM Index="25"	Name="DI_He_PRESSURE_SENSOR" Device="" Addr="w1.08" Note="" />
+		<DI_ITEM Index="26"	Name="DI_LEAK_SENSOR" Device="" Addr="w1.09" Note="" />
+		<DI_ITEM Index="27"	Name="DI_TM_VACUUM_GAUGE" Device="" Addr="w1.10" Note="" />
+		<DI_ITEM Index="28"	Name="DI_VCE_VACUUM_GAUGE" Device="" Addr="w1.11" Note="" />
+		<DI_ITEM Index="29"	Name="DI_ROBOT_TO_VCE_RETRACT" Device="" Addr="w1.12" Note="" />
+		<DI_ITEM Index="30"	Name="DI_ROBOT_TO_PMA_RETRACT" Device="" Addr="w1.13" Note="" />
+		<DI_ITEM Index="31"	Name="DI_ROBOT_TO_PMB_RETRACT" Device="" Addr="w1.14" Note="" />
+		<DI_ITEM Index="32"	Name="DI_ROBOT_TO_PMC_RETRACT" Device="" Addr="w1.15" Note="" />
+	</Dig_In>
+	<Dig_Out>
+		<DO_ITEM Index="1"	Name="DO_SLIT_DOOR_CLOSED_TO_VCE"		Device="" Addr="W100.00"/>
+		<DO_ITEM Index="2"	Name="DO_SLIT_DOOR_CLOSED_TO_PMA"		Device="" Addr="W100.01"/>
+		<DO_ITEM Index="3"	Name="DO_SLIT_DOOR_CLOSED_TO_PMB"		Device="" Addr="W100.02"/>
+		<DO_ITEM Index="4"	Name="DO_SLIT_DOOR_CLOSED_TO_PMC"		Device="" Addr="W100.03"/>
+		<DO_ITEM Index="5"	Name="DO_TM_ROBOT_NOT_EXTEND_TO_VCE"	Device="" Addr="W100.04"/>
+		<DO_ITEM Index="6"	Name="DO_TM_ROBOT_NOT_EXTEND_TO_PMA"	Device="" Addr="W100.05"/>
+		<DO_ITEM Index="7"	Name="DO_TM_ROBOT_NOT_EXTEND_TO_PMB"	Device="" Addr="W100.06"/>
+		<DO_ITEM Index="8"	Name="DO_TM_ROBOT_NOT_EXTEND_TO_PMC"	Device="" Addr="W100.07"/>
+		<DO_ITEM Index="9"	Name="DO_SYSTEM_NO_WATER_LEAK"		Device="" Addr="W100.08"/>
+		<DO_ITEM Index="10"	Name="DO_RB_EXTEND_VCE_OK"				Device="" Addr="W100.09"/>
+		<DO_ITEM Index="11"	Name="DO_RB_EXTEND_PMA_OK"				Device="" Addr="W100.10"/>
+		<DO_ITEM Index="12"	Name="DO_RB_EXTEND_PMB_OK"				Device="" Addr="W100.11"/>
+		<DO_ITEM Index="13"	Name="DO_RB_EXTEND_PMC_OK"				Device="" Addr="W100.12"/>
+		<DO_ITEM Index="14"	Name="DO_VCE_TO_TM_VALVE_OPEN"				Device="" Addr="W100.13"/>
+		<DO_ITEM Index="15"	Name="DO_VCE_TO_TM_VALVE_CLOSED"				Device="" Addr="W100.14"/>
+		<DO_ITEM Index="16"	Name="DO_PMA_VALVE_OPEN"				Device="" Addr="W100.15"/>
+		<DO_ITEM Index="17"	Name="DO_PMA_VALVE_CLOSED"				Device="" Addr="W101.00"/>
+		<DO_ITEM Index="18"	Name="DO_PMB_VALVE_OPEN"					Device="" Addr="W101.01"/>
+		<DO_ITEM Index="19"	Name="DO_PMB_VALVE_CLOSED"					Device="" Addr="W101.02"/>
+		<DO_ITEM Index="20"	Name="DO_PMC_VALVE_OPEN"				Device="" Addr="W101.03"/>
+		<DO_ITEM Index="21"	Name="DO_PMC_VALVE_CLOSED"				Device="" Addr="W101.04"/>
+		<DO_ITEM Index="22"	Name="DO_TM_FAST_PUMP"					Device="" Addr="W101.05"/>
+		<DO_ITEM Index="23"	Name="DO_TM_SOFT_PUMP"					Device="" Addr="W101.06"/>
+		<DO_ITEM Index="24"	Name="DO_TM_FAST_VENT"					Device="" Addr="W101.07"/>
+		<DO_ITEM Index="25"	Name="DO_TM_SOFT_VENT"					Device="" Addr="W101.08"/>
+		<DO_ITEM Index="26"	Name="DO_VCE_FAST_PUMP"				Device="" Addr="W101.09"/>
+		<DO_ITEM Index="27"	Name="DO_VCE_SOFT_PUMP"				Device="" Addr="W101.10"/>
+		<DO_ITEM Index="28"	Name="DO_VCE_FAST_VENT"				Device="" Addr="W101.11"/>
+		<DO_ITEM Index="29"	Name="DO_VCE_SOFT_VENT"				Device="" Addr="W101.12"/>
+		<DO_ITEM Index="30"	Name="DO_220V_COIL"						Device="" Addr="W101.13"/>
+		<DO_ITEM Index="31"	Name="DO_CDA_PRESSURE_OK"					Device="" Addr="W101.14"/>
+		<DO_ITEM Index="32"	Name="DO_N2_PRESSURE_OK"					Device="" Addr="W101.15"/>
+
+	</Dig_Out>
+	<Ana_In>
+
+	</Ana_In>
+	<Ana_Out>
+	</Ana_Out>
+</IO_DEFINE>

+ 1 - 1
Venus/Venus_RT/Devices/EFEM/JetEfem.cs

@@ -830,7 +830,7 @@ namespace Venus_RT.Devices.EFEM
         {
             if(message.Operation != EfemOperation.Ready)
             {
-                if (_currentMsg.Operation != message.Operation && SearchForDeleteBackMsg(message))
+                if (_currentMsg.Operation != message.Operation && !SearchForDeleteBackMsg(message))
                 {
                     LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EfemRobot, $"OnCommandUpdated() unexpected return: {message.Operation}, expect: {_currentMsg.Operation}");
                     return;

+ 188 - 0
Venus/Venus_RT/Devices/TM/HongHuTM.cs

@@ -0,0 +1,188 @@
+using Aitex.Core.Common.DeviceData;
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Device.Unit;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Venus_Core;
+
+namespace Venus_RT.Devices
+{
+    public class HongHuTM : TM
+    {
+        /// <summary>
+        /// 针对VenusSE设计
+        /// </summary>
+        #region io 信号抽象
+        //控制阀信号
+        private readonly IoValve _TMFastPumpValve;
+        private readonly IoValve _TMSoftPumpValve;
+        private readonly IoValve _VCESoftPumpValve;
+        private readonly IoValve _VCEFastPumpValve;
+        private readonly IoValve _TMFastVentValve;
+        private readonly IoValve _TMSoftVentValve;
+        private readonly IoValve _VCESoftVentValve;
+        private readonly IoValve _VCEFastVentValve;
+
+        //判断信号
+        private readonly IoSensor _VCESlitDoorOpen;
+        private readonly IoSensor _PMASlitDoorOpen;
+        private readonly IoSensor _PMBSlitDoorOpen;
+        private readonly IoSensor _PMCSlitDoorOpen;
+        private readonly IoSensor _VCESlitDoorOpenEnable;
+        private readonly IoSensor _PMASlitDoorOpenEnable;
+        private readonly IoSensor _PMBSlitDoorOpenEnable;
+        private readonly IoSensor _PMCSlitDoorOpenEnable;
+        private readonly IoSensor _TMExtendVCEEnable;
+        private readonly IoSensor _TMExtendPMAEnable;
+        private readonly IoSensor _TMExtendPMBEnable;
+        private readonly IoSensor _TMExtendPMCEnable;
+        private readonly IoSensor _TMATMSensor;
+        private readonly IoSensor _VCEATMSensor;
+
+        //控制门信号
+        private readonly IoCylinder _VCESlitDoor;
+        private readonly IoCylinder _PMASlitDoor;
+        private readonly IoCylinder _PMBSlitDoor;
+        private readonly IoCylinder _PMCSlitDoor;
+        #endregion
+
+        #region 暴露变量
+        //ATM VAC信号
+        public bool IsTMATM => _TMATMSensor.Value;
+        public bool IsVCEATM => _VCEATMSensor.Value;
+        //valve开关状态
+        public bool IsTMFastPumpOpen => _TMFastPumpValve.Status;
+        public bool IsTMSoftPumpOpen => _TMSoftPumpValve.Status;
+        public bool IsTMFastVentOpen => _TMFastVentValve.Status;
+        public bool IsTMSoftVentOpen => _TMSoftVentValve.Status;
+        public bool IsVCEFastPumpOpen => _VCEFastPumpValve.Status;
+        public bool IsVCESoftPumpOpen => _VCESoftPumpValve.Status;
+        public bool IsVCEFastVentOpen => _VCEFastVentValve.Status;
+        public bool IsVCESoftVentOpen => _VCESoftVentValve.Status;
+        //SlitDoor
+        public bool VCESlitDoorClosed => _VCESlitDoor.State == CylinderState.Close;
+        public bool PMASlitDoorClosed => _PMASlitDoor.State == CylinderState.Close;
+        public bool PMBSlitDoorClosed => _PMBSlitDoor.State == CylinderState.Close;
+        public bool PMCSlitDoorClosed => _PMCSlitDoor.State == CylinderState.Close;
+        public bool VCESlitDoorOpenEnable => _VCESlitDoorOpenEnable.Value;
+        public bool PMASlitDoorOpenEnable => _PMASlitDoorOpenEnable.Value;
+        public bool PMBSlitDoorOpenEnable => _PMBSlitDoorOpenEnable.Value;
+        public bool PMCSlitDoorOpenEnable => _PMCSlitDoorOpenEnable.Value;
+        //Robot动作
+        public bool TMExtendVCEEnable => _TMExtendVCEEnable.Value;
+        public bool TMExtendPMAEnable => _TMExtendPMAEnable.Value;
+        public bool TMExtendPMBEnable => _TMExtendPMBEnable.Value;
+        public bool TMExtendPMCEnable => _TMExtendPMCEnable.Value;
+
+        #endregion
+
+        public HongHuTM(string module) : base(module)
+        {
+            _TMFastPumpValve       = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.TMFastPumpValve}");
+            _TMSoftPumpValve       = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.TMSoftPumpValve}");
+            _VCESoftPumpValve      = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.VCESoftPumpValve}");
+            _VCEFastPumpValve      = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.VCEFastPumpValve}");
+            _TMFastVentValve       = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.TMFastPumpValve}");
+            _TMSoftVentValve       = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.TMSoftVentValve}");
+            _VCESoftVentValve      = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.VCESoftVentValve}");
+            _VCEFastVentValve      = DEVICE.GetDevice<IoValve>($"TM.{VenusDevice.VCEFastVentValve}");
+            _VCESlitDoorOpenEnable = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.VCESlitDoorOpenEnable}");
+            _PMASlitDoorOpenEnable = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.PMASlitDoorOpenEnable}");
+            _PMBSlitDoorOpenEnable = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.PMBSlitDoorOpenEnable}");
+            _PMCSlitDoorOpenEnable = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.PMCSlitDoorOpenEnable}");
+            _TMExtendVCEEnable     = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.TMExtendVCEEnable}");
+            _TMExtendPMAEnable     = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.TMExtendPMAEnable}");
+            _TMExtendPMBEnable     = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.TMExtendPMBEnable}");
+            _TMExtendPMCEnable     = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.TMExtendPMCEnable}");
+            _TMATMSensor           = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.TMATMSensor}");
+            _VCEATMSensor          = DEVICE.GetDevice<IoSensor>($"TM.{VenusDevice.VCEATMSensor}");
+            _VCESlitDoor           = DEVICE.GetDevice<IoCylinder>($"TM.{VenusDevice.VCESlitDoor}");
+            _PMASlitDoor           = DEVICE.GetDevice<IoCylinder>($"TM.{VenusDevice.PMASlitDoor}");
+            _PMBSlitDoor           = DEVICE.GetDevice<IoCylinder>($"TM.{VenusDevice.PMBSlitDoor}");
+            _PMCSlitDoor           = DEVICE.GetDevice<IoCylinder>($"TM.{VenusDevice.PMCSlitDoor}");
+        }
+
+        #region IO控制方法
+
+
+        //slitdoor
+        public void TurnSlitDoor(ModuleName mod, bool bOn)
+        {
+            switch(mod) 
+            {
+                case ModuleName.VCE1: 
+                    _VCESlitDoor.SetCylinder(bOn, out _); 
+                    break;
+                case ModuleName.PMA: 
+                    _PMASlitDoor.SetCylinder(bOn, out _);  
+                    break;
+                case ModuleName.PMB: 
+                    _PMBSlitDoor.SetCylinder(bOn, out _);  
+                    break;
+                case ModuleName.PMC: 
+                    _PMCSlitDoor.SetCylinder(bOn, out _);  
+                    break;
+            }
+        }
+
+        //valve
+        public void TurnFastPumpValve(ModuleName mod, bool bOn)
+        {
+            switch (mod) 
+            {
+                case ModuleName.TM:
+                    _TMFastPumpValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.VCE1:
+                    _VCEFastPumpValve.TurnValve(bOn, out string _);
+                    break;
+            }
+        }
+
+        public void TurnSoftPumpValve(ModuleName mod, bool bOn)
+        {
+            switch (mod)
+            {
+                case ModuleName.TM:
+                    _TMSoftPumpValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.VCE1:
+                    _VCESoftPumpValve.TurnValve(bOn, out string _);
+                    break;
+            }
+        }
+
+        public void TurnFastVentValve(ModuleName mod, bool bOn)
+        {
+            switch (mod)
+            {
+                case ModuleName.TM:
+                    _TMFastVentValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.VCE1:
+                    _VCEFastVentValve.TurnValve(bOn, out string _);
+                    break;
+            }
+        }
+
+        public void TurnSoftVentValve(ModuleName mod, bool bOn)
+        {
+            switch (mod)
+            {
+                case ModuleName.TM:
+                    _TMSoftVentValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.VCE1:
+                    _VCESoftVentValve.TurnValve(bOn, out string _);
+                    break;
+            }
+        }
+        #endregion
+
+    }
+}

+ 367 - 0
Venus/Venus_RT/Devices/TM/HongHuVR.cs

@@ -0,0 +1,367 @@
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.SCCore;
+using Aitex.Core.Util;
+using Aitex.Sorter.Common;
+using MECF.Framework.Common.CommonData;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.SubstrateTrackings;
+using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Venus_Core;
+using Venus_RT.Modules;
+
+namespace Venus_RT.Devices.VCE
+{
+    //泓浒
+    enum VRStep
+    {
+        Idle,
+        Home,
+        Move,
+        Halt,
+        Release,
+        Goto,
+        Pick,
+        PickExtend,
+        PickRetract,
+        Place,
+        PlaceExtend,
+        PlaceRetract,
+        Xfer,
+        CheckLoad_ArmA,
+        CheckLoad_ArmB,
+        SetLoad,
+        ReQueryLoad,
+    }
+    public class HongHuVR : ITransferRobot
+    {
+        private readonly AsyncSocket _socket;
+        private const string EOF = "\r";
+        private RState _status;
+        private bool _IsHomed;
+        private VRStep _currentStep = VRStep.Idle;
+        private Dictionary<ModuleName, int> _StationNumbers = new Dictionary<ModuleName, int>();
+        private RobotMoveInfo _robotMoveInfo = new RobotMoveInfo();
+        public RState Status { get { return _status; } }
+        public bool IsHomed { get { return _IsHomed; } }
+        private string Hand2Arm(Hand hand) => hand == Hand.Blade1 ? "B" : "A";
+
+        private readonly Regex _rex_check_load = new Regex(@"LOAD\s+(A|B)\s+(\w+)\s*");
+        private readonly Regex _rex_error_code = new Regex(@"_ERR\s+(\d+)\s*");
+        public RobotMoveInfo VaccumRobotMoveInfo { get { return _robotMoveInfo; } }
+
+        public RobotMoveInfo TMRobotMoveInfo => throw new NotImplementedException();
+
+        public double Offset_X => 0;
+                                  
+        public double Offset_Y => 0;
+                                  
+        public double Offset_D => 0;
+
+        public Dictionary<string, string> _error2msg = new Dictionary<string, string>()
+        {
+            { "701" , "设备检查互锁,发现无法执行"},
+            { "722" , "设备动作,但是发生异常"},
+        };
+
+        public HongHuVR()
+        {
+
+            _socket = new AsyncSocket("", EOF);
+            _socket.Connect(SC.GetStringValue($"VacRobot.IPAddress"));
+            _socket.OnDataChanged += OnReceiveMessage;
+            _socket.OnErrorHappened += OnErrorHappen;
+
+            _status = RState.Init;
+            _IsHomed = false;
+        }
+        //初始化某个轴
+        //1.清错
+        //2.设备上电
+        //3.各轴按顺序运动
+        public bool Home()
+        {
+            _status = RState.Running;
+            _currentStep = VRStep.Home;
+            return _SendCommand("HOME ALL");
+        }
+        public bool Halt()
+        {
+            _status = RState.Running;
+            _currentStep = VRStep.Halt;
+            return _SendCommand("HALT");
+        }
+        public bool Release()
+        {
+            _status = RState.Running;
+            _currentStep = VRStep.Release;
+            return _SendCommand("RELEASE");
+        }
+        //public bool MOVE()
+        //{
+        //}
+        public bool Pick(ModuleName station, int slot, Hand hand)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.Pick;
+            _status = RState.Running;
+            SetRobotMovingInfo(RobotAction.Picking, hand, station);
+            return _SendCommand($"PICK {_StationNumbers[station]} ARM {Hand2Arm(hand)}");
+        }
+
+        public bool PickExtend(ModuleName station, int slot, Hand hand)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.PickExtend;
+            _status = RState.Running;
+            SetRobotMovingInfo(RobotAction.Picking, hand, station);
+            return _SendCommand($"PICK {_StationNumbers[station]} ARM {Hand2Arm(hand)} ENRT NR");
+        }
+
+        public bool PickRetract(ModuleName station, int slot, Hand hand)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.PickRetract;
+            _status = RState.Running;
+            SetRobotMovingInfo(RobotAction.Picking, hand, station);
+            return _SendCommand($"PICK {_StationNumbers[station]} ARM {Hand2Arm(hand)} STRT NR");
+        }
+        public bool Place(ModuleName station, int slot, Hand hand)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.Place;
+            _status = RState.Running;
+            SetRobotMovingInfo(RobotAction.Picking, hand, station);
+            return _SendCommand($"PLACE {_StationNumbers[station]} ARM {Hand2Arm(hand)}");
+        }
+        public bool PlaceExtend(ModuleName station, int slot, Hand hand)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.Place;
+            _status = RState.Running;
+            SetRobotMovingInfo(RobotAction.Picking, hand, station);
+            return _SendCommand($"PLACE {_StationNumbers[station]} ARM {Hand2Arm(hand)} ENRT NR");
+        }
+        public bool PlaceRetract(ModuleName station, int slot, Hand hand)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.Place;
+            _status = RState.Running;
+            SetRobotMovingInfo(RobotAction.Picking, hand, station);
+            return _SendCommand($"PLACE {_StationNumbers[station]} ARM {Hand2Arm(hand)} STRT NR");
+        }
+        public bool Transfer(ModuleName fromstation, ModuleName tostation, Hand hand)
+        {
+            if (!CheckRobotStatus())
+                return false;
+
+            _currentStep = VRStep.Xfer;
+            _status = RState.Running;
+            return _SendCommand($"XFER ARM {Hand2Arm(hand)} {_StationNumbers[fromstation]} {_StationNumbers[tostation]}");
+
+        }
+        public bool CheckLoad(Hand hand = Hand.Blade1)
+        {
+            if (_currentStep != VRStep.Home && _currentStep != VRStep.CheckLoad_ArmA && !CheckRobotStatus())
+                return false;
+
+            _currentStep = hand == Hand.Blade2 ? VRStep.CheckLoad_ArmB : VRStep.CheckLoad_ArmA;
+            _status = RState.Running;
+            return _SendCommand($"CHECK LOAD ARM {Hand2Arm(hand)}");
+        }
+
+
+        public bool QueryAwc()
+        {
+            return true;
+        }
+
+        public bool Goto(ModuleName station, int slot, Hand hand)
+        {
+            _currentStep = VRStep.Goto;
+            _status = RState.Running;
+            return _SendCommand($"GOTO N {_StationNumbers[station]}");
+        }
+
+        public bool MoveTo(ModuleName stnFrom, ModuleName stnTo, Hand hand)
+        {
+            _currentStep = VRStep.Move;
+            _status = RState.Running;
+            return _SendCommand($"MOVE R ABS 100 ARM {Hand2Arm(hand)}"); ;
+        }
+
+        private bool _SendCommand(string cmd)
+        {
+            LOG.WriteSingeLine(eEvent.INFO_TM_ROBOT, ModuleName.VaccumRobot, $"Send Command to HongHu VaccumRobot: {cmd}");
+            return _socket.Write(cmd + EOF);
+        }
+
+        private bool CheckRobotStatus()
+        {
+            if (Status == RState.Init)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, ModuleName.VaccumRobot, "VaccumRobot is not homed, please home first.");
+                return false;
+            }
+            else if (Status == RState.Running)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, ModuleName.VaccumRobot, "VaccumRobot is busy, please wait a minute");
+                return false;
+            }
+            else if (Status == RState.Failed || Status == RState.Timeout)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, ModuleName.VaccumRobot, "VaccumRobot has a error, please check and fix the hardware issue and home it");
+                return false;
+            }
+
+            return true;
+        }
+
+        private void OnReceiveMessage(string RevMsg)
+        {
+            LOG.WriteSingeLine(eEvent.INFO_TM_ROBOT, ModuleName.VaccumRobot, $"Receive message from HongHu VaccumRobot: {RevMsg}, while {_currentStep}");
+
+            if (_rex_error_code.IsMatch(RevMsg))
+            {
+                _IsHomed = false;
+                _status = RState.Failed;
+
+                var results = _rex_error_code.Match(RevMsg);
+                ErrorMessageHandler(results.Groups[1].Value);
+                return;
+            }
+
+            switch (_currentStep)
+            {
+                case VRStep.Goto:
+                case VRStep.Move:
+                case VRStep.Xfer:
+                case VRStep.Pick:
+                case VRStep.PickExtend:
+                case VRStep.PickRetract:
+                case VRStep.Place:
+                case VRStep.PlaceExtend:
+                case VRStep.PlaceRetract:
+                    {
+                        if (RevMsg.Trim() == "_RDY" || (RevMsg.Contains("_RDY") && !RevMsg.Contains("_ERR")))
+                        {
+                            _currentStep = VRStep.Idle;
+                            _status = RState.End;
+                        }
+                        else
+                        {
+                            ReportWrongMsg(RevMsg);
+                        }
+
+                        if (_currentStep != VRStep.PickExtend && _currentStep != VRStep.PlaceExtend)
+                            SetRobotMovingInfo(RobotAction.None, Hand.Both, ModuleName.VaccumRobot);
+                    }
+                    break;
+                case VRStep.Home:
+                    {
+
+                        if (RevMsg.Trim() == "_RDY")
+                        {
+                            //CheckLoad(Hand.Blade1);
+                            _currentStep = VRStep.Idle;
+                            _status = RState.End;
+                            _IsHomed = true;
+                        }
+                        else
+                            ReportWrongMsg(RevMsg);
+                    }
+                    break;
+                case VRStep.CheckLoad_ArmA:
+                    {
+                        if (_rex_check_load.IsMatch(RevMsg))
+                        {
+                            GetCheckLoadResult(RevMsg);
+
+                            CheckLoad(Hand.Blade2);
+                        }
+                        else
+                            ReportWrongMsg(RevMsg);
+                    }
+                    break;
+                case VRStep.CheckLoad_ArmB:
+                    {
+                        if (_rex_check_load.IsMatch(RevMsg))
+                        {
+                            GetCheckLoadResult(RevMsg);
+
+                            _currentStep = VRStep.Idle;
+                            _status = RState.End;
+                            _IsHomed = true;
+                        }
+                    }
+                    break;
+                default:
+                    if (!RevMsg.Contains("_EVENT"))
+                        ReportWrongMsg(RevMsg);
+                    break;
+            }
+        }
+
+        private void GetCheckLoadResult(string revMsg)
+        {
+            Match result = _rex_check_load.Match(revMsg);
+
+            string Arm = result.Groups[1].Value;
+            string WaferStatus = result.Groups[2].Value;
+            if (WaferStatus == "ON")
+            {
+                WaferManager.Instance.CreateWafer(ModuleName.VaccumRobot, Arm == "A" ? 0 : 1, Aitex.Core.Common.WaferStatus.Unknown);
+            }
+        }
+
+        private void ErrorMessageHandler(string errorcode)
+        {
+            string ErrorInfo;
+            if (_error2msg.ContainsKey(errorcode))
+            {
+                ErrorInfo = _error2msg[errorcode];
+                LOG.Write(eEvent.ERR_DEVICE_INFO, ModuleName.VaccumRobot, ErrorInfo);
+            }
+            else
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, ModuleName.VaccumRobot, $"Dictionary Not Contains error code:{errorcode}");
+            }
+        }
+
+        private void OnErrorHappen(ErrorEventArgs args)
+        {
+            Singleton<RouteManager>.Instance.TM.PostMsg(TMEntity.MSG.Error);
+            LOG.Write(eEvent.ERR_DEVICE_INFO, ModuleName.VaccumRobot, $"HongHu VaccumRobot Error: {args.Reason} while {_currentStep}");
+        }
+
+        private void ReportWrongMsg(string revMsg)
+        {
+            LOG.Write(eEvent.ERR_DEVICE_INFO, ModuleName.VaccumRobot, $"Receive wrong message:{revMsg} while {_currentStep}");
+        }
+
+        public void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target)
+        {
+            _robotMoveInfo.Action = action;
+            _robotMoveInfo.ArmTarget = hand == Hand.Blade1 ? RobotArm.ArmA : (hand == Hand.Both ? RobotArm.Both : RobotArm.ArmB);
+            _robotMoveInfo.BladeTarget = $"{_robotMoveInfo.ArmTarget}.{target}";
+        }
+
+    }
+}

+ 132 - 0
Venus/Venus_RT/Modules/TM/VenusEntity/SETMEntity.cs

@@ -0,0 +1,132 @@
+using Aitex.Core.RT.Fsm;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Venus_Core;
+using Venus_RT.Devices;
+
+namespace Venus_RT.Modules.TM.VenusEntity
+{
+    public class SETMEntity : Entity, IModuleEntity
+    {
+        public enum STATE
+        {
+            Unknown,
+            Init,
+            Initializing,
+            InitializingRB,
+            Idle,
+            Error,
+            Pumping,
+            Venting,
+            Purging,
+            Leakchecking,
+            Picking,
+            Placing,
+            Swaping,
+            PMPicking,
+            PMPlacing,
+            PMSwaping,
+            Aligning,
+            Mapping,
+            Extending,
+            Retracting,
+            Swapping,
+            Gotoing,
+            ControllingPressure
+        }
+
+        public enum MSG
+        {
+            Home,
+            RobotHome,
+            Online,
+            Offline,
+            Pump,
+            Vent,
+            Purge,
+            CyclePurge,
+            LeakCheck,
+            Pick,
+            Place,
+            Swap,
+            DoublePick,
+            DoublePlace,
+            DoubleSwap,
+            PMPick,
+            PMPlace,
+            PMSwap,
+            Extend,
+            Retract,
+            TMCycle,
+            ControlPressure,
+            Error,
+            Abort,
+            AbortControlPressure
+        }
+
+        public bool IsIdle
+        {
+            get { return fsm.State == (int)STATE.Idle; }
+        }
+
+        public bool IsError
+        {
+            get { return fsm.State == (int)STATE.Error; }
+        }
+
+        public bool IsInit
+        {
+            get { return fsm.State == (int)STATE.Unknown || fsm.State == (int)STATE.Init; }
+        }
+
+        public bool IsBusy
+        {
+            get { return !IsInit && !IsError && !IsIdle; }
+        }
+
+        public RState RobotStatus
+        {
+            get
+            {
+                if (_robot.Status != RState.Running)
+                {
+                    if (_robotWatch.ElapsedMilliseconds < 100)
+                        return RState.Running;
+                    else
+                        return _robot.Status;
+                }
+                else
+                    return RState.Running;
+            }
+        }
+        private readonly ITransferRobot _robot;
+        private readonly Stopwatch _robotWatch;
+
+        public SETMEntity()
+        {
+
+        }
+
+
+
+        public bool Check(int msg, out string reason, params object[] args)
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool CheckAcked(int msg)
+        {
+            throw new NotImplementedException();
+        }
+
+
+        public int Invoke(string function, params object[] args)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 338 - 0
Venus/Venus_Simulator/Config/_ioDefineVenusSE_MF.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>

+ 83 - 0
Venus/Venus_Simulator/Devices/SETMSimulatorServer.cs

@@ -0,0 +1,83 @@
+using Aitex.Core.Util;
+using MECF.Framework.Simulator.Core.Driver;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Venus_Simulator.Devices
+{
+    public class SETMSimulatorServer : SocketDeviceSimulator
+    {
+        private readonly Regex _check_load = new Regex(@"CHECK LOAD\s+(\d+)\s+ARM\s+(A|B)\s*");
+        private readonly Regex _move_arm = new Regex(@"(PLACE|PICK)\s+(\d+)\s+ARM\s+(A|B)\s*");
+        private readonly Regex _move_wafer = new Regex(@"(PLACE|PICK)\s+(\d+)\s+ARM\s+(A|B)\s*");
+
+        private PeriodicJob _HwThread;
+        public SETMSimulatorServer() : base(1103, -1, "\r\n", ' ')
+        {
+            _HwThread = new PeriodicJob(500, OnSendEvent, "honghuRobot", true);
+        }
+
+        private bool OnSendEvent()
+        {
+            return true;
+        }
+
+        protected override void ProcessUnsplitMessage(string str)
+        {
+            if (str.Contains("HOME") || str.Contains("GOTO") || str.Contains("XFER"))
+            {
+                OnWriteMessage("_RDY");
+            }
+
+            //if (str.Contains("RQ WAF_CEN DATA"))
+            //{
+            //    string t = new Random().Next(0, 359).ToString().PadLeft(6, '0');
+            //    string r = new Random().Next(0, 50000).ToString().PadLeft(6, '0');
+            //    OnWriteMessage($"WAF_CEN RT 000000 000000 000000 000000 LFT 000000 000000 000000 000000 OFFSET {r} {t}");
+            //    OnWriteMessage("_RDY");
+            //}
+
+            if (_check_load.IsMatch(str))
+            {
+                Match result = _check_load.Match(str);
+                string station = result.Groups[1].Value;
+                string arm = result.Groups[2].Value;
+
+                OnWriteMessage(string.Format($"LOAD {arm} OFF"));
+            }
+            else if (_move_arm.IsMatch(str))
+            {
+                // @"(PLACE|PICK)\s+(\d+)\s+SLOT\s+(\d+)\s+ARM\s+(A|B)\s+(\w{4})\s+"
+
+                Match result = _move_arm.Match(str);
+                string operation = result.Groups[1].Value;
+                string station = result.Groups[2].Value;
+                string slot = result.Groups[3].Value;
+                string arm = result.Groups[4].Value;
+                string dir = result.Groups[5].Value;
+
+                Thread.Sleep(5000);
+                OnWriteMessage("_RDY");
+            }
+            else if (_move_wafer.IsMatch(str))
+            {
+                // @"(PLACE|PICK)\s+(\d+)\s+SLOT\s+(\d+)\s+ARM\s+(A|B)\s+"
+
+                Match result = _move_wafer.Match(str);
+                string operation = result.Groups[1].Value;
+                string station = result.Groups[2].Value;
+                string slot = result.Groups[3].Value;
+                string arm = result.Groups[4].Value;
+
+                Thread.Sleep(5000);
+                OnWriteMessage("_RDY");
+            }
+
+        }
+    }
+}

+ 68 - 0
Venus/Venus_Themes/UserControls/Vce.xaml

@@ -0,0 +1,68 @@
+<UserControl x:Class="Venus_Themes.UserControls.Vce"
+             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_Themes.UserControls"
+             xmlns:converters="clr-namespace:Venus_Themes.Converters"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800" Name="vceChamber">
+    <UserControl.Resources>
+        <Style TargetType="Rectangle" x:Key="doorAnimation">
+            <Setter Property="Width" Value="200"/>
+            <Style.Triggers>
+                <DataTrigger Binding="{Binding ElementName=door2,Path=DoorIsOpen}" Value="True">
+                    <DataTrigger.EnterActions>
+                        <BeginStoryboard>
+                            <Storyboard>
+                                <DoubleAnimation  Storyboard.TargetProperty="Width" To="40" Duration="0:0:1"/>
+                            </Storyboard>
+                        </BeginStoryboard>
+                    </DataTrigger.EnterActions>
+                    <DataTrigger.ExitActions>
+                        <BeginStoryboard>
+                            <Storyboard>
+                                <DoubleAnimation  Storyboard.TargetProperty="Width" To="200" Duration="0:0:1"/>
+                            </Storyboard>
+                        </BeginStoryboard>
+                    </DataTrigger.ExitActions>
+                </DataTrigger>
+            </Style.Triggers>
+        </Style>
+        <converters:BoolToBool x:Key="BoolToBool"/>
+    </UserControl.Resources>
+    <Viewbox>
+        <Canvas Height="120" Width="200">
+            <Canvas.Background>
+                <LinearGradientBrush StartPoint="1,1" EndPoint="0,0">
+                    <GradientStop Color="#337c8e" Offset="0"></GradientStop>
+                    <GradientStop Color="#27829e" Offset="0.3"></GradientStop>
+                    <GradientStop Color="#729bab" Offset=".5"></GradientStop>
+                    <GradientStop Color="#27829e" Offset="0.8"></GradientStop>
+                    <GradientStop Color="#337c8e" Offset="1"></GradientStop>
+                </LinearGradientBrush>
+            </Canvas.Background>
+            <Rectangle Cursor="Hand" DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl,AncestorLevel=1}}" Style="{StaticResource doorAnimation}"  Fill="DimGray"   VerticalAlignment="Top"    Height="15"    Canvas.Top="-20" Canvas.Left="-4" Name="door2">
+                <Rectangle.RenderTransform >
+                    <RotateTransform CenterX="102" CenterY="10" Angle="180"/>
+                </Rectangle.RenderTransform>
+                <Rectangle.ContextMenu >
+                    <ContextMenu>
+                        <MenuItem Header="Open Door"  Click="OpenDoor_Click"    IsChecked="{Binding DoorIsOpen}" IsEnabled="{Binding DoorIsOpen,Converter={StaticResource BoolToBool}}"/>
+                        <MenuItem Header="Close Door" Click="CloseDoor_Click"    IsChecked="{Binding DoorIsOpen,Converter={StaticResource BoolToBool}}" IsEnabled="{Binding DoorIsOpen}"/>
+                    </ContextMenu>
+                </Rectangle.ContextMenu>
+            </Rectangle>
+            <Border Canvas.Bottom="0" Canvas.Left="10">
+                <Rectangle Fill="#fac090"  Width="180" Height="10" >
+                    <Rectangle.ContextMenu >
+                        <ContextMenu>
+                            <MenuItem Header="Open Door"  Click="OpenInnerDoor_Click"    IsChecked="{Binding VceInnerDoorDoorIsOpen}" IsEnabled="{Binding VceInnerDoorDoorIsOpen,Converter={StaticResource BoolToBool}}"/>
+                            <MenuItem Header="Close Door" Click="CloseInnerDoor_Click"    IsChecked="{Binding VceInnerDoorDoorIsOpen,Converter={StaticResource BoolToBool}}" IsEnabled="{Binding VceInnerDoorDoorIsOpen}"/>
+                        </ContextMenu>
+                    </Rectangle.ContextMenu>
+                </Rectangle>
+            </Border>
+        </Canvas>
+    </Viewbox>
+</UserControl>

+ 56 - 0
Venus/Venus_Themes/UserControls/Vce.xaml.cs

@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Venus_Themes.UserControls
+{
+    /// <summary>
+    /// Vce.xaml 的交互逻辑
+    /// </summary>
+    public partial class Vce : UserControl
+    {
+        public Vce()
+        {
+            InitializeComponent();
+            DoorIsOpen = false;
+            VceInnerDoorDoorIsOpen = false;
+        }
+
+
+        public bool DoorIsOpen { get; set; }
+        public bool VceInnerDoorDoorIsOpen { get; set; }
+
+        private void OpenDoor_Click(object sender, RoutedEventArgs e)
+        {
+            //UIEvents.OnPMDoorRaiseChanged(new DoorPara() { ModuleName = ModuleName, IsOpen = "Open" });
+            DoorIsOpen = true;
+        }
+
+        private void CloseDoor_Click(object sender, RoutedEventArgs e)
+        {
+            //UIEvents.OnPMDoorRaiseChanged(new DoorPara() { ModuleName = ModuleName, IsOpen = "Close" });
+            DoorIsOpen = false;
+        }
+
+        private void OpenInnerDoor_Click(object sender, RoutedEventArgs e)
+        {
+            VceInnerDoorDoorIsOpen = true;
+        }
+
+        private void CloseInnerDoor_Click(object sender, RoutedEventArgs e)
+        {
+            VceInnerDoorDoorIsOpen = false;
+        }
+    }
+}

+ 81 - 0
Venus/Venus_Themes/UserControls/VenusSETM.xaml

@@ -0,0 +1,81 @@
+<UserControl x:Class="Venus_Themes.UserControls.VenusSETM"
+             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_Themes.UserControls"
+             mc:Ignorable="d" 
+             xmlns:converters="clr-namespace:Venus_Themes.Converters"
+             d:DesignHeight="450" d:DesignWidth="800" Name="venusSetm">
+
+    <Viewbox>
+        <Canvas Width="200" Height="200">
+            <Border BorderBrush="Gray" BorderThickness="2" Canvas.Top="20" Canvas.Left="20" CornerRadius="2">
+                <Rectangle Height="200" Width="200" >
+                    <Rectangle.Fill>
+                        <LinearGradientBrush StartPoint="-1,0" EndPoint="0,-1">
+                            <GradientStop Color="Gray" Offset="0"></GradientStop>
+                            <GradientStop Color="LightGray" Offset=".2"></GradientStop>
+                            <GradientStop Color="White" Offset=".5"></GradientStop>
+                            <GradientStop Color="LightGray" Offset=".8"></GradientStop>
+                            <GradientStop Color="Gray" Offset="1"></GradientStop>
+                        </LinearGradientBrush>
+                    </Rectangle.Fill>
+                </Rectangle>
+            </Border>
+
+            <Viewbox Stretch="Uniform" Width="100" Height="100" Canvas.Left="222"  Canvas.Top="75" Canvas.ZIndex="2">
+                <Canvas UseLayoutRounding="False"  Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Center">
+                    <Canvas.Background>
+                        <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
+                            <GradientStop Color="Gray" Offset="0"></GradientStop>
+                            <GradientStop Color="White" Offset=".5"></GradientStop>
+                            <GradientStop Color="Gray" Offset="1"></GradientStop>
+                        </LinearGradientBrush>
+                    </Canvas.Background>
+                    <Canvas  Width="72.522" Height="72.521" Canvas.Left="14" Canvas.Top="14">
+                        <Path Data="F1M10.473,65.041C10.473,85.068,26.708,101.302,46.734,101.302L46.734,101.302C66.761,101.302,82.995,85.068,82.995,65.041L82.995,65.041C82.995,45.015,66.761,28.781,46.734,28.781L46.734,28.781C26.708,28.781,10.473,45.015,10.473,65.041" Stretch="Fill" Width="72.522" Height="72.521" Canvas.Left="0" Canvas.Top="0">
+                            <Path.Fill>
+                                <RadialGradientBrush Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5" GradientOrigin="0.5,0.5">
+                                    <RadialGradientBrush.GradientStops>
+                                        <GradientStop Color="#FFE5E2DF" Offset="0" />
+                                        <GradientStop Color="#FFFFFFFF" Offset="0" />
+                                        <GradientStop Color="#FFADAEB0" Offset="0.52" />
+                                        <GradientStop Color="sc#1, 0.238698155, 0.250727534, 0.259264916" Offset="0.82" />
+                                        <GradientStop Color="#FF454F52" Offset="1" />
+                                    </RadialGradientBrush.GradientStops>
+                                </RadialGradientBrush>
+                            </Path.Fill>
+                        </Path>
+                        <Path Data="M46.8477,55.6938C52.0087,55.6938 56.1937,59.8788 56.1937,65.0398 56.1937,70.2008 52.0087,74.3858 46.8477,74.3858 41.6857,74.3858 37.5007,70.2008 37.5007,65.0398 37.5007,59.8788 41.6857,55.6938 46.8477,55.6938z" Stretch="Fill" Stroke="White" StrokeThickness="0.25" Width="18.943" Height="18.942" Canvas.Left="26.903" Canvas.Top="26.788" />
+                    </Canvas>
+                    <Canvas   Width="5.857" Height="5.855" Canvas.Left="48" Canvas.Top="48">
+                        <Path Data="M46.8477,62.1133C48.4637,62.1133 49.7757,63.4243 49.7757,65.0413 49.7757,66.6583 48.4637,67.9683 46.8477,67.9683 45.2307,67.9683 43.9187,66.6583 43.9187,65.0413 43.9187,63.4243 45.2307,62.1133 46.8477,62.1133z" Stretch="Fill" Fill="LightBlue" Stroke="#FF4C4C4C" StrokeThickness="0.25" Width="6.107" Height="6.105" Canvas.Left="-0.125" Canvas.Top="-0.125" />
+                    </Canvas>
+                    <Canvas   Width="56.555" Height="56.556" Canvas.Left="23" Canvas.Top="23">
+                        <Path Data="M46.8477,46.3472C57.1717,46.3472 65.5407,54.7172 65.5407,65.0412 65.5407,75.3652 57.1717,83.7342 46.8477,83.7342 36.5227,83.7342 28.1537,75.3652 28.1537,65.0412 28.1537,54.7172 36.5227,46.3472 46.8477,46.3472z" Stretch="Fill" Stroke="White" StrokeThickness="0.25" Width="37.637" Height="37.637" Canvas.Left="9.459" Canvas.Top="9.46" />
+                        <Path Data="M46.8477,36.8872C62.3957,36.8872 74.9997,49.4912 74.9997,65.0402 74.9997,80.5882 62.3957,93.1932 46.8477,93.1932 31.2987,93.1932 18.6947,80.5882 18.6947,65.0402 18.6947,49.4912 31.2987,36.8872 46.8477,36.8872z" Stretch="Fill" Stroke="White" StrokeThickness="0.25" Width="56.555" Height="56.556" />
+                    </Canvas>
+                </Canvas>
+            </Viewbox>
+            <Viewbox Width="70" Height="70"  Canvas.Left="237"  Canvas.Top="90">
+                <local:WaferCtrl WaferData="{Binding ElementName=efem, Path=Aligner1Wafer}"/>
+            </Viewbox>
+            <Border  Canvas.Top="223" Canvas.Left="29" BorderBrush="Gray" BorderThickness="3" CornerRadius="0,0,5,5" Opacity=".5">
+                <Canvas Width="180" Height="80" HorizontalAlignment="Left" VerticalAlignment="Center" Panel.ZIndex="2">
+                    <Canvas.Background>
+                        <LinearGradientBrush StartPoint="1,1" EndPoint="0,0">
+                            <GradientStop Color="Gray" Offset="0"></GradientStop>
+                            <GradientStop Color="LightGray" Offset=".2"></GradientStop>
+                            <GradientStop Color="White" Offset=".5"></GradientStop>
+                            <GradientStop Color="LightGray" Offset=".8"></GradientStop>
+                            <GradientStop Color="Gray" Offset="1"></GradientStop>
+                        </LinearGradientBrush>
+                    </Canvas.Background>
+                </Canvas>
+            </Border>
+           
+        </Canvas>
+    </Viewbox>
+       
+</UserControl>

+ 30 - 0
Venus/Venus_Themes/UserControls/VenusSETM.xaml.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Venus_Themes.Unity;
+
+namespace Venus_Themes.UserControls
+{
+    /// <summary>
+    /// VenusSETM.xaml 的交互逻辑
+    /// </summary>
+    public partial class VenusSETM : UserControl
+    {
+        public VenusSETM()
+        {
+            InitializeComponent();
+        }
+
+    }
+}