Explorar o código

add platingcell run recipe releated

chenzk hai 1 semana
pai
achega
698880cb75

+ 43 - 1
PunkHPX8_MainPages/ViewModels/PlatingCellHomePageViewModel.cs

@@ -16,6 +16,7 @@ using MECF.Framework.Common.RecipeCenter;
 using MECF.Framework.Common.ToolLayout;
 using MECF.Framework.Common.Utilities;
 using Prism.Mvvm;
+using PunkHPX8_MainPages.Unity;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -24,6 +25,7 @@ using System.Threading.Tasks;
 using System.Windows.Forms.VisualStyles;
 using System.Windows.Input;
 using System.Windows.Threading;
+using WaferInfo = OpenSEMI.ClientBase.WaferInfo;
 
 namespace PunkHPX8_MainPages.ViewModels
 {
@@ -187,6 +189,20 @@ namespace PunkHPX8_MainPages.ViewModels
         private double _currentCCRRotationSpeed;
         #endregion
 
+        #region wafer
+        /// <summary>
+        /// WaferID
+        /// </summary>
+        private string _waferID = "";
+        /// <summary>
+        /// Wafer信息
+        /// </summary>
+        private WaferInfo _waferInfo;
+        #endregion
+
+
+        
+
         #region 属性
 
         #region Common
@@ -316,6 +332,8 @@ namespace PunkHPX8_MainPages.ViewModels
         #endregion
 
 
+
+
         /// SeqRecipe
         /// </summary>
         public string SeqRecipe
@@ -438,8 +456,27 @@ namespace PunkHPX8_MainPages.ViewModels
             set { SetProperty(ref _powerSupplierData, value); }
         }
 
+        #region wafer
+        /// <summary>
+        /// WaferID
+        /// </summary>
+        public string WaferID
+        {
+            get { return _waferID; }
+            set { SetProperty(ref _waferID, value); }
+        }
+        /// <summary>
+        /// Wafer信息
+        /// </summary>
+        public WaferInfo WaferInfo
+        {
+            get { return _waferInfo; }
+            set { SetProperty(ref _waferInfo, value); }
+        }
         #endregion
-        
+
+        #endregion
+
         #endregion
 
         #region Command指令
@@ -530,6 +567,11 @@ namespace PunkHPX8_MainPages.ViewModels
                     CurrentCCRStep = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.CurrentCCRStep");
                     CurrentCCRStepTimeRemain = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.CurrentCCRTimeRemain");
                     CurrentCCRRotationSpeed = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.Rotation.ProfileVelocity");
+                    //PlatingCell Wafer信息
+                    if (ModuleManager.ModuleInfos[Module].WaferManager.Wafers.Count != 0)
+                    {
+                        WaferInfo = ModuleManager.ModuleInfos[Module].WaferManager.Wafers[0];
+                    }
                     if ("Manual".Equals(PlatingCellPersistent.OperatingMode))
                     {
                         IsEnabled = true;

+ 1 - 0
PunkHPX8_MainPages/Views/PlatingCellHomePageView.xaml

@@ -234,6 +234,7 @@
                                                 CAIsolationValve="{Binding ReservoirCommonData.CaIsolation}"
                                                 CCRValve="{Binding PlatingCellCommonData.CCREnable}"
                                                 RinseValve="{Binding PlatingCellCommonData.RinseEnable}"
+                                                WaferInfo="{Binding WaferInfo}" 
                                      
             />
 

+ 8 - 9
PunkHPX8_RT/Modules/PlatingCell/PlatingCellDepositionRoutine.cs

@@ -37,7 +37,6 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             LoopRotationBiRotation,
             LoopRotationBiRotationCheck,
 
-            LoopUpdateDepositionIndex,
             LoopEnd,
             RotationStartIfCurrentIsStoped,
             End
@@ -114,9 +113,8 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// </summary>
         /// <returns></returns>
         public RState Monitor()
-        {
-            Runner //没有上电保护,此刻给电
-                .RunIf(RunRecipeStep.RunPowerStep, _recipe.IsEntryTypeCold, StartPowerStep, _delay_1ms)
+        {               //没有上电保护,此刻给电
+            Runner.RunIf(RunRecipeStep.RunPowerStep, _recipe.IsEntryTypeCold, StartPowerStep, _delay_1ms)
                 .LoopStart(RunRecipeStep.LoopRotationStart, "Start rotation cycle",_recipe.DepStepCount,NullFun)
                 //vertical 调整位置
                 .LoopRunIf(RunRecipeStep.LoopVerticalGotoOffSet, _recipe.DepSteps[_depositionStepIndex].PlatingZoffset!=0, () => StartVertical("Plate", _recipe.DepSteps[_depositionStepIndex].PlatingZoffset),_delay_1ms)
@@ -138,9 +136,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
                 .LoopRunIfWithStopStatus(RunRecipeStep.LoopRotationBiRotationCheck, _recipe.DepSteps[_depositionStepIndex].BiDireaction, 
                         () => CommonFunction.CheckRoutineEndState(_rotationBiDirectionRoutine), 
                         () => CommonFunction.CheckRoutineStopState(_rotationBiDirectionRoutine))
-                
-                .LoopRun(RunRecipeStep.LoopUpdateDepositionIndex, UpdateDepositionIndex, _delay_1ms)
-                .LoopEnd(RunRecipeStep.LoopEnd,NullFun,_delay_1ms)
+                .LoopEnd(RunRecipeStep.LoopEnd, UpdateDepositionIndex, _delay_1ms)
                 //检验步阶电流是否完成
                 .WaitWithStopCondition(RunRecipeStep.RunPowerStepWait, CheckRecipeStepEndStatus, CheckRecipeStepStopStatus, _delay_1ms)
                 
@@ -179,7 +175,10 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// <returns></returns>
         private bool UpdateDepositionIndex()
         {
-            _depositionStepIndex++;
+            if (_depositionStepIndex < _recipe.DepStepCount - 1)
+            {
+                _depositionStepIndex++;
+            }
             return true;
         }
         /// <summary>
@@ -293,7 +292,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             //获取vertical entity
             string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
             _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
-            return Runner.Start(Module, "start intervale rinse");
+            return Runner.Start(Module, "start Deposition routine");
         }
     }
 }

