Browse Source

TM 添加两个pump 串口23/24/25/26

lixiang 1 year ago
parent
commit
be22c5112d

+ 34 - 5
Venus/Venus_MainPages/ViewModels/TMOperationViewModel.cs

@@ -10,7 +10,6 @@ using System.Windows.Threading;
 using Venus_Core;
 using Venus_MainPages.Unity;
 using Venus_Themes.CustomControls;
-using Venus_Themes.UserControls;
 
 namespace Venus_MainPages.ViewModels
 {
@@ -215,7 +214,21 @@ namespace Venus_MainPages.ViewModels
         private DelegateCommand<object> _ControlValveCommand;
         public DelegateCommand<object> ControlValveCommand =>
             _ControlValveCommand ?? (_ControlValveCommand = new DelegateCommand<object>(OnControlValve));
+        private DelegateCommand _OpenLLPumpCommand;
+        public DelegateCommand OpenLLPumpCommand =>
+            _OpenLLPumpCommand ?? (_OpenLLPumpCommand = new DelegateCommand(OnOpenLLPump));
 
+        private DelegateCommand _CloseLLPumpCommand;
+        public DelegateCommand CloseLLPumpCommand =>
+            _CloseLLPumpCommand ?? (_CloseLLPumpCommand = new DelegateCommand(OnCloseLLPump));
+
+        private DelegateCommand _OpenTMPumpCommand;
+        public DelegateCommand OpenTMPumpCommand =>
+            _OpenTMPumpCommand ?? (_OpenTMPumpCommand = new DelegateCommand(OnOpenTMPump));
+
+        private DelegateCommand _CloseTMPumpCommand;
+        public DelegateCommand CloseTMPumpCommand =>
+            _CloseTMPumpCommand ?? (_CloseTMPumpCommand = new DelegateCommand(OnCloseTMPump));
 
         #endregion
 
@@ -276,6 +289,24 @@ namespace Venus_MainPages.ViewModels
                 InvokeClient.Instance.Service.DoOperation($"TM.{commonValveControl.Tag.ToString()}.{AITValveOperation.GVTurnValve}", !commonValveControl.Status);
             }
         }
+        private void OnOpenTMPump()
+        {
+            InvokeClient.Instance.Service.DoOperation("TM.ControlPump",true);
+        }
+        private void OnCloseTMPump()
+        {
+            InvokeClient.Instance.Service.DoOperation("TM.ControlPump", false);
+
+        }
+        private void OnOpenLLPump()
+        {
+            InvokeClient.Instance.Service.DoOperation("LL.ControlPump",true);
+        }
+        private void OnCloseLLPump()
+        {
+            InvokeClient.Instance.Service.DoOperation("LL.ControlPump", false);
+
+        }
         #endregion
 
         #region 私有方法
@@ -331,10 +362,8 @@ namespace Venus_MainPages.ViewModels
             m_RtDataKeys.Add($"TM.LLAPressureGauge.Value");
             m_RtDataKeys.Add($"TM.LLBPressureGauge.Value");
             m_RtDataKeys.Add($"TM.LoadlockForelineGauge.Value");
-
-
-
-
+            m_RtDataKeys.Add($"TM.PumpIsRunning");
+            m_RtDataKeys.Add($"LL.PumpIsRunning");
         }
 
         #endregion

+ 55 - 45
Venus/Venus_MainPages/Views/OperationOverView.xaml

@@ -47,44 +47,59 @@
                 </Canvas>
 
             </Viewbox>
+            <ctrls:Foup Canvas.Top="638" Canvas.Left="150" Width="85" Height="145"/>
+            <ctrls:Foup Canvas.Top="638" Canvas.Left="310" Width="85" Height="145"/>
 
+            <ctrls:Foup Canvas.Top="638" Canvas.Left="460" Width="85" Height="145"/>
         </Canvas>
