浏览代码

Efem module raw design.

sangwq 2 年之前
父节点
当前提交
f211c4242f

+ 5 - 0
Venus/Framework/Common/Device/ModuleName.cs

@@ -260,6 +260,11 @@ namespace MECF.Framework.Common.Equipment
         {
             return unit == ModuleName.TM;
         }
+
+        public static bool IsEFEMRobot(ModuleName unit)
+        {
+            return unit == ModuleName.EfemRobot;
+        }
         public static string GetAbbr(ModuleName module)
         {
             switch (module)

+ 2 - 2
Venus/RecipeEditorControl/ViewModel/RecipeEditorControlViewModel.cs

@@ -96,7 +96,7 @@ namespace Aitex.UI.RecipeEditor
             }           
         }
 
-        int index = 0;
+        //int index = 0;
         /// <summary>
         /// 选中recipe,显示界面
         /// </summary>
@@ -115,7 +115,7 @@ namespace Aitex.UI.RecipeEditor
             CurrentRecipe = recipe;
             Grid grid = new Grid();
             grid.Margin = new Thickness(15);
-            index = 0;
+            //index = 0;
 
             for (int i = 0; i < recipe.Steps.Count; i++)
             {

+ 3 - 0
Venus/Venus_Core/EventDefine.cs

@@ -67,5 +67,8 @@ namespace Aitex.Core.RT.Log{
 		EV_EFEM_COMMON_INFO = 4000,
 		WARN_EFEM_COMMON_WARN = 4001,
 		ERR_EFEM_COMMON_FAILED = 4002,
+		EV_EFEM_ROBOT = 4100,
+		WARN_EFEM_ROBOT = 4101,
+		ERR_EFEM_ROBOT = 4102,
 	}
 }

+ 27 - 0
Venus/Venus_RT/Config/LogDefine.json

@@ -593,5 +593,32 @@
     "GlobalDescription_en": "{0}.",
     "Module": "EFEM",
     "Note": "EFEM Failed"
+  },
+  {
+    "Id": 4100,
+    "Level": "Info",
+    "LogEnum": "EV_EFEM_ROBOT",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "EFEM",
+    "Note": "EFEM Notify"
+  },
+  {
+    "Id": 4101,
+    "Level": "Warning",
+    "LogEnum": "WARN_EFEM_ROBOT",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "EFEM",
+    "Note": "EFEM Warning"
+  },
+  {
+    "Id": 4102,
+    "Level": "Error",
+    "LogEnum": "ERR_EFEM_ROBOT",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "EFEM",
+    "Note": "EFEM Failed"
   }
 ]

+ 1 - 1
Venus/Venus_RT/Devices/DataDefine.cs

@@ -140,7 +140,7 @@ namespace Venus_RT
         PMToLP
     }
 
-    interface IHardwareMessage
+    public interface IHardwareMessage
     {
         string RawString { get; set; }
     }

+ 0 - 815
Venus/Venus_RT/Devices/EFEM/Efem.cs

