SchedulerLoadPort.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.Fsm;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.SCCore;
  5. using Aitex.Core.Util;
  6. using Aitex.Sorter.Common;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.Schedulers;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using FurnaceRT.Equipments.PMs;
  11. using FurnaceRT.Equipments.FIMSs;
  12. using FurnaceRT.Equipments.Systems;
  13. using FurnaceRT.Equipments.LPs;
  14. using System.Linq;
  15. namespace FurnaceRT.Equipments.Schedulers
  16. {
  17. public class SchedulerLoadPort : SchedulerModule
  18. {
  19. public override bool IsAvailable
  20. {
  21. get { return _lp.IsReady && _lp.IsOnline && CheckTaskDone(); }
  22. }
  23. public override bool IsOnline
  24. {
  25. get { return _lp.IsOnline; }
  26. }
  27. public override bool IsError
  28. {
  29. get { return _lp.IsError; }
  30. }
  31. private LoadPortModule _lp = null;
  32. private ModuleName _taskRobot;
  33. private EnumTransferType _taskTransferType;
  34. private int _taskSlot;
  35. private DeviceTimer _timer = new DeviceTimer();
  36. public SchedulerLoadPort(ModuleName chamber) : base(chamber.ToString())
  37. {
  38. _lp = Singleton<EquipmentManager>.Instance.Modules.FirstOrDefault(x=>x.Key == chamber).Value as LoadPortModule;
  39. }
  40. public override bool IsReadyForPick(ModuleName robot, int slot)
  41. {
  42. return _lp.CheckReadyForTransfer(robot, Hand.Blade1, slot, EnumTransferType.Pick, out _);
  43. }
  44. public override bool IsReadyForPlace(ModuleName robot, int slot)
  45. {
  46. return _lp.CheckReadyForTransfer(robot, Hand.Blade1, slot, EnumTransferType.Place, out _)
  47. && CarrierManager.Instance.CheckNoCarrier(ModuleHelper.Converter(_module), 0);
  48. }
  49. public override bool PrepareTransfer(ModuleName robot, EnumTransferType type, int slot)
  50. {
  51. _task = TaskType.PrepareTransfer;
  52. _taskRobot = robot;
  53. _taskSlot = slot;
  54. _taskTransferType = type;
  55. if (!_lp.PrepareTransfer(robot, Hand.Blade1, slot, type, out string reason))
  56. {
  57. LOG.Write(reason);
  58. return false;
  59. }
  60. LogTaskStart(_task, $"{robot} {type} slot {slot + 1}");
  61. return true;
  62. }
  63. public bool Load()
  64. {
  65. _task = TaskType.Load;
  66. _lp.InvokeLoad();
  67. LogTaskStart(_task, $"{Module} load start");
  68. return true;
  69. }
  70. public bool Unload()
  71. {
  72. _task = TaskType.Unload;
  73. _lp.InvokeUnload();
  74. LogTaskStart(_task, $"{Module} unload start");
  75. return true;
  76. }
  77. public bool CheckTaskDone()
  78. {
  79. bool ret = false;
  80. switch (_task)
  81. {
  82. case TaskType.None:
  83. ret = true;
  84. break;
  85. case TaskType.PrepareTransfer:
  86. ret = _lp.CheckReadyForTransfer(_taskRobot, Hand.Blade1, _taskSlot, _taskTransferType, out _);
  87. break;
  88. case TaskType.Load:
  89. ret = _lp.LPDevice.IsLoadCompleted;
  90. break;
  91. case TaskType.Unload:
  92. ret = _lp.LPDevice.IsUnloadCompleted;
  93. break;
  94. }
  95. if (ret && _task != TaskType.None)
  96. {
  97. LogTaskDone(_task, "");
  98. _task = TaskType.None;
  99. }
  100. return ret;
  101. }
  102. public bool Monitor()
  103. {
  104. return true;
  105. }
  106. }
  107. }