1991 lines
72 KiB
C#
1991 lines
72 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text.RegularExpressions;
|
|||
|
using Aitex.Core.Common;
|
|||
|
using Aitex.Core.RT.Log;
|
|||
|
using Aitex.Core.RT.Event;
|
|||
|
using Aitex.Core.RT.DataCenter;
|
|||
|
using Aitex.Core.Util;
|
|||
|
using Aitex.Sorter.Common;
|
|||
|
using TSC = Aitex.Sorter.Common;
|
|||
|
using Aitex.Core.RT.Device;
|
|||
|
using Aitex.Core.RT.SCCore;
|
|||
|
using MECF.Framework.Common.Equipment;
|
|||
|
using MECF.Framework.Common.SubstrateTrackings;
|
|||
|
using Aitex.Core.RT.OperationCenter;
|
|||
|
using MECF.Framework.Common.CommonData;
|
|||
|
using MECF.Framework.Common.Communications;
|
|||
|
|
|||
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot
|
|||
|
{
|
|||
|
public enum RobotType
|
|||
|
{
|
|||
|
SR100,
|
|||
|
NX100,
|
|||
|
MAG7,
|
|||
|
DAIHEN,
|
|||
|
HAtm,
|
|||
|
HIRATA_R4
|
|||
|
}
|
|||
|
|
|||
|
public class Robot : BaseDevice, IDevice, IConnection
|
|||
|
{
|
|||
|
public event Action<ModuleName, string> OnSlotMapRead;
|
|||
|
|
|||
|
public event Action<bool> ActionDone;
|
|||
|
|
|||
|
public string Address
|
|||
|
{
|
|||
|
get { return _addr; }
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool IsConnected
|
|||
|
{
|
|||
|
get { return _socket.IsConnected; }
|
|||
|
}
|
|||
|
|
|||
|
public bool Disconnect()
|
|||
|
{
|
|||
|
_commErr = true;
|
|||
|
_socket.Dispose();
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool IsOnline
|
|||
|
{
|
|||
|
get { return _isOnline; }
|
|||
|
}
|
|||
|
|
|||
|
public const string delimiter = "\r";
|
|||
|
|
|||
|
private bool _isOnline;
|
|||
|
|
|||
|
public int LastErrorCode { get; set; }
|
|||
|
public int Status { get; set; }
|
|||
|
public int ErrorCode { get; set; }
|
|||
|
|
|||
|
public int ElapseTime { get; set; }
|
|||
|
public int Speed { get; set; }
|
|||
|
|
|||
|
public int Rotation { get; set; }
|
|||
|
public int Extension { get; set; }
|
|||
|
public int Wrist1 { get; set; }
|
|||
|
public int Wrist2 { get; set; }
|
|||
|
public int Evevation { get; set; }
|
|||
|
|
|||
|
public bool StateWaferOnBlade1 { get; set; }
|
|||
|
public bool StateWaferOnBlade2 { get; set; }
|
|||
|
public bool StateBlade1Gripped { get; set; }
|
|||
|
public bool StateBlade2Gripped { get; set; }
|
|||
|
|
|||
|
public bool StateInterlock1 { get; set; }
|
|||
|
public bool StateInterlock2 { get; set; }
|
|||
|
public bool StateInterlock3 { get; set; }
|
|||
|
public bool StateInterlock4 { get; set; }
|
|||
|
public bool StateInterlock5 { get; set; }
|
|||
|
public bool StateInterlock6 { get; set; }
|
|||
|
public bool StateInterlock7 { get; set; }
|
|||
|
public bool StateInterlock8 { get; set; }
|
|||
|
|
|||
|
public bool Swap { get; set; }
|
|||
|
public Hand PlaceBalde { get; set; }
|
|||
|
|
|||
|
public ModuleName Blade1Target
|
|||
|
{
|
|||
|
get;
|
|||
|
set;
|
|||
|
}
|
|||
|
public ModuleName Blade2Target { get; set; }
|
|||
|
|
|||
|
public RobotMoveInfo MoveInfo { get; set; }
|
|||
|
|
|||
|
//naming follow PM1.A LL1.A PM2.B
|
|||
|
public string CmdBladeTarget { get; set; }
|
|||
|
|
|||
|
//naming follow 0 1
|
|||
|
public string CmdBlade1Extend { get; set; }
|
|||
|
|
|||
|
//naming follow 0 1
|
|||
|
public string CmdBlade2Extend { get; set; }
|
|||
|
|
|||
|
public bool Blade1Enable
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (SC.ContainsItem($"{Name}.Blade1Enable"))
|
|||
|
{
|
|||
|
return SC.GetValue<bool>($"{Name}.Blade1Enable");
|
|||
|
}
|
|||
|
|
|||
|
return SC.GetValue<bool>($"Robot.Blade1Enable");
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
if (SC.ContainsItem($"{Name}.Blade1Enable"))
|
|||
|
{
|
|||
|
SC.SetItemValue($"{Name}.Blade1Enable", value);
|
|||
|
}else if (SC.ContainsItem($"Robot.Blade1Enable"))
|
|||
|
{
|
|||
|
SC.SetItemValue($"Robot.Blade1Enable", value);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
public bool Blade2Enable
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (SC.ContainsItem($"{Name}.Blade2Enable"))
|
|||
|
{
|
|||
|
return SC.GetValue<bool>($"{Name}.Blade2Enable");
|
|||
|
}
|
|||
|
|
|||
|
return SC.GetValue<bool>($"Robot.Blade2Enable");
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
if (SC.ContainsItem($"{Name}.Blade2Enable"))
|
|||
|
{
|
|||
|
SC.SetItemValue($"{Name}.Blade2Enable", value);
|
|||
|
}
|
|||
|
else if (SC.ContainsItem($"Robot.Blade2Enable"))
|
|||
|
{
|
|||
|
SC.SetItemValue($"Robot.Blade2Enable", value);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public int Blade2Slots
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (SC.ContainsItem($"{Name}.Blade2Slots"))
|
|||
|
{
|
|||
|
return Math.Max(SC.GetValue<int>($"{Name}.Blade2Slots"), 1);
|
|||
|
}
|
|||
|
|
|||
|
if (SC.ContainsItem($"Robot.Blade2Slots"))
|
|||
|
{
|
|||
|
return Math.Max(SC.GetValue<int>($"Robot.Blade2Slots"), 1);
|
|||
|
}
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool Initalized { get; set; }
|
|||
|
|
|||
|
public bool Communication
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return !_commErr;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public virtual bool Busy
|
|||
|
{
|
|||
|
get { return _backgroundHandler != null || _foregroundHandler != null; }
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Moving
|
|||
|
{
|
|||
|
get { return _backgroundHandler != null; }
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Error
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return ErrorCode > 0 || _commErr || _exceuteErr;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public DeviceState State
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (!Initalized)
|
|||
|
{
|
|||
|
return DeviceState.Unknown;
|
|||
|
}
|
|||
|
if (Error)
|
|||
|
{
|
|||
|
return DeviceState.Error;
|
|||
|
}
|
|||
|
|
|||
|
if (Busy)
|
|||
|
return DeviceState.Busy;
|
|||
|
|
|||
|
return DeviceState.Idle;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//public string ErrorMessage
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// return _factory.GetError(LastErrorCode);
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
public virtual bool WaferOnBlade1 { get { return (Status & (int)StateBit.WaferOnBlade1) > 0; } }
|
|||
|
public virtual bool WaferOnBlade2 { get { return (Status & (int)StateBit.WaferOnBlade2) > 0; } }
|
|||
|
|
|||
|
public bool WaferPresentOnBlade1 { get; set; }
|
|||
|
public bool WaferPresentOnBlade2 { get; set; }
|
|||
|
|
|||
|
public Hand TransferBlade {
|
|||
|
get
|
|||
|
{
|
|||
|
if (!Blade1Enable) return Hand.Blade2;
|
|||
|
if (!Blade2Enable) return Hand.Blade1;
|
|||
|
return Hand.Both;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
protected static Object _locker = new Object();
|
|||
|
protected AsyncSocket _socket;
|
|||
|
|
|||
|
|
|||
|
protected IHandler _eventHandler = null;
|
|||
|
protected IHandler _backgroundHandler = null; //moving
|
|||
|
protected IHandler _foregroundHandler = null; //current handler
|
|||
|
|
|||
|
private IRobotHandlerFactory _factory = null;
|
|||
|
|
|||
|
private DeviceTimer _timerQuery = new DeviceTimer();
|
|||
|
//private int _queryPeriod = 5000; //ms
|
|||
|
//private bool _queryState = true;
|
|||
|
protected bool _exceuteErr = false;
|
|||
|
protected bool _commErr = false;
|
|||
|
|
|||
|
protected string _addr;
|
|||
|
protected RobotType _type = RobotType.SR100;
|
|||
|
private string AlarmRobotError = "RobotMotionError";
|
|||
|
|
|||
|
//Active wafer Center finder Data R
|
|||
|
public int CenterOffsetR { get; private set; }
|
|||
|
|
|||
|
//Active wafer Center finder Data T
|
|||
|
public int CenterOffsetT { get; private set; }
|
|||
|
|
|||
|
private int _bufferMaxSlot = 6;
|
|||
|
public int BufferMaxSlot
|
|||
|
{
|
|||
|
set
|
|||
|
{
|
|||
|
_bufferMaxSlot = value;
|
|||
|
}
|
|||
|
get
|
|||
|
{
|
|||
|
return _bufferMaxSlot;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Robot(string module, string name, string display, string deviceId, string address, RobotType type = RobotType.SR100)
|
|||
|
: base(module, name, display, deviceId)
|
|||
|
{
|
|||
|
_addr = address;
|
|||
|
if (!string.IsNullOrEmpty(_addr))
|
|||
|
{
|
|||
|
_socket = new AsyncSocket(address);
|
|||
|
_socket.OnDataChanged += new AsyncSocket.MessageHandler(OnDataChanged);
|
|||
|
_socket.OnErrorHappened += new AsyncSocket.ErrorHandler(OnErrorHandler);
|
|||
|
}
|
|||
|
_type = type;
|
|||
|
|
|||
|
Initalized = false;
|
|||
|
|
|||
|
MoveInfo = new RobotMoveInfo()
|
|||
|
{
|
|||
|
Action = RobotAction.Moving,
|
|||
|
ArmTarget = RobotArm.Both,
|
|||
|
BladeTarget = "ArmA.System",
|
|||
|
};
|
|||
|
|
|||
|
WaferManager.Instance.SubscribeLocation(name, 1+ Blade2Slots);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public Robot(string module, string name, string address, RobotType type = RobotType.SR100, int bufferMaxSlot = 6)
|
|||
|
: this(module, name, name, name, address, type)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Initialize()
|
|||
|
{
|
|||
|
switch (_type)
|
|||
|
{
|
|||
|
case RobotType.NX100:
|
|||
|
_factory = new NX100.NX100RobotHandlerFactory(this);
|
|||
|
break;
|
|||
|
case RobotType.SR100:
|
|||
|
_factory = new SR100.SR100RobotHandlerFactory(this);
|
|||
|
break;
|
|||
|
case RobotType.MAG7:
|
|||
|
_factory = new MAG7.Mag7RobotHandlerFactory(this);
|
|||
|
break;
|
|||
|
//case RobotType.DAIHEN:
|
|||
|
// _factory = new Daihen.DaihenRobotHandlerFactory(this);
|
|||
|
// break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ConnectionManager.Instance.Subscribe(Name, this);
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(_addr))
|
|||
|
Connect();
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", ModuleName.Robot.ToString(), "Init"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool ret = Init(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Initializing");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", ModuleName.Robot.ToString(), "Home"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool ret = Home(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Homing");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", ModuleName.Robot.ToString(), "RobotHome"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool ret = Home(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Homing");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Reset"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool ret = Clear(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Reset");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotReset"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool ret = Clear(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Reset");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Grip"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[0], true);
|
|||
|
bool ret = Grip(hand,out reason);
|
|||
|
//bool ret = WaferMapping(ModuleName.LP1, out reason);
|
|||
|
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Grip");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotGrip"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[0], true);
|
|||
|
bool ret = Grip(hand, out reason);
|
|||
|
//bool ret = WaferMapping(ModuleName.LP1, out reason);
|
|||
|
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Grip");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Release"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[0], true);
|
|||
|
bool ret = Release(hand, out reason);
|
|||
|
//bool ret = QueryWaferMap(ModuleName.LP1, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Release");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotRelease"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[0], true);
|
|||
|
bool ret = Release(hand, out reason);
|
|||
|
//bool ret = QueryWaferMap(ModuleName.LP1, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Release");
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Stop"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool ret = Stop(false, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Stopping");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotStop"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool ret = Stop(false, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Stopping");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Pick"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
bool ret = Pick(chamber, slot, hand, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Pick wafer");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotPick"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
bool ret = Pick(chamber, slot, hand, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Pick wafer");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Place"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
bool ret = Place(chamber, slot, hand, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Place wafer");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotPlace"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
bool ret = Place(chamber, slot, hand, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Place wafer");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Exchange"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
bool ret = Exchange(chamber, slot, hand, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Swap wafer");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotExchange"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
bool ret = Exchange(chamber, slot, hand, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0} {1}", Name, "Swap wafer");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "Goto"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
Motion next = (Motion)Enum.Parse(typeof(Motion), (string)param[3], true);
|
|||
|
|
|||
|
int x = int.Parse((string)param[4]);
|
|||
|
int y = int.Parse((string)param[5]);
|
|||
|
int z = int.Parse((string)param[6]);
|
|||
|
|
|||
|
bool ret = Goto(chamber, slot, next, hand, x,y,z, out reason);
|
|||
|
|
|||
|
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0}{1}", Name, "Goto");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotGoto"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
ModuleName chamber = (ModuleName)Enum.Parse(typeof(ModuleName), (string)param[0], true);
|
|||
|
int slot = int.Parse((string)param[1]);
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[2], true);
|
|||
|
Motion next = (Motion)Enum.Parse(typeof(Motion), (string)param[3], true);
|
|||
|
|
|||
|
int x = int.Parse((string)param[4]);
|
|||
|
int y = int.Parse((string)param[5]);
|
|||
|
int z = int.Parse((string)param[6]);
|
|||
|
|
|||
|
bool ret = Goto(chamber, slot, next, hand, x, y, z, out reason);
|
|||
|
|
|||
|
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0}{1}", Name, "Goto");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "BladeEnable"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[0], true);
|
|||
|
bool bEnable = bool.Parse((string)param[1]);
|
|||
|
bool ret = Enable(hand, bEnable, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0}{1}", Name, "Disable robot arm");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
DEVICE.Register(String.Format("{0}.{1}", Name, "RobotBladeEnable"), (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
Hand hand = (Hand)Enum.Parse(typeof(Hand), (string)param[0], true);
|
|||
|
bool bEnable = bool.Parse((string)param[1]);
|
|||
|
bool ret = Enable(hand, bEnable, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0}{1}", Name, "Disable robot arm");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
|
|||
|
OP.Subscribe($"{Name}.Reconnect", (string cmd, object[] args) =>
|
|||
|
{
|
|||
|
return Connect();
|
|||
|
});
|
|||
|
|
|||
|
OP.Subscribe($"{Name}.TestRobotPosition", (string cmd, object[] param) =>
|
|||
|
{
|
|||
|
//int setValue = 0;
|
|||
|
Hand _hand = Hand.Blade1;
|
|||
|
Axis axis;
|
|||
|
if (param == null || param.Length < 2) return false;
|
|||
|
int moveValue = (int)(double.Parse(param[1].ToString()));
|
|||
|
switch (param[0].ToString())
|
|||
|
{
|
|||
|
case "TestRobotUp":
|
|||
|
axis = Axis.Z;
|
|||
|
break;
|
|||
|
case "TestRobotDown":
|
|||
|
moveValue = -moveValue;
|
|||
|
axis = Axis.Z;
|
|||
|
break;
|
|||
|
case "TestRobotArmLeft":
|
|||
|
moveValue = -moveValue;
|
|||
|
axis = Axis.S;// Axis.H;//H1
|
|||
|
break;
|
|||
|
case "TestRobotArmRight":
|
|||
|
axis = Axis.S;
|
|||
|
break;
|
|||
|
case "TestRobotArmUp":
|
|||
|
axis = Axis.A;// Axis.I;//H2
|
|||
|
break;
|
|||
|
case "TestRobotArmDown":
|
|||
|
moveValue = -moveValue;
|
|||
|
axis = Axis.A;
|
|||
|
break;
|
|||
|
case "TestRobotBlade1Left":
|
|||
|
_hand = Hand.Blade1;
|
|||
|
axis = Axis.H;
|
|||
|
break;
|
|||
|
case "TestRobotBlade1Right":
|
|||
|
moveValue = -moveValue;
|
|||
|
_hand = Hand.Blade1;
|
|||
|
axis = Axis.H;//TH
|
|||
|
break;
|
|||
|
case "TestRobotBlade2Left":
|
|||
|
_hand = Hand.Blade2;
|
|||
|
axis = Axis.I;
|
|||
|
break;
|
|||
|
case "TestRobotBlade2Right":
|
|||
|
moveValue = -moveValue;
|
|||
|
_hand = Hand.Blade2;
|
|||
|
axis = Axis.I;
|
|||
|
break;
|
|||
|
default:
|
|||
|
axis = Axis.A;
|
|||
|
break;
|
|||
|
}
|
|||
|
string reason;
|
|||
|
bool ret = PositionAdjustment(axis,_hand, moveValue, out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0}{1}", Name, reason);
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
OP.Subscribe($"{Name}.QueryPosition", (string cmd, object[] args) =>
|
|||
|
{
|
|||
|
string reason;
|
|||
|
bool ret = QueryPosition(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("{0}.QueryPosition,{1}", Name, reason);
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.State", () => State);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.Busy", () => Busy);
|
|||
|
DATA.Subscribe($"{Name}.ErrorCode", () => ErrorCode);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.Blade1Target", () => Blade1Target);
|
|||
|
DATA.Subscribe($"{Name}.Blade2Target", () => Blade2Target);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.Blade1Enable", () => Blade1Enable);
|
|||
|
DATA.Subscribe($"{Name}.Blade2Enable", () => Blade2Enable);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.Swap", () => Swap);
|
|||
|
DATA.Subscribe($"{Name}.PlaceBalde", () => PlaceBalde);
|
|||
|
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.Speed", () => Speed);
|
|||
|
DATA.Subscribe($"{Name}.RobotSpeed", () => Speed.ToString());
|
|||
|
DATA.Subscribe($"{Name}.RobotState", () => State.ToString());
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.Rotation", () => Rotation);
|
|||
|
DATA.Subscribe($"{Name}.Extension", () => Extension);
|
|||
|
DATA.Subscribe($"{Name}.Wrist1", () => Wrist1);
|
|||
|
DATA.Subscribe($"{Name}.Wrist2", () => Wrist2);
|
|||
|
DATA.Subscribe($"{Name}.Evevation", () => Evevation);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.CmdBladeTarget", () => CmdBladeTarget);
|
|||
|
DATA.Subscribe($"{Name}.CmdBlade1Extend", () => CmdBlade1Extend);
|
|||
|
DATA.Subscribe($"{Name}.CmdBlade2Extend", () => CmdBlade2Extend);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.RobotMoveInfo", () => MoveInfo);
|
|||
|
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.RobotBusy", () => Busy);
|
|||
|
DATA.Subscribe($"{Name}.RobotError", () => ErrorCode);
|
|||
|
DATA.Subscribe($"{Name}.RobotBlade1Traget", () => Blade1Target);
|
|||
|
DATA.Subscribe($"{Name}.RobotBlade2Traget", () => Blade2Target);
|
|||
|
DATA.Subscribe($"{Name}.RobotBlade1Enabled", () => Blade1Enable);
|
|||
|
DATA.Subscribe($"{Name}.RobotBlade2Enabled", () => Blade2Enable);
|
|||
|
DATA.Subscribe($"{Name}.RobotSwap", () => Swap);
|
|||
|
DATA.Subscribe($"{Name}.RobotSwapPlaceBlade", () => PlaceBalde);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.RobotPosRotationAxis", () => Rotation);
|
|||
|
DATA.Subscribe($"{Name}.RobotPosExtensionAxis", () => Extension);
|
|||
|
DATA.Subscribe($"{Name}.RobotPosWrist1Axis", () => Wrist1);
|
|||
|
DATA.Subscribe($"{Name}.RobotPosWrist2Axis", () => Wrist2);
|
|||
|
DATA.Subscribe($"{Name}.RobotPosEvevationAxis", () => Evevation);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.CenterOffsetR", () => CenterOffsetR);
|
|||
|
DATA.Subscribe($"{Name}.CenterOffsetT", () => CenterOffsetT);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.CommunicationStatus", () => _socket == null ? false : _socket.IsConnected);
|
|||
|
|
|||
|
DATA.Subscribe($"{Name}.IsOnline", () => _isOnline);
|
|||
|
|
|||
|
EV.Subscribe(new EventItem(60014,"Event", AlarmRobotError, "Robot error", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
|
|||
|
|
|||
|
Reset();
|
|||
|
string str = string.Empty;
|
|||
|
|
|||
|
if(_factory != null)
|
|||
|
_eventHandler = _factory.Event();
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public virtual void Terminate()
|
|||
|
{
|
|||
|
if (SC.ContainsItem("Robot.CloseSocketOnShutDown") && SC.GetValue<bool>("Robot.CloseSocketOnShutDown"))
|
|||
|
{
|
|||
|
LOG.Write($"Robot {Name} termination process: close socket");
|
|||
|
_socket.Dispose();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public virtual void Monitor()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public virtual void Reset()
|
|||
|
{
|
|||
|
|
|||
|
if (Error)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
_backgroundHandler = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
_exceuteErr = false;
|
|||
|
if (_commErr)
|
|||
|
{
|
|||
|
Connect();
|
|||
|
}
|
|||
|
Swap = false;
|
|||
|
}
|
|||
|
|
|||
|
public void SetOnline(bool online)
|
|||
|
{
|
|||
|
_isOnline = online;
|
|||
|
}
|
|||
|
|
|||
|
public bool Enable(Hand hand, bool bEnable, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
|
|||
|
if (hand == Hand.Blade1)
|
|||
|
{
|
|||
|
Blade2Enable = bEnable;
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
Blade2Enable = bEnable;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
reason = "Can't disable all blade";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Connect()
|
|||
|
{
|
|||
|
_commErr = false;
|
|||
|
_socket.Connect(this._addr);
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#region Command
|
|||
|
|
|||
|
public virtual bool Init(out string reason)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
_backgroundHandler = null;
|
|||
|
}
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.Init(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public virtual bool Home(out string reason)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
_backgroundHandler = null;
|
|||
|
}
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.Home(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ArmHome(out string reason)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
_backgroundHandler = null;
|
|||
|
}
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.ArmHome(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Grip(Hand hand,out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.Grip(hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Release(Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.Release(hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool WaferMapping(ModuleName loadport, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.WaferMapping(loadport), out reason);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public virtual bool QueryWaferMap(ModuleName loadport, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.QueryWaferMap(loadport), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool QueryState(out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.QueryState(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool QueryPosition(out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
|
|||
|
return execute(_factory.QueryPosition(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Clear(out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.Clear(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public virtual bool Stop(bool isEmergency, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
_backgroundHandler = null;
|
|||
|
}
|
|||
|
return execute(_factory.Stop(isEmergency), out reason);
|
|||
|
}
|
|||
|
public virtual bool Resume( out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
|
|||
|
return execute(_factory.Resume(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool SetSpeed(int speed, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.SetSpeed(speed), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool SetCommunication( out string reason)
|
|||
|
{
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
_backgroundHandler = null;
|
|||
|
}
|
|||
|
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.SetCommunication(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public virtual bool SetLoad(Hand hand, out string reason)
|
|||
|
{
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
_backgroundHandler = null;
|
|||
|
}
|
|||
|
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.SetLoad(hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public virtual bool CheckLoad(ModuleName chamber, int slot, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.CheckLoad(chamber, slot), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool RequestWaferAWCData(out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.RequestAWCData(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool RequestWaferPresent( out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.RequestWaferPresent(), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Goto(ModuleName chamber, int slot, Motion motion,Hand hand, int x, int y, int z,out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if(hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, double pick,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.Goto( chamber, slot, motion, hand, x,y,z), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool MoveTo(ModuleName chamber, int slot, Hand hand, bool isPick, int x, int y, int z,out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if(hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, double pick,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.MoveTo( chamber, slot, hand, isPick, x,y,z), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Extend(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Extend invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Extend invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Extend invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Extend invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Extend invalid parameter, double pick,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.Extend(chamber, slot, hand), out reason);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Retract(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Retract invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Retract invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Retract invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Retract invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Retract invalid parameter, double pick,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.Retract(chamber, slot, hand), out reason);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool PickExtend(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber.ToString() == Name || chamber == ModuleName.System || ModuleHelper.IsLoadPort(chamber) || ModuleHelper.IsBuffer(chamber))
|
|||
|
{
|
|||
|
reason = $"Pick extend target not support, chamber is {chamber.ToString()}, slot is {slot}";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Pick extend invalid parameter, do not support double arm extend ,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PickExtend(chamber, slot, hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool PickRetract(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber.ToString() == Name || chamber == ModuleName.System || ModuleHelper.IsLoadPort(chamber) || ModuleHelper.IsBuffer(chamber))
|
|||
|
{
|
|||
|
reason = $"Pick retract target not support, chamber is {chamber.ToString()}, slot is {slot}";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Pick retract invalid parameter, do not support double arm retract ,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PickRetract(chamber, slot, hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Pick(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else if(ModuleHelper.IsBuffer(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, _bufferMaxSlot - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, _bufferMaxSlot - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, _bufferMaxSlot, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, double pick,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.Pick(chamber, slot, hand), out reason);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool PickReadyPosition(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PickReadyPosition(chamber, slot, hand), out reason);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Place(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter,place, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else if (ModuleHelper.IsBuffer(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, _bufferMaxSlot - Blade2Slots, slot)) //0-6
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, _bufferMaxSlot - Blade2Slots + 1, slot)) //0 - 6
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, _bufferMaxSlot, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter,place, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter, double place,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.Place(chamber, slot, hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool PlaceReadyPosition(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PlaceReadyPosition(chamber, slot, hand), out reason);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool PlaceExtend(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber.ToString() == Name || chamber == ModuleName.System || ModuleHelper.IsLoadPort(chamber) || ModuleHelper.IsBuffer(chamber))
|
|||
|
{
|
|||
|
reason = $"Place extend target not support, chamber is {chamber.ToString()}, slot is {slot}";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason =
|
|||
|
$"Place extend invalid parameter, do not support double arm extend ,chamber is {chamber.ToString()}, slot is {slot}";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PlaceExtend(chamber, slot, hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool PlaceRetract(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber.ToString() == Name || chamber == ModuleName.System || ModuleHelper.IsLoadPort(chamber) ||ModuleHelper.IsBuffer(chamber) )
|
|||
|
{
|
|||
|
reason = $"Place retract target not support, chamber is {chamber.ToString()}, slot is {slot}";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason =
|
|||
|
$"Place retract invalid parameter, do not support double arm extend ,chamber is {chamber.ToString()}, slot is {slot}";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PlaceRetract(chamber, slot, hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool Exchange(ModuleName chamber, int slot, Hand hand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Exchange invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Exchange invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Exchange invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.Exchange(chamber, slot, hand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ExchangeReadyPosition(ModuleName chamber, int slot, Hand pickHand, Hand placeHand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (pickHand == Hand.Both || placeHand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.ExchangeReadyPosition(chamber, slot, pickHand, placeHand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ExchangeReadyPositionExtend(ModuleName chamber, int slot, Hand pickHand, Hand placeHand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (pickHand == Hand.Both || placeHand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.ExchangeReadyExtend(chamber, slot, pickHand, placeHand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ExchangeAfterReadyPositionExtend(ModuleName chamber, int slot, Hand pickHand, Hand placeHand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (pickHand == Hand.Both || placeHand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("ExchangeReadyPosition invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.ExchangeAfterReadyExtend(chamber, slot, pickHand, placeHand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ExchangePickExtend(ModuleName chamber, int slot, Hand pickHand, Hand placeHand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePickExtend invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (pickHand == Hand.Both || placeHand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePickExtend invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePickExtend invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.ExchangePickExtend(chamber, slot, pickHand, placeHand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ExchangePlaceExtend(ModuleName chamber, int slot, Hand pickHand, Hand placeHand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePlaceExtend invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (pickHand == Hand.Both || placeHand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePlaceExtend invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePlaceExtend invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.ExchangePlaceExtend(chamber, slot, pickHand, placeHand), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ExchangePlaceRetract(ModuleName chamber, int slot, Hand pickHand, Hand placeHand, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePlaceRetract invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (pickHand == Hand.Both || placeHand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePlaceRetract invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("ExchangePlaceRetract invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.ExchangePlaceRetract(chamber, slot, pickHand, placeHand), out reason);
|
|||
|
}
|
|||
|
public virtual bool SetWaferSize(int cmd, WaferSize size, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.SetWaferSize(cmd, size), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool QueryParameter(int parameter, string parameterType, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.QueryParameter(parameter, parameterType), out reason);
|
|||
|
}
|
|||
|
public virtual bool SetServoOnOff(bool trueForOnFalseForOff, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.SetServoOnOff(trueForOnFalseForOff), out reason);
|
|||
|
}
|
|||
|
public virtual bool PickEx(ModuleName chamber, int slot, Hand hand, int x, int y, int z, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter, double pick,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PickEx(chamber, slot, hand, x,y,z), out reason);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool PlaceEx(ModuleName chamber, int slot, Hand hand, int x, int y, int z, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots, slot)) //0-20 | 20,21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter,double hand, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
if (!checkslot(0, 25 - Blade2Slots + 1, slot)) //0 - 21| 21,22,23,24
|
|||
|
{
|
|||
|
reason = string.Format("Pick invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter,place, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Place invalid parameter, double place,chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return execute(_factory.PlaceEx(chamber, slot, hand,x,y,z), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool ExchangeEx(ModuleName chamber, int slot, Hand hand, int x, int y, int z, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
if (chamber == ModuleName.Robot)
|
|||
|
{
|
|||
|
reason = string.Format("Exchange invalid parameter, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (Blade2Slots > 1)
|
|||
|
{
|
|||
|
reason = string.Format("this robot don't support exchange operation.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Both)
|
|||
|
{
|
|||
|
reason = string.Format("Exchange invalid parameter,double hand");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (ModuleHelper.IsLoadPort(chamber))
|
|||
|
{
|
|||
|
if (!checkslot(0, 25, slot))
|
|||
|
{
|
|||
|
reason = string.Format("Exchange invalid parameter,pick, chamber is {0}, slot is {1}", chamber.ToString(), slot);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return execute(_factory.ExchangeEx(chamber, slot, hand, x, y, z), out reason);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
public virtual bool PositionAdjustment( Axis axis, Hand hand, int value, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
return execute(_factory.PositionAdjustment( axis,hand,value), out reason);
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool execute(IHandler handler, out string reason)
|
|||
|
{
|
|||
|
reason = string.Empty;
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
if (_foregroundHandler != null)
|
|||
|
{
|
|||
|
reason = "System busy, please wait or reset system.";
|
|||
|
EV.PostMessage(Name, EventEnum.DefaultWarning, string.Format("{0} {1} {2}", this.DeviceID, handler.ToString(), reason));
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (_backgroundHandler != null && handler.IsBackground)
|
|||
|
{
|
|||
|
reason = "System busy,one background command is running, please wait or reset system.";
|
|||
|
EV.PostMessage(Name, EventEnum.DefaultWarning, string.Format("{0} {1} {2}", this.DeviceID, handler.ToString(), reason));
|
|||
|
//reason = "系统忙,后台命令正在处理,暂时不能处理新的后台命令";
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
handler.Unit = (int)Unit.Robot;
|
|||
|
if(!handler.Execute(ref _socket))
|
|||
|
{
|
|||
|
reason = "Communication error,please check it.";
|
|||
|
OnError(reason);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (handler.IsBackground)
|
|||
|
_backgroundHandler = handler;
|
|||
|
else
|
|||
|
_foregroundHandler = handler;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public virtual void OnDataChanged(string package)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (!package.Contains("Gb") && !package.Contains("Pb"))
|
|||
|
package = package.ToUpper();
|
|||
|
string[] msgs = Regex.Split(package, delimiter);
|
|||
|
|
|||
|
foreach (string msg in msgs)
|
|||
|
{
|
|||
|
if (msg.Length > 0)
|
|||
|
{
|
|||
|
bool completed = false;
|
|||
|
string resp = msg;
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
if (_foregroundHandler != null && _foregroundHandler.OnMessage(ref _socket, resp, out completed))
|
|||
|
{
|
|||
|
_foregroundHandler = null;
|
|||
|
}
|
|||
|
else if (_backgroundHandler != null && _backgroundHandler.OnMessage(ref _socket, resp, out completed))
|
|||
|
{
|
|||
|
if (completed)
|
|||
|
{
|
|||
|
//string reason = string.Empty;
|
|||
|
//QueryState(out reason);
|
|||
|
_backgroundHandler = null;
|
|||
|
|
|||
|
if (ActionDone != null)
|
|||
|
ActionDone(true);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_eventHandler != null)
|
|||
|
{
|
|||
|
if (_eventHandler.OnMessage(ref _socket, resp, out completed))
|
|||
|
{
|
|||
|
if (completed)
|
|||
|
{
|
|||
|
EV.PostMessage("Robot", EventEnum.DefaultWarning, string.Format(" has error. {0:X}", ErrorCode));
|
|||
|
OnError(string.Format("has error. {0:X}", ErrorCode));
|
|||
|
_exceuteErr = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
catch (ExcuteFailedException e)
|
|||
|
{
|
|||
|
EV.PostMessage("Robot", EventEnum.DefaultWarning, string.Format("executed failed. {0}",e.Message));
|
|||
|
OnError(string.Format("executed failed. {0}", e.Message));
|
|||
|
_exceuteErr = false;
|
|||
|
}
|
|||
|
catch (InvalidPackageException e)
|
|||
|
{
|
|||
|
EV.PostMessage("Robot", EventEnum.DefaultWarning, string.Format("receive invalid package. {0}", e.Message));
|
|||
|
OnError(string.Format("receive invalid package. {0}", e.Message));
|
|||
|
}
|
|||
|
catch (System.Exception ex)
|
|||
|
{
|
|||
|
_commErr = true;
|
|||
|
LOG.Write("Robot failed:" + ex.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void OnErrorHandler(ErrorEventArgs args)
|
|||
|
{
|
|||
|
_commErr = true;
|
|||
|
Initalized = false;
|
|||
|
EV.PostMessage(Module, EventEnum.CommunicationError, Display, args.Reason);
|
|||
|
|
|||
|
OnError("CommunicationError");
|
|||
|
}
|
|||
|
|
|||
|
private bool checkslot(int min, int max, int slot)
|
|||
|
{
|
|||
|
return slot >= min && slot < max;
|
|||
|
}
|
|||
|
|
|||
|
public void NotifySlotMapResult(ModuleName module, string slotMap)
|
|||
|
{
|
|||
|
if (OnSlotMapRead != null)
|
|||
|
{
|
|||
|
OnSlotMapRead(module, slotMap);
|
|||
|
}
|
|||
|
}
|
|||
|
public void OnError(string errorcode)
|
|||
|
{
|
|||
|
EV.Notify(AlarmRobotError,new SerializableDictionary<string, object> {
|
|||
|
{
|
|||
|
"AlarmText",errorcode
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (ActionDone != null)
|
|||
|
ActionDone(false);
|
|||
|
}
|
|||
|
|
|||
|
public void NotifyWaferPresent(Hand hand, WaferStatus status)
|
|||
|
{
|
|||
|
if (status == WaferStatus.Empty)
|
|||
|
{
|
|||
|
if (hand == Hand.Blade1)
|
|||
|
{
|
|||
|
WaferPresentOnBlade1 = status == WaferStatus.Empty;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
WaferPresentOnBlade2 = status == WaferStatus.Empty;
|
|||
|
}
|
|||
|
}
|
|||
|
if (status == WaferStatus.Unknown)
|
|||
|
{
|
|||
|
EV.PostWarningLog(Module, "Wafer present unknown");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Blade1)
|
|||
|
{
|
|||
|
WaferPresentOnBlade1 = status == WaferStatus.Normal;
|
|||
|
}
|
|||
|
|
|||
|
if (hand == Hand.Blade2)
|
|||
|
{
|
|||
|
WaferPresentOnBlade2 = status == WaferStatus.Normal;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//Active wafer Center finder Data
|
|||
|
public void NotifyAWCData(int rOffset, int tOffset)
|
|||
|
{
|
|||
|
CenterOffsetR = rOffset;
|
|||
|
CenterOffsetT = tOffset;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|