Ver código fonte

1revise robot cycle
2 add vpw pick/place

chenzk 3 dias atrás
pai
commit
9ee6d50c0f

+ 5 - 0
Framework/Common/Device/ModuleName.cs

@@ -328,6 +328,11 @@ namespace MECF.Framework.Common.Equipment
             return (int)unit >= (int)ModuleName.VPW1 && (int)(unit) <= (int)ModuleName.VPW10;
 
         }
+        public static bool IsPlatingCell(ModuleName unit)
+        {
+            return (int)unit >= (int)ModuleName.PlatingCell1 && (int)(unit) <= (int)ModuleName.PlatingCell4;
+
+        }
 
         public static bool IsLoadPort(ModuleName unit)
         {

+ 1 - 1
PunkHPX8_MainPages/Unity/ModuleManager.cs

@@ -19,7 +19,7 @@ namespace PunkHPX8_MainPages.Unity
         /// </summary>
         public static readonly List<string> ModulesID = new List<string>()
         {
-             "LP1","LP2","LP3","EfemRobot","Aligner1","SRD1","SRD2","PUF1","PUF2","Dummy1","Dummy2","Loader1","VPW1","VPW2"
+             "LP1","LP2","LP3","EfemRobot","Aligner1","SRD1","SRD2","PUF1","PUF2","Dummy1","Dummy2","Loader1","VPW1","VPW2","PlatingCell1","PlatingCell2","PlatingCell3","PlatingCell4"
         };
 
         public static Dictionary<string, ModuleInfo> ModuleInfos { get; private set; } = new Dictionary<string, ModuleInfo>();

+ 55 - 260
PunkHPX8_MainPages/ViewModels/EfemViewModel.cs

@@ -32,37 +32,28 @@ namespace PunkHPX8_MainPages.ViewModels
 {
     public enum EFEMModule
     {
-        LP1,LP2,LP3,Aligner1,PUF1,PUF2,SRD1,SRD2,Dummy1,Dummy2
+        LP1,LP2,Aligner1,PUF1,PUF2,SRD1,SRD2,Dummy1,Dummy2,VPW1,VPW2,PlatingCell1,PlatingCell2,PlatingCell3,PlatingCell4
     }
     public enum EFEMBlade
     {
-        Blade1
+        Blade1,Blade2
     }
 
     internal class EfemViewModel:BindableBase
     {
         #region 私有字段       
-        private bool m_puf1IsInstalled;
-        private bool m_puf2IsInstalled;
         private bool m_srd1IsInstalled;
         private bool m_srd2IsInstalled;
-        private bool m_puf1IsInRobotStation;
-        private bool m_puf2IsInRobotStation;
         private bool _isAlignerVacuumOn;
         private bool _isRobotVacuumOn;
 
 
-
         private ModuleInfo m_LP1ModuleInfo;
         private ModuleInfo m_LP2ModuleInfo;
-        private ModuleInfo m_LP3ModuleInfo;
         private ModuleInfo m_EFEMModuleInfo;
         private ModuleInfo m_srd1ModuleInfo;//upper
         private ModuleInfo m_srd2ModuleInfo;
 
-        private ModuleInfo m_puf1ModuleInfo;
-        private ModuleInfo m_puf2ModuleInfo;
-
         private List<EFEMModule> m_EFEMModules = new List<EFEMModule>();
         private List<EFEMModule> m_PUFModules = new List<EFEMModule>();
         private EFEMBlade m_PickSelectedBlade;
@@ -71,48 +62,38 @@ namespace PunkHPX8_MainPages.ViewModels
         private EFEMBlade m_RetractSelectedBlade;
         private ObservableCollection<int> m_PlaceSoltItemsSource = new ObservableCollection<int>();
         private ObservableCollection<int> m_PickSoltItemsSource = new ObservableCollection<int>();
-        private ObservableCollection<int> m_PUFPlaceSoltItemsSource = new ObservableCollection<int>();
-        private ObservableCollection<int> m_PUFPickSoltItemsSource = new ObservableCollection<int>();
         private ObservableCollection<int> m_ExtendSoltItemsSource = new ObservableCollection<int>();
         private ObservableCollection<int> m_RetractSoltItemsSource = new ObservableCollection<int>();
+
         private int m_PickSoltSelectedIndex;
         private int m_PlaceSoltSelectedIndex;
-        private int m_PUFPickSoltSelectedIndex;
-        private int m_PUFPlaceSoltSelectedIndex;
         private int m_ExtendSoltSelectedIndex;
         private int m_RetractSoltSelectedIndex;
         private EFEMModule m_PickSelectedModule;
         private EFEMModule m_PlaceSelectedModule;
         private EFEMModule m_ExtendSelectedModule;
         private EFEMModule m_RetractSelectedModule;
-        private EFEMModule m_PUFPickSelectedModule;
-        private EFEMModule m_PUFPlaceSelectedModule;
         private WaferInfo m_BladeAWafer;
         private WaferInfo m_BladeBWafer;
 
-        private WaferInfo m_puf1Wafer;
-        private WaferInfo m_puf2Wafer;
-
         private WaferInfo m_srd1Wafer;
         private WaferInfo m_srd2Wafer;
         
         private WaferInfo m_Aligner1Wafer;
+        private WaferInfo m_VPW1Wafer;
+        private WaferInfo m_VPW2Wafer;
 
         private string m_LP1Status;
         private string m_LP2Status;
-        private string m_LP3Status;
         
         private string _setLP1IDValue;
         private string _setLP2IDValue;
-        private string _setLP3IDValue;
 
         private int _setLP1CycleValue;
         private int _setLP2CycleValue;
-        private int _setLP3CycleValue;
 
         private bool _isLp1Unable;
         private bool _isLp2Unable;
-        private bool _isLp3Unable;
 
         private List<string> m_RtDataKeys=new List<string>();
         private Dictionary<string, object> m_RtDataValues;
@@ -135,7 +116,6 @@ namespace PunkHPX8_MainPages.ViewModels
 
         private bool _isLp1HasNoJob;
         private bool _isLp2HasNoJob;
-        private bool _isLp3HasNoJob;
 
         private bool _isHomeAllEnable;
 
@@ -160,11 +140,7 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return m_LP2ModuleInfo; }
             set { SetProperty(ref m_LP2ModuleInfo, value); }
         }
-        public ModuleInfo LP3ModuleInfo
-        {
-            get { return m_LP3ModuleInfo; }
-            set { SetProperty(ref m_LP3ModuleInfo, value); }
-        }
+
         public bool IsLP1Unable
         {
             get { return _isLp1Unable; }
@@ -175,11 +151,7 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return _isLp2Unable; }
             set { SetProperty(ref _isLp2Unable, value); }
         }
-        public bool IsLP3Unable
-        {
-            get { return _isLp3Unable; }
-            set { SetProperty(ref _isLp3Unable, value); }
-        }
+
         public bool IsLP1HasNoJob
         {
             get { return _isLp1HasNoJob; }
@@ -190,11 +162,7 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return _isLp2HasNoJob; }
             set { SetProperty(ref _isLp2HasNoJob, value); }
         }
-        public bool IsLP3HasNoJob
-        {
-            get { return _isLp3HasNoJob; }
-            set { SetProperty(ref _isLp3HasNoJob, value); }
-        }
+
         public ModuleInfo EFEMModuleInfo
         {
             get { return m_EFEMModuleInfo; }
@@ -242,18 +210,6 @@ namespace PunkHPX8_MainPages.ViewModels
             set { SetProperty(ref m_PlaceSoltItemsSource, value); }
         }
 
-        public ObservableCollection<int> PUFPickSoltItemsSource
-        {
-            get { return m_PUFPickSoltItemsSource; }
-            set { SetProperty(ref m_PUFPickSoltItemsSource, value); }
-        }
-
-        public ObservableCollection<int> PUFPlaceSoltItemsSource
-        {
-            get { return m_PUFPlaceSoltItemsSource; }
-            set { SetProperty(ref m_PUFPlaceSoltItemsSource, value); }
-        }
-
         public ObservableCollection<int> ExtendSoltItemsSource
         {
             get { return m_ExtendSoltItemsSource; }
@@ -274,16 +230,7 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return m_PlaceSoltSelectedIndex; }
             set { SetProperty(ref m_PlaceSoltSelectedIndex, value); }
         }
-        public int PUFPickSoltSelectedIndex
-        {
-            get { return m_PUFPickSoltSelectedIndex; }
-            set { SetProperty(ref m_PUFPickSoltSelectedIndex, value); }
-        }
-        public int PUFPlaceSoltSelectedIndex
-        {
-            get { return m_PUFPlaceSoltSelectedIndex; }
-            set { SetProperty(ref m_PUFPlaceSoltSelectedIndex, value); }
-        }
+
         public int ExtendSoltSelectedIndex
         {
             get { return m_ExtendSoltSelectedIndex; }
@@ -304,16 +251,7 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return m_PlaceSelectedModule; }
             set { SetProperty(ref m_PlaceSelectedModule, value); }
         }
-        public EFEMModule PUFPickSelectedModule
-        {
-            get { return m_PUFPickSelectedModule; }
-            set { SetProperty(ref m_PUFPickSelectedModule, value); }
-        }
-        public EFEMModule PUFPlaceSelectedModule
-        {
-            get { return m_PUFPlaceSelectedModule; }
-            set { SetProperty(ref m_PUFPlaceSelectedModule, value); }
-        }
+
         public EFEMModule ExtendSelectedModule
         {
             get { return m_ExtendSelectedModule; }
@@ -334,29 +272,15 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return m_Aligner1Wafer; }
             set { SetProperty(ref m_Aligner1Wafer, value); }
         }
