新增ModuleStatusIndicator控件,完善Interlock_Bypass功能。

1.全局Interlock_Bypass改为TM/PM1/PM2三组独立
2.Interlock_bypass时界面三角提示
3.bypass时,无法online,无法进行process,但可以进入processidle
This commit is contained in:
SIC1016\caipeilun 2023-08-31 15:43:26 +08:00
parent ada42c6aca
commit 97e4412900
6 changed files with 204 additions and 11 deletions

View File

@ -11,6 +11,8 @@ using Aitex.Core.Common.DeviceData;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Fsm;
using Aitex.Core.RT.IOCore;
using Aitex.Core.RT.IOCore.Interlock;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
@ -409,9 +411,24 @@ namespace SicModules.PMs
InitalDeviceFunc();
InitScChangeCallback();
return base.Initialize();
}
private void InitScChangeCallback()
{
// Bypass Interlock时自动Offline
SC.RegisterValueChangedCallback($"PM.{Module}.BypassInterlock", isBypassed =>
{
if (isBypassed is true && IsOnline)
{
PutOffline();
EV.PostWarningLog(Module, "Offline automatically due to interlock bypassed");
}
});
}
private void InitRoutine()
{
_purgeRoutine = new PMPurgeRoutine(ModuleHelper.Converter(Module), this);
@ -461,6 +478,7 @@ namespace SicModules.PMs
DATA.Subscribe($"{Module}.IsAlarm", () => IsAlarm);
DATA.Subscribe($"{Module}.IsWarning", () => IsWarning);
DATA.Subscribe($"{Module}.IsIdle", () => !IsWarning && (IsIdle || IsInit || IsSafety));
DATA.Subscribe($"{Module}.IsInterlockBypassed", () => IsInterlockBypassed);
DATA.Subscribe($"{Module}.WaferSize", () => WaferManager.Instance.GetWaferSize(_module, 0).ToString());
@ -1132,19 +1150,25 @@ namespace SicModules.PMs
private bool FsmToService(object[] param)
{
if (IsOnline)
{
return false;
}
else
{
if (IsServiceIdle)
{
// 如果退出Service模式需要检查Interlock是否启用如果未启用不能退出Service模式
DoIfInterlockNotBypassed(() => { IsServiceIdle = false; });
DoIfInterlockNotBypassed(() =>
{
IsServiceIdle = false;
// 如果退出Service模式Interlock信息以Warning等级输出
Singleton<InterlockManager>.Instance.SetEventLevel(Module, false);
});
}
else
{
IsServiceIdle = true;
// 如果退出Service模式Interlock信息以Info等级输出
Singleton<InterlockManager>.Instance.SetEventLevel(Module, true);
}
}
return true;
@ -1215,6 +1239,12 @@ namespace SicModules.PMs
// return false;
//}
if (IsInterlockBypassed)
{
EV.PostWarningLog(Module, $"Interlock bypassed, unable to start process");
return false;
}
_preprocessRoutine.Init((string)param[0], (bool)param[1], (bool)param[2]);
Result ret = StartRoutine(_preprocessRoutine);
if (ret == Result.FAIL || ret == Result.DONE)
@ -1608,6 +1638,7 @@ namespace SicModules.PMs
return false;
}
// 检查互锁如果互锁旁路则不能Online
DoIfInterlockNotBypassed(() =>
{

View File

@ -222,7 +222,7 @@ namespace SicModules.TMs
}
}
//检查InterLock
if (!SC.GetConfigItem("System.BypassInterlock").BoolValue && (module == ModuleName.PM1 || module == ModuleName.PMA) )
if (!SC.GetConfigItem($"PM.PM1.BypassInterlock").BoolValue && (module == ModuleName.PM1 || module == ModuleName.PMA))
{
if (!isOpen)
{
@ -234,7 +234,7 @@ namespace SicModules.TMs
}
}
if (!SC.GetConfigItem("System.BypassInterlock").BoolValue && (module == ModuleName.PM2 || module == ModuleName.PMB))
if (!SC.GetConfigItem("PM.PM2.BypassInterlock").BoolValue && (module == ModuleName.PM2 || module == ModuleName.PMB))
{
if (!isOpen)
{

View File

@ -84,7 +84,7 @@ namespace SicModules.TMs
ToInit,
};
public bool IsInterlockBypassed => SC.GetValue<bool>($"TM.BypassInterlock");
public bool IsAlarm
{
@ -241,9 +241,25 @@ namespace SicModules.TMs
InitData();
InitScChangeCallback();
return base.Initialize();
}
private void InitScChangeCallback()
{
// Bypass Interlock时自动Offline
SC.RegisterValueChangedCallback($"TM.BypassInterlock", isBypassed =>
{
if (isBypassed is true && IsOnline)
{
PutOffline();
EV.PostWarningLog(Module, "Offline automatically due to interlock bypassed");
}
});
}
private void InitRoutine()
{
_gotoRoutine = new TMRobotGotoRoutine();
@ -553,6 +569,7 @@ namespace SicModules.TMs
DATA.Subscribe($"{Module}.IsError", () => IsError);
DATA.Subscribe($"{Module}.IsAlarm", () => IsAlarm);
DATA.Subscribe($"{Module}.IsWarning", () => IsWarning);
DATA.Subscribe($"{Module}.IsInterlockBypassed", () => IsInterlockBypassed);
DATA.Subscribe($"{Name}.CurrentRoutineLoop", () => CurrentRoutineLoop);
DATA.Subscribe($"{Name}.CurrentRoutineLoopTotal", () => CurrentRoutineLoopTotal);
@ -1064,6 +1081,12 @@ namespace SicModules.TMs
private bool PutOnline()
{
if (IsInterlockBypassed)
{
EV.PostWarningLog(Module, $"Interlock is bypassed");
return false;
}
IsOnline = true;
NotifyModuleOfflineCancellation.Cancel();
return true;

View File

@ -497,6 +497,7 @@
</configs>
</configs>
<configs name="PM1">
<config default="false" name="BypassInterlock" description="Bypass Interlock" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="Sic" name="RecipeChamberType" visible="false" description="Recipe Chamber Type" max="" min="" paramter="" tag="" unit="" type="String" />
<config default="" name="LastRecipeName" description="last recipe name" max="" min="" paramter="" tag="" visible="false" unit="" type="String" />
<config default="127.0.0.1:102" name="SiemensIP" description="Siemens IP AddressDefault IP192.168.1.105:102" max="" min="" paramter="" tag="" unit="" type="String" />
@ -1012,6 +1013,7 @@
</configs>
</configs>
<configs name="PM2">
<config default="false" name="BypassInterlock" description="Bypass Interlock" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="Sic" name="RecipeChamberType" visible="false" description="Recipe Chamber Type" max="" min="" paramter="" tag="" unit="" type="String" />
<config default="" name="LastRecipeName" description="last recipe name" max="" min="" paramter="" tag="" visible="false" unit="" type="String" />
<config default="127.0.0.1:102" name="SiemensIP" description="Siemens IP AddressDefault IP192.168.1.205:102" max="" min="" paramter="" tag="" unit="" type="String" />
@ -1529,6 +1531,7 @@
</configs>
</configs>
<configs name="TM">
<config default="false" name="BypassInterlock" description="Bypass Interlock" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="200" name="ProcessPressure" description="传盘压力基准" max="1200" min="0" paramter="" tag="" unit="mbar" type="Double" />
<config default="20" name="VacuumPressureBaseOffset" description="传盘压力Offset" max="1200" min="0" paramter="" tag="" unit="mbar" type="Double" />
<config default="127.0.0.1:102" name="SiemensIP" description="Siemens IP AddressDefault IP192.168.1.102:102" max="" min="" paramter="" tag="" unit="" type="String" />

View File

@ -412,9 +412,140 @@
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="0"
Caption="System"
ModuleName="System"
ModuleDescription="All Module"
IsOnline="{Binding IsOnlineSystem}"
Status="{Binding RtStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="1"
Caption="TM"
ModuleName="TM"
ModuleDescription="TM"
IsOnline="{Binding IsOnlineTM}"
Status="{Binding TMStatus}"
HasWarning="{Binding IsTMInterlockBypassed}"
WarningTip="Warning: Interlock bypassed"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="2"
Caption="EFEM"
ModuleName="EFEM"
ModuleDescription="EFEM"
IsOnline="{Binding IsOnlineEFEM}"
Status="{Binding EFEMStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="3"
Caption="Load"
ModuleName="LoadLock"
ModuleDescription="LoadLock"
IsOnline="{Binding IsOnlineLL}"
Status="{Binding LLStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="4"
Caption="Aligner"
ModuleName="Aligner"
ModuleDescription="Aligner"
IsOnline="{Binding IsOnlineAligner}"
Status="{Binding AlignerStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="5"
Caption="CassBL"
ModuleName="CassBL"
ModuleDescription="CassBL"
IsOnline="{Binding IsOnlineCassBL}"
Status="{Binding CassBLStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="6"
Caption="WaferRobot"
ModuleName="WaferRobot"
ModuleDescription="WaferRobot"
IsOnline="{Binding IsOnlineWaferRobot}"
Status="{Binding WaferRobotStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="0"
Caption="PM1"
ModuleName="PM1"
ModuleDescription="PM1"
IsOnline="{Binding IsOnlinePM1}"
Status="{Binding PM1Status}"
HasWarning="{Binding IsPM1InterlockBypassed}"
WarningTip="Warning: Interlock bypassed"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="1"
Caption="PM2"
ModuleName="PM2"
ModuleDescription="PM2"
IsOnline="{Binding IsOnlinePM2}"
Status="{Binding PM2Status}"
HasWarning="{Binding IsPM2InterlockBypassed}"
WarningTip="Warning: Interlock bypassed"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="2"
Caption="Buffer"
ModuleName="Buffer"
ModuleDescription="Buffer"
IsOnline="{Binding IsOnlineBuffer}"
Status="{Binding BufferStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="3"
Caption="UnLoad"
ModuleName="UnLoad"
ModuleDescription="UnLoad"
IsOnline="{Binding IsOnlineUnLoad}"
Status="{Binding UnLoadStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="4"
Caption="CassAL"
ModuleName="CassAL"
ModuleDescription="CassAL"
IsOnline="{Binding IsOnlineCassAL}"
Status="{Binding CassALStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="5"
Caption="CassAR"
ModuleName="CassAR"
ModuleDescription="CassAR"
IsOnline="{Binding IsOnlineCassAR}"
Status="{Binding CassARStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="6"
Caption="TrayRobot"
ModuleName="TrayRobot"
ModuleDescription="TrayRobot"
IsOnline="{Binding IsOnlineTrayRobot}"
Status="{Binding TrayRobotStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<Label
Grid.Row="2"
Grid.Column="0"

View File

@ -358,7 +358,6 @@ namespace SicUI.Client
public int LogoutTime { get; set; }
//public ObservableCollection<EventItem> WarnEventLogList { get; set; }
private DelayedPresentRollingObservableCollection<EventItem> EventLogList { get; }
@ -405,8 +404,14 @@ namespace SicUI.Client
public Visibility WarnEventsVisibility { get; set; }
[Subscription("System.IsEngMode")]
public bool IsEngMode { get; set; }
[Subscription("PM1.IsInterlockBypassed")]
public bool IsPM1InterlockBypassed { get; set; }
[Subscription("PM2.IsInterlockBypassed")]
public bool IsPM2InterlockBypassed { get; set; }
[Subscription("TM.IsInterlockBypassed")]
public bool IsTMInterlockBypassed { get; set; }
[Subscription("Rt.Status")]
public string RtStatus { get; set; }