+ 1 - 1
PunkHPX8_RT/Modules/PlatingCell/PlatingCellDryRoutine.cs

@@ -144,7 +144,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             //获取vertical entity
             string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
             _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
-            return Runner.Start(Module, "start intervale rinse");
+            return Runner.Start(Module, "start Dry Routine");
         }
     }
 }

+ 4 - 4
PunkHPX8_RT/Modules/PlatingCell/PlatingCellEntryRoutine.cs

@@ -123,11 +123,11 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             int delayTime = 0;
             if (!_recipe.RinseBeforeEntryEnable)
             {
-                delayTime = _verticalAxis.CalculateVerticaMoveTime(_verticalAxis.Name, "Rinse", "Entry") - 110;
+                delayTime = _verticalAxis.CalculateVerticaMoveTime($"{_verticalAxis.Module}.Vertical", "Rinse", "Entry") - 110;
             }
             else
             {
-                delayTime = _verticalAxis.CalculateVerticaMoveTime(_verticalAxis.Name, "Home", "Entry") - 110;
+                delayTime = _verticalAxis.CalculateVerticaMoveTime($"{_verticalAxis.Module}.Vertical", "Home", "Entry") - 110;
 
             }
             return delayTime;
@@ -220,8 +220,8 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             //获取vertical entity
             string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
             _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
-            _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{vertical}.Vertical");//不能用来移动
-            return Runner.Start(Module, "start intervale rinse");
+            _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{vertical}.Vertical");//不能用来移动,移动用vertical entity来操作
+            return Runner.Start(Module, "start Entry routine");
         }
     }
 }

+ 1 - 1
PunkHPX8_RT/Modules/PlatingCell/PlatingCellReclaimRoutine.cs

@@ -184,7 +184,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             //获取vertical entity
             string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
             _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
-            return Runner.Start(Module, "start intervale rinse");
+            return Runner.Start(Module, "start Reclaim routine");
         }
     }
 }

+ 2 - 2
PunkHPX8_RT/Modules/PlatingCell/PlatingCellRinseRoutine.cs

@@ -69,7 +69,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// <returns></returns>
         public RState Monitor()
         {
-            Runner.Run(RunRecipeStep.VerticalGotoRinse, () => StartVertical("Risne", _recipe.RinseZoffset, 0, 0), _delay_1ms)
+            Runner.Run(RunRecipeStep.VerticalGotoRinse, () => StartVertical("Rinse", _recipe.RinseZoffset, 0, 0), _delay_1ms)
                   .WaitWithStopCondition(RunRecipeStep.CheckVerticalGotoRinse, CheckVerticalEnd, CheckVerticalError)
                   .Run(RunRecipeStep.OpenRinseValve, () => _device.RinseEnableAction(),_delay_1ms)
                   .Run(RunRecipeStep.ChangeRotation, () => ChangeRotationSpeed(_recipe.RinseSpeed), _delay_1ms)
@@ -131,7 +131,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             //获取vertical entity
             string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
             _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
-            return Runner.Start(Module, "start intervale rinse");
+            return Runner.Start(Module, "start rinse routine");
         }
     }
 }

