| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 | 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{    /// <summary>    /// ProcessControl.xaml 的交互逻辑    /// </summary>    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<string, bool> _cellWaferHolderDictionary=new ConcurrentDictionary<string, bool>();        /// <summary>        /// RT查询data集合        /// </summary>        private Dictionary<string, object> _rtDataValues;        /// <summary>        /// RT查询key集合        /// </summary>        private List<string> _rtDataKeys = new List<string>();        /// <summary>        /// layout对象        /// </summary>        private ProcessLayout _processLayout;        /// <summary>        /// Reservoir-Metals        /// </summary>        private SerializableDictionary<string, List<string>> _reservoirMetals;        /// <summary>        /// 定时器        /// </summary>        DispatcherTimer _timer = null;        /// <summary>        /// 可见变化事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        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<ProcessLayout>(_rtDataValues, "System.Layout");                _reservoirMetals = CommonFunction.GetValue<SerializableDictionary<string, List<string>>>(_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($"Res{item.Substring(item.Length - 1, 1)}", 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);                    }                }            }        }               /// <summary>        /// 初始化Keys        /// </summary>        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");            }        }        /// <summary>        /// 获取Reservior属性信息        /// </summary>        /// <param name="item"></param>        /// <param name="width"></param>        /// <returns></returns>        private ReserviorInfo GenerateReserviorInfo(string item,int width)        {            ReserviorInfo info = new ReserviorInfo();            info.Name = item;            info.Width = width;            info.Cells = new List<ProcessCellInfo>();            return info;        }        /// <summary>        /// 定时器执行        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void Timer_Tick(object sender, EventArgs e)        {            if (_rtDataKeys.Count != 0)            {                _rtDataValues = QueryDataClient.Instance.Service.PollData(_rtDataKeys);                if (_rtDataValues != null)                {                    _cellWaferHolderDictionary = CommonFunction.GetValue<ConcurrentDictionary<string, bool>>(_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;                        }                    }                }            }        }        /// <summary>        /// 增加Cell元素        /// </summary>        /// <param name="item"></param>        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);                    }        /// <summary>        /// 获取Reservior宽度        /// </summary>        /// <param name="item"></param>        /// <returns></returns>        private (int max,int min,int minTop) GetReserviorWidth(List<string> 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);        }        /// <summary>        /// 判断状态        /// </summary>        /// <param name="moduleName"></param>        /// <returns></returns>        private CellStatus JudgeAtState(string moduleName)        {            string state = CommonFunction.GetValue<string>(_rtDataValues, $"{moduleName}.IsDisable");            if (state != null && (bool.Parse(state)))            {                return CellStatus.Disabled;            }            state = CommonFunction.GetValue<string>(_rtDataValues, $"{moduleName}.IsIdle");            if (state != null && (bool.Parse(state)))            {                return CellStatus.Idle;            }            state = CommonFunction.GetValue<string>(_rtDataValues, $"{moduleName}.IsError");            if (state != null && (bool.Parse(state)))            {                return CellStatus.Error;            }            state = CommonFunction.GetValue<string>(_rtDataValues, $"{moduleName}.IsBusy");            if (state != null && (bool.Parse(state)))            {                return CellStatus.Busy;            }            state = CommonFunction.GetValue<string>(_rtDataValues, $"{moduleName}.IsInit");            if (state != null && (bool.Parse(state)))            {                return CellStatus.Init;            }                        return CellStatus.Idle;                    }    }        }
 |