123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984 |
- 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;
- /// <summary>
- /// 是否为工程模式
- /// </summary>
- public bool IsEngineering { get; } = false;
- /// <summary>
- /// 是否为产品模式
- /// </summary>
- public bool IsProduction { get; } = true;
- public bool IsHomed
- {
- get { return _isHomed; }
- }
- /// <summary>
- /// 当前状态机状态
- /// </summary>
- public int State { get { return fsm.State; } }
- /// <summary>
- /// 是否禁用
- /// </summary>
- public bool IsDisable { get; internal set; }
- /// <summary>
- /// Rotation是否SwitchOn
- /// </summary>
- public bool IsRotationSwitchOn
- {
- get { return _rotationAxis.IsSwitchOn; }
- }
- /// <summary>
- /// ShuttleA是否SwitchOn
- /// </summary>
- public bool IsShuttleASwitchOn
- {
- get { return _shuttleAAxis.IsSwitchOn; }
- }
- /// <summary>
- /// ShuttleB是否SwitchOn
- /// </summary>
- public bool IsShuttleBSwitchOn
- {
- get { return _shuttleBAxis.IsSwitchOn; }
- }
- /// <summary>
- /// TiltA是否SwitchOn
- /// </summary>
- public bool IsTiltASwitchOn
- {
- get { return _tiltAAxis.IsSwitchOn; }
- }
- /// <summary>
- /// TiltB是否SwitchOn
- /// </summary>
- public bool IsTiltBSwitchOn
- {
- get { return _tiltBAxis.IsSwitchOn; }
- }
- /// <summary>
- /// CrsA是否SwitchOn
- /// </summary>
- public bool IsCrsASwitchOn
- {
- get { return _crsAAxis.IsSwitchOn; }
- }
- /// <summary>
- /// CrsB是否SwitchOn
- /// </summary>
- public bool IsCrsBSwitchOn
- {
- get { return _crsBAxis.IsSwitchOn; }
- }
- /// <summary>
- /// WaferHolder信息
- /// </summary>
- public WaferHolderInfo WaferHolderInfo { get { return WaferHolderManager.Instance.GetWaferHolder("Loader"); } }
- #endregion
- #region 内部变量
- private bool _isHomed = false;
- private IRoutine _currentRoutine;
- /// <summary>
- /// Loader当前unload、load操作Slot
- /// </summary>
- private Dictionary<string, List<string>> _loaderOperatingWaferInfosList = new Dictionary<string, List<string>> { { "unload", new List<string>(new string[2]) }, { "load", new List<string>(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
- /// <summary>
- /// Load LotTrackData
- /// </summary>
- private List<LoaderLotTrackData> _loadLotTrackDatas = new List<LoaderLotTrackData>();
- /// <summary>
- /// UnLoad LotTrackData
- /// </summary>
- private List<LoaderLotTrackData> _unloadLotTrackDatas = new List<LoaderLotTrackData>();
- /// <summary>
- /// UnLoad LotTrackDataBuffer
- /// </summary>
- private List<LoaderLotTrackData> _unloadLotTrackDatasBuffer = new List<LoaderLotTrackData>();
- /// <summary>
- /// LeakTest LotTrackData
- /// </summary>
- private List<LoaderFlowLotTrackData> _flowLotTrackdatas = new List<LoaderFlowLotTrackData>();
- /// <summary>
- /// LoadTime
- /// </summary>
- private List<DateTime> _loadTimeList = new List<DateTime>();
- /// <summary>
- /// LoadTime
- /// </summary>
- private List<DateTime> _unloadTimeList = new List<DateTime>();
- /// <summary>
- /// Unload Start Time
- /// </summary>
- private DateTime _unloadStartTime;
- /// <summary>
- /// LotTrackHead
- /// </summary>
- private LotTrackFileHeaderCommonData _headerdata;
- /// <summary>
- /// Load Datas Status
- private LotTrackDatasStatus _loadDatasStatus = LotTrackDatasStatus.None;
- /// <summary>
- /// Unload Datas Status
- /// </summary>
- private LotTrackDatasStatus _unloadDatasStatus = LotTrackDatasStatus.None;
- /// <summary>
- /// Unload Datas Buffer Status
- /// </summary>
- private LotTrackDatasStatus _unloadDatasBufferStatus = LotTrackDatasStatus.None;
- /// <summary>
- /// Flow Test Datas status
- /// </summary>
- private LotTrackDatasStatus _flowTestDatasStatus = LotTrackDatasStatus.None;
- #endregion
- #endregion
- /// <summary>
- /// 构造函数
- /// </summary>
- /// <param name="module"></param>
- public LoaderEntity(ModuleName module)
- {
- this.Module = module;
- _shuttleAAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.ShuttleA");
- _shuttleBAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.ShuttleB");
- _tiltAAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.TiltA");
- _tiltBAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.TiltB");
- _crsAAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.LSA");
- _crsBAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.LSB");
- _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Rotation");
- _sideA = DEVICE.GetDevice<LoaderSideDevice>($"{Module}.SideA");
- _sideB = DEVICE.GetDevice<LoaderSideDevice>($"{Module}.SideB");
- _loaderCommon = DEVICE.GetDevice<LoaderCommonDevice>($"{module}.Common");
- WaferManager.Instance.SubscribeLocation(Module, 2);
- InitialOperation();
- InitializeRoutine();
- InitialDATA();
- InitialFsm();
- }
- /// <summary>
- /// 初始化操作
- /// </summary>
- private void InitialOperation()
- {
- OP.Subscribe($"{Module}.Abort", (cmd, args) => { return CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.Abort); });
- OP.Subscribe($"{Module}.ClearError", (cmd, args) => { return CheckToPostMessage<LOADERSTATE, LoaderMSG>(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; });
- }
- /// <summary>
- /// 初始化Routine
- /// </summary>
- 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());
- }
- /// <summary>
- /// 初始化数据
- /// </summary>
- 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);
- }
- /// <summary>
- /// 初始化SVID
- /// </summary>
- 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);
- }
- /// <summary>
- /// 初始化状态机
- /// </summary>
- private void InitialFsm()
- {
- fsm = new StateMachine<LoaderEntity>(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<LOADERSTATE>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
- EnumLoop<LoaderMSG>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
- }
- /// <summary>
- /// 恢复错误
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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
- /// <summary>
- /// 进入错误状态
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- private bool EnterError(object param)
- {
- return true;
- }
- /// <summary>
- /// 进入初始化状态
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- private bool EnterInit(object param)
- {
- _isHomed = false;
- return true;
- }
- #region HomeAll
- /// <summary>
- /// Home All
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- private bool HomeAll(object[] param)
- {
- _isHomed = false;
- bool result= _homeAllRoutine.Start(param) == RState.Running;
- if (result)
- {
- _currentRoutine = _homeAllRoutine;
- }
- return result;
- }
- /// <summary>
- /// Load All监控
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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
- /// <summary>
- /// Prepare For Place
- /// </summary>
- /// <returns></returns>
- private bool PrePareForPlace(object param)
- {
- return _rotationAxis.PositionStation("TRNPA");
- }
- /// <summary>
- /// Prepare For Place监控
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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
- /// <summary>
- /// Unload All
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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<string>();
- }
- return result;
- }
- /// <summary>
- /// Retry UloadAll
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// Unload All监控
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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<RouteManager>.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;
- }
- /// <summary>
- /// 确认UnloadAll是否完成
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- private bool ConfirmUnloadAll(object[] param)
- {
- int stepIdex=(int)param[0];
- bool result = _unloadAllSideRoutine.CheckCompleteCondition(stepIdex);
- if(!result)
- {
- if (Singleton<RouteManager>.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<RouteManager>.Instance.IsAutoRunning)
- {
- AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), LOADERSTATE.Unloading.ToString());
- }
- }
- return result;
- }
- #endregion
- #region Load All
- /// <summary>
- /// Load All
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// Retry LoadAll
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 监控LoadAll
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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<RouteManager>.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;
- }
- /// <summary>
- /// 确认UnloadAll是否完成
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- private bool ConfirmLoadAll(object[] param)
- {
- int stepIdex = (int)param[0];
- bool result = _loadAllSideRoutine.CheckCompleteCondition(stepIdex);
- if (!result)
- {
- if (Singleton<RouteManager>.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<RouteManager>.Instance.IsAutoRunning)
- {
- AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(),LOADERSTATE.Loading.ToString());
- }
- }
- return result;
- }
- #endregion
- #region LotTrack
- /// <summary>
- /// 获取Wafer信息
- /// </summary>
- private List<string> GetWaferInfo(bool clearPath = false)
- {
- List<string> waferIDs = new List<string>(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;
- }
- /// <summary>
- /// 清除信息
- /// </summary>
- private void LotTrackDataClear()
- {
- _headerdata = null;
- _loadLotTrackDatas.Clear();
- _unloadLotTrackDatas.Clear();
- _flowLotTrackdatas.Clear();
- _loadTimeList.Clear();
- _unloadTimeList.Clear();
- _loaderOperatingWaferInfosList["load"].Clear();
- _loaderOperatingWaferInfosList["unload"].Clear();
- }
- /// <summary>
- /// 设置Load LotTrackDatas记录状态
- /// </summary>
- /// <param name="stepIndex"></param>
- 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
- /// <summary>
- /// Retry
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- private bool LoaderRetry(object[] param)
- {
- AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
- if (alarmList != null)
- {
- CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), alarmList.ModuleCmd,
- alarmList.ModuleStep);
- }
- return false;
- }
- #endregion
- #region ConfirmComplete
- /// <summary>
- /// 确认是否完成
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- private bool ConfirmComplete(object[] param)
- {
- AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
- if (alarmList != null)
- {
- if(alarmList.ModuleState==LOADERSTATE.Unloading.ToString())
- {
- CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(),(int)LoaderMSG.UnloadAll,alarmList.ModuleStep);
- }
- else if(alarmList.ModuleState==LOADERSTATE.Loading.ToString())
- {
- CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.LoadAll,alarmList.ModuleStep);
- }
- else if (alarmList.ModuleState == LOADERSTATE.PrepreForPlacing.ToString())
- {
- CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.PrepareForPlace, alarmList.ModuleStep);
- }
- else
- {
- PostMsg(LoaderMSG.Error);
- }
- }
- return false;
- }
- /// <summary>
- /// 清除报警
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- 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<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.HomeAll))
- {
- return (int)FSM_MSG.NONE;
- }
- else
- {
- return (int)FSM_MSG.ALARM;
- }
- case "Abort":
- CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.Abort);
- return (int)FSM_MSG.NONE;
- case "PrepareForPlace":
- if (CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.PrepareForPlace))
- {
- return (int)LoaderMSG.PrepareForPlace;
- }
- else
- {
- return (int)FSM_MSG.NONE;
- }
- case "Retry":
- if (CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.ERR_LOADER, Module.ToString(), (int)LoaderMSG.Retry,args))
- {
- return (int)LoaderMSG.Retry;
- }
- else
- {
- return (int)FSM_MSG.NONE;
- }
- case "ConfirmComplete":
- if (CheckToPostMessage<LOADERSTATE, LoaderMSG>(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
- }
- }
|