JetEfem.cs 31 KB

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