| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 | using Aitex.Core.RT.RecipeCenter;using Aitex.Core.Util;using MECF.Framework.Common.Routine;using CyberX8_RT.Devices.EFEM;using CyberX8_RT.Dispatch;using CyberX8_RT.Modules.LPs;using SecsGem.Core.Application;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Aitex.Core.RT.Log;using MECF.Framework.Common.Jobs;namespace CyberX8_RT.Modules{    public class FaRemoteManager: Singleton<FaRemoteManager>, IEquipmentCommand    {        #region 内部变量        private SchedulerFACallback fACallback = new SchedulerFACallback();        #endregion        #region 属性        /// <summary>        /// Job Cycle对象        /// </summary>        public ICycle JobCycle { get; set; }        #endregion        #region Fa接口        /// <summary>        /// 接口指令        /// </summary>        /// <param name="command"></param>        /// <param name="paras"></param>        /// <param name="reason"></param>        /// <returns></returns>        public bool ExcuteCommand(string command, object[] paras, out string reason)        {            reason = "";            switch (command.ToUpper())            {                case "PP-SELECT":                    return FaCreateJob(paras, out reason);                case "STARTJOB":                    return FaStartJob(paras[0].ToString(), out reason);                case "STOPJOB":                    return FaStopJob(paras[0].ToString(), out reason);                case "PAUSEJOB":                    return FaPauseJob(paras[0].ToString(), out reason);                case "RESUMEJOB":                    return FaResumeJob(paras[0].ToString(), out reason);                case "MAPCASSETTE":                    return FaMapCassete(paras[0].ToString(), out reason);                case "LOAD":                    return FaLoad(paras[0].ToString(), out reason);                case "UNLOAD":                    return FaUnLoad(paras[0].ToString(), out reason);                case "READID":                    return FaReadId(paras[0].ToString(), out reason);                case "WRITEID":                    return FaWriteId(paras[0].ToString(), paras[1].ToString(), out reason);                default:                    reason = $"{command} is not supported";                    return false;            }        }        /// <summary>        /// Fa创建任务        /// </summary>        /// <param name="paras"></param>        /// <param name="reason"></param>        /// <returns></returns>        private bool FaCreateJob(object[] paras, out string reason)        {            if (!Singleton<RouteManager>.Instance.IsFaAutoMode)            {                reason = "System is not in Auto,cannot create job";                return false;            }            else            {                Dictionary<string, object> createParams = new Dictionary<string, object>();                string jobId = paras[1].ToString();                string module = $"LP{paras[0]}";                string lotId=paras[2].ToString();                createParams["Module"] =module;                createParams["JobId"] = jobId;                createParams["LotId"]=lotId;                createParams["SlotSequence"] = (string[])paras[3];                createParams["AutoStart"] = true;                bool result= JobCycle.CreateJob(createParams, out reason);                if(result)                {                    FaJobManager.Instance.Add(jobId);                    fACallback.JobCreated(JobProcesser.Instance.GetControlJobInfoByName(jobId));                }                else                {                    fACallback.JobCreateFailed(module, lotId, jobId,reason);                }                return result;            }        }        /// <summary>        /// Fa启动任务        /// </summary>        /// <param name="jobName"></param>        /// <param name="reason"></param>        /// <returns></returns>        private bool FaStartJob(string jobName, out string reason)        {            if (!Singleton<RouteManager>.Instance.IsFaAutoMode)            {                reason = "System is not in Auto,cannot start job";                return false;            }            bool result = JobCycle.StartJob(jobName, out reason);            if (result)            {                Singleton<RouteManager>.Instance.CheckToPostMessage((int)RouteManager.MSG.FaStartJob);            }            return result;        }        /// <summary>        /// Fa停止任务        /// </summary>        /// <param name="jobName"></param>        /// <param name="reason"></param>        /// <returns></returns>        private bool FaStopJob(string jobName, out string reason)        {            if (!Singleton<RouteManager>.Instance.IsFaAutoMode)            {                reason = "System is not in Auto,cannot stop job";                return false;            }            return JobCycle.StopJob(jobName, out reason);        }        /// <summary>        /// Fa暂停任务        /// </summary>        /// <param name="jobName"></param>        /// <param name="reason"></param>        /// <returns></returns>        private bool FaPauseJob(string jobName, out string reason)        {            if (!Singleton<RouteManager>.Instance.IsFaAutoMode)            {                reason = "System is not in Auto,cannot pause job";                return false;            }            return JobCycle.PauseJob(jobName, out reason);        }        /// <summary>        /// Fa恢复任务        /// </summary>        /// <param name="jobName"></param>        /// <param name="reason"></param>        /// <returns></returns>        private bool FaResumeJob(string jobName, out string reason)        {            if (!Singleton<RouteManager>.Instance.IsFaAutoMode)            {                reason = "System is not in Auto,cannot resume job";                return false;            }            return JobCycle.ResumeJob(jobName, out reason);        }        /// <summary>        /// Fa Load        /// </summary>        /// <param name="lp"></param>        /// <returns></returns>        private bool FaLoad(string lp, out string reason)        {            return ExecuteMsg(lp, (int)LoadPortModule.MSG.Load, out reason);        }        /// <summary>        /// 获取LoadPort对象        /// </summary>        /// <param name="lp"></param>        /// <param name="reason"></param>        /// <returns></returns>        private LoadPortModule FaGetLoadPort(string lp, out string reason)        {            reason = "";            if (int.TryParse(lp, out var lpValue))            {                EfemEntity efemEntity = Singleton<RouteManager>.Instance.GetModule<EfemEntity>("EFEM");                LoadPortModule loadPortModule =efemEntity.GetLoadportModule(lpValue-1);                if (loadPortModule != null)                {                    if (loadPortModule.LPDevice.HasCassette)                    {                        return loadPortModule;                    }                    else                    {                        reason = $"LP{lpValue} not found carrier, can not load";                        return null;                    }                }                else                {                    reason = $"LP{lp} is null";                    return null;                }            }            else            {                reason = $"{lp} is invalid data";                return null;            }        }        /// <summary>        /// 读取Id        /// </summary>        /// <param name="lp"></param>        /// <returns></returns>        private bool FaMapCassete(string lp, out string reason)        {            return ExecuteMsg(lp, (int)LoadPortModule.MSG.Map, out reason);        }        /// <summary>        /// 读取Id        /// </summary>        /// <param name="lp"></param>        /// <returns></returns>        private bool FaReadId(string lp, out string reason)        {            return ExecuteMsg(lp, (int)LoadPortModule.MSG.ReadCarrierId, out reason);        }        /// <summary>        /// 读取Id        /// </summary>        /// <param name="lp"></param>        /// <returns></returns>        private bool FaWriteId(string lp, string carrierId, out string reason)        {            return ExecuteMsg(lp, (int)LoadPortModule.MSG.WriteCarrierID, out reason);        }        /// <summary>        /// Fa Unload        /// </summary>        /// <param name="lp"></param>        /// <returns></returns>        private bool FaUnLoad(string lp, out string reason)        {            ControlJobInfo controlJobInfo = JobProcesser.Instance.GetControlJobInfoByLoadPort(lp);            if (controlJobInfo != null)            {                reason = $"{lp} has controljob {controlJobInfo.Name},cannot unload";                return false;            }            return ExecuteMsg(lp, (int)LoadPortModule.MSG.Unload, out reason);        }        /// <summary>        /// 执行消息        /// </summary>        /// <param name="lp"></param>        /// <param name="msg"></param>        /// <param name="reason"></param>        /// <returns></returns>        private bool ExecuteMsg(string lp,int msg,out string reason)        {            if (!CheckAuto())            {                reason = "System is not in Auto";                return false;            }            LoadPortModule loadport = FaGetLoadPort(lp, out reason);            if (loadport != null)            {                bool result = loadport.CheckToPostMessage(msg);                if (!result)                {                    reason = $"{lp} in invalid state";                }                return result;            }            else            {                reason = $"{lp} is not LoadPort";                return false;            }        }        /// <summary>        /// 获取所有Sequence        /// </summary>        /// <returns></returns>        public string[] GetSequenceList()        {            return RecipeFileManager.Instance.GetProductionRecipeList().ToArray();        }        /// <summary>        /// 获取recipe内容        /// </summary>        /// <param name="ppid"></param>        /// <returns></returns>        public string GetSequenceBody(string ppid)        {                        return RecipeFileManager.Instance.LoadRecipeContent(ppid);        }        /// <summary>        /// 获取固定格式的Recipe内容         /// </summary>        /// <param name="ppid"></param>        /// <returns></returns>        public List<string> GetFormatedSequence(string ppid)        {            List<string> result = new List<string>();            string reason = string.Empty;            try            {                string content = RecipeFileManager.Instance.LoadRecipeContent(ppid);                result.Add(content);            }            catch (Exception ex)            {                reason = ex.Message;            }            return result;        }        /// <summary>        /// 删除Sequence        /// </summary>        /// <param name="ppid"></param>        /// <returns></returns>        public bool deleteSequence(string ppid)        {            return false;        }        /// <summary>        /// 更新Sequence        /// </summary>        /// <param name="ppid"></param>        /// <param name="body"></param>        /// <returns></returns>        public bool UpdateSequence(string ppid, string body)        {            return false;        }        public void ShowTerminalMessage(string message)        {        }        public bool CreateProcessJob(string processJobId, string sequenceName, string carrierId, out string reason)        {            reason = "";            return true;        }        public void UpdateProcessJobCarrierSlot(string processJobId, string moduleName, List<int> slots)        {        }        public void CreateControlJob(string controlJobId, string carrierId, List<string> processJobs)        {        }        public bool CheckCreateControlJobCondition(List<string> modules, out string reason)        {            reason = "";            return true;        }        public bool StartControlJob(string controlJob)        {            return true;        }        public bool StopControlJob(string controlJob)        {            return true;        }        public bool AbortControlJob(string controlJob)        {            return true;        }        public bool PauseControlJob(string controlJob)        {            return true;        }        public bool ResumeControlJob(string controlJob)        {            return true;        }        public bool CheckAuto()        {            return Singleton<RouteManager>.Instance.IsAutoMode;        }        public void UpdateControlJobModule(string controlJobId, string moduleName)        {        }        public void WriteWarningLog(string msg)        {        }        public void WriteErrorLog(string msg)        {        }        public void WriteInfoLog(string msg)        {        }        #endregion    }}
 |