@@ -1,815 +0,0 @@
-using Aitex.Core.Common;
-using Aitex.Core.Common.DeviceData;
-using Aitex.Core.RT.DataCenter;
-using Aitex.Core.RT.Device;
-using Aitex.Core.RT.Event;
-using Aitex.Core.RT.Log;
-using Aitex.Core.RT.SCCore;
-using Aitex.Core.Util;
-using Aitex.Sorter.Common;
-using MECF.Framework.Common.Equipment;
-using MECF.Framework.Common.CommonData;
-using MECF.Framework.Common.SubstrateTrackings;
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using Venus_Core;
-
-using Venus_RT.Devices.YASKAWA;
-using Venus_RT.Modules;
-using Venus_RT.Modules.LPs;
-
-namespace Venus_RT.Devices.EFEM
-{
-    /// <summary>
-    /// EFEM object class
-    /// </summary>
-    sealed class Efem : EfemBase, IEfem
-    {
-        //---------------------------------Fields----------------------------------------
-        // 
-        private readonly JetPMBase[] _pm = new JetPMBase[2];
-        private readonly Loadport[] _LPMs = new Loadport[2];
-        private readonly SignalTower _signalT = new SignalTower();
-        //private readonly CoolingStage[] _aligner = new CoolingStage[2];
-        //private string _robotMoveAction;
-        private RobotMoveInfo _robotMoveInfo = new RobotMoveInfo();
-        private LidState _CassetteDoor;
-        private LidState _SideDoor;
-        private F_TRIG _bSysVacPressure1 = new F_TRIG();
-        private F_TRIG _bSysCompressedAirPressure = new F_TRIG();
-        private R_TRIG _bFlowGaugeSensor = new R_TRIG();
-        private R_TRIG _bLeakageSensor = new R_TRIG();
-        private F_TRIG _bDiffPressureSensorSetting1 = new F_TRIG();
-        private F_TRIG _bDiffPressureSensorSetting2 = new F_TRIG();
-        private F_TRIG _bIonizerAlarm = new F_TRIG();
-        private F_TRIG _bFFuAlarm = new F_TRIG();
-        private F_TRIG _bAreaSensor = new F_TRIG();
-        private F_TRIG _bModeSwitch = new F_TRIG();
-        private RD_TRIG _bCassetteDoorTrig = new RD_TRIG();
-        private RD_TRIG _bSideDoorTrig = new RD_TRIG();
-
-        public Dictionary<ModuleName, bool> IsBufferPinUp = new Dictionary<ModuleName, bool>();
-
-
-        public override ILoadport this[ModuleName mod]
-        {
-            get
-            {
-                if (!ModuleHelper.IsLoadPort(mod))
-                    throw new ApplicationException($"{mod} is NOT Loadport");
-
-                return _LPMs[mod - ModuleName.LP1];
-            }
-        }
-
-        //---------------------------------Properties------------------------------------
-        // 
-        public LidState CassetteDoor
-        {
-            get => _CassetteDoor;
-            set
-            {
-                _CassetteDoor = value;
-
-                _bCassetteDoorTrig.CLK = _CassetteDoor == LidState.Close;
-                if (_bCassetteDoorTrig.T)
-                {
-                    EV.Notify(CassetteDoorOpen);
-
-                    EV.PostWarningLog(Module.ToString(), "Cassette door opened");
-                }
-                if (_bCassetteDoorTrig.R)
-                {
-                    EV.Notify(CassetteDoorClose);
-
-                    EV.PostInfoLog(Module.ToString(), "Cassette door closed");
-                }
-            }
-        }
-
-        public LidState DoorSwitch
-        {
-            get => _SideDoor;
-            set
-            {
-                _SideDoor = value;
-
-                _bSideDoorTrig.CLK = _SideDoor == LidState.Close;
-                if (_bSideDoorTrig.T)
-                {
-                    EV.Notify(EFEMSideDoorOpen);
-                    EV.PostAlarmLog(Module.ToString(), "EFEM Side door open");
-                }
-                if (_bSideDoorTrig.R)
-                {
-                    EV.PostInfoLog(Module.ToString(), "EFEM Side door close");
-                }
-            }
-        }
-        private string CassetteDoorOpen = "CassetteDoorOpen";
-        private string CassetteDoorClose = "CassetteDoorClose";
-
-        private string EFEMSideDoorOpen = "EFEMSideDoorOpen";
-
-        private string EFEMVacuumPressureError = "EFEMVacuumPressureError";
-        private string EFEMCDAError = "EFEMCDAError";
-        private string EFEMFlowGaugeSensorError = "EFEMFlowGaugeSensorError";
-        private string EFEMLeakageAlarm = "EFEMLeakageAlarm";
-        private string EFEMIonizerAlarm = "EFEMIonizerAlarm";
-        private string EFEMFFUAlarm = "EFEMFFUAlarm";
-        private string EFEMOffline = "EFEMOffline";
-        private string EFEMCommunicationError = "EFEMCommunicationError";
-        private string WaferTransferFailed = "WaferTransferFailed";
-        private string EFEMError = "EFEMError";
-
-        // Constructor
-        //
-        public Efem()
-        {
-            Module = ModuleName.EfemRobot;
-
-            _pm[0] = DEVICE.GetDevice<JetPMBase>(ModuleName.PMA.ToString());
-            _pm[1] = DEVICE.GetDevice<JetPMBase>(ModuleName.PMB.ToString());
-
-            _comm = new EfemComm();
-
-            _LPMs[0] = new Loadport(ModuleName.LP1, this);
-            _LPMs[1] = new Loadport(ModuleName.LP2, this);
-
-            IsBufferPinUp[ModuleName.Aligner1] = false;
-            IsBufferPinUp[ModuleName.Aligner2] = false;
-            IsBufferPinUp[ModuleName.Cooling1] = false;
-            IsBufferPinUp[ModuleName.Cooling2] = false;
-
-            //if ((EfemEntity.EfemType)SC.GetValue<int>($"EFEM.EfemType") == EfemEntity.EfemType.BrooksEFEM)
-            //{
-            //    BrooksProxy = new BrooksEFEMProxy();
-            //    BrooksProxy.CommandUpdated += MsgOnCommandUpdated;
-            //    BrooksProxy.EventUpdated += MsgOnEventUpdated;
-            //    BrooksProxy.ErrorOccurred += MsgOnErrorOccurred;
-            //}
-
-            _msgHandler = new MessageHandler(this);
-            _msgHandler.CommandUpdated += MsgOnCommandUpdated;
-            _msgHandler.EventUpdated += MsgOnEventUpdated;
-            _msgHandler.ErrorOccurred += MsgOnErrorOccurred;
-
-            CarrierManager.Instance.SubscribeLocation(ModuleName.LP1.ToString(), 1);
-            CarrierManager.Instance.SubscribeLocation(ModuleName.LP2.ToString(), 1);
-
-            Action<ModuleName, int> _subscribeLoc = (ModuleName module, int waferCount) => {
-                if (ModuleHelper.IsInstalled(module))
-                {
-                    WaferManager.Instance.SubscribeLocation(module, waferCount);
-                }
-            };
-
-            _subscribeLoc(ModuleName.EfemRobot, 2);
-            _subscribeLoc(ModuleName.Aligner1, 1);
-            _subscribeLoc(ModuleName.Aligner2, 1);
-            _subscribeLoc(ModuleName.Cooling1, 1);
-            _subscribeLoc(ModuleName.Cooling2, 1);
-            _subscribeLoc(ModuleName.LP1, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
-            _subscribeLoc(ModuleName.LP2, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
-            //_subscribeLoc(ModuleName.Flipper, 1);
-            _subscribeLoc(ModuleName.Buffer, 10);
-
-            DATA.Subscribe("EfemRobot.RobotMoveAction", () => _robotMoveInfo);
-            DATA.Subscribe("LP1.JobDone", () =>
-            {
-                return _LPMs[0].JobDone;
-            });
-
-            DATA.Subscribe("LP1.NotifyJobDone", () =>
-            {
-                if (!_LPMs[0].JobDone || !_LPMs[0].HasCassette)
-                    return false;
-
-                if (SC.GetValue<int>("System.Job.BuzzerTimeWhenJobDone") >= 0
-                    && _LPMs[0].TimerNotifyJobDone.ElapsedMilliseconds > SC.GetValue<int>("System.Job.BuzzerTimeWhenJobDone") * 1000)
-                    return false;
-
-                return _LPMs[0].JobDone;
-            });
-
-            DATA.Subscribe("LP2.JobDone", () =>
-            {
-                return _LPMs[1].JobDone;
-            });
-            DATA.Subscribe("LP2.NotifyJobDone", () =>
-            {
-                if (!_LPMs[1].JobDone || !_LPMs[1].HasCassette)
-                    return false;
-
-                if (SC.GetValue<int>("System.Job.BuzzerTimeWhenJobDone") >= 0
-                    && _LPMs[1].TimerNotifyJobDone.ElapsedMilliseconds > SC.GetValue<int>("System.Job.BuzzerTimeWhenJobDone") * 1000)
-                    return false;
-
-                return _LPMs[1].JobDone;
-            });
-
-            Func<ModuleName, int, string> _waferSize = (ModuleName module, int slot) => {
-                string sSize = WaferSize.WS12.ToString();
-                if (ModuleHelper.IsInstalled(module))
-                {
-                    sSize = WaferManager.Instance.GetWafer(module, slot).Size.ToString();
-                }
-                else
-                {
-                    sSize = WaferSize.WS12.ToString();
-                }
-
-                return sSize;
-            };
-            DATA.Subscribe("Aligner1.WaferSize", () => _waferSize(ModuleName.Aligner1, 0));
-            DATA.Subscribe("Aligner2.WaferSize", () => _waferSize(ModuleName.Aligner2, 0));
-            DATA.Subscribe("Cooling1.WaferSize", () => _waferSize(ModuleName.Cooling1, 0));
-            DATA.Subscribe("Cooling2.WaferSize", () => _waferSize(ModuleName.Cooling2, 0));
-            DATA.Subscribe("EfemRobot.WaferSize", () => _waferSize(ModuleName.EfemRobot, 0));
-            DATA.Subscribe("Buffer.WaferSize", () => _waferSize(ModuleName.Buffer, 0));
-            DATA.Subscribe("EFEM.CassetteDoor", () => CassetteDoor);
-
-            DATA.Subscribe("EfemRobot.GripStateBlade1", () => GripStateBlade1);
-            DATA.Subscribe("EfemRobot.GripStateBlade2", () => GripStateBlade2);
-
-
-            GripStateBlade1 = "Unknown";
-            GripStateBlade2 = "Unknown";
-
-            _bCassetteDoorTrig.CLK = true;
-            _bSideDoorTrig.CLK = true;
-
-            EV.Subscribe(new EventItem("Event", CassetteDoorOpen, "Cassette Door Open"));
-            EV.Subscribe(new EventItem("Event", CassetteDoorClose, "Cassette Door Close"));
-
-            EV.Subscribe(new EventItem("Event", EFEMSideDoorOpen, "EFEM Side Door Open", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMVacuumPressureError, "EFEM Vacuum pressure error", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMCDAError, "EFEM CDA error", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMFlowGaugeSensorError, "EFEM flow gauge sensor error", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMLeakageAlarm, "EFEM leakage alarm", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMIonizerAlarm, "EFEM Ionizer alarm", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMFFUAlarm, "EFEM FFU alarm", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMOffline, "EFEM offline", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMCommunicationError, "EFEM Communication error", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", WaferTransferFailed, "Wafer Transfer Failed", EventLevel.Alarm, EventType.HostNotification));
-            EV.Subscribe(new EventItem("Event", EFEMError, "EFEM Error", EventLevel.Alarm, EventType.HostNotification));
-        }
-
-        // Methods
-        //
-        public bool HomeAll()
-        {
-            AddAction(new HomeAllAction(this, ModuleName.EFEM));
-            AddAction(new OrgshAction(this, ModuleName.EFEM));
-            AddAction(new TrackAction(this, ModuleName.EFEM));
-            return true;
-        }
-
-        public bool Home(ModuleName mod)
-        {
-            AddAction(new HomeModuleAction(this, mod));
-
-            return true;
-        }
-
-        public bool Load(ModuleName mod)
-        {
-            AddAction(new LoadModuleAction(this, mod));
-
-            return true;
-        }
-        public bool Unload(ModuleName mod)
-        {
-            AddAction(new UnloadModuleAction(this, mod));
-
-            return true;
-        }
-        public bool ReadCarrierId(ModuleName mod)
-        {
-            AddAction(new ReadCarrierIdModuleAction(this, mod));
-
-            return true;
-        }
-        public bool WriteCarrierId(ModuleName mod, string id)
-        {
-            AddAction(new WriteCarrierIdModuleAction(this, mod, id));
-
-            return true;
-        }
-        public bool ReadTagData(ModuleName mod)
-        {
-            AddAction(new ReadTagDataModuleAction(this, mod));
-
-            return true;
-        }
-        public bool WriteTagData(ModuleName mod, string tagData)
-        {
-            AddAction(new WriteTagDataModuleAction(this, mod, tagData));
-
-            return true;
-        }
-
-        public bool Dock(ModuleName mod)
-        {
-            AddAction(new DockModuleAction(this, mod));
-
-            return true;
-        }
-        public bool Undock(ModuleName mod)
-        {
-            AddAction(new UndockModuleAction(this, mod));
-
-            return true;
-        }
-        public bool Clamp(ModuleName mod, bool isUnloadClamp)
-        {
-            AddAction(new ClampModuleAction(this, mod, isUnloadClamp));
-
-            return true;
-        }
-        public bool Unclamp(ModuleName mod)
-        {
-            AddAction(new UnclampModuleAction(this, mod));
-
-            return true;
-        }
-        public bool SetThick(ModuleName mod)
-        {
-            AddAction(new SetThicknessModuleAction(this, mod, "Thick"));
-
-            return true;
-        }
-
-        public bool SetThin(ModuleName mod)
-        {
-            AddAction(new SetThicknessModuleAction(this, mod, "Thin"));
-
-            return true;
-        }
-
-        public bool ClearError()
-        {
-            AddAction(new ClearErrorAction(this));
-            return true;
-        }
-
-        public void AbortRobot()
-        {
-            AddAction(new AbortAction(this));
-        }
-
-        public void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target)
-        {
-            _robotMoveInfo.Action = action;
-            _robotMoveInfo.ArmTarget = hand == Hand.Blade1 ? RobotArm.ArmA : (hand == Hand.Both ? RobotArm.Both : RobotArm.ArmB);
-            _robotMoveInfo.BladeTarget = $"{_robotMoveInfo.ArmTarget}.{target}";
-        }
-
-        public bool Pick(MoveParam mp)
-        {
-            if (!WaferManager.Instance.CheckWafer(mp.SrcModule, mp.SrcSlot, WaferStatus.Normal))
-            {
-                EV.PostAlarmLog("System", $"{mp.SrcModule} slot {mp.SrcSlot + 1} wafer is not normal");
-                return false;
-            }
-
-            if (ModuleHelper.IsPm(mp.SrcModule))
-            {
-                JetPMBase pM = GetPM(mp.SrcModule);
-
-                if (pM.IsSlitDoorClosed)
-                {
-                    EV.PostAlarmLog(pM.Module.ToString(), "Slit 门必须打开");
-                    return false;
-                }
-
-                AddAction(new PinAction(mp.SrcModule, pM, MovementPosition.Up, false, mp.Arm, true));
-                AddAction(new ExtendAction(this, new ExtendParam { Module = mp.SrcModule, Arm = mp.Arm, Pos = ExtendPos.GB }));
-
-                AddAction(new PinAction(mp.SrcModule, pM, MovementPosition.Down, true, mp.Arm, true));
-                AddAction(new ExtendAction(this, new ExtendParam { Module = mp.SrcModule, Arm = mp.Arm, Pos = ExtendPos.G4 }));
-            }
-            else
-            {
-                SetRobotMovingInfo(RobotAction.Picking, mp.Arm, mp.SrcModule);
-                AddAction(new PickAction(this, mp));
-            }
-
-            return true;
-        }
-
-        public bool Place(MoveParam mp)
-        {
-            if (ModuleHelper.IsPm(mp.DestModule))
-            {
-                JetPMBase pM = GetPM(mp.DestModule);
-
-                if (pM.IsSlitDoorClosed)
-                {
-                    EV.PostAlarmLog(pM.Module.ToString(), "Slit 门必须打开");
-                    return false;
-                }
-
-                AddAction(new ExtendAction(this, new ExtendParam { Module = mp.DestModule, Arm = mp.Arm, Pos = ExtendPos.PB }));
-                AddAction(new PinAction(mp.DestModule, pM, MovementPosition.Up, true, mp.Arm, false));
-                AddAction(new ExtendAction(this, new ExtendParam { Module = mp.DestModule, Arm = mp.Arm, Pos = ExtendPos.P4 }));
-                AddAction(new PinAction(mp.DestModule, pM, MovementPosition.Up, false, mp.Arm, false));
-            }
-            else
-            {
-                SetRobotMovingInfo(RobotAction.Placing, mp.Arm, mp.DestModule);
-                AddAction(new PlaceAction(this, mp));
-            }
-
-            return true;
-        }
-
-
-        public void PickAndPlace(MoveParam pickParam, MoveParam placeParam)
-        {
-            if (!WaferManager.Instance.CheckWafer(pickParam.SrcModule, pickParam.SrcSlot, WaferStatus.Normal))
-            {
-                EV.PostAlarmLog("System", $"{pickParam.SrcModule} slot {pickParam.SrcSlot + 1} wafer is not normal");
-                return;
-            }
-
-            if (ModuleHelper.IsPm(pickParam.SrcModule))
-            {
-                JetPMBase pM = GetPM(pickParam.SrcModule);
-
-                if (pM.IsSlitDoorClosed)
-                {
-                    EV.PostAlarmLog(pM.Module.ToString(), "Slit 门必须打开");
-                    return;
-                }
-
-                AddAction(new PinAction(pickParam.SrcModule, pM, MovementPosition.Up, false, pickParam.Arm, true));
-                AddAction(new ExtendAction(this, new ExtendParam { Module = pickParam.SrcModule, Arm = pickParam.Arm, Pos = ExtendPos.GB }));
-
-                AddAction(new PinAction(pickParam.SrcModule, pM, MovementPosition.Down, true, pickParam.Arm, true));
-                AddAction(new ExtendAction(this, new ExtendParam { Module = pickParam.SrcModule, Arm = pickParam.Arm, Pos = ExtendPos.G4 }));
-
-
-                AddAction(new ExtendAction(this, new ExtendParam { Module = placeParam.DestModule, Arm = placeParam.Arm, Pos = ExtendPos.PB }));
-                AddAction(new PinAction(placeParam.DestModule, pM, MovementPosition.Up, true, placeParam.Arm, false));
-                AddAction(new ExtendAction(this, new ExtendParam { Module = placeParam.DestModule, Arm = placeParam.Arm, Pos = ExtendPos.P4 }));
-                AddAction(new PinAction(placeParam.DestModule, pM, MovementPosition.Up, false, placeParam.Arm, false));
-            }
-            else
-            {
-                SetRobotMovingInfo(RobotAction.Picking, pickParam.Arm, pickParam.SrcModule);
-                AddAction(new PickAction(this, pickParam));
-
-                SetRobotMovingInfo(RobotAction.Placing, placeParam.Arm, placeParam.DestModule);
-                AddAction(new PlaceAction(this, placeParam));
-            }
-        }
-
-        public bool Extend(ExtendParam ep)
-        {
-            AddAction(new ExtendAction(this, ep));
-
-            return true;
-        }
-
-        public void Goto(MoveParam ep)
-        {
-            //_robotMoveAction = string.Format($"{ep.SrcModule}.Goto");
-            AddAction(new GotoAction(this, ep));
-        }
-
-        public bool Retract(ExtendParam ep)
-        {
-            AddAction(new ExtendAction(this, ep));
-            return true;
-        }
-
-        public bool Map(ModuleName mod)
-        {
-            if (_LPMs[mod - ModuleName.LP1].Protrusion)
-            {
-                EV.PostAlarmLog(mod.ToString(), $"{mod} wafer protrusion, can not do Map");
-                return false;
-            }
-
-            _LPMs[mod - ModuleName.LP1].Map();
-            return true;
-        }
-		
-		
-        public bool Grip(Hand blade, bool isGrip)
-        {
-            AddAction(new GripAction(this, blade, isGrip));
-
-            return true;
-        }
-
-        public bool SetPinUp(ModuleName mod)
-        {
-            AddAction(new LiftAction(this, mod, true));
-            return true;
-        }
-
-        public bool SetPinDown(ModuleName mod)
-        {
-            if ((EfemEntity.EfemType)SC.GetValue<int>($"EFEM.EfemType") == EfemEntity.EfemType.BrooksEFEM)
-                return true;
-
-            AddAction(new LiftAction(this, mod, false));
-            return true;
-        }
-
-        public bool Align(ModuleName mod, float delayTime, Aitex.Core.Common.WaferSize size)
-        {
-            AddAction(new AlignAction(this, mod, size));
-            return true;
-        }
-
-        public bool SetLamp(LightType light, LightStatus status)
-        {
-            AddAction(new LedAction(this, light, status));
-            return true;
-        }
-
-        public void TurnOffBuzzer()
-        {
-            AddAction(new LedAction(this, LightType.BUZZER1, LightStatus.OFF));
-        }
-
-
-        //public void SwitchOnBuzzerAndRed()
-        //{
-        //    AddAction(new LedAction(this, LightType.RED, LightStatus.ON));
-        //    AddAction(new LedAction(this, LightType.YELLOW, LightStatus.OFF));
-        //    AddAction(new LedAction(this, LightType.GREEN, LightStatus.OFF));
-        //    AddAction(new LedAction(this, LightType.BUZZER1, LightStatus.ON));
-        //}
-
-        public override void ReceiveMessage(string sRec)
-        {
-            _msgHandler.ReceiveMessage(sRec);
-        }
-
-        public override void SetOnline(ModuleName mod, bool online)
-        {
-            this[mod].SetOnline(online);
-        }
-
-        public override void SetBusy(ModuleName mod, bool busy)
-        {
-            this[mod].Status = DeviceState.Busy;
-        }
-
-        //--------------------------------Constructor------------------------------------
-        // 
-        private JetPMBase GetPM(ModuleName mod)
-        {
-            if (!ModuleHelper.IsPm(mod))
-                throw new ArgumentException("Module argument error");
-
-            return _pm[mod - ModuleName.PMA];
-        }
-
-        //----------------------------------Private Method-------------------------------
-        // 
-        private void MsgOnEventUpdated(object sender, EventArgs e)
-        {
-            if (!(e is EfemEventArgs))
-                return;
-
-            EfemEventArgs eArg = e as EfemEventArgs;
-
-            switch (eArg.CommandType)
-            {
-                case EfemOperation.SigStatus:
-                    // EVT:SIGSTAT/Parameter/DATA1/DATA2;
-                    string sParam = eArg.DataList[0];           // "SYSTEM" or "Pn"
-
-                    // DATA1 & DATA2
-                    int nData1 = Convert.ToInt32(eArg.DataList[1], 16);
-                    int nData2 = Convert.ToInt32(eArg.DataList[2], 16);
-
-                    BitArray baData1 = new BitArray(new int[] { nData1 });
-                    BitArray baData2 = new BitArray(new int[] { nData2 });
-
-                    if (0 == string.Compare(sParam, Constant.SYS, true))
-                    {
-                        // EVT:SIGSTAT/System/00000000/00000004;
-                        // DATA1
-                        _bSysVacPressure1.CLK = baData1[0]; //  bit 0
-                        _bSysCompressedAirPressure.CLK = baData1[2];  // bit 2
-                        _bFlowGaugeSensor.CLK = baData1[4];  // bit 4
-                        _bLeakageSensor.CLK = baData1[5];  // bit 5
-                        this.DoorSwitch = baData1[6] ? LidState.Close : LidState.Open; // bit 6
-                                                                                       //bDrivePower                    = baData1[7];  // bit 7
-                        _bDiffPressureSensorSetting1.CLK = baData1[8];  // bit 8
-                        _bDiffPressureSensorSetting2.CLK = baData1[9];  // bit 9
-                        _bIonizerAlarm.CLK = baData1[10];  // bit 10
-                        _bFFuAlarm.CLK = baData1[11];  // bit 11
-                        _bAreaSensor.CLK = baData1[12];  // bit 12
-                        _bModeSwitch.CLK = baData1[13];  // bit 13
-                        this.CassetteDoor = baData1[15] ? LidState.Close : LidState.Open;  // bit 15
-
-                        // Post warning and alarm
-                        if (!baData1[0])   // Bit[0] ON=Normal, OFF=Abnormal
-                        {
-                            EV.Notify(EFEMVacuumPressureError);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM System vacuum source pressure low");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
-                        if (!baData1[1])   // Bit[1] ON=Normal, OFF=Abnormal
-                        {
-                            EV.Notify(EFEMIonizerAlarm);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM Ionizer compressed air error");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
-                        if (!baData1[2])   // Bit[2] ON=Normal, OFF=Abnormal
-                        {
-                            EV.Notify(EFEMCDAError);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM System compressed air pressure low");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
-                        if (!baData1[4])   // Bit[4] ON=Normal, OFF=Abnormal
-                        {
-                            EV.Notify(EFEMFlowGaugeSensorError);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM Flow gauge sensor error");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
-                        if (!baData1[5])   // Bit[5] ON=Normal, OFF=Abnormal
-                        {
-                            EV.Notify(EFEMLeakageAlarm);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM Leakage alarm");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
-                        if (!baData1[10])   // Bit[10] ON=Normal, OFF=Abnormal
-                        {
-                            EV.Notify(EFEMIonizerAlarm);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM Ionizer alarm");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
-                        if (!baData1[11])   // Bit[11] ON=Normal, OFF=Abnormal
-                        {
-                            EV.Notify(EFEMFFUAlarm);
-                            EV.PostAlarmLog(Module.ToString(), "FFU alarm");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
-                        if (!baData1[13])   // Bit[13] ON=RUN, OFF=Maintain
-                        {
-                            EV.Notify(EFEMOffline);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM switch to Maintain mode, HomeAll to recover");
-                            //Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.ToInit);
-                        }
-                        // DATA2
-                        _signalT.ChangeLightStatus(LightType.RED, baData2[0] ? LightStatus.ON : baData2[5] ? LightStatus.BLINK : LightStatus.OFF);
-                        _signalT.ChangeLightStatus(LightType.GREEN, baData2[1] ? LightStatus.ON : baData2[6] ? LightStatus.BLINK : LightStatus.OFF);
-                        _signalT.ChangeLightStatus(LightType.YELLOW, baData2[2] ? LightStatus.ON : baData2[7] ? LightStatus.BLINK : LightStatus.OFF);
-                        _signalT.ChangeLightStatus(LightType.BLUE, baData2[3] ? LightStatus.ON : baData2[8] ? LightStatus.BLINK : LightStatus.OFF);
-                        _signalT.ChangeLightStatus(LightType.WHITE, baData2[4] ? LightStatus.ON : baData2[9] ? LightStatus.BLINK : LightStatus.OFF);
-                        _signalT.ChangeLightStatus(LightType.BUZZER1, baData2[10] ? LightStatus.ON : LightStatus.OFF);
-
-                        /* EFEM 程序中目前没有实现
-                        _RobotErr.CLK = baData2[27]; // bit 27
-
-                        bool bArmNotExtendLLA            = baData2[30]; // bit 30
-                        bool bArmNotExtendLLB            = baData2[31]; // bit 31
-                        */
-                    } // system event
-                    else
-                    {
-                        _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
-                    } // FOUP EVENT
-                    break;
-                case EfemOperation.GetWaferInfo:
-                    _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        private void MsgOnCommandUpdated(object sender, EventArgs e)
-        {
-            EfemActionArgs arg = e as EfemActionArgs;
-            if (arg == null) throw new ArgumentNullException("Argument is Null");
-
-            if (arg.CommandType == EfemOperation.Ready)
-            {
-                this.CommunicationConnected = true;
-                Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.CommReady);
-                return;
-            }
-            
-
-            EfemActionBase action = null;
-
-            lock (_lockerAction)
-            {
-                foreach (var item in _actions)
-                {
-                    if (item is EfemActionBase a1)
-                    {
-                        if (a1.Type == arg.CommandType && item.Status != ActionStatus.Completed)
-                        {
-                            action = a1;
-                            break;
-                        }
-                    }
-                }
-
-                if (action == null)
-                {
-                    //EV.PostAlarmLog(arg.Module.ToString(), $"NO activated {arg.CommandType} in the queue");
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"NO activated [{arg.ID}] [{arg.CommandType}] in the queue");
-                    return;
-                }
-
-                // 更新 action 状态
-                action.Status = arg.Status;
-
-                if (arg.Status == ActionStatus.Completed)
-                {
-                    ModuleName mod = action.Module;
-
-                    // Map 命令比较特别, module 是LPX但是用robot做mapping
-                    if (mod == ModuleName.EFEM || mod == ModuleName.EfemRobot || ModuleHelper.IsAligner(mod) || ModuleHelper.IsCooling(mod) || arg.CommandType == EfemOperation.Map)
-                    {
-                        if ((action.Type != EfemOperation.Light) && (action.Type != EfemOperation.Lift))
-                        {
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.ActionDone, arg.CommandType);
-                        }
-
-                        if (action.Type == EfemOperation.Lift)
-                        {
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.LiftActionDone, arg.CommandType);
-                        }
-                    }
-                    else if (ModuleHelper.IsLoadPort(mod))
-                    {
-                        Singleton<RouteManager>.Instance.EFEM.NotifyLP(mod, LoadportEntity.MSG.ActionDone);
-                    }
-
-                    if(arg.CommandType == EfemOperation.Pick || arg.CommandType == EfemOperation.Place)
-                        SetRobotMovingInfo(RobotAction.None, Hand.Both, ModuleName.System);
-
-                    action.OnPostWork(arg.Data);
-
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"efem action [{action.GetType().Name}] [{action.ID}][{action.Type}] removed from queue");
-
-                    _actions.Remove(action);
-                }
-            }
-        }
-
-        private void MsgOnErrorOccurred(object sender, EventArgs e)
-        {
-            if (!(e is EfemErrorArgs arg))
-                return;
-
-            this.Status = DeviceState.Error;
-
-            EfemActionBase action = null;
-
-            lock (_lockerAction)
-            {
-                foreach (var item in _actions)
-                {
-                    if (item is EfemActionBase a1)
-                    {
-                        if (a1.Type == arg.CommandType && item.Status != ActionStatus.Completed)
-                        {
-                            action = a1;
-                            break;
-                        }
-                    }
-                }
-
-                if (action == null)
-                {
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"NO activated [{arg.ID}] [{arg.Module}] [{arg.CommandType}] in the queue");
-                    return;
-                }
-
-                ModuleName mod = action.Module;
-                if (mod == ModuleName.EFEM || mod == ModuleName.EfemRobot || ModuleHelper.IsAligner(mod) || ModuleHelper.IsCooling(mod) || arg.CommandType == EfemOperation.Map)
-                {
-                    if (action.Type != EfemOperation.Light)
-                    {
-                        Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.ActionDone, arg.CommandType);
-                    }
-                }
-                else if (ModuleHelper.IsLoadPort(mod))
-                {
-                    Singleton<RouteManager>.Instance.EFEM.NotifyLPError(mod );
-                }
-
-                LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"efem action [{action.GetType().Name}] [{action.ID}][{action.Module}][{action.Type}] removed from queue");
-                _actions.Remove(action);
-            }
-
-            EV.Notify(EFEMError);
-            EV.PostAlarmLog(Module.ToString(), $"{arg.Description}, [{arg.Message}], [{arg.Factor}]");
-        }
-    }
-
-}

文件差异内容过多而无法显示
+ 0 - 999
Venus/Venus_RT/Devices/EFEM/EfemAction.cs


+ 60 - 138
Venus/Venus_RT/Devices/EFEM/EfemBase.cs

@@ -8,48 +8,25 @@ using System.Xml;
 using Aitex.Core.RT.Device;
 using Aitex.Core.RT.Log;
 using Aitex.Sorter.Common;
+using Aitex.Core.Common;
 using MECF.Framework.Common.Equipment;
 using Venus_RT.Devices;
 using Venus_RT.Devices.YASKAWA;
+using Venus_Core;
+using MECF.Framework.Common.CommonData;
 
 namespace Venus_RT.Devices.EFEM
 {
 
-    class EfemBase : BaseDevice, IDevice
+    public abstract class EfemBase : BaseDevice, IDevice
     {
-        // Fields
-        //
-        protected volatile LinkedList<ActionBase> _actions = new LinkedList<ActionBase>();
-        protected EfemCommunicationBase _comm;
-        protected IMessageHandler _msgHandler;
-
-
-        public virtual ILoadport this[ModuleName mod]
-        {
-            get { throw new ApplicationException(); }
-        }
+        public virtual ILoadport this[ModuleName mod] => throw new ApplicationException();
 
         // Properties
         //
         public new ModuleName Module { get; set; }
         public OnlineFlag OnlineFlag { get; set; }
         public bool CommunicationConnected { get; protected set; }
-        public DeviceState Status { get; set; }
-
-        public bool HasActions
-        {
-            get
-            {
-                lock (_lockerAction)
-                {
-                    return _actions.Any(x => x.Status == ActionStatus.Pending);
-                }
-
-            }
-        }
-
-        public EfemCommunicationBase Comm => _comm;
-        public IMessageHandler MsgHandler => _msgHandler;
 
         protected object _lockerAction = new object();
 
@@ -66,131 +43,76 @@ namespace Venus_RT.Devices.EFEM
             set;
         }
 
-        protected EfemBase(XmlElement xmlNode = null)
-        {
-        }
-
-        public bool Initialize()
-        {
-            return true;
-        }
-
-        public void Monitor()
-        {
-            throw new NotImplementedException();
-        }
-
-        public void Terminate()
-        {
-            throw new NotImplementedException();
-        }
-
-        public void Reset()
-        {
-            throw new NotImplementedException();
-        }
-
-        // Methods
-        //
-        public void ExecuteAction()
+        protected EfemBase()
         {
-            lock (_lockerAction)
-            {
-                if (!_actions.Any())
-                {
-                    LOG.Write( eEvent.EV_EFEM_COMMON_INFO, Module, "No Action in the EFEM Queue");
-
-                    return;
-                }
-                if (_actions.All(x => x.Status != ActionStatus.Pending))
-                {
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, "NO pending Action in EFEM Queue");
-                    //System.Diagnostics.Trace.Assert(false);
-                    return;
-                }
-
-                var nextAction = _actions.First(a => a.Status == ActionStatus.Pending);
-
-                if (nextAction != null)
-                {
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"found pending action : efem action [{nextAction.GetType().Name}] [{nextAction.ID}] 开始执行");
-
-                    nextAction.Execute();
-                }
-            }
-
         }
 
-        public void ClearActions()
+        protected bool CheckEfemStatus()
         {
-            lock (_lockerAction)
+            if (Status == RState.Init)
             {
-                _actions?.Clear();
+                LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, "EFEM is not homed, please home first.");
+                return false;
             }
-
-        }
-
-        public void AddAction(ActionBase cmd)
-        {
-            lock (_lockerAction)
+            else if (Status == RState.Running)
             {
-                _actions.AddLast(cmd);
-
-                LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"efem action [{cmd.GetType().Name}] [{cmd.ID}] add to queue");
-
-                if (cmd.IsBackground)
-                {
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"background, efem action [{cmd.GetType().Name}]  [{cmd.ID}] 开始执行");
-                    cmd.Execute();
-                }
-
-                if (cmd is LedAction)
-                {
-                    Thread.Sleep(50);
-                }
-
-                if (cmd is LiftAction)
-                {
-                    Thread.Sleep(50);
-                }
+                LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, "EFEM is busy, please wait a minute");
+                return false;
             }