-        <!--<customControls:AduRadioButtonIcon Canvas.Left="900"  IsChecked="{Binding TabIsChecked}" Canvas.Top="100" Content="Carrier"  Height="30" Cursor="Hand"   Attach:IconElement.PathData="{StaticResource Icon_OverView}"
-                                                            Attach:IconElement.Margin="20,0"  />
-        <customControls:AduRadioButtonIcon  Canvas.Left="1050" Canvas.Top="100" Content="Job"  Height="30" Cursor="Hand"   Attach:IconElement.PathData="{StaticResource Icon_OverView}"
-                                                            Attach:IconElement.Margin="20,0"/>-->
-        <RadioButton Content="Carrier" Name="CarrierRadioButton"  Canvas.Left="900"  Canvas.Top="115" Width="120" Height="33" Style="{StaticResource Button_RadioButton}" IsChecked="True"/>
-        <RadioButton Content="Job"     Name="JobRadioButton" Canvas.Left="980" Canvas.Top="115" Width="120" Height="33" Style="{StaticResource Button_RadioButton}" IsChecked="False"/>
-        <TabPanel Canvas.Left="900"  Canvas.Top="140" Visibility="{Binding ElementName=CarrierRadioButton,Path=IsChecked,Converter={StaticResource boolToVisibility2}}">
-            <StackPanel Orientation="Horizontal" >
-                <StackPanel>
-                    <TextBox Background="{DynamicResource Table_BG_Title}"  Text="LP1" Width="250" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
-                    <ctrls:FOUPFrontView UnitData="{Binding LP1ModuleInfo}" ShowTitle="False"/>
-                </StackPanel>
-                <StackPanel>
-                    <TextBox Background="{DynamicResource Table_BG_Title}" Text="LP2" Width="250" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
-                    <ctrls:FOUPFrontView UnitData="{Binding LP2ModuleInfo}" ShowTitle="False"/>
+
+        <Canvas Canvas.Left="-150">
+            <RadioButton Content="Carrier" Name="CarrierRadioButton"  Canvas.Left="900"   Canvas.Top="106" Width="120" Height="33" Style="{StaticResource Button_RadioButton}" IsChecked="True"/>
+            <RadioButton Content="Job"     Name="JobRadioButton"      Canvas.Left="1020"  Canvas.Top="106" Width="120" Height="33" Style="{StaticResource Button_RadioButton}" IsChecked="False"/>
+            <TabPanel Canvas.Left="900"  Canvas.Top="140" Visibility="{Binding ElementName=CarrierRadioButton,Path=IsChecked,Converter={StaticResource boolToVisibility2}}">
+                <StackPanel Orientation="Horizontal" >
+                    <StackPanel>
+                        <TextBox Background="{DynamicResource Table_BG_Title}"  Text="LP1" Width="250" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
+                        <ctrls:FOUPFrontView UnitData="{Binding LP1ModuleInfo}" ShowTitle="False"/>
+                    </StackPanel>
+                    <StackPanel>
+                        <TextBox Background="{DynamicResource Table_BG_Title}" Text="LP2" Width="250" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
+                        <ctrls:FOUPFrontView UnitData="{Binding LP2ModuleInfo}" ShowTitle="False"/>
+                    </StackPanel>
+                    <StackPanel>
+                        <TextBox Background="{DynamicResource Table_BG_Title}" Text="LP3" Width="250" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
+                        <ctrls:FOUPFrontView UnitData="{Binding LP3ModuleInfo}" ShowTitle="False"/>
+                    </StackPanel>
                 </StackPanel>
-            </StackPanel>
-        </TabPanel>
-        <TabPanel Canvas.Left="900"  Canvas.Top="140" Visibility="{Binding ElementName=CarrierRadioButton,Path=IsChecked,Converter={StaticResource boolToVisibility}}" >
-            <Grid>
-                <Grid.RowDefinitions>
-                    <RowDefinition Height="30"/>
-                    <RowDefinition/>
-                </Grid.RowDefinitions>
-                <Grid.ColumnDefinitions>
-                    <ColumnDefinition/>
-                    <ColumnDefinition/>
-                </Grid.ColumnDefinitions>
-                <TextBox Text="LP1" Background="{DynamicResource Table_BG_Title}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" />
-                <TextBox Text="LP2" Background="{DynamicResource Table_BG_Title}" Grid.Column="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
-                <ctrls:WaferAssociationUnit  Grid.Row="1"/>
-                <ctrls:WaferAssociationUnit  Grid.Row="1" Grid.Column="1"/>
-            </Grid>
-            
-        </TabPanel>
+            </TabPanel>
+            <TabPanel Canvas.Left="900"  Canvas.Top="140" Visibility="{Binding ElementName=CarrierRadioButton,Path=IsChecked,Converter={StaticResource boolToVisibility}}" >
+                <Grid>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition/>
+                    </Grid.RowDefinitions>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition/>
+                        <ColumnDefinition/>
+                        <ColumnDefinition/>
+
+                    </Grid.ColumnDefinitions>
+                    <TextBox Text="LP1" Background="{DynamicResource Table_BG_Title}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" />
+                    <TextBox Text="LP2" Background="{DynamicResource Table_BG_Title}" Grid.Column="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
+                    <TextBox Text="LP2" Background="{DynamicResource Table_BG_Title}" Grid.Column="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True"/>
+
+                    <ctrls:WaferAssociationUnit  Grid.Row="1"/>
+                    <ctrls:WaferAssociationUnit  Grid.Row="1" Grid.Column="1"/>
+                    <ctrls:WaferAssociationUnit  Grid.Row="1" Grid.Column="2"/>
+
+                </Grid>
+
+            </TabPanel>
+
+
+
 
