AlignerBaseDevice.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.RT.Fsm;
  6. using Aitex.Core.RT.Log;
  7. using Aitex.Core.RT.OperationCenter;
  8. using Aitex.Core.RT.SCCore;
  9. using MECF.Framework.Common.Equipment;
  10. using MECF.Framework.Common.Event;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders;
  13. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.AlignersBase
  20. {
  21. public abstract class AlignerBaseDevice : Entity, IDevice, IEntity
  22. {
  23. protected bool IsSimulatorMode
  24. {
  25. get
  26. {
  27. if (SC.ContainsItem("System.IsSimulatorMode"))
  28. return SC.GetValue<bool>("System.IsSimulatorMode");
  29. return false;
  30. }
  31. }
  32. private OCRReaderBaseDevice[] _ocrs;
  33. public OCRReaderBaseDevice[] OCRs
  34. {
  35. get => _ocrs;
  36. set
  37. {
  38. _ocrs = value;
  39. foreach (var ocr in _ocrs)
  40. {
  41. if (ocr != null)
  42. ocr.InstalledModule = RobotModuleName;
  43. }
  44. }
  45. }
  46. public event Action<bool> ActionDone;
  47. public event Action<string, AlarmEventItem> OnDeviceAlarmStateChanged;
  48. public bool HasAlarm { get; }
  49. private bool _isBusy;
  50. public bool IsBusy
  51. {
  52. get { return _isBusy; }
  53. set
  54. {
  55. if (_isBusy != value)
  56. LOG.Write($"Set {RobotModuleName} IsBusy flag to {value}");
  57. _isBusy = value;
  58. }
  59. }
  60. public string ErrorCode { get; set; } = "";
  61. public virtual bool IsReady()
  62. {
  63. return !IsBusy && AlignerState == AlignerStateEnum.Idle;
  64. }
  65. public object[] CurrentParamter { get; private set; }
  66. public bool IsOnline { get; set; }
  67. public WaferSize Size
  68. {
  69. get; set;
  70. } = WaferSize.WS12;
  71. public virtual WaferAlignerTypeEnum CurrentWaferAlignmentType { get; set; }
  72. public virtual int AlginerSpeedSetPoint
  73. {
  74. get
  75. {
  76. if (SC.ContainsItem($"Aligner.{RobotModuleName}.AlignSpeed"))
  77. return SC.GetValue<int>($"Aligner.{RobotModuleName}.AlignSpeed");
  78. return 100;
  79. }
  80. set
  81. {
  82. if (SC.ContainsItem($"Aligner.{RobotModuleName}.AlignSpeed"))
  83. SC.SetItemValue($"Aligner.{RobotModuleName}.AlignSpeed", value);
  84. }
  85. }
  86. public virtual bool IsReversePreAlignDirection
  87. {
  88. get
  89. {
  90. if (SC.ContainsItem($"Aligner.{RobotModuleName}.ReversePreAlignDirection"))
  91. return SC.GetValue<bool>($"Aligner.{RobotModuleName}.ReversePreAlignDirection");
  92. return false;
  93. }
  94. }
  95. public virtual bool IsReversePostAlignDirection
  96. {
  97. get
  98. {
  99. if (SC.ContainsItem($"Aligner.{RobotModuleName}.ReversePostAlignDirection"))
  100. return SC.GetValue<bool>($"Aligner.{RobotModuleName}.ReversePostAlignDirection");
  101. return false;
  102. }
  103. }
  104. public virtual bool IsPreAlgin { get; set; }
  105. public virtual WaferSize GetCurrentWaferSize()
  106. {
  107. return Size;
  108. }
  109. public virtual double CompensationAngleValue
  110. {
  111. get
  112. {
  113. if (SC.ContainsItem($"Aligner.{Name}.CompensationAngle"))
  114. return SC.GetValue<double>($"Aligner.{Name}.CompensationAngle");
  115. return 0;
  116. }
  117. }
  118. public virtual double PostAlignCompensationAngleValue
  119. {
  120. get
  121. {
  122. double retValue = 0;
  123. if (SC.ContainsItem($"Aligner.{Name}.PostAlignCompensationAngle"))
  124. retValue += SC.GetValue<double>($"Aligner.{Name}.PostAlignCompensationAngle");
  125. var wafer = WaferManager.Instance.GetWafer(RobotModuleName, 0);
  126. if (wafer.IsEmpty || !ModuleHelper.IsLoadPort((ModuleName)wafer.DestinationStation))
  127. return retValue;
  128. ModuleName module = (ModuleName)wafer.DestinationStation;
  129. if (SC.ContainsItem($"LoadPort.{module}.PostAlignAngle"))
  130. retValue += SC.GetValue<double>($"LoadPort.{module}.PostAlignAngle");
  131. return retValue;
  132. }
  133. }
  134. public virtual double PreDefineAngle { get; set; }
  135. public virtual bool IsGripperHoldWafer { get; set; }
  136. public bool IsIdle
  137. {
  138. get
  139. {
  140. return fsm.State == (int)AlignerStateEnum.Idle && fsm.CheckExecuted() && !IsBusy;
  141. }
  142. }
  143. public bool IsError
  144. {
  145. get
  146. {
  147. return fsm.State == (int)AlignerStateEnum.Error;
  148. }
  149. }
  150. public bool IsInit
  151. {
  152. get
  153. {
  154. return fsm.State == (int)AlignerStateEnum.Init;
  155. }
  156. }
  157. public double CurrentNotch { get; set; }
  158. public int SpeedAxis1 { set; get; }
  159. public int SpeedAxis2 { set; get; }
  160. public int SpeedAxis3 { set; get; }
  161. public int SpeedAxis4 { set; get; }
  162. public int SpeedAxis5 { set; get; }
  163. public int SpeedAxis6 { set; get; }
  164. public float PositionAxis1 { get; set; }
  165. public float PositionAxis2 { get; set; }
  166. public float PositionAxis3 { get; set; }
  167. public float PositionAxis4 { get; set; }
  168. public float PositionAxis5 { get; set; }
  169. public float PositionAxis6 { get; set; }
  170. public int AlignerCommandTimeout { get; private set; }
  171. public virtual float RadialOffset { set; get; }//extend
  172. public virtual float ThetaOffset { set; get; }//rotate
  173. public virtual int TimeLimitAlignWafer
  174. {
  175. get
  176. {
  177. if (SC.ContainsItem($"Aligner.{Name}.TimeLimitForAlignWafer"))
  178. return SC.GetValue<int>($"Aligner.{Name}.TimeLimitForAlignWafer");
  179. return 90;
  180. }
  181. }
  182. public virtual int TimeLimitAlignerHome
  183. {
  184. get
  185. {
  186. if (SC.ContainsItem($"Aligner.{Name}.TimeLimitAlignerHome"))
  187. return SC.GetValue<int>($"Aligner.{Name}.TimeLimitAlignerHome");
  188. return 30;
  189. }
  190. }
  191. public virtual int TimeLimitReadOcr
  192. {
  193. get
  194. {
  195. if (SC.ContainsItem($"Aligner.{Name}.TimeLimitReadOCR"))
  196. return SC.GetValue<int>($"Aligner.{Name}.TimeLimitReadOCR");
  197. return 180;
  198. }
  199. }
  200. public virtual int TimeLimitVerifyOcr
  201. {
  202. get
  203. {
  204. if (SC.ContainsItem($"Aligner.{Name}.TimeLimitVerifyOCR"))
  205. return SC.GetValue<int>($"Aligner.{Name}.TimeLimitVerifyOCR");
  206. return 5;
  207. }
  208. }
  209. public enum AlignerMsg
  210. {
  211. Reset,
  212. Clear,
  213. ResetToReady,
  214. Stop,
  215. StartInit,
  216. InitComplete,
  217. StartHome,
  218. HomeComplete,
  219. ERROR,
  220. ActionDone,
  221. Abort,
  222. StartMaintenance,
  223. CompleteMaintenance,
  224. ReadData,
  225. SetParameters,
  226. SetParametersComplete,
  227. Grip,
  228. GripComplete,
  229. UnGrip,
  230. UnGripComplete,
  231. LiftUp,
  232. LiftUpComplete,
  233. LiftDown,
  234. LiftDownComplete,
  235. Align,
  236. AlignComplete,
  237. PrepareAccept,
  238. PrepareAcceptComplete,
  239. ToIdle,
  240. }
  241. protected AlignerBaseDevice(string module, string name)
  242. : base()
  243. {
  244. Module = module;
  245. Name = name;
  246. RobotModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), Name);
  247. InitializeRobot();
  248. }
  249. public string EventAlignerStartAlign { get => RobotModuleName.ToString() + "StartAligning"; }
  250. public string EventAlignerCompleteAlign { get => RobotModuleName.ToString() + "CompleteAligning"; }
  251. public string AlarmAlignFailed { get => RobotModuleName.ToString() + "AligningFailed"; }
  252. public string AlarmAlignTimeout { get => RobotModuleName.ToString() + "AligningTimeout"; }
  253. public string AlarmVerifyLaserMarkFailed { get => RobotModuleName.ToString() + "VerifyLaserMarkFailed"; }
  254. public string AlarmVerifyLaserMarkSlotNoFailed { get => RobotModuleName.ToString() + "VerifyLaserMarkSlotNoFailed"; }
  255. public string AlarmVerifyLaserMarkLengthFailed { get => RobotModuleName.ToString() + "VerifyLaserMarkLengthFailed"; }
  256. public string AlarmVerifyLaserMarkWithHostFailed { get => RobotModuleName.ToString() + "VerifyLaserMarkWithHostFailed"; }
  257. public string AlarmVerifyLaserMarkChecksumFailed { get => RobotModuleName.ToString() + "VerifyLaserMarkChecksumFailed"; }
  258. public string AlarmSlotInLaserMarkIsOccuppied { get => RobotModuleName.ToString() + "SlotInLaserMarkIsOccuppied"; }
  259. public string AlarmVerifyLaserMarkTimeout { get => RobotModuleName.ToString() + "VerifyLaserMarkTimeout"; }
  260. public string AlarmWaferInformationError { get => RobotModuleName.ToString() + "WaferInformationError"; }
  261. public virtual bool IsNeedChangeWaferSize(WaferSize wz)
  262. {
  263. return false;
  264. }
  265. protected override bool Init()
  266. {
  267. return base.Init();
  268. }
  269. public void InitializeRobot()
  270. {
  271. BuildTransitionTable();
  272. SubscribeDataVariable();
  273. SubscribeOperation();
  274. SubscribeDeviceOperation();
  275. AlignerCommandTimeout = SC.ContainsItem("Aligner.TimeLimitAlignerCommand") ?
  276. SC.GetValue<int>("Aligner.TimeLimitAlignerCommand") : 120;
  277. WaferManager.Instance.SubscribeLocation(Name, 1);
  278. Running = true;
  279. }
  280. protected virtual void SubscribeOperation()
  281. {
  282. OP.Subscribe(String.Format("{0}.{1}", Name, "LiftUp"), (out string reason, int time, object[] param) =>
  283. {
  284. bool ret = LiftUp(out reason);
  285. if (ret)
  286. {
  287. reason = string.Format("{0} {1}", Name, "LiftUp");
  288. return true;
  289. }
  290. reason = "";
  291. return false;
  292. });
  293. OP.Subscribe(String.Format("{0}.{1}", Name, "LiftDown"), (out string reason, int time, object[] param) =>
  294. {
  295. bool ret = LiftDown(out reason);
  296. if (ret)
  297. {
  298. reason = string.Format("{0} {1}", Name, "LiftDown");
  299. return true;
  300. }
  301. reason = "";
  302. return false;
  303. });
  304. OP.Subscribe(String.Format("{0}.{1}", Name, "SetWaferSize"), (out string reason, int time, object[] param) =>
  305. {
  306. if (param.Length < 2)
  307. {
  308. reason = "Invalide parameter";
  309. return false;
  310. }
  311. WaferSize size = (WaferSize)Enum.Parse(typeof(WaferSize), param[1].ToString());
  312. bool ret = SetWaferSize(size, out reason);
  313. if (ret)
  314. {
  315. reason = string.Format("{0} {1}", Name, "SetWaferSize");
  316. return true;
  317. }
  318. reason = "";
  319. return false;
  320. });
  321. OP.Subscribe(String.Format("{0}.{1}", Name, "Init"), (out string reason, int time, object[] param) =>
  322. {
  323. bool ret = Init(out reason);
  324. if (ret)
  325. {
  326. reason = string.Format("{0} {1}", Name, "Initializing");
  327. return true;
  328. }
  329. reason = "";
  330. return false;
  331. });
  332. OP.Subscribe(String.Format("{0}.{1}", Name, "Abort"), (out string reason, int time, object[] param) =>
  333. {
  334. bool ret = Abort(out reason);
  335. if (ret)
  336. {
  337. reason = string.Format("{0} {1}", Name, "Abort");
  338. return true;
  339. }
  340. reason = "";
  341. return false;
  342. });
  343. OP.Subscribe(String.Format("{0}.{1}", Name, "Home"), (out string reason, int time, object[] param) =>
  344. {
  345. bool ret = Home(out reason);
  346. if (ret)
  347. {
  348. reason = string.Format("{0} {1}", Name, "Homing");
  349. return true;
  350. }
  351. reason = "";
  352. return false;
  353. });
  354. OP.Subscribe(String.Format("{0}.{1}", Name, "AlignerHome"), (out string reason, int time, object[] param) =>
  355. {
  356. bool ret = Home(out reason);
  357. if (ret)
  358. {
  359. reason = string.Format("{0} {1}", Name, "Homing");
  360. return true;
  361. }
  362. reason = "";
  363. return false;
  364. });
  365. OP.Subscribe(String.Format("{0}.{1}", Name, "HomeModule"), (out string reason, int time, object[] param) =>
  366. {
  367. bool ret = HomeModule(out reason);
  368. if (ret)
  369. {
  370. reason = string.Format("{0} {1}", Name, "ModuleHoming");
  371. return true;
  372. }
  373. reason = "";
  374. return false;
  375. });
  376. OP.Subscribe(String.Format("{0}.{1}", Name, "AlignerHomeModule"), (out string reason, int time, object[] param) =>
  377. {
  378. bool ret = HomeModule(out reason);
  379. if (ret)
  380. {
  381. reason = string.Format("{0} {1}", Name, "ModuleHoming");
  382. return true;
  383. }
  384. reason = "";
  385. return false;
  386. });
  387. OP.Subscribe(String.Format("{0}.{1}", Name, "Reset"), (out string reason, int time, object[] param) =>
  388. {
  389. bool ret = AlignerReset(out reason);
  390. if (ret)
  391. {
  392. reason = string.Format("{0} {1}", Name, "Resetting");
  393. return true;
  394. }
  395. reason = "";
  396. return true;
  397. });
  398. OP.Subscribe(String.Format("{0}.{1}", Name, "AlignerReset"), (out string reason, int time, object[] param) =>
  399. {
  400. bool ret = AlignerReset(out reason);
  401. if (ret)
  402. {
  403. reason = string.Format("{0} {1}", Name, "Resetting");
  404. return true;
  405. }
  406. reason = "";
  407. return true;
  408. });
  409. OP.Subscribe(String.Format("{0}.{1}", Name, "AlignerAlign"), (out string reason, int time, object[] param) =>
  410. {
  411. bool ret = AlignerAlign(param, out reason);
  412. if (ret)
  413. {
  414. reason = string.Format("{0} {1}", Name, "Resetting");
  415. return true;
  416. }
  417. reason = "";
  418. return true;
  419. });
  420. OP.Subscribe(String.Format("{0}.{1}", Name, "AlignerSetWaferSize"), (out string reason, int time, object[] param) =>
  421. {
  422. bool ret = AlignerSetWaferSize(param, out reason);
  423. if (ret)
  424. {
  425. reason = string.Format("{0} {1}", Name, "Resetting");
  426. return true;
  427. }
  428. reason = "";
  429. return true;
  430. });
  431. OP.Subscribe(String.Format("{0}.{1}", Name, "PrepareAccept"), (out string reason, int time, object[] param) =>
  432. {
  433. bool ret = PrepareAcceptWafer();
  434. if (ret)
  435. {
  436. reason = string.Format("{0} {1}", Name, "PrepareAccept");
  437. return true;
  438. }
  439. reason = "";
  440. return true;
  441. });
  442. OP.Subscribe(String.Format("{0}.{1}", Name, "AlignerHold"), (out string reason, int time, object[] param) =>
  443. {
  444. bool ret = Grip(0, out reason);
  445. if (ret)
  446. {
  447. reason = string.Format("{0} {1}", Name, "Hold Wafer");
  448. return true;
  449. }
  450. return false;
  451. });
  452. OP.Subscribe(String.Format("{0}.{1}", Name, "AlignerRelease"), (out string reason, int time, object[] param) =>
  453. {
  454. bool ret = Release(0, out reason);
  455. if (ret)
  456. {
  457. reason = string.Format("{0} {1}", Name, "Release Wafer");
  458. return true;
  459. }
  460. return false;
  461. });
  462. }
  463. protected virtual void SubscribeDeviceOperation()
  464. {
  465. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerInit"), (out string reason, int time, object[] param) =>
  466. {
  467. bool ret = Init(out reason);
  468. if (ret)
  469. {
  470. reason = string.Format("{0} {1}", Name, "Init");
  471. return true;
  472. }
  473. return false;
  474. });
  475. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerHome"), (out string reason, int time, object[] param) =>
  476. {
  477. bool ret = Home(out reason);
  478. if (ret)
  479. {
  480. reason = string.Format("{0} {1}", Name, "Home");
  481. return true;
  482. }
  483. return false;
  484. });
  485. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerHomeModule"), (out string reason, int time, object[] param) =>
  486. {
  487. bool ret = HomeModule(out reason);
  488. if (ret)
  489. {
  490. reason = string.Format("{0} {1}", Name, "ModuleHome");
  491. return true;
  492. }
  493. return false;
  494. });
  495. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerReset"), (out string reason, int time, object[] param) =>
  496. {
  497. bool ret = AlignerReset(out reason);
  498. if (ret)
  499. {
  500. reason = string.Format("{0} {1}", Name, "Reset Error");
  501. return true;
  502. }
  503. return false;
  504. });
  505. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerGrip"), (out string reason, int time, object[] param) =>
  506. {
  507. bool ret = Grip(0, out reason);
  508. if (ret)
  509. {
  510. reason = string.Format("{0} {1}", Name, "Hold Wafer");
  511. return true;
  512. }
  513. return false;
  514. });
  515. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerRelease"), (out string reason, int time, object[] param) =>
  516. {
  517. bool ret = Release(0, out reason);
  518. if (ret)
  519. {
  520. reason = string.Format("{0} {1}", Name, "Release Wafer");
  521. return true;
  522. }
  523. return false;
  524. });
  525. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerLiftUp"), (out string reason, int time, object[] param) =>
  526. {
  527. bool ret = LiftUp(out reason);
  528. if (ret)
  529. {
  530. reason = string.Format("{0} {1}", Name, "Lifter Up");
  531. return true;
  532. }
  533. return false;
  534. });
  535. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerLiftDown"), (out string reason, int time, object[] param) =>
  536. {
  537. bool ret = LiftDown(out reason);
  538. if (ret)
  539. {
  540. reason = string.Format("{0} {1}", Name, "Lifter Down");
  541. return true;
  542. }
  543. return false;
  544. });
  545. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerStop"), (out string reason, int time, object[] param) =>
  546. {
  547. bool ret = Stop(out reason);
  548. if (ret)
  549. {
  550. reason = string.Format("{0} {1}", Name, "Stop Align");
  551. return true;
  552. }
  553. return false;
  554. });
  555. DEVICE.Register(String.Format("{0}.{1}", Name, "AlignerAlign"), (out string reason, int time, object[] param) =>
  556. {
  557. double angle = double.Parse((string)param[0]);
  558. bool ret = Align(angle, out reason);
  559. if (ret)
  560. {
  561. reason = string.Format("{0} {1}", Name, "PreAlign");
  562. return true;
  563. }
  564. return false;
  565. });
  566. }
  567. public bool SetWaferSize(WaferSize size, out string reason)
  568. {
  569. reason = "";
  570. if (CheckToPostMessage((int)AlignerMsg.SetParameters, new object[] { "WaferSize", size }))
  571. {
  572. IsBusy = true;
  573. return true;
  574. }
  575. return false;
  576. }
  577. public bool AlignerReset(out string reason)
  578. {
  579. IsBusy = false;
  580. reason = "";
  581. if (CheckToPostMessage((int)AlignerMsg.Reset, null))
  582. return true;
  583. reason = $"{Name} is in {AlignerState}";
  584. return false;
  585. }
  586. public bool Abort(out string reason)
  587. {
  588. reason = "";
  589. if (CheckToPostMessage((int)AlignerMsg.Abort, null))
  590. return true;
  591. reason = $"{Name} is in {AlignerState}";
  592. return false;
  593. }
  594. public bool Stop(out string reason)
  595. {
  596. reason = "";
  597. if (CheckToPostMessage((int)AlignerMsg.Stop, null))
  598. return true;
  599. reason = $"{Name} is in {AlignerState}";
  600. return false;
  601. }
  602. public bool AlignerAlign(object[] param, out string reason)
  603. {
  604. reason = "";
  605. return Align((double)param[0], out reason);
  606. //if (CheckToPostMessage((int)AlignerMsg.Align, param))
  607. //{
  608. // IsBusy = true;
  609. // return true;
  610. //}
  611. //reason = $"{Name} is in {AlignerState}";
  612. //return false;
  613. }
  614. public bool AlignerSetWaferSize(object[] param, out string reason)
  615. {
  616. reason = "";
  617. if (CheckToPostMessage((int)AlignerMsg.SetParameters, param))
  618. {
  619. IsBusy = true;
  620. return true;
  621. }
  622. reason = $"{Name} is in {AlignerState}";
  623. return false;
  624. }
  625. public bool AlignerSetWaferSize(WaferSize wz, out string reason)
  626. {
  627. reason = "";
  628. if (CheckToPostMessage((int)AlignerMsg.SetParameters, new object[] { "WaferSize", wz }))
  629. {
  630. IsBusy = true;
  631. return true;
  632. }
  633. reason = $"{Name} is in {AlignerState}";
  634. return false;
  635. }
  636. public bool Align(double angle, out string reason)
  637. {
  638. IsPreAlgin = true;
  639. reason = "";
  640. double anglevalue = angle + CompensationAngleValue;
  641. while (anglevalue >= 360)
  642. {
  643. anglevalue -= 360;
  644. }
  645. while (anglevalue < 0)
  646. {
  647. anglevalue += 360;
  648. }
  649. IsBusy = true;
  650. if (CheckToPostMessage((int)AlignerMsg.Align, new object[] { anglevalue }))
  651. {
  652. WaferManager.Instance.UpdateWaferAlignAngle(RobotModuleName, 0, angle);
  653. return true;
  654. }
  655. IsBusy = false;
  656. reason = $"{Name} is in {AlignerState}";
  657. return false;
  658. }
  659. public bool PreAlign(double angle, out string reason)
  660. {
  661. IsPreAlgin = true;
  662. reason = "";
  663. double anglevalue = angle + CompensationAngleValue;
  664. while (anglevalue > 360)
  665. {
  666. anglevalue -= 360;
  667. }
  668. while (anglevalue < 0)
  669. {
  670. anglevalue += 360;
  671. }
  672. IsBusy = true;
  673. if (CheckToPostMessage((int)AlignerMsg.Align, new object[] { anglevalue }))
  674. {
  675. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to implement the align command");
  676. WaferManager.Instance.UpdateWaferAlignAngle(RobotModuleName, 0, angle);
  677. return true;
  678. }
  679. IsBusy = false;
  680. reason = $"{Name} is in {AlignerState}";
  681. EV.PostAlarmLog("Aligner", $"{RobotModuleName} failed to implement the align command due to {reason}");
  682. return false;
  683. }
  684. public bool PostAlign(double angle, out string reason)
  685. {
  686. IsPreAlgin = false;
  687. reason = "";
  688. double anglevalue = angle + CompensationAngleValue;
  689. while (anglevalue > 360)
  690. {
  691. anglevalue -= 360;
  692. }
  693. while (anglevalue < 0)
  694. {
  695. anglevalue += 360;
  696. }
  697. IsBusy = true;
  698. if (CheckToPostMessage((int)AlignerMsg.Align, new object[] { anglevalue }))
  699. {
  700. WaferManager.Instance.UpdateWaferAlignAngle(RobotModuleName, 0, angle);
  701. return true;
  702. }
  703. IsBusy = false;
  704. reason = $"{Name} is in {AlignerState}";
  705. return false;
  706. }
  707. public bool LiftDown(out string reason)
  708. {
  709. reason = "";
  710. if (CheckToPostMessage((int)AlignerMsg.LiftDown, null))
  711. {
  712. IsBusy = true;
  713. return true;
  714. }
  715. reason = $"{Name} is in {AlignerState}";
  716. return false;
  717. }
  718. public bool LiftUp(out string reason)
  719. {
  720. reason = "";
  721. if (CheckToPostMessage((int)AlignerMsg.LiftUp, null))
  722. {
  723. IsBusy = true;
  724. return true;
  725. }
  726. reason = $"{Name} is in {AlignerState}";
  727. return false;
  728. }
  729. public bool Release(int v, out string reason)
  730. {
  731. reason = "";
  732. if (CheckToPostMessage((int)AlignerMsg.UnGrip, new object[] { v }))
  733. {
  734. IsBusy = true;
  735. return true;
  736. }
  737. reason = $"{Name} is in {AlignerState}";
  738. return false;
  739. }
  740. public bool Grip(int v, out string reason)
  741. {
  742. reason = "";
  743. if (CheckToPostMessage((int)AlignerMsg.Grip, new object[] { v }))
  744. {
  745. IsBusy = true;
  746. return true;
  747. }
  748. reason = $"{Name} is in {AlignerState}";
  749. return false;
  750. }
  751. public bool Clear(out string reason)
  752. {
  753. reason = "";
  754. if (CheckToPostMessage((int)AlignerMsg.Clear, null))
  755. {
  756. return true;
  757. }
  758. reason = $"{Name} is in {AlignerState}";
  759. return false;
  760. }
  761. public bool Init(out string reason)
  762. {
  763. reason = "";
  764. if (CheckToPostMessage((int)AlignerMsg.StartInit, null))
  765. {
  766. IsBusy = true;
  767. return true;
  768. }
  769. reason = $"{Name} is in {AlignerState}";
  770. return false;
  771. }
  772. public bool Home(out string reason)
  773. {
  774. reason = "";
  775. if (CheckToPostMessage((int)AlignerMsg.StartInit, null))
  776. {
  777. IsBusy = true;
  778. return true;
  779. }
  780. reason = $"{Name} is in {AlignerState}";
  781. return false;
  782. }
  783. public bool HomeModule(out string reason)
  784. {
  785. reason = "";
  786. if (CheckToPostMessage((int)AlignerMsg.StartHome, null))
  787. {
  788. IsBusy = true;
  789. return true;
  790. }
  791. reason = $"{Name} is in {AlignerState}";
  792. return false;
  793. }
  794. public bool SetMaintenanceMode(bool ismaintain)
  795. {
  796. if (ismaintain)
  797. return CheckToPostMessage((int)AlignerMsg.StartMaintenance, null);
  798. else
  799. return CheckToPostMessage((int)AlignerMsg.CompleteMaintenance, null);
  800. }
  801. private void SubscribeDataVariable()
  802. {
  803. DATA.Subscribe($"{Name}.State", () => AlignerState.ToString());
  804. DATA.Subscribe($"{Name}.AlignerState", () => AlignerState.ToString());
  805. DATA.Subscribe($"{Name}.Busy", () => AlignerState != AlignerStateEnum.Idle && AlignerState != AlignerStateEnum.Init);
  806. DATA.Subscribe($"{Name}.ErrorCode", () => ErrorCode);
  807. DATA.Subscribe($"{Name}.Error", () => AlignerState == AlignerStateEnum.Error);
  808. DATA.Subscribe($"{Name}.Notch", () => CurrentNotch);
  809. DATA.Subscribe($"{Name}.WaferOnAligner", () => IsWaferPresent(0));
  810. DATA.Subscribe($"{Name}.WaferSize", () => GetCurrentWaferSize().ToString());
  811. DATA.Subscribe($"{Name}.WaferAlignmentType", () => CurrentWaferAlignmentType.ToString());
  812. // string str = string.Empty;
  813. //
  814. DATA.Subscribe($"{Module}.{Name}.State", () => AlignerState.ToString());
  815. DATA.Subscribe($"{Module}.{Name}.Axis1Postion", () => PositionAxis1.ToString());
  816. DATA.Subscribe($"{Module}.{Name}.Axis2Postion", () => PositionAxis2.ToString());
  817. DATA.Subscribe($"{Module}.{Name}.Axis3Postion", () => PositionAxis3.ToString());
  818. DATA.Subscribe($"{Module}.{Name}.Axis4Postion", () => PositionAxis4.ToString());
  819. DATA.Subscribe($"{Module}.{Name}.Axis5Postion", () => PositionAxis5.ToString());
  820. DATA.Subscribe($"{Module}.{Name}.AlignerErrorCode", () => ErrorCode ?? ErrorCode.ToString());
  821. //EV.Subscribe(new EventItem("Event", EventAlignerStartAlign, $"{RobotModuleName} start aligning wafer.", EventLevel.Information, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  822. //EV.Subscribe(new EventItem("Event", EventAlignerCompleteAlign, $"{RobotModuleName} complete aligning wafer.", EventLevel.Information, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  823. //EV.Subscribe(new EventItem("Alarm", AlarmAlignTimeout, "Aligner align wafer time out.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  824. //EV.Subscribe(new EventItem("Alarm", AlarmAlignFailed, "Aligner aligner wafer failed.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  825. //EV.Subscribe(new EventItem("Alarm", AlarmVerifyLaserMarkFailed, "Aligner verify laser mark failed.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  826. //EV.Subscribe(new EventItem("Alarm", AlarmVerifyLaserMarkSlotNoFailed, "Aligner verify laser mark slot no failed.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  827. //EV.Subscribe(new EventItem("Alarm", AlarmVerifyLaserMarkLengthFailed, "Aligner verify laser mark length failed.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  828. //EV.Subscribe(new EventItem("Alarm", AlarmVerifyLaserMarkWithHostFailed, "Aligner verify laser mark with host failed.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  829. //EV.Subscribe(new EventItem("Alarm", AlarmVerifyLaserMarkChecksumFailed, "Aligner verify laser mark check character failed.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  830. //EV.Subscribe(new EventItem("Alarm", AlarmVerifyLaserMarkTimeout, "Aligner wait ocr manual verification timeout.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  831. //EV.Subscribe(new EventItem("Alarm", AlarmSlotInLaserMarkIsOccuppied, "The slot in Laser Mark is occuppied.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  832. //EV.Subscribe(new EventItem("Alarm", AlarmWaferInformationError, "The wafer sensor status doesn't match wafer information.", EventLevel.Alarm, Aitex.Core.RT.Event.EventType.EventUI_Notify));
  833. }
  834. private void BuildTransitionTable()
  835. {
  836. fsm = new StateMachine<AlignerBaseDevice>(Name + ".StateMachine", (int)AlignerStateEnum.Init, 50);
  837. //Init sequence
  838. AnyStateTransition(AlignerMsg.ERROR, fError, AlignerStateEnum.Error);
  839. AnyStateTransition(AlignerMsg.Reset, fReset, AlignerStateEnum.Resetting);
  840. AnyStateTransition(AlignerMsg.Stop, fStop, AlignerStateEnum.Stopped);
  841. AnyStateTransition(AlignerMsg.Abort, FsmAbort, AlignerStateEnum.Init);
  842. AnyStateTransition(AlignerMsg.StartMaintenance, fStartMaintenance, AlignerStateEnum.Maintenance);
  843. Transition(AlignerStateEnum.Maintenance, FSM_MSG.TIMER, fMonitorMaintenance, AlignerStateEnum.Idle);
  844. Transition(AlignerStateEnum.Maintenance, AlignerMsg.CompleteMaintenance, fCompleteMaintenance, AlignerStateEnum.Idle);
  845. Transition(AlignerStateEnum.Resetting, AlignerMsg.ActionDone, fResetComplete, AlignerStateEnum.Idle);
  846. Transition(AlignerStateEnum.Resetting, FSM_MSG.TIMER, fMonitorReset, AlignerStateEnum.Idle);
  847. Transition(AlignerStateEnum.Init, AlignerMsg.StartInit, fStartInit, AlignerStateEnum.Initializing);
  848. Transition(AlignerStateEnum.Idle, AlignerMsg.StartInit, fStartInit, AlignerStateEnum.Initializing);
  849. Transition(AlignerStateEnum.Error, AlignerMsg.StartInit, fStartInit, AlignerStateEnum.Initializing);
  850. Transition(AlignerStateEnum.Init, AlignerMsg.InitComplete, fInitComplete, AlignerStateEnum.Idle);
  851. Transition(AlignerStateEnum.Error, AlignerMsg.InitComplete, fInitComplete, AlignerStateEnum.Idle);
  852. Transition(AlignerStateEnum.Initializing, AlignerMsg.InitComplete, fInitComplete, AlignerStateEnum.Idle);
  853. Transition(AlignerStateEnum.Initializing, AlignerMsg.ActionDone, fInitComplete, AlignerStateEnum.Idle);
  854. Transition(AlignerStateEnum.Initializing, FSM_MSG.TIMER, fMonitorInit, AlignerStateEnum.Idle);
  855. Transition(AlignerStateEnum.Init, AlignerMsg.StartHome, fStartHome, AlignerStateEnum.Homing);
  856. Transition(AlignerStateEnum.Idle, AlignerMsg.StartHome, fStartHome, AlignerStateEnum.Homing);
  857. Transition(AlignerStateEnum.Error, AlignerMsg.StartHome, fStartHome, AlignerStateEnum.Homing);
  858. Transition(AlignerStateEnum.Init, AlignerMsg.HomeComplete, fHomeComplete, AlignerStateEnum.Idle);
  859. Transition(AlignerStateEnum.Error, AlignerMsg.HomeComplete, fHomeComplete, AlignerStateEnum.Idle);
  860. Transition(AlignerStateEnum.Homing, AlignerMsg.HomeComplete, fHomeComplete, AlignerStateEnum.Idle);
  861. Transition(AlignerStateEnum.Homing, AlignerMsg.ActionDone, fHomeComplete, AlignerStateEnum.Idle);
  862. Transition(AlignerStateEnum.Homing, FSM_MSG.TIMER, fMonitorHome, AlignerStateEnum.Idle);
  863. Transition(AlignerStateEnum.Error, AlignerMsg.Clear, fClear, AlignerStateEnum.Init);
  864. Transition(AlignerStateEnum.Error, AlignerMsg.ResetToReady, fResetToReady, AlignerStateEnum.Idle);
  865. Transition(AlignerStateEnum.Idle, AlignerMsg.SetParameters, fStartSetParameters, AlignerStateEnum.SettingServos);
  866. Transition(AlignerStateEnum.SettingServos, AlignerMsg.SetParametersComplete, fSetComplete, AlignerStateEnum.Idle);
  867. Transition(AlignerStateEnum.SettingServos, AlignerMsg.ActionDone, fSetComplete, AlignerStateEnum.Idle);
  868. Transition(AlignerStateEnum.SettingServos, FSM_MSG.TIMER, fMonitorSetParamter, AlignerStateEnum.Idle);
  869. Transition(AlignerStateEnum.Idle, AlignerMsg.ReadData, fStartReadData, AlignerStateEnum.ReadingData);
  870. Transition(AlignerStateEnum.ReadingData, AlignerMsg.ActionDone, null, AlignerStateEnum.Idle);
  871. Transition(AlignerStateEnum.ReadingData, FSM_MSG.TIMER, fMonitorReadData, AlignerStateEnum.Idle);
  872. Transition(AlignerStateEnum.Idle, AlignerMsg.Grip, fStartGrip, AlignerStateEnum.Gripping);
  873. Transition(AlignerStateEnum.Gripping, AlignerMsg.GripComplete, fGripComplete, AlignerStateEnum.Idle);
  874. Transition(AlignerStateEnum.Gripping, AlignerMsg.ActionDone, fGripComplete, AlignerStateEnum.Idle);
  875. Transition(AlignerStateEnum.Gripping, FSM_MSG.TIMER, fMonitorGrip, AlignerStateEnum.Idle);
  876. Transition(AlignerStateEnum.Idle, AlignerMsg.UnGrip, fStartUnGrip, AlignerStateEnum.UnGripping);
  877. Transition(AlignerStateEnum.UnGripping, AlignerMsg.UnGripComplete, fUnGripComplete, AlignerStateEnum.Idle);
  878. Transition(AlignerStateEnum.UnGripping, AlignerMsg.ActionDone, fUnGripComplete, AlignerStateEnum.Idle);
  879. Transition(AlignerStateEnum.UnGripping, FSM_MSG.TIMER, fMonitorUnGrip, AlignerStateEnum.Idle);
  880. Transition(AlignerStateEnum.Idle, AlignerMsg.LiftUp, fStartLiftup, AlignerStateEnum.LiftingUp);
  881. Transition(AlignerStateEnum.LiftingUp, AlignerMsg.LiftUpComplete, fLiftupComplete, AlignerStateEnum.Idle);
  882. Transition(AlignerStateEnum.LiftingUp, AlignerMsg.ActionDone, fLiftupComplete, AlignerStateEnum.Idle);
  883. Transition(AlignerStateEnum.LiftingUp, FSM_MSG.TIMER, fMonitorLiftup, AlignerStateEnum.Idle);
  884. Transition(AlignerStateEnum.Idle, AlignerMsg.LiftDown, fStartLiftdown, AlignerStateEnum.LiftingDown);
  885. Transition(AlignerStateEnum.LiftingDown, AlignerMsg.LiftDownComplete, fLiftdownComplete, AlignerStateEnum.Idle);
  886. Transition(AlignerStateEnum.LiftingDown, AlignerMsg.ActionDone, fLiftdownComplete, AlignerStateEnum.Idle);
  887. Transition(AlignerStateEnum.LiftingDown, FSM_MSG.TIMER, fMonitorLiftdown, AlignerStateEnum.Idle);
  888. Transition(AlignerStateEnum.Idle, AlignerMsg.Align, fStartAlign, AlignerStateEnum.Aligning);
  889. Transition(AlignerStateEnum.Aligning, AlignerMsg.AlignComplete, fAlignComplete, AlignerStateEnum.Idle);
  890. Transition(AlignerStateEnum.Aligning, AlignerMsg.ActionDone, fAlignComplete, AlignerStateEnum.Idle);
  891. Transition(AlignerStateEnum.Aligning, FSM_MSG.TIMER, fMonitorAligning, AlignerStateEnum.Idle);
  892. Transition(AlignerStateEnum.Idle, AlignerMsg.PrepareAccept, fStartPrepareAccept, AlignerStateEnum.PrepareAccept);
  893. Transition(AlignerStateEnum.PrepareAccept, AlignerMsg.PrepareAcceptComplete, fPrepareAcceptComplete, AlignerStateEnum.Idle);
  894. Transition(AlignerStateEnum.PrepareAccept, AlignerMsg.ActionDone, fPrepareAcceptComplete, AlignerStateEnum.Idle);
  895. Transition(AlignerStateEnum.PrepareAccept, FSM_MSG.TIMER, fMonitorPrepareAccept, AlignerStateEnum.Idle);
  896. }
  897. protected virtual bool fMonitorPrepareAccept(object[] param)
  898. {
  899. return false;
  900. }
  901. protected virtual bool fPrepareAcceptComplete(object[] param)
  902. {
  903. return true;
  904. }
  905. protected virtual bool fStartPrepareAccept(object[] param)
  906. {
  907. return true;
  908. }
  909. protected virtual bool fMonitorHome(object[] param)
  910. {
  911. return false;
  912. }
  913. protected virtual bool fHomeComplete(object[] param)
  914. {
  915. return true; ;
  916. }
  917. protected virtual bool fStartHome(object[] param)
  918. {
  919. return true;
  920. }
  921. public virtual bool IsWaferPresent(int slotindex)
  922. {
  923. return WaferManager.Instance.CheckHasWafer(RobotModuleName, slotindex);
  924. }
  925. public virtual RobotArmWaferStateEnum GetWaferState(int slotindex = 0)
  926. {
  927. if (WaferManager.Instance.CheckHasWafer(RobotModuleName, slotindex) != IsWaferPresent(slotindex))
  928. {
  929. return RobotArmWaferStateEnum.Error;
  930. }
  931. return IsWaferPresent(slotindex) ? RobotArmWaferStateEnum.Present : RobotArmWaferStateEnum.Absent;
  932. }
  933. protected virtual bool fStartMaintenance(object[] param)
  934. {
  935. return true;
  936. }
  937. protected virtual bool fMonitorMaintenance(object[] param)
  938. {
  939. return false;
  940. }
  941. protected virtual bool fCompleteMaintenance(object[] param)
  942. {
  943. return true;
  944. }
  945. protected abstract bool fStartLiftup(object[] param);
  946. protected virtual bool fLiftupComplete(object[] param)
  947. {
  948. return true;
  949. }
  950. protected virtual bool fMonitorLiftup(object[] param)
  951. {
  952. return false;
  953. }
  954. protected abstract bool fStartLiftdown(object[] param);
  955. protected virtual bool fLiftdownComplete(object[] param)
  956. {
  957. return true;
  958. }
  959. protected virtual bool fMonitorLiftdown(object[] param)
  960. {
  961. return false;
  962. }
  963. protected abstract bool fStartAlign(object[] param);
  964. private bool fAlignComplete(object[] param)
  965. {
  966. IsBusy = false;
  967. return true;
  968. }
  969. protected virtual bool fMonitorAligning(object[] param)
  970. {
  971. return false;
  972. }
  973. protected virtual bool fMonitorUnGrip(object[] param)
  974. {
  975. return false;
  976. }
  977. protected virtual bool fMonitorGrip(object[] param)
  978. {
  979. return false;
  980. }
  981. protected virtual bool fMoveComplete(object[] param)
  982. {
  983. return true;
  984. }
  985. protected virtual bool fStartMove(object[] param)
  986. {
  987. return true;
  988. }
  989. protected virtual bool fMonitorSetParamter(object[] param)
  990. {
  991. return false;
  992. }
  993. protected virtual bool fMonitorReadData(object[] param)
  994. {
  995. return false;
  996. }
  997. protected virtual bool fMonitorReset(object[] param)
  998. {
  999. return false;
  1000. }
  1001. protected virtual bool fMonitorGoTo(object[] param)
  1002. {
  1003. return false;
  1004. }
  1005. protected virtual bool fMonitorMap(object[] param)
  1006. {
  1007. return false;
  1008. }
  1009. protected virtual bool fMonitorPlace(object[] param)
  1010. {
  1011. return false;
  1012. }
  1013. protected virtual bool fMonitorSwap(object[] param)
  1014. {
  1015. return false;
  1016. }
  1017. protected virtual bool fMonitorPick(object[] param)
  1018. {
  1019. return false;
  1020. }
  1021. protected virtual bool fMonitorInit(object[] param)
  1022. {
  1023. return false;
  1024. }
  1025. protected abstract bool fStop(object[] param);
  1026. protected abstract bool FsmAbort(object[] param);
  1027. protected bool fResetComplete(object[] param)
  1028. {
  1029. IsBusy = false;
  1030. return true;
  1031. }
  1032. protected abstract bool fClear(object[] param);
  1033. protected virtual bool fSetComplete(object[] param)
  1034. {
  1035. IsBusy = false;
  1036. return true;
  1037. }
  1038. protected abstract bool fStartReadData(object[] param);
  1039. protected abstract bool fStartSetParameters(object[] param);
  1040. protected abstract bool fStartUnGrip(object[] param);
  1041. protected abstract bool fStartGrip(object[] param);
  1042. protected abstract bool fResetToReady(object[] param);
  1043. protected abstract bool fReset(object[] param);
  1044. protected abstract bool fStartInit(object[] param);
  1045. protected abstract bool fError(object[] param);
  1046. protected virtual bool fUnGripComplete(object[] param)
  1047. {
  1048. IsBusy = false;
  1049. return true;
  1050. }
  1051. protected virtual bool fGripComplete(object[] param)
  1052. {
  1053. IsBusy = false;
  1054. return true;
  1055. }
  1056. protected virtual bool fInitComplete(object[] param)
  1057. {
  1058. IsBusy = false;
  1059. return true;
  1060. }
  1061. public AlignerStateEnum AlignerState { get => (AlignerStateEnum)fsm.State; }
  1062. public string Module { get; set; }
  1063. public string Name { get; set; }
  1064. public ModuleName RobotModuleName { get; private set; }
  1065. public ModuleName CurrentInteractModule { get; private set; }
  1066. public virtual bool IsNeedRelease
  1067. {
  1068. get; set;
  1069. } = false;
  1070. public virtual bool IsNeedPrepareBeforePlaceWafer()
  1071. {
  1072. return false;
  1073. }
  1074. public virtual void Monitor()
  1075. {
  1076. return;
  1077. }
  1078. public virtual void Reset()
  1079. {
  1080. }
  1081. public virtual void OnError(string errortext)
  1082. {
  1083. EV.Notify("AlignerMotionError");
  1084. EV.PostAlarmLog(Module, $"{Name} occurred error: {errortext}");
  1085. IsBusy = false;
  1086. CheckToPostMessage((int)AlignerMsg.ERROR, new object[] { errortext });
  1087. }
  1088. public virtual bool SetParameters(object[] param)
  1089. {
  1090. return CheckToPostMessage((int)AlignerMsg.SetParameters, param);
  1091. }
  1092. public virtual bool PrepareAcceptWafer()
  1093. {
  1094. if (CheckToPostMessage((int)AlignerMsg.PrepareAccept, null))
  1095. {
  1096. IsBusy = true;
  1097. return true;
  1098. }
  1099. return false;
  1100. }
  1101. public virtual bool HomeAllAxes(out string reason)
  1102. {
  1103. reason = string.Empty;
  1104. return true;
  1105. }
  1106. public virtual bool QueryWaferMap(ModuleName module, out string reason)
  1107. {
  1108. reason = "";
  1109. return true;
  1110. }
  1111. public virtual bool OnActionDone(object[] param)
  1112. {
  1113. IsBusy = false;
  1114. return CheckToPostMessage((int)AlignerMsg.ActionDone, new object[] { "ActionDone" });
  1115. }
  1116. public bool CheckToPostMessage(int msg, params object[] args)
  1117. {
  1118. if (!fsm.FindTransition(fsm.State, msg))
  1119. {
  1120. if (msg != 7)
  1121. EV.PostWarningLog(Name, $"{Name} is in { (AlignerStateEnum)fsm.State} state,can not do {(AlignerMsg)msg}");
  1122. return false;
  1123. }
  1124. CurrentParamter = args;
  1125. fsm.PostMsg(msg, args);
  1126. return true;
  1127. }
  1128. public bool CheckToPostMessage(AlignerMsg msg, params object[] args)
  1129. {
  1130. if (!fsm.FindTransition(fsm.State, (int)msg))
  1131. {
  1132. if ((int)msg != 7)
  1133. EV.PostWarningLog(Name, $"{Name} is in { (AlignerStateEnum)fsm.State} state,can not do {(AlignerMsg)msg}");
  1134. return false;
  1135. }
  1136. CurrentParamter = args;
  1137. fsm.PostMsg((int)msg, args);
  1138. return true;
  1139. }
  1140. public bool Check(int msg, out string reason, params object[] args)
  1141. {
  1142. if (!fsm.FindTransition(fsm.State, msg))
  1143. {
  1144. reason = String.Format("{0} is in {1} state,can not do {2}", Name, (AlignerStateEnum)fsm.State, (AlignerMsg)msg);
  1145. return false;
  1146. }
  1147. CurrentParamter = args;
  1148. reason = "";
  1149. return true;
  1150. }
  1151. }
  1152. public enum WaferAlignerTypeEnum
  1153. {
  1154. Notch,
  1155. Line,
  1156. }
  1157. }