从8号机移植PMProcessView视图及其相关视图,并编译通过。
This commit is contained in:
parent
072e92104f
commit
592ed68e78
|
@ -0,0 +1,526 @@
|
|||
#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.CenterViews.Modules.PM;
|
||||
using MECF.Framework.UI.Client.ClientBase;
|
||||
using Sicentury.Core;
|
||||
|
||||
#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 = "Init";
|
||||
_pmProcessVm = vm;
|
||||
_pmProcessVm.PropertyChanged += VmOnPropertyChanged;
|
||||
|
||||
GasFlowCountCollection = new ObservableQueue<PmGasFlowCountInfo>(MAX_ROWS);
|
||||
GasFlowCountCollection.CollectionChanged += GasFlowCountCollectionOnCollectionChanged;
|
||||
|
||||
// 加载历史记录。
|
||||
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(PMProcessViewModel.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 == "ProcessIdle" &&
|
||||
currentStatus == "PreProcess")
|
||||
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool CheckIfProcessStopped(string previousStatus, string currentStatus)
|
||||
{
|
||||
if ((previousStatus != "ProcessIdle" &&
|
||||
currentStatus == "ProcessIdle") ||
|
||||
(previousStatus != "Error" &&
|
||||
currentStatus == "Error"))
|
||||
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
|
@ -0,0 +1,21 @@
|
|||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace MECF.Framework.UI.Client.CenterViews.Modules.PM
|
||||
{
|
||||
/// <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
|
@ -0,0 +1,598 @@
|
|||
<Window x:Class="MECF.Framework.UI.Client.CenterViews.Modules.PM.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>
|
|
@ -0,0 +1,15 @@
|
|||
using System.Windows;
|
||||
|
||||
namespace MECF.Framework.UI.Client.CenterViews.Modules.PM
|
||||
{
|
||||
/// <summary>
|
||||
/// ProcessMonitorView.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class ProcessMonitorView : Window
|
||||
{
|
||||
public ProcessMonitorView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,212 @@
|
|||
using Aitex.Core.Util;
|
||||
using Aitex.Core.Common.DeviceData;
|
||||
using MECF.Framework.UI.Client.ClientBase;
|
||||
using System;
|
||||
using Aitex.Core.RT.Device.PmDevices;
|
||||
|
||||
namespace MECF.Framework.UI.Client.CenterViews.Modules.PM
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
|
@ -236,6 +236,13 @@
|
|||
<DependentUpon>PMJobListView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CenterViews\JobList\PMJobListViewModel.cs" />
|
||||
<Compile Include="CenterViews\Modules\PM\PMProcessGasFlowCounterViewModel.cs" />
|
||||
<Compile Include="CenterViews\Modules\PM\PMProcessView.xaml.cs">
|
||||
<DependentUpon>PMProcessView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CenterViews\Modules\PM\PMProcessViewModel.cs" />
|
||||
<Compile Include="CenterViews\Modules\PM\ProcessMonitorView.xaml.cs" />
|
||||
<Compile Include="CenterViews\Modules\PM\ProcessMonitorViewModel.cs" />
|
||||
<Compile Include="Ctrlib\Controls\PanelLocker.xaml.cs">
|
||||
<DependentUpon>PanelLocker.xaml</DependentUpon>
|
||||
</Compile>
|
||||
|
@ -790,6 +797,7 @@
|
|||
<Compile Include="RecipeEditorLib\RecipeModel\RecipeStep.cs" />
|
||||
<Compile Include="RecipeEditorLib\RecipeModel\RecipeStepCollection.cs" />
|
||||
<Compile Include="RecipeEditorLib\RecipeModel\RecipeStepValidationInfo.cs" />
|
||||
<Compile Include="SicModuleUIViewModelBase.cs" />
|
||||
<Compile Include="Themes\CenterBorderGapMaskConverter.cs" />
|
||||
<Compile Include="TrayThickness\CoatingData.cs" />
|
||||
<Compile Include="TrayThickness\HistoryData\HistoryCoatingManager.cs" />
|
||||
|
@ -868,6 +876,14 @@
|
|||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="CenterViews\Modules\PM\PMProcessView.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="CenterViews\Modules\PM\ProcessMonitorView.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="RecipeEditorLib\DGExtension\DataGridRecipe.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
|
@ -916,6 +932,7 @@
|
|||
<Resource Include="Resources\Images\units\rfOff.png" />
|
||||
<Resource Include="Resources\Images\units\rfOn.png" />
|
||||
<Content Include="ReleaseNotes.md" />
|
||||
<Content Include="Resources\Images\chamber.png" />
|
||||
<Content Include="Resources\Images\foupTopView3.png" />
|
||||
<Resource Include="Resources\Images\units\chiller_right_error.png" />
|
||||
<Resource Include="Resources\Images\units\chiller_right_off.png" />
|
||||
|
@ -923,6 +940,9 @@
|
|||
<Resource Include="Resources\Images\units\carrier.png" />
|
||||
<Resource Include="Resources\Images\units\CassetteTopViewNoWafer.png" />
|
||||
<Resource Include="Resources\Images\units\CassetteTopviewWithWafer.png" />
|
||||
<Resource Include="Resources\Images\showerhead.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Resource>
|
||||
<Content Include="Themes\DeepBlueBackUp\Folder_Close.png" />
|
||||
<Content Include="Themes\DeepBlueBackUp\Folder_Open.png" />
|
||||
<Content Include="Themes\DeepBlueBackUp\Folder_Unable.png" />
|
||||
|
@ -1787,6 +1807,10 @@
|
|||
<Project>{efad063f-fa97-42b7-87f8-8279eba30d34}</Project>
|
||||
<Name>MECF.Framework.Common</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\MECF.Framework.RT.EquipmentLibrary\MECF.Framework.RT.EquipmentLibrary.csproj">
|
||||
<Project>{090A1E9C-1087-4C8A-B4E0-FF074459E071}</Project>
|
||||
<Name>MECF.Framework.RT.EquipmentLibrary</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\MECF.Framework.UI.Core\MECF.Framework.UI.Core.csproj">
|
||||
<Project>{2C9E1DF3-1ABA-4972-BE60-41DD9B3C47A7}</Project>
|
||||
<Name>MECF.Framework.UI.Core</Name>
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 8.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,202 @@
|
|||
using MECF.Framework.UI.Client.ClientBase;
|
||||
using System.Windows;
|
||||
|
||||
namespace MECF.Framework.UI.Client
|
||||
{
|
||||
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"];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue