using Aitex.Core.Common; using Aitex.Core.UI.MVVM; using Aitex.Core.Util; using Aitex.Core.Utilities; using LiveCharts; using MECF.Framework.Common.Beckhoff.AxisProvider; using MECF.Framework.Common.Beckhoff.Station; using MECF.Framework.Common.CommonData.Loader; using MECF.Framework.Common.CommonData.PUF; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.Utilities; using OpenSEMI.ClientBase; using CyberX8_MainPages.Unity; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers; using System.Windows; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Threading; using WaferInfo = OpenSEMI.ClientBase.WaferInfo; namespace CyberX8_MainPages.ViewModels { public class LoaderSetupViewModel : BindableBase { #region 常量 private const string MOTION_DATA = "MotionData"; private const string IS_SWITCH_ON = "IsSwitchOn"; private const string CURRENT_STATION = "CurrentStation"; private const string SIDE_DATA = "SideData"; private const string COMMON_DATA = "CommonData"; private const string MOTOR_POSITION = "MotorPosition"; private const string CURRENT_OPERATION = "CurrentOperation"; private const double LOADER_ROTATION_DIFFER = 90; #endregion #region 内部变量 #region shuttleA /// /// shuttleA模块名称 /// private string _shuttleAModuleName; /// /// shuttleA运动数据 /// private CommandMotionData _shuttleAMotorData; /// /// shuttleA当前位置 /// private string _shuttleACurrentStation; #endregion #region TiltA /// /// tiltA模块名称 /// private string _tiltAModuleName; /// /// tiltA运动数据 /// private CommandMotionData _tiltAMotorData; /// /// tiltA当前位置 /// private string _tiltACurrentStation; /// /// Loader1 TiltA实际位置数据 /// private double _loader1TiltAMotorPosition; #endregion #region CRSA /// /// crsA模块名称 /// private string _crsAModuleName; /// /// CRSA运动数据 /// private CommandMotionData _crsAMotorData; /// /// crsA当前位置 /// private string _crsACurrentStation; #endregion #region Rotation /// /// rotation模块名称 /// private string _rotationModuleName; /// /// rotation运动数据 /// private CommandMotionData _rotationMotorData; /// /// rotation当前位置 /// private string _rotationCurrentStation; /// /// Loader1 Rotation UI对应位置 /// private double _loader1RotationPosition; /// /// Loader1 Rotation实际位置数据 /// private double _loader1RotationMotorPosition; #endregion #region shuttleB /// /// shuttleB模块名称 /// private string _shuttleBModuleName; /// /// shuttleB运动数据 /// private CommandMotionData _shuttleBMotorData; /// /// shuttleB当前位置 /// private string _shuttleBCurrentStation; #endregion #region TiltB /// /// tiltB模块名称 /// private string _tiltBModuleName; /// /// tiltB运动数据 /// private CommandMotionData _tiltBMotorData; /// /// tiltB当前位置 /// private string _tiltBCurrentStation; /// /// Loader1 TiltB实际位置数据 /// private double _loader1TiltBMotorPosition; #endregion #region CRSB /// /// crsB模块名称 /// private string _crsBModuleName; /// /// crsB运动数据 /// private CommandMotionData _crsBMotorData; /// /// crsB当前位置 /// private string _crsBCurrentStation; #endregion #region SideA /// /// Side A模块名称 /// private string _sideAModuleName; /// /// Side A数据 /// private LoaderSideData _sideAData; #endregion #region SideB /// /// Side B模块名称 /// private string _sideBModuleName; /// /// Side B数据 /// private LoaderSideData _sideBData; #endregion #region Common /// /// Common模块名称 /// private string _commonModuleName; /// /// 公共模块数据 /// public LoaderCommonData _commonData; #endregion #region 系统数据 /// /// Wafer尺寸 /// private int _waferSize = 0; /// /// 查询后台数据集合 /// private List _rtDataKeys = new List(); /// /// Busy状态 /// private bool _isBusy; /// /// CRSH状态 /// private bool _isCRSH; /// /// label系列 /// private ChartValues _labelSeries; /// /// Value系列 /// private ChartValues _valueSeries; /// /// 定时器 /// DispatcherTimer _timer; /// /// rt查询key数值字典 /// private Dictionary _rtDataValueDic = new Dictionary(); /// /// PlateOutCamera Enable /// private Visibility _plateOutCameraVisibility = Visibility.Hidden; /// /// Loader的sideA开启状态 /// private bool m_loaderWaferVisibleA = false; /// /// Loader的sideB开启状态 /// private bool m_loaderWaferVisibleB = false; /// /// WaferA信息 /// private WaferInfo m_loaderWaferA; /// /// WaferB信息 /// private WaferInfo m_loaderWaferB; /// /// Loader模块信息 /// private ModuleInfo _loaderModuleInfo; /// /// Loader是否安装 /// private bool _loaderInstalled; /// /// 当前SideA操作 /// private string _currentSideAOperation; /// /// 当前SideA操作 /// private string _currentSideBOperation; #endregion #endregion #region 属性 #region 系统数据 public string Module { get; set; } /// /// 尺寸大小 /// public int WaferSize { get { return _waferSize; } set { SetProperty(ref _waferSize, value); } } /// /// Busy状态 /// public bool IsBusy { get { return _isBusy; } set { SetProperty(ref _isBusy, value); } } /// /// CRSH状态 /// public bool IsCRSH { get { return _isCRSH; } set { SetProperty(ref _isCRSH, value); } } /// /// Label系列 /// public ChartValues LabelSeries { get { return _labelSeries; } set { SetProperty(ref _labelSeries, value); } } /// /// Value系列 /// public ChartValues ValueSeries { get { return _valueSeries; } set { SetProperty(ref _valueSeries, value); } } /// /// Loader的sideA开启状态 /// public bool LoaderWaferVisibleA { get { return m_loaderWaferVisibleA; } set { SetProperty(ref m_loaderWaferVisibleA, value); } } /// /// Loader的sideB开启状态 /// public bool LoaderWaferVisibleB { get { return m_loaderWaferVisibleB; } set { SetProperty(ref m_loaderWaferVisibleB, value); } } /// /// WaferA信息 /// public WaferInfo LoaderWaferA { get { return m_loaderWaferA; } set { SetProperty(ref m_loaderWaferA, value); } } /// /// WaferB信息 /// public WaferInfo LoaderWaferB { get { return m_loaderWaferB; } set { SetProperty(ref m_loaderWaferB, value); } } /// /// Loader模块信息 /// public ModuleInfo LoaderModuleInfo { get { return _loaderModuleInfo; } set { SetProperty(ref _loaderModuleInfo, value); } } /// /// Loader是否安装 /// public bool LoaderIsInstalled { get { return _loaderInstalled; } set { SetProperty(ref _loaderInstalled, value); } } /// /// 当前SideA操作 /// public string CurrentSideAOperation { get { return _currentSideAOperation; } set { SetProperty(ref _currentSideAOperation, value); } } /// /// 当前SideB操作 /// public string CurrentSideBOperation { get { return _currentSideBOperation; } set { SetProperty(ref _currentSideBOperation, value); } } #endregion #region shuttleA /// /// shuttleA名称 /// public string ShuttleAModuleName { get { return _shuttleAModuleName; } set { SetProperty(ref _shuttleAModuleName, value); } } /// /// shuttleA运动数据 /// public CommandMotionData ShuttleAMotionData { get { return _shuttleAMotorData; } set { SetProperty(ref _shuttleAMotorData, value); } } /// /// shuttleA当前位置 /// public string ShuttleACurrentStation { get { return _shuttleACurrentStation; } set { SetProperty(ref _shuttleACurrentStation, value); } } #endregion #region TiltA /// /// TiltA名称 /// public string TiltAModuleName { get { return _tiltAModuleName; } set { SetProperty(ref _tiltAModuleName, value); } } /// /// TiltA运动数据 /// public CommandMotionData TiltAMotionData { get { return _tiltAMotorData; } set { SetProperty(ref _tiltAMotorData, value); } } /// /// TiltA当前位置 /// public string TiltACurrentStation { get { return _tiltACurrentStation; } set { SetProperty(ref _tiltACurrentStation, value); } } /// /// Loader1 TiltA实际位置数据 /// public double Loader1TiltAMotorPosition { get { return _loader1TiltAMotorPosition; } set { SetProperty(ref _loader1TiltAMotorPosition, value); } } #endregion #region CRSA /// /// CRSA名称 /// public string CRSAModuleName { get { return _crsAModuleName; } set { SetProperty(ref _crsAModuleName, value); } } /// /// CRSA运动数据 /// public CommandMotionData CRSAMotionData { get { return _crsAMotorData; } set { SetProperty(ref _crsAMotorData, value); } } /// /// CRSA当前位置 /// public string CRSACurrentStation { get { return _crsACurrentStation; } set { SetProperty(ref _crsACurrentStation, value); } } #endregion #region Rotation /// /// Rotation名称 /// public string RotationModuleName { get { return _rotationModuleName; } set { SetProperty(ref _rotationModuleName, value); } } /// /// Rotation运动数据 /// public CommandMotionData RotationMotionData { get { return _rotationMotorData; } set { SetProperty(ref _rotationMotorData, value); } } /// /// Loader1 Rotation UI对应位置 /// public double Loader1RotationPosition { get { return _loader1RotationPosition; } set { SetProperty(ref _loader1RotationPosition, value); } } /// /// Rotation当前位置 /// public string RotationCurrentStation { get { return _rotationCurrentStation; } set { SetProperty(ref _rotationCurrentStation, value); } } /// /// Loader1 Rotation实际位置数据 /// public double Loader1RotationMotorPosition { get { return _loader1RotationMotorPosition; } set { SetProperty(ref _loader1RotationMotorPosition, value); } } #endregion #region shuttleB /// /// shuttleB名称 /// public string ShuttleBModuleName { get { return _shuttleBModuleName; } set { SetProperty(ref _shuttleBModuleName, value); } } /// /// shuttleB运动数据 /// public CommandMotionData ShuttleBMotionData { get { return _shuttleBMotorData; } set { SetProperty(ref _shuttleBMotorData, value); } } /// /// shuttleB当前位置 /// public string ShuttleBCurrentStation { get { return _shuttleBCurrentStation; } set { SetProperty(ref _shuttleBCurrentStation, value); } } #endregion #region TiltB /// /// TiltB名称 /// public string TiltBModuleName { get { return _tiltBModuleName; } set { SetProperty(ref _tiltBModuleName, value); } } /// /// TiltB运动数据 /// public CommandMotionData TiltBMotionData { get { return _tiltBMotorData; } set { SetProperty(ref _tiltBMotorData, value); } } /// /// TiltB当前位置 /// public string TiltBCurrentStation { get { return _tiltBCurrentStation; } set { SetProperty(ref _tiltBCurrentStation, value); } } /// /// Loader1 TiltB实际位置数据 /// public double Loader1TiltBMotorPosition { get { return _loader1TiltBMotorPosition; } set { SetProperty(ref _loader1TiltBMotorPosition, value); } } #endregion #region CRSB /// /// CRSB名称 /// public string CRSBModuleName { get { return _crsBModuleName; } set { SetProperty(ref _crsBModuleName, value); } } /// /// CRSB运动数据 /// public CommandMotionData CRSBMotionData { get { return _crsBMotorData; } set { SetProperty(ref _crsBMotorData, value); } } /// /// CRSB当前位置 /// public string CRSBCurrentStation { get { return _crsBCurrentStation; } set { SetProperty(ref _crsBCurrentStation, value); } } #endregion #region Side A /// /// Side A模块名称 /// public string SideAModuleName { get { return _sideAModuleName; } set { SetProperty(ref _sideAModuleName, value); } } /// /// Side A数据 /// public LoaderSideData SideAData { get { return _sideAData; } set { SetProperty(ref _sideAData, value); } } #endregion #region Side B /// /// Side B模块名称 /// public string SideBModuleName { get { return _sideBModuleName; } set { SetProperty(ref _sideBModuleName, value); } } /// /// Side B数据 /// public LoaderSideData SideBData { get { return _sideBData; } set { SetProperty(ref _sideBData, value); } } #endregion #region Common /// /// Common模块名称 /// public string CommonModuleName { get { return _commonModuleName; } set { SetProperty(ref _commonModuleName, value); } } /// /// 公共数据 /// public LoaderCommonData CommonData { get { return _commonData; } set { SetProperty(ref _commonData, value);} } /// /// PlateOut Camera Enable /// public Visibility PlateOutCameraVisibility { get { return _plateOutCameraVisibility; } set { SetProperty(ref _plateOutCameraVisibility, value);} } #endregion #endregion #region 指令 [IgnorePropertyChange] public ICommand SideALoadCommand { get; private set; } [IgnorePropertyChange] public ICommand SideAUnloadCommand { get; private set; } [IgnorePropertyChange] public ICommand SideAInstallCRSCommand { get;private set; } [IgnorePropertyChange] public ICommand SideBLoadCommand { get; private set; } [IgnorePropertyChange] public ICommand SideBUnloadCommand { get; private set; } [IgnorePropertyChange] public ICommand SideBInstallCRSCommand { get; private set; } #endregion /// /// 构造函数 /// public LoaderSetupViewModel() { SideALoadCommand=new DelegateCommand(SideALoadAction); SideAUnloadCommand = new DelegateCommand(SideAUnloadAction); SideAInstallCRSCommand = new DelegateCommand(SideAInstallCRSAction); SideBLoadCommand = new DelegateCommand(SideBLoadAction); SideBUnloadCommand = new DelegateCommand(SideBUnloadAction); SideBInstallCRSCommand = new DelegateCommand(SideBInstallCRSAction); } /// /// 加载数据 /// public void LoadData(string systemName) { Module = systemName; ShuttleAModuleName = $"{Module}.ShuttleA"; TiltAModuleName = $"{Module}.TiltA"; CRSAModuleName = $"{Module}.LSA"; RotationModuleName = $"{Module}.Rotation"; ShuttleBModuleName = $"{Module}.ShuttleB"; TiltBModuleName = $"{Module}.TiltB"; CRSBModuleName = $"{Module}.LSB"; SideAModuleName = $"{Module}.SideA"; SideBModuleName = $"{Module}.SideB"; CommonModuleName = $"{Module}.Common"; bool plateOutCameraEnable= (bool)QueryDataClient.Instance.Service.GetConfig($"{ModuleName.Loader1}.PlateOutCameraEnable"); if(plateOutCameraEnable) { PlateOutCameraVisibility = Visibility.Visible; } else { PlateOutCameraVisibility = Visibility.Hidden; } //LoaderIsinstalled Dictionary allModulesDictionary = QueryDataClient.Instance.Service.PollData(new List() { "System.InstalledModules" }); if (allModulesDictionary != null) { List allModules = CommonFunction.GetValue>(allModulesDictionary, "System.InstalledModules"); LoaderIsInstalled = allModules.Contains(ModuleName.Loader1.ToString()); } WaferSize = (int)QueryDataClient.Instance.Service.GetConfig("System.WaferSize"); AddDataKeys(); ValueSeries = new ChartValues(); LabelSeries = new ChartValues(); if (_timer == null) { _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromMilliseconds(100); _timer.Tick += Timer_Tick; } _timer.Start(); } /// /// 定时器 /// /// /// private void Timer_Tick(object sender, EventArgs e) { LoaderModuleInfo = ModuleManager.ModuleInfos["Loader1"]; if (LoaderIsInstalled && LoaderModuleInfo != null) { if (LoaderModuleInfo.WaferManager.Wafers.Count != 0) { LoaderWaferA = LoaderModuleInfo.WaferManager.Wafers[0]; } if (LoaderModuleInfo.WaferManager.Wafers.Count != 0) { LoaderWaferB = LoaderModuleInfo.WaferManager.Wafers[1]; } } if (_rtDataKeys.Count != 0) { _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys); if (_rtDataValueDic != null) { //SRD Wafer信息 if (ModuleManager.ModuleInfos[$"{Module}"].WaferManager.Wafers.Count != 0) { LoaderWaferA = ModuleManager.ModuleInfos[$"{Module}"].WaferManager.Wafers[0]; LoaderWaferB = ModuleManager.ModuleInfos[$"{Module}"].WaferManager.Wafers[1]; } ShuttleAMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{ShuttleAModuleName}.{MOTION_DATA}"); ShuttleACurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{ShuttleAModuleName}.{CURRENT_STATION}"), ShuttleAModuleName); ShuttleBMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{ShuttleBModuleName}.{MOTION_DATA}"); ShuttleBCurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{ShuttleBModuleName}.{CURRENT_STATION}"), ShuttleBModuleName); TiltAMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{TiltAModuleName}.{MOTION_DATA}"); TiltACurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{TiltAModuleName}.{CURRENT_STATION}"), TiltAModuleName); TiltBMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{TiltBModuleName}.{MOTION_DATA}"); TiltBCurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{TiltBModuleName}.{CURRENT_STATION}"), TiltBModuleName); CRSAMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{CRSAModuleName}.{MOTION_DATA}"); CRSACurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{CRSAModuleName}.{CURRENT_STATION}"), CRSAModuleName); CRSBMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{CRSBModuleName}.{MOTION_DATA}"); CRSBCurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{CRSBModuleName}.{CURRENT_STATION}"), CRSBModuleName); RotationMotionData = CommonFunction.GetValue(_rtDataValueDic, $"{RotationModuleName}.{MOTION_DATA}"); RotationCurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue(_rtDataValueDic, $"{RotationModuleName}.{CURRENT_STATION}"), RotationModuleName); SideAData = CommonFunction.GetValue(_rtDataValueDic, $"{SideAModuleName}.{SIDE_DATA}"); SideBData = CommonFunction.GetValue(_rtDataValueDic, $"{SideBModuleName}.{SIDE_DATA}"); CommonData = CommonFunction.GetValue(_rtDataValueDic, $"{Module}.{COMMON_DATA}"); if (CommonData!=null&&CommonData.FlowValues != null && CommonData.FlowValues.Count != 0) { if (ValueSeries.Count < CommonData.FlowValues.Count) { InitialValueSeries(CommonData.FlowValues); } } else { ValueSeries.Clear(); LabelSeries.Clear(); } Loader1TiltAMotorPosition = TiltBMotionData.MotorPosition; Loader1TiltBMotorPosition = TiltAMotionData.MotorPosition; Loader1RotationMotorPosition = RotationMotionData.MotorPosition; //计Loader Rotation UI位置 Loader1RotationPosition = -Loader1RotationMotorPosition - LOADER_ROTATION_DIFFER; //判断Loader1的TiltA水平状态 if (TiltACurrentStation == "HORI") { LoaderWaferVisibleA = true; } else if (TiltACurrentStation == "VERT") { LoaderWaferVisibleA = false; } //判断Loader1的TiltB水平状态 if (TiltBCurrentStation == "HORI") { LoaderWaferVisibleB = true; } else if (TiltBCurrentStation == "VERT") { LoaderWaferVisibleB = false; } CurrentSideAOperation = CommonFunction.GetValue(_rtDataValueDic, $"{SideAModuleName}.{CURRENT_OPERATION}"); CurrentSideBOperation = CommonFunction.GetValue(_rtDataValueDic, $"{SideBModuleName}.{CURRENT_OPERATION}"); } } } /// /// 隐藏 /// public void Hide() { if (_timer != null) { _timer.Stop(); } } /// /// 初始化查询数据集合 /// private void AddDataKeys() { _rtDataKeys.Clear(); _rtDataKeys.Add($"{ShuttleAModuleName}.{MOTION_DATA}"); _rtDataKeys.Add($"{ShuttleAModuleName}.{IS_SWITCH_ON}"); _rtDataKeys.Add($"{ShuttleAModuleName}.{CURRENT_STATION}"); _rtDataKeys.Add($"{ShuttleBModuleName}.{MOTION_DATA}"); _rtDataKeys.Add($"{ShuttleBModuleName}.{IS_SWITCH_ON}"); _rtDataKeys.Add($"{ShuttleBModuleName}.{CURRENT_STATION}"); _rtDataKeys.Add($"{TiltAModuleName}.{MOTION_DATA}"); _rtDataKeys.Add($"{TiltAModuleName}.{IS_SWITCH_ON}"); _rtDataKeys.Add($"{TiltAModuleName}.{CURRENT_STATION}"); _rtDataKeys.Add($"{TiltBModuleName}.{MOTION_DATA}"); _rtDataKeys.Add($"{TiltBModuleName}.{IS_SWITCH_ON}"); _rtDataKeys.Add($"{TiltBModuleName}.{CURRENT_STATION}"); _rtDataKeys.Add($"{CRSAModuleName}.{MOTION_DATA}"); _rtDataKeys.Add($"{CRSAModuleName}.{IS_SWITCH_ON}"); _rtDataKeys.Add($"{CRSAModuleName}.{CURRENT_STATION}"); _rtDataKeys.Add($"{CRSBModuleName}.{MOTION_DATA}"); _rtDataKeys.Add($"{CRSBModuleName}.{IS_SWITCH_ON}"); _rtDataKeys.Add($"{CRSBModuleName}.{CURRENT_STATION}"); _rtDataKeys.Add($"{RotationModuleName}.{MOTION_DATA}"); _rtDataKeys.Add($"{RotationModuleName}.{IS_SWITCH_ON}"); _rtDataKeys.Add($"{RotationModuleName}.{CURRENT_STATION}"); _rtDataKeys.Add($"{SideAModuleName}.{SIDE_DATA}"); _rtDataKeys.Add($"{SideBModuleName}.{SIDE_DATA}"); _rtDataKeys.Add($"{Module}.{COMMON_DATA}"); _rtDataKeys.Add($"{SideAModuleName}.{CURRENT_OPERATION}"); _rtDataKeys.Add($"{SideBModuleName}.{CURRENT_OPERATION}"); } private void InitialValueSeries(List datas) { foreach(LoaderFlowLotTrackData item in datas) { ValueSeries.Add(item.FlowValue); LabelSeries.Add(item.Time); } } #region 指令Action /// /// Load Action /// /// private void SideALoadAction(object obj) { InvokeClient.Instance.Service.DoOperation($"{Module}.SideA.Load"); } /// /// Unload Action /// /// private void SideAUnloadAction(object obj) { InvokeClient.Instance.Service.DoOperation($"{Module}.SideA.Unload"); } /// /// Install CRS Action /// /// private void SideAInstallCRSAction(object obj) { InvokeClient.Instance.Service.DoOperation($"{Module}.SideA.InstallCRS"); } /// /// SideB Load Action /// /// private void SideBLoadAction(object obj) { InvokeClient.Instance.Service.DoOperation($"{Module}.SideB.Load"); } /// /// SideB Unload Action /// /// private void SideBUnloadAction(object obj) { InvokeClient.Instance.Service.DoOperation($"{Module}.SideB.Unload"); } /// /// SideB Install CRS Action /// /// private void SideBInstallCRSAction(object obj) { InvokeClient.Instance.Service.DoOperation($"{Module}.SideB.InstallCRS"); } #endregion } }