PreAligner.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Event;
  3. using Aitex.Core.Util;
  4. using Aitex.Sorter.Common;
  5. using athosRT.tool;
  6. using Common.DataCenter;
  7. using MECF.Framework.Common.Communications;
  8. using MECF.Framework.Common.SubstrateTrackings;
  9. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Text.RegularExpressions;
  15. using System.Threading.Tasks;
  16. namespace athosRT.Devices.PA
  17. {
  18. public abstract class PreAligner : BaseDevice, IDevice, IConnection
  19. {
  20. public enum PAStatus
  21. {
  22. Init,
  23. Idle,
  24. Error,
  25. Home,
  26. Align,
  27. Reset
  28. }
  29. public const string delimiter = "\r";
  30. private static object _locker = new object();
  31. private AsyncSocket _socket;
  32. private IHandler _eventHandler = null;
  33. private IHandler _backgroundHandler = null;
  34. private IHandler _foregroundHandler = null;
  35. private IAlignerHandlerFactory _factory = null;
  36. private bool _commErr = false;
  37. private string _addr;
  38. private DeviceTimer _timerQuery = new DeviceTimer();
  39. private string AlarmAlignerMotionError = "AlignerMotionError";
  40. public string Address => _addr;
  41. public virtual bool IsConnected => _socket.IsConnected;
  42. public int LastErrorCode { get; set; }
  43. public virtual PAStatus Status { get; set; }
  44. public int ErrorCode { get; set; }
  45. public int ElapseTime { get; set; }
  46. public int Notch { get; set; }
  47. public bool Initalized { get; set; }
  48. public bool Communication => !_commErr;
  49. public virtual bool Busy => _backgroundHandler != null || _foregroundHandler != null;
  50. public virtual bool Moving => _backgroundHandler != null;
  51. public virtual bool Error => ErrorCode >= Convert.ToInt32("2EB0", 16) || _commErr;
  52. public virtual int Feedback4Inch => 1;
  53. public virtual int Feedback3Inch => 1;
  54. public virtual int SetPoint4Inch => 1;
  55. public virtual int SetPoint3Inch => 1;
  56. public virtual bool SetPointLift => false;
  57. public DeviceState State
  58. {
  59. get
  60. {
  61. if (!Initalized)
  62. {
  63. return DeviceState.Unknown;
  64. }
  65. if (Error)
  66. {
  67. return DeviceState.Error;
  68. }
  69. if (Busy)
  70. {
  71. return DeviceState.Busy;
  72. }
  73. return DeviceState.Idle;
  74. }
  75. }
  76. public bool StateWaferHold { get; set; }
  77. public virtual bool Disconnect()
  78. {
  79. return true;
  80. }
  81. public virtual bool Connect()
  82. {
  83. return true;
  84. }
  85. public PreAligner(string module, string name, string display, string deviceId, string address)
  86. : base(module, name, display, deviceId)
  87. {
  88. _addr = address;
  89. if (!string.IsNullOrEmpty(_addr))
  90. {
  91. _socket = new AsyncSocket(address);
  92. _socket.OnDataChanged += OnDataChanged;
  93. //_socket.OnErrorHappened += OnErrorHandler;
  94. }
  95. Initalized = false;
  96. _commErr = false;
  97. Singleton<WaferManager>.Instance.SubscribeLocation(name, 1);
  98. }
  99. public virtual bool Initialize()
  100. {
  101. _eventHandler = _factory.Event();
  102. Singleton<ConnectionManager>.Instance.Subscribe(base.Name, this);
  103. if (!string.IsNullOrEmpty(_addr))
  104. {
  105. _socket.Connect(_addr);
  106. }
  107. DEVICE.Register(string.Format("{0}.{1}", base.Name, "Init"), delegate (out string reason, int time, object[] param)
  108. {
  109. if (Init(out reason))
  110. {
  111. reason = string.Format("{0} {1}", base.Name, "Init");
  112. return true;
  113. }
  114. return false;
  115. });
  116. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerInit"), delegate (out string reason, int time, object[] param)
  117. {
  118. if (Init(out reason))
  119. {
  120. reason = string.Format("{0} {1}", base.Name, "Init");
  121. return true;
  122. }
  123. return false;
  124. });
  125. DEVICE.Register(string.Format("{0}.{1}", base.Name, "Home"), delegate (out string reason, int time, object[] param)
  126. {
  127. if (Home(out reason))
  128. {
  129. reason = string.Format("{0} {1}", base.Name, "Home");
  130. return true;
  131. }
  132. return false;
  133. });
  134. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerHome"), delegate (out string reason, int time, object[] param)
  135. {
  136. if (Home(out reason))
  137. {
  138. reason = string.Format("{0} {1}", base.Name, "Home");
  139. return true;
  140. }
  141. return false;
  142. });
  143. DEVICE.Register(string.Format("{0}.{1}", base.Name, "Reset"), delegate (out string reason, int time, object[] param)
  144. {
  145. if (Clear(out reason))
  146. {
  147. reason = string.Format("{0} {1}", base.Name, "Reset Error");
  148. return true;
  149. }
  150. return false;
  151. });
  152. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerReset"), delegate (out string reason, int time, object[] param)
  153. {
  154. if (Clear(out reason))
  155. {
  156. reason = string.Format("{0} {1}", base.Name, "Reset Error");
  157. return true;
  158. }
  159. return false;
  160. });
  161. DEVICE.Register(string.Format("{0}.{1}", base.Name, "Grip"), delegate (out string reason, int time, object[] param)
  162. {
  163. if (Grip(Hand.Blade1, out reason))
  164. {
  165. reason = string.Format("{0} {1}", base.Name, "Hold Wafer");
  166. return true;
  167. }
  168. return false;
  169. });
  170. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerGrip"), delegate (out string reason, int time, object[] param)
  171. {
  172. if (Grip(Hand.Blade1, out reason))
  173. {
  174. reason = string.Format("{0} {1}", base.Name, "Hold Wafer");
  175. return true;
  176. }
  177. return false;
  178. });
  179. DEVICE.Register(string.Format("{0}.{1}", base.Name, "Release"), delegate (out string reason, int time, object[] param)
  180. {
  181. if (Release(Hand.Blade1, out reason))
  182. {
  183. reason = string.Format("{0} {1}", base.Name, "Release Wafer");
  184. return true;
  185. }
  186. return false;
  187. });
  188. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerRelease"), delegate (out string reason, int time, object[] param)
  189. {
  190. if (Release(Hand.Blade1, out reason))
  191. {
  192. reason = string.Format("{0} {1}", base.Name, "Release Wafer");
  193. return true;
  194. }
  195. return false;
  196. });
  197. DEVICE.Register(string.Format("{0}.{1}", base.Name, "LiftUp"), delegate (out string reason, int time, object[] param)
  198. {
  199. if (LiftUp(out reason))
  200. {
  201. reason = string.Format("{0} {1}", base.Name, "Lifter Up");
  202. return true;
  203. }
  204. return false;
  205. });
  206. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerLiftUp"), delegate (out string reason, int time, object[] param)
  207. {
  208. if (LiftUp(out reason))
  209. {
  210. reason = string.Format("{0} {1}", base.Name, "Lifter Up");
  211. return true;
  212. }
  213. return false;
  214. });
  215. DEVICE.Register(string.Format("{0}.{1}", base.Name, "LiftDown"), delegate (out string reason, int time, object[] param)
  216. {
  217. if (LiftDown(out reason))
  218. {
  219. reason = string.Format("{0} {1}", base.Name, "Lifter Down");
  220. return true;
  221. }
  222. return false;
  223. });
  224. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerLiftDown"), delegate (out string reason, int time, object[] param)
  225. {
  226. if (LiftDown(out reason))
  227. {
  228. reason = string.Format("{0} {1}", base.Name, "Lifter Down");
  229. return true;
  230. }
  231. return false;
  232. });
  233. DEVICE.Register(string.Format("{0}.{1}", base.Name, "Stop"), delegate (out string reason, int time, object[] param)
  234. {
  235. if (Stop(out reason))
  236. {
  237. reason = string.Format("{0} {1}", base.Name, "Stop Align");
  238. return true;
  239. }
  240. return false;
  241. });
  242. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerStop"), delegate (out string reason, int time, object[] param)
  243. {
  244. if (Stop(out reason))
  245. {
  246. reason = string.Format("{0} {1}", base.Name, "Stop Align");
  247. return true;
  248. }
  249. return false;
  250. });
  251. DEVICE.Register(string.Format("{0}.{1}", base.Name, "Align"), delegate (out string reason, int time, object[] param)
  252. {
  253. double angle2 = double.Parse((string)param[0]);
  254. if (Align(angle2, out reason))
  255. {
  256. reason = string.Format("{0} {1}", base.Name, "PreAlign");
  257. return true;
  258. }
  259. return false;
  260. });
  261. DEVICE.Register(string.Format("{0}.{1}", base.Name, "AlignerAlign"), delegate (out string reason, int time, object[] param)
  262. {
  263. double angle = double.Parse((string)param[0]);
  264. if (Align(angle, out reason))
  265. {
  266. reason = string.Format("{0} {1}", base.Name, "PreAlign");
  267. return true;
  268. }
  269. return false;
  270. });
  271. DATA.Subscribe(base.Name + ".State", () => State);
  272. DATA.Subscribe(base.Name + ".AlignerState", () => State.ToString());
  273. DATA.Subscribe(base.Name + ".Busy", () => Busy);
  274. DATA.Subscribe(base.Name + ".ErrorCode", () => ErrorCode);
  275. DATA.Subscribe(base.Name + ".Error", () => Error);
  276. DATA.Subscribe(base.Name + ".ElapseTime", () => ElapseTime);
  277. DATA.Subscribe(base.Name + ".Notch", () => Notch);
  278. //EV.Subscribe(new EventItem(0, "Event", AlarmAlignerMotionError, "Aligner error", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  279. return true;
  280. }
  281. public virtual void Terminate()
  282. {
  283. _socket.Dispose();
  284. }
  285. public virtual void Monitor()
  286. {
  287. }
  288. public virtual void Reset()
  289. {
  290. lock (_locker)
  291. {
  292. _foregroundHandler = null;
  293. _backgroundHandler = null;
  294. }
  295. if (_commErr)
  296. {
  297. _commErr = false;
  298. _socket.Connect(_addr);
  299. }
  300. }
  301. public virtual bool Init(out string reason)
  302. {
  303. reason = string.Empty;
  304. return true;
  305. }
  306. public virtual bool Home(out string reason)
  307. {
  308. reason = string.Empty;
  309. return true;
  310. }
  311. public virtual bool Clear(out string reason)
  312. {
  313. reason = string.Empty;
  314. return true;
  315. }
  316. public virtual bool Grip(Hand hand, out string reason)
  317. {
  318. reason = string.Empty;
  319. return true;
  320. }
  321. public virtual bool Release(Hand hand, out string reason)
  322. {
  323. reason = string.Empty;
  324. return true;
  325. }
  326. public virtual bool LiftUp(out string reason)
  327. {
  328. reason = string.Empty;
  329. return true;
  330. }
  331. public virtual bool LiftDown(out string reason)
  332. {
  333. reason = string.Empty;
  334. return true;
  335. }
  336. public virtual bool MoveToReady(out string reason)
  337. {
  338. reason = string.Empty;
  339. return true;
  340. }
  341. public virtual bool Align(double angle, out string reason)
  342. {
  343. reason = string.Empty;
  344. return true;
  345. }
  346. public virtual bool QueryState(out string reason)
  347. {
  348. reason = string.Empty;
  349. return execute(_factory.QueryState(), out reason);
  350. }
  351. public virtual bool Stop(out string reason)
  352. {
  353. reason = string.Empty;
  354. lock (_locker)
  355. {
  356. _foregroundHandler = null;
  357. _backgroundHandler = null;
  358. }
  359. return execute(_factory.Stop(), out reason);
  360. }
  361. private bool execute(IHandler handler, out string reason)
  362. {
  363. reason = string.Empty;
  364. lock (_locker)
  365. {
  366. if (_foregroundHandler != null)
  367. {
  368. reason = "System busy, please wait or reset system.";
  369. //EV.PostMessage(base.Name, EventEnum.DefaultWarning, $"{base.DeviceID} {handler.ToString()} {reason}");
  370. return false;
  371. }
  372. if (_backgroundHandler != null && handler.IsBackground)
  373. {
  374. reason = "System busy,one background command is running, please wait or reset system.";
  375. //EV.PostMessage(base.Name, EventEnum.DefaultWarning, $"{base.DeviceID} {handler.ToString()} {reason}");
  376. return false;
  377. }
  378. handler.Unit = 2;
  379. if (!handler.Execute(ref _socket))
  380. {
  381. reason = "Communication error,please check it.";
  382. return false;
  383. }
  384. if (handler.IsBackground)
  385. {
  386. _backgroundHandler = handler;
  387. }
  388. else
  389. {
  390. _foregroundHandler = handler;
  391. }
  392. }
  393. return true;
  394. }
  395. private void OnDataChanged(string package)
  396. {
  397. try
  398. {
  399. package = package.ToUpper();
  400. string[] array = Regex.Split(package, "\r");
  401. string[] array2 = array;
  402. foreach (string text in array2)
  403. {
  404. if (text.Length <= 0)
  405. {
  406. continue;
  407. }
  408. bool completed = false;
  409. string msg = text;
  410. lock (_locker)
  411. {
  412. if (_foregroundHandler != null && _foregroundHandler.OnMessage(ref _socket, msg, out completed))
  413. {
  414. _foregroundHandler = null;
  415. }
  416. else if (_backgroundHandler != null && _backgroundHandler.OnMessage(ref _socket, msg, out completed))
  417. {
  418. if (completed)
  419. {
  420. string reason = string.Empty;
  421. QueryState(out reason);
  422. _backgroundHandler = null;
  423. }
  424. }
  425. else if (_eventHandler != null && _eventHandler.OnMessage(ref _socket, msg, out completed) && completed)
  426. {
  427. //EV.PostMessage("Aligner", EventEnum.DefaultWarning, $" has error. {ErrorCode:X}");
  428. OnError($" has error. {ErrorCode:X}");
  429. }
  430. }
  431. }
  432. }
  433. catch (ExcuteFailedException ex)
  434. {
  435. //EV.PostMessage("Aligner", EventEnum.DefaultWarning, $"executed failed. {ex.Message}");
  436. OnError($"executed failed. {ex.Message}");
  437. }
  438. catch (InvalidPackageException ex2)
  439. {
  440. //EV.PostMessage("Aligner", EventEnum.DefaultWarning, $"receive invalid package. {ex2.Message}");
  441. OnError($"receive invalid package. {ex2.Message}");
  442. }
  443. catch (Exception ex3)
  444. {
  445. _commErr = true;
  446. //LOG.Write("Aligner failed:" + ex3.ToString(), 2, "D:\\sorter\\trunk\\Framework\\RTEquipmentLibrary\\HardwareUnits\\Robots\\Aligner.cs", "OnDataChanged", 604);
  447. }
  448. }
  449. private void OnErrorHandler(ErrorEventArgs args)
  450. {
  451. Initalized = false;
  452. _commErr = true;
  453. //EV.PostMessage(base.Module, EventEnum.CommunicationError, base.Display, args.Reason);
  454. OnError("Communciation Error");
  455. }
  456. private void OnError(string errortext)
  457. {
  458. //EV.Notify(AlarmAlignerMotionError, new SerializableDictionary<string, object> { { "AlarmText", errortext } });
  459. }
  460. }
  461. }