Sic04/FrameworkLocal/RTEquipmentLibrary/HardwareUnits/Robots/Robot.cs

1991 lines
72 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}