-
-        public WaferInfo Puf1Wafer
+        public WaferInfo VPW1Wafer
         {
-            get { return m_puf1Wafer; }
-            set { SetProperty(ref m_puf1Wafer, value); }
+            get { return m_VPW1Wafer; }
+            set { SetProperty(ref m_VPW1Wafer, value); }
         }
-
-        public WaferInfo Puf2Wafer
+        public WaferInfo VPW2Wafer
         {
-            get { return m_puf2Wafer; }
-            set { SetProperty(ref m_puf2Wafer, value); }
-        }
-
-        public bool Puf1IsInstalled
-        {
-            get { return m_puf1IsInstalled; }
-            set { SetProperty(ref m_puf1IsInstalled, value); }
-        }
-
-        public bool Puf2IsInstalled
-        {
-            get { return m_puf2IsInstalled; }
-            set { SetProperty(ref m_puf2IsInstalled, value); }
+            get { return m_VPW2Wafer; }
+            set { SetProperty(ref m_VPW2Wafer, value); }
         }
 
         public bool Srd1IsInstalled
@@ -371,28 +295,6 @@ namespace PunkHPX8_MainPages.ViewModels
             set { SetProperty(ref m_srd2IsInstalled, value); }
         }
 
-        public ModuleInfo Puf1ModuleInfo
-        {
-            get { return m_puf1ModuleInfo; }
-            set { SetProperty(ref m_puf1ModuleInfo, value); }
-        }
-
-        public ModuleInfo Puf2ModuleInfo
-        {
-            get { return m_puf2ModuleInfo; }
-            set { SetProperty(ref m_puf2ModuleInfo, value); }
-        }
-
-        public bool Puf1IsInRobotStation
-        {
-            get { return m_puf1IsInRobotStation; }
-            set { SetProperty(ref m_puf1IsInRobotStation, value); }
-        }
-        public bool Puf2IsInRobotStation
-        {
-            get { return m_puf2IsInRobotStation; }
-            set { SetProperty(ref m_puf2IsInRobotStation, value); }
-        }
         public bool IsAlignerVacuumOn
         {
             get { return _isAlignerVacuumOn; }
@@ -413,11 +315,6 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return m_LP2Status; }
             set { SetProperty(ref m_LP2Status, value); }
         }
-        public string LP3Status
-        {
-            get { return m_LP3Status; }
-            set { SetProperty(ref m_LP3Status, value); }
-        }
 
         public string SetLP1IDValue
         {
@@ -447,12 +344,6 @@ namespace PunkHPX8_MainPages.ViewModels
             set { SetProperty(ref _setLP2CycleValue, value); }
         }
 
-        public int SetLP3CycleValue
-        {
-            get { return _setLP3CycleValue; }
-            set { SetProperty(ref _setLP3CycleValue, value); }
-        }
-
         public Dictionary<string, object> RtDataValues
         {
             get { return m_RtDataValues; }
@@ -585,10 +476,6 @@ namespace PunkHPX8_MainPages.ViewModels
         public DelegateCommand RetractCommand =>
             _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract));
 
-        private DelegateCommand<object> _PUFModuleChangeCommand;
-        public DelegateCommand<object> PUFModuleChangeCommand =>
-            _PUFModuleChangeCommand ?? (_PUFModuleChangeCommand = new DelegateCommand<object>(OnPUFModuleChange));
-
         private DelegateCommand<object> _ModuleChangeCommand;
         public DelegateCommand<object> ModuleChangeCommand =>
             _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand<object>(OnModuleChange));
@@ -610,14 +497,6 @@ namespace PunkHPX8_MainPages.ViewModels
         public DelegateCommand SetRobotSpeedCommand =>
             _SetRobotSpeedCommand ?? (_SetRobotSpeedCommand = new DelegateCommand(OnSetRobotSpeed));
 
-        private DelegateCommand<object> _PUFPickCommand;
-        public DelegateCommand<object> PUFPickCommand =>
-            _PUFPickCommand ?? (_PUFPickCommand = new DelegateCommand<object>(OnPUFPick));
-
-        private DelegateCommand<object> _PUFPlaceCommand;
-        public DelegateCommand<object> PUFPlaceCommand =>
-            _PUFPlaceCommand ?? (_PUFPlaceCommand = new DelegateCommand<object>(OnPUFPlace));
-
 
         private DelegateCommand _HomeAllCommand;
         public DelegateCommand HomeAllCommand =>
@@ -692,11 +571,6 @@ namespace PunkHPX8_MainPages.ViewModels
         public DelegateCommand<object> LP2WriteIDCommand =>
             _LP2WriteIDCommand ?? (_LP2WriteIDCommand = new DelegateCommand<object>(OnLP2WriteID));
 
-        private DelegateCommand<object> _LP3WriteIDCommand;
-        public DelegateCommand<object> LP3WriteIDCommand =>
-            _LP3WriteIDCommand ?? (_LP3WriteIDCommand = new DelegateCommand<object>(OnLP3WriteID));
-
-
         private DelegateCommand<object> _LPClampCommand;
         public DelegateCommand<object> LPClampCommand =>
             _LPClampCommand ?? (_LPClampCommand = new DelegateCommand<object>(OnLPClamp));
@@ -742,8 +616,6 @@ namespace PunkHPX8_MainPages.ViewModels
         private ICommand _lP2CycleCommand;
         public ICommand LP2CycleCommand => _lP2CycleCommand ?? (_lP2CycleCommand = new DelegateCommand<object>(OnLP2CycleAction));
 
-        private ICommand _lP3CycleCommand;
-        public ICommand LP3CycleCommand => _lP3CycleCommand ?? (_lP3CycleCommand = new DelegateCommand<object>(OnLP3CycleAction));
         private DelegateCommand _doorUnlockCommand;
         public DelegateCommand DoorUnlockCommand =>
             _doorUnlockCommand ?? (_doorUnlockCommand = new DelegateCommand(OnDoorUnlock));
