using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Fsm;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using Aitex.Core.Utilities;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.Common.Utilities;
using MECF.Framework.Common.WaferHolder;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS;
using CyberX8_RT.Devices.Loader;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MECF.Framework.Common.Alarm;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.Routine;
using System.Collections;
using System.Windows.Markup;
using MECF.Framework.Common.CommonData.Loader;
using Aitex.Core.Common;
using MECF.Framework.RT.Core.Equipments;
using CyberX8_RT.Modules.Dryer;
namespace CyberX8_RT.Modules.Loader
{
public class LoaderEntity : Entity, IEntity, IModuleEntity
{
public enum LotTrackDatasStatus
{
None,
Half,
Complete
}
#region 属性
public ModuleName Module { get; private set; }
public bool IsInit
{
get { return fsm.State == (int)LOADERSTATE.Init; }
}
public bool IsIdle
{
get
{
return fsm.State == (int)LOADERSTATE.Idle;
}
}
public bool IsError
{
get { return fsm.State == (int)LOADERSTATE.Error; }
}
public bool IsBusy
{
get { return !IsInit && !IsError && !IsIdle; }
}
public bool IsAuto { get; } = true;
///
/// 是否为工程模式
///
public bool IsEngineering { get; } = false;
///
/// 是否为产品模式
///
public bool IsProduction { get; } = true;
public bool IsHomed
{
get { return _isHomed; }
}
///
/// 当前状态机状态
///
public int State { get { return fsm.State; } }
///
/// 是否禁用
///
public bool IsDisable { get; internal set; }
///
/// Rotation是否SwitchOn
///
public bool IsRotationSwitchOn
{
get { return _rotationAxis.IsSwitchOn; }
}
///
/// ShuttleA是否SwitchOn
///
public bool IsShuttleASwitchOn
{
get { return _shuttleAAxis.IsSwitchOn; }
}
///
/// ShuttleB是否SwitchOn
///
public bool IsShuttleBSwitchOn
{
get { return _shuttleBAxis.IsSwitchOn; }
}
///
/// TiltA是否SwitchOn
///
public bool IsTiltASwitchOn
{
get { return _tiltAAxis.IsSwitchOn; }
}
///
/// TiltB是否SwitchOn
///
public bool IsTiltBSwitchOn
{
get { return _tiltBAxis.IsSwitchOn; }
}
///
/// CrsA是否SwitchOn
///
public bool IsCrsASwitchOn
{
get { return _crsAAxis.IsSwitchOn; }
}
///
/// CrsB是否SwitchOn
///
public bool IsCrsBSwitchOn
{
get { return _crsBAxis.IsSwitchOn; }
}
///
/// WaferHolder信息
///
public WaferHolderInfo WaferHolderInfo { get { return WaferHolderManager.Instance.GetWaferHolder("Loader"); } }
#endregion
#region 内部变量
private bool _isHomed = false;
private IRoutine _currentRoutine;
///
/// Loader当前unload、load操作Slot
///
private Dictionary> _loaderOperatingWaferInfosList = new Dictionary> { { "unload", new List(new string[2]) }, { "load", new List(new string[2]) } };
#region Axis
JetAxisBase _shuttleAAxis;
JetAxisBase _shuttleBAxis;
JetAxisBase _tiltAAxis;
JetAxisBase _tiltBAxis;
JetAxisBase _crsAAxis;
JetAxisBase _crsBAxis;
JetAxisBase _rotationAxis;
LoaderSideDevice _sideA;
LoaderSideDevice _sideB;
LoaderCommonDevice _loaderCommon;
#endregion
#region routine
private LoaderHomeAllRoutine _homeAllRoutine;
private LoaderSwitchAllOnRoutine _switchAllOnRoutine;
private LoaderSwitchAllOffRoutine _switchAllOffRoutine;
private LoaderUnloadAllSideRoutine _unloadAllSideRoutine;
private LoaderLoadAllSideRoutine _loadAllSideRoutine;
#endregion
#region LotTrackDatas
///
/// Load LotTrackData
///
private List _loadLotTrackDatas = new List();
///
/// UnLoad LotTrackData
///
private List _unloadLotTrackDatas = new List();
///
/// UnLoad LotTrackDataBuffer
///
private List _unloadLotTrackDatasBuffer = new List();
///
/// LeakTest LotTrackData
///
private List _flowLotTrackdatas = new List();
///
/// LoadTime
///
private List _loadTimeList = new List();
///
/// LoadTime
///
private List _unloadTimeList = new List();
///
/// Unload Start Time
///
private DateTime _unloadStartTime;
///
/// LotTrackHead
///
private LotTrackFileHeaderCommonData _headerdata;
///
/// Load Datas Status
private LotTrackDatasStatus _loadDatasStatus = LotTrackDatasStatus.None;
///
/// Unload Datas Status
///
private LotTrackDatasStatus _unloadDatasStatus = LotTrackDatasStatus.None;
///
/// Unload Datas Buffer Status
///
private LotTrackDatasStatus _unloadDatasBufferStatus = LotTrackDatasStatus.None;
///
/// Flow Test Datas status
///
private LotTrackDatasStatus _flowTestDatasStatus = LotTrackDatasStatus.None;
#endregion
#endregion
///
/// 构造函数
///
///
public LoaderEntity(ModuleName module)
{
this.Module = module;
_shuttleAAxis = DEVICE.GetDevice($"{module}.ShuttleA");
_shuttleBAxis = DEVICE.GetDevice($"{module}.ShuttleB");
_tiltAAxis = DEVICE.GetDevice($"{module}.TiltA");
_tiltBAxis = DEVICE.GetDevice($"{module}.TiltB");
_crsAAxis = DEVICE.GetDevice($"{module}.LSA");
_crsBAxis = DEVICE.GetDevice($"{module}.LSB");
_rotationAxis = DEVICE.GetDevice($"{module}.Rotation");
_sideA = DEVICE.GetDevice($"{Module}.SideA");
_sideB = DEVICE.GetDevice($"{Module}.SideB");
_loaderCommon = DEVICE.GetDevice($"{module}.Common");
WaferManager.Instance.SubscribeLocation(Module, 2);
InitialOperation();
InitializeRoutine();
InitialDATA();
InitialFsm();
}
///
/// 初始化操作
///
private void InitialOperation()
{
OP.Subscribe($"{Module}.Abort", (cmd, args) => { return CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.Abort); });
OP.Subscribe($"{Module}.ClearError", (cmd, args) => { return CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.ClearError); });
OP.Subscribe($"{Module}.Common.HomeAll", (cmd, args) => { PostMsg((int)LoaderMSG.HomeAll); return true; });
OP.Subscribe($"{Module}.Common.SwitchOnAll", (cmd, args) => { PostMsg((int)LoaderMSG.SwitchOnAll); return true; });
OP.Subscribe($"{Module}.Common.SwitchOffAll", (cmd, args) => { PostMsg((int)LoaderMSG.SwitchOffAll); return true; });
}
///
/// 初始化Routine
///
private void InitializeRoutine()
{
_homeAllRoutine=new LoaderHomeAllRoutine(Module.ToString());
_switchAllOnRoutine=new LoaderSwitchAllOnRoutine(Module.ToString());
_switchAllOffRoutine=new LoaderSwitchAllOffRoutine(Module.ToString());
_unloadAllSideRoutine = new LoaderUnloadAllSideRoutine(Module.ToString());
_loadAllSideRoutine=new LoaderLoadAllSideRoutine(Module.ToString());
}
///
/// 初始化数据
///
private void InitialDATA()
{
InitializeSvid();
DATA.Subscribe($"{Module}.FsmState", () => ((LOADERSTATE)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.IsHomed", () => _isHomed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.IsError", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
}
///
/// 初始化SVID
///
private void InitializeSvid()
{
DATA.Subscribe($"{Module}.State", () => ((LOADERSTATE)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LotID", () => (WaferHolderInfo != null ? WaferHolderInfo.LotId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.WSID", () => (WaferHolderInfo != null ? WaferHolderInfo.Id : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LSAID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LSBID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.SequenceRecipe", () => (WaferHolderInfo != null ? WaferHolderInfo.SequenceId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.WaferAID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.WaferBID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo!=null?WaferHolderInfo.CurrentControlJobId:"", SubscriptionAttribute.FLAG.IgnoreSaveDB);
}
///
/// 初始化状态机
///
private void InitialFsm()
{
fsm = new StateMachine(Module.ToString(), (int)LOADERSTATE.Init, 100);
fsm.EnableRepeatedMsg(true);
AnyStateTransition(LoaderMSG.Error, EnterError, LOADERSTATE.Error);
AnyStateTransition(LoaderMSG.ReturnInit, EnterInit, LOADERSTATE.Init);
AnyStateTransition(LoaderMSG.ReturnIdle, NullFunc, LOADERSTATE.Idle);
AnyStateTransition(LoaderMSG.Abort, Abort, LOADERSTATE.Init);
//clear error
Transition(LOADERSTATE.Error, LoaderMSG.ClearError, ResumeError, LOADERSTATE.Init);
//HomeAll
AnyStateTransition(LoaderMSG.HomeAll, HomeAll, LOADERSTATE.Homing);
Transition(LOADERSTATE.Homing, FSM_MSG.TIMER, HomeAllMonitor, LOADERSTATE.Idle);
//Switch On All
Transition(LOADERSTATE.Error, LoaderMSG.SwitchOnAll, SwitchOnAll, LOADERSTATE.SwitchOning);
Transition(LOADERSTATE.Init, LoaderMSG.SwitchOnAll, SwitchOnAll, LOADERSTATE.SwitchOning);
Transition(LOADERSTATE.Idle, LoaderMSG.SwitchOnAll, SwitchOnAll, LOADERSTATE.SwitchOning);
Transition(LOADERSTATE.SwitchOning, FSM_MSG.TIMER, SwitchOnAllMonitor, LOADERSTATE.Init);
//Switch Off All
Transition(LOADERSTATE.Error, LoaderMSG.SwitchOffAll, SwitchOffAll, LOADERSTATE.SwitchOffing);
Transition(LOADERSTATE.Init, LoaderMSG.SwitchOffAll, SwitchOffAll, LOADERSTATE.SwitchOffing);
Transition(LOADERSTATE.Idle, LoaderMSG.SwitchOffAll, SwitchOffAll, LOADERSTATE.SwitchOffing);
Transition(LOADERSTATE.SwitchOffing, FSM_MSG.TIMER, SwitchOffAllMonitor, LOADERSTATE.Init);
//Prepare for Place
Transition(LOADERSTATE.Idle, LoaderMSG.PrepareForPlace, PrePareForPlace, LOADERSTATE.PrepreForPlacing);
Transition(LOADERSTATE.PrepreForPlacing, FSM_MSG.TIMER, PrepareForPlaceMonitor, LOADERSTATE.WaitForUnload);
Transition(LOADERSTATE.WaitForUnload, LoaderMSG.UnloadAll, UnloadAll, LOADERSTATE.Unloading);
Transition(LOADERSTATE.Unloading, FSM_MSG.TIMER, UnloadAllMonitor, LOADERSTATE.WaitForLoad);
Transition(LOADERSTATE.WaitForLoad, LoaderMSG.LoadAll, LoadAll, LOADERSTATE.Loading);
Transition(LOADERSTATE.Loading, FSM_MSG.TIMER, LoadAllMonitor, LOADERSTATE.Idle);
//Retry
Transition(LOADERSTATE.Error, LoaderMSG.Retry, NullFunc, LOADERSTATE.Retrying);
Transition(LOADERSTATE.Retrying,FSM_MSG.TIMER,LoaderRetry,LOADERSTATE.Retrying);
Transition(LOADERSTATE.Retrying, LoaderMSG.UnloadAll, RetryUnloadAll, LOADERSTATE.Unloading);
Transition(LOADERSTATE.Retrying, LoaderMSG.LoadAll, RetryLoadAll, LOADERSTATE.Loading);
//ConfirmComplete
Transition(LOADERSTATE.Init, LoaderMSG.ConfirmComplete, ClearModuleAlarm, LOADERSTATE.Init);
Transition(LOADERSTATE.Idle, LoaderMSG.ConfirmComplete, ClearModuleAlarm, LOADERSTATE.Idle);
Transition(LOADERSTATE.Error, LoaderMSG.ConfirmComplete, NullFunc, LOADERSTATE.ConfirmCompleting);
Transition(LOADERSTATE.ConfirmCompleting,FSM_MSG.TIMER,ConfirmComplete, LOADERSTATE.ConfirmCompleting);
Transition(LOADERSTATE.ConfirmCompleting, LoaderMSG.PrepareForPlace, NullFunc, LOADERSTATE.WaitForUnload);
Transition(LOADERSTATE.ConfirmCompleting,LoaderMSG.UnloadAll,ConfirmUnloadAll, LOADERSTATE.WaitForLoad);
Transition(LOADERSTATE.ConfirmCompleting, LoaderMSG.LoadAll, ConfirmLoadAll, LOADERSTATE.Idle);
EnumLoop.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
EnumLoop.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
}
///
/// 恢复错误
///
///
///
private bool ResumeError(object[] param)
{
if (_isHomed)
{
PostMsg(LoaderMSG.ReturnIdle);
return false;
}
return true;
}
#region Abort
private bool Abort(object parameter)
{
bool preHomed = IsHomed;
_shuttleAAxis.StopPositionOperation();
_shuttleBAxis.StopPositionOperation();
_tiltAAxis.StopPositionOperation();
_tiltBAxis.StopPositionOperation();
_crsAAxis.StopPositionOperation();
_crsBAxis.StopPositionOperation();
_rotationAxis.StopPositionOperation();
if (_currentRoutine != null)
{
_currentRoutine.Abort();
_currentRoutine = null;
}
if (preHomed)
{
PostMsg(LoaderMSG.ReturnIdle);
return false;
}
//Header信息
if (_headerdata != null)
{
WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(Module.ToString());
_headerdata.SequenceRecipe = (info != null ? $"{info.SequenceRecipe.SequenceType}\\" + $"{info.SequenceRecipe.Ppid}.seq.rcp" : null);
_headerdata.ProcessTransferList = (info != null ? info.SchedulerModules : null);
LoaderLotTrackUtil.ExportLoaderLotTrack(Module.ToString(), _unloadLotTrackDatas, _loadLotTrackDatas, _flowLotTrackdatas, _headerdata, _loaderOperatingWaferInfosList,
_loadTimeList, _unloadTimeList, _unloadStartTime, LotTrackDatasStatus.None, LotTrackDatasStatus.None, LotTrackDatasStatus.None, _unloadLotTrackDatasBuffer, LotTrackDatasStatus.None);
}
return true;
}
#endregion
///
/// 进入错误状态
///
///
///
private bool EnterError(object param)
{
return true;
}
///
/// 进入初始化状态
///
///
///
private bool EnterInit(object param)
{
_isHomed = false;
return true;
}
#region HomeAll
///
/// Home All
///
///
///
private bool HomeAll(object[] param)
{
_isHomed = false;
bool result= _homeAllRoutine.Start(param) == RState.Running;
if (result)
{
_currentRoutine = _homeAllRoutine;
}
return result;
}
///
/// Load All监控
///
///
///
private bool HomeAllMonitor(object[] param)
{
RState state = _homeAllRoutine.Monitor();
if (state==RState.Failed||state==RState.Timeout)
{
_currentRoutine = null;
PostMsg(LoaderMSG.Error);
return false;
}
bool result= state == RState.End;
if(result)
{
_currentRoutine = null;
_isHomed = true;
}
return result;
}
#endregion
#region Switch On All
private bool SwitchOnAll(object[] param)
{
return _switchAllOnRoutine.Start(param) == RState.Running;
}
private bool SwitchOnAllMonitor(object[] param)
{
RState state = _switchAllOnRoutine.Monitor();
if (state == RState.Failed || state == RState.Timeout)
{
PostMsg(LoaderMSG.ReturnInit);
return false;
}
bool result= state == RState.End;
if(result)
{
_isHomed = false;
}
return result;
}
#endregion
#region Switch Off All
private bool SwitchOffAll(object[] param)
{
return _switchAllOffRoutine.Start(param) == RState.Running;
}
private bool SwitchOffAllMonitor(object[] param)
{
RState state = _switchAllOffRoutine.Monitor();
if (state == RState.Failed || state == RState.Timeout)
{
PostMsg(LoaderMSG.ReturnInit);
return false;
}
bool result = state == RState.End;
if (result)
{
_isHomed = false;
}
return result;
}
#endregion
#region Prepare for Place
///
/// Prepare For Place
///
///
private bool PrePareForPlace(object param)
{
return _rotationAxis.PositionStation("TRNPA");
}
///
/// Prepare For Place监控
///
///
///
private bool PrepareForPlaceMonitor(object param)
{
RState ret = _rotationAxis.Status;
if (ret == RState.End)
{
return true;
}
if (ret == RState.Failed || ret == RState.Timeout)
{
PostMsg(LoaderMSG.Error);
}
return false;
}
#endregion
#region Unload All
///
/// Unload All
///
///
///
private bool UnloadAll(object param)
{
bool result= _unloadAllSideRoutine.Start(param) == RState.Running;
if(result)
{
LotTrackDataClear();
_currentRoutine = _unloadAllSideRoutine;
_unloadLotTrackDatas.Clear();
_unloadLotTrackDatasBuffer.Clear();
_unloadTimeList.Clear();
_unloadTimeList.Add(DateTime.Now);
_unloadStartTime = DateTime.Now;
_loaderOperatingWaferInfosList["unload"] = GetWaferInfo();
//Header信息
_headerdata = new LotTrackFileHeaderCommonData();
_headerdata.SoftWareVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
if (SC.ContainsItem("System.ToolID")) _headerdata.ToolID = SC.GetStringValue("System.ToolID");
_loadDatasStatus = LotTrackDatasStatus.None;
_unloadDatasStatus = LotTrackDatasStatus.None;
_flowTestDatasStatus = LotTrackDatasStatus.None;
_headerdata.ProcessTransferList = new List();
}
return result;
}
///
/// Retry UloadAll
///
///
///
private bool RetryUnloadAll(object[] param)
{
int stepIndex = (int)param[0];
bool result = _unloadAllSideRoutine.Retry(stepIndex)==RState.Running;
if (result)
{
_unloadDatasStatus = LotTrackDatasStatus.Half;
_unloadLotTrackDatas.Clear();
_currentRoutine = _unloadAllSideRoutine;
}
return result;
}
///
/// Unload All监控
///
///
///
private bool UnloadAllMonitor(object param)
{
RState ret = _unloadAllSideRoutine.Monitor();
if (ret == RState.End)
{
AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), LOADERSTATE.Unloading.ToString());
_unloadLotTrackDatas = _unloadAllSideRoutine.UnloadLotTrackDatas;
_unloadLotTrackDatasBuffer.AddRange(_unloadAllSideRoutine.UnloadLotTrackDatas);
_unloadTimeList.Add(DateTime.Now);
//Header信息
WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(Module.ToString());
_headerdata.SequenceRecipe = ((info != null && info.SequenceRecipe != null) ? $"{info.SequenceRecipe.SequenceType}\\" + $"{info.SequenceRecipe.Ppid}.seq.rcp" : "");
if (info != null) _headerdata.ProcessTransferList.AddRange(info.SchedulerModules);
info.SchedulerModules.Clear();
LoaderLotTrackUtil.ExportLoaderLotTrack(Module.ToString(), _unloadLotTrackDatas, _loadLotTrackDatas, _flowLotTrackdatas, _headerdata, _loaderOperatingWaferInfosList,
_loadTimeList, _unloadTimeList, _unloadStartTime, _unloadDatasStatus, _loadDatasStatus, _flowTestDatasStatus, _unloadLotTrackDatasBuffer, _unloadDatasStatus, true);
return true;
}
if (ret == RState.Failed || ret == RState.Timeout)
{
if (Singleton.Instance.IsAutoRunning)
{
AlarmList alarmList = new AlarmList(Module.ToString(), ((LOADERSTATE)fsm.State).ToString(), (int)LoaderMSG.UnloadAll,
_unloadAllSideRoutine.ErrorMsg, _unloadAllSideRoutine.ErrorStep, (int)AlarmType.Error);
AlarmListManager.Instance.AddAlarm(alarmList);
}
PostMsg(LoaderMSG.Error);
_unloadLotTrackDatas = _unloadAllSideRoutine.UnloadLotTrackDatas;
_unloadLotTrackDatasBuffer.AddRange(_unloadAllSideRoutine.UnloadLotTrackDatas);
////Header信息
WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(Module.ToString());
_headerdata.SequenceRecipe = ((info != null && info.SequenceRecipe != null) ? $"{info.SequenceRecipe.SequenceType}\\" + $"{info.SequenceRecipe.Ppid}.seq.rcp" : "");
if (info != null) _headerdata.ProcessTransferList.AddRange(info.SchedulerModules);
info.SchedulerModules.Clear();
LoaderLotTrackUtil.ExportLoaderLotTrack(Module.ToString(), _unloadLotTrackDatas, _loadLotTrackDatas, _flowLotTrackdatas, _headerdata, _loaderOperatingWaferInfosList,
_loadTimeList, _unloadTimeList, _unloadStartTime, _unloadDatasStatus, _loadDatasStatus, _flowTestDatasStatus, _unloadLotTrackDatasBuffer, _unloadDatasStatus, true);
}
return false;
}
///
/// 确认UnloadAll是否完成
///
///
///
private bool ConfirmUnloadAll(object[] param)
{
int stepIdex=(int)param[0];
bool result = _unloadAllSideRoutine.CheckCompleteCondition(stepIdex);
if(!result)
{
if (Singleton.Instance.IsAutoRunning)
{
AlarmList alarmList = new AlarmList(Module.ToString(), ((LOADERSTATE)fsm.State).ToString(), (int)LoaderMSG.UnloadAll,
_unloadAllSideRoutine.ErrorMsg, _unloadAllSideRoutine.ErrorStep, (int)AlarmType.Error);
AlarmListManager.Instance.AddAlarm(alarmList);
}
PostMsg(LoaderMSG.Error);
}
else
{
if (Singleton.Instance.IsAutoRunning)
{
AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), LOADERSTATE.Unloading.ToString());
}
}
return result;
}
#endregion
#region Load All
///
/// Load All
///
///
///
private bool LoadAll(object param)
{
bool result= _loadAllSideRoutine.Start(param) == RState.Running;
if(result)
{
_currentRoutine = _loadAllSideRoutine;
//_loadTimeList.Clear();
_flowLotTrackdatas.Clear();
_loadLotTrackDatas.Clear();
_loadDatasStatus = LotTrackDatasStatus.None;
_flowTestDatasStatus = LotTrackDatasStatus.None;
_unloadDatasStatus = LotTrackDatasStatus.Complete;
_unloadDatasBufferStatus = LotTrackDatasStatus.None;
}
return result;
}
///
/// Retry LoadAll
///
///
///
private bool RetryLoadAll(object[] param)
{
int stepIndex = (int)param[0];
bool result = _loadAllSideRoutine.Retry(stepIndex) == RState.Running;
if (result)
{
_unloadDatasStatus = LotTrackDatasStatus.Complete;
_unloadDatasBufferStatus = LotTrackDatasStatus.Complete;
SetLotTrackDatasStatus(stepIndex);
_currentRoutine = _loadAllSideRoutine;
}
return result;
}
///
/// 监控LoadAll
///
///
///
private bool LoadAllMonitor(object param)
{
RState ret = _loadAllSideRoutine.Monitor();
if (ret == RState.End)
{
AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), LOADERSTATE.Loading.ToString());
_loadLotTrackDatas = _loadAllSideRoutine.LoadLotTrackDatas;
_loadTimeList = _loadAllSideRoutine.LoadTimeList;
_flowLotTrackdatas = _loadAllSideRoutine.FlowLotTrackDatas;
bool clearFlag = _loadDatasStatus == LotTrackDatasStatus.None && _flowTestDatasStatus == LotTrackDatasStatus.None;
_loaderOperatingWaferInfosList["load"] = GetWaferInfo(clearFlag);
//Header信息
WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(Module.ToString());
_headerdata.SequenceRecipe = ((info != null && info.SequenceRecipe != null) ? $"{info.SequenceRecipe.SequenceType}\\" + $"{info.SequenceRecipe.Ppid}.seq.rcp" : "");
if(info != null) _headerdata.ProcessTransferList.AddRange(info.SchedulerModules);
info.SchedulerModules.Clear();
LoaderLotTrackUtil.ExportLoaderLotTrack(Module.ToString(), _unloadLotTrackDatas, _loadLotTrackDatas, _flowLotTrackdatas, _headerdata, _loaderOperatingWaferInfosList,
_loadTimeList, _unloadTimeList,_unloadStartTime, _unloadDatasStatus, _loadDatasStatus, _flowTestDatasStatus, _unloadLotTrackDatasBuffer, _unloadDatasBufferStatus);
return true;
}
if (ret == RState.Failed || ret == RState.Timeout)
{
if (Singleton.Instance.IsAutoRunning)
{
AlarmList alarmList = new AlarmList(Module.ToString(), ((LOADERSTATE)fsm.State).ToString(), (int)LoaderMSG.LoadAll,
_loadAllSideRoutine.ErrorMsg, _loadAllSideRoutine.ErrorStep, (int)AlarmType.Error);
AlarmListManager.Instance.AddAlarm(alarmList);
}
PostMsg(LoaderMSG.Error);
_loadLotTrackDatas = _loadAllSideRoutine.LoadLotTrackDatas;
_loadTimeList = _loadAllSideRoutine.LoadTimeList;
_flowLotTrackdatas = _loadAllSideRoutine.FlowLotTrackDatas;
bool clearFlag = _loadDatasStatus == LotTrackDatasStatus.None && _flowTestDatasStatus == LotTrackDatasStatus.None;
_loaderOperatingWaferInfosList["load"] = GetWaferInfo(clearFlag);
//Header信息
WaferHolderInfo info = WaferHolderManager.Instance.GetWaferHolder(Module.ToString());
_headerdata.SequenceRecipe = ((info != null && info.SequenceRecipe != null) ? $"{info.SequenceRecipe.SequenceType}\\" + $"{info.SequenceRecipe.Ppid}.seq.rcp" : "");
if (info != null) _headerdata.ProcessTransferList.AddRange(info.SchedulerModules);
info.SchedulerModules.Clear();
LoaderLotTrackUtil.ExportLoaderLotTrack(Module.ToString(), _unloadLotTrackDatas, _loadLotTrackDatas, _flowLotTrackdatas, _headerdata, _loaderOperatingWaferInfosList,
_loadTimeList, _unloadTimeList, _unloadStartTime, _unloadDatasStatus, _loadDatasStatus, _flowTestDatasStatus, _unloadLotTrackDatasBuffer, _unloadDatasBufferStatus);
}
return false;
}
///
/// 确认UnloadAll是否完成
///
///
///
private bool ConfirmLoadAll(object[] param)
{
int stepIdex = (int)param[0];
bool result = _loadAllSideRoutine.CheckCompleteCondition(stepIdex);
if (!result)
{
if (Singleton.Instance.IsAutoRunning)
{
AlarmList alarmList = new AlarmList(Module.ToString(), ((LOADERSTATE)fsm.State).ToString(), (int)LoaderMSG.LoadAll,
_loadAllSideRoutine.ErrorMsg, _loadAllSideRoutine.ErrorStep, (int)AlarmType.Error);
AlarmListManager.Instance.AddAlarm(alarmList);
}
PostMsg(LoaderMSG.Error);
}
else
{
if (Singleton.Instance.IsAutoRunning)
{
AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(),LOADERSTATE.Loading.ToString());
}
}
return result;
}
#endregion
#region LotTrack
///
/// 获取Wafer信息
///
private List GetWaferInfo(bool clearPath = false)
{
List waferIDs = new List(new string[2]);
WaferHolderInfo whInfo = WaferHolderManager.Instance.GetWaferHolder(Module.ToString());
if (whInfo == null) return null;
waferIDs[0] = string.IsNullOrEmpty(whInfo.WaferAId) ? "" : whInfo.WaferAId;
waferIDs[1] = string.IsNullOrEmpty(whInfo.WaferBId) ? "" : whInfo.WaferBId;
if (clearPath && !string.IsNullOrEmpty(waferIDs[0])) WaferManager.Instance.ClearWaferLotTrackPath(ModuleName.Loader1, 0);
if (clearPath && !string.IsNullOrEmpty(waferIDs[1])) WaferManager.Instance.ClearWaferLotTrackPath(ModuleName.Loader1, 1);
return waferIDs;
}
///
/// 清除信息
///
private void LotTrackDataClear()
{
_headerdata = null;
_loadLotTrackDatas.Clear();
_unloadLotTrackDatas.Clear();
_flowLotTrackdatas.Clear();
_loadTimeList.Clear();
_unloadTimeList.Clear();
_loaderOperatingWaferInfosList["load"].Clear();
_loaderOperatingWaferInfosList["unload"].Clear();
}
///
/// 设置Load LotTrackDatas记录状态
///
///
private void SetLotTrackDatasStatus(int stepIndex)
{
if (stepIndex == 0 || stepIndex == -1)
{
_loadDatasStatus = LotTrackDatasStatus.Half;
_flowTestDatasStatus = LotTrackDatasStatus.None;
}
else if (stepIndex == 1)
{
_loadDatasStatus = LotTrackDatasStatus.Complete;
_flowTestDatasStatus = LotTrackDatasStatus.None;
}
else
{
_loadDatasStatus = LotTrackDatasStatus.Complete;
_flowTestDatasStatus = LotTrackDatasStatus.Complete;
}
}
#endregion
#region LoaderRetry
///
/// Retry
///
///
///
private bool LoaderRetry(object[] param)
{
AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
if (alarmList != null)
{
CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), alarmList.ModuleCmd,
alarmList.ModuleStep);
}
return false;
}
#endregion
#region ConfirmComplete
///
/// 确认是否完成
///
///
///
private bool ConfirmComplete(object[] param)
{
AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
if (alarmList != null)
{
if(alarmList.ModuleState==LOADERSTATE.Unloading.ToString())
{
CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(),(int)LoaderMSG.UnloadAll,alarmList.ModuleStep);
}
else if(alarmList.ModuleState==LOADERSTATE.Loading.ToString())
{
CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.LoadAll,alarmList.ModuleStep);
}
else if (alarmList.ModuleState == LOADERSTATE.PrepreForPlacing.ToString())
{
CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.PrepareForPlace, alarmList.ModuleStep);
}
else
{
PostMsg(LoaderMSG.Error);
}
}
return false;
}
///
/// 清除报警
///
///
///
private bool ClearModuleAlarm(object[] param)
{
AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
if (alarmList != null)
{
AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), "");
}
return true;
}
#endregion
public bool Check(int msg, out string reason, params object[] args)
{
reason = "";
return false;
}
public bool CheckAcked(int msg)
{
return false;
}
public int Invoke(string function, params object[] args)
{
switch (function)
{
case "HomeAll":
if(IsIdle)
{
return (int)FSM_MSG.NONE;
}
if (CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.HomeAll))
{
return (int)FSM_MSG.NONE;
}
else
{
return (int)FSM_MSG.ALARM;
}
case "Abort":
CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.Abort);
return (int)FSM_MSG.NONE;
case "PrepareForPlace":
if (CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.PrepareForPlace))
{
return (int)LoaderMSG.PrepareForPlace;
}
else
{
return (int)FSM_MSG.NONE;
}
case "Retry":
if (CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.Retry,args))
{
return (int)LoaderMSG.Retry;
}
else
{
return (int)FSM_MSG.NONE;
}
case "ConfirmComplete":
if (CheckToPostMessage(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.ConfirmComplete, args))
{
return (int)LoaderMSG.ConfirmComplete;
}
else
{
return (int)FSM_MSG.NONE;
}
}
return (int)FSM_MSG.NONE;
}
}
public enum LoaderMSG
{
ReturnInit,
ReturnIdle,
Abort,
HomeAll,
GoToSavedPosition,
StopFlow,
SwitchOnAll,
SwitchOffAll,
Error,
ClearError,
PrepareForPlace,
UnloadAll,
LoadAll,
Retry,
ConfirmComplete
}
}