using Aitex.Core.RT.Fsm; using Aitex.Core.Util; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Layout; using MECF.Framework.Common.ProcessCell; using MECF.Framework.Common.Reservior; using MECF.Framework.Common.Utilities; using CyberX8_Core; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Timers; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using System.Runtime.InteropServices; using MECF.Framework.Common.WaferHolder; namespace CyberX8_Themes.UserControls { /// /// ProcessControl.xaml 的交互逻辑 /// public partial class ProcessControl : UserControl { #region 常量 private const int RESERVIOR_MARGIN_LEFT = 10; #endregion public ProcessControl() { InitializeComponent(); } public static readonly DependencyProperty ControlLoadProperty = DependencyProperty.Register("ControlLoad", typeof(bool), typeof(ProcessControl), new PropertyMetadata(false)); public bool ControlLoad { get { return (bool)this.GetValue(ControlLoadProperty); } set { this.SetValue(ControlLoadProperty, value); } } public static readonly DependencyProperty LoaderTransoprterWaferHolderVisibleProperty = DependencyProperty.Register("LoaderTransoprterWaferHolderVisible", typeof(bool), typeof(ProcessControl), new PropertyMetadata(false)); public bool LoaderTransoprterWaferHolderVisible { get { return (bool)this.GetValue(LoaderTransoprterWaferHolderVisibleProperty); } set { this.SetValue(LoaderTransoprterWaferHolderVisibleProperty, value); } } public static readonly DependencyProperty LoaderGantryPositionProperty = DependencyProperty.Register("LoaderGantryPosition", typeof(double), typeof(ProcessControl)); public double LoaderGantryPosition { get { return (double)this.GetValue(LoaderGantryPositionProperty); } set { this.SetValue(LoaderGantryPositionProperty, value); } } public static readonly DependencyProperty ProcessGantryPositionProperty = DependencyProperty.Register("ProcessGantryPosition", typeof(double), typeof(ProcessControl),new PropertyMetadata((double)1725)); public double ProcessGantryPosition { get { return (double)this.GetValue(ProcessGantryPositionProperty); } set { this.SetValue(ProcessGantryPositionProperty, value); } } public static readonly DependencyProperty LoaderVerticalPositionProperty = DependencyProperty.Register("LoaderVerticalPosition", typeof(double), typeof(ProcessControl), new PropertyMetadata((double)100)); public double LoaderVerticalPosition { get { return (double)this.GetValue(LoaderVerticalPositionProperty); } set { this.SetValue(LoaderVerticalPositionProperty, value); } } public static readonly DependencyProperty ProcessVerticalPositionProperty = DependencyProperty.Register("ProcessVerticalPosition", typeof(double), typeof(ProcessControl), new PropertyMetadata((double)100)); public double ProcessVerticalPosition { get { return (double)this.GetValue(ProcessVerticalPositionProperty); } set { this.SetValue(ProcessVerticalPositionProperty, value); } } public static readonly DependencyProperty ProcessTransoprterWaferHolderVisibleProperty = DependencyProperty.Register("ProcessTransoprterWaferHolderVisible", typeof(bool), typeof(ProcessControl), new PropertyMetadata(true)); public bool ProcessTransoprterWaferHolderVisible { get { return (bool)this.GetValue(ProcessTransoprterWaferHolderVisibleProperty); } set { this.SetValue(ProcessTransoprterWaferHolderVisibleProperty, value); } } public static readonly DependencyProperty LoaderTransoprterWaferHolderEnableProperty = DependencyProperty.Register("LoaderTransoprterWaferHolderEnable", typeof(bool), typeof(ProcessControl), new PropertyMetadata(true)); public bool LoaderTransoprterWaferHolderEnable { get { return (bool)this.GetValue(LoaderTransoprterWaferHolderEnableProperty); } set { this.SetValue(LoaderTransoprterWaferHolderEnableProperty, value); } } public static readonly DependencyProperty ProcessTransoprterWaferHolderEnableProperty = DependencyProperty.Register("ProcessTransoprterWaferHolderEnable", typeof(bool), typeof(ProcessControl), new PropertyMetadata(false)); public bool ProcessTransoprterWaferHolderEnable { get { return (bool)this.GetValue(ProcessTransoprterWaferHolderEnableProperty); } set { this.SetValue(ProcessTransoprterWaferHolderEnableProperty, value); } } private ConcurrentDictionary _cellWaferHolderDictionary=new ConcurrentDictionary(); /// /// RT查询data集合 /// private Dictionary _rtDataValues; /// /// RT查询key集合 /// private List _rtDataKeys = new List(); /// /// layout对象 /// private ProcessLayout _processLayout; /// /// Reservoir-Metals /// private SerializableDictionary> _reservoirMetals; /// /// 定时器 /// DispatcherTimer _timer = null; /// /// 可见变化事件 /// /// /// private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if(!ControlLoad) { return; } if (e.NewValue != null) { bool isShow = (bool)e.NewValue; if (isShow) { LoadCells(); if (_timer == null) { _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromSeconds(0.2); _timer.Tick += Timer_Tick; } InitialKeys(); _timer.Start(); } else { if (_timer != null) { _timer.Stop(); _timer.IsEnabled = false; _timer = null; } } } } private void LoadCells() { _rtDataKeys.Clear(); _rtDataKeys.Add("System.Layout"); _rtDataKeys.Add("System.ReservoirMetals"); _rtDataValues = QueryDataClient.Instance.Service.PollData(_rtDataKeys); if (_rtDataValues != null) { _processLayout = CommonFunction.GetValue(_rtDataValues, "System.Layout"); _reservoirMetals = CommonFunction.GetValue>>(_rtDataValues, "System.ReservoirMetals"); if (_processLayout != null && _processLayout.Items.Count != 0) { totalCanvas.Children.Clear(); foreach (ProcessLayoutCellItem item in _processLayout.Items) { if (string.IsNullOrEmpty(item.ModuleName)) { continue; } if (item.Type == "Cell") { AddCellControl(item); } else if (item.Type == "Buffer") { WaferHolderBuffer buffer = new WaferHolderBuffer(); buffer.CellName = item.ModuleName; buffer.Width = item.Width; buffer.Height = item.Height; Canvas.SetLeft(buffer, item.Left); Canvas.SetTop(buffer, item.Top); totalCanvas.Children.Add(buffer); } } } if (_reservoirMetals != null && _reservoirMetals.Keys.Count != 0) { foreach(string item in _reservoirMetals.Keys) { ReserviorControl reserviorControl = new ReserviorControl(); reserviorControl.ReserviorName = item; var maxmin = GetReserviorWidth(_reservoirMetals[item]); reserviorControl.ReserviorInfo = GenerateReserviorInfo(item, maxmin.max - maxmin.min + 2 * RESERVIOR_MARGIN_LEFT); Canvas.SetLeft(reserviorControl, maxmin.min - RESERVIOR_MARGIN_LEFT); Canvas.SetTop(reserviorControl, maxmin.minTop); Canvas.SetZIndex(reserviorControl, -1); totalCanvas.Children.Add(reserviorControl); } } } } /// /// 初始化Keys /// private void InitialKeys() { _rtDataKeys.Clear(); _rtDataKeys.Add("System.CellWaferHolderDictionary"); foreach (ProcessLayoutCellItem item in _processLayout.Items) { if (item.Type == "Cell"&&!string.IsNullOrEmpty(item.ModuleName)) { _rtDataKeys.Add($"{item.ModuleName}.IsInit"); _rtDataKeys.Add($"{item.ModuleName}.IsIdle"); _rtDataKeys.Add($"{item.ModuleName}.IsError"); _rtDataKeys.Add($"{item.ModuleName}.IsBusy"); _rtDataKeys.Add($"{item.ModuleName}.IsDisable"); } } foreach(string key in _reservoirMetals.Keys) { _rtDataKeys.Add($"{key}.IsInit"); _rtDataKeys.Add($"{key}.IsIdle"); _rtDataKeys.Add($"{key}.IsError"); _rtDataKeys.Add($"{key}.IsBusy"); _rtDataKeys.Add($"{key}.IsDisable"); } } /// /// 获取Reservior属性信息 /// /// /// /// private ReserviorInfo GenerateReserviorInfo(string item,int width) { ReserviorInfo info = new ReserviorInfo(); info.Name = item; info.Width = width; info.Cells = new List(); return info; } /// /// 定时器执行 /// /// /// private void Timer_Tick(object sender, EventArgs e) { if (_rtDataKeys.Count != 0) { _rtDataValues = QueryDataClient.Instance.Service.PollData(_rtDataKeys); if (_rtDataValues != null) { _cellWaferHolderDictionary = CommonFunction.GetValue>(_rtDataValues, "System.CellWaferHolderDictionary"); LoaderTransoprterWaferHolderVisible = _cellWaferHolderDictionary[ModuleName.Transporter2.ToString()]; ProcessTransoprterWaferHolderVisible = _cellWaferHolderDictionary[ModuleName.Transporter1.ToString()]; WaferHolderInfo waferHolderInfo = WaferHolderDataClient.Instance.Service.GetWaferHolderDataByLocation(ModuleName.Transporter2.ToString()); if (waferHolderInfo != null) LoaderTransoprterWaferHolderEnable = waferHolderInfo.Enabled; waferHolderInfo = WaferHolderDataClient.Instance.Service.GetWaferHolderDataByLocation(ModuleName.Transporter1.ToString()); if (waferHolderInfo != null) ProcessTransoprterWaferHolderEnable = waferHolderInfo.Enabled; //判断Chanmber状态 foreach (DependencyObject child in totalCanvas.Children) { if (child is WaferHolderProcessCell) { WaferHolderProcessCell cellChild = child as WaferHolderProcessCell; cellChild.CellStatus = (int)JudgeAtState(cellChild.CellName); cellChild.WaferHolderVisible = _cellWaferHolderDictionary[cellChild.CellName]; waferHolderInfo = WaferHolderDataClient.Instance.Service.GetWaferHolderDataByLocation(cellChild.CellName); if (waferHolderInfo != null) cellChild.IsWHEnable = waferHolderInfo.Enabled; } else if (child is ReserviorControl) { ReserviorControl reservior = child as ReserviorControl; reservior.ReserviorStatus = (int)JudgeAtState(reservior.ReserviorName); } else if(child is WaferHolderBuffer) { WaferHolderBuffer waferHolderBuffer = child as WaferHolderBuffer; waferHolderBuffer.WaferHolderVisible = _cellWaferHolderDictionary[waferHolderBuffer.CellName]; waferHolderInfo = WaferHolderDataClient.Instance.Service.GetWaferHolderDataByLocation(waferHolderBuffer.CellName); if (waferHolderInfo != null) waferHolderBuffer.IsWHEnable = waferHolderInfo.Enabled; } } } } } /// /// 增加Cell元素 /// /// private void AddCellControl(ProcessLayoutCellItem item) { WaferHolderProcessCell cellControl = new WaferHolderProcessCell(); cellControl.CellName = item.ModuleName; cellControl.Width = item.Width; cellControl.Height = item.Height; Canvas.SetLeft(cellControl, item.Left); Canvas.SetTop(cellControl, item.Top); totalCanvas.Children.Add(cellControl); } /// /// 获取Reservior宽度 /// /// /// private (int max,int min,int minTop) GetReserviorWidth(List metals) { int min = int.MaxValue; int max = 0; int minTop = int.MaxValue; foreach (ProcessLayoutCellItem subitem in _processLayout.Items) { if (metals.Contains(subitem.ModuleName)) { if (subitem.Left < min) { min = subitem.Left; } if (subitem.Left + subitem.Width > max) { max = subitem.Left + subitem.Width; } if (subitem.Top < min) { minTop = subitem.Top; } } } return (max,min,minTop); } /// /// 判断状态 /// /// /// private CellStatus JudgeAtState(string moduleName) { string state = CommonFunction.GetValue(_rtDataValues, $"{moduleName}.IsDisable"); if (state != null && (bool.Parse(state))) { return CellStatus.Disabled; } state = CommonFunction.GetValue(_rtDataValues, $"{moduleName}.IsIdle"); if (state != null && (bool.Parse(state))) { return CellStatus.Idle; } state = CommonFunction.GetValue(_rtDataValues, $"{moduleName}.IsError"); if (state != null && (bool.Parse(state))) { return CellStatus.Error; } state = CommonFunction.GetValue(_rtDataValues, $"{moduleName}.IsBusy"); if (state != null && (bool.Parse(state))) { return CellStatus.Busy; } state = CommonFunction.GetValue(_rtDataValues, $"{moduleName}.IsInit"); if (state != null && (bool.Parse(state))) { return CellStatus.Init; } return CellStatus.Idle; } } }