SwapRoutine.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  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. using Aitex.Sorter.RT.SorterCommonFrame.Modules;
  20. namespace Aitex.Sorter.RT.SorterCommonFrame.Routines
  21. {
  22. public class SwapRoutine : CommonRoutineSorter, IRoutine
  23. {
  24. enum Swap
  25. {
  26. ReleaseAligner,
  27. WaitAlignerReady,
  28. TurnTo180,
  29. WaitTurnTo180,
  30. QueryState,
  31. CheckBeforeSwap,
  32. SwapWafer,
  33. WaitSwap,
  34. SwapPickExtend,
  35. WaitPickExtend,
  36. SwapUnGripTurnOver,
  37. WaitUnGripTurnOver,
  38. SwapPickRetract,
  39. WaitPickRetract,
  40. CheckAfterPick,
  41. SwapTurnBack,
  42. WaitTurnBack,
  43. SwapPlaceExtend,
  44. WaitPlaceExtend,
  45. SwapGrip,
  46. WaitGrip,
  47. SwapPlaceRetract,
  48. WaitPlaceRetract,
  49. TurnOver,
  50. WaitTurnOver,
  51. CheckAfterSwap,
  52. UpdateWaferOnPickBlade,
  53. UpdateWaferOnChamber,
  54. RaiseAligner,
  55. CheckWaferOnTurnOver,
  56. PickWafer,
  57. AlignerPrepareAccept,
  58. WaitAlignerReadyAfterPick,
  59. PlaceWafer,
  60. }
  61. private bool _isNeedToRaiseAligner = false;
  62. public SwapRoutine(string module, string name)
  63. {
  64. Module = module;
  65. Name = name;
  66. }
  67. public bool Initalize()
  68. {
  69. Reset();
  70. IsRoutineActive = false;
  71. // SC.GetConfigItem($"Robot.{ Robot.RobotModuleName}.TimeLimitForExchangeWafer");
  72. return true;
  73. }
  74. public ModuleName Source { get; set; }
  75. public ModuleName RobotModulename { get; set; } = ModuleName.Robot;
  76. public int Slot { get; set; }
  77. public Hand PlaceBlade { get; set; }
  78. public Hand PickBlade => GetPickBlade(PlaceBlade);
  79. public Result Start(params object[] objs)
  80. {
  81. Name = "Swap";
  82. Robot = DEVICE.GetDevice<RobotBaseDevice>(RobotModulename.ToString());
  83. Reset();
  84. if (!Robot.Blade2Enable && !Robot.Blade1Enable)
  85. {
  86. EV.PostAlarmLog(ModuleName.System.ToString(), $"Can not {Name}, not all blade is enable");
  87. return Result.FAIL;
  88. }
  89. FixedTurnOverPosition = SC.ContainsItem("Process.FixedTurnOverPosition") ? SC.GetValue<bool>("Process.FixedTurnOverPosition") : true;
  90. IsRoutineActive = true;
  91. if(WaferManager.Instance.CheckHasWafer(RobotModulename,(int)PickBlade))
  92. {
  93. EV.PostAlarmLog(ModuleName.System.ToString(), $"Robot:{RobotModulename} detect wafer on pick blade:{PickBlade}.");
  94. return Result.FAIL;
  95. }
  96. if (WaferManager.Instance.CheckNoWafer(RobotModulename, (int)PlaceBlade))
  97. {
  98. EV.PostAlarmLog(ModuleName.System.ToString(), $"Robot:{RobotModulename} detect no wafer on place blade:{PlaceBlade}.");
  99. return Result.FAIL;
  100. }
  101. if (ModuleHelper.IsAligner(Source) && !DEVICE.GetDevice<AlignerBaseDevice>(Source.ToString()).IsReady())
  102. {
  103. EV.PostAlarmLog(ModuleName.System.ToString(), "Aligner is not ready.");
  104. return Result.FAIL;
  105. }
  106. if(ModuleHelper.IsTurnOverStation(Source) && !_ioTurnOver.IsReady)
  107. {
  108. EV.PostAlarmLog(ModuleName.System.ToString(), "Turn Over is not ready.");
  109. return Result.FAIL;
  110. }
  111. if (ModuleHelper.IsTurnOverStation(Source))
  112. {
  113. _isTurnOverOn0deg = _ioTurnOver.CurrentFlipperPosition == FlipperPosEnum.FrontSide;
  114. }
  115. if (ModuleHelper.IsAligner(Source))
  116. {
  117. _isNeedToRaiseAligner = Aligner.IsNeedRelease;
  118. _isNeedPrepareAccept = Aligner.IsNeedPrepareBeforePlaceWafer();
  119. }
  120. if (ModuleHelper.IsLoadPort(Source))
  121. {
  122. var lp = DEVICE.GetDevice<LoadPortBaseDevice>(Source.ToString());
  123. if (lp.IsForbidAccessSlotAboveWafer() && Slot > 0 && WaferManager.Instance.CheckHasWafer(Source, Slot - 1))
  124. {
  125. EV.PostAlarmLog(ModuleName.System.ToString(), "Access dennied to the slot above wafer.");
  126. return Result.FAIL;
  127. }
  128. string reason;
  129. if (!lp.IsEnableTransferWafer(out reason))
  130. {
  131. EV.PostAlarmLog(ModuleName.System.ToString(), $"{Source} is not ready to transfer wafer:{reason}.");
  132. return Result.FAIL;
  133. }
  134. }
  135. if (!ModuleHelper.IsTurnOverStation(Source) && Source != ModuleName.Aligner)
  136. {
  137. if (!RobotOffsetConfig.Instance.GetPickOffset(Source, ref _offsetX, ref _offsetY, ref _offsetZ,
  138. out string reason))
  139. {
  140. EV.PostWarningLog(ModuleName.System.ToString(), $"Can not {Name}, {reason}");
  141. return Result.FAIL;
  142. }
  143. }
  144. else
  145. {
  146. _offsetX = 0;
  147. _offsetY = 0;
  148. _offsetY = 0;
  149. }
  150. EV.PostInfoLog("System", $"Start swapping wafer from station:{Source} slot:{Slot + 1} with blade {PickBlade}");
  151. return Monitor();
  152. }
  153. private bool _isTurnOverOn0deg;
  154. private bool _isNeedPrepareAccept;
  155. public Result Monitor()
  156. {
  157. if (!IsRoutineActive)
  158. return Result.DONE;
  159. var ret = MonitorRoutine();
  160. if(ret == Result.FAIL)
  161. {
  162. IsRoutineActive = false;
  163. }
  164. if (ret == Result.DONE)
  165. {
  166. IsRoutineActive = false;
  167. }
  168. return ret;
  169. }
  170. private Result MonitorRoutine()
  171. {
  172. try
  173. {
  174. if (ModuleHelper.IsAligner(Source))
  175. {
  176. if (_isNeedToRaiseAligner)
  177. {
  178. RtReleaseAligner((int)Swap.ReleaseAligner, Notify, Stop);
  179. if (ExecuteResult.Item1)
  180. {
  181. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  182. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  183. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  184. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  185. }
  186. RtWaitAlignerMotion((int)Swap.WaitAlignerReady, Aligner, "Wait Aligner Ready", Aligner.TimeLimitAlignWafer, 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. }
  195. if(_isNeedPrepareAccept)
  196. {
  197. RtPickWaferForSwap((int)Swap.PickWafer,"Pick wafer for swap",Source,Slot,PickBlade, Robot.RobotCommandTimeout,_offsetX,_offsetY,_offsetZ, Notify, Stop);
  198. if (ExecuteResult.Item1)
  199. {
  200. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  201. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  202. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  203. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  204. }
  205. AlignerPostActionAfterPick((int)Swap.AlignerPrepareAccept, Notify, Stop);
  206. if (ExecuteResult.Item1)
  207. {
  208. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  209. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  210. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  211. if (ExecuteResult.Item2 == Result.DONE) return Result.RUN;
  212. }
  213. RtWaitAlignerMotion((int)Swap.WaitAlignerReadyAfterPick, Aligner, "Wait Aligner Ready", Aligner.TimeLimitAlignWafer, Notify, Stop);
  214. if (ExecuteResult.Item1)
  215. {
  216. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  217. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  218. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  219. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  220. }
  221. RtPlaceWafer((int)Swap.PlaceWafer,"Place wafer for swap",Source,Slot,PlaceBlade, Robot.RobotCommandTimeout, _offsetX, _offsetY, _offsetZ, Notify, Stop);
  222. if (ExecuteResult.Item1)
  223. {
  224. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  225. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  226. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  227. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  228. }
  229. }
  230. else
  231. {
  232. RtSwapWafer((int)Swap.SwapWafer, "Swap wafer", Source, Slot, PickBlade, Robot.RobotCommandTimeout, Notify, Stop);
  233. if (ExecuteResult.Item1)
  234. {
  235. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  236. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  237. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  238. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  239. }
  240. }
  241. }
  242. if (ModuleHelper.IsLoadPort(Source) || ModuleHelper.IsBuffer(Source))
  243. {
  244. RtSwapWafer((int)Swap.SwapWafer, "Swap wafer", Source, Slot, PickBlade, Robot.RobotCommandTimeout, Notify, Stop);
  245. if (ExecuteResult.Item1)
  246. {
  247. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  248. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  249. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  250. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  251. }
  252. }
  253. if (ModuleHelper.IsTurnOverStation(Source))
  254. {
  255. if (FixedTurnOverPosition)
  256. {
  257. if (_isTurnOverOn0deg)
  258. {
  259. RtTurnOverTurn((int)Swap.TurnTo180, Notify, Stop);
  260. if (ExecuteResult.Item1)
  261. {
  262. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  263. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  264. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  265. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  266. }
  267. RtWaitTurnOverTurnTo180((int)Swap.WaitTurnTo180, _ioTurnOver, _ioTurnOver.TimelimitAction, Notify, Stop);
  268. if (ExecuteResult.Item1)
  269. {
  270. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  271. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  272. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  273. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  274. }
  275. }
  276. RtRobotArmGoReadyForPickFromTurnOver((int)Swap.SwapPickExtend, Source, Slot, PickBlade, Robot.RobotCommandTimeout,
  277. Notify, Stop, GetWaferOffsetForTurnOverOn180());
  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. RtTurnOverUnGripWafer((int)Swap.SwapUnGripTurnOver, 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. RtWaitTurnOverMotion((int)Swap.WaitUnGripTurnOver, _ioTurnOver, _ioTurnOver.TimelimitAction, 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. RtPickWaferFromTurnOver((int)Swap.SwapPickRetract, Source, Slot, PickBlade,Robot.RobotCommandTimeout, Notify, Stop, GetWaferOffsetForTurnOverOn180());
  302. if (ExecuteResult.Item1)
  303. {
  304. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  305. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  306. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  307. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  308. }
  309. RtTurnOverTurnBack((int)Swap.SwapTurnBack, Notify, Stop);
  310. if (ExecuteResult.Item1)
  311. {
  312. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  313. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  314. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  315. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  316. }
  317. RtWaitTurnOverMotion((int)Swap.WaitTurnBack, _ioTurnOver, _ioTurnOver.TimelimitAction, Notify, Stop);
  318. if (ExecuteResult.Item1)
  319. {
  320. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  321. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  322. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  323. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  324. }
  325. RtDeliverWaferToGrip((int)Swap.SwapPlaceExtend, Source, Slot, PlaceBlade, Robot.RobotCommandTimeout, Notify, Stop);
  326. if (ExecuteResult.Item1)
  327. {
  328. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  329. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  330. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  331. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  332. }
  333. RtTurnOverGripWafer((int)Swap.SwapGrip, Notify, Stop);
  334. if (ExecuteResult.Item1)
  335. {
  336. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  337. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  338. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  339. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  340. }
  341. RtWaitTurnOverMotion((int)Swap.WaitGrip, _ioTurnOver, _ioTurnOver.TimelimitAction, Notify, Stop);
  342. if (ExecuteResult.Item1)
  343. {
  344. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  345. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  346. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  347. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  348. }
  349. RtRetractRobotArmForTurning((int)Swap.SwapPlaceRetract, Source, Slot, PlaceBlade, Robot.RobotCommandTimeout, Notify, Stop);
  350. if (ExecuteResult.Item1)
  351. {
  352. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  353. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  354. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  355. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  356. }
  357. RtCheckWaferOnTurn((int)Swap.CheckWaferOnTurnOver, Notify, Stop);
  358. if (ExecuteResult.Item1)
  359. {
  360. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  361. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  362. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  363. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  364. }
  365. RtTurnOverTurn((int)Swap.TurnOver, Notify, Stop);
  366. if (ExecuteResult.Item1)
  367. {
  368. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  369. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  370. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  371. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  372. }
  373. }
  374. else
  375. {
  376. if (_isTurnOverOn0deg)
  377. {
  378. RtRobotArmGoReadyForPickFromTurnOver((int)Swap.SwapPickExtend, Source, Slot, PickBlade, Robot.RobotCommandTimeout, 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. RtTurnOverUnGripWafer((int)Swap.SwapUnGripTurnOver, Notify, Stop);
  387. if (ExecuteResult.Item1)
  388. {
  389. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  390. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  391. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  392. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  393. }
  394. RtWaitTurnOverMotion((int)Swap.WaitUnGripTurnOver, _ioTurnOver, _ioTurnOver.TimelimitAction, Notify, Stop);
  395. if (ExecuteResult.Item1)
  396. {
  397. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  398. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  399. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  400. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  401. }
  402. RtPickWaferFromTurnOver((int)Swap.SwapPickRetract, Source, Slot, PickBlade, Robot.RobotCommandTimeout, Notify, Stop);
  403. if (ExecuteResult.Item1)
  404. {
  405. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  406. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  407. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  408. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  409. }
  410. RtDeliverWaferToGrip((int)Swap.SwapPlaceExtend, Source, Slot, PlaceBlade, Robot.RobotCommandTimeout, Notify, Stop);
  411. if (ExecuteResult.Item1)
  412. {
  413. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  414. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  415. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  416. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  417. }
  418. RtTurnOverGripWafer((int)Swap.SwapGrip, Notify, Stop);
  419. if (ExecuteResult.Item1)
  420. {
  421. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  422. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  423. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  424. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  425. }
  426. RtWaitTurnOverMotion((int)Swap.WaitGrip, _ioTurnOver, _ioTurnOver.TimelimitAction, Notify, Stop);
  427. if (ExecuteResult.Item1)
  428. {
  429. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  430. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  431. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  432. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  433. }
  434. RtRetractRobotArmForTurning((int)Swap.SwapPlaceRetract, Source, Slot, PlaceBlade, Robot.RobotCommandTimeout, Notify, Stop);
  435. if (ExecuteResult.Item1)
  436. {
  437. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  438. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  439. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  440. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  441. }
  442. RtCheckWaferOnTurn((int)Swap.CheckWaferOnTurnOver, Notify, Stop);
  443. if (ExecuteResult.Item1)
  444. {
  445. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  446. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  447. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  448. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  449. }
  450. RtTurnOverTurn((int)Swap.TurnOver, Notify, Stop);
  451. if (ExecuteResult.Item1)
  452. {
  453. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  454. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  455. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  456. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  457. }
  458. }
  459. else
  460. {
  461. RtRobotArmGoReadyForPickFromTurnOver((int)Swap.SwapPickExtend, Source, Slot, PickBlade, Robot.RobotCommandTimeout, Notify, Stop,
  462. GetWaferOffsetForTurnOverOn180());
  463. if (ExecuteResult.Item1)
  464. {
  465. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  466. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  467. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  468. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  469. }
  470. RtTurnOverUnGripWafer((int)Swap.SwapUnGripTurnOver, Notify, Stop);
  471. if (ExecuteResult.Item1)
  472. {
  473. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  474. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  475. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  476. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  477. }
  478. RtWaitTurnOverMotion((int)Swap.WaitUnGripTurnOver, _ioTurnOver, _ioTurnOver.TimelimitAction, Notify, Stop);
  479. if (ExecuteResult.Item1)
  480. {
  481. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  482. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  483. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  484. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  485. }
  486. RtPickWaferFromTurnOver((int)Swap.SwapPickRetract, Source, Slot, PickBlade, Robot.RobotCommandTimeout, Notify, Stop,
  487. GetWaferOffsetForTurnOverOn180());
  488. if (ExecuteResult.Item1)
  489. {
  490. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  491. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  492. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  493. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  494. }
  495. RtDeliverWaferToGrip((int)Swap.SwapPlaceExtend, Source, Slot, PlaceBlade, Robot.RobotCommandTimeout, Notify, Stop,
  496. PutWaferOffsetForTurnOverOn180());
  497. if (ExecuteResult.Item1)
  498. {
  499. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  500. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  501. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  502. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  503. }
  504. RtTurnOverGripWafer((int)Swap.SwapGrip, Notify, Stop);
  505. if (ExecuteResult.Item1)
  506. {
  507. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  508. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  509. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  510. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  511. }
  512. RtWaitTurnOverMotion((int)Swap.WaitGrip, _ioTurnOver, _ioTurnOver.TimelimitAction, Notify, Stop);
  513. if (ExecuteResult.Item1)
  514. {
  515. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  516. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  517. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  518. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  519. }
  520. RtRetractRobotArmForTurning((int)Swap.SwapPlaceRetract, Source, Slot, PlaceBlade, Robot.RobotCommandTimeout, Notify, Stop,
  521. PutWaferOffsetForTurnOverOn180());
  522. if (ExecuteResult.Item1)
  523. {
  524. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  525. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  526. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  527. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  528. }
  529. RtCheckWaferOnTurn((int)Swap.CheckWaferOnTurnOver, Notify, Stop);
  530. if (ExecuteResult.Item1)
  531. {
  532. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  533. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  534. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  535. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  536. }
  537. RtTurnOverTurnBack((int)Swap.TurnOver, Notify, Stop);
  538. if (ExecuteResult.Item1)
  539. {
  540. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  541. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  542. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  543. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  544. }
  545. }
  546. }
  547. }
  548. RtUpdateWaferSingleStepProcessState((int)Swap.UpdateWaferOnPickBlade, "Update process state on robot", RobotModulename, 0, PickBlade,
  549. EnumWaferProcessStatus.Idle, Notify, Stop);
  550. if (ExecuteResult.Item1)
  551. {
  552. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  553. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  554. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  555. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  556. }
  557. RtUpdateWaferSingleStepProcessState((int)Swap.UpdateWaferOnChamber, "Update process state on chamber", Source, Slot, PickBlade,
  558. EnumWaferProcessStatus.Wait, Notify, Stop);
  559. if (ExecuteResult.Item1)
  560. {
  561. if (ExecuteResult.Item2 == Result.RUN) return Result.RUN;
  562. if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL;
  563. if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL;
  564. if (ExecuteResult.Item2 == Result.DONE) return Result.DONE;
  565. }
  566. EV.PostInfoLog("System", $"Complete swapping wafer from station:{Source} slot:{Slot + 1} with blade {PickBlade}.");
  567. //EV.PostMessage(ModuleName.System.ToString(), EventEnum.GeneralInfo, string.Format("Swap wafer {0}{1:D2} place blade {2}", Source.ToString(), Slot+1, PlaceBlade.ToString()));
  568. IsRoutineActive = false;
  569. return Result.DONE;
  570. }
  571. catch (Exception ex)
  572. {
  573. LOG.Write(ex);
  574. EV.PostAlarmLog("System", $"Failed to swap wafer from station:{Source} slot:{Slot + 1} with blade {PickBlade}.");
  575. IsRoutineActive = false;
  576. return Result.FAIL;
  577. }
  578. }
  579. protected override void Notify(string message)
  580. {
  581. EV.PostMessage(Module, EventEnum.GeneralInfo, String.Format("Swap wafer:{0}", message));
  582. }
  583. /// <summary>
  584. /// prepare process failed
  585. /// </summary>
  586. /// <param name="failReason"></param>
  587. /// <param name="reactor"></param>
  588. protected override void Stop(string failReason)
  589. {
  590. string reason = String.Empty;
  591. 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));
  592. }
  593. private Hand GetPickBlade(Hand placeBlade)
  594. {
  595. return PlaceBlade == Hand.Blade1 ? Hand.Blade2 : Hand.Blade1;
  596. }
  597. }
  598. }