BoatZAxisMove.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Device.Unit;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.Routine;
  5. using Aitex.Core.RT.SCCore;
  6. using Aitex.Core.Util;
  7. using Aitex.Sorter.Common;
  8. using MECF.Framework.Common.Alarms;
  9. using MECF.Framework.Common.Device.Bases;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using FurnaceRT.Equipments.Systems;
  19. using static Aitex.Core.RT.Device.Unit.IoAutoShutter;
  20. using static Aitex.Core.RT.Device.Unit.IoBoat;
  21. using FurnaceRT.Devices;
  22. namespace FurnaceRT.Equipments.Boats
  23. {
  24. public class BoatZAxisMove : ModuleRoutine, IRoutine
  25. {
  26. enum RoutineStep
  27. {
  28. AutoShutterOpen,
  29. AutoShutterClose,
  30. AutoShutterUp,
  31. AutoShutterDown,
  32. ZAxisManualMove,
  33. CheckPrepareMove,
  34. SetZAxisBoatSpeed,
  35. BoatZAxisMoveTo,
  36. Delay1,
  37. Delay2,
  38. Delay3,
  39. Delay4,
  40. }
  41. private BoatPosition _targetPosition;
  42. private float _speed;
  43. private BoatModule _boatModule;
  44. private int _timeout = 0;
  45. private int _shutterTimeout = 0;
  46. public BoatZAxisMove(BoatModule boatModule)
  47. {
  48. _boatModule = boatModule;
  49. Module = boatModule.Module;
  50. Name = "ZAxisMove";
  51. }
  52. public void Init(string targetPosition, string speed)
  53. {
  54. _targetPosition = (BoatPosition)Enum.Parse(typeof(BoatPosition), targetPosition);
  55. float.TryParse(speed, out _speed);
  56. var para = new List<object> { _targetPosition, speed };
  57. _boatModule.BoatZAxisMoveFailedForInterlock.RetryMessage = (int)BoatModule.MSG.ZAxisMoveRetry;
  58. _boatModule.BoatZAxisMoveFailedForInterlock.RetryMessageParas = para.ToArray();
  59. _boatModule.BoatZAxisMoveFailedForHumanInterlock.RetryMessage = (int)BoatModule.MSG.ZAxisMoveRetry;
  60. _boatModule.BoatZAxisMoveFailedForHumanInterlock.RetryMessageParas = para.ToArray();
  61. _boatModule.BoatZAxisMoveFailedForWaferRobotArmExtend.RetryMessage = (int)BoatModule.MSG.ZAxisMoveRetry;
  62. _boatModule.BoatZAxisMoveFailedForWaferRobotArmExtend.RetryMessageParas = para.ToArray();
  63. _boatModule.BoatZAxisMoveTimeOut.RetryMessage = (int)BoatModule.MSG.ZAxisMoveRetry;
  64. _boatModule.BoatZAxisMoveTimeOut.RetryMessageParas = para.ToArray();
  65. _boatModule.AutoShutterMoveFailedForInterlock.RetryMessage = (int)BoatModule.MSG.ZAxisMoveRetry;
  66. _boatModule.AutoShutterMoveFailedForInterlock.RetryMessageParas = para.ToArray();
  67. _boatModule.AutoShutterOpenTimeOut.RetryMessage = (int)BoatModule.MSG.ZAxisMoveRetry;
  68. _boatModule.AutoShutterOpenTimeOut.RetryMessageParas = para.ToArray();
  69. _boatModule.AutoShutterCloseTimeOut.RetryMessage = (int)BoatModule.MSG.ZAxisMoveRetry;
  70. _boatModule.AutoShutterCloseTimeOut.RetryMessageParas = para.ToArray();
  71. }
  72. public Result Start(params object[] objs)
  73. {
  74. Reset();
  75. if (_targetPosition == BoatPosition.None)
  76. return Result.DONE;
  77. _timeout = SC.GetValue<int>($"{Module}.MotionTimeout");
  78. _shutterTimeout = SC.GetValue<int>($"{Module}.AutoShutter.MotionTimeout");
  79. string reason = string.Empty;
  80. if (!_boatModule.CheckPrepareMove(out reason, false))
  81. {
  82. _boatModule.BoatZAxisMoveFailedForInterlock.Set(reason);
  83. return Result.FAIL;
  84. }
  85. Notify($"Start");
  86. return Result.RUN;
  87. }
  88. public void Abort()
  89. {
  90. _boatModule.BoatZAxisStop();
  91. }
  92. public override Result Monitor()
  93. {
  94. try
  95. {
  96. PauseRountine(_boatModule.RAxisDevice.IsPause);
  97. if (_boatModule.RAxisDevice.IsPause)
  98. return Result.RUN;
  99. if (_boatModule.ZAxisDevice.IsError)
  100. return Result.FAIL;
  101. AutoShutterOpen((int)RoutineStep.AutoShutterOpen, true, _shutterTimeout);
  102. CheckPrepareMove((int)RoutineStep.CheckPrepareMove, 2);
  103. Delay((int)RoutineStep.Delay2, 1);
  104. SetBoatZAxisMove((int)RoutineStep.BoatZAxisMoveTo, _targetPosition, _speed, _timeout);
  105. if (_targetPosition == BoatPosition.HomePosition)
  106. {
  107. AutoShutterOpen((int)RoutineStep.AutoShutterClose, false, _timeout);
  108. }
  109. }
  110. catch (RoutineBreakException)
  111. {
  112. return Result.RUN;
  113. }
  114. catch (RoutineFaildException ex)
  115. {
  116. return Result.FAIL;
  117. }
  118. Notify("Finished");
  119. return Result.DONE;
  120. }
  121. private void CheckPrepareMove(int id, int timeout)
  122. {
  123. var reason = "";
  124. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  125. {
  126. Notify($"Check boat move enable");
  127. return true;
  128. }, () =>
  129. {
  130. return _boatModule.CheckPrepareMove(out reason);
  131. }, timeout * 2 * 1000);
  132. if (ret.Item1)
  133. {
  134. if (ret.Item2 == Result.FAIL)
  135. {
  136. throw (new RoutineFaildException());
  137. }
  138. else if (ret.Item2 == Result.TIMEOUT) //timeout
  139. {
  140. _boatModule.BoatZAxisMoveFailedForInterlock.Set($"{reason} is not OK, can not complete in {timeout} seconds");
  141. throw (new RoutineFaildException());
  142. }
  143. else
  144. throw (new RoutineBreakException());
  145. }
  146. }
  147. private void AutoShutterOpen(int id, bool isOpen, int timeout)
  148. {
  149. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  150. {
  151. Notify($"shutter {(isOpen ? "open" : "close")}");
  152. string reason;
  153. if (!_boatModule.ShutterDevice.SetOpen(isOpen, out reason))
  154. {
  155. _boatModule.ShutterDevice.AutoShutterMoveFailedForInterlock.Set();
  156. return false;
  157. }
  158. return true;
  159. }, () =>
  160. {
  161. return isOpen ? _boatModule.ShutterDevice.OpenCloseStatus == DeviceStatus.Open : _boatModule.ShutterDevice.OpenCloseStatus == DeviceStatus.Close;
  162. }, timeout * 1000);
  163. if (ret.Item1)
  164. {
  165. if (ret.Item2 == Result.FAIL)
  166. {
  167. throw (new RoutineFaildException());
  168. }
  169. else if (ret.Item2 == Result.TIMEOUT) //timeout
  170. {
  171. if (isOpen)
  172. {
  173. _boatModule.ShutterDevice.AutoShutterOpenTimeOut.Set($"can not complete in {timeout} seconds");
  174. }
  175. else
  176. {
  177. _boatModule.ShutterDevice.AutoShutterCloseTimeOut.Set($"can not complete in {timeout} seconds");
  178. }
  179. throw (new RoutineFaildException());
  180. }
  181. else
  182. throw (new RoutineBreakException());
  183. }
  184. }
  185. private void SetBoatZAxisMove(int id, BoatPosition position, float speed, int timeout)
  186. {
  187. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  188. {
  189. Notify($"Boat ZAxis movet to {position}");
  190. string reason;
  191. if (!_boatModule.ZAxisDevice.SetServoMoveTo(position.ToString(), out reason, speed))
  192. {
  193. //_boatModule.BoatDevice.BoatRAxisMoveFailedForInterlock.Description = reason;
  194. _boatModule.BoatZAxisMoveFailedForInterlock.Set(reason);
  195. }
  196. return true;
  197. }, () =>
  198. {
  199. if (_boatModule.ZAxisDevice.IsError)
  200. return null;
  201. return _boatModule.ZAxisDevice.CheckServoAtPosition(position.ToString());
  202. }, timeout * 2 * 1000);
  203. if (ret.Item1)
  204. {
  205. if (ret.Item2 == Result.FAIL)
  206. {
  207. _boatModule.ZAxisDevice.ServoStop();
  208. throw (new RoutineFaildException());
  209. }
  210. else if (ret.Item2 == Result.TIMEOUT) //timeout
  211. {
  212. _boatModule.ZAxisDevice.ServoStop();
  213. _boatModule.BoatZAxisMoveTimeOut.Set($"can not complete in {timeout} seconds");
  214. throw (new RoutineFaildException());
  215. }
  216. else
  217. throw (new RoutineBreakException());
  218. }
  219. }
  220. }
  221. }