BoatModule.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq;
  4. using Aitex.Core.Common;
  5. using Aitex.Core.RT.DataCenter;
  6. using Aitex.Core.RT.Device;
  7. using Aitex.Core.RT.Device.Unit;
  8. using Aitex.Core.RT.Event;
  9. using Aitex.Core.RT.Fsm;
  10. using Aitex.Core.RT.OperationCenter;
  11. using Aitex.Core.RT.Routine;
  12. using Aitex.Core.RT.SCCore;
  13. using Aitex.Core.Utilities;
  14. using Aitex.Sorter.Common;
  15. using MECF.Framework.Common.Alarms;
  16. using MECF.Framework.Common.Equipment;
  17. using MECF.Framework.Common.Schedulers;
  18. using MECF.Framework.Common.SubstrateTrackings;
  19. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  20. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  21. using FurnaceRT.Equipments.Systems;
  22. using static Aitex.Core.RT.Device.Unit.IoAutoShutter;
  23. using Aitex.Core.Util;
  24. using MECF.Framework.Common.Device.Bases;
  25. using Aitex.Core.RT.Log;
  26. using FurnaceRT.Devices;
  27. namespace FurnaceRT.Equipments.Boats
  28. {
  29. public partial class BoatModule : ModuleFsmDevice, IModuleDevice
  30. {
  31. public enum STATE
  32. {
  33. Init,
  34. Idle,
  35. Error,
  36. Homing,
  37. InTransfer,
  38. ZAxisMoving,
  39. ZAxisManualMoving,
  40. RAxisMoving,
  41. RAxisMovingTest,
  42. ZAxisMovingTest,
  43. MovingTest,
  44. BoatMoving,
  45. }
  46. public enum MSG
  47. {
  48. Home,
  49. Reset,
  50. Init,
  51. Error,
  52. Abort,
  53. InTransfer,
  54. TransferComplete,
  55. ZAxisManualMove,
  56. ZAxisMove,
  57. RAxisMove,
  58. RAxisMoveTest,
  59. ZAxisMoveTest,
  60. MoveTest,
  61. ZAxisManualMoveRetry,
  62. ZAxisMoveRetry,
  63. RAxisMoveRetry,
  64. BoatMove,
  65. BoatMoveRetry,
  66. }
  67. public bool IsReady
  68. {
  69. get { return FsmState == (int)STATE.Idle; }
  70. }
  71. public bool IsError
  72. {
  73. get
  74. {
  75. return FsmState == (int)STATE.Error;
  76. }
  77. }
  78. public bool IsInit
  79. {
  80. get { return FsmState == (int)STATE.Init; }
  81. }
  82. public event Action<string> OnEnterError;
  83. private bool _jobDone;
  84. private bool _isInit;
  85. private Stopwatch _timerNotifyJobDone = new Stopwatch();
  86. private BoatHome _home;
  87. private BoatZAxisMove _zAxisMove;
  88. private BoatZAxisManualMove _zAxisManualMove;
  89. private BoatRAxisMove _rAxisMove;
  90. private BoatRAxisMoveCycleTest _rAxisMoveCycleTest;
  91. private BoatZAxisMoveCycleTest _zAxisMoveCycleTest;
  92. private BoatMoveCycleTest _moveCycleTest;
  93. private BoatMove _boatMove;
  94. public bool IsExcuteRoutineFailed { get; set; }
  95. public bool IsBoatElevatorAtHomePosition => ZAxisDevice == null ? false : ZAxisDevice.CheckServoAtPosition("HomePosition") && ZAxisDevice.IsReady;
  96. public bool IsBoatRotationAtHomePosition => RAxisDevice == null ? false : RAxisDevice.IsHomeDone && RAxisDevice.IsReady;
  97. public BoatModule(ModuleName module) : base()
  98. {
  99. Name = module.ToString();
  100. Module = module.ToString();
  101. IsOnline = true;
  102. }
  103. public override bool Initialize()
  104. {
  105. InitRoutine();
  106. InitDevice();
  107. InitFsm();
  108. InitOp();
  109. InitData();
  110. InitAlarmEvent();
  111. Singleton<EventManager>.Instance.OnAlarmEvent += Instance_OnAlarmEvent;
  112. return base.Initialize();
  113. }
  114. private void Instance_OnAlarmEvent(EventItem item)
  115. {
  116. if (item != null && item.Level == EventLevel.Alarm && (item.Source == Name || item.Source == Module))
  117. {
  118. DEVICE.GetDevice<SignalTowerBase>("System.SignalTower")?.Reset();
  119. LOG.Write($"{item.Source} {item.EventEnum} {item.Description}\n");
  120. PostMsg(MSG.Error);
  121. }
  122. }
  123. private void InitRoutine()
  124. {
  125. _home = new BoatHome(this);
  126. _zAxisMove = new BoatZAxisMove(this);
  127. _zAxisManualMove = new BoatZAxisManualMove(this);
  128. _rAxisMove = new BoatRAxisMove(this);
  129. _rAxisMoveCycleTest = new BoatRAxisMoveCycleTest(this);
  130. _zAxisMoveCycleTest = new BoatZAxisMoveCycleTest(this);
  131. _moveCycleTest = new BoatMoveCycleTest(this);
  132. _boatMove = new BoatMove(this);
  133. }
  134. private void InitData()
  135. {
  136. DATA.Subscribe($"{Module}.Status", () => IsExcuteRoutineFailed ? STATE.Error.ToString() : StringFsmStatus);
  137. DATA.Subscribe($"{Module}.IsError", () => IsError);
  138. DATA.Subscribe($"{Module}.IsOnline", () => IsOnline);
  139. DATA.Subscribe($"{Module}.BoatTestCycledCount", () => _moveCycleTest.LoopCounter);
  140. }
  141. private void InitOp()
  142. {
  143. OP.Subscribe($"{Module}.Home", (string cmd, object[] args) => CheckToPostMessage((int)MSG.Home));
  144. OP.Subscribe($"{Module}.Abort", (string cmd, object[] args) => CheckToPostMessage((int)MSG.Abort));
  145. OP.Subscribe($"{Module}.Reset", (string cmd, object[] args) => CheckToPostMessage((int)MSG.Reset));
  146. OP.Subscribe($"{Module}.ZAxisMove", (string cmd, object[] args) => CheckToPostMessage((int)MSG.ZAxisMove, args));
  147. OP.Subscribe($"{Module}.ZAxisManualMove", (string cmd, object[] args) => CheckToPostMessage((int)MSG.ZAxisManualMove, args));
  148. OP.Subscribe($"{Module}.RAxisMove", (string cmd, object[] args) => CheckToPostMessage((int)MSG.RAxisMove, args));
  149. OP.Subscribe($"{Module}.RAxisMovingTest", (string cmd, object[] args) => CheckToPostMessage((int)MSG.RAxisMoveTest, args));
  150. OP.Subscribe($"{Module}.ZAxisMovingTest", (string cmd, object[] args) => CheckToPostMessage((int)MSG.ZAxisMoveTest, args));
  151. OP.Subscribe($"{Module}.MovingTest", (string cmd, object[] args) => CheckToPostMessage((int)MSG.MoveTest, args));
  152. OP.Subscribe($"{Name}.SetBoatZAxisSpeed", SetBoatZAxisSpeed);
  153. OP.Subscribe($"{Name}.SetBoatRAxisSpeed", SetBoatRAxisSpeed);
  154. OP.Subscribe($"{Name}.SetBoatRAxisAngle", SetBoatRAxisAngle);
  155. OP.Subscribe($"{Name}.BoatZAxisStop", SetBoatZAxisStop);
  156. OP.Subscribe($"{Name}.BoatRAxisStop", SetBoatRAxisStop);
  157. OP.Subscribe($"{Module}.AlarmAction", (string cmd, object[] args) =>
  158. {
  159. Enum.TryParse(args[0].ToString(), out AlarmAction alarmAction);
  160. string eventName = null;
  161. if (args.Length > 1)
  162. eventName = args[1].ToString();
  163. if (eventName != null)
  164. {
  165. EV.ClearAlarmEvent(eventName);
  166. var item = _triggeredAlarmList.FirstOrDefault(x => x.EventEnum == eventName);
  167. if (item != null)
  168. {
  169. item.Reset();
  170. _triggeredAlarmList.Remove(item);
  171. }
  172. if (item != null)
  173. {
  174. switch (alarmAction)
  175. {
  176. case AlarmAction.Retry:
  177. {
  178. CheckToPostMessage((int)item.RetryMessage, item.RetryMessageParas);
  179. }
  180. break;
  181. case AlarmAction.Abort:
  182. {
  183. CheckToPostMessage((int)MSG.Abort);
  184. }
  185. break;
  186. case AlarmAction.Clear:
  187. {
  188. int alarmCount = 0;
  189. var alarms = EV.GetAlarmEvent();
  190. foreach (var alarm in alarms)
  191. {
  192. if (alarm.Level == EventLevel.Alarm && alarm.Source == Name)
  193. alarmCount++;
  194. }
  195. if (alarmCount == 0)
  196. CheckToPostMessage((int)MSG.Reset);
  197. }
  198. break;
  199. case AlarmAction.Continue:
  200. {
  201. int alarmCount = 0;
  202. var alarms = EV.GetAlarmEvent();
  203. foreach (var alarm in alarms)
  204. {
  205. if (alarm.Level == EventLevel.Alarm && alarm.Source == Name)
  206. alarmCount++;
  207. }
  208. if (alarmCount == 0)
  209. CheckToPostMessage((int)MSG.Reset);
  210. }
  211. break;
  212. }
  213. }
  214. }
  215. return true;
  216. });
  217. }
  218. private void InitFsm()
  219. {
  220. EnumLoop<STATE>.ForEach((item) =>
  221. {
  222. MapState((int)item, item.ToString());
  223. });
  224. EnumLoop<MSG>.ForEach((item) =>
  225. {
  226. MapMessage((int)item, item.ToString());
  227. });
  228. EnableFsm(100, STATE.Idle);
  229. //Init
  230. Transition(STATE.Init, MSG.Home, FsmStartHome, STATE.Homing);
  231. Transition(STATE.Error, MSG.Home, FsmStartHome, STATE.Homing);
  232. Transition(STATE.Idle, MSG.Home, FsmStartHome, STATE.Homing);
  233. Transition(STATE.Homing, FSM_MSG.TIMER, FsmMonitorHomeTask, STATE.Idle);
  234. Transition(STATE.Homing, MSG.Error, null, STATE.Init);
  235. Transition(STATE.Homing, MSG.Abort, FsmAbortTask, STATE.Init);
  236. EnterExitTransition<STATE, FSM_MSG>(STATE.Idle, FsmEnterIdle, FSM_MSG.NONE, FsmExitIdle);
  237. Transition(STATE.Idle, MSG.Abort, null, STATE.Idle);
  238. Transition(STATE.Idle, MSG.Reset, null, STATE.Idle);
  239. Transition(STATE.Init, MSG.Reset, null, STATE.Init);
  240. Transition(STATE.Error, MSG.Abort, null, STATE.Error);
  241. //Error
  242. AnyStateTransition(MSG.Error, FsmOnError, STATE.Error);
  243. Transition(STATE.Error, MSG.Reset, FsmReset, STATE.Idle);
  244. EnterExitTransition<STATE, FSM_MSG>(STATE.Error, FsmEnterError, FSM_MSG.NONE, FsmExitError);
  245. //ZAxisMove,open shutter
  246. Transition(STATE.Error, MSG.ZAxisMoveRetry, FsmStartZAxisMove, STATE.ZAxisMoving);
  247. Transition(STATE.Idle, MSG.ZAxisMove, FsmStartZAxisMove, STATE.ZAxisMoving);
  248. Transition(STATE.ZAxisMoving, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
  249. Transition(STATE.ZAxisMoving, MSG.Abort, FsmAbortTask, STATE.Idle);
  250. //ZAxisManualMove,not open shutter
  251. Transition(STATE.Error, MSG.ZAxisManualMoveRetry, FsmStartZAxisManualMove, STATE.ZAxisManualMoving);
  252. Transition(STATE.Idle, MSG.ZAxisManualMove, FsmStartZAxisManualMove, STATE.ZAxisManualMoving);
  253. Transition(STATE.ZAxisManualMoving, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
  254. Transition(STATE.ZAxisManualMoving, MSG.Abort, FsmAbortTask, STATE.Idle);
  255. //RAxisMove
  256. Transition(STATE.Error, MSG.RAxisMoveRetry, FsmStartRAxisMove, STATE.RAxisMoving);
  257. Transition(STATE.Idle, MSG.RAxisMove, FsmStartRAxisMove, STATE.RAxisMoving);
  258. Transition(STATE.RAxisMoving, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
  259. Transition(STATE.RAxisMoving, MSG.Abort, FsmAbortTask, STATE.Idle);
  260. //RAxisMoveCycleTest
  261. Transition(STATE.Idle, MSG.RAxisMoveTest, FsmStartRAxisMoveTest, STATE.RAxisMovingTest);
  262. Transition(STATE.RAxisMovingTest, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
  263. Transition(STATE.RAxisMovingTest, MSG.Abort, FsmAbortTask, STATE.Idle);
  264. //ZAxisMoveCycleTest
  265. Transition(STATE.Idle, MSG.ZAxisMoveTest, FsmStartZAxisMoveTest, STATE.ZAxisMovingTest);
  266. Transition(STATE.ZAxisMovingTest, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
  267. Transition(STATE.ZAxisMovingTest, MSG.Abort, FsmAbortTask, STATE.Idle);
  268. //MoveCycleTest
  269. Transition(STATE.Idle, MSG.MoveTest, FsmStartMoveTest, STATE.MovingTest);
  270. Transition(STATE.MovingTest, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
  271. Transition(STATE.MovingTest, MSG.Abort, FsmAbortTask, STATE.Idle);
  272. //BoatMove
  273. Transition(STATE.Error, MSG.BoatMoveRetry, FsmStartBoatMove, STATE.BoatMoving);
  274. Transition(STATE.Idle, MSG.BoatMove, FsmStartBoatMove, STATE.BoatMoving);
  275. Transition(STATE.BoatMoving, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
  276. Transition(STATE.BoatMoving, MSG.Abort, FsmAbortTask, STATE.Idle);
  277. Transition(STATE.Idle, MSG.InTransfer, null, STATE.InTransfer);
  278. Transition(STATE.InTransfer, MSG.InTransfer, null, STATE.InTransfer);
  279. Transition(STATE.InTransfer, MSG.TransferComplete, null, STATE.Idle);
  280. Transition(STATE.InTransfer, MSG.Abort, null, STATE.Idle);
  281. }
  282. public bool Home(out string reason)
  283. {
  284. if (!CheckToPostMessage((int)MSG.Home))
  285. {
  286. reason = $"Can not home in {StringFsmStatus} status";
  287. return false;
  288. }
  289. reason = string.Empty;
  290. return true;
  291. }
  292. public void NoteJobStart()
  293. {
  294. _jobDone = false;
  295. }
  296. public void NoteJobComplete()
  297. {
  298. _timerNotifyJobDone.Restart();
  299. _jobDone = true;
  300. }
  301. public override void Monitor()
  302. {
  303. base.Monitor();
  304. }
  305. public override void Reset()
  306. {
  307. if (IsError)
  308. {
  309. CheckToPostMessage((int)MSG.Reset);
  310. }
  311. }
  312. private bool FsmReset(object[] param)
  313. {
  314. return true;
  315. }
  316. private bool FsmOnError(object[] param)
  317. {
  318. if (FsmState == (int)STATE.Error)
  319. {
  320. return false;
  321. }
  322. AbortRoutine();
  323. if (FsmState == (int)STATE.Init)
  324. return false;
  325. return true;
  326. }
  327. private bool FsmExitIdle(object[] param)
  328. {
  329. return true;
  330. }
  331. private bool FsmEnterIdle(object[] param)
  332. {
  333. return true;
  334. }
  335. private bool FsmExitError(object[] param)
  336. {
  337. return true;
  338. }
  339. private bool FsmEnterError(object[] param)
  340. {
  341. if (OnEnterError != null)
  342. OnEnterError(Module);
  343. return true;
  344. }
  345. private bool FsmAbortTask(object[] param)
  346. {
  347. AbortRoutine();
  348. return true;
  349. }
  350. private bool FsmToInit(object[] param)
  351. {
  352. return true;
  353. }
  354. private bool FsmToIdle(object[] param)
  355. {
  356. return true;
  357. }
  358. private bool FsmStartHome(object[] param)
  359. {
  360. Result ret = StartRoutine(_home);
  361. if (ret == Result.FAIL || ret == Result.DONE)
  362. return false;
  363. _isInit = false;
  364. return ret == Result.RUN;
  365. }
  366. private bool FsmStartZAxisMove(object[] param)
  367. {
  368. _zAxisMove.Init(param[0].ToString(), param[1].ToString());
  369. Result ret = StartRoutine(_zAxisMove);
  370. if (ret == Result.FAIL || ret == Result.DONE)
  371. return false;
  372. return ret == Result.RUN;
  373. }
  374. private bool FsmStartZAxisManualMove(object[] param)
  375. {
  376. _zAxisManualMove.Init(param[0].ToString(), param.Length > 1 ? param[1].ToString() : "0");
  377. Result ret = StartRoutine(_zAxisManualMove);
  378. if (ret == Result.FAIL || ret == Result.DONE)
  379. return false;
  380. return ret == Result.RUN;
  381. }
  382. private bool FsmStartRAxisMove(object[] param)
  383. {
  384. _rAxisMove.Init(param[0].ToString(), param.Length > 1 ? param[1].ToString() : "0", param.Length > 2 ? param[2].ToString() : "0");
  385. Result ret = StartRoutine(_rAxisMove);
  386. if (ret == Result.FAIL || ret == Result.DONE)
  387. return false;
  388. return ret == Result.RUN;
  389. }
  390. private bool FsmStartMoveTest(object[] param)
  391. {
  392. _moveCycleTest.Init(param[0].ToString(), param[1].ToString(), param[2].ToString());
  393. Result ret = StartRoutine(_moveCycleTest);
  394. if (ret == Result.FAIL || ret == Result.DONE)
  395. return false;
  396. return ret == Result.RUN;
  397. }
  398. private bool FsmStartRAxisMoveTest(object[] param)
  399. {
  400. _rAxisMoveCycleTest.Init(param[0].ToString());
  401. Result ret = StartRoutine(_rAxisMoveCycleTest);
  402. if (ret == Result.FAIL || ret == Result.DONE)
  403. return false;
  404. return ret == Result.RUN;
  405. }
  406. private bool FsmStartZAxisMoveTest(object[] param)
  407. {
  408. _zAxisMoveCycleTest.Init(param[0].ToString(), param[1].ToString());
  409. Result ret = StartRoutine(_zAxisMoveCycleTest);
  410. if (ret == Result.FAIL || ret == Result.DONE)
  411. return false;
  412. return ret == Result.RUN;
  413. }
  414. private bool FsmStartBoatMove(object[] param)
  415. {
  416. _boatMove.Init(param[0].ToString(), param[1].ToString(), param[2].ToString());
  417. Result ret = StartRoutine(_boatMove);
  418. if (ret == Result.FAIL || ret == Result.DONE)
  419. return false;
  420. return ret == Result.RUN;
  421. }
  422. private bool FsmMonitorHomeTask(object[] param)
  423. {
  424. Result ret = MonitorRoutine();
  425. if (ret == Result.FAIL)
  426. {
  427. PostMsg(MSG.Error);
  428. return false;
  429. }
  430. if (ret == Result.DONE)
  431. {
  432. _isInit = true;
  433. return true;
  434. }
  435. return false;
  436. }
  437. private bool FsmMonitorTask(object[] param)
  438. {
  439. Result ret = MonitorRoutine();
  440. if (ret == Result.FAIL)
  441. {
  442. PostMsg(MSG.Error);
  443. return false;
  444. }
  445. return ret == Result.DONE;
  446. }
  447. public bool CheckPrepareMove(out string reason, bool isNeedCheckShutter = true)
  448. {
  449. reason = string.Empty;
  450. //if (!SensorPS13LStatus.Value)
  451. //{
  452. // reason = "PS13 not true, tube not ATM";
  453. // return false;
  454. //}
  455. if (!SensorVAC1.Value)
  456. {
  457. reason = "VAC1 not true";
  458. return false;
  459. }
  460. if (!SensorVAC2.Value)
  461. {
  462. reason = "VAC2 not true";
  463. return false;
  464. }
  465. if (!SensorVAC3.Value)
  466. {
  467. reason = "VAC3 not true";
  468. return false;
  469. }
  470. if (!SensorBoatUnloadInterlock.Value)
  471. {
  472. reason = "boat unload interlock is not OK, please check VAC1,VAV2,VAC3,PS13 status";
  473. return false;
  474. }
  475. if (isNeedCheckShutter && ShutterDevice.OpenCloseStatus != DeviceStatus.Open)
  476. {
  477. reason = "shutter not open";
  478. return false;
  479. }
  480. return true;
  481. }
  482. public void NoteTransferStart()
  483. {
  484. CheckToPostMessage((int)MSG.InTransfer);
  485. }
  486. public void NoteTransferStop()
  487. {
  488. if (FsmState == (int)STATE.InTransfer)
  489. CheckToPostMessage((int)MSG.TransferComplete);
  490. }
  491. public void ZAxisMove(string position, string speed)
  492. {
  493. CheckToPostMessage((int)MSG.ZAxisMove, position, speed);
  494. }
  495. public void BoatMove(string command, string targetPosition, float speed)
  496. {
  497. CheckToPostMessage((int)MSG.BoatMove, command, targetPosition, speed);
  498. }
  499. }
  500. }