移除PMProcessView视图、ProcessMonitor视图。

将一些常用的using整合到GlobalUsings.cs文件中,定义为全局using。
This commit is contained in:
SL 2023-06-29 14:44:35 +08:00
parent 559fdaf4f9
commit 1dac143c58
45 changed files with 20 additions and 5518 deletions

View File

@ -1,5 +1,4 @@
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Equipment;
using MECF.Framework.UI.Client.ClientBase;
using System.Collections.Generic;

View File

@ -45,7 +45,7 @@
<menuItem id="PM1" resKey="PM1" System="PM1">
<menuItem id="mainPM1" resKey="Main" System="PM1" viewmodel="SicUI.Models.PMs.PMOperationViewModel,SicUI" />
<menuItem id="processPM1" resKey="Process" System="PM1" viewmodel="SicUI.Models.PMs.PMProcessViewModel,SicUI" />
<menuItem id="processPM1" resKey="Process" System="PM1" viewmodel="MECF.Framework.UI.Client.CenterViews.Modules.PM.PMProcessViewModel,MECF.Framework.UI.Client" />
<menuItem id="ioPM1" resKey="IO" System="PM1.io" viewmodel="MECF.Framework.UI.Client.CenterViews.Maitenances.IO3.IO3ViewModel,MECF.Framework.UI.Client" />
<menuItem id="motionPM1" resKey="Motion" System="PM1" viewmodel="SicUI.Models.PMs.PMMotionViewModel,SicUI" />
<menuItem id="heaterPM1" resKey="Heater" System="PM1" viewmodel="SicUI.Models.PMs.PMHeaterViewModel,SicUI" />
@ -56,7 +56,7 @@
<menuItem id="PM2" resKey="PM2" System="PM2">
<menuItem id="mainPM2" resKey="Main" System="PM2" viewmodel="SicUI.Models.PMs.PMOperationViewModel,SicUI" />
<menuItem id="processPM2" resKey="Process" System="PM2" viewmodel="SicUI.Models.PMs.PMProcessViewModel,SicUI" />
<menuItem id="processPM2" resKey="Process" System="PM2" viewmodel="MECF.Framework.UI.Client.CenterViews.Modules.PM.PMProcessViewModel,MECF.Framework.UI.Client" />
<menuItem id="ioPM2" resKey="IO" System="PM2.io" viewmodel="MECF.Framework.UI.Client.CenterViews.Maitenances.IO3.IO3ViewModel,MECF.Framework.UI.Client" />
<menuItem id="motionPM2" resKey="Motion" System="PM2" viewmodel="SicUI.Models.PMs.PMMotionViewModel,SicUI" />
<menuItem id="heaterPM2" resKey="Heater" System="PM2" viewmodel="SicUI.Models.PMs.PMHeaterViewModel,SicUI" />

View File

@ -1,6 +1,5 @@
using Aitex.Core.Common.DeviceData;
using Aitex.Core.UI.ControlDataContext;
using MECF.Framework.Common.OperationCenter;
using System;
using System.Collections.Generic;
using System.Linq;

View File

@ -1,6 +1,5 @@
using Aitex.Core.Common.DeviceData;
using Aitex.Core.UI.ControlDataContext;
using MECF.Framework.Common.OperationCenter;
using System;
using System.Collections.Generic;
using System.Linq;

View File

@ -1,7 +1,6 @@
using Aitex.Core.Common.DeviceData;
using Aitex.Core.UI.ControlDataContext;
using Caliburn.Micro;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.Ctrlib.UnitControls;
using System;
using System.Collections.Generic;

