调试传盘流程

This commit is contained in:
Han Qiang Qiang 2024-04-26 18:21:14 +08:00
parent 810a67b001
commit f745f4a51e
7 changed files with 118 additions and 219 deletions

View File

@ -709,12 +709,12 @@ namespace SicModules.LLs
public override bool CheckTrayClamped()
{
throw new NotImplementedException();
return _llDevice.CheckTrayClamped();
}
public override bool CheckTrayUnClamped()
{
throw new NotImplementedException();
return _llDevice.CheckTrayUnClamped();
}
public override bool CheckWaferClamped()
@ -724,15 +724,15 @@ namespace SicModules.LLs
public override bool CheckWaferUnClamped()
{
throw new NotImplementedException();
return _llDevice.CheckWaferUnClamped();
}
public override bool CheckWaferPlaced()
{
throw new NotImplementedException();
return _llDevice.CheckWaferPlaced();
}
public override bool CheckTrayPlaced()
{
throw new NotImplementedException();
return _llDevice.CheckTrayPlaced();
}
private bool PutOnline()

View File

@ -3,12 +3,10 @@
<TableSequenceFormat RecipeVersion="Sic">
<Catalog Type="Position">
<Item Name="Position" DisplayName="Position" InputType="ReadOnlySelection" >
<Selection Name="PM1" DisplayName="PM1" Parameter="ProcessRecipe" />
<Selection Name="PM2" DisplayName="PM2" Parameter="ProcessRecipe" />
<Selection Name="Buffer" DisplayName="Buffer" Parameter="PurgeCount,PumpDelayTime" />
<Selection Name="Aligner" DisplayName="Aligner" Parameter="" />
<Selection Name="Load" DisplayName="Load" Parameter="PurgeCount,PumpDelayTime" />
<Selection Name="UnLoad" DisplayName="UnLoad" Parameter="PurgeCount,PumpDelayTime,PurgeCountBeforeWaferPicking,PumpDelayTimeBeforeWaferPicking,PurgeCountAfterWaferPicking,PumpDelayTimeAfterWaferPicking,CoolingTime" />
<Selection Name="PM1" DisplayName="PM1" Parameter="ProcessRecipe" />
<Selection Name="PM2" DisplayName="PM2" Parameter="ProcessRecipe" />
<Selection Name="Buffer" DisplayName="Buffer" Parameter="SetValue" />
<Selection Name="Load" DisplayName="Load" Parameter="SetValue,PurgeCount,PumpDelayTime" />
</Item>
</Catalog>
@ -27,6 +25,9 @@
<Selection Name="HeatByTime" DisplayName="HeatByTime"/>
<Selection Name="CoolingByTime" DisplayName="CoolingByTime"/>
</Item>
<Item Name="Type" DisplayName="Type" InputType="ReadOnlySelection" >
<Selection Name="CoolingByTime" DisplayName="CoolingByTime"/>
</Item>
<Item Name="SetValue" DisplayName="SetValue" InputType="NumInput" Min="0" Max="10000" />
<Item Name="PurgeCount" DisplayName="PurgeCount" InputType="NumInput" Min="0" Max="1000" />
<Item Name="PumpDelayTime" DisplayName="PumpDelayTime" InputType="NumInput" Min="0" Max="1000" />

View File

