Sic.Framework/MECF.Framework.RT.Equipment.../HardwareUnits/Robots/NX100/Handler.cs

2067 lines
72 KiB
C#
Raw Normal View History

2023-04-13 11:51:03 +08:00
using System;
using System.Text;
using Aitex.Core.RT.Device;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using System.Text.RegularExpressions;
using Aitex.Core.RT.Log;
using System.Collections.Generic;
using Aitex.Core.Common;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot.NX100
{
/*
* A command is transmitted from the host in the following format.
* $ UNo (SeqNo) COMMAND Parameter Sum CR\
* $: Start mark (1 byte)
Indicates the start of the message.
UNo: Unit No. (1 byte)
Indicates the unit number
SeqNo: Sequence number (Non/1/2/3 bytes)
Sequence number is used to avoid duplicate motion when sending of
commands improperly. An integer parameter can specify the length of
SeqNo. (Non/1/2/3 bytes). See parameter table for more details. (Default:
Non), 2bytes
Parameter: Parameter (Differs depending on the command.)
Sets the operation axis, the moving amount, etc. following a command.
Sum: Checksum (2 bytes)
This information is used for the communications error check.
Calculate the sum of the ASCII characters (0 to 9 and A to F), in Uno,
COMMAND and Parameter section, and take the lowest tow digit.
*/
public class handler<T> : IHandler where T : ITransferMsg, new()
{
public int ID { get; set; }
public int Unit { get; set; }
public bool IsBackground { get { return _imp.background; } }
private static int retry_time = 3;
private int retry_count = retry_time;
private object[] _objs = null;
private TokenGenerator _generator;
private T _imp = new T();
private List<string> _words = new List<string>();
public handler(IDevice device)
{
_imp.Robot = device;
}
public handler(IDevice device, ref TokenGenerator gen, params object[] objs)
{
_imp.Robot = device;
this._generator = gen;
this._objs = objs;
}
public bool Execute<TPort>(ref TPort port) where TPort : ICommunication
{
retry_count = retry_time;
ID = _generator.create();
return port.Write(string.Format("{0}{1}{2}", ProtocolTag.tag_cmd_start, package().Replace(",", ""), ProtocolTag.tag_end));
}
/// <summary>
/// return value: bhandle
/// </summary>
/// <typeparam name="TPort"></typeparam>
/// <param name="port"></param>
/// <param name="msg"></param>
/// <param name="completed"></param>
/// <returns></returns>
///
public bool OnMessage<TPort>(ref TPort port, string message, out bool completed) where TPort : ICommunication
{
//$1E000003AC0300010
//message = ">,1,EVNT,100,2018/11/16 17:01:06,2BA0,A1";
//message = " !,1,36,40,2BA0,MTRS,002200,-0011931,-0610171,00179995,00049818,00186336,57";
//message = "!,1,16,40,0000,MTCH,000483,-0011862,00000000,00179516,00090369,00172882,0A";
//message = "$156000000RMAPC2FF01OK02OK03OK04OK05OK06OK07OK08OK09--10--11--12--13--14--15--16--17--18--19--20--21--22--23--24--25--96";
//message =!283000000MALNE5.
try
{
completed = false;
string package = message;
_words.Clear();
string type = package.Substring(0,1);
_words.Add(type);
int unit = int.Parse(package.Substring(1, 1));
_words.Add(package.Substring(1, 1));
string sum = package.Substring(package.Length - 2, 2);
string check = Checksum(package);
if (sum != check)
{
throw (new InvalidPackageException(string.Format("check sum error{0}", package)));
}
if (type != ProtocolTag.resp_tag_event && type != ProtocolTag.resp_tag_error)
{
_words.Add(package.Substring(2, 2));
int seq = int.Parse(package.Substring(2,2));
if (seq != ID)
return false;
if (unit != Unit)
{
throw (new InvalidPackageException(string.Format("invalid unit {0}", package)));
}
}
if (type == ProtocolTag.resp_tag_error)
{
//? Ackcd Sum CR
string error = package.Substring(1,4);
//1: Warning 1 (W1), 2: Warning 2 (W2), 3: Important alarm 1 (A1), 4: Important alarm 2 (A2),
//5: Serious alarm (F)
if (error[0] != '1' || error[0] != '2')
{
string warning = string.Format("can't execute retry, {0}", error);
LOG.Warning(warning);
throw (new ExcuteFailedException(warning));
}
if (retry_count-- <= 0)
{
string warning = string.Format("retry over {0} times", retry_time);
LOG.Warning(warning);
throw (new ExcuteFailedException(warning));
}
port.Write(string.Format("{0}{1}{2}", ProtocolTag.tag_cmd_start, this.package(), ProtocolTag.tag_end));
return true;
}
else if (type == ProtocolTag.resp_tag_event)
{
//0 1 2-3 4-7 8-10
//> UNo SeqNo COMMAND EvNo EvData Sum CR
//• COMMAND : Command (4 Byte) EVNT(Fixed length)
//• EvNo: Event number(
_words.Add(package.Substring(4, 4)); //stsN
string evtType = package.Substring(8, 10);
_words.Add(evtType); //Errcd
string evtInfo = package.Substring(11, package.Length - 10 -2 );
_words.Add(evtInfo); //Errcd
if (_imp.evt)
completed = _imp.unpackage(type, _words.ToArray());
return _imp.evt;
}
else
{
//0 1 2,3 4,5 6-9
//! UNo (SeqNo) StsN Errcd COMMAND Sum
_words.Add(package.Substring(4, 2)); //stsN
string error = package.Substring(6, 4);
//int intError = Convert.ToInt32(error, 16);
if (error != "0000")
{
string warning = string.Format("Robot execute failed, return error {0}", error);
throw (new ExcuteFailedException(warning));
}
_words.Add(error); //Errcd
_words.Add(package.Substring(10, package.Length - 10 -2)) ; //COMMAND
completed = _imp.unpackage(type, _words.ToArray());
if (completed)
{
_generator.release(ID);
if (_imp.background)
{
ID = this._generator.create();
port.Write(string.Format("{0}{1}{2}", ProtocolTag.tag_cmd_start, ackn(), ProtocolTag.tag_end));
_generator.release(ID);
}
//wait 2ms
return true;
}
return true;
}
}
catch (ExcuteFailedException e)
{
throw (e);
}
catch (InvalidPackageException e)
{
throw e;
}
catch (Exception ex)
{
LOG.Write(ex);
throw (new InvalidPackageException(message));
}
}
private string Checksum(string package)
{
int start = package.IndexOf(ProtocolTag.cmd_token);
int end = package.LastIndexOf(ProtocolTag.cmd_token);
start = 1;
end = package.Length - 2 - 1;
int len = end - start + 1;
if (len > 1)
{
string data = package.Substring(start, len);
return Checksum(Encoding.Default.GetBytes(data));
}
return "";
}
private string Checksum(byte[] bytes)
{
int sum = 0;
foreach (byte code in bytes)
{
sum += code;
}
string hex = String.Format("{0:X2}", sum % 256);
return hex;
}
private string package()
{
//$,<UNo>(,<SeqNo>),<Command>,<Parameter>(,<Sum>)<CR>
string data = string.Empty;
data = string.Format("{0:D1}{1:D2}{2}", Unit, ID, _imp.package(this._objs).Replace(",",""));
string sum = Checksum(Encoding.ASCII.GetBytes(data));
return data + sum;
}
private string ackn()
{
//$<UNo>(<SeqNo>)ACKN(<Sum>)<CR>
string data = string.Empty;
data = string.Format("{0:D1}{1:D2}ACKN", Unit, ID);
string sum = Checksum(Encoding.ASCII.GetBytes(data));
return data + sum;
}
}
public class RobotMotionHandler : ITransferMsg
{
public bool background { get; protected set; }
public bool evt { get { return false; } }
public string deviceID { private get; set; }
public string _cmd = string.Empty;
public IDevice Robot { set { _device = (Robot)value; } }
protected Robot _device;
public RobotMotionHandler()
{
background = false;
}
public virtual string package(params object[] args)
{
return "";
}
public bool unpackage(string type, string[] items)
{
//! <UNo> (<SeqNo>) <StsN> <Errcd> MTRG <Sum> <CR>
int value = Convert.ToInt32(items[3],16);
_device.Status = value;
int error = Convert.ToInt32(items[4], 16);
_device.ErrorCode = error;
if(error > 0)
_device.LastErrorCode = error;
if (type.Equals(ProtocolTag.resp_tag_excute))
{
//_device.ElapseTime = int.Parse(items[6]);
//_device.Rotation = int.Parse(items[7]);
//_device.Extension = int.Parse(items[8]);
//_device.Wrist1= int.Parse(items[9]);
//_device.Wrist2= int.Parse(items[10]);
//_device.Evevation = int.Parse(items[11]);
if (error == 0)
{
update(items);
}
return true;
}
return !background;
}
protected virtual void update(string[] data)
{
}
}
public class RbInitHandler : RobotMotionHandler
{
public RbInitHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) INIT<IMode> <Sum> <CR>
// IMode: Initialization mode(2 Byte)
//• ”00”: Error clear, servo ON and all axes move to home position
//• ”01”: Servo ON and all axes move to home position
//• ”05”: Error clear, servo ON and arm moves to home position.
//• ”06”: Servo ON and arm moves to home position
//• ”10”: Error clear and servo ON
updateBefore();
return ",INIT,00,";
}
protected void updateBefore()
{
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
protected override void update(string[] data)
{
_device.Initalized = true;
_device.Swap = false;
}
}
public class RbHomeHandler : RobotMotionHandler
{
public RbHomeHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ < UNo > > (< SeqNo >) MHOM<MMode> < Sum > < CR >
//• UNo: Unit number(1 byte)
//• 1 to 4: Unit specified
//• SeqNo: Sequence number(Non/ 1 / 2 / 3 byte)
//• MMode: Motion mode(1 byte)
//• F: All axes
//• A: Arm(s) only
updateBefore();
return ",MHOM,F,";
}
protected void updateBefore()
{
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
_device.CmdBladeTarget = $"{_device.Name}.A";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
}
protected override void update(string[] data)
{
_device.Initalized = true;
_device.Swap = false;
}
}
public class RbArmHomeHandler : RobotMotionHandler
{
public RbArmHomeHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ < UNo > > (< SeqNo >) MHOM<MMode> < Sum > < CR >
//• UNo: Unit number(1 byte)
//• 1 to 4: Unit specified
//• SeqNo: Sequence number(Non/ 1 / 2 / 3 byte)
//• MMode: Motion mode(1 byte)
//• F: All axes
//• A: Arm(s) only
updateBefore();
return ",MHOM,A,";
}
protected void updateBefore()
{
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
_device.CmdBladeTarget = $"{_device.Name}.A";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
}
protected override void update(string[] data)
{
_device.Initalized = true;
_device.Swap = false;
}
}
public class RbClearErrorHandler : RobotMotionHandler
{
public RbClearErrorHandler()
{
background = true;
}
//$ <UNo> (<SeqNo>) CCLR <CMode> <Sum> <CR>
public override string package(params object[] args)
{
//• CMode: Clear mode(1 byte)
//• E: Releases the error status.
//• H: Clears the error history.
return ",CCLR,E,";
}
}
public class RbGripHandler : RobotMotionHandler
{
Hand _hand;
public RbGripHandler()
{
background = true;
}
//Command wafer hold/release signal to the solenoid of the specified unit.
//$ <UNo> (<SeqNo>) CSOL <Fork> <Sw> <Sum> <CR>
//• Fork: Fork specified(1 byte)
//• A: Extension axis 1 (Blade 1), pre-aligner
//• B: Extension axis 2 (Blade 2)
//• Sw: Chucking command(1 byte)
//• 0: Chucking OFF
//• 1: Chucking ON
public override string package(params object[] args)
{
_hand = (Hand)args[0];
bool bHold = (bool)args[1];
if(bHold)
return string.Format(",CSOL,{0},1,",RobotConvertor.hand2string(_hand));
return string.Format(",CSOL,{0},0,", RobotConvertor.hand2string(_hand));
}
}
public class RbStopHandler : RobotMotionHandler
{
public RbStopHandler()
{
background = true;
}
//$ <UNo> (<SeqNo>) CHLTs <Sum> <CR>
//Pause (decelerate and stop) the motion of the specified unit during the drive command execution.
public override string package(params object[] args)
{
bool isEmergency = (bool)args[0];
if (isEmergency)
return ",CEMG,";
//$ < UNo > (< SeqNo >) CHLT<Sum> < CR >
return ",CHLT,";
//return ",MHOM,F,";
}
}
public class RbResumeHandler : RobotMotionHandler
{
public RbResumeHandler()
{
background = true;
}
//$ <UNo> (<SeqNo>) CRSM <Sum> <CR>
public override string package(params object[] args)
{
return ",CRSM,";
}
}
public class PickHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PickHandler()
{
background = true;
}
public override string package(params object[] args)
{
//Move To Ready position and wafer Get motion(MTRS+MGET)
//$ <UNo> (<SeqNo>) MTRG <TrsSt> <SlotNo> <MtnMode> <Posture> <Sum> <CR>
// • TrsSt: Transfer station(2 bytes)
//• "C1" to "C8": When cassette stage specified
//• "S1" to "SC": When transfer stage specified
//• "P1" to “P2”: When P/ A stage specified
//Note: P2 station is effective only when two or more PA stations exist.
//• SlotNo: Slot number(2 bytes)
//< Manipulator >
//• "01" to "XX": When cassette stage is specified by < TrsST >
//(The maximum value of "XX" is in the ASCII code of the number of slots specified by parameter.)
//• "00": When transfer stage or P / A stage specified by < TrsSt >
//• MtnMode: Motion mode(2 bytes)
//• "GA": Wafer Get motion at extension axis 1(Blade 1).
//• "GB": Wafer Get motion at extension axis 2(Blade 2).
//• "GW": Wafer Get motion with extension axis 1 and 2(Blade 1 and 2). < WGet motion >
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
if (_hand == Hand.Both)
{
return string.Format(",MTRG,{0},{1:D2},G{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1) ,
RobotConvertor.hand2string(_hand));
}
return string.Format(",MTRG,{0},{1:D2},G{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
protected override void update(string[] data)
{
if (_hand == Hand.Blade1)
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1);
}
else if (_hand == Hand.Blade2)
{
for (int i = 0; i < _device.Blade2Slots; i++)
WaferManager.Instance.WaferMoved(_chamber, _slot + i, ModuleHelper.Converter(_device.Name), (int)Hand.Blade2 + i);
}
else
{
for (int i = 0; i < _device.Blade2Slots + 1; i++)
WaferManager.Instance.WaferMoved(_chamber, _slot + i, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1 + i);
}
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class PickExtendHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PickExtendHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MTPT <TrsSt> <SlotNo> <NextMtn> <Posture> <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTPT,{0},{1:D2},G{2},A,Gb,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
}
public class PickRetractHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PickRetractHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MPNT <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return ",MPNT,G4,";
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
protected override void update(string[] data)
{
if (_hand == Hand.Both)
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1);
WaferManager.Instance.WaferMoved(_chamber, _slot + 1, ModuleHelper.Converter(_device.Name), (int)Hand.Blade2);
}
else
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)_hand);
}
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class PickReadyPositionHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PickReadyPositionHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MTRS <TrsSt> <SlotNo> <NextMtn> <Posture> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTRS,{0},{1:D2},G{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
}
public class PlaceHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PlaceHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $ <UNo> (<SeqNo>) MTRP <TrsSt> <SlotNo> <MtnMode> <Posture> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
if (_hand == Hand.Both)
{
return string.Format(",MTRP,{0},{1:D2},P{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_hand));
}
return string.Format(",MTRP,{0},{1:D2},P{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
protected override void update(string[] data)
{
if (_hand == Hand.Blade1)
{
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1, _chamber, _slot);
}
else if (_hand == Hand.Blade2)
{
for (int i = 0; i < _device.Blade2Slots; i++)
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade2 +i, _chamber, _slot + i);
}
else
{
for (int i = 0; i < _device.Blade2Slots + 1; i++)
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1 + i, _chamber, _slot + i);
}
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class PlaceExtendHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PlaceExtendHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MTPT <TrsSt> <SlotNo> <NextMtn> <Posture> <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTPT,{0},{1:D2},P{2},A,Pb,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
}
public class PlaceRetractHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PlaceRetractHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MPNT <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return ",MPNT,P4,";
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
protected override void update(string[] data)
{
if (_hand == Hand.Both)
{
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1, _chamber, _slot);
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade2, _chamber, _slot + 1);
}
else
{
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)_hand, _chamber, _slot);
}
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class PlaceReadyPositionHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PlaceReadyPositionHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MTRS <TrsSt> <SlotNo> <NextMtn> <Posture> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTRS,{0},{1:D2},P{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
}
public class ExchangeReadyPositionHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _pickHand;
private Hand _placeHand;
public ExchangeReadyPositionHandler()
{
background = true;
}
public override string package(params object[] args)
{
////$ <UNo> (<SeqNo>) MTRS <TrsSt> <SlotNo> <NextMtn> <Posture> <Sum> <CR>
//_chamber = (ModuleName)args[0];
//_slot = (int)args[1];
//_pickHand = (Hand)args[2];
//_placeHand = (Hand)args[3];
//updateBefore();
//return string.Format(",MTRS,{0},{1:D2},E{2},A,",
// RobotConvertor.chamber2staion(_chamber),
// RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
// RobotConvertor.hand2string(_pickHand));
//$ <UNo> (<SeqNo>) MTPT <TrsSt> <SlotNo> <NextMtn> <Posture> <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_pickHand = (Hand)args[2];
_placeHand = (Hand)args[3];
updateBefore();
return string.Format(",MTPT,{0},{1:D2},E{2},A,G1,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_pickHand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _pickHand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
}
}
public class ExchangePickExtendHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public ExchangePickExtendHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MPNT <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return ",MPNT,Gb,";
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
}
public class ExchangePlaceExtendHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _pickHand;
private Hand _placeHand;
public ExchangePlaceExtendHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MPNT <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_pickHand = (Hand)args[2];
_placeHand = (Hand)args[3];
updateBefore();
return ",MPNT,Pb,";
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _placeHand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _placeHand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _placeHand == Hand.Blade1 ? "0" : "1";
}
}
public class ExchangePlaceRetractHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _pickHand;
private Hand _placeHand;
public ExchangePlaceRetractHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MPNT <TrsPnt> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_pickHand = (Hand)args[2];
_placeHand = (Hand)args[3];
updateBefore();
return ",MPNT,P4,";
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _placeHand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
}
protected override void update(string[] data)
{
if (_placeHand == Hand.Blade1)
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade2);
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1, _chamber, _slot);
}
else
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1);
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade2, _chamber, _slot);
}
_device.Swap = false;
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class ExchangeHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public ExchangeHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $ <UNo> (<SeqNo>) MTRE <TrsSt> <SlotNo> <MtnMode> <Posture> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
if (_hand == Hand.Blade1)
_hand = Hand.Blade2;
else
_hand = Hand.Blade1;
updateBefore();
return string.Format(",MTRE,{0},{1:D2},E{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
_device.Swap = true;
_device.PlaceBalde = _hand;
}
protected override void update(string[] data)
{
if (_hand == Hand.Blade2)
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade2);
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1, _chamber, _slot);
}
else
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1);
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade2, _chamber, _slot);
}
_device.Swap = false;
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class ExchangeReadyExtHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _pickHand;
private Hand _placeHand;
public ExchangeReadyExtHandler()
{
background = true;
}
public override string package(params object[] args)
{
////$ <UNo> (<SeqNo>) MTRS <TrsSt> <SlotNo> <NextMtn> <Posture> <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_pickHand = (Hand)args[2];
_placeHand = (Hand)args[3];
updateBefore();
return string.Format(",MTRS,{0},{1:D2},E{2},A,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_pickHand));
//$ <UNo> (<SeqNo>) MTPT <TrsSt> <SlotNo> <NextMtn> <Posture> <TrsPnt> <Sum> <CR>
//_chamber = (ModuleName)args[0];
//_slot = (int)args[1];
//_pickHand = (Hand)args[2];
//_placeHand = (Hand)args[3];
//updateBefore();
//return string.Format(",MTPT,{0},{1:D2},E{2},A,G1,",
// RobotConvertor.chamber2staion(_chamber),
// RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
// RobotConvertor.hand2string(_pickHand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _pickHand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
}
}
public class ExchangeAfterReadyHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public ExchangeAfterReadyHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $ <UNo> (<SeqNo>) MEXG <Sum> <CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
//if (_hand == Hand.Blade1)
// _hand = Hand.Blade2;
//else
// _hand = Hand.Blade1;
updateBefore();
return ",MEXG,";
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
_device.Swap = true;
_device.PlaceBalde = _hand;
}
protected override void update(string[] data)
{
if (_hand == Hand.Blade2)
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade2);
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1, _chamber, _slot);
}
else
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1);
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade2, _chamber, _slot);
}
_device.Swap = false;
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class GotoHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Motion _next;
private Hand _hand;
public GotoHandler()
{
background = true;
}
public override string package(params object[] args)
{
//Move to ready position with specified adjustment offset
//$<UNo>(<SeqNo>) MTRO <TrsSt> <SlotNo> <NextMtn> <Posture> <OffsetX> <OffsetY> <OffsetZ> <Sum>
//• OffsetN: Offset(5 bytes each)
//• OffsetX: X direction offset
//• OffsetY: Y direction offset
//• OffsetZ: Z direction offset
//• Specified in the range between "-9999" and "99999"(Resolution: 0.01[mm])
//• If value is less than 5 digits, fill the higher digit with 0 so that the field always has 5 digits.
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_next = (Motion)args[2];
_hand = (Hand)args[3];
int x = (int)args[4];
int y = (int)args[5];
int z = (int)args[6];
updateBefore();
return string.Format(",MTRO,{0},{1:D2},{2},A,{3},{4},{5}",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.NextMotion2String(_next, _hand),
RobotConvertor.Offset2String(x),
RobotConvertor.Offset2String(y),
RobotConvertor.Offset2String(z)
); ;
}
private void updateBefore()
{
if(_hand == Hand.Blade1)
_device.Blade1Target = _chamber;
else if (_hand == Hand.Blade2)
_device.Blade2Target = _chamber;
else
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
}
}
}
public class PickHandlerEx : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PickHandlerEx()
{
background = true;
}
public override string package(params object[] args)
{
//Move to ready position and get wafer with adjustment offset(MTRO+MGET)
//$ < UNo > (< SeqNo >) MTGO<TrsSt> < SlotNo > < NextMtn > < Posture > < OffsetX > < OffsetY > < OffsetZ > < Sum > < CR >
//• UNo: Unit number(1 byte)
//• 1 to 4: Unit specified
//• SeqNo: Sequence number(Non/ 1 / 2 / 3 byte)
//• TrsSt: Transfer station(2 bytes)
//• "C1" to "C8": When cassette stage specified
//• "S1" to "SC": When transfer stage specified
//• "P1" to “P2”: When P/ A stage specified
//Note: P2 station is effective only when two or more PA stations exist.
//• SlotNo: Slot number(2 bytes)
//• "01" to "XX": When cassette stage specified by<TrsST>
//(The maximum value of "XX" is in the ASCII code of the number of slots specified by parameter.)
//• "00": When transfer stage or P / A stage specified by < TrsSt >
//• NextMtn: Next motion mode(2 bytes)
//• "GA": Next motion is wafer Get motion with extension axis 1(Blade 1).
//• "GB": Next motion is wafer Get motion with extension axis 2(Blade 2).
//• "GW": Next motion is wafer Get motion with extension axis 1 and 2(Blade 1 and 2). < WGet motion >
//Note 1.The motion of extension axis 2(or blade 2) is available only for a dual-arm manipulator and dual blade
//linear motion manipulator.
//2.The WGet motion is available for a dual-arm manipulator and dual blade linear motion manipulator.
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
int x = (int)args[3];
int y = (int)args[4];
int z = (int)args[5];
updateBefore();
if (_hand == Hand.Both)
{
return string.Format(",MTGO,{0},{1:D2},G{2},A,{3},{4},{5}",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_hand),
RobotConvertor.Offset2String(x),
RobotConvertor.Offset2String(y),
RobotConvertor.Offset2String(z)
);
}
return string.Format(",MTGO,{0},{1:D2},G{2},A,{3},{4},{5}",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.hand2string(_hand),
RobotConvertor.Offset2String(x),
RobotConvertor.Offset2String(y),
RobotConvertor.Offset2String(z)
);
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
protected override void update(string[] data)
{
if (_hand == Hand.Blade1)
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1);
}
else if (_hand == Hand.Blade2)
{
for (int i = 0; i < _device.Blade2Slots; i++)
WaferManager.Instance.WaferMoved(_chamber, _slot + i, ModuleHelper.Converter(_device.Name), (int)Hand.Blade2 + i);
}
else
{
for (int i = 0; i < _device.Blade2Slots + 1; i++)
WaferManager.Instance.WaferMoved(_chamber, _slot + i, ModuleHelper.Converter(_device.Name), (int)Hand.Blade1 + i);
}
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class PlaceHandlerEx : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PlaceHandlerEx()
{
background = true;
}
public override string package(params object[] args)
{
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
int x = (int)args[3];
int y = (int)args[4];
int z = (int)args[5];
updateBefore();
if (_hand == Hand.Both)
{
return string.Format(",MTPO,{0},{1:D2},P{2},A,{3},{4},{5}",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
RobotConvertor.hand2string(_hand),
RobotConvertor.Offset2String(x),
RobotConvertor.Offset2String(y),
RobotConvertor.Offset2String(z)
);
}
return string.Format(",MTPO,{0},{1:D2},P{2},A,{3},{4},{5}",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.hand2string(_hand),
RobotConvertor.Offset2String(x),
RobotConvertor.Offset2String(y),
RobotConvertor.Offset2String(z)
);
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = _hand == Hand.Blade1 ? "1" : "0";
_device.CmdBlade2Extend = _hand == Hand.Blade1 ? "0" : "1";
}
protected override void update(string[] data)
{
if (_hand == Hand.Blade1)
{
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1, _chamber, _slot);
}
else if (_hand == Hand.Blade2)
{
for (int i = 0; i < _device.Blade2Slots; i++)
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade2 + i, _chamber, _slot + i);
}
else
{
for (int i = 0; i < _device.Blade2Slots + 1; i++)
WaferManager.Instance.WaferMoved(ModuleHelper.Converter(_device.Name), (int)Hand.Blade1 + i, _chamber, _slot + i);
}
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
string arm = _hand == Hand.Blade1 ? "A" : "B";
_device.CmdBladeTarget = $"{_chamber}.{arm}";
_device.CmdBlade1Extend = "0";
_device.CmdBlade2Extend = "0";
}
}
//NOT SUPPORT with OFFSET
//public class ExchangeHandlerEx : RobotMotionHandler
//{
// private ModuleName _chamber;
// private int _slot;
// private Hand _hand;
// public ExchangeHandlerEx()
// {
// background = true;
// }
// public override string package(params object[] args)
// {
// // $ <UNo> (<SeqNo>) MEXG <Sum> <CR>
// _chamber = (ModuleName)args[0];
// _slot = (int)args[1];
// _hand = (Hand)args[2];
// if (_hand == Hand.Blade1)
// _hand = Hand.Blade2;
// else
// _hand = Hand.Blade1;
// updateBefore();
// int x = (int)args[3];
// int y = (int)args[4];
// int z = (int)args[5];
// updateBefore();
// if (_hand == Hand.Both)
// {
// return string.Format(",MTPO,{0},{1:D2},G{2},A,{3},{4},{5}",
// RobotConvertor.chamber2staion(_chamber),
// RobotConvertor.chamberSlot2Slot(_chamber, _slot + 1),
// RobotConvertor.hand2string(_hand),
// RobotConvertor.Offset2String(x),
// RobotConvertor.Offset2String(y),
// RobotConvertor.Offset2String(z)
// );
// }
// return string.Format(",MTPO,{0},{1:D2},G{2},A,{3},{4},{5}",
// RobotConvertor.chamber2staion(_chamber),
// RobotConvertor.chamberSlot2Slot(_chamber, _slot),
// RobotConvertor.hand2string(_hand),
// RobotConvertor.Offset2String(x),
// RobotConvertor.Offset2String(y),
// RobotConvertor.Offset2String(z));
// }
// private void updateBefore()
// {
// _device.Blade1Target = _chamber;
// _device.Blade2Target = _chamber;
// _device.Swap = true;
// _device.PlaceBalde = _hand;
// }
// protected override void update(string[] data)
// {
// if (_hand == Hand.Blade2)
// {
// WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleName.Robot, (int)Hand.Blade2);
// WaferManager.Instance.WaferMoved(ModuleName.Robot, (int)Hand.Blade1, _chamber, _slot);
// }
// else
// {
// WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleName.Robot, (int)Hand.Blade1);
// WaferManager.Instance.WaferMoved(ModuleName.Robot, (int)Hand.Blade2, _chamber, _slot);
// }
// _device.Swap = false;
// _device.Blade1Target = ModuleName.Robot;
// _device.Blade2Target = ModuleName.Robot;
// }
//}
public class RBWaferMappingHandler : RobotMotionHandler
{
private ModuleName _chamber;
public RBWaferMappingHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) MMAP <TrsSt> <SlotNo> <Sum> <CR>
// SlotNo: Slot number(2 bytes)
//• "FF": When all slots specified
//• ”01” to ”XX”: When cassette stage is specified by < TrsSt >
//(The maximum value of "XX" is in ASCII code of the number of slots specified by parameter.)
//• ”00”: When transfer stage or P / A stage specified by<TrsSt>
// Note: Specific slot section definition cannot be performed.
//• Reception rejected: Responds with the error code.
_chamber = (ModuleName)args[0];
//_slot = (int)args[1];
//_hand = (Hand)args[2];
updateBefore();
return string.Format(",MMAP,{0},FF,",
RobotConvertor.chamber2staion(_chamber));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
}
protected override void update(string[] data)
{
_device.Blade1Target = ModuleHelper.Converter(_device.Name);
_device.Blade2Target = ModuleHelper.Converter(_device.Name);
}
}
public class RBQueryWaferMapHandler : ITransferMsg
{
public bool background { get; protected set; }
public bool evt { get { return false; } }
public string deviceID { private get; set; }
public string _cmd = string.Empty;
private ModuleName _chamber;
public IDevice Robot { set { _device = (Robot)value; } }
protected Robot _device;
public RBQueryWaferMapHandler()
{
background = false;
}
//$ <UNo> (<SeqNo>) RMAP <TrsSt> <SlotNo> <Sum> <CR>
public string package(params object[] args)
{
_chamber = (ModuleName)args[0];
return string.Format(",RMAP,{0},FF,",
RobotConvertor.chamber2staion(_chamber));
}
public bool unpackage(string type, string[] items)
{
//$,<UNo>(,<SeqNo>),<Sts>,<Ackcd>,RMAP,<TrsSt>,<Slot>,
//01:<Result1>…,N:<ResultN>(,<Sum>)<CR>
//• UNo : Unit number (1 byte)
//• SeqNo : Sequence number (None / 2 bytes)
//• Sts : Status (2 bytes)
//• Ackcd : Response code (4 bytes)
//• TrsSt : Transfer station (3 bytes)
//• Slot : Slot number (2 bytes)
//• Result* : Mapping result (2 bytes each)
//• “--” : No wafer detected.
//• “OK” : Wafer inserted correctly.
//• “CW” : Wafer inserted incorrectly (inclined).
//• “DW” : Wafer inserted incorrectly (duplicated).
//Note) Responds with the number of slots of the specified transfer station.
//$,1,00,0000,RMAP,C02,00,
//01:OK,02:DW,03:OK,04:CW,05:CW,06:OK,07:OK,08:--,09:OK,10:OK
// No wafer: "0", Wafer: "1", Crossed:"2", Undefined: "?", Overlapping wafers: "W"
if (items.Length > 5)
{
string data = items[5];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Length; i += 4)
{
string value = data.Substring(i + 2, 2);
switch (value)
{
case "--":
sb.Append("0");
break;
case "OK":
sb.Append("1");
break;
case "CW":
sb.Append("2");
break;
case "DW":
sb.Append("W");
break;
}
}
_device.NotifySlotMapResult(_chamber, sb.ToString());
return true;
}
return !background;
}
}
// Transfer speed level setting
public class RbSetSpeedHandler : RobotMotionHandler
{
private int _speed = 0;
public RbSetSpeedHandler()
{
background = false;
}
public override string package(params object[] args)
{
_speed = (int)args[0];
//$ < UNo > (< SeqNo >) SSLV<Level> < Sum > < CR >
///
/// • H : High speed level
//• M : Medium speed level
//• L : Low speed level
///
if(_speed == 1)
return string.Format(",SSLV,H,");
else if (_speed == 2)
return string.Format(",SSLV,M,");
return string.Format(",SSLV,L,");
}
}
// Transfer speed level setting
public class RbSetOffsetHandler : RobotMotionHandler
{
public RbSetOffsetHandler()
{
background = false;
}
public override string package(params object[] args)
{
//$ <UNo> (<SeqNo>) SOFS <Mem> <TrsSt> <Offset1> <Offset2> … <Offset5> <Sum> <CR>
///Mem: Memory (1 byte) V: Volatile memory N: Non -volatile memory
//• TrsSt: Transfer station(2 bytes)
//• "C1" to "C8": When cassette stage specified
//• "S1" to "SC": When transfer stage specified
//• "P1" to “P2”: When P/ A stage specified
//Note: P2 station is effective only when two or more PA stations exist.
//• Offset: Transfer offset(4 bytes each)
//• Offset1: Downward offset
//• Offset2: Upward offset
//• Offset3: Offset in the extending direction(with the edge - grip - type fork)
//• Offset4: Offset in the retracting direction(with the edge - grip - type fork)
//• Offset5: Put downward offset(with the edge - grip - type fork)
//Note: Offset3 to Offset5 are omitted when the fork type is not the edge - grip type.
//• About Offset3 to Offset5, it is omissible with a parameter setup.
//• Specified in the range between "-999" and "9999"(resolution: 0.01[mm])
//• If a value is less than specified digits, fill the higher digit with 0 so that the field always has specfied digits.
ModuleName _chamber = (ModuleName)args[0];
int down = (int)args[1];
int up = (int)args[2];
int extend = (int)args[2];
int retract = (int)args[2];
int pdown = (int)args[2];
return string.Format(",SOFS,V{0},{1:D4},{2:D4},{3:D4},{4:D4},",
RobotConvertor.chamber2staion(_chamber),
down,
up,
extend,
retract,
pdown
);
}
}
public class RBQueryStateHandler : ITransferMsg
{
public bool background { get; protected set; }
public bool evt { get { return false; } }
public string deviceID { private get; set; }
public string _cmd = string.Empty;
public IDevice Robot { set { _device = (Robot)value; } }
protected Robot _device;
public RBQueryStateHandler()
{
background = false;
}
//$ <UNo> (<SeqNo>) <StsN> <Ackcd> <Sum> <CR>
//$ <UNo> (<SeqNo>) <StsN> <Ackcd> <Errcd> <Status1> … <Status4> <Sum> <CR>
public string package(params object[] args)
{
return ",RSTS,";
}
public bool unpackage(string type, string[] items)
{
//status1 bit 0 --blade 1 wafer status 0=wafer present, 1=wafer absent. Here balde 1 is upper
//status1 bit 1 --blade 2 wafer status 0=wafer present, 1=wafer absent. Here balde 2 is lower
//$,1,10,A0,0000,29D05000 status1 = 5 measn blade1 has wafer, blade2 no wafer
int status1 = 0;
if (items!=null && items.Length >= 6 && items[5].Length > 4)
{
var content = items[5];
var status1Bit = content[4];
if (status1Bit >= 'A' && status1Bit <= 'F')
status1 = status1Bit - 'A' + 10;
else if (status1Bit >= 'a' && status1Bit <= 'f')
status1 = status1Bit - 'a' + 10;
else
int.TryParse(status1Bit.ToString(), out status1);
//Here balde 1 is upper,balde 2 is lower
((Robot)_device).NotifyWaferPresent(Hand.Blade2, (status1&0x0001) == 0 ? WaferStatus.Normal : WaferStatus.Empty);
((Robot)_device).NotifyWaferPresent(Hand.Blade1, (status1&0x0002) == 0 ? WaferStatus.Normal : WaferStatus.Empty);
}
return !background;
}
}
public class RbEventHandler : ITransferMsg
{
public bool background { get { return false; } }
public bool evt { get { return true; } }
public string deviceID { private get; set; }
public string _cmd = string.Empty;
public IDevice Robot { set { _device = (Robot)value; } }
protected Robot _device;
public RbEventHandler()
{
}
//$,<UNo>(,<SeqNo>),RSTS(,<Sum>)<CR>
public string package(params object[] args)
{
return "";
}
public bool unpackage(string type, string[] items)
{
string evtType = items[3];
if (evtType.Equals(ProtocolTag.resp_evt_error))
{
int error = Convert.ToInt32(items[5], 16);
_device.ErrorCode = error;
if (error > 0)
_device.LastErrorCode = error;
return true;
}
return false;
}
}
public class RBQueryPositionHandler : ITransferMsg
{
public bool background { get; protected set; }
public bool evt { get { return false; } }
public string deviceID { private get; set; }
public string _cmd = string.Empty;
public IDevice Robot { set { _device = (Robot)value; } }
protected Robot _device;
public RBQueryPositionHandler()
{
background = false;
}
//$ <UNo> (<SeqNo>) RPOS <TrsSt> <Fork> <Posture> <Sum> <CR>
// • TrsSt: Transfer station(2 bytes)
//• "C1" to "C8": When the lowest-layer position of the cassette stage specified
//• "H1" to "H8": When the highest-layer position of the cassette stage specified
//• "S1" to "SC": When transfer stage specified
//• "P1" to “P2”: When P/A stage specified
//Note: P2 station is effective only when two or more PA stations exist.
//• "FF": When current position specified
//• "FE": When specify the feedback of present location
//<Three-axis pre-aligner, Edge-grip pre-aligner>
//• "FF": When current position specified
//• "FE": When specify the feedback of present location
//• Fork: Fork specified(1 byte)
//• A: When extension axis 1 (Blade 1) specified
//• B: When extension axis 2 (Blade 2) specified(for dual-arm manipulator and dual blade linear motion
//manipulator only)
//Note: Fixed to A when the current position and feedback of present location are specified at<TrsSt>
public string package(params object[] args)
{
return ",RPOS,FF,A,A,";
}
public bool unpackage(string type, string[] items)
{
//$ <UNo> (<SeqNo>) <StsN> <Ackcd> <Value1> … <ValueN> <Sum> <CR>
// • ValueN: Coordinate(8 bytes each)
//• Specified in the range as follows (The resolution is 0.01[mm] or[deg])
//8 Byte: between "-9999999" ~"99999999"
//• If a value is less than specified digits, fill the higher digit with 0 so that the field always has specfied digits.
//• The sign is added to the highest digit.
//• The number of “ValueN” depends on the unit type.
//Responds with as many axis numbers as the specified unit has.See the table bellow.
//Unit Value1 Value2 Value3 Value4 Value5 Value6
//Single - arm manipulator Rotation //Elevation //(Track
//Dual - arm manipulator Rotation //Extension //axis 1 //axis 2 //(Track
if (items.Length > 7)
{
_device.Rotation = int.Parse(items[7]);
_device.Extension = int.Parse(items[8]);
_device.Wrist1 = int.Parse(items[9]);
_device.Wrist2 = int.Parse(items[10]);
_device.Evevation = int.Parse(items[11]);
return true;
}
return !background;
}
}
public class RbSetWaferSizeHandler : RobotMotionHandler
{
public RbSetWaferSizeHandler()
{
background = false;
}
public override string package(params object[] args)
{
////$ < UNo > (< SeqNo >) SPRM<Type> < PrmNo > < Value > < Sum > < CR >
//// UNo: Unit No. (1 Byte)
////  1 : RB
////  2 : PA
//// SeqNo: Sequence No. (None / 1 / 2 / 3 Byte)
//// Type: Parameter type(3 Byte)
////  ”CIU” : Common integral number parameter
////  ”CRU” : Common real number parameter
////  ”CRS” : Common real number system parameter
////  ”UIU” : Unit integral number parameter
////  ”URU” : Unit real number parameter
////  ”URS” : Unit real number system parameter
//// PrmNo: Parameter No. (4 Byte)
////  Designate in the range of ”0000” - ”9999”
////  In case of less than 4 - digit, put 0 in front of the numbers. Always designate numbers in
////4 - digit format.
//// Value: Parameter value(12 Byte)
//// Designate in the range of ”-99999999999” - ”999999999999” (Resolving power of real
////number parameter is 0.0001)  In case of less than 12 - digit, put 0 in front of the numbers. Always designate numbers in
////12 - digit format.
//// Simbol is added on most significant bit
////[Response format](Response message) $ < UNo > (< SeqNo >) < StsN > < Ackcd > < Sum > < CR >
//// UNo: Unit No.(1 Byte)
////  1 : RB
////  2 : PA
//// SeqNo: Sequence No. (None / 1 / 2 / 3 Byte)
//// StsN: Status(1 / 2 Byte)
//// Ackcd: Response code(4 Byte)
////  In case of reception normally  Response ”0000”
////  Incase of reception denial  Response error code
///
//SPRMCRS0000 000000625000 68
int cmd = (int)args[0];
WaferSize size = (WaferSize)args[1];
string package = "";
switch (cmd)
{
case 0x0000:
package = string.Format("SPRM,CRS,0000,{0:D12},",
RobotConvertor.WaferSize2Int(size)
);
break;
case 0x0114:
package = string.Format("SPRM,URS,0114,{0:D12},",
RobotConvertor.MappingOffset2Int(size)
);
break;
}
return package;
}
}
/*
public class RBQueryWaferSizeHandler : ITransferMsg
{
public bool background { get; protected set; }
public bool evt { get { return false; } }
public string deviceID { private get; set; }
public string _cmd = string.Empty;
public IDevice Robot { set { _device = (Robot)value; } }
protected Robot _device;
public RBQueryWaferSizeHandler()
{
background = false;
}
//$ <UNo> (<SeqNo>) <StsN> <Ackcd> <Sum> <CR>
//$ <UNo> (<SeqNo>) <StsN> <Ackcd> <Errcd> <Status1> … <Status4> <Sum> <CR>
public string package(params object[] args)
{
return ",RSTS,";
}
public bool unpackage(string type, string[] items)
{
//status1 bit 0 --blade 1 wafer status 0=wafer present, 1=wafer absent. Here balde 1 is upper
//status1 bit 1 --blade 2 wafer status 0=wafer present, 1=wafer absent. Here balde 2 is lower
//$,1,10,A0,0000,29D05000 status1 = 5 measn blade1 has wafer, blade2 no wafer
int status1 = 0;
if (items != null && items.Length >= 6 && items[5].Length > 4)
{
var content = items[5];
var status1Bit = content[4];
if (status1Bit >= 'A' && status1Bit <= 'F')
status1 = status1Bit - 'A' + 10;
else if (status1Bit >= 'a' && status1Bit <= 'f')
status1 = status1Bit - 'a' + 10;
else
int.TryParse(status1Bit.ToString(), out status1);
//Here balde 1 is upper,balde 2 is lower
((Robot)_device).NotifyWaferPresent(Hand.Blade2, (status1 & 0x0001) == 0 ? WaferStatus.Normal : WaferStatus.Empty);
((Robot)_device).NotifyWaferPresent(Hand.Blade1, (status1 & 0x0002) == 0 ? WaferStatus.Normal : WaferStatus.Empty);
}
return !background;
}
}
*/
}