TazmoAlignerWithOcrCylinder.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.Device.Unit;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.SCCore;
  5. using MECF.Framework.Common.SubstrateTrackings;
  6. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TazmoAligners;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TazmoAlignerIIs
  13. {
  14. public class TazmoAlignerWithOcrCylinder: TazmoAlignerII
  15. {
  16. public TazmoAlignerWithOcrCylinder(string module,string name, string scRoot,IoSensor[] dis,IoTrigger[] dos, WaferSize[] wsizes):base(module,name,scRoot)
  17. {
  18. switch (wsizes[0])
  19. {
  20. case WaferSize.WS4:
  21. _diOcrOn4Inch = dis[0];
  22. _doOcrTo4Inch = dos[0];
  23. break;
  24. case WaferSize.WS6:
  25. _diOcrOn6Inch = dis[0];
  26. _doOcrTo6Inch = dos[0];
  27. break;
  28. case WaferSize.WS8:
  29. _diOcrOn8Inch = dis[0];
  30. _doOcrTo8Inch = dos[0];
  31. break;
  32. case WaferSize.WS12:
  33. _diOcrOn12Inch = dis[0];
  34. _doOcrTo12Inch = dos[0];
  35. break;
  36. default:
  37. break;
  38. }
  39. switch (wsizes[1])
  40. {
  41. case WaferSize.WS4:
  42. _diOcrOn4Inch = dis[1];
  43. _doOcrTo4Inch = dos[1];
  44. break;
  45. case WaferSize.WS6:
  46. _diOcrOn6Inch = dis[1];
  47. _doOcrTo6Inch = dos[1];
  48. break;
  49. case WaferSize.WS8:
  50. _diOcrOn8Inch = dis[1];
  51. _doOcrTo8Inch = dos[1];
  52. break;
  53. case WaferSize.WS12:
  54. _diOcrOn12Inch = dis[1];
  55. _doOcrTo12Inch = dos[1];
  56. break;
  57. default:
  58. break;
  59. }
  60. if (dis.Length > 2)
  61. _diWaferPresent = dis[2];
  62. }
  63. private IoSensor _diOcrOn6Inch;
  64. private IoSensor _diOcrOn8Inch;
  65. private IoSensor _diOcrOn12Inch;
  66. private IoSensor _diOcrOn4Inch;
  67. private IoSensor _diWaferPresent;
  68. private IoTrigger _doOcrTo4Inch;
  69. private IoTrigger _doOcrTo6Inch;
  70. private IoTrigger _doOcrTo8Inch;
  71. private IoTrigger _doOcrTo12Inch;
  72. private DateTime _dtActionStart;
  73. protected override bool fStartSetParameters(object[] param)
  74. {
  75. _dtActionStart = DateTime.Now;
  76. _currentSetParameter = param[0].ToString();
  77. switch (_currentSetParameter)
  78. {
  79. case "WaferSize":
  80. //if (GetWaferState() != RobotArmWaferStateEnum.Absent)
  81. //{
  82. // EV.PostAlarmLog("System", "Can't set wafersize when wafer is not absent");
  83. // return false;
  84. //}
  85. _currentSetWaferSize = (WaferSize)param[1];
  86. if (WaferManager.Instance.CheckHasWafer(RobotModuleName, 0))
  87. {
  88. WaferManager.Instance.UpdateWaferSize(RobotModuleName, 0, _currentSetWaferSize);
  89. }
  90. switch (_currentSetWaferSize)
  91. {
  92. case WaferSize.WS12:
  93. if (_doOcrTo8Inch != null && _doOcrTo8Inch.DoTrigger != null)
  94. _doOcrTo8Inch.SetTrigger(false, out _);
  95. if (_doOcrTo6Inch != null && _doOcrTo6Inch.DoTrigger != null)
  96. _doOcrTo6Inch.SetTrigger(false, out _);
  97. if (_doOcrTo12Inch != null && _doOcrTo12Inch.DoTrigger != null)
  98. _doOcrTo12Inch.SetTrigger(true, out _);
  99. if (_doOcrTo4Inch != null && _doOcrTo4Inch.DoTrigger != null)
  100. _doOcrTo4Inch.SetTrigger(false, out _);
  101. break;
  102. case WaferSize.WS8:
  103. if (_doOcrTo8Inch != null && _doOcrTo8Inch.DoTrigger != null)
  104. _doOcrTo8Inch.SetTrigger(true, out _);
  105. if (_doOcrTo6Inch != null && _doOcrTo6Inch.DoTrigger != null)
  106. _doOcrTo6Inch.SetTrigger(false, out _);
  107. if (_doOcrTo12Inch != null && _doOcrTo12Inch.DoTrigger != null)
  108. _doOcrTo12Inch.SetTrigger(false, out _);
  109. if (_doOcrTo4Inch != null && _doOcrTo4Inch.DoTrigger != null)
  110. _doOcrTo4Inch.SetTrigger(false, out _);
  111. break;
  112. case WaferSize.WS2:
  113. case WaferSize.WS3:
  114. case WaferSize.WS4:
  115. if (_doOcrTo8Inch != null && _doOcrTo8Inch.DoTrigger != null)
  116. _doOcrTo8Inch.SetTrigger(false, out _);
  117. if (_doOcrTo6Inch != null && _doOcrTo6Inch.DoTrigger != null)
  118. _doOcrTo6Inch.SetTrigger(false, out _);
  119. if (_doOcrTo12Inch != null && _doOcrTo12Inch.DoTrigger != null)
  120. _doOcrTo12Inch.SetTrigger(false, out _);
  121. if (_doOcrTo4Inch != null && _doOcrTo4Inch.DoTrigger != null)
  122. _doOcrTo4Inch.SetTrigger(true, out _);
  123. break;
  124. case WaferSize.WS5:
  125. case WaferSize.WS6:
  126. case WaferSize.WS7:
  127. if (_doOcrTo4Inch != null && _doOcrTo4Inch.DoTrigger != null)
  128. _doOcrTo4Inch.SetTrigger(false, out _);
  129. if (_doOcrTo6Inch != null && _doOcrTo6Inch.DoTrigger != null)
  130. _doOcrTo6Inch.SetTrigger(true, out _);
  131. if (_doOcrTo8Inch != null && _doOcrTo8Inch.DoTrigger != null)
  132. _doOcrTo8Inch.SetTrigger(false, out _);
  133. if (_doOcrTo12Inch != null && _doOcrTo12Inch.DoTrigger != null)
  134. _doOcrTo12Inch.SetTrigger(false, out _);
  135. break;
  136. default:
  137. break;
  138. }
  139. break;
  140. }
  141. return true;
  142. }
  143. private string _currentSetParameter;
  144. private WaferSize _currentSetWaferSize = WaferSize.WS0;
  145. protected override bool fMonitorSetParamter(object[] param)
  146. {
  147. IsBusy = false;
  148. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignWafer))
  149. OnError("Set parameter timeout");
  150. switch (_currentSetParameter)
  151. {
  152. case "WaferSize":
  153. switch (_currentSetWaferSize)
  154. {
  155. case WaferSize.WS6:
  156. if (_diOcrOn4Inch != null && _diOcrOn4Inch.SensorDI != null && _diOcrOn4Inch.Value)
  157. return false;
  158. if (_diOcrOn6Inch != null && _diOcrOn6Inch.SensorDI != null && !_diOcrOn6Inch.Value)
  159. return false;
  160. if (_diOcrOn8Inch != null && _diOcrOn8Inch.SensorDI != null && _diOcrOn8Inch.Value)
  161. return false;
  162. if (_diOcrOn12Inch != null && _diOcrOn12Inch.SensorDI != null && _diOcrOn12Inch.Value)
  163. return false;
  164. break;
  165. case WaferSize.WS8:
  166. if (_diOcrOn4Inch != null && _diOcrOn4Inch.SensorDI != null && _diOcrOn4Inch.Value)
  167. return false;
  168. if (_diOcrOn6Inch != null && _diOcrOn6Inch.SensorDI != null && _diOcrOn6Inch.Value)
  169. return false;
  170. if (_diOcrOn8Inch != null && _diOcrOn8Inch.SensorDI != null && !_diOcrOn8Inch.Value)
  171. return false;
  172. if (_diOcrOn12Inch != null && _diOcrOn12Inch.SensorDI != null && _diOcrOn12Inch.Value)
  173. return false;
  174. break;
  175. case WaferSize.WS4:
  176. if (_diOcrOn4Inch != null && _diOcrOn4Inch.SensorDI != null && !_diOcrOn4Inch.Value)
  177. return false;
  178. if (_diOcrOn6Inch != null && _diOcrOn6Inch.SensorDI != null && _diOcrOn6Inch.Value)
  179. return false;
  180. if (_diOcrOn8Inch != null && _diOcrOn8Inch.SensorDI != null && _diOcrOn8Inch.Value)
  181. return false;
  182. if (_diOcrOn12Inch != null && _diOcrOn12Inch.SensorDI != null && _diOcrOn12Inch.Value)
  183. return false;
  184. break;
  185. case WaferSize.WS12:
  186. if (_diOcrOn4Inch != null && _diOcrOn4Inch.SensorDI != null && _diOcrOn4Inch.Value)
  187. return false;
  188. if (_diOcrOn6Inch != null && _diOcrOn6Inch.SensorDI != null && _diOcrOn6Inch.Value)
  189. return false;
  190. if (_diOcrOn8Inch != null && _diOcrOn8Inch.SensorDI != null && _diOcrOn8Inch.Value)
  191. return false;
  192. if (_diOcrOn12Inch != null && _diOcrOn12Inch.SensorDI != null && !_diOcrOn12Inch.Value)
  193. return false;
  194. break;
  195. default:
  196. return true;
  197. }
  198. WaferManager.Instance.UpdateWaferSize(RobotModuleName, 0, _currentSetWaferSize);
  199. return true;
  200. default:
  201. return true;
  202. }
  203. }
  204. public override bool IsNeedChangeWaferSize(WaferSize wz)
  205. {
  206. switch(wz)
  207. {
  208. case WaferSize.WS12:
  209. if (_diOcrOn12Inch != null && _diOcrOn12Inch.Value && _doOcrTo12Inch != null && _doOcrTo12Inch.Value)
  210. return false;
  211. break;
  212. case WaferSize.WS8:
  213. if (_diOcrOn8Inch != null && _diOcrOn8Inch.Value && _doOcrTo8Inch != null && _doOcrTo8Inch.Value)
  214. return false;
  215. break;
  216. }
  217. return true;
  218. }
  219. public override WaferSize GetCurrentWaferSize()
  220. {
  221. if (_diOcrOn12Inch != null && _diOcrOn12Inch.Value && _doOcrTo12Inch != null && _doOcrTo12Inch.Value)
  222. return WaferSize.WS12;
  223. if (_diOcrOn8Inch != null && _diOcrOn8Inch.Value && _doOcrTo8Inch != null && _doOcrTo8Inch.Value)
  224. return WaferSize.WS8;
  225. return WaferSize.WS0;
  226. }
  227. public override bool IsNeedPrepareBeforePlaceWafer()
  228. {
  229. if (AligneTimesNoHome >= IntervalToHome)
  230. return true;
  231. return false;
  232. }
  233. private int IntervalToHome
  234. {
  235. get
  236. {
  237. if (SC.ContainsItem($"Aligner.{Name}.IntervalToHome"))
  238. return SC.GetValue<int>($"Aligner.{Name}.IntervalToHome");
  239. return 0;
  240. }
  241. }
  242. protected override bool fStartAlign(object[] param)
  243. {
  244. _dtActionStart = DateTime.Now;
  245. lock (_locker)
  246. {
  247. double aligneangle = (double)param[0];
  248. int anglevalue = (int)aligneangle * 10;
  249. IsNeedRelease = false;
  250. string para1 = $"1," + anglevalue.ToString("0000") + ",000";
  251. var wafer = WaferManager.Instance.GetWafer(RobotModuleName, 0);
  252. if (IsPreAlgin && !wafer.IsEmpty && wafer.Size == WaferSize.WS8)
  253. {
  254. if (SC.ContainsItem($"Aligner.{RobotModuleName}.PreAlignDistanceWS8"))
  255. {
  256. int nDistance = SC.GetValue<int>($"Aligner.{RobotModuleName}.PreAlignDistanceWS8");
  257. para1 = $"1," + anglevalue.ToString("0000") + $",{nDistance.ToString("D3")}";
  258. IsNeedRelease = true;
  259. }
  260. }
  261. if (_tazmotype == AlignerType.Mechnical)
  262. {
  263. anglevalue = (int)aligneangle * 100;
  264. para1 = $"1," + anglevalue.ToString("00000");
  265. }
  266. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.SetalignmentangleetcSet, para1));
  267. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.SeriesofalignmentMotion, "1,5"));
  268. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.OpenalignerchuckMotion, null));
  269. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  270. if (_tazmotype == AlignerType.Mechnical)
  271. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  272. }
  273. return true;
  274. }
  275. protected override bool fMonitorAligning(object[] param)
  276. {
  277. IsBusy = false;
  278. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  279. OnError("Aligning timeout");
  280. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  281. EV.PostInfoLog("Aligner", $"{RobotModuleName} aligning complete.");
  282. AligneTimesNoHome++;
  283. return true;
  284. }
  285. protected override bool fStartUnGrip(object[] param)
  286. {
  287. lock (_locker)
  288. {
  289. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.OpenalignerchuckMotion, null));
  290. _lstHandler.AddLast(new TwinTransactionHandler(this, TazmoCommand.MoveTheAlignerChuckToSpecifiedPosition, _defaultChuckPosition.ToString()));
  291. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.RequeststatusStatus, null));
  292. if (_tazmotype == AlignerType.Mechnical)
  293. _lstHandler.AddLast(new SingleTransactionHandler(this, TazmoCommand.Requeststatus2Status, null));
  294. }
  295. EV.PostInfoLog("Aligner", $"{RobotModuleName} start to ungrip wafer.");
  296. _dtActionStart = DateTime.Now;
  297. return true;
  298. }
  299. protected override bool fMonitorUnGrip(object[] param)
  300. {
  301. IsBusy = false;
  302. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimeLimitAlignerHome))
  303. OnError("UnGrip timeout");
  304. if (_lstHandler.Count != 0 || _connection.IsBusy) return false;
  305. IsNeedRelease = false;
  306. EV.PostInfoLog("Aligner", $"{RobotModuleName} ungrip complete.");
  307. return true;
  308. }
  309. }
  310. }