EfemRobotMapRoutine.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.RT.Routine;
  3. using Aitex.Core.RT.SCCore;
  4. using Aitex.Sorter.Common;
  5. using CyberX8_Core;
  6. using CyberX8_RT.Devices.EFEM;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.Routine;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Runtime.InteropServices;
  14. using System.Text;
  15. using System.Threading;
  16. using System.Threading.Tasks;
  17. namespace CyberX8_RT.Modules.EFEM
  18. {
  19. public class EfemRobotMapRoutine : RoutineBase, IRoutine
  20. {
  21. enum RoutineStep
  22. {
  23. GotoMapWaitIdle,
  24. GotoMap,
  25. WaitEFEMIdle,
  26. Map,
  27. RequestMapWaitIdle,
  28. RequestMap,
  29. BackWaitIdle,
  30. Back,
  31. End,
  32. }
  33. /// <summary>
  34. /// 构造函数
  35. /// </summary>
  36. /// <param name="efem"></param>
  37. public EfemRobotMapRoutine(EfemBase efem):base(ModuleName.EfemRobot.ToString())
  38. {
  39. _efem = efem;
  40. }
  41. #region 内部变量
  42. private int _timeout = 0;
  43. private ModuleName _module = ModuleName.EfemRobot;
  44. private EfemBase _efem;
  45. #endregion
  46. /// <summary>
  47. /// 启动
  48. /// </summary>
  49. /// <param name="objs"></param>
  50. /// <returns></returns>
  51. public RState Start(params object[] objs)
  52. {
  53. Reset();
  54. _module=(ModuleName)objs[0];
  55. _timeout = SC.GetValue<int>("EFEM.LoadPort.MotionTimeout");
  56. return Runner.Start(Module, $"Start Map {_module}");
  57. }
  58. public RState Monitor()
  59. {
  60. Runner.Wait(RoutineStep.GotoMapWaitIdle, WaitModuleReady)
  61. .Run(RoutineStep.GotoMap, GotoMap, CheckStepDone, _timeout * 1000)
  62. .Wait(RoutineStep.WaitEFEMIdle, WaitModuleReady)
  63. .Run(RoutineStep.Map, Map, CheckStepDone, _timeout * 1000)
  64. .Wait(RoutineStep.RequestMapWaitIdle, WaitModuleReady)
  65. .Run(RoutineStep.RequestMap, RequestMap, CheckStepDone, _timeout * 1000)
  66. .Wait(RoutineStep.BackWaitIdle, WaitModuleReady)
  67. .Run(RoutineStep.Back, Back, CheckStepDone, _timeout * 1000)
  68. .End(RoutineStep.End, NullFun, _delay_1s);
  69. return Runner.Status;
  70. }
  71. private bool GotoMap()
  72. {
  73. return _efem.GotoMap(_module, Hand.Blade1);
  74. }
  75. private bool Map()
  76. {
  77. return _efem.Map(_module);
  78. }
  79. private bool Back()
  80. {
  81. return _efem.GotoMap(_module, Hand.Blade1, "RE");
  82. }
  83. private bool RequestMap()
  84. {
  85. return _efem.RequestMapResult(_module);
  86. }
  87. private bool WaitModuleReady()
  88. {
  89. return _efem.Status == RState.End;
  90. }
  91. private bool CheckStepDone()
  92. {
  93. if (_efem.Status == RState.End)
  94. {
  95. return true;
  96. }
  97. else if (_efem.Status == RState.Failed)
  98. {
  99. NotifyError(eEvent.ERR_EFEM_ROBOT, $"Efem robot picking failed: {_efem.Status}", -1);
  100. return true;
  101. }
  102. return false;
  103. }
  104. public void Abort()
  105. {
  106. Runner.Stop("Manual Abort");
  107. }
  108. }
  109. }