RobotCycleMoveRoutine.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using Aitex.Core.RT.Routine;
  2. using Aitex.Core.RT.SCCore;
  3. using Aitex.Core.Util;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.Routine;
  6. using MECF.Framework.Common.Schedulers;
  7. using MECF.Framework.Common.Utilities;
  8. using PunkHPX8_Core;
  9. using PunkHPX8_RT.Devices.EFEM;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. namespace PunkHPX8_RT.Modules.EFEM
  16. {
  17. public class RobotCycleMoveRoutine : RoutineBase, IRoutine
  18. {
  19. private enum CycleStep
  20. {
  21. LoopStart,
  22. LoopRun,
  23. LoopCheck,
  24. LoopEnd,
  25. End
  26. }
  27. private EfemPickRoutine _efemPickRoutine;
  28. private EfemPlaceRoutine _efemPlaceRoutine;
  29. private EFEMAlignRoutine _efemAlignRoutine;
  30. private IRoutine _currentRoutine;
  31. private List<EfemCycleAction> _moveActionQueue;
  32. /// <summary>
  33. /// 构建函数
  34. /// </summary>
  35. /// <param name="module"></param>
  36. public RobotCycleMoveRoutine(EfemBase efem) : base(ModuleName.EfemRobot.ToString())
  37. {
  38. _efemPickRoutine = new EfemPickRoutine(efem);
  39. _efemPlaceRoutine = new EfemPlaceRoutine(efem);
  40. _efemAlignRoutine = new EFEMAlignRoutine(efem);
  41. }
  42. /// <summary>
  43. /// 中止
  44. /// </summary>
  45. public void Abort()
  46. {
  47. Runner.Stop("Manual abort");
  48. }
  49. /// <summary>
  50. /// 中止
  51. /// </summary>
  52. /// <returns></returns>
  53. public RState Monitor()
  54. {
  55. Runner.LoopStart(CycleStep.LoopStart, "start efem cycle action", _moveActionQueue.Count, NullFun, _delay_1ms)
  56. .LoopRun(CycleStep.LoopRun, RunAction, _delay_1ms)
  57. .LoopRunWithStopStatus(CycleStep.LoopCheck, () => CommonFunction.CheckRoutineEndState(_currentRoutine),
  58. () => CommonFunction.CheckRoutineStopState(_currentRoutine))
  59. .LoopEnd(CycleStep.LoopEnd, NullFun, _delay_1ms)
  60. .End(CycleStep.End, NullFun, _delay_1ms);
  61. return Runner.Status;
  62. }
  63. private bool RunAction()
  64. {
  65. EfemCycleAction action = _moveActionQueue[Runner.LoopCounter];
  66. if(Runner.LoopCounter + 1 <= _moveActionQueue.Count - 1)
  67. {
  68. UpdateCurrentStep(action, _moveActionQueue[Runner.LoopCounter + 1]);
  69. }
  70. switch (action.Action)
  71. {
  72. case "Pick":
  73. Queue<MoveItem> moveItems = new Queue<MoveItem>();
  74. moveItems.Enqueue((MoveItem)action.Parameter);
  75. _currentRoutine = _efemPickRoutine;
  76. return _efemPickRoutine.Start(moveItems) == RState.Running;
  77. case "Place":
  78. Queue<MoveItem> placeMoveItems = new Queue<MoveItem>();
  79. placeMoveItems.Enqueue((MoveItem)action.Parameter);
  80. _currentRoutine= _efemPlaceRoutine;
  81. return _efemPlaceRoutine.Start(placeMoveItems) == RState.Running;
  82. case "Align":
  83. _currentRoutine = _efemAlignRoutine;
  84. object[] alignerParamater = new object[4];//初始化Align参数
  85. alignerParamater[0] = ModuleName.Aligner1;
  86. alignerParamater[1] = 0;
  87. alignerParamater[2] = action.Parameter;
  88. alignerParamater[3] = SC.GetValue<int>("EFEM.Aligner1.AlignerPlatType");
  89. return _efemAlignRoutine.Start(alignerParamater) ==RState.Running;
  90. }
  91. return false;
  92. }
  93. /// <summary>
  94. /// 更新当前执行到哪一步
  95. /// </summary>
  96. private void UpdateCurrentStep(EfemCycleAction action, EfemCycleAction nextAction)
  97. {
  98. EfemEntity efemEntity = Singleton<RouteManager>.Instance.GetModule<EfemEntity>("EFEM");
  99. string step = "";
  100. switch (action.Action)
  101. {
  102. case "Pick":
  103. MoveItem moveItem1 = (MoveItem)action.Parameter;
  104. MoveItem moveItem2 = (MoveItem)nextAction.Parameter;
  105. step = $"{moveItem1.SourceModule} -> {moveItem2.DestinationModule}";
  106. efemEntity.GetCurrentRobotCycleStep(step);
  107. break;
  108. }
  109. }
  110. /// <summary>
  111. /// 启动
  112. /// </summary>
  113. /// <param name="objs"></param>
  114. /// <returns></returns>
  115. public RState Start(params object[] objs)
  116. {
  117. _moveActionQueue = (List<EfemCycleAction>)objs[0];
  118. return Runner.Start(Module, "Robot Cycle move");
  119. }
  120. }
  121. }