MpntTask.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. using System.Diagnostics.Eventing.Reader;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.Log;
  5. using Aitex.Core.Util;
  6. using EFEM.RT.Modules;
  7. using Aitex.Sorter.Common;
  8. using MECF.Framework.Common.Equipment;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  11. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
  12. using System.Linq;
  13. namespace EFEM.RT.Tasks
  14. {
  15. public enum MpntTaskEnum //按客户要求此处全部大写
  16. {
  17. G1,
  18. GB,
  19. G4,
  20. P1,
  21. PB,
  22. P4,
  23. ParamNg
  24. }
  25. public class MpntTask : CheckImp, ITask
  26. {
  27. private bool ParseTaskEnum(string args, out MpntTaskEnum taskEnum)
  28. {
  29. taskEnum = MpntTaskEnum.ParamNg;
  30. switch (args)
  31. {
  32. case "G1":
  33. taskEnum = MpntTaskEnum.G1;
  34. break;
  35. case "GB":
  36. taskEnum = MpntTaskEnum.GB;
  37. break;
  38. case "G4":
  39. taskEnum = MpntTaskEnum.G4;
  40. break;
  41. case "P1":
  42. taskEnum = MpntTaskEnum.P1;
  43. break;
  44. case "PB":
  45. taskEnum = MpntTaskEnum.PB;
  46. break;
  47. case "P4":
  48. taskEnum = MpntTaskEnum.P4;
  49. break;
  50. default:
  51. return false;
  52. }
  53. return true;
  54. }
  55. private bool IsGetCommand(MpntTaskEnum taskEnum)
  56. {
  57. return taskEnum == MpntTaskEnum.G1 || taskEnum == MpntTaskEnum.GB || taskEnum == MpntTaskEnum.G4;
  58. }
  59. public bool Execute(out string result, params string[] args)
  60. {
  61. string device = DeviceName.Robot;
  62. IServerModule entity = GetEntity(device);
  63. ModuleName target = ModuleName.System;
  64. MpntTaskEnum taskEnum = MpntTaskEnum.ParamNg;
  65. int slot = 1;
  66. if (!ParseMoveTarget(args[0], out target, out slot))
  67. {
  68. result = PARAM_NG;
  69. return false;
  70. }
  71. if (!ParseTaskEnum(args[1], out taskEnum))
  72. {
  73. result = PARAM_NG;
  74. return false;
  75. }
  76. Hand arm = Hand.Blade2;
  77. if (!ParseMoveArm(args[2], out arm))
  78. {
  79. result = PARAM_NG;
  80. return false;
  81. }
  82. if (!ModuleHelper.IsLoadLock(target))
  83. {
  84. result = PARAM_NG;
  85. return false;
  86. }
  87. if (MultiWaferSize)
  88. {
  89. if (args.Length < 2)
  90. {
  91. result = PARAM_NG;
  92. return false;
  93. }
  94. if (args.Length == 4)
  95. {
  96. if (!CheckWaferSize(args[3], ModuleName.Robot, args[2] == "ARM1" ? 1 : 0))
  97. {
  98. result = PARAM_NG;
  99. return false;
  100. }
  101. }
  102. else
  103. {
  104. if (!CheckWaferSize("WS6", ModuleName.Robot, args[2]=="ARM1"?1:0))
  105. {
  106. result = PARAM_NG;
  107. return false;
  108. }
  109. }
  110. }
  111. if (!Check<NoReadyPolicy>(device, out result))
  112. {
  113. return false;
  114. }
  115. if (!Check<NoInitCompletedPolicy>(device, out result))
  116. {
  117. return false;
  118. }
  119. if (!Check<NoOriginCompletedPolicy>(device, out result))
  120. {
  121. return false;
  122. }
  123. if (!Check<VacPolicy>(device, out result))
  124. {
  125. return false;
  126. }
  127. if (!Check<EMSPolicy>(device, out result))
  128. {
  129. return false;
  130. }
  131. if (!Check<ErrorPolicy>(device, out result))
  132. {
  133. return false;
  134. }
  135. if (!Check<BusyPolicy>(device, out result))
  136. {
  137. LOG.Write($"MPNTTask {device} Busy");
  138. return false;
  139. }
  140. if (!Check<HoldPolicy>(device, out result))
  141. {
  142. return false;
  143. }
  144. if (!Check<RemovePolicy>(device, out result))
  145. {
  146. return false;
  147. }
  148. if (!Check<MaintenancePolicy>(device, out result))
  149. {
  150. return false;
  151. }
  152. if (!Check<LinkPolicy>(device, out result))
  153. {
  154. return false;
  155. }
  156. if (!Check<NoWaferMappingCompletedPolicy>(target.ToString(), out result))
  157. {
  158. return false;
  159. }
  160. if (!Check<NoPodPolicy>(target.ToString(), out result))
  161. {
  162. return false;
  163. }
  164. if (!Check<ClosePolicy>(target.ToString(), out result))
  165. {
  166. return false;
  167. }
  168. //do not check loadlock
  169. if (!ModuleHelper.IsLoadLock(target) && !Singleton<WaferManager>.Instance.CheckNoWafer(target,slot-1))
  170. {
  171. result = "WAFER";
  172. return false;
  173. }
  174. if (!Check<PowerDownPolicy>(device, out result))
  175. {
  176. return false;
  177. }
  178. if (!Singleton<RouteManager>.Instance.IsIdle)
  179. {
  180. LOG.Write($"Mpnt Task RouteManager is Busy");
  181. result = "BUSY";
  182. return false;
  183. }
  184. if (IsGetCommand(taskEnum))
  185. {
  186. if (taskEnum == MpntTaskEnum.GB)
  187. {
  188. if (arm == Hand.Blade1)
  189. {
  190. if (!Singleton<WaferManager>.Instance.CheckNoWafer(ModuleName.Robot,0))
  191. {
  192. result = "WAFER";
  193. return false;
  194. }
  195. }
  196. else if (arm == Hand.Blade2)
  197. {
  198. if (!Singleton<WaferManager>.Instance.CheckNoWafer(ModuleName.Robot,1))
  199. {
  200. result = "WAFER";
  201. return false;
  202. }
  203. }
  204. else
  205. {
  206. if (!Singleton<WaferManager>.Instance.CheckNoWafer(ModuleName.Robot,0))
  207. {
  208. result = "WAFER";
  209. return false;
  210. }
  211. if (!Singleton<WaferManager>.Instance.CheckNoWafer(ModuleName.Robot,1))
  212. {
  213. result = "WAFER";
  214. return false;
  215. }
  216. }
  217. }
  218. _token = Singleton<RouteManager>.Instance.Invoke("MPNTPick", target.ToString(), slot - 1, arm, taskEnum);
  219. return true;
  220. }
  221. else
  222. {
  223. if (taskEnum == MpntTaskEnum.PB)
  224. {
  225. if (arm == Hand.Blade1)
  226. {
  227. if (!Singleton<WaferManager>.Instance.CheckHasWafer(ModuleName.Robot,0))
  228. {
  229. result = "NONWAF";
  230. return false;
  231. }
  232. }
  233. else if (arm == Hand.Blade2)
  234. {
  235. if (!Singleton<WaferManager>.Instance.CheckHasWafer(ModuleName.Robot,1))
  236. {
  237. result = "NONWAF";
  238. return false;
  239. }
  240. }
  241. else
  242. {
  243. if (!Singleton<WaferManager>.Instance.CheckHasWafer(ModuleName.Robot,0))
  244. {
  245. result = "NONWAF";
  246. return false;
  247. }
  248. if (!Singleton<WaferManager>.Instance.CheckHasWafer(ModuleName.Robot,1))
  249. {
  250. result = "NONWAF";
  251. return false;
  252. }
  253. }
  254. }
  255. _token = Singleton<RouteManager>.Instance.Invoke("MPNTPlace", target.ToString(), slot - 1, arm, taskEnum);
  256. return true;
  257. }
  258. }
  259. public bool? Monitor(out string result, params string[] args)
  260. {
  261. result = string.Empty;
  262. RobotBaseDevice _device = DEVICE.GetDevice<RobotBaseDevice>(DeviceName.Robot);
  263. if (_device.IsError || Singleton<RouteManager>.Instance.IsError)
  264. {
  265. flag1 = ErrorCheckList1.VAC | ErrorCheckList1.AIR | ErrorCheckList1.STALL
  266. | ErrorCheckList1.LIMIT | ErrorCheckList1.SENSOR | ErrorCheckList1.POSITION | ErrorCheckList1.EMS
  267. | ErrorCheckList1.COMM | ErrorCheckList1.COMM2 | ErrorCheckList1.VACON | ErrorCheckList1.VACOFF
  268. | ErrorCheckList1.CLAMPON | ErrorCheckList1.CLAMPOF;
  269. flag2 = ErrorCheckList2.RRTWAF | ErrorCheckList2.CRSWAF | ErrorCheckList2.THICKWAF | ErrorCheckList2.THINWAF
  270. | ErrorCheckList2.DBLWAF | ErrorCheckList2.BAOWAF | ErrorCheckList2.COMMAND | ErrorCheckList2.PODNG
  271. | ErrorCheckList2.PODMISMATCH | ErrorCheckList2.VAC_S | ErrorCheckList2.CLAMP_S | ErrorCheckList2.SAFTY
  272. | ErrorCheckList2.LOCKNG | ErrorCheckList2.UNLOCKNG | ErrorCheckList2.L_KEY_LK | ErrorCheckList2.L_KEY_UL;
  273. flag3 = ErrorCheckList3.MAP_S | ErrorCheckList3.MAP_S1 | ErrorCheckList3.MAP_S2 | ErrorCheckList3.WAFLOST
  274. | ErrorCheckList3.ALIGNNG
  275. | ErrorCheckList3.DRIVER | ErrorCheckList3.DRPOWERDOWN | ErrorCheckList3.HARDWARE
  276. | ErrorCheckList3.INTERNAL | ErrorCheckList3.E84_TIMEOUTx | ErrorCheckList3.E84_CS_VALID | ErrorCheckList3.READFAIL;
  277. var ret = CheckError(DeviceName.Robot, out result);
  278. if (!ret)
  279. {
  280. result = "";
  281. if (Singleton<EfemEntity>.Instance.EventError != null)
  282. {
  283. //result = Singleton<EfemEntity>.Instance.EventError.ToList().Where(m => m.Source == "System" || m.Source == "Robot")?.LastOrDefault()?.Description;
  284. var items = Singleton<EfemEntity>.Instance.EventError.ToList().Where(m => m.Source == "System" || m.Source == "Robot").Reverse().ToList();
  285. for (int i = 0; i < items.Count; i++)
  286. {
  287. if (i < 3)
  288. result += items[i].Description + "|";
  289. }
  290. }
  291. }
  292. return ret;
  293. }
  294. if (Singleton<RouteManager>.Instance.IsIdle&&_device.IsReady()&&!_device.IsBusy && Singleton<RouteManager>.Instance.CheckAcked(_token))
  295. return true;
  296. return null;
  297. }
  298. }
  299. }