+ 92 - 28
PunkHPX8_RT/Modules/PlatingCell/PlatingCellRunRecipeRoutine.cs

@@ -31,6 +31,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
     {
         private enum RunRecipeStep
         {
+            LoopStart,
             InterRinse,
             CheckInterRinse,
             Entry,
@@ -43,6 +44,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             CheckRinse,
             Dry,
             CheckDry,
+            LoopEnd,
             End
         }
         #region 常量 
@@ -186,40 +188,60 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// <returns></returns>
         public RState Monitor()
         {         
+                
+            Runner.LoopStart(RunRecipeStep.LoopStart, "Loop Start Cycle Run Platingcell Recipe Routine", _cycle, NullFun, _delay_1ms)
                 //interval rinse
-            Runner.RunIf(RunRecipeStep.InterRinse, _recipe.RinseBeforeEntryEnable, () => { return _interRinseRoutine.Start(_recipe, _targetPositionList[0]) == RState.Running; })
-                .WaitWithStopConditionIf(RunRecipeStep.CheckInterRinse, _recipe.RinseBeforeEntryEnable, CheckInterRinseEndStatus,
+                .LoopRunIf(RunRecipeStep.InterRinse, _recipe.RinseBeforeEntryEnable, () => { return _interRinseRoutine.Start(_recipe, _targetPositionList[0]) == RState.Running; })
+                .LoopRunIfWithStopStatus(RunRecipeStep.CheckInterRinse, _recipe.RinseBeforeEntryEnable, CheckInterRinseEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_interRinseRoutine))
                 //entry
-                .Run(RunRecipeStep.Entry,  () => { return _entryRoutine.Start(_recipe, _targetPositionList[0], _powerSupplierStepPeriodDatas,_platingStartTime) == RState.Running; })
-                .WaitWithStopCondition(RunRecipeStep.CheckEntry, CheckInterRinseEndStatus,
+                .LoopRun(RunRecipeStep.Entry,  () => { return _entryRoutine.Start(_recipe, _targetPositionList[0], _powerSupplierStepPeriodDatas,_platingStartTime) == RState.Running; })
+                .LoopRunWithStopStatus(RunRecipeStep.CheckEntry, CheckEntryEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_entryRoutine))
 
                 //Deposition
-                .Run(RunRecipeStep.Deposition, () => { return _depositionRoutine.Start(_recipe, _isZeroCurrent, _isRecipeContainsRevserseRotation,_powerSupplierStepPeriodDatas, _platingStartTime) == RState.Running; })
-                .WaitWithStopCondition(RunRecipeStep.CheckDeposition, CheckInterRinseEndStatus,
+                .LoopRun(RunRecipeStep.Deposition, () => { return _depositionRoutine.Start(_recipe, _isZeroCurrent, _isRecipeContainsRevserseRotation,_powerSupplierStepPeriodDatas, _platingStartTime) == RState.Running; })
+                .LoopRunWithStopStatus(RunRecipeStep.CheckDeposition, CheckDepositionEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_depositionRoutine))
 
-                 //Relaim
-                .Run(RunRecipeStep.Reclaim, () => { return _reclaimRoutine.Start(_recipe, _isZeroCurrent) == RState.Running; })
-                .WaitWithStopCondition(RunRecipeStep.CheckReclaim, CheckInterRinseEndStatus,
+                 //Reclaim
+                .LoopRun(RunRecipeStep.Reclaim, () => { return _reclaimRoutine.Start(_recipe, _isZeroCurrent) == RState.Running; })
+                .LoopRunWithStopStatus(RunRecipeStep.CheckReclaim, CheckReclaimEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_reclaimRoutine))
 
                 //Rinse
-                .Run(RunRecipeStep.Rinse, () => { return _rinseRoutine.Start(_recipe) == RState.Running; })
-                .WaitWithStopCondition(RunRecipeStep.CheckRinse, CheckInterRinseEndStatus,
+                .LoopRun(RunRecipeStep.Rinse, () => { return _rinseRoutine.Start(_recipe) == RState.Running; })
+                .LoopRunWithStopStatus(RunRecipeStep.CheckRinse, CheckRinseEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_rinseRoutine))
 
                 //Dry
-                .Run(RunRecipeStep.Dry, () => { return _dryRoutine.Start(_recipe) == RState.Running; })
-                .WaitWithStopCondition(RunRecipeStep.CheckDry, CheckInterRinseEndStatus,
+                .LoopRun(RunRecipeStep.Dry, () => { return _dryRoutine.Start(_recipe) == RState.Running; })
+                .LoopRunWithStopStatus(RunRecipeStep.CheckDry, CheckDryEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_dryRoutine))
-
+                .LoopEnd(RunRecipeStep.LoopEnd, UpdateCycleCount, _delay_1ms)
                 .End(RunRecipeStep.End, NullFun);
             return Runner.Status;
         }
-
-
+        /// 统计完成的Cycle次数
+        /// </summary>
+        /// <returns></returns>
+        private bool UpdateCycleCount()
+        {
+            _currentCycle += 1;
+            return true;
+        }
+        /// <summary>
+        /// 获取当前Cycle次数
+        /// </summary>
+        /// <returns></returns>
+        public int GetCurrentCycle()
+        {
+            return _currentCycle;
+        }
+        /// <summary>
+        /// 检查interval rinse是否完成
+        /// </summary>
+        /// <returns></returns>
         private bool CheckInterRinseEndStatus()
         {
             bool result = CommonFunction.CheckRoutineEndState(_interRinseRoutine);
@@ -227,6 +249,56 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             return result;
         }
         /// <summary>
+        /// 检查entry是否完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckEntryEndStatus()
+        {
+            bool result = CommonFunction.CheckRoutineEndState(_entryRoutine);
+            SubRoutineStep = _entryRoutine.CurrentStep;
+            return result;
+        }
+        /// <summary>
+        /// 检查Deposition是否完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckDepositionEndStatus()
+        {
+            bool result = CommonFunction.CheckRoutineEndState(_depositionRoutine);
+            SubRoutineStep = _depositionRoutine.CurrentStep;
+            return result;
+        }
+        /// <summary>
+        /// 检查Reclaim是否完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckReclaimEndStatus()
+        {
+            bool result = CommonFunction.CheckRoutineEndState(_reclaimRoutine);
+            SubRoutineStep = _reclaimRoutine.CurrentStep;
+            return result;
+        }
+        /// <summary>
+        /// 检查Rinse是否完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckRinseEndStatus()
+        {
+            bool result = CommonFunction.CheckRoutineEndState(_rinseRoutine);
+            SubRoutineStep = _rinseRoutine.CurrentStep;
+            return result;
+        }
+        /// <summary>
+        /// 检查Dry是否完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckDryEndStatus()
+        {
+            bool result = CommonFunction.CheckRoutineEndState(_dryRoutine);
+            SubRoutineStep = _dryRoutine.CurrentStep;
+            return result;
+        }
+        /// <summary>
         /// 启动
         /// </summary>
         /// <param name="objs"></param>
@@ -274,7 +346,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             _currentCycle = 0;
 
  
-            return Runner.Start(Module, "Run Recipe");
+            return Runner.Start(Module, "PlatingCell Run Recipe");
         }
         /// <summary>
         /// 初始化Power step步骤