+        </Canvas>
         <Grid Canvas.Left="1700"  Canvas.Top="140" Width="200" Background="White" Margin="10,-1,0,-1">
             <Grid.RowDefinitions>
                 <RowDefinition Height="30"/>
@@ -167,7 +182,7 @@
                         <deviceControl:AITSensor Margin="-30,0,5,0" GreenColor="True" LightOnValue="{Binding IsRtInitialized}"></deviceControl:AITSensor>
 
                         <Button Grid.Column="1" Content="初始化"  Width="120" Height="25">
-                          
+
                         </Button>
                     </Grid>
                     <Grid Margin="0,8,0,0">
@@ -176,7 +191,7 @@
                             <ColumnDefinition />
                         </Grid.ColumnDefinitions>
                         <Button  Grid.Column="1" Content="终止" Width="120" Height="25">
-                          
+
                         </Button>
                     </Grid>
                     <Grid Margin="0,8,0,0">
@@ -185,7 +200,7 @@
                             <ColumnDefinition />
                         </Grid.ColumnDefinitions>
                         <Button  Grid.Column="1" Content="全部暂停" Width="120" Height="25" IsEnabled="{Binding IsPauseAllEnable}">
-                           
+
                         </Button>
                     </Grid>
                     <Grid Margin="0,8,0,0">
@@ -194,7 +209,7 @@
                             <ColumnDefinition />
                         </Grid.ColumnDefinitions>
                         <Button  Grid.Column="1" Content="晶圆返回" Width="120" Height="25">
-                            
+
                         </Button>
                     </Grid>
                 </StackPanel>
@@ -207,11 +222,11 @@
                 <StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,5">
 
                     <Button  IsEnabled="{Binding EnableAuto}" Margin ="5" Content="自动"  Width="80" Height="25">
-                    
+
                     </Button>
 
                     <Button  IsEnabled="{Binding EnableManual}" Margin ="5" Content="手动" Width="80" Height="25">
-                      
+
                     </Button>
 
 
@@ -246,11 +261,6 @@
                 </StackPanel>
             </Border>
         </Grid>
-      
-        <ctrls:Foup Canvas.Top="638" Canvas.Left="150" Width="85" Height="145"/>
-        <ctrls:Foup Canvas.Top="638" Canvas.Left="310" Width="85" Height="145"/>
-
-        <ctrls:Foup Canvas.Top="638" Canvas.Left="460" Width="85" Height="145"/>
 
     </Canvas>
 </UserControl>

+ 57 - 7
Venus/Venus_MainPages/Views/TMOperationView.xaml

@@ -65,7 +65,7 @@
                     </MultiBinding>
                 </userControls:FlowPipe.IsFlowing>
             </userControls:FlowPipe>
-            <userControls:FlowPipe   Height="8"  Width="825" Canvas.Left="260" Canvas.Top="50" IsFlowing="{Binding LLBVentValveIsOpen}"/>
+            <userControls:FlowPipe   Height="8"  Width="825" Canvas.Left="256" Canvas.Top="50" IsFlowing="{Binding LLBVentValveIsOpen}"/>
             <userControls:FlowPipe   Height="8"  Width="394" Canvas.Left="1092" Canvas.Top="54" RotateTransformValue="90" IsFlowing="{Binding LLBVentValveIsOpen}"/>
             <userControls:FlowPipe   Height="8"  Width="285" Canvas.Left="800" Canvas.Top="450" IsFlowing="{Binding LLBVentValveIsOpen}" IsReverse="True"/>
             <userControls:FlowPipe   Height="8"  Width="100" Canvas.Left="657" Canvas.Top="454" RotateTransformValue="90">
@@ -91,11 +91,11 @@
                 </userControls:FlowPipe.IsFlowing>
                
             </userControls:FlowPipe>
-            <userControls:Pump Canvas.Left="636" Canvas.Top="664" Width="35" Height="35" IsOpen="{Binding PumpIsOpen,Mode=TwoWay}">
+            <userControls:Pump Canvas.Left="636" Canvas.Top="664" Width="35" Height="35" IsOpen="{Binding RtDataValues[TM.PumpIsRunning],Mode=TwoWay}">
                 <userControls:Pump.ContextMenu>
                     <ContextMenu>