@@ -774,8 +646,6 @@ namespace PunkHPX8_MainPages.ViewModels
             if (allModulesDictionary != null)
             {
                 List<string> allModules = CommonFunction.GetValue<List<string>>(allModulesDictionary, "System.InstalledModules");
-                Puf1IsInstalled = allModules.Contains("PUF1");
-                Puf2IsInstalled = allModules.Contains("PUF2");
 
                 Srd1IsInstalled = allModules.Contains("SRD1");
                 Srd2IsInstalled = allModules.Contains("SRD2");
@@ -787,7 +657,6 @@ namespace PunkHPX8_MainPages.ViewModels
             timer.Start();
             EFEMModules.Add(EFEMModule.LP1);
             EFEMModules.Add(EFEMModule.LP2);
-            EFEMModules.Add(EFEMModule.LP3);
             EFEMModules.Add(EFEMModule.Aligner1);
             EFEMModules.Add(EFEMModule.PUF1);
             EFEMModules.Add(EFEMModule.PUF2);
@@ -795,14 +664,14 @@ namespace PunkHPX8_MainPages.ViewModels
             EFEMModules.Add(EFEMModule.SRD2);
             EFEMModules.Add(EFEMModule.Dummy1);
             EFEMModules.Add(EFEMModule.Dummy2);
-
-            PUFModules.Add(EFEMModule.PUF1);
-            PUFModules.Add(EFEMModule.PUF2);
-
+            EFEMModules.Add(EFEMModule.VPW1);
+            EFEMModules.Add(EFEMModule.VPW2);
+            EFEMModules.Add(EFEMModule.PlatingCell1);
+            EFEMModules.Add(EFEMModule.PlatingCell2);
+            EFEMModules.Add(EFEMModule.PlatingCell3);
+            EFEMModules.Add(EFEMModule.PlatingCell4);
             OnModuleChange("Pick");
             OnModuleChange("Place");
-            OnPUFModuleChange("Pick");
-            OnPUFModuleChange("Place");
 
             Init();
 
@@ -810,39 +679,6 @@ namespace PunkHPX8_MainPages.ViewModels
         #endregion
 
         #region 命令方法
-        private void OnPUFModuleChange(object obj)
-        {
-            var value = obj.ToString();
-            switch (value)
-            {
-                case "Pick":
-                    PUFPickSoltItemsSource.Clear();
-                    switch (PUFPickSelectedModule)
-                    {
-                        case EFEMModule.PUF1:
-                        case EFEMModule.PUF2:
-                            PUFPickSoltItemsSource.Add(1);
-                            PUFPickSoltItemsSource.Add(2);
-                            break;
-                    }
-                    PUFPickSoltSelectedIndex = 0;
-
-                    break;
-
-                case "Place":
-                    PUFPlaceSoltItemsSource.Clear();
-                    switch (PUFPlaceSelectedModule)
-                    {
-                        case EFEMModule.PUF1:
-                        case EFEMModule.PUF2:
-                            PUFPlaceSoltItemsSource.Add(1);
-                            PUFPlaceSoltItemsSource.Add(2);
-                            break;
-                    }
-                    PUFPlaceSoltSelectedIndex = 0;
-                    break;
-            }
-        }
         private void OnModuleChange(object obj)
         {
             var value = obj.ToString();
@@ -852,11 +688,6 @@ namespace PunkHPX8_MainPages.ViewModels
                      PickSoltItemsSource.Clear();
                     switch (PickSelectedModule)
                     {
-                        case EFEMModule.PUF1:
-                        case EFEMModule.PUF2:
-                            PickSoltItemsSource.Add(1);
-                            PickSoltItemsSource.Add(2);
-                            break;
                         case EFEMModule.Dummy1:
                         case EFEMModule.Dummy2:
                             for (int i = 1; i < 17; i++)
@@ -866,7 +697,6 @@ namespace PunkHPX8_MainPages.ViewModels
                             break;
                         case EFEMModule.LP1:
                         case EFEMModule.LP2:
-                        case EFEMModule.LP3:
 
                             for (int i = 1; i < 26; i++)
                             {
@@ -900,8 +730,6 @@ namespace PunkHPX8_MainPages.ViewModels
                             break;
                         case EFEMModule.LP1:
                         case EFEMModule.LP2:
-                        case EFEMModule.LP3:
-
                             for (int i = 1; i < 26; i++)
                             {
                                 PlaceSoltItemsSource.Add(i);
@@ -950,21 +778,6 @@ namespace PunkHPX8_MainPages.ViewModels
             InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Place}", moveItems);
         }
 
-        private void OnPUFPick(object obj)
-        {
-            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PUFPickSelectedModule.ToString(), true);
-            var PufSlot = PUFPickSoltSelectedIndex == 0 ? "SideA" : "SideB";
-
-            InvokeClient.Instance.Service.DoOperation($"{moduleName}.GotoRobotPositionForPick", PufSlot);
-
-        }
-        private void OnPUFPlace(object obj)
-        {
-            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PUFPlaceSelectedModule.ToString(), true);
-            var PufSlot = PUFPlaceSoltSelectedIndex == 0 ? "SideA" : "SideB";
-
-            InvokeClient.Instance.Service.DoOperation($"{moduleName}.GotoRobotPositionForPlace", PufSlot);
-        }
         private void OnHomeAll()
         {
             InvokeClient.Instance.Service.DoOperation($"EFEM.{EfemOperation.Home}");
@@ -1149,31 +962,12 @@ namespace PunkHPX8_MainPages.ViewModels
             InvokeClient.Instance.Service.DoOperation($"{obj.ToString()}.CycleLoadUnload", SetLP2CycleValue);
         }
 
-        private void OnLP3CycleAction(object obj)
-        {
-            InvokeClient.Instance.Service.DoOperation($"{obj.ToString()}.CycleLoadUnload", SetLP3CycleValue);
-        }
         #endregion
 
         #region 私有方法
         private void Timer_Tick(object sender, EventArgs e)
         {
-            if (Puf1IsInstalled)
-            {
-                if (ModuleManager.ModuleInfos["PUF1"].WaferManager.Wafers.Count != 0)
-                {
-                    Puf1Wafer = ModuleManager.ModuleInfos["PUF1"].WaferManager.Wafers[0];
-                }
-                Puf1ModuleInfo = ModuleManager.ModuleInfos["PUF1"];
-            }
-            if (Puf2IsInstalled)
-            {
-                if (ModuleManager.ModuleInfos["PUF2"].WaferManager.Wafers.Count != 0)
-                {
-                    Puf2Wafer = ModuleManager.ModuleInfos["PUF2"].WaferManager.Wafers[0];
-                }
-                Puf2ModuleInfo = ModuleManager.ModuleInfos["PUF2"];
-            }
+            
             if (Srd1IsInstalled)
             {
                 if (ModuleManager.ModuleInfos["SRD1"].WaferManager.Wafers.Count != 0)
@@ -1192,7 +986,6 @@ namespace PunkHPX8_MainPages.ViewModels
             }
             LP1ModuleInfo = ModuleManager.ModuleInfos["LP1"];
             LP2ModuleInfo = ModuleManager.ModuleInfos["LP2"];
-            LP3ModuleInfo = ModuleManager.ModuleInfos["LP3"];
             EFEMModuleInfo = ModuleManager.ModuleInfos["EfemRobot"];
             if (ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers.Count != 0)
             {
@@ -1202,20 +995,24 @@ namespace PunkHPX8_MainPages.ViewModels
             {
                 Aligner1Wafer = ModuleManager.ModuleInfos["Aligner1"].WaferManager.Wafers[0];
             }
+            if (ModuleManager.ModuleInfos["VPW1"].WaferManager.Wafers.Count != 0)
+            {
+                VPW1Wafer = ModuleManager.ModuleInfos["VPW1"].WaferManager.Wafers[0];
+            }
+            if (ModuleManager.ModuleInfos["VPW2"].WaferManager.Wafers.Count != 0)
+            {
+                VPW2Wafer = ModuleManager.ModuleInfos["VPW2"].WaferManager.Wafers[0];
+            }
+
             RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
             if(RtDataValues!=null)
             {
                 IsHomeAllEnable = !CommonFunction.GetValue<bool>(RtDataValues, "System.IsAutoMode");
-                
-                Puf1IsInRobotStation = CommonFunction.GetValue<bool>(RtDataValues, "PUF1.IsInRobotStation");
-                Puf2IsInRobotStation = CommonFunction.GetValue<bool>(RtDataValues, "PUF2.IsInRobotStation");
 
                 ControlJobInfo lp1Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP1.CurrentControlJob");
                 IsLP1HasNoJob = lp1Cj == null ? true : false;
                 ControlJobInfo lp2Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP2.CurrentControlJob");
                 IsLP2HasNoJob = lp2Cj == null ? true : false;
-                ControlJobInfo lp3Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP3.CurrentControlJob");
-                IsLP3HasNoJob = lp3Cj == null ? true : false;
 
                 VacuumValue = CommonFunction.GetValue<double>(RtDataValues, "EFEM.VacuumValue");
                 DoorUnlock = CommonFunction.GetValue<bool>(RtDataValues, "EFEM.DoorUnlock");
@@ -1229,8 +1026,7 @@ namespace PunkHPX8_MainPages.ViewModels
             Dummy2WaferCount = Dummy2ModuleInfo.WaferManager.Wafers.Where(x => x.WaferStatus != 0).Count();
 
             IsLP1Unable = (bool)QueryDataClient.Instance.Service.GetConfig("EFEM.IsLoadPort1Unable");
-            IsLP2Unable = (bool)QueryDataClient.Instance.Service.GetConfig("EFEM.IsLoadPort2Unable");
-            IsLP3Unable = (bool)QueryDataClient.Instance.Service.GetConfig("EFEM.IsLoadPort3Unable");         
+            IsLP2Unable = (bool)QueryDataClient.Instance.Service.GetConfig("EFEM.IsLoadPort2Unable");      
         }
         private void Init()
         {
@@ -1238,28 +1034,22 @@ namespace PunkHPX8_MainPages.ViewModels
             
             m_RtDataKeys.Add("LP1.Status");
             m_RtDataKeys.Add("LP2.Status");
-            m_RtDataKeys.Add("LP3.Status");
 
             m_RtDataKeys.Add("LP1.IsLoaded");
             m_RtDataKeys.Add("LP2.IsLoaded");
-            m_RtDataKeys.Add("LP3.IsLoaded");
-
+           
             m_RtDataKeys.Add("LP1.CarrierId");
             m_RtDataKeys.Add("LP2.CarrierId");
-            m_RtDataKeys.Add("LP3.CarrierId");
 
             m_RtDataKeys.Add("LP1.IsClamped");
             m_RtDataKeys.Add("LP2.IsClamped");
-            m_RtDataKeys.Add("LP3.IsClamped");
 
             m_RtDataKeys.Add("LP1.IsDocked");
-            m_RtDataKeys.Add("LP2.IsDocked");
-            m_RtDataKeys.Add("LP3.IsDocked");
+            m_RtDataKeys.Add("LP2.IsDocked");;
 
 
             m_RtDataKeys.Add("LP1.IsDoorOpened");
             m_RtDataKeys.Add("LP2.IsDoorOpened");
-            m_RtDataKeys.Add("LP3.IsDoorOpened");
 
             m_RtDataKeys.Add("TM.LLATSlitDoor.IsClosed");
             m_RtDataKeys.Add("TM.LLBTSlitDoor.IsClosed");
@@ -1269,7 +1059,6 @@ namespace PunkHPX8_MainPages.ViewModels
 
             m_RtDataKeys.Add("LP1.CassettePlaced");
             m_RtDataKeys.Add("LP2.CassettePlaced");
-            m_RtDataKeys.Add("LP3.CassettePlaced");
 
             m_RtDataKeys.Add("Dummy1.CassettePlaced");
             m_RtDataKeys.Add("Dummy2.CassettePlaced");
@@ -1279,11 +1068,9 @@ namespace PunkHPX8_MainPages.ViewModels
 
             m_RtDataKeys.Add("LP1.CurrentControlJob");
             m_RtDataKeys.Add("LP2.CurrentControlJob");
-            m_RtDataKeys.Add("LP3.CurrentControlJob");
 
             m_RtDataKeys.Add("LP1.WaferSize");
             m_RtDataKeys.Add("LP2.WaferSize");
-            m_RtDataKeys.Add("LP3.WaferSize");
 
             m_RtDataKeys.Add("Dummy1.WaferSize");
             m_RtDataKeys.Add("Dummy2.WaferSize");
@@ -1385,15 +1172,11 @@ namespace PunkHPX8_MainPages.ViewModels
             //await Task.Delay(1000);
             if(robotAction == RobotAction.Placing)
             {
-                if (waferRobotTAction == WaferRobotTAction.LP1 || waferRobotTAction == WaferRobotTAction.PUF1)
+                if (waferRobotTAction == WaferRobotTAction.LP1)
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Left_Place;
                 }
-                else if (waferRobotTAction == WaferRobotTAction.LP3)
-                {
-                    CurrentRobotPosition = EFEM.RobotPosition.Right_Place;
-                }
-                else if (waferRobotTAction == WaferRobotTAction.LP2 || waferRobotTAction == WaferRobotTAction.PUF2)
+                else if (waferRobotTAction == WaferRobotTAction.LP2)
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Middle_Place;
                 }
@@ -1409,6 +1192,14 @@ namespace PunkHPX8_MainPages.ViewModels
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Dummy_Place;
                 }
+                else if (waferRobotTAction == WaferRobotTAction.VPW1 )
+                {
+                    CurrentRobotPosition = EFEM.RobotPosition.VPW1;
+                }
+                else if (waferRobotTAction == WaferRobotTAction.VPW2)
+                {
+                    CurrentRobotPosition = EFEM.RobotPosition.VPW2;
+                }
                 else
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Origin;
@@ -1416,15 +1207,11 @@ namespace PunkHPX8_MainPages.ViewModels
             }
             else
             {
-                if (waferRobotTAction == WaferRobotTAction.LP1 || waferRobotTAction == WaferRobotTAction.PUF1)
+                if (waferRobotTAction == WaferRobotTAction.LP1)
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Left;
                 }
-                else if (waferRobotTAction == WaferRobotTAction.LP3)
-                {
-                    CurrentRobotPosition = EFEM.RobotPosition.Right;
-                }
-                else if (waferRobotTAction == WaferRobotTAction.LP2 || waferRobotTAction == WaferRobotTAction.PUF2)
+                else if (waferRobotTAction == WaferRobotTAction.LP2)
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Middle;
                 }