-        }
-
-        public void UpdateStatus(ushort Id, ActionStatus st)
-        {
-            lock (_lockerAction)
+            else if (Status == RState.Failed || Status == RState.Timeout)
             {
-                var cur = _actions.First(x => x.ID == Id);
-                if (null == cur)
-                {
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"NO {Id} action in the queue");
-                    return;
-                }
-
-                cur.Status = st;
-                if (st == ActionStatus.Completed)
-                {
-                    cur.OnPostWork();
-                    _actions.Remove(cur);
-
-                    LOG.Write(eEvent.EV_EFEM_COMMON_INFO, Module, $"efem action [{cur.GetType().Name}] [{cur.ID}] removed from queue");
-
-                }
+                LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, "EFEM has a error, please check and fix the hardware issue and home it");
+                return false;
             }
 
-
-
+            return true;
         }
 
-        public virtual void ReceiveMessage(string sRec) { throw new NotImplementedException(); }
-
-        public void SetOnline(bool online)
+        public virtual bool Initialize()
         {
-            this.OnlineFlag = online ? OnlineFlag.Online : OnlineFlag.Offline;
+            return true;
         }
 
-        public virtual void SetOnline(ModuleName mod, bool online) { }
-
-        public virtual void SetBusy(ModuleName mod, bool online) { }
+        public abstract void Monitor();
+        public abstract void Terminate();
+        public abstract void Reset();
+        public abstract void SetOnline(bool online);
+        public abstract void SetOnline(ModuleName mod, bool online);
+
+        public abstract void SetBusy(ModuleName mod, bool online);
+
+        public virtual RState Status { get; }
+        public virtual RobotMoveInfo TMRobotMoveInfo { get; }
+        public virtual bool IsHomed { get; }
+        public abstract bool HomeAll();
+        public abstract bool Home(ModuleName mod);
+        public abstract bool Halt();
+        public abstract bool ClearError();
+        public abstract bool PickExtend(ModuleName chamber, int slot, Hand hand);
+        public abstract bool PickRetract(ModuleName chamber, int slot, Hand hand);
+        public abstract bool PlaceExtend(ModuleName chamber, int slot, Hand hand);
+        public abstract bool PlaceRetract(ModuleName chamber, int slot, Hand hand);
+        public abstract bool Pick(ModuleName station, int slot, Hand hand);
+        public abstract bool Place(ModuleName station, int slot, Hand hand);
+        public abstract bool Goto(ModuleName station);
+        public abstract bool Grip(Hand blade, bool isGrip);
+        public abstract bool Map(ModuleName mod);
+        public abstract bool SetPinUp(ModuleName mod);
+        public abstract bool SetPinDown(ModuleName mod);
+        public abstract bool Align(ModuleName mod, float delayTime, WaferSize size);
+        public abstract bool SetLamp(LightType light, LightStatus status);
+        public abstract bool Load(ModuleName mod);
+        public abstract bool Unload(ModuleName mod);
+        public abstract bool ReadCarrierId(ModuleName mod);
+        public abstract bool WriteCarrierId(ModuleName mod, string id);
+        public abstract bool ReadTagData(ModuleName mod);
+        public abstract bool WriteTagData(ModuleName mod, string tagData);
+        public abstract bool Dock(ModuleName mod);
+        public abstract bool Undock(ModuleName mod);
+        public abstract bool Clamp(ModuleName mod, bool isUnloadClamp);
+        public abstract bool Unclamp(ModuleName mod);
+        public abstract bool SetThick(ModuleName mod);
+        public abstract bool SetThin(ModuleName mod);
+        public abstract void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target);
     }
 }