-                        <MenuItem Header="ON"  Command="{Binding OpenPumpCommand}" IsChecked="{Binding PumpIsOpen,Mode=OneWay}" IsEnabled="{Binding PumpIsOpen,Converter={StaticResource BoolToBool},Mode=OneWay}"/>
-                        <MenuItem Header="OFF" Command="{Binding ClosePumpCommand}" IsChecked="{Binding PumpIsOpen,Converter={StaticResource BoolToBool},Mode=OneWay}" IsEnabled="{Binding PumpIsOpen,Mode=OneWay}"/>
+                        <MenuItem Header="ON"  Command="{Binding OpenTMPumpCommand}" IsChecked="{Binding RtDataValues[TM.PumpIsRunning],Mode=OneWay}" IsEnabled="{Binding RtDataValues[TM.PumpIsRunning],Converter={StaticResource BoolToBool},Mode=OneWay}"/>
+                        <MenuItem Header="OFF" Command="{Binding CloseTMPumpCommand}" IsChecked="{Binding RtDataValues[TM.PumpIsRunning],Converter={StaticResource BoolToBool},Mode=OneWay}" IsEnabled="{Binding RtDataValues[TM.PumpIsRunning],Mode=OneWay}"/>
                     </ContextMenu>
                 </userControls:Pump.ContextMenu>
             </userControls:Pump>
@@ -171,11 +171,11 @@
                     </MultiBinding>
                 </userControls:FlowPipe.IsFlowing>
             </userControls:FlowPipe>
-            <userControls:Pump Canvas.Left="636" Canvas.Top="744" Width="35" Height="35" IsOpen="{Binding PumpIsOpen,Mode=TwoWay}">
+            <userControls:Pump Canvas.Left="636" Canvas.Top="744" Width="35" Height="35" IsOpen="{Binding RtDataValues[LL.PumpIsRunning],Mode=TwoWay}">
                 <userControls:Pump.ContextMenu>
                     <ContextMenu>
-                        <MenuItem Header="ON"  Command="{Binding OpenPumpCommand}"  IsChecked="{Binding PumpIsOpen,Mode=OneWay}" IsEnabled="{Binding PumpIsOpen,Converter={StaticResource BoolToBool},Mode=OneWay}"/>
-                        <MenuItem Header="OFF" Command="{Binding ClosePumpCommand}" IsChecked="{Binding PumpIsOpen,Converter={StaticResource BoolToBool},Mode=OneWay}" IsEnabled="{Binding PumpIsOpen,Mode=OneWay}"/>
+                        <MenuItem Header="ON"  Command="{Binding OpenLLPumpCommand}"  IsChecked="{Binding RtDataValues[LL.PumpIsRunning],Mode=OneWay}" IsEnabled="{Binding RtDataValues[LL.PumpIsRunning],Converter={StaticResource BoolToBool},Mode=OneWay}"/>
+                        <MenuItem Header="OFF" Command="{Binding CloseLLPumpCommand}" IsChecked="{Binding RtDataValues[LL.PumpIsRunning],Converter={StaticResource BoolToBool},Mode=OneWay}" IsEnabled="{Binding RtDataValues[LL.PumpIsRunning],Mode=OneWay}"/>
                     </ContextMenu>
                 </userControls:Pump.ContextMenu>
             </userControls:Pump>
@@ -611,7 +611,57 @@
             </Grid>
         </StackPanel>
 
+        <StackPanel Canvas.Top="610" Canvas.Right="10" Width="720" Visibility="Collapsed">
+            <Grid>
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="30"/>
+                    <RowDefinition Height="Auto"/>
+                </Grid.RowDefinitions>
+                <Border  BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_FirstTitle}" Padding="5,1">
+                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
+                        <Path Data="M0,0 L5,0 5,5 z" Fill="White" HorizontalAlignment="Left" Grid.Row="1" RenderTransformOrigin="0.5,0.5" Stretch="Fill" Width="5" Height="5">
+                            <Path.RenderTransform>
+                                <TransformGroup>
+                                    <ScaleTransform/>
+                                    <SkewTransform/>
+                                    <RotateTransform Angle="45"/>
+                                    <TranslateTransform/>
+                                </TransformGroup>
+                            </Path.RenderTransform>
+                        </Path>
+                        <TextBlock  Margin="5,0,0,0" Text="PM Operation" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_White}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                    </StackPanel>
+                </Border>
+                <Border  Grid.Row="1" BorderBrush="{DynamicResource Table_BD}"  BorderThickness="1,0,1,1" >
+                    <Canvas Background="{DynamicResource Table_BG_Content}" Margin="1" Height="130" Width="712">
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="180" Canvas.Top="10" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMA Door Open"                                               Canvas.Left="210" Canvas.Top="10" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
+
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="380" Canvas.Top="10" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMA Door Open"                                               Canvas.Left="410" Canvas.Top="10" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
+
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="180" Canvas.Top="40" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMB Door Open"                                               Canvas.Left="210" Canvas.Top="40" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
+
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="380" Canvas.Top="40" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMB Door Open"                                               Canvas.Left="410" Canvas.Top="40" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
 
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="180" Canvas.Top="70" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMC Door Open"                                               Canvas.Left="210" Canvas.Top="70" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
+
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="380" Canvas.Top="70" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMC Door Open"                                               Canvas.Left="410" Canvas.Top="70" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
+
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="180" Canvas.Top="100" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMA Door Open"                                               Canvas.Left="210" Canvas.Top="100" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
+
+                        <Ellipse Width="22" Height="22" Fill="{Binding GasIsFlowing,Converter={StaticResource boolToColor}}"  Canvas.Left="380" Canvas.Top="100" Stroke="Silver" StrokeThickness="2"/>
+                        <Button Width="120" Height="25" Content="PMA Door Open"                                               Canvas.Left="410" Canvas.Top="100" Style="{StaticResource SysBtnStyle}"  Command="{Binding GasCommand}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
+                    </Canvas>
+                </Border>
+                
+            </Grid>
+        </StackPanel>
     </Canvas>
     
 </UserControl>

