JetEfem.cs 36 KB

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