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.Linq; using System.Text; using System.Threading.Tasks; using Venus_Core; using Venus_Themes.CustomControls; using System.Windows.Threading; using Venus_MainPages.Unity; using Microsoft.VisualBasic; using ExcelLibrary.BinaryFileFormat; using MECF.Framework.Common.Schedulers; using Venus_MainPages.Views; using System.Windows; using static Venus_Themes.CustomControls.SERobot; using System.Security.RightsManagement; namespace Venus_MainPages.ViewModels { public class VenusSeOperationOverViewModel : BindableBase { #region 私有字段 private ModuleInfo m_VCE1ModuleInfo; private ModuleInfo m_PMAModuleInfo; private ModuleInfo m_PMBModuleInfo; private ModuleInfo m_PMCModuleInfo; private ModuleInfo m_VPAModuleInfo; private ModuleInfo m_TMModuleInfo; public WaferInfo m_PMAWafer; public WaferInfo m_PMBWafer; public WaferInfo m_PMCWafer; public WaferInfo m_RobotUpperWafer; public WaferInfo m_RobotLowerWafer; public WaferInfo m_PAWafer; private SERobotTAction m_Robot1TAction; private SERobotXAction m_Robot1XAction; private SERobotTAction m_Robot2TAction; private SERobotXAction m_Robot2XAction; public RobotMoveInfo m_robotMoveInfo; private int m_VCE1WaferCount; private bool m_PMAIsInstalled; private bool m_PMBIsInstalled; private bool m_PMCIsInstalled; private bool m_VCEIsInstalled; private bool m_VCEDoorIsOpen; private bool m_PMADoorIsOpen; private bool m_PMBDoorIsOpen; private bool m_PMCDoorIsOpen; private bool m_VCEOutDoorIsOpen; private Dictionary m_RtDataValues = new Dictionary(); private List m_RtDataKeys = new List(); private double m_PMAPercent; private double m_PMBPercent; private double m_PMCPercent; private double m_VCEPercent; private int m_PickNum; private RecipeResult m_PMARecipeResult; private RecipeResult m_PMBRecipeResult; private RecipeResult m_PMCRecipeResult; private WaferAssociationInfo m_VCEwaferAssociation; private bool loadflag; #endregion #region 属性 public SERobotTAction Robot1TAction { get { return m_Robot1TAction; } set { SetProperty(ref m_Robot1TAction, value); } } public SERobotXAction Robot1XAction { get { return m_Robot1XAction; } set { SetProperty(ref m_Robot1XAction, value); } } public SERobotTAction Robot2TAction { get { return m_Robot2TAction; } set { SetProperty(ref m_Robot2TAction, value); } } public SERobotXAction Robot2XAction { get { return m_Robot2XAction; } set { SetProperty(ref m_Robot2XAction, value); } } public RobotMoveInfo RobotMoveInfo { get { return m_robotMoveInfo; } set { RobotMoveInfoChanged(m_robotMoveInfo, value); m_robotMoveInfo = value; } } public RecipeResult PMARecipeResult { get { return m_PMARecipeResult; } set { SetProperty(ref m_PMARecipeResult, value); } } public RecipeResult PMBRecipeResult { get { return m_PMBRecipeResult; } set { SetProperty(ref m_PMBRecipeResult, value); } } public RecipeResult PMCRecipeResult { get { return m_PMCRecipeResult; } set { SetProperty(ref m_PMCRecipeResult, value); } } public double PMAPercent { get { return m_PMAPercent; } set { SetProperty(ref m_PMAPercent, value); } } public double PMBPercent { get { return m_PMBPercent; } set { SetProperty(ref m_PMBPercent, value); } } public double PMCPercent { get { return m_PMCPercent; } set { SetProperty(ref m_PMCPercent, value); } } public double VCEPercent { get { return m_VCEPercent; } set { SetProperty(ref m_VCEPercent, value); } } public int PickNum { get { return m_PickNum; } set { SetProperty(ref m_PickNum, 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 RobotUpperWafer { get { return m_RobotUpperWafer; } set { SetProperty(ref m_RobotUpperWafer, value); } } public WaferInfo RobotLowerWafer { get { return m_RobotLowerWafer; } set { SetProperty(ref m_RobotLowerWafer, value); } } public WaferInfo PAWafer { get { return m_PAWafer; } set { SetProperty(ref m_PAWafer, value); } } public ModuleInfo VCE1ModuleInfo { get { return m_VCE1ModuleInfo; } set { SetProperty(ref m_VCE1ModuleInfo, value); } } public ModuleInfo PMAModuleInfo { get { return m_PMAModuleInfo; } set { SetProperty(ref m_PMAModuleInfo, value); } } public ModuleInfo PMBModuleInfo { get { return m_PMBModuleInfo; } set { SetProperty(ref m_PMBModuleInfo, value); } } public ModuleInfo PMCModuleInfo { get { return m_PMCModuleInfo; } set { SetProperty(ref m_PMCModuleInfo, value); } } public ModuleInfo VPAModuleInfo { get { return m_VPAModuleInfo; } set { SetProperty(ref m_VPAModuleInfo, value); } } public ModuleInfo TMModuleInfo { get { return m_TMModuleInfo; } set { SetProperty(ref m_TMModuleInfo, value); } } public bool PMAIsInstalled { get { return m_PMAIsInstalled; } set { SetProperty(ref m_PMAIsInstalled, value); } } public bool PMBIsInstalled { get { return m_PMBIsInstalled; } set { SetProperty(ref m_PMBIsInstalled, value); } } public bool PMCIsInstalled { get { return m_PMCIsInstalled; } set { SetProperty(ref m_PMCIsInstalled, value); } } public bool VCEIsInstalled { get { return m_VCEIsInstalled; } set { SetProperty(ref m_VCEIsInstalled, value); } } public bool VCEDoorIsOpen { get => m_VCEDoorIsOpen; set => SetProperty(ref m_VCEDoorIsOpen, value); } public bool PMADoorIsOpen { get => m_PMADoorIsOpen; set => SetProperty(ref m_PMADoorIsOpen, value); } public bool PMBDoorIsOpen { get => m_PMBDoorIsOpen; set => SetProperty(ref m_PMBDoorIsOpen, value); } public bool PMCDoorIsOpen { get => m_PMCDoorIsOpen; set => SetProperty(ref m_PMCDoorIsOpen, value); } public bool VCEOutDoorIsOpen { get => m_VCEOutDoorIsOpen; set => SetProperty(ref m_VCEOutDoorIsOpen, value); } public int VCE1WaferCount { get { return m_VCE1WaferCount; } set { SetProperty(ref m_VCE1WaferCount, value); } } public Dictionary RtDataValues { get { return m_RtDataValues; } set { SetProperty(ref m_RtDataValues, value); } } public WaferAssociationInfo VCEwaferAssociation { get { return m_VCEwaferAssociation; } set { SetProperty(ref m_VCEwaferAssociation, value); } } #endregion #region 命令 private DelegateCommand _HomeAll; public DelegateCommand HomeAll => _HomeAll ?? (_HomeAll = new DelegateCommand(onHomeAll)); private DelegateCommand _SetAutoMode; public DelegateCommand SetAutoMode => _SetAutoMode ?? (_SetAutoMode = new DelegateCommand(onSetAutoMode)); private DelegateCommand _SetManualMode; public DelegateCommand SetManualMode => _SetManualMode ?? (_SetManualMode = new DelegateCommand(onSetManualMode)); private DelegateCommand _StartSETMCycle; public DelegateCommand StartSETMCycle => _StartSETMCycle ?? (_StartSETMCycle = new DelegateCommand(onStartSETMCycle)); private DelegateCommand _StartCommand; public DelegateCommand StartCommand => _StartCommand ?? (_StartCommand = new DelegateCommand(OnStart)); private DelegateCommand _StopCycle; public DelegateCommand StopCycle => _StopCycle ?? (_StopCycle = new DelegateCommand(onStopCycle)); private DelegateCommand _VCEHome; public DelegateCommand VCEHome => _VCEHome ?? (_VCEHome = new DelegateCommand(vceHome)); private DelegateCommand _VCEReadMap; public DelegateCommand VCEReadMap => _VCEReadMap ?? (_VCEReadMap = new DelegateCommand(vceReadMap)); private DelegateCommand _VCELoadPrepare; public DelegateCommand VCELoadPrepare => _VCELoadPrepare ?? (_VCELoadPrepare = new DelegateCommand(vceLoadPrepare)); private DelegateCommand __VCELoad; public DelegateCommand VCELoad => __VCELoad ?? (__VCELoad = new DelegateCommand(vceLoad)); private DelegateCommand __VCELoadWithSMIF; public DelegateCommand VCELoadWithSMIF => __VCELoadWithSMIF ?? (__VCELoadWithSMIF = new DelegateCommand(vceLoadWithSMIF)); private DelegateCommand __VCEUnLoadWithSMIF; public DelegateCommand VCEUnLoadWithSMIF => __VCEUnLoadWithSMIF ?? (__VCEUnLoadWithSMIF = new DelegateCommand(vceUnLoadWithSMIF)); private DelegateCommand _VCEUnLoad; public DelegateCommand VCEUnLoad => _VCEUnLoad ?? (_VCEUnLoad = new DelegateCommand(vceUnLoad)); private DelegateCommand _SMIFLoad; public DelegateCommand SMIFLoad => _SMIFLoad ?? (_SMIFLoad = new DelegateCommand(smifLoad)); private DelegateCommand _SMIFULoad; public DelegateCommand SMIFULoad => _SMIFULoad ?? (_SMIFULoad = new DelegateCommand(smifUnLoad)); private DelegateCommand _tmhome; public DelegateCommand TmHome => _tmhome ?? (_tmhome = new DelegateCommand(tmhome)); private DelegateCommand _tmPick; public DelegateCommand TmPick => _tmPick ?? (_tmPick = new DelegateCommand(tmpick)); private DelegateCommand _tmPlace; public DelegateCommand TMPlace => _tmPlace ?? (_tmPlace = new DelegateCommand(tmplace)); //private DelegateCommand _tmSave; private DelegateCommand _LoadCommand; public DelegateCommand LoadCommand => _LoadCommand ?? (_LoadCommand = new DelegateCommand(OnLoad)); private DelegateCommand _PauseAllJobCommand; public DelegateCommand PauseAllJobCommand => _PauseAllJobCommand ?? (_PauseAllJobCommand = new DelegateCommand(OnPauseAllJob)); private DelegateCommand _AbortAllCommand; public DelegateCommand AbortAllCommand => _AbortAllCommand ?? (_AbortAllCommand = new DelegateCommand(OnAbortAll)); private DelegateCommand _SetSequenceCommand; public DelegateCommand SetSequenceCommand => _SetSequenceCommand ?? (_SetSequenceCommand = new DelegateCommand(OnSetSequence)); private DelegateCommand _CreateJobCommand; public DelegateCommand CreateJobCommand => _CreateJobCommand ?? (_CreateJobCommand = new DelegateCommand(OnCreateJob)); private DelegateCommand _SelectAllCommand; public DelegateCommand SelectAllCommand => _SelectAllCommand ?? (_SelectAllCommand = new DelegateCommand(OnSelectAll)); private DelegateCommand _ReturnAllWafer; public DelegateCommand ReturnAllWafer => _ReturnAllWafer ?? (_ReturnAllWafer = new DelegateCommand(OnReturnAllWafer)); #endregion #region 构造函数 public VenusSeOperationOverViewModel() { //页面不刷错的方法 页面中的PM做成List的形式 通过itemsource显示 同时提供各个位置的pm点位 旋转角度 VCE1WaferCount = 25; string[] allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString().Split(','); PMAIsInstalled = allModules.Contains("PMA"); PMBIsInstalled = allModules.Contains("PMB"); PMCIsInstalled = allModules.Contains("PMC"); VCEIsInstalled = allModules.Contains("VCE1"); addDataKeys(); RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys); VCEDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.VCESlitDoorClosed"); PMADoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.PMASlitDoorClosed"); PMBDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.PMBSlitDoorClosed"); PMCDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.PMCSlitDoorClosed"); VCEOutDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "VCE1.VCEOutDoorClosed"); loadflag = false; DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(0.1); timer.Tick += Timer_Tick; timer.Start(); } #endregion #region 命令实现 private void OnLoad() { if (VCEIsInstalled && !loadflag) { VCEwaferAssociation = new WaferAssociationInfo { ModuleData = ModuleManager.ModuleInfos["VCE1"] }; loadflag = true; } } private void OnSelectAll(object obj) { var info = obj as WaferAssociationInfo; info.SlotFrom = 1; info.SlotTo = 25; AssociateSequence(info, true); } private void OnReturnAllWafer(object obj) { WaferDialogView dialog = new WaferDialogView() { Owner = Application.Current.MainWindow, }; dialog.Height = 300; dialog.Width = 400; double angel = 0; double coolingtime = 0; string message = "Please Confirm Return Wafer"; WaferDialogViewModel vm = new WaferDialogViewModel(); vm.ConfirmText = message; dialog.DataContext = vm; if (dialog.ShowDialog() == true) { if ((bool)dialog.AlignFlag == true && !string.IsNullOrEmpty(dialog.Angle)) { angel = Convert.ToDouble(dialog.Angle); } if ((bool)dialog.CoolingFlag == true && !string.IsNullOrEmpty(dialog.CoolingTime)) { coolingtime = Convert.ToDouble(dialog.CoolingTime); } InvokeClient.Instance.Service.DoOperation("System.ReturnAllSEWafer", dialog.CoolingFlag, coolingtime, dialog.AlignFlag, angel); } } private void OnCreateJob(object obj) { var info = obj as WaferAssociationInfo; List slotSequence = new List(); info.ModuleData.WaferManager.Wafers.ForEach(key => { slotSequence.Insert(0, key.SequenceName); }); string jobId = info.LotId.Trim(); if (string.IsNullOrEmpty(jobId)) jobId = "CJ_Local_" + info.ModuleData.ModuleID; info.LotId = jobId; info.JobID = jobId; info.JobStatus = "WaitingForStart"; info.LotIdSaved = true; Dictionary param = new Dictionary() { {"JobId", jobId}, {"Module", info.ModuleData.ModuleID}, {"SlotSequence", slotSequence.ToArray()}, {"AutoStart", true}, }; InvokeClient.Instance.Service.DoOperation("System.CreateSEJob", param); } private void OnSetSequence(object obj) { var info = obj as WaferInfo; bool flag = info.SequenceName != "" ? false : true; if (info.ModuleID == "VCE1") { AssociateSequence(VCEwaferAssociation, flag, info.SlotID); } } private void OnPauseAllJob() { InvokeClient.Instance.Service.DoOperation("System.PauseJob", VCEwaferAssociation.JobID); } private void OnAbortAll() { InvokeClient.Instance.Service.DoOperation("System.SEAbort"); } private void AssociateSequence(WaferAssociationInfo info, bool flag, int slot = -1) { List wafers = info.ModuleData.WaferManager.Wafers; if (slot >= 0) //by wafer { int index = wafers.Count - slot - 1; if (index < wafers.Count) { //has wafer if (flag && !(wafers[index].WaferStatus == 0)) wafers[index].SequenceName = info.SequenceName; else wafers[index].SequenceName = string.Empty; } } else //by from-to { for (int i = info.SlotFrom - 1; i < info.SlotTo; i++) { int index = wafers.Count - i - 1; if (index < wafers.Count) { if (flag && !(wafers[index].WaferStatus == 0)) wafers[index].SequenceName = info.SequenceName; else wafers[index].SequenceName = string.Empty; } } } if (VCEIsInstalled) { VCEwaferAssociation = info; } } private void addDataKeys() { m_RtDataKeys.Add($"SETM.VCESlitDoorClosed"); m_RtDataKeys.Add($"SETM.PMASlitDoorClosed"); m_RtDataKeys.Add($"SETM.PMBSlitDoorClosed"); m_RtDataKeys.Add($"SETM.PMCSlitDoorClosed"); m_RtDataKeys.Add($"SETM.VCEPressure.Value"); m_RtDataKeys.Add($"VCE1.VCEOutDoorClosed"); m_RtDataKeys.Add($"VCE1.CassetteArrive"); m_RtDataKeys.Add($"SEScheduler.CycledWafer"); m_RtDataKeys.Add($"SEScheduler.CycleSetPoint"); m_RtDataKeys.Add($"SEScheduler.CycleCount"); m_RtDataKeys.Add($"SEScheduler.ThroughPut"); if (PMAIsInstalled) { m_RtDataKeys.Add($"PMA.ChamberPressure"); m_RtDataKeys.Add($"PMA.VentingFlag"); m_RtDataKeys.Add($"PMA.CurrentRecipeResult"); } if (PMBIsInstalled) { m_RtDataKeys.Add($"PMB.ChamberPressure"); m_RtDataKeys.Add($"PMB.VentingFlag"); m_RtDataKeys.Add($"PMB.CurrentRecipeResult"); } if (PMCIsInstalled) { m_RtDataKeys.Add($"PMC.ChamberPressure"); m_RtDataKeys.Add($"PMC.VentingFlag"); m_RtDataKeys.Add($"PMC.CurrentRecipeResult"); } } private void onHomeAll() { InvokeClient.Instance.Service.DoOperation("System.HomeAll"); } private void onSetAutoMode() { InvokeClient.Instance.Service.DoOperation("System.SetAutoMode"); } private void onSetManualMode() { InvokeClient.Instance.Service.DoOperation("System.SetManualMode"); } private void onStopCycle() { InvokeClient.Instance.Service.DoOperation("System.StopSECycle"); } private void onStartSETMCycle() { List stations = new List(); stations.Add("VCE1"); stations.Add("VPA"); if (PMAIsInstalled) { stations.Add("PMA"); } if (PMBIsInstalled) { stations.Add("PMB"); } if (PMCIsInstalled) { stations.Add("PMC"); } stations.Add("VCE1"); InvokeClient.Instance.Service.DoOperation("System.SETMCycle", stations.ToArray(), 1); } private void OnStart(object obj) { var info = obj as WaferAssociationInfo; InvokeClient.Instance.Service.DoOperation("System.StartSEJob", info.LotId); } private void vceHome() { InvokeClient.Instance.Service.DoOperation("VCE1.HOME"); } private void vceReadMap() { InvokeClient.Instance.Service.DoOperation("VCE1.ReadMap"); } private void vceLoadPrepare() { InvokeClient.Instance.Service.DoOperation("VCE1.LoadPrepare"); } private void vceLoad() { InvokeClient.Instance.Service.DoOperation("VCE1.SafeLoad"); } private void vceLoadWithSMIF() { InvokeClient.Instance.Service.DoOperation("VCE1.LoadWithSMIF"); } private void vceUnLoadWithSMIF() { InvokeClient.Instance.Service.DoOperation("VCE1.UnLoadWithSMIF"); } private void vceUnLoad() { InvokeClient.Instance.Service.DoOperation("VCE1.SafeUnload"); } private void smifLoad() { } private void smifUnLoad() { } private void tmhome() { InvokeClient.Instance.Service.DoOperation("SETM.Home"); } private void tmpick() { ModuleName target = ModuleName.VCE1; int slot = PickNum; MoveItem moveItem = new MoveItem(target, slot - 1, ModuleName.TMRobot, 0, 0); Queue que = new Queue(); que.Enqueue(moveItem); InvokeClient.Instance.Service.DoOperation("SETM.Pick", que); } private void tmplace() { ModuleName target = ModuleName.VCE1; int slot = PickNum; MoveItem moveItem = new MoveItem( ModuleName.TMRobot, 0, target, slot - 1, 0); Queue que = new Queue(); que.Enqueue(moveItem); InvokeClient.Instance.Service.DoOperation("SETM.Place", que); } #endregion #region 私有方法 private void Timer_Tick(object sender, EventArgs e) { try { RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys); VCEDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.VCESlitDoorClosed"); PMADoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.PMASlitDoorClosed"); PMBDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.PMBSlitDoorClosed"); PMCDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "SETM.PMCSlitDoorClosed"); VCEOutDoorIsOpen = !CommonFunction.GetValue(RtDataValues, "VCE1.VCEOutDoorClosed"); VCEPercent = CommonFunction.GetValue(RtDataValues, "SETM.VCEPressure.Value") * 260 / 750000; if (PMAIsInstalled == true) { PMAModuleInfo = ModuleManager.ModuleInfos["PMA"]; PMAWafer = PMAModuleInfo.WaferManager.Wafers[0]; PMAPercent = CommonFunction.GetValue(RtDataValues, "PMA.ChamberPressure") * 260 / 750000; PMARecipeResult = CommonFunction.GetValue(RtDataValues, "PMA.CurrentRecipeResult"); } if (PMBIsInstalled == true) { PMBModuleInfo = ModuleManager.ModuleInfos["PMB"]; PMBWafer = PMBModuleInfo.WaferManager.Wafers[0]; PMBPercent = CommonFunction.GetValue(RtDataValues, "PMB.ChamberPressure") * 260 / 750000; PMBRecipeResult = CommonFunction.GetValue(RtDataValues, "PMB.CurrentRecipeResult"); } if (PMCIsInstalled == true) { PMCModuleInfo = ModuleManager.ModuleInfos["PMC"]; PMCWafer = PMCModuleInfo.WaferManager.Wafers[0]; PMCPercent = CommonFunction.GetValue(RtDataValues, "PMC.ChamberPressure") * 260 / 750000; PMCRecipeResult = CommonFunction.GetValue(RtDataValues, "PMC.CurrentRecipeResult"); } if (VCEIsInstalled == true) { VCE1ModuleInfo = ModuleManager.ModuleInfos["VCE1"]; } RobotMoveInfo = (RobotMoveInfo)QueryDataClient.Instance.Service.GetData("SETM.RobotMoveAction"); TMModuleInfo = ModuleManager.ModuleInfos["TMRobot"]; RobotUpperWafer = TMModuleInfo.WaferManager.Wafers[0]; RobotLowerWafer = TMModuleInfo.WaferManager.Wafers[1]; PAWafer = ModuleManager.ModuleInfos["VPA"].WaferManager.Wafers[0]; } catch { } } #endregion private async void RobotMoveInfoChanged(RobotMoveInfo oldValue, RobotMoveInfo newValue) { string RobotTarget; if (oldValue == null || newValue == null) { return; } #region Rotating if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && (newValue.Action == RobotAction.Rotating)) { var TMRobotMoveActionBladeTarget = newValue.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 = (SERobotTAction)Enum.Parse(typeof(SERobotTAction), module, true); } else if (arm == "ArmB") { Robot2TAction = (SERobotTAction)Enum.Parse(typeof(SERobotTAction), module, true); } } #endregion #region VPA、VCE1 Pick、Place else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && (newValue.Action == RobotAction.Placing || newValue.Action == RobotAction.Picking)) { var TMRobotMoveActionBladeTarget = newValue.BladeTarget; if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; var module = values[1]; if (arm == "ArmA") { var SERobotTAction = (SERobotTAction)Enum.Parse(typeof(SERobotTAction), module, true); if (SERobotTAction != Robot1TAction) { Robot1TAction = SERobotTAction; } else { //await Task.Delay(100); } await Task.Delay(600); if (module == "VCE1") { Robot1XAction = SERobotXAction.ToVCE; } else { Robot1XAction = SERobotXAction.Extend; } while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus == 0)) { await Task.Delay(100); } Robot1XAction = SERobotXAction.Retract; } else if (arm == "ArmB") { var waferRobotTAction = (SERobotTAction)Enum.Parse(typeof(SERobotTAction), module, true); if (waferRobotTAction != Robot2TAction) { Robot2TAction = waferRobotTAction; } else { //await Task.Delay(100); } await Task.Delay(600); if (module == "VCE1") { Robot2XAction = SERobotXAction.ToVCE2; } else { Robot2XAction = SERobotXAction.Extend2; } while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus == 0)) { await Task.Delay(100); } Robot2XAction = SERobotXAction.Retract2; } } #endregion #region PM pick、PM place else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && newValue.Action == RobotAction.Extending) { var TMRobotMoveActionBladeTarget = newValue.BladeTarget; if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; var module = values[1]; if (arm == "ArmA") { var SERobotTAction = (SERobotTAction)Enum.Parse(typeof(SERobotTAction), module, true); if (SERobotTAction != Robot1TAction) { Robot1TAction = SERobotTAction; } else { // await Task.Delay(100); } await Task.Delay(600); Robot1XAction = SERobotXAction.Extend; } else if (arm == "ArmB") { var SERobotTAction = (SERobotTAction)Enum.Parse(typeof(SERobotTAction), module, true); if (SERobotTAction != Robot2TAction) { Robot2TAction = SERobotTAction; } else { // await Task.Delay(100); } await Task.Delay(600); Robot2XAction = SERobotXAction.Extend2; } } else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && newValue.Action == RobotAction.Retracting) { var TMRobotMoveActionBladeTarget = newValue.BladeTarget; if (TMRobotMoveActionBladeTarget != null) { RobotTarget = TMRobotMoveActionBladeTarget.ToString(); } else { return; } var values = RobotTarget.Split('.'); var arm = values[0]; if (arm == "ArmA") { Robot1XAction = SERobotXAction.Retract; } else if (arm == "ArmB") { Robot2XAction = SERobotXAction.Retract2; } } #endregion #region Home else if (oldValue.Action == RobotAction.None && newValue.Action == RobotAction.Homing) { if (Robot1XAction == SERobotXAction.Extend) { Robot1XAction = SERobotXAction.Retract; } if (Robot2XAction == SERobotXAction.Extend2) { Robot2XAction = SERobotXAction.Retract2; } await Task.Delay(2000); if (Robot1TAction != SERobotTAction.T_Origin) { Robot1TAction = SERobotTAction.T_Origin; } if (Robot2TAction != SERobotTAction.T_Origin) { Robot2TAction = SERobotTAction.T_Origin; } } #endregion } } }