+ 16 - 0
Venus/Venus_RT/Config/System.sccfg

@@ -153,6 +153,14 @@
 			<config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
+		<configs name="DryPump" nameView="Dry Pump" >
+			<config default="1" name="MFG" nameView="MFG" description="厂商, 1:Sky; 2:Edwards" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
+			<config default="1" name="CommunicationType" nameView="Communication Type" description="0:Analogue; 1:RS232; 2:Ethernet" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
+			<config default="COM24" name="Port" nameView="Port" description="serial port name of pump" max="" min="" paramter="" tag="" unit="" type="String" />
+			<config default="1000" name="ChamberForelinePressureThreshold" nameView="Chamber Foreline Pressure Threshold" description="" max="10000" min="0" paramter="" tag="" unit="mtorr" type="Double" />
+			<config default="20" name="ChamberForelinePressureTimeout" nameView="Chamber Foreline Pressure Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
+		</configs>
+		
 	</configs>
 	<!--LLA-->
 	<configs name="LLA" nameView="LLA">
@@ -168,6 +176,14 @@
 		<config default="300" name="LeakCheckWaitTime" description="Leak Check Wait Time" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />
 		<config default="30" name="LeakRate" description="Leak Rate" max="756000" min="0" paramter="" tag="" unit="mTorrPerMin" type="Double" />
 		<config default="4" name="SlotNumber" nameView="Slot number"  description="槽位个数" max="60" min="1" paramter="" tag="" unit="" type="Integer" />
+
+		<configs name="DryPump" nameView="Dry Pump" >
+			<config default="1" name="MFG" nameView="MFG" description="厂商, 1:Sky; 2:Edwards" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
+			<config default="1" name="CommunicationType" nameView="Communication Type" description="0:Analogue; 1:RS232; 2:Ethernet" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
+			<config default="COM26" name="Port" nameView="Port" description="serial port name of pump" max="" min="" paramter="" tag="" unit="" type="String" />
+			<config default="1000" name="ChamberForelinePressureThreshold" nameView="Chamber Foreline Pressure Threshold" description="" max="10000" min="0" paramter="" tag="" unit="mtorr" type="Double" />
+			<config default="20" name="ChamberForelinePressureTimeout" nameView="Chamber Foreline Pressure Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
+		</configs>
 	</configs>
 
 	<!--LLB-->

+ 27 - 0
Venus/Venus_RT/Devices/DeviceManager.cs

@@ -170,6 +170,33 @@ namespace Venus_RT.Instances
         private void InitTM(ModuleName mod)
         {
             Initialize(device_model_file_MF, RtInstance.SystemName, mod, mod.ToString());
+            if (SC.GetValue<int>($"LLA.DryPump.CommunicationType") == (int)CommunicationType.RS232)
+            {
+                if (SC.GetValue<int>($"LLA.DryPump.MFG") == (int)DryPumpMFG.SKY)
+                {
+                    AddCustomModuleDevice(new SkyPump(ModuleName.LLA));
+                }
+                else if (SC.GetValue<int>($"LLA.DryPump.MFG") == (int)DryPumpMFG.Edwards)
+                {
+                    AddCustomModuleDevice(new EdwardsPump(ModuleName.LLA));
+                }
+            }
+
+            if (SC.GetValue<int>($"{mod}.DryPump.CommunicationType") == (int)CommunicationType.RS232)
+            {
+                if (SC.GetValue<int>($"{mod}.DryPump.MFG") == (int)DryPumpMFG.SKY)
+                {
+                    AddCustomModuleDevice(new SkyPump(mod));
+                }
+                else if (SC.GetValue<int>($"{mod}.DryPump.MFG") == (int)DryPumpMFG.Edwards)
+                {
+                    AddCustomModuleDevice(new EdwardsPump(mod));
+                }
+            }
+           
+            //AddCustomModuleDevice(new SkyPump(mod));
+            //AddCustomModuleDevice(new SkyPump(ModuleName.LLA));
+
 
             AddCustomDevice(new JetTM());
         }

