JetEfem.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  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 Aitex.Sorter.Common;
  12. using Aitex.Core.Common;
  13. using Aitex.Core.RT.SCCore;
  14. using Aitex.Core.RT.Log;
  15. using Aitex.Core.Util;
  16. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  17. using Venus_RT.Devices.YASKAWA;
  18. namespace Venus_RT.Devices.EFEM
  19. {
  20. class JetEfem :EfemBase
  21. {
  22. private RState _status;
  23. private bool _IsHomed;
  24. private RobotMoveInfo _robotMoveInfo = new RobotMoveInfo();
  25. private readonly Loadport[] _LPMs = new Loadport[2];
  26. private readonly SignalTower _signalT = new SignalTower();
  27. private readonly AsyncSocket _socket;
  28. private EfemMessage _currentMsg;
  29. private EfemMessage _revMsg;
  30. public override RState Status { get { return _status; } }
  31. public override bool IsHomed { get { return _IsHomed; } }
  32. public override RobotMoveInfo TMRobotMoveInfo { get { return _robotMoveInfo; } }
  33. public override ILoadport this[ModuleName mod]
  34. {
  35. get
  36. {
  37. if (!ModuleHelper.IsLoadPort(mod))
  38. throw new ApplicationException($"{mod} is NOT Loadport");
  39. return _LPMs[mod - ModuleName.LP1];
  40. }
  41. }
  42. public JetEfem()
  43. {
  44. _socket = new AsyncSocket("");
  45. _socket.Connect(SC.GetStringValue($"EFEM.IPAddress"));
  46. _socket.OnDataChanged += OnReceiveMessage;
  47. _socket.OnErrorHappened += OnErrorHappen;
  48. _status = RState.Init;
  49. _IsHomed = false;
  50. }
  51. public override void Monitor()
  52. {
  53. }
  54. public override void Terminate()
  55. {
  56. }
  57. public override void Reset()
  58. {
  59. }
  60. public override void SetOnline(bool online)
  61. {
  62. }
  63. public override void SetOnline(ModuleName mod, bool online)
  64. {
  65. }
  66. public override void SetBusy(ModuleName mod, bool online)
  67. {
  68. }
  69. public override bool HomeAll()
  70. {
  71. if (!CheckEfemStatus())
  72. return false;
  73. _currentMsg = new EfemMessage
  74. {
  75. Operation = EfemOperation.Home,
  76. Head = EfemMessage.MsgHead.MOV,
  77. Parameters = new List<string> { Constant.ModuleString[ModuleName.EFEM] }
  78. };
  79. _status = RState.Running;
  80. return _socket.Write(_currentMsg.ToString());
  81. }
  82. public override bool Home(ModuleName mod)
  83. {
  84. if (!CheckEfemStatus())
  85. return false;
  86. _currentMsg = new EfemMessage
  87. {
  88. Operation = EfemOperation.Home,
  89. Head = EfemMessage.MsgHead.MOV,
  90. Parameters = new List<string> { Constant.ModuleString[mod] }
  91. };
  92. _status = RState.Running;
  93. return _socket.Write(_currentMsg.ToString());
  94. }
  95. public override bool Halt()
  96. {
  97. return true;
  98. }
  99. public override bool ClearError()
  100. {
  101. if (!CheckEfemStatus())
  102. return false;
  103. _currentMsg = new EfemMessage
  104. {
  105. Operation = EfemOperation.ClearError,
  106. Head = EfemMessage.MsgHead.SET,
  107. Parameters = new List<string> { "CLEAR" }
  108. };
  109. _status = RState.Running;
  110. return _socket.Write(_currentMsg.ToString());
  111. }
  112. public override bool PickExtend(ModuleName chamber, int slot, Hand hand)
  113. {
  114. if (!CheckEfemStatus())
  115. return false;
  116. _currentMsg = new EfemMessage
  117. {
  118. Operation = EfemOperation.Extend,
  119. Head = EfemMessage.MsgHead.MOV,
  120. Parameters = new List<string>
  121. {
  122. chamber.ToHWString(),
  123. ExtendPos.GB.ToString(),
  124. Constant.ArmString[hand],
  125. }
  126. };
  127. _status = RState.Running;
  128. return _socket.Write(_currentMsg.ToString());
  129. }
  130. public override bool PickRetract(ModuleName chamber, int slot, Hand hand)
  131. {
  132. if (!CheckEfemStatus())
  133. return false;
  134. _currentMsg = new EfemMessage
  135. {
  136. Operation = EfemOperation.Extend,
  137. Head = EfemMessage.MsgHead.MOV,
  138. Parameters = new List<string>
  139. {
  140. chamber.ToHWString(),
  141. ExtendPos.G4.ToString(),
  142. Constant.ArmString[hand],
  143. }
  144. };
  145. _status = RState.Running;
  146. return _socket.Write(_currentMsg.ToString());
  147. }
  148. public override bool PlaceExtend(ModuleName chamber, int slot, Hand hand)
  149. {
  150. if (!CheckEfemStatus())
  151. return false;
  152. _currentMsg = new EfemMessage
  153. {
  154. Operation = EfemOperation.Extend,
  155. Head = EfemMessage.MsgHead.MOV,
  156. Parameters = new List<string>
  157. {
  158. chamber.ToHWString(),
  159. ExtendPos.PB.ToString(),
  160. Constant.ArmString[hand],
  161. }
  162. };
  163. _status = RState.Running;
  164. return _socket.Write(_currentMsg.ToString());
  165. }
  166. public override bool PlaceRetract(ModuleName chamber, int slot, Hand hand)
  167. {
  168. if (!CheckEfemStatus())
  169. return false;
  170. _currentMsg = new EfemMessage
  171. {
  172. Operation = EfemOperation.Extend,
  173. Head = EfemMessage.MsgHead.MOV,
  174. Parameters = new List<string>
  175. {
  176. chamber.ToHWString(),
  177. ExtendPos.P4.ToString(),
  178. Constant.ArmString[hand],
  179. }
  180. };
  181. _status = RState.Running;
  182. return _socket.Write(_currentMsg.ToString());
  183. }
  184. public override bool Pick(ModuleName station, int slot, Hand hand)
  185. {
  186. if (!CheckEfemStatus())
  187. return false;
  188. Position SrcPos = new Position { Module= station,Slot= (byte)slot };
  189. _currentMsg = new EfemMessage
  190. {
  191. Operation = EfemOperation.Pick,
  192. Head = EfemMessage.MsgHead.MOV,
  193. Parameters = new List<string>
  194. {
  195. SrcPos.ToHWString(),
  196. Constant.ArmString[hand],
  197. WaferSize.WS12.ToString()
  198. }
  199. };
  200. _status = RState.Running;
  201. return _socket.Write(_currentMsg.ToString());
  202. }
  203. public override bool Place(ModuleName station, int slot, Hand hand)
  204. {
  205. if (!CheckEfemStatus())
  206. return false;
  207. Position DestPos = new Position { Module = station, Slot = (byte)slot };
  208. _currentMsg = new EfemMessage
  209. {
  210. Operation = EfemOperation.Place,
  211. Head = EfemMessage.MsgHead.MOV,
  212. Parameters = new List<string>
  213. {
  214. DestPos.ToHWString(),
  215. Constant.ArmString[hand],
  216. WaferSize.WS12.ToString()
  217. }
  218. };
  219. _status = RState.Running;
  220. return _socket.Write(_currentMsg.ToString());
  221. }
  222. public override bool Goto(ModuleName station, Hand hand)
  223. {
  224. if (!CheckEfemStatus())
  225. return false;
  226. Position DestPos = new Position { Module = station, Slot = (byte)0 };
  227. _currentMsg = new EfemMessage
  228. {
  229. Operation = EfemOperation.Goto,
  230. Head = EfemMessage.MsgHead.MOV,
  231. Parameters = new List<string>
  232. {
  233. DestPos.ToHWString(),
  234. Constant.ArmString[hand],
  235. WaferSize.WS12.ToString()
  236. }
  237. };
  238. _status = RState.Running;
  239. return _socket.Write(_currentMsg.ToString());
  240. }
  241. public override bool Grip(Hand blade, bool isGrip)
  242. {
  243. return true;
  244. }
  245. public override bool Map(ModuleName mod)
  246. {
  247. if (!CheckEfemStatus())
  248. return false;
  249. _currentMsg = new EfemMessage
  250. {
  251. Operation = EfemOperation.Map,
  252. Head = EfemMessage.MsgHead.MOV,
  253. Parameters = new List<string> { Constant.ModuleString[mod] }
  254. };
  255. _status = RState.Running;
  256. return _socket.Write(_currentMsg.ToString());
  257. }
  258. public override bool SetPinUp(ModuleName mod)
  259. {
  260. if (!CheckEfemStatus())
  261. return false;
  262. _currentMsg = new EfemMessage
  263. {
  264. Operation = EfemOperation.Lift,
  265. Head = EfemMessage.MsgHead.MOV,
  266. Parameters = new List<string> { Constant.ModuleString[mod], "UP" }
  267. };
  268. _status = RState.Running;
  269. return _socket.Write(_currentMsg.ToString());
  270. }
  271. public override bool SetPinDown(ModuleName mod)
  272. {
  273. if (!CheckEfemStatus())
  274. return false;
  275. _currentMsg = new EfemMessage
  276. {
  277. Operation = EfemOperation.Lift,
  278. Head = EfemMessage.MsgHead.MOV,
  279. Parameters = new List<string> { Constant.ModuleString[mod], "DOWN" }
  280. };
  281. _status = RState.Running;
  282. return _socket.Write(_currentMsg.ToString());
  283. }
  284. public override bool Align(ModuleName mod, float delayTime, WaferSize size)
  285. {
  286. return true;
  287. }
  288. public override bool SetLamp(LightType light, LightStatus status)
  289. {
  290. return true;
  291. }
  292. public override bool Load(ModuleName mod)
  293. {
  294. return true;
  295. }
  296. public override bool Unload(ModuleName mod)
  297. {
  298. return true;
  299. }
  300. public override bool ReadCarrierId(ModuleName mod)
  301. {
  302. return true;
  303. }
  304. public override bool WriteCarrierId(ModuleName mod, string id)
  305. {
  306. return true;
  307. }
  308. public override bool ReadTagData(ModuleName mod)
  309. {
  310. return true;
  311. }
  312. public override bool WriteTagData(ModuleName mod, string tagData)
  313. {
  314. return true;
  315. }
  316. public override bool Dock(ModuleName mod)
  317. {
  318. return true;
  319. }
  320. public override bool Undock(ModuleName mod)
  321. {
  322. return true;
  323. }
  324. public override bool Clamp(ModuleName mod, bool isUnloadClamp)
  325. {
  326. return true;
  327. }
  328. public override bool Unclamp(ModuleName mod)
  329. {
  330. return true;
  331. }
  332. public override bool SetThick(ModuleName mod)
  333. {
  334. return true;
  335. }
  336. public override bool SetThin(ModuleName mod)
  337. {
  338. return true;
  339. }
  340. public override void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target)
  341. {
  342. }
  343. private void OnReceiveMessage(string RevMsg)
  344. {
  345. string[] msgs = RevMsg.Split('\r');
  346. foreach (var msg in msgs)
  347. {
  348. if (string.IsNullOrWhiteSpace(msg)) continue;
  349. EfemMessage rec_msg = msg.ToMessage();
  350. switch (rec_msg.Head)
  351. {
  352. case EfemMessage.MsgHead.ACK:
  353. _revMsg = rec_msg;
  354. break;
  355. case EfemMessage.MsgHead.INF:
  356. // 收到INF之后发送ACK确认
  357. string strACK = rec_msg.RawString.Replace("INF", "ACK");
  358. _socket.Write(strACK);
  359. EfemMessage ack_msg = strACK.ToMessage();
  360. ack_msg.Direct = MsgDirection.To;
  361. _revMsg = rec_msg;
  362. OnCommandUpdated(rec_msg);
  363. break;
  364. case EfemMessage.MsgHead.EVT:
  365. OnEventUpdated(new EfemEventArgs
  366. {
  367. EvtStr = rec_msg.ToParamString(),
  368. Module = rec_msg.Port,
  369. CommandType = rec_msg.Operation,
  370. DataList = rec_msg.Data
  371. });
  372. break;
  373. case EfemMessage.MsgHead.NAK:
  374. case EfemMessage.MsgHead.CAN:
  375. case EfemMessage.MsgHead.ABS:
  376. OnErrorOccurred(rec_msg);
  377. break;
  378. }
  379. }
  380. }
  381. private void OnErrorHappen(ErrorEventArgs args)
  382. {
  383. }
  384. private void OnErrorOccurred(EfemMessage message)
  385. {
  386. string description = string.Empty;
  387. switch(message.Head)
  388. {
  389. case EfemMessage.MsgHead.NAK:
  390. description = Constant.FactorString[message.Factor];
  391. break;
  392. case EfemMessage.MsgHead.CAN:
  393. description = Constant.FactorString.ContainsKey(message.Factor) ? Constant.FactorString[message.Factor] : message.Factor;
  394. break;
  395. case EfemMessage.MsgHead.ABS:
  396. description = $"{message.Data[0]}, {message.Data[1]}";
  397. break;
  398. }
  399. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, $"{description}, [{message.Data[0]}], [{message.Factor}]");
  400. }
  401. private void OnEventUpdated(EfemEventArgs eArg)
  402. {
  403. switch (eArg.CommandType)
  404. {
  405. case EfemOperation.SigStatus:
  406. // EVT:SIGSTAT/Parameter/DATA1/DATA2;
  407. string sParam = eArg.DataList[0]; // "SYSTEM" or "Pn"
  408. // DATA1 & DATA2
  409. int nData1 = Convert.ToInt32(eArg.DataList[1], 16);
  410. int nData2 = Convert.ToInt32(eArg.DataList[2], 16);
  411. BitArray baData1 = new BitArray(new int[] { nData1 });
  412. BitArray baData2 = new BitArray(new int[] { nData2 });
  413. if (0 == string.Compare(sParam, Constant.SYS, true))
  414. {
  415. // EVT:SIGSTAT/System/00000000/00000004;
  416. // DATA1
  417. // Post warning and alarm
  418. if (!baData1[0]) // Bit[0] ON=Normal, OFF=Abnormal
  419. {
  420. //EV.Notify(EFEMVacuumPressureError);
  421. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM System vacuum source pressure low");
  422. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  423. }
  424. if (!baData1[1]) // Bit[1] ON=Normal, OFF=Abnormal
  425. {
  426. //EV.Notify(EFEMIonizerAlarm);
  427. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Ionizer compressed air error");
  428. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  429. }
  430. if (!baData1[2]) // Bit[2] ON=Normal, OFF=Abnormal
  431. {
  432. //EV.Notify(EFEMCDAError);
  433. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM System compressed air pressure low");
  434. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  435. }
  436. if (!baData1[4]) // Bit[4] ON=Normal, OFF=Abnormal
  437. {
  438. //EV.Notify(EFEMFlowGaugeSensorError);
  439. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Flow gauge sensor error");
  440. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  441. }
  442. if (!baData1[5]) // Bit[5] ON=Normal, OFF=Abnormal
  443. {
  444. //EV.Notify(EFEMLeakageAlarm);
  445. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Leakage alarm");
  446. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  447. }
  448. if (!baData1[10]) // Bit[10] ON=Normal, OFF=Abnormal
  449. {
  450. //EV.Notify(EFEMIonizerAlarm);
  451. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM Ionizer alarm");
  452. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  453. }
  454. if (!baData1[11]) // Bit[11] ON=Normal, OFF=Abnormal
  455. {
  456. //EV.Notify(EFEMFFUAlarm);
  457. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "FFU alarm");
  458. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  459. }
  460. if (!baData1[13]) // Bit[13] ON=RUN, OFF=Maintain
  461. {
  462. //EV.Notify(EFEMOffline);
  463. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "EFEM switch to Maintain mode, HomeAll to recover");
  464. }
  465. // DATA2
  466. _signalT.ChangeLightStatus(LightType.RED, baData2[0] ? LightStatus.ON : baData2[5] ? LightStatus.BLINK : LightStatus.OFF);
  467. _signalT.ChangeLightStatus(LightType.GREEN, baData2[1] ? LightStatus.ON : baData2[6] ? LightStatus.BLINK : LightStatus.OFF);
  468. _signalT.ChangeLightStatus(LightType.YELLOW, baData2[2] ? LightStatus.ON : baData2[7] ? LightStatus.BLINK : LightStatus.OFF);
  469. _signalT.ChangeLightStatus(LightType.BLUE, baData2[3] ? LightStatus.ON : baData2[8] ? LightStatus.BLINK : LightStatus.OFF);
  470. _signalT.ChangeLightStatus(LightType.WHITE, baData2[4] ? LightStatus.ON : baData2[9] ? LightStatus.BLINK : LightStatus.OFF);
  471. _signalT.ChangeLightStatus(LightType.BUZZER1, baData2[10] ? LightStatus.ON : LightStatus.OFF);
  472. /* EFEM 程序中目前没有实现
  473. _RobotErr.CLK = baData2[27]; // bit 27
  474. bool bArmNotExtendLLA = baData2[30]; // bit 30
  475. bool bArmNotExtendLLB = baData2[31]; // bit 31
  476. */
  477. } // system event
  478. else
  479. {
  480. _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  481. } // FOUP EVENT
  482. break;
  483. case EfemOperation.GetWaferInfo:
  484. _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  485. break;
  486. default:
  487. break;
  488. }
  489. }
  490. private void OnCommandUpdated(EfemMessage message)
  491. {
  492. if(_currentMsg.Operation != message.Operation)
  493. {
  494. return;
  495. }
  496. switch(message.Operation)
  497. {
  498. case EfemOperation.ClearError:
  499. case EfemOperation.Pick:
  500. case EfemOperation.Place:
  501. case EfemOperation.Extend:
  502. case EfemOperation.Goto:
  503. _status = RState.End;
  504. break;
  505. }
  506. }
  507. }
  508. }