AlignRoutine.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.SCCore;
  3. using Aitex.Sorter.Common;
  4. using athosRT.FSM;
  5. using athosRT.tool;
  6. using MECF.Framework.Common.Equipment;
  7. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders;
  8. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using static Aitex.Core.Util.SubscriptionAttribute;
  15. namespace athosRT.Modules.EFEMs.Routine
  16. {
  17. public class AlignRoutine : ModuleRoutineBase, FSM.IRoutine
  18. {
  19. private SCConfigItem _scAlignTimeout = null;
  20. private SCConfigItem _scReaderTimeout = null;
  21. private SCConfigItem _scReadLaserNotch = null;
  22. private int _timeoutAlign = 0;
  23. private int _timeoutReadID = 0;
  24. private double _fReadLaserNotch = 0.0;
  25. private Aligner aligner;
  26. private OcrReader widreader = null;
  27. private bool flag;
  28. public double Notch { get; set; }
  29. public MoveOption Option { get; set; }
  30. public bool VerifyAny { get; set; }
  31. public bool VerifyLaserMaker { get; set; }
  32. public string LaserMaker { get; set; }
  33. public bool VerifyT7Code { get; set; }
  34. public string T7Code { get; set; }
  35. public AlignRoutine():base(ModuleName.Aligner)
  36. {
  37. Name = "Aligner";
  38. widreader = DEVICE.GetDevice<OcrReader>("WIDReader");
  39. _scAlignTimeout = SC.GetConfigItem("Aligner.TimeLimitForAlignWafer");
  40. _scReaderTimeout = SC.GetConfigItem("OcrReader.TimeLimitForWID");
  41. _scReadLaserNotch = SC.GetConfigItem("Aligner.AlignerReadAngle");
  42. aligner = DEVICE.GetDevice<Aligner>("Aligner");
  43. flag = false;
  44. }
  45. public RState Start(params object[] objs)
  46. {
  47. Reset();
  48. _scAlignTimeout = SC.GetConfigItem("Aligner.TimeLimitForAlignWafer");
  49. _scReaderTimeout = SC.GetConfigItem("OcrReader.TimeLimitForWID");
  50. _scReadLaserNotch = SC.GetConfigItem("Aligner.AlignerReadAngle");
  51. _timeoutAlign = _scAlignTimeout.IntValue*1000;
  52. _timeoutReadID = _scReaderTimeout.IntValue * 1000;
  53. _fReadLaserNotch = _scReadLaserNotch.IntValue * 1000;
  54. return Runner.Start(ModuleName.Aligner,"aligner routine 开始");
  55. }
  56. public enum AlignStep
  57. {
  58. AlignWafer,
  59. ReleaseAligner,
  60. AlignerMoveUp,
  61. ReadWaferID,
  62. ReadWaferID1,
  63. AlignWafer1,
  64. ReleaseAligner1,
  65. AlignerMoveUp1,
  66. }
  67. public RState Monitor()
  68. {
  69. Runner
  70. .Run(AlignStep.AlignWafer, AlignWafer, CheckAlignReady, _timeoutAlign)
  71. .Run(AlignStep.ReleaseAligner, ReleaseAlign, CheckAlignReady, _timeoutAlign)
  72. .Run(AlignStep.AlignerMoveUp, AlignerMoveUp, CheckAlignReady, _timeoutAlign)
  73. .Run(AlignStep.ReadWaferID, ReadWafer1, Check1WIDReader, _timeoutAlign)
  74. .Run(AlignStep.ReadWaferID1, ReadWafer2, Check2WIDReader, _timeoutAlign)
  75. .Run(AlignStep.AlignWafer1, AlignWafer1, CheckAlignReady1, _timeoutAlign)
  76. .Run(AlignStep.ReleaseAligner1, ReleaseAlign1, CheckAlignReady1, _timeoutAlign)
  77. .End(AlignStep.AlignerMoveUp1, AlignerMoveUp1, CheckAlignReady1, _timeoutAlign)
  78. ;
  79. return Runner.Status;
  80. }
  81. private bool ReadWafer2()
  82. {
  83. if ((Option & MoveOption.ReadID2) == MoveOption.ReadID2)
  84. {
  85. if (widreader.Read(false, out _))
  86. {
  87. LogObject.Info(Name, "wafer id reader操作成功");
  88. return true;
  89. }
  90. else
  91. {
  92. LogObject.Error(Name, "wafer id reader操作失败");
  93. return false;
  94. }
  95. }
  96. return true;
  97. }
  98. private bool Check1WIDReader()
  99. {
  100. if ((Option & MoveOption.ReadID) == MoveOption.ReadID)
  101. {
  102. if (!widreader.Busy)
  103. {
  104. LogObject.Info(Name, "ID Reader 设备不再busy");
  105. return true;
  106. }
  107. else
  108. {
  109. LogObject.Info(Name, "ID Reader 设备仍busy");
  110. return false;
  111. }
  112. }
  113. return true;
  114. }
  115. private bool Check2WIDReader()
  116. {
  117. if ((Option & MoveOption.ReadID2) == MoveOption.ReadID2)
  118. {
  119. if (!widreader.Busy)
  120. {
  121. LogObject.Info(Name, "ID Reader 设备不再busy");
  122. return true;
  123. }
  124. else
  125. {
  126. LogObject.Info(Name, "ID Reader 设备仍busy");
  127. return false;
  128. }
  129. }
  130. return true;
  131. }
  132. private bool ReadWafer1()
  133. {
  134. if ((Option & MoveOption.ReadID) == MoveOption.ReadID)
  135. {
  136. if (widreader.Read(true, out _))
  137. {
  138. LogObject.Info(Name, "wafer id reader操作成功");
  139. return true;
  140. }
  141. else
  142. {
  143. LogObject.Error(Name, "wafer id reader操作失败");
  144. return false;
  145. }
  146. }
  147. return true;
  148. }
  149. private bool AlignerMoveUp()
  150. {
  151. if (check1())
  152. {
  153. if (aligner.LiftUp(out _))
  154. {
  155. LogObject.Info(Name, "align MoveUp操作成功");
  156. return true;
  157. }
  158. else
  159. {
  160. LogObject.Error(Name, "align MoveUp操作失败");
  161. return false;
  162. }
  163. }
  164. return true;
  165. }
  166. private bool ReleaseAlign()
  167. {
  168. if (check1())
  169. {
  170. if (aligner.Release(Hand.Both, out _))
  171. {
  172. LogObject.Info(Name, "align Release操作成功");
  173. return true;
  174. }
  175. else
  176. {
  177. LogObject.Error(Name, "align Release操作失败");
  178. return false;
  179. }
  180. }
  181. return true;
  182. }
  183. private bool CheckAlignReady()
  184. {
  185. if (check1())
  186. {
  187. if (!aligner.Busy)
  188. {
  189. LogObject.Info(Name, "align 设备不再busy");
  190. return true;
  191. }
  192. else
  193. {
  194. LogObject.Info(Name, "align 设备仍busy");
  195. return false;
  196. }
  197. }
  198. return true;
  199. }
  200. private bool AlignWafer()
  201. {
  202. if (check1())
  203. {
  204. if (aligner.Align(Notch, out _))
  205. {
  206. LogObject.Info(Name, "align wafer操作成功");
  207. return true;
  208. }
  209. else
  210. {
  211. LogObject.Error(Name, "align wafer操作失败");
  212. return false;
  213. }
  214. }
  215. return true;
  216. }
  217. private bool AlignerMoveUp1()
  218. {
  219. if (check2())
  220. {
  221. if (aligner.LiftUp(out _))
  222. {
  223. LogObject.Info(Name, "align1 MoveUp操作成功");
  224. return true;
  225. }
  226. else
  227. {
  228. LogObject.Error(Name, "align1 MoveUp操作失败");
  229. return false;
  230. }
  231. }
  232. return true;
  233. }
  234. private bool ReleaseAlign1()
  235. {
  236. if (check2())
  237. {
  238. if (aligner.Release(Hand.Both, out _))
  239. {
  240. LogObject.Info(Name, "align1 Release操作成功");
  241. return true;
  242. }
  243. else
  244. {
  245. LogObject.Error(Name, "align1 Release操作失败");
  246. return false;
  247. }
  248. }
  249. return true;
  250. }
  251. private bool CheckAlignReady1()
  252. {
  253. if (check2())
  254. {
  255. if (!aligner.Busy)
  256. {
  257. LogObject.Info(Name, "align1 设备不再busy");
  258. return true;
  259. }
  260. else
  261. {
  262. LogObject.Info(Name, "align1 设备仍busy");
  263. return false;
  264. }
  265. }
  266. return true;
  267. }
  268. private bool AlignWafer1()
  269. {
  270. if (check2())
  271. {
  272. if (aligner.Align(Notch, out _))
  273. {
  274. LogObject.Info(Name, "align1 wafer操作成功");
  275. return true;
  276. }
  277. else
  278. {
  279. LogObject.Error(Name, "align1 wafer操作失败");
  280. return false;
  281. }
  282. }
  283. return true;
  284. }
  285. public void Abort()
  286. {
  287. }
  288. private bool check2()
  289. {
  290. return (!flag || Math.Abs(this.Notch - this._fReadLaserNotch) > 0.01);
  291. }
  292. private bool check1()
  293. {
  294. if ((Option & MoveOption.ReadID) == MoveOption.ReadID || (Option & MoveOption.ReadID2) == MoveOption.ReadID2)
  295. {
  296. flag = true;
  297. return true;
  298. }
  299. else
  300. {
  301. flag = false;
  302. return false;
  303. }
  304. }
  305. }
  306. }