Browse Source

1 revise srd switch off
2 add reservoir ca/an pump atuoadjust speed
3 revise TC auto monitor

chenzk 14 hours ago
parent
commit
f6a9ac36e5

+ 5 - 77
PunkHPX8_MainPages/ViewModels/SRDMotionViewModel.cs

@@ -19,18 +19,7 @@ namespace PunkHPX8_MainPages.ViewModels
         private const int ACCEL_FACTOR = 10;
         #endregion
 
-        #region 内部变量
-
-        #region SRD1Arm
-        /// <summary>
-        /// SRD1Arm模块名称
-        /// </summary>
-        private string _sRD1ArmModuleName;
-        /// <summary>
-        /// 数据
-        /// </summary>
-        private CommandMotionData _sRD1ArmMotionData;
-        #endregion
+        #region 内部变量   
 
         #region SRD1Rotation
         /// <summary>
@@ -43,17 +32,6 @@ namespace PunkHPX8_MainPages.ViewModels
         private CommandMotionData _sRD1RotationMotionData;
         #endregion
 
-        #region SRD2Arm
-        /// <summary>
-        /// SRD2Arm模块名称
-        /// </summary>
-        private string _sRD2ArmModuleName;
-        /// <summary>
-        /// 数据
-        /// </summary>
-        private CommandMotionData _sRD2ArmMotionData;
-        #endregion
-
         #region SRD2Rotation
         /// <summary>
         /// SRD2Rotation模块名称
@@ -86,25 +64,6 @@ namespace PunkHPX8_MainPages.ViewModels
 
         #region 属性
 
-        #region SRD1Arm
-        /// <summary>
-        /// SRD1Arm名称
-        /// </summary>
-        public string SRD1ArmModuleName
-        {
-            get { return _sRD1ArmModuleName; }
-            set { SetProperty(ref _sRD1ArmModuleName, value); }
-        }
-        /// <summary>
-        /// 
-        /// </summary>
-        public CommandMotionData SRD1ArmMotionData
-        {
-            get { return _sRD1ArmMotionData; }
-            set { SetProperty(ref _sRD1ArmMotionData, value); }
-        }
-        #endregion
-
         #region SRD1Rotation
         /// <summary>
         /// SRD1Rotation名称
@@ -124,25 +83,6 @@ namespace PunkHPX8_MainPages.ViewModels
         }
         #endregion
 
-        #region SRD2Arm
-        /// <summary>
-        /// SRD2Arm名称
-        /// </summary>
-        public string SRD2ArmModuleName
-        {
-            get { return _sRD2ArmModuleName; }
-            set { SetProperty(ref _sRD2ArmModuleName, value); }
-        }
-        /// <summary>
-        /// 
-        /// </summary>
-        public CommandMotionData SRD2ArmMotionData
-        {
-            get { return _sRD2ArmMotionData; }
-            set { SetProperty(ref _sRD2ArmMotionData, value); }
-        }
-        #endregion
-
         #region SRD2Rotation
         /// <summary>
         /// SRD2Rotation名称