@@ -1440,6 +1227,14 @@ namespace PunkHPX8_MainPages.ViewModels
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Dummy;
                 }
+                else if (waferRobotTAction == WaferRobotTAction.VPW1)
+                {
+                    CurrentRobotPosition = EFEM.RobotPosition.VPW1;
+                }
+                else if (waferRobotTAction == WaferRobotTAction.VPW2)
+                {
+                    CurrentRobotPosition = EFEM.RobotPosition.VPW2;
+                }
                 else
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Origin;

+ 6 - 214
PunkHPX8_MainPages/ViewModels/OperationOverViewModel.cs

@@ -32,7 +32,6 @@ using System.Reflection;
 using MECF.Framework.Common.Beckhoff.IOAxis;
 using MECF.Framework.Common.TwinCat;
 using LiveCharts.Wpf;
-using MECF.Framework.Common.CommonData.PUF;
 using MECF.Framework.Common.Beckhoff.AxisProvider;
 using QiHe.CodeLib;
 using MECF.Framework.Common.Jobs;
@@ -48,7 +47,6 @@ namespace PunkHPX8_MainPages.ViewModels
         private const string MOTOR_POSITION = "MotorPosition";
         private const string MOTION_DATA = "MotionData";
         private const double LOADER_ROTATION_DIFFER = 90;
-        private const double PUF_FLIP_DIFFER = 180;
         #endregion
 
         #region 私有字段
@@ -63,7 +61,6 @@ namespace PunkHPX8_MainPages.ViewModels
         private ModuleInfo _EFEMModuleInfo;
         private ModuleInfo _srd1ModuleInfo;
         private ModuleInfo _srd2ModuleInfo;
-        private ModuleInfo _puf1ModuleInfo;
         private ModuleInfo _dummy1ModuleInfo;
         private ModuleInfo _dummy2ModuleInfo;
 
@@ -80,16 +77,12 @@ namespace PunkHPX8_MainPages.ViewModels
 
         private WaferInfo m_srd1Wafer;
         private WaferInfo m_srd2Wafer;
-        private WaferInfo m_puf1WaferA;
-        private WaferInfo m_puf1WaferB;
         private WaferInfo m_loaderWaferA;
         private WaferInfo m_loaderWaferB;
         private List<string> m_RtDataKeys = new List<string>();
         private Dictionary<string, object> m_RtDataValues;
         private bool m_EFEMIsInstalled;
         private bool m_loaderInstalled;
-        private bool m_puf1IsInRobotStation;
-        //private bool m_IsPUFChange;
         private WaferInfo m_EFEMBladeAWafer;
         private WaferInfo m_EFEMBladeBWafer;
         private WaferInfo m_Aligner1Wafer;
@@ -103,8 +96,6 @@ namespace PunkHPX8_MainPages.ViewModels
         private int m_CycleCountDisplay;
 
         private EFEM.RobotPosition m_CurrentRobotPosition;
-        private PufControl.LoaderXLocation m_loaderAXLoaction = PufControl.LoaderXLocation.Parker;
-        private PufControl.LoaderXLocation m_loaderBXLoaction = PufControl.LoaderXLocation.Parker;
         
         /// <summary>
         /// Loader的sideA开启状态
@@ -122,10 +113,6 @@ namespace PunkHPX8_MainPages.ViewModels
 
         private string m_RouteState;
         /// <summary>
-        /// puf1 Rotation ui 水平比例
-        /// </summary>
-        private double _puf1RotationRatio;
-        /// <summary>
         /// 定时器
         /// </summary>
         private DispatcherTimer _timer;
@@ -134,50 +121,6 @@ namespace PunkHPX8_MainPages.ViewModels
         /// </summary>
         private DispatcherTimer _timer1;
         /// <summary>
-        /// puf Rotation UI水平距离
-        /// </summary>
-        private int _pufLayoutRotationDistance;
-        /// <summary>
-        /// Efem robot UI位置
-        /// </summary>
-        private int _robotLayoutPosition;
-        /// <summary>
-        /// Puf1 Rotation实际位置数据
-        /// </summary>
-        private double _puf1RotationMotorPosition;
-        /// <summary>
-        /// Puf1 Flip实际位置数据
-        /// </summary>
-        private double _puf1FlipMotorPosition;
-        /// <summary>
-        /// Puf1 Flip UI位置
-        /// </summary>
-        private double _puf1FlipPosition;
-        /// <summary>
-        /// Puf1 Flip Diff
-        /// </summary>
-        private double _puf1FlipDiff;
-        /// <summary>
-        /// Puf1 Rotation最左侧的位置
-        /// </summary>
-        private double _puf1RotationMotorPositionMax;
-        /// <summary>
-        /// Puf1 Rotation UI对应位置
-        /// </summary>
-        private double _puf1RotationPosition;
-        /// <summary>
-        /// Loader1 Rotation UI对应位置
-        /// </summary>
-        private double _loader1RotationPosition;
-        /// <summary>
-        /// Puf1 Rotation Axis
-        /// </summary>
-        private BeckhoffStationAxis _puf1RotationAxis;
-        /// <summary>
-        /// Puf1 Flip Axis
-        /// </summary>
-        private BeckhoffStationAxis _puf1FlipAxis;
-        /// <summary>
         /// Loader1 Rotation Axis
         /// </summary>
         private BeckhoffStationAxis _loader1RotationAxis;
@@ -202,10 +145,6 @@ namespace PunkHPX8_MainPages.ViewModels
         /// </summary>
         private double _loader1TiltBMotorPosition;
         /// <summary>
-        /// Puf1 Flip当前station
-        /// </summary>
-        private string _puf1FlipCurrentStation;
-        /// <summary>
         /// Loader1 TiltA当前station
         /// </summary>
         private string _loaderTiltACurrentStation;
@@ -270,11 +209,7 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return _srd2ModuleInfo; }
             set { SetProperty(ref _srd2ModuleInfo, value); }
         }
-        public ModuleInfo PUF1ModuleInfo
-        {
-            get { return _puf1ModuleInfo; }
-            set { SetProperty(ref _puf1ModuleInfo, value); }
-        }
+ 
         public ModuleInfo Dummy1ModuleInfo
         {
             get { return _dummy1ModuleInfo; }
@@ -384,17 +319,6 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return m_srd2Wafer; }
             set { SetProperty(ref m_srd2Wafer, value); }
         }
-
-        public WaferInfo PUF1WaferA
-        {
-            get { return m_puf1WaferA; }
-            set { SetProperty(ref m_puf1WaferA, value); }
-        }
-        public WaferInfo PUF1WaferB
-        {
-            get { return m_puf1WaferB; }
-            set { SetProperty(ref m_puf1WaferB, value); }
-        }
         public WaferInfo LoaderWaferA
         {
             get { return m_loaderWaferA; }
@@ -458,19 +382,6 @@ namespace PunkHPX8_MainPages.ViewModels
             set { SetProperty(ref m_CurrentRobotPosition, value); }
         }
 
-       
-        public PufControl.LoaderXLocation LoaderAXLocation
-        {
-            get { return m_loaderAXLoaction; }
-            set { SetProperty(ref m_loaderAXLoaction, value); }
-        }
-
-        public PufControl.LoaderXLocation LoaderBXLocation
-        {
-            get { return m_loaderBXLoaction; }
-            set { SetProperty(ref m_loaderBXLoaction, value); }
-        }
-
         public WaferInfo BladeAWafer
         {
             get { return m_BladeAWafer; }
@@ -508,67 +419,7 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return m_loaderWaferVisibleB; }
             set { SetProperty(ref m_loaderWaferVisibleB, value); }
         }
