Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../HardwareUnits/Robots/Robot.cs

1991 lines
72 KiB
C#
Raw Normal View History

2023-04-13 11:51:03 +08:00
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 busyone 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;
}
}
}