@@ -178,23 +118,15 @@ namespace PunkHPX8_MainPages.ViewModels
         /// </summary>
         public void LoadData(string systemName)
         {
-            SRD1ArmModuleName = $"{ModuleName.SRD1}.Arm";
+         
             SRD1RotaionModuleName = $"{ModuleName.SRD1}.Rotation";
-            SRD2ArmModuleName = $"{ModuleName.SRD2}.Arm";
             SRD2RotaionModuleName = $"{ModuleName.SRD2}.Rotation";
             _rtDataKeys.Clear();
-            _rtDataKeys.Add($"{SRD1ArmModuleName}.IsHomed");
-            _rtDataKeys.Add($"{SRD1ArmModuleName}.IsSwitchOn");
-            _rtDataKeys.Add($"{SRD1ArmModuleName}.{MOTION_DATA}");
 
             _rtDataKeys.Add($"{SRD1RotaionModuleName}.IsHomed");
             _rtDataKeys.Add($"{SRD1RotaionModuleName}.IsSwitchOn");
             _rtDataKeys.Add($"{SRD1RotaionModuleName}.{MOTION_DATA}");
 
-            _rtDataKeys.Add($"{SRD2ArmModuleName}.IsHomed");
-            _rtDataKeys.Add($"{SRD2ArmModuleName}.IsSwitchOn");
-            _rtDataKeys.Add($"{SRD2ArmModuleName}.{MOTION_DATA}");
-
             _rtDataKeys.Add($"{SRD2RotaionModuleName}.IsHomed");
             _rtDataKeys.Add($"{SRD2RotaionModuleName}.IsSwitchOn");
             _rtDataKeys.Add($"{SRD2RotaionModuleName}.{MOTION_DATA}");
@@ -218,21 +150,17 @@ namespace PunkHPX8_MainPages.ViewModels
                 _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
                 if (_rtDataValueDic != null)
                 {
-                    SRD1ArmMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{SRD1ArmModuleName}.{MOTION_DATA}");
-
                     CommandMotionData tmp1 = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{SRD1RotaionModuleName}.{MOTION_DATA}");
                     if(tmp1 != null)
                     {
-                        tmp1.ActualVelocity = Math.Round(tmp1.ActualVelocity / 6, 2);
+                        tmp1.ActualVelocity = Math.Round(tmp1.ActualVelocity / 6, 2);  //除6是 deg/s--->rpm 单位的转换
                         tmp1.ProfileVelocity = Math.Round(tmp1.ProfileVelocity / 6, 2);
                         tmp1.HomingVelocity = Math.Round(tmp1.HomingVelocity / 6, 2);
                         tmp1.HomingVelocitySlow = Math.Round(tmp1.HomingVelocitySlow / 6, 2);
-                        tmp1.ProfileDecel = tmp1.ProfileDecel * ACCEL_FACTOR;
-                        tmp1.ProfileAccel = tmp1.ProfileAccel * ACCEL_FACTOR;
+                        tmp1.ProfileDecel = tmp1.ProfileDecel;
+                        tmp1.ProfileAccel = tmp1.ProfileAccel;
                     }                    
                     SRD1RotationMotionData = tmp1;
-
-                    SRD2ArmMotionData = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{SRD2ArmModuleName}.{MOTION_DATA}");
                     CommandMotionData tmp2 = CommonFunction.GetValue<CommandMotionData>(_rtDataValueDic, $"{SRD2RotaionModuleName}.{MOTION_DATA}");
                     if (tmp2 != null)
                     {

+ 179 - 11
PunkHPX8_MainPages/Views/PlatingCellHomePageView.xaml

@@ -6,7 +6,7 @@
      xmlns:local="clr-namespace:PunkHPX8_MainPages.Views"
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
      xmlns:customControls="clr-namespace:PunkHPX8_Themes.CustomControls;assembly=PunkHPX8_Themes"
-     xmlns:userControls="clr-namespace:PunkHPX8_Themes.UserControls;assembly=PunkHPX8_Themes"
+     xmlns:UserControls="clr-namespace:PunkHPX8_Themes.UserControls;assembly=PunkHPX8_Themes"
      xmlns:converters="clr-namespace:PunkHPX8_Themes.Converters;assembly=PunkHPX8_Themes"
      xmlns:Control="clr-namespace:MECF.Framework.UI.Core.Control;assembly=MECF.Framework.UI.Core"  
      xmlns:Control1="clr-namespace:Aitex.Core.UI.Control;assembly=MECF.Framework.UI.Core"
@@ -14,7 +14,7 @@
      xmlns:prism="http://prismlibrary.com/"
      prism:ViewModelLocator.AutoWireViewModel="True"
      mc:Ignorable="d"
-     d:DesignHeight="1000" d:DesignWidth="1500">
+     d:DesignHeight="800" d:DesignWidth="1850">
     <UserControl.Resources>
         <converters:StringToString x:Key="stringToString"/>
         <converters:BoolToOrientation x:Key="boolToOrientation"></converters:BoolToOrientation>
@@ -40,19 +40,187 @@
         <Grid>
             <Grid.RowDefinitions>
                 <RowDefinition Height="5"/>
-                <RowDefinition Height="200"/>
-                <RowDefinition Height="450"/>
-                <RowDefinition Height="250"/>
-                <RowDefinition Height="50"/>
-                <RowDefinition/>
+                <RowDefinition Height="170"/>
+                <RowDefinition Height="240"/>
+                <RowDefinition Height="145"/>
+                <RowDefinition Height="245"/>
             </Grid.RowDefinitions>
             <Grid.ColumnDefinitions>
-                <ColumnDefinition Width="500"></ColumnDefinition>
-                <ColumnDefinition Width="500"></ColumnDefinition>
-                <ColumnDefinition Width="500"></ColumnDefinition>
-                <ColumnDefinition Width="300"></ColumnDefinition>
+                <ColumnDefinition Width="610"></ColumnDefinition>
+                <ColumnDefinition Width="400"></ColumnDefinition>
+                <ColumnDefinition Width="610"></ColumnDefinition>
+                <ColumnDefinition Width="250"></ColumnDefinition>
                 <ColumnDefinition/>
             </Grid.ColumnDefinitions>
+            <Grid Grid.Row="1" Grid.Column="0">
+                <UserControls:SrdOverviewInformationPanel HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" 
+                                   ModuleTitle="{Binding Module}" IsEnabled="{Binding IsEnabled}"
+                                   />
+            </Grid>
+            <Grid Grid.Row="1" Grid.Column="1">
+                <UserControls:WaferOverviewPanel HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" 
+                                     IsEnabled="{Binding IsEnabled}"
+                                     />
+            </Grid>
+            <Grid Grid.Row="1" Grid.Column="2" Grid.RowSpan="2">
+                <UserControls:RecipeControl HorizontalAlignment="Center" Margin="10,0,0,0" VerticalAlignment="Center" Name="rcpControl"
+                     ModuleName="{Binding Module}" IsEnabled="{Binding IsEnabled}"
+                     ModuleTitle="{Binding RecipeModuleName}"
+                     RecipeType="{Binding RecipeType}"
+                     SelectedRecipeNode="{Binding SelectedRecipeNode,Mode=TwoWay}"
+                     CurrentOperationMode="{Binding SRDPersistent.OperatingMode}"
+                     AchievedCycleTimes="{Binding AchievedRunRecipeCycle}" 
+                     RecipeModeValue ="{Binding SRDPersistent.RecipeOperatingMode}"
+                     />
+            </Grid>
+            <Grid Grid.Row="1" Grid.Column="3">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="60"></RowDefinition>
+                    <RowDefinition Height="50"></RowDefinition>
+                    <RowDefinition Height="60"></RowDefinition>
+                </Grid.RowDefinitions>
+                <Grid Grid.Row="0">
+                    <Label Content="{Binding Module}" FontSize="35" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,13"></Label>
+                </Grid>
+                <Grid Grid.Row="1">
+                    <Button Style="{StaticResource SysBtnStyle}" IsEnabled="{Binding IsAutoEnabled}" Grid.Column="1" Height="30" Width="100" HorizontalAlignment="Center" Content="Initialize" Command="{Binding InitializeCommand}"></Button>
+                </Grid>
+                <Grid Grid.Row="2">
+                    <Label Content="Operating Mode"  FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Bottom" HorizontalAlignment="Center"></Label>
+                </Grid>
+            </Grid>
+            <Grid Grid.Row="2" Grid.Column="3" Height="155" VerticalAlignment="Top">
+                <UserControls:OperatingModeControl HorizontalAlignment="Left" Margin="26,0,0,0" VerticalAlignment="Top" 
+                                        ModuleName="{Binding Module}"
+                                        OperationModeValue="{Binding SRDPersistent.OperatingMode}"/>
+
+            </Grid>
+            <Grid Grid.Row="2" Grid.Column="3" Grid.RowSpan="2">
+                <Label Content="Recipe Mode"  FontSize="15" FontWeight="Bold" Margin="0,0,0,90" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"></Label>
+                <UserControls:RecipeModeControl HorizontalAlignment="Center" Margin="0,170,0,0" VerticalAlignment="Top" Width="190"
+                        ModuleName="{Binding Module}"
+                        RecipeModeValue="{Binding ReservoirsPersistent.RecipeOperatingMode}" />
+            </Grid>
+
+            <GroupBox Header="Cell Status" Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="2" HorizontalAlignment="Right" Height="180" VerticalAlignment="Center" Margin="0,0,30,50">
+                <Grid>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition Height="30"/>
+                    </Grid.RowDefinitions>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="200"></ColumnDefinition>
+                        <ColumnDefinition Width="80"></ColumnDefinition>
+                        <ColumnDefinition Width="80"></ColumnDefinition>
+                    </Grid.ColumnDefinitions>
+                    <Grid Grid.Row="0" >
+                        <Label Content="AN Tower Status" FontSize="14" FontWeight="Bold"   Margin="10,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" />
+                    </Grid>
+                    <Grid Grid.Row="1" >
+                        <Label Content="Anode Flow" FontSize="14" FontWeight="Bold"   Margin="10,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" />
+                    </Grid>
+                    <Grid Grid.Row="2" >
+                        <Label Content="Overflow Level" FontSize="14" FontWeight="Bold"   Margin="10,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" />
+                    </Grid>
+                    <Grid Grid.Row="3" >
+                        <Label Content="OverflowStatus" FontSize="14" FontWeight="Bold"   Margin="10,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"/>
+                    </Grid>
+                    <Grid Grid.Row="4" >
+                        <Label Content="Cell FLow" FontSize="14" FontWeight="Bold"   Margin="10,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"/>
+                    </Grid>
+
+                    <Grid Grid.Row="0" Grid.Column="1">
+                        <Ellipse Grid.Column="0" Width="16" Height="16" HorizontalAlignment="Left" Margin="3,0,0,0"  Fill="{Binding CommonSafetyData.Reservoir12CAPumpEdm,Converter={StaticResource boolToRedGreenColor}}" Stroke="Silver"/>
+                        <Label Content="High" FontSize="12" FontWeight="Bold"   Margin="20,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"/>
+                    </Grid>
+                    <Grid Grid.Row="0" Grid.Column="2">
+                        <Ellipse Grid.Column="0" Width="16" Height="16" HorizontalAlignment="Right" Margin="0 0 20 0"  Fill="{Binding CommonSafetyData.Reservoir12CAPumpEdm,Converter={StaticResource boolToRedGreenColor}}" Stroke="Silver"/>
+                        <Label Content="Low" FontSize="12" FontWeight="Bold"   Margin="8,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"/>
+                    </Grid>
+                    <Border Grid.Row="1" Grid.Column="1"  Margin="5,5,2,5" Background="Black">
+                        <TextBlock  Text="{Binding CommonData.VacuumValue, ElementName=self, StringFormat=\{0:F2\}}"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="1" Grid.Column="2"  Margin="5,5,25,5" Background="Black">
+                        <TextBlock   Text="L/min"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="2" Grid.Column="1"  Margin="5,5,2,5" Background="Black">
+                        <TextBlock  Text="{Binding CommonData.VacuumValue, ElementName=self, StringFormat=\{0:F2\}}"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="2" Grid.Column="2"  Margin="5,5,25,5" Background="Black">
+                        <TextBlock   Text="mm"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="3" Grid.Column="1"  Grid.ColumnSpan="2" Background="Black"  Height="30" Margin="5,5,25,5">
+                        <TextBlock Text="{Binding CurrentRecipe.Metal}" Foreground="Lime" FontSize="14" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="4" Grid.Column="1"  Margin="5,5,2,5" Background="Black">
+                        <TextBlock  Text="{Binding CommonData.VacuumValue, ElementName=self, StringFormat=\{0:F2\}}"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="4" Grid.Column="2"  Margin="5,5,25,5" Background="Black">
+                        <TextBlock   Text="L/min"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                    </Border>
+                </Grid>
+            </GroupBox>
+
+            <Grid Grid.Row="2" Grid.Column="0" Grid.RowSpan="2">
+                <UserControls:PlatingCellStatusControl HorizontalAlignment="Left" Margin="10,-50,0,0" VerticalAlignment="Center" 
+                IsEnabled="True"
+                ModuleName="{Binding Module}"
+                 />
+            </Grid>
+
+            <GroupBox Header="Plating Power Supply" Grid.Row="3" Grid.Column="0" Grid.RowSpan="2" HorizontalAlignment="Left" Height="150" VerticalAlignment="Center" Margin="10,0,30,0">
+                <Grid>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition Height="30"/>
+                    </Grid.RowDefinitions>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="100"></ColumnDefinition>
+                        <ColumnDefinition Width="100"></ColumnDefinition>
+                        <ColumnDefinition Width="100"></ColumnDefinition>
+                    </Grid.ColumnDefinitions>
+                    <Grid Grid.Row="1" >
+                        <Label Content="Current" FontSize="14" FontWeight="Bold"   Margin="10,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" />
+                    </Grid>
+                    <Grid Grid.Row="2" >
+                        <Label Content="Voltage" FontSize="14" FontWeight="Bold"   Margin="10,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" />
+                    </Grid>
+                    <Grid Grid.Row="0" Grid.Column="1">
+                        <Label Content="Setpoint" FontSize="12" FontWeight="Bold"   Margin="20,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"/>
+                    </Grid>
+                    <Grid Grid.Row="0" Grid.Column="2">
+                        <Label Content="Feedback" FontSize="12" FontWeight="Bold"   Margin="8,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"/>
+                    </Grid>
+                    <Border Grid.Row="1" Grid.Column="1"  Margin="5,5,5,5" Background="Black">
+                        <TextBlock  Text="{Binding CommonData.VacuumValue, ElementName=self, StringFormat=\{0:F2\}}"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="1" Grid.Column="2"  Margin="5,5,25,5" Background="Black">
+                        <TextBlock   Text="L/min"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="2" Grid.Column="1"  Margin="5,5,5,5" Background="Black">
+                        <TextBlock  Text="{Binding CommonData.VacuumValue, ElementName=self, StringFormat=\{0:F2\}}"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                    </Border>
+                    <Border Grid.Row="2" Grid.Column="2"  Margin="5,5,25,5" Background="Black">
+                        <TextBlock   Text="mm"  Foreground="Lime" FontSize="16" FontWeight="Bold" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+                    </Border>
+         
+                </Grid>
+            </GroupBox>
+
+            <Grid Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Grid.RowSpan="3" HorizontalAlignment="Center" Margin="-120,100,0,0">
+                <UserControls:PlatingCellUIControl ModuleName="{Binding Module}"
+                                      
+      
+             ></UserControls:PlatingCellUIControl>
+            </Grid>
+
+
+
+
 
         </Grid>
     </Canvas>

+ 0 - 2
PunkHPX8_MainPages/Views/VPWMainView.xaml

@@ -60,8 +60,6 @@
                                                MachineState="{Binding Status}"
                                                PressureTarget="{Binding VpwMainCommonData.PressureTarget}"
                                                
-                                               
-                                               
                                                ></UserControls:VPWMainStateControl>
         </Grid>
         <Grid Grid.Row="4" Grid.Column="0">

+ 4 - 4
PunkHPX8_RT/Config/System.sccfg

@@ -342,10 +342,10 @@
 	</configs>
 	<configs name="Reservoir" nameView="Reservoir">
 		<config default="0.5" name="LevelHysteresis" nameView="LevelHysteresis" description="level Hysteresis" max="2" min="0" paramter="" tag="" unit="" type="Double"></config>
-		<config default="5000" name="CADefaultPumpSpeed" nameView="CADefaultPumpSpeed" description="CA pump default speed" max="7200" min="0" paramter="" tag="" unit="" type="Double"></config>
-		<config default="7200" name="CAMaxPumpSpeed" nameView="CAMaxPumpSpeed" description="CA Max Pump Speed" max="10000" min="1" paramter="" tag="" unit="rpm" type="Double"></config>
-		<config default="3" name="ANDefaultPumpSpeed" nameView="ANDefaultPumpSpeed" description="AN pump default speed" max="5" min="0" paramter="" tag="" unit="" type="Double"></config>
-		<config default="7200" name="ANMaxPumpSpeed" nameView="ANMaxPumpSpeed" description="AN Max Pump Speed" max="10000" min="1" paramter="" tag="" unit="rpm" type="Double"></config>
+		<config default="30" name="CADefaultPumpSpeed" nameView="CADefaultPumpSpeed" description="CA pump default speed" max="100" min="0" paramter="" tag="" unit="" type="Double"></config>
+		<config default="100" name="CAMaxPumpSpeed" nameView="CAMaxPumpSpeed" description="CA Max Pump Speed" max="100" min="0" paramter="" tag="" unit="" type="Double"></config>
+		<config default="30" name="ANDefaultPumpSpeed" nameView="ANDefaultPumpSpeed" description="AN pump default speed" max="100" min="0" paramter="" tag="" unit="" type="Double"></config>
+		<config default="100" name="ANMaxPumpSpeed" nameView="ANMaxPumpSpeed" description="AN Max Pump Speed" max="1000" min="1" paramter="" tag="" unit="" type="Double"></config>
 		<config default="30" name="CellFlowUpdatePeriod" nameView="CellFlowUpdatePeriod" description="Cell Flow Update Period" max="60" min="0" paramter="" tag="" unit="s" type="Integer"/>
 		<config default="50" name="ReturnOpenDefaultPercentage" nameView="ReturnOpenDefaultPercentage" description="Return Valve default percentage" max="100" min="0" paramter="" tag="" unit="" type="Integer"></config>
 		<config default="20" name="LevelAvgSamples" nameView="LevelAvgSamples" description="Level average sample" max="100" min="0" paramter="" tag="" unit="" type="Integer"></config>

+ 13 - 1
PunkHPX8_RT/Devices/Reservoir/DMReservoirDevice.cs

@@ -26,6 +26,10 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// 默认泵速
         /// </summary>
         private double _anPumpSpeed = 5000;
+        /// <summary>
+        /// an泵速Helper
+        /// </summary>
+        private ReservoirANPumpSpeedHelper _anPumpSpeedHelper;
         #endregion
 
         #region 属性
@@ -55,6 +59,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// <param name="moduleName"></param>
         public DMReservoirDevice(string moduleName) : base(moduleName)
         {
+            _anPumpSpeedHelper = new ReservoirANPumpSpeedHelper(Module, this);
         }
         /// <summary>
         /// 订阅变量
@@ -177,7 +182,14 @@ namespace PunkHPX8_RT.Devices.Reservoir
             return WriteVariableValue(AN_ISOLATION, false);
         }
         #endregion
-
+        protected override void AutoMonitor()
+        {
+            base.AutoMonitor();
+            if (_persistentValue.OperatingMode == AUTO)
+            {
+                _anPumpSpeedHelper.Monitor(_resRecipe);
+            }
+        }
         /// <summary>
         /// 水位监控
         /// </summary>

+ 2 - 2
PunkHPX8_RT/Devices/Reservoir/ReservoirCAPumpSpeedHelper.cs

@@ -67,12 +67,12 @@ namespace PunkHPX8_RT.Devices.Reservoir
                 }
                 double caPumpMaxSpeed = SC.GetValue<double>("Reservoir.CAMaxPumpSpeed");
                 double caFlowDelta = resRecipe.CAFlowSetPoint - averageCAFlow;
-                double newCAPumpSpeed = 330 * caFlowDelta + caPumpSpeed;
+                double newCAPumpSpeed = 1.8 * caFlowDelta + caPumpSpeed;  //系数1.8待调整
                 if (newCAPumpSpeed <= 0 || newCAPumpSpeed > caPumpMaxSpeed)
                 {
                     return;
                 }
-                if (Math.Abs(newCAPumpSpeed - caPumpSpeed) >= 10)
+                if (Math.Abs(newCAPumpSpeed - caPumpSpeed) >= 0.5)
                 {
                     _device.CAPumpSpeed(newCAPumpSpeed);
                 }

+ 76 - 5
PunkHPX8_RT/Devices/Reservoir/ReservoirDevice.cs

@@ -31,6 +31,7 @@ using System.Reflection;
 using System.ServiceModel.Security;
 using System.Text;
 using System.Threading.Tasks;
+using System.Windows.Documents;
 
 namespace PunkHPX8_RT.Devices.Reservoir
 {
@@ -73,6 +74,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
         protected const string HED_FLOW_ENABLE="HedFlowEnable";
         protected const string PH_FLOW_VALVE="PhFlowValve";
         protected const string PH_VALUE="PhValue";
+        private const int ENABLE = 5;
         #endregion
 
         #region 内部变量
@@ -106,10 +108,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// CA level计算平均值取样数
         /// </summary>
         private int _levelSampleCount;
-        /// <summary>
-        /// Recipe
-        /// </summary>
-        private ResRecipe _resRecipe;
+     
 
         /// <summary>
         /// 累计补水是否超时
@@ -140,6 +139,13 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// ca flow 是否首次达到条件
         /// </summary>
         private bool _isFirstCaFlowOK = false;
+
+        /// <summary>
+        /// ca泵速Helper
+        /// </summary>
+        private ReservoirCAPumpSpeedHelper _caPumpSpeedHelper;
+        //TC是否报警
+        private bool _isTCControlWARN = false;
         #endregion
 
         #region Trigger
@@ -172,6 +178,10 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// platingcellData
         /// </summary>
         protected PlatingCellDevice _platingCellDevice;
+        /// <summary>
+        /// Recipe
+        /// </summary>
+        protected ResRecipe _resRecipe;
         #endregion
 
         #region 属性
@@ -266,6 +276,8 @@ namespace PunkHPX8_RT.Devices.Reservoir
             }
             _direplenHelper = new ReservoirDiReplenHelper(Module, _persistentValue);
             
+            _caPumpSpeedHelper = new ReservoirCAPumpSpeedHelper(Module, this);
+
             ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module);
             if (reservoirItem!=null)
             {
@@ -427,10 +439,22 @@ namespace PunkHPX8_RT.Devices.Reservoir
             DireplenMonitor();
             AutoOpenDegasValve();
             HedMonitor();
+            AutoMonitor();
             return true;
         }
         #region timer
         /// <summary>
