SunWayEfem.cs 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501
  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 CyberX8_Core;
  8. using CyberX8_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 CyberX8_RT.Devices.YASKAWA;
  19. using System.Collections.Concurrent;
  20. using System.Diagnostics;
  21. using System.Data.SqlTypes;
  22. using System.Windows.Media.Media3D;
  23. using System.ComponentModel;
  24. namespace CyberX8_RT.Devices.EFEM
  25. {
  26. public class SunWayEfem : EfemBase
  27. {
  28. #region 常量
  29. private const string NONE = "None";
  30. #endregion
  31. private RState _status;
  32. private bool _IsHomed;
  33. private bool _bIsUnloadClamp;
  34. private RobotMoveInfo _robotMoveInfo = new RobotMoveInfo();
  35. private readonly Loadport[] _LPMs = new Loadport[3];
  36. private readonly SignalTower _signalT = new SignalTower();
  37. private readonly AsyncSocket _socket;
  38. private EfemMessage _currentMsg;
  39. private EfemMessage _revMsg;
  40. private string _error;
  41. private bool _LiftIsUp = false;
  42. private bool _LiftIsDown = false;
  43. private R_TRIG _busyTrig = new R_TRIG();
  44. private Stopwatch _busyWatch = new Stopwatch();
  45. private bool _isComm;
  46. public override RState Status
  47. {
  48. get
  49. {
  50. _busyTrig.CLK = _status == RState.Running;
  51. if (_busyTrig.Q)
  52. {
  53. _busyWatch.Restart();
  54. }
  55. else if (_busyTrig.M)
  56. {
  57. int timeOut = 5000;
  58. if(_currentMsg.Operation==EfemOperation.Home||_currentMsg.Operation==EfemOperation.Load||
  59. _currentMsg.Operation==EfemOperation.Map)
  60. {
  61. timeOut = 30000;
  62. }
  63. if (_busyWatch.ElapsedMilliseconds > timeOut)
  64. {
  65. _busyWatch.Stop();
  66. _status = RState.Timeout;
  67. }
  68. }
  69. return _status;
  70. }
  71. }
  72. public override bool IsHomed { get { return _IsHomed; } }
  73. public override RobotMoveInfo TMRobotMoveInfo { get { return _robotMoveInfo; } }
  74. public override ILoadport this[ModuleName mod]
  75. {
  76. get
  77. {
  78. if (!ModuleHelper.IsLoadPort(mod))
  79. throw new ApplicationException($"{mod} is NOT Loadport");
  80. return _LPMs[mod - ModuleName.LP1];
  81. }
  82. }
  83. public override bool LiftIsUp { get { return _LiftIsUp; } }
  84. public override bool LiftIsDown { get { return _LiftIsDown; } }
  85. private BlockingCollection<RobotAnimationData> blockingCollection = new BlockingCollection<RobotAnimationData>();
  86. private string _address = "";
  87. public SunWayEfem()
  88. {
  89. _socket = new AsyncSocket("","\r",DataType.Ascii,true);
  90. try
  91. {
  92. _address = SC.GetStringValue($"EFEM.IPAddress");
  93. _socket.Connect(_address);
  94. _socket.OnConnect += Socket_OnConnect;
  95. _socket.OnDataChanged += OnReceiveMessage;
  96. _socket.OnErrorHappened += OnErrorHappen;
  97. }
  98. catch(Exception ex)
  99. {
  100. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, "EFEM", ex.Message);
  101. }
  102. _status = RState.Init;
  103. _IsHomed = false;
  104. _busyTrig.RST = true;
  105. _isComm = false;
  106. _LPMs[0] = new Loadport(ModuleName.LP1, this);
  107. _LPMs[1] = new Loadport(ModuleName.LP2, this);
  108. _LPMs[2] = new Loadport(ModuleName.LP3, this);
  109. CarrierManager.Instance.SubscribeLocation(ModuleName.LP1.ToString(), 1);
  110. CarrierManager.Instance.SubscribeLocation(ModuleName.LP2.ToString(), 1);
  111. CarrierManager.Instance.SubscribeLocation(ModuleName.LP3.ToString(), 1);
  112. WaferManager.Instance.SubscribeLocation(ModuleName.EfemRobot, 2);
  113. WaferManager.Instance.SubscribeLocation(ModuleName.Aligner1, 1);
  114. WaferManager.Instance.SubscribeLocation(ModuleName.LP1, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
  115. WaferManager.Instance.SubscribeLocation(ModuleName.LP2, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
  116. WaferManager.Instance.SubscribeLocation(ModuleName.LP3, SC.GetValue<int>("EFEM.LoadPort.SlotNumber"));
  117. Task.Run(() =>
  118. {
  119. foreach (var data in blockingCollection.GetConsumingEnumerable())
  120. {
  121. _robotMoveInfo.Action = data.Action;
  122. _robotMoveInfo.ArmTarget = data.Hand == Hand.Blade1 ? RobotArm.ArmA : (data.Hand == Hand.Both ? RobotArm.Both : RobotArm.ArmB);
  123. _robotMoveInfo.BladeTarget = $"{_robotMoveInfo.ArmTarget}.{data.Target}";
  124. System.Threading.Thread.Sleep(600);
  125. }
  126. });
  127. }
  128. private void Socket_OnConnect()
  129. {
  130. LOG.WriteBackgroundLog(eEvent.EV_EFEM_COMMON_INFO, Module.ToString(), $"connect {_address} success");
  131. }
  132. public override void Monitor()
  133. {
  134. }
  135. public override void Terminate()
  136. {
  137. }
  138. public override void Reset()
  139. {
  140. _status = RState.End;
  141. }
  142. public override void SetOnline(bool online)
  143. {
  144. }
  145. public override void SetOnline(ModuleName mod, bool online)
  146. {
  147. }
  148. public override void SetBusy(ModuleName mod, bool online)
  149. {
  150. _status = RState.Running;
  151. }
  152. public override bool HomeAll()
  153. {
  154. if (_status == RState.Running&&_currentMsg!=null)
  155. {
  156. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"Current Msg {_currentMsg.Operation} is Running,cannot home All");
  157. return false;
  158. }
  159. //判断socket是否链接
  160. if (!_socket.IsConnected)
  161. {
  162. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  163. return false ;
  164. }
  165. //判断机台是否准备就绪
  166. if (!_isComm)
  167. {
  168. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  169. return false;
  170. }
  171. _currentMsg = new EfemMessage
  172. {
  173. Module = ModuleName.EFEM,
  174. Operation = EfemOperation.Home,
  175. Head = EfemMessage.MsgHead.MOV,
  176. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[ModuleName.EFEM] }
  177. };
  178. _status = RState.Running;
  179. string data = _currentMsg.ToString();
  180. SetRobotMovingInfo(RobotAction.Homing, Hand.Both, ModuleName.EFEM);
  181. return _socket.Write(data);
  182. }
  183. public override bool Home(ModuleName mod)
  184. {
  185. if (_status == RState.Running && _currentMsg != null)
  186. {
  187. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"Current Msg {_currentMsg.Operation} is Running,cannot home {mod}");
  188. return false;
  189. }
  190. //判断socket是否链接
  191. if (!_socket.IsConnected)
  192. {
  193. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  194. return false;
  195. }
  196. //判断机台是否准备就绪
  197. if (!_isComm)
  198. {
  199. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  200. return false;
  201. }
  202. _currentMsg = new EfemMessage
  203. {
  204. Module = mod,
  205. Operation = EfemOperation.Home,
  206. Head = EfemMessage.MsgHead.MOV,
  207. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  208. };
  209. if(mod == ModuleName.EfemRobot) SetRobotMovingInfo(RobotAction.Homing, Hand.Blade1, ModuleName.EfemRobot);
  210. _status = RState.Running;
  211. return _socket.Write(_currentMsg.ToString());
  212. }
  213. public override bool OriginalSearch(ModuleName mod)
  214. {
  215. return true;
  216. }
  217. public override bool CheckWaferPresence()
  218. {
  219. if (!CheckEfemStatus())
  220. return false;
  221. _currentMsg = new EfemMessage
  222. {
  223. Module = ModuleName.EFEM,
  224. Operation = EfemOperation.StateTrack,
  225. Head = EfemMessage.MsgHead.GET,
  226. Parameters = new List<string> { "TRACK" }
  227. };
  228. _status = RState.Running;
  229. return _socket.Write(_currentMsg.ToString());
  230. }
  231. public override string GetWaferPresence()
  232. {
  233. return "";
  234. }
  235. public override bool Halt()
  236. {
  237. //判断socket是否链接
  238. if (!_socket.IsConnected)
  239. {
  240. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  241. return false;
  242. }
  243. _currentMsg = new EfemMessage
  244. {
  245. Module = ModuleName.EFEM,
  246. Operation = EfemOperation.Abort,
  247. Head = EfemMessage.MsgHead.MOV,
  248. };
  249. return _socket.Write(_currentMsg.ToString());
  250. }
  251. public override bool ClearError()
  252. {
  253. //判断机台是否准备就绪
  254. if (!_isComm)
  255. {
  256. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  257. return false;
  258. }
  259. //判断socket是否链接
  260. if (!_socket.IsConnected)
  261. {
  262. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  263. return false;
  264. }
  265. _currentMsg = new EfemMessage
  266. {
  267. Module = ModuleName.EFEM,
  268. Operation = EfemOperation.ClearError,
  269. Head = EfemMessage.MsgHead.SET,
  270. Parameters = new List<string> { "CLEAR" }
  271. };
  272. _status = RState.Running;
  273. return _socket.Write(_currentMsg.ToString());
  274. }
  275. public override bool CloseBuzzer()
  276. {
  277. //判断机台是否准备就绪
  278. if (!_isComm)
  279. {
  280. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  281. return false;
  282. }
  283. //判断socket是否链接
  284. if (!_socket.IsConnected)
  285. {
  286. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  287. return false;
  288. }
  289. _currentMsg = new EfemMessage
  290. {
  291. Module = ModuleName.EFEM,
  292. Operation = EfemOperation.Light,
  293. Head = EfemMessage.MsgHead.SET,
  294. Parameters = new List<string> { Constant.STOWER, LightType.BUZZER1.ToString(), "OFF" }
  295. };
  296. _status = RState.Running;
  297. return _socket.Write(_currentMsg.ToString());
  298. }
  299. public override bool PickExtend(ModuleName chamber, int slot, Hand hand)
  300. {
  301. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Extend]}");
  302. return false;
  303. }
  304. public override bool PickRetract(ModuleName chamber, int slot, Hand hand)
  305. {
  306. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Extend]}");
  307. return false;
  308. }
  309. public override bool PlaceExtend(ModuleName chamber, int slot, Hand hand)
  310. {
  311. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Extend]}");
  312. return false;
  313. }
  314. public override bool PlaceRetract(ModuleName chamber, int slot, Hand hand)
  315. {
  316. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Extend]}");
  317. return false;
  318. }
  319. public override bool SetAlignWaferSize()
  320. {
  321. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner wafer size");
  322. return false;
  323. }
  324. public override bool SetAlignFlatType(int flatType)
  325. {
  326. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner flat type");
  327. return false;
  328. }
  329. public override bool SetAlignDistance()
  330. {
  331. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner distance");
  332. return false;
  333. }
  334. public override bool GotoMap(ModuleName mod, Hand hand,string extend="EX")
  335. {
  336. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support GotoMap");
  337. return false;
  338. }
  339. public override bool Pause()
  340. {
  341. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support Pause");
  342. return false;
  343. }
  344. public override bool Resume()
  345. {
  346. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support Resume");
  347. return false;
  348. }
  349. public override bool RequestMapResult(ModuleName mod)
  350. {
  351. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support RequestMapResult");
  352. return false;
  353. }
  354. public override bool Pick(ModuleName station, int slot, Hand hand)
  355. {
  356. //判断机台是否准备就绪
  357. if (!_isComm)
  358. {
  359. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  360. return false;
  361. }
  362. //判断socket是否链接
  363. if (!_socket.IsConnected)
  364. {
  365. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  366. return false;
  367. }
  368. //判断Loadport的门是否打开
  369. if (ModuleHelper.IsLoadPort(station) && !_LPMs[station - ModuleName.LP1].IsDoorOpened)
  370. {
  371. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{station}'s Door is Closed, Cannot Execute Pick Action");
  372. return false;
  373. }
  374. if (!CheckEfemStatus())
  375. return false;
  376. Position SrcPos = new Position { Module = station, Slot = (byte)slot };
  377. _currentMsg = new EfemMessage
  378. {
  379. Operation = EfemOperation.Pick,
  380. Head = EfemMessage.MsgHead.MOV,
  381. Parameters = new List<string>
  382. {
  383. SunWayMessageHandler.Instance.ToHWString(SrcPos),
  384. SunWayMessageHandler.Instance.ArmString[hand]
  385. }
  386. };
  387. _status = RState.Running;
  388. SetRobotMovingInfo(RobotAction.Picking, hand, station);
  389. return _socket.Write(_currentMsg.ToString());
  390. }
  391. public override bool Place(ModuleName station, int slot, Hand hand)
  392. {
  393. //判断机台是否准备就绪
  394. if (!_isComm)
  395. {
  396. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  397. return false;
  398. }
  399. //判断socket是否链接
  400. if (!_socket.IsConnected)
  401. {
  402. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  403. return false;
  404. }
  405. //判断Loadport的门是否打开
  406. if (ModuleHelper.IsLoadPort(station) && !_LPMs[station - ModuleName.LP1].IsDoorOpened)
  407. {
  408. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{station}'s Door is Closed, Cannot Execute Pick Action");
  409. return false;
  410. }
  411. if (!CheckEfemStatus())
  412. return false;
  413. Position DestPos = new Position { Module = station, Slot = (byte)slot };
  414. _currentMsg = new EfemMessage
  415. {
  416. Operation = EfemOperation.Place,
  417. Head = EfemMessage.MsgHead.MOV,
  418. Parameters = new List<string>
  419. {
  420. SunWayMessageHandler.Instance.ToHWString(DestPos),
  421. SunWayMessageHandler.Instance.ArmString[hand]
  422. }
  423. };
  424. _status = RState.Running;
  425. SetRobotMovingInfo(RobotAction.Placing, hand, station);
  426. return _socket.Write(_currentMsg.ToString());
  427. }
  428. public override bool Goto(ModuleName station, Hand hand, string updown = "UP")
  429. {
  430. if (!CheckEfemStatus())
  431. return false;
  432. //判断socket是否链接
  433. if (!_socket.IsConnected)
  434. {
  435. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  436. return false;
  437. }
  438. Position DestPos = new Position { Module = station, Slot = (byte)0 };
  439. _currentMsg = new EfemMessage
  440. {
  441. Operation = EfemOperation.Goto,
  442. Head = EfemMessage.MsgHead.MOV,
  443. Parameters = new List<string>
  444. {
  445. SunWayMessageHandler.Instance.ToHWString(DestPos),
  446. SunWayMessageHandler.Instance.ArmString[hand],
  447. updown
  448. }
  449. };
  450. _status = RState.Running;
  451. return _socket.Write(_currentMsg.ToString());
  452. }
  453. public override bool Grip(Hand blade, bool isGrip)
  454. {
  455. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Grip]}");
  456. return false;
  457. }
  458. public override bool Map(ModuleName mod)
  459. {
  460. //判断机台是否准备就绪
  461. if (!_isComm)
  462. {
  463. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  464. return false;
  465. }
  466. //判断socket是否链接
  467. if (!_socket.IsConnected)
  468. {
  469. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  470. return false;
  471. }
  472. if (!CheckEfemStatus())
  473. return false;
  474. _currentMsg = new EfemMessage
  475. {
  476. Operation = EfemOperation.Map,
  477. Head = EfemMessage.MsgHead.MOV,
  478. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  479. };
  480. _status = RState.Running;
  481. return _socket.Write(_currentMsg.ToString());
  482. }
  483. public override bool Vacuum(ModuleName mod,bool VacuumState)
  484. {
  485. //判断机台是否准备就绪
  486. if (!_isComm)
  487. {
  488. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  489. return false;
  490. }
  491. //判断socket是否链接
  492. if (!_socket.IsConnected)
  493. {
  494. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  495. return false;
  496. }
  497. string strVacuum = VacuumState ? "ON" : "OFF";
  498. _currentMsg = new EfemMessage
  499. {
  500. Operation = EfemOperation.Vacuum,
  501. Head = EfemMessage.MsgHead.MOV,
  502. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod],strVacuum }
  503. };
  504. _status = RState.Running;
  505. return _socket.Write(_currentMsg.ToString());
  506. }
  507. public override bool GetWaferSize(ModuleName mod)
  508. {
  509. if (!CheckEfemStatus())
  510. return false;
  511. //判断机台是否准备就绪
  512. if (!_isComm)
  513. {
  514. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  515. return false;
  516. }
  517. //判断socket是否链接
  518. if (!_socket.IsConnected)
  519. {
  520. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  521. return false;
  522. }
  523. _currentMsg = new EfemMessage
  524. {
  525. Operation = EfemOperation.Size,
  526. Head = EfemMessage.MsgHead.GET,
  527. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  528. };
  529. _status = RState.Running;
  530. return _socket.Write(_currentMsg.ToString());
  531. }
  532. public override bool SetWaferSize(ModuleName mod, int WaferSize)
  533. {
  534. if (!CheckEfemStatus())
  535. return false;
  536. //判断机台是否准备就绪
  537. if (!_isComm)
  538. {
  539. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  540. return false;
  541. }
  542. //判断socket是否链接
  543. if (!_socket.IsConnected)
  544. {
  545. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  546. return false;
  547. }
  548. _currentMsg = new EfemMessage
  549. {
  550. Operation = EfemOperation.Size,
  551. Head = EfemMessage.MsgHead.SET,
  552. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod], WaferSize.ToString() }
  553. };
  554. _status = RState.Running;
  555. return _socket.Write(_currentMsg.ToString());
  556. }
  557. public override bool SetPinUp(ModuleName mod)
  558. {
  559. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Lift]}");
  560. return false;
  561. }
  562. public override bool SetPinDown(ModuleName mod)
  563. {
  564. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Lift]}");
  565. return false;
  566. }
  567. public override bool SetAlignAngle(ModuleName mod, double angle)
  568. {
  569. if (!CheckEfemStatus())
  570. return false;
  571. //判断机台是否准备就绪
  572. if (!_isComm)
  573. {
  574. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  575. return false;
  576. }
  577. //判断socket是否链接
  578. if (!_socket.IsConnected)
  579. {
  580. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  581. return false;
  582. }
  583. _currentMsg = new EfemMessage
  584. {
  585. Operation = EfemOperation.Align,
  586. Head = EfemMessage.MsgHead.SET,
  587. Parameters = new List<string>
  588. {
  589. SunWayMessageHandler.Instance.ModuleString[mod],
  590. angle.ToString("000.00")
  591. }
  592. };
  593. _status = RState.Running;
  594. return _socket.Write(_currentMsg.ToString());
  595. }
  596. public override bool SetRobotSpeed(ModuleName mod, int speed)
  597. {
  598. if (!CheckEfemStatus())
  599. return false;
  600. //判断机台是否准备就绪
  601. if (!_isComm)
  602. {
  603. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  604. return false;
  605. }
  606. //判断socket是否链接
  607. if (!_socket.IsConnected)
  608. {
  609. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  610. return false;
  611. }
  612. _currentMsg = new EfemMessage
  613. {
  614. Operation = EfemOperation.Speed,
  615. Head = EfemMessage.MsgHead.SET,
  616. Parameters = new List<string>
  617. {
  618. SunWayMessageHandler.Instance.ModuleString[mod],
  619. speed.ToString()
  620. }
  621. };
  622. _status = RState.Running;
  623. return _socket.Write(_currentMsg.ToString());
  624. }
  625. public override bool RobotPowerOn(ModuleName mod, bool Status)
  626. {
  627. //判断机台是否准备就绪
  628. if (!_isComm)
  629. {
  630. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  631. return false;
  632. }
  633. //判断socket是否链接
  634. if (!_socket.IsConnected)
  635. {
  636. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  637. return false;
  638. }
  639. if (!CheckEfemStatus())
  640. return false;
  641. string status = "ON";
  642. if (!Status)
  643. {
  644. status = "OFF";
  645. }
  646. _currentMsg = new EfemMessage
  647. {
  648. Operation = EfemOperation.PowerOn,
  649. Head = EfemMessage.MsgHead.MOV,
  650. Parameters = new List<string>
  651. {
  652. SunWayMessageHandler.Instance.ModuleString[mod],
  653. status
  654. }
  655. };
  656. _status = RState.Running;
  657. return _socket.Write(_currentMsg.ToString());
  658. }
  659. public override bool Align(ModuleName mod, double angle, float delayTime, WaferSize size)
  660. {
  661. //判断机台是否准备就绪
  662. if (!_isComm)
  663. {
  664. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  665. return false;
  666. }
  667. //判断socket是否链接
  668. if (!_socket.IsConnected)
  669. {
  670. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  671. return false;
  672. }
  673. if (!CheckEfemStatus())
  674. return false;
  675. _currentMsg = new EfemMessage
  676. {
  677. Operation = EfemOperation.Align,
  678. Head = EfemMessage.MsgHead.MOV,
  679. Parameters = new List<string>
  680. {
  681. SunWayMessageHandler.Instance.ModuleString[mod]
  682. }
  683. };
  684. _status = RState.Running;
  685. return _socket.Write(_currentMsg.ToString());
  686. }
  687. public override bool SetLamp(LightType light, LightStatus status)
  688. {
  689. if (!_isComm)
  690. {
  691. return false;
  692. }
  693. //判断socket是否链接
  694. if (!_socket.IsConnected)
  695. {
  696. return false;
  697. }
  698. EfemMessage currentMsg = new EfemMessage
  699. {
  700. Module = ModuleName.EFEM,
  701. Operation = EfemOperation.Light,
  702. Head = EfemMessage.MsgHead.SET,
  703. Parameters = new List<string> { Constant.STOWER, light.ToString(), status.ToString() }
  704. };
  705. return _socket.Write(currentMsg.ToString());
  706. }
  707. public override bool Load(ModuleName mod)
  708. {
  709. //判断机台是否准备就绪
  710. if (!_isComm)
  711. {
  712. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  713. return false;
  714. }
  715. //判断socket是否链接
  716. if (!_socket.IsConnected)
  717. {
  718. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  719. return false;
  720. }
  721. if (!CheckEfemStatus())
  722. return false;
  723. _currentMsg = new EfemMessage
  724. {
  725. Module = mod,
  726. Operation = EfemOperation.Load,
  727. Head = EfemMessage.MsgHead.MOV,
  728. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  729. };
  730. _status = RState.Running;
  731. return _socket.Write(_currentMsg.ToString());
  732. }
  733. public override bool Unload(ModuleName mod)
  734. {
  735. //判断机台是否准备就绪
  736. if (!_isComm)
  737. {
  738. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  739. return false;
  740. }
  741. //判断socket是否链接
  742. if (!_socket.IsConnected)
  743. {
  744. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  745. return false;
  746. }
  747. if (!CheckEfemStatus())
  748. return false;
  749. _currentMsg = new EfemMessage
  750. {
  751. Module = mod,
  752. Operation = EfemOperation.Unload,
  753. Head = EfemMessage.MsgHead.MOV,
  754. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  755. };
  756. _status = RState.Running;
  757. return _socket.Write(_currentMsg.ToString());
  758. }
  759. public override bool ReadCarrierId(ModuleName mod)
  760. {
  761. //判断机台是否准备就绪
  762. if (!_isComm)
  763. {
  764. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  765. return false;
  766. }
  767. //判断socket是否链接
  768. if (!_socket.IsConnected)
  769. {
  770. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  771. return false;
  772. }
  773. if (!CheckEfemStatus())
  774. return false;
  775. _currentMsg = new EfemMessage
  776. {
  777. Module = mod,
  778. Operation = EfemOperation.CarrierId,
  779. Head = EfemMessage.MsgHead.GET,
  780. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  781. };
  782. _status = RState.Running;
  783. return _socket.Write(_currentMsg.ToString());
  784. }
  785. public override bool WriteCarrierId(ModuleName mod, string id)
  786. {
  787. if (!CheckEfemStatus())
  788. return false;
  789. //判断机台是否准备就绪
  790. if (!_isComm)
  791. {
  792. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  793. return false;
  794. }
  795. //判断socket是否链接
  796. if (!_socket.IsConnected)
  797. {
  798. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  799. return false;
  800. }
  801. _currentMsg = new EfemMessage
  802. {
  803. Module = mod,
  804. Operation = EfemOperation.CarrierId,
  805. Head = EfemMessage.MsgHead.SET,
  806. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod], id }
  807. };
  808. _status = RState.Running;
  809. return _socket.Write(_currentMsg.ToString());
  810. }
  811. public override bool ReadTagData(ModuleName mod)
  812. {
  813. return ReadCarrierId(mod);
  814. }
  815. public override bool WriteTagData(ModuleName mod, string tagData)
  816. {
  817. return WriteCarrierId(mod, tagData);
  818. }
  819. public override bool Dock(ModuleName mod)
  820. {
  821. //判断机台是否准备就绪
  822. if (!_isComm)
  823. {
  824. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  825. return false;
  826. }
  827. //判断socket是否链接
  828. if (!_socket.IsConnected)
  829. {
  830. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  831. return false;
  832. }
  833. if (!CheckEfemStatus())
  834. return false;
  835. _currentMsg = new EfemMessage
  836. {
  837. Module = mod,
  838. Operation = EfemOperation.Dock,
  839. Head = EfemMessage.MsgHead.MOV,
  840. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  841. };
  842. _status = RState.Running;
  843. return _socket.Write(_currentMsg.ToString());
  844. }
  845. public override bool Undock(ModuleName mod)
  846. {
  847. //判断机台是否准备就绪
  848. if (!_isComm)
  849. {
  850. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  851. return false;
  852. }
  853. //判断socket是否链接
  854. if (!_socket.IsConnected)
  855. {
  856. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  857. return false;
  858. }
  859. if (!CheckEfemStatus())
  860. return false;
  861. _currentMsg = new EfemMessage
  862. {
  863. Module = mod,
  864. Operation = EfemOperation.Undock,
  865. Head = EfemMessage.MsgHead.MOV,
  866. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  867. };
  868. _status = RState.Running;
  869. return _socket.Write(_currentMsg.ToString());
  870. }
  871. public override bool Clamp(ModuleName mod, bool isUnloadClamp)
  872. {
  873. //判断机台是否准备就绪
  874. if (!_isComm)
  875. {
  876. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  877. return false;
  878. }
  879. //判断socket是否链接
  880. if (!_socket.IsConnected)
  881. {
  882. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  883. return false;
  884. }
  885. if (!CheckEfemStatus())
  886. return false;
  887. _currentMsg = new EfemMessage
  888. {
  889. Module = mod,
  890. Operation = EfemOperation.Clamp,
  891. Head = EfemMessage.MsgHead.MOV,
  892. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  893. };
  894. _status = RState.Running;
  895. _bIsUnloadClamp = isUnloadClamp;
  896. return _socket.Write(_currentMsg.ToString());
  897. }
  898. public override bool Unclamp(ModuleName mod)
  899. {
  900. //判断机台是否准备就绪
  901. if (!_isComm)
  902. {
  903. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  904. return false;
  905. }
  906. //判断socket是否链接
  907. if (!_socket.IsConnected)
  908. {
  909. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  910. return false;
  911. }
  912. if (!CheckEfemStatus())
  913. return false;
  914. _currentMsg = new EfemMessage
  915. {
  916. Module = mod,
  917. Operation = EfemOperation.Unclamp,
  918. Head = EfemMessage.MsgHead.MOV,
  919. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  920. };
  921. _status = RState.Running;
  922. return _socket.Write(_currentMsg.ToString());
  923. }
  924. public override bool SetThickness(ModuleName mod, string thickness)
  925. {
  926. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.SetThickness]}");
  927. return false;
  928. }
  929. public override void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target)
  930. {
  931. blockingCollection.Add(new RobotAnimationData(action, hand, target));
  932. }
  933. private void OnReceiveMessage(string RevMsg)
  934. {
  935. LOG.WriteBackgroundLog(eEvent.EV_EFEM_COMMON_INFO, Module.ToString(), RevMsg.Replace("\r",""));
  936. if (!_isComm)
  937. {
  938. //检验是否收到CommReady信号
  939. if (RevMsg.IndexOf("COMM", StringComparison.OrdinalIgnoreCase) >= 0)
  940. {
  941. _isComm = true;
  942. }
  943. }
  944. string[] msgs = RevMsg.Split('\r');
  945. foreach (var msg in msgs)
  946. {
  947. if (string.IsNullOrWhiteSpace(msg)) continue;
  948. EfemMessage rec_msg = SunWayMessageHandler.Instance.ToMessage(msg);
  949. switch (rec_msg.Head)
  950. {
  951. case EfemMessage.MsgHead.ACK:
  952. if (msg.Contains("ERROR"))
  953. {
  954. _revMsg = rec_msg;
  955. }
  956. break;
  957. case EfemMessage.MsgHead.INF:
  958. // 收到INF之后发送ACK确认
  959. string strACK = rec_msg.RawString.Replace("INF", "ACK");
  960. SendBack(strACK);
  961. LOG.WriteBackgroundLog(eEvent.EV_EFEM_COMMON_INFO, Module.ToString(), strACK);
  962. //提示当前机械臂速度设置情况
  963. if (strACK.Contains("SPEED"))
  964. {
  965. string[] SpeedInf = rec_msg.RawString.Split('/');
  966. LOG.Write(eEvent.INFO_PROCESS, ModuleName.Robot, $"Robot Speed is {SpeedInf[SpeedInf.Length-1]}");
  967. }
  968. //提示当前机械臂电源情况
  969. if (strACK.Contains("SERVOS"))
  970. {
  971. string[] PowerInf = rec_msg.RawString.Split('/');
  972. LOG.Write(eEvent.INFO_PROCESS, ModuleName.Robot, $"Robot Power is {PowerInf[PowerInf.Length - 1]}");
  973. }
  974. EfemMessage ack_msg = SunWayMessageHandler.Instance.ToMessage(strACK);
  975. ack_msg.Direct = MsgDirection.To;
  976. _revMsg = rec_msg;
  977. OnCommandUpdated(rec_msg);
  978. SetRobotMovingInfo(RobotAction.None, Hand.Both, ModuleName.EfemRobot);
  979. break;
  980. case EfemMessage.MsgHead.EVT:
  981. OnEventUpdated(new EfemEventArgs
  982. {
  983. EvtStr = rec_msg.ToParamString(),
  984. Module = rec_msg.Module,
  985. CommandType = rec_msg.Operation,
  986. DataList = rec_msg.Data
  987. });
  988. if (rec_msg.Operation == EfemOperation.Home)
  989. {
  990. SetRobotMovingInfo(RobotAction.Homing, Hand.Both, ModuleName.EFEM);
  991. }
  992. if (rec_msg.Operation == EfemOperation.Error)
  993. {
  994. OnErrorOccurred(rec_msg);
  995. }
  996. break;
  997. case EfemMessage.MsgHead.NAK:
  998. case EfemMessage.MsgHead.CAN:
  999. case EfemMessage.MsgHead.ABS:
  1000. OnErrorOccurred(rec_msg);
  1001. break;
  1002. }
  1003. }
  1004. }
  1005. private void OnErrorHappen(ErrorEventArgs args)
  1006. {
  1007. _status = RState.Failed;
  1008. if(_error!=args.Reason)
  1009. {
  1010. _error=args.Reason;
  1011. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"{Module} {_error}");
  1012. }
  1013. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  1014. }
  1015. private void OnErrorOccurred(EfemMessage message)
  1016. {
  1017. string description = string.Empty;
  1018. string str = "";
  1019. switch (message.Head)
  1020. {
  1021. case EfemMessage.MsgHead.NAK:
  1022. description = Constant.SunWayFactorString.ContainsKey(message.Factor) ? Constant.SunWayFactorString[message.Factor]:message.Factor;
  1023. break;
  1024. case EfemMessage.MsgHead.CAN:
  1025. description = Constant.SunWayFactorString.ContainsKey(message.Factor) ? Constant.SunWayFactorString[message.Factor] : message.Factor;
  1026. str = message.Data.Count != 0 ? message.Data[0] : "";
  1027. break;
  1028. case EfemMessage.MsgHead.ABS:
  1029. description = message.Factor;
  1030. str = message.Data.Count != 0 ? String.Join(" ", message.Data.ToArray()):"";
  1031. break;
  1032. case EfemMessage.MsgHead.EVT:
  1033. str= message.Data.Count != 0 ? String.Join(" ", message.Data.ToArray()) : "";
  1034. break;
  1035. }
  1036. _status = RState.Failed;
  1037. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,description);
  1038. if (message.Head == EfemMessage.MsgHead.NAK || message.Head == EfemMessage.MsgHead.CAN)
  1039. {
  1040. eEvent eEvent = GetFactorEventId(message.Factor);
  1041. LOG.Write(eEvent, ModuleName.EFEM, $"{description}, [{str}]");
  1042. }
  1043. else
  1044. {
  1045. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, $"{description}, [{str}]");
  1046. }
  1047. }
  1048. /// <summary>
  1049. /// 根据Factor获取相应的eEventId
  1050. /// </summary>
  1051. /// <param name="factor"></param>
  1052. /// <returns></returns>
  1053. private eEvent GetFactorEventId(string factor)
  1054. {
  1055. string str = $"ERR_EFEM_{factor}";
  1056. if(Enum.TryParse(str,out eEvent result))
  1057. {
  1058. return result;
  1059. }
  1060. else
  1061. {
  1062. return eEvent.ERR_EFEM_COMMON_FAILED;
  1063. }
  1064. }
  1065. private void OnEventUpdated(EfemEventArgs eArg)
  1066. {
  1067. switch (eArg.CommandType)
  1068. {
  1069. case EfemOperation.SigStatus:
  1070. // EVT:SIGSTAT/Parameter/DATA1/DATA2;
  1071. string sParam = eArg.DataList[0];
  1072. // DATA1 & DATA2
  1073. int nData1 = Convert.ToInt32(eArg.DataList[1], 16);
  1074. int nData2 = Convert.ToInt32(eArg.DataList[2], 16);
  1075. BitArray baData1 = new BitArray(new int[] { nData1 });
  1076. BitArray baData2 = new BitArray(new int[] { nData2 });
  1077. if (0 == string.Compare(sParam, Constant.SYS, true))
  1078. {
  1079. // EVT:SIGSTAT/System/00000000/00000004;
  1080. // DATA1
  1081. if (!baData1[0]) // Bit[0] ON=Normal, OFF=Abnormal
  1082. {
  1083. string error = "EFEM Door is OFF Alarm";
  1084. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1085. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1086. }
  1087. if (!baData1[1]) // Bit[0] ON=Normal, OFF=Abnormal
  1088. {
  1089. string error = "EFEM Vacuum Detection is OFF Alarm";
  1090. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1091. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error, error);
  1092. }
  1093. if (!baData1[2]) // Bit[2] ON=Normal, OFF=Abnormal
  1094. {
  1095. string error = "EFEM Air Detection is OFF Alarm";
  1096. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1097. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1098. }
  1099. if (!baData1[3]) // Bit[3] ON=Normal, OFF=Abnormal
  1100. {
  1101. string error = "EFEM OnlineMode is OFF Alarm";
  1102. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1103. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1104. }
  1105. if (baData1[4]) // Bit[4] ON=Abnormal, OFF=Normal
  1106. {
  1107. string error = "EFEM MaintenanceMode is ON Alarm";
  1108. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1109. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error, error);
  1110. }
  1111. if (baData1[5]) // Bit[5] ON=Abnormal, OFF=Normal
  1112. {
  1113. string error = "EFEM System Wafer Stick-out1 Alarm";
  1114. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1115. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error, error);
  1116. }
  1117. if (baData1[6]) // Bit[6] ON=Abnormal, OFF=Normal
  1118. {
  1119. string error = "EFEM System Wafer Stick-out2 Alarm";
  1120. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1121. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1122. }
  1123. if (baData1[7]) // Bit[7] ON=Abnormal, OFF=Normal
  1124. {
  1125. string error = "EFEM Emergency Stop Signal Alarm";
  1126. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM,error);
  1127. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1128. }
  1129. // DATA2
  1130. _signalT.ChangeLightStatus(LightType.BUZZER1, baData2[0] ? LightStatus.ON : LightStatus.OFF);
  1131. _signalT.ChangeLightStatus(LightType.BLUE, baData2[1] ? LightStatus.ON : LightStatus.OFF);
  1132. _signalT.ChangeLightStatus(LightType.GREEN, baData2[2] ? LightStatus.ON : LightStatus.OFF);
  1133. _signalT.ChangeLightStatus(LightType.YELLOW, baData2[3] ? LightStatus.ON : LightStatus.OFF);
  1134. _signalT.ChangeLightStatus(LightType.RED, baData2[4] ? LightStatus.ON : LightStatus.OFF);
  1135. _signalT.ChangeLightStatus(LightType.BLUE, baData2[6] ? LightStatus.BLINK : LightStatus.OFF);
  1136. _signalT.ChangeLightStatus(LightType.GREEN, baData2[7] ? LightStatus.BLINK : LightStatus.OFF);
  1137. _signalT.ChangeLightStatus(LightType.YELLOW, baData2[8] ? LightStatus.BLINK : LightStatus.OFF);
  1138. _signalT.ChangeLightStatus(LightType.RED, baData2[9] ? LightStatus.BLINK : LightStatus.OFF);
  1139. //屏蔽LP光栅信号
  1140. /* EFEM 程序中目前没有实现
  1141. _RobotErr.CLK = baData2[27]; // bit 27
  1142. bool bArmNotExtendLLA = baData2[30]; // bit 30
  1143. bool bArmNotExtendLLB = baData2[31]; // bit 31
  1144. */
  1145. } // system event
  1146. else
  1147. {
  1148. // placement & present
  1149. bool bPlacement = baData1[0]; // bit 0
  1150. bool bPresence = baData1[0]; // bit 1
  1151. bool bArrived = bPlacement && bPresence;
  1152. _LPMs[eArg.Module - ModuleName.LP1].UpdateWaferArrive(bArrived);
  1153. _LPMs[eArg.Module - ModuleName.LP1].IsClamped = baData1[1];
  1154. _LPMs[eArg.Module - ModuleName.LP1].IsDocked = baData1[2];
  1155. _LPMs[eArg.Module - ModuleName.LP1].IsDoorOpened = !baData1[5];
  1156. //_LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  1157. } // FOUP EVENT
  1158. break;
  1159. case EfemOperation.GetWaferInfo:
  1160. //MADPT
  1161. //lp
  1162. if (ModuleHelper.IsLoadPort(eArg.Module))
  1163. {
  1164. _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  1165. }
  1166. // BF
  1167. else
  1168. {
  1169. MapBufferHandleEvent(eArg);
  1170. }
  1171. //buffer
  1172. break;
  1173. case EfemOperation.Align:
  1174. //ALIGN
  1175. MapBufferHandleEvent(eArg);
  1176. break;
  1177. default:
  1178. break;
  1179. }
  1180. }
  1181. public void MapBufferHandleEvent(EfemEventArgs eArg)
  1182. {
  1183. string sWaferInfo = eArg.DataList[0];
  1184. for (byte index = 0; index < sWaferInfo.Length; index++)
  1185. {
  1186. int waferState = int.Parse(sWaferInfo.Substring(index, 1));
  1187. //合理的映射到内部支持的叠片/交叉片
  1188. if (waferState >= 7) waferState = 7;
  1189. else if (waferState >= 2) waferState = 3;
  1190. WaferStatus st = (WaferStatus)waferState;
  1191. if (st != WaferStatus.Empty)
  1192. {
  1193. WaferManager.Instance.CreateWafer(eArg.Module, index, st);
  1194. }
  1195. else
  1196. {
  1197. WaferManager.Instance.DeleteWafer(eArg.Module, index);
  1198. }
  1199. }
  1200. }
  1201. private void OnCommandUpdated(EfemMessage message)
  1202. {
  1203. try
  1204. {
  1205. switch (message.Operation)
  1206. {
  1207. case EfemOperation.ClearError:
  1208. case EfemOperation.Align:
  1209. case EfemOperation.Pick:
  1210. case EfemOperation.Place:
  1211. case EfemOperation.Extend:
  1212. case EfemOperation.Goto:
  1213. case EfemOperation.Orgsh:
  1214. case EfemOperation.EmsStop:
  1215. case EfemOperation.Abort:
  1216. case EfemOperation.Speed:
  1217. case EfemOperation.Vacuum:
  1218. case EfemOperation.PowerOn:
  1219. _status = RState.End;
  1220. break;
  1221. case EfemOperation.Map:
  1222. if (ModuleHelper.IsLoadPort(message.Module))
  1223. {
  1224. _LPMs[message.Module - ModuleName.LP1].OnMaped();
  1225. }
  1226. _status = RState.End;
  1227. break;
  1228. case EfemOperation.StateTrack:
  1229. {
  1230. string str = message.Data.Count >= 1 ? message.Data.First() : string.Empty;
  1231. if (str.ToLower() == "track")
  1232. {
  1233. string strA = message.Data.Count > 1 ? message.Data[1].ToString() : string.Empty;
  1234. if (strA.ToLower() != NONE.ToLower())
  1235. {
  1236. if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0))
  1237. {
  1238. WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 0, WaferStatus.Normal);
  1239. }
  1240. }
  1241. string strB = message.Data.Count > 2 ? message.Data[2].ToString() : string.Empty;
  1242. if (strB.ToLower() != NONE.ToLower())
  1243. {
  1244. if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 1))
  1245. {
  1246. WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 1, WaferStatus.Normal);
  1247. }
  1248. }
  1249. }
  1250. _status = RState.End;
  1251. }
  1252. break;
  1253. case EfemOperation.Home:
  1254. {
  1255. if (_currentMsg.Module == ModuleName.EFEM)
  1256. {
  1257. _LPMs[0].OnHomed();
  1258. _LPMs[1].OnHomed();
  1259. _LPMs[2].OnHomed();
  1260. }
  1261. else if (ModuleHelper.IsLoadPort(_currentMsg.Module))
  1262. {
  1263. _LPMs[_currentMsg.Module - ModuleName.LP1].OnHomed();
  1264. }
  1265. _status = RState.End;
  1266. }
  1267. break;
  1268. case EfemOperation.Load:
  1269. {
  1270. _LPMs[message.Module - ModuleName.LP1].OnLoaded();
  1271. _status = RState.End;
  1272. }
  1273. break;
  1274. case EfemOperation.Unload:
  1275. {
  1276. _LPMs[message.Module - ModuleName.LP1].OnUnloaded();
  1277. _status = RState.End;
  1278. }
  1279. break;
  1280. case EfemOperation.CarrierId:
  1281. {
  1282. if (message.Head == EfemMessage.MsgHead.GET)
  1283. {
  1284. _LPMs[message.Module - ModuleName.LP1].OnCarrierIDRead(message.Data.First());
  1285. }
  1286. else
  1287. {
  1288. _LPMs[message.Module - ModuleName.LP1].OnCarrierIDWrite(message.Data.First());
  1289. }
  1290. _status = RState.End;
  1291. }
  1292. break;
  1293. case EfemOperation.Clamp:
  1294. {
  1295. _LPMs[message.Module - ModuleName.LP1].OnClamped(_bIsUnloadClamp);
  1296. _status = RState.End;
  1297. }
  1298. break;
  1299. case EfemOperation.Unclamp:
  1300. {
  1301. _LPMs[message.Module - ModuleName.LP1].OnUnclamped();
  1302. _status = RState.End;
  1303. }
  1304. break;
  1305. case EfemOperation.Dock:
  1306. {
  1307. _LPMs[message.Module - ModuleName.LP1].OnDocked();
  1308. _status = RState.End;
  1309. }
  1310. break;
  1311. case EfemOperation.Undock:
  1312. {
  1313. _LPMs[message.Module - ModuleName.LP1].OnUndocked();
  1314. _status = RState.End;
  1315. }
  1316. break;
  1317. case EfemOperation.Ready:
  1318. {
  1319. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.CommReady);
  1320. }
  1321. break;
  1322. case EfemOperation.Size:
  1323. {
  1324. if (message.Data.Count != 0)
  1325. {
  1326. if(ModuleHelper.IsLoadPort(message.Module))
  1327. {
  1328. string waferSize = message.Data[0];
  1329. if (waferSize == "200")
  1330. {
  1331. _LPMs[message.Module - ModuleName.LP1].UpdateWaferSize(WaferSize.WS8);
  1332. }
  1333. else if (waferSize == "300")
  1334. {
  1335. _LPMs[message.Module - ModuleName.LP1].UpdateWaferSize(WaferSize.WS12);
  1336. }
  1337. else
  1338. {
  1339. _LPMs[message.Module - ModuleName.LP1].UpdateWaferSize(WaferSize.WS0);
  1340. }
  1341. }
  1342. }
  1343. _status = RState.End;
  1344. }
  1345. break;
  1346. }
  1347. }
  1348. catch(Exception ex)
  1349. {
  1350. string error = $"OnCommandUpdated meets {ex.Message}";
  1351. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), error);
  1352. _status = RState.Failed;
  1353. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1354. }
  1355. }
  1356. async void SendBack(string data)
  1357. {
  1358. await Task.Run(() => _socket.Write(data + '\r'));
  1359. }
  1360. }
  1361. }