| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894 | using System;using System.Collections.Generic;using Aitex.Core.Common;using Aitex.Core.RT.DataCenter;using Aitex.Core.RT.Event;using Aitex.Core.RT.Fsm;using Aitex.Core.RT.Log;using Aitex.Core.RT.OperationCenter;using Aitex.Core.RT.Routine;using Aitex.Core.Util;using Aitex.Core.Utilities;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.SubstrateTrackings;using MECF.Framework.RT.Core.Applications;using MECF.Framework.RT.Core.IoProviders;using MECF.Framework.RT.ModuleLibrary.Commons;using MECF.Framework.RT.ModuleLibrary.SystemModules.Routines;using Venus_Core;namespace MECF.Framework.RT.ModuleLibrary.SystemModules{    public enum RtState    {        Init,        Initializing,        Idle,        Transfer,        AutoRunning,        AutoIdle,        ReturnAllWafer,        Error,    }    public  class EquipmentManager : FsmDevice    {        public enum MSG        {            MoveWafer,            ReturnAllWafer,            Stop,            HOME,            RESET,            ABORT,            ERROR,            ToInit,            SetAutoMode,            SetManualMode,            CreateJob,            PauseJob,            ResumeJob,            StartJob,            StopJob,            AbortJob,            JobDone,            ModuleError,            Map,        }        public static Dictionary<ModuleName, ModuleFsmDevice> Modules { get; set; }        public bool IsAutoMode        {            get            {                return FsmState == (int)RtState.AutoRunning || FsmState == (int)RtState.AutoIdle;            }        }        public bool IsInit        {            get { return FsmState == (int)RtState.Init; }        }        public bool IsIdle        {            get { return FsmState == (int)RtState.Idle; }        }        public bool IsAlarm        {            get { return FsmState == (int)RtState.Error; }        }        public bool IsRunning        {            get            {                return !IsAlarm && !IsIdle && !IsInit && (FsmState != (int)RtState.AutoIdle);            }        }        private bool _isInited;        protected IRoutine _manualTransfer;        protected IAutoTransfer _auto;        protected IRoutine _homeAll;        protected IRoutine _returnAll;        private List<string> _modules;        public EquipmentManager()        {            Module = "System";            Name = "System";            Modules = new Dictionary<ModuleName, ModuleFsmDevice>();            _modules = new List<string>() { "System" };        }        public override bool Initialize()        {            InitDevices();            InitModules();            EnumLoop<RtState>.ForEach((item) =>            {                MapState((int)item, item.ToString());            });            EnumLoop<MSG>.ForEach((item) =>            {                MapMessage((int)item, item.ToString());            });            EnableFsm(100, RtState.Init);            BuildTransitionTable();            SubscribeDataVariable();            SubscribeOperation();            InitRoutine();            Singleton<EventManager>.Instance.OnAlarmEvent += Instance_OnAlarmEvent;             return true;        }        protected void BuildModules(params ModuleFsmDevice[] modules)        {            if (modules != null && modules.Length > 0)            {                foreach (var moduleFsmDevice in modules)                {                    Modules[ModuleHelper.Converter(moduleFsmDevice.Module)] = moduleFsmDevice;                }                foreach (var modulesKey in Modules.Keys)                {                    _modules.Add(modulesKey.ToString());                }                foreach (var modulesValue in Modules.Values)                {                    modulesValue.Initialize();                }            }        }        protected virtual void InitRoutine()        {         }        protected  virtual void InitModules()        {        }        protected virtual void InitDevices()        {        }        //private PeriodicJob _job1;        //Stopwatch _sw = new Stopwatch();        //private bool OnJob1()        //{        //    _sw.Restart();        //    BufferModule buffer = Modules[ModuleName.Buffer] as BufferModule;        //    if (!buffer.CheckToPostMessage(BufferModule.MSG.InTransfer))        //    {        //        System.Diagnostics.Trace.Assert(false)        //        System.Diagnostics.Trace.WriteLine("fail to in transfer");        //    }        //    if (buffer.IsIdle)        //    {        //        System.Diagnostics.Trace.Assert(false);        //        System.Diagnostics.Trace.WriteLine("!!!==========>IsIdle");        //    }        //    //System.Diagnostics.Trace.Assert(buffer.IsIdle, $"in {buffer.StringFsmStatus}");        //    while (buffer.IsIdle)        //    {        //        Thread.Sleep(5);        //    }        //    //buffer.NoteTransferStop(ModuleName.EfemRobot, Hand.Blade1, 0, EnumTransferType.Place);        //    //Thread.Sleep(15);        //    if (!buffer.CheckToPostMessage(BufferModule.MSG.TransferComplete))        //    {        //        System.Diagnostics.Trace.Assert(false);        //        System.Diagnostics.Trace.WriteLine("fail to complete");        //    }        //    //if (!buffer.IsIdle)        //    //{        //    //    System.Diagnostics.Trace.WriteLine("not idle");        //    //}        //    System.Diagnostics.Trace.WriteLine($" === {_sw.ElapsedMilliseconds}");        //    while (!buffer.IsIdle)        //    {        //        Thread.Sleep(5);        //    }        //    return true;        //}        private void BuildTransitionTable()        {            //Init sequence            Transition(RtState.Init, MSG.HOME, FsmStartHome, RtState.Initializing);            Transition(RtState.Idle, MSG.HOME, FsmStartHome, RtState.Initializing);            Transition(RtState.Error, MSG.HOME, FsmStartHome, RtState.Initializing);            Transition(RtState.Error, MSG.ToInit, null, RtState.Init);             Transition(RtState.Initializing, FSM_MSG.TIMER, FsmMonitorHome, RtState.Idle);            Transition(RtState.Initializing, MSG.ERROR, fError, RtState.Error);            Transition(RtState.Initializing, MSG.ABORT, FsmAbort, RtState.Init);            //Reset            AnyStateTransition(MSG.RESET, fStartReset, RtState.Idle);            AnyStateTransition(MSG.ERROR, fError, RtState.Error);            AnyStateTransition((int)FSM_MSG.ALARM, fError, (int)RtState.Error);            //Auto/manual sequence            Transition(RtState.Idle, MSG.SetAutoMode, fStartAutoTransfer, RtState.AutoIdle);            Transition(RtState.AutoRunning, FSM_MSG.TIMER, fAutoTransfer, RtState.AutoRunning);            Transition(RtState.AutoRunning, MSG.ABORT, FsmAbort, RtState.AutoIdle);            Transition(RtState.AutoRunning, MSG.JobDone, null, RtState.AutoIdle);             Transition(RtState.AutoRunning, MSG.CreateJob, FsmCreateJob, RtState.AutoRunning);            Transition(RtState.AutoRunning, MSG.StartJob, FsmStartJob, RtState.AutoRunning);            Transition(RtState.AutoRunning, MSG.PauseJob, FsmPauseJob, RtState.AutoRunning);            Transition(RtState.AutoRunning, MSG.ResumeJob, FsmResumeJob, RtState.AutoRunning);            Transition(RtState.AutoRunning, MSG.StopJob, FsmStopJob, RtState.AutoRunning);             Transition(RtState.AutoRunning, MSG.AbortJob, FsmAbortJob, RtState.AutoRunning);            Transition(RtState.AutoRunning, MSG.ModuleError, FsmModuleError, RtState.AutoRunning);            Transition(RtState.AutoRunning, MSG.Map, FsmMap, RtState.AutoRunning);            EnterExitTransition<RtState, FSM_MSG>(RtState.AutoRunning, null, FSM_MSG.NONE, fExitAutoTransfer);            Transition(RtState.AutoIdle, FSM_MSG.TIMER, FsmMonitorAutoIdle, RtState.AutoIdle);            Transition(RtState.AutoIdle, MSG.SetManualMode, FsmStartSetManualMode, RtState.Idle);            Transition(RtState.AutoIdle, MSG.CreateJob, FsmCreateJob, RtState.AutoIdle);            Transition(RtState.AutoIdle, MSG.StartJob, FsmStartJob, RtState.AutoRunning);            Transition(RtState.AutoIdle, MSG.ABORT, FsmAbort, RtState.AutoIdle);            Transition(RtState.AutoIdle, MSG.AbortJob, FsmAbortJob, RtState.AutoIdle);            Transition(RtState.AutoIdle, MSG.Map, FsmMap, RtState.AutoIdle);            //return all wafer            Transition(RtState.Idle, MSG.ReturnAllWafer, FsmStartReturnAllWafer, RtState.ReturnAllWafer);            Transition(RtState.ReturnAllWafer, FSM_MSG.TIMER, FsmMonitorReturnAllWafer, RtState.Idle);            Transition(RtState.ReturnAllWafer, MSG.ABORT, FsmAbortReturnAllWafer, RtState.Idle);            //Transfer sequence            Transition(RtState.Idle, MSG.MoveWafer, fStartTransfer, RtState.Transfer);            Transition(RtState.Transfer, FSM_MSG.TIMER, fTransfer, RtState.Idle);            EnterExitTransition<RtState, FSM_MSG>(RtState.Transfer, null, FSM_MSG.NONE, fExitTransfer);            Transition(RtState.Transfer, MSG.ABORT, FsmAbort, RtState.Idle);        }        void SubscribeDataVariable()        {            DATA.Subscribe("Rt.Status", () => StringFsmStatus);            DATA.Subscribe("System.IsIdle", () => IsIdle || IsInit || (FsmState == (int)RtState.AutoIdle));            DATA.Subscribe("System.IsAlarm", () => IsAlarm);            DATA.Subscribe("System.IsBusy", () => IsRunning);            DATA.Subscribe("System.IsAutoRunning", () => IsRunning);            DATA.Subscribe("System.Modules", () => _modules);        }        void SubscribeOperation()        {            OP.Subscribe("Create8InchWafer", InvokeCreate8InchWafer);            OP.Subscribe("Create12InchWafer", InvokeCreate12InchWafer);            OP.Subscribe("DeleteWafer", InvokeDeleteWafer);            OP.Subscribe("ReturnWafer", InvokeReturnWafer);            OP.Subscribe("System.ReturnAllWafer", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.ReturnAllWafer);            });            OP.Subscribe("System.MoveWafer", (string cmd, object[] args) =>            {                if (!Enum.TryParse((string)args[0], out ModuleName source))                {                    EV.PostWarningLog(Name, $"Parameter source {(string)args[0]} not valid");                    return false;                }                if (!Enum.TryParse((string)args[2], out ModuleName destination))                {                    EV.PostWarningLog(Name, $"Parameter destination {(string)args[1]} not valid");                    return false;                }                if (args.Length > 8)                {                    return CheckToPostMessage((int)MSG.MoveWafer, source, (int)args[1], destination, (int)args[3],                        (bool)args[4], (int)args[5], (bool)args[6], (int)args[7]);                }                else if (args.Length > 5)                {                    return CheckToPostMessage((int)MSG.MoveWafer, source, (int)args[1], destination, (int)args[3], (bool)args[4]);                }                return CheckToPostMessage((int)MSG.MoveWafer, source, (int)args[1], destination, (int)args[3]);            });            OP.Subscribe("System.HomeAll", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.HOME);            });            OP.Subscribe("System.Abort", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.ABORT);            });            OP.Subscribe("System.Reset", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.RESET);            });            OP.Subscribe("System.SetAutoMode", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.SetAutoMode);            });            OP.Subscribe("System.SetManualMode", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.SetManualMode);            });            OP.Subscribe("System.CreateJob", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.CreateJob, args[0]);            });            OP.Subscribe("System.StartJob", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.StartJob, args[0]);            });                    OP.Subscribe("System.PauseJob", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.PauseJob, args[0]);            });            OP.Subscribe("System.ResumeJob", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.ResumeJob, args[0]);            });            OP.Subscribe("System.StopJob", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.StopJob, args[0]);            });            OP.Subscribe("System.AbortJob", (string cmd, object[] args) =>            {                return CheckToPostMessage((int)MSG.AbortJob, args[0]);            });            OP.Subscribe("System.ShutDown", InvokeShutDown);            OP.Subscribe("System.MapWafer", InvokeEfemMap);        }        private void Instance_OnAlarmEvent(EventItem obj)        {        }        #region Init        private bool FsmStartHome(object[] objs)        {            _isInited = false;            return _homeAll.Start() == Venus_Core.RState.Running;        }        private bool FsmMonitorHome(object[] objs)        {            RState ret = _homeAll.Monitor();            if (ret == RState.End)            {                _isInited = true;                return true;            }            if (ret == RState.Failed)            {                PostMsg(MSG.ERROR);            }            return false;        }        private bool fError(object[] objs)        {            if (FsmState == (int)RtState.Transfer)            {            }            return true;        }        #endregion        #region AutoTransfer        private bool FsmMonitorAutoIdle(object[] param)        {            RState ret = _auto.Monitor();            if (!_auto.CheckAllJobDone())            {                return false;            }            return ret == RState.End;        }        private bool FsmStartSetManualMode(object[] objs)        {            if (_auto.HasJobRunning)            {                EV.PostWarningLog("System", "Can not change to manual mode, abort running job first");                return false;            }            return true;        }        private bool fStartAutoTransfer(object[] objs)        {            RState ret = _auto.Start(objs);            return ret == RState.Running;        }        private bool fAutoTransfer(object[] objs)        {            RState ret = _auto.Monitor();            if (_auto.CheckAllJobDone())            {                if (!CheckToPostMessage((int)MSG.JobDone))                    return false;            }            return ret == RState.End;        }        private bool fExitAutoTransfer(object[] objs)        {            return true;        }        private bool fAbortAutoTransfer(object[] objs)        {            return true;        }        #endregion         #region  return all wafer        private bool FsmAbortReturnAllWafer(object[] param)        {            return true;        }        private bool FsmMonitorReturnAllWafer(object[] param)        {            return _returnAll.Monitor() == RState.End;        }        private bool FsmStartReturnAllWafer(object[] param)        {            return _returnAll.Start() == RState.Running;        }        #endregion        #region Transfer        private bool fStartTransfer(object[] objs)        {            RState ret = _manualTransfer.Start(objs);            if (ret == RState.Failed || ret == RState.End)                return false;            return ret == RState.Running;        }        private bool fTransfer(object[] objs)        {            RState ret = _manualTransfer.Monitor();            if (ret == RState.Failed)            {                PostMsg(MSG.ERROR);                return false;            }            return ret == RState.End;        }        private bool fExitTransfer(object[] objs)        {             return true;        }        private bool fAbortTransfer(object[] objs)        {            return true;        }        #endregion        #region reset        private bool fStartReset(object[] objs)        {            EV.ClearAlarmEvent();            //Singleton<DeviceEntity>.Instance.PostMsg(DeviceEntity.MSG.RESET);            IoProviderManager.Instance.Reset();            foreach (var modulesValue in Modules.Values)            {                modulesValue.Reset();            }            if (FsmState == (int)RtState.Error)            {                if (!_isInited)                {                    PostMsg(MSG.ToInit);                    return false;                }                return true;            }            return false;        }        #endregion        private bool FsmCreateJob(object[] param)        {            _auto.CreateJob((Dictionary<string, object>)param[0]);            return true;        }        private bool FsmAbortJob(object[] param)        {            _auto.AbortJob((string)param[0]);            return true;        }        private bool FsmStopJob(object[] param)        {            _auto.StopJob((string)param[0]);            //CheckToPostMessage((int)MSG.StopJob);//            return true;        }        private bool FsmResumeJob(object[] param)        {            _auto.ResumeJob((string)param[0]);            return true;        }        private bool FsmPauseJob(object[] param)        {            _auto.PauseJob((string)param[0]);            return true;        }        private bool FsmStartJob(object[] param)        {            return _auto.StartJob((string)param[0]);        }        private bool FsmAbort(object[] param)        {            if (FsmState == (int)RtState.Transfer)            {               // _manualTransfer.Clear();            }            if (FsmState == (int)RtState.AutoRunning)            {                _auto.Clear();            }            if (FsmState == (int)RtState.Initializing)            {                _homeAll.Abort();            }            return true;        }        private bool FsmModuleError(object[] param)        {            _auto.ModuleError((string)param[0]);            return true;        }        private bool FsmMap(object[] param)        {            _auto.Map((string)param[0]);            return true;        }        private bool InvokeReturnWafer(string arg1, object[] args)        {            ModuleName target = ModuleHelper.Converter(args[0].ToString());            int slot = (int)args[1];            if (ModuleHelper.IsLoadPort(target))            {                EV.PostInfoLog("System", string.Format("Wafer already at LoadPort {0} {1}, return operation is not valid", target.ToString(), slot + 1));                return false;            }            if (!WaferManager.Instance.IsWaferSlotLocationValid(target, slot))            {                EV.PostWarningLog("System", string.Format("Invalid position,{0},{1}", target.ToString(), slot.ToString()));                return false;            }            WaferInfo wafer = WaferManager.Instance.GetWafer(target, slot);            if (wafer.IsEmpty)            {                EV.PostInfoLog("System", string.Format("No wafer at {0} {1}, return operation is not valid", target.ToString(), slot + 1));                return false;            }            return CheckToPostMessage((int)MSG.MoveWafer,                target, slot,                (ModuleName)wafer.OriginStation, wafer.OriginSlot,                false, 0, false, 0);        }        private bool InvokeDeleteWafer(string arg1, object[] args)        {            ModuleName chamber = ModuleHelper.Converter(args[0].ToString());            int slot = (int)args[1];            if (WaferManager.Instance.IsWaferSlotLocationValid(chamber, slot))            {                if (WaferManager.Instance.CheckHasWafer(chamber, slot))                {                    WaferManager.Instance.DeleteWafer(chamber, slot);                    EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDelete, chamber.ToString(), slot + 1);                }                else                {                    EV.PostInfoLog("System", string.Format("No wafer at {0} {1}, delete not valid", chamber.ToString(), slot + 1));                }            }            else            {                EV.PostWarningLog("System", string.Format("Invalid position,{0},{1}", chamber.ToString(), slot.ToString()));                return false;            }            return true;        }        private bool InvokeCreate8InchWafer(string arg1, object[] args)        {            ModuleName chamber = ModuleHelper.Converter(args[0].ToString());            int slot = (int)args[1];            WaferStatus state = WaferStatus.Normal;            //if (ModuleHelper.IsLoadPort(chamber))            //{            //    var lp = Modules[chamber] as LoadPortModule;            //    if (lp.LPDevice.CassetteState != LoadportCassetteState.Normal)            //    {            //        EV.PostWarningLog("System", $"Can not create wafer at {chamber}.{slot + 1}, Cassette not placed.");            //        return false;            //    }            //}            if (WaferManager.Instance.IsWaferSlotLocationValid(chamber, slot))            {                if (WaferManager.Instance.CheckHasWafer(chamber, slot))                {                    EV.PostInfoLog("System", string.Format("{0} slot {1} already has wafer.create wafer is not valid", chamber, slot));                }                else if (WaferManager.Instance.CreateWafer(chamber, slot, state,WaferSize.WS8) != null)                {                    EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferCreate, chamber.ToString(), slot + 1, state.ToString());                }            }            else            {                EV.PostWarningLog("System", string.Format("Invalid position,{0},{1}", chamber.ToString(), slot.ToString()));                return false;            }            return true;        }        private bool InvokeCreate12InchWafer(string arg1, object[] args)        {            ModuleName chamber = ModuleHelper.Converter(args[0].ToString());            int slot = (int)args[1];            WaferStatus state = WaferStatus.Normal;            //if (ModuleHelper.IsLoadPort(chamber))            //{            //    var lp = Modules[chamber] as LoadPortModule;            //    if (lp.LPDevice.CassetteState != LoadportCassetteState.Normal)            //    {            //        EV.PostWarningLog("System", $"Can not create wafer at {chamber}.{slot + 1}, Cassette not placed.");            //        return false;            //    }            //}            if (WaferManager.Instance.IsWaferSlotLocationValid(chamber, slot))            {                if (WaferManager.Instance.CheckHasWafer(chamber, slot))                {                    EV.PostInfoLog("System", string.Format("{0} slot {1} already has wafer.create wafer is not valid", chamber, slot));                }                else if (WaferManager.Instance.CreateWafer(chamber, slot, state,WaferSize.WS12) != null)                {                    EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferCreate, chamber.ToString(), slot + 1, state.ToString());                }            }            else            {                EV.PostWarningLog("System", string.Format("Invalid position,{0},{1}", chamber.ToString(), slot.ToString()));                return false;            }            return true;        }        private bool InvokeShutDown(string arg1, object[] arg2)        {            if (IsAlarm || IsIdle || IsInit)            {                EV.PostWarningLog(Module, $"System start shut down");                EV.PostKickoutMessage("ShutDown");                RtApplication.Instance.Terminate();                return true;            }            EV.PostWarningLog(Module, $"System in {StringFsmStatus} mode, can not shut down");            return false;        }        private bool InvokeEfemMap(string arg1, object[] arg2)        {            ModuleName target = ModuleHelper.Converter((string)arg2[0]);            if (!ModuleHelper.IsLoadPort(target))            {                EV.PostWarningLog("System", $"Invalid map target {target}");                return false;            }            for (int i = 0; i < 25; i++)            {                WaferInfo wafer = WaferManager.Instance.GetWafer(target, i);                if (wafer.IsEmpty)                    continue;                if (wafer.ProcessState == EnumWaferProcessStatus.Completed ||                    wafer.ProcessState == EnumWaferProcessStatus.Failed)                {                    EV.PostWarningLog("System", $"{target} wafer is processed, can not map again");                    return false;                }            }            if (IsAutoMode)            {               _auto.Map((string)arg2[0]);                return true;            }            //EfemModule efem = Modules[ModuleName.EfemRobot] as EfemModule;            //if (!efem.Map(ModuleHelper.Converter((string) arg2[0]), out string reason))            //{            //    EV.PostWarningLog(Module, reason);            //}            return true;        }        private void OnModuleError(string module)        {            if (FsmState == (int)RtState.AutoRunning)            {                ModuleName mod = ModuleHelper.Converter(module);                PostMsg(MSG.ModuleError, module);            }        }        public override void Monitor()        {            base.Monitor();            try            {            }            catch (Exception ex)            {                LOG.WriteExeption(ex);            }        }     }}
 |