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