PUFEntity.cs 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  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.Utilities;
  8. using MECF.Framework.Common.Equipment;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using MECF.Framework.Common.Utilities;
  11. using CyberX8_Core;
  12. using CyberX8_RT.Devices.AXIS;
  13. using CyberX8_RT.Devices.PUF;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. using System.Windows.Interop;
  20. using MECF.Framework.Common.CommonData;
  21. using MECF.Framework.Common.Alarm;
  22. using Aitex.Core.Util;
  23. using MECF.Framework.Common.WaferHolder;
  24. namespace CyberX8_RT.Modules.PUF
  25. {
  26. public class PUFEntity : Entity, IEntity, IModuleEntity
  27. {
  28. #region 常量
  29. #endregion
  30. #region 属性
  31. public bool IsInRobotStation
  32. {
  33. get { return CheckPufRotationInRobot(); }
  34. }
  35. public ModuleName Module { get; private set; }
  36. public bool IsInit
  37. {
  38. get { return fsm.State == (int)PUFSTATE.Init; }
  39. }
  40. public bool IsIdle
  41. {
  42. get
  43. {
  44. return fsm.State == (int)PUFSTATE.Idle;
  45. }
  46. }
  47. public bool IsError
  48. {
  49. get { return fsm.State == (int)PUFSTATE.Error; }
  50. }
  51. public bool IsBusy
  52. {
  53. get { return !IsInit && !IsError && !IsIdle; }
  54. }
  55. public bool IsAuto { get; } = true;
  56. /// <summary>
  57. /// 是否为工程模式
  58. /// </summary>
  59. public bool IsEngineering { get; } = false;
  60. /// <summary>
  61. /// 是否为产品模式
  62. /// </summary>
  63. public bool IsProduction { get; } = true;
  64. /// <summary>
  65. /// SideA Wafer情况
  66. /// </summary>
  67. public bool SideAWaferPresent
  68. {
  69. get { return _pufVacuum.ChuckAWaferPresent; }
  70. }
  71. /// <summary>
  72. /// SideB Wafer情况
  73. /// </summary>
  74. public bool SideBWaferPresent
  75. {
  76. get { return _pufVacuum.ChuckBWaferPresent; }
  77. }
  78. public bool IsHomed
  79. {
  80. get { return _isHomed; }
  81. }
  82. /// <summary>
  83. /// 是否禁用
  84. /// </summary>
  85. public bool IsDisable { get; internal set; }
  86. /// <summary>
  87. /// Rotation是否SwitchOn
  88. /// </summary>
  89. public bool IsRotationSwitchOn
  90. {
  91. get { return _rotationAxis.IsSwitchOn; }
  92. }
  93. /// <summary>
  94. /// Flip是否SwitchOn
  95. /// </summary>
  96. public bool IsFlipSwitchOn
  97. {
  98. get { return _flipAxis.IsSwitchOn; }
  99. }
  100. /// <summary>
  101. /// 当前状态机状态
  102. /// </summary>
  103. public int State { get { return fsm.State; } }
  104. /// <summary>
  105. /// 是否回到安全位置
  106. /// </summary>
  107. public bool IsBackToParkStation
  108. {
  109. get
  110. {
  111. double flipPosition = _flipAxis.MotionData.MotorPosition;
  112. double rotationPosition = _rotationAxis.MotionData.MotorPosition;
  113. return (_flipAxis.CheckPositionIsInStation(flipPosition, "SideA")||Module==ModuleName.PUF2)
  114. && _rotationAxis.CheckPositionIsInStation(rotationPosition, "Home") &&
  115. _pufVacuum.CheckChuckIn();
  116. }
  117. }
  118. /// <summary>
  119. /// 是否Flip到达sideA
  120. /// </summary>
  121. public bool IsFlipSideA
  122. {
  123. get { return _flipAxis.CheckPositionIsInStation(_flipAxis.MotionData.MotorPosition, "SideA"); }
  124. }
  125. /// <summary>
  126. /// Vacuum状态
  127. /// </summary>
  128. public PufVacuum PufVacuum { get { return _pufVacuum; } }
  129. #endregion
  130. #region 内部变量
  131. private bool _isHomed;
  132. private JetAxisBase _flipAxis;
  133. private JetAxisBase _rotationAxis;
  134. private PufVacuum _pufVacuum;
  135. private IRoutine _currentRoutine;
  136. #endregion
  137. #region routine
  138. private PufHomeAllRoutine _homeAllRoutine;
  139. private PufSwitchOnRoutine _switchOnRoutine;
  140. private PufSwitchOffRoutine _switchOffRoutine;
  141. private PufCalibrateRoutine _calibrateRoutine;
  142. private PufPickFromLoaderRoutine _pickFromLoaderRoutine;
  143. private PufPlaceToLoaderRoutine _placeToLoaderRoutine;
  144. private PufGotoRobotForPlaceRoutine _gotoRobotForPlaceRoutine;
  145. private PufGotoRobotForPickRoutine _gotoRobotForPickRoutine;
  146. private PufReadyForRobotPlaceRoutine _readyForRobotPlaceRoutine;
  147. private PufReadyForSwapRoutine _readyForSwapRoutine;
  148. private PufSwapRoutine _swapRoutine;
  149. private PufReadyForRobotPickRoutine _readyForRobotPickRoutine;
  150. private PufBackToParkRoutine _backToParkRoutine;
  151. #endregion
  152. /// <summary>
  153. /// 构造函数
  154. /// </summary>
  155. /// <param name="module"></param>
  156. public PUFEntity(ModuleName module)
  157. {
  158. this.Module = module;
  159. _flipAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Flip");
  160. _rotationAxis=DEVICE.GetDevice<JetAxisBase>($"{module}.Rotation");
  161. _pufVacuum = DEVICE.GetDevice<PufVacuum>($"{module}.Vacuum");
  162. _pufVacuum.OnVacuumLeak += PufVacuum_OnVacuumLeak;
  163. WaferManager.Instance.SubscribeLocation(Module, 2);
  164. InitialFsm();
  165. InitializeRoutine();
  166. }
  167. /// <summary>
  168. /// Vacuum Leak 异常
  169. /// </summary>
  170. /// <param name="sender"></param>
  171. /// <param name="e"></param>
  172. private void PufVacuum_OnVacuumLeak(object sender, string e)
  173. {
  174. PostMsg((int)PUFMSG.Error);
  175. }
  176. protected override bool Init()
  177. {
  178. InitialOperation();
  179. InitialDATA();
  180. return true;
  181. }
  182. private void InitialDATA()
  183. {
  184. DATA.Subscribe($"{Module}.FsmState", () => ((PUFSTATE)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  185. DATA.Subscribe($"{Module}.IsHomed", () => _isHomed,SubscriptionAttribute.FLAG.IgnoreSaveDB);
  186. DATA.Subscribe($"{Module}.IsError", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  187. DATA.Subscribe($"{Module}.IsInRobotStation", () => IsInRobotStation, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  188. DATA.Subscribe($"{Module}.State", () => ((PUFSTATE)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  189. }
  190. /// <summary>
  191. /// 初始化操作
  192. /// </summary>
  193. private void InitialOperation()
  194. {
  195. OP.Subscribe($"{Module}.Abort", (cmd, args) => { return CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.Abort); });
  196. OP.Subscribe($"{Module}.ClearError", (cmd, args) => { return CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.ResumeError); });
  197. OP.Subscribe($"{Module}.{MotionOperation.HomeAll}", (cmd, args) => { return CheckToPostMessage<PUFSTATE,PUFMSG>(eEvent.ERR_PUF,Module.ToString(),(int)PUFMSG.HomeAll);});
  198. OP.Subscribe($"{Module}.{MotionOperation.SwitchOff}", (cmd, args) => { return CheckToPostMessage<PUFSTATE,PUFMSG>(eEvent.ERR_PUF,Module.ToString(),(int)PUFMSG.SwitchOff); });
  199. OP.Subscribe($"{Module}.{MotionOperation.SwitchOn}", (cmd, args) => { return CheckToPostMessage<PUFSTATE,PUFMSG>(eEvent.ERR_PUF,Module.ToString(),(int)PUFMSG.SwitchOn); });
  200. OP.Subscribe($"{Module}.{MotionOperation.Calibrate}", (cmd, args) => { return CheckToPostMessage<PUFSTATE,PUFMSG>(eEvent.ERR_PUF,Module.ToString(),(int)PUFMSG.Calibrate, args);});
  201. OP.Subscribe($"{Module}.{MotionOperation.Pick}", (cmd, args) => { return CheckToPostMessage<PUFSTATE,PUFMSG>(eEvent.ERR_PUF,Module.ToString(),(int)PUFMSG.PickFromLoader, args); });
  202. OP.Subscribe($"{Module}.{MotionOperation.Place}", (cmd, args) => { return CheckToPostMessage<PUFSTATE,PUFMSG>(eEvent.ERR_PUF,Module.ToString(),(int)PUFMSG.PlaceToLoader, args); });
  203. OP.Subscribe($"{Module}.GotoRobotPositionForPlace", (cmd, args) => { return CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.GotoRobotPositionForPlace, args); });
  204. OP.Subscribe($"{Module}.GotoRobotPositionForPick", (cmd, args) => { return CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.GotoRobotPositionForPick, args); });
  205. }
  206. /// <summary>
  207. /// 初始化Routine
  208. /// </summary>
  209. private void InitializeRoutine()
  210. {
  211. _homeAllRoutine = new PufHomeAllRoutine(Module,this);
  212. _switchOnRoutine = new PufSwitchOnRoutine(Module);
  213. _switchOffRoutine= new PufSwitchOffRoutine(Module);
  214. _calibrateRoutine = new PufCalibrateRoutine(Module);
  215. _pickFromLoaderRoutine = new PufPickFromLoaderRoutine(Module.ToString());
  216. _placeToLoaderRoutine=new PufPlaceToLoaderRoutine(Module.ToString());
  217. _gotoRobotForPlaceRoutine = new PufGotoRobotForPlaceRoutine(Module.ToString());
  218. _gotoRobotForPickRoutine=new PufGotoRobotForPickRoutine(Module.ToString());
  219. _readyForRobotPlaceRoutine=new PufReadyForRobotPlaceRoutine(Module.ToString());
  220. _readyForSwapRoutine=new PufReadyForSwapRoutine(Module.ToString());
  221. _swapRoutine=new PufSwapRoutine(Module.ToString());
  222. _readyForRobotPickRoutine=new PufReadyForRobotPickRoutine(Module.ToString());
  223. _backToParkRoutine=new PufBackToParkRoutine(Module.ToString());
  224. }
  225. /// <summary>
  226. /// 检验所有电机是否已经完成Home
  227. /// </summary>
  228. /// <returns></returns>
  229. private bool CheckAllAxisIsHomed()
  230. {
  231. bool flipIsHomed = _flipAxis.CheckAxisIsAreadyHomed();
  232. if (!flipIsHomed)
  233. {
  234. return false;
  235. }
  236. bool rotationIsHomed = _rotationAxis.CheckAxisIsAreadyHomed();
  237. if (!rotationIsHomed)
  238. {
  239. return false;
  240. }
  241. bool chuckIn = _pufVacuum.CheckChuckIn();
  242. if (!chuckIn)
  243. {
  244. return false;
  245. }
  246. return true;
  247. }
  248. /// <summary>
  249. /// 检验所有电机的位置
  250. /// </summary>
  251. /// <returns></returns>
  252. private bool CheckAllAxisStation()
  253. {
  254. bool flipSideA = _flipAxis.CheckPositionIsInStation(_flipAxis.MotionData.MotorPosition, "SideA");
  255. if (!flipSideA)
  256. {
  257. return false;
  258. }
  259. bool rotationPark = _rotationAxis.CheckPositionIsInStation(_rotationAxis.MotionData.MotorPosition, "Home");
  260. if (!rotationPark)
  261. {
  262. return false;
  263. }
  264. return true;
  265. }
  266. /// <summary>
  267. /// 初始化状态机
  268. /// </summary>
  269. private void InitialFsm()
  270. {
  271. if (CheckAllAxisIsHomed() && CheckAllAxisStation())
  272. {
  273. _isHomed = true;
  274. fsm = new StateMachine<PUFEntity>(Module.ToString(), (int)PUFSTATE.Idle, 20);
  275. }
  276. else
  277. {
  278. fsm = new StateMachine<PUFEntity>(Module.ToString(), (int)PUFSTATE.Init, 20);
  279. }
  280. fsm.EnableRepeatedMsg(true);
  281. AnyStateTransition(PUFMSG.Error, EnterError, PUFSTATE.Error);
  282. AnyStateTransition(PUFMSG.ReturnIdle, (param) => { return true; }, PUFSTATE.Idle);
  283. AnyStateTransition(PUFMSG.Abort, Abort, PUFSTATE.Init);
  284. AnyStateTransition(PUFMSG.HomeAll, HomeAll, PUFSTATE.Homing);
  285. Transition(PUFSTATE.Error, PUFMSG.ResumeError, ResumeError, PUFSTATE.Init);
  286. //SwitchOn
  287. Transition(PUFSTATE.Init, PUFMSG.SwitchOn, SwitchOnAll, PUFSTATE.SwitchOning);
  288. Transition(PUFSTATE.Idle, PUFMSG.SwitchOn, SwitchOnAll, PUFSTATE.SwitchOning);
  289. Transition(PUFSTATE.Error, PUFMSG.SwitchOn, SwitchOnAll, PUFSTATE.SwitchOning);
  290. Transition(PUFSTATE.SwitchOning, FSM_MSG.TIMER, SwitchOnTimeout, PUFSTATE.Init);
  291. //SwitchOff
  292. Transition(PUFSTATE.Init, PUFMSG.SwitchOff, SwitchOffAll, PUFSTATE.SwitchOffing);
  293. Transition(PUFSTATE.Idle, PUFMSG.SwitchOff, SwitchOffAll, PUFSTATE.SwitchOffing);
  294. Transition(PUFSTATE.Error, PUFMSG.SwitchOff, SwitchOffAll, PUFSTATE.SwitchOffing);
  295. Transition(PUFSTATE.SwitchOffing, FSM_MSG.TIMER, SwitchOffTimeout, PUFSTATE.Init);
  296. // Home
  297. Transition(PUFSTATE.Homing, FSM_MSG.TIMER, HomingTimeout, PUFSTATE.Idle);
  298. //Calibrate
  299. Transition(PUFSTATE.Idle, PUFMSG.Calibrate, Calibrate, PUFSTATE.Calibrating);
  300. Transition(PUFSTATE.Calibrating, FSM_MSG.TIMER, CalibrateTimeout, PUFSTATE.Idle);
  301. //PickFromLoader
  302. Transition(PUFSTATE.Idle, PUFMSG.PickFromLoader, PickFromLoader, PUFSTATE.Picking);
  303. Transition(PUFSTATE.Picking, FSM_MSG.TIMER, PickTimeout, PUFSTATE.Idle);
  304. //PlaceToLoader
  305. Transition(PUFSTATE.Idle, PUFMSG.PlaceToLoader, PlaceToLoader, PUFSTATE.Placing);
  306. Transition(PUFSTATE.Placing, FSM_MSG.TIMER, PlaceToLoaderMonitor, PUFSTATE.Idle);
  307. //GotoRobotPositionForPlace
  308. Transition(PUFSTATE.Idle, PUFMSG.GotoRobotPositionForPlace, GotoRobotPositionForPlace, PUFSTATE.GotoRobotPositionForPlace);
  309. Transition(PUFSTATE.GotoRobotPositionForPlace, FSM_MSG.TIMER, GotoRobotPositionForPlaceMonitor, PUFSTATE.Idle);
  310. //GotoRobotPositionForPick
  311. Transition(PUFSTATE.Idle, PUFMSG.GotoRobotPositionForPick, GotoRobotPositionForPick, PUFSTATE.GotoRobotPositionForPick);
  312. Transition(PUFSTATE.GotoRobotPositionForPick, FSM_MSG.TIMER, GotoRobotPositionForPickMonitor, PUFSTATE.Idle);
  313. //ready for robot place
  314. Transition(PUFSTATE.Idle, PUFMSG.ReadyForRobotPlace, ReadyForRobotPlace, PUFSTATE.WaitForRobotPlacing);
  315. Transition(PUFSTATE.WaitForRobotPlacing, FSM_MSG.TIMER, ReadyForRobotPlaceMonitor, PUFSTATE.WaitForRobotPlace);
  316. Transition(PUFSTATE.WaitForRobotPlace, PUFMSG.ReadyForSwap, ReadyForSwap, PUFSTATE.WaitForSwaping);
  317. Transition(PUFSTATE.WaitForSwaping, FSM_MSG.TIMER, ReadyForSwapMonitor, PUFSTATE.WaitForSwap);
  318. Transition(PUFSTATE.WaitForSwap, PUFMSG.Swap, Swap, PUFSTATE.Swaping);
  319. Transition(PUFSTATE.Swaping, FSM_MSG.TIMER, SwapMonitor, PUFSTATE.AferSwapParkStation);
  320. Transition(PUFSTATE.AferSwapParkStation, PUFMSG.ReadyForRobotPick, ReadyForRobotPick, PUFSTATE.WaitForRobotPicking);
  321. Transition(PUFSTATE.WaitForRobotPicking, FSM_MSG.TIMER, ReadyForRobotPickMonitor, PUFSTATE.WaitForRobotPick);
  322. Transition(PUFSTATE.WaitForRobotPick, PUFMSG.RobotPickComplete, BackToParkStation, PUFSTATE.BackToPackStationing);
  323. Transition(PUFSTATE.BackToPackStationing, FSM_MSG.TIMER, BackToParkStationMonitor, PUFSTATE.Idle);
  324. Transition(PUFSTATE.Idle, PUFMSG.FlipSideA, FlipSideA, PUFSTATE.Fliping);
  325. Transition(PUFSTATE.Fliping,FSM_MSG.TIMER,FlipSideAMonitor,PUFSTATE.Idle);
  326. //Retry
  327. Transition(PUFSTATE.Error, PUFMSG.Retry, NullFunc, PUFSTATE.Retrying);
  328. Transition(PUFSTATE.Retrying, FSM_MSG.TIMER, PufRetry,PUFSTATE.Retrying);
  329. Transition(PUFSTATE.Retrying, PUFMSG.ReadyForRobotPlace, RetryReadyForRobotPlace, PUFSTATE.WaitForRobotPlacing);
  330. Transition(PUFSTATE.Retrying, PUFMSG.ReadyForSwap, RetryReadyForSwap, PUFSTATE.WaitForSwaping);
  331. Transition(PUFSTATE.Retrying, PUFMSG.Swap, RetrySwap, PUFSTATE.Swaping);
  332. Transition(PUFSTATE.Retrying, PUFMSG.ReadyForRobotPick, RetryReadyForRobotPick, PUFSTATE.WaitForRobotPicking);
  333. Transition(PUFSTATE.Retrying, PUFMSG.RobotPickComplete, RetryBackToParkStation, PUFSTATE.BackToPackStationing);
  334. //ConfirmComplete
  335. Transition(PUFSTATE.Error, PUFMSG.ConfirmComplete, NullFunc, PUFSTATE.ConfirmCompleting);
  336. Transition(PUFSTATE.Init, PUFMSG.ConfirmComplete, ClearModuleAlarm, PUFSTATE.Init);
  337. Transition(PUFSTATE.Idle, PUFMSG.ConfirmComplete, ClearModuleAlarm, PUFSTATE.Idle);
  338. Transition(PUFSTATE.ConfirmCompleting, FSM_MSG.TIMER, ConfirmComplete, PUFSTATE.ConfirmCompleting);
  339. Transition(PUFSTATE.ConfirmCompleting, PUFMSG.ReadyForRobotPlace, ConfirmReadyForRobotPlace, PUFSTATE.WaitForRobotPlace);
  340. Transition(PUFSTATE.ConfirmCompleting, PUFMSG.ReadyForSwap, ConfirmReadyForSwap, PUFSTATE.WaitForSwap);
  341. Transition(PUFSTATE.ConfirmCompleting, PUFMSG.Swap, ConfirmSwap, PUFSTATE.AferSwapParkStation);
  342. Transition(PUFSTATE.ConfirmCompleting, PUFMSG.ReadyForRobotPick, ConfirmReadyForRobotPick, PUFSTATE.WaitForRobotPick);
  343. Transition(PUFSTATE.ConfirmCompleting, PUFMSG.RobotPickComplete, ConfirmBackToParkStation, PUFSTATE.Idle);
  344. EnumLoop<PUFSTATE>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
  345. EnumLoop<PUFMSG>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
  346. }
  347. private bool EnterError(object[] param)
  348. {
  349. return true;
  350. }
  351. /// <summary>
  352. /// 恢复错误
  353. /// </summary>
  354. /// <param name="param"></param>
  355. /// <returns></returns>
  356. private bool ResumeError(object[] param)
  357. {
  358. if (_isHomed)
  359. {
  360. PostMsg(PUFMSG.ReturnIdle);
  361. return false;
  362. }
  363. return true;
  364. }
  365. #region Abort
  366. private bool Abort(object parameter)
  367. {
  368. bool preHomed = IsHomed;
  369. if(_flipAxis != null) _flipAxis.StopPositionOperation();
  370. if(_rotationAxis != null) _rotationAxis.StopPositionOperation();
  371. if(_currentRoutine!=null)
  372. {
  373. _currentRoutine.Abort();
  374. _currentRoutine = null;
  375. }
  376. if (preHomed)
  377. {
  378. PostMsg(PUFMSG.ReturnIdle);
  379. return false;
  380. }
  381. return true;
  382. }
  383. #endregion
  384. #region Switch On
  385. /// <summary>
  386. /// SwitchAll
  387. /// </summary>
  388. /// <param name="param"></param>
  389. /// <returns></returns>
  390. private bool SwitchOnAll(object[] param)
  391. {
  392. return _switchOnRoutine.Start() == RState.Running;
  393. }
  394. private bool SwitchOnTimeout(object[] param)
  395. {
  396. RState ret = _switchOnRoutine.Monitor();
  397. if (ret == RState.Failed || ret == RState.Timeout)
  398. {
  399. PostMsg(PUFMSG.Error);
  400. return false;
  401. }
  402. bool result= ret == RState.End;
  403. if(result)
  404. {
  405. _isHomed = false;
  406. }
  407. return result;
  408. }
  409. #endregion
  410. #region Switch Off
  411. /// <summary>
  412. /// SwitchAll
  413. /// </summary>
  414. /// <param name="param"></param>
  415. /// <returns></returns>
  416. private bool SwitchOffAll(object[] param)
  417. {
  418. return _switchOffRoutine.Start() == RState.Running;
  419. }
  420. private bool SwitchOffTimeout(object[] param)
  421. {
  422. RState ret = _switchOffRoutine.Monitor();
  423. if (ret == RState.Failed || ret == RState.Timeout)
  424. {
  425. PostMsg(PUFMSG.Error);
  426. return false;
  427. }
  428. bool result= ret == RState.End;
  429. if(result)
  430. {
  431. _isHomed= false;
  432. }
  433. return result;
  434. }
  435. #endregion
  436. #region Home
  437. /// <summary>
  438. /// HomeAll
  439. /// </summary>
  440. /// <param name="param"></param>
  441. /// <returns></returns>
  442. private bool HomeAll(object[] param)
  443. {
  444. _isHomed = false;
  445. bool result= _homeAllRoutine.Start() == RState.Running;
  446. if(result)
  447. {
  448. _currentRoutine = _homeAllRoutine;
  449. }
  450. return result;
  451. }
  452. /// <summary>
  453. /// Home超时
  454. /// </summary>
  455. /// <param name="param"></param>
  456. /// <returns></returns>
  457. private bool HomingTimeout(object[] param)
  458. {
  459. RState ret = _homeAllRoutine.Monitor();
  460. if (ret == RState.Failed || ret == RState.Timeout)
  461. {
  462. _currentRoutine = null;
  463. PostMsg(PUFMSG.Error);
  464. _isHomed = false;
  465. return false;
  466. }
  467. bool result = ret == RState.End;
  468. if (result)
  469. {
  470. _currentRoutine = null;
  471. _isHomed = true;
  472. }
  473. return result;
  474. }
  475. #endregion
  476. #region Calibrate
  477. private bool Calibrate(object[] param)
  478. {
  479. _calibrateRoutine.Start(param);
  480. return true;
  481. }
  482. private bool CalibrateTimeout(object[] param)
  483. {
  484. RState ret = _calibrateRoutine.Monitor();
  485. if (ret == RState.Failed || ret == RState.Timeout)
  486. {
  487. return true;
  488. }
  489. return ret == RState.End;
  490. }
  491. #endregion
  492. #region Pick
  493. private bool PickFromLoader(object[] param)
  494. {
  495. bool result= _pickFromLoaderRoutine.Start(param)==RState.Running;
  496. if(result)
  497. {
  498. _currentRoutine = _pickFromLoaderRoutine;
  499. }
  500. return result;
  501. }
  502. private bool PickTimeout(object[] param)
  503. {
  504. //RState ret = _pufNoWaferPickRoutine.Monitor();
  505. RState ret = _pickFromLoaderRoutine.Monitor();
  506. if (ret == RState.Failed || ret == RState.Timeout)
  507. {
  508. PostMsg(PUFMSG.Error);
  509. return false;
  510. }
  511. bool result = ret == RState.End;
  512. if(result)
  513. {
  514. _currentRoutine = null;
  515. }
  516. return result;
  517. }
  518. #endregion
  519. #region Place
  520. /// <summary>
  521. /// 放片至Loader
  522. /// </summary>
  523. /// <param name="param"></param>
  524. /// <returns></returns>
  525. private bool PlaceToLoader(object[] param)
  526. {
  527. bool result = _placeToLoaderRoutine.Start(param) == RState.Running;
  528. if(result)
  529. {
  530. _currentRoutine = _placeToLoaderRoutine;
  531. }
  532. return result;
  533. }
  534. /// <summary>
  535. /// 监控放片至Loader
  536. /// </summary>
  537. /// <param name="param"></param>
  538. /// <returns></returns>
  539. private bool PlaceToLoaderMonitor(object[] param)
  540. {
  541. //RState ret = _pufNoWaferPickRoutine.Monitor();
  542. RState ret = _placeToLoaderRoutine.Monitor();
  543. if (ret == RState.Failed || ret == RState.Timeout)
  544. {
  545. _currentRoutine = null;
  546. PostMsg(PUFMSG.Error);
  547. return false;
  548. }
  549. bool result = ret == RState.End;
  550. if(result)
  551. {
  552. _currentRoutine = null;
  553. }
  554. return result;
  555. }
  556. #endregion
  557. #region GotoRobotPositionForPlace
  558. /// <summary>
  559. /// Goto Robot Position For Place
  560. /// </summary>
  561. /// <param name="param"></param>
  562. /// <returns></returns>
  563. private bool GotoRobotPositionForPlace(object[] param)
  564. {
  565. bool result= _gotoRobotForPlaceRoutine.Start(param)==RState.Running;
  566. if(result)
  567. {
  568. _currentRoutine = _gotoRobotForPlaceRoutine;
  569. }
  570. return result;
  571. }
  572. /// <summary>
  573. /// Goto Robot Position For Place监控
  574. /// </summary>
  575. /// <param name="param"></param>
  576. /// <returns></returns>
  577. private bool GotoRobotPositionForPlaceMonitor(object[] param)
  578. {
  579. RState ret = _gotoRobotForPlaceRoutine.Monitor();
  580. if (ret == RState.Failed || ret == RState.Timeout)
  581. {
  582. _currentRoutine = null;
  583. PostMsg(PUFMSG.Error);
  584. return false;
  585. }
  586. bool result= ret == RState.End;
  587. if(result)
  588. {
  589. _currentRoutine = null;
  590. }
  591. return result;
  592. }
  593. #endregion
  594. #region GotoRobotPositionForPick
  595. /// <summary>
  596. /// Goto Robot Position For Pick
  597. /// </summary>
  598. /// <param name="param"></param>
  599. /// <returns></returns>
  600. private bool GotoRobotPositionForPick(object[] param)
  601. {
  602. bool result= _gotoRobotForPickRoutine.Start(param) == RState.Running;
  603. if(result)
  604. {
  605. _currentRoutine = _gotoRobotForPickRoutine;
  606. }
  607. return result;
  608. }
  609. /// <summary>
  610. /// Goto Robot Position For Pick监控
  611. /// </summary>
  612. /// <param name="param"></param>
  613. /// <returns></returns>
  614. private bool GotoRobotPositionForPickMonitor(object[] param)
  615. {
  616. RState ret = _gotoRobotForPickRoutine.Monitor();
  617. if (ret == RState.Failed || ret == RState.Timeout)
  618. {
  619. _currentRoutine = null;
  620. PostMsg(PUFMSG.Error);
  621. return false;
  622. }
  623. bool result = ret == RState.End;
  624. if(result)
  625. {
  626. _currentRoutine = null;
  627. }
  628. return result;
  629. }
  630. #endregion
  631. #region ReadyForRobotPlace
  632. /// <summary>
  633. /// Ready For Robot Place
  634. /// </summary>
  635. /// <param name="param"></param>
  636. /// <returns></returns>
  637. private bool ReadyForRobotPlace(object[] param)
  638. {
  639. bool result = _readyForRobotPlaceRoutine.Start(param)==RState.Running;
  640. if(result)
  641. {
  642. _currentRoutine = _readyForRobotPlaceRoutine;
  643. }
  644. return result;
  645. }
  646. /// <summary>
  647. /// Ready For Robot Place
  648. /// </summary>
  649. /// <param name="param"></param>
  650. /// <returns></returns>
  651. private bool RetryReadyForRobotPlace(object[] param)
  652. {
  653. int stepIndex = (int)param[0];
  654. bool result = _readyForRobotPlaceRoutine.Retry(stepIndex) == RState.Running;
  655. if (result)
  656. {
  657. _currentRoutine = _readyForRobotPlaceRoutine;
  658. }
  659. return result;
  660. }
  661. /// <summary>
  662. /// ReadyForRobotPlace监控
  663. /// </summary>
  664. /// <param name="param"></param>
  665. /// <returns></returns>
  666. private bool ReadyForRobotPlaceMonitor(object[] param)
  667. {
  668. RState ret = _readyForRobotPlaceRoutine.Monitor();
  669. if (ret == RState.Failed || ret == RState.Timeout)
  670. {
  671. _currentRoutine = null;
  672. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  673. {
  674. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.ReadyForRobotPlace, _readyForRobotPlaceRoutine.ErrorMsg, _readyForRobotPlaceRoutine.ErrorStep, (int)AlarmType.Error);
  675. AlarmListManager.Instance.AddAlarm(alarmList);
  676. }
  677. PostMsg(PUFMSG.Error);
  678. return false;
  679. }
  680. bool result= ret == RState.End;
  681. if(result)
  682. {
  683. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.WaitForRobotPlacing.ToString());
  684. _currentRoutine = null;
  685. }
  686. return result;
  687. }
  688. /// <summary>
  689. /// 确认ReadyForRobotPlace
  690. /// </summary>
  691. /// <param name="param"></param>
  692. /// <returns></returns>
  693. private bool ConfirmReadyForRobotPlace(object[] param)
  694. {
  695. bool result = _readyForRobotPlaceRoutine.CheckCompleteCondition();
  696. if (!result)
  697. {
  698. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  699. {
  700. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.ReadyForRobotPlace,
  701. _readyForRobotPlaceRoutine.ErrorMsg, _readyForRobotPlaceRoutine.ErrorStep, (int)AlarmType.Error);
  702. AlarmListManager.Instance.AddAlarm(alarmList);
  703. }
  704. PostMsg(PUFMSG.Error);
  705. }
  706. else
  707. {
  708. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  709. {
  710. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.WaitForRobotPlacing.ToString());
  711. }
  712. }
  713. return result;
  714. }
  715. #endregion
  716. #region Ready for Swap
  717. /// <summary>
  718. /// Ready For Swap
  719. /// </summary>
  720. /// <param name="param"></param>
  721. /// <returns></returns>
  722. private bool ReadyForSwap(object[] param)
  723. {
  724. bool result= _readyForSwapRoutine.Start(param)==RState.Running;
  725. if(result)
  726. {
  727. _currentRoutine = _readyForSwapRoutine;
  728. }
  729. return result;
  730. }
  731. /// <summary>
  732. /// Retry Ready For Swap
  733. /// </summary>
  734. /// <param name="param"></param>
  735. /// <returns></returns>
  736. private bool RetryReadyForSwap(object[] param)
  737. {
  738. int stepIndex = (int)param[0];
  739. bool result = _readyForSwapRoutine.Retry(stepIndex) == RState.Running;
  740. if (result)
  741. {
  742. _currentRoutine = _readyForSwapRoutine;
  743. }
  744. return result;
  745. }
  746. /// <summary>
  747. /// Ready For Swap 监控
  748. /// </summary>
  749. /// <param name="param"></param>
  750. /// <returns></returns>
  751. private bool ReadyForSwapMonitor(object[] param)
  752. {
  753. RState ret = _readyForSwapRoutine.Monitor();
  754. if (ret == RState.Failed || ret == RState.Timeout)
  755. {
  756. _currentRoutine = null;
  757. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  758. {
  759. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.ReadyForSwap,
  760. _readyForSwapRoutine.ErrorMsg, _readyForSwapRoutine.ErrorStep, (int)AlarmType.Error);
  761. AlarmListManager.Instance.AddAlarm(alarmList);
  762. }
  763. PostMsg(PUFMSG.Error);
  764. return false;
  765. }
  766. bool result= ret == RState.End;
  767. if(result)
  768. {
  769. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.WaitForSwaping.ToString());
  770. _currentRoutine = null;
  771. }
  772. return result;
  773. }
  774. /// <summary>
  775. /// 确认Ready For Swap
  776. /// </summary>
  777. /// <param name="param"></param>
  778. /// <returns></returns>
  779. private bool ConfirmReadyForSwap(object[] param)
  780. {
  781. bool result = _readyForSwapRoutine.CheckCompleteCondition();
  782. if (!result)
  783. {
  784. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  785. {
  786. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.ReadyForSwap,
  787. _readyForSwapRoutine.ErrorMsg, _readyForSwapRoutine.ErrorStep, (int)AlarmType.Error);
  788. AlarmListManager.Instance.AddAlarm(alarmList);
  789. }
  790. PostMsg(PUFMSG.Error);
  791. }
  792. else
  793. {
  794. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  795. {
  796. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.WaitForSwaping.ToString());
  797. }
  798. }
  799. return result;
  800. }
  801. #endregion
  802. #region Swap
  803. /// <summary>
  804. /// Swap
  805. /// </summary>
  806. /// <param name="param"></param>
  807. /// <returns></returns>
  808. private bool Swap(object[] param)
  809. {
  810. bool result= _swapRoutine.Start(param)==RState.Running;
  811. if(result)
  812. {
  813. _currentRoutine = _swapRoutine;
  814. }
  815. return result;
  816. }
  817. /// <summary>
  818. /// Retry Swap
  819. /// </summary>
  820. /// <param name="param"></param>
  821. /// <returns></returns>
  822. private bool RetrySwap(object[] param)
  823. {
  824. int stepIndex = (int)param[0];
  825. bool result = _swapRoutine.Retry(stepIndex) == RState.Running;
  826. if (result)
  827. {
  828. _currentRoutine = _swapRoutine;
  829. }
  830. return result;
  831. }
  832. /// <summary>
  833. /// Swap监控
  834. /// </summary>
  835. /// <param name="param"></param>
  836. /// <returns></returns>
  837. private bool SwapMonitor(object[] param)
  838. {
  839. RState ret = _swapRoutine.Monitor();
  840. if (ret == RState.Failed || ret == RState.Timeout)
  841. {
  842. _currentRoutine = null;
  843. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  844. {
  845. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.Swap,
  846. _swapRoutine.ErrorMsg, _swapRoutine.ErrorStep, (int)AlarmType.Error);
  847. AlarmListManager.Instance.AddAlarm(alarmList);
  848. }
  849. PostMsg(PUFMSG.Error);
  850. return false;
  851. }
  852. bool result = ret == RState.End;
  853. if(result)
  854. {
  855. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.Swaping.ToString());
  856. _currentRoutine = null;
  857. }
  858. return result;
  859. }
  860. /// <summary>
  861. /// 确认ReadyForRobotPick
  862. /// </summary>
  863. /// <param name="param"></param>
  864. /// <returns></returns>
  865. private bool ConfirmSwap(object[] param)
  866. {
  867. bool result = _swapRoutine.CheckCompleteCondition();
  868. if (!result)
  869. {
  870. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  871. {
  872. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.Swap,
  873. _readyForRobotPickRoutine.ErrorMsg, _readyForRobotPickRoutine.ErrorStep, (int)AlarmType.Error);
  874. AlarmListManager.Instance.AddAlarm(alarmList);
  875. }
  876. PostMsg(PUFMSG.Error);
  877. }
  878. else
  879. {
  880. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  881. {
  882. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.Swaping.ToString());
  883. }
  884. }
  885. return result;
  886. }
  887. #endregion
  888. #region ReadyForRobotPIck
  889. /// <summary>
  890. /// Ready For Robot Pick
  891. /// </summary>
  892. /// <param name="param"></param>
  893. /// <returns></returns>
  894. private bool ReadyForRobotPick(object[] param)
  895. {
  896. bool result= _readyForRobotPickRoutine.Start(param) == RState.Running;
  897. if(result)
  898. {
  899. _currentRoutine = _readyForRobotPickRoutine;
  900. }
  901. return result;
  902. }
  903. /// <summary>
  904. /// retry Ready For Robot Pick
  905. /// </summary>
  906. /// <param name="param"></param>
  907. /// <returns></returns>
  908. private bool RetryReadyForRobotPick(object[] param)
  909. {
  910. int stepIndex = (int)param[0];
  911. bool result = _readyForRobotPickRoutine.Retry(stepIndex) == RState.Running;
  912. if (result)
  913. {
  914. _currentRoutine = _readyForRobotPickRoutine;
  915. }
  916. return result;
  917. }
  918. /// <summary>
  919. /// ReadyForRobotPick监控
  920. /// </summary>
  921. /// <param name="param"></param>
  922. /// <returns></returns>
  923. private bool ReadyForRobotPickMonitor(object[] param)
  924. {
  925. RState ret = _readyForRobotPickRoutine.Monitor();
  926. if (ret == RState.Failed || ret == RState.Timeout)
  927. {
  928. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  929. {
  930. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.ReadyForRobotPick,
  931. _readyForRobotPickRoutine.ErrorMsg, _readyForRobotPickRoutine.ErrorStep, (int)AlarmType.Error);
  932. AlarmListManager.Instance.AddAlarm(alarmList);
  933. }
  934. PostMsg(PUFMSG.Error);
  935. _currentRoutine = _readyForRobotPickRoutine;
  936. return false;
  937. }
  938. bool result= ret == RState.End;
  939. if(result)
  940. {
  941. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.WaitForRobotPicking.ToString());
  942. _currentRoutine = null;
  943. }
  944. return result;
  945. }
  946. /// <summary>
  947. /// 确认ReadyForRobotPick
  948. /// </summary>
  949. /// <param name="param"></param>
  950. /// <returns></returns>
  951. private bool ConfirmReadyForRobotPick(object[] param)
  952. {
  953. bool result = _readyForRobotPickRoutine.CheckCompleteCondition();
  954. if (!result)
  955. {
  956. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  957. {
  958. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.ReadyForRobotPick,
  959. _readyForRobotPickRoutine.ErrorMsg, _readyForRobotPickRoutine.ErrorStep, (int)AlarmType.Error);
  960. AlarmListManager.Instance.AddAlarm(alarmList);
  961. }
  962. PostMsg(PUFMSG.Error);
  963. }
  964. else
  965. {
  966. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  967. {
  968. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.ConfirmCompleting.ToString());
  969. }
  970. }
  971. return result;
  972. }
  973. #endregion
  974. #region BackToParkStation
  975. /// <summary>
  976. /// Back to park station
  977. /// </summary>
  978. /// <param name="param"></param>
  979. /// <returns></returns>
  980. private bool BackToParkStation(object[] param)
  981. {
  982. bool result= _backToParkRoutine.Start(param) == RState.Running;
  983. if(result)
  984. {
  985. _currentRoutine = _backToParkRoutine;
  986. }
  987. return true;
  988. }
  989. /// <summary>
  990. /// Retry Back to park station
  991. /// </summary>
  992. /// <param name="param"></param>
  993. /// <returns></returns>
  994. private bool RetryBackToParkStation(object[] param)
  995. {
  996. int stepIdex = (int)param[0];
  997. bool result = _backToParkRoutine.Retry(stepIdex) == RState.Running;
  998. if (result)
  999. {
  1000. _currentRoutine = _backToParkRoutine;
  1001. }
  1002. return true;
  1003. }
  1004. /// <summary>
  1005. /// BackToParkStation监控
  1006. /// </summary>
  1007. /// <param name="param"></param>
  1008. /// <returns></returns>
  1009. private bool BackToParkStationMonitor(object[] param)
  1010. {
  1011. RState ret = _backToParkRoutine.Monitor();
  1012. if (ret == RState.Failed || ret == RState.Timeout)
  1013. {
  1014. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1015. {
  1016. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.RobotPickComplete,
  1017. _backToParkRoutine.ErrorMsg, _backToParkRoutine.ErrorStep, (int)AlarmType.Error);
  1018. AlarmListManager.Instance.AddAlarm(alarmList);
  1019. }
  1020. PostMsg(PUFMSG.Error);
  1021. _currentRoutine = null;
  1022. return false;
  1023. }
  1024. bool result= ret == RState.End;
  1025. if(result)
  1026. {
  1027. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.BackToPackStationing.ToString());
  1028. _currentRoutine = null;
  1029. }
  1030. return result;
  1031. }
  1032. /// <summary>
  1033. /// 确认BackToParkStation
  1034. /// </summary>
  1035. /// <param name="param"></param>
  1036. /// <returns></returns>
  1037. private bool ConfirmBackToParkStation(object[] param)
  1038. {
  1039. bool result = _backToParkRoutine.CheckCompleteCondition();
  1040. if (!result)
  1041. {
  1042. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1043. {
  1044. AlarmList alarmList = new AlarmList(Module.ToString(), ((PUFSTATE)fsm.State).ToString(), (int)PUFMSG.RobotPickComplete,
  1045. _backToParkRoutine.ErrorMsg, _backToParkRoutine.ErrorStep, (int)AlarmType.Error);
  1046. AlarmListManager.Instance.AddAlarm(alarmList);
  1047. }
  1048. PostMsg(PUFMSG.Error);
  1049. }
  1050. else
  1051. {
  1052. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  1053. {
  1054. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), PUFSTATE.BackToPackStationing.ToString());
  1055. }
  1056. }
  1057. return result;
  1058. }
  1059. #endregion
  1060. #region Retry
  1061. /// <summary>
  1062. /// Retry
  1063. /// </summary>
  1064. /// <param name="param"></param>
  1065. /// <returns></returns>
  1066. private bool PufRetry(object[] param)
  1067. {
  1068. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1069. if (alarmList != null)
  1070. {
  1071. CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), alarmList.ModuleCmd,
  1072. alarmList.ModuleStep);
  1073. }
  1074. return false;
  1075. }
  1076. #endregion
  1077. #region ConfirmComplete
  1078. /// <summary>
  1079. /// 确认是否完成
  1080. /// </summary>
  1081. /// <param name="param"></param>
  1082. /// <returns></returns>
  1083. private bool ConfirmComplete(object[] param)
  1084. {
  1085. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1086. if (alarmList != null)
  1087. {
  1088. if (alarmList.ModuleState == PUFSTATE.WaitForRobotPlacing.ToString())
  1089. {
  1090. CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.ReadyForRobotPlace);
  1091. }
  1092. else if (alarmList.ModuleState == PUFSTATE.WaitForSwaping.ToString())
  1093. {
  1094. CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.ReadyForSwap);
  1095. }
  1096. else if (alarmList.ModuleState == PUFSTATE.WaitForRobotPicking.ToString())
  1097. {
  1098. CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.ReadyForRobotPick);
  1099. }
  1100. else if (alarmList.ModuleState == PUFSTATE.BackToPackStationing.ToString())
  1101. {
  1102. CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.RobotPickComplete);
  1103. }
  1104. else if (alarmList.ModuleState == PUFSTATE.Swaping.ToString())
  1105. {
  1106. CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.Swap);
  1107. }
  1108. else
  1109. {
  1110. PostMsg(PUFMSG.Error);
  1111. LOG.WriteLog(eEvent.ERR_PUF, Module.ToString(), $"error state {alarmList.ModuleState},cannot ConfirmComplete");
  1112. }
  1113. }
  1114. return false;
  1115. }
  1116. /// <summary>
  1117. /// 清除报警
  1118. /// </summary>
  1119. /// <param name="param"></param>
  1120. /// <returns></returns>
  1121. private bool ClearModuleAlarm(object[] param)
  1122. {
  1123. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  1124. if (alarmList != null)
  1125. {
  1126. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), "");
  1127. }
  1128. return true;
  1129. }
  1130. #endregion
  1131. #region FlipSideA
  1132. /// <summary>
  1133. /// Flip SideA
  1134. /// </summary>
  1135. /// <param name="param"></param>
  1136. /// <returns></returns>
  1137. private bool FlipSideA(object[] param)
  1138. {
  1139. return _flipAxis.PositionStation("SideA");
  1140. }
  1141. /// <summary>
  1142. /// Flip SideA监控
  1143. /// </summary>
  1144. /// <param name="param"></param>
  1145. /// <returns></returns>
  1146. private bool FlipSideAMonitor(object[] param)
  1147. {
  1148. RState ret = _flipAxis.Status;
  1149. if (ret == RState.End)
  1150. {
  1151. return true;
  1152. }
  1153. else if (ret == RState.Failed || ret == RState.Timeout)
  1154. {
  1155. PostMsg(PUFMSG.Error);
  1156. }
  1157. return false;
  1158. }
  1159. #endregion
  1160. /// <summary>
  1161. /// 校验Puf Rotation是否到达Robot位置
  1162. /// </summary>
  1163. /// <returns></returns>
  1164. public bool CheckPufRotationInRobot()
  1165. {
  1166. if (!_pufVacuum.CheckChuckIn())
  1167. {
  1168. return false;
  1169. }
  1170. if (!_rotationAxis.CheckPositionIsInStation(_rotationAxis.MotionData.MotorPosition, "Robot"))
  1171. {
  1172. return false;
  1173. }
  1174. return true;
  1175. }
  1176. public bool Check(int msg, out string reason, params object[] args)
  1177. {
  1178. reason = "";
  1179. return false;
  1180. }
  1181. public bool CheckAcked(int msg)
  1182. {
  1183. return false;
  1184. }
  1185. public int Invoke(string function, params object[] args)
  1186. {
  1187. switch(function)
  1188. {
  1189. case "HomeAll":
  1190. if(IsIdle)
  1191. {
  1192. return (int)FSM_MSG.NONE;
  1193. }
  1194. if (CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.HomeAll))
  1195. {
  1196. return (int)FSM_MSG.NONE;
  1197. }
  1198. else
  1199. {
  1200. return (int)FSM_MSG.ALARM;
  1201. }
  1202. case "Abort":
  1203. CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.Abort);
  1204. return (int)FSM_MSG.NONE;
  1205. case "Retry":
  1206. if (CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.Retry, args))
  1207. {
  1208. return (int)PUFMSG.Retry;
  1209. }
  1210. else
  1211. {
  1212. return (int)FSM_MSG.NONE;
  1213. }
  1214. case "ConfirmComplete":
  1215. if (CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(), (int)PUFMSG.ConfirmComplete, args))
  1216. {
  1217. return (int)PUFMSG.ConfirmComplete;
  1218. }
  1219. else
  1220. {
  1221. return (int)FSM_MSG.NONE;
  1222. }
  1223. default:
  1224. return (int)FSM_MSG.NONE;
  1225. }
  1226. }
  1227. }
  1228. public enum PUFMSG
  1229. {
  1230. HomeAll, // 0
  1231. SwitchOn,
  1232. SwitchOff,
  1233. Calibrate,
  1234. Error,
  1235. ResumeError,
  1236. Abort,
  1237. PickFromLoader,
  1238. PlaceToLoader,
  1239. GoToSavedPosition,
  1240. GotoRobotPositionForPlace,
  1241. GotoRobotPositionForPick,
  1242. ReturnIdle,
  1243. ReturnInit,
  1244. ReadyForRobotPlace,
  1245. ReadyForSwap,
  1246. Swap,
  1247. ReadyForRobotPick,
  1248. RobotPickComplete,
  1249. Retry,
  1250. ConfirmComplete,
  1251. FlipSideA
  1252. }
  1253. }