using Aitex.Sorter.Common; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.OperationCenter; using OpenSEMI.ClientBase; using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Threading; using Venus_Core; using Venus_MainPages.Unity; using Venus_Themes.CustomControls; namespace Venus_MainPages.ViewModels { public enum TMModule { PMA, PMB, PMC, PMD, LLA, LLB } public enum TMBlade { Blade1, Blade2 } internal class TMViewModel : BindableBase { #region 私有字段 //private ModuleInfo m_PMAWafer; private ModuleInfo m_LLAModuleInfo; private ModuleInfo m_LLBModuleInfo; private bool m_TMIsOFFline; private bool m_LLIsOFFline; private WaferInfo m_PMAWafer; private WaferInfo m_PMBWafer; private WaferInfo m_PMCWafer; private WaferInfo m_PMDWafer; private WaferInfo m_LLAWafer; private WaferInfo m_LLBWafer; private WaferInfo m_BladeAWafer; private WaferInfo m_BladeBWafer; private bool m_PMADoorIsOpen; //private bool m_PMBDoorIsOpen; //private bool m_PMCDoorIsOpen; //private bool m_PMDDoorIsOpen; private bool m_LLADoorIsOpen; private WaferRobotTAction m_WaferRobotTAction; private WaferRobotTAction m_Robot1TAction; private WaferRobotXAction m_Robot1XAction; private WaferRobotTAction m_Robot2TAction; private WaferRobotXAction m_Robot2XAction; private TMModule m_PickSelectedModule; private TMModule m_PlaceSelectedModule; private TMModule m_ExtendSelectedModule; private TMModule m_RetractSelectedModule; private TMBlade m_PickSelectedBlade; private TMBlade m_PlaceSelectedBlade; private TMBlade m_ExtendSelectedBlade; private TMBlade m_RetractSelectedBlade; private TMBlade m_GoToSelectedBlade; private ObservableCollection<int> m_PlaceSoltItemsSource = new ObservableCollection<int>(); private ObservableCollection<int> m_PickSoltItemsSource = 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_ExtendSoltSelectedIndex; private int m_RetractSoltSelectedIndex; private List<string> m_RtDataKeys=new List<string> (); private Dictionary<string, object> m_RtDataValues; private string m_ModuleCheckedName="TM"; private string m_RobotAction; private string m_RobotTarget; private string m_RobotArm; #endregion #region 属性 public string RobotAction { get { return m_RobotAction; } set { RobotActiont(m_RobotAction, value); SetProperty(ref m_RobotAction, value); } } public string RobotTarget { get { return m_RobotTarget; } set { SetProperty(ref m_RobotTarget, value); } } public string RobotArm { get { return m_RobotArm; } set { SetProperty(ref m_RobotArm, value); } } int arm1oldWaferStatus = 100; int arm2oldWaferStatus = 100; private async void RobotActiont(string oldValue,string newValue) { if (oldValue == "None" && newValue == "Placing" && ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[0].WaferStatus==1) { var TMRobotMoveActionBladeTarget = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.BladeTarget"); if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; var module = values[1]; Robot1TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot1XAction = WaferRobotXAction.Extend; if (arm == "ArmA") { Robot1TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot1XAction = WaferRobotXAction.Extend; } else if (arm == "ArmB") { Robot2TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot2XAction = WaferRobotXAction.Extend; } } if (oldValue == "None" && newValue == "Placing" && ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[1].WaferStatus == 1) { var TMRobotMoveActionBladeTarget = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.BladeTarget"); if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; var module = values[1]; if (arm == "ArmA") { Robot1TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot1XAction = WaferRobotXAction.Extend; } else if (arm == "ArmB") { Robot2TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot2XAction = WaferRobotXAction.Extend; } //Robot2TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); //await Task.Delay(1500); //Robot2XAction = WaferRobotXAction.Extend; } if (arm1oldWaferStatus != ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[0].WaferStatus) { Robot1XAction = WaferRobotXAction.Retract; } if (arm2oldWaferStatus != ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[1].WaferStatus) { Robot2XAction = WaferRobotXAction.Retract; } if (oldValue == "None" && newValue == "Picking" && ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[1].WaferStatus == 0) { var TMRobotMoveActionBladeTarget = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.BladeTarget"); if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; var module = values[1]; if (arm == "ArmA") { Robot1TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot1XAction = WaferRobotXAction.Extend; } else if (arm == "ArmB") { Robot2TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot2XAction = WaferRobotXAction.Extend; } } #region pick 和 place pm if (oldValue == "None" && newValue == "Extending") { var TMRobotMoveActionBladeTarget = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.BladeTarget"); if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; var module = values[1]; if (arm == "ArmA") { Robot1TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot1XAction = WaferRobotXAction.Extend; } else if (arm == "ArmB") { Robot2TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true); await Task.Delay(1500); Robot2XAction = WaferRobotXAction.Extend; } } if (oldValue == "None" && newValue == "Retracting") { var TMRobotMoveActionBladeTarget = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.BladeTarget"); if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; if (arm == "ArmA") { Robot1XAction = WaferRobotXAction.Retract; } else if (arm == "ArmB") { Robot2XAction = WaferRobotXAction.Retract; } } #endregion arm1oldWaferStatus = ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[0].WaferStatus; arm2oldWaferStatus = ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[1].WaferStatus; } public WaferInfo LLAWafer { get { return m_LLAWafer; } set { SetProperty(ref m_LLAWafer, value); } } public WaferInfo LLBWafer { get { return m_LLBWafer; } set { SetProperty(ref m_LLBWafer, value); } } public WaferInfo PMAWafer { get { return m_PMAWafer; } set { SetProperty(ref m_PMAWafer, value); } } public WaferInfo PMBWafer { get { return m_PMBWafer; } set { SetProperty(ref m_PMBWafer, value); } } public WaferInfo PMCWafer { get { return m_PMCWafer; } set { SetProperty(ref m_PMCWafer, value); } } public WaferInfo PMDWafer { get { return m_PMDWafer; } set { SetProperty(ref m_PMDWafer, value); } } public WaferInfo BladeAWafer { get { return m_BladeAWafer; } set { SetProperty(ref m_BladeAWafer, value); } } public WaferInfo BladeBWafer { get { return m_BladeBWafer; } set { SetProperty(ref m_BladeBWafer, value); } } public ModuleInfo LLAModuleInfo { get { return m_LLAModuleInfo; } set { SetProperty(ref m_LLAModuleInfo, value); } } public ModuleInfo LLBModuleInfo { get { return m_LLBModuleInfo; } set { SetProperty(ref m_LLBModuleInfo, value); } } public bool TMIsOFFline { get { return m_TMIsOFFline; } set { SetProperty(ref m_TMIsOFFline, value); } } public bool LLIsOFFline { get { return m_LLIsOFFline; } set { SetProperty(ref m_LLIsOFFline, value); } } public bool PMADoorIsOpen { get { return m_PMADoorIsOpen; } set { SetProperty(ref m_PMADoorIsOpen, value); } } public bool LLADoorIsOpen { get { return m_LLADoorIsOpen; } set { SetProperty(ref m_LLADoorIsOpen, value); } } public WaferRobotTAction WaferRobotTAction { get { return m_WaferRobotTAction; } set { SetProperty(ref m_WaferRobotTAction, value); } } public WaferRobotTAction Robot1TAction { get { return m_Robot1TAction; } set { SetProperty(ref m_Robot1TAction, value); } } public WaferRobotXAction Robot1XAction { get { return m_Robot1XAction; } set { SetProperty(ref m_Robot1XAction, value); } } public WaferRobotTAction Robot2TAction { get { return m_Robot2TAction; } set { SetProperty(ref m_Robot2TAction, value); } } public WaferRobotXAction Robot2XAction { get { return m_Robot2XAction; } set { SetProperty(ref m_Robot2XAction, value); } } public TMModule PickSelectedModule { get { return m_PickSelectedModule; } set { SetProperty(ref m_PickSelectedModule, value); } } public TMModule PlaceSelectedModule { get { return m_PlaceSelectedModule; } set { SetProperty(ref m_PlaceSelectedModule, value); } } public TMModule ExtendSelectedModule { get { return m_ExtendSelectedModule; } set { SetProperty(ref m_ExtendSelectedModule, value); } } public TMModule RetractSelectedModule { get { return m_RetractSelectedModule; } set { SetProperty(ref m_RetractSelectedModule, value); } } public TMBlade PickSelectedBlade { get { return m_PickSelectedBlade; } set { SetProperty(ref m_PickSelectedBlade, value); } } public TMBlade PlaceSelectedBlade { get { return m_PlaceSelectedBlade; } set { SetProperty(ref m_PlaceSelectedBlade, value); } } public TMBlade ExtendSelectedBlade { get { return m_ExtendSelectedBlade; } set { SetProperty(ref m_ExtendSelectedBlade, value); } } public TMBlade RetractSelectedBlade { get { return m_RetractSelectedBlade; } set { SetProperty(ref m_RetractSelectedBlade, value); } } public TMBlade GoToSelectedBlade { get { return m_GoToSelectedBlade; } set { SetProperty(ref m_GoToSelectedBlade, value); } } public ObservableCollection<int> PickSoltItemsSource { get { return m_PickSoltItemsSource; } set { SetProperty(ref m_PickSoltItemsSource, value); } } public ObservableCollection<int> PlaceSoltItemsSource { get { return m_PlaceSoltItemsSource; } set { SetProperty(ref m_PlaceSoltItemsSource, value); } } public ObservableCollection<int> ExtendSoltItemsSource { get { return m_ExtendSoltItemsSource; } set { SetProperty(ref m_ExtendSoltItemsSource, value); } } public ObservableCollection<int> RetractSoltItemsSource { get { return m_RetractSoltItemsSource; } set { SetProperty(ref m_RetractSoltItemsSource, value); } } public int PickSoltSelectedIndex { get { return m_PickSoltSelectedIndex; } set { SetProperty(ref m_PickSoltSelectedIndex, value); } } public int PlaceSoltSelectedIndex { get { return m_PlaceSoltSelectedIndex; } set { SetProperty(ref m_PlaceSoltSelectedIndex, value); } } public int ExtendSoltSelectedIndex { get { return m_ExtendSoltSelectedIndex; } set { SetProperty(ref m_ExtendSoltSelectedIndex, value); } } public int RetractSoltSelectedIndex { get { return m_RetractSoltSelectedIndex; } set { SetProperty(ref m_RetractSoltSelectedIndex, value); } } public Dictionary<string, object> RtDataValues { get { return m_RtDataValues; } set { SetProperty(ref m_RtDataValues, value); } } #endregion #region 命令 private DelegateCommand _GotoCommand; public DelegateCommand GotoCommand => _GotoCommand ?? (_GotoCommand = new DelegateCommand(OnGoto)); private DelegateCommand _ExtendCommand; public DelegateCommand ExtendCommand => _ExtendCommand ?? (_ExtendCommand = new DelegateCommand(OnExtend)); private DelegateCommand _RetractCommand; public DelegateCommand RetractCommand => _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract)); private DelegateCommand<object> _ModuleChangeCommand; public DelegateCommand<object> ModuleChangeCommand => _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand<object>(OnModuleChange)); private DelegateCommand _PickCommand; public DelegateCommand PickCommand => _PickCommand ?? (_PickCommand = new DelegateCommand(OnPick)); private DelegateCommand _PlaceCommand; public DelegateCommand PlaceCommand => _PlaceCommand ?? (_PlaceCommand = new DelegateCommand(OnPlace)); private DelegateCommand _HomeCommand; public DelegateCommand HomeCommand => _HomeCommand ?? (_HomeCommand = new DelegateCommand(OnHome)); private DelegateCommand _VentCommand; public DelegateCommand VentCommand => _VentCommand ?? (_VentCommand = new DelegateCommand(OnVent)); private DelegateCommand _PumpCommand; public DelegateCommand PumpCommand => _PumpCommand ?? (_PumpCommand = new DelegateCommand(OnPump)); private DelegateCommand _PurgeCommand; public DelegateCommand PurgeCommand => _PurgeCommand ?? (_PurgeCommand = new DelegateCommand(OnPurge)); private DelegateCommand<object> _ModuleCheckedCommand; public DelegateCommand<object> ModuleCheckedCommand => _ModuleCheckedCommand ?? (_ModuleCheckedCommand = new DelegateCommand<object>(OnModuleChecked)); private DelegateCommand _AbortCommand; public DelegateCommand AbortCommand => _AbortCommand ?? (_AbortCommand = new DelegateCommand(OnAbort)); #endregion #region 构造函数 public TMViewModel() { addDataKeys(); DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(0.5); timer.Tick += Timer_Tick; timer.Start(); PickSoltItemsSource.Add(1); PlaceSoltItemsSource.Add(1); ExtendSoltItemsSource.Add(1); RetractSoltItemsSource.Add(1); //Robot1TAction = WaferRobotTAction.PMA; //Robot2TAction = WaferRobotTAction.PMD; } private void Timer_Tick(object sender, EventArgs e) { LLAModuleInfo = ModuleManager.ModuleInfos["LLA"]; LLBModuleInfo = ModuleManager.ModuleInfos["LLB"]; //LLBWafer = ModuleManager.ModuleInfos["LLB"].WaferManager.Wafers[0]; //LLAWafer = ModuleManager.ModuleInfos["LLA"].WaferManager.Wafers[3]; PMAWafer = ModuleManager.ModuleInfos["PMA"].WaferManager.Wafers[0]; BladeAWafer = ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[0]; BladeBWafer = ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[1]; RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys); var TMRobotMoveActionArmTarget = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.ArmTarget"); if (TMRobotMoveActionArmTarget != null) { RobotArm = ModuleManager.ModuleInfos["TM"].WaferManager.Wafers[0].WaferStatus.ToString(); } var TMRobotMoveActionBladeTarget = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.BladeTarget"); if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } var TMRobotMoveActionRobotAction = QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction.RobotAction"); if (TMRobotMoveActionRobotAction != null) { RobotAction = TMRobotMoveActionRobotAction.ToString(); } } #endregion #region 命令方法 private void OnGoto() { if (GoToSelectedBlade == TMBlade.Blade1) { Robot1TAction = WaferRobotTAction; } else if (GoToSelectedBlade == TMBlade.Blade2) { Robot2TAction = WaferRobotTAction; } } private void OnExtend() { var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true); var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true); InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.Extend}", moduleName, 0, selectedHand); } private void OnRetract() { var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true); var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true); InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.Retract}", moduleName, 0, selectedHand); } private void OnModuleChange(object obj) { var value = obj.ToString(); switch (value) { case "Pick": PickSoltItemsSource.Clear(); if ((int)PickSelectedModule == 4) { for (int i = 1; i <= LLAModuleInfo.WaferManager.Wafers.Count; i++) { PickSoltItemsSource.Add(i); } } else if ((int)PickSelectedModule == 5) { for (int i = 1; i <= LLBModuleInfo.WaferManager.Wafers.Count; i++) { PickSoltItemsSource.Add(i); } } else { PickSoltItemsSource.Add(1); } PickSoltSelectedIndex = 0; break; case "Place": PlaceSoltItemsSource.Clear(); if ((int)PlaceSelectedModule == 4) { for (int i = 1; i <= LLAModuleInfo.WaferManager.Wafers.Count; i++) { PlaceSoltItemsSource.Add(i); } } else if ((int)PlaceSelectedModule == 5) { for (int i = 1; i <= LLBModuleInfo.WaferManager.Wafers.Count; i++) { PlaceSoltItemsSource.Add(i); } } else { PlaceSoltItemsSource.Add(1); } PlaceSoltSelectedIndex = 0; break; case "Extend": ExtendSoltItemsSource.Clear(); if ((int)ExtendSelectedModule == 4) { for (int i = 1; i <= LLAModuleInfo.WaferManager.Wafers.Count; i++) { ExtendSoltItemsSource.Add(i); } } else if ((int)ExtendSelectedModule == 5) { for (int i = 1; i <= LLBModuleInfo.WaferManager.Wafers.Count; i++) { ExtendSoltItemsSource.Add(i); } } else { ExtendSoltItemsSource.Add(1); } ExtendSoltSelectedIndex = 0; break; case "Retract": RetractSoltItemsSource.Clear(); if ((int)RetractSelectedModule == 4) { for (int i = 1; i <= LLAModuleInfo.WaferManager.Wafers.Count; i++) { RetractSoltItemsSource.Add(i); } //RetractSoltItemsSource = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; } else if ((int)RetractSelectedModule == 5) { for (int i = 1; i <= LLBModuleInfo.WaferManager.Wafers.Count; i++) { RetractSoltItemsSource.Add(i); } } else { RetractSoltItemsSource.Add(1); } RetractSoltSelectedIndex = 0; break; } } private void OnPick() { var moduleName= (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true); var selectedHand= (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true); if ((int)PickSelectedModule > 3) { InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.LLPick}", moduleName, PickSoltItemsSource[PickSoltSelectedIndex] - 1, selectedHand); } else { InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.PMPick}", moduleName, PickSoltItemsSource[PickSoltSelectedIndex] - 1, selectedHand); } } private void OnPlace() { var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true); var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true); if ((int)PlaceSelectedModule > 3) { InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.LLPlace}", moduleName, PlaceSoltItemsSource[PlaceSoltSelectedIndex]-1, selectedHand); } else { InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.PMPlace}", moduleName, PlaceSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand); } } private void OnHome() { InvokeClient.Instance.Service.DoOperation($"{m_ModuleCheckedName}.Home"); } private void OnVent() { InvokeClient.Instance.Service.DoOperation($"{m_ModuleCheckedName}.{RtOperation.Vent}"); } private void OnPump() { InvokeClient.Instance.Service.DoOperation($"{m_ModuleCheckedName}.{RtOperation.Pump}"); } private void OnPurge() { InvokeClient.Instance.Service.DoOperation($"{m_ModuleCheckedName}.{RtOperation.Purge}"); } private void OnModuleChecked(object obj) { m_ModuleCheckedName=obj.ToString(); } private void OnAbort() { InvokeClient.Instance.Service.DoOperation($"{m_ModuleCheckedName}.{RtOperation.Abort}"); } #endregion #region 私有方法 private void addDataKeys() { m_RtDataKeys.Add("PMA.IsSlitDoorClosed"); m_RtDataKeys.Add("PMB.IsSlitDoorClosed"); m_RtDataKeys.Add("PMC.IsSlitDoorClosed"); m_RtDataKeys.Add("PMD.IsSlitDoorClosed"); m_RtDataKeys.Add("TM.LLATSlitDoor.IsClosed"); m_RtDataKeys.Add("TM.LLBTSlitDoor.IsClosed"); //m_RtDataKeys.Add("TM.RobotMoveAction"); } #endregion } }