From f763c3070113f62167b6adcc3087226b5149e8c1 Mon Sep 17 00:00:00 2001 From: "SIC1016\\caipeilun" <905168240@qq.com> Date: Fri, 14 Aug 2026 18:22:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0load=E8=85=94=E9=A1=B6?= =?UTF-8?q?=E5=8D=87=E5=92=8C=E9=97=B8=E6=9D=BF=E9=98=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Config/TM/DeviceModelSystem.xml | 19 +- .../SicModules/Config/TM/IODefinePlatform.xml | 4 +- App/Modules/SicModules/LLs/LoadLockModule.cs | 56 +++++- .../LLs/Routines/LoadLockSlitValveRoutine.cs | 145 ++++++++++++++ App/Modules/SicModules/SicModules.csproj | 1 + App/SicSimulator/Instances/SimulatorSystem.cs | 29 ++- App/SicUI/Models/Maintenances/TM/TMView.xaml | 183 ++++++++++++++---- .../Models/Maintenances/TM/TMViewModel.cs | 61 +++--- 8 files changed, 396 insertions(+), 102 deletions(-) create mode 100644 App/Modules/SicModules/LLs/Routines/LoadLockSlitValveRoutine.cs diff --git a/App/Modules/SicModules/Config/TM/DeviceModelSystem.xml b/App/Modules/SicModules/Config/TM/DeviceModelSystem.xml index 944aa0f..b4b6f3a 100644 --- a/App/Modules/SicModules/Config/TM/DeviceModelSystem.xml +++ b/App/Modules/SicModules/Config/TM/DeviceModelSystem.xml @@ -110,11 +110,8 @@ - - - - + @@ -128,14 +125,9 @@ + - - - - - - @@ -152,10 +144,11 @@ - - - + + + + \ No newline at end of file diff --git a/App/Modules/SicModules/Config/TM/IODefinePlatform.xml b/App/Modules/SicModules/Config/TM/IODefinePlatform.xml index e4a433a..b2aba22 100644 --- a/App/Modules/SicModules/Config/TM/IODefinePlatform.xml +++ b/App/Modules/SicModules/Config/TM/IODefinePlatform.xml @@ -288,14 +288,14 @@ - + diff --git a/App/Modules/SicModules/LLs/LoadLockModule.cs b/App/Modules/SicModules/LLs/LoadLockModule.cs index edf75a1..606ef6c 100644 --- a/App/Modules/SicModules/LLs/LoadLockModule.cs +++ b/App/Modules/SicModules/LLs/LoadLockModule.cs @@ -1,7 +1,4 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Aitex.Core.RT.DataCenter; +using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Device; using Aitex.Core.RT.Event; using Aitex.Core.RT.Fsm; @@ -13,7 +10,12 @@ using Aitex.Core.Utilities; using Aitex.Sorter.Common; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Schedulers; +using SicModules.EFEMs.Routines; using SicModules.LLs.Routines; +using SicModules.TMs.Routines; +using System; +using System.Threading; +using System.Threading.Tasks; namespace SicModules.LLs { @@ -39,6 +41,8 @@ namespace SicModules.LLs Separating, Grouping, RotationHomeOffset, + OpenSlitValve, + CloseSlitValve, } public enum MSG @@ -63,6 +67,8 @@ namespace SicModules.LLs Separate, Group, RelativeHomeOffset, + OpenSlitValve, + CloseSlitValve, } @@ -167,6 +173,7 @@ namespace SicModules.LLs private LoadSeparateRoutine _loadSeparateRoutine; private LoadRotationHomeOffsetRoutine _loadRotationHomeOffsetRoutine; + private LoadLockSlitValveRoutine _slitValveRoutine; public LoadLockModule(ModuleName module) : base(1) @@ -217,6 +224,7 @@ namespace SicModules.LLs _loadLockGroupRoutine = new LoadLockGroupRoutine(module); _loadSeparateRoutine = new LoadSeparateRoutine(module); _loadRotationHomeOffsetRoutine = new LoadRotationHomeOffsetRoutine(); + _slitValveRoutine = new LoadLockSlitValveRoutine(); } private void InitDevice() @@ -243,7 +251,6 @@ namespace SicModules.LLs Transition(STATE.Error, MSG.Reset, FsmReset, STATE.Idle); - //PrepareTransfer Transition(STATE.Idle, MSG.PrepareTransfer, FsmStartPrepareTransfer, STATE.PrepareTransfer); Transition(STATE.PrepareTransfer, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle); @@ -273,6 +280,15 @@ namespace SicModules.LLs Transition(STATE.LeakCheck, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle); Transition(STATE.LeakCheck, MSG.Abort, FsmAbortTask, STATE.Idle); + //open SlitValve + Transition(STATE.Idle, MSG.OpenSlitValve, FsmStartOpenSlitValve, STATE.OpenSlitValve); + Transition(STATE.OpenSlitValve, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle); + Transition(STATE.OpenSlitValve, MSG.Abort, FsmAbortTask, STATE.Idle); + + //close SlitValve + Transition(STATE.Idle, MSG.CloseSlitValve, FsmStartCloseSlitValve, STATE.CloseSlitValve); + Transition(STATE.CloseSlitValve, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle); + Transition(STATE.CloseSlitValve, MSG.Abort, FsmAbortTask, STATE.Idle); //Separate Transition(STATE.Idle, MSG.Separate, FsmStartSeparate, STATE.Separating); @@ -331,6 +347,16 @@ namespace SicModules.LLs return CheckToPostMessage((int)MSG.CloseDoor); }); + OP.Subscribe($"{Name}.OpenSlitValve", (string cmd, object[] args) => + { + return CheckToPostMessage((int)MSG.OpenSlitValve); + }); + + OP.Subscribe($"{Name}.CloseSlitValve", (string cmd, object[] args) => + { + return CheckToPostMessage((int)MSG.CloseSlitValve); + }); + OP.Subscribe($"{Name}.Reset", (string cmd, object[] args) => { return CheckToPostMessage((int)MSG.Reset); @@ -693,6 +719,26 @@ namespace SicModules.LLs return false; } + private bool FsmStartOpenSlitValve(object[] param) + { + _slitValveRoutine.Init(true); + + Result ret = StartRoutine(_slitValveRoutine); + if (ret == Result.FAIL || ret == Result.DONE) + return false; + return ret == Result.RUN; + } + + private bool FsmStartCloseSlitValve(object[] param) + { + _slitValveRoutine.Init(false); + + Result ret = StartRoutine(_slitValveRoutine); + if (ret == Result.FAIL || ret == Result.DONE) + return false; + return ret == Result.RUN; + } + public override bool TransferHandoff(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason) { reason = string.Empty; diff --git a/App/Modules/SicModules/LLs/Routines/LoadLockSlitValveRoutine.cs b/App/Modules/SicModules/LLs/Routines/LoadLockSlitValveRoutine.cs new file mode 100644 index 0000000..69698a3 --- /dev/null +++ b/App/Modules/SicModules/LLs/Routines/LoadLockSlitValveRoutine.cs @@ -0,0 +1,145 @@ +using Aitex.Core.RT.Device; +using Aitex.Core.RT.Device.Unit; +using Aitex.Core.RT.Event; +using Aitex.Core.RT.Routine; +using Aitex.Core.RT.SCCore; +using MECF.Framework.Common.Equipment; +using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadLocks; +using SicModules.EFEMs.Routines; +using SicModules.TMs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace SicModules.LLs.Routines +{ + public class LoadLockSlitValveRoutine : LoadLockBaseRoutine + { + enum RoutineStep + { + ServoRoutine, + LiftRoutine, + CheckPressureCondition, + CheckPressure, + SetSlitValve, + CheckPressureCondition2, + TimeDlay1 + } + + private int _motionTimeout = 30; + private bool _paramIsOpen; //是否开门 + private SicTM _tm; + private IoSlitValve _slitvalveLoadLockLeft; + private LoadLockServoToRoutine _llServoToRoutine; + private LoadLockLiftRoutine _llLiftRoutine; + + public void Init(bool isOpen) + { + _paramIsOpen = isOpen; + Name = isOpen ? "Open Slit Valve" : "Close Slit Valve"; + } + + public LoadLockSlitValveRoutine() + { + Module = ModuleName.LoadLock.ToString(); + Name = "LoadLockSlitValue"; + _tm = DEVICE.GetDevice($"{ModuleName.System.ToString()}.{ModuleName.TM.ToString()}"); + _llServoToRoutine = new LoadLockServoToRoutine(ModuleName.LoadLock); + + _llLiftRoutine = new LoadLockLiftRoutine(); + _slitvalveLoadLockLeft = DEVICE.GetDevice("LoadLock.LoadLockLSideDoor"); + + } + + public override Result Start(params object[] objs) + { + Reset(); + if (_paramIsOpen) + { + //判断TM到LoadLock或者UnLoad的门是否关上 + if (!_tm.CheckSlitValveClose(ModuleName.LoadLock)) + { + EV.PostWarningLog(Module, $"can not open left slit valve,TM slit valve not closed, can not open at same time"); + return Result.FAIL; + } + + _motionTimeout = SC.GetValue("System.SlitValveMotionTimeout"); + + _llServoToRoutine.Init(SC.GetValue("LoadLock.AtmPressureBase")); + _llLiftRoutine.Init(false); + } + Notify("Start"); + return Result.RUN; + } + + public override Result Monitor() + { + try + { + //开门之前需要对两边腔体进行气压调节,降Lift + if (_paramIsOpen) + { + ExecuteRoutine((int)RoutineStep.ServoRoutine, _llServoToRoutine); + ExecuteRoutine((int)RoutineStep.LiftRoutine, _llLiftRoutine); + } + + SetSlitValve((int)RoutineStep.SetSlitValve, _paramIsOpen, _motionTimeout); + + TimeDelay((int)RoutineStep.TimeDlay1, 1); + + } + catch (RoutineBreakException) + { + return Result.RUN; + } + catch (RoutineFaildException) + { + return Result.FAIL; + } + + Notify("Finished"); + return Result.DONE; + + } + + public void SetSlitValve(int id, bool isOpen, int timeout) + { + Tuple ret = ExecuteAndWait(id, () => + { + Notify($"set left slit valve " + (isOpen ? "Open" : "Close")); + + if (!_slitvalveLoadLockLeft.SetSlitValve(isOpen, out string reason)) + { + Stop(reason); + return false; + } + + return true; + }, () => + { + return isOpen ? _slitvalveLoadLockLeft.IsOpen : _slitvalveLoadLockLeft.IsClose; + + }, timeout * 1000); + + if (ret.Item1) + { + if (ret.Item2 == Result.FAIL) + { + throw (new RoutineFaildException()); + } + else if (ret.Item2 == Result.TIMEOUT) //timeout + { + Stop($"can not complete in {timeout} seconds"); + throw (new RoutineFaildException()); + } + else + throw (new RoutineBreakException()); + } + } + + } +} diff --git a/App/Modules/SicModules/SicModules.csproj b/App/Modules/SicModules/SicModules.csproj index cba47ca..a85a6e2 100644 --- a/App/Modules/SicModules/SicModules.csproj +++ b/App/Modules/SicModules/SicModules.csproj @@ -98,6 +98,7 @@ + diff --git a/App/SicSimulator/Instances/SimulatorSystem.cs b/App/SicSimulator/Instances/SimulatorSystem.cs index d68c4f9..ac79526 100644 --- a/App/SicSimulator/Instances/SimulatorSystem.cs +++ b/App/SicSimulator/Instances/SimulatorSystem.cs @@ -736,35 +736,24 @@ namespace SicSimulator.Instances IO.DI["DI_ReactorBDoorClosed"].Value = IO.DO["DO_RectorBDoorClose"].Value; } - if (IO.DO["DO_UnloadStationDoorOpen"].Value != IO.DO["DO_UnloadStationDoorClose"].Value) - { - IO.DI["DI_UnloadStationDoorOpened"].Value = IO.DO["DO_UnloadStationDoorOpen"].Value; - IO.DI["DI_UnloadStationDoorClosed"].Value = IO.DO["DO_UnloadStationDoorClose"].Value; - } - if (IO.DO["DO_BufferStationDoorOpen"].Value != IO.DO["DO_BufferStationDoorClose"].Value) { IO.DI["DI_BufferStationDoorOpened"].Value = IO.DO["DO_BufferStationDoorOpen"].Value; IO.DI["DI_BufferStationDoorClosed"].Value = IO.DO["DO_BufferStationDoorClose"].Value; } - if (IO.DO["DO_UnloadSubStationDoorOpen"].Value != IO.DO["DO_UnloadSubStationDoorClose"].Value) - { - IO.DI["DI_UnloadSubStationDoorOpened"].Value = IO.DO["DO_UnloadSubStationDoorOpen"].Value; - IO.DI["DI_UnloadSubStationDoorClosed"].Value = IO.DO["DO_UnloadSubStationDoorClose"].Value; - } - if (IO.DO["DO_LoadLSideDoorOpen"].Value != IO.DO["DO_LoadLSideDoorClose"].Value) { IO.DI["DI_LoadLSideDoorOpened"].Value = IO.DO["DO_LoadLSideDoorOpen"].Value; IO.DI["DI_LoadLSideDoorClosed"].Value = IO.DO["DO_LoadLSideDoorClose"].Value; } - if (IO.DO["DO_LoadRSideDoorOpen"].Value != IO.DO["DO_LoadRSideDoorClose"].Value) + if (IO.DO["DO_LoadLidLock"].Value != IO.DO["DO_LoadLidUnlock"].Value) { - IO.DI["DI_LoadRSideDoorOpened"].Value = IO.DO["DO_LoadRSideDoorOpen"].Value; - IO.DI["DI_LoadRSideDoorClosed"].Value = IO.DO["DO_LoadRSideDoorClose"].Value; + IO.DI["DI_LoadLidLocked"].Value = IO.DO["DO_LoadLidLock"].Value; + IO.DI["DI_LoadLidUnlocked"].Value = IO.DO["DO_LoadLidUnlock"].Value; } + } private int time1 = 0; @@ -801,6 +790,16 @@ namespace SicSimulator.Instances IO.AI["AI_M60FlowRead"].Value = IO.AO[$"AO_M60FlowSetpoint"].Value; + if (IO.DO["DO_LoadLockWaferCYUP"].Value != IO.DO["DO_LoadLockWaferCYDown"].Value) + { + time1++; + if (time1 > 10) + { + time1 = 0; + IO.DI["DI_LoadLockWaferCYUPFB"].Value = IO.DO["DO_LoadLockWaferCYUP"].Value; + IO.DI["DI_LoadLockWaferCYDownFB"].Value = IO.DO["DO_LoadLockWaferCYDown"].Value; + } + } //if (IO.DO["DO_LoadLidLock"].Value != IO.DO["DO_LoadLidUnlock"].Value) //{ // time1++; diff --git a/App/SicUI/Models/Maintenances/TM/TMView.xaml b/App/SicUI/Models/Maintenances/TM/TMView.xaml index f6d87ae..7371ff5 100644 --- a/App/SicUI/Models/Maintenances/TM/TMView.xaml +++ b/App/SicUI/Models/Maintenances/TM/TMView.xaml @@ -1321,6 +1321,7 @@ + @@ -1729,46 +1730,162 @@ + Grid.Row="6" + Padding="5,1,0,1" + Background="{DynamicResource Table_BG_Title}" + BorderBrush="{DynamicResource Table_BD}" + BorderThickness="1,0,1,1"> + VerticalAlignment="Center" + lex:ResxLocalizationProvider.DefaultDictionary="lang_efemview" + FontFamily="Arial" + FontSize="12" + Foreground="{DynamicResource FG_Black}" + Text="{lex:Loc ID_TXT_Door}" + TextWrapping="Wrap" /> - + Grid.Row="6" + Grid.Column="1" + Padding="5,1,0,1" + Background="{DynamicResource Table_BG_Content}" + BorderBrush="{DynamicResource Table_BD}" + BorderThickness="0,0,0,1"> + - + Grid.Row="6" + Grid.Column="2" + Padding="5,1" + Background="{DynamicResource Table_BG_Content}" + BorderBrush="{DynamicResource Table_BD}" + BorderThickness="1,0,1,1"> + + + + + + + + + + + + + + + + + + + + diff --git a/App/SicUI/Models/Maintenances/TM/TMViewModel.cs b/App/SicUI/Models/Maintenances/TM/TMViewModel.cs index 63dd6a3..9a05e31 100644 --- a/App/SicUI/Models/Maintenances/TM/TMViewModel.cs +++ b/App/SicUI/Models/Maintenances/TM/TMViewModel.cs @@ -701,6 +701,18 @@ namespace SicUI.Client.Models.Platform.TM [Subscription("LoadLock.Status")] public string LLStatus { get; set; } + [Subscription("LoadLock.LLLift.UpSensor")] + public bool LoadLiftUpSensor { get; set; } + + [Subscription("LoadLock.LLLift.DownSensor")] + public bool LoadLiftDownSensor { get; set; } + + [Subscription("LoadLock.LoadLockLSideDoor.OpenFeedback")] + public bool LoadLockLSideDoorOpenSensor { get; set; } + + [Subscription("LoadLock.LoadLockLSideDoor.CloseFeedback")] + public bool LoadLockLSideDoorCloseSensor { get; set; } + [Subscription("LoadLock.LidState")] public string LLLidState { get; set; } @@ -1028,14 +1040,17 @@ namespace SicUI.Client.Models.Platform.TM TMProvider.Instance.Purge(module); } - public void LiftUp(string module) + + public void LLLiftUp() { - TMProvider.Instance.LiftUp(module); + InvokeClient.Instance.Service.DoOperation($"LoadLock.LLLift.MoveUp"); } - public void LiftDown(string module) + + public void LLLiftDown() { - TMProvider.Instance.LiftDown(module); + InvokeClient.Instance.Service.DoOperation($"LoadLock.LLLift.MoveDown"); } + public void OpenDoor(string module) { TMProvider.Instance.OpenDoor(module); @@ -1126,7 +1141,14 @@ namespace SicUI.Client.Models.Platform.TM InvokeClient.Instance.Service.DoOperation($"LoadLock.LoadLidLock.MoveDown"); } - + public void LoadOpenSlitValve() + { + InvokeClient.Instance.Service.DoOperation($"LoadLock.OpenSlitValve"); + } + public void LoadCloseSlitValve() + { + InvokeClient.Instance.Service.DoOperation($"LoadLock.CloseSlitValve"); + } #endregion #region ConfinementRing @@ -1153,34 +1175,5 @@ namespace SicUI.Client.Models.Platform.TM #endregion - - #region EFEM - [Subscription("EFEM.Status")] - public string EFEMStatus { get; set; } - - - [Subscription("EFEM.IsOnline")] - public bool EFEMIsOnline { get; set; } - public bool EFEMIsOffline => !EFEMIsOnline; - - public bool IsEFEMEnableManualOperation => !EFEMIsOnline && EFEMStatus == "Idle"; - - public void EFEMHomeRoutine(string module) - { - InvokeClient.Instance.Service.DoOperation($"{module}.Home"); - } - public void EFEMAbortRoutine(string module) - { - InvokeClient.Instance.Service.DoOperation($"{module}.Abort"); - } - public void SetModuleOnline(string module) - { - InvokeClient.Instance.Service.DoOperation($"{module}.SetOnline"); - } - public void SetModuleOffline(string module) - { - InvokeClient.Instance.Service.DoOperation($"{module}.SetOffline"); - } - #endregion } }