@@ -319,11 +391,11 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             }
             if(_maxCurrent > 0.6) //设置电源挡位,有超过0.6A的电流则用高档,否则用中挡
             {
-                return _device.PowerSupplier.SetPowerGrade("set power grade high", new object[] { 2 });
+                return _device.PowerSupplier.SetPowerGrade("set power grade high", new object[] { (byte)2 });
             }
             else
             {
-                return  _device.PowerSupplier.SetPowerGrade("set power grade high", new object[] { 1 });
+                return  _device.PowerSupplier.SetPowerGrade("set power grade high", new object[] { (byte)1 });
             }
         }
         /// <summary>
@@ -342,15 +414,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
                     continue;
                 }
             }
-            //不存在双向旋转直接给roation一个很大的值,电镀完成后再停止
-            if (!_isRecipeContainsRevserseRotation)
-            {
-                _targetPositionList.Add(12 * 60 * 60 * 500 * 6); //以500rmp 运行12个小时的位置
-            }
-            else
-            {
-
-            }
+            _targetPositionList.Add(12 * 60 * 60 * 500 * 6); //以500rmp 运行12个小时的位置
         }
         /// <summary>
         /// 检验前置条件

+ 3 - 0
PunkHPX8_RT/PunkHPX8_RT.csproj

@@ -301,9 +301,12 @@
     <Compile Include="Modules\ModuleMatcherManager.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellCCRRoutine.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellDepositionRoutine.cs" />
