FlipperEntity.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Event;
  3. using Aitex.Core.RT.Fsm;
  4. using Aitex.Core.RT.Log;
  5. using Aitex.Core.RT.OperationCenter;
  6. using Aitex.Core.RT.Routine;
  7. using Aitex.Core.Util;
  8. using EFEM.RT.Devices.Flipper;
  9. using EFEM.RT.Routines.FLP;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. namespace EFEM.RT.Devices
  13. {
  14. public class FlipperEntity : Entity, IEntity
  15. {
  16. public enum FlipperMSG
  17. {
  18. Home = 1,
  19. TurnOver = 2,
  20. Clamp = 3,
  21. UnClamp = 4,
  22. Error = 5,
  23. Reset = 6,
  24. Abort = 7,
  25. PrepareTransfer = 8,
  26. EndTransfer = 9,
  27. manualTurn = 10,
  28. manualTurnStop = 11,
  29. manualClamp = 12,
  30. manualClampStop = 13,
  31. }
  32. private JetFlipper _flipper => DeviceModel.Flipper;
  33. private FlipperHomeRoutine flipperhomeroutine = null;
  34. public bool IsTransfer => fsm.State == (int)FlipperState.TransferState;
  35. public bool IsIdle => fsm.State == (int)FlipperState.Idle;
  36. public ModuleName _modulename;
  37. public FlipperState State => ((FlipperState)fsm.State);
  38. public bool ClampOpen => _flipper == null ? false : _flipper.IsClampOpen;
  39. public bool ClampClose => _flipper == null ? false : _flipper.IsClampClose;
  40. public bool IsFlipperOrigin => _flipper == null ? false : _flipper.IsFlipperOrigin;//是否在0°
  41. public bool IsFlipperHorizontal => _flipper == null ? false : _flipper.IsFlipperHorizontal;//是否在180°
  42. public bool IsFlipperOverOrigin => _flipper == null ? false : _flipper.IsFlipperOverOrigin;//是否反转
  43. public FlipperEntity(ModuleName name)
  44. {
  45. _modulename = name;
  46. flipperhomeroutine = new FlipperHomeRoutine(_modulename, _flipper);
  47. fsm = new StateMachine<FlipperEntity>(_modulename.ToString(), (int)FlipperState.Init, 50);//状态机频率
  48. BuildTransitionTable();
  49. Singleton<WaferManager>.Instance.SubscribeLocation(_modulename, 1);
  50. OP.Subscribe($"{_modulename}.{FlipperMSG.TurnOver}", (cmd, args) => { PostMsg(FlipperMSG.TurnOver); return true; });
  51. OP.Subscribe($"{_modulename}.{FlipperMSG.Clamp}", (cmd, args) => { PostMsg(FlipperMSG.Clamp); return true; });
  52. OP.Subscribe($"{_modulename}.{FlipperMSG.UnClamp}", (cmd, args) => { PostMsg(FlipperMSG.UnClamp); return true; });
  53. OP.Subscribe($"{_modulename}.{FlipperMSG.Home}", (cmd, args) =>
  54. {
  55. CheckToPostMsg(FlipperMSG.Home);
  56. return true;
  57. });
  58. OP.Subscribe($"{_modulename}.{FlipperMSG.Abort}", (cmd, args) => { PostMsg(FlipperMSG.Abort); return true; });
  59. OP.Subscribe($"{_modulename}.{FlipperMSG.Reset}", (cmd, args) => { PostMsg(FlipperMSG.Reset); return true; });
  60. OP.Subscribe($"{_modulename}.{FlipperMSG.manualTurn}", (cmd, args) => { PostMsg(FlipperMSG.manualTurn, args); return true; });
  61. OP.Subscribe($"{_modulename}.{FlipperMSG.manualTurnStop}", (cmd, args) =>
  62. {
  63. PostMsg(FlipperMSG.manualTurnStop, args); return true;
  64. });
  65. DATA.Subscribe($"{_modulename}.Status", () => ((FlipperState)fsm.State).ToString());
  66. DATA.Subscribe($"{_modulename}.IsFlipperOrigin", () => IsFlipperOrigin);
  67. DATA.Subscribe($"{_modulename}.IsFlipperHorizontal", () => IsFlipperHorizontal);
  68. DATA.Subscribe($"{_modulename}.IsFlipperOverOrigin", () => IsFlipperOverOrigin);
  69. DATA.Subscribe($"{_modulename}.ClampOpen", () => ClampOpen);
  70. DATA.Subscribe($"{_modulename}.ClampClose", () => ClampClose);
  71. }
  72. //状态迁移表
  73. private void BuildTransitionTable()
  74. {
  75. AnyStateTransition(FlipperMSG.Home, fStartHome, FlipperState.Homing);
  76. //Home sequence
  77. Transition(FlipperState.Init, FlipperMSG.Home, fStartHome, FlipperState.Homing);
  78. Transition(FlipperState.Idle, FlipperMSG.Home, fStartHome, FlipperState.Homing);
  79. Transition(FlipperState.Homing, FSM_MSG.TIMER, fHomeTimout, FlipperState.Idle);
  80. Transition(FlipperState.Homing, FlipperMSG.Abort, fReset, FlipperState.Idle);
  81. //TurnOver sequence
  82. Transition(FlipperState.Idle, FlipperMSG.TurnOver, fStartTurnOver, FlipperState.Turning);
  83. Transition(FlipperState.Turning, FSM_MSG.TIMER, fTurnOverTimout, FlipperState.Idle);
  84. Transition(FlipperState.Turning, FlipperMSG.Abort, fReset, FlipperState.Idle);
  85. //TurnOver Jog sequence
  86. Transition(FlipperState.Idle, FlipperMSG.manualTurn, fStartTurnJog, FlipperState.TurnOverJog);
  87. Transition(FlipperState.TurnOverJog, FSM_MSG.TIMER, fTurnOverJogTimout, FlipperState.TurnOverJog);
  88. Transition(FlipperState.TurnOverJog, FlipperMSG.manualTurnStop, fStartTurnJogStop, FlipperState.Idle);
  89. //Transition(FlipperState.Turning, FlipperMSG.Abort, fReset, FlipperState.Idle);
  90. //Grip sequence
  91. Transition(FlipperState.Idle, FlipperMSG.Clamp, fStartGrip, FlipperState.Gripping);
  92. Transition(FlipperState.Gripping, FSM_MSG.TIMER, fGripTimout, FlipperState.Idle);
  93. Transition(FlipperState.Gripping, FlipperMSG.Abort, fReset, FlipperState.Idle);
  94. //UnGrip sequence
  95. Transition(FlipperState.Idle, FlipperMSG.UnClamp, fStartUnGrip, FlipperState.UnGripping);
  96. Transition(FlipperState.UnGripping, FSM_MSG.TIMER, fUnGripTimout, FlipperState.Idle);
  97. Transition(FlipperState.UnGripping, FlipperMSG.Abort, fReset, FlipperState.Idle);
  98. //Transfer
  99. Transition(FlipperState.Idle, FlipperMSG.PrepareTransfer, fStartUnGrip, FlipperState.StartTransfer);
  100. Transition(FlipperState.StartTransfer, FSM_MSG.TIMER, fUnGripTimout, FlipperState.TransferState);
  101. Transition(FlipperState.TransferState, FlipperMSG.EndTransfer, fStartGrip, FlipperState.EndTransfer);
  102. Transition(FlipperState.EndTransfer, FSM_MSG.TIMER, fGripTimout, FlipperState.Idle);
  103. //Reset
  104. Transition(FlipperState.Error, FlipperMSG.Reset, fReset, FlipperState.Idle);
  105. Transition(FlipperState.Idle, FlipperMSG.Reset, fReset, FlipperState.Idle);
  106. Running = true;
  107. }
  108. private bool fStartGrip(object[] param)
  109. {
  110. LOG.Info($"{_modulename.ToString()} start Grip!");
  111. if (!_flipper.IsBusy)
  112. {
  113. return _flipper.Clamp(true);
  114. }
  115. else
  116. {
  117. // LogObject.Error(_modulename.ToString(), "is busy!");
  118. return false;
  119. }
  120. }
  121. private bool fStartUnGrip(object[] param)
  122. {
  123. LOG.Info($"{_modulename.ToString()} start UnGrip!");
  124. if (!_flipper.IsBusy)
  125. {
  126. return _flipper.Clamp(false);
  127. }
  128. else
  129. {
  130. //LogObject.Error(_modulename.ToString(), "is busy!");
  131. return false;
  132. }
  133. }
  134. private bool fGripTimout(object[] param)
  135. {
  136. //LogObject.Info(_modulename.ToString(), "Gripping!");
  137. _flipper.Monitor();
  138. switch (_flipper.State)
  139. {
  140. case FlipperState.Gripping:
  141. return false;
  142. case FlipperState.Idle:
  143. return true;
  144. default:
  145. PostMsg(FlipperMSG.Error);
  146. return true;
  147. }
  148. }
  149. private bool fUnGripTimout(object[] param)
  150. {
  151. //LogObject.Info(_modulename.ToString(), "UnGripping!");
  152. _flipper.Monitor();
  153. switch (_flipper.State)
  154. {
  155. case FlipperState.UnGripping:
  156. return false;
  157. case FlipperState.Idle:
  158. return true;
  159. default:
  160. PostMsg(FlipperMSG.Error);
  161. return true;
  162. }
  163. }
  164. private bool fStartTurnJog(object[] param)
  165. {
  166. LOG.Info($"{_modulename.ToString()} fStartTurnJog----" + param[0].ToString());
  167. string NorP = param[0].ToString();
  168. if (!_flipper.IsBusy)
  169. {
  170. return _flipper.TrunOverJog(NorP);
  171. }
  172. else
  173. {
  174. LOG.Info($"{_modulename.ToString()} is busy!");
  175. return false;
  176. }
  177. }
  178. private bool fStartTurnJogStop(object[] param)
  179. {
  180. string NorP = param[0].ToString();
  181. return _flipper.TrunOverJogStop(NorP);
  182. }
  183. private bool fStartTurnOver(object[] param)
  184. {
  185. LOG.Info($"{_modulename.ToString()} Start TurnOver!");
  186. if (!_flipper.IsBusy)
  187. {
  188. return _flipper.TurnOver();
  189. }
  190. else
  191. {
  192. //LogObject.Error(_modulename.ToString(), "is busy!");
  193. return false;
  194. }
  195. }
  196. private bool fTurnOverTimout(object[] param)
  197. {
  198. //LogObject.Info(_modulename.ToString(), "Turnning Over!");
  199. _flipper.Monitor();
  200. switch (_flipper.State)
  201. {
  202. case FlipperState.Turning:
  203. case FlipperState.Homing:
  204. return false;
  205. case FlipperState.Idle:
  206. LOG.Info($"{_modulename.ToString()} 已完成旋转");
  207. if (Singleton<WaferManager>.Instance.CheckHasWafer(_modulename, 0))
  208. Singleton<WaferManager>.Instance.GetWafer(_modulename, 0).IsChecked = true;
  209. return true;
  210. default:
  211. PostMsg(FlipperMSG.Error);
  212. return true;
  213. }
  214. }
  215. private bool fTurnOverJogTimout(object[] param)
  216. {
  217. _flipper.Monitor();
  218. return true;
  219. }
  220. private bool fStartHome(object[] param)
  221. {
  222. return flipperhomeroutine.Start(param) == Result.RUN;
  223. }
  224. private bool fHomeTimout(object[] param)
  225. {
  226. Result state = flipperhomeroutine.Monitor();
  227. if (state == Result.DONE)
  228. {
  229. return true;
  230. }
  231. if (state == Result.FAIL || state == Result.TIMEOUT)
  232. {
  233. PostMsg(FlipperMSG.Error);
  234. return true;
  235. }
  236. return false;
  237. }
  238. private bool fReset(object[] param)
  239. {
  240. _flipper.Reset();
  241. return _flipper.State == FlipperState.Idle;
  242. }
  243. public bool Check(int msg, out string reason, params object[] args)
  244. {
  245. if (!fsm.FindTransition(fsm.State, msg))
  246. {
  247. reason = string.Format("{0} is in {1} state,can not do {2}", (object)_modulename, (object)(FlipperState)fsm.State, (object)(FlipperMSG)msg);
  248. return false;
  249. }
  250. reason = "";
  251. PostMsg(msg);
  252. return true;
  253. }
  254. public bool CheckToPostMsg(FlipperMSG msg)
  255. {
  256. if (!fsm.FindTransition(fsm.State, (int)msg))
  257. {
  258. EV.PostMessage("System", EventEnum.DefaultWarning,
  259. string.Format("{0} is in {1} state,can not do {2}", _modulename.ToString(), (FlipperState)fsm.State, (FlipperMSG)msg));
  260. return false;
  261. }
  262. PostMsg(msg);
  263. return true;
  264. }
  265. }
  266. }