EfemSwapRoutine.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. using System;
  2. using Aitex.Core.Common;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.RT.Routine;
  6. using Aitex.Core.RT.SCCore;
  7. using Aitex.Sorter.Common;
  8. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  9. using MECF.Framework.Common.Equipment;
  10. using MECF.Framework.Common.SubstrateTrackings;
  11. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  12. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.AlignersBase;
  13. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
  14. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
  15. using System.Threading;
  16. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
  17. using Aitex.Core.RT.Log;
  18. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Flipper.FlipperBase;
  19. namespace Aitex.Sorter.RT.SorterCommonFrame.Routines
  20. {
  21. public class EfemSwapRoutine : CommonRoutineSorter, IRoutine
  22. {
  23. enum Swap
  24. {
  25. ReleaseAligner,
  26. WaitAlignerReady,
  27. TurnTo180,
  28. WaitTurnTo180,
  29. QueryState,
  30. CheckBeforeSwap,
  31. SwapWafer,
  32. WaitSwap,
  33. SwapPickExtend,
  34. WaitPickExtend,
  35. SwapUnGripTurnOver,
  36. WaitUnGripTurnOver,
  37. SwapPickRetract,
  38. WaitPickRetract,
  39. CheckAfterPick,
  40. SwapTurnBack,
  41. WaitTurnBack,
  42. SwapPlaceExtend,
  43. WaitPlaceExtend,
  44. SwapGrip,
  45. WaitGrip,
  46. SwapPlaceRetract,
  47. WaitPlaceRetract,
  48. TurnOver,
  49. WaitTurnOver,
  50. CheckAfterSwap,
  51. UpdateWaferOnPickBlade,
  52. UpdateWaferOnChamber,
  53. RaiseAligner,
  54. CheckWaferOnTurnOver,
  55. }
  56. private int _timeout = 0;
  57. private bool _isNeedToRaiseAligner = false;
  58. public EfemSwapRoutine(string module, string name)
  59. {
  60. Module = module;
  61. Name = name;
  62. }
  63. public bool Initalize()
  64. {
  65. Reset();
  66. IsRoutineActive = false;
  67. // SC.GetConfigItem($"Robot.{ Robot.RobotModuleName}.TimeLimitForExchangeWafer");
  68. return true;
  69. }
  70. public ModuleName Source { get; set; }
  71. public ModuleName RobotModulename { get; set; } = ModuleName.Robot;
  72. public int Slot { get; set; }
  73. public Hand PlaceBlade => GetPlaceBlade(PickBlade);
  74. public Hand PickBlade { get; set; }
  75. public Result Start(params object[] objs)
  76. {
  77. Name = "Swap";
  78. Robot = DEVICE.GetDevice<RobotBaseDevice>(RobotModulename.ToString());
  79. _timeout = Robot.RobotCommandTimeout;
  80. Reset();
  81. FixedTurnOverPosition = SC.ContainsItem("Process.FixedTurnOverPosition") ? SC.GetValue<bool>("Process.FixedTurnOverPosition") : true;
  82. IsRoutineActive = true;
  83. if(WaferManager.Instance.CheckHasWafer(RobotModulename,(int)PickBlade))
  84. {
  85. EV.PostAlarmLog(ModuleName.System.ToString(), $"Robot:{RobotModulename} detect wafer on pick blade:{PickBlade}.");
  86. return Result.FAIL;
  87. }
  88. if (WaferManager.Instance.CheckNoWafer(RobotModulename, (int)PlaceBlade))
  89. {
  90. EV.PostAlarmLog(ModuleName.System.ToString(), $"Robot:{RobotModulename} detect no wafer on place blade:{PlaceBlade}.");
  91. return Result.FAIL;
  92. }
  93. if (ModuleHelper.IsAligner(Source) && !DEVICE.GetDevice<AlignerBaseDevice>(Source.ToString()).IsReady())
  94. {
  95. EV.PostAlarmLog(ModuleName.System.ToString(), "Aligner is not ready.");
  96. return Result.FAIL;
  97. }
  98. if(ModuleHelper.IsTurnOverStation(Source) && !_ioTurnOver.IsReady)
  99. {
  100. EV.PostAlarmLog(ModuleName.System.ToString(), "Turn Over is not ready.");
  101. return Result.FAIL;
  102. }
  103. if (ModuleHelper.IsTurnOverStation(Source))
  104. {
  105. _isTurnOverOn0deg = _ioTurnOver.CurrentFlipperPosition == FlipperPosEnum.FrontSide;
  106. }
  107. if (ModuleHelper.IsAligner(Source))
  108. {
  109. _isNeedToRaiseAligner = Aligner.IsNeedRelease; ;
  110. }
  111. if (ModuleHelper.IsLoadPort(Source))
  112. {
  113. var lp = DEVICE.GetDevice<LoadPortBaseDevice>(Source.ToString());
  114. if (lp.IsForbidAccessSlotAboveWafer() && Slot > 0 && WaferManager.Instance.CheckHasWafer(Source, Slot - 1))
  115. {
  116. EV.PostAlarmLog(ModuleName.System.ToString(), "Access dennied to the slot above wafer.");
  117. return Result.FAIL;
  118. }
  119. string reason;
  120. if (!lp.IsEnableTransferWafer(out reason))
  121. {
  122. EV.PostAlarmLog(ModuleName.System.ToString(), $"{Source} is not ready to transfer wafer:{reason}.");
  123. return Result.FAIL;
  124. }
  125. }
  126. EV.PostInfoLog("System", $"Start swapping wafer from station:{Source} slot:{Slot + 1} with blade {PickBlade}");
  127. return Monitor();
  128. }
  129. private bool _isTurnOverOn0deg;
  130. public Result Monitor()
  131. {
  132. if (!IsRoutineActive)
  133. return Result.DONE;
  134. var ret = MonitorRoutine();
  135. if(ret == Result.FAIL)
  136. {
  137. Initalize();
  138. IsRoutineActive = false;
  139. }
  140. if (ret == Result.DONE)
  141. {
  142. IsRoutineActive = false;
  143. }
  144. return ret;
  145. }
  146. private Result MonitorRoutine()
  147. {
  148. try
  149. {
  150. if (ModuleHelper.IsAligner(Source) && _isNeedToRaiseAligner)
  151. {
  152. RtReleaseAligner((int)Swap.ReleaseAligner, Notify, Stop);
  153. if (ExecuteResult.Item1)
  154. {
  155. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  156. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  157. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  158. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  159. }
  160. RtWaitAlignerMotion((int)Swap.WaitAlignerReady, Aligner, "Wait Aligner Ready", _timeout, Notify, Stop);
  161. if (ExecuteResult.Item1)
  162. {
  163. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  164. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  165. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  166. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  167. }
  168. }
  169. if (!ModuleHelper.IsTurnOverStation(Source))
  170. {
  171. RtSwapWafer((int)Swap.SwapWafer, "Swap wafer", Source, Slot, PickBlade, _timeout, Notify, Stop);
  172. if (ExecuteResult.Item1)
  173. {
  174. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  175. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  176. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  177. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  178. }
  179. }
  180. else
  181. {
  182. if (FixedTurnOverPosition)
  183. {
  184. if (_isTurnOverOn0deg)
  185. {
  186. RtTurnOverTurn((int)Swap.TurnTo180, Notify, Stop);
  187. if (ExecuteResult.Item1)
  188. {
  189. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  190. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  191. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  192. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  193. }
  194. RtWaitTurnOverTurnTo180((int)Swap.WaitTurnTo180, _ioTurnOver, _timeout, Notify, Stop);
  195. if (ExecuteResult.Item1)
  196. {
  197. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  198. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  199. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  200. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  201. }
  202. }
  203. RtRobotArmGoReadyForPickFromTurnOver((int)Swap.SwapPickExtend, Source, Slot, PickBlade, _timeout,
  204. Notify, Stop, GetWaferOffsetForTurnOverOn180());
  205. if (ExecuteResult.Item1)
  206. {
  207. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  208. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  209. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  210. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  211. }
  212. RtTurnOverUnGripWafer((int)Swap.SwapUnGripTurnOver, Notify, Stop);
  213. if (ExecuteResult.Item1)
  214. {
  215. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  216. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  217. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  218. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  219. }
  220. RtWaitTurnOverMotion((int)Swap.WaitUnGripTurnOver, _ioTurnOver, _timeout, Notify, Stop);
  221. if (ExecuteResult.Item1)
  222. {
  223. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  224. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  225. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  226. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  227. }
  228. RtPickWaferFromTurnOver((int)Swap.SwapPickRetract, Source, Slot, PickBlade,
  229. _timeout, Notify, Stop, GetWaferOffsetForTurnOverOn180());
  230. if (ExecuteResult.Item1)
  231. {
  232. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  233. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  234. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  235. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  236. }
  237. RtTurnOverTurnBack((int)Swap.SwapTurnBack, Notify, Stop);
  238. if (ExecuteResult.Item1)
  239. {
  240. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  241. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  242. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  243. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  244. }
  245. RtWaitTurnOverMotion((int)Swap.WaitTurnBack, _ioTurnOver, _timeout, Notify, Stop);
  246. if (ExecuteResult.Item1)
  247. {
  248. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  249. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  250. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  251. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  252. }
  253. RtDeliverWaferToGrip((int)Swap.SwapPlaceExtend, Source, Slot, PlaceBlade, _timeout, Notify, Stop);
  254. if (ExecuteResult.Item1)
  255. {
  256. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  257. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  258. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  259. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  260. }
  261. RtTurnOverGripWafer((int)Swap.SwapGrip, Notify, Stop);
  262. if (ExecuteResult.Item1)
  263. {
  264. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  265. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  266. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  267. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  268. }
  269. RtWaitTurnOverMotion((int)Swap.WaitGrip, _ioTurnOver, _timeout, Notify, Stop);
  270. if (ExecuteResult.Item1)
  271. {
  272. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  273. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  274. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  275. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  276. }
  277. RtRetractRobotArmForTurning((int)Swap.SwapPlaceRetract, Source, Slot, PlaceBlade, _timeout, Notify, Stop);
  278. if (ExecuteResult.Item1)
  279. {
  280. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  281. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  282. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  283. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  284. }
  285. RtCheckWaferOnTurn((int)Swap.CheckWaferOnTurnOver, Notify, Stop);
  286. if (ExecuteResult.Item1)
  287. {
  288. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  289. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  290. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  291. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  292. }
  293. RtTurnOverTurn((int)Swap.TurnOver, Notify, Stop);
  294. if (ExecuteResult.Item1)
  295. {
  296. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  297. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  298. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  299. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  300. }
  301. }
  302. else
  303. {
  304. if (_isTurnOverOn0deg)
  305. {
  306. RtRobotArmGoReadyForPickFromTurnOver((int)Swap.SwapPickExtend, Source, Slot, PickBlade, _timeout, Notify, Stop);
  307. if (ExecuteResult.Item1)
  308. {
  309. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  310. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  311. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  312. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  313. }
  314. RtTurnOverUnGripWafer((int)Swap.SwapUnGripTurnOver, Notify, Stop);
  315. if (ExecuteResult.Item1)
  316. {
  317. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  318. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  319. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  320. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  321. }
  322. RtWaitTurnOverMotion((int)Swap.WaitUnGripTurnOver, _ioTurnOver, _timeout, Notify, Stop);
  323. if (ExecuteResult.Item1)
  324. {
  325. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  326. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  327. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  328. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  329. }
  330. RtPickWaferFromTurnOver((int)Swap.SwapPickRetract, Source, Slot, PickBlade, _timeout, Notify, Stop);
  331. if (ExecuteResult.Item1)
  332. {
  333. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  334. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  335. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  336. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  337. }
  338. RtDeliverWaferToGrip((int)Swap.SwapPlaceExtend, Source, Slot, PlaceBlade, _timeout, Notify, Stop);
  339. if (ExecuteResult.Item1)
  340. {
  341. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  342. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  343. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  344. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  345. }
  346. RtTurnOverGripWafer((int)Swap.SwapGrip, Notify, Stop);
  347. if (ExecuteResult.Item1)
  348. {
  349. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  350. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  351. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  352. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  353. }
  354. RtWaitTurnOverMotion((int)Swap.WaitGrip, _ioTurnOver, _timeout, Notify, Stop);
  355. if (ExecuteResult.Item1)
  356. {
  357. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  358. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  359. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  360. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  361. }
  362. RtRetractRobotArmForTurning((int)Swap.SwapPlaceRetract, Source, Slot, PlaceBlade, _timeout, Notify, Stop);
  363. if (ExecuteResult.Item1)
  364. {
  365. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  366. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  367. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  368. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  369. }
  370. RtCheckWaferOnTurn((int)Swap.CheckWaferOnTurnOver, Notify, Stop);
  371. if (ExecuteResult.Item1)
  372. {
  373. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  374. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  375. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  376. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  377. }
  378. RtTurnOverTurn((int)Swap.TurnOver, Notify, Stop);
  379. if (ExecuteResult.Item1)
  380. {
  381. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  382. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  383. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  384. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  385. }
  386. }
  387. else
  388. {
  389. RtRobotArmGoReadyForPickFromTurnOver((int)Swap.SwapPickExtend, Source, Slot, PickBlade, _timeout, Notify, Stop,
  390. GetWaferOffsetForTurnOverOn180());
  391. if (ExecuteResult.Item1)
  392. {
  393. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  394. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  395. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  396. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  397. }
  398. RtTurnOverUnGripWafer((int)Swap.SwapUnGripTurnOver, Notify, Stop);
  399. if (ExecuteResult.Item1)
  400. {
  401. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  402. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  403. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  404. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  405. }
  406. RtWaitTurnOverMotion((int)Swap.WaitUnGripTurnOver, _ioTurnOver, _timeout, Notify, Stop);
  407. if (ExecuteResult.Item1)
  408. {
  409. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  410. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  411. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  412. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  413. }
  414. RtPickWaferFromTurnOver((int)Swap.SwapPickRetract, Source, Slot, PickBlade, _timeout, Notify, Stop,
  415. GetWaferOffsetForTurnOverOn180());
  416. if (ExecuteResult.Item1)
  417. {
  418. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  419. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  420. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  421. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  422. }
  423. RtDeliverWaferToGrip((int)Swap.SwapPlaceExtend, Source, Slot, PlaceBlade, _timeout, Notify, Stop,
  424. PutWaferOffsetForTurnOverOn180());
  425. if (ExecuteResult.Item1)
  426. {
  427. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  428. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  429. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  430. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  431. }
  432. RtTurnOverGripWafer((int)Swap.SwapGrip, Notify, Stop);
  433. if (ExecuteResult.Item1)
  434. {
  435. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  436. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  437. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  438. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  439. }
  440. RtWaitTurnOverMotion((int)Swap.WaitGrip, _ioTurnOver, _timeout, Notify, Stop);
  441. if (ExecuteResult.Item1)
  442. {
  443. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  444. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  445. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  446. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  447. }
  448. RtRetractRobotArmForTurning((int)Swap.SwapPlaceRetract, Source, Slot, PlaceBlade, _timeout, Notify, Stop,
  449. PutWaferOffsetForTurnOverOn180());
  450. if (ExecuteResult.Item1)
  451. {
  452. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  453. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  454. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  455. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  456. }
  457. RtCheckWaferOnTurn((int)Swap.CheckWaferOnTurnOver, Notify, Stop);
  458. if (ExecuteResult.Item1)
  459. {
  460. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  461. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  462. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  463. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  464. }
  465. RtTurnOverTurnBack((int)Swap.TurnOver, Notify, Stop);
  466. if (ExecuteResult.Item1)
  467. {
  468. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  469. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  470. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  471. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  472. }
  473. }
  474. }
  475. }
  476. RtUpdateWaferSingleStepProcessState((int)Swap.UpdateWaferOnPickBlade, "Update process state on robot", RobotModulename, 0, PickBlade,
  477. EnumWaferProcessStatus.Idle, Notify, Stop);
  478. if (ExecuteResult.Item1)
  479. {
  480. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  481. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  482. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  483. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  484. }
  485. RtUpdateWaferSingleStepProcessState((int)Swap.UpdateWaferOnChamber, "Update process state on chamber", Source, Slot, PickBlade,
  486. EnumWaferProcessStatus.Wait, Notify, Stop);
  487. if (ExecuteResult.Item1)
  488. {
  489. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  490. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  491. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  492. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  493. }
  494. EV.PostInfoLog("System", $"Complete swapping wafer from station:{Source} slot:{Slot + 1} with blade {PickBlade}.");
  495. //EV.PostMessage(ModuleName.System.ToString(), EventEnum.GeneralInfo, string.Format("Swap wafer {0}{1:D2} place blade {2}", Source.ToString(), Slot+1, PlaceBlade.ToString()));
  496. IsRoutineActive = false;
  497. return Result.DONE;
  498. }
  499. catch (Exception ex)
  500. {
  501. LOG.Write(ex);
  502. EV.PostAlarmLog("System", $"Failed to swap wafer from station:{Source} slot:{Slot + 1} with blade {PickBlade}.");
  503. IsRoutineActive = false;
  504. return Result.FAIL;
  505. }
  506. }
  507. protected override void Notify(string message)
  508. {
  509. EV.PostMessage(Module, EventEnum.GeneralInfo, String.Format("Swap wafer:{0}", message));
  510. }
  511. /// <summary>
  512. /// prepare process failed
  513. /// </summary>
  514. /// <param name="failReason"></param>
  515. /// <param name="reactor"></param>
  516. protected override void Stop(string failReason)
  517. {
  518. string reason = String.Empty;
  519. EV.PostMessage(ModuleName.System.ToString(), EventEnum.GeneralInfo, string.Format("Swap wafer {0}{1:D2} with arm {2} failed, {3}", Source.ToString(), Slot+1, PlaceBlade.ToString(), failReason));
  520. }
  521. private Hand GetPlaceBlade(Hand placeBlade)
  522. {
  523. return PickBlade == Hand.Blade1 ? Hand.Blade2 : Hand.Blade1;
  524. }
  525. }
  526. }