WaferRobotSwap.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. using Aitex.Core.RT.Routine;
  2. using Aitex.Core.RT.SCCore;
  3. using Aitex.Core.Util;
  4. using Aitex.Sorter.Common;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.Schedulers;
  7. using MECF.Framework.Common.SubstrateTrackings;
  8. using MECF.Framework.RT.EquipmentLibrary.LogicUnits;
  9. using System;
  10. using System.Collections.Generic;
  11. using FurnaceRT.Equipments.FIMSs;
  12. using FurnaceRT.Equipments.PMs;
  13. using FurnaceRT.Equipments.Stockers;
  14. using FurnaceRT.Equipments.Systems;
  15. namespace FurnaceRT.Equipments.WaferRobots
  16. {
  17. public class WaferRobotSwap : ModuleRoutine, IRoutine
  18. {
  19. enum RoutineStep
  20. {
  21. Loop,
  22. Pick1,
  23. Pick2,
  24. PickInit1,
  25. PickInit2,
  26. Place1,
  27. Place2,
  28. PlaceInit1,
  29. PlaceInit2,
  30. EndLoop,
  31. }
  32. private ModuleName _source;
  33. private ModuleName _dest;
  34. private int _sourceSlot;
  35. private int _destSlot;
  36. private Hand _blade;
  37. private WaferRobotModule _waferRobotModule;
  38. private Hand _hand;
  39. private WaferRobotPick _pick;
  40. private WaferRobotPlace _place;
  41. private int _cycleNumber;
  42. public WaferRobotSwap(WaferRobotModule waferRobotModule)
  43. {
  44. _waferRobotModule = waferRobotModule;
  45. Module = waferRobotModule.Module;
  46. _pick = new WaferRobotPick(waferRobotModule);
  47. _place = new WaferRobotPlace(waferRobotModule);
  48. Name = "Swap";
  49. }
  50. public void Init(ModuleName source, ModuleName dest, int sourceSlot, int destSlot, Hand hand)
  51. {
  52. _source = source;
  53. _dest = dest;
  54. _hand = hand;
  55. _sourceSlot = sourceSlot;
  56. _destSlot = destSlot;
  57. }
  58. public Result Start(params object[] objs)
  59. {
  60. Reset();
  61. _cycleNumber = SC.GetValue<int>($"{Module}.TransferModeNumber");
  62. Notify("Start");
  63. return Result.RUN;
  64. }
  65. public void Abort()
  66. {
  67. _waferRobotModule.Stop();
  68. }
  69. public override Result Monitor()
  70. {
  71. try
  72. {
  73. PauseRountine(_waferRobotModule.WaferRobotDevice.IsPause);
  74. if (_waferRobotModule.WaferRobotDevice.IsPause)
  75. return Result.RUN;
  76. Loop((int)RoutineStep.Loop, _cycleNumber);
  77. PickInit((int)RoutineStep.PickInit1, _source, _sourceSlot, _hand);
  78. ExecuteRoutine((int)RoutineStep.Pick1, _pick);
  79. PlaceInit((int)RoutineStep.PlaceInit1, _dest, _destSlot, _hand);
  80. ExecuteRoutine((int)RoutineStep.Place1, _place);
  81. PickInit((int)RoutineStep.PickInit2, _dest, _destSlot, _hand);
  82. ExecuteRoutine((int)RoutineStep.Pick2, _pick);
  83. PlaceInit((int)RoutineStep.PlaceInit2, _source, _sourceSlot, _hand);
  84. ExecuteRoutine((int)RoutineStep.Place2, _place);
  85. EndLoop((int)RoutineStep.EndLoop);
  86. }
  87. catch (RoutineBreakException)
  88. {
  89. return Result.RUN;
  90. }
  91. catch (RoutineFaildException ex)
  92. {
  93. (Singleton<EquipmentManager>.Instance.Modules[_source] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_waferRobotModule.Module), _blade, _sourceSlot, EnumTransferType.Pick);
  94. return Result.FAIL;
  95. }
  96. (Singleton<EquipmentManager>.Instance.Modules[_source] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_waferRobotModule.Module), _blade, _sourceSlot, EnumTransferType.Pick);
  97. Notify("Finished");
  98. return Result.DONE;
  99. }
  100. private void PickInit(int id, ModuleName source, int slot, Hand blade)
  101. {
  102. Tuple<bool, Result> ret = Execute(id, () =>
  103. {
  104. Notify($"Pick from {source} {slot} init");
  105. string reason = string.Empty;
  106. _pick.Init(source, slot, blade, false);
  107. return true;
  108. });
  109. if (ret.Item1)
  110. {
  111. if (ret.Item2 == Result.FAIL)
  112. {
  113. throw (new RoutineFaildException());
  114. }
  115. }
  116. }
  117. private void PlaceInit(int id, ModuleName dest, int slot, Hand blade)
  118. {
  119. Tuple<bool, Result> ret = Execute(id, () =>
  120. {
  121. Notify($"Place to {dest} {slot} init");
  122. string reason = string.Empty;
  123. _place.Init(dest, slot, blade, false);
  124. return true;
  125. });
  126. if (ret.Item1)
  127. {
  128. if (ret.Item2 == Result.FAIL)
  129. {
  130. throw (new RoutineFaildException());
  131. }
  132. }
  133. }
  134. }
  135. }