+ 2 - 93
Venus/Venus_RT/Devices/EFEM/EfemDevice.cs

@@ -26,74 +26,7 @@ using Venus_RT.Modules;
 
 namespace Venus_RT.Devices
 {
-    class EfemCommunicationBase
-    {
-        protected readonly AsyncSocket _socket = new AsyncSocket("");
-
-        protected string _simIPAddress =>  (EfemEntity.EfemType)SC.GetValue<int>($"EFEM.EfemType") == EfemEntity.EfemType.JetEfem ? "127.0.0.1:13000" : "127.0.0.1:13001";
-
-        public bool IsConnected
-        {
-            get
-            {
-                return (EfemEntity.EfemType)SC.GetValue<int>($"EFEM.EfemType") == EfemEntity.EfemType.BrooksEFEM || _socket.IsConnected;
-            }
-        }
-
-        private string _ip;
-
-        protected EfemCommunicationBase(string sIP)
-        {
-            if ((EfemEntity.EfemType)SC.GetValue<int>($"EFEM.EfemType") == EfemEntity.EfemType.BrooksEFEM && SC.GetValue<bool>("System.IsSimulatorMode") == false)
-            {
-                Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.CommReady);
-                return;
-            }
 
-            _ip = sIP;
-            if (SC.GetValue<bool>("System.IsSimulatorMode"))
-            {
-                _ip = _simIPAddress;
-            }
-            _socket.Connect(_ip);
-            _socket.OnDataChanged += Hardware_OnDataChanged;
-            _socket.OnErrorHappened += Hardware_OnErrorHappened;
-
-            //if (!_socket.IsConnected)
-            //{
-            //    EV.PostAlarmLog(ModuleName.EFEM.ToString(), "Cannot connect to EFEM");
-            //}
-        }
-
-
-        public void Reconnect()
-        {
-            if (SC.GetValue<bool>("System.IsSimulatorMode"))
-            {
-                _ip = _simIPAddress;
-            }
-            _socket.Connect(_ip);
-        }
-
-        private void Hardware_OnDataChanged(string message)
-        {
-            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.RecHwMsg, message);
-        }
-
-        private void Hardware_OnErrorHappened(ErrorEventArgs args)
-        {
-            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-        }
-
-        public virtual void SendTo(string str) { }
-
-        public virtual void SendTo(IEfemMessage yas_msg) { }
-    }
-
-}
-
-namespace Venus_RT.Devices.YASKAWA
-{
     sealed class MessageHandler : IMessageHandler
     {
         // Fields
@@ -125,7 +58,7 @@ namespace Venus_RT.Devices.YASKAWA
 
         public void Send(IEfemMessage msg)
         {
-            _efem.Comm.SendTo(msg);
+  //          _efem.Comm.SendTo(msg);
 
             _msgQueue.Add(msg as EfemMessage);
         }
@@ -165,7 +98,7 @@ namespace Venus_RT.Devices.YASKAWA
                         // 收到INF之后发送ACK确认
                         string strACK = rec_msg.RawString.Replace("INF", "ACK");
 
-                        _efem.Comm.SendTo(strACK);
+  //                      _efem.Comm.SendTo(strACK);
 
                         EfemMessage ack_msg = strACK.ToMessage();
                         ack_msg.Direct = MsgDirection.To;
@@ -240,30 +173,6 @@ namespace Venus_RT.Devices.YASKAWA
         }
     }
 
