BoatShutterCycleTest.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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.IoBoat;
  20. using System.Diagnostics;
  21. using FurnaceRT.Devices;
  22. namespace FurnaceRT.Equipments.Boats
  23. {
  24. public class BoatShutterCycleTest : ModuleRoutine, IRoutine
  25. {
  26. enum RoutineStep
  27. {
  28. ShutterOpen,
  29. ShutterClose,
  30. Loop,
  31. EndLoop,
  32. Delay1,
  33. Delay2,
  34. Delay3,
  35. }
  36. private float _speed;
  37. private float _interval;
  38. private BoatModule _boatModule;
  39. private int _shutterTimeout = 0;
  40. private int _count;
  41. public BoatShutterCycleTest(BoatModule boatModule)
  42. {
  43. _boatModule = boatModule;
  44. Module = boatModule.Module;
  45. Name = "ShutterCycleTest";
  46. }
  47. public void Init()
  48. {
  49. }
  50. public Result Start(params object[] objs)
  51. {
  52. Reset();
  53. _count = SC.GetValue<int>($"{Module}.AutoShutter.CycleCount");
  54. _interval = (float)SC.GetValue<double>($"Boat.AutoShutter.IntervalTime");
  55. _shutterTimeout = SC.GetValue<int>($"{Module}.AutoShutter.MotionTimeout");
  56. string reason = string.Empty;
  57. if (!_boatModule.CheckPrepareMove(out reason, false))
  58. {
  59. _boatModule.BoatZAxisMoveFailedForInterlock.Set(reason);
  60. return Result.FAIL;
  61. }
  62. Notify($"Start");
  63. return Result.RUN;
  64. }
  65. public void Abort()
  66. {
  67. _boatModule.ShutterDevice.Reset();
  68. }
  69. public override Result Monitor()
  70. {
  71. try
  72. {
  73. Loop((int)RoutineStep.Loop, _count);
  74. ShutterOpen((int)RoutineStep.ShutterOpen, true, _shutterTimeout);
  75. Delay((int)RoutineStep.Delay1, 2);
  76. Delay((int)RoutineStep.Delay2, _interval);
  77. ShutterOpen((int)RoutineStep.ShutterClose, false, _shutterTimeout);
  78. Delay((int)RoutineStep.Delay3, _interval);
  79. EndLoop((int)RoutineStep.EndLoop);
  80. }
  81. catch (RoutineBreakException)
  82. {
  83. return Result.RUN;
  84. }
  85. catch (RoutineFaildException ex)
  86. {
  87. return Result.FAIL;
  88. }
  89. _boatModule.ShutterDevice.Reset();
  90. Notify("Finished");
  91. return Result.DONE;
  92. }
  93. private void ShutterOpen(int id, bool isOpen, int timeout)
  94. {
  95. Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
  96. {
  97. Notify($"shutter {(isOpen ? "open" : "close")}");
  98. string reason;
  99. if (!_boatModule.ShutterDevice.SetOpen(isOpen, out reason))
  100. {
  101. _boatModule.ShutterDevice.AutoShutterMoveFailedForInterlock.Set();
  102. return false;
  103. }
  104. return true;
  105. }, () =>
  106. {
  107. return isOpen ? _boatModule.ShutterDevice.OpenCloseStatus == DeviceStatus.Open : _boatModule.ShutterDevice.OpenCloseStatus == DeviceStatus.Close;
  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. if (isOpen)
  118. {
  119. _boatModule.ShutterDevice.AutoShutterOpenTimeOut.Set($"can not complete in {timeout} seconds");
  120. }
  121. else
  122. {
  123. _boatModule.ShutterDevice.AutoShutterCloseTimeOut.Set($"can not complete in {timeout} seconds");
  124. }
  125. throw (new RoutineFaildException());
  126. }
  127. else
  128. throw (new RoutineBreakException());
  129. }
  130. }
  131. }
  132. }