FlipperEntity.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Fsm;
  3. using Aitex.Core.Util;
  4. using athosRT.Devices;
  5. using athosRT.Devices.FLP;
  6. using athosRT.FSM;
  7. using athosRT.tool;
  8. using Common.DataCenter;
  9. using Common.OP;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Reflection;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using System.Xml.Linq;
  19. namespace athosRT.Modules.FLP
  20. {
  21. public class FlipperEntity : Entity, IEntity
  22. {
  23. public enum FlipperMSG
  24. {
  25. Home = 1,
  26. TurnOver = 2,
  27. Clamp = 3,
  28. UnClamp = 4,
  29. Error = 5,
  30. Reset = 6,
  31. Abort = 7,
  32. PrepareTransfer = 8,
  33. EndTransfer = 9,
  34. manualTurn =10,
  35. manualTurnStop = 11,
  36. manualClamp = 12,
  37. manualClampStop = 13,
  38. }
  39. private JetFlipper _flipper => DeviceModel.TurnOverStation;
  40. private FlipperHomeRoutine flipperhomeroutine= null;
  41. public bool IsTransfer => fsm.State == (int)FlipperState.TransferState;
  42. public bool IsIdle => fsm.State == (int)FlipperState.Idle;
  43. public ModuleName _modulename;
  44. public FlipperState State => ((FlipperState)fsm.State);
  45. public bool ClampOpen => _flipper == null ? false :_flipper.IsClampOpen;
  46. public bool ClampClose => _flipper == null ? false :_flipper.IsClampClose;
  47. public bool IsFlipperOrigin => _flipper == null ? false : _flipper.IsFlipperOrigin;
  48. public bool IsFlipperHorizontal => _flipper == null ? false : _flipper.IsFlipperHorizontal;//是否在反面
  49. public FlipperEntity(ModuleName name)
  50. {
  51. _modulename = name;
  52. //_flipper = DEVICE.GetDevice<FlipperBase>(_modulename.ToString());
  53. //if(_flipper == null)
  54. // _flipper = DEVICE.GetDevice<FlipperBase>($"System.{_modulename.ToString()}");
  55. flipperhomeroutine = new FlipperHomeRoutine(_modulename,_flipper);
  56. fsm = new StateMachine<FlipperEntity>(_modulename.ToString(), (int)FlipperState.Init, 50);//状态机频率
  57. BuildTransitionTable();
  58. Singleton<WaferManager>.Instance.SubscribeLocation(_modulename,1);
  59. OP.Subscribe($"{_modulename}.{FlipperMSG.TurnOver}", (cmd, args) => { PostMsg(FlipperMSG.TurnOver); return true; });
  60. OP.Subscribe($"{_modulename}.{FlipperMSG.Clamp}", (cmd, args) => { PostMsg(FlipperMSG.Clamp); return true; });
  61. OP.Subscribe($"{_modulename}.{FlipperMSG.UnClamp}", (cmd, args) => { PostMsg(FlipperMSG.UnClamp); return true; });
  62. OP.Subscribe($"{_modulename}.{FlipperMSG.Home}", (cmd, args) => { PostMsg(FlipperMSG.Home); return true; });
  63. OP.Subscribe($"{_modulename}.{FlipperMSG.Abort}", (cmd, args) => { PostMsg(FlipperMSG.Abort); return true; });
  64. OP.Subscribe($"{_modulename}.{FlipperMSG.Reset}", (cmd, args) => { PostMsg(FlipperMSG.Reset); return true; });
  65. OP.Subscribe($"{_modulename}.{FlipperMSG.manualTurn}", (cmd, args) => { PostMsg(FlipperMSG.manualTurn,args); return true; });
  66. OP.Subscribe($"{_modulename}.{FlipperMSG.manualTurnStop}", (cmd, args) => {
  67. PostMsg(FlipperMSG.manualTurnStop,args); return true;
  68. });
  69. DATA.Subscribe($"{_modulename}.Status",()=> ((FlipperState)fsm.State).ToString());
  70. DATA.Subscribe($"{_modulename}.IsFlipperOrigin", () => IsFlipperOrigin);
  71. DATA.Subscribe($"{_modulename}.IsFlipperHorizontal", () => IsFlipperHorizontal);
  72. }
  73. //状态迁移表
  74. private void BuildTransitionTable()
  75. {
  76. AnyStateTransition(FlipperMSG.Home, fStartHome, FlipperState.Homing);
  77. //Home sequence
  78. Transition(FlipperState.Init, FlipperMSG.Home, fStartHome, FlipperState.Homing);
  79. Transition(FlipperState.Idle, FlipperMSG.Home, fStartHome, FlipperState.Homing);
  80. Transition(FlipperState.Homing, FSM_MSG.TIMER, fHomeTimout, FlipperState.Idle);
  81. Transition(FlipperState.Homing, FlipperMSG.Abort, fReset, FlipperState.Idle);
  82. //TurnOver sequence
  83. Transition(FlipperState.Idle, FlipperMSG.TurnOver, fStartTurnOver, FlipperState.Turning);
  84. Transition(FlipperState.Turning, FSM_MSG.TIMER, fTurnOverTimout, FlipperState.Idle);
  85. Transition(FlipperState.Turning, FlipperMSG.Abort, fReset, FlipperState.Idle);
  86. //TurnOver jog sequence
  87. Transition(FlipperState.Idle, FlipperMSG.manualTurn, fStartTurnJog, FlipperState.TurnOverJog);
  88. Transition(FlipperState.TurnOverJog, FSM_MSG.TIMER, fTurnOverJogTimout, FlipperState.TurnOverJog);
  89. Transition(FlipperState.TurnOverJog, FlipperMSG.manualTurnStop, fStartTurnJogStop, FlipperState.Idle);
  90. //Transition(FlipperState.Turning, FlipperMSG.Abort, fReset, FlipperState.Idle);
  91. //Grip sequence
  92. Transition(FlipperState.Idle, FlipperMSG.Clamp, fStartGrip, FlipperState.Gripping);
  93. Transition(FlipperState.Gripping, FSM_MSG.TIMER, fGripTimout, FlipperState.Idle);
  94. Transition(FlipperState.Gripping, FlipperMSG.Abort, fReset, FlipperState.Idle);
  95. //UnGrip sequence
  96. Transition(FlipperState.Idle, FlipperMSG.UnClamp, fStartUnGrip, FlipperState.UnGripping);
  97. Transition(FlipperState.UnGripping, FSM_MSG.TIMER, fUnGripTimout, FlipperState.Idle);
  98. Transition(FlipperState.UnGripping, FlipperMSG.Abort, fReset, FlipperState.Idle);
  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. LogObject.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. LogObject.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. LogObject.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. LogObject.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. LogObject.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. LogObject.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) == RState.Running;
  223. }
  224. private bool fHomeTimout(object[] param)
  225. {
  226. RState state = flipperhomeroutine.Monitor();
  227. if (state == RState.End)
  228. {
  229. return true;
  230. }
  231. if (state == RState.Failed || state == RState.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. }
  255. }