895 lines
31 KiB
C#
895 lines
31 KiB
C#
|
using Aitex.Sorter.Common;
|
|||
|
using MECF.Framework.Common.CommonData;
|
|||
|
using MECF.Framework.Common.Communications;
|
|||
|
using MECF.Framework.Common.Equipment;
|
|||
|
using Newtonsoft.Json.Linq;
|
|||
|
using System;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.SiasunPhoenixB
|
|||
|
{
|
|||
|
public abstract class RobotSiasunPhoenixBHandler : HandlerBase
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixB Device { get; }
|
|||
|
public bool HasResponse { get; set; } = true;
|
|||
|
|
|||
|
protected string _command;
|
|||
|
protected string _parameter;
|
|||
|
protected string _target;
|
|||
|
protected RobotArmEnum _blade;
|
|||
|
|
|||
|
|
|||
|
protected string _requestResponse = "";
|
|||
|
|
|||
|
protected RobotSiasunPhoenixBHandler(RobotSiasunPhoenixB device, string command, string parameter = null)
|
|||
|
: base(BuildMessage(command, parameter))
|
|||
|
{
|
|||
|
Device = device;
|
|||
|
_command = command;
|
|||
|
_parameter = parameter;
|
|||
|
Name = command;
|
|||
|
}
|
|||
|
private static string BuildMessage(string command, string parameter)
|
|||
|
{
|
|||
|
string msg = parameter == null ? $"{command}" : $"{command} {parameter}";
|
|||
|
if (msg.Contains("GOTO N 5 ") || msg.Contains("PLACE 5 ") || msg.Contains("PICK 5 "))
|
|||
|
{
|
|||
|
msg = msg.Replace("SLOT 3 ", "SLOT 1 ");
|
|||
|
msg = msg.Replace("SLOT 2 ", "SLOT 1 ");
|
|||
|
}
|
|||
|
else if (msg.Contains("GOTO N 4 ") || msg.Contains("PLACE 4 ") || msg.Contains("PICK 4 "))
|
|||
|
{
|
|||
|
msg = msg.Replace("SLOT 3 ", "SLOT 1 ");
|
|||
|
msg = msg.Replace("SLOT 2 ", "SLOT 1 ");
|
|||
|
}
|
|||
|
|
|||
|
return msg + "\r";
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
|
|||
|
{
|
|||
|
RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
|
|||
|
if (response.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(response.Data);
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsComplete)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
transactionComplete = true;
|
|||
|
return true;
|
|||
|
}
|
|||
|
if (response.IsResponse)
|
|||
|
{
|
|||
|
_requestResponse = response.Data;
|
|||
|
}
|
|||
|
|
|||
|
transactionComplete = false;
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBRawCommandHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBRawCommandHandler(RobotSiasunPhoenixB device, string command, string parameter = null)
|
|||
|
: base(device, command, parameter)
|
|||
|
{
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
var rawMsg = _requestResponse != null ? _requestResponse + "$" + result.RawMessage : result.RawMessage;
|
|||
|
Device.NoteRawCommandInfo(_command, rawMsg);
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBGotoHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//GOTO N station [R (EX|RE)] [Z (UP|DN)] [SLOT num] [[ARM] arm]
|
|||
|
public RobotSiasunPhoenixBGotoHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade,
|
|||
|
bool isRetract = true, bool isZaxisDown = true, int timeout = 60)
|
|||
|
: base(device, "GOTO", $"N {device.GetStationByModule(module,slot)} R {(isRetract ? "RE" : "EX")}" +
|
|||
|
$" Z {(isZaxisDown ? "DN" : "UP")} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
_target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
|
|||
|
_blade = blade;
|
|||
|
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = isRetract ? RobotAction.Moving : RobotAction.Picking,
|
|||
|
ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
public class RobotSiasunPhoenixBPickHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//PICK station [SLOT slot] [[ARM] arm][ENRT|STRT NR][RO x TO x]
|
|||
|
public RobotSiasunPhoenixBPickHandler(RobotSiasunPhoenixB device, string module, int slot, RobotArmEnum blade,
|
|||
|
int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
|
|||
|
: base(device, "PICK", $"{device.GetStationByModule(module, slot)} SLOT {slot}" +
|
|||
|
$" ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
|
|||
|
var moduleArr = module.Split('.');
|
|||
|
_target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + moduleArr[0];
|
|||
|
_blade = blade;
|
|||
|
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Picking,
|
|||
|
ArmTarget = blade == RobotArmEnum.Blade2 ? RobotArm.ArmB : RobotArm.ArmA, //blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
Device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Moving,
|
|||
|
ArmTarget = _blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBPickExtendHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//PICK station [SLOT slot] [[ARM] arm][ENRT|STRT NR][RO x TO x]
|
|||
|
public RobotSiasunPhoenixBPickExtendHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade,
|
|||
|
int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
|
|||
|
: base(device, "PICK", $"{device.GetStationByModule(module, slot)} SLOT {slot}" +
|
|||
|
$" ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} ENRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
|
|||
|
_target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
|
|||
|
_blade = blade;
|
|||
|
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Picking,
|
|||
|
ArmTarget = blade == RobotArmEnum.Blade2 ? RobotArm.ArmB : RobotArm.ArmA, //blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBPickRetractHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//PICK station [SLOT slot] [[ARM] arm][ENRT|STRT NR][RO x TO x]
|
|||
|
public RobotSiasunPhoenixBPickRetractHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade, int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
|
|||
|
: base(device, "PICK", $"{device.GetStationByModule(module, slot)} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} STRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
|
|||
|
_target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
|
|||
|
_blade = blade;
|
|||
|
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Moving,
|
|||
|
ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBPlaceHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBPlaceHandler(RobotSiasunPhoenixB device, string module, int slot, RobotArmEnum blade,
|
|||
|
int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
|
|||
|
: base(device, "PLACE", $"{device.GetStationByModule(module, slot)} SLOT {slot}" +
|
|||
|
$" ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
|
|||
|
var moduleArr = module.Split('.');
|
|||
|
_target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + moduleArr[0];
|
|||
|
_blade = blade;
|
|||
|
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Placing,
|
|||
|
ArmTarget = blade == RobotArmEnum.Blade2 ? RobotArm.ArmB : RobotArm.ArmA,//RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
Device.NoteActionCompleted();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
Device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Moving,
|
|||
|
ArmTarget = _blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
Device.NoteActionCompleted();
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBPlaceExtendHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBPlaceExtendHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade, int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
|
|||
|
: base(device, "PLACE", $"{device.GetStationByModule(module, slot)} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} ENRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
|
|||
|
_target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
|
|||
|
_blade = blade;
|
|||
|
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Placing,
|
|||
|
ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBPlaceRetractHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBPlaceRetractHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade, int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
|
|||
|
: base(device, "PLACE", $"{device.GetStationByModule(module, slot)} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} STRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
|
|||
|
_target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
|
|||
|
_blade = blade;
|
|||
|
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Moving,
|
|||
|
ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
|
|||
|
BladeTarget = _target,
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBTransferHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//XFER [[ARM]arm] station-a station-b
|
|||
|
public RobotSiasunPhoenixBTransferHandler(RobotSiasunPhoenixB device, int fromStation, int toStation, RobotArmEnum blade, int timeout)
|
|||
|
: base(device, "XFER", $"ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} {fromStation} {toStation}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBRetractHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBRetractHandler(RobotSiasunPhoenixB device, int timeout)
|
|||
|
: base(device, "RETRACT")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
Device.NoteActionCompleted();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBResetHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//RESET
|
|||
|
public RobotSiasunPhoenixBResetHandler(RobotSiasunPhoenixB device)
|
|||
|
: base(device, "RESET")
|
|||
|
{
|
|||
|
HasResponse = false;
|
|||
|
}
|
|||
|
|
|||
|
//no return message
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
handled = true;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBHaltHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBHaltHandler(RobotSiasunPhoenixB device)
|
|||
|
: base(device, "HALT")
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
public class RobotSiasunPhoenixBHELLOtHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBHELLOtHandler(RobotSiasunPhoenixB device)
|
|||
|
: base(device, "HLLO")
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
public class RobotSiasunPhoenixBSetCommunicationEchoHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBSetCommunicationEchoHandler(RobotSiasunPhoenixB device, bool isEchoOn)
|
|||
|
: base(device, "SET IO ECHO", isEchoOn ? "Y" : "N")
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
Device.NoteSetCommEchoCompleted(true);
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBSetLoadHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBSetLoadHandler(RobotSiasunPhoenixB device, RobotArmEnum blade, bool isWaferPresent)
|
|||
|
: base(device, "SET LOAD", $"{(blade == RobotArmEnum.Blade1 ? "A" : "B")} {(isWaferPresent ? "ON" : "OFF")}")
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
Device.NoteSetParametersComplete();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBSevoOnOffHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBSevoOnOffHandler(RobotSiasunPhoenixB device, bool isOn)
|
|||
|
: base(device, isOn ? "SVON" : "SVOFF")
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
Device.NoteSevoOnOff(_command == "SVON");
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBHomeAxisHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBHomeAxisHandler(RobotSiasunPhoenixB device, int timeout)
|
|||
|
: base(device, "HOME", "ALL")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
device.MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Moving,
|
|||
|
ArmTarget = RobotArm.Both,
|
|||
|
BladeTarget = "ArmA.System",
|
|||
|
};
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
var result = msg as RobotSiasunPhoenixBMessage;
|
|||
|
if (result.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(result.Data);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Device.NoteError(null);
|
|||
|
Device.NoteAxisHomed();
|
|||
|
}
|
|||
|
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = true;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBCheckLoadHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//CHECK LOAD station [[ARM] arm]
|
|||
|
//_RDY
|
|||
|
public RobotSiasunPhoenixBCheckLoadHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, int timeout)
|
|||
|
: base(device, "CHECK LOAD", $"{station} {(blade == RobotArmEnum.Blade1 ? "A" : "B")}")
|
|||
|
{
|
|||
|
AckTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
CompleteTimeout = TimeSpan.FromSeconds(timeout);
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = false;
|
|||
|
|
|||
|
if (response.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(response.Data);
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsResponse)
|
|||
|
{
|
|||
|
_requestResponse = response.Data;
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsComplete)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
handled = true;
|
|||
|
Device.NoteReadDataComplete();
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBQueryWaferPresentHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBQueryWaferPresentHandler(RobotSiasunPhoenixB device, RobotArmEnum blade)
|
|||
|
: base(device, "RQ LOAD", blade == RobotArmEnum.Blade1 ? "A" : "B")
|
|||
|
{
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = false;
|
|||
|
|
|||
|
if (response.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(response.Data);
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsResponse)
|
|||
|
{
|
|||
|
_requestResponse = response.Data;
|
|||
|
}
|
|||
|
|
|||
|
if (_requestResponse != null && _requestResponse.Contains(" B"))
|
|||
|
{
|
|||
|
Device.NoteWafeOnOff("B", _requestResponse.ToUpper().Contains("ON"), _requestResponse.ToUpper().Contains("UNKNOW"));
|
|||
|
}
|
|||
|
else if (_requestResponse != null && _requestResponse.Contains(" A"))
|
|||
|
{
|
|||
|
Device.NoteWafeOnOff("A", _requestResponse.ToUpper().Contains("ON"), _requestResponse.ToUpper().Contains("UNKNOW"));
|
|||
|
}
|
|||
|
|
|||
|
if (response.IsComplete)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
handled = true;
|
|||
|
Device.NoteReadDataComplete();
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBRequestWaferCentDataHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
public RobotSiasunPhoenixBRequestWaferCentDataHandler(RobotSiasunPhoenixB device)
|
|||
|
: base(device, "RQ WAF_CEN DATA")
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
|
|||
|
ResponseMessage = msg;
|
|||
|
handled = false;
|
|||
|
|
|||
|
if (response.IsError)
|
|||
|
{
|
|||
|
Device.NoteError(response.Data);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (response.IsResponse)
|
|||
|
{
|
|||
|
_requestResponse = response.Data;
|
|||
|
}
|
|||
|
//WAF_CEN RT value1x value1y value4x value4y LFT value2x value2y value3x value3y offset_r offset_t
|
|||
|
Device.NoteWafeCenData(_requestResponse);
|
|||
|
|
|||
|
if (response.IsComplete)
|
|||
|
{
|
|||
|
SetState(EnumHandlerState.Completed);
|
|||
|
handled = true;
|
|||
|
Device.NoteReadDataComplete();
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBSetWaferCentModeHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//SET WAF_CEN MODE SINGLE_SENS|RL_SENS
|
|||
|
public RobotSiasunPhoenixBSetWaferCentModeHandler(RobotSiasunPhoenixB device, bool isSingleSensorMode)
|
|||
|
: base(device, "SET WAF_CEN MODE", isSingleSensorMode ? "SINGLE_SENS" : "RL_SENS")
|
|||
|
{
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
Device.NoteSetParametersComplete();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBSetWaferCentEnableHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//SET STN station [[ARM]arm] WAF_CEN ENABLE Y|N
|
|||
|
public RobotSiasunPhoenixBSetWaferCentEnableHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, bool isEnable)
|
|||
|
: base(device, "SET STN", $"{station} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} WAF_CEN ENABLE {(isEnable ? "Y" : "N")}")
|
|||
|
{
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
Device.NoteSetParametersComplete();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBSetWaferCentWaferSizeHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//SET STN station [[ARM]arm] WAF_CEN WAF_SIZE value
|
|||
|
//SET STN 1 ARM A WAF_CEN WAF_SIZE 300000
|
|||
|
public RobotSiasunPhoenixBSetWaferCentWaferSizeHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, int waferSize)
|
|||
|
: base(device, "SET STN", $"{station} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} WAF_CEN WAF_SIZE {waferSize}")
|
|||
|
{
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
Device.NoteSetParametersComplete();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBSetWaferCentAutoNotchHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//SET STN station [[ARM]arm] WAF_CEN AUTO_NOTCH Y|N
|
|||
|
//SET STN 1 ARM A WAF_CEN WAF_SIZE 300000
|
|||
|
public RobotSiasunPhoenixBSetWaferCentAutoNotchHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, bool isAutoNotch)
|
|||
|
: base(device, "SET STN", $"{station} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} WAF_CEN AUTO_NOTCH {(isAutoNotch ? "Y" : "N")}")
|
|||
|
{
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
Device.NoteSetParametersComplete();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#region Aligner
|
|||
|
public class RobotSiasunPhoenixBTransferAndAlignHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//XFER [[ARM] arm] station [SLOT num] station [SLOT num] ALGN
|
|||
|
public RobotSiasunPhoenixBTransferAndAlignHandler(RobotSiasunPhoenixB device, int fromStation, int formSlot, int toStation, int toSlot, Hand blade)
|
|||
|
: base(device, "XFER", $"ARM {(blade == Hand.Blade1 ? "A" : "B")} {fromStation} SLOT {formSlot} {toStation} SLOT {toSlot} ALGN")
|
|||
|
{
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBAlignAndPickHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//PICK station [SLOT num] [[ARM] arm][ENRT|STRT NR][RO x TO x][ALGN][PALGN]
|
|||
|
//align and then pick it
|
|||
|
public RobotSiasunPhoenixBAlignAndPickHandler(RobotSiasunPhoenixB device, int alignerStation, int alignerSlot, Hand blade, int ro = 0, int to = 0)
|
|||
|
: base(device, "PICK", $" {alignerStation} SLOT {alignerSlot} ARM {(blade == Hand.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")} ALGN")
|
|||
|
{
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RobotSiasunPhoenixBPlaceAndAlignHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//PLACEstation [SLOT num] [[ARM] arm][ENRT|STRT NR][RO x TO x][ALGN]
|
|||
|
//place to aligner and align
|
|||
|
public RobotSiasunPhoenixBPlaceAndAlignHandler(RobotSiasunPhoenixB device, int alignerStation, int alignerSlot, Hand blade, int ro = 0, int to = 0)
|
|||
|
: base(device, "PLACE", $" {alignerStation} SLOT {alignerSlot} ARM {(blade == Hand.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")} ALGN")
|
|||
|
{
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//两个aligner怎么区分
|
|||
|
public class RobotSiasunPhoenixBRequestAlignerOffsetHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//RQ ALGN 00 OFFSETS
|
|||
|
//RO 0.000 TO 0.000
|
|||
|
//_RDY
|
|||
|
public RobotSiasunPhoenixBRequestAlignerOffsetHandler(RobotSiasunPhoenixB device)
|
|||
|
: base(device, "RQ ALGN 00 OFFSETS")
|
|||
|
{
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//两个aligner怎么区分
|
|||
|
public class RobotSiasunPhoenixBRequestAlignerWaferPresentHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//RQ ALIGNER RQWPRS
|
|||
|
//WFR PRS YES/NO
|
|||
|
//_RDY
|
|||
|
public RobotSiasunPhoenixBRequestAlignerWaferPresentHandler(RobotSiasunPhoenixB device)
|
|||
|
: base(device, "RQ ALIGNER RQWPRS")
|
|||
|
{
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//默认选用哪个index对应的angle?
|
|||
|
public class RobotSiasunPhoenixBSetAlignerAlignAngleHandler : RobotSiasunPhoenixBHandler
|
|||
|
{
|
|||
|
//SET ALIGNER 1 POSTPOS %i POS %i
|
|||
|
//_RDY
|
|||
|
//eg. SET ALIGNER 1 POSTPOS 1 POS 27.1
|
|||
|
public RobotSiasunPhoenixBSetAlignerAlignAngleHandler(RobotSiasunPhoenixB device, int alignerID, int index, int angle)
|
|||
|
: base(device, "SET ALIGNER", $"{alignerID} POSTPOS {index} POS {angle}")
|
|||
|
{
|
|||
|
}
|
|||
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|||
|
{
|
|||
|
if (base.HandleMessage(msg, out handled))
|
|||
|
{
|
|||
|
Device.NoteSetParametersComplete();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
}
|