+    <Compile Include="Modules\PlatingCell\PlatingCellDryRoutine.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellEntity.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellEntryRoutine.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellInterRinseRoutine.cs" />
+    <Compile Include="Modules\PlatingCell\PlatingCellReclaimRoutine.cs" />
+    <Compile Include="Modules\PlatingCell\PlatingCellRinseRoutine.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellVerticalPositionRoutine.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellVerticalInitializeRoutine.cs" />
     <Compile Include="Modules\PlatingCell\PlatingCellInitializeRoutine.cs" />

+ 11 - 1
PunkHPX8_Themes/UserControls/PlatingCellUIControl.xaml

@@ -141,7 +141,7 @@
 
         <Label Content="{Binding ElementName=self,Path=ModuleName}" Visibility="{Binding ElementName=self,Path=IsLeftEnable,Converter={StaticResource boolToVisibility2}}" FontSize="10" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Top" HorizontalAlignment="Left" Canvas.Left="228" Canvas.Top="64"/>
         <Label Content="{Binding ElementName=self,Path=ModuleName}" Visibility="{Binding ElementName=self,Path=IsLeftEnable,Converter={StaticResource boolToVisibility}}" FontSize="10" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" VerticalAlignment="Top" HorizontalAlignment="Left" Canvas.Left="450" Canvas.Top="64"/>
-        
+
         <userControls:FlowPipe IsReverse="False" IsFlowing="{Binding ElementName=self,Path=CCRValve}" Height="8"  Width="140"  Canvas.Left="65"  Canvas.Top="200" RotateTransformValue="0" HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="-1"/>
         <userControls:FlowPipe IsReverse="False" IsFlowing="{Binding ElementName=self,Path=RinseValve}" Height="8"  Width="140"  Canvas.Left="67"  Canvas.Top="224" RotateTransformValue="0" HorizontalAlignment="Left" VerticalAlignment="Center" Panel.ZIndex="-1"/>
         <userControls:FlowPipe IsReverse="True" IsFlowing="True" Height="8"  Width="40"  Canvas.Left="160"  Canvas.Top="266" RotateTransformValue="0" HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="-1"/>
@@ -304,5 +304,15 @@
                 <Label Margin="13,-20,0,0" Height="20" Width="100" FontSize="10"  FontWeight="Bold" Content="CA Isolation" />
             </Grid>
         </Grid>
+        <Canvas Height="10" Width="80" Canvas.Left="219" Canvas.Top="167" RenderTransformOrigin="0.5,0.5" Panel.ZIndex="2">
+            <Viewbox   Canvas.Left="5"  Canvas.Top="2.5" HorizontalAlignment="Left" VerticalAlignment="Top" Panel.ZIndex="5">
+                <local:VPWWaferCtrl Width="80" Height="9" WaferData="{Binding ElementName=self, Path=WaferInfo}"   Visibility="{Binding ElementName=self,Path=IsLeftEnable,Converter={StaticResource boolToVisibility2}}"/>
+            </Viewbox>
+        </Canvas>
+        <Canvas Height="10" Width="80" Canvas.Left="438" Canvas.Top="167" RenderTransformOrigin="0.5,0.5" Panel.ZIndex="2">
+            <Viewbox   Canvas.Left="5"  Canvas.Top="2.5" HorizontalAlignment="Left" VerticalAlignment="Top" Panel.ZIndex="5">
+                <local:VPWWaferCtrl Width="80" Height="9" WaferData="{Binding ElementName=self, Path=WaferInfo}"   Visibility="{Binding ElementName=self,Path=IsLeftEnable,Converter={StaticResource boolToVisibility}}"/>
+            </Viewbox>
+        </Canvas>
     </Canvas>
 </UserControl>

+ 17 - 1
PunkHPX8_Themes/UserControls/PlatingCellUIControl.xaml.cs

@@ -1,4 +1,5 @@
 using MECF.Framework.Common.OperationCenter;
+using OpenSEMI.ClientBase;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -43,7 +44,22 @@ namespace PunkHPX8_Themes.UserControls
                 this.SetValue(ModuleNameProperty, value);
             }
         }
-
+        public static readonly DependencyProperty WaferInfoProperty = DependencyProperty.Register(
+                "WaferInfo", typeof(WaferInfo), typeof(PlatingCellUIControl));
+        /// <summary>
+        /// WaferInfo
+        /// </summary>
+        public WaferInfo WaferInfo
+        {
+            get
+            {
+                return (WaferInfo)this.GetValue(WaferInfoProperty);
+            }
+            set
+            {
+                this.SetValue(WaferInfoProperty, value);
+            }
+        }
         public static readonly DependencyProperty ReservoirNameProperty = DependencyProperty.Register(
         "ReservoirName", typeof(string), typeof(PlatingCellUIControl),
             new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));