-    sealed class EfemComm : EfemCommunicationBase
-    {
-        public EfemComm() : base(SC.GetStringValue("EFEM.IPAddress"))
-        {
-        }
-
-        public override void SendTo(string str) { _socket.Write(str + '\r'); }
-
-        public override void SendTo(IEfemMessage msg)
-        {
-            if (msg is EfemMessage yas_msg)
-            {
-                //string str = EfemParser.Instance.TranslateBack(yas_msg);
-                string str = yas_msg.ToString();
-                if (string.IsNullOrEmpty(str))
-                    throw new ApplicationException("Yaskawa message translation error");
-
-                yas_msg.RawString = str;
-
-                SendTo(str);
-            }
-        }
-    }
-
 
     sealed class SignalTower
     {

+ 6 - 25
Venus/Venus_RT/Devices/EFEM/EfemInterface.cs

@@ -8,30 +8,11 @@ using Venus_Core;
 
 namespace Venus_RT.Devices
 {
-    interface IEfemMessage : IHardwareMessage
+    public interface IEfemMessage : IHardwareMessage
     {
         EfemOperation Operation { get; set; }
     }
 
-    interface IEfem
-    {
-        bool HomeAll();
-
-        bool Home(ModuleName mod);
-        bool ClearError();
-
-        bool Pick(MoveParam mp);
-        bool Place(MoveParam mp);
-        bool Extend(ExtendParam ep);
-        bool Retract(ExtendParam ep);
-
-        bool Map(ModuleName mod);
-        bool SetPinUp(ModuleName mod);
-        bool Align(ModuleName mod, float delayTime, WaferSize size);
-
-        bool SetLamp(LightType light, LightStatus status);
-    }
-
     interface IAlign
     {
         void Lift();
@@ -39,7 +20,7 @@ namespace Venus_RT.Devices
         void Align(WaferSize size);
     }
 
-    interface ILoadport
+    public interface ILoadport
     {
         ModuleName Module            { get; set; }
         //DoorState DoorStatus         { get; set; }
@@ -83,7 +64,7 @@ namespace Venus_RT.Devices
         void OnTagDataWriteFailed(string data);
     }
 
-    interface IMessageHandler
+    public interface IMessageHandler
     {
         bool IsCompleted { get; }
 
@@ -97,7 +78,7 @@ namespace Venus_RT.Devices
         void ReceiveMessage(string str);
     }
 
-    class EfemActionArgs : EventArgs
+    public class EfemActionArgs : EventArgs
     {
         public ushort ID                 { get; set; }
         public ModuleName Module         { get; set; }
@@ -106,7 +87,7 @@ namespace Venus_RT.Devices
         public string Data               { get; set; }
     }
 
-    class EfemEventArgs : EventArgs
+    public class EfemEventArgs : EventArgs
     {
         public string EvtStr             { get; set; }
         public ModuleName Module         { get; set; }
@@ -114,7 +95,7 @@ namespace Venus_RT.Devices
         public IList<string> DataList    { get; set; }
     }
 
-    class EfemErrorArgs : EventArgs
+    public class EfemErrorArgs : EventArgs
     {
         public string Factor      { get; set; }
         public string Description { get; set; }

+ 3 - 3
Venus/Venus_RT/Devices/EFEM/Loadport.cs

@@ -21,7 +21,7 @@ namespace Venus_RT.Devices.EFEM
 {
     sealed class Loadport : ILoadport
     {
-        private readonly Efem _controller;
+        private readonly EfemBase _controller;
 
         //---------------------------------Properties------------------------------------
         // 
@@ -96,7 +96,7 @@ namespace Venus_RT.Devices.EFEM
 
         // Constructor
         //
-        public Loadport(ModuleName mod, Efem efem)
+        public Loadport(ModuleName mod, EfemBase efem)
         {
             Module = mod;
             _controller = efem;
@@ -482,7 +482,7 @@ namespace Venus_RT.Devices.EFEM
 
         public void Map()
         {
-            _controller.AddAction(new MapAction(_controller, Module));
+            _controller.Map(Module);
         }
 
 

+ 36 - 36
Venus/Venus_RT/Devices/IODevices/IoSignalTower.cs

@@ -178,11 +178,11 @@ namespace Venus_RT.Devices
 
             DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
 
-            //DATA.Subscribe($"{Module}.{Name}.IsRedLightOn", () => _red != null && _red.Value);
-            //DATA.Subscribe($"{Module}.{Name}.IsYellowLightOn", () => _yellow != null && _yellow.Value);
-            //DATA.Subscribe($"{Module}.{Name}.IsGreenLightOn", () => _green != null && _green.Value);
-            //DATA.Subscribe($"{Module}.{Name}.IsBlueLightOn", () => _blue != null && _blue.Value);
-            //DATA.Subscribe($"{Module}.{Name}.IsBuzzerOn", () => (_buzzer1 != null && _buzzer1.Value) || (_buzzer2 != null && _buzzer2.Value));
+            DATA.Subscribe($"{Module}.{Name}.IsRedLightOn", () => _red != null && _red.Value);
+            DATA.Subscribe($"{Module}.{Name}.IsYellowLightOn", () => _yellow != null && _yellow.Value);
+            DATA.Subscribe($"{Module}.{Name}.IsGreenLightOn", () => _green != null && _green.Value);
+            DATA.Subscribe($"{Module}.{Name}.IsBlueLightOn", () => _blue != null && _blue.Value);
+            DATA.Subscribe($"{Module}.{Name}.IsBuzzerOn", () => (_buzzer1 != null && _buzzer1.Value) || (_buzzer2 != null && _buzzer2.Value));
             return true;
         }
 
@@ -211,7 +211,7 @@ namespace Venus_RT.Devices
                     break;
                 //case LightType.buzz:
                 //    light = _buzzer2;
-                    break;
+                //    break;
             }
 
             if (light == null)
@@ -307,37 +307,37 @@ namespace Venus_RT.Devices
                 _Generator = null;
             }
             //pumping valve开,vent purge valve开,Gas valve开,RF开,只要有其中之一处于开的状态,就是绿灯
-            //if (state == PMState.Error || _buzzerAndRed)
-            //{
-            //    SetLight(LightType.Green, LightState.Off);
-            //    SetLight(LightType.Red, LightState.On);
-            //    SetLight(LightType.Yellow, LightState.Off);
-            //    SetLight(LightType.Buzzer1, _buzzerSwitchOff ? LightState.Off : LightState.On);
-            //}
-            //else if ((_Generator != null && _Generator.IsPowerOn) || valves.Exists(v => v.Status))
-            //{
-            //    SetLight(LightType.Green, LightState.On);
-            //    SetLight(LightType.Red, LightState.Off);
-            //    SetLight(LightType.Yellow, LightState.Off);
-            //    SetLight(LightType.Buzzer1, LightState.Off);
-            //}
-            //else if (state == PMState.PreProcess ||state == PMState.Processing ||state == PMState.PostProcess)
-            //{
-            //    Green = TowerLightStatus.On;
-            //    Red = TowerLightStatus.Off;
-            //    Yellow = TowerLightStatus.Off;
-            //    Buzzer_Alarm = TowerLightStatus.Off;
-            //}
-            //else
-            //{
-            //    SetLight(LightType.Green, LightState.Off);
-            //    SetLight(LightType.Red, LightState.Off);
-            //    SetLight(LightType.Yellow, LightState.On);
-            //    SetLight(LightType.Buzzer1, LightState.Off);
-            //}
+            if (state == PMState.Error || _buzzerAndRed)
+            {
+                SetLight(LightType.GREEN, LightState.Off);
+                SetLight(LightType.RED, LightState.On);
+                SetLight(LightType.YELLOW, LightState.Off);
+                SetLight(LightType.BUZZER1, _buzzerSwitchOff ? LightState.Off : LightState.On);
+            }
+            else if ((_Generator != null && _Generator.IsPowerOn) || valves.Exists(v => v.Status))
+            {
+                SetLight(LightType.GREEN, LightState.On);
+                SetLight(LightType.RED, LightState.Off);
+                SetLight(LightType.YELLOW, LightState.Off);
+                SetLight(LightType.BUZZER1, LightState.Off);
+            }
+            else if (state == PMState.PreProcess || state == PMState.Processing || state == PMState.PostProcess)
+            {
+                SetLight(LightType.GREEN, LightState.On);
+                SetLight(LightType.RED, LightState.Off);
+                SetLight(LightType.YELLOW, LightState.Off);
+                SetLight(LightType.BUZZER1, LightState.Off);
+            }
+            else
+            {
+                SetLight(LightType.GREEN, LightState.Off);
+                SetLight(LightType.RED, LightState.Off);
+                SetLight(LightType.YELLOW, LightState.On);
+                SetLight(LightType.BUZZER1, LightState.Off);
+            }
 
-            //if (!_timerBuzzerBlinking.IsIdle() && !_timerBuzzerBlinking.IsTimeout())
-            //    SetLight(LightType.Buzzer1, LightState.Blink);
+            if (!_timerBuzzerBlinking.IsIdle() && !_timerBuzzerBlinking.IsTimeout())
+                SetLight(LightType.BUZZER1, LightState.Blink);
 
             MonitorLight(_red);
             MonitorLight(_blue);

文件差异内容过多而无法显示
+ 0 - 1225
Venus/Venus_RT/Devices/JetPM.cs


+ 2 - 2
Venus/Venus_RT/Devices/TM/JetTM.cs

@@ -86,8 +86,8 @@ namespace Venus_RT.Devices
         public bool LLBLidClosed => _LLBLid.OFFFeedback;
         public bool IsLLASlitDoorClosed => _LLATSlitDoor.State == CylinderState.Close;
         public bool IsLLASlitDoorOpen => _LLATSlitDoor.State == CylinderState.Open;
-        public bool IsELLASlitDoorClosed => _LLAESlitDoor.State == CylinderState.Close;
-        public bool IsELLASlitDoorOpen => _LLAESlitDoor.State == CylinderState.Open;
+        public bool IsLLAESlitDoorClosed => _LLAESlitDoor.State == CylinderState.Close;
+        public bool IsLLAESlitDoorOpen => _LLAESlitDoor.State == CylinderState.Open;
         public bool IsLLBSlitDoorClosed => _LLBTSlitDoor.State == CylinderState.Close;
         public bool IsLLBSlitDoorOpen => _LLBTSlitDoor.State == CylinderState.Open;
         public bool IsLLBESlitDoorClosed => _LLBESlitDoor.State == CylinderState.Close;

+ 4 - 3
Venus/Venus_RT/Devices/VirgoSignalTower.cs

@@ -4,12 +4,13 @@ using MECF.Framework.Common.Equipment;
 using System;
 using System.Collections.Generic;
 using Aitex.Core.RT.Log;
+using Venus_RT.Devices.EFEM;
 namespace Venus_RT.Devices
 {
     class VenusSignalLight : SignalLightBase
     {
         public MECF.Framework.Common.Device.Bases.LightType Type { get; set; }
-        //public Efem EfemController { get; set; }
+        public EfemBase EfemController { get; set; }
 
         private F_TRIG _trigError = new F_TRIG();
 
@@ -26,7 +27,7 @@ namespace Venus_RT.Devices
         protected override void SetOn()
         {
             SetLight(TowerLightStatus.On);
-            //_SignalTower.SetLight()
+            //_SignalTower.SetLight();
         }
 
         protected override void SetOff()
@@ -93,7 +94,7 @@ namespace Venus_RT.Devices
 
                     break;
             }
-            //EfemController.SetLamp(venusType, venusSetpoint);
+            EfemController.SetLamp(venusType, venusSetpoint);
             _SignalTower.SetLight(venusType, lightState);
             return true;
         }

+ 123 - 369
Venus/Venus_RT/Modules/EFEM/EfemEntity.cs

@@ -16,6 +16,7 @@ using Venus_RT.Devices;
 using Venus_RT.Devices.YASKAWA;
 using Venus_RT.Devices.EFEM;
 using Venus_RT.Modules.LPs;
+using Venus_RT.Modules.EFEM;
 
 namespace Venus_RT.Modules
 {
@@ -78,7 +79,7 @@ namespace Venus_RT.Modules
             Map,
 			ToInit,
 			Cool,
-            PickAndPlace,
+            Swap,
             Grip,
             Ungrip,
             Flip,
@@ -100,12 +101,17 @@ namespace Venus_RT.Modules
         // Fields
         //
         private readonly string Name;
-        private readonly Efem _efem;
+        private readonly EfemBase _efem;
         private readonly LoadPortModule[] _lpms = new LoadPortModule[2];
         private readonly EfemType _efemType;
-        public Efem EfemDevice => _efem;
+        public EfemBase EfemDevice => _efem;
         public EfemType EFEMType => _efemType;
 
+        // routine
+        private readonly EfemPickRoutine _pickRoutine;
+        private readonly EfemPlaceRoutine _placeRoutine;
+        private readonly EfemSwapRoutine _swapRoutine;
+
         // Constructor
         //
         public EfemEntity()
@@ -115,10 +121,14 @@ namespace Venus_RT.Modules
             _bigWafer = SC.GetValue<int>($"System.BigWafer");
             _efemType = (EfemType)SC.GetValue<int>($"EFEM.EfemType");
 
-            _efem = new Efem();
+            _efem = new JetEfem();
 
             Name = ModuleName.EFEM.ToString();
 
+            _pickRoutine    = new EfemPickRoutine(_efem);
+            _placeRoutine   = new EfemPlaceRoutine(_efem);
+            _swapRoutine    = new EfemSwapRoutine(_efem);
+
             InitFsmMap();
         }
 
@@ -190,93 +200,64 @@ namespace Venus_RT.Modules
             fsm = new StateMachine<EfemEntity>("EFEM", (int)STATE.Unknown, 50);
             fsm.EnableRepeatedMsg(true);
 
-            AnyStateTransition(FSM_MSG.TIMER,                       fnMonitor, FSM_STATE.SAME);
-            AnyStateTransition(MSG.RecHwMsg,                        fnRecMsg, FSM_STATE.SAME);
-            //AnyStateTransition(MSG.LED,                             fnSetLED, STATE.SettingLamp);
-            AnyStateTransition(MSG.TurnOffBuzzer, fnTurnOffBuzzer, FSM_STATE.SAME);
-            //AnyStateTransition(MSG.SwitchOnBuzzerAndRed,            fnSwitchOnBuzzerAndRed, FSM_STATE.SAME);
-            AnyStateTransition(MSG.Recover,                         fnRecover, STATE.Idle);
-            AnyStateTransition(MSG.Error,                           fnError, STATE.Error);
-            AnyStateTransition(MSG.Online,                          fnOnline, FSM_STATE.SAME);
-            AnyStateTransition(MSG.Abort,                           fnAbortRobot, STATE.Idle);
-            AnyStateTransition(MSG.ToInit, fnToInit, STATE.Init);
-
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Initializing, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.InitingRB,    fnEnterExecute, FSM_MSG.NONE, null);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.InitingAL,    fnEnterExecute, FSM_MSG.NONE, null);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Picking,      fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Gotoing,      fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Placing,      fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Swapping,     fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Extending,    fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Retracting,   fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Lifting,      fnEnterExecute, FSM_MSG.NONE, null);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Aligning,     fnEnterExecute, FSM_MSG.NONE, null);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Mapping,      fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Gripping,     fnEnterExecute, FSM_MSG.NONE, null);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Ungripping,   fnEnterExecute, FSM_MSG.NONE, null);
-            EnterExitTransition<STATE, FSM_MSG>(STATE.Fliping,      fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
-
-            Transition(STATE.Unknown, MSG.CommReady,                null, STATE.Init);
+            AnyStateTransition(FSM_MSG.TIMER,               fnMonitor,          FSM_STATE.SAME);
+            AnyStateTransition(MSG.TurnOffBuzzer,           fnTurnOffBuzzer,    FSM_STATE.SAME);
+            AnyStateTransition(MSG.Recover,                 fnRecover,          STATE.Idle);
+            AnyStateTransition(MSG.Error,                   fnError,            STATE.Error);
+            AnyStateTransition(MSG.Online,                  fnOnline,           FSM_STATE.SAME);
+            AnyStateTransition(MSG.Abort,                   fnAbortRobot,       STATE.Idle);
+            AnyStateTransition(MSG.ToInit,                  fnToInit,           STATE.Init);
+
+
+            Transition(STATE.Unknown,       MSG.CommReady,          null,               STATE.Init);
 
             // Home
-            Transition(STATE.Init, MSG.HomeAll,                     fnHomeAll, STATE.Initializing);
-            Transition(STATE.Idle, MSG.HomeAll,                     fnHomeAll, STATE.Initializing);    // 暂时加,出错的时候做 HOME
-            Transition(STATE.Initializing, MSG.ActionDone,          null, STATE.Orgshing);
-            Transition(STATE.Orgshing, MSG.ActionDone,              fnActionDone, STATE.Idle);
-            Transition(STATE.Idle, MSG.HomeRB,                      fnHomeRobot, STATE.InitingRB);
-            Transition(STATE.InitingRB, MSG.ActionDone,             null, STATE.Idle);
-            //Transition(STATE.SettingLamp, MSG.ActionDone,           fnSetLampDone, STATE.Idle);
-
-            // Pick
-            Transition(STATE.Idle, MSG.Pick,                        fnPick, STATE.Picking);
-            Transition(STATE.Picking, MSG.ActionDone,               fnActionDone, STATE.Idle);
-            Transition(STATE.Picking, MSG.PMLiftPinUp,              fnPmPinUp, STATE.Idle);
-            Transition(STATE.Picking, MSG.PMLiftPinDown,            fnPmPinDown, STATE.Idle);
-            
-            // Place
-            Transition(STATE.Idle, MSG.Place,                       fnPlace, STATE.Placing);
-            Transition(STATE.Placing, MSG.ActionDone,               fnActionDone, STATE.Idle);
-            Transition(STATE.Placing, MSG.PMLiftPinUp,              fnPmPinUp, STATE.Idle);
-            Transition(STATE.Placing, MSG.PMLiftPinDown,            fnPmPinDown, STATE.Idle);
-
-            // PickAndPlace
-            Transition(STATE.Idle, MSG.PickAndPlace, fnSwap, STATE.Swapping);
-            Transition(STATE.Swapping, MSG.ActionDone, fnActionDone, STATE.Idle);
-            Transition(STATE.Swapping, MSG.PMLiftPinUp, fnPmPinUp, STATE.Idle);
-            Transition(STATE.Swapping, MSG.PMLiftPinDown, fnPmPinDown, STATE.Idle);
-            
-            // Goto
-            Transition(STATE.Idle, MSG.Goto, fnGoto, STATE.Gotoing);
-            Transition(STATE.Gotoing, MSG.ActionDone, fnActionDone, STATE.Idle);
+            Transition(STATE.Init,          MSG.HomeAll,            fnHomeAll,          STATE.Initializing);
+            Transition(STATE.Idle,          MSG.HomeAll,            fnHomeAll,          STATE.Initializing);    // 暂时加,出错的时候做 HOME
+            Transition(STATE.Initializing,  MSG.ActionDone,         null, STATE.        Orgshing);
+            Transition(STATE.Orgshing,      MSG.ActionDone,         fnActionDone,       STATE.Idle);
+            Transition(STATE.Idle,          MSG.HomeRB,             fnHomeRobot,        STATE.InitingRB);
+            Transition(STATE.InitingRB,     MSG.ActionDone,         null,               STATE.Idle);
+
+            // Pick wafer
+            Transition(STATE.Idle,          MSG.Pick,               FnStartPick,        STATE.Picking);
+            Transition(STATE.Picking,       FSM_MSG.TIMER,          FnPickTimeout,      STATE.Idle);
+            Transition(STATE.Picking,       MSG.Abort,              FnAbortPick,        STATE.Idle);
+
+            // Place wafer
+            Transition(STATE.Idle,          MSG.Place,              FnStartPlace,       STATE.Placing);
+            Transition(STATE.Placing,       FSM_MSG.TIMER,          FnPlaceTimeout,     STATE.Idle);
+            Transition(STATE.Placing,       MSG.Abort,              FnAbortPlace,       STATE.Idle);
+
+            // Swap wafer with LL sequence
+            Transition(STATE.Idle,          MSG.Swap,               FnStartSwap,        STATE.Swapping);
+            Transition(STATE.Swapping,      FSM_MSG.TIMER,          FnSwapTimeout,      STATE.Idle);
+            Transition(STATE.Swapping,      MSG.Abort,              FnAbortSwap,        STATE.Idle);
 
-            // Extend
-            Transition(STATE.Idle, MSG.Extend,                      fnExtend, STATE.Extending);
-            Transition(STATE.Extending, MSG.ActionDone,             fnActionDone, STATE.Idle);
+            // Goto
+            Transition(STATE.Idle,          MSG.Goto,               fnGoto,             STATE.Gotoing);
+            Transition(STATE.Gotoing,       MSG.ActionDone,         fnActionDone,       STATE.Idle);
 
-            // Retract
-            Transition(STATE.Idle, MSG.Retract,                     fnRetract, STATE.Retracting);
-            Transition(STATE.Retracting, MSG.ActionDone,            fnActionDone, STATE.Idle);
 
             // Map
-            Transition(STATE.Idle, MSG.Map,                         fnMap, STATE.Mapping);
-            Transition(STATE.Mapping, MSG.ActionDone,               fnActionDone, STATE.Idle);
+            Transition(STATE.Idle,          MSG.Map,                fnMap,              STATE.Mapping);
+            Transition(STATE.Mapping,       MSG.ActionDone,         fnActionDone,       STATE.Idle);
 
             // Grip
-            Transition(STATE.Idle, MSG.Grip, fnGrip, STATE.Gripping);
-            Transition(STATE.Gripping, MSG.ActionDone, fnActionDone, STATE.Idle);
+            Transition(STATE.Idle,          MSG.Grip,               fnGrip,             STATE.Gripping);
+            Transition(STATE.Gripping,      MSG.ActionDone,         fnActionDone,       STATE.Idle);
 
             // Ungrip
-            Transition(STATE.Idle, MSG.Ungrip, fnUngrip, STATE.Ungripping);
-            Transition(STATE.Ungripping, MSG.ActionDone, fnActionDone, STATE.Idle);
+            Transition(STATE.Idle,          MSG.Ungrip,             fnUngrip,           STATE.Ungripping);
+            Transition(STATE.Ungripping,    MSG.ActionDone,         fnActionDone,       STATE.Idle);
 
             // Aligner
-            Transition(STATE.Idle,      MSG.HomeAL,                 fnHomeAligner,  STATE.InitingAL);
-            Transition(STATE.InitingAL, MSG.ActionDone,             fnActionDone,   STATE.Idle);
-            Transition(STATE.Idle,      MSG.Lift,                   fnLift,         STATE.Lifting);
-            Transition(STATE.Lifting,   MSG.LiftActionDone,         fnActionDone,   STATE.Idle);
-            Transition(STATE.Idle,      MSG.Align,                  fnAlign,        STATE.Aligning);
-            Transition(STATE.Aligning,  MSG.ActionDone,             fnActionDone,   STATE.Idle);
+            Transition(STATE.Idle,          MSG.HomeAL,             fnHomeAligner,      STATE.InitingAL);
+            Transition(STATE.InitingAL,     MSG.ActionDone,         fnActionDone,       STATE.Idle);
+            Transition(STATE.Idle,          MSG.Lift,               fnLift,             STATE.Lifting);
+            Transition(STATE.Lifting,       MSG.LiftActionDone,     fnActionDone,       STATE.Idle);
+            Transition(STATE.Idle,          MSG.Align,              fnAlign,            STATE.Aligning);
+            Transition(STATE.Aligning,      MSG.ActionDone,         fnActionDone,       STATE.Idle);
 
 
             EnumLoop<STATE>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
@@ -286,7 +267,6 @@ namespace Venus_RT.Modules
 
         private bool fnHomeAll(object[] param)
         {
-            _efem.ClearActions();
             _efem.HomeAll();
             return true;
         }
@@ -314,71 +294,17 @@ namespace Venus_RT.Modules
 
         private bool fnEnterExecute(object[] param)
         {
-            _efem.ExecuteAction();
             return false;
         }
 
         private bool fnExitExecute(object[] param)
         {
-            _efem.ExecuteAction();
             return false;
         }
 
         private bool fnActionDone(object[] param)
         {
-            try
-            {
-                EfemOperation actionType = (EfemOperation)param[0];
-
-                if ((actionType == EfemOperation.Orgsh || actionType == EfemOperation.Home) && (fsm.State == (int)STATE.Orgshing))
-                {
-                    if (_efem.HasActions)
-                    {
-                        _efem.ExecuteAction();
-                        return false;
-                    }
-                }
-
-                    if (actionType == EfemOperation.Extend)
-                {
-                    if (fsm.State == (int)STATE.Placing)
-                    {
-                        _efem.ExecuteAction();
-                        return false;
-                    }
-                    else if (fsm.State == (int)STATE.Picking)
-                    {
-                        if (_efem.HasActions)
-                        {
-                            _efem.ExecuteAction();
-                            return false;
-                        }
-                        else
-                        {
-                            return true;
-                        }
-                    }
-                    else if (fsm.State == (int)STATE.Swapping)
-                    {
-                        if (_efem.HasActions)
-                        {
-                            _efem.ExecuteAction();
-                            return false;
-                        }
-                        else
-                        {
-                            return true;
-                        }
-                    }
-                }
-
-                return true;
-            }
-            catch (Exception ex)
-            {
-                EV.PostAlarmLog(ModuleName.EFEM.ToString(), ex.Message);
-                return true;
-            }
+            return false;
         }
 
         public bool CheckToPostMessage(int msg, params object[] args)
@@ -395,19 +321,6 @@ namespace Venus_RT.Modules
             return true;
         }
 