@ -18,7 +18,6 @@ using MECF.Framework.Common.SubstrateTrackings;
using SicRT.Equipments.Schedulers;
using SicRT.Modules.Schedulers;
namespace SicRT.Modules
{
public partial class ManualAutoTransfer : SchedulerModuleFactory
@ -64,9 +63,9 @@ namespace SicRT.Modules
private Dictionary<string, DateTime> _bufferWaferInfo = new();
Queue<Action> waferRobotActions = new() { };
Queue<Action> trayRobotActions = new() { };
Queue<Action> tmRobotActions = new() { };
private Queue<Action> waferRobotActions = new() { };
private Queue<Action> trayRobotActions = new() { };
private Queue<Action> tmRobotActions = new() { };
private R_TRIG _updateAutoJobLocation = new(); //需要向数据库更新Wafer位置
@ -133,6 +132,7 @@ namespace SicRT.Modules
tmRobotActions.Enqueue(MonitorTmRobotPMPickTask);
tmRobotActions.Enqueue(MonitorTmRobotBufferPlaceTask);
tmRobotActions.Enqueue(MonitorTmRobotBufferPickTask);
}
public bool HasJobRunning
@ -140,7 +140,6 @@ namespace SicRT.Modules
get { return _lstControlJobs.Count > 0; }
}
public void Clear()
{
_tmRobot.ResetTask();
@ -186,7 +185,6 @@ namespace SicRT.Modules
_isCycleMode = SC.GetValue<bool>("System.IsCycleMode");
_cycleSetPoint = _isCycleMode ? SC.GetValue<int>("System.CycleCount") : 0;
_maxTrayCount = _lstPms.Count * 2;
}
@ -418,7 +416,6 @@ namespace SicRT.Modules
//JobDataRecorder.StartCJ(cj.InnerId.ToString(), carrier.InnerId.ToString(), cj.Name, cj.Module, cj.Module, totalWafer);
JobDataRecorder.StartCJ(cj.InnerId.ToString(), null, cj.Name, cj.Module, cj.Module, totalWafer);
//保存信息
var waferInfo = WaferManager.Instance.GetWafer(ModuleName.LoadLock, 0);
if (waferInfo != null)
@ -519,7 +516,6 @@ namespace SicRT.Modules
// }
// }
// currentIndex++;
// if (sequence.Steps[currentIndex] == null || sequence.Steps[currentIndex].StepModules.Count <= 0 || sequence.Steps[currentIndex].StepModules.Any(pm => !ModuleHelper.IsPm(pm)))
// {
@ -599,7 +595,6 @@ namespace SicRT.Modules
return false;
}
if (_lstProcessJobs.Count <= 0) //判断上一步ProcessJob是否创建成功
{
EV.PostWarningLog(LogSource, $"process job is not exist");
@ -614,7 +609,6 @@ namespace SicRT.Modules
cj.LotWafers = new List<WaferInfoRt>();
cj.SetState(EnumControlJobState.WaitingForStart);
var totalWafer = 0;
foreach (var pjName in pjIDs)
{
@ -625,7 +619,6 @@ namespace SicRT.Modules
continue;
}
var slotWafers = new List<Tuple<ModuleName, int>>();
foreach (var slotWafer in pj.SlotWafers)
{
@ -648,8 +641,6 @@ namespace SicRT.Modules
slotWafers.Add(Tuple.Create(ModuleHelper.Converter(module), slotWafer.Item2));
totalWafer++;
}
@ -691,7 +682,6 @@ namespace SicRT.Modules
var lstUnLoad = new List<int>();
var lstPM = new List<int>();
for (var i = 0; i < sequenceInfo.Steps.Count; i++)
{
if (sequenceInfo.Steps[i].StepModules.Count == 0)
@ -754,8 +744,6 @@ namespace SicRT.Modules
}
}
var slotWafers = new List<Tuple<ModuleName, int>>();
foreach (var slot in slotNumbers)
{
@ -989,7 +977,8 @@ namespace SicRT.Modules
}
}
}
#endregion
#endregion Job Management
/// <summary>
/// Start Auto Transfer
@ -1014,6 +1003,7 @@ namespace SicRT.Modules
public Result Monitor()
{
var cjActive = _lstControlJobs.Find(x => x.State == EnumControlJobState.Executing);
if (cjActive != null)
{
@ -1034,6 +1024,7 @@ namespace SicRT.Modules
}
#region Job task
public Result MonitorJobTasks()
{
UpdateProcessJobStatus();
@ -1087,7 +1078,6 @@ namespace SicRT.Modules
{
return ModuleName.CassAL;
}
}
return moduleFrom;
}
@ -1123,7 +1113,6 @@ namespace SicRT.Modules
}
}
return true;
}
@ -1256,7 +1245,6 @@ namespace SicRT.Modules
_cycledWafer = _cycledCount * countPerCycle + countProcessed;
//StatsDataManager.Instance.SetValue(StatsNameTotalRunningWafer, _totalWaferWhenStart + _cycledWafer);
if (allControlJobComplete)
{
_cycledCount++;
@ -1282,7 +1270,6 @@ namespace SicRT.Modules
}
}
}
}
foreach (var cj in cjRemoveList)
@ -1415,7 +1402,8 @@ namespace SicRT.Modules
return true;
}
#endregion
#endregion Job task
#region Module task
@ -1428,7 +1416,6 @@ namespace SicRT.Modules
// || (_unload.IsInPumping && _load.IsInPumping))
// EV.PostAlarmLog("Schedule", $"检测到 _load.IsInPumping :{_load.IsInPumping}, _unload.IsInPumping :{_unload.IsInPumping}, _tmRobot.IsInPumping :{_tmRobot.IsInPumping}");
MonitorPMTask();
MonitorBufferTask();
@ -1438,6 +1425,8 @@ namespace SicRT.Modules
return Result.RUN;
}
#region SIC多片机报错
private void MonitorBufferTask()
{
if (!_buffer.IsAvailable)
@ -1459,10 +1448,7 @@ namespace SicRT.Modules
}
var bufferSetValue = 0;
if (!GetWaferSequenceNextValue(ModuleName.Buffer, i, "Type", out var strBufferType))
{
continue;
}
if (!GetWaferSequenceNextValue(ModuleName.Buffer, i, "SetValue", out var strBufferSetValue))
{
continue;
@ -1472,88 +1458,33 @@ namespace SicRT.Modules
continue;
}
//分别判断冷却和加热方式温度是否达到
if (strBufferType == "HeatByTemp")
if (_bufferWaferInfo.ContainsKey(bufferWafer.WaferInnerID.ToString()))
{
if (_bufferWaferInfo.ContainsKey(bufferWafer.WaferInnerID.ToString()))
{
var dtStartTime = _bufferWaferInfo[bufferWafer.WaferInnerID.ToString()];
var pastTime = (DateTime.Now - dtStartTime).TotalSeconds;
var dtStartTime = _bufferWaferInfo[bufferWafer.WaferInnerID.ToString()];
var pastTime = (DateTime.Now - dtStartTime).TotalSeconds;
//选择By温度5秒后再判断温度
if (pastTime > 5)
{
if (_buffer.GetTemperature() >= bufferSetValue)
bufferWafer.NextSequenceStep++;
_bufferWaferInfo.Remove(bufferWafer.WaferInnerID.ToString());
}
}
else
if (i == 0)
{
_bufferWaferInfo.Add(bufferWafer.WaferInnerID.ToString(), DateTime.Now);
_timeBuffer1 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
else if (i == 1)
{
_timeBuffer2 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
else if (i == 2)
{
_timeBuffer3 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
if (pastTime > bufferSetValue)
{
bufferWafer.NextSequenceStep++;
_bufferWaferInfo.Remove(bufferWafer.WaferInnerID.ToString());
}
}
else if (strBufferType == "HeatByTime")
else
{
if (_bufferWaferInfo.ContainsKey(bufferWafer.WaferInnerID.ToString()))
{
var dtStartTime = _bufferWaferInfo[bufferWafer.WaferInnerID.ToString()];
var pastTime = (DateTime.Now - dtStartTime).TotalSeconds;
if (i == 0)
{
_timeBuffer1 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
else if (i == 1)
{
_timeBuffer2 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
else if (i == 2)
{
_timeBuffer3 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
if (pastTime > bufferSetValue)
{
bufferWafer.NextSequenceStep++;
_bufferWaferInfo.Remove(bufferWafer.WaferInnerID.ToString());
}
}
else
{
_bufferWaferInfo.Add(bufferWafer.WaferInnerID.ToString(), DateTime.Now);
}
}
else if (strBufferType == "CoolingByTime")
{
if (_bufferWaferInfo.ContainsKey(bufferWafer.WaferInnerID.ToString()))
{
var dtStartTime = _bufferWaferInfo[bufferWafer.WaferInnerID.ToString()];
var pastTime = (DateTime.Now - dtStartTime).TotalSeconds;
if (i == 0)
{
_timeBuffer1 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
else if (i == 1)
{
_timeBuffer2 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
else if (i == 2)
{
_timeBuffer3 = pastTime > bufferSetValue ? 0 : (bufferSetValue - pastTime);
}
if (pastTime > bufferSetValue)
{
bufferWafer.NextSequenceStep++;
_bufferWaferInfo.Remove(bufferWafer.WaferInnerID.ToString());
}
}
else
{
_bufferWaferInfo.Add(bufferWafer.WaferInnerID.ToString(), DateTime.Now);
}
_bufferWaferInfo.Add(bufferWafer.WaferInnerID.ToString(), DateTime.Now);
}
return;
@ -1567,6 +1498,8 @@ namespace SicRT.Modules
}
}
#endregion SIC多片机报错
/// <summary>
/// 检测到LL中的Wafer已完成Job。
/// </summary>
@ -1600,7 +1533,6 @@ namespace SicRT.Modules
return;
}
if (!_load.CheckWaferSequenceStepDone(0))
{
if (_load.CheckWaferNextStepIsThis(ModuleName.LoadLock, 0))
@ -1615,11 +1547,7 @@ namespace SicRT.Modules
}
else
{
if (!GetWaferSequenceNextValue(ModuleName.Load, 0, "Type", out var strType))
{
return;
}
if (!GetWaferSequenceNextValue(ModuleName.Load, 0, "SetValue", out var strSetValue))
{
return;
@ -1630,54 +1558,39 @@ namespace SicRT.Modules
return;
}
//Load腔没有测温
//if (strType == "CoolingByTemp")
//{
// if (_load.GetTemperature() <= setValue)
// {
// _load.Purge(_load.GetWaferPurgeCount(0), _load.GetWaferPumpDelayTime(0));
// _load.Vent();
// _load.GetWaferInfo(0).NextSequenceStep++;
// }
//}
if (strType == "CoolingByTime")
if (_loadWaferInfo.ContainsKey(_load.GetWaferInfo(0).WaferInnerID.ToString()))
{
if (_loadWaferInfo.ContainsKey(_load.GetWaferInfo(0).WaferInnerID.ToString()))
var dtStartTime = _loadWaferInfo[_load.GetWaferInfo(0).WaferInnerID.ToString()];
var pastTime = (DateTime.Now - dtStartTime).TotalSeconds;
_timeLoad = pastTime > setValue ? 0 : (setValue - pastTime);
if (pastTime > setValue)
{
var dtStartTime = _loadWaferInfo[_load.GetWaferInfo(0).WaferInnerID.ToString()];
var pastTime = (DateTime.Now - dtStartTime).TotalSeconds;
_timeLoad = pastTime > setValue ? 0 : (setValue - pastTime);
if (pastTime > setValue)
if (!_load.CheckPurged())
{
if (!_load.CheckPurged())
{
_load.Purge(_load.GetWaferPurgeCount(0), _load.GetWaferPumpDelayTime(0));
return;
}
_load.ResetPurged();
_load.Vent();
_load.GetWaferInfo(0).NextSequenceStep++;
_loadWaferInfo.Remove(_load.GetWaferInfo(0).WaferInnerID.ToString());
_load.Purge(_load.GetWaferPurgeCount(0), _load.GetWaferPumpDelayTime(0));
return;
}
}
else
{
_loadWaferInfo.Add(_load.GetWaferInfo(0).WaferInnerID.ToString(), DateTime.Now);
_load.ResetPurged();
_load.Vent();
_load.GetWaferInfo(0).NextSequenceStep++;
_loadWaferInfo.Remove(_load.GetWaferInfo(0).WaferInnerID.ToString());
return;
}
}
else
{
_loadWaferInfo.Add(_load.GetWaferInfo(0).WaferInnerID.ToString(), DateTime.Now);
return;
}
}
}
else if (!_load.IsReadyForPick(ModuleName.TMRobot, 0) && !_tmRobot.IsInPumping)
@ -1710,7 +1623,6 @@ namespace SicRT.Modules
}
}
private void MonitorPMTask()
{
//if (_pm1.FirstDetectTrayArrive(0))
@ -1771,43 +1683,8 @@ namespace SicRT.Modules
}
}
private void MonitorTmRobotTask()
{
// TMRobot Idle或者Error时清除被传盘对象的等待状态
if (_tmRobot.CheckTaskDone())
{
foreach (var pm in _lstPms.Where(
pm => pm.IsWaitTransfer(ModuleName.TMRobot) && _tmRobot.CheckTaskDone()))
{
pm.StopWaitTransfer(ModuleName.TMRobot);
}
if (_buffer.IsWaitTransfer(ModuleName.TMRobot) && _tmRobot.CheckTaskDone())
_buffer.StopWaitTransfer(ModuleName.TMRobot);
if (_load.IsWaitTransfer(ModuleName.TMRobot) && _tmRobot.CheckTaskDone())
_load.StopWaitTransfer(ModuleName.TMRobot);
//if (_unload.IsWaitTransfer(ModuleName.TMRobot))
// _unload.StopWaitTransfer(ModuleName.TMRobot);
}
if (!_tmRobot.IsAvailable)
{
return;
}
if (!_tmRobot.IsAvailable)
return;
var act = tmRobotActions.Peek();
act.Invoke();
tmRobotActions.Enqueue(tmRobotActions.Dequeue());
}
#region TmRobotTask
private void MonitorTmRobotLoadPlaceTask()
{
if (!_load.IsAvailable || !_tmRobot.IsAvailable)
@ -1886,7 +1763,6 @@ namespace SicRT.Modules
}
}
}
}
private void MonitorTmRobotBufferPlaceTask()
@ -1948,7 +1824,41 @@ namespace SicRT.Modules
}
return;
}
}
private void MonitorTmRobotTask()
{
// TMRobot Idle或者Error时清除被传盘对象的等待状态
if (_tmRobot.CheckTaskDone())
{
foreach (var pm in _lstPms.Where(
pm => pm.IsWaitTransfer(ModuleName.TMRobot) && _tmRobot.CheckTaskDone()))
{
pm.StopWaitTransfer(ModuleName.TMRobot);
}
if (_buffer.IsWaitTransfer(ModuleName.TMRobot) && _tmRobot.CheckTaskDone())
_buffer.StopWaitTransfer(ModuleName.TMRobot);
if (_load.IsWaitTransfer(ModuleName.TMRobot) && _tmRobot.CheckTaskDone())
_load.StopWaitTransfer(ModuleName.TMRobot);
//if (_unload.IsWaitTransfer(ModuleName.TMRobot))
// _unload.StopWaitTransfer(ModuleName.TMRobot);
}
if (!_tmRobot.IsAvailable)
{
return;
}
if (!_tmRobot.IsAvailable)
return;
var act = tmRobotActions.Peek();
act.Invoke();
tmRobotActions.Enqueue(tmRobotActions.Dequeue());
}
private void MonitorTmRobotBufferPickTask()
@ -2004,7 +1914,6 @@ namespace SicRT.Modules
return;
}
}
}
}
}
@ -2052,7 +1961,6 @@ namespace SicRT.Modules
}
}
}
}
}
}
@ -2087,7 +1995,6 @@ namespace SicRT.Modules
}
}
}
}
private void MonitorTmRobotPMPlaceTask()
@ -2125,7 +2032,6 @@ namespace SicRT.Modules
}
}
}
}
private void MonitorTmRobotPMPickTask()
@ -2184,13 +2090,12 @@ namespace SicRT.Modules
}
}
}
}
}
#endregion
#endregion TmRobotTask
#endregion
#endregion Module task
#region Logic Check
@ -2339,7 +2244,6 @@ namespace SicRT.Modules
}
return true;
}
public bool CheckWaferProcessModuleIsAvailable(ModuleName waferModule, int waferSlot)
@ -2399,7 +2303,6 @@ namespace SicRT.Modules
return false;
}
private SlotItem GetWaferInJobQueue()
{
var processingWafers = new List<Tuple<ModuleName, int>>();
@ -2435,7 +2338,6 @@ namespace SicRT.Modules
{
return SortBySerialMode(processingWafers);
}
}
return null;
@ -2740,9 +2642,8 @@ namespace SicRT.Modules
//}
//return waferCount;
}
#endregion
#endregion Logic Check
#region Module error
@ -2767,7 +2668,6 @@ namespace SicRT.Modules
if (isModuleError && !_isModuleErrorPrevious)
{
}
else if (!isModuleError && _isModuleErrorPrevious)
{
@ -2891,7 +2791,6 @@ namespace SicRT.Modules
reason = $"TmRobot have wafer!";
EV.PostWarningLog(LogSource, reason);
return true;
}
if (!_load.HasWafer(0))
@ -2899,7 +2798,6 @@ namespace SicRT.Modules
reason = $"Load have no wafer!";
EV.PostWarningLog(LogSource, reason);
return true;
}
if (!_load.HasTray(0))
@ -2907,7 +2805,6 @@ namespace SicRT.Modules
reason = $"Load have no Tray!";
EV.PostWarningLog(LogSource, reason);
return true;
}
return false;
@ -2952,7 +2849,6 @@ namespace SicRT.Modules
return true;
}
#endregion
#endregion Module error
}
}
}

