SunWayEfem.cs 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489
  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 RequestMapResult(ModuleName mod)
  340. {
  341. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support RequestMapResult");
  342. return false;
  343. }
  344. public override bool Pick(ModuleName station, int slot, Hand hand)
  345. {
  346. //判断机台是否准备就绪
  347. if (!_isComm)
  348. {
  349. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  350. return false;
  351. }
  352. //判断socket是否链接
  353. if (!_socket.IsConnected)
  354. {
  355. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  356. return false;
  357. }
  358. //判断Loadport的门是否打开
  359. if (ModuleHelper.IsLoadPort(station) && !_LPMs[station - ModuleName.LP1].IsDoorOpened)
  360. {
  361. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{station}'s Door is Closed, Cannot Execute Pick Action");
  362. return false;
  363. }
  364. if (!CheckEfemStatus())
  365. return false;
  366. Position SrcPos = new Position { Module = station, Slot = (byte)slot };
  367. _currentMsg = new EfemMessage
  368. {
  369. Operation = EfemOperation.Pick,
  370. Head = EfemMessage.MsgHead.MOV,
  371. Parameters = new List<string>
  372. {
  373. SunWayMessageHandler.Instance.ToHWString(SrcPos),
  374. SunWayMessageHandler.Instance.ArmString[hand]
  375. }
  376. };
  377. _status = RState.Running;
  378. SetRobotMovingInfo(RobotAction.Picking, hand, station);
  379. return _socket.Write(_currentMsg.ToString());
  380. }
  381. public override bool Place(ModuleName station, int slot, Hand hand)
  382. {
  383. //判断机台是否准备就绪
  384. if (!_isComm)
  385. {
  386. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  387. return false;
  388. }
  389. //判断socket是否链接
  390. if (!_socket.IsConnected)
  391. {
  392. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  393. return false;
  394. }
  395. //判断Loadport的门是否打开
  396. if (ModuleHelper.IsLoadPort(station) && !_LPMs[station - ModuleName.LP1].IsDoorOpened)
  397. {
  398. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{station}'s Door is Closed, Cannot Execute Pick Action");
  399. return false;
  400. }
  401. if (!CheckEfemStatus())
  402. return false;
  403. Position DestPos = new Position { Module = station, Slot = (byte)slot };
  404. _currentMsg = new EfemMessage
  405. {
  406. Operation = EfemOperation.Place,
  407. Head = EfemMessage.MsgHead.MOV,
  408. Parameters = new List<string>
  409. {
  410. SunWayMessageHandler.Instance.ToHWString(DestPos),
  411. SunWayMessageHandler.Instance.ArmString[hand]
  412. }
  413. };
  414. _status = RState.Running;
  415. SetRobotMovingInfo(RobotAction.Placing, hand, station);
  416. return _socket.Write(_currentMsg.ToString());
  417. }
  418. public override bool Goto(ModuleName station, Hand hand, string updown = "UP")
  419. {
  420. if (!CheckEfemStatus())
  421. return false;
  422. //判断socket是否链接
  423. if (!_socket.IsConnected)
  424. {
  425. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  426. return false;
  427. }
  428. Position DestPos = new Position { Module = station, Slot = (byte)0 };
  429. _currentMsg = new EfemMessage
  430. {
  431. Operation = EfemOperation.Goto,
  432. Head = EfemMessage.MsgHead.MOV,
  433. Parameters = new List<string>
  434. {
  435. SunWayMessageHandler.Instance.ToHWString(DestPos),
  436. SunWayMessageHandler.Instance.ArmString[hand],
  437. updown
  438. }
  439. };
  440. _status = RState.Running;
  441. return _socket.Write(_currentMsg.ToString());
  442. }
  443. public override bool Grip(Hand blade, bool isGrip)
  444. {
  445. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Grip]}");
  446. return false;
  447. }
  448. public override bool Map(ModuleName mod)
  449. {
  450. //判断机台是否准备就绪
  451. if (!_isComm)
  452. {
  453. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  454. return false;
  455. }
  456. //判断socket是否链接
  457. if (!_socket.IsConnected)
  458. {
  459. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  460. return false;
  461. }
  462. if (!CheckEfemStatus())
  463. return false;
  464. _currentMsg = new EfemMessage
  465. {
  466. Operation = EfemOperation.Map,
  467. Head = EfemMessage.MsgHead.MOV,
  468. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  469. };
  470. _status = RState.Running;
  471. return _socket.Write(_currentMsg.ToString());
  472. }
  473. public override bool Vacuum(ModuleName mod,bool VacuumState)
  474. {
  475. //判断机台是否准备就绪
  476. if (!_isComm)
  477. {
  478. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  479. return false;
  480. }
  481. //判断socket是否链接
  482. if (!_socket.IsConnected)
  483. {
  484. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  485. return false;
  486. }
  487. string strVacuum = VacuumState ? "ON" : "OFF";
  488. _currentMsg = new EfemMessage
  489. {
  490. Operation = EfemOperation.Vacuum,
  491. Head = EfemMessage.MsgHead.MOV,
  492. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod],strVacuum }
  493. };
  494. _status = RState.Running;
  495. return _socket.Write(_currentMsg.ToString());
  496. }
  497. public override bool GetWaferSize(ModuleName mod)
  498. {
  499. if (!CheckEfemStatus())
  500. return false;
  501. //判断机台是否准备就绪
  502. if (!_isComm)
  503. {
  504. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  505. return false;
  506. }
  507. //判断socket是否链接
  508. if (!_socket.IsConnected)
  509. {
  510. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  511. return false;
  512. }
  513. _currentMsg = new EfemMessage
  514. {
  515. Operation = EfemOperation.Size,
  516. Head = EfemMessage.MsgHead.GET,
  517. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  518. };
  519. _status = RState.Running;
  520. return _socket.Write(_currentMsg.ToString());
  521. }
  522. public override bool SetWaferSize(ModuleName mod, int WaferSize)
  523. {
  524. if (!CheckEfemStatus())
  525. return false;
  526. //判断机台是否准备就绪
  527. if (!_isComm)
  528. {
  529. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  530. return false;
  531. }
  532. //判断socket是否链接
  533. if (!_socket.IsConnected)
  534. {
  535. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  536. return false;
  537. }
  538. _currentMsg = new EfemMessage
  539. {
  540. Operation = EfemOperation.Size,
  541. Head = EfemMessage.MsgHead.SET,
  542. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod], WaferSize.ToString() }
  543. };
  544. _status = RState.Running;
  545. return _socket.Write(_currentMsg.ToString());
  546. }
  547. public override bool SetPinUp(ModuleName mod)
  548. {
  549. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Lift]}");
  550. return false;
  551. }
  552. public override bool SetPinDown(ModuleName mod)
  553. {
  554. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.Lift]}");
  555. return false;
  556. }
  557. public override bool SetAlignAngle(ModuleName mod, double angle)
  558. {
  559. if (!CheckEfemStatus())
  560. return false;
  561. //判断机台是否准备就绪
  562. if (!_isComm)
  563. {
  564. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  565. return false;
  566. }
  567. //判断socket是否链接
  568. if (!_socket.IsConnected)
  569. {
  570. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  571. return false;
  572. }
  573. _currentMsg = new EfemMessage
  574. {
  575. Operation = EfemOperation.Align,
  576. Head = EfemMessage.MsgHead.SET,
  577. Parameters = new List<string>
  578. {
  579. SunWayMessageHandler.Instance.ModuleString[mod],
  580. angle.ToString("000.00")
  581. }
  582. };
  583. _status = RState.Running;
  584. return _socket.Write(_currentMsg.ToString());
  585. }
  586. public override bool SetRobotSpeed(ModuleName mod, int speed)
  587. {
  588. if (!CheckEfemStatus())
  589. return false;
  590. //判断机台是否准备就绪
  591. if (!_isComm)
  592. {
  593. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  594. return false;
  595. }
  596. //判断socket是否链接
  597. if (!_socket.IsConnected)
  598. {
  599. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  600. return false;
  601. }
  602. _currentMsg = new EfemMessage
  603. {
  604. Operation = EfemOperation.Speed,
  605. Head = EfemMessage.MsgHead.SET,
  606. Parameters = new List<string>
  607. {
  608. SunWayMessageHandler.Instance.ModuleString[mod],
  609. speed.ToString()
  610. }
  611. };
  612. _status = RState.Running;
  613. return _socket.Write(_currentMsg.ToString());
  614. }
  615. public override bool RobotPowerOn(ModuleName mod, bool Status)
  616. {
  617. //判断机台是否准备就绪
  618. if (!_isComm)
  619. {
  620. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  621. return false;
  622. }
  623. //判断socket是否链接
  624. if (!_socket.IsConnected)
  625. {
  626. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  627. return false;
  628. }
  629. if (!CheckEfemStatus())
  630. return false;
  631. string status = "ON";
  632. if (!Status)
  633. {
  634. status = "OFF";
  635. }
  636. _currentMsg = new EfemMessage
  637. {
  638. Operation = EfemOperation.PowerOn,
  639. Head = EfemMessage.MsgHead.MOV,
  640. Parameters = new List<string>
  641. {
  642. SunWayMessageHandler.Instance.ModuleString[mod],
  643. status
  644. }
  645. };
  646. _status = RState.Running;
  647. return _socket.Write(_currentMsg.ToString());
  648. }
  649. public override bool Align(ModuleName mod, double angle, float delayTime, WaferSize size)
  650. {
  651. //判断机台是否准备就绪
  652. if (!_isComm)
  653. {
  654. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  655. return false;
  656. }
  657. //判断socket是否链接
  658. if (!_socket.IsConnected)
  659. {
  660. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  661. return false;
  662. }
  663. if (!CheckEfemStatus())
  664. return false;
  665. _currentMsg = new EfemMessage
  666. {
  667. Operation = EfemOperation.Align,
  668. Head = EfemMessage.MsgHead.MOV,
  669. Parameters = new List<string>
  670. {
  671. SunWayMessageHandler.Instance.ModuleString[mod]
  672. }
  673. };
  674. _status = RState.Running;
  675. return _socket.Write(_currentMsg.ToString());
  676. }
  677. public override bool SetLamp(LightType light, LightStatus status)
  678. {
  679. if (!_isComm)
  680. {
  681. return false;
  682. }
  683. //判断socket是否链接
  684. if (!_socket.IsConnected)
  685. {
  686. return false;
  687. }
  688. EfemMessage currentMsg = new EfemMessage
  689. {
  690. Module = ModuleName.EFEM,
  691. Operation = EfemOperation.Light,
  692. Head = EfemMessage.MsgHead.SET,
  693. Parameters = new List<string> { Constant.STOWER, light.ToString(), status.ToString() }
  694. };
  695. return _socket.Write(currentMsg.ToString());
  696. }
  697. public override bool Load(ModuleName mod)
  698. {
  699. //判断机台是否准备就绪
  700. if (!_isComm)
  701. {
  702. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  703. return false;
  704. }
  705. //判断socket是否链接
  706. if (!_socket.IsConnected)
  707. {
  708. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  709. return false;
  710. }
  711. if (!CheckEfemStatus())
  712. return false;
  713. _currentMsg = new EfemMessage
  714. {
  715. Module = mod,
  716. Operation = EfemOperation.Load,
  717. Head = EfemMessage.MsgHead.MOV,
  718. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  719. };
  720. _status = RState.Running;
  721. return _socket.Write(_currentMsg.ToString());
  722. }
  723. public override bool Unload(ModuleName mod)
  724. {
  725. //判断机台是否准备就绪
  726. if (!_isComm)
  727. {
  728. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  729. return false;
  730. }
  731. //判断socket是否链接
  732. if (!_socket.IsConnected)
  733. {
  734. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  735. return false;
  736. }
  737. if (!CheckEfemStatus())
  738. return false;
  739. _currentMsg = new EfemMessage
  740. {
  741. Module = mod,
  742. Operation = EfemOperation.Unload,
  743. Head = EfemMessage.MsgHead.MOV,
  744. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  745. };
  746. _status = RState.Running;
  747. return _socket.Write(_currentMsg.ToString());
  748. }
  749. public override bool ReadCarrierId(ModuleName mod)
  750. {
  751. //判断机台是否准备就绪
  752. if (!_isComm)
  753. {
  754. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  755. return false;
  756. }
  757. //判断socket是否链接
  758. if (!_socket.IsConnected)
  759. {
  760. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  761. return false;
  762. }
  763. if (!CheckEfemStatus())
  764. return false;
  765. _currentMsg = new EfemMessage
  766. {
  767. Module = mod,
  768. Operation = EfemOperation.CarrierId,
  769. Head = EfemMessage.MsgHead.GET,
  770. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  771. };
  772. _status = RState.Running;
  773. return _socket.Write(_currentMsg.ToString());
  774. }
  775. public override bool WriteCarrierId(ModuleName mod, string id)
  776. {
  777. if (!CheckEfemStatus())
  778. return false;
  779. //判断机台是否准备就绪
  780. if (!_isComm)
  781. {
  782. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  783. return false;
  784. }
  785. //判断socket是否链接
  786. if (!_socket.IsConnected)
  787. {
  788. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  789. return false;
  790. }
  791. _currentMsg = new EfemMessage
  792. {
  793. Module = mod,
  794. Operation = EfemOperation.CarrierId,
  795. Head = EfemMessage.MsgHead.SET,
  796. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod], id }
  797. };
  798. _status = RState.Running;
  799. return _socket.Write(_currentMsg.ToString());
  800. }
  801. public override bool ReadTagData(ModuleName mod)
  802. {
  803. return ReadCarrierId(mod);
  804. }
  805. public override bool WriteTagData(ModuleName mod, string tagData)
  806. {
  807. return WriteCarrierId(mod, tagData);
  808. }
  809. public override bool Dock(ModuleName mod)
  810. {
  811. //判断机台是否准备就绪
  812. if (!_isComm)
  813. {
  814. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  815. return false;
  816. }
  817. //判断socket是否链接
  818. if (!_socket.IsConnected)
  819. {
  820. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  821. return false;
  822. }
  823. if (!CheckEfemStatus())
  824. return false;
  825. _currentMsg = new EfemMessage
  826. {
  827. Module = mod,
  828. Operation = EfemOperation.Dock,
  829. Head = EfemMessage.MsgHead.MOV,
  830. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  831. };
  832. _status = RState.Running;
  833. return _socket.Write(_currentMsg.ToString());
  834. }
  835. public override bool Undock(ModuleName mod)
  836. {
  837. //判断机台是否准备就绪
  838. if (!_isComm)
  839. {
  840. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  841. return false;
  842. }
  843. //判断socket是否链接
  844. if (!_socket.IsConnected)
  845. {
  846. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  847. return false;
  848. }
  849. if (!CheckEfemStatus())
  850. return false;
  851. _currentMsg = new EfemMessage
  852. {
  853. Module = mod,
  854. Operation = EfemOperation.Undock,
  855. Head = EfemMessage.MsgHead.MOV,
  856. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  857. };
  858. _status = RState.Running;
  859. return _socket.Write(_currentMsg.ToString());
  860. }
  861. public override bool Clamp(ModuleName mod, bool isUnloadClamp)
  862. {
  863. //判断机台是否准备就绪
  864. if (!_isComm)
  865. {
  866. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  867. return false;
  868. }
  869. //判断socket是否链接
  870. if (!_socket.IsConnected)
  871. {
  872. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  873. return false;
  874. }
  875. if (!CheckEfemStatus())
  876. return false;
  877. _currentMsg = new EfemMessage
  878. {
  879. Module = mod,
  880. Operation = EfemOperation.Clamp,
  881. Head = EfemMessage.MsgHead.MOV,
  882. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  883. };
  884. _status = RState.Running;
  885. _bIsUnloadClamp = isUnloadClamp;
  886. return _socket.Write(_currentMsg.ToString());
  887. }
  888. public override bool Unclamp(ModuleName mod)
  889. {
  890. //判断机台是否准备就绪
  891. if (!_isComm)
  892. {
  893. LOG.WriteLog(eEvent.ERROR_EFEM_NOREADY, Module.ToString(), "No \"CommReady\" Message Received,Cannot Execute Action");
  894. return false;
  895. }
  896. //判断socket是否链接
  897. if (!_socket.IsConnected)
  898. {
  899. LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
  900. return false;
  901. }
  902. if (!CheckEfemStatus())
  903. return false;
  904. _currentMsg = new EfemMessage
  905. {
  906. Module = mod,
  907. Operation = EfemOperation.Unclamp,
  908. Head = EfemMessage.MsgHead.MOV,
  909. Parameters = new List<string> { SunWayMessageHandler.Instance.ModuleString[mod] }
  910. };
  911. _status = RState.Running;
  912. return _socket.Write(_currentMsg.ToString());
  913. }
  914. public override bool SetThickness(ModuleName mod, string thickness)
  915. {
  916. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support {EfemConstant.OperationString[EfemOperation.SetThickness]}");
  917. return false;
  918. }
  919. public override void SetRobotMovingInfo(RobotAction action, Hand hand, ModuleName target)
  920. {
  921. blockingCollection.Add(new RobotAnimationData(action, hand, target));
  922. }
  923. private void OnReceiveMessage(string RevMsg)
  924. {
  925. LOG.WriteBackgroundLog(eEvent.EV_EFEM_COMMON_INFO, Module.ToString(), RevMsg.Replace("\r",""));
  926. if (!_isComm)
  927. {
  928. //检验是否收到CommReady信号
  929. if (RevMsg.IndexOf("COMM", StringComparison.OrdinalIgnoreCase) >= 0)
  930. {
  931. _isComm = true;
  932. }
  933. }
  934. string[] msgs = RevMsg.Split('\r');
  935. foreach (var msg in msgs)
  936. {
  937. if (string.IsNullOrWhiteSpace(msg)) continue;
  938. EfemMessage rec_msg = SunWayMessageHandler.Instance.ToMessage(msg);
  939. switch (rec_msg.Head)
  940. {
  941. case EfemMessage.MsgHead.ACK:
  942. if (msg.Contains("ERROR"))
  943. {
  944. _revMsg = rec_msg;
  945. }
  946. break;
  947. case EfemMessage.MsgHead.INF:
  948. // 收到INF之后发送ACK确认
  949. string strACK = rec_msg.RawString.Replace("INF", "ACK");
  950. SendBack(strACK);
  951. LOG.WriteBackgroundLog(eEvent.EV_EFEM_COMMON_INFO, Module.ToString(), strACK);
  952. //提示当前机械臂速度设置情况
  953. if (strACK.Contains("SPEED"))
  954. {
  955. string[] SpeedInf = rec_msg.RawString.Split('/');
  956. LOG.Write(eEvent.INFO_PROCESS, ModuleName.Robot, $"Robot Speed is {SpeedInf[SpeedInf.Length-1]}");
  957. }
  958. //提示当前机械臂电源情况
  959. if (strACK.Contains("SERVOS"))
  960. {
  961. string[] PowerInf = rec_msg.RawString.Split('/');
  962. LOG.Write(eEvent.INFO_PROCESS, ModuleName.Robot, $"Robot Power is {PowerInf[PowerInf.Length - 1]}");
  963. }
  964. EfemMessage ack_msg = SunWayMessageHandler.Instance.ToMessage(strACK);
  965. ack_msg.Direct = MsgDirection.To;
  966. _revMsg = rec_msg;
  967. OnCommandUpdated(rec_msg);
  968. SetRobotMovingInfo(RobotAction.None, Hand.Both, ModuleName.EfemRobot);
  969. break;
  970. case EfemMessage.MsgHead.EVT:
  971. OnEventUpdated(new EfemEventArgs
  972. {
  973. EvtStr = rec_msg.ToParamString(),
  974. Module = rec_msg.Module,
  975. CommandType = rec_msg.Operation,
  976. DataList = rec_msg.Data
  977. });
  978. if (rec_msg.Operation == EfemOperation.Home)
  979. {
  980. SetRobotMovingInfo(RobotAction.Homing, Hand.Both, ModuleName.EFEM);
  981. }
  982. if (rec_msg.Operation == EfemOperation.Error)
  983. {
  984. OnErrorOccurred(rec_msg);
  985. }
  986. break;
  987. case EfemMessage.MsgHead.NAK:
  988. case EfemMessage.MsgHead.CAN:
  989. case EfemMessage.MsgHead.ABS:
  990. OnErrorOccurred(rec_msg);
  991. break;
  992. }
  993. }
  994. }
  995. private void OnErrorHappen(ErrorEventArgs args)
  996. {
  997. _status = RState.Failed;
  998. if(_error!=args.Reason)
  999. {
  1000. _error=args.Reason;
  1001. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"{Module} {_error}");
  1002. }
  1003. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  1004. }
  1005. private void OnErrorOccurred(EfemMessage message)
  1006. {
  1007. string description = string.Empty;
  1008. string str = "";
  1009. switch (message.Head)
  1010. {
  1011. case EfemMessage.MsgHead.NAK:
  1012. description = Constant.SunWayFactorString.ContainsKey(message.Factor) ? Constant.SunWayFactorString[message.Factor]:message.Factor;
  1013. break;
  1014. case EfemMessage.MsgHead.CAN:
  1015. description = Constant.SunWayFactorString.ContainsKey(message.Factor) ? Constant.SunWayFactorString[message.Factor] : message.Factor;
  1016. str = message.Data.Count != 0 ? message.Data[0] : "";
  1017. break;
  1018. case EfemMessage.MsgHead.ABS:
  1019. description = message.Factor;
  1020. str = message.Data.Count != 0 ? String.Join(" ", message.Data.ToArray()):"";
  1021. break;
  1022. case EfemMessage.MsgHead.EVT:
  1023. str= message.Data.Count != 0 ? String.Join(" ", message.Data.ToArray()) : "";
  1024. break;
  1025. }
  1026. _status = RState.Failed;
  1027. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,description);
  1028. if (message.Head == EfemMessage.MsgHead.NAK || message.Head == EfemMessage.MsgHead.CAN)
  1029. {
  1030. eEvent eEvent = GetFactorEventId(message.Factor);
  1031. LOG.Write(eEvent, ModuleName.EFEM, $"{description}, [{str}]");
  1032. }
  1033. else
  1034. {
  1035. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, $"{description}, [{str}]");
  1036. }
  1037. }
  1038. /// <summary>
  1039. /// 根据Factor获取相应的eEventId
  1040. /// </summary>
  1041. /// <param name="factor"></param>
  1042. /// <returns></returns>
  1043. private eEvent GetFactorEventId(string factor)
  1044. {
  1045. string str = $"ERR_EFEM_{factor}";
  1046. if(Enum.TryParse(str,out eEvent result))
  1047. {
  1048. return result;
  1049. }
  1050. else
  1051. {
  1052. return eEvent.ERR_EFEM_COMMON_FAILED;
  1053. }
  1054. }
  1055. private void OnEventUpdated(EfemEventArgs eArg)
  1056. {
  1057. switch (eArg.CommandType)
  1058. {
  1059. case EfemOperation.SigStatus:
  1060. // EVT:SIGSTAT/Parameter/DATA1/DATA2;
  1061. string sParam = eArg.DataList[0];
  1062. // DATA1 & DATA2
  1063. int nData1 = Convert.ToInt32(eArg.DataList[1], 16);
  1064. int nData2 = Convert.ToInt32(eArg.DataList[2], 16);
  1065. BitArray baData1 = new BitArray(new int[] { nData1 });
  1066. BitArray baData2 = new BitArray(new int[] { nData2 });
  1067. if (0 == string.Compare(sParam, Constant.SYS, true))
  1068. {
  1069. // EVT:SIGSTAT/System/00000000/00000004;
  1070. // DATA1
  1071. if (!baData1[0]) // Bit[0] ON=Normal, OFF=Abnormal
  1072. {
  1073. string error = "EFEM Door is OFF Alarm";
  1074. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1075. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1076. }
  1077. if (!baData1[1]) // Bit[0] ON=Normal, OFF=Abnormal
  1078. {
  1079. string error = "EFEM Vacuum Detection is OFF Alarm";
  1080. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1081. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error, error);
  1082. }
  1083. if (!baData1[2]) // Bit[2] ON=Normal, OFF=Abnormal
  1084. {
  1085. string error = "EFEM Air Detection is OFF Alarm";
  1086. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1087. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1088. }
  1089. if (!baData1[3]) // Bit[3] ON=Normal, OFF=Abnormal
  1090. {
  1091. string error = "EFEM OnlineMode is OFF Alarm";
  1092. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1093. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1094. }
  1095. if (baData1[4]) // Bit[4] ON=Abnormal, OFF=Normal
  1096. {
  1097. string error = "EFEM MaintenanceMode is ON Alarm";
  1098. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1099. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error, error);
  1100. }
  1101. if (baData1[5]) // Bit[5] ON=Abnormal, OFF=Normal
  1102. {
  1103. string error = "EFEM System Wafer Stick-out1 Alarm";
  1104. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1105. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error, error);
  1106. }
  1107. if (baData1[6]) // Bit[6] ON=Abnormal, OFF=Normal
  1108. {
  1109. string error = "EFEM System Wafer Stick-out2 Alarm";
  1110. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, error);
  1111. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1112. }
  1113. if (baData1[7]) // Bit[7] ON=Abnormal, OFF=Normal
  1114. {
  1115. string error = "EFEM Emergency Stop Signal Alarm";
  1116. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM,error);
  1117. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1118. }
  1119. // DATA2
  1120. _signalT.ChangeLightStatus(LightType.BUZZER1, baData2[0] ? LightStatus.ON : LightStatus.OFF);
  1121. _signalT.ChangeLightStatus(LightType.BLUE, baData2[1] ? LightStatus.ON : LightStatus.OFF);
  1122. _signalT.ChangeLightStatus(LightType.GREEN, baData2[2] ? LightStatus.ON : LightStatus.OFF);
  1123. _signalT.ChangeLightStatus(LightType.YELLOW, baData2[3] ? LightStatus.ON : LightStatus.OFF);
  1124. _signalT.ChangeLightStatus(LightType.RED, baData2[4] ? LightStatus.ON : LightStatus.OFF);
  1125. _signalT.ChangeLightStatus(LightType.BLUE, baData2[6] ? LightStatus.BLINK : LightStatus.OFF);
  1126. _signalT.ChangeLightStatus(LightType.GREEN, baData2[7] ? LightStatus.BLINK : LightStatus.OFF);
  1127. _signalT.ChangeLightStatus(LightType.YELLOW, baData2[8] ? LightStatus.BLINK : LightStatus.OFF);
  1128. _signalT.ChangeLightStatus(LightType.RED, baData2[9] ? LightStatus.BLINK : LightStatus.OFF);
  1129. //屏蔽LP光栅信号
  1130. /* EFEM 程序中目前没有实现
  1131. _RobotErr.CLK = baData2[27]; // bit 27
  1132. bool bArmNotExtendLLA = baData2[30]; // bit 30
  1133. bool bArmNotExtendLLB = baData2[31]; // bit 31
  1134. */
  1135. } // system event
  1136. else
  1137. {
  1138. // placement & present
  1139. bool bPlacement = baData1[0]; // bit 0
  1140. bool bPresence = baData1[0]; // bit 1
  1141. bool bArrived = bPlacement && bPresence;
  1142. _LPMs[eArg.Module - ModuleName.LP1].UpdateWaferArrive(bArrived);
  1143. _LPMs[eArg.Module - ModuleName.LP1].IsClamped = baData1[1];
  1144. _LPMs[eArg.Module - ModuleName.LP1].IsDocked = baData1[2];
  1145. _LPMs[eArg.Module - ModuleName.LP1].IsDoorOpened = !baData1[5];
  1146. //_LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  1147. } // FOUP EVENT
  1148. break;
  1149. case EfemOperation.GetWaferInfo:
  1150. //MADPT
  1151. //lp
  1152. if (ModuleHelper.IsLoadPort(eArg.Module))
  1153. {
  1154. _LPMs[eArg.Module - ModuleName.LP1].HandleEvent(eArg);
  1155. }
  1156. // BF
  1157. else
  1158. {
  1159. MapBufferHandleEvent(eArg);
  1160. }
  1161. //buffer
  1162. break;
  1163. case EfemOperation.Align:
  1164. //ALIGN
  1165. MapBufferHandleEvent(eArg);
  1166. break;
  1167. default:
  1168. break;
  1169. }
  1170. }
  1171. public void MapBufferHandleEvent(EfemEventArgs eArg)
  1172. {
  1173. string sWaferInfo = eArg.DataList[0];
  1174. for (byte index = 0; index < sWaferInfo.Length; index++)
  1175. {
  1176. int waferState = int.Parse(sWaferInfo.Substring(index, 1));
  1177. //合理的映射到内部支持的叠片/交叉片
  1178. if (waferState >= 7) waferState = 7;
  1179. else if (waferState >= 2) waferState = 3;
  1180. WaferStatus st = (WaferStatus)waferState;
  1181. if (st != WaferStatus.Empty)
  1182. {
  1183. WaferManager.Instance.CreateWafer(eArg.Module, index, st);
  1184. }
  1185. else
  1186. {
  1187. WaferManager.Instance.DeleteWafer(eArg.Module, index);
  1188. }
  1189. }
  1190. }
  1191. private void OnCommandUpdated(EfemMessage message)
  1192. {
  1193. try
  1194. {
  1195. switch (message.Operation)
  1196. {
  1197. case EfemOperation.ClearError:
  1198. case EfemOperation.Align:
  1199. case EfemOperation.Pick:
  1200. case EfemOperation.Place:
  1201. case EfemOperation.Extend:
  1202. case EfemOperation.Goto:
  1203. case EfemOperation.Orgsh:
  1204. case EfemOperation.EmsStop:
  1205. case EfemOperation.Abort:
  1206. case EfemOperation.Speed:
  1207. case EfemOperation.Vacuum:
  1208. case EfemOperation.PowerOn:
  1209. _status = RState.End;
  1210. break;
  1211. case EfemOperation.Map:
  1212. if (ModuleHelper.IsLoadPort(message.Module))
  1213. {
  1214. _LPMs[message.Module - ModuleName.LP1].OnMaped();
  1215. }
  1216. _status = RState.End;
  1217. break;
  1218. case EfemOperation.StateTrack:
  1219. {
  1220. string str = message.Data.Count >= 1 ? message.Data.First() : string.Empty;
  1221. if (str.ToLower() == "track")
  1222. {
  1223. string strA = message.Data.Count > 1 ? message.Data[1].ToString() : string.Empty;
  1224. if (strA.ToLower() != NONE.ToLower())
  1225. {
  1226. if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0))
  1227. {
  1228. WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 0, WaferStatus.Normal);
  1229. }
  1230. }
  1231. string strB = message.Data.Count > 2 ? message.Data[2].ToString() : string.Empty;
  1232. if (strB.ToLower() != NONE.ToLower())
  1233. {
  1234. if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 1))
  1235. {
  1236. WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 1, WaferStatus.Normal);
  1237. }
  1238. }
  1239. }
  1240. _status = RState.End;
  1241. }
  1242. break;
  1243. case EfemOperation.Home:
  1244. {
  1245. if (_currentMsg.Module == ModuleName.EFEM)
  1246. {
  1247. _LPMs[0].OnHomed();
  1248. _LPMs[1].OnHomed();
  1249. _LPMs[2].OnHomed();
  1250. }
  1251. else if (ModuleHelper.IsLoadPort(_currentMsg.Module))
  1252. {
  1253. _LPMs[_currentMsg.Module - ModuleName.LP1].OnHomed();
  1254. }
  1255. _status = RState.End;
  1256. }
  1257. break;
  1258. case EfemOperation.Load:
  1259. {
  1260. _LPMs[message.Module - ModuleName.LP1].OnLoaded();
  1261. _status = RState.End;
  1262. }
  1263. break;
  1264. case EfemOperation.Unload:
  1265. {
  1266. _LPMs[message.Module - ModuleName.LP1].OnUnloaded();
  1267. _status = RState.End;
  1268. }
  1269. break;
  1270. case EfemOperation.CarrierId:
  1271. {
  1272. if (message.Head == EfemMessage.MsgHead.GET)
  1273. {
  1274. _LPMs[message.Module - ModuleName.LP1].OnCarrierIDRead(message.Data.First());
  1275. }
  1276. else
  1277. {
  1278. _LPMs[message.Module - ModuleName.LP1].OnCarrierIDWrite(message.Data.First());
  1279. }
  1280. _status = RState.End;
  1281. }
  1282. break;
  1283. case EfemOperation.Clamp:
  1284. {
  1285. _LPMs[message.Module - ModuleName.LP1].OnClamped(_bIsUnloadClamp);
  1286. _status = RState.End;
  1287. }
  1288. break;
  1289. case EfemOperation.Unclamp:
  1290. {
  1291. _LPMs[message.Module - ModuleName.LP1].OnUnclamped();
  1292. _status = RState.End;
  1293. }
  1294. break;
  1295. case EfemOperation.Dock:
  1296. {
  1297. _LPMs[message.Module - ModuleName.LP1].OnDocked();
  1298. _status = RState.End;
  1299. }
  1300. break;
  1301. case EfemOperation.Undock:
  1302. {
  1303. _LPMs[message.Module - ModuleName.LP1].OnUndocked();
  1304. _status = RState.End;
  1305. }
  1306. break;
  1307. case EfemOperation.Ready:
  1308. {
  1309. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.CommReady);
  1310. }
  1311. break;
  1312. case EfemOperation.Size:
  1313. {
  1314. if (message.Data.Count != 0)
  1315. {
  1316. if(ModuleHelper.IsLoadPort(message.Module))
  1317. {
  1318. string waferSize = message.Data[0];
  1319. if (waferSize == "200")
  1320. {
  1321. _LPMs[message.Module - ModuleName.LP1].UpdateWaferSize(WaferSize.WS8);
  1322. }
  1323. else if (waferSize == "300")
  1324. {
  1325. _LPMs[message.Module - ModuleName.LP1].UpdateWaferSize(WaferSize.WS12);
  1326. }
  1327. else
  1328. {
  1329. _LPMs[message.Module - ModuleName.LP1].UpdateWaferSize(WaferSize.WS0);
  1330. }
  1331. }
  1332. }
  1333. _status = RState.End;
  1334. }
  1335. break;
  1336. }
  1337. }
  1338. catch(Exception ex)
  1339. {
  1340. string error = $"OnCommandUpdated meets {ex.Message}";
  1341. LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), error);
  1342. _status = RState.Failed;
  1343. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error,error);
  1344. }
  1345. }
  1346. async void SendBack(string data)
  1347. {
  1348. await Task.Run(() => _socket.Write(data + '\r'));
  1349. }
  1350. }
  1351. }