新增ModuleStatusIndicator控件,完善Interlock_Bypass功能。
1.全局Interlock_Bypass改为TM/PM1/PM2三组独立 2.Interlock_bypass时界面三角提示 3.bypass时,无法online,无法进行process,但可以进入processidle
This commit is contained in:
parent
ada42c6aca
commit
97e4412900
|
@ -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(() =>
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 Address,Default IP:192.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 Address,Default IP:192.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 Address,Default IP:192.168.1.102:102" max="" min="" paramter="" tag="" unit="" type="String" />
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Reference in New Issue