+        /// 处于Auto时要监控的逻辑
+        /// </summary>
+        protected virtual void AutoMonitor()
+        {
+            if (_persistentValue.OperatingMode == AUTO)
+            {
+                _caPumpSpeedHelper.Monitor(_resRecipe);
+                TemperatureCheck();
+            }
+        }
+        /// <summary>
         /// 监控TC
         /// </summary>
         private void HedMonitor()
@@ -1341,7 +1365,54 @@ namespace PunkHPX8_RT.Devices.Reservoir
         public void Terminate()
         {
         }
-        
+
+        /// <summary>
+        /// Temperature Check
+        /// </summary>
+        private void TemperatureCheck()
+        {
+            ReservoirEntity reservoirEntity = Singleton<RouteManager>.Instance.GetModule<ReservoirEntity>(Module);
+            ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module);
+            TemperatureController temperatureController = DEVICE.GetDevice<TemperatureController>(reservoirItem.TCID);
+            if (temperatureController == null || temperatureController.TemperatureData == null || _resRecipe == null
+                || temperatureController.TemperatureData.ControlOperationModel != ENABLE) return;
+
+            double tempValue = temperatureController.TemperatureData.ReserviorTemperature;
+            if (tempValue > _resRecipe.TemperatureErrorHigh && !reservoirEntity.IsError)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{temperatureController.Name} temperature:{tempValue} is over recipe TemperatureErrorHigh parameter:{_resRecipe.TemperatureErrorHigh}");
+                reservoirEntity.PostMsg(ReservoirMsg.Error);
+            }
+            else if (tempValue < _resRecipe.TemperatureErrorLow && !reservoirEntity.IsError)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{temperatureController.Name} temperature:{tempValue} is less than recipe TemperatureErrorLow parameter:{_resRecipe.TemperatureErrorLow}");
+                reservoirEntity.PostMsg(ReservoirMsg.Error);
+            }
+            else if (tempValue > _resRecipe.TemperatureWarningHigh)
+            {
+                if (!_isTCControlWARN)
+                {
+                    LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{temperatureController.Name} temperature:{tempValue} is over recipe TemperatureWarningHigh parameter:{_resRecipe.TemperatureWarningHigh}");
+                    _isTCControlWARN = true;
+                    AlarmListManager.Instance.AddWarn(Module,
+                    $"Temperature", $"{Module} temperature:{tempValue} is large than recipe temperatureWarningHigh{_resRecipe.TemperatureWarningHigh}");
+                }
+            }
+            else if (tempValue < _resRecipe.TemperatureWarningLow)
+            {
+                if (!_isTCControlWARN)
+                {
+                    LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{temperatureController.Name} temperature;{tempValue} is less than recipe TemperatureWarningLow parameter:{_resRecipe.TemperatureWarningLow}");
+                    _isTCControlWARN = true;
+                    AlarmListManager.Instance.AddWarn(Module,
+                    $"Temperature", $"{Module} temperature:{tempValue} is lower than recipe temperatureWarningLow{_resRecipe.TemperatureWarningLow}");
+                }
+            }
+            else
+            {
+                _isTCControlWARN = false;
+            }
+        }
 
     }
 }

