FIMSLoadRoutine.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using Aitex.Core.RT.Event;
  2. using Aitex.Core.RT.Routine;
  3. using Aitex.Core.RT.SCCore;
  4. using Aitex.Core.Util;
  5. using FurnaceRT.Equipments.Systems;
  6. using MECF.Framework.Common.Equipment;
  7. using MECF.Framework.Common.SubstrateTrackings;
  8. using System;
  9. namespace FurnaceRT.Equipments.FIMSs
  10. {
  11. public class FIMSLoadRoutine : ModuleRoutine, IRoutine
  12. {
  13. enum RoutineStep
  14. {
  15. Load,
  16. Delay,
  17. CheckLoadFinish,
  18. }
  19. private int _timeout;
  20. private FIMSModule _fimsModule;
  21. public FIMSLoadRoutine(FIMSModule fimsModule)
  22. {
  23. Module = fimsModule.Module.ToString();
  24. _fimsModule = fimsModule;
  25. Name = "Load";
  26. }
  27. public Result Init()
  28. {
  29. return Result.DONE;
  30. }
  31. public Result Start(params object[] objs)
  32. {
  33. Reset();
  34. _timeout = SC.GetValue<int>($"FIMS.{Module}.MotionTimeout");
  35. if (!Singleton<EquipmentManager>.Instance.IsAutoMode && !Singleton<EquipmentManager>.Instance.IsReturnWafer)
  36. {
  37. if (!_fimsModule.SensorWaferRobotEX1AxisHomePosition.Value)
  38. {
  39. _fimsModule.LoadFailAlarm.Set($"wafer robot EX1 axis not at home position");
  40. return Result.FAIL;
  41. }
  42. if (!_fimsModule.SensorWaferRobotEX2AxisHomePosition.Value)
  43. {
  44. _fimsModule.LoadFailAlarm.Set($"wafer robot EX2 axis not at home position");
  45. return Result.FAIL;
  46. }
  47. }
  48. if (_fimsModule.FIMSDevice.IsLoadCompleted)
  49. {
  50. EV.PostInfoLog(Module, $"{Module} already at load position");
  51. _fimsModule.FIMSDevice.IsLoadCompleted = true;
  52. _fimsModule.FIMSDevice.IsUnloadCompleted = false;
  53. return Result.DONE;
  54. }
  55. if (_fimsModule.FIMSDevice.DoorOpenCloseStatus == Devices.DeviceStatus.Close && _fimsModule.IsWaferOnRobot)
  56. {
  57. _fimsModule.UnloadFailAlarm.Set($"wafer robot inside {Module}");
  58. return Result.FAIL;
  59. }
  60. Notify($"{_fimsModule.Name} {Name} start");
  61. _fimsModule.FIMSDevice.IsLoadCompleted = false;
  62. _fimsModule.FIMSDevice.IsUnloadCompleted = false;
  63. return Result.RUN;
  64. }
  65. public override Result Monitor()
  66. {
  67. try
  68. {
  69. PauseRountine(_fimsModule.FIMSDevice.IsPause);
  70. if (_fimsModule.FIMSDevice.IsPause)
  71. return Result.RUN;
  72. Load((int)RoutineStep.Load, _timeout);
  73. Delay((int)RoutineStep.Delay, 3);
  74. CheckLoadFinish((int)RoutineStep.CheckLoadFinish, _timeout);
  75. }
  76. catch (RoutineBreakException)
  77. {
  78. return Result.RUN;
  79. }
  80. catch (RoutineFaildException)
  81. {
  82. _fimsModule.Stop();
  83. return Result.FAIL;
  84. }
  85. _fimsModule.FIMSDevice.IsLoadCompleted = true;
  86. _fimsModule.Stop();
  87. Notify($"{_fimsModule.Name} {Name} finished");
  88. return Result.DONE;
  89. }
  90. public void Abort()
  91. {
  92. _fimsModule.Stop();
  93. }
  94. private void Load(int id, int timeout)
  95. {
  96. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  97. {
  98. Notify($"{Module} load");
  99. if (!_fimsModule.FIMSDevice.Load(out string reason))
  100. {
  101. Stop(reason);
  102. return false;
  103. }
  104. return true;
  105. }, () =>
  106. {
  107. return true;
  108. }, timeout * 1000);
  109. if (ret.Item1)
  110. {
  111. if (ret.Item2 == Result.FAIL)
  112. {
  113. throw (new RoutineFaildException());
  114. }
  115. else if (ret.Item2 == Result.TIMEOUT) //timeout
  116. {
  117. _fimsModule.LoadTimeoutAlarm.Set($"can not complete in {timeout} seconds");
  118. throw (new RoutineFaildException());
  119. }
  120. else
  121. throw (new RoutineBreakException());
  122. }
  123. }
  124. private void CheckLoadFinish(int id, int timeout)
  125. {
  126. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  127. {
  128. Notify($"Check {Module} load finish");
  129. return true;
  130. }, () =>
  131. {
  132. return _fimsModule.FIMSDevice.IsPLCLoadCompleted && !_fimsModule.FIMSDevice.IsRunning;
  133. }, timeout * 1000);
  134. if (ret.Item1)
  135. {
  136. if (ret.Item2 == Result.FAIL)
  137. {
  138. throw (new RoutineFaildException());
  139. }
  140. else if (ret.Item2 == Result.TIMEOUT) //timeout
  141. {
  142. _fimsModule.LoadTimeoutAlarm.Set($"can not complete in {timeout} seconds");
  143. throw (new RoutineFaildException());
  144. }
  145. else
  146. throw (new RoutineBreakException());
  147. }
  148. }
  149. }
  150. }