236 lines
7.2 KiB
C#
236 lines
7.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Aitex.Core.Common;
|
|
using Aitex.Core.RT.DataCenter;
|
|
using Aitex.Core.RT.Device.Devices;
|
|
using Aitex.Core.RT.Device.Unit;
|
|
using Aitex.Core.RT.Event;
|
|
using Aitex.Core.RT.IOCore;
|
|
using Aitex.Core.RT.Log;
|
|
using Aitex.Core.RT.SCCore;
|
|
using Aitex.Core.Util;
|
|
using Aitex.Sorter.Common;
|
|
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDK;
|
|
|
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts
|
|
{
|
|
public class OpenStageLoadPortSuper1 : LoadPort
|
|
{
|
|
public override bool IsWaferProtrude
|
|
{
|
|
get
|
|
{
|
|
return _diWaferProtrude.Value;
|
|
}
|
|
|
|
}
|
|
private IoSensor _diPresent3;
|
|
private IoSensor _diPresent4;
|
|
private IoSensor _diPresent6;
|
|
private IoSensor _diWaferProtrude;
|
|
|
|
|
|
|
|
|
|
|
|
//private int _alarmCount = 0;
|
|
//private int _presentCount = 0;
|
|
//private int _BusyingCount = 0;
|
|
//private int _CompleteCount = 0;
|
|
|
|
|
|
|
|
|
|
private RD_TRIG _trigPresentAbsent = new RD_TRIG();
|
|
|
|
private R_TRIG _trigWaferProtrude = new R_TRIG();
|
|
|
|
|
|
public override LoadportCassetteState CassetteState
|
|
{
|
|
get
|
|
{
|
|
return _trigPresentAbsent.M ? LoadportCassetteState.Normal : LoadportCassetteState.Absent;
|
|
}
|
|
}
|
|
|
|
public OpenStageLoadPortSuper1(string module, string name, IoSensor[] diPresents, IoTrigger[] doIndicators) : base(
|
|
module, name)
|
|
{
|
|
if (diPresents[0] == null)
|
|
throw new ArgumentException("DI present cannot be null", "diPresent");
|
|
if (diPresents[1] == null)
|
|
throw new ArgumentException("DI present cannot be null", "diPresent");
|
|
if (diPresents[2] == null)
|
|
throw new ArgumentException("DI present cannot be null", "diPresent");
|
|
if (string.IsNullOrEmpty(name))
|
|
throw new ArgumentException("name cannot be null or empty", "name");
|
|
|
|
_diPresent3 = diPresents[0];
|
|
_diPresent4 = diPresents[1];
|
|
_diPresent6 = diPresents[2];
|
|
_diWaferProtrude = diPresents[3];
|
|
|
|
|
|
IsMapWaferByLoadPort = false;
|
|
PortType = EnumLoadPortType.OpenStage;
|
|
SetPlaced(false);
|
|
SetPresent(false);
|
|
Initalized = true;
|
|
//InfoPadCarrierIndex = SC.GetValue<int>($"CarrierInfo.{Name}CarrierIndex");
|
|
}
|
|
|
|
public override bool Initialize()
|
|
{
|
|
DATA.Subscribe($"{Name}.WaferSize", () => GetCurrentWaferSize().ToString());
|
|
DATA.Subscribe($"{Name}.WaferSizeInfo", () => $"Index:{InfoPadCarrierIndex}\r\n" +
|
|
$"WaferSize:{GetCurrentWaferSize()}");
|
|
LoadPortIndicatorLightMap =
|
|
new Dictionary<IndicatorType, Indicator>()
|
|
{
|
|
{IndicatorType.Presence, Indicator.PRESENCE},
|
|
{IndicatorType.Alarm, Indicator.ALARM},
|
|
{IndicatorType.Busy, Indicator.RESERVE1 },
|
|
{IndicatorType.Complete, Indicator.RESERVE2},
|
|
};
|
|
|
|
return base.Initialize();
|
|
}
|
|
|
|
public override WaferSize GetCurrentWaferSize()
|
|
{
|
|
if (InfoPadCarrierIndex == 1) return WaferSize.WS3;
|
|
if (InfoPadCarrierIndex == 2) return WaferSize.WS4;
|
|
if (InfoPadCarrierIndex == 4) return WaferSize.WS6;
|
|
|
|
return WaferSize.WS0;
|
|
}
|
|
|
|
public override void Monitor()
|
|
{
|
|
try
|
|
{
|
|
base.Monitor();
|
|
|
|
bool present3 = _diPresent3.Value && (!_diPresent4.Value) && (!_diPresent6.Value);
|
|
bool present4 = (!_diPresent3.Value) && (_diPresent4.Value) && (!_diPresent6.Value);
|
|
bool present6 = (!_diPresent3.Value) && (!_diPresent4.Value) && (_diPresent6.Value);
|
|
|
|
_trigPresentAbsent.CLK = present3|| present4 || present6;
|
|
if (_trigPresentAbsent.R)
|
|
{
|
|
SetPresent(true);
|
|
SetPlaced(true);
|
|
}
|
|
if (_trigPresentAbsent.T)
|
|
{
|
|
SetPresent(false);
|
|
SetPlaced(false);
|
|
_isMapped = false;
|
|
}
|
|
int infopadindex = (_diPresent3.Value ? 1 : 0) + (_diPresent4.Value ? 2 : 0) + (_diPresent6.Value ? 4 : 0);
|
|
if (InfoPadCarrierIndex != infopadindex)
|
|
{
|
|
InfoPadCarrierIndex = infopadindex;
|
|
SC.SetItemValue($"CarrierInfo.{Name}CarrierIndex", infopadindex);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{ LOG.Write(ex); }
|
|
}
|
|
|
|
|
|
public override void Reset()
|
|
{
|
|
base.Reset();
|
|
|
|
_trigWaferProtrude.RST = true;
|
|
}
|
|
|
|
public override bool IsEnableMapWafer()
|
|
{
|
|
bool present3 = _diPresent3.Value && (!_diPresent4.Value) && (!_diPresent6.Value);
|
|
bool present4 = (!_diPresent3.Value) && (_diPresent4.Value) && (!_diPresent6.Value);
|
|
bool present6 = (!_diPresent3.Value) && (!_diPresent4.Value) && (_diPresent6.Value);
|
|
|
|
return (!_diWaferProtrude.Value) && (present4 ||present3||present6);
|
|
}
|
|
|
|
public override bool IsEnableTransferWafer()
|
|
{
|
|
return IsEnableTransferWafer(out _);
|
|
}
|
|
|
|
public override bool IsEnableTransferWafer(out string reason)
|
|
{
|
|
bool present3 = !_diPresent3.Value && (!_diPresent4.Value) && (!_diPresent6.Value);
|
|
bool present4 = (!_diPresent3.Value) && (_diPresent4.Value) && (!_diPresent6.Value);
|
|
bool present6 = (_diPresent3.Value) && (!_diPresent4.Value) && (_diPresent6.Value);
|
|
|
|
if ((!present4) && (!present6) &&(!present3))
|
|
{
|
|
reason = "no cassette placed";
|
|
return false;
|
|
}
|
|
|
|
|
|
if (_diWaferProtrude.Value)
|
|
{
|
|
reason = "wafer protrude";
|
|
return false;
|
|
}
|
|
if (!_isMapped)
|
|
{
|
|
reason = "Not Mapped";
|
|
return false;
|
|
}
|
|
if (MapError)
|
|
{
|
|
reason = "Mapping error";
|
|
return false;
|
|
}
|
|
|
|
reason = "";
|
|
return true;
|
|
}
|
|
|
|
public override bool Unload(out string reason)
|
|
{
|
|
reason = "";
|
|
|
|
_isMapped = false;
|
|
|
|
OnUnloaded();
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool QueryState(out string reason)
|
|
{
|
|
reason = string.Empty;
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
public override FoupDoorState DoorState
|
|
{
|
|
get
|
|
{
|
|
return FoupDoorState.Open;
|
|
}
|
|
}
|
|
public override bool SetIndicator(Indicator light, IndicatorState state, out string reason)
|
|
{
|
|
reason = "";
|
|
return true;
|
|
}
|
|
|
|
|
|
}
|
|
}
|