+ 6 - 0
PunkHPX8_RT/Modules/Reservoir/DMReservoirInitializeRoutine.cs

@@ -34,6 +34,8 @@ namespace PunkHPX8_RT.Modules.Reservoir
             CheckDiReplen,
             AutoDiReplen,
             AutoCellAutoEnableHED,
+            AutoCellAutoEnableHEDDelay,
+            AutoCellAutoEnableHEDCheck,
             End
         }
         #region 常量 
@@ -86,6 +88,8 @@ namespace PunkHPX8_RT.Modules.Reservoir
                   .RunIf(InitializeStep.CellAutoCheckFlow,_dmReservoirDevice.OperationMode == AUTO, AutoCheckFlow, _delay_1ms)
                   .RunIf(InitializeStep.AutoDiReplen, _recipe.DIReplenEnable || _recipe.ANDIReplenEnable, CheckFacilitiesDiReplenStatus, _delay_1ms)
                   .Run(InitializeStep.AutoCellAutoEnableHED, AutoHedOn, _delay_1ms)
+                  .Delay(InitializeStep.AutoCellAutoEnableHEDDelay, _autoHedDelay)
+                  .Run(InitializeStep.AutoCellAutoEnableHEDCheck, AutoHedSuccess, _delay_1ms)
                   .End(InitializeStep.End, ClearAlarmDataError, _delay_1ms);
             return Runner.Status;
         }