-        public bool Puf1IsInRobotStation
-        {
-            get { return m_puf1IsInRobotStation; }
-            set { SetProperty(ref m_puf1IsInRobotStation, value); }
-        }
-        /// <summary>
-        /// Puf1 Rotation实际位置数据
-        /// </summary>
-        public double Puf1RotationMotorPosition
-        {
-            get { return _puf1RotationMotorPosition; }
-            set { SetProperty(ref _puf1RotationMotorPosition, value); }
-        }
-        /// <summary>
-        /// Puf1 Flip实际位置数据
-        /// </summary>
-        public double Puf1FlipMotorPosition
-        {
-            get { return _puf1FlipMotorPosition; }
-            set { SetProperty(ref _puf1FlipMotorPosition, value); }
-        }
-        /// <summary>
-        /// Puf1 Flip UI位置
-        /// </summary>
-        public double Puf1FlipPosition
-        {
-            get { return _puf1FlipPosition; }
-            set { SetProperty(ref _puf1FlipPosition, value); }
-        }
-        /// <summary>
-        /// Puf1 Rotation UI对应位置     
-        /// </summary>
-        public double Puf1RotationPosition
-        {
-            get { return _puf1RotationPosition; }
-            set { SetProperty(ref _puf1RotationPosition, value); }
-        }
-        /// <summary>
-        /// Loader1 Rotation UI对应位置     
-        /// </summary>
-        public double Loader1RotationPosition
-        {
-            get { return _loader1RotationPosition; }
-            set { SetProperty(ref _loader1RotationPosition, value); }
-        }
-        /// <summary>
-        /// Puf1 Rotation Axis     
-        /// </summary>
-        public BeckhoffStationAxis Puf1RotationAxis
-        {
-            get { return _puf1RotationAxis; }
-            set { SetProperty(ref _puf1RotationAxis, value); }
-        }
-        /// <summary>
-        /// Puf1 Flip Axis     
-        /// </summary>
-        public BeckhoffStationAxis Puf1FlipAxis
-        {
-            get { return _puf1FlipAxis; }
-            set { SetProperty(ref _puf1FlipAxis, value); }
-        }
+       
         /// <summary>
         /// Loader1 Rotation Axis     
         /// </summary>
@@ -746,25 +597,7 @@ namespace PunkHPX8_MainPages.ViewModels
             }
             _timer1.Start();            
 
-            if (!m_RtDataKeys.Contains($"Station.PUF1.Roation"))
-            {
-                addStationDataKeys();
-            }
-            
             RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
-            if (RtDataValues != null)
-            {
-                //目标位置数据获取
-                Puf1RotationAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.PUF1.Rotation");
-                //Puf1Rotation比例尺计算
-                var resultRotation = Puf1RotationAxis != null ? CalculatePufMaxMin(Puf1RotationAxis) : (0, 0);
-                double distance = resultRotation.right - resultRotation.left;
-                _puf1RotationRatio = distance / _pufLayoutRotationDistance;
-                _puf1RotationMotorPositionMax = resultRotation.left;
-                //目标位置数据获取
-                Puf1FlipAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.PUF1.Flip");
-                _puf1FlipDiff = CalculatePufFlipDiff(Puf1FlipAxis);
-            }
         }
 
         
@@ -893,7 +726,6 @@ namespace PunkHPX8_MainPages.ViewModels
             EFEMModuleInfo = ModuleManager.ModuleInfos["EfemRobot"];
             SRD1ModuleInfo = ModuleManager.ModuleInfos["SRD1"];
             SRD2ModuleInfo = ModuleManager.ModuleInfos["SRD2"];
-            PUF1ModuleInfo = ModuleManager.ModuleInfos["PUF1"];
             Dummy1ModuleInfo = ModuleManager.ModuleInfos["Dummy1"];
             Dummy2ModuleInfo = ModuleManager.ModuleInfos["Dummy2"];
 
@@ -923,17 +755,6 @@ namespace PunkHPX8_MainPages.ViewModels
             {
                 SRD2Wafer = SRD2ModuleInfo.WaferManager.Wafers[0];
             }
-            if(PUF1ModuleInfo!=null)
-            {
-                if (PUF1ModuleInfo.WaferManager.Wafers.Count != 0)
-                {
-                    PUF1WaferA = PUF1ModuleInfo.WaferManager.Wafers[0];
-                }
-                if (PUF1ModuleInfo.WaferManager.Wafers.Count != 0)
-                {
-                    PUF1WaferB = PUF1ModuleInfo.WaferManager.Wafers[1];
-                }
-            }
             if(LoaderIsInstalled&&LoaderModuleInfo!=null)
             {
                 if (LoaderModuleInfo.WaferManager.Wafers.Count != 0)
@@ -962,8 +783,6 @@ namespace PunkHPX8_MainPages.ViewModels
 
             if (RtDataValues != null)
             {
-                Puf1IsInRobotStation = CommonFunction.GetValue<bool>(RtDataValues, "PUF1.IsInRobotStation");
-
                 if (CommonFunction.GetValue<int>(RtDataValues, "EquipmentStatus") == 4)
                 {
                     RouteState = "Resume";
@@ -994,17 +813,10 @@ namespace PunkHPX8_MainPages.ViewModels
                 RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
                 if (RtDataValues != null) 
                 {                
-                    Puf1RotationMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"PUF1.Rotation.{MOTOR_POSITION}");
+                   
                     Loader1TiltAMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"Loader1.TiltA.{MOTOR_POSITION}");
                     Loader1TiltBMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"Loader1.TiltB.{MOTOR_POSITION}");
                     Loader1RotationMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"Loader1.Rotation.{MOTOR_POSITION}");
-                    Puf1FlipMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"PUF1.Flip.{MOTOR_POSITION}");
-                    //计算Puf1 Rotation UI位置
-                    Puf1RotationPosition = _robotLayoutPosition + (Puf1RotationMotorPosition - _puf1RotationMotorPositionMax) / _puf1RotationRatio;
-                    //计Loader Rotation UI位置
-                    Loader1RotationPosition = -Loader1RotationMotorPosition - LOADER_ROTATION_DIFFER;
-                    //计算Puf1 Flip UI位置                    
-                    Puf1FlipPosition = Puf1FlipMotorPosition - _puf1FlipDiff;
                     //判断Loader1的TiltA水平状态
                     LoaderTiltACurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue<string>(RtDataValues, $"Loader1.TiltA.{CURRENT_STATION}"), "Loader1.TiltA");
                     if (LoaderTiltACurrentStation == "HORI")
@@ -1404,27 +1216,7 @@ namespace PunkHPX8_MainPages.ViewModels
 
             m_RtDataKeys.Add("Scheduler.CjNameList");
         }