+ 6 - 1
Venus/Venus_RT/Devices/EdwardsPump.cs

@@ -222,7 +222,12 @@ namespace Venus_RT.Devices
             StatusDry = EdwardsPumpState.Unknown;
             _serial = new AsyncSerialPort(_PortNum, 9600, 8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.One, "\r\n", true);
         }
-
+        public EdwardsPump(ModuleName mod, string name) : base(mod.ToString(), VenusDevice.MainPump.ToString(), "Edwards Pump", "")
+        {
+            _PortNum = SC.GetStringValue($"{mod.ToString()}.{name}.Port");
+            StatusDry = EdwardsPumpState.Unknown;
+            _serial = new AsyncSerialPort(_PortNum, 9600, 8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.One, "\r\n", true);
+        }
         public override bool Initialize()
         {
             base.Initialize();

+ 52 - 0
Venus/Venus_RT/Devices/TM/JetTM.cs

@@ -89,6 +89,10 @@ namespace Venus_RT.Devices
         private readonly IoSwitch _PMCWaferSizeCheck;
         private readonly IoSwitch _PMDWaferSizeCheck;
 
+        private readonly PumpBase _TMPump;
+        private readonly PumpBase _LLPump;
+
+
 
         private readonly IoTMPressureCtrl _presureCtrl;
 
@@ -142,6 +146,10 @@ namespace Venus_RT.Devices
         public double TMForelinePressure => _presureCtrl.MFForelineGauge.Value;
         public double LoadlockForelinePressure => _presureCtrl.LLForelineGauge.Value;
 
+        public  bool? TMPumpIsRunning => _TMPump?.IsRunning;
+        public  bool? LLPumpIsRunning => _LLPump?.IsRunning;
+
+
         public JetTM() : base("TM")
         {
             _TMLid  = DEVICE.GetDevice<IoLid>($"TM.{VenusDevice.TMLid}");
@@ -210,6 +218,45 @@ namespace Venus_RT.Devices
 
             _presureCtrl = DEVICE.GetDevice<IoTMPressureCtrl>($"TM.{VenusDevice.TMPressureCtrl}");
 
+            if (SC.GetValue<int>($"TM.DryPump.CommunicationType") == (int)CommunicationType.RS232)
+            {
+                if (SC.GetValue<int>($"TM.DryPump.MFG") == (int)DryPumpMFG.SKY)
+                {
+                    _TMPump = DEVICE.GetDevice<SkyPump>($"TM.{VenusDevice.MainPump}");
+                }
+                else if (SC.GetValue<int>($"TM.DryPump.MFG") == (int)DryPumpMFG.Edwards)
+                {
+                    _TMPump = DEVICE.GetDevice<EdwardsPump>($"TM.{VenusDevice.MainPump}");
+                }
+            }
+            if (SC.GetValue<int>($"LLA.DryPump.CommunicationType") == (int)CommunicationType.RS232)
+            {
+                if (SC.GetValue<int>($"LLA.DryPump.MFG") == (int)DryPumpMFG.SKY)
+                {
+                    _LLPump = DEVICE.GetDevice<SkyPump>($"LLA.{VenusDevice.MainPump}");
+                }
+                else if (SC.GetValue<int>($"LLA.DryPump.MFG") == (int)DryPumpMFG.Edwards)
+                {
+                    _LLPump = DEVICE.GetDevice<EdwardsPump>($"LLA.{VenusDevice.MainPump}");
+                }
+            }
+            //_LLPump = DEVICE.GetDevice<SkyPump>($"LLA.{VenusDevice.MainPump}");
+
+            //_TMPump = DEVICE.GetDevice<SkyPump>($"TM.{VenusDevice.MainPump}");
+
+            DATA.Subscribe("TM.PumpIsRunning", () => TMPumpIsRunning);
+            OP.Subscribe("TM.ControlPump", (cmd, args) =>
+            {
+                _TMPump.SetPumpOnOff((bool)args[0]);
+                return true;
+            });
+            DATA.Subscribe("LL.PumpIsRunning", () => LLPumpIsRunning);
+            OP.Subscribe("LL.ControlPump", (cmd, args) =>
+            {
+                _LLPump.SetPumpOnOff((bool)args[0]);
+                return true;
+            });
+
         }
 
         public override void Monitor()
@@ -549,5 +596,10 @@ namespace Venus_RT.Devices
             LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason);
             return false;
         }
