467 lines
16 KiB
C#
467 lines
16 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using Aitex.Core.Common.DeviceData;
|
|||
|
using Aitex.Core.RT.Event;
|
|||
|
using Aitex.Core.RT.Log;
|
|||
|
using Aitex.Sorter.Common;
|
|||
|
using MECF.Framework.Common.Communications;
|
|||
|
|
|||
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDKB
|
|||
|
{
|
|||
|
public class TDKBLoadPortHandler : HandlerBase
|
|||
|
{
|
|||
|
public TDKBLoadPort Device { get; set; }
|
|||
|
public string Command;
|
|||
|
protected TDKBLoadPortHandler(TDKBLoadPort device, string command, string para) : base(BuildMesage(command, para))
|
|||
|
{
|
|||
|
Device = device;
|
|||
|
Command = command;
|
|||
|
Name = command;
|
|||
|
}
|
|||
|
public static string BuildMesage(string command, string para)
|
|||
|
{
|
|||
|
if(string.IsNullOrEmpty(para))
|
|||
|
return $"s00{command};\r";
|
|||
|
return $"s00{command}{para};\r";
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
|
|||
|
{
|
|||
|
TDKBLoadPortMessage response = msg as TDKBLoadPortMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
transactionComplete = false;
|
|||
|
if (response.IsAck)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Acked);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsError)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
if (response.IsNak)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
if (response.IsEvent)
|
|||
|
{
|
|||
|
SendAck();
|
|||
|
if (response.Command.Contains(Command))
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public void HandleEvent(string content)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public void SendAck()
|
|||
|
{
|
|||
|
//Device.Connection.SendMessage(new byte[] { 0x06 });
|
|||
|
}
|
|||
|
|
|||
|
public void Retry()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public virtual bool PaseData(byte[] data)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class TDKBSetHandler : TDKBLoadPortHandler
|
|||
|
{
|
|||
|
private string setcommand;
|
|||
|
public TDKBSetHandler(TDKBLoadPort device, string command, string para) : base(device, BuildData(command), para)
|
|||
|
{
|
|||
|
setcommand = command;
|
|||
|
}
|
|||
|
private static string BuildData(string command)
|
|||
|
{
|
|||
|
return "SET:" + command;
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
|
|||
|
{
|
|||
|
TDKBLoadPortMessage response = msg as TDKBLoadPortMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
//Device.TaExecuteSuccss = true;
|
|||
|
transactionComplete = false;
|
|||
|
if (response.IsAck)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Acked);
|
|||
|
transactionComplete = false;
|
|||
|
if (setcommand.Contains("FSB"))
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
if (response.IsBusy)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
if (response.IsNak)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
|
|||
|
transactionComplete = true;
|
|||
|
//ParseError(response.Data);
|
|||
|
}
|
|||
|
if (response.IsError)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
|
|||
|
transactionComplete = true;
|
|||
|
|
|||
|
}
|
|||
|
if (response.IsEvent)
|
|||
|
{
|
|||
|
SendAck();
|
|||
|
if (response.Command.Contains(setcommand))
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
HandleEvent(response.Command);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
//if (setcommand == "RESET")
|
|||
|
//{
|
|||
|
// transactionComplete = true;
|
|||
|
//}
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class TDKBGetHandler : TDKBLoadPortHandler
|
|||
|
{
|
|||
|
public TDKBGetHandler(TDKBLoadPort device, string command, string para) : base(device, BuildData(command), para)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
private static string BuildData(string command)
|
|||
|
{
|
|||
|
return "GET:" + command;
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
|
|||
|
{
|
|||
|
TDKBLoadPortMessage response = msg as TDKBLoadPortMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
//Device.TaExecuteSuccss = true;
|
|||
|
transactionComplete = false;
|
|||
|
if (response.IsAck)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Acked);
|
|||
|
transactionComplete = true;
|
|||
|
ParseData(response.Command);
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsNak)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
//ParseError(response.Data);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void ParseData(string cmddata)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
|
|||
|
if (cmddata.Contains("STATE"))
|
|||
|
{
|
|||
|
byte[] data = Encoding.ASCII.GetBytes(cmddata.Replace("STATE/", ""));
|
|||
|
if (data.Length < 20) return;
|
|||
|
Device.SystemStatus = (TDKSystemStatus)data[0];
|
|||
|
Device.Mode = (TDKMode)data[1];
|
|||
|
Device.InitPosMovement = (TDKInitPosMovement)data[2];
|
|||
|
Device.OperationStatus = (TDKOperationStatus)data[3];
|
|||
|
Device.ErrorCode = Encoding.ASCII.GetString(new byte[] { data[4], data[5] });
|
|||
|
|
|||
|
Device.ContainerStatus = (TDKContainerStatus)data[6];
|
|||
|
Device.ClampPosition = (TDKPosition)data[7];
|
|||
|
Device.LPDoorLatchPosition = (TDKPosition)data[8];
|
|||
|
Device.VacuumStatus = (TDKVacummStatus)data[9];
|
|||
|
Device.LPDoorState = (TDKPosition)data[10];
|
|||
|
Device.WaferProtrusion = (TDKWaferProtrusion)data[11];
|
|||
|
Device.ElevatorAxisPosition = (TDKElevatorAxisPosition)data[12];
|
|||
|
Device.DockPosition = (TDKDockPosition)data[13];
|
|||
|
|
|||
|
|
|||
|
Device.MapperPostion = (TDKMapPosition)data[14];
|
|||
|
Device.MappingStatus = (TDKMappingStatus)data[17];
|
|||
|
Device.Model = (TDKModel)data[18];
|
|||
|
if (Device.InfoPadType == 0 && Device.IsAutoDetectCarrierType)
|
|||
|
{
|
|||
|
int infopadstatus = Convert.ToInt16($"0x{Encoding.ASCII.GetString(new byte[] { data[19] })}", 16);
|
|||
|
if ((infopadstatus & 1) != 0) Device.IsInfoPadAOn = true;
|
|||
|
else Device.IsInfoPadAOn = false;
|
|||
|
if ((infopadstatus & 2) != 0) Device.IsInfoPadBOn = true;
|
|||
|
else Device.IsInfoPadBOn = false;
|
|||
|
if ((infopadstatus & 4) != 0) Device.IsInfoPadCOn = true;
|
|||
|
else Device.IsInfoPadCOn = false;
|
|||
|
if ((infopadstatus & 8) != 0) Device.IsInfoPadDOn = true;
|
|||
|
else Device.IsInfoPadDOn = false;
|
|||
|
|
|||
|
Device.InfoPadCarrierIndex = (Device.IsInfoPadAOn? 8:0) + (Device.IsInfoPadBOn ? 4 : 0) +
|
|||
|
(Device.IsInfoPadCOn ? 2 : 0) + (Device.IsInfoPadDOn ? 1 : 0);
|
|||
|
}
|
|||
|
Device.IsError = Device.SystemStatus != TDKSystemStatus.Normal;
|
|||
|
Device.ErrorCode = Encoding.ASCII.GetString(new byte[] { data[4], data[5] });
|
|||
|
LoadportCassetteState st = LoadportCassetteState.None;
|
|||
|
if (Device.ContainerStatus == TDKContainerStatus.Absence) st = LoadportCassetteState.Absent;
|
|||
|
if (Device.ContainerStatus == TDKContainerStatus.NormalMount) st = LoadportCassetteState.Normal;
|
|||
|
if (Device.ContainerStatus == TDKContainerStatus.MountError) st = LoadportCassetteState.Unknown;
|
|||
|
Device.SetCassetteState(st);
|
|||
|
|
|||
|
if (Device.ClampPosition == TDKPosition.Close)
|
|||
|
Device.ClampState = FoupClampState.Close;
|
|||
|
else if (Device.ClampPosition == TDKPosition.Open)
|
|||
|
Device.ClampState = FoupClampState.Open;
|
|||
|
else if (Device.ClampPosition == TDKPosition.TBD)
|
|||
|
Device.ClampState = FoupClampState.Unknown;
|
|||
|
|
|||
|
if (Device.LPDoorState == TDKPosition.Close)
|
|||
|
Device.DoorState = FoupDoorState.Close;
|
|||
|
if (Device.LPDoorState == TDKPosition.Open)
|
|||
|
Device.DoorState = FoupDoorState.Open;
|
|||
|
if (Device.LPDoorState == TDKPosition.TBD)
|
|||
|
Device.DoorState = FoupDoorState.Unknown;
|
|||
|
|
|||
|
Device.DockState = ConvertTDKDockPositin(Device.DockPosition); // Load port dock state
|
|||
|
|
|||
|
if (Device.ElevatorAxisPosition == TDKElevatorAxisPosition.UP)
|
|||
|
Device.DoorPosition = FoupDoorPostionEnum.Up;
|
|||
|
if (Device.ElevatorAxisPosition == TDKElevatorAxisPosition.Down)
|
|||
|
Device.DoorPosition = FoupDoorPostionEnum.Down; // = TDKZ_AxisPos.Down;
|
|||
|
if (Device.ElevatorAxisPosition == TDKElevatorAxisPosition.MappingEndPos)
|
|||
|
Device.DoorPosition = FoupDoorPostionEnum.MapEnd;// = TDKZ_AxisPos.End;
|
|||
|
if (Device.ElevatorAxisPosition == TDKElevatorAxisPosition.MappingStartPos)
|
|||
|
Device.DoorPosition = FoupDoorPostionEnum.MapStart;// = TDKZ_AxisPos.Start;
|
|||
|
if (Device.ElevatorAxisPosition == TDKElevatorAxisPosition.TBD)
|
|||
|
Device.DoorPosition = FoupDoorPostionEnum.Unknown;// = TDKZ_AxisPos.Unknown;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
if (cmddata.Contains("VERSN/"))
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
if (cmddata.Contains("LEDST/"))
|
|||
|
{
|
|||
|
IndicatorState[] lpledstate = new IndicatorState[]
|
|||
|
{
|
|||
|
Device.IndicatiorPresence,
|
|||
|
Device.IndicatiorPlacement,
|
|||
|
Device.IndicatiorLoad,
|
|||
|
Device.IndicatiorUnload,
|
|||
|
Device.IndicatiorOpAccess,
|
|||
|
Device.IndicatiorStatus1,
|
|||
|
Device.IndicatiorStatus2,
|
|||
|
|
|||
|
};
|
|||
|
char[] ledstate = cmddata.Replace("LEDST/", "").ToArray();
|
|||
|
for (int i = 0; i < (lpledstate.Length > ledstate.Length ? ledstate.Length : lpledstate.Length); i++)
|
|||
|
{
|
|||
|
if (ledstate[i] == '0') SetIEDValue(i, IndicatorState.OFF);
|
|||
|
if (ledstate[i] == '1') SetIEDValue(i, IndicatorState.ON);
|
|||
|
if (ledstate[i] == '2') SetIEDValue(i, IndicatorState.BLINK);
|
|||
|
}
|
|||
|
}
|
|||
|
if (cmddata.Contains("MAPRD/"))
|
|||
|
{
|
|||
|
string str1 = cmddata.Replace("MAPRD/", "");
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Device.OnSlotMapRead(str1);
|
|||
|
}
|
|||
|
if (cmddata.Contains("WFCNT/"))
|
|||
|
{
|
|||
|
|
|||
|
Device.WaferCount = Convert.ToInt16(cmddata.Replace("WFCNT/", ""));
|
|||
|
}
|
|||
|
if (cmddata.Contains("MDAH/"))
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
if (cmddata.Contains("LPIOI/"))
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
if (cmddata.Contains("FSBxx/"))
|
|||
|
{
|
|||
|
if (cmddata.Contains("ON"))
|
|||
|
Device.IsFosbModeActual = true;
|
|||
|
if (cmddata.Contains("OF"))
|
|||
|
Device.IsFosbModeActual = false;
|
|||
|
}
|
|||
|
}
|
|||
|
catch(Exception ex)
|
|||
|
{
|
|||
|
LOG.Write(ex);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void SetIEDValue(int index, IndicatorState state)
|
|||
|
{
|
|||
|
switch (index)
|
|||
|
{
|
|||
|
case 0:
|
|||
|
Device.IndicatiorPresence = state;
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
Device.IndicatiorPlacement = state;
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
Device.IndicatiorLoad = state;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
Device.IndicatiorUnload = state;
|
|||
|
break;
|
|||
|
case 4:
|
|||
|
Device.IndicatiorOpAccess = state;
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
Device.IndicatiorStatus1 = state;
|
|||
|
break;
|
|||
|
case 6:
|
|||
|
Device.IndicatiorStatus2 = state;
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private FoupDockState ConvertTDKDockPositin(TDKDockPosition dockPosition)
|
|||
|
{
|
|||
|
if (dockPosition == TDKDockPosition.Dock) return FoupDockState.Docked;
|
|||
|
if (dockPosition == TDKDockPosition.Undock) return FoupDockState.Undocked;
|
|||
|
return FoupDockState.Unknown;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class TDKBModHandler : TDKBLoadPortHandler
|
|||
|
{
|
|||
|
public TDKBModHandler(TDKBLoadPort device, string command, string para) : base(device, BuildData(command), para)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
private static string BuildData(string command)
|
|||
|
{
|
|||
|
return "MOD:" + command;
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
|
|||
|
{
|
|||
|
TDKBLoadPortMessage response = msg as TDKBLoadPortMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
//Device.TaExecuteSuccss = true;
|
|||
|
transactionComplete = false;
|
|||
|
if (response.IsAck)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Acked);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsNak)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
//ParseError(response.Data);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void ParseData(byte[] cmd)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class TDKBMoveHandler : TDKBLoadPortHandler
|
|||
|
{
|
|||
|
private string moveCommand;
|
|||
|
public TDKBMoveHandler(TDKBLoadPort device, string command, string para) : base(device, BuildData(command), para)
|
|||
|
{
|
|||
|
moveCommand = command;
|
|||
|
}
|
|||
|
private static string BuildData(string command)
|
|||
|
{
|
|||
|
return "MOV:" + command;
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
|
|||
|
{
|
|||
|
TDKBLoadPortMessage response = msg as TDKBLoadPortMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
//Device.TaExecuteSuccss = true;
|
|||
|
transactionComplete = false;
|
|||
|
if (response.IsAck)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Acked);
|
|||
|
transactionComplete = false;
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsNak)
|
|||
|
{
|
|||
|
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
//ParseError(response.Data);
|
|||
|
}
|
|||
|
if (response.IsError)
|
|||
|
{
|
|||
|
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
if (response.IsEvent)
|
|||
|
{
|
|||
|
if (response.Command.Contains("ORGSH") || response.Command.Contains("ABORG"))
|
|||
|
{
|
|||
|
Device.OnHomed();
|
|||
|
}
|
|||
|
if (response.Command.Contains(moveCommand))
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void ParseData(byte[] cmd)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|