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

1393 lines
48 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;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot.SR100
{
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();
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(), 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
{
//message = ">,1,EVNT,100,2018/11/16 17:01:06,2BA0,A1";
// >,1,EVNT,100,2019/10/11 17:27:32,1930,8B
//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";
try
{
completed = false;
string package = message;
string[] words = Regex.Split(package, ProtocolTag.cmd_token);
string type = words[0];
int unit = int.Parse(words[1]);
string sum = words[words.Length - 1];
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)
{
int seq = int.Parse(words[2]);
if (seq != ID)
return false;
if (unit != Unit)
{
throw (new InvalidPackageException(string.Format("invalid unit {0}", package)));
}
}
if (type == ProtocolTag.resp_tag_error)
{
string error = words[1];
//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)
{
string evtType = words[3];
string evtInfo = words[5];
if (_imp.evt)
completed = _imp.unpackage(type, words);
return _imp.evt;
}
else
{
completed = _imp.unpackage(type, words);
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);
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));
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)
{
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))
{
if (items.Length > 7)
_device.ElapseTime = int.Parse(items[6]);
if (items.Length > 8)
_device.Rotation = int.Parse(items[7]);
if (items.Length > 9)
_device.Extension = int.Parse(items[8]);
if (items.Length > 10)
_device.Wrist1= int.Parse(items[9]);
if (items.Length > 11)
_device.Wrist2= int.Parse(items[10]);
if (items.Length > 12)
_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;
}
//$,<UNo>(,<SeqNo>),CCLR,<CMode>(,<Sum>)<CR>
public override string package(params object[] args)
{
return ",CCLR,E,";
}
}
public class RbHomeHandler : RobotMotionHandler
{
public RbHomeHandler()
{
background = true;
}
public override string package(params object[] args)
{
updateBefore();
return ",INIT,1,1,G,";
}
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 RbClearErrorHandler : RobotMotionHandler
{
public RbClearErrorHandler()
{
background = true;
}
//$,<UNo>(,<SeqNo>),CCLR,<CMode>(,<Sum>)<CR>
public override string package(params object[] args)
{
return ",CCLR,E,";
}
}
public class RbGripHandler : RobotMotionHandler
{
Hand _hand;
public RbGripHandler()
{
background = true;
}
//$,<UNo>(,<SeqNo>),CSOL,<Sol>,<Sw>,<Wait>(,<Sum>)<CR>
//sol Solenoid control specification (1 byte) • 1 : Blade 1. • 2 : Blade 2. • F : Blade 1 + Blade 2.
// Solenoid command (1 byte) • 0 : Wafer release. / Lifter down. • 1 : Wafer hold. / Lifter up.
public override string package(params object[] args)
{
_hand = (Hand)args[0];
bool bHold = (bool)args[1];
if(bHold)
return string.Format(",CSOL,{0},1,0,",RobotConvertor.hand2string(_hand));
return string.Format(",CSOL,{0},0,0,", RobotConvertor.hand2string(_hand));
}
}
public class RbStopHandler : RobotMotionHandler
{
public RbStopHandler()
{
background = true;
}
//$,<UNo>(,<SeqNo>),CSTP,<Sw>(,<Sum>)<CR>
//• H : Deceleration to a stop.
//• E : Emergency stop.
public override string package(params object[] args)
{
bool isEmergency = (bool)args[0];
if (isEmergency)
return ",CSTP,E,";
return ",CSTP,H,";
}
}
public class RbResumeHandler : RobotMotionHandler
{
public RbResumeHandler()
{
background = true;
}
//[Command Message] $,<UNo>(,<SeqNo>),CRSM(,<Sum>)<CR>
//• UNo : Unit number(1 byte)
// • 1 : Manipulator.
// • 2 : Pre-aligner.
//• SeqNo : Sequence number(None / 2 bytes)
public override string package(params object[] args)
{
return ",CRSM,";
}
}
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>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<Sum>)<CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTRS,G,{0},{1:D2},A,{2},Gb,",
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";
}
}
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>
// $,<UNo>(,<SeqNo>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<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 PickHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PickHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $,<UNo>(,<SeqNo>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<Sum>)<CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTRS,G,{0},{1:D2},A,{2},G4,",
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.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 PlaceHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PlaceHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $,<UNo>(,<SeqNo>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<Sum>)<CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTRS,P,{0},{1:D2},A,{2},P4,",
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.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 PlaceExtendHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public PlaceExtendHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $,<UNo>(,<SeqNo>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<Sum>)<CR>
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTRS,P,{0},{1:D2},A,{2},Pb,",
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";
}
}
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>
// $,<UNo>(,<SeqNo>),MPNT,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<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 ExchangHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public ExchangHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $,<UNo>(,<SeqNo>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<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(",MTRS,E,{0},{1:D2},A,{2},P4,",
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 GotoHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
public GotoHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $,<UNo>(,<SeqNo>),MTCH,<TrsSt>,<Slot>,<Posture>,<Hand>,<PMode> (,< OfstX >,< OfstY >,< OfstZ >)(,< Sum >)< CR >
//• M : Intermediate position (position with XYZ direction offset value applied).
//• R : Ready position (position with XYZ direction offset value applied).
// • O : Offset position (position with XYZ direction offset values applied).
//// • S : Registered position.
/// • B : Mapping start position.
// • E : Mapping finish position.
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
updateBefore();
return string.Format(",MTCH,{0},{1:D2},A,{2},R,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.hand2string(_hand));
}
private void updateBefore()
{
_device.Blade1Target = _chamber;
_device.Blade2Target = _chamber;
}
}
public class MoveToHandler : RobotMotionHandler
{
private ModuleName _chamber;
private int _slot;
private Hand _hand;
private bool _isPick;
public MoveToHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $,<UNo>(,<SeqNo>),MTCH,<TrsSt>,<Slot>,<Posture>,<Hand>,<PMode> (,< OfstX >,< OfstY >,< OfstZ >)(,< Sum >)< CR >
_chamber = (ModuleName)args[0];
_slot = (int)args[1];
_hand = (Hand)args[2];
_isPick = (bool)args[3];
updateBefore();
return string.Format(",MTRS,G,{0},{1:D2},A,{2},G4,",
RobotConvertor.chamber2staion(_chamber),
RobotConvertor.chamberSlot2Slot(_chamber, _slot),
RobotConvertor.IsPick2Position(_isPick));
}
private void updateBefore()
{
_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>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt> (,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<Sum>)<CR>
// UNo: Unit number (1 byte)
// • 1 : Manipulator.
// • SeqNo : Sequence number (None / 2 bytes)
// • Mtn : Motion mode (1 byte)
// • G : Get motion.
// • P : Put motion.
// • E : Exchange motion.
// • TrsSt : Transfer station (3 bytes)
// • “C01” - “C08” : Cassette stage.
// • “S01” - “S12” : Transfer stage.
// • “P01” : P/A stage.
// • Slot : Slot number (2 bytes)
// <Cassette stage>
// • “01” - “30” : When cassette stage specified.
// <Transfer stage, Pre-aligner stage>
// • “00” : Fixed slot(because this type of station does not have multiple slots.).
// Note) If value is less than 2 digits, fill the higher digit with 0 so that the field always has 2 digits.
// Note) If <Hand> is F(Blade 1 + Blade 2), specifies the slot accessed by Blade 1.
// Note) If <TrsST> is “S01”-“S12” or “P01”, the slot no. is ignored.
// • Posture : Arm Posture (1 byte)
// • L : Left elbow.
// • R : Right elbow.
// • A : Automatic (Automatically selected posture with the proper path).
// • Hand : Blade (1 byte)
// • 1 : Blade 1.
// • 2 : Blade 2.
// • F : Blade 1 + Blade 2 (WGet/WPut operation).
// Note) Except for <TrsPnt> is [C01-C08: Cassette stage], F(Blade 1 + Blade 2) cannot be
// specified.
// Note) If <Mtn> is E( Exchange motion), F(Blade 1 + Blade 2) cannot be specified.
_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];
if (x < -5000) x = -5000;
if (x > 5000) x = 5000;
if (y < -5000) y = -5000;
if (y > 5000) y = 5000;
if (z < -2500) z = -5000;
if (z > 2500) z = 2500;
updateBefore();
return string.Format(",MTRS,G,{0},{1:D2},A,{2},G4,{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;
}
protected override void update(string[] data)
{
if (_hand == Hand.Both)
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleName.Robot, (int)Hand.Blade1);
WaferManager.Instance.WaferMoved(_chamber, _slot + 1, ModuleName.Robot, (int)Hand.Blade2);
}
else
{
WaferManager.Instance.WaferMoved(_chamber, _slot, ModuleName.Robot, (int)_hand);
}
_device.Blade1Target = ModuleName.Robot;
_device.Blade2Target = ModuleName.Robot;
}
}
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];
if (x < -5000) x = -5000;
if (x > 5000) x = 5000;
if (y < -5000) y = -5000;
if (y > 5000) y = 5000;
if (z < -2500) z = -5000;
if (z > 2500) z = 2500;
updateBefore();
return string.Format(",MTRS,P,{0},{1:D2},A,{2},P4,{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;
}
protected override void update(string[] data)
{
if (_hand == Hand.Both)
{
WaferManager.Instance.WaferMoved(ModuleName.Robot, (int)Hand.Blade1, _chamber, _slot);
WaferManager.Instance.WaferMoved(ModuleName.Robot, (int)Hand.Blade2, _chamber, _slot + 1);
}
else
{
WaferManager.Instance.WaferMoved(ModuleName.Robot, (int)_hand, _chamber, _slot);
}
_device.Blade1Target = ModuleName.Robot;
_device.Blade2Target = ModuleName.Robot;
}
}
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>),MTRS,<Mtn>,<TrsSt>,<Slot>,<Posture>,<Hand>,<TrsPnt>(,<OfstX>,<OfstY>,<OfstZ>)(,<Angle>)(,<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;
int x = (int)args[3];
int y = (int)args[4];
int z = (int)args[5];
updateBefore();
return string.Format(",MTRS,E,{0},{1:D2},A,{2},P4,{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;
//private int _slot;
//private Hand _hand;
public RBWaferMappingHandler()
{
background = true;
}
public override string package(params object[] args)
{
//$,<UNo>(,<SeqNo>),MMAP,<TrsSt>,<Slot>(,<Safe>)(,<Sum>)<CR>
//TrsSt : Transfer station (3 bytes)
//“C01” - “C08” : Cassette stage.
//“S01” - “S12” : Transfer stage.
//“P01” : P/A stage.
//• Slot : Slot number (2 bytes)
//<Cassette stage>
//• “01” - “30” : When specifying individual cassette stage slot.
//• “00” : When specifying all slots.
//<Transfer stage, P/A stage>
//• “00” : Fixed value t(because this type of station does not have multiple slots.)
//Note) If value is less than 2 digits, fill the higher digit with 0 so that the field always has 8 digits.
//Note) If <TrsST> is “S01”-“S12” or “P01”, the slot no. is ignored.
//• Safe : Specifies wafer protrusion detection operation yes/no (1 byte)
//• 0 : No wafer protrusion detection operation.
//• 1 : Wafer protrusion detection operation performed.
_chamber = (ModuleName)args[0];
//_slot = (int)args[1];
//_hand = (Hand)args[2];
updateBefore();
return string.Format(",MMAP,{0},00,1,",
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>,<Slot>(,<Sum>)<CR>
public string package(params object[] args)
{
_chamber = (ModuleName)args[0];
return string.Format(",RMAP,{0},00,",
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 > 7)
{
StringBuilder sb = new StringBuilder();
for (int i = 8; i < items.Length-1; i++)
{
string value = items[i].Substring(3);
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;
}
}
public class RbSetSpeedHandler : RobotMotionHandler
{
private int _speed = 0;
public RbSetSpeedHandler()
{
background = false;
}
public override string package(params object[] args)
{
_speed = (int)args[0];
return string.Format(",SSLV,{0},", _speed);
}
}
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>),RSTS(,<Sum>)<CR>
public string package(params object[] args)
{
return ",RSTS,";
}
public bool unpackage(string type, string[] items)
{
/*
(Positive Response Message)
$,<UNo>(,<SeqNo>),<Sts>,<Ackcd>,RSTS,<Errcd>,<Status>(,<Sum>)<CR>
UNo : Unit number (1 byte)
SeqNo : Sequence number (None / 2 bytes)
Sts : Status (2 bytes)
Ackcd : Response code (4 bytes)
Errcd : Error code (4 bytes)
Note) Responds with the currently occurring error for the specified unit.
(When there is no error, responds 0000)
Status : Status information (4 bytes)
Refer to the supplementary explanation.
(Negative Response Message)
$,<UNo>(,<SeqNo>),<Sts>,<Ackcd>,RSTS(,<Sum>)<CR>
UNo : Unit number (1 byte)
SeqNo : Sequence number (None / 2 bytes)
Sts : Status (2 bytes)
Ackcd : Response code (4 bytes)
*/
if (items.Length > 7)
{
int errorCode = Convert.ToInt32(items[6], 16);
_device.ErrorCode = errorCode;
}
if (items.Length > 8)
{
int status = Convert.ToInt32(items[7], 16);
_device.StateWaferOnBlade1 = (status & 0x01) == 0x01;
_device.StateWaferOnBlade2 = (status & 0x02) == 0x02;
_device.StateBlade1Gripped = (status & 0x04) == 0x04;
_device.StateBlade2Gripped = (status & 0x08) == 0x08;
_device.StateInterlock1 = (status & 0x0100) == 0x0100;
_device.StateInterlock2 = (status & 0x0200) == 0x0200;
_device.StateInterlock3 = (status & 0x0400) == 0x0400;
_device.StateInterlock4 = (status & 0x0800) == 0x0800;
_device.StateInterlock5 = (status & 0x010000) == 0x010000;
_device.StateInterlock6 = (status & 0x020000) == 0x020000;
_device.StateInterlock7 = (status & 0x040000) == 0x040000;
_device.StateInterlock8 = (status & 0x080000) == 0x080000;
}
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,<PType>(,<Sum>)<CR>
//• R : Command position.• F : Feedback position.
public string package(params object[] args)
{
return ",RPOS,F,";
}
public bool unpackage(string type, string[] items)
{
//Positive $,<UNo>(,<SeqNo>),<Sts>,<Ackcd>,RPOS,<PType>,<Value1>…,<ValueN>(,<Sum>)<CR>
//Negative $,<UNo>(,<SeqNo>),<Sts>,<Ackcd>,RPOS,<PType>(,<Sum>)<CR>
if (items.Length > 11)
{
_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 PositionAdjustmentHandler : RobotMotionHandler
{
private Axis axis;
//private int _slot;
//private Motion _next;
private Hand _hand;
public PositionAdjustmentHandler()
{
background = true;
}
public override string package(params object[] args)
{
// $,< UNo > (,< SeqNo >),MABS,< Axis >,< Hand >,< Mode >,< Value > (,< Sum >) < CR >
// $< UNo >,< Saqno >),MREL,< Axis >< mode >< Value >< Sum >< CR >
// UNo : Unit number(1 byte)
//1 : Manipulator.
//2 : Edge grip type pre-alinger.
//SeqNo : Sequence number(None / 2 bytes)
//Axis: Axis(1 byte)
//< Manipulator >
//S : Rotation axis.
//A : Extension axis.
//H : Wrist axis 1.
//I : Wrist axis 2.
//Z : Elevation axis.
//< Edge grip type pre - alinger >
//S : Rotation axis.
//Hand: Blade(1 byte)
//1 : Blade 1.
//2 : Blade 2.
//Note) If the<Axis> specification is “A: Extension axis”, specify the access blade.
//If the<Axis> specification is not “A: Extension axis”, specify 1
//Mode: Passive blade operation mode(1 byte)
//C : Maintain passive blade posture.
//H : Passive blade fixed to wafer center.
//Note) Valid if the < Axis > specification is “A: Extension axis”.
//If the<Axis> specification is not “A: Extension axis”, specify C.
//Value: Coordinate(8 bytes, Resolution: 0.001[mm] /[deg])
//Note) Specified in the range between “-9999999” and “99999999”.
//If value is less than 8 digits, fill the higher digit(s) with 0 so that the field always has 8 digits.
//A sign is added to the highest digit.
//Note) If the operation range is exceeded a stroke limit error will be notified.
axis = (Axis)args[0];
_hand = (Hand)args[1];
int x = (int)args[2];
return string.Format(",MREL,{0},{1},C,{2},",//MABS
RobotConvertor.AxisToStr(axis),
RobotConvertor.hand2string(_hand),
RobotConvertor.Offset2String(x)
);
}
}
}