12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052 |
- using System;
- using System.Collections.Generic;
- using Aitex.Core.Common;
- using Aitex.Core.RT.Event;
- using Aitex.Core.Util;
- using Aitex.Sorter.Common;
- using MECF.Framework.Common.Equipment;
- using MECF.Framework.Common.SubstrateTrackings;
- using VirgoCommon;
- using VirgoRT.Device;
- using VirgoRT.Device.YASKAWA;
- using System.Diagnostics;
- using System.Threading;
- using Aitex.Core.RT.Device;
- using Aitex.Core.RT.Log;
- using MECF.Framework.Common.CommonData;
- using VirgoRT.Devices.EFEM;
- using VirgoRT.Modules;
- namespace VirgoRT.Devices
- {
- /// <summary>
- /// Base action
- /// </summary>
- abstract class EfemActionBase : ActionBase
- {
- protected readonly EfemBase _efem;
- public EfemOperation Type { get; protected set; }
- protected EfemActionBase() : this(null) { }
- protected EfemActionBase(EfemBase efem) : base(ModuleName.EFEM)
- {
- _efem = efem;
- }
- }
- class DelayAction : ActionBase
- {
- private readonly DeviceTimer _timer = new DeviceTimer();
- private readonly ushort _delayTime;
- public bool IsDone => _timer.IsTimeout();
- public DelayAction(ushort delaytime) : base(ModuleName.System)
- {
- this._delayTime = delaytime;
- }
- public override void Execute()
- {
- _timer.Start(this._delayTime * 1000);
- }
- public override void OnPostWork(string data)
- {
- EV.PostInfoLog(ModuleName.EFEM.ToString(), $"Delay time [{_delayTime}]");
- }
- }
- }
- namespace VirgoRT.Devices.YASKAWA
- {
- class EfemAction : EfemActionBase
- {
- public EfemAction(EfemBase device, ModuleName mod) : base(device)
- { }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV,
- Parameters = new List<string> { Constant.ModuleString[this.Module] }
- });
- base.Execute();
- _efem.Status = DeviceState.Busy;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- }
- /// <summary>
- ///
- /// </summary>
- class HomeAllAction : EfemAction
- {
- public HomeAllAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Home;
- this.Module = mod;
- }
- public override void OnPostWork(string data = null)
- {
- _efem[ModuleName.LP1].OnHomed();
- _efem[ModuleName.LP2].OnHomed();
- (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
- (_efem as Efem).MoveInfo.BladeTarget = "System";
- base.OnPostWork(data);
- var tower = DEVICE.GetDevice<VirgoSignalTower>("System.SignalTower");
- if (tower != null)
- {
- tower.ResetData();
- }
- }
- }
- class HomeModuleAction : EfemAction
- {
- public HomeModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Home;
- this.Module = mod;
- IsBackground = ModuleHelper.IsLoadPort(mod);
- }
- public override void OnPostWork(string data = null)
- {
- if (ModuleHelper.IsLoadPort(Module))
- {
- _efem[Module].OnHomed();
- }
- (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
- (_efem as Efem).MoveInfo.BladeTarget = "System";
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- }
- class LoadModuleAction : EfemAction
- {
- public LoadModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Load;
- this.Module = mod;
- IsBackground = true;
- }
- public override void OnPostWork(string data = null)
- {
- _efem[Module].OnLoaded();
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnLoadFailed(data);
- base.OnError(data);
- }
- }
- class UnloadModuleAction : EfemAction
- {
- public UnloadModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Unload;
- this.Module = mod;
- IsBackground = true;
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- _efem[Module].OnUnloaded();
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnUnloadFailed(data);
- base.OnError(data);
- }
- }
- class ReadCarrierIdModuleAction : EfemAction
- {
- public ReadCarrierIdModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.CarrierId;
- this.Module = mod;
- IsBackground = true;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.GET,
- Parameters = new List<string> { Constant.ModuleString[this.Module] }
- });
- //base.Execute();
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- _efem[Module].OnCarrierIDRead(data);
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnCarrierIDReadFailed(data);
- base.OnError(data);
- }
- }
- class WriteCarrierIdModuleAction : EfemAction
- {
- private string _id;
- public WriteCarrierIdModuleAction(EfemBase efem, ModuleName mod, string id) : base(efem, mod)
- {
- Type = EfemOperation.CarrierId;
- this.Module = mod;
- IsBackground = true;
- _id = id;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.SET,
- Parameters = new List<string> { Constant.ModuleString[this.Module], _id }
- });
- //base.Execute();
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- _efem[Module].OnCarrierIDWrite(_id);
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnCarrierIDWriteFailed(_id);
- base.OnError(data);
- }
- }
- class ReadTagDataModuleAction : EfemAction
- {
- public ReadTagDataModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.CarrierId;
- this.Module = mod;
- IsBackground = true;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.GET,
- Parameters = new List<string> { Constant.ModuleString[this.Module] }
- });
- //base.Execute();
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- _efem[Module].OnTagDataRead(data);
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnTagDataReadFailed(data);
- base.OnError(data);
- }
- }
- class WriteTagDataModuleAction : EfemAction
- {
- private string _id;
- public WriteTagDataModuleAction(EfemBase efem, ModuleName mod, string id) : base(efem, mod)
- {
- Type = EfemOperation.CarrierId;
- this.Module = mod;
- IsBackground = true;
- _id = id;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.SET,
- Parameters = new List<string> { Constant.ModuleString[this.Module], _id }
- });
- //base.Execute();
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- _efem[Module].OnTagDataWrite(_id);
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnTagDataWriteFailed(_id);
- base.OnError(data);
- }
- }
- class DockModuleAction : EfemAction
- {
- public DockModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Dock;
- this.Module = mod;
- IsBackground = true;
- }
- }
- class UndockModuleAction : EfemAction
- {
- public UndockModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Undock;
- this.Module = mod;
- IsBackground = true;
- }
- }
- class ClampModuleAction : EfemAction
- {
- private bool _isUnloadClamp;
- public ClampModuleAction(EfemBase efem, ModuleName mod, bool isUnloadClamp) : base(efem, mod)
- {
- Type = EfemOperation.Clamp;
- this.Module = mod;
- IsBackground = true;
- _isUnloadClamp = isUnloadClamp;
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- _efem[Module].OnClamped(_isUnloadClamp);
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnClampFailed(data);
- base.OnError(data);
- }
- }
- class UnclampModuleAction : EfemAction
- {
- public UnclampModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Unclamp;
- this.Module = mod;
- IsBackground = true;
- }
- public override void OnPostWork(string data = null)
- {
- _efem.Status = DeviceState.Idle;
- _efem[Module].OnUnclamped();
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
- }
- public override void OnError(string data = null)
- {
- _efem[Module].OnUnclampFailed(data);
- base.OnError(data);
- }
- }
- class SetThicknessModuleAction : EfemAction
- {
- private string _thick;
- public SetThicknessModuleAction(EfemBase efem, ModuleName mod, string thickness) : base(efem, mod)
- {
- Type = EfemOperation.SetThickness;
- this.Module = mod;
- IsBackground = true;
- _thick = thickness;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.SET,
- Parameters = new List<string> { Constant.ModuleString[this.Module], _thick.ToUpper() }
- });
- //base.Execute();
- this.Status = ActionStatus.SendCmd;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
- }
- }
- class OrgshAction : EfemAction
- {
- public OrgshAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Orgsh;
- this.Module = mod;
- }
- }
- class TrackAction : EfemAction
- {
- public TrackAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.StateTrack;
- this.Module = mod;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.GET,
- Parameters = new List<string> { "TRACK" }
- });
- this.Status = ActionStatus.SendCmd;
- EV.PostInfoLog(this.Module.ToString(), "Query wafer present information");
- }
- public override void OnPostWork(string data)
- {
- this.Status = ActionStatus.Completed;
- //000/111 upperArmWafer, lowerArmWafer, alignerWafer1, alignerWafer2, coolingwafer1,coolingwafer2
- if (data.Length != 6)
- {
- LOG.Write($"EFEM Track wafer present return invalid value, {data}, should be 6 characters");
- return;
- }
- //upper arm
- if (data[0] == '1')
- {
- if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 1))
- {
- WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 1, WaferStatus.Normal);
- }
- }
- else
- {
- if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 1))
- {
- EV.PostWarningLog(Module.ToString(), $" {ModuleName.EfemRobot} upper arm has wafer information, while EFEM return empty, manually delete if really no wafer");
- }
- }
- //lower arm
- if (data[1] == '1')
- {
- if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0))
- {
- WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 0, WaferStatus.Normal);
- }
- }
- else
- {
- if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0))
- {
- EV.PostWarningLog(Module.ToString(), $" {ModuleName.EfemRobot} lower arm has wafer information, while EFEM return empty, manually delete if really no wafer");
- }
- }
- //aligner1
- if (data[2] == '1')
- {
- if (WaferManager.Instance.CheckNoWafer(ModuleName.Aligner1, 0))
- {
- WaferManager.Instance.CreateWafer(ModuleName.Aligner1, 0, WaferStatus.Normal);
- }
- }
- else
- {
- if (WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0))
- {
- EV.PostWarningLog(Module.ToString(), $" {ModuleName.Aligner1} has wafer information, while EFEM return empty, manually delete if really no wafer");
- }
- }
- //aligner2
- if (data[3] == '1')
- {
- if (WaferManager.Instance.CheckNoWafer(ModuleName.Aligner2, 0))
- {
- WaferManager.Instance.CreateWafer(ModuleName.Aligner2, 0, WaferStatus.Normal);
- }
- }
- else
- {
- if (WaferManager.Instance.CheckHasWafer(ModuleName.Aligner2, 0))
- {
- EV.PostWarningLog(Module.ToString(), $" {ModuleName.Aligner2} has wafer information, while EFEM return empty, manually delete if really no wafer");
- }
- }
- //cooling1
- if (data[4] == '1')
- {
- if (WaferManager.Instance.CheckNoWafer(ModuleName.Cooling1, 0))
- {
- WaferManager.Instance.CreateWafer(ModuleName.Cooling1, 0, WaferStatus.Normal);
- }
- }
- else
- {
- if (WaferManager.Instance.CheckHasWafer(ModuleName.Cooling1, 0))
- {
- EV.PostWarningLog(Module.ToString(), $" {ModuleName.Cooling1} has wafer information, while EFEM return empty, manually delete if really no wafer");
- }
- }
- //cooling2
- if (data[5] == '1')
- {
- if (WaferManager.Instance.CheckNoWafer(ModuleName.Cooling2, 0))
- {
- WaferManager.Instance.CreateWafer(ModuleName.Cooling2, 0, WaferStatus.Normal);
- }
- }
- else
- {
- if (WaferManager.Instance.CheckHasWafer(ModuleName.Cooling2, 0))
- {
- EV.PostWarningLog(Module.ToString(), $" {ModuleName.Cooling2} has wafer information, while EFEM return empty, manually delete if really no wafer");
- }
- }
- }
- }
- class ClearErrorAction : EfemAction
- {
- public ClearErrorAction(EfemBase efem) : base(efem, ModuleName.EFEM)
- {
- Type = EfemOperation.ClearError;
- IsBackground = true;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.SET,
- Parameters = new List<string> { "CLEAR" }
- });
- this.Status = ActionStatus.SendCmd;
- EV.PostInfoLog(this.Module.ToString(), "清除 EFEM 所有错误");
- }
- }
- class LoadPortClearErrorAction : EfemAction
- {
- public LoadPortClearErrorAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.ClearError;
- this.Module = mod;
- IsBackground = true;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.SET,
- Parameters = new List<string> { "CLEAR", Constant.ModuleString[this.Module] }
- });
- this.Status = ActionStatus.SendCmd;
- EV.PostInfoLog(this.Module.ToString(), "清除 LoadPort 所有错误");
- }
- }
- class MapAction : EfemAction
- {
- public MapAction(EfemBase efem, ModuleName mod) : base(efem, mod)
- {
- Type = EfemOperation.Map;
- this.Module = mod;
- }
- public override void OnPostWork(string data)
- {
- _efem[Module].Status = DeviceState.Idle;
- }
- }
- class PickAction : EfemAction
- {
- private MoveParam MoveParam { get; }
- public PickAction(EfemBase efem, MoveParam mp) : base(efem, ModuleName.EFEM)
- {
- Type = EfemOperation.Pick;
- MoveParam = mp;
- }
- public override void Execute()
- {
- //MOV:LOAD/P113/ARM2;
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV,
- Parameters = new List<string>
- {
- MoveParam.SrcPos.ToHWString(),
- Constant.ArmString[MoveParam.Arm],
- MoveParam.WaferSize.ToString()
- }
- });
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- }
- public override void OnPostWork(string data)
- {
- if (MoveParam.Arm == Hand.Both)
- {
- if (MoveParam.DestModule == ModuleName.EfemRobot)
- {
- WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, 0);
- WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot + 1, MoveParam.DestModule, 1);
- }
- else
- {
- WaferManager.Instance.WaferMoved(MoveParam.SrcModule, 0, MoveParam.DestModule, MoveParam.DestSlot);
- WaferManager.Instance.WaferMoved(MoveParam.SrcModule, 1, MoveParam.DestModule, MoveParam.DestSlot + 1);
- }
- }
- else
- WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
- _efem.Status = DeviceState.Idle;
- //_bladeTarget = ModuleName.EfemRobot;
- (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
- }
- }
- class PlaceAction : EfemAction
- {
- private MoveParam MoveParam { get; }
- public PlaceAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
- {
- Type = EfemOperation.Place;
- MoveParam = mp;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV,
- Parameters = new List<string>
- {
- MoveParam.DestPos.ToHWString(),
- Constant.ArmString[MoveParam.Arm],
- MoveParam.WaferSize.ToString()
- }
- });
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- }
- public override void OnPostWork(string data)
- {
- WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
- _efem.Status = DeviceState.Idle;
- (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
- }
- }
- class GotoAction : EfemAction
- {
- private MoveParam MoveParam { get; }
- public GotoAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
- {
- Type = EfemOperation.Goto;
- MoveParam = mp;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV,
- Parameters = new List<string>
- {
- MoveParam.DestPos.ToHWString(),
- Constant.ArmString[MoveParam.Arm],
- //MoveParam.WaferSize.ToString()
- }
- });
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- }
- public override void OnPostWork(string data)
- {
- _efem.Status = DeviceState.Idle;
- (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
- (_efem as Efem).MoveInfo.BladeTarget = MoveParam.DestPos.Module.ToString();
- }
- }
- class ExtendAction : EfemAction
- {
- private ExtendParam ExtParam { get; }
- public ExtendPos TargetPosition => ExtParam.Pos;
- private JetPM _pm;
- public ExtendAction(EfemBase efem, JetPM pm, ExtendParam ep)
- : base(efem, ModuleName.EFEM)
- {
- Type = EfemOperation.Extend;
- ExtParam = ep;
- ExtParam.Arm = ep.Arm;
- _pm = pm;
- }
- public override void Execute()
- {
- if (_pm != null && !_pm.CheckSlitDoorOpen())
- {
- EV.PostAlarmLog("EFEM", $"{_pm.Module} slit door should be opened");
- Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
- return;
- }
- //MOV:EXTEND/LLA03/ARM2;
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV,
- Parameters = new List<string>
- {
- ExtParam.Module.ToHWString(),
- //Constant.ExtendPosString[ExtParam.Pos],
- ExtParam.Pos.ToString(),
- Constant.ArmString[ExtParam.Arm],
- ExtParam.ws.ToString()
- }
- }); ;
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- }
- public override void OnPostWork(string data)
- {
- _efem.Status = DeviceState.Idle;
- switch (TargetPosition)
- {
- case ExtendPos.PB:
- LOG.Write($"robot extend PB put: arm {ExtParam.Arm}, module {ExtParam.Module}");
- //WaferManager.Instance.WaferMoved(ModuleName.EfemRobot, (int)ExtParam.Arm, ExtParam.Module, 0);
- break;
- case ExtendPos.G4:
- LOG.Write($"robot extend G4 get: arm {ExtParam.Arm}, module {ExtParam.Module}");
- // WaferManager.Instance.WaferMoved(ExtParam.Module, 0, ModuleName.EfemRobot, (int)ExtParam.Arm);
- break;
- default:
- LOG.Write($"MNPT:{TargetPosition} 不需要更新 WaferManager 信息");
- break;
- }
- (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
- }
- }
- class GripAction : EfemAction
- {
- private Hand _blade;
- private bool _isGrip;
- public GripAction(EfemBase efem, Hand blade, bool isGrip)
- : base(efem, ModuleName.EFEM)
- {
- Type = EfemOperation.Grip;
- _blade = blade;
- _isGrip = isGrip;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.SET,
- Parameters = new List<string>
- {
- Constant.ArmString[_blade],
- _isGrip ? "ON":"OFF"
- }
- });
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- }
- public override void OnPostWork(string data)
- {
- _efem.Status = DeviceState.Idle;
- if (_blade == Hand.Blade1)
- _efem.GripStateBlade1 = _isGrip ? "ON" : "OFF";
- if (_blade == Hand.Blade2)
- _efem.GripStateBlade2 = _isGrip ? "ON" : "OFF";
- }
- }
- class LiftAction : EfemAction
- {
- // MOV:LIFT/ALIGN1;
- private bool _isUp;
- public LiftAction(EfemBase device, ModuleName mod, bool isUp) : base(device, mod)
- {
- Type = EfemOperation.Lift;
- Module = mod;
- _isUp = isUp;
- IsBackground = true;
- (device as Efem).IsBufferPinUp[mod] = !isUp;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV,
- Parameters = new List<string> { Constant.ModuleString[this.Module], _isUp ? "UP" : "DOWN" }
- });
- this.Status = ActionStatus.SendCmd;
- _efem.Status = DeviceState.Busy;
- EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
- }
- public override void OnPostWork(string data)
- {
- _efem.Status = DeviceState.Idle;
- (_efem as Efem).IsBufferPinUp[Module] = _isUp;
- }
- }
- class AlignAction : EfemAction
- {
- private WaferSize _ws { get; }
- public AlignAction(EfemBase device, ModuleName mod, WaferSize size) : base(device, mod)
- {
- Type = EfemOperation.Align;
- this.Module = mod;
- this._ws = size;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV,
- Parameters = new List<string> { Module.ToHWString(), this._ws.ToString() }
- });
- this.Status = ActionStatus.SendCmd;
- }
- public override void OnPostWork(string data) { }
- }
- class LedAction : EfemAction
- {
- private LightType Light { get; }
- private LightStatus LtStatus { get; }
- public LedAction(EfemBase device, LightType lt, LightStatus st) : base(device, ModuleName.EFEM)
- {
- Type = EfemOperation.Light;
- Light = lt;
- LtStatus = st;
- IsBackground = true;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.SET,
- Parameters = new List<string> { Constant.STOWER, Light.ToString(), LtStatus.ToString() }
- });
- _efem.Status = DeviceState.Busy;
- this.Status = ActionStatus.SendCmd;
- //EV.PostInfoLog(this.Module.ToString(), $"CMD[{this.ID}], Set {this.Light} = {LtStatus}");
- }
- public override void OnPostWork(string data)
- {
- }
- }
- class AbortAction : EfemAction
- {
- public AbortAction(EfemBase efem) : base(efem, ModuleName.EFEM)
- {
- Type = EfemOperation.Abort;
- }
- public override void Execute()
- {
- _efem.MsgHandler.Send(new EfemMessage
- {
- Operation = this.Type,
- Head = EfemMessage.MsgHead.MOV
- });
- }
- }
- }
|