-        private void addStationDataKeys()
-        {
-            m_RtDataKeys.Add($"Station.PUF1.Rotation"); 
-            m_RtDataKeys.Add($"Station.PUF1.Flip"); 
-            m_RtDataKeys.Add($"Station.PUF1.Vertical"); 
-            m_RtDataKeys.Add($"Station.Loader1.Rotation");
-            m_RtDataKeys.Add($"Station.Loader1.TiltA");
-            m_RtDataKeys.Add($"Station.Loader1.TiltB");
-
-            m_RtDataKeys.Add($"PUF1.Rotation.{MOTOR_POSITION}");
-            m_RtDataKeys.Add($"PUF1.Flip.{MOTOR_POSITION}");
-            m_RtDataKeys.Add($"Loader1.Rotation.{MOTOR_POSITION}");
-            m_RtDataKeys.Add($"Loader1.TiltA.{MOTOR_POSITION}");
-            m_RtDataKeys.Add($"Loader1.TiltB.{MOTOR_POSITION}");
-            m_RtDataKeys.Add($"PUF1.Flip.{CURRENT_STATION}");
-            m_RtDataKeys.Add($"Loader1.TiltA.{CURRENT_STATION}");
-            m_RtDataKeys.Add($"Loader1.TiltB.{CURRENT_STATION}");
-
-            m_RtDataKeys.Add($"PUF1.Rotation.{MOTION_DATA}");
-
-        }
+       
         private bool HasWaferOnSlot(List<WaferInfo> wafers, int index)
         {
             if (wafers[index].WaferStatus == 0)
@@ -1438,7 +1230,7 @@ namespace PunkHPX8_MainPages.ViewModels
             int delay = 500;
             if (robotAction == RobotAction.Placing)
             {
-                if (waferRobotTAction == WaferRobotTAction.LP1 || waferRobotTAction == WaferRobotTAction.PUF1)
+                if (waferRobotTAction == WaferRobotTAction.LP1)
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Left_Place;
                     await Task.Delay(delay);
@@ -1474,7 +1266,7 @@ namespace PunkHPX8_MainPages.ViewModels
             }
             else
             {
-                if (waferRobotTAction == WaferRobotTAction.LP1 || waferRobotTAction == WaferRobotTAction.PUF1)
+                if (waferRobotTAction == WaferRobotTAction.LP1)
                 {
                     CurrentRobotPosition = EFEM.RobotPosition.Left;
                     await Task.Delay(delay);

+ 6 - 14
PunkHPX8_MainPages/Views/EfemView.xaml

@@ -103,8 +103,6 @@
                 </Canvas>
             </Viewbox>
             <userControls:EFEM  x:Name="efem1" Width="360" Height="300" Canvas.Left="578" Canvas.Top="426" 
-                                Puf1Wafer="{Binding Puf1Wafer}"  
-                                Puf2Wafer="{Binding Puf2Wafer}" 
                                 LP1Presented="{Binding RtDataValues[LP1.CassettePlaced]}" 
                                 LP2Presented="{Binding RtDataValues[LP2.CassettePlaced]}" 
                                 LP3Presented="{Binding RtDataValues[LP3.CassettePlaced]}" 
@@ -115,9 +113,9 @@
                                 RobotAXAction="{Binding Robot1XAction}"
                                 RobotAWaferInfo="{Binding BladeAWafer}" 
                                 CurrentRobotPosition="{Binding CurrentRobotPosition}"
-                                Puf2IsInRobotStation="{Binding Puf2IsInRobotStation}" 
-                                Puf1IsInRobotStation="{Binding Puf1IsInRobotStation}"
                                 Aligner1Wafer="{Binding Aligner1Wafer}" 
+                                VPW1Wafer="{Binding VPW1Wafer}"
+                                VPW2Wafer="{Binding VPW2Wafer}"
                                 AlignActionValue="{Binding AlignValue, UpdateSourceTrigger=PropertyChanged}"/>
         </Canvas>
         <userControls:SRD CassetteName="SRD" Canvas.Left="787" Canvas.Top="172" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Center" SRD1Wafer="{Binding Srd1Wafer}" SRD2Wafer="{Binding Srd2Wafer}" SRDVisibility="Visible"/>
@@ -217,11 +215,10 @@
                     </i:Interaction.Triggers>
                 </ComboBox>
                 <ComboBox Grid.Row="1" Grid.Column="1"   Margin="5" ItemsSource="{Binding PickSoltItemsSource}" SelectedIndex="{Binding PickSoltSelectedIndex}"/>
-                <TextBox Text="1" Grid.Row="1" Grid.Column="2" Margin="5" FontSize="15" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"></TextBox>
-                <!--<ComboBox Grid.Row="1" Grid.Column="2"   Margin="5"  SelectedItem="{Binding PickSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>-->
+                <ComboBox Grid.Row="1" Grid.Column="2"   Margin="5"  SelectedItem="{Binding PickSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
                 <Button   Grid.Row="1" Grid.Column="3"   Content="Pick" Command="{Binding PickCommand}"/>
 
-                <ComboBox Grid.Row="2"                 Margin="5" SelectedItem="{Binding PlaceSelectedModule}" ItemsSource="{Binding EFEMModules}">
+                <ComboBox Grid.Row="2"   Margin="5" SelectedItem="{Binding PlaceSelectedModule}" ItemsSource="{Binding EFEMModules}">
                     <i:Interaction.Triggers>
                         <i:EventTrigger EventName="SelectionChanged">
                             <i:InvokeCommandAction Command="{Binding ModuleChangeCommand}" CommandParameter="Place" />
@@ -229,8 +226,7 @@
                     </i:Interaction.Triggers>
                 </ComboBox>
                 <ComboBox Grid.Row="2" Grid.Column="1" Margin="5" ItemsSource="{Binding PlaceSoltItemsSource}" SelectedIndex="{Binding PlaceSoltSelectedIndex}"/>
-                <!--<ComboBox Grid.Row="2" Grid.Column="2" Margin="5" SelectedItem="{Binding PlaceSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>-->
-                <TextBox Text="1" Grid.Row="2" Grid.Column="2" Margin="5" FontSize="15" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"></TextBox>
+                <ComboBox Grid.Row="2" Grid.Column="2" Margin="5" SelectedItem="{Binding PlaceSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
                 <Button   Grid.Row="2" Grid.Column="3"  Content="Place"  Command="{Binding PlaceCommand}"/>
 
 
@@ -674,11 +670,7 @@
             <TextBox Canvas.Left="1700" Canvas.Top="220" Text="{Binding RobotMoveInfo.ArmTarget}"/>
             <TextBox Canvas.Left="1800" Canvas.Top="220" Text="{Binding RobotMoveInfo.Action}"/>
         </Canvas>-->
-        <!--<Button Padding="5" Canvas.Top="120" Canvas.Left="1040" Content="PUF1Pick" Command="{Binding PUFPickCommand}" CommandParameter="PUF1"/>
-        <Button Padding="5" Canvas.Top="120" Canvas.Left="1115" Content="PUF1Place" Command="{Binding PUFPlaceCommand}" CommandParameter="PUF1" HorizontalAlignment="Left" VerticalAlignment="Center"/>
-        <Button Padding="5" Canvas.Top="120" Canvas.Left="1200" Content="PUF2Pick" Command="{Binding PUFPickCommand}" CommandParameter="PUF2"/>
-        <Button Padding="5" Canvas.Top="120" Canvas.Left="1275" Content="PUF2Place" Command="{Binding PUFPlaceCommand}" CommandParameter="PUF2" HorizontalAlignment="Left" VerticalAlignment="Center"/>-->
-
+       
 
     </Canvas>
 

+ 1 - 1
PunkHPX8_MainPages/Views/OperationOverView.xaml

@@ -82,7 +82,7 @@
                                    LP2Loaded="{Binding RtDataValues[LP2.IsLoaded]}" LP3Loaded="{Binding RtDataValues[LP3.IsLoaded]}" 
                                    RobotATAction="{Binding Robot3TAction}" RobotAXAction="{Binding Robot3XAction}" 
                                    RobotAWaferInfo="{Binding BladeAWafer}" CurrentRobotPosition="{Binding CurrentRobotPosition}" 
-                                   Puf2IsInRobotStation="false" Puf1IsInRobotStation="false"
+                      
                                    HorizontalAlignment="Center" VerticalAlignment="Top" 
                                    />
 

+ 2 - 2
PunkHPX8_RT/Config/Layout/ToolLayoutConfiguration.xml

@@ -207,7 +207,7 @@
 
 		<Item i:type="SRD">
 			<Installed>true</Installed>
-			<PermittedWaferSizeInMM>300</PermittedWaferSizeInMM>
+			<PermittedWaferSizeInMM>200</PermittedWaferSizeInMM>
 			<ResourceID>SRD1</ResourceID>
 			<Type>SRD</Type>
 			<SRDID>1</SRDID>
@@ -215,7 +215,7 @@
 		</Item>
 		<Item i:type="SRD">
 			<Installed>true</Installed>
-			<PermittedWaferSizeInMM>300</PermittedWaferSizeInMM>
+			<PermittedWaferSizeInMM>200</PermittedWaferSizeInMM>
 			<ResourceID>SRD2</ResourceID>
 			<Type>SRD</Type>
 			<SRDID>2</SRDID>

+ 29 - 4
PunkHPX8_RT/Config/System.sccfg

@@ -126,10 +126,35 @@
 			<config default="7" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="7" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
-		<configs name="PUF1" nameView="PUF1" visible="false">
-			<config default="8" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="8" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="8" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+		<configs name="VPW1" nameView="VPW1" visible="false">
+			<config default="67" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="68" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="69" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+		</configs>
+		<configs name="VPW2" nameView="VPW2" visible="false">
+			<config default="70" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="71" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="72" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+		</configs>
+		<configs name="PlatingCell1" nameView="PlatingCell1" visible="false">
+			<config default="73" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="74" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="75" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+		</configs>
+		<configs name="PlatingCell2" nameView="PlatingCell2" visible="false">
+			<config default="76" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="77" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="78" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+		</configs>
+		<configs name="PlatingCell3" nameView="PlatingCell3" visible="false">
+			<config default="79" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="80" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="81" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+		</configs>
+		<configs name="PlatingCell4" nameView="PlatingCell4" visible="false">
+			<config default="82" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="83" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="84" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="Aligner1" nameView="Aligner1">
 			<config default="9" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>

+ 9 - 3
PunkHPX8_RT/Devices/EFEM/SunWayRobot.cs

@@ -129,7 +129,13 @@ namespace PunkHPX8_RT.Devices.EFEM
             InitializeModuleStation(ModuleName.Aligner1);
             InitializeModuleStation(ModuleName.SRD1);
             InitializeModuleStation(ModuleName.SRD2);
-            InitializeModuleStation(ModuleName.PUF1);
+            InitializeModuleStation(ModuleName.VPW1);
+            InitializeModuleStation(ModuleName.VPW2);
+            InitializeModuleStation(ModuleName.PlatingCell1);
+            InitializeModuleStation(ModuleName.PlatingCell2);
+            InitializeModuleStation(ModuleName.PlatingCell3);
+            InitializeModuleStation(ModuleName.PlatingCell4);
+ 
 
             CarrierManager.Instance.SubscribeLocation(ModuleName.LP1.ToString(), 1);
             CarrierManager.Instance.SubscribeLocation(ModuleName.LP2.ToString(), 1);
@@ -422,7 +428,7 @@ namespace PunkHPX8_RT.Devices.EFEM
             int stationNumber= _moduleStationNumberDictionary[strModuleWaferSize]; 
             string strFlip = flip == Flip.Flip ? " Flip" : "";
             string cmd = $"PICK {stationNumber} SLOT {slot+1} ARM {_armString[hand]}{strFlip}\r";
-            if(ModuleHelper.IsPUF(station)||ModuleHelper.IsAligner(station)||ModuleHelper.IsSRD(station))
+            if(ModuleHelper.IsAligner(station)||ModuleHelper.IsSRD(station)||ModuleHelper.IsVPWCell(station) || ModuleHelper.IsPlatingCell(station))
             {
                 cmd = $"PICK {stationNumber} SLOT 1 ARM {_armString[hand]}\r";
             }
@@ -478,7 +484,7 @@ namespace PunkHPX8_RT.Devices.EFEM
             int stationNumber = _moduleStationNumberDictionary[strModuleWaferSize];
             string strFlip = flip == Flip.Flip ? " Flip" : "";
             string cmd = $"PLACE {stationNumber} SLOT {slot+1} ARM {_armString[hand]}{strFlip}\r";
-            if (ModuleHelper.IsPUF(station)||ModuleHelper.IsSRD(station))
+            if (ModuleHelper.IsSRD(station) || ModuleHelper.IsVPWCell(station) || ModuleHelper.IsPlatingCell(station))
             {
                 cmd = $"PLACE {stationNumber} SLOT 1 ARM {_armString[hand]}\r";
             }

+ 15 - 28
PunkHPX8_RT/Modules/EFEM/CycleRobotCycleNewRoutine.cs

@@ -75,45 +75,38 @@ namespace PunkHPX8_RT.Modules.EFEM
         {
             ModuleName sequenceModuleName = _sequences[0].ModuleName;
             WaferInfo[] waferInfos = WaferManager.Instance.GetWafers(sequenceModuleName);
-            int count = 0;
             foreach (WaferInfo item in waferInfos)
             {
                 if (item.IsEmpty)
                 {
                     continue;
                 }
-                _actions.AddRange(GenerateCycle(_sequences[0], item.Slot, _sequences[1].ModuleName, ModuleHelper.IsDummy(_sequences[1].ModuleName) ? count : 0));
+                // generateCycle的参数:源模块,源模块slot,目的模块,目的模块slot
+                _actions.AddRange(GenerateCycle(_sequences[0], item.Slot, _sequences[1].ModuleName,0));
                 for (int i = 1; i < _sequences.Count; i++)
                 {
                  
                     if (i == _sequences.Count - 1)
                     {
-                        _actions.AddRange(GenerateCycle(_sequences[i], ModuleHelper.IsDummy(_sequences[i].ModuleName) ? count : 0, _sequences[0].ModuleName,
-                            item.Slot));
+                        _actions.AddRange(GenerateCycle(_sequences[i], 0, _sequences[0].ModuleName, item.Slot));
                     }
                     //else (i == 1)
                     else
                     {
-                        _actions.AddRange(GenerateCycle(_sequences[i], ModuleHelper.IsDummy(_sequences[i].ModuleName) ? count : 0, _sequences[i + 1].ModuleName,
-                            ModuleHelper.IsDummy(_sequences[i + 1].ModuleName) ? count : 0));
-                    }
-                    if (ModuleHelper.IsDummy(_sequences[i].ModuleName))
-                    {
-                        WaferInfo[] dummywaferInfos = WaferManager.Instance.GetWafers(_sequences[i].ModuleName);
-                        if (dummywaferInfos != null)
-                        {
-                            _dummySlotNumber = dummywaferInfos.Length;
-                        }
+                        _actions.AddRange(GenerateCycle(_sequences[i], 0, _sequences[i + 1].ModuleName, 0));
                     }
-                }
-                count++;
-                if(count >= _dummySlotNumber)
-                {
-                    count = 0;
+                   
                 }
             }
         }
-
+        /// <summary>
+        /// 返回从哪儿取,放到哪儿的一个EfemCycleAction列表
+        /// </summary>
+        /// <param name="sourceParameter"></param>
+        /// <param name="sourceSlot"></param>
+        /// <param name="destModule"></param>
+        /// <param name="destSlot"></param>
+        /// <returns></returns>
         private List<EfemCycleAction> GenerateCycle(RobotCycleParameter sourceParameter,int sourceSlot,ModuleName destModule,int destSlot)
         {
             List<EfemCycleAction> actions = new List<EfemCycleAction>();
@@ -214,20 +207,14 @@ namespace PunkHPX8_RT.Modules.EFEM
                     return false;
                 };
             }
-            else if (lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.LP1.ToString()) != -1)
-            {
-                if (!CheckLoadPortStatus(ModuleName.LP2))
-                {
-                    return false;
-                };
-            }
-            else
+            else if (lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.LP2.ToString()) != -1)
             {
                 if (!CheckLoadPortStatus(ModuleName.LP2))
                 {
                     return false;
                 };
             }