-        private bool fnRecMsg(object[] param)
-        {
-            if (param == null) return false;
-            string strHwMsg = param[0] as string;
-
-            if (_efem is EfemBase device)
-            {
-                device.ReceiveMessage(strHwMsg);
-                return true;
-            }
-            return false;
-        }
-
         private bool fnMonitor(object[] param)
         {
             STATE curSt = (STATE)fsm.State;
@@ -471,7 +384,6 @@ namespace Venus_RT.Modules
 
         private bool fnRecover(object[] param)
         {
-            _efem.ClearActions();
             _efem.ClearError();
             //_efem.ExecuteAction();
             return true;
@@ -479,8 +391,6 @@ namespace Venus_RT.Modules
 
         private bool fnAbortRobot(object[] param)
         {
-            _efem.ClearActions();
-            _efem.AbortRobot();
             //_efem.ExecuteAction();
             return true;
         }
@@ -496,7 +406,6 @@ namespace Venus_RT.Modules
 
         private bool fnTurnOffBuzzer(object[] param)
         {
-            _efem.TurnOffBuzzer();
             return false;
         }
 
@@ -509,197 +418,79 @@ namespace Venus_RT.Modules
 
         private bool fnSetLampDone(object[] param)
         {
-            if (_efem.HasActions)
-            {
-                _efem.ExecuteAction();
-                return false;
-            }
-            else
             {
                 return true;
             }
         }
 
-        private bool fnPick(object[] param)
+        private bool FnStartPick(object[] param)
         {
-            // module
-            ModuleName unit = ModuleName.EFEM;
-            if (param[0] is string s1)
-                unit = ModuleNameString.ToEnum(s1);
-            else if (param[0] is ModuleName mod)
-                unit = mod;
-            else
-                throw new ArgumentException("Argument error");
-
-            // slot
-            byte slot = (byte)(int)param[1];
-
-            // hand
-            Hand arm = (Hand)Enum.Parse(typeof(Hand),  param[2].ToString());
+            return _pickRoutine.Start(param) == RState.Running;
+        }
 
-            // wafer size
-            WaferSize ws1 = WaferSize.WS0;
-            if (param[3] is string s2)
-            {
-                if (Enum.TryParse(s2, out WaferSize p5))
-                    ws1 = p5;
-            }
-            else if (param[3] is WaferSize p6)
+        private bool FnPickTimeout(object[] param)
+        {
+            RState ret = _pickRoutine.Monitor();
+            if (ret == RState.Failed || ret == RState.Timeout)
             {
-                ws1 = p6;
+                PostMsg(MSG.Error);
+                return false;
             }
 
-            MoveParam mp = new MoveParam(unit, slot, ModuleName.EfemRobot, (byte)arm, arm, ws1);
-            if (!_efem.Pick(mp))
-                return false;
+            return ret == RState.End;
+        }
 
+        private bool FnAbortPick(object[] param)
+        {
+            _pickRoutine.Abort();
             return true;
         }
-
-        private bool fnPlace(object[] param)
+        private bool FnStartPlace(object[] param)
         {
-            // module
-            ModuleName unit = ModuleName.EFEM;
-            if (param[0] is string s1)
-                unit = ModuleNameString.ToEnum(s1);
-            else if (param[0] is ModuleName mod)
-                unit = mod;
-            else
-                throw new ArgumentException("Argument error");
-
-            // slot
-            byte slot = (byte)(int)param[1];
-
-            // hand
-            Hand arm = (Hand)Enum.Parse(typeof(Hand), param[2].ToString());
+            return _placeRoutine.Start(param) == RState.Running;
+        }
 
-            // wafer size
-            WaferSize ws1 = WaferSize.WS0;
-            if (param[3] is string s2)
-            {
-                if (Enum.TryParse(s2, out WaferSize p5))
-                    ws1 = p5;
-            }
-            else if (param[3] is WaferSize p6)
+        private bool FnPlaceTimeout(object[] param)
+        {
+            RState ret = _placeRoutine.Monitor();
+            if (ret == RState.Failed || ret == RState.Timeout)
             {
-                ws1 = p6;
+                PostMsg(MSG.Error);
+                return false;
             }
 
-            MoveParam mp = new MoveParam(ModuleName.EfemRobot, (byte)arm, unit, slot, arm, ws1);
-            if (!_efem.Place(mp))
-                return false;
-		   
-            return true;
+            return ret == RState.End;
         }
 
-        private bool fnGoto(object[] param)
+        private bool FnAbortPlace(object[] param)
         {
-            // module
-            ModuleName unit = ModuleName.EFEM;
-            if (param[0] is string s1)
-                unit = ModuleNameString.ToEnum(s1);
-            else if (param[0] is ModuleName mod)
-                unit = mod;
-            else
-                throw new ArgumentException("Argument error");
-
-            // slot
-            byte slot = (byte)(int)param[1];
-
-
-            Hand arm = Hand.Blade1;
-
-            WaferSize ws = WaferSize.WS6;
-
-            if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0))
-            {
-                arm = Hand.Blade1;
-                ws = WaferManager.Instance.GetWafer(ModuleName.EfemRobot, 0).Size;
-            }
-            else if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 1))
-            {
-                arm = Hand.Blade2;
-                ws = WaferManager.Instance.GetWafer(ModuleName.EfemRobot, 1).Size;
-            }
-
-            MoveParam mp = new MoveParam(unit, slot, unit, slot, arm, ws);
-            _efem.Goto(mp);
+            _placeRoutine.Abort();
             return true;
         }
 