+        //public bool ControlTMPump(bool ison)
+        //{
+        //    _TMPump.SetPumpOnOff(ison);
+        //    return true;
+        //}
     }
 }

+ 3 - 1
Venus/Venus_RT/Modules/LLs/LLEntity.cs

@@ -9,6 +9,7 @@ using Venus_RT.Devices;
 using Venus_Core;
 using Aitex.Core.RT.DataCenter;
 using Aitex.Core.RT.OperationCenter;
+using Aitex.Core.RT.Device;
 
 namespace Venus_RT.Modules
 {
@@ -94,7 +95,8 @@ namespace Venus_RT.Modules
         public LLEntity(ModuleName module)
         {
             Module = module;
-            _JetTM = Singleton<JetTM>.Instance;
+            //_JetTM = Singleton<JetTM>.Instance;
+            _JetTM= DEVICE.GetDevice<JetTM>("TM");
 
             _pumpingRoutine     = new MFPumpRoutine(_JetTM, Module);
             _ventingRoutine     = new MFVentRoutine(_JetTM, Module);

+ 6 - 1
Venus/Venus_RT/Modules/TM/TMEntity.cs

@@ -13,6 +13,7 @@ using Aitex.Core.RT.DataCenter;
 using Aitex.Core.RT.OperationCenter;
 using MECF.Framework.Common.Schedulers;
 using MECF.Framework.Common.CommonData;
+using Aitex.Core.RT.Device;
 
 namespace Venus_RT.Modules
 {
@@ -116,7 +117,8 @@ namespace Venus_RT.Modules
 
         public TMEntity()
         {
-            _tm                 = Singleton<JetTM>.Instance;
+            //_tm                 = Singleton<JetTM>.Instance;
+            _tm                 = DEVICE.GetDevice<JetTM>("TM");
             _robot              = new SIASUNRobot();
 
             _homeRoutine    = new MFHomeRoutine(_tm, _robot);
@@ -161,6 +163,9 @@ namespace Venus_RT.Modules
             OP.Subscribe($"TM.{RtOperation.Purge}", (cmd, args) => CheckToPostMessage((int)MSG.Purge));
             OP.Subscribe($"TM.{RtOperation.Abort}", (cmd, args) => CheckToPostMessage((int)MSG.Abort));
 
+            
+
+
 
 
 

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

@@ -5,9 +5,7 @@
   <Navigation Id="operation" Name="Operation" >
 
 	  <SubView Id="Efem" Name="EFEM" ViewClass="Venus_Simulator.Views.Simu_EfemView" Assembly="Venus_Simulator" />
-	  <SubView Id="TM" Name="TM" ViewClass="Venus_Simulator.Views.Simu_TMView" Assembly="Venus_Simulator" />
-
-	  <SubView Id="ioTM" Name="IO-TM" ViewClass="Venus_Simulator.Views.SimulatorIoTMView" Assembly="Venus_Simulator"/>
+	 
     
   </Navigation>
 
@@ -50,4 +48,12 @@
 	  <SubView Id="SMCChillerGridPMB" Name="Grid Chiller" ViewClass="Venus_Simulator.Views.SimuSMCChillerGridPMBView" Assembly="Venus_Simulator" />
 
   </Navigation>
+
+	<Navigation Id="TM" Name="TM">
+		<SubView Id="ioTM" Name="IO-TM" ViewClass="Venus_Simulator.Views.SimulatorIoTMView" Assembly="Venus_Simulator"/>
+		<SubView Id="TM" Name="TM" ViewClass="Venus_Simulator.Views.Simu_TMView" Assembly="Venus_Simulator" />
+		<SubView Id="SkyPumpTM" Name="SkyPumpTM" ViewClass="Venus_Simulator.Views.SimuSkyPumpTMView" Assembly="Venus_Simulator"/>
+		<SubView Id="SkyPumpLL" Name="SkyPumpLL" ViewClass="Venus_Simulator.Views.SimuSkyPumpLLView" Assembly="Venus_Simulator"/>
+	</Navigation>
+
 </MECFUI>

+ 102 - 0
Venus/Venus_Simulator/Devices/EdwardsPumpMockLL.cs

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

+ 102 - 0
Venus/Venus_Simulator/Devices/EdwardsPumpMockTM.cs

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

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

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

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

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

+ 32 - 0
Venus/Venus_Simulator/Venus_Simulator.csproj

@@ -79,8 +79,12 @@
       <SubType>Code</SubType>
     </Compile>
     <Compile Include="Devices\AIRSYSChillerMock.cs" />
+    <Compile Include="Devices\EdwardsPumpMockLL.cs" />
+    <Compile Include="Devices\EdwardsPumpMockTM.cs" />
     <Compile Include="Devices\ESCHVMockPMA.cs" />
     <Compile Include="Devices\PendulumValveMockPMA.cs" />
+    <Compile Include="Devices\SkyPumpMockLL.cs" />
+    <Compile Include="Devices\SkyPumpMockTM.cs" />
     <Compile Include="Devices\TMSimulatorServer.cs" />
     <Compile Include="Devices\TurboPumpMockPMA.cs" />
     <Compile Include="Instances\SystemConfig.cs" />
@@ -112,6 +116,12 @@
     <Compile Include="Views\SimuAIRSYSChillerPMBView.xaml.cs">
       <DependentUpon>SimuAIRSYSChillerPMBView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuEdwardsPumpLLView.xaml.cs">
+      <DependentUpon>SimuEdwardsPumpLLView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Views\SimuEdwardsPumpTMView.xaml.cs">
+      <DependentUpon>SimuEdwardsPumpTMView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuEdwardsPumpPMAView.xaml.cs">
       <DependentUpon>SimuEdwardsPumpPMAView.xaml</DependentUpon>
     </Compile>
@@ -133,6 +143,12 @@
     <Compile Include="Views\SimuPendulumValvePMAView.xaml.cs">
       <DependentUpon>SimuPendulumValvePMAView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SimuSkyPumpLLView.xaml.cs">
+      <DependentUpon>SimuSkyPumpLLView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Views\SimuSkyPumpTMView.xaml.cs">
+      <DependentUpon>SimuSkyPumpTMView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SimuSkyPumpPMAView.xaml.cs">
       <DependentUpon>SimuSkyPumpPMAView.xaml</DependentUpon>
     </Compile>
@@ -273,6 +289,14 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuEdwardsPumpLLView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Views\SimuEdwardsPumpTMView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuEdwardsPumpPMAView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -301,6 +325,14 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="Views\SimuSkyPumpLLView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Views\SimuSkyPumpTMView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SimuSkyPumpPMAView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 11 - 10
Venus/Venus_Themes/Themes/Generic.xaml

@@ -322,11 +322,12 @@
                                         </Canvas>
 
                                         <Canvas x:Name="armGripper" Height="40" Width="50"  Canvas.Left="0" Canvas.Top="0">
-                                            <Path  Data="M 30 10 30 30 -20 25 -20 15 30 10z" Stroke="Black"  Fill="{StaticResource RobotBrush2}"  StrokeThickness="1"  StrokeEndLineCap="Round">
-                                                <!--<Path.Data>
+                                            <!--<Path  Data="M 30 10 30 30 -20 25 -20 15 30 10z" Stroke="Black"  Fill="{StaticResource RobotBrush2}"  StrokeThickness="1"  StrokeEndLineCap="Round">-->
+                                        <Path   Stroke="Black"    StrokeThickness="5"  StrokeEndLineCap="Round">
+                                            <Path.Data>
                                                 <PathGeometry>
-                                                    -->
-                                                <!--<PathFigure StartPoint="30 14" >
+                                                    
+                                                <PathFigure StartPoint="30 14" >
                                                         <LineSegment Point="10 14" />
                                                         <LineSegment Point="4 8" />
                                                         <LineSegment Point="-6 8" />
@@ -336,19 +337,19 @@
                                                         <LineSegment Point="10 26" />
                                                         <LineSegment Point="4 32" />
                                                         <LineSegment Point="-6 32" />
-                                                    </PathFigure>-->
-                                                <!--
-                                                    <PathFigure StartPoint="30 10" >
+                                                    </PathFigure>
+                                                
+                                                    <!--<PathFigure StartPoint="30 10" >
                                                         <LineSegment Point="30 30" />
                                                         <LineSegment Point="-20 25" />
                                                         <LineSegment Point="-20 15" />
                                                         <LineSegment Point="30 10" />
 
-                                                    </PathFigure>
+                                                    </PathFigure>-->
                                                 </PathGeometry>
-                                            </Path.Data>-->
+                                            </Path.Data>
                                             </Path>
-                                            <Path  Stroke="{StaticResource robotBorderBrush}" Fill="{StaticResource RobotBrush}"  StrokeThickness="1" StrokeEndLineCap="Round" >
+                                        <Path  Stroke="{StaticResource robotBorderBrush}" Fill="{StaticResource RobotBrush}"  StrokeThickness="1" StrokeEndLineCap="Round" >
                                                 <Path.Data>
                                                     <PathGeometry>
                                                         <PathFigure StartPoint="40 0" >