@@ -195,6 +199,7 @@ namespace PunkHPX8_RT.Modules.Reservoir
                 LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"CA Flow {_dmReservoirDevice.ReservoirData.CaFlow} is less than CellFlowStartLowLimit{_cellFlowStartLowLimit}");
                 return false;
             }
+            _autoHedDelay = _delay_2s;
             result = _temperatureController.EnableOperation("", null);
             if (!result)
             {
@@ -442,5 +447,6 @@ namespace PunkHPX8_RT.Modules.Reservoir
             }
             return true;
         }
+
     }
 }

+ 1 - 11
PunkHPX8_RT/Modules/SRD/SRDSwitchOffRoutine.cs

@@ -16,7 +16,6 @@ namespace PunkHPX8_RT.Modules.Transporter
     {
         private enum SwitchOffStep
         {
-            Arm,
             Rotation,
             End
         }
@@ -47,21 +46,12 @@ namespace PunkHPX8_RT.Modules.Transporter
 
         public RState Monitor()
         {
-            Runner.Run(SwitchOffStep.Arm, ArmAxisSwitchOff, CheckArmSwitchOff, _timeOut)
-                .Run(SwitchOffStep.Rotation, RotationAxisSwitchOff, CheckRotationSwitchOff, _timeOut)
+            Runner.Run(SwitchOffStep.Rotation, RotationAxisSwitchOff, CheckRotationSwitchOff, _timeOut)
                 .End(SwitchOffStep.End,NullFun);
 
             return Runner.Status; 
         }
        
-        private bool ArmAxisSwitchOff()
-        {
-            return _armAxis.SwitchOff();
-        }
-        private bool CheckArmSwitchOff()
-        {
-            return !_armAxis.IsSwitchOn&&_armAxis.Status==RState.End;
-        }
         private bool RotationAxisSwitchOff()
         {
             return _rotationAxis.SwitchOff();

+ 14 - 0
PunkHPX8_Themes/PunkHPX8_Themes.csproj

@@ -274,6 +274,12 @@
     <Compile Include="UserControls\PathButton.xaml.cs">
       <DependentUpon>PathButton.xaml</DependentUpon>
     </Compile>
+    <Compile Include="UserControls\PlatingCellStatusControl.xaml.cs">
+      <DependentUpon>PlatingCellStatusControl.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="UserControls\PlatingCellUIControl.xaml.cs">
+      <DependentUpon>PlatingCellUIControl.xaml</DependentUpon>
+    </Compile>
     <Compile Include="UserControls\PlatingPowerSupplyControl.xaml.cs">
       <DependentUpon>PlatingPowerSupplyControl.xaml</DependentUpon>
     </Compile>
@@ -791,6 +797,14 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="UserControls\PlatingCellStatusControl.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="UserControls\PlatingCellUIControl.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="UserControls\PlatingPowerSupplyControl.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 130 - 0
PunkHPX8_Themes/UserControls/PlatingCellStatusControl.xaml

@@ -0,0 +1,130 @@
+<UserControl x:Class="PunkHPX8_Themes.UserControls.PlatingCellStatusControl"
+             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:converters="clr-namespace:PunkHPX8_Themes.Converters"
+             xmlns:UserControls="clr-namespace:PunkHPX8_Themes.UserControls"
+             xmlns:Control="clr-namespace:MECF.Framework.UI.Core.Control;assembly=MECF.Framework.UI.Core"
+             xmlns:local="clr-namespace:PunkHPX8_Themes.UserControls"
+             mc:Ignorable="d" x:Name="self"
+             d:DesignHeight="310" d:DesignWidth="420">
+    <UserControl.Resources>
+        <converters:BoolToYellowColor x:Key="boolToYellowColor"></converters:BoolToYellowColor>
+        <converters:BoolToColor x:Key="boolToColor"></converters:BoolToColor>
+        <converters:BoolToColor2 x:Key="boolToColor2"></converters:BoolToColor2>
+        <converters:BoolToColor6 x:Key="boolToColor6"></converters:BoolToColor6>
+        <converters:BoolToBool x:Key="boolToBool"></converters:BoolToBool>
+    </UserControl.Resources>
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="40"/>
+            <RowDefinition Height="40"/>
+            <RowDefinition Height="40"/>
+            <RowDefinition Height="40"/>
+            <RowDefinition Height="40"/>
+            <RowDefinition Height="40"/>
+            <RowDefinition Height="40"/>
+            <RowDefinition/>
+        </Grid.RowDefinitions>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="180"/>
+            <ColumnDefinition Width="30"/>
+            <ColumnDefinition Width="80"/>
+            <ColumnDefinition Width="80"/>
+            <ColumnDefinition Width="30"/>
+            <ColumnDefinition Width="60"/>
+            <ColumnDefinition/>
+        </Grid.ColumnDefinitions>
+        <Grid Grid.Row="0" Grid.Column="0">
+            <Label Content="Chemistry" FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+        </Grid>
+        <Grid Grid.Row="1" Grid.Column="0">
+            <Label Content="Vertical Station" FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+        </Grid>
+        <Grid Grid.Row="2" Grid.Column="0">
+            <Label Content="Wafer Size" FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+        </Grid>
+        <Grid Grid.Row="3" Grid.Column="0">
+            <Label Content="Clamshell Sensor" FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+        </Grid>
+        <Grid Grid.Row="4" Grid.Column="0">
+            <Label Content="Clamshell" FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+        </Grid>
+        <Grid Grid.Row="5" Grid.Column="0">
+            <Label Content="Angle Entry" FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+        </Grid>
+        <Grid Grid.Row="6" Grid.Column="0">
+            <Label Content="Rotation" FontSize="15" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"/>
+        </Grid>
+        <Border Grid.Row="1" Grid.Column="1"  Grid.ColumnSpan="2" Margin="5,5,5,5" Background="Black" Width="50" VerticalAlignment="Center" HorizontalAlignment="Left">
+            <TextBlock  Text="{Binding ElementName=self,Path=VerticalStation}" Foreground="Lime" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Left"/>
+        </Border>
+        <Border Grid.Row="1" Grid.Column="2"  Grid.ColumnSpan="2" Margin="32,5,5,5" Background="Black" Height="22" Width="50" VerticalAlignment="Center" HorizontalAlignment="Left">
+            <TextBlock  Text="mm" Foreground="Lime" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Left"/>
+        </Border>
+
+        <Grid Grid.Row="6" Grid.Column="2" >
+            <Button Style="{StaticResource SysBtnStyle}" Margin="0,0,0,0" Grid.Column="1" Height="25" Width="60" HorizontalAlignment="Center" Content="Start" Click="RotationStart_Click"></Button>
+        </Grid>
+        <Grid Grid.Row="6" Grid.Column="3" >
+            <Button Style="{StaticResource SysBtnStyle}" Margin="0,0,0,0" Grid.Column="1" Height="25" Width="60" HorizontalAlignment="Center" Content="Stop" Click="RotationStop_Click"></Button>
+        </Grid>
+
+        <Control:NumbericTextBox Grid.Row="7" Grid.Column="1" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="15" FontWeight="Bold" Height="22" Width="50" Margin="5,0,5,0"
+                Value="{Binding ElementName=self,Path=InputRotationSpeed}"  
+                IsEnabled="True"/>
+        <TextBlock Grid.Row="7" Background="White"   Grid.Column="2" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Center"  FontSize="15" FontWeight="Bold" Height="22" Width="40" Margin="-35,0,30,0" Text="rpm"/>
+
+        <Control:NumbericTextBox Grid.Row="7" Grid.Column="3" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="15" FontWeight="Bold" Height="22" Width="50" Margin="-7,0,5,0"
+          Value="{Binding ElementName=self,Path=InputRotationTime}"  
+          IsEnabled="True"/>
+        <TextBlock Grid.Row="7" Background="White"   Grid.Column="4" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Center"  FontSize="15" FontWeight="Bold" Height="22" Width="40" Margin="-65,0,50,0" Text="sec"/>
+
+
+        <Grid Grid.Row="4" Grid.Column="1">
+            <Ellipse Grid.Column="1" Width="16" Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" Stroke="Silver"
+                Fill="{Binding IsClamshellOpen, Converter={StaticResource boolToColor}, ElementName=self}" />
+        </Grid>
+        <Grid Grid.Row="4" Grid.Column="2" >
+            <Button Style="{StaticResource SysBtnStyle}" Margin="0,0,0,0" Grid.Column="1" Height="25" Width="60" HorizontalAlignment="Center" Content="Open" Click="ClamshellOpen_Click"></Button>
+        </Grid>
+        <Grid Grid.Row="4" Grid.Column="3" >
+            <Button Style="{StaticResource SysBtnStyle}" Margin="0,0,0,0" Grid.Column="1" Height="25" Width="60" HorizontalAlignment="Center" Content="Close" Click="ClamshellClose_Click"></Button>
+        </Grid>
+        <Grid Grid.Row="4" Grid.Column="4">
+            <Ellipse Grid.Column="1" Width="16" Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" Stroke="Silver"
+                    Fill="{Binding IsClamshellClose, Converter={StaticResource boolToColor}, ElementName=self}" />
+        </Grid>
+
+        <Grid Grid.Row="5" Grid.Column="1">
+            <Ellipse Grid.Column="1" Width="16" Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" Stroke="Silver"
+                Fill="{Binding IsAngleTilt, Converter={StaticResource boolToColor}, ElementName=self}"/>
+        </Grid>
+        <Grid Grid.Row="5" Grid.Column="2" >
+            <Button Style="{StaticResource SysBtnStyle}" Margin="0,0,0,0" Grid.Column="1" Height="25" Width="60" HorizontalAlignment="Center" Content="Tilt" Click="AngleTilt_Click"></Button>
+        </Grid>
+        <Grid Grid.Row="5" Grid.Column="3" >
+            <Button Style="{StaticResource SysBtnStyle}" Margin="0,0,0,0" Grid.Column="1" Height="25" Width="60" HorizontalAlignment="Center" Content="Vertical" Click="AngleVertical_Click"></Button>
+        </Grid>
+        <Grid Grid.Row="5" Grid.Column="4">
+            <Ellipse Grid.Column="1" Width="16" Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" Stroke="Silver"
+              Fill="{Binding IsAngleVertical, Converter={StaticResource boolToColor}, ElementName=self}"/>
+        </Grid>
+        <Border Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" Margin="5,5,5,5" Background="Black">
+            <TextBlock  Text="{Binding ElementName=self,Path=Chemistry}" Foreground="Lime" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Left"/>
+        </Border>
+        <Border Grid.Row="2" Grid.Column="1"  Grid.ColumnSpan="2" Margin="5,5,5,5" Background="Black" Width="50" VerticalAlignment="Center" HorizontalAlignment="Left">
+            <TextBlock  Text="{Binding ElementName=self,Path=WaferSize}" Foreground="Lime" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Left"/>
+        </Border>
+        <Border Grid.Row="2" Grid.Column="2"  Grid.ColumnSpan="2" Margin="32,5,5,5" Background="Black" Height="22" Width="50" VerticalAlignment="Center" HorizontalAlignment="Left">
+            <TextBlock  Text="Psi" Foreground="Lime" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Left"/>
+        </Border>
+        <Border Grid.Row="3" Grid.Column="1"  Grid.ColumnSpan="2" Margin="5,5,5,5" Background="Black" Width="50" VerticalAlignment="Center" HorizontalAlignment="Left">
+            <TextBlock  Text="{Binding ElementName=self,Path=ClamshellSensor}" Foreground="Lime" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Left"/>
+        </Border>
+        <Border Grid.Row="3" Grid.Column="2"  Grid.ColumnSpan="2" Margin="32,5,5,5" Background="Black" Height="22" Width="50" VerticalAlignment="Center" HorizontalAlignment="Left">
+            <TextBlock  Text="Psi" Foreground="Lime" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Left"/>
+        </Border>
+    </Grid>
+</UserControl>

+ 264 - 0
PunkHPX8_Themes/UserControls/PlatingCellStatusControl.xaml.cs

@@ -0,0 +1,264 @@
+using Aitex.Core.Common;
+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 PunkHPX8_Themes.UserControls
+{
+    /// <summary>
+    /// PlatingCellStatusControl.xaml 的交互逻辑
+    /// </summary>
+    public partial class PlatingCellStatusControl : UserControl
+    {
+        public PlatingCellStatusControl()
+        {
+            InitializeComponent();
+        }
+
+        public static readonly DependencyProperty ModuleNameProperty = DependencyProperty.Register(
+         "ModuleName", typeof(string), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// 模块名称
+        /// </summary>
+        public string ModuleName
+        {
+            get
+            {
+                return (string)this.GetValue(ModuleNameProperty);
+            }
+            set
+            {
+                this.SetValue(ModuleNameProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty ChemistryProperty = DependencyProperty.Register(
+           "Chemistry", typeof(string), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Chemistry
+        /// </summary>
+        public string Chemistry
+        {
+            get
+            {
+                return (string)this.GetValue(ChemistryProperty);
+            }
+            set
+            {
+                this.SetValue(ChemistryProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty VerticalStationProperty = DependencyProperty.Register(
+            "VerticalStation", typeof(string), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// VerticalStation
+        /// </summary>
+        public string VerticalStation
+        {
+            get
+            {
+                return (string)this.GetValue(VerticalStationProperty);
+            }
+            set
+            {
+                this.SetValue(VerticalStationProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty WaferSizeProperty = DependencyProperty.Register(
+            "WaferSize", typeof(int), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        ///WaferSize
+        /// </summary>
+        public double WaferSize
+        {
+            get
+            {
+                return (double)this.GetValue(WaferSizeProperty);
+            }
+            set
+            {
+                this.SetValue(WaferSizeProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty WaferSizeListProperty = DependencyProperty.Register(
+            "WaferSizeList", typeof(List<int>), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        ///WaferSizeList
+        /// </summary>
+        public List<int> WaferSizeList
+        {
+            get
+            {
+                return (List<int>)this.GetValue(WaferSizeListProperty);
+            }
+            set
+            {
+                this.SetValue(WaferSizeListProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty ClamshellSensorProperty = DependencyProperty.Register(
+            "ClamshellSensor", typeof(double), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// ClamshellSensor
+        /// </summary>
+        public double ClamshellSensor
+        {
+            get
+            {
+                return (double)this.GetValue(ClamshellSensorProperty);
+            }
+            set
+            {
+                this.SetValue(ClamshellSensorProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty IsClamshellOpenProperty = DependencyProperty.Register(
+           "IsClamshellOpen", typeof(bool), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// IsClamshellOpen
+        /// </summary>
+        public bool IsClamshellOpen
+        {
+            get
+            {
+                return (bool)this.GetValue(IsClamshellOpenProperty);
+            }
+            set
+            {
+                this.SetValue(IsClamshellOpenProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty IsClamshellCloseProperty = DependencyProperty.Register(
+           "IsClamshellClose", typeof(bool), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// IsClamshellClose
+        /// </summary>
+        public bool IsClamshellClose
+        {
+            get
+            {
+                return (bool)this.GetValue(IsClamshellCloseProperty);
+            }
+            set
+            {
+                this.SetValue(IsClamshellCloseProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty IsAngleTiltProperty = DependencyProperty.Register(
+          "IsAngleTilt", typeof(bool), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// IsAngleTilt
+        /// </summary>
+        public bool IsAngleTilt
+        {
+            get
+            {
+                return (bool)this.GetValue(IsAngleTiltProperty);
+            }
+            set
+            {
+                this.SetValue(IsAngleTiltProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty IsAngleVerticalProperty = DependencyProperty.Register(
+         "IsAngleVertical", typeof(bool), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// IsAngleVertical
+        /// </summary>
+        public bool IsAngleVertical
+        {
+            get
+            {
+                return (bool)this.GetValue(IsAngleVerticalProperty);
+            }
+            set
+            {
+                this.SetValue(IsAngleVerticalProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty InputRotationSpeedProperty = DependencyProperty.Register(
+           "InputRotationSpeed", typeof(int), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// InputRotationSpeed
+        /// </summary>
+        public int InputRotationSpeed
+        {
+            get
+            {
+                return (int)this.GetValue(InputRotationSpeedProperty);
+            }
+            set
+            {
+                this.SetValue(InputRotationSpeedProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty InputRotationTimeProperty = DependencyProperty.Register(
+           "InputRotationTime", typeof(int), typeof(PlatingCellStatusControl), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// InputRotationTime
+        /// </summary>
+        public int InputRotationTime
+        {
+            get
+            {
+                return (int)this.GetValue(InputRotationTimeProperty);
+            }
+            set
+            {
+                this.SetValue(InputRotationTimeProperty, value);
+            }
+        }
+
+
+        private void ClamshellOpen_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void ClamshellClose_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void AngleTilt_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void AngleVertical_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void RotationStart_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void RotationStop_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+    }
+}

+ 99 - 0
PunkHPX8_Themes/UserControls/PlatingCellUIControl.xaml

@@ -0,0 +1,99 @@
+<UserControl x:Class="PunkHPX8_Themes.UserControls.PlatingCellUIControl"
+         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:userControls="clr-namespace:PunkHPX8_Themes.UserControls"
+         xmlns:customControls="clr-namespace:PunkHPX8_Themes.CustomControls"
+         xmlns:converters="clr-namespace:PunkHPX8_Themes.Converters"
+         xmlns:local="clr-namespace:PunkHPX8_Themes.UserControls"
+         mc:Ignorable="d" Name="self"
+         d:DesignHeight="500" d:DesignWidth="800">
+    <UserControl.Resources>
+        <converters:BoolToVisibility2 x:Key="boolToVisibility2"></converters:BoolToVisibility2>
+        <converters:BoolToVisibility x:Key="boolToVisibility"></converters:BoolToVisibility>
+        <converters:BoolToOrientation x:Key="boolToOrientation"></converters:BoolToOrientation>
+        <converters:MutiBoolToBool x:Key="mutiBoolToBool"/>
+        <ContextMenu x:Key="CCRValve">
+            <MenuItem Header="Open" Click="OpenCCRValve_Click"/>
+            <MenuItem Header="Close" Click="CloseCCRValve_Click"/>
+        </ContextMenu>
+        <ContextMenu x:Key="RinseValve">
+            <MenuItem Header="Open" Click="OpenRinseValve_Click"/>
+            <MenuItem Header="Close" Click="CloseRinseValve_Click"/>
+        </ContextMenu>
+        <ContextMenu x:Key="CAIsolationValve">
+            <MenuItem Header="Open" Click="OpenCAIsolationValve_Click"/>
+            <MenuItem Header="Close" Click="CloseCAIsolationValve_Click"/>
+        </ContextMenu>
+        <ContextMenu x:Key="ANIsolationValve">
+            <MenuItem Header="Open" Click="OpenANIsolationValve_Click"/>
+            <MenuItem Header="Close" Click="CloseANIsolationValve_Click"/>
+        </ContextMenu>
+    </UserControl.Resources>
+    <Canvas>
+        <Grid Height="50" Width="100" Canvas.Left="206" Canvas.Top="202" HorizontalAlignment="Center" VerticalAlignment="Top"  >
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="30"></RowDefinition>
+                    <RowDefinition Height="20"></RowDefinition>
+                </Grid.RowDefinitions>
+                <Grid Grid.Row="0">
+                    <customControls:CommonValveControl Height="16" Width="16"   ValveOrientation="Horizontal" 
+                          Status="{Binding ElementName=self,Path=CCRValve}"  
+                          IsCanEdit="True" 
+                          ContextMenu="{StaticResource CCRValve}"/>
+                </Grid>
+                <Grid Grid.Row="1" >
+                    <Label Margin="35,0,0,0" Height="20" Width="100" FontSize="10"  FontWeight="Bold" Content="CCR" />
+                </Grid>
+            </Grid>
+
+        <Grid Height="50" Width="100" Canvas.Left="306" Canvas.Top="202" HorizontalAlignment="Center" VerticalAlignment="Top"  >
+            <Grid.RowDefinitions>
+                <RowDefinition Height="30"></RowDefinition>
+                <RowDefinition Height="20"></RowDefinition>
+            </Grid.RowDefinitions>
+            <Grid Grid.Row="0">
+                <customControls:CommonValveControl Height="16" Width="16"   ValveOrientation="Horizontal" 
+              Status="{Binding ElementName=self,Path=RinseValve}"  
+              IsCanEdit="True" 
+              ContextMenu="{StaticResource RinseValve}"/>
+            </Grid>
+            <Grid Grid.Row="1" >
+                <Label Margin="30,0,0,0" Height="20" Width="100" FontSize="10"  FontWeight="Bold" Content="Rinse" />
+            </Grid>
+        </Grid>
+
+        <Grid Height="50" Width="100" Canvas.Left="306" Canvas.Top="402" HorizontalAlignment="Center" VerticalAlignment="Top"  >
+            <Grid.RowDefinitions>
+                <RowDefinition Height="30"></RowDefinition>
+                <RowDefinition Height="20"></RowDefinition>
+            </Grid.RowDefinitions>
+            <Grid Grid.Row="0">
+                <customControls:CommonValveControl Height="16" Width="16"   ValveOrientation="Horizontal" 
+                Status="{Binding ElementName=self,Path=ANIsolationValve}"  
+                IsCanEdit="True" 
+                ContextMenu="{StaticResource ANIsolationValve}"/>
+            </Grid>
+            <Grid Grid.Row="1" >
+                <Label Margin="13,0,0,0" Height="20" Width="100" FontSize="10"  FontWeight="Bold" Content="AN Isolation" />
+            </Grid>
+        </Grid>
+
+        <Grid Height="50" Width="100" Canvas.Left="306" Canvas.Top="302" HorizontalAlignment="Center" VerticalAlignment="Top"  >
+            <Grid.RowDefinitions>
+                <RowDefinition Height="30"></RowDefinition>
+                <RowDefinition Height="20"></RowDefinition>
+            </Grid.RowDefinitions>
+            <Grid Grid.Row="0">
+                <customControls:CommonValveControl Height="16" Width="16"   ValveOrientation="Horizontal" 
+         Status="{Binding ElementName=self,Path=CAIsolationValve}"  
+         IsCanEdit="True" 
+         ContextMenu="{StaticResource CAIsolationValve}"/>
+            </Grid>
+            <Grid Grid.Row="1" >
+                <Label Margin="13,0,0,0" Height="20" Width="100" FontSize="10"  FontWeight="Bold" Content="CA Isolation" />
+            </Grid>
+        </Grid>
+    </Canvas>
+</UserControl>

+ 156 - 0
PunkHPX8_Themes/UserControls/PlatingCellUIControl.xaml.cs

@@ -0,0 +1,156 @@
+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 PunkHPX8_Themes.UserControls
+{
+    /// <summary>
+    /// PlatingCellUIControl.xaml 的交互逻辑
+    /// </summary>
+    public partial class PlatingCellUIControl : UserControl
+    {
+        public PlatingCellUIControl()
+        {
+            InitializeComponent();
+        }
+
+        public static readonly DependencyProperty ModuleNameProperty = DependencyProperty.Register(
+         "ModuleName", typeof(string), typeof(PlatingCellUIControl),
+         new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// 模块名称
+        /// </summary>
+        public string ModuleName
+        {
+            get
+            {
+                return (string)this.GetValue(ModuleNameProperty);
+            }
+            set
+            {
+                this.SetValue(ModuleNameProperty, value);
+            }
+        }
+
+        public static readonly DependencyProperty CCRValveProerty = DependencyProperty.Register(
+            "CCRValve", typeof(bool), typeof(PlatingCellUIControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// CCRValve
+        /// </summary>
+        public bool CCRValve
+        {
+            get
+            {
+                return (bool)this.GetValue(CCRValveProerty);
+            }
+            set
+            {
+                this.SetValue(CCRValveProerty, value);
+            }
+        }
+
+        public static readonly DependencyProperty RinseValveProerty = DependencyProperty.Register(
+            "RinseValve", typeof(bool), typeof(PlatingCellUIControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// RinseValve
+        /// </summary>
+        public bool RinseValve
+        {
+            get
+            {
+                return (bool)this.GetValue(RinseValveProerty);
+            }
+            set
+            {
+                this.SetValue(RinseValveProerty, value);
+            }
+        }
+
+        public static readonly DependencyProperty CAIsolationValveProerty = DependencyProperty.Register(
+            "CAIsolationValve", typeof(bool), typeof(PlatingCellUIControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// CAIsolationValve
+        /// </summary>
+        public bool CAIsolationValve
+        {
+            get
+            {
+                return (bool)this.GetValue(CAIsolationValveProerty);
+            }
+            set
+            {
+                this.SetValue(CAIsolationValveProerty, value);
+            }
+        }
+
+        public static readonly DependencyProperty ANIsolationValveProerty = DependencyProperty.Register(
+            "ANIsolationValve", typeof(bool), typeof(PlatingCellUIControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// ANIsolationValve
+        /// </summary>
+        public bool ANIsolationValve
+        {
+            get
+            {
+                return (bool)this.GetValue(ANIsolationValveProerty);
+            }
+            set
+            {
+                this.SetValue(ANIsolationValveProerty, value);
+            }
+        }
+
+        private void OpenCCRValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void CloseCCRValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void OpenRinseValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void CloseRinseValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void OpenCAIsolationValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void CloseCAIsolationValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void OpenANIsolationValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void CloseANIsolationValve_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+       
+    }
+}