TazmoAlignerII.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. using System;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.DataCenter;
  5. using Aitex.Core.Util;
  6. using Aitex.Sorter.Common;
  7. using Aitex.Core.RT.Device;
  8. using MECF.Framework.Common.Communications;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using System.Collections.Generic;
  11. using Aitex.Core.RT.SCCore;
  12. using System.IO.Ports;
  13. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.AlignersBase;
  14. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TazmoAligners;
  15. using System.Threading;
  16. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TazmoAlignerIIs
  17. {
  18. public class TazmoAlignerII : AlignerBaseDevice, IConnection
  19. {
  20. public enum AlignerType
  21. {
  22. Mechnical = 0,
  23. Vaccum,
  24. }
  25. public string Address
  26. {
  27. get
  28. {
  29. return "";
  30. }
  31. }
  32. public virtual bool IsConnected
  33. {
  34. get { return true; }
  35. }
  36. public virtual bool Disconnect()
  37. {
  38. return true;
  39. }
  40. public virtual bool Connect()
  41. {
  42. return true;
  43. }
  44. public const string delimiter = "\r";
  45. public int LastErrorCode { get; set; }
  46. public int Status { get; set; }
  47. public int ElapseTime { get; set; }
  48. public int Notch { get; set; }
  49. public bool Initalized { get; set; }
  50. protected AlignerType _tazmotype => (AlignerType)SC.GetValue<int>($"{_scRoot}.{Name}.AlignerType");
  51. public AlignerType TazmoType { get => _tazmotype; }
  52. //public override bool IsNeedRelease
  53. //{
  54. // get
  55. // {
  56. // return true;
  57. // }
  58. //}
  59. public int AligneTimesNoHome
  60. {
  61. get;set;
  62. }
  63. public bool Communication
  64. {
  65. get
  66. {
  67. return !_commErr;
  68. }
  69. }
  70. public virtual bool Error
  71. {
  72. get
  73. {
  74. return (int)TaAlignerStatus1 >= 0x111 || _commErr;
  75. }
  76. }
  77. public bool Busy { get { return _connection.IsBusy || _lstHandler.Count != 0; } }
  78. public TazmoState1 TaAlignerStatus1
  79. {
  80. get; set;
  81. }
  82. public TazmoStatus TaAlignerStatus2Status
  83. {
  84. get; set;
  85. }
  86. public LiftStatus TaAlignerStatus2Lift
  87. {
  88. get; set;
  89. }
  90. public bool IsWaferPresentByCheckResult { get; set; }
  91. //public override bool IsWaferPresent(int slotindex)
  92. //{
  93. // return _isWaferPresentByCheckResult;
  94. //}
  95. public NotchDetectionStatus TaAlignerStatus2Notch
  96. {
  97. get; set;
  98. }
  99. public int TaAlignerStatus2DeviceStatus
  100. { get; set; }
  101. public int TaAlignerStatus2ErrorCode
  102. {
  103. get; set;
  104. }
  105. public int TaAlignerStatus2LastErrorCode
  106. {
  107. get; set;
  108. }
  109. public bool TaExecuteSuccss
  110. {
  111. get; set;
  112. }
  113. public TazmoAlignerIIConnection Connection
  114. {
  115. get => _connection;
  116. }
  117. protected TazmoAlignerIIConnection _connection;
  118. //private int _presetNumber;
  119. private R_TRIG _trigError = new R_TRIG();
  120. private R_TRIG _trigWarningMessage = new R_TRIG();
  121. private R_TRIG _trigCommunicationError = new R_TRIG();
  122. private R_TRIG _trigRetryConnect = new R_TRIG();
  123. private PeriodicJob _thread;
  124. protected static Object _locker = new Object();
  125. private DateTime _dtActionStart;
  126. protected LinkedList<HandlerBase> _lstHandler = new LinkedList<HandlerBase>();
  127. private bool _enableLog => SC.GetValue<bool>($"{_scRoot}.{Name}.EnableLogMessage");
  128. private bool _commErr = false;
  129. protected int _defaultChuckPosition => SC.ContainsItem($"{_scRoot}.{Name}.DefaultChuckPosition") ?
  130. SC.GetValue<int>($"{_scRoot}.{Name}.DefaultChuckPosition") : 1;
  131. private string _scRoot;
  132. private string AlarmMechanicalAlignmentError = "MechanicalAlignmentError";
  133. public TazmoAlignerII(string module, string name, string scRoot) : base(module, name)
  134. {
  135. Name = name;
  136. _scRoot = scRoot;
  137. InitializeAligner();
  138. }
  139. public bool InitializeAligner()
  140. {
  141. string portName = SC.GetStringValue($"{_scRoot}.{Name}.PortName");
  142. int bautRate = SC.GetValue<int>($"{_scRoot}.{Name}.BaudRate");
  143. int dataBits = SC.GetValue<int>($"{_scRoot}.{Name}.DataBits");
  144. Enum.TryParse(SC.GetStringValue($"{_scRoot}.{Name}.Parity"), out Parity parity);
  145. Enum.TryParse(SC.GetStringValue($"{_scRoot}.{Name}.StopBits"), out StopBits stopBits);
  146. //_deviceAddress = SC.GetValue<int>($"{Name}.DeviceAddress");
  147. _connection = new TazmoAlignerIIConnection(portName);//, bautRate, dataBits, parity, stopBits);
  148. _connection.EnableLog(_enableLog);
  149. int _retryTime = 0;
  150. while(!_connection.Connect())
  151. {
  152. _retryTime++;
  153. Thread.Sleep(1000);
  154. _connection.Disconnect();
  155. if(_retryTime >10)
  156. EV.PostInfoLog(Module, $"Can't connect to {portName} for {Module}.{Name}.");
  157. }
  158. _thread = new PeriodicJob(100, OnTimer, $"{Module}.{Name} MonitorHandler", true);
  159. EV.Subscribe(new EventItem(0, "Event", AlarmMechanicalAlignmentError, "Aligner error", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.HostNotification));
  160. return true;
  161. }
  162. private bool OnTimer()
  163. {
  164. try
  165. {
  166. _connection.EnableLog(_enableLog);
  167. _connection.MonitorTimeout();
  168. _trigCommunicationError.CLK = _connection.IsCommunicationError;
  169. if (_trigCommunicationError.Q)
  170. {
  171. EV.PostAlarmLog(Module, $"{Module}.{Name} communication error, {_connection.LastCommunicationError}");
  172. }
  173. if (!_connection.IsConnected || _connection.IsCommunicationError)
  174. {
  175. lock (_locker)
  176. {
  177. _lstHandler.Clear();
  178. }
  179. _trigRetryConnect.CLK = !_connection.IsConnected;
  180. if (_trigRetryConnect.Q)
  181. {
  182. _connection.SetPortAddress(SC.GetStringValue($"{_scRoot}.{Name}.PortName"));
  183. if (!_connection.Connect())
  184. {
  185. EV.PostAlarmLog(Module, $"Can not connect with {_connection.Address}, {Module}.{Name}");
  186. }
  187. }
  188. return true;
  189. }
  190. HandlerBase handler = null;
  191. if (!_connection.IsBusy)
  192. {
  193. lock (_locker)
  194. {
  195. if (_lstHandler.Count == 0)
  196. {
  197. }
  198. if (_lstHandler.Count > 0)
  199. {
  200. handler = _lstHandler.First.Value;
  201. if (handler != null) _connection.Execute(handler);
  202. _lstHandler.RemoveFirst();
  203. }
  204. }
  205. }
  206. }
  207. catch (Exception ex)
  208. {
  209. LOG.Write(ex);
  210. }
  211. return true;
  212. }
  213. internal void NoteError(string reason)
  214. {
  215. _trigWarningMessage.CLK = true;
  216. if (_trigWarningMessage.Q)
  217. {
  218. EV.PostWarningLog(Module, $"{Module}.{Name} error, {reason}");
  219. }
  220. }
  221. #region Command
  222. public virtual void Pause()
  223. {
  224. lock (_locker)
  225. {
  226. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.PauseMotion, null));
  227. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  228. if (_tazmotype == AlignerType.Mechnical)
  229. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  230. }
  231. }
  232. public virtual void CancelPause()
  233. {
  234. lock (_locker)
  235. {
  236. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.CancelthepauseMotion, null));
  237. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  238. if (_tazmotype == AlignerType.Mechnical)
  239. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  240. }
  241. }
  242. public virtual void MoveChuck(int position)
  243. {
  244. lock (_locker)
  245. {
  246. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MoveTheAlignerChuckToSpecifiedPosition, position.ToString("0")));
  247. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  248. if (_tazmotype == AlignerType.Mechnical)
  249. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  250. }
  251. }
  252. private bool _resetCpu
  253. {
  254. get
  255. {
  256. if (SC.ContainsItem($"Aligner.{RobotModuleName}.RestartCpuOnReset"))
  257. return SC.GetValue<bool>($"Aligner.{RobotModuleName}.RestartCpuOnReset");
  258. return false;
  259. }
  260. }
  261. protected override bool fReset(object[] param)
  262. {
  263. _dtActionStart = DateTime.Now;
  264. _trigError.RST = true;
  265. _trigWarningMessage.RST = true;
  266. _lstHandler.Clear();
  267. _connection.ForceClear();
  268. _trigCommunicationError.RST = true;
  269. _trigRetryConnect.RST = true;
  270. if(!_connection.IsConnected)
  271. {
  272. _connection.SetPortAddress(SC.GetStringValue($"{_scRoot}.{Name}.PortName"));
  273. if (!_connection.Connect())
  274. {
  275. EV.PostAlarmLog(Module, $"Can not connect with {_connection.Address}, {Module}.{Name}");
  276. }
  277. else
  278. {
  279. IsBusy = false;
  280. OnError("CommunicationError");
  281. return false;
  282. }
  283. }
  284. lock (_locker)
  285. {
  286. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.CancelerrorSet, null));
  287. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  288. if (_tazmotype == AlignerType.Mechnical)
  289. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  290. if (_resetCpu)
  291. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.CPUresetMotion, null));
  292. }
  293. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to reset.");
  294. return true;
  295. }
  296. protected override bool fMonitorReset(object[] param)
  297. {
  298. IsBusy = false;
  299. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  300. OnError("Reset timeout");
  301. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  302. EV.PostInfoLog("Aligner", $"{RobotModuleName} reset complete.");
  303. return true;
  304. }
  305. protected override bool fStartInit(object[] param)
  306. {
  307. _dtActionStart = DateTime.Now;
  308. lock (_locker)
  309. {
  310. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.InitializeMotion, null));
  311. if (_tazmotype == AlignerType.Vaccum)
  312. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MoveTheAlignerChuckToSpecifiedPosition, _defaultChuckPosition.ToString("0")));
  313. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  314. if (_tazmotype == AlignerType.Mechnical)
  315. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  316. }
  317. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to initialize.");
  318. return true;
  319. }
  320. protected override bool fMonitorInit(object[] param)
  321. {
  322. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  323. OnError("Init timeout");
  324. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  325. IsBusy = false;
  326. IsNeedRelease = true;
  327. EV.PostInfoLog("Aligner", $"{RobotModuleName} initialize complete.");
  328. AligneTimesNoHome = 0;
  329. return true;
  330. }
  331. protected override bool fStartHome(object[] param)
  332. {
  333. _dtActionStart = DateTime.Now;
  334. lock (_locker)
  335. {
  336. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MovealignertohomepositionMotion, null));
  337. if (_tazmotype == AlignerType.Mechnical)
  338. {
  339. string para1 = $"A," + "0000";
  340. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.SetalignmentangleetcSet, para1));
  341. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MovetopickpositionMotion, "A"));
  342. }
  343. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  344. if (_tazmotype == AlignerType.Mechnical)
  345. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  346. }
  347. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to home.");
  348. return true;
  349. }
  350. protected override bool fMonitorHome(object[] param)
  351. {
  352. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  353. OnError("Home timeout");
  354. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  355. IsBusy = false;
  356. EV.PostInfoLog("Aligner", $"{RobotModuleName} home complete.");
  357. AligneTimesNoHome = 0;
  358. return true;
  359. }
  360. protected override bool fStartLiftup(object[] param)
  361. {
  362. _dtActionStart = DateTime.Now;
  363. lock (_locker)
  364. {
  365. string para1 = $"A," + "0000";
  366. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.SetalignmentangleetcSet, para1));
  367. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MovetopickpositionMotion, "A"));
  368. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  369. if (_tazmotype == AlignerType.Mechnical)
  370. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  371. }
  372. EV.PostInfoLog("Aligner", $"{RobotModuleName} start lift up.");
  373. return true;
  374. }
  375. protected override bool fMonitorLiftup(object[] param)
  376. {
  377. IsBusy = false;
  378. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  379. OnError("Liftup timeout");
  380. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  381. EV.PostInfoLog("Aligner", $"{RobotModuleName} liftup complete.");
  382. return true;
  383. }
  384. protected override bool fStartLiftdown(object[] param)
  385. {
  386. _dtActionStart = DateTime.Now;
  387. lock (_locker)
  388. {
  389. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MovealignertohomepositionMotion, ""));
  390. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  391. if (_tazmotype == AlignerType.Mechnical)
  392. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  393. }
  394. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to lift down.");
  395. return true;
  396. }
  397. protected override bool fMonitorLiftdown(object[] param)
  398. {
  399. IsBusy = false;
  400. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  401. OnError("Lifdown timeout");
  402. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  403. EV.PostInfoLog("Aligner", $"{RobotModuleName} liftdown complete.");
  404. return true;
  405. }
  406. protected override bool fStartAlign(object[] param)
  407. {
  408. _dtActionStart = DateTime.Now;
  409. lock (_locker)
  410. {
  411. double aligneangle = (double)param[0];
  412. int anglevalue = (int)aligneangle * 10;
  413. string para1 = $"1," + anglevalue.ToString("0000") + ",000";
  414. if (_tazmotype == AlignerType.Mechnical)
  415. {
  416. anglevalue = (int)aligneangle * 100;
  417. para1 = $"1," + anglevalue.ToString("00000");
  418. }
  419. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.SetalignmentangleetcSet, para1));
  420. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.SeriesofalignmentMotion, "1,5"));
  421. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.OpenalignerchuckMotion, null));
  422. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  423. if (_tazmotype == AlignerType.Mechnical)
  424. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  425. }
  426. return true;
  427. }
  428. protected override bool fMonitorAligning(object[] param)
  429. {
  430. IsBusy = false;
  431. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  432. OnError("Aligning timeout");
  433. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  434. IsNeedRelease = false;
  435. EV.PostInfoLog("Aligner", $"{RobotModuleName} aligning complete.");
  436. AligneTimesNoHome++;
  437. return true;
  438. }
  439. protected override bool fStartSetParameters(object[] param)
  440. {
  441. return true;
  442. }
  443. protected override bool fStartUnGrip(object[] param)
  444. {
  445. lock (_locker)
  446. {
  447. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.OpenalignerchuckMotion, null));
  448. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  449. if (_tazmotype == AlignerType.Mechnical)
  450. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  451. }
  452. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to ungrip wafer.");
  453. _dtActionStart = DateTime.Now;
  454. return true;
  455. }
  456. protected override bool fMonitorUnGrip(object[] param)
  457. {
  458. IsBusy = false;
  459. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  460. OnError("UnGrip timeout");
  461. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  462. IsNeedRelease = false;
  463. EV.PostInfoLog("Aligner", $"{RobotModuleName} ungrip complete.");
  464. return true;
  465. }
  466. protected override bool fStartGrip(object[] param)
  467. {
  468. _dtActionStart = DateTime.Now;
  469. lock (_locker)
  470. {
  471. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.ClosealignerchuckMotion, null));
  472. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  473. if (_tazmotype == AlignerType.Mechnical)
  474. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  475. }
  476. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to grip wafer.");
  477. IsNeedRelease = true;
  478. _dtActionStart = DateTime.Now;
  479. return true;
  480. }
  481. protected override bool fMonitorGrip(object[] param)
  482. {
  483. IsBusy = false;
  484. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  485. OnError("Grip timeout");
  486. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  487. EV.PostInfoLog("Aligner", $"{RobotModuleName} grip complete.");
  488. return true;
  489. }
  490. protected override bool fStartPrepareAccept(object[] param)
  491. {
  492. _dtActionStart = DateTime.Now;
  493. lock (_locker)
  494. {
  495. //_lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.InitializeMotion, null));
  496. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MoveTheAlignerChuckToSpecifiedPosition, _defaultChuckPosition.ToString()));
  497. if (_tazmotype == AlignerType.Mechnical)
  498. {
  499. _lstHandler.AddLast(new CheckWaferPresentHandler(this, TazmoCommand.CheckwaferpresenceMotionNoEValve));
  500. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  501. }
  502. else
  503. _lstHandler.AddLast(new CheckWaferPresentHandler(this, TazmoCommand.CheckwaferpresenceMotion));
  504. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  505. }
  506. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to prepare accept wafer.");
  507. return true;
  508. }
  509. protected override bool fMonitorPrepareAccept(object[] param)
  510. {
  511. IsBusy = false;
  512. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  513. OnError("Prepare accept timeout");
  514. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  515. if(IsWaferPresentByCheckResult)
  516. {
  517. OnError("Prepare Failed due to detect wafer ON");
  518. return false;
  519. }
  520. EV.PostInfoLog("Aligner", $"{RobotModuleName} prepare accept complete.");
  521. AligneTimesNoHome = 0;
  522. return true;
  523. }
  524. protected override bool fStop(object[] param)
  525. {
  526. return true;
  527. }
  528. protected override bool FsmAbort(object[] param)
  529. {
  530. return true;
  531. }
  532. protected override bool fClear(object[] param)
  533. {
  534. return true;
  535. }
  536. protected override bool fStartReadData(object[] param)
  537. {
  538. return true;
  539. }
  540. protected override bool fResetToReady(object[] param)
  541. {
  542. return true;
  543. }
  544. protected override bool fError(object[] param)
  545. {
  546. return true;
  547. }
  548. #endregion
  549. }
  550. }