View File

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MECF.Framework.Common.CommonData;
namespace SicUI.Controls.Common
{

View File

@ -1,5 +1,4 @@
using MECF.Framework.Common.CommonData;
using SicUI.Controls.Common;
using SicUI.Controls.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;

View File

@ -1,5 +1,4 @@
using MECF.Framework.Common.CommonData;
using System.Collections.ObjectModel;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;

View File

@ -1,5 +1,4 @@
using MECF.Framework.Common.CommonData;
using SicUI.Controls.Common;
using SicUI.Controls.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;

View File

@ -1,5 +1,4 @@
using MECF.Framework.Common.CommonData;
using SicUI.Controls.Common;
using SicUI.Controls.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;

View File

@ -1,6 +1,5 @@
using Aitex.Core.UI.MVVM;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.OperationCenter;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

View File

@ -1,5 +1,4 @@
using Aitex.Core.Common.DeviceData;
using MECF.Framework.Common.OperationCenter;
using System;
using System.Collections.Generic;
using System.Linq;

View File

@ -1,5 +1,4 @@
using MECF.Framework.Common.OperationCenter;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

View File

@ -7,7 +7,7 @@ using System.Windows.Input;
using OpenSEMI.ClientBase;
using OpenSEMI.ClientBase.Command;
using MECF.Framework.Common.RecipeCenter;
namespace SicUI.Client.Dialog
{
public class ItemsSelectDialogViewModel : DialogViewModel<string>

9
SicUI/GlobalUsings.cs Normal file
View File

@ -0,0 +1,9 @@
// Global using directives
global using MECF.Framework.Common.CommonData;
global using MECF.Framework.Common.DataCenter;
global using MECF.Framework.Common.OperationCenter;
global using MECF.Framework.Common.RecipeCenter;
global using MECF.Framework.UI.Client;
global using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
global using MECF.Framework.UI.Client.CenterViews.Modules.PM;

View File

@ -6,8 +6,6 @@ using Aitex.Core.Util;
using Aitex.Core.WCF;
using Caliburn.Micro;
using MECF.Framework.Common.Account.Extends;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.CenterViews.LogOnOff;
using MECF.Framework.UI.Client.ClientBase;
using MECF.Framework.UI.Core.Accounts;

View File

@ -3,209 +3,11 @@ using System.Windows;
using Aitex.Core.RT.Log;
using Aitex.Core.Util;
using Caliburn.Micro;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.ClientBase;
using OpenSEMI.Ctrlib.Controls;
namespace SicUI.Models
{
public class SicModuleUIViewModelBase : UiViewModelBase
{
public ModuleInfo CassAL
{
get
{
if (ModuleManager.ModuleInfos["CassAL"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["CassAL"];
return null;
}
}
public ModuleInfo CassAR
{
get
{
if (ModuleManager.ModuleInfos["CassAR"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["CassAR"];
return null;
}
}
public ModuleInfo CassBL
{
get
{
if (ModuleManager.ModuleInfos["CassBL"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["CassBL"];
return null;
}
}
public ModuleInfo Buffer
{
get
{
if (ModuleManager.ModuleInfos["Buffer"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["Buffer"];
return null;
}
}
public ModuleInfo Aligner { get; set; }
public ModuleInfo TMRobot { get; set; }
public ModuleInfo WaferRobot { get; set; }
public ModuleInfo TrayRobot { get; set; }
public ModuleInfo LoadLock { get; set; }
public ModuleInfo UnLoad { get; set; }
public ModuleInfo PM1 { get; set; }
public ModuleInfo PM2 { get; set; }
#region Wafer info for machine
public WaferInfo BufferWafer
{
get
{
if (ModuleManager.ModuleInfos["Buffer"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["Buffer"].WaferManager.Wafers[0];
return null;
}
}
public WaferInfo PM1Wafer
{
get
{
if (ModuleManager.ModuleInfos["PM1"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["PM1"].WaferManager.Wafers[0];
return null;
}
}
public WaferInfo PM2Wafer
{
get
{
if (ModuleManager.ModuleInfos["PM2"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["PM2"].WaferManager.Wafers[0];
return null;
}
}
public WaferInfo Wafer1
{
get
{
if (ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0];
return null;
}
}
public WaferInfo TrayRobotWafer
{
get
{
if (ModuleManager.ModuleInfos["TrayRobot"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["TrayRobot"].WaferManager.Wafers[0];
return null;
}
}
public WaferInfo WaferRobotWafer
{
get
{
if (ModuleManager.ModuleInfos["WaferRobot"].WaferManager.Wafers.Count > 0)
return ModuleManager.ModuleInfos["WaferRobot"].WaferManager.Wafers[0];
return null;
}
}
#endregion
#region Tray Visble
public Visibility TrayRobotHaveTray
{
get
{
if (ModuleManager.ModuleInfos["TrayRobot"].WaferManager.Wafers.Count > 0 && ModuleManager.ModuleInfos["TrayRobot"].WaferManager.Wafers[0].WaferTrayStatus > 0)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility TMRobotHaveTray
{
get
{
if (ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers.Count > 0 && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferTrayStatus > 0)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility LoadLockHaveTray
{
get
{
if (ModuleManager.ModuleInfos["LoadLock"].WaferManager.Wafers.Count > 0 && ModuleManager.ModuleInfos["LoadLock"].WaferManager.Wafers[0].WaferTrayStatus > 0)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility UnLoadHaveTray
{
get
{
if (ModuleManager.ModuleInfos["UnLoad"].WaferManager.Wafers.Count > 0 && ModuleManager.ModuleInfos["UnLoad"].WaferManager.Wafers[0].WaferTrayStatus > 0)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility PM1HaveTray
{
get
{
if (ModuleManager.ModuleInfos["PM1"].WaferManager.Wafers.Count > 0 && ModuleManager.ModuleInfos["PM1"].WaferManager.Wafers[0].WaferTrayStatus > 0)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility PM2HaveTray
{
get
{
if (ModuleManager.ModuleInfos["PM2"].WaferManager.Wafers.Count > 0 && ModuleManager.ModuleInfos["PM2"].WaferManager.Wafers[0].WaferTrayStatus > 0)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
#endregion
protected void InitPM()
{
TMRobot = ModuleManager.ModuleInfos["TMRobot"];
PM1 = ModuleManager.ModuleInfos["PM1"];
PM2 = ModuleManager.ModuleInfos["PM2"];
}
}
public class SicUIViewModelBase : UiViewModelBase
{
public string SystemName { get; set; }

View File

@ -10,9 +10,6 @@ using Aitex.Core.Util;
using Aitex.Sorter.Common;
using Caliburn.Micro.Core;
using SicUI.Models;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.ClientBase;
using OpenSEMI.ClientBase;
using SciChart.Core.Extensions;

View File

@ -1,6 +1,4 @@
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.DBCore;
using MECF.Framework.Common.DBCore;
using MECF.Framework.Common.Equipment;
using System;
using System.Collections.Generic;

View File

@ -1,5 +1,4 @@
using Aitex.Core.Util;
using MECF.Framework.Common.OperationCenter;
using SicUI.Models;
using System;
using System.Collections.Generic;

View File

@ -1,8 +1,6 @@
using Aitex.Core.Common.DeviceData;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.OperationCenter;
using SicUI.Models;
using System;
using System.Collections.Generic;

View File

@ -1,7 +1,5 @@
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.OperationCenter;
using SicUI.Models;
using System;
using System.Collections.Generic;

View File

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MECF.Framework.Common.OperationCenter;
using OpenSEMI.ClientBase.ServiceProvider;
namespace SicUI.Client.Models.Platform.TM

View File

@ -4,9 +4,6 @@ using Aitex.Core.Common.DeviceData;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using SicUI.Models;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using Caliburn.Micro;
using System.Windows.Input;
using Aitex.Core.UI.MVVM;

View File

@ -1,15 +1,10 @@
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.Common.RecipeCenter;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using Caliburn.Micro;
using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
using MECF.Framework.UI.Client.CenterViews.Operations.WaferAssociation;
using MECF.Framework.UI.Client.ClientBase;
using OpenSEMI.ClientBase;

View File

@ -1,5 +1,4 @@
using Aitex.Core.RT.Log;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory;
using MECF.Framework.UI.Client.ClientBase;
using System;

View File

@ -1,14 +1,10 @@
using Aitex.Common.Util;
using MECF.Framework.UI.Client.ClientBase;
using SciChart.Charting.Visuals.RenderableSeries;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace SicUI.Models.PMs.Charting
{

View File

@ -4,7 +4,6 @@ using Aitex.Core.Util;
using Aitex.Core.Utilities;
using Caliburn.Micro.Core;
using MECF.Framework.Common.ControlDataContext;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory;
using MECF.Framework.UI.Client.ClientBase;
using SciChart.Charting.ChartModifiers;

View File

@ -2,10 +2,7 @@
using Aitex.Core.Util;
using Aitex.Core.RT.Event;
using Caliburn.Micro;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
using MECF.Framework.UI.Client.ClientBase;
using System;
using System.Collections.Generic;

View File

@ -1,10 +1,7 @@
using Aitex.Core.Common.DeviceData;
using Aitex.Core.Util;
using Caliburn.Micro;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
using MECF.Framework.UI.Client.ClientBase;
using System;
using System.Collections.Generic;

View File

@ -9,10 +9,7 @@ using Aitex.Core.RT.Log;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using Caliburn.Micro.Core;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.ClientBase;
using OpenSEMI.ClientBase;
using SciChart.Core.Extensions;

View File

@ -1,6 +1,5 @@
using Aitex.Core.Common.DeviceData;
using Aitex.Core.Util;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.ClientBase;
using System;
using System.Collections.Generic;

View File

@ -2,10 +2,7 @@
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using Caliburn.Micro;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
using MECF.Framework.UI.Client.ClientBase;
using System;
using System.Collections.Generic;

View File

@ -3,9 +3,6 @@ using Aitex.Core.RT.Event;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using Caliburn.Micro;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.ClientBase;
using SicUI.Controls;
using System;

View File

@ -2,10 +2,7 @@
using Aitex.Core.Util;
using Aitex.Core.Utilities;
using Caliburn.Micro;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
using MECF.Framework.UI.Client.ClientBase;
using OpenSEMI.ClientBase;
using System.Collections.Generic;

View File

@ -1,525 +0,0 @@
#define _FAKE_DATA
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Windows.Data;
using Aitex.Core.RT.Log;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.UI.Client.ClientBase;
using Sicentury.Core;
using SicModules.PMs;
#if FAKE_DATA
using System.Threading;
using System.Threading.Tasks;
#endif
namespace SicUI.Models.PMs
{
public class ObservableQueue<T> : Queue<T>, INotifyCollectionChanged
{
public event NotifyCollectionChangedEventHandler CollectionChanged;
private readonly object _syncRoot = new object();
#region Constructors
public ObservableQueue()
{
LimitSize = 0;
}
public ObservableQueue(int capacity) : base(capacity)
{
LimitSize = capacity;
}
#endregion
#region Properties
public int LimitSize { get; }
public new virtual void Enqueue(T obj)
{
lock (_syncRoot)
{
base.Enqueue(obj);
if (LimitSize > 0 && base.Count > LimitSize)
base.Dequeue();
CollectionChanged?.Invoke(this,
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, obj));
}
}
public new virtual T Dequeue()
{
lock (_syncRoot)
{
var obj = base.Dequeue();
CollectionChanged?.Invoke(this,
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, obj));
return obj;
}
}
public new virtual void Clear()
{
lock (_syncRoot)
{
base.Clear();
CollectionChanged?.Invoke(this,
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
#endregion
}
public class GasFlowCounter : BindableBase
{
#region Variables
#endregion
#region Constructors
public GasFlowCounter(string gasName)
{
GasName = gasName;
TotalFlow = 0;
}
public GasFlowCounter(string gasName, double initValue) : this(gasName)
{
TotalFlow = initValue;
}
#endregion
#region Properties
public string GasName { get; }
public double TotalFlow { get; private set; }
#endregion
#region Methods
public void AddFlow(double increment)
{
TotalFlow += increment;
}
public override string ToString()
{
return $"{TotalFlow:F1}";
}
#endregion
}
public class PmGasFlowCountInfo : BindableBase
{
#region Variables
private DateTime _statStart;
private DateTime? _statEnd;
#endregion
#region Constructors
public PmGasFlowCountInfo(int index, Guid uid, string recipeName, string waferUid, DateTime beginTime, DateTime endTime, double h2,
double ar,
double pn2, double hcl, double sih4, double cxhx, double tcs, double tma)
{
Index = index;
StatisticsUid = uid;
RecipeName = recipeName;
WaferId = waferUid;
StatisticsStart = beginTime;
StatisticsEnd = endTime;
H2 = new GasFlowCounter(nameof(H2), h2);
Ar = new GasFlowCounter(nameof(Ar), ar);
PN2 = new GasFlowCounter(nameof(PN2), pn2);
HCL = new GasFlowCounter(nameof(HCL), hcl);
SiH4 = new GasFlowCounter(nameof(SiH4), sih4);
CxHx = new GasFlowCounter(nameof(CxHx), cxhx);
TCS = new GasFlowCounter(nameof(TCS), tcs);
TMA = new GasFlowCounter(nameof(TMA), tma);
}
public PmGasFlowCountInfo()
{
StatisticsUid = Guid.NewGuid();
WaferId = string.Empty;
RecipeName = string.Empty;
StatisticsStart = DateTime.Now;
H2 = new GasFlowCounter(nameof(H2));
Ar = new GasFlowCounter(nameof(Ar));
PN2 = new GasFlowCounter(nameof(PN2));
HCL = new GasFlowCounter(nameof(HCL));
SiH4 = new GasFlowCounter(nameof(SiH4));
CxHx = new GasFlowCounter(nameof(CxHx));
TCS = new GasFlowCounter(nameof(TCS));
TMA = new GasFlowCounter(nameof(TMA));
}
public PmGasFlowCountInfo(string waferId) : this()
{
WaferId = waferId;
}
#endregion
#region Properties
public int Index { get; set; }
public string WaferId { get; }
public string RecipeName { get; }
public Guid StatisticsUid { get; }
public DateTime StatisticsStart
{
get => _statStart;
set => Set(ref _statStart, value);
}
public DateTime? StatisticsEnd
{
get => _statEnd;
set => Set(ref _statEnd, value);
}
public GasFlowCounter H2 { get; }
public GasFlowCounter Ar { get; }
public GasFlowCounter PN2 { get; }
public GasFlowCounter HCL { get; }
public GasFlowCounter SiH4 { get; }
public GasFlowCounter CxHx { get; }
public GasFlowCounter TCS { get; }
public GasFlowCounter TMA { get; }
#endregion
}
public class PMProcessGasFlowCounterViewModel : UiViewModelBase
{
#region Variables
private const int MAX_ROWS = 10;
private readonly object _syncObject = new object();
private readonly PMProcessViewModel _pmProcessVm;
private string _previousStatus;
#if FAKE_DATA
private readonly Random _randomFlow;
#endif
#endregion
#region Constructors
public PMProcessGasFlowCounterViewModel(PMProcessViewModel vm)
{
_previousStatus = PMModule.STATE.Init.ToString();
_pmProcessVm = vm;
GasFlowCountCollection = new ObservableQueue<PmGasFlowCountInfo>(MAX_ROWS);
GasFlowCountCollection.CollectionChanged += GasFlowCountCollectionOnCollectionChanged;
vm.PropertyChanged += VmOnPropertyChanged;
// 加载历史记录。
ReadLastFlowCounts();
#if FAKE_DATA
_randomFlow = new Random();
//for (var i = 0; i < 10; i++)
//{
// var counter = new PmGasFlowCountInfo();
// counter.H2.AddFlow(_randomFlow.NextDouble());
// counter.Ar.AddFlow(_randomFlow.NextDouble());
// counter.PN2.AddFlow(_randomFlow.NextDouble());
// counter.HCL.AddFlow(_randomFlow.NextDouble());
// counter.SiH4.AddFlow(_randomFlow.NextDouble());
// counter.C3H8.AddFlow(_randomFlow.NextDouble());
// counter.TCS.AddFlow(_randomFlow.NextDouble());
// counter.TMA.AddFlow(_randomFlow.NextDouble());
// counter.StatisticsEnd = DateTime.Now;
// GasFlowCountCollection.Enqueue(counter);
// CurrentFlowCounter = counter;
//}
// Add new Flow Counter every 5s
Task.Run(() =>
{
while (true)
{
Thread.Sleep(5000);
if (CurrentFlowCounter != null)
{
// 结束当前的统计,随后开启新统计
CurrentFlowCounter.StatisticsEnd = DateTime.Now;
SaveFlowCount(CurrentFlowCounter);
}
var counter = new PmGasFlowCountInfo();
GasFlowCountCollection.Enqueue(counter);
CurrentFlowCounter = counter;
}
});
#endif
}
#endregion
#region Properties
public ObservableQueue<PmGasFlowCountInfo> GasFlowCountCollection { get; }
public PmGasFlowCountInfo CurrentFlowCounter { get; private set; }
public ICollectionView GasFlowDetailList
{
get
{
var view = CollectionViewSource.GetDefaultView(GasFlowCountCollection.ToList());
view.SortDescriptions.Add(new SortDescription(nameof(PmGasFlowCountInfo.Index),
ListSortDirection.Ascending));
return view;
}
}
#endregion
#region Methods
private void GasFlowCountCollectionOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// 列表发生变化时重新排序。
if (e.Action == NotifyCollectionChangedAction.Add)
{
var i = 1;
GasFlowCountCollection.ToList().OrderByDescending(x => x.StatisticsStart).ToList().ForEach(x =>
{
x.Index = i;
i++;
});
}
}
/// <summary>
/// 监测Process的Status属性是否变化以确定Process的开始和结束时机。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void VmOnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(PMOperationViewModel.Status))
{
var currentStatus = _pmProcessVm.Status;
if (CheckIfProcessStarted(_previousStatus, currentStatus))
{
// Process启动
lock (_syncObject)
{
CurrentFlowCounter = new PmGasFlowCountInfo();
GasFlowCountCollection.Enqueue(CurrentFlowCounter);
}
}
else if (CheckIfProcessStopped(_previousStatus, currentStatus))
{
lock (_syncObject)
{
// Process结束
if (CurrentFlowCounter != null)
{
CurrentFlowCounter.StatisticsEnd = DateTime.Now;
// 写数据库
SaveFlowCount(CurrentFlowCounter);
}
}
}
Debug.WriteLineIf(_previousStatus != currentStatus,
$"PM Process Status: {_previousStatus} to {currentStatus}");
_previousStatus = currentStatus;
}
}
private bool CheckIfProcessStarted(string previousStatus, string currentStatus)
{
if (previousStatus == PMModule.STATE.ProcessIdle.ToString() &&
currentStatus == PMModule.STATE.PreProcess.ToString())
return true;
return false;
}
private bool CheckIfProcessStopped(string previousStatus, string currentStatus)
{
if ((previousStatus != PMModule.STATE.ProcessIdle.ToString() &&
currentStatus == PMModule.STATE.ProcessIdle.ToString()) ||
(previousStatus != PMModule.STATE.Error.ToString() &&
currentStatus == PMModule.STATE.Error.ToString()))
return true;
return false;
}
/// <summary>
/// 将统计值保存到数据库。
/// </summary>
/// <param name="count"></param>
private void SaveFlowCount(PmGasFlowCountInfo count)
{
try
{
var c = count;
var sql = $"INSERT INTO process_flow_data " +
$"(process_guid, module_name, recipe_name, wafer_guid, process_begin_time, process_end_time, h2, ar, pn2, hcl, sih4, c3h8, tcs, tma) " +
$"VALUES " +
$"('{c.StatisticsUid:D}', '{_pmProcessVm.SystemName}', '{_pmProcessVm.SelectedRecipe}', '{c.WaferId:D}', " +
$"'{c.StatisticsStart:yyyy/MM/dd HH:mm:ss.fff}', '{c.StatisticsEnd:yyyy/MM/dd HH:mm:ss.fff}', " +
$"{c.H2}, {c.Ar}, {c.PN2}, {c.HCL}, {c.SiH4}, {c.CxHx}, {c.TCS}, {c.TMA})";
QueryDataClient.Instance.Service.QueryData(sql);
}
catch (Exception ex)
{
LOG.Error($"Unable to save total gas flow to database, {ex.Message}", ex);
}
}
/// <summary>
/// 从数据库加载指定的记录。
/// </summary>
/// <param name="limit"></param>
private void ReadLastFlowCounts(int limit = MAX_ROWS)
{
try
{
var sql =
$"SELECT * FROM process_flow_data where module_name = '{_pmProcessVm.SystemName}' " +
$" ORDER BY process_begin_time DESC LIMIT {limit}";
var dt = QueryDataClient.Instance.Service.QueryData(sql);
if (dt != null && dt.Rows.Count > 0)
{
for (var i = 0; i < dt.Rows.Count; i++)
{
try
{
var row = dt.Rows[i];
var uid = Guid.Parse(row["process_guid"].ToString());
var recipeName = row["recipe_name"].ToString();
var waferUid = row["wafer_guid"].ToString();
var beginTime = DateTime.Parse(row["process_begin_time"].ToString());
var endTime = DateTime.Parse(row["process_end_time"].ToString());
var h2 = double.Parse(row["h2"].ToString());
var ar = double.Parse(row["ar"].ToString());
var pn2 = double.Parse(row["pn2"].ToString());
var hcl = double.Parse(row["hcl"].ToString());
var sih4 = double.Parse(row["sih4"].ToString());
var cxhx = double.Parse(row["c3h8"].ToString());
var tcs = double.Parse(row["tcs"].ToString());
var tma = double.Parse(row["tma"].ToString());
var counter = new PmGasFlowCountInfo(i + 1, uid, recipeName, waferUid, beginTime, endTime, h2, ar, pn2,
hcl,
sih4, cxhx, tcs, tma);
GasFlowCountCollection.Enqueue(counter);
}
catch (Exception ex)
{
LOG.Error($"Unable to load process flow count history at row {i}, {ex.Message}", ex);
}
}
}
}
catch (Exception ex)
{
LOG.Error($"Unable to load process flow count history, {ex.Message}", ex);
}
}
protected override void Poll()
{
base.Poll();
lock (_syncObject)
{
if (CurrentFlowCounter != null && CurrentFlowCounter.StatisticsEnd.HasValue == false)
{
#if FAKE_DATA
CurrentFlowCounter.H2.AddFlow(_randomFlow.NextDouble());
CurrentFlowCounter.Ar.AddFlow(_randomFlow.NextDouble());
CurrentFlowCounter.PN2.AddFlow(_randomFlow.NextDouble());
CurrentFlowCounter.HCL.AddFlow(_randomFlow.NextDouble());
CurrentFlowCounter.SiH4.AddFlow(_randomFlow.NextDouble());
CurrentFlowCounter.CxHx.AddFlow(_randomFlow.NextDouble());
CurrentFlowCounter.TCS.AddFlow(_randomFlow.NextDouble());
CurrentFlowCounter.TMA.AddFlow(_randomFlow.NextDouble());
#else
CurrentFlowCounter.H2.AddFlow(_pmProcessVm.H2Flow);
CurrentFlowCounter.Ar.AddFlow(_pmProcessVm.ArFlow);
CurrentFlowCounter.PN2.AddFlow(_pmProcessVm.PN2Flow);
CurrentFlowCounter.HCL.AddFlow(_pmProcessVm.HCLFlow);
CurrentFlowCounter.SiH4.AddFlow(_pmProcessVm.SiH4Flow);
CurrentFlowCounter.CxHx.AddFlow(_pmProcessVm.C2H4Flow);
CurrentFlowCounter.TCS.AddFlow(_pmProcessVm.TCSFlow);
CurrentFlowCounter.TMA.AddFlow(_pmProcessVm.TMAFlow);
#endif
}
}
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 MECF.Framework.UI.Client.ClientBase;
using MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel;
using DataGridBeginningEditEventArgs = ExtendedGrid.Microsoft.Windows.Controls.DataGridBeginningEditEventArgs;
namespace SicUI.Models.PMs
{
/// <summary>
/// PMProcessView.xaml 的交互逻辑
/// </summary>
public partial class PMProcessView : UserControl
{
public PMProcessView()
{
InitializeComponent();
}
private void BtnLockRecipe_OnClick(object sender, RoutedEventArgs e)
{
recipeLocker.Lock();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,4 @@
using Aitex.Core.Util;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.UI.Client.ClientBase;
using System;
using System.Collections.Generic;

View File

@ -1,598 +0,0 @@
<Window x:Class="SicUI.ProcessMonitorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SicUI"
mc:Ignorable="d"
Height="380" Width="600" Topmost="True" WindowStartupLocation="CenterScreen" >
<Window.Resources>
<Style TargetType="TextBlock" >
<Setter Property="FontSize" Value="12" />
<Setter Property="TextAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="Margin" Value="3"/>
</Style>
<Style TargetType="Border">
<Setter Property="Background" Value="{DynamicResource Table_BG_Title}" />
<Setter Property="BorderBrush" Value="{DynamicResource Table_BD}"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
</Style>
<Style x:Key="InfBorder" TargetType="Border">
<Setter Property="Background" Value="{DynamicResource Table_BG_Content}" />
<Setter Property="BorderBrush" Value="{DynamicResource Table_BD}"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
</Style>
</Window.Resources>
<Viewbox Stretch="Fill"
Margin="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="85" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="5" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="5" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="90" />
<ColumnDefinition Width="90" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="90" />
<ColumnDefinition Width="90" />
</Grid.ColumnDefinitions>
<Grid Grid.ColumnSpan="6">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="5" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Border
CornerRadius="8,8,0,0"
Grid.ColumnSpan="2"
Background="#FF243664" >
<TextBlock
Text="Process Monitor" FontSize="13" Foreground="White" HorizontalAlignment="Center" Padding="8,0,0,0"/>
</Border >
<Border
Grid.Row="1"
Padding="5,1,0,1"
BorderThickness="1,0,1,1">
<TextBlock Text="PM1 Recipe" />
</Border>
<Border
Grid.Row="1"
Grid.Column="1"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.RecipeName}" HorizontalAlignment="Left" />
</Border>
<Border
Grid.Row="2"
Padding="5,1,0,1"
BorderThickness="1,0,1,1">
<TextBlock Text="PM2 Recipe" />
</Border>
<Border
Grid.Row="2"
Grid.Column="1"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.RecipeName}" HorizontalAlignment="Left"/>
</Border>
<!--<Border
Grid.Column="1"
CornerRadius="0,10,0,0"
Background="#FF243664"
Style="{StaticResource InfBorder}">
<TextBlock
Text="{Binding Pm1Monitor.RecipeName}" FontSize="14" Foreground="White" HorizontalAlignment="Left" Padding="8,0,0,0"/>
</Border>-->
<!--<Border
Grid.Row="1"
Grid.Column="2"
Grid.ColumnSpan="5"
Background="#FF243664"
Style="{StaticResource InfBorder}">
<TextBlock
Text="{Binding Pm2Monitor.RecipeName}" FontSize="14" Foreground="White" HorizontalAlignment="Left" Padding="8,0,0,0"/>
</Border>-->
</Grid>
<Border
Grid.Row="1"
Padding="5,1,0,1"
BorderThickness="1,1,1,1">
<TextBlock Text="Mode Name"/>
</Border>
<Border
Grid.Row="1"
Grid.Column="1"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,1,1,1">
<TextBlock Text="PM1" />
</Border>
<Border
Grid.Row="1"
Grid.Column="2"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,1,1,1">
<TextBlock Text="PM2" />
</Border>
<Border
Grid.Row="2"
Padding="5,1,0,1"
BorderThickness="1,0,1,1">
<TextBlock Text="Step No."/>
</Border>
<Border
Grid.Row="2"
Grid.Column="1"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.StepNumber}" />
</Border>
<Border
Grid.Row="2"
Grid.Column="2"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.StepNumber}" />
</Border>
<Border
Grid.Row="1"
Grid.Column="3"
Padding="5,1,0,1"
BorderThickness="0,1,1,1">
<TextBlock Text="Mode Name"/>
</Border>
<Border
Grid.Row="1"
Grid.Column="4"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,1,1,1">
<TextBlock Text="PM1" />
</Border>
<Border
Grid.Row="1"
Grid.Column="5"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,1,1,1">
<TextBlock Text="PM2" />
</Border>
<Border
Grid.Row="2"
Grid.Column="3"
Padding="5,1,0,1"
BorderThickness="0,0,1,1">
<TextBlock Text="Step Name"/>
</Border>
<Border
Grid.Row="2"
Grid.Column="4"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.StepName}" />
</Border>
<Border
Grid.Row="2"
Grid.Column="5"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.StepName}" />
</Border>
<Border
Grid.Row="3"
Padding="5,1,0,1"
BorderThickness="1,0,1,1">
<TextBlock Text="Step Time"/>
</Border>
<Border
Grid.Row="3"
Grid.Column="1"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.StepTime}" />
</Border>
<Border
Grid.Row="3"
Grid.Column="2"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.StepTime}" />
</Border>
<Border
Grid.Row="3"
Grid.Column="3"
Padding="5,1,0,1"
BorderThickness="0,0,1,1">
<TextBlock Text="Recipe Time" />
</Border>
<Border
Grid.Row="3"
Grid.Column="4"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.RecipeTime}" />
</Border>
<Border
Grid.Row="3"
Grid.Column="5"
Padding="5,1,0,1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.RecipeTime}" />
</Border>
<Border
Grid.Row="4"
Grid.ColumnSpan="6"
Background="{DynamicResource Table_BG_Content}"
BorderBrush="{DynamicResource Table_BD}"
BorderThickness="1,0,1,1"
SnapsToDevicePixels="True" />
<!-- PSU/SCR Mode -->
<Border
Grid.Row="5"
Grid.Column="0"
BorderThickness="1,0,1,1">
<TextBlock Text="PSU Mode"/>
</Border>
<Border
Grid.Row="5"
Grid.Column="1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1"
SnapsToDevicePixels="True">
<TextBlock Text="{Binding Pm1Monitor.PsuMode}" />
</Border>
<Border
Grid.Row="5"
Grid.Column="2"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1"
SnapsToDevicePixels="True">
<TextBlock Text="{Binding Pm2Monitor.PsuMode}" />
</Border>
<Border
Grid.Row="5"
Grid.Column="3"
BorderThickness="0,0,1,1">
<TextBlock Text="SCR Mode" />
</Border>
<Border
Grid.Row="5"
Grid.Column="4"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.ScrMode}" />
</Border>
<Border
Grid.Row="5"
Grid.Column="5"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.ScrMode}" />
</Border>
<!-- 底部三区功率 -->
<Border
Grid.Row="6"
Grid.Column="0"
BorderThickness="1,0,1,1">
<TextBlock Text="Power Inner" />
</Border>
<Border
Grid.Row="6"
Grid.Column="1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.PSU1Power}" />
</Border>
<Border
Grid.Row="6"
Grid.Column="2"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.PSU1Power}" />
</Border>
<Border
Grid.Row="6"
Grid.Column="3"
BorderThickness="0,0,1,1">
<TextBlock Text="Power Upper" />
</Border>
<Border
Grid.Row="6"
Grid.Column="4"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.SCR1Power}" />
</Border>
<Border
Grid.Row="6"
Grid.Column="5"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.SCR1Power}" />
</Border>
<Border
Grid.Row="7"
Grid.Column="0"
BorderThickness="1,0,1,1">
<TextBlock Text="Power Middle" />
</Border>
<Border
Grid.Row="7"
Grid.Column="1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.PSU2Power}" />
</Border>
<Border
Grid.Row="7"
Grid.Column="2"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.PSU2Power}" />
</Border>
<Border
Grid.Row="7"
Grid.Column="3"
BorderThickness="0,0,1,1">
<TextBlock Text="Power Middle" />
</Border>
<Border
Grid.Row="7"
Grid.Column="4"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.SCR2Power}" />
</Border>
<Border
Grid.Row="7"
Grid.Column="5"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.SCR2Power}" />
</Border>
<Border
Grid.Row="8"
Grid.Column="0"
BorderThickness="1,0,1,1">
<TextBlock Text="Power Outer" />
</Border>
<Border
Grid.Row="8"
Grid.Column="1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.PSU3Power}" />
</Border>
<Border
Grid.Row="8"
Grid.Column="2"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.PSU3Power}" />
</Border>
<Border
Grid.Row="8"
Grid.Column="3"
BorderThickness="0,0,1,1">
<TextBlock Text="Power Lower" />
</Border>
<Border
Grid.Row="8"
Grid.Column="4"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.SCR3Power}" />
</Border>
<Border
Grid.Row="8"
Grid.Column="5"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.SCR3Power}" />
</Border>
<Border
Grid.Row="9"
Grid.ColumnSpan="6"
Background="{DynamicResource Table_BG_Content}"
BorderBrush="{DynamicResource Table_BD}"
BorderThickness="1,0,1,1"/>
<!-- SCR功率 -->
<!-- 底部三区温度 -->
<!--<Border
Grid.Row="10"
Grid.Column="0"
BorderThickness="1,0,1,1">
<TextBlock Text="Pyro Lower" />
</Border>-->
<!--<Border
Grid.Row="10"
Grid.Column="1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.SCRL3InputTemp}" />
</Border>-->
<!--<Border
Grid.Row="10"
Grid.Column="2"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.SCRL3InputTemp}" />
</Border>-->
<Border
Grid.Row="10"
Grid.Column="3"
BorderThickness="0,0,1,1">
<TextBlock Text="Pressure" />
</Border>
<Border
Grid.Row="10"
Grid.Column="4"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.ChamberPressureFeedback}" />
</Border>
<Border
Grid.Row="10"
Grid.Column="5"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.ChamberPressureFeedback}" />
</Border>
<Border
Grid.Row="10"
Grid.Column="0"
BorderThickness="1,0,1,1">
<TextBlock Text="Pyro Middle"/>
</Border>
<Border
Grid.Row="10"
Grid.Column="1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.L2InputTemp}" />
</Border>
<Border
Grid.Row="10"
Grid.Column="2"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.L2InputTemp}" />
</Border>
<Border
Grid.Row="11"
Grid.Column="3"
BorderThickness="0,0,1,1">
<TextBlock
VerticalAlignment="Center"
FontSize="11"
Foreground="{DynamicResource FG_Black}"
Text="Rotate Speed "
TextWrapping="Wrap" />
</Border>
<Border
Grid.Row="11"
Grid.Column="4"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.ActualSpeedFeedback}" />
</Border>
<Border
Grid.Row="11"
Grid.Column="5"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.ActualSpeedFeedback}" />
</Border>
<Border
Grid.Row="11"
Grid.Column="0"
BorderThickness="1,0,1,1">
<TextBlock Text="Pyro Outer"/>
</Border>
<Border
Grid.Row="11"
Grid.Column="1"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm1Monitor.L3InputTemp}" />
</Border>
<Border
Grid.Row="11"
Grid.Column="2"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock Text="{Binding Pm2Monitor.L3InputTemp}" />
</Border>
<!--<Border
Grid.Row="12"
Grid.Column="3"
BorderThickness="0,0,1,1">
<TextBlock
VerticalAlignment="Center"
FontSize="11"
Foreground="{DynamicResource FG_Black}"
Text=""
TextWrapping="Wrap" />
</Border>
<Border
Grid.Row="12"
Grid.Column="4"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock />
</Border>
<Border
Grid.Row="12"
Grid.Column="5"
Style="{StaticResource InfBorder}"
BorderThickness="0,0,1,1">
<TextBlock />
</Border>-->
<!-- 腔体压力 转速 -->
</Grid>
</Viewbox>
</Window>

View File

@ -1,27 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Shapes;
namespace SicUI
{
/// <summary>
/// Window2.xaml 的交互逻辑
/// </summary>
public partial class ProcessMonitorView : Window
{
public ProcessMonitorView()
{
InitializeComponent();
}
}
}

View File

@ -1,213 +0,0 @@
using Aitex.Core.Util;
using Aitex.Core.Common.DeviceData;
using MECF.Framework.UI.Client.ClientBase;
using System;
using Aitex.Core.RT.Device.PmDevices;
using SicUI.Models;
namespace SicUI
{
public class ProcessMonitorViewModel : SicModuleUIViewModelBase
{
public ProcessMonitorViewModel()
{
Pm1Monitor = new MonitorModel() { SystemName = "PM1" };
Pm2Monitor = new MonitorModel() { SystemName = "PM2" };
}
public MonitorModel Pm1Monitor { get; set; }
public MonitorModel Pm2Monitor { get; }
protected override void OnInitialize()
{
base.OnInitialize();
Pm1Monitor.SubscribeKeys();
Pm2Monitor.SubscribeKeys();
}
protected override void OnActivate()
{
base.OnActivate();
Pm1Monitor.EnableTimer(true);
Pm2Monitor.EnableTimer(true);
}
protected override void OnDeactivate(bool close)
{
base.OnDeactivate(close);
Pm1Monitor.EnableTimer(false);
Pm2Monitor.EnableTimer(false);
}
}
public class MonitorModel : SicModuleUIViewModelBase, ISupportMultipleSystem
{
public string TargetModule { get; set; }
[Subscription("SelectedRecipeName")]
public string RecipeName { get; set; }
[Subscription("RecipeStepNumber")]
public int RecipeStepNumber { get; set; }
[Subscription("RecipeStepName")]
public string RecipeStepName { get; set; }
[Subscription("RecipeStepElapseTime")]
public int RecipeStepElapseTime { get; set; }
[Subscription("RecipeStepTime")]
public int RecipeStepTime { get; set; }
[Subscription("RecipeTotalElapseTime")]
public int RecipeTotalElapseTime { get; set; }
[Subscription("RecipeTotalTime")]
public int RecipeTotalTime { get; set; }
[Subscription("TC1.HeaterModeSetPoint")]
public float TC1HeaterMode { get; set; }
[Subscription("TC2.HeaterModeSetPoint")]
public float TC2HeaterMode { get; set; }
[Subscription("SCR1.PowerFeedBack")]
public float SCR1Power { get; set; }
[Subscription("SCR2.PowerFeedBack")]
public float SCR2Power { get; set; }
[Subscription("SCR3.PowerFeedBack")]
public float SCR3Power { get; set; }
[Subscription("PSU1.OutputPowerFeedBack")]
public float PSU1Power { get; set; }
[Subscription("PSU2.OutputPowerFeedBack")]
public float PSU2Power { get; set; }
[Subscription("PSU3.OutputPowerFeedBack")]
public float PSU3Power { get; set; }
[Subscription("TC1.L2InputTempSetPoint")]
public float L2InputTemp { get; set; }
[Subscription("TC1.L3InputTempSetPoint")]
public float L3InputTemp { get; set; }
[Subscription("TC2.L3InputTempSetPoint")]
public float SCRL3InputTemp { get; set; }
[Subscription("PMServo.ActualSpeedFeedback")]
public float ActualSpeedFeedback { get; set; }
[Subscription("PT1.DeviceData")]
public AITPressureMeterData ChamPress { get; set; }
[Subscription("TC1.TempCtrlTCIN")]
public float PM1Temprature { get; set; }
[Subscription("Status")]
public string Status { get; set; }
public bool IsPMProcess => Status == "Process" || Status == "PostProcess" || Status == "Paused" ||
Status == "PMMacroPause" || Status == "PMMacro" || Status == "PostPMMacro";
public bool IsPreProcess => Status == "PreProcess" || Status == "PrePMMacro";
public string StepNumber
{
get
{
if (IsPMProcess)
{
return $"{RecipeStepNumber}";
}
else if (IsPreProcess)
{
return "0";
}
return "--";
}
set
{
}
}
public string StepName
{
get
{
if (IsPMProcess)
{
return $"{RecipeStepName}";
}
else if (IsPreProcess)
{
return "0";
}
return "--";
}
}
public string StepTime
{
get
{
if (IsPMProcess)
{
return $"{RecipeStepElapseTime}/{RecipeStepTime}";
}
else if (IsPreProcess)
{
return "0";
}
return "--";
}
}
public string RecipeTime
{
get
{
if (IsPMProcess)
{
return $"{RecipeTotalElapseTime}/{RecipeTotalTime}";
}
else if (IsPreProcess)
{
return "0";
}
return "--";
}
}
public string PsuMode
{
get
{
return Enum.GetName(typeof(DicMode.HeaterControlMode),Convert.ToInt32( TC1HeaterMode));
}
}
public string ScrMode
{
get
{
return Enum.GetName(typeof(DicMode.HeaterControlMode), Convert.ToInt32(TC2HeaterMode));
}
}
public string ChamberPressureFeedback => ChamPress?.FeedBack.ToString(ChamPress?.FormatString);
}
}

View File

@ -212,6 +212,7 @@
<Compile Include="Controls\WaferAssociationUnitLite.xaml.cs">
<DependentUpon>WaferAssociationUnitLite.xaml</DependentUpon>
</Compile>
<Compile Include="GlobalUsings.cs" />
<Compile Include="Models\Maintenances\RuntimeView.xaml.cs">
<DependentUpon>RuntimeView.xaml</DependentUpon>
</Compile>
@ -341,8 +342,6 @@
</Compile>
<Compile Include="Bootstrapper.cs" />
<Compile Include="MainViewModel.cs" />
<Compile Include="Models\PMs\PMProcessGasFlowCounterViewModel.cs" />
<Compile Include="ProcessMonitorViewModel.cs" />
<Compile Include="RtIpAddressInput.xaml.cs">
<DependentUpon>RtIpAddressInput.xaml</DependentUpon>
</Compile>
@ -351,9 +350,6 @@
<DependentUpon>Splash.xaml</DependentUpon>
</Compile>
<Compile Include="StartupArguments.cs" />
<Compile Include="ProcessMonitorView.xaml.cs">
<DependentUpon>ProcessMonitorView.xaml</DependentUpon>
</Compile>
<Compile Include="TimeredMainViewModel.cs" />
<Page Include="Controls\AITPump.xaml">
<SubType>Designer</SubType>
@ -567,10 +563,6 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Models\PMs\PMProcessView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Models\PMs\PMServoView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@ -583,20 +575,12 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="ProcessMonitorView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Models\PMs\PMOperationView.xaml.cs">
<DependentUpon>PMOperationView.xaml</DependentUpon>
</Compile>
<Compile Include="Models\PMs\PMOperationViewModel.cs" />
<Compile Include="Models\PMs\PMProcessView.xaml.cs">
<DependentUpon>PMProcessView.xaml</DependentUpon>
</Compile>
<Compile Include="Models\PMs\PMProcessViewModel.cs" />
<Compile Include="Models\PMs\PMServoView.xaml.cs">
<DependentUpon>PMServoView.xaml</DependentUpon>
</Compile>

View File

@ -1,5 +1,4 @@
using Aitex.Core.Util;
using MECF.Framework.Common.DataCenter;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;