-        private bool fnSwap(object[] param)
+        private bool FnStartSwap(object[] param)
         {
-            // module
-            ModuleName unit = ModuleName.EFEM;
-            if (param[0] is string s1)
-                unit = ModuleNameString.ToEnum(s1);
-            else if (param[0] is ModuleName mod)
-                unit = mod;
-            else
-                throw new ArgumentException("Argument error");
-
-            // pickSlot
-            byte pickSlot = (byte)(int)param[1];
-
-            // pick hand
-            Hand pickArm = (Hand)Enum.Parse(typeof(Hand), param[2].ToString());
+            return _swapRoutine.Start(param) == RState.Running;
+        }
 
-            // wafer size
-            WaferSize ws1 = WaferSize.WS0;
-            if (param[5] is string s2)
-            {
-                if (Enum.TryParse(s2, out WaferSize p5))
-                    ws1 = p5;
-            }
-            else if (param[5] is WaferSize p6)
+        private bool FnSwapTimeout(object[] param)
+        {
+            RState ret = _swapRoutine.Monitor();
+            if (ret == RState.Failed || ret == RState.Timeout)
             {
-                ws1 = p6;
+                PostMsg(MSG.Error);
+                return false;
             }
 
-            MoveParam pickParam = new MoveParam(unit, pickSlot, ModuleName.EfemRobot, (byte)pickArm, pickArm, ws1);
-
-            // place slot
-            byte placeSlot = (byte)(int)param[4];
-
-            // hand
-            Hand placeArm = (Hand)Enum.Parse(typeof(Hand), param[3].ToString());
- 
-            MoveParam placeParam = new MoveParam(ModuleName.EfemRobot, (byte)placeArm, unit, placeSlot, placeArm, ws1);
-
-            _efem.PickAndPlace(pickParam, placeParam);
-            return true;
+            return ret == RState.End;
         }
 
-
-        
-
-        private bool fnExtend(object[] param)
+        private bool FnAbortSwap(object[] param)
         {
-            // module
-            ModuleName unit = ModuleName.EFEM;
-            if (param[0] is string s1)
-                unit = ModuleNameString.ToEnum(s1);
-            else if (param[0] is ModuleName mod)
-                unit = mod;
-            else
-                throw new ArgumentException("Argument error");
-
-            Hand arm = (Hand)Enum.Parse(typeof(Hand), (string)param[2]);
-
-            ExtendParam mp = new ExtendParam
-            {
-                Module = unit,
-                Arm = arm,
-                Pos = (ExtendPos)Enum.Parse(typeof(ExtendPos), param[1] as string)
-            };
-
-            if (!_efem.Extend(mp))
-                return false;
-
+            _swapRoutine.Abort();
             return true;
         }
-
-        private bool fnRetract(object[] param)
+        private bool fnGoto(object[] param)
         {
             // module
             ModuleName unit = ModuleName.EFEM;
@@ -710,49 +501,10 @@ namespace Venus_RT.Modules
             else
                 throw new ArgumentException("Argument error");
 
-            Hand arm = (Hand)Enum.Parse(typeof(Hand), (string)param[2]);
-
-            ExtendParam mp = new ExtendParam
-            {
-                Module = unit,
-                Arm = arm,
-                Pos = (ExtendPos)Enum.Parse(typeof(ExtendPos), param[1] as string)
-            };
-
-            if (!_efem.Retract(mp))
-                return false;
-
+            _efem.Goto(unit);
             return true;
         }
 