+            
             //Dummy
             if (lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.Dummy1.ToString()) != -1)
             {

+ 7 - 3
PunkHPX8_Themes/CustomControls/CustomRobot.cs

@@ -61,12 +61,16 @@ namespace PunkHPX8_Themes.CustomControls
         Aligner1,
         RightLocation,
         LeftLocation,
-        PUF1,
-        PUF2,
         Dummy1,
         Dummy2,
         SRD1,
-        SRD2
+        SRD2,
+        VPW1,
+        VPW2,
+        PlatingCell1,
+        PlatingCell2,
+        PlatingCell3,
+        PlatingCell4
     }
 
     public class WaferRobotControl : Control

+ 10 - 4
PunkHPX8_Themes/Themes/Generic.xaml

@@ -709,18 +709,24 @@
                                             </DoubleAnimationUsingKeyFrames>
                                         </Storyboard>
                                     </VisualTransition>
-                                    <VisualTransition To="PUF1">
+                                    <VisualTransition To="VPW1">
                                         <Storyboard FillBehavior="HoldEnd">
                                             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Angle">
                                                 <LinearDoubleKeyFrame Value="180" KeyTime="0:0:0.5"/>
                                             </DoubleAnimationUsingKeyFrames>
+                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRightLeftAct" Storyboard.TargetProperty="Y">
+                                                <LinearDoubleKeyFrame Value="-56" KeyTime="0:0:0.5"/>
+                                            </DoubleAnimationUsingKeyFrames>
                                         </Storyboard>
                                     </VisualTransition>
-                                    <VisualTransition To="PUF2">
+                                    <VisualTransition To="VPW2">
                                         <Storyboard FillBehavior="HoldEnd">
                                             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Angle">
                                                 <LinearDoubleKeyFrame Value="180" KeyTime="0:0:0.5"/>
                                             </DoubleAnimationUsingKeyFrames>
+                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRightLeftAct" Storyboard.TargetProperty="Y">
+                                                <LinearDoubleKeyFrame Value="115" KeyTime="0:0:0.5"/>
+                                            </DoubleAnimationUsingKeyFrames>
                                         </Storyboard>
                                     </VisualTransition>
                                 </VisualStateGroup.Transitions>
@@ -809,14 +815,14 @@
                                         </DoubleAnimationUsingKeyFrames>
                                     </Storyboard>
                                 </VisualState>
-                                <VisualState Name="PUF1">
+                                <VisualState Name="VPW1">
                                     <Storyboard FillBehavior="HoldEnd">
                                         <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Angle">
                                             <LinearDoubleKeyFrame Value="180" KeyTime="0:0:0"/>
                                         </DoubleAnimationUsingKeyFrames>
                                     </Storyboard>
                                 </VisualState>
-                                <VisualState Name="PUF2">
+                                <VisualState Name="VPW2">
                                     <Storyboard FillBehavior="HoldEnd">
                                         <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Angle">
                                             <LinearDoubleKeyFrame Value="180" KeyTime="0:0:0"/>

+ 25 - 12
PunkHPX8_Themes/UserControls/EFEM.xaml

@@ -40,7 +40,20 @@
                         </DoubleAnimationUsingKeyFrames>
                     </Storyboard>
                 </VisualTransition>
-
+                <VisualTransition To="VPW1">
+                    <Storyboard FillBehavior="HoldEnd">
+                        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Y">
+                            <LinearDoubleKeyFrame Value="-100" KeyTime="0:0:0.5"/>
+                        </DoubleAnimationUsingKeyFrames>
+                    </Storyboard>
+                </VisualTransition>
+                <VisualTransition To="VPW2">
+                    <Storyboard FillBehavior="HoldEnd">
+                        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Y">
+                            <LinearDoubleKeyFrame Value="130" KeyTime="0:0:0.5"/>
+                        </DoubleAnimationUsingKeyFrames>
+                    </Storyboard>
+                </VisualTransition>
                 <VisualTransition To="Aligner">
                     <Storyboard FillBehavior="HoldEnd">
                         <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Y">
@@ -48,6 +61,7 @@
                         </DoubleAnimationUsingKeyFrames>
                     </Storyboard>
                 </VisualTransition>
+                
                 <VisualTransition To="SRD">
                     <Storyboard FillBehavior="HoldEnd">
                         <DoubleAnimationUsingKeyFrames Storyboard.TargetName="robotRotateAct" Storyboard.TargetProperty="Y">
@@ -404,9 +418,9 @@
                     <local:WaferCtrl WaferData="{Binding ElementName=efem, Path=Aligner1Wafer}"/>
                 </Viewbox>
                 
-                <!--PUF1-->
+       
                 <Viewbox Stretch="Uniform" Width="370" Height="370" Canvas.Left="810"  Canvas.Top="60" HorizontalAlignment="Center" VerticalAlignment="Top" 
-                         Visibility="{Binding ElementName=efem,Path=Puf1IsInRobotStation,Converter={StaticResource bool2VisibilityConverter}}">
+                        >
                     <Canvas UseLayoutRounding="False"  Width="93.693" Height="112.5" HorizontalAlignment="Center" VerticalAlignment="Top" >
                         <Canvas  Width="72.522" Height="72.521" Canvas.Left="10.473" Canvas.Top="0">
                             <Path Data="F1M10.473,65.041C10.473,85.068,26.708,101.302,46.734,101.302L46.734,101.302C66.761,101.302,82.995,85.068,82.995,65.041L82.995,65.041C82.995,45.015,66.761,28.781,46.734,28.781L46.734,28.781C26.708,28.781,10.473,45.015,10.473,65.041" Stretch="Fill" Width="72.522" Height="72.521" Canvas.Left="0" Canvas.Top="0">
@@ -433,13 +447,12 @@
                         </Canvas>
                     </Canvas>
                 </Viewbox>
