JelAlignerVacWithOcrCylinder.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO.Ports;
  4. using System.Linq;
  5. using System.Text;
  6. using Aitex.Core.Common.DeviceData;
  7. using Aitex.Core.RT.Device;
  8. using Aitex.Core.RT.Device.Unit;
  9. using Aitex.Core.RT.Event;
  10. using Aitex.Core.RT.Log;
  11. using Aitex.Core.RT.OperationCenter;
  12. using Aitex.Core.RT.SCCore;
  13. using Aitex.Core.Util;
  14. using MECF.Framework.Common.Communications;
  15. using MECF.Framework.Common.Device.Bases;
  16. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Common;
  17. using Newtonsoft.Json;
  18. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
  19. using MECF.Framework.Common.Equipment;
  20. using MECF.Framework.Common.SubstrateTrackings;
  21. using System.Threading;
  22. using Aitex.Core.Common;
  23. using Aitex.Core.RT.DataCenter;
  24. using System.Text.RegularExpressions;
  25. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.AlignersBase;
  26. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.JEL;
  27. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
  28. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.JelAligner
  29. {
  30. public class JelAlignerVacWithOcrCylinder : JelAligner, IConnection
  31. {
  32. /* SAL3262HV model: for 2-inch to 6-inch wafer
  33. SAL3362HV model: for 3-inch to 6-inch wafer
  34. SAL3482HV model: for 4-inch to 8-inch wafer
  35. SAL38C3HV model: for 8-inch to 12-inch wafer*/
  36. public JelAlignerVacWithOcrCylinder(string module, string name, string scRoot, IoSensor[] dis, IoTrigger[] dos,WaferSize[] sizes, int alignerType = 0, string robotModel = "") :
  37. base(module, name,scRoot,null,null,alignerType,robotModel)
  38. {
  39. _diWaferPresent = dis[0];
  40. _diOcrOnWaferSize1 = dis[1];
  41. _diOcrOnWaferSize2 = dis[2];
  42. _doOcrToWaferSize1 = dos[0];
  43. _doOcrToWaferSize2 = dos[1];
  44. _size1 = sizes[0];
  45. _size2 = sizes[1];
  46. DEVICE.Register(String.Format("{0}.{1}", Name, "OcrMoveTo6Inch"), (out string reason, int time, object[] param) =>
  47. {
  48. _doOcrToWaferSize1.SetTrigger(true,out _);
  49. _doOcrToWaferSize2.SetTrigger(false, out _);
  50. lock (_locker)
  51. {
  52. _lstMonitorHandler.AddLast(new JelAlignerMoveHandler(this, "WAS", "6"));
  53. _lstMonitorHandler.AddLast(new JelAlignerMoveHandler(this, "WMC"));
  54. }
  55. reason = string.Format("{0} {1}", Name, "MoveTo6Inch");
  56. return true;
  57. });
  58. DEVICE.Register(String.Format("{0}.{1}", Name, "OcrMoveTo8Inch"), (out string reason, int time, object[] param) =>
  59. {
  60. _doOcrToWaferSize1.SetTrigger(false, out _);
  61. _doOcrToWaferSize2.SetTrigger(true, out _);
  62. lock (_locker)
  63. {
  64. _lstMonitorHandler.AddLast(new JelAlignerMoveHandler(this, "WAS", "8"));
  65. _lstMonitorHandler.AddLast(new JelAlignerMoveHandler(this, "WMC"));
  66. }
  67. reason = string.Format("{0} {1}", Name, "MoveTo8Inch");
  68. return true;
  69. });
  70. }
  71. private IoSensor _diOcrOnWaferSize1;
  72. private IoSensor _diOcrOnWaferSize2;
  73. private IoTrigger _doOcrToWaferSize1;
  74. private IoTrigger _doOcrToWaferSize2;
  75. private IoSensor _diWaferPresent;
  76. private WaferSize _size1;
  77. private WaferSize _size2;
  78. #region ParseHandler
  79. #endregion
  80. public override bool IsNeedChangeWaferSize(WaferSize wz)
  81. {
  82. if (wz != GetCurrentWaferSize())
  83. return true;
  84. if (wz != Size)
  85. return true;
  86. return false;
  87. }
  88. protected override bool fStartInit(object[] param)
  89. {
  90. lock (_locker)
  91. {
  92. int alignspeed = AlginerSpeedSetPoint * 8191 / 100;
  93. _lstMoveHandler.AddLast(new JelAlignerMoveHandler(this, "W0"));
  94. _lstMoveHandler.AddLast(new JelAlignerReadHandler(this, ""));
  95. _lstMoveHandler.AddLast(new JelAlignerReadHandler(this, "WIS1"));
  96. //if (SC.ContainsItem($"{_scRoot}.{Name}.JelWaferType"))
  97. //{
  98. // int wafertype = SC.GetValue<int>($"{_scRoot}.{Name}.JelWaferType");
  99. // _lstMoveHandler.AddLast(new JelAlignerSetHandler(this, "WAT", wafertype.ToString()));
  100. //}
  101. if (WaferManager.Instance.CheckHasWafer(RobotModuleName, 0))
  102. {
  103. string strpara;
  104. var currentWafersize = WaferManager.Instance.GetWaferSize(RobotModuleName, 0);
  105. }
  106. _lstMoveHandler.AddLast(new JelAlignerMoveHandler(this, "WMC"));
  107. _lstMoveHandler.AddLast(new JelAlignerReadHandler(this, "WAS"));
  108. }
  109. _isAligned = false;
  110. _isOnHomedPostion = false;
  111. _dtActionStart = DateTime.Now;
  112. return true;
  113. }
  114. public override WaferSize GetCurrentWaferSize()
  115. {
  116. if (_diOcrOnWaferSize1.Value && !_diOcrOnWaferSize2.Value &&
  117. _doOcrToWaferSize1.Value && !_doOcrToWaferSize2.Value)
  118. return _size1;
  119. if (!_diOcrOnWaferSize1.Value && _diOcrOnWaferSize2.Value &&
  120. !_doOcrToWaferSize1.Value && _doOcrToWaferSize2.Value)
  121. return _size2;
  122. return WaferSize.WS0;
  123. }
  124. private DateTime _dtActionStart;
  125. protected override bool fMonitorInit(object[] param)
  126. {
  127. _isAligned = false;
  128. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds((double)TimelimitAlginerHome))
  129. OnError("Init timeout");
  130. if (_lstMoveHandler.Count == 0
  131. && !_connection.IsBusy && XAxisStatus == JelAxisStatus.NormalEnd
  132. && YAxisAndThetaAxisStatus == JelAxisStatus.NormalEnd)
  133. {
  134. IsBusy = false;
  135. _isOnHomedPostion = true;
  136. if (IsWaferPresent(0) && WaferManager.Instance.CheckNoWafer(RobotModuleName, 0))
  137. {
  138. WaferManager.Instance.CreateWafer(RobotModuleName, 0,
  139. WaferStatus.Normal, GetCurrentWaferSize());
  140. }
  141. if (!IsWaferPresent(0) && WaferManager.Instance.CheckHasWafer(RobotModuleName, 0))
  142. {
  143. EV.PostAlarmLog("System", $"There's no phisical wafer on {RobotModuleName},but it has wafer information on.");
  144. //WaferManager.Instance.DeleteWafer(RobotModuleName, 0);
  145. }
  146. return true;
  147. }
  148. if (_lstMoveHandler.Count == 0 && !_connection.IsBusy)
  149. _connection.Execute(new JelAlignerReadHandler(this, ""));
  150. return false;
  151. }
  152. protected override bool fStartHome(object[] param)
  153. {
  154. lock (_locker)
  155. {
  156. int alignspeed = AlginerSpeedSetPoint * 8191 / 100;
  157. _lstMoveHandler.AddLast(new JelAlignerMoveHandler(this, "W0"));
  158. _lstMoveHandler.AddLast(new JelAlignerReadHandler(this, ""));
  159. _lstMoveHandler.AddLast(new JelAlignerReadHandler(this, "WIS1"));
  160. if (SC.ContainsItem($"{_scRoot}.{Name}.JelWaferType"))
  161. {
  162. int wafertype = SC.GetValue<int>($"{_scRoot}.{Name}.JelWaferType");
  163. _lstMoveHandler.AddLast(new JelAlignerSetHandler(this, "WAT", wafertype.ToString()));
  164. }
  165. if (WaferManager.Instance.CheckHasWafer(RobotModuleName, 0))
  166. {
  167. string strpara;
  168. var currentWafersize = WaferManager.Instance.GetWaferSize(RobotModuleName, 0);
  169. //switch (WaferManager.Instance.GetWaferSize(RobotModuleName, 0))
  170. //{
  171. // case WaferSize.WS2:
  172. // case WaferSize.WS3:
  173. // case WaferSize.WS4:
  174. // case WaferSize.WS5:
  175. // case WaferSize.WS6:
  176. // case WaferSize.WS8:
  177. // strpara = _currentSetWaferSize.ToString().Replace("WS", "");
  178. // if (_doOcrTo200 != null && _doOcrTo200.DoTrigger != null)
  179. // _doOcrTo200.SetTrigger(true, out _);
  180. // if (_doOcrTo300 != null && _doOcrTo300.DoTrigger != null)
  181. // _doOcrTo300.SetTrigger(false, out _);
  182. // break;
  183. // case WaferSize.WS12:
  184. // strpara = "9";
  185. // if (_doOcrTo200 != null && _doOcrTo200.DoTrigger != null)
  186. // _doOcrTo200.SetTrigger(false, out _);
  187. // if (_doOcrTo300 != null && _doOcrTo300.DoTrigger != null)
  188. // _doOcrTo300.SetTrigger(true, out _);
  189. // break;
  190. // default:
  191. // return false;
  192. //}
  193. //_lstMonitorHandler.AddLast(new JelAlignerMoveHandler(this, "WAS", strpara));
  194. }
  195. _lstMoveHandler.AddLast(new JelAlignerMoveHandler(this, "WMC"));
  196. _lstMoveHandler.AddLast(new JelAlignerReadHandler(this, "WAS"));
  197. }
  198. _isAligned = false;
  199. _isOnHomedPostion = false;
  200. _dtActionStart = DateTime.Now;
  201. return true;
  202. }
  203. protected override bool fMonitorHome(object[] param)
  204. {
  205. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds((double)TimelimitAlginerHome))
  206. OnError("Home timeout");
  207. if (_lstMoveHandler.Count == 0
  208. && !_connection.IsBusy && XAxisStatus == JelAxisStatus.NormalEnd
  209. && YAxisAndThetaAxisStatus == JelAxisStatus.NormalEnd)
  210. {
  211. IsBusy = false;
  212. _isOnHomedPostion = true;
  213. return true;
  214. }
  215. if (_lstMoveHandler.Count == 0 && !_connection.IsBusy)
  216. _connection.Execute(new JelAlignerReadHandler(this, ""));
  217. return false;
  218. }
  219. public override bool IsWaferPresent(int slotindex)
  220. {
  221. if (_diWaferPresent != null)
  222. return _diWaferPresent.Value;
  223. return WaferManager.Instance.CheckHasWafer(RobotModuleName, slotindex);
  224. }
  225. public override bool IsNeedPrepareBeforePlaceWafer()
  226. {
  227. return !_isOnHomedPostion;
  228. }
  229. protected override bool fStartLiftdown(object[] param)
  230. {
  231. _dtActionStart = DateTime.Now;
  232. lock (_locker)
  233. {
  234. _lstMoveHandler.AddLast(new JelAlignerMoveHandler(this, "WD"));
  235. _lstMoveHandler.AddLast(new JelAlignerReadHandler(this, ""));
  236. }
  237. return true;
  238. }
  239. protected override bool fMonitorLiftdown(object[] param)
  240. {
  241. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimelimitForAlignWafer))
  242. OnError("Aligner lift down timeout");
  243. if (_lstMoveHandler.Count == 0
  244. && !_connection.IsBusy && XAxisStatus == JelAxisStatus.NormalEnd
  245. && YAxisAndThetaAxisStatus == JelAxisStatus.NormalEnd)
  246. {
  247. IsBusy = false;
  248. _isAligned = true;
  249. _isOnHomedPostion = false;
  250. return true;
  251. }
  252. if (_lstMoveHandler.Count == 0 && !_connection.IsBusy)
  253. _connection.Execute(new JelAlignerReadHandler(this, ""));
  254. return false;
  255. }
  256. protected override bool fStartSetParameters(object[] param)
  257. {
  258. _dtActionStart = DateTime.Now;
  259. _currentSetParameter = param[0].ToString();
  260. switch (_currentSetParameter)
  261. {
  262. case "WaferSize":
  263. if (GetWaferState() != RobotArmWaferStateEnum.Absent)
  264. {
  265. EV.PostAlarmLog("System", "Can't set wafersize when wafer is not absent");
  266. return false;
  267. }
  268. _currentSetWaferSize = (WaferSize)param[1];
  269. if (WaferManager.Instance.CheckHasWafer(RobotModuleName, 0))
  270. {
  271. WaferManager.Instance.UpdateWaferSize(RobotModuleName, 0, _currentSetWaferSize);
  272. }
  273. string strpara;
  274. switch (_currentSetWaferSize)
  275. {
  276. case WaferSize.WS2:
  277. case WaferSize.WS3:
  278. case WaferSize.WS4:
  279. case WaferSize.WS5:
  280. case WaferSize.WS6:
  281. strpara = _currentSetWaferSize.ToString().Replace("WS", "");
  282. break;
  283. case WaferSize.WS8:
  284. strpara = _currentSetWaferSize.ToString().Replace("WS", "");
  285. break;
  286. case WaferSize.WS12:
  287. strpara = "9";
  288. break;
  289. default:
  290. return false;
  291. }
  292. if(_currentSetWaferSize == _size1)
  293. {
  294. _doOcrToWaferSize1.SetTrigger(true, out _);
  295. _doOcrToWaferSize2.SetTrigger(false, out _);
  296. }
  297. if (_currentSetWaferSize == _size2)
  298. {
  299. _doOcrToWaferSize2.SetTrigger(true, out _);
  300. _doOcrToWaferSize1.SetTrigger(false, out _);
  301. }
  302. lock (_locker)
  303. {
  304. _lstMonitorHandler.AddLast(new JelAlignerMoveHandler(this, "WAS", strpara));
  305. _lstMonitorHandler.AddLast(new JelAlignerReadHandler(this, "WAS"));
  306. _lstMonitorHandler.AddLast(new JelAlignerMoveHandler(this, "WMC"));
  307. }
  308. break;
  309. }
  310. return true;
  311. }
  312. private string _currentSetParameter;
  313. private WaferSize _currentSetWaferSize = WaferSize.WS0;
  314. protected override bool fMonitorSetParamter(object[] param)
  315. {
  316. IsBusy = false;
  317. if (DateTime.Now - _dtActionStart > TimeSpan.FromSeconds(TimelimitForAlignWafer))
  318. OnError("Set parameter timeout");
  319. switch (_currentSetParameter)
  320. {
  321. case "WaferSize":
  322. if (_lstMonitorHandler.Count == 0 && _lstMoveHandler.Count == 0 && !_connection.IsBusy)
  323. {
  324. if (_currentSetWaferSize != Size)
  325. {
  326. OnError($"Fail to set wafer size,set:{_currentSetWaferSize},return:{Size}");
  327. }
  328. if(_currentSetWaferSize != GetCurrentWaferSize())
  329. {
  330. return false;
  331. }
  332. return true;
  333. }
  334. break;
  335. }
  336. return false;
  337. }
  338. }
  339. }