JetEfem.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Collections;
  7. using Venus_Core;
  8. using Venus_RT.Modules;
  9. using MECF.Framework.Common.CommonData;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using Aitex.Sorter.Common;
  13. using Aitex.Core.Common;
  14. using Aitex.Core.RT.SCCore;
  15. using Aitex.Core.RT.Log;
  16. using Aitex.Core.Util;
  17. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  18. using Venus_RT.Devices.YASKAWA;
  19. namespace Venus_RT.Devices.EFEM
  20. {
  21. class JetEfem : EfemBase
  22. {
  23. private RState _status;
  24. private bool _IsHomed;
  25. private string _waferPresence;
  26. private bool _bIsUnloadClamp;
  27. private RobotMoveInfo _robotMoveInfo = new RobotMoveInfo();
  28. private readonly Loadport[] _LPMs = new Loadport[3];
  29. private readonly SignalTower _signalT = new SignalTower();
  30. private readonly AsyncSocket _socket;
  31. private EfemMessage _currentMsg;
  32. private EfemMessage _backroundMsg;
  33. private bool _backround = false;
  34. private EfemMessage _revMsg;
  35. private bool _LiftIsUp = false;
  36. private bool _LiftIsDown = false;
  37. public override RState Status { get { return _status; } }
  38. public override bool IsHomed { get { return _IsHomed; } }
  39. public override RobotMoveInfo TMRobotMoveInfo { get { return _robotMoveInfo; } }
  40. public override ILoadport this[ModuleName mod]
  41. {
  42. get
  43. {
  44. if (!ModuleHelper.IsLoadPort(mod))
  45. throw new ApplicationException($"{mod} is NOT Loadport");
  46. return _LPMs[mod - ModuleName.LP1];
  47. }
  48. }
  49. public override bool LiftIsUp { get { return _LiftIsUp; } }
  50. public override bool LiftIsDown { get { return _LiftIsDown; } }
  51. public JetEfem()
  52. {
  53. _socket = new AsyncSocket("");
  54. _socket.Connect(SC.GetStringValue($"EFEM.IPAddress"));
  55. _socket.OnDataChanged += OnReceiveMessage;
  56. _socket.OnErrorHappened += OnErrorHappen;
  57. _status = RState.Init;
  58. _IsHomed = false;
  59. _LPMs[0] = new Loadport(ModuleName.LP1, this);
  60. _LPMs[1] = new Loadport(ModuleName.LP2, this);
  61. _LPMs[2] = new Loadport(ModuleName.LP3, this);
  62. CarrierManager.Instance.SubscribeLocation(ModuleName.LP1.ToString(), 1);
  63. CarrierManager.Instance.SubscribeLocation(ModuleName.LP2.ToString(), 1);
  64. CarrierManager.Instance.SubscribeLocation(ModuleName.LP3.ToString(), 1);
  65. Action<ModuleName, int> _subscribeLoc = (ModuleName module, int waferCount) => {
  66. if (ModuleHelper.IsInstalled(module))
  67. {
  68. WaferManager.Instance.SubscribeLocation(module, waferCount);
  69. }
  70. };
  71. WaferManager.Instance.SubscribeLocation(ModuleName.EfemRobot, 2);
  72. WaferManager.Instance.SubscribeLocation(ModuleName.Aligner1, 1);
  73. // _subscribeLoc(ModuleName.EfemRobot, 2);
  74. //_subscribeLoc(ModuleName.Aligner1, 1);
  75. _subscribeLoc(ModuleName.Aligner2, 1);
  76. _subscribeLoc(ModuleName.Cooling1, 1);
  77. _subscribeLoc(ModuleName.Cooling2, 1);
  78. _subscribeLoc(ModuleName.LP1, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
  79. _subscribeLoc(ModuleName.LP2, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
  80. _subscribeLoc(ModuleName.LP3, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
  81. }
  82. public override void Monitor()
  83. {
  84. }
  85. public override void Terminate()
  86. {
  87. }
  88. public override void Reset()
  89. {
  90. _status = RState.End;
  91. }
  92. public override void SetOnline(bool online)
  93. {
  94. }
  95. public override void SetOnline(ModuleName mod, bool online)
  96. {
  97. }
  98. public override void SetBusy(ModuleName mod, bool online)
  99. {
  100. _status = RState.Running;
  101. }
  102. public override bool HomeAll()
  103. {
  104. _currentMsg = new EfemMessage
  105. {
  106. Port = ModuleName.EFEM,
  107. Operation = EfemOperation.Home,
  108. Head = EfemMessage.MsgHead.MOV,
  109. Parameters = new List<string> { Constant.ModuleString[ModuleName.EFEM] }
  110. };
  111. _backround = false;
  112. _status = RState.Running;
  113. string data = _currentMsg.ToString();
  114. return _socket.Write(data);
  115. }
  116. public override bool Home(ModuleName mod)
  117. {
  118. if(ModuleHelper.IsLoadPort(mod))
  119. {
  120. _backroundMsg = new EfemMessage
  121. {
  122. Port = mod,
  123. Operation = EfemOperation.Home,
  124. Head = EfemMessage.MsgHead.MOV,
  125. Parameters = new List<string> { Constant.ModuleString[mod] }
  126. };
  127. _backround = true;
  128. return _socket.Write(_backroundMsg.ToString());
  129. }
  130. else
  131. {
  132. _currentMsg = new EfemMessage
  133. {
  134. Operation = EfemOperation.Home,
  135. Head = EfemMessage.MsgHead.MOV,
  136. Parameters = new List<string> { Constant.ModuleString[mod] }
  137. };
  138. _backround = false;
  139. _status = RState.Running;
  140. return _socket.Write(_currentMsg.ToString());
  141. }
  142. }
  143. public override bool OriginalSearch(ModuleName mod)
  144. {
  145. if (!CheckEfemStatus())
  146. return false;
  147. _currentMsg = new EfemMessage
  148. {
  149. Operation = EfemOperation.Orgsh,
  150. Head = EfemMessage.MsgHead.MOV,
  151. Parameters = new List<string>
  152. {
  153. Constant.ModuleString[mod]
  154. }
  155. };
  156. _backround = false;
  157. _status = RState.Running;
  158. return _socket.Write(_currentMsg.ToString());
  159. }
  160. public override bool CheckWaferPresence()
  161. {
  162. if (!CheckEfemStatus())
  163. return false;
  164. _currentMsg = new EfemMessage
  165. {
  166. Operation = EfemOperation.StateTrack,
  167. Head = EfemMessage.MsgHead.GET,
  168. Parameters = new List<string> { "TRACK" }
  169. };
  170. _backround = false;
  171. _waferPresence = string.Empty;
  172. _status = RState.Running;
  173. return _socket.Write(_currentMsg.ToString());
  174. }
  175. public override string GetWaferPresence()
  176. {
  177. return _waferPresence;
  178. }
  179. public override bool Halt()
  180. {
  181. _currentMsg = new EfemMessage
  182. {
  183. Operation = EfemOperation.EmsStop,
  184. Head = EfemMessage.MsgHead.MOV,
  185. };
  186. _backround = false;
  187. _status = RState.Running;
  188. return _socket.Write(_currentMsg.ToString());
  189. }
  190. public override bool ClearError()
  191. {
  192. if(_status == RState.Running)
  193. {
  194. LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, "EFEM is busy, please wait a minute");
  195. return false;
  196. }
  197. _backroundMsg = new EfemMessage
  198. {
  199. Operation = EfemOperation.ClearError,
  200. Head = EfemMessage.MsgHead.SET,
  201. Parameters = new List<string> { "CLEAR" }
  202. };
  203. _backround = true;
  204. _status = RState.Running;
  205. return _socket.Write(_backroundMsg.ToString());
  206. }
  207. public override bool PickExtend(ModuleName chamber, int slot, Hand hand)
  208. {
  209. if (!CheckEfemStatus())
  210. return false;
  211. _currentMsg = new EfemMessage
  212. {
  213. Operation = EfemOperation.Extend,
  214. Head = EfemMessage.MsgHead.MOV,
  215. Parameters = new List<string>
  216. {
  217. chamber.ToHWString(),
  218. ExtendPos.GB.ToString(),
  219. Constant.ArmString[hand],
  220. }
  221. };
  222. SetRobotMovingInfo(RobotAction.Extending, hand, chamber);
  223. _backround = false;
  224. _status = RState.Running;
  225. return _socket.Write(_currentMsg.ToString());
  226. }
  227. public override bool PickRetract(ModuleName chamber, int slot, Hand hand)
  228. {
  229. if (!CheckEfemStatus())
  230. return false;
  231. _currentMsg = new EfemMessage
  232. {
  233. Operation = EfemOperation.Extend,
  234. Head = EfemMessage.MsgHead.MOV,
  235. Parameters = new List<string>
  236. {
  237. chamber.ToHWString(),
  238. ExtendPos.G4.ToString(),
  239. Constant.ArmString[hand],
  240. }
  241. };
  242. _backround = false;
  243. _status = RState.Running;
  244. SetRobotMovingInfo(RobotAction.Retracting, hand, chamber);
  245. return _socket.Write(_currentMsg.ToString());
  246. }
  247. public override bool PlaceExtend(ModuleName chamber, int slot, Hand hand)
  248. {
  249. if (!CheckEfemStatus())
  250. return false;
  251. _currentMsg = new EfemMessage
  252. {
  253. Operation = EfemOperation.Extend,
  254. Head = EfemMessage.MsgHead.MOV,
  255. Parameters = new List<string>
  256. {
  257. chamber.ToHWString(),
  258. ExtendPos.PB.ToString(),
  259. Constant.ArmString[hand],
  260. }
  261. };
  262. _backround = false;
  263. _status = RState.Running;
  264. SetRobotMovingInfo(RobotAction.Extending, hand, chamber);
  265. return _socket.Write(_currentMsg.ToString());
  266. }
  267. public override bool PlaceRetract(ModuleName chamber, int slot, Hand hand)
  268. {
  269. if (!CheckEfemStatus())
  270. return false;
  271. _currentMsg = new EfemMessage
  272. {
  273. Operation = EfemOperation.Extend,
  274. Head = EfemMessage.MsgHead.MOV,
  275. Parameters = new List<string>
  276. {
  277. chamber.ToHWString(),
  278. ExtendPos.P4.ToString(),
  279. Constant.ArmString[hand],
  280. }
  281. };
  282. _backround = false;
  283. _status = RState.Running;
  284. SetRobotMovingInfo(RobotAction.Retracting, hand, chamber);
  285. return _socket.Write(_currentMsg.ToString());
  286. }
  287. public override bool Pick(ModuleName station, int slot, Hand hand)
  288. {
  289. if (!CheckEfemStatus())
  290. return false;
  291. Position SrcPos = new Position { Module= station,Slot= (byte)slot };
  292. _currentMsg = new EfemMessage
  293. {
  294. Operation = EfemOperation.Pick,
  295. Head = EfemMessage.MsgHead.MOV,
  296. Parameters = new List<string>
  297. {
  298. SrcPos.ToHWString(),
  299. Constant.ArmString[hand],
  300. //WaferSize.WS12.ToString()
  301. }
  302. };
  303. _backround = false;
  304. _status = RState.Running;
  305. SetRobotMovingInfo(RobotAction.Picking, hand, station);
  306. return _socket.Write(_currentMsg.ToString());
  307. }
  308. public override bool Place(ModuleName station, int slot, Hand hand)
  309. {
  310. if (!CheckEfemStatus())
  311. return false;
  312. Position DestPos = new Position { Module = station, Slot = (byte)slot };
  313. _currentMsg = new EfemMessage
  314. {
  315. Operation = EfemOperation.Place,
  316. Head = EfemMessage.MsgHead.MOV,
  317. Parameters = new List<string>
  318. {
  319. DestPos.ToHWString(),
  320. Constant.ArmString[hand],
  321. //WaferSize.WS12.ToString()
  322. }
  323. };
  324. _backround = false;
  325. _status = RState.Running;
  326. SetRobotMovingInfo(RobotAction.Placing, hand, station);
  327. return _socket.Write(_currentMsg.ToString());
  328. }
  329. public override bool Goto(ModuleName station, Hand hand)
  330. {
  331. if (!CheckEfemStatus())
  332. return false;
  333. Position DestPos = new Position { Module = station, Slot = (byte)0 };
  334. _currentMsg = new EfemMessage
  335. {
  336. Operation = EfemOperation.Goto,
  337. Head = EfemMessage.MsgHead.MOV,
  338. Parameters = new List<string>
  339. {
  340. DestPos.ToHWString(),
  341. Constant.ArmString[hand],
  342. WaferSize.WS12.ToString()
  343. }
  344. };
  345. _backround = false;
  346. _status = RState.Running;
  347. return _socket.Write(_currentMsg.ToString());
  348. }
  349. public override bool Grip(Hand blade, bool isGrip)
  350. {
  351. if (!CheckEfemStatus())
  352. return false;
  353. _currentMsg = new EfemMessage
  354. {
  355. Operation = EfemOperation.Grip,
  356. Head = EfemMessage.MsgHead.SET,
  357. Parameters = new List<string>
  358. {
  359. isGrip ? "ON":"OFF",
  360. Constant.ArmString[blade]
  361. }
  362. };
  363. _backround = false;
  364. _status = RState.Running;
  365. return _socket.Write(_currentMsg.ToString());
  366. }
  367. public override bool Map(ModuleName mod)
  368. {
  369. if (!CheckEfemStatus())
  370. return false;
  371. _currentMsg = new EfemMessage
  372. {
  373. Operation = EfemOperation.Map,
  374. Head = EfemMessage.MsgHead.MOV,
  375. Parameters = new List<string> { Constant.ModuleString[mod] }
  376. };
  377. _backround = false;
  378. _status = RState.Running;
  379. return _socket.Write(_currentMsg.ToString());
  380. }
  381. public override bool SetPinUp(ModuleName mod)
  382. {
  383. if (!CheckEfemStatus())
  384. return false;
  385. _currentMsg = new EfemMessage
  386. {
  387. Operation = EfemOperation.Lift,
  388. Head = EfemMessage.MsgHead.MOV,
  389. Parameters = new List<string> { Constant.ModuleString[mod], "UP" }
  390. };
  391. _backround = false;
  392. _status = RState.Running;
  393. return _socket.Write(_currentMsg.ToString());
  394. }
  395. public override bool SetPinDown(ModuleName mod)
  396. {
  397. if (!CheckEfemStatus())
  398. return false;
  399. _currentMsg = new EfemMessage
  400. {
  401. Operation = EfemOperation.Lift,
  402. Head = EfemMessage.MsgHead.MOV,
  403. Parameters = new List<string> { Constant.ModuleString[mod], "DOWN" }
  404. };
  405. _backround = false;
  406. _status = RState.Running;
  407. return _socket.Write(_currentMsg.ToString());
  408. }
  409. public override bool Align(ModuleName mod, double angle, float delayTime, WaferSize size)
  410. {
  411. if (!CheckEfemStatus())
  412. return false;
  413. _currentMsg = new EfemMessage
  414. {
  415. Operation = EfemOperation.Align,
  416. Head = EfemMessage.MsgHead.MOV,
  417. Parameters = new List<string> { $"A{angle.ToString("000.00")}" }
  418. };
  419. _backround = false;
  420. _status = RState.Running;
  421. return _socket.Write(_currentMsg.ToString());
  422. }
  423. public override bool SetLamp(LightType light, LightStatus status)
  424. {
  425. _backroundMsg = new EfemMessage
  426. {
  427. Operation = EfemOperation.Light,
  428. Head = EfemMessage.MsgHead.SET,
  429. Parameters = new List<string> { Constant.STOWER, light.ToString(), status.ToString() }
  430. };
  431. _backround = true;
  432. return _socket.Write(_backroundMsg.ToString());
  433. }
  434. public override bool Load(ModuleName mod)
  435. {
  436. _backroundMsg = new EfemMessage
  437. {
  438. Operation = EfemOperation.Load,
  439. Head = EfemMessage.MsgHead.MOV,
  440. Parameters = new List<string> { Constant.ModuleString[mod] }
  441. };
  442. _backround = true;
  443. return _socket.Write(_backroundMsg.ToString());
  444. }
  445. public override bool Unload(ModuleName mod)
  446. {
  447. _backroundMsg = new EfemMessage
  448. {
  449. Operation = EfemOperation.Unload,
  450. Head = EfemMessage.MsgHead.MOV,
  451. Parameters = new List<string> { Constant.ModuleString[mod] }
  452. };
  453. _backround = true;
  454. return _socket.Write(_backroundMsg.ToString());
  455. }
  456. public override bool ReadCarrierId(ModuleName mod)
  457. {
  458. _backroundMsg = new EfemMessage
  459. {
  460. Operation = EfemOperation.CarrierId,
  461. Head = EfemMessage.MsgHead.GET,
  462. Parameters = new List<string> { Constant.ModuleString[mod] }
  463. };
  464. _backround = true;
  465. return _socket.Write(_backroundMsg.ToString());
  466. }
  467. public override bool WriteCarrierId(ModuleName mod, string id)
  468. {
  469. _backroundMsg = new EfemMessage
  470. {
  471. Operation = EfemOperation.CarrierId,
  472. Head = EfemMessage.MsgHead.SET,
  473. Parameters = new List<string> { Constant.ModuleString[mod], id }
  474. };
  475. _backround = true;
  476. return _socket.Write(_backroundMsg.ToString());
  477. }
  478. public override bool ReadTagData(ModuleName mod)
  479. {
  480. _backroundMsg = new EfemMessage
  481. {
  482. Operation = EfemOperation.CarrierId,
  483. Head = EfemMessage.MsgHead.GET,
  484. Parameters = new List<string> { Constant.ModuleString[mod] }
  485. };
  486. _backround = true;
  487. return _socket.Write(_backroundMsg.ToString());
  488. }
  489. public override bool WriteTagData(ModuleName mod, string tagData)
  490. {
  491. _backroundMsg = new EfemMessage
  492. {
  493. Operation = EfemOperation.CarrierId,
  494. Head = EfemMessage.MsgHead.SET,
  495. Parameters = new List<string> { Constant.ModuleString[mod], tagData }
  496. };
  497. _backround = true;
  498. return _socket.Write(_backroundMsg.ToString());
  499. }
  500. public override bool Dock(ModuleName mod)
  501. {
  502. _backroundMsg = new EfemMessage
  503. {
  504. Operation = EfemOperation.Dock,
  505. Head = EfemMessage.MsgHead.MOV,
  506. Parameters = new List<string> { Constant.ModuleString[mod]}
  507. };
  508. _backround = true;
  509. return _socket.Write(_backroundMsg.ToString());
  510. }
  511. public override bool Undock(ModuleName mod)
  512. {
  513. _backroundMsg = new EfemMessage
  514. {
  515. Operation = EfemOperation.Undock,
  516. Head = EfemMessage.MsgHead.MOV,
  517. Parameters = new List<string> { Constant.ModuleString[mod]}
  518. };
  519. _backround = true;
  520. return _socket.Write(_backroundMsg.ToString());
  521. }
  522. public override bool Clamp(ModuleName mod, bool isUnloadClamp)
  523. {
  524. _backroundMsg = new EfemMessage
  525. {
  526. Operation = EfemOperation.Clamp,
  527. Head = EfemMessage.MsgHead.MOV,
  528. Parameters = new List<string> { Constant.ModuleString[mod] }
  529. };
  530. _backround = true;
  531. _bIsUnloadClamp = isUnloadClamp;
  532. return _socket.Write(_backroundMsg.ToString());
  533. }
  534. public override bool Unclamp(ModuleName mod)
  535. {
  536. _backroundMsg = new EfemMessage
  537. {
  538. Operation = EfemOperation.Unclamp,
  539. Head = EfemMessage.MsgHead.MOV,
  540. Parameters = new List<string> { Constant.ModuleString[mod] }
  541. };
  542. _backround = true;
  543. return _socket.Write(_backroundMsg.ToString());
  544. }
  545. public override bool SetThickness(ModuleName mod, string thickness)
  546. {
  547. _backroundMsg = new EfemMessage
  548. {
  549. Operation = EfemOperation.SetThickness,
  550. Head = EfemMessage.MsgHead.SET,
  551. Parameters = new List<string> { Constant.ModuleString[mod], thickness.ToUpper() }
  552. };
  553. _backround = true;
  554. return _socket.Write(_backroundMsg.ToString());
  555. }
  556. public override void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target)
  557. {
  558. _robotMoveInfo.Action = action;
  559. _robotMoveInfo.ArmTarget = hand == Hand.Blade1 ? RobotArm.ArmA : (hand == Hand.Both ? RobotArm.Both : RobotArm.ArmB);
  560. _robotMoveInfo.BladeTarget = $"{_robotMoveInfo.ArmTarget}.{target}";
  561. }
  562. private void OnReceiveMessage(string RevMsg)
  563. {
  564. string[] msgs = RevMsg.Split('\r');
  565. foreach (var msg in msgs)
  566. {
  567. if (string.IsNullOrWhiteSpace(msg)) continue;
  568. EfemMessage rec_msg = msg.ToMessage();
  569. switch (rec_msg.Head)
  570. {
  571. case EfemMessage.MsgHead.ACK:
  572. if (msg.Contains("ERROR"))
  573. {
  574. _revMsg = rec_msg;
  575. }
  576. break;
  577. case EfemMessage.MsgHead.INF:
  578. // 收到INF之后发送ACK确认
  579. string strACK = rec_msg.RawString.Replace("INF", "ACK");
  580. SendBack(strACK);
  581. EfemMessage ack_msg = strACK.ToMessage();
  582. ack_msg.Direct = MsgDirection.To;
  583. _revMsg = rec_msg;
  584. OnCommandUpdated(rec_msg);
  585. SetRobotMovingInfo(RobotAction.None, Hand.Both, ModuleName.EfemRobot);
  586. break;
  587. case EfemMessage.MsgHead.EVT:
  588. OnEventUpdated(new EfemEventArgs
  589. {
  590. EvtStr = rec_msg.ToParamString(),
  591. Module = rec_msg.Port,
  592. CommandType = rec_msg.Operation,
  593. DataList = rec_msg.Data
  594. });
  595. break;
  596. case EfemMessage.MsgHead.NAK:
  597. case EfemMessage.MsgHead.CAN:
  598. case EfemMessage.MsgHead.ABS:
  599. OnErrorOccurred(rec_msg);
  600. break;
  601. }
  602. }
  603. }
  604. private void OnErrorHappen(ErrorEventArgs args)
  605. {
  606. _status = RState.Failed;
  607. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  608. }
  609. private void OnErrorOccurred(EfemMessage message)
  610. {
  611. string description = string.Empty;
  612. switch(message.Head)
  613. {
  614. case EfemMessage.MsgHead.NAK:
  615. description = Constant.FactorString[message.Factor];
  616. break;
  617. case EfemMessage.MsgHead.CAN:
  618. description = Constant.FactorString.ContainsKey(message.Factor) ? Constant.FactorString[message.Factor] : message.Factor;
  619. break;
  620. case EfemMessage.MsgHead.ABS:
  621. description = $"{message.Data[0]}, {message.Data[1]}";
  622. break;
  623. }
  624. _status = RState.Failed;
  625. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  626. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, $"{description}, [{message.Data[0]}], [{message.Factor}]");
  627. }
  628. private void OnEventUpdated(EfemEventArgs eArg)
  629. {
  630. switch (eArg.CommandType)
  631. {
  632. case EfemOperation.SigStatus:
  633. // EVT:SIGSTAT/Parameter/DATA1/DATA2;
  634. string sParam = eArg.DataList[0]; // "SYSTEM" or "Pn"
  635. // DATA1 & DATA2
  636. int nData1 = Convert.ToInt32(eArg.DataList[1], 16);
  637. int nData2 = Convert.ToInt32(eArg.DataList[2], 16);
  638. BitArray baData1 = new BitArray(new int[] { nData1 });
  639. BitArray baData2 = new BitArray(new int[] { nData2 });
  640. if (0 == string.Compare(sParam, Constant.SYS, true))
  641. {
  642. // EVT:SIGSTAT/System/00000000/00000004;
  643. // DATA1
  644. // Post warning and alarm
  645. if (!baData1[0]) // Bit[0] ON=Normal, OFF=Abnormal
  646. {
  647. //EV.Notify(EFEMVacuumPressureError);
  648. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM System vacuum source pressure low");
  649. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  650. }
  651. if (!baData1[1]) // Bit[1] ON=Normal, OFF=Abnormal
  652. {
  653. //EV.Notify(EFEMIonizerAlarm);
  654. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Ionizer compressed air error");
  655. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  656. }
  657. if (!baData1[2]) // Bit[2] ON=Normal, OFF=Abnormal
  658. {
  659. //EV.Notify(EFEMCDAError);
  660. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM System compressed air pressure low");
  661. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  662. }
  663. if (!baData1[4]) // Bit[4] ON=Normal, OFF=Abnormal
  664. {
  665. //EV.Notify(EFEMFlowGaugeSensorError);
  666. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Flow gauge sensor error");
  667. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  668. }
  669. if (!baData1[5]) // Bit[5] ON=Normal, OFF=Abnormal
  670. {
  671. //EV.Notify(EFEMLeakageAlarm);
  672. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Leakage alarm");
  673. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  674. }
  675. if (!baData1[10]) // Bit[10] ON=Normal, OFF=Abnormal
  676. {
  677. //EV.Notify(EFEMIonizerAlarm);
  678. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Ionizer alarm");
  679. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  680. }
  681. if (!baData1[11]) // Bit[11] ON=Normal, OFF=Abnormal
  682. {
  683. //EV.Notify(EFEMFFUAlarm);
  684. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "FFU alarm");
  685. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  686. }
  687. if (!baData1[13]) // Bit[13] ON=RUN, OFF=Maintain
  688. {
  689. //EV.Notify(EFEMOffline);
  690. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM switch to Maintain mode, HomeAll to recover");
  691. }
  692. // DATA2
  693. _signalT.ChangeLightStatus(LightType.RED, baData2[0] ? LightStatus.ON : baData2[5] ? LightStatus.BLINK : LightStatus.OFF);
  694. _signalT.ChangeLightStatus(LightType.GREEN, baData2[1] ? LightStatus.ON : baData2[6] ? LightStatus.BLINK : LightStatus.OFF);
  695. _signalT.ChangeLightStatus(LightType.YELLOW, baData2[2] ? LightStatus.ON : baData2[7] ? LightStatus.BLINK : LightStatus.OFF);
  696. _signalT.ChangeLightStatus(LightType.BLUE, baData2[3] ? LightStatus.ON : baData2[8] ? LightStatus.BLINK : LightStatus.OFF);
  697. _signalT.ChangeLightStatus(LightType.WHITE, baData2[4] ? LightStatus.ON : baData2[9] ? LightStatus.BLINK : LightStatus.OFF);
  698. _signalT.ChangeLightStatus(LightType.BUZZER1, baData2[10] ? LightStatus.ON : LightStatus.OFF);
  699. /* EFEM 程序中目前没有实现
  700. _RobotErr.CLK = baData2[27]; // bit 27
  701. bool bArmNotExtendLLA = baData2[30]; // bit 30
  702. bool bArmNotExtendLLB = baData2[31]; // bit 31
  703. */
  704. } // system event
  705. else
  706. {
  707. _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  708. } // FOUP EVENT
  709. break;
  710. case EfemOperation.GetWaferInfo:
  711. _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  712. break;
  713. default:
  714. break;
  715. }
  716. }
  717. private void OnCommandUpdated(EfemMessage message)
  718. {
  719. if(message.Operation != EfemOperation.Ready)
  720. {
  721. var operation = _backround ? _backroundMsg.Operation : _currentMsg.Operation;
  722. if (operation != message.Operation)
  723. {
  724. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EfemRobot, $"OnCommandUpdated() unexpected return: {message.Operation}, expect: {operation}");
  725. return;
  726. }
  727. }
  728. switch(message.Operation)
  729. {
  730. case EfemOperation.ClearError:
  731. case EfemOperation.Align:
  732. case EfemOperation.Map:
  733. case EfemOperation.Pick:
  734. case EfemOperation.Place:
  735. case EfemOperation.Extend:
  736. case EfemOperation.Goto:
  737. case EfemOperation.Orgsh:
  738. case EfemOperation.EmsStop:
  739. _status = RState.End;
  740. break;
  741. case EfemOperation.StateTrack:
  742. {
  743. _waferPresence = message.Data.Count >= 1 ? message.Data.First() : string.Empty;
  744. _IsHomed = true;
  745. _status = RState.End;
  746. }
  747. break;
  748. case EfemOperation.Home:
  749. {
  750. if(_currentMsg.Port == ModuleName.EFEM)
  751. {
  752. _LPMs[0].OnHomed();
  753. _LPMs[1].OnHomed();
  754. _LPMs[2].OnHomed();
  755. }
  756. else if(ModuleHelper.IsLoadPort(_currentMsg.Port))
  757. {
  758. _LPMs[_currentMsg.Port - ModuleName.LP1].OnHomed();
  759. }
  760. _status = RState.End;
  761. }
  762. break;
  763. case EfemOperation.Load:
  764. {
  765. _LPMs[message.Port - ModuleName.LP1].OnLoaded();
  766. }
  767. break;
  768. case EfemOperation.Unload:
  769. {
  770. _LPMs[message.Port - ModuleName.LP1].OnUnloaded();
  771. }
  772. break;
  773. case EfemOperation.CarrierId:
  774. {
  775. if(message.Head == EfemMessage.MsgHead.GET)
  776. {
  777. _LPMs[message.Port - ModuleName.LP1].OnCarrierIDRead(message.Data.First());
  778. }
  779. else
  780. {
  781. _LPMs[message.Port - ModuleName.LP1].OnCarrierIDWrite(message.Data.First());
  782. }
  783. }
  784. break;
  785. case EfemOperation.Clamp:
  786. {
  787. _LPMs[message.Port - ModuleName.LP1].OnClamped(_bIsUnloadClamp);
  788. }
  789. break;
  790. case EfemOperation.Unclamp:
  791. {
  792. _LPMs[message.Port - ModuleName.LP1].OnUnclamped();
  793. }
  794. break;
  795. case EfemOperation.Grip:
  796. {
  797. if (_currentMsg.Parameters[1] == "ARM2")
  798. {
  799. GripStateBlade1 = _currentMsg.Parameters[0];
  800. }
  801. else
  802. {
  803. GripStateBlade2 = _currentMsg.Parameters[0];
  804. }
  805. }
  806. break;
  807. case EfemOperation.Ready:
  808. {
  809. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.CommReady);
  810. }
  811. break;
  812. case EfemOperation.Lift:
  813. {
  814. if (_currentMsg.Parameters[1] == "UP")
  815. {
  816. _LiftIsUp = true;
  817. _LiftIsDown = false;
  818. _status = RState.End;
  819. }
  820. else if (_currentMsg.Parameters[1] == "DOWN")
  821. {
  822. _LiftIsUp = false;
  823. _LiftIsDown = true;
  824. _status = RState.End;
  825. }
  826. }
  827. break;
  828. }
  829. }
  830. async void SendBack(string data)
  831. {
  832. await Task.Run(()=> _socket.Write(data + '\r'));
  833. }
  834. }
  835. }