-                <Viewbox Width="230" Height="230"  Canvas.Left="880" Canvas.Top="60" Visibility="{Binding ElementName=efem,Path=Puf1IsInRobotStation,Converter={StaticResource bool2VisibilityConverter}}">
-                    <local:WaferCtrl WaferData="{Binding ElementName=efem, Path=Puf1Wafer}"/>
+                <Viewbox Width="230" Height="230"  Canvas.Left="880" Canvas.Top="60" >
+                    <local:WaferCtrl WaferData="{Binding ElementName=efem, Path=VPW1Wafer}"/>
                 </Viewbox>
-                <TextBox Visibility="{Binding ElementName=efem,Path=Puf1IsInRobotStation,Converter={StaticResource bool2VisibilityConverter}}" IsReadOnly="True" BorderThickness="0"  Text="PUF1" Canvas.Left="1160"  Canvas.Top="150" FontSize="55" Width="280"  Height="84" Background="Transparent" HorizontalContentAlignment="Center" HorizontalAlignment="Left" VerticalAlignment="Top"/>
-                <!--PUF2-->
-                <Viewbox Stretch="Uniform" Width="370" Height="370" Canvas.Left="810"  Canvas.Top="370" HorizontalAlignment="Center" VerticalAlignment="Top" 
-                         Visibility="{Binding ElementName=efem,Path=Puf2IsInRobotStation,Converter={StaticResource bool2VisibilityConverter}}">
+                <TextBox  IsReadOnly="True" BorderThickness="0"  Text="VPW1" Canvas.Left="1160"  Canvas.Top="150" FontSize="55" Width="280"  Height="84" Background="Transparent" HorizontalContentAlignment="Center" HorizontalAlignment="Left" VerticalAlignment="Top"/>
+       
+                <Viewbox Stretch="Uniform" Width="370" Height="370" Canvas.Left="810"  Canvas.Top="370" HorizontalAlignment="Center" VerticalAlignment="Top" >
                     <Canvas UseLayoutRounding="False"  Width="93.693" Height="112.5" HorizontalAlignment="Center" VerticalAlignment="Top">
                         <Canvas  Width="72.522" Height="72.521" Canvas.Left="10.473" Canvas.Top="0">
                             <Path Data="F1M10.473,65.041C10.473,85.068,26.708,101.302,46.734,101.302L46.734,101.302C66.761,101.302,82.995,85.068,82.995,65.041L82.995,65.041C82.995,45.015,66.761,28.781,46.734,28.781L46.734,28.781C26.708,28.781,10.473,45.015,10.473,65.041" Stretch="Fill" Width="72.522" Height="72.521" Canvas.Left="0" Canvas.Top="0">
@@ -466,10 +479,10 @@
                         </Canvas>
                     </Canvas>
                 </Viewbox>
-                <Viewbox Width="230" Height="230"  Canvas.Left="880" Canvas.Top="370" Visibility="{Binding ElementName=efem,Path=Puf2IsInRobotStation,Converter={StaticResource bool2VisibilityConverter}}">
-                    <local:WaferCtrl WaferData="{Binding ElementName=efem, Path=Puf2Wafer}"/>
+                <Viewbox Width="230" Height="230"  Canvas.Left="880" Canvas.Top="370">
+                    <local:WaferCtrl WaferData="{Binding ElementName=efem, Path=VPW2Wafer}"/>
                 </Viewbox>
-                <TextBox Visibility="{Binding ElementName=efem,Path=Puf2IsInRobotStation,Converter={StaticResource bool2VisibilityConverter}}" IsReadOnly="True" BorderThickness="0"  Text="PUF2" Canvas.Left="1160"  Canvas.Top="450" FontSize="55" Width="280"  Height="84" Background="Transparent" HorizontalContentAlignment="Center" HorizontalAlignment="Left" VerticalAlignment="Top"/>
+                <TextBox IsReadOnly="True" BorderThickness="0"  Text="VPW2" Canvas.Left="1160"  Canvas.Top="450" FontSize="55" Width="280"  Height="84" Background="Transparent" HorizontalContentAlignment="Center" HorizontalAlignment="Left" VerticalAlignment="Top"/>
 
                 <local:Loadport Canvas.Top="20" Width="300" Height="300" RotateTransformValue="90" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                 <local:Loadport  Canvas.Top="345" Width="300" Height="300" RotateTransformValue="90"/>

+ 44 - 21
PunkHPX8_Themes/UserControls/EFEM.xaml.cs

@@ -30,7 +30,9 @@ namespace PunkHPX8_Themes.UserControls
             Middle_Place,
             Aligner_Place,
             SRD_Place,
-            Dummy_Place
+            Dummy_Place,
+            VPW1,
+            VPW2,
         }
         public EFEM()
         {
@@ -61,35 +63,56 @@ namespace PunkHPX8_Themes.UserControls
             get => (WaferInfo)GetValue(Aligner1WaferProperty);
             set => SetValue(Aligner1WaferProperty, value);
         }
-        public static readonly DependencyProperty Puf1WaferProperty = DependencyProperty.Register(
-            "Puf1Wafer", typeof(WaferInfo), typeof(EFEM));
-        public WaferInfo Puf1Wafer
+
+        public static readonly DependencyProperty VPW1WaferProperty = DependencyProperty.Register(
+    "VPW1Wafer", typeof(WaferInfo), typeof(EFEM));
+        public WaferInfo VPW1Wafer
         {
-            get => (WaferInfo)GetValue(Puf1WaferProperty);
-            set => SetValue(Puf1WaferProperty, value);
+            get => (WaferInfo)GetValue(VPW1WaferProperty);
+            set => SetValue(VPW1WaferProperty, value);
         }
-        public static readonly DependencyProperty Puf2WaferProperty = DependencyProperty.Register(
-            "Puf2Wafer", typeof(WaferInfo), typeof(EFEM));
-        public WaferInfo Puf2Wafer
+
+        public static readonly DependencyProperty VPW2WaferProperty = DependencyProperty.Register(
+    "VPW2Wafer", typeof(WaferInfo), typeof(EFEM));
+        public WaferInfo VPW2Wafer
         {
-            get => (WaferInfo)GetValue(Puf2WaferProperty);
-            set => SetValue(Puf2WaferProperty, value);
+            get => (WaferInfo)GetValue(VPW2WaferProperty);
+            set => SetValue(VPW2WaferProperty, value);
         }
-        public static readonly DependencyProperty Puf1IsInRobotStationProperty = DependencyProperty.Register(
-            "Puf1IsInRobotStation", typeof(bool), typeof(EFEM));
-        public bool Puf1IsInRobotStation
+
+        public static readonly DependencyProperty PlatingCell1WaferProperty = DependencyProperty.Register(
+   "PlatingCell1Wafer", typeof(WaferInfo), typeof(EFEM));
+        public WaferInfo PlatingCell1Wafer
         {
-            get => (bool)GetValue(Puf1IsInRobotStationProperty);
-            set => SetValue(Puf1IsInRobotStationProperty, value);
+            get => (WaferInfo)GetValue(PlatingCell1WaferProperty);
+            set => SetValue(PlatingCell1WaferProperty, value);
         }
-        public static readonly DependencyProperty Puf2IsInRobotStationProperty = DependencyProperty.Register(
-            "Puf2IsInRobotStation", typeof(bool), typeof(EFEM));
-        public bool Puf2IsInRobotStation
+
+        public static readonly DependencyProperty PlatingCell2WaferProperty = DependencyProperty.Register(
+  "PlatingCell2Wafer", typeof(WaferInfo), typeof(EFEM));
+        public WaferInfo PlatingCell2Wafer
         {
-            get => (bool)GetValue(Puf2IsInRobotStationProperty);
-            set => SetValue(Puf2IsInRobotStationProperty, value);
+            get => (WaferInfo)GetValue(PlatingCell2WaferProperty);
+            set => SetValue(PlatingCell2WaferProperty, value);
         }
 
+        public static readonly DependencyProperty PlatingCell3WaferProperty = DependencyProperty.Register(
+  "PlatingCell3Wafer", typeof(WaferInfo), typeof(EFEM));
+        public WaferInfo PlatingCell3Wafer
+        {
+            get => (WaferInfo)GetValue(PlatingCell3WaferProperty);
+            set => SetValue(PlatingCell3WaferProperty, value);
+        }
+
+        public static readonly DependencyProperty PlatingCell4WaferProperty = DependencyProperty.Register(
+  "PlatingCell4Wafer", typeof(WaferInfo), typeof(EFEM));
+        public WaferInfo PlatingCell4Wafer
+        {
+            get => (WaferInfo)GetValue(PlatingCell4WaferProperty);
+            set => SetValue(PlatingCell4WaferProperty, value);
+        }
+
+
 
         public static readonly DependencyProperty LP1PresentedProperty = DependencyProperty.Register(
        "LP1Presented", typeof(bool), typeof(EFEM),

+ 2 - 1
PunkHPX8_Twincate/PunkHPX8/PlcTest/POUs/MAIN.TcPOU

@@ -168,7 +168,8 @@ VAR
 	RES3_4_DI_8CHANNEL_4_20MA_EL1008_N230_7 AT%I* :BOOL;
 	
 	
-	
+    //Dummy1Cassete200Present
+	Facility_DI_16CHANNEL_EL1819_N000_160 AT%I* :BOOL;
 	//CassetteAPlaced
 	Facility_DI_16CHANNEL_EL1819_N000_11 AT%I* :BOOL;
 	//CassetteA100M