FaRemoteManager.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. using Aitex.Core.RT.RecipeCenter;
  2. using Aitex.Core.Util;
  3. using MECF.Framework.Common.Routine;
  4. using CyberX8_RT.Devices.EFEM;
  5. using CyberX8_RT.Dispatch;
  6. using CyberX8_RT.Modules.LPs;
  7. using SecsGem.Core.Application;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using Aitex.Core.RT.Log;
  14. using MECF.Framework.Common.Jobs;
  15. namespace CyberX8_RT.Modules
  16. {
  17. public class FaRemoteManager: Singleton<FaRemoteManager>, IEquipmentCommand
  18. {
  19. #region 内部变量
  20. private SchedulerFACallback fACallback = new SchedulerFACallback();
  21. #endregion
  22. #region 属性
  23. /// <summary>
  24. /// Job Cycle对象
  25. /// </summary>
  26. public ICycle JobCycle { get; set; }
  27. #endregion
  28. #region Fa接口
  29. /// <summary>
  30. /// 接口指令
  31. /// </summary>
  32. /// <param name="command"></param>
  33. /// <param name="paras"></param>
  34. /// <param name="reason"></param>
  35. /// <returns></returns>
  36. public bool ExcuteCommand(string command, object[] paras, out string reason)
  37. {
  38. reason = "";
  39. switch (command.ToUpper())
  40. {
  41. case "PP-SELECT":
  42. return FaCreateJob(paras, out reason);
  43. case "STARTJOB":
  44. return FaStartJob(paras[0].ToString(), out reason);
  45. case "STOPJOB":
  46. return FaStopJob(paras[0].ToString(), out reason);
  47. case "PAUSEJOB":
  48. return FaPauseJob(paras[0].ToString(), out reason);
  49. case "RESUMEJOB":
  50. return FaResumeJob(paras[0].ToString(), out reason);
  51. case "MAPCASSETTE":
  52. return FaMapCassete(paras[0].ToString(), out reason);
  53. case "LOAD":
  54. return FaLoad(paras[0].ToString(), out reason);
  55. case "UNLOAD":
  56. return FaUnLoad(paras[0].ToString(), out reason);
  57. case "READID":
  58. return FaReadId(paras[0].ToString(), out reason);
  59. case "WRITEID":
  60. return FaWriteId(paras[0].ToString(), paras[1].ToString(), out reason);
  61. default:
  62. reason = $"{command} is not supported";
  63. return false;
  64. }
  65. }
  66. /// <summary>
  67. /// Fa创建任务
  68. /// </summary>
  69. /// <param name="paras"></param>
  70. /// <param name="reason"></param>
  71. /// <returns></returns>
  72. private bool FaCreateJob(object[] paras, out string reason)
  73. {
  74. if (!Singleton<RouteManager>.Instance.IsFaAutoMode)
  75. {
  76. reason = "System is not in Auto,cannot create job";
  77. return false;
  78. }
  79. else
  80. {
  81. Dictionary<string, object> createParams = new Dictionary<string, object>();
  82. string jobId = paras[1].ToString();
  83. string module = $"LP{paras[0]}";
  84. string lotId=paras[2].ToString();
  85. createParams["Module"] =module;
  86. createParams["JobId"] = jobId;
  87. createParams["LotId"]=lotId;
  88. createParams["SlotSequence"] = (string[])paras[3];
  89. createParams["AutoStart"] = true;
  90. bool result= JobCycle.CreateJob(createParams, out reason);
  91. if(result)
  92. {
  93. FaJobManager.Instance.Add(jobId);
  94. fACallback.JobCreated(JobProcesser.Instance.GetControlJobInfoByName(jobId));
  95. }
  96. else
  97. {
  98. fACallback.JobCreateFailed(module, lotId, jobId,reason);
  99. }
  100. return result;
  101. }
  102. }
  103. /// <summary>
  104. /// Fa启动任务
  105. /// </summary>
  106. /// <param name="jobName"></param>
  107. /// <param name="reason"></param>
  108. /// <returns></returns>
  109. private bool FaStartJob(string jobName, out string reason)
  110. {
  111. if (!Singleton<RouteManager>.Instance.IsFaAutoMode)
  112. {
  113. reason = "System is not in Auto,cannot start job";
  114. return false;
  115. }
  116. bool result = JobCycle.StartJob(jobName, out reason);
  117. if (result)
  118. {
  119. Singleton<RouteManager>.Instance.CheckToPostMessage((int)RouteManager.MSG.FaStartJob);
  120. }
  121. return result;
  122. }
  123. /// <summary>
  124. /// Fa停止任务
  125. /// </summary>
  126. /// <param name="jobName"></param>
  127. /// <param name="reason"></param>
  128. /// <returns></returns>
  129. private bool FaStopJob(string jobName, out string reason)
  130. {
  131. if (!Singleton<RouteManager>.Instance.IsFaAutoMode)
  132. {
  133. reason = "System is not in Auto,cannot stop job";
  134. return false;
  135. }
  136. return JobCycle.StopJob(jobName, out reason);
  137. }
  138. /// <summary>
  139. /// Fa暂停任务
  140. /// </summary>
  141. /// <param name="jobName"></param>
  142. /// <param name="reason"></param>
  143. /// <returns></returns>
  144. private bool FaPauseJob(string jobName, out string reason)
  145. {
  146. if (!Singleton<RouteManager>.Instance.IsFaAutoMode)
  147. {
  148. reason = "System is not in Auto,cannot pause job";
  149. return false;
  150. }
  151. return JobCycle.PauseJob(jobName, out reason);
  152. }
  153. /// <summary>
  154. /// Fa恢复任务
  155. /// </summary>
  156. /// <param name="jobName"></param>
  157. /// <param name="reason"></param>
  158. /// <returns></returns>
  159. private bool FaResumeJob(string jobName, out string reason)
  160. {
  161. if (!Singleton<RouteManager>.Instance.IsFaAutoMode)
  162. {
  163. reason = "System is not in Auto,cannot resume job";
  164. return false;
  165. }
  166. return JobCycle.ResumeJob(jobName, out reason);
  167. }
  168. /// <summary>
  169. /// Fa Load
  170. /// </summary>
  171. /// <param name="lp"></param>
  172. /// <returns></returns>
  173. private bool FaLoad(string lp, out string reason)
  174. {
  175. return ExecuteMsg(lp, (int)LoadPortModule.MSG.Load, out reason);
  176. }
  177. /// <summary>
  178. /// 获取LoadPort对象
  179. /// </summary>
  180. /// <param name="lp"></param>
  181. /// <param name="reason"></param>
  182. /// <returns></returns>
  183. private LoadPortModule FaGetLoadPort(string lp, out string reason)
  184. {
  185. reason = "";
  186. if (int.TryParse(lp, out var lpValue))
  187. {
  188. EfemEntity efemEntity = Singleton<RouteManager>.Instance.GetModule<EfemEntity>("EFEM");
  189. LoadPortModule loadPortModule =efemEntity.GetLoadportModule(lpValue-1);
  190. if (loadPortModule != null)
  191. {
  192. if (loadPortModule.LPDevice.HasCassette)
  193. {
  194. return loadPortModule;
  195. }
  196. else
  197. {
  198. reason = $"LP{lpValue} not found carrier, can not load";
  199. return null;
  200. }
  201. }
  202. else
  203. {
  204. reason = $"LP{lp} is null";
  205. return null;
  206. }
  207. }
  208. else
  209. {
  210. reason = $"{lp} is invalid data";
  211. return null;
  212. }
  213. }
  214. /// <summary>
  215. /// 读取Id
  216. /// </summary>
  217. /// <param name="lp"></param>
  218. /// <returns></returns>
  219. private bool FaMapCassete(string lp, out string reason)
  220. {
  221. return ExecuteMsg(lp, (int)LoadPortModule.MSG.Map, out reason);
  222. }
  223. /// <summary>
  224. /// 读取Id
  225. /// </summary>
  226. /// <param name="lp"></param>
  227. /// <returns></returns>
  228. private bool FaReadId(string lp, out string reason)
  229. {
  230. return ExecuteMsg(lp, (int)LoadPortModule.MSG.ReadCarrierId, out reason);
  231. }
  232. /// <summary>
  233. /// 读取Id
  234. /// </summary>
  235. /// <param name="lp"></param>
  236. /// <returns></returns>
  237. private bool FaWriteId(string lp, string carrierId, out string reason)
  238. {
  239. return ExecuteMsg(lp, (int)LoadPortModule.MSG.WriteCarrierID, out reason);
  240. }
  241. /// <summary>
  242. /// Fa Unload
  243. /// </summary>
  244. /// <param name="lp"></param>
  245. /// <returns></returns>
  246. private bool FaUnLoad(string lp, out string reason)
  247. {
  248. ControlJobInfo controlJobInfo = JobProcesser.Instance.GetControlJobInfoByLoadPort(lp);
  249. if (controlJobInfo != null)
  250. {
  251. reason = $"{lp} has controljob {controlJobInfo.Name},cannot unload";
  252. return false;
  253. }
  254. return ExecuteMsg(lp, (int)LoadPortModule.MSG.Unload, out reason);
  255. }
  256. /// <summary>
  257. /// 执行消息
  258. /// </summary>
  259. /// <param name="lp"></param>
  260. /// <param name="msg"></param>
  261. /// <param name="reason"></param>
  262. /// <returns></returns>
  263. private bool ExecuteMsg(string lp,int msg,out string reason)
  264. {
  265. if (!CheckAuto())
  266. {
  267. reason = "System is not in Auto";
  268. return false;
  269. }
  270. LoadPortModule loadport = FaGetLoadPort(lp, out reason);
  271. if (loadport != null)
  272. {
  273. bool result = loadport.CheckToPostMessage(msg);
  274. if (!result)
  275. {
  276. reason = $"{lp} in invalid state";
  277. }
  278. return result;
  279. }
  280. else
  281. {
  282. reason = $"{lp} is not LoadPort";
  283. return false;
  284. }
  285. }
  286. /// <summary>
  287. /// 获取所有Sequence
  288. /// </summary>
  289. /// <returns></returns>
  290. public string[] GetSequenceList()
  291. {
  292. return RecipeFileManager.Instance.GetProductionRecipeList().ToArray();
  293. }
  294. /// <summary>
  295. /// 获取recipe内容
  296. /// </summary>
  297. /// <param name="ppid"></param>
  298. /// <returns></returns>
  299. public string GetSequenceBody(string ppid)
  300. {
  301. return RecipeFileManager.Instance.LoadRecipeContent(ppid);
  302. }
  303. /// <summary>
  304. /// 获取固定格式的Recipe内容
  305. /// </summary>
  306. /// <param name="ppid"></param>
  307. /// <returns></returns>
  308. public List<string> GetFormatedSequence(string ppid)
  309. {
  310. List<string> result = new List<string>();
  311. string reason = string.Empty;
  312. try
  313. {
  314. string content = RecipeFileManager.Instance.LoadRecipeContent(ppid);
  315. result.Add(content);
  316. }
  317. catch (Exception ex)
  318. {
  319. reason = ex.Message;
  320. }
  321. return result;
  322. }
  323. /// <summary>
  324. /// 删除Sequence
  325. /// </summary>
  326. /// <param name="ppid"></param>
  327. /// <returns></returns>
  328. public bool deleteSequence(string ppid)
  329. {
  330. return false;
  331. }
  332. /// <summary>
  333. /// 更新Sequence
  334. /// </summary>
  335. /// <param name="ppid"></param>
  336. /// <param name="body"></param>
  337. /// <returns></returns>
  338. public bool UpdateSequence(string ppid, string body)
  339. {
  340. return false;
  341. }
  342. public void ShowTerminalMessage(string message)
  343. {
  344. }
  345. public bool CreateProcessJob(string processJobId, string sequenceName, string carrierId, out string reason)
  346. {
  347. reason = "";
  348. return true;
  349. }
  350. public void UpdateProcessJobCarrierSlot(string processJobId, string moduleName, List<int> slots)
  351. {
  352. }
  353. public void CreateControlJob(string controlJobId, string carrierId, List<string> processJobs)
  354. {
  355. }
  356. public bool CheckCreateControlJobCondition(List<string> modules, out string reason)
  357. {
  358. reason = "";
  359. return true;
  360. }
  361. public bool StartControlJob(string controlJob)
  362. {
  363. return true;
  364. }
  365. public bool StopControlJob(string controlJob)
  366. {
  367. return true;
  368. }
  369. public bool AbortControlJob(string controlJob)
  370. {
  371. return true;
  372. }
  373. public bool PauseControlJob(string controlJob)
  374. {
  375. return true;
  376. }
  377. public bool ResumeControlJob(string controlJob)
  378. {
  379. return true;
  380. }
  381. public bool CheckAuto()
  382. {
  383. return Singleton<RouteManager>.Instance.IsAutoMode;
  384. }
  385. public void UpdateControlJobModule(string controlJobId, string moduleName)
  386. {
  387. }
  388. public void WriteWarningLog(string msg)
  389. {
  390. }
  391. public void WriteErrorLog(string msg)
  392. {
  393. }
  394. public void WriteInfoLog(string msg)
  395. {
  396. }
  397. #endregion
  398. }
  399. }