View File

@ -90,6 +90,8 @@ namespace SicRT.Modules.Schedulers
return _cassetteBL;
case ModuleName.LoadLock:
return _load;
case ModuleName.Load:
return _load;
case ModuleName.UnLoad:
return _unload;
case ModuleName.Aligner:

View File

@ -502,7 +502,7 @@ namespace SicSimulator.Instances
{
if (IO.AI[$"{pm}.AI_ActualPressure"].Value + 10 < IO.AO[$"{pm}.AO_SetpointPressure"].Value)
{
IO.AI[$"{pm}.AI_ActualPressure"].Value += 10;
IO.AI[$"{pm}.AI_ActualPressure"].Value += 50;
}
else
{
@ -518,7 +518,7 @@ namespace SicSimulator.Instances
{
if (IO.AI[$"{pm}.AI_ActualPressure"].Value < 1200)
{
IO.AI[$"{pm}.AI_ActualPressure"].Value += 10;
IO.AI[$"{pm}.AI_ActualPressure"].Value += 50;
}
}
}

View File

@ -77,7 +77,7 @@
</unitControls:Door.RenderTransform>
</unitControls:Door>
<!-- Tray和晶圆 -->
<Canvas Visibility="{Binding IsPM1Installed, Converter={StaticResource BoolVisibilityConverter}}">
<Canvas Visibility="{Binding IsPM1Installed, Converter={StaticResource BoolVisibilityConverter}}">
<Image
Canvas.Left="248"
Canvas.Top="182"

View File

@ -5,10 +5,10 @@
xmlns:controls="http://OpenSEMI.Ctrlib.com/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:lex="http://wpflocalizeextension.codeplex.com"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:micro="clr-namespace:Caliburn.Micro;assembly=MECF.Framework.UI.Client"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:lex="http://wpflocalizeextension.codeplex.com"
lex:LocalizeDictionary.DesignCulture="zh"
lex:ResxLocalizationProvider.DefaultAssembly="Sicentury.Localization"
lex:ResxLocalizationProvider.DefaultDictionary="lang_overview">