PickRoutine.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Device.Unit;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.RT.Routine;
  6. using Aitex.Core.RT.SCCore;
  7. using Aitex.Core.Util;
  8. using Aitex.Sorter.Common;
  9. using MECF.Framework.Common.Equipment;
  10. using MECF.Framework.Common.SubstrateTrackings;
  11. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  12. using System;
  13. using System.Threading;
  14. namespace EFEM.RT.Routines
  15. {
  16. public class PickRoutine : CommonRoutine, IRoutine, IEfemPickRoutine
  17. {
  18. enum Pick
  19. {
  20. ReserveRobot,
  21. WaitForPick,
  22. QueryState,
  23. OpenLoadLockDoor,
  24. CoolBufferMoveUP,
  25. WaitCoolBufferMoveUP,
  26. CheckBeforePick,
  27. QueryRobotParameter,
  28. RobotServoOff,
  29. WaitRobotServoOff,
  30. SetWaferSizeParameter0000,
  31. SetWaferSizeParameter0114,
  32. RobotServoOn,
  33. WaitRobotServoOn,
  34. PickWafer,
  35. WaitPick,
  36. XMove,
  37. CloseLoadLockDoor,
  38. CoolBufferMoveDown,
  39. WaitCoolBufferMoveDown,
  40. CheckAfterPick,
  41. PostMessage,
  42. RobotBusytoSimifOn,
  43. RobotBusytoSimifOff,
  44. CheckWaferPrecense,
  45. WaitCheckWaferPrecense,
  46. CheckWaferPrecenseAfterPick,
  47. QuerySignalStatus,
  48. RobotBladeUnGrip
  49. }
  50. protected bool MultiWaferSize = DeviceDefineManager.Instance.GetValue<bool>("MultiWaferSize") ?? false;
  51. private SCConfigItem _scPickTimeout = null;
  52. private int _timeout = 0;
  53. private int _axisTimeout = 0;
  54. private int _axisSpeed = 0;
  55. public double WaitForPickTime = 0.00;
  56. public PickRoutine(string module, string name)
  57. {
  58. Module = module;
  59. Name = name;
  60. _scPickTimeout = SC.GetConfigItem(SorterCommon.ScPathName.Robot_TimeLimitForPickWafer);
  61. if (HaveMotionAxis)
  62. {
  63. _axisTimeout = SC.GetValue<int>("MotionAxis.MoveTimeout");
  64. _axisSpeed = SC.GetValue<int>("MotionAxis.AutoSpeed");
  65. }
  66. }
  67. public bool Initalize()
  68. {
  69. IsStopped = true;
  70. return true;
  71. }
  72. public ModuleName Source { get; set; }
  73. public int Slot { get; set; }
  74. public Hand Blade { get; set; }
  75. private LoadPort _lpDevice;
  76. private bool _skipWait;
  77. public Result Start(params object[] objs)
  78. {
  79. IsStopped = false;
  80. Reset();
  81. _timeout = robot.RobotCommandTimeout;
  82. Reset();
  83. EV.PostMessage(ModuleName.System.ToString(), EventEnum.PickingWaferFromChamberBegins, string.Format("{0}{1:D2} by {2}", Source.ToString(), Slot + 1, Blade.ToString()));
  84. //robot.IsBusy = true;
  85. return Result.RUN;
  86. }
  87. public Result Monitor()
  88. {
  89. try
  90. {
  91. if (IsStopped) return Result.DONE;
  92. if (WaitForPickTime > 0.0)
  93. Wait((int)Pick.WaitForPick, "Wait", WaitForPickTime, Notify, Stop);
  94. //if (ModuleHelper.IsLoadPort(Source))
  95. // QueryLoadportState((int)Pick.QueryState, Source.ToString(), _timeout);
  96. if (ModuleHelper.IsCoolingBuffer(Source) || ModuleHelper.IsAligner(Source))
  97. {
  98. CoolBufferMoveUP((int)Pick.CoolBufferMoveUP, GetCoolBuffer(Source), WaferManager.Instance.GetWaferSize(Source, Slot), _timeout, Notify, Stop);
  99. WaitCoolBufferMoveUp((int)Pick.WaitCoolBufferMoveUP, GetCoolBuffer(Source), "Wait CoolingBuffer Move Up...", _timeout, Notify, Stop);
  100. }
  101. //RobotSignalStatus((int)Pick.QuerySignalStatus, robot, _timeout);
  102. CheckBladeWaferIsExist((int)Pick.CheckWaferPrecense, robot, Blade, _timeout);
  103. WaitRobotMotion((int)Pick.WaitCheckWaferPrecense, robot, "Wait finish check wafer", _timeout, Notify, Stop);
  104. CheckBeforePick((int)Pick.CheckBeforePick, "Check wafer information", Source, Slot, Blade, Notify, Stop);
  105. if(!ModuleHelper.IsLoadLock(Source))
  106. {
  107. PickWafer((int)Pick.PickWafer, "Pick wafer", Source, Slot, Blade, OffsetX, OffsetY, OffsetZ, Notify, Stop);
  108. this.WaitRobotMotion((int)Pick.WaitPick, robot, "Wait picked", _timeout, Notify, Stop);
  109. }
  110. //UnGripRobotBlade((int)Pick.RobotBladeUnGrip, Blade, robot, _timeout);
  111. //if (ModuleHelper.IsCoolingBuffer(Source) || ModuleHelper.IsAligner(Source))
  112. //{
  113. // CoolBufferMoveDown((int)Pick.CoolBufferMoveDown, GetCoolBuffer(Source), WaferManager.Instance.GetWaferSize(Source, Slot), _timeout, Notify, Stop);
  114. // WaitCoolBufferMoveDown((int)Pick.WaitCoolBufferMoveDown, GetCoolBuffer(Source), "Wait CoolingBuffer Move Down...", _timeout, Notify, Stop);
  115. //}
  116. PostMessage((int)Pick.PostMessage, string.Format("{0}{1:D2} by {2}.", Source.ToString(), Slot + 1, Blade.ToString()));
  117. //CheckBladeWaferIsExist((int)Pick.CheckWaferPrecenseAfterPick, robot, Blade, _timeout);
  118. CheckAfterPick((int)Pick.CheckAfterPick, "Check wafer information after wafer picked", Source, Slot, Blade, Notify, Stop);
  119. }
  120. catch (RoutineBreakException)
  121. {
  122. if (!IsActived(TokenId) && !_skipWait)
  123. {
  124. _skipWait = true;
  125. return Monitor();
  126. }
  127. return Result.RUN;
  128. }
  129. catch (RoutineFaildException)
  130. {
  131. IsStopped = true;
  132. return Result.FAIL;
  133. }
  134. IsStopped = true;
  135. return Result.DONE;
  136. }
  137. public void CheckBeforePick(int id, string name, ModuleName chamber, int slot, Hand blade, Action<string> notify, Action<string> error)
  138. {
  139. Tuple<bool, Result> ret = Execute(id, () =>
  140. {
  141. notify(name);
  142. string reason = string.Empty;
  143. if (!CheckRobotMotionInterlock(chamber, slot, out reason))
  144. {
  145. EV.PostMessage(ModuleName.System.ToString(), EventEnum.TransferPrepareFailed, String.Format("target {0}{1:D2},{2}", chamber.ToString(), slot + 1, reason));
  146. return false;
  147. }
  148. notify(String.Format("Check {0}{1:D2} wafer information", chamber.ToString(), slot));
  149. if (blade == Hand.Blade1)
  150. {
  151. if (ModuleHelper.IsLoadLock(chamber) && Singleton<EfemEntity>.Instance.IsOnlineMode)
  152. {
  153. //online mode, CreateWafer in LoadLock
  154. WaferManager.Instance.CreateWafer(chamber, slot, WaferStatus.Normal);
  155. }
  156. else if (ModuleHelper.IsBuffer(chamber) && Singleton<EfemEntity>.Instance.IsOnlineMode)
  157. {
  158. //online mode, CreateWafer in LoadLock
  159. WaferManager.Instance.CreateWafer(chamber, slot, WaferStatus.Normal);
  160. if(chamber.ToString()=="Buffer1")
  161. WaferManager.Instance.UpdateWaferSize(chamber, slot, bf1.Size);
  162. if (chamber.ToString() == "Buffer2")
  163. WaferManager.Instance.UpdateWaferSize(chamber, slot, bf2.Size);
  164. }
  165. else
  166. {
  167. bool bHasWafer = WaferManager.Instance.CheckWafer(chamber, slot, WaferStatus.Normal);
  168. if (!bHasWafer)
  169. {
  170. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferAbsentWithoutRecord, String.Format("target {0}{1:D2}", chamber.ToString(), slot + 1));
  171. return false;
  172. }
  173. }
  174. bool bNoWafer = WaferManager.Instance.CheckWafer(ModuleName.Robot, 0, WaferStatus.Empty);
  175. if (!bNoWafer)
  176. {
  177. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDetectedBeforePick);
  178. return false;
  179. }
  180. bNoWafer = CheckSensorNoWafer(ModuleName.Robot, 0); //check sensor
  181. if (!bNoWafer)
  182. {
  183. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDetectedBeforePick);
  184. return false;
  185. }
  186. if (ModuleHelper.IsBuffer(chamber))
  187. {
  188. bool bHasWafer = CheckSeneorHasWafer(chamber, slot); //check sensor
  189. if (!bHasWafer)
  190. {
  191. EV.PostWarningLog(chamber.ToString(), "Can not pick wafer from buffer, Buffer slot has no wafer.");
  192. return false;
  193. }
  194. }
  195. }
  196. else if (blade == Hand.Blade2)
  197. {
  198. bool bHasWafer = true;
  199. for (int i = 0; i < robot.Blade2Slots; i++)
  200. {
  201. if (ModuleHelper.IsLoadLock(chamber) && Singleton<EfemEntity>.Instance.IsOnlineMode)
  202. {
  203. //online mode, CreateWafer in LoadLock
  204. WaferManager.Instance.CreateWafer(chamber, slot, WaferStatus.Normal);
  205. }
  206. else if (ModuleHelper.IsBuffer(chamber) && Singleton<EfemEntity>.Instance.IsOnlineMode)
  207. {
  208. //online mode, CreateWafer in LoadLock
  209. WaferManager.Instance.CreateWafer(chamber, slot, WaferStatus.Normal);
  210. if (chamber.ToString() == "Buffer1")
  211. WaferManager.Instance.UpdateWaferSize(chamber, slot, bf1.Size);
  212. if (chamber.ToString() == "Buffer2")
  213. WaferManager.Instance.UpdateWaferSize(chamber, slot, bf2.Size);
  214. }
  215. else
  216. bHasWafer = WaferManager.Instance.CheckWafer(chamber, slot + i, WaferStatus.Normal);
  217. bool bNoWafer = WaferManager.Instance.CheckWafer(ModuleName.Robot, (int)blade + i, WaferStatus.Empty);
  218. if (!bNoWafer)
  219. {
  220. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDetectedBeforePick);
  221. return false;
  222. }
  223. bNoWafer = CheckSensorNoWafer(ModuleName.Robot, (int)blade + i); //check sensor
  224. if (!bNoWafer)
  225. {
  226. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDetectedBeforePick);
  227. return false;
  228. }
  229. if (ModuleHelper.IsBuffer(chamber))
  230. {
  231. bHasWafer = CheckSeneorHasWafer(chamber, slot + i); //check sensor
  232. if (!bHasWafer)
  233. {
  234. EV.PostWarningLog(chamber.ToString(), "Can not pick wafer from buffer, Buffer slot has no wafer.");
  235. return false;
  236. }
  237. }
  238. }
  239. if (!bHasWafer)
  240. {
  241. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferAbsentWithoutRecord, String.Format("target {0}{1:D2}", chamber.ToString(), slot + 1));
  242. return false;
  243. }
  244. }
  245. else
  246. {
  247. bool bHasWafer = true;
  248. for (int i = 0; i < robot.Blade2Slots + 1; i++)
  249. {
  250. if (ModuleHelper.IsLoadLock(chamber) && Singleton<EfemEntity>.Instance.IsOnlineMode)
  251. {
  252. //online mode, CreateWafer in LoadLock
  253. WaferManager.Instance.CreateWafer(chamber, slot, WaferStatus.Normal);
  254. }
  255. else if (ModuleHelper.IsBuffer(chamber) && Singleton<EfemEntity>.Instance.IsOnlineMode)
  256. {
  257. //online mode, CreateWafer in LoadLock
  258. WaferManager.Instance.CreateWafer(chamber, slot, WaferStatus.Normal);
  259. if (chamber.ToString() == "Buffer1")
  260. WaferManager.Instance.UpdateWaferSize(chamber, slot, bf1.Size);
  261. if (chamber.ToString() == "Buffer2")
  262. WaferManager.Instance.UpdateWaferSize(chamber, slot, bf2.Size);
  263. }
  264. else
  265. bHasWafer = WaferManager.Instance.CheckWafer(chamber, slot, WaferStatus.Normal);
  266. bool bNoWafer = WaferManager.Instance.CheckWafer(ModuleName.Robot, (int)Hand.Blade1 + i, WaferStatus.Empty);
  267. if (!bNoWafer)
  268. {
  269. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDetectedBeforePick);
  270. return false;
  271. }
  272. bNoWafer = CheckSensorNoWafer(ModuleName.Robot, (int)Hand.Blade1 + i); //check sensor
  273. if (!bNoWafer)
  274. {
  275. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDetectedBeforePick);
  276. return false;
  277. }
  278. if (ModuleHelper.IsBuffer(chamber) && blade == Hand.Both)
  279. {
  280. bHasWafer &= CheckSeneorHasWafer(chamber, slot + i); //check sensor
  281. if (!bHasWafer)
  282. {
  283. EV.PostWarningLog(chamber.ToString(), "Can not pick wafer from buffer, Buffer slot has no wafer.");
  284. return false;
  285. }
  286. }
  287. }
  288. if (!bHasWafer)
  289. {
  290. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferAbsentWithoutRecord, String.Format("target {0}{1:D2}", chamber.ToString(), slot));
  291. return false;
  292. }
  293. }
  294. if (ModuleHelper.IsCoolingBuffer(chamber))
  295. {
  296. IoCoolingBuffer buffer = DEVICE.GetDevice<IoCoolingBuffer>(chamber.ToString());
  297. if (!buffer.CheckPinUp())
  298. {
  299. EV.PostWarningLog(chamber.ToString(), "Can not pick wafer from buffer, buffer isn't pick position.");
  300. return false;
  301. }
  302. }
  303. return true;
  304. });
  305. if (ret.Item1)
  306. {
  307. if (ret.Item2 == Result.FAIL)
  308. {
  309. //error(String.Format("Failed to check wafer information."));
  310. throw (new RoutineFaildException());
  311. }
  312. }
  313. }
  314. public void CheckAfterPick(int id, string name, ModuleName chamber, int slot, Hand blade, Action<string> notify, Action<string> error)
  315. {
  316. Tuple<bool, Result> ret = Execute(id, () =>
  317. {
  318. notify(name);
  319. if (blade == Hand.Blade1)
  320. {
  321. bool bHasWafer = CheckSeneorHasWafer(ModuleName.Robot, (int)blade);
  322. if (!bHasWafer)
  323. {
  324. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferNotDetectedAfterPick);
  325. return false;
  326. }
  327. }
  328. else if (blade == Hand.Blade2)
  329. {
  330. for (int i = 0; i < robot.Blade2Slots; i++)
  331. {
  332. bool bHasWafer = CheckSeneorHasWafer(ModuleName.Robot, (int)Hand.Blade2 + i);
  333. if (!bHasWafer)
  334. {
  335. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferNotDetectedAfterPick);
  336. return false;
  337. }
  338. }
  339. }
  340. else
  341. {
  342. for (int i = 0; i < robot.Blade2Slots + 1; i++)
  343. {
  344. bool bHasWafer = CheckSeneorHasWafer(ModuleName.Robot, (int)Hand.Blade1 + i);
  345. if (!bHasWafer)
  346. {
  347. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferNotDetectedAfterPick);
  348. return false;
  349. }
  350. }
  351. }
  352. return true;
  353. });
  354. if (ret.Item1)
  355. {
  356. if (ret.Item2 == Result.FAIL)
  357. {
  358. //error(String.Format("Failed to check wafer information."));
  359. throw (new RoutineFaildException());
  360. }
  361. }
  362. }
  363. }
  364. }