SRDEntity.cs 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.Fsm;
  5. using Aitex.Core.RT.Log;
  6. using Aitex.Core.RT.OperationCenter;
  7. using Aitex.Core.RT.RecipeCenter;
  8. using Aitex.Core.Util;
  9. using Aitex.Core.Utilities;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.RecipeCenter;
  12. using MECF.Framework.Common.SubstrateTrackings;
  13. using PunkHPX8_Core;
  14. using PunkHPX8_RT.Devices.AXIS;
  15. using PunkHPX8_RT.Devices.SRD;
  16. using PunkHPX8_RT.Modules.Transporter;
  17. using System;
  18. using MECF.Framework.Common.Persistent.SRD;
  19. using MECF.Framework.Common.ToolLayout;
  20. using MECF.Framework.Common.Alarm;
  21. using MECF.Framework.Common.CommonData;
  22. namespace PunkHPX8_RT.Modules.SRD
  23. {
  24. public class SRDEntity : Entity, IEntity, IModuleEntity
  25. {
  26. #region 常量
  27. private const string AUTO = "Auto";
  28. private const string MANUAL = "Manual";
  29. private const string DISABLED = "Disabled";
  30. private const string ENGINEERING = "Engineering";
  31. private const string PRODUCTION = "Production";
  32. #endregion
  33. #region 内部变量
  34. /// <summary>
  35. /// 是否Homed
  36. /// </summary>
  37. private bool _isHomed;
  38. /// <summary>
  39. /// rotation电机
  40. /// </summary>
  41. private JetAxisBase _rotationAxis;
  42. /// <summary>
  43. /// arm电机
  44. /// </summary>
  45. private JetAxisBase _armAxis;
  46. /// <summary>
  47. /// IsPresenceTesting
  48. /// </summary>
  49. private bool _isPresenceTesting = false;
  50. /// <summary>
  51. /// IsAWCCycling
  52. /// </summary>
  53. private bool _isAWCCycling = false;
  54. /// <summary>
  55. /// 当前Recipe
  56. /// </summary>
  57. private SrdRecipe _currentRecipe = null;
  58. /// <summary>
  59. /// 持久化对象
  60. /// </summary>
  61. private SRDPersistentValue _persistentValue;
  62. /// <summary>
  63. /// run recipe start time
  64. /// </summary>
  65. private DateTime _runRecipeStartTime;
  66. /// <summary>
  67. /// run recipe complete time
  68. /// </summary>
  69. private DateTime _runRecipeCompleteTime;
  70. /// <summary>
  71. /// Wafer已Loader完
  72. /// </summary>
  73. private bool _isLoaded = false;
  74. #endregion
  75. #region Routine
  76. /// <summary>
  77. /// SRD Home
  78. /// </summary>
  79. private SRDHomeRoutine _homeRoutine;
  80. /// <summary>
  81. /// SRD初始化Home Routine
  82. /// </summary>
  83. private SRDInitializeHomeRoutine _initializeHomeRoutine;
  84. /// <summary>
  85. /// SRD SwicthOn
  86. /// </summary>
  87. private SRDSwitchOnRoutine _switchOnRoutine;
  88. /// <summary>
  89. /// SRD SwicthOff
  90. /// </summary>
  91. private SRDSwitchOffRoutine _switchOffRoutine;
  92. /// <summary>
  93. /// SRD Initialize
  94. /// </summary>
  95. private SRDInitializeRoutine _initializeRoutine;
  96. /// <summary>
  97. /// SRD Common Device
  98. /// </summary>
  99. private SrdCommonDevice _srdCommon;
  100. /// <summary>
  101. /// SRD GoToPosition
  102. /// </summary>
  103. private SRDPositionRoutine _positionRoutine;
  104. /// <summary>
  105. /// SRD StartRotation
  106. /// </summary>
  107. private SRDRotationRoutine _rotationRoutine;
  108. /// <summary>
  109. /// SRD PresenceTest
  110. /// </summary>
  111. private SRDPresenceTestRoutine _presenceTestRoutine;
  112. /// <summary>
  113. /// SRD ProcessRecipe
  114. /// </summary>
  115. private SRDProcessRecipeRoutine _processRecipeRoutine;
  116. /// <summary>
  117. /// SRD AWC Cycle
  118. /// </summary>
  119. private SRDAWCCycleRoutine _awcCycleRoutine;
  120. /// <summary>
  121. /// SRD Process Error
  122. /// </summary>
  123. private SRDProcessErrorRoutine _processErrorRoutine;
  124. /// <summary>
  125. /// SRD Loader Routine
  126. /// </summary>
  127. private SRDLoaderRoutine _loaderRoutine;
  128. /// <summary>
  129. /// SRD Unloader Routine
  130. /// </summary>
  131. private SRDUnloaderRoutine _unloaderRoutine;
  132. /// <summary>
  133. /// RecipeCycle
  134. /// </summary>
  135. private int _cycle = 0;
  136. /// <summary>
  137. /// recipe时长
  138. /// </summary>
  139. private int _recipeTime;
  140. #endregion
  141. #region 属性
  142. /// <summary>
  143. /// 模块名称
  144. /// </summary>
  145. public ModuleName Module { get; private set; }
  146. /// <summary>
  147. /// 初始化状态
  148. /// </summary>
  149. public bool IsInit
  150. {
  151. get { return fsm.State == (int)SRDState.Init; }
  152. }
  153. /// <summary>
  154. /// 空闲状态
  155. /// </summary>
  156. public bool IsIdle
  157. {
  158. get
  159. {
  160. return fsm.State == (int)SRDState.Idle;
  161. }
  162. }
  163. /// <summary>
  164. /// 当前状态机状态
  165. /// </summary>
  166. public int State { get { return fsm.State; } }
  167. /// <summary>
  168. /// 是否发生错误
  169. /// </summary>
  170. public bool IsError
  171. {
  172. get { return fsm.State == (int)SRDState.Error; }
  173. }
  174. /// <summary>
  175. /// 是否正在作业
  176. /// </summary>
  177. public bool IsBusy
  178. {
  179. get { return !IsInit && !IsError && !IsIdle; }
  180. }
  181. /// <summary>
  182. /// 是否已Home
  183. /// </summary>
  184. public bool IsHomed
  185. {
  186. get { return _isHomed; }
  187. }
  188. /// <summary>
  189. /// 是否正在用水
  190. /// </summary>
  191. public bool IsUsingWater
  192. {
  193. get { return _processRecipeRoutine.IsUsingWater; }
  194. }
  195. /// <summary>
  196. /// SRD门是否关闭
  197. /// </summary>
  198. public bool IsSrdDoorClosed
  199. {
  200. get { return !_srdCommon.CommonData.DoorOpened && _srdCommon.CommonData.DoorClosed; }
  201. }
  202. /// <summary>
  203. /// SRD真空是否开启
  204. /// </summary>
  205. public bool IsSrdChuckVacuum
  206. {
  207. get { return _srdCommon.CommonData.ChuckVacuum; }
  208. }
  209. /// <summary>
  210. /// 是否禁用
  211. /// </summary>
  212. public bool IsDisable { get { return _persistentValue == null || _persistentValue.OperatingMode == DISABLED; } }
  213. /// <summary>
  214. /// 自动模式
  215. /// </summary>
  216. public bool IsAuto { get { return _persistentValue != null && _persistentValue.OperatingMode == AUTO; } }
  217. /// <summary>
  218. /// 自动模式
  219. /// </summary>
  220. public bool IsManual { get { return _persistentValue != null && _persistentValue.OperatingMode == MANUAL; } }
  221. /// <summary>
  222. /// Arm是否SwitchOn
  223. /// </summary>
  224. public bool IsArmSwitchOn
  225. {
  226. get { return _armAxis.IsSwitchOn; }
  227. }
  228. /// <summary>
  229. /// Rotation是否SwitchOn
  230. /// </summary>
  231. public bool IsRotationSwitchOn
  232. {
  233. get { return _rotationAxis.IsSwitchOn; }
  234. }
  235. /// <summary>
  236. /// 已完成的RunRecipeCycle次数
  237. /// </summary>
  238. public int AchievedCycle { get { return _processRecipeRoutine.AchievedCycle; } }
  239. /// <summary>
  240. /// PresenceTest状态
  241. /// </summary>
  242. public bool IsPresenceTesting
  243. {
  244. get { return _isPresenceTesting; }
  245. }
  246. /// <summary>
  247. /// AWCCycle状态
  248. /// </summary>
  249. public bool IsAWCCycling
  250. {
  251. get { return _isAWCCycling; }
  252. }
  253. /// <summary>
  254. /// 当前状态机
  255. /// </summary>
  256. public string CurrentStateMachine
  257. {
  258. get { return GetCurrentStateMachine(); }
  259. }
  260. /// <summary>
  261. /// 是否为工程模式
  262. /// </summary>
  263. public bool IsEngineering { get { return _persistentValue != null && _persistentValue.RecipeOperatingMode == ENGINEERING; } }
  264. /// <summary>
  265. /// 是否为产品模式
  266. /// </summary>
  267. public bool IsProduction { get { return _persistentValue != null && _persistentValue.RecipeOperatingMode == PRODUCTION; } }
  268. /// <summary>
  269. /// Wafer已Loader完
  270. /// </summary>
  271. public bool IsLoaded
  272. {
  273. get { return _isLoaded; }
  274. }
  275. #endregion
  276. /// <summary>
  277. /// 构造函数
  278. /// </summary>
  279. /// <param name="module"></param>
  280. public SRDEntity(ModuleName module)
  281. {
  282. this.Module = module;
  283. _armAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Arm");
  284. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Rotation");
  285. WaferManager.Instance.SubscribeLocation(Module, 1);
  286. InitialFsm();
  287. }
  288. /// <summary>
  289. /// 总初始化
  290. /// </summary>
  291. /// <returns></returns>
  292. protected override bool Init()
  293. {
  294. _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
  295. InitializeParameter();
  296. InitialDATA();
  297. InitialRoutine();
  298. InitialOperation();
  299. return true;
  300. }
  301. /// <summary>
  302. /// 初始化参数
  303. /// </summary>
  304. private void InitializeParameter()
  305. {
  306. _persistentValue = SRDPersistentManager.Instance.GetModulePersistentValue(Module.ToString());
  307. if (_persistentValue == null)
  308. {
  309. LOG.WriteLog(eEvent.ERR_SRD, Module.ToString(), "Persistent Value Object is not exist");
  310. }
  311. }
  312. /// <summary>
  313. /// 初始化数据
  314. /// </summary>
  315. private void InitialDATA()
  316. {
  317. DATA.Subscribe($"{Module}.FsmState", () => ((SRDState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  318. DATA.Subscribe($"{Module}.IsHomed", () => _isHomed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  319. DATA.Subscribe($"{Module}.IsError", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  320. DATA.Subscribe($"{Module}.SrdDoorClosed", () => IsSrdDoorClosed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  321. DATA.Subscribe($"{Module}.AchievedCycle", () => AchievedCycle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  322. DATA.Subscribe($"{Module}.IsPresenceTesting", () => IsPresenceTesting, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  323. DATA.Subscribe($"{Module}.CurrentStateMachine", () => CurrentStateMachine, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  324. DATA.Subscribe($"{Module}.IsAWCCycling", () => IsAWCCycling, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  325. DATA.Subscribe($"{Module}.CurrentRecipe", () => _currentRecipe != null ? _currentRecipe.Ppid : "", SubscriptionAttribute.FLAG.IgnoreSaveDB);
  326. DATA.Subscribe($"{Module}.TotalTime", () => _recipeTime, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  327. DATA.Subscribe($"{Module}.TimeRemain", () => CalculateTimeRemain(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  328. DATA.Subscribe($"{Module}.OperatingMode", () => _persistentValue != null ? _persistentValue.OperatingMode : "None", SubscriptionAttribute.FLAG.IgnoreSaveDB);
  329. }
  330. /// <summary>
  331. /// 初始化状态机
  332. /// </summary>
  333. private void InitialFsm()
  334. {
  335. fsm = new StateMachine<SRDEntity>(Module.ToString(), (int)SRDState.Init, 20);
  336. fsm.EnableRepeatedMsg(true);
  337. AnyStateTransition(SRDMSG.Error, EnterError, SRDState.Error);
  338. Transition(SRDState.Error, SRDMSG.ResumeError, (param) => { return true; }, SRDState.Init);
  339. //Initialized
  340. AnyStateTransition(SRDMSG.Initialize, InitializeAll, SRDState.Initializing);
  341. Transition(SRDState.Initializing, FSM_MSG.TIMER, InitializeAllTimeout, SRDState.Initialized);
  342. //SwitchOn
  343. Transition(SRDState.Init, SRDMSG.SwitchOn, SwitchOnAll, SRDState.SwitchOning);
  344. Transition(SRDState.Idle, SRDMSG.SwitchOn, SwitchOnAll, SRDState.SwitchOning);
  345. Transition(SRDState.Error, SRDMSG.SwitchOn, SwitchOnAll, SRDState.SwitchOning);
  346. Transition(SRDState.Initialized, SRDMSG.SwitchOn, SwitchOnAll, SRDState.SwitchOning);
  347. Transition(SRDState.SwitchOning, FSM_MSG.TIMER, SwitchOnTimeout, SRDState.Init);
  348. //SwitchOff
  349. Transition(SRDState.Init, SRDMSG.SwitchOff, SwitchOffAll, SRDState.SwitchOffing);
  350. Transition(SRDState.Idle, SRDMSG.SwitchOff, SwitchOffAll, SRDState.SwitchOffing);
  351. Transition(SRDState.Error, SRDMSG.SwitchOff, SwitchOffAll, SRDState.SwitchOffing);
  352. Transition(SRDState.Initialized, SRDMSG.SwitchOff, SwitchOffAll, SRDState.SwitchOffing);
  353. Transition(SRDState.SwitchOffing, FSM_MSG.TIMER, SwitchOffTimeout, SRDState.Init);
  354. // Home
  355. Transition(SRDState.Init, SRDMSG.HomeAll, HomeAll, SRDState.Homing);
  356. Transition(SRDState.Initialized, SRDMSG.HomeAll, HomeAll, SRDState.Homing);
  357. Transition(SRDState.Error, SRDMSG.HomeAll, HomeAll, SRDState.Homing);
  358. Transition(SRDState.Idle, SRDMSG.HomeAll, HomeAll, SRDState.Homing);
  359. Transition(SRDState.Abort, SRDMSG.HomeAll, HomeAll, SRDState.Homing);
  360. Transition(SRDState.Homing, FSM_MSG.TIMER, HomingTimeout, SRDState.Idle);
  361. //Initialize Home
  362. Transition(SRDState.Init, SRDMSG.InitializeHome, InitializeHome, SRDState.InitializeHoming);
  363. Transition(SRDState.Error, SRDMSG.InitializeHome, InitializeHome, SRDState.InitializeHoming);
  364. Transition(SRDState.InitializeHoming, FSM_MSG.TIMER, InitializeHomeTimeout, SRDState.Idle);
  365. Transition(SRDState.Abort, SRDMSG.InitializeHome, InitializeHome, SRDState.InitializeHoming);
  366. Transition(SRDState.Idle, SRDMSG.InitializeHome, InitializeHome, SRDState.InitializeHoming);
  367. //Process Recipe
  368. Transition(SRDState.Idle, SRDMSG.ProcessRecipe, ProcessRecipe, SRDState.ProcessReciping);
  369. Transition(SRDState.ProcessReciping, FSM_MSG.TIMER, ProcessRecipeTimeout, SRDState.Idle);
  370. Transition(SRDState.ProcessReciping, SRDMSG.ProcessError, ProcessError, SRDState.ProcessError);
  371. Transition(SRDState.ProcessError, FSM_MSG.TIMER, ProcessErrorMonitor, SRDState.Error);
  372. //GoToSavedPosition
  373. Transition(SRDState.Idle, SRDMSG.GoToSavedPosition, GotoPosition, SRDState.Positioning);
  374. Transition(SRDState.Positioning, FSM_MSG.TIMER, GotoPositionTimeout, SRDState.Idle);
  375. //StartRotation
  376. Transition(SRDState.Idle, SRDMSG.StartRotation, StartRotation, SRDState.Rotating);
  377. Transition(SRDState.Rotating, FSM_MSG.TIMER, RotationTimeout, SRDState.Idle);
  378. //StopRotation
  379. Transition(SRDState.Rotating, SRDMSG.StopRotation, StopRotation, SRDState.Stopping);
  380. Transition(SRDState.Stopping, FSM_MSG.TIMER, StopRotationTimeout, SRDState.Idle);
  381. //Abort
  382. Transition(SRDState.ProcessReciping, SRDMSG.Abort, AbortProcessRecipe, SRDState.Abort);
  383. Transition(SRDState.PresenceTesting, SRDMSG.Abort, AbortPresenceTest, SRDState.Abort);
  384. Transition(SRDState.AWCCycling, SRDMSG.Abort, AbortAWCCycle, SRDState.Abort);
  385. Transition(SRDState.ProcessError, SRDMSG.Abort, AbortProcessError, SRDState.Abort);
  386. //PresenceTestStart
  387. Transition(SRDState.Idle, SRDMSG.PresenceTestStart, PresenceTest, SRDState.PresenceTesting);
  388. Transition(SRDState.PresenceTesting, FSM_MSG.TIMER, PresenceTestTimeout, SRDState.Idle);
  389. //AWC Cycle
  390. Transition(SRDState.Idle, SRDMSG.AWCCycleStart, AWCCycle, SRDState.AWCCycling);
  391. Transition(SRDState.AWCCycling, FSM_MSG.TIMER, AWCCycleTimeout, SRDState.Idle);
  392. Transition(SRDState.AWCCycling, SRDMSG.HomeAll, HomeAll, SRDState.AWCHoming);
  393. Transition(SRDState.AWCHoming, FSM_MSG.TIMER, HomingTimeout, SRDState.AWCCycling);
  394. //Retry
  395. Transition(SRDState.Error, SRDMSG.Retry, NullFunc, SRDState.Retrying);
  396. Transition(SRDState.Retrying, FSM_MSG.TIMER, SRDRetry, SRDState.Retrying);
  397. Transition(SRDState.Retrying, SRDMSG.ProcessRecipe, RetryRunRecipe, SRDState.ProcessReciping);
  398. //ConfirmComplete
  399. Transition(SRDState.Init, SRDMSG.ConfirmComplete, ClearModuleAlarm, SRDState.Init);
  400. Transition(SRDState.Idle, SRDMSG.ConfirmComplete, ClearModuleAlarm, SRDState.Idle);
  401. Transition(SRDState.Error, SRDMSG.ConfirmComplete, NullFunc, SRDState.ConfirmCompleting);
  402. Transition(SRDState.ConfirmCompleting, FSM_MSG.TIMER, ConfirmComplete, SRDState.ConfirmCompleting);
  403. Transition(SRDState.ConfirmCompleting, SRDMSG.ProcessRecipe, ConfirmProcessRecipe, SRDState.Idle);
  404. //Enter Init
  405. Transition(SRDState.Idle, SRDMSG.Init, NullFunc, SRDState.Init);
  406. //Loader
  407. Transition(SRDState.Idle, SRDMSG.Loader, LoaderWafer, SRDState.Loading);
  408. Transition(SRDState.Loading, FSM_MSG.TIMER, LoaderWaferMonitor, SRDState.Idle);
  409. //UnLoader
  410. Transition(SRDState.Idle, SRDMSG.Unloader, UnloaderWafer, SRDState.Unloading);
  411. Transition(SRDState.Unloading, FSM_MSG.TIMER, UnloaderWaferMonitor, SRDState.Idle);
  412. EnumLoop<SRDState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
  413. EnumLoop<SRDMSG>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
  414. }
  415. /// <summary>
  416. /// 初始化Routine
  417. /// </summary>
  418. private void InitialRoutine()
  419. {
  420. _initializeHomeRoutine = new SRDInitializeHomeRoutine(Module.ToString());
  421. _homeRoutine = new SRDHomeRoutine(Module.ToString());
  422. _switchOnRoutine = new SRDSwitchOnRoutine(Module.ToString());
  423. _switchOffRoutine = new SRDSwitchOffRoutine(Module.ToString());
  424. _initializeRoutine = new SRDInitializeRoutine(Module.ToString());
  425. _positionRoutine = new SRDPositionRoutine(Module);
  426. _rotationRoutine = new SRDRotationRoutine(Module, _rotationAxis);
  427. _presenceTestRoutine = new SRDPresenceTestRoutine(Module.ToString());
  428. _processRecipeRoutine = new SRDProcessRecipeRoutine(Module.ToString(), _rotationAxis, _armAxis, _srdCommon);
  429. _awcCycleRoutine = new SRDAWCCycleRoutine(Module);
  430. _processErrorRoutine=new SRDProcessErrorRoutine(Module.ToString());
  431. _loaderRoutine = new SRDLoaderRoutine(Module.ToString());
  432. _unloaderRoutine = new SRDUnloaderRoutine(Module.ToString());
  433. }
  434. /// <summary>
  435. /// 初始化操作
  436. /// </summary>
  437. private void InitialOperation()
  438. {
  439. OP.Subscribe($"{Module}.HomeAll", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.HomeAll); });
  440. OP.Subscribe($"{Module}.InitializeHome", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.InitializeHome); });
  441. OP.Subscribe($"{Module}.SwitchOnAll", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.SwitchOn); });
  442. OP.Subscribe($"{Module}.SwitchOffAll", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.SwitchOff); });
  443. OP.Subscribe($"{Module}.CycleManualProcessRecipe", (cmd, args) =>
  444. {
  445. SrdRecipe recipe = RecipeFileManager.Instance.LoadGenericityRecipe<SrdRecipe>(args[0].ToString());
  446. if (recipe == null)
  447. {
  448. LOG.WriteLog(eEvent.ERR_SRD, Module.ToString(), $"{args[0]} recipe is null");
  449. return false;
  450. }
  451. object[] objects = new object[args.Length];
  452. objects[0] = recipe;
  453. for (int i = 1; i < args.Length; i++)
  454. {
  455. objects[i] = args[i];
  456. }
  457. return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.ProcessRecipe, objects);
  458. });
  459. //OP.Subscribe($"{Module}.Arm.GotoSavedPosition", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.GoToSavedPosition, "Arm", args); });
  460. //OP.Subscribe($"{Module}.Rotation.GotoSavedPosition", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.GoToSavedPosition, "Rotation", args); });
  461. OP.Subscribe($"{Module}.Abort", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.Abort); });
  462. OP.Subscribe($"{Module}.StartRotation", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.StartRotation, "Rotation", args); });
  463. OP.Subscribe($"{Module}.StopRotation", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.StopRotation); });
  464. OP.Subscribe($"{Module}.PresenceTestStart", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.PresenceTestStart, args); });
  465. OP.Subscribe($"{Module}.AWCCycle", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.AWCCycleStart, args); });
  466. OP.Subscribe($"{Module}.Loader", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.Loader); });
  467. OP.Subscribe($"{Module}.Unloader", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.Unloader); });
  468. }
  469. /// <summary>
  470. /// Enter Init
  471. /// </summary>
  472. public void EnterInit()
  473. {
  474. if ((SRDState)fsm.State != SRDState.Idle) return;
  475. else
  476. {
  477. CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.Init);
  478. }
  479. }
  480. /// <summary>
  481. /// 进入Error状态
  482. /// </summary>
  483. /// <param name="param"></param>
  484. /// <returns></returns>
  485. private bool EnterError(object[] param)
  486. {
  487. _isHomed = false;
  488. return true;
  489. }
  490. #region Initialized
  491. /// <summary>
  492. /// Initialize
  493. /// </summary>
  494. /// <param name="param"></param>
  495. /// <returns></returns>
  496. private bool InitializeAll(object[] param)
  497. {
  498. if (fsm.State == (int)MetalState.Initializing)
  499. {
  500. LOG.WriteLog(eEvent.WARN_SRD, Module.ToString(), "state is Initializing,cannot do initialize");
  501. return false;
  502. }
  503. return _initializeRoutine.Start() == RState.Running;
  504. }
  505. /// <summary>
  506. /// Initialize 监控
  507. /// </summary>
  508. /// <param name="param"></param>
  509. /// <returns></returns>
  510. private bool InitializeAllTimeout(object[] param)
  511. {
  512. RState ret = _initializeRoutine.Monitor();
  513. if (ret == RState.Failed || ret == RState.Timeout)
  514. {
  515. PostMsg(SRDMSG.Error);
  516. return false;
  517. }
  518. bool result = ret == RState.End;
  519. if (result)
  520. {
  521. _isHomed = false;
  522. }
  523. return result;
  524. }
  525. #endregion
  526. #region Switch On
  527. /// <summary>
  528. /// SwitchAll
  529. /// </summary>
  530. /// <param name="param"></param>
  531. /// <returns></returns>
  532. private bool SwitchOnAll(object[] param)
  533. {
  534. return _switchOnRoutine.Start() == RState.Running;
  535. }
  536. private bool SwitchOnTimeout(object[] param)
  537. {
  538. RState ret = _switchOnRoutine.Monitor();
  539. if (ret == RState.Failed || ret == RState.Timeout)
  540. {
  541. PostMsg(SRDMSG.Error);
  542. return false;
  543. }
  544. bool result = ret == RState.End;
  545. if (result)
  546. {
  547. _isHomed = false;
  548. }
  549. return result;
  550. }
  551. #endregion
  552. #region Switch Off
  553. /// <summary>
  554. /// SwitchAll
  555. /// </summary>
  556. /// <param name="param"></param>
  557. /// <returns></returns>
  558. private bool SwitchOffAll(object[] param)
  559. {
  560. return _switchOffRoutine.Start() == RState.Running;
  561. }
  562. private bool SwitchOffTimeout(object[] param)
  563. {
  564. RState ret = _switchOffRoutine.Monitor();
  565. if (ret == RState.Failed || ret == RState.Timeout)
  566. {
  567. PostMsg(SRDMSG.Error);
  568. return false;
  569. }
  570. bool result = ret == RState.End;
  571. if (result)
  572. {
  573. _isHomed = false;
  574. }
  575. return result;
  576. }
  577. #endregion
  578. #region Home
  579. /// <summary>
  580. /// HomeAll
  581. /// </summary>
  582. /// <param name="param"></param>
  583. /// <returns></returns>
  584. private bool HomeAll(object[] param)
  585. {
  586. _isHomed = false;
  587. return _homeRoutine.Start() == RState.Running;
  588. }
  589. /// <summary>
  590. /// Home超时
  591. /// </summary>
  592. /// <param name="param"></param>
  593. /// <returns></returns>
  594. private bool HomingTimeout(object[] param)
  595. {
  596. RState ret = _homeRoutine.Monitor();
  597. if (ret == RState.Failed || ret == RState.Timeout)
  598. {
  599. PostMsg(SRDMSG.Error);
  600. return false;
  601. }
  602. bool result = ret == RState.End;
  603. if (result)
  604. {
  605. _isHomed = true;
  606. }
  607. return result;
  608. }
  609. #endregion
  610. #region Process Recipe
  611. /// <summary>
  612. /// ProcessRecipe
  613. /// </summary>
  614. /// <param name="param"></param>
  615. /// <returns></returns>
  616. private bool ProcessRecipe(object[] param)
  617. {
  618. SrdRecipe recipe= param[0] as SrdRecipe;
  619. if(param.Length >= 2) _cycle = (int)param[1];
  620. bool result = _processRecipeRoutine.Start(param) == RState.Running;
  621. if (result)
  622. {
  623. if (CellItemRecipeTimeManager.Instance.ContainRecipe(recipe.Ppid))
  624. {
  625. _recipeTime = _cycle * CellItemRecipeTimeManager.Instance.GetRecipeTotalTime(recipe.Ppid);
  626. }
  627. else
  628. {
  629. _recipeTime = 0;
  630. }
  631. _currentRecipe = recipe;
  632. _runRecipeStartTime = DateTime.Now;
  633. FaModuleNotifier.Instance.NotifySRDRecipeStart(Module, recipe.Ppid);
  634. }
  635. return result;
  636. }
  637. /// <summary>
  638. /// ProcessRecipe超时
  639. /// </summary>
  640. /// <param name="param"></param>
  641. /// <returns></returns>
  642. private bool ProcessRecipeTimeout(object[] param)
  643. {
  644. RState ret = _processRecipeRoutine.Monitor();
  645. if (ret == RState.Failed || ret == RState.Timeout)
  646. {
  647. PostMsg(SRDMSG.ProcessError);
  648. //记录LotTrack
  649. _runRecipeCompleteTime = DateTime.Now;
  650. _processRecipeRoutine.SRDLotTrackHeaderDatas.ProcessTime = (_runRecipeCompleteTime - _runRecipeStartTime).TotalSeconds.ToString("F2");
  651. SRDLotTrackUtil.ExportSRDLotTrack(Module.ToString(), _processRecipeRoutine.SRDLotTrackDatas,
  652. _processRecipeRoutine.SRDLotTrackHeaderDatas, IsAuto);
  653. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  654. {
  655. AlarmList alarmList = new AlarmList(Module.ToString(), ((SRDState)fsm.State).ToString(), (int)SRDMSG.ProcessRecipe,
  656. _processRecipeRoutine.ErrorMsg, _processRecipeRoutine.ErrorStep, (int)AlarmType.Error);
  657. AlarmListManager.Instance.AddAlarm(alarmList);
  658. }
  659. if (_currentRecipe != null)
  660. {
  661. FaModuleNotifier.Instance.NotifySRDRecipeFailed(Module, _currentRecipe.Ppid);
  662. }
  663. return false;
  664. }
  665. bool result = ret == RState.End;
  666. if (result)
  667. {
  668. double elapsedMilliseconds = _processRecipeRoutine.ElapsedMilliseconds;
  669. int recipeTime = (int)Math.Floor(elapsedMilliseconds / _cycle / 1000);
  670. CellItemRecipeTimeManager.Instance.UpdateRecipeTime(_currentRecipe.Ppid, recipeTime);
  671. //记录LotTrack
  672. _runRecipeCompleteTime = DateTime.Now;
  673. _processRecipeRoutine.SRDLotTrackHeaderDatas.ProcessTime = (_runRecipeCompleteTime - _runRecipeStartTime).TotalSeconds.ToString("F2");
  674. SRDLotTrackUtil.ExportSRDLotTrack(Module.ToString(), _processRecipeRoutine.SRDLotTrackDatas,
  675. _processRecipeRoutine.SRDLotTrackHeaderDatas, IsAuto);
  676. if (_currentRecipe != null)
  677. {
  678. FaModuleNotifier.Instance.NotifySRDRecipeEnd(Module, _currentRecipe.Ppid);
  679. }
  680. _currentRecipe = null;
  681. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), SRDState.ProcessReciping.ToString());
  682. }
  683. return result;
  684. }
  685. /// <summary>
  686. /// Abort Recipe
  687. /// </summary>
  688. /// <param name="param"></param>
  689. /// <returns></returns>
  690. private bool AbortProcessRecipe(object[] param)
  691. {
  692. _processRecipeRoutine.Abort();
  693. //记录LotTrack
  694. _runRecipeCompleteTime = DateTime.Now;
  695. _processRecipeRoutine.SRDLotTrackHeaderDatas.ProcessTime = (_runRecipeCompleteTime - _runRecipeStartTime).TotalSeconds.ToString("F2");
  696. SRDLotTrackUtil.ExportSRDLotTrack(Module.ToString(), _processRecipeRoutine.SRDLotTrackDatas,
  697. _processRecipeRoutine.SRDLotTrackHeaderDatas, IsAuto);
  698. return true;
  699. }
  700. /// <summary>
  701. /// 计算剩余时间
  702. /// </summary>
  703. /// <returns></returns>
  704. private double CalculateTimeRemain()
  705. {
  706. if (IsBusy)
  707. {
  708. return _recipeTime != 0 ? (_recipeTime - Math.Floor((double)_processRecipeRoutine.ElapsedMilliseconds / 1000)) : 0;
  709. }
  710. else
  711. {
  712. return 0;
  713. }
  714. }
  715. /// <summary>
  716. /// ProcessError
  717. /// </summary>
  718. /// <param name="param"></param>
  719. /// <returns></returns>
  720. private bool ProcessError(object[] param)
  721. {
  722. return _processErrorRoutine.Start(param)==RState.Running;
  723. }
  724. /// <summary>
  725. /// Process Error监控
  726. /// </summary>
  727. /// <param name="param"></param>
  728. /// <returns></returns>
  729. private bool ProcessErrorMonitor(object[] param)
  730. {
  731. RState state = _processErrorRoutine.Monitor();
  732. if (state == RState.End||state==RState.Failed||state==RState.Timeout)
  733. {
  734. return true;
  735. }
  736. return false;
  737. }
  738. private bool AbortProcessError(object[] param)
  739. {
  740. _processErrorRoutine.Abort();
  741. return false;
  742. }
  743. /// <summary>
  744. /// Retry RunRecipe
  745. /// </summary>
  746. /// <param name="param"></param>
  747. /// <returns></returns>
  748. private bool RetryRunRecipe(object[] param)
  749. {
  750. int stepIndex = (int)param[0];
  751. bool result = _processRecipeRoutine.Retry(stepIndex) == RState.Running;
  752. if (result)
  753. {
  754. if (_currentRecipe != null)
  755. {
  756. if (CellItemRecipeTimeManager.Instance.ContainRecipe(_currentRecipe.Ppid))
  757. {
  758. _recipeTime = _cycle * CellItemRecipeTimeManager.Instance.GetRecipeTotalTime(_currentRecipe.Ppid);
  759. }
  760. else
  761. {
  762. _recipeTime = 0;
  763. }
  764. _runRecipeStartTime = DateTime.Now;
  765. }
  766. }
  767. return result;
  768. }
  769. /// <summary>
  770. /// 确认ProcessRecipe是否完成
  771. /// </summary>
  772. /// <param name="param"></param>
  773. /// <returns></returns>
  774. private bool ConfirmProcessRecipe(object[] param)
  775. {
  776. int stepIdex = (int)param[0];
  777. bool result = _processRecipeRoutine.CheckCompleteCondition(stepIdex);
  778. if (!result)
  779. {
  780. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  781. {
  782. AlarmList alarmList = new AlarmList(Module.ToString(), ((SRDState)fsm.State).ToString(), (int)SRDMSG.ProcessRecipe,
  783. _processRecipeRoutine.ErrorMsg, _processRecipeRoutine.ErrorStep, (int)AlarmType.Error);
  784. AlarmListManager.Instance.AddAlarm(alarmList);
  785. }
  786. PostMsg(SRDMSG.Error);
  787. }
  788. else
  789. {
  790. if (Singleton<RouteManager>.Instance.IsAutoRunning)
  791. {
  792. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), SRDState.ProcessReciping.ToString());
  793. }
  794. }
  795. return result;
  796. }
  797. #endregion
  798. #region AWC Cycle
  799. /// <summary>
  800. /// AWC Cycle
  801. /// </summary>
  802. /// <returns></returns>
  803. private bool AWCCycle(object[] param)
  804. {
  805. return _awcCycleRoutine.Start(param) == RState.Running;
  806. }
  807. /// <summary>
  808. /// AWC Cycle超时
  809. /// </summary>
  810. /// <param name="param"></param>
  811. /// <returns></returns>
  812. private bool AWCCycleTimeout(object[] param)
  813. {
  814. RState ret = _awcCycleRoutine.Monitor();
  815. if (ret == RState.Failed || ret == RState.Timeout)
  816. {
  817. _isAWCCycling = false;
  818. PostMsg(SRDMSG.Error);
  819. return false;
  820. }
  821. //设置IsPresenceTesting
  822. if (ret == RState.Running)
  823. {
  824. _isAWCCycling = true;
  825. }
  826. else
  827. {
  828. _isAWCCycling = false;
  829. }
  830. return ret == RState.End;
  831. }
  832. /// <summary>
  833. /// Abort AWC Cycle
  834. /// </summary>
  835. /// <param name="param"></param>
  836. /// <returns></returns>
  837. private bool AbortAWCCycle(object[] param)
  838. {
  839. _awcCycleRoutine.Abort();
  840. return true;
  841. }
  842. #endregion
  843. #region InitializeHome
  844. /// <summary>
  845. /// InitializeHome
  846. /// </summary>
  847. /// <param name="param"></param>
  848. /// <returns></returns>
  849. private bool InitializeHome(object[] param)
  850. {
  851. _isHomed = false;
  852. return _initializeHomeRoutine.Start() == RState.Running;
  853. }
  854. /// <summary>
  855. /// InitializeHome超时
  856. /// </summary>
  857. /// <param name="param"></param>
  858. /// <returns></returns>
  859. private bool InitializeHomeTimeout(object[] param)
  860. {
  861. RState ret = _initializeHomeRoutine.Monitor();
  862. if (ret == RState.Failed || ret == RState.Timeout)
  863. {
  864. PostMsg(SRDMSG.Error);
  865. return false;
  866. }
  867. bool result = ret == RState.End;
  868. if (result)
  869. {
  870. _isHomed = true;
  871. }
  872. return result;
  873. }
  874. #endregion
  875. #region RunRecipeRetry
  876. /// <summary>
  877. /// Retry
  878. /// </summary>
  879. /// <param name="param"></param>
  880. /// <returns></returns>
  881. private bool SRDRetry(object[] param)
  882. {
  883. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  884. if (alarmList != null)
  885. {
  886. CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), alarmList.ModuleCmd,
  887. alarmList.ModuleStep);
  888. }
  889. return false;
  890. }
  891. #endregion
  892. #region ConfirmComplete
  893. /// <summary>
  894. /// 确认是否完成
  895. /// </summary>
  896. /// <param name="param"></param>
  897. /// <returns></returns>
  898. private bool ConfirmComplete(object[] param)
  899. {
  900. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  901. if (alarmList != null)
  902. {
  903. if (alarmList.ModuleState == SRDState.ProcessReciping.ToString())
  904. {
  905. CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.ProcessRecipe, alarmList.ModuleStep);
  906. }
  907. else
  908. {
  909. PostMsg(SRDState.Error);
  910. }
  911. }
  912. return false;
  913. }
  914. /// <summary>
  915. /// 清除报警
  916. /// </summary>
  917. /// <param name="param"></param>
  918. /// <returns></returns>
  919. private bool ClearModuleAlarm(object[] param)
  920. {
  921. AlarmList alarmList = AlarmListManager.Instance.GetAlarmListByModule(Module.ToString());
  922. if (alarmList != null)
  923. {
  924. AlarmListManager.Instance.CheckModuleAlamAndRemove(Module.ToString(), "");
  925. }
  926. return true;
  927. }
  928. #endregion
  929. #region Loader
  930. /// <summary>
  931. /// SRD Loader Wafer
  932. /// </summary>
  933. /// <param name="param"></param>
  934. /// <returns></returns>
  935. private bool LoaderWafer(object[] param)
  936. {
  937. return _loaderRoutine.Start(param) == RState.Running;
  938. }
  939. /// <summary>
  940. /// SRD Loader Wafer Monitor
  941. /// </summary>
  942. /// <param name="param"></param>
  943. /// <returns></returns>
  944. private bool LoaderWaferMonitor(object[] param)
  945. {
  946. RState state = _loaderRoutine.Monitor();
  947. if (state == RState.End || state == RState.Failed || state == RState.Timeout)
  948. {
  949. _isLoaded = state == RState.End;
  950. return true;
  951. }
  952. return false;
  953. }
  954. #endregion
  955. #region Unloader
  956. /// <summary>
  957. /// SRD Unloader Wafer
  958. /// </summary>
  959. /// <param name="param"></param>
  960. /// <returns></returns>
  961. private bool UnloaderWafer(object[] param)
  962. {
  963. return _unloaderRoutine.Start(false) == RState.Running;
  964. }
  965. /// <summary>
  966. /// SRD Unloader Wafer Monitor
  967. /// </summary>
  968. /// <param name="param"></param>
  969. /// <returns></returns>
  970. private bool UnloaderWaferMonitor(object[] param)
  971. {
  972. RState state = _unloaderRoutine.Monitor();
  973. if (state == RState.End || state == RState.Failed || state == RState.Timeout)
  974. {
  975. _isLoaded = !(state == RState.End);
  976. return true;
  977. }
  978. return false;
  979. }
  980. #endregion
  981. public bool Check(int msg, out string reason, params object[] args)
  982. {
  983. reason = "";
  984. return false;
  985. }
  986. public bool CheckAcked(int msg)
  987. {
  988. return false;
  989. }
  990. public int Invoke(string function, params object[] args)
  991. {
  992. switch (function)
  993. {
  994. case "HomeAll":
  995. if (IsIdle)
  996. {
  997. return (int)FSM_MSG.NONE;
  998. }
  999. if (CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.InitializeHome))
  1000. {
  1001. return (int)SRDMSG.Initialize;
  1002. }
  1003. else
  1004. {
  1005. return (int)FSM_MSG.NONE;
  1006. }
  1007. case "Retry":
  1008. if (CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.Retry, args))
  1009. {
  1010. return (int)SRDMSG.Retry;
  1011. }
  1012. else
  1013. {
  1014. return (int)FSM_MSG.NONE;
  1015. }
  1016. case "ConfirmComplete":
  1017. if (CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.ConfirmComplete, args))
  1018. {
  1019. return (int)SRDMSG.ConfirmComplete;
  1020. }
  1021. else
  1022. {
  1023. return (int)FSM_MSG.NONE;
  1024. }
  1025. }
  1026. return (int)FSM_MSG.NONE;
  1027. }
  1028. #region GoToPosition
  1029. /// <summary>
  1030. /// Go to Position
  1031. /// </summary>
  1032. /// <param name="param"></param>
  1033. /// <returns></returns>
  1034. private bool GotoPosition(object[] param)
  1035. {
  1036. string axis = param[0].ToString();
  1037. object[] objs = (object[])param[1];
  1038. string position = objs[1].ToString();
  1039. var result = CheckGotoPositionPreCondition(axis, position);
  1040. if (result.result)
  1041. {
  1042. return _positionRoutine.Start(result.axis, position) == RState.Running;
  1043. }
  1044. else
  1045. {
  1046. return false;
  1047. }
  1048. }
  1049. /// <summary>
  1050. /// 检验GotoPosition前置条件
  1051. /// </summary>
  1052. /// <param name="axis"></param>
  1053. /// <param name="position"></param>
  1054. /// <returns></returns>
  1055. private (bool result, JetAxisBase axis) CheckGotoPositionPreCondition(string axis, string position)
  1056. {
  1057. switch (axis)
  1058. {
  1059. case "Rotation":
  1060. return (_rotationAxis.CheckGotoPosition(position), _rotationAxis);
  1061. case "Arm":
  1062. return (_armAxis.CheckGotoPosition(position), _armAxis);
  1063. default:
  1064. return (false, null);
  1065. }
  1066. }
  1067. /// <summary>
  1068. /// GotoPosition超时
  1069. /// </summary>
  1070. /// <param name="param"></param>
  1071. /// <returns></returns>
  1072. private bool GotoPositionTimeout(object[] param)
  1073. {
  1074. RState ret = _positionRoutine.Monitor();
  1075. if (ret == RState.Failed || ret == RState.Timeout)
  1076. {
  1077. return true;
  1078. }
  1079. return ret == RState.End;
  1080. }
  1081. #endregion
  1082. #region 旋转
  1083. /// <summary>
  1084. /// 开始旋转
  1085. /// </summary>
  1086. /// <param name="param"></param>
  1087. /// <returns></returns>
  1088. private bool StartRotation(object[] param)
  1089. {
  1090. string axis = param[0].ToString();
  1091. object[] objs = (object[])param[1];
  1092. double time = double.Parse(objs[0].ToString());
  1093. double speed = double.Parse(objs[1].ToString());
  1094. return _rotationRoutine.Start(_rotationAxis, time, speed) == RState.Running;
  1095. }
  1096. /// <summary>
  1097. /// RotationTimeout
  1098. /// </summary>
  1099. /// <param name="param"></param>
  1100. /// <returns></returns>
  1101. private bool RotationTimeout(object[] param)
  1102. {
  1103. RState ret = _rotationRoutine.Monitor();
  1104. if (ret == RState.Failed || ret == RState.Timeout)
  1105. {
  1106. //PostMsg(SRDMSG.Error);
  1107. return true;
  1108. }
  1109. return ret == RState.End;
  1110. }
  1111. /// <summary>
  1112. /// 停止旋转
  1113. /// </summary>
  1114. /// <param name="param"></param>
  1115. /// <returns></returns>
  1116. private bool StopRotation(object[] param)
  1117. {
  1118. _rotationAxis.StopPositionOperation();
  1119. return _rotationAxis.Status == RState.Running;
  1120. }
  1121. /// <summary>
  1122. /// 停止旋转监控
  1123. /// </summary>
  1124. /// <param name="param"></param>
  1125. /// <returns></returns>
  1126. private bool StopRotationTimeout(object[] param)
  1127. {
  1128. RState ret = _rotationAxis.Status;
  1129. if (ret == RState.Failed || ret == RState.Timeout)
  1130. {
  1131. //PostMsg(SRDMSG.Error);
  1132. return true;
  1133. }
  1134. return ret == RState.End;
  1135. }
  1136. #endregion
  1137. #region PresenceTest
  1138. private bool PresenceTest(object[] param)
  1139. {
  1140. _recipeTime = 0;
  1141. return _presenceTestRoutine.Start(param) == RState.Running;
  1142. }
  1143. private bool PresenceTestTimeout(object[] param)
  1144. {
  1145. RState ret = _presenceTestRoutine.Monitor();
  1146. if (ret == RState.Failed || ret == RState.Timeout)
  1147. {
  1148. _isPresenceTesting = false;
  1149. PostMsg(SRDMSG.Error);
  1150. return false;
  1151. }
  1152. //设置IsPresenceTesting
  1153. if (ret == RState.Running)
  1154. {
  1155. _isPresenceTesting = true;
  1156. }
  1157. else
  1158. {
  1159. _isPresenceTesting = false;
  1160. }
  1161. return ret == RState.End;
  1162. }
  1163. /// <summary>
  1164. /// Abort PresenceTest
  1165. /// </summary>
  1166. /// <param name="param"></param>
  1167. /// <returns></returns>
  1168. private bool AbortPresenceTest(object[] param)
  1169. {
  1170. _presenceTestRoutine.Abort();
  1171. return true;
  1172. }
  1173. #endregion
  1174. /// <summary>
  1175. /// 获取当前子状态机
  1176. /// </summary>
  1177. private string GetCurrentStateMachine()
  1178. {
  1179. string state = "";
  1180. switch ((SRDState)fsm.State)
  1181. {
  1182. case SRDState.Init:
  1183. state = "Init";
  1184. break;
  1185. case SRDState.Initializing:
  1186. state = _initializeRoutine.CurrentStateMachine;
  1187. break;
  1188. case SRDState.Homing:
  1189. state = _homeRoutine.CurrentStateMachine;
  1190. break;
  1191. case SRDState.SwitchOning:
  1192. state = _switchOnRoutine.CurrentStateMachine;
  1193. break;
  1194. case SRDState.SwitchOffing:
  1195. state = _switchOffRoutine.CurrentStateMachine;
  1196. break;
  1197. case SRDState.Positioning:
  1198. state = _positionRoutine.CurrentStateMachine;
  1199. break;
  1200. case SRDState.Rotating:
  1201. state = _rotationRoutine.CurrentStateMachine;
  1202. break;
  1203. case SRDState.PresenceTesting:
  1204. state = _presenceTestRoutine.CurrentStateMachine;
  1205. break;
  1206. case SRDState.ProcessReciping:
  1207. state = _processRecipeRoutine.CurrentStateMachine;
  1208. break;
  1209. case SRDState.AWCCycling:
  1210. state = _awcCycleRoutine.CurrentStateMachine;
  1211. break;
  1212. default:
  1213. state = Enum.GetName(typeof(SRDState),fsm.State);
  1214. break;
  1215. }
  1216. return state;
  1217. }
  1218. /// <summary>
  1219. /// 设置IsAWCCycling
  1220. /// </summary>
  1221. /// <param name="flag"></param>
  1222. public void SetIsAWCCycling(bool flag)
  1223. {
  1224. _isAWCCycling = flag;
  1225. }
  1226. }
  1227. public enum SRDMSG
  1228. {
  1229. Initialize,
  1230. InitializeHome,
  1231. ProcessRecipe,
  1232. ResumeError,
  1233. SwitchOn,
  1234. SwitchOff,
  1235. HomeAll,
  1236. Error,
  1237. GoToSavedPosition,
  1238. Abort,
  1239. StartRotation,
  1240. StopRotation,
  1241. PresenceTestStart,
  1242. PresenceTestStop,
  1243. AWCCycleStart,
  1244. Init,
  1245. ProcessError,
  1246. Retry,
  1247. ConfirmComplete,
  1248. Loader,
  1249. Unloader
  1250. }
  1251. }