Sic03-8inch/SicUI/Models/Maintenances/TM/DeviceViewModel.cs

424 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using SicUI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aitex.Core.RT.Event;
using System.Threading;
using Aitex.Core.Common.DeviceData;
namespace SicUI.Client.Models.Platform.TM
{
public class DeviceViewModel : SicUIViewModelBase
{
[Subscription("LoadLock.IsOnline")]
public bool LoadLockIsOnline { get; set; }
[Subscription("PM1.IsOnline")]
public bool PM1IsOnline { get; set; }
[Subscription("PM1.Status")]
public string PM1Status{ get; set; }
[Subscription("Load.Rotation.IsServoBusy")]
public bool LdRotationIsBusy { get; set; }
[Subscription("Load.Rotation.IsServoOn")]
public bool LdRotationIsServoOn { get; set; }
[Subscription("Load.Rotation.IsMoveDone")]
public bool LdRotationIsServoDone { get; set; }
[Subscription("Load.Rotation.IsServoError")]
public bool LdRotationIsServoError { get; set; }
[Subscription("TM.LLTrayPresence.DeviceData")]
public AITSensorData LoadTrayPresence { get; set; }
[Subscription("TM.LoadTrayHomeSensor.DeviceData")]
public AITSensorData LoadTrayHomeSensor { get; set; }
[Subscription("TM.LLWaferPlaced.DeviceData")]
public AITSensorData LoadWaferPlaced { get; set; }
[Subscription("Load.Rotation.CurPos")]
public double LdRotationCurPos { get; set; }
[Subscription("Load.Rotation.CCD1Degree")]
public double LdCCD1Degree { get; set; }
[Subscription("Load.Rotation.CCD2Degree")]
public double LdCCD2Degree { get; set; }
public bool LdRotationBtnEnable => !LdRotationIsBusy && !LdRotationIsServoError && !LoadLockIsOnline;
#region AutoTransferCondition
[Subscription("Scheduler.AutoTransferConditionText")]
public string AutoTransferConditionText { get; set; }
[Subscription("Scheduler.WhichCondition")]
public string WhichCondition { get; set; }
[Subscription("Aligner.HiWinAligner.WaferSize")]
public string WaferSize { get; set; }
[Subscription("Aligner.HiWinAligner.WaferType")]
public string WaferType { get; set; }
[Subscription("Aligner.HiWinAligner.WaferMaterial")]
public string WaferMaterialData { get; set; }
[Subscription("Aligner.HiWinAligner.WaferOrientation")]
public string WaferOrientation { get; set; }
public void AutoTransferCond(string sCond)
{
AutoTransferConditionText = "";
WhichCondition = sCond;
}
#endregion
public DeviceViewModel()
{
AutoTransferConditionText = "";
}
public void LdRotationStop()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.Stop");
}
public void LdRotationReset()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.ServoReset");
}
public void LdRotationServoOn()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.ServoOn");
}
public void LdRotationMoveOneCircle()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.MoveOneCircle");
}
public void LdRotationRelativeHome()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.MoveRelativeHome");
}
public void LdRotationRelativeHomeOffset()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.HomeOffset");
}
public void LdRotationMoveCCD1Pos()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.MoveCCD1Pos");
}
public void LdRotationMoveCCD2Pos()
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.MoveCCD2Pos");
}
public void LdRotationJogCW(float angle)
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.JogCW", angle);
}
public void LdRotationJogCCW(float angle)
{
InvokeClient.Instance.Service.DoOperation($"Load.Rotation.JogCCW", angle);
}
#region CCD
[Subscription("TM.KeyenceCVX300F.Result")]
public string CCDResult { get; set; }
public void CCDTrig()
{
int iConditionId = CCDPosSelected == "Pos1" ? 1 : 2;
InvokeClient.Instance.Service.DoOperation("TM.KeyenceCVX300F.ClearResult");
InvokeClient.Instance.Service.DoOperation("TM.KeyenceCVX300F.GetResult", iConditionId);
}
public void RunR0()
{
InvokeClient.Instance.Service.DoOperation("TM.KeyenceCVX300F.RunR0");
}
private List<string> _CCDPos = new List<string>() { "Pos1", "Pos2" };
public List<string> CCDPos
{
get { return _CCDPos; }
set { _CCDPos = value; }
}
private string _CCDPosSelect = "Pos1";
public string CCDPosSelected
{
get { return _CCDPosSelect; }
set { _CCDPosSelect = value; }
}
#endregion
#region hw aligner
//晶圆尺寸
private List<string> _waferSizes = new List<string>() { "0出厂值", "4", "5", "6", "8" };
public List<string> WaferSizes
{
get { return _waferSizes; }
set { _waferSizes = value; NotifyOfPropertyChange("WaferSize"); }
}
private string _waferSizeSelected;
public string WaferSizeSelected
{
get { return _waferSizeSelected; }
set {
if (value.CompareTo(_waferSizes[0]) == 0)
{
_waferSizeSelected = "0";
}
else
{
_waferSizeSelected = value;
}
NotifyOfPropertyChange("WaferSizeSelected");
}
}
//晶圆类型
private List<string> _waferTypes = new List<string>() {
"0无Notch或Flat的晶圆",
"1有NOtch的晶圆出厂值",
"2有一个或多个Flat的晶圆"
};
public List<string> WaferTypes
{
get { return _waferTypes; }
set { _waferTypes = value; NotifyOfPropertyChange("WaferTypes"); }
}
private string _waferTypeSelected;
public string WaferTypeSelected
{
get { return _waferTypeSelected; }
set {
if (value.CompareTo(_waferTypes[0]) == 0)
{
_waferTypeSelected = "0";
}
else if(value.CompareTo(_waferTypes[1]) == 0)
{
_waferTypeSelected = "1";
}
else
{
_waferTypeSelected = "2";
}
NotifyOfPropertyChange("WaferTypeSelected");
}
}
//寻边材质
private List<string> _waferMaterial = new List<string>() {
"0:不透明(出厂值)",
"1:透明、半透明"
};
public List<string> WaferMaterial
{
get { return _waferMaterial; }
set { _waferMaterial = value; NotifyOfPropertyChange("WaferMaterial"); }
}
private string _waferMaterialSelected;
public string WaferMaterialSelected
{
get { return _waferMaterialSelected; }
set {
if(value.CompareTo(_waferMaterial[0]) == 0)
{
_waferMaterialSelected = "0";
}
else
{
_waferMaterialSelected = "1";
}
NotifyOfPropertyChange("WaferMaterialSelected");
}
}
//qbh 20220701
public void Aligner_WaferSize(string sValue)
{
InvokeClient.Instance.Service.DoOperation($"Aligner.HiWinAligner.HwWaferSize", WaferSizeSelected);
}
public void Aligner_WaferType(string sValue)
{
InvokeClient.Instance.Service.DoOperation($"Aligner.HiWinAligner.HwWaferType", WaferTypeSelected);
}
public void Aligner_WaferMaterial(string sValue)
{
InvokeClient.Instance.Service.DoOperation($"Aligner.HiWinAligner.HwWaferMaterial", WaferMaterialSelected);
}
public void Aligner_WaferOrientation(string sValue)
{
string sDegree = sValue.Trim();
if(sDegree.Length == 0)
{
EV.PostWarningLog("TM", "Aligner parameter error: Wafer Orientation is empty.");
return;
}
int iDegree = -1;
try
{
iDegree = Convert.ToInt32(sDegree);
}
catch(Exception ex)
{
EV.PostWarningLog("TM", "Aligner parameter error: Wafer Orientation degree should be in 0-3599.");
return;
}
InvokeClient.Instance.Service.DoOperation($"Aligner.HiWinAligner.HwWaferOrientation", sDegree);
}
public void Aligner_SaveParameters()
{
InvokeClient.Instance.Service.DoOperation($"Aligner.HiWinAligner.HwSaveParameters");
}
#endregion
#region UPS
//PM1 UPSA
[Subscription("PM1.ITAUPSA.BatteryUnderResidue")]
public float UPSPM1A_BatteryUnderResidue { get; set; }
[Subscription("PM1.ITAUPSA.BatteryRemainsTime")]
public float UPSPM1A_BatteryRemainsTime { get; set; }
[Subscription("PM1.ITAUPSA.BatteryVoltage")]
public float UPSPM1A_BatteryVoltage { get; set; }
[Subscription("PM1.ITAUPSA.InputVoltage")]
public float UPSPM1A_InputVoltage { get; set; }
//PM1 UPSB
[Subscription("PM1.ITAUPSB.BatteryUnderResidue")]
public float UPSPM1B_BatteryUnderResidue { get; set; }
[Subscription("PM1.ITAUPSB.BatteryRemainsTime")]
public float UPSPM1B_BatteryRemainsTime { get; set; }
[Subscription("PM1.ITAUPSB.BatteryVoltage")]
public float UPSPM1B_BatteryVoltage { get; set; }
[Subscription("PM1.ITAUPSB.InputVoltage")]
public float UPSPM1B_InputVoltage { get; set; }
//PM2 UPSA
[Subscription("PM2.ITAUPSA.BatteryUnderResidue")]
public float UPSPM2A_BatteryUnderResidue { get; set; }
[Subscription("PM2.ITAUPSA.BatteryRemainsTime")]
public float UPSPM2A_BatteryRemainsTime { get; set; }
[Subscription("PM2.ITAUPSA.BatteryVoltage")]
public float UPSPM2A_BatteryVoltage { get; set; }
[Subscription("PM2.ITAUPSA.InputVoltage")]
public float UPSPM2A_InputVoltage { get; set; }
//PM2 UPSB
[Subscription("PM2.ITAUPSB.BatteryUnderResidue")]
public float UPSPM2B_BatteryUnderResidue { get; set; }
[Subscription("PM2.ITAUPSB.BatteryRemainsTime")]
public float UPSPM2B_BatteryRemainsTime { get; set; }
[Subscription("PM2.ITAUPSB.BatteryVoltage")]
public float UPSPM2B_BatteryVoltage { get; set; }
[Subscription("PM2.ITAUPSB.InputVoltage")]
public float UPSPM2B_InputVoltage { get; set; }
#endregion
#region Ring
[Subscription("PM1.ConfinementRing.RingCurPos")]
public float RingCurPos { get; set; }
[Subscription("PM1.ConfinementRing.RingUpPos")]
public float RingUpPos { get; set; }
[Subscription("PM1.ConfinementRing.RingDownPos")]
public float RingDownPos { get; set; }
[Subscription("PM1.ConfinementRing.RingUpSensor")]
public bool RingUpSensor { get; set; }
[Subscription("PM1.ConfinementRing.RingDownSensor")]
public bool RingDownSensor { get; set; }
[Subscription("PM1.ConfinementRing.RingDone")]
public bool RingDone { get; set; }
[Subscription("PM1.ConfinementRing.RingIsServoOn")]
public bool RingIsServoOn { get; set; }
[Subscription("PM1.ConfinementRing.RingIsBusy")]
public bool RingIsBusy { get; set; }
[Subscription("PM1.ConfinementRing.RingIsAlarm")]
public bool RingIsAlarm { get; set; }
public bool ConfinementRingBtnEnable => !RingIsBusy && !RingIsAlarm && !PM1IsOnline && PM1Status != "Process";
public void RingServoStop()
{
InvokeClient.Instance.Service.DoOperation("PM1.ConfinementRing.ServoStop");
}
public void RingServoOn()
{
InvokeClient.Instance.Service.DoOperation("PM1.ConfinementRing.ServoOn");
}
public void RingServoReset()
{
InvokeClient.Instance.Service.DoOperation("PM1.ConfinementRing.ServoReset");
}
public void RingMoveUpPos()
{
InvokeClient.Instance.Service.DoOperation("PM1.ConfinementRing.MoveUpPos");
}
public void RingMoveDownPos()
{
InvokeClient.Instance.Service.DoOperation("PM1.ConfinementRing.MoveDownPos");
}
public void RingJogUp(float distance)
{
InvokeClient.Instance.Service.DoOperation("PM1.ConfinementRing.JogUp",distance);
}
public void RingJogDown(float distance)
{
InvokeClient.Instance.Service.DoOperation("PM1.ConfinementRing.JogDown",distance);
}
#endregion
}
}