-        private bool fnPmPinUp(object[] param)
-        {
-            _efem.UpdateStatus((ushort)param[0], ActionStatus.Completed);
-            if (_efem.HasActions)
-            {
-                _efem.ExecuteAction();
-                return false;
-            }
-            else
-            {
-                return true;
-            }
-        }
-
-        private bool fnPmPinDown(object[] param)
-        {
-            _efem.UpdateStatus((ushort)param[0], ActionStatus.Completed);
-            if (_efem.HasActions)
-            {
-                _efem.ExecuteAction();
-                return false;
-            }
-            else
-            {
-                return true;
-            }
-        }
-
         private bool fnLift(object[] param)
         {
             // module
@@ -944,8 +696,8 @@ namespace Venus_RT.Modules
 
         public int InvokePickAndPlace(ModuleName targetModule, Hand pickHand, int pickSlot,  Hand placeHand, int placeSlot, WaferSize size)
         {
-            if (CheckToPostMessage((int)MSG.PickAndPlace, targetModule, pickSlot, pickHand, placeHand, placeSlot, size))
-                return (int)MSG.PickAndPlace;
+            if (CheckToPostMessage((int)MSG.Swap, targetModule, pickSlot, pickHand, placeHand, placeSlot, size))
+                return (int)MSG.Swap;
 
             return (int)FSM_MSG.NONE;
         }
@@ -968,16 +720,16 @@ namespace Venus_RT.Modules
 
         public bool IsPrepareTransferReady(ModuleName module, EnumTransferType type, int slot)
         {
-            if (type == EnumTransferType.Pick)
-            {
-                //需要补充:判断LP 放好了,而且已经map过。
-                return _efem[module].HasCassette && _efem[module].IsMapped;
-            }
-            else if (type == EnumTransferType.Place)
-            {
-                //需要补充:判断LP 放好了,而且已经map过。
-                return _efem[module].HasCassette && _efem[module].IsMapped;
-            }
+            //if (type == EnumTransferType.Pick)
+            //{
+            //    //需要补充:判断LP 放好了,而且已经map过。
+            //    return _efem[module].HasCassette && _efem[module].IsMapped;
+            //}
+            //else if (type == EnumTransferType.Place)
+            //{
+            //    //需要补充:判断LP 放好了,而且已经map过。
+            //    return _efem[module].HasCassette && _efem[module].IsMapped;
+            //}
 
             return false;
         }
@@ -990,21 +742,24 @@ namespace Venus_RT.Modules
 
         internal bool CheckReadyTransfer(ModuleName module)
         {
-            return _efem[module].HasCassette && _efem[module].IsMapped;
+            //return _efem[module].HasCassette && _efem[module].IsMapped;
+            return true;
         }
         internal bool CheckPlaced(ModuleName module)
         {
-            return _efem[module].HasCassette;
+            //return _efem[module].HasCassette;
+            return true;
         }
 		
         internal void NoteJobStart(ModuleName module)
         {
-            _efem[module].NoteJobStart();
+            //_efem[module].NoteJobStart();
+
         }
 
         internal void NoteJobComplete(ModuleName module)
         {
-            _efem[module].NoteJobComplete();
+            //_efem[module].NoteJobComplete();
         }
     }
 
@@ -1035,11 +790,11 @@ namespace Venus_RT.Modules
             Error            // 7
         }
 
-        private readonly Efem _efem;
+        private readonly EfemBase _efem;
 
         private ModuleName Module { get; }
 
-        public LoadportEntity(ModuleName mod, Efem efem)
+        public LoadportEntity(ModuleName mod, EfemBase efem)
         {
             this.Module = mod;
             _efem = efem;
@@ -1089,7 +844,7 @@ namespace Venus_RT.Modules
         private bool fnOnline(object[] param)
         {
             bool online = (bool)param[0];
-            _efem.SetOnline(Module, online);
+            //_efem.SetOnline(Module, online);
             return true;
         }
 
@@ -1113,7 +868,6 @@ namespace Venus_RT.Modules
 
         private bool fnEnterExecute(object[] param)
         {
-            _efem.ExecuteAction();
             return true;
         }
 

+ 6 - 5
Venus/Venus_RT/Modules/LPs/LoadPortModule.cs

@@ -9,6 +9,7 @@ using MECF.Framework.Common.Schedulers;
 using MECF.Framework.RT.ModuleLibrary.LPModules;
 using System;
 using Aitex.Core.RT.SCCore;
+using Venus_RT.Devices;
 using Venus_RT.Devices.EFEM;
 using Venus_Core;
 
@@ -73,7 +74,7 @@ namespace Venus_RT.Modules.LPs
             WriteTagData,
         }
 
-        private readonly Efem _efem;
+        private readonly EfemBase _efem;
 
 
         private Loadport _lpDevice;
@@ -114,7 +115,7 @@ namespace Venus_RT.Modules.LPs
 
         //private bool _isInit;
 
-        public LoadPortModule(ModuleName module, Efem efem) : base(SC.GetValue<int>("EFEM.LoadPort.SlotNumber"))
+        public LoadPortModule(ModuleName module, EfemBase efem) : base(SC.GetValue<int>("EFEM.LoadPort.SlotNumber"))
         {
             Name = module.ToString();
 
@@ -445,7 +446,7 @@ namespace Venus_RT.Modules.LPs
         private bool fnOnline(object[] param)
         {
             bool online = (bool)param[0];
-            _efem.SetOnline(ModuleHelper.Converter(Module), online);
+            //_efem.SetOnline(ModuleHelper.Converter(Module), online);
             return true;
         }
 
@@ -455,12 +456,12 @@ namespace Venus_RT.Modules.LPs
             if (type == EnumTransferType.Pick)
             {
                 //需要补充:判断LP 放好了,而且已经map过。
-                return _efem[module].HasCassette && _efem[module].IsMapped && _efem[module].IsThicknessValid;
+                //return _efem[module].HasCassette && _efem[module].IsMapped && _efem[module].IsThicknessValid;
             }
             else if (type == EnumTransferType.Place)
             {
                 //需要补充:判断LP 放好了,而且已经map过。
-                return _efem[module].HasCassette && _efem[module].IsMapped && _efem[module].IsThicknessValid;
+                //return _efem[module].HasCassette && _efem[module].IsMapped && _efem[module].IsThicknessValid;
             }
 
             return false;

+ 0 - 2
Venus/Venus_RT/Modules/PMs/GasBoxLeakCheckRoutine.cs

@@ -21,8 +21,6 @@ namespace Venus_RT.Modules.PMs
         }
         public double LeakRate { get; private set; }
 
-        private readonly double _GasFlow = 1.0;
-
         private int _basePressure = 100;
         private int _leakcheckPumpTime = 180;
         private int _leakcheckHoldTime = 300;

+ 0 - 2
Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs

@@ -47,7 +47,6 @@ namespace Venus_RT.Modules.PMs
         private int _loopStartStep = 0;
         private int _loopCounter = 0;
         private int _recipeRunningMode = 0;
-        private JetPMBase _chamber;
         private Stopwatch _stepTime = new Stopwatch();
 
         public RecipeResult currentRecipeResult;
@@ -97,7 +96,6 @@ namespace Venus_RT.Modules.PMs
             Name = "Process";
             _pumpDownRoutine = pdRoutine;
             _processHelper = new ProcessHelper(chamber);
-            _chamber=chamber;
         }
 
         private bool AssignFuns(Recipe recipe)

+ 5 - 0
Venus/Venus_RT/Modules/RouteManager.cs

@@ -221,6 +221,11 @@ namespace Venus_RT.Modules
 
             return null;
         }
+
+        public TMEntity GetTM()
+        {
+            return TM;
+        }
     
 
         protected override bool Init()

+ 1 - 1
Venus/Venus_RT/Modules/Schedulers/SchedulerAligner.cs

@@ -136,7 +136,7 @@ namespace Venus_RT.Modules.Schedulers
                         _timerDelay.Stop();
                     }
 
-                    ret = !_timerDelay.IsRunning && _timerCooling.IsTimeout() && /* _entity.CheckAcked(_token) &&*/ _entity.IsIdle && !_entity.EfemDevice.IsBufferPinUp[Module];
+                    ret = !_timerDelay.IsRunning && _timerCooling.IsTimeout() && /* _entity.CheckAcked(_token) &&*/ _entity.IsIdle /*&& !_entity.EfemDevice.IsBufferPinUp[Module]*/;
                     break;
                 case TaskType.Cooling:
                     if (_timerDelay.IsRunning && _timerDelay.ElapsedMilliseconds > _coolingDelayTime * 1000)

+ 14 - 6
Venus/Venus_RT/Modules/TM/TMEntity.cs

@@ -88,6 +88,9 @@ namespace Venus_RT.Modules
             get { return !IsInit && !IsError && !IsIdle; }
         }
 
+        public bool IsLLSlitDoorClosed(ModuleName ll) => ll == ModuleName.LLA ? _tm.IsLLAESlitDoorClosed : _tm.IsLLBESlitDoorClosed;
+        public bool IsLLSlitDoorOpen(ModuleName ll) => ll == ModuleName.LLA ? _tm.IsLLAESlitDoorOpen : _tm.IsLLBESlitDoorOpen;
+
         public bool IsOnline { get; internal set; }
 
         private readonly JetTM _tm;
@@ -239,14 +242,14 @@ namespace Venus_RT.Modules
 
 
             //Retract
-            Transition(STATE.Idle, MSG.Retract, FnStartRetract, STATE.Retracting);
-            Transition(STATE.Retracting, FSM_MSG.TIMER, FnRetract, STATE.Idle);
-            Transition(STATE.Retracting, MSG.Abort, FnAbortRetract, STATE.Idle);
+            Transition(STATE.Idle,              MSG.Retract,        FnStartRetract,     STATE.Retracting);
+            Transition(STATE.Retracting,        FSM_MSG.TIMER,      FnRetract,          STATE.Idle);
+            Transition(STATE.Retracting,        MSG.Abort,          FnAbortRetract,     STATE.Idle);
 
             //Extend
-            Transition(STATE.Idle, MSG.Extend, FnStartExtend, STATE.Extending);
-            Transition(STATE.Extending, FSM_MSG.TIMER, FnExtend, STATE.Idle);
-            Transition(STATE.Extending, MSG.Abort, FnAbortExtend, STATE.Idle);
+            Transition(STATE.Idle,              MSG.Extend,         FnStartExtend,      STATE.Extending);
+            Transition(STATE.Extending,         FSM_MSG.TIMER,      FnExtend,           STATE.Idle);
+            Transition(STATE.Extending,         MSG.Abort,          FnAbortExtend,      STATE.Idle);
 
 
             Running = true;
@@ -608,6 +611,11 @@ namespace Venus_RT.Modules
             return true;
         }
 
+        public bool TurnEFEMSlitDoor(ModuleName loadlock, bool open, out string reason)
+        {
+            return _tm.TurnEFEMSlitDoor(loadlock, open, out reason);
+        }
+
         private void _debugRoutine()
         {
             int flag = 0;

+ 5 - 3
Venus/Venus_RT/Venus_RT.csproj

@@ -109,12 +109,11 @@
     <Compile Include="Devices\DataDefine.cs" />
     <Compile Include="Devices\DeviceManager.cs" />
     <Compile Include="Devices\EdwardsPump.cs" />
-    <Compile Include="Devices\EFEM\Efem.cs" />
-    <Compile Include="Devices\EFEM\EfemAction.cs" />
     <Compile Include="Devices\EFEM\EfemBase.cs" />
     <Compile Include="Devices\EFEM\EfemDevice.cs" />
     <Compile Include="Devices\EFEM\EfemInterface.cs" />
     <Compile Include="Devices\EFEM\EfemMessage.cs" />
+    <Compile Include="Devices\EFEM\JetEfem.cs" />
     <Compile Include="Devices\EFEM\Loadport.cs" />
     <Compile Include="Devices\EPD\Data\ByteReader.cs" />
     <Compile Include="Devices\EPD\Data\ByteStructConverter.cs" />
@@ -143,7 +142,6 @@
     <Compile Include="Devices\JetPMBase.cs" />
     <Compile Include="Devices\JetVenusPM.cs" />
     <Compile Include="Devices\JetKeplerPM.cs" />
-    <Compile Include="Devices\JetPM.cs" />
     <Compile Include="Devices\PendulumValve.cs" />
     <Compile Include="Devices\PlasmaController.cs" />
     <Compile Include="Devices\SkyPump.cs" />
@@ -169,6 +167,10 @@
     <Compile Include="Instances\ToolLoader.cs" />
     <Compile Include="Modules\AutoCycle.cs" />
     <Compile Include="Modules\EFEM\EfemEntity.cs" />
+    <Compile Include="Modules\EFEM\EfemHomeRoutine.cs" />
+    <Compile Include="Modules\EFEM\EfemPickRoutine.cs" />
+    <Compile Include="Modules\EFEM\EfemPlaceRoutine.cs" />
+    <Compile Include="Modules\EFEM\EfemSwapRoutine.cs" />
     <Compile Include="Modules\EntityTaskBase.cs" />
     <Compile Include="Modules\LLs\LLEntity.cs" />
     <Compile Include="Modules\LPs\LoadPortClampRoutine.cs" />