TransferManager.cs 102 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using Aitex.Core.Common;
  6. using Aitex.Core.RT.Device;
  7. using Aitex.Core.RT.Event;
  8. using Aitex.Core.RT.Log;
  9. using Aitex.Core.RT.SCCore;
  10. using Aitex.Sorter.Common;
  11. using Aitex.Sorter.RT.Module;
  12. using MECF.Framework.Common.Equipment;
  13. using MECF.Framework.Common.SubstrateTrackings;
  14. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot;
  15. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
  16. namespace EFEM.RT.Modules
  17. {
  18. public class TransferManager
  19. {
  20. public bool empty { get { return moves.Count == 0; } }
  21. public bool PassAligner
  22. {
  23. get
  24. {
  25. foreach (var move in moves)
  26. {
  27. if ((((MoveOption)move.option & MoveOption.Align) == MoveOption.Align) ||
  28. (((MoveOption)move.option & MoveOption.ReadID) == MoveOption.ReadID) ||
  29. (((MoveOption)move.option & MoveOption.ReadID2) == MoveOption.ReadID2)
  30. )
  31. {
  32. return true;
  33. }
  34. }
  35. return false;
  36. }
  37. }
  38. public bool PassTurnOver
  39. {
  40. get
  41. {
  42. foreach (var move in moves)
  43. {
  44. if ((((MoveOption)move.option & MoveOption.Turnover) == MoveOption.Turnover))
  45. {
  46. return true;
  47. }
  48. }
  49. return false;
  50. }
  51. }
  52. public bool PassLoadLock
  53. {
  54. get
  55. {
  56. foreach (var move in moves)
  57. {
  58. if ((((MoveOption)move.option & MoveOption.LoadLock1) == MoveOption.LoadLock1) ||
  59. (((MoveOption)move.option & MoveOption.LoadLock2) == MoveOption.LoadLock2) ||
  60. (((MoveOption)move.option & MoveOption.LoadLock3) == MoveOption.LoadLock3) ||
  61. (((MoveOption)move.option & MoveOption.LoadLock4) == MoveOption.LoadLock4) ||
  62. (((MoveOption)move.option & MoveOption.LoadLock5) == MoveOption.LoadLock5) ||
  63. (((MoveOption)move.option & MoveOption.LoadLock6) == MoveOption.LoadLock6) ||
  64. (((MoveOption)move.option & MoveOption.LoadLock7) == MoveOption.LoadLock7) ||
  65. (((MoveOption)move.option & MoveOption.LoadLock8) == MoveOption.LoadLock8)
  66. )
  67. {
  68. return true;
  69. }
  70. }
  71. return false;
  72. }
  73. }
  74. public bool PassBuffer
  75. {
  76. get
  77. {
  78. foreach (var move in moves)
  79. {
  80. if (((MoveOption)move.option & MoveOption.Buffer) == MoveOption.Buffer)
  81. {
  82. return true;
  83. }
  84. }
  85. return false;
  86. }
  87. }
  88. private List<Move> moves = new List<Move>();
  89. private RobotBaseDevice rb = null;
  90. private List<Move> checks = new List<Move>();
  91. public List<ModuleName> TaskLoadPort { get; set; }
  92. //private int cyclestep = 0;
  93. //private bool A2B = true;
  94. public TransferManager()
  95. {
  96. rb = DEVICE.GetDevice<RobotBaseDevice>(DeviceName.Robot);
  97. TaskLoadPort = new List<ModuleName>();
  98. }
  99. public void AddMove(Move move)
  100. {
  101. moves.Add(move);
  102. }
  103. public List<MoveTask> GetTask()
  104. {
  105. List<MoveTask> tasks = new List<MoveTask>();
  106. foreach (Move move in moves)
  107. {
  108. MoveTask task = new MoveTask();
  109. task.WaferID = move.WaferID;
  110. task.SourceStaion = (ModuleName)move.SourceStaion;
  111. task.SourceSlot = move.SourceSlot;
  112. task.DestStaion = (ModuleName)move.DestStaion;
  113. task.DestSlot = move.DestSlot;
  114. task.swap = move.swap;
  115. task.option = (MoveOption)move.option;
  116. task.Notch = move.Angle; //
  117. task.VerifyAny = move.VerifyAny;
  118. task.VerifyLaserMaker = move.VerifyLaserMaker;
  119. task.LaserMaker = move.LaserMaker;
  120. task.VerifyT7Code = move.VerifyT7Code;
  121. task.T7Code = move.T7Code;
  122. task.DelayTimeBeforePick= move.DelayTimeBeforePick;
  123. tasks.Add(task);
  124. }
  125. return tasks;
  126. }
  127. public void Clear()
  128. {
  129. moves.Clear();
  130. }
  131. public bool CreateTransferTask(TransferInfo[] transfers)
  132. {
  133. TaskLoadPort.Clear();
  134. if (!Convert(transfers, ref moves))
  135. {
  136. return false;
  137. }
  138. checks = new List<Move>(moves.ToArray());
  139. return CheckMoves();
  140. }
  141. public bool CreateCycleTransferTask(ModuleName source, MoveOption option)
  142. {
  143. moves.Clear();
  144. if (!LoadAlignerCycleTask(source, option, ref moves))
  145. return false;
  146. checks = new List<Move>(moves.ToArray());
  147. return CheckMoves();
  148. }
  149. public bool CreateCycleBenchmarkTask(ModuleName source, MoveOption option)
  150. {
  151. moves.Clear();
  152. if (!LoadBenchmarkCycleTask(source, option, ref moves))
  153. return false;
  154. checks = new List<Move>(moves.ToArray());
  155. return CheckMoves();
  156. }
  157. private bool LoadAlignerCycleTask(ModuleName source, MoveOption passThrough, ref List<Move> moves)
  158. {
  159. int option = 0;
  160. //if (!SC.GetValue<bool>("Process.CycleEnableAlign") && !SC.GetValue<bool>("Process.CycleEnableLaserMarker1") && !SC.GetValue<bool>("Process.CycleEnableLaserMarker2"))
  161. //{
  162. // EV.PostWarningLog("System", "Cycle in same port need through aligner");
  163. // return false;
  164. //}
  165. if (SC.ContainsItem("Process.CycleEnableTurnOver"))
  166. if (SC.GetValue<bool>("Process.CycleEnableTurnOver"))
  167. {
  168. option |= (int)MoveOption.Turnover;
  169. }
  170. if (SC.ContainsItem("Process.CycleEnableAlign"))
  171. if (SC.GetValue<bool>("Process.CycleEnableAlign"))
  172. {
  173. option |= (int)MoveOption.Align;
  174. }
  175. if (SC.ContainsItem("Process.CycleEnableLaserMarker1"))
  176. if (SC.GetValue<bool>("Process.CycleEnableLaserMarker1"))
  177. {
  178. option |= (int)MoveOption.ReadID;
  179. }
  180. if (SC.ContainsItem("Process.CycleEnableLaserMarker2"))
  181. if (SC.GetValue<bool>("Process.CycleEnableLaserMarker2"))
  182. {
  183. option |= (int)MoveOption.ReadID2;
  184. }
  185. if (SC.ContainsItem("Process.DefaultReader"))
  186. option |= (int)(SC.GetValue<int>("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2);
  187. SCConfigItem _scLP2Pitch = SC.GetConfigItem("LoadPort.LoadPort2Pitch");
  188. if (_scLP2Pitch == null || _scLP2Pitch.IntValue == 10)
  189. {
  190. for (int i = 0; i < 25; i++)
  191. {
  192. ModuleName? midStation = null;
  193. if (WaferManager.Instance.CheckHasWafer(source, i))
  194. {
  195. #region MyRegion
  196. if ((passThrough & MoveOption.LoadLock1) == MoveOption.LoadLock1)
  197. {
  198. midStation = ModuleName.LL1;
  199. Move move = new Move();
  200. move.SourceStaion = (int)source;
  201. move.SourceSlot = i;
  202. move.DestStaion = (int)midStation;
  203. move.DestSlot = 0;
  204. move.option = option;
  205. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  206. moves.Add(move);
  207. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  208. ((ModuleName)move.SourceStaion).ToString(),
  209. move.SourceSlot,
  210. ((ModuleName)move.DestStaion).ToString(),
  211. move.DestSlot));
  212. }
  213. if ((passThrough & MoveOption.LoadLock2) == MoveOption.LoadLock2)
  214. {
  215. if (midStation != null)
  216. {
  217. Move move = new Move();
  218. move.SourceStaion = (int)midStation;
  219. move.SourceSlot = 0;
  220. midStation = ModuleName.LL2;
  221. move.DestStaion = (int)midStation;
  222. move.DestSlot = 0;
  223. move.option = option;
  224. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  225. moves.Add(move);
  226. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  227. ((ModuleName)move.SourceStaion).ToString(),
  228. move.SourceSlot,
  229. ((ModuleName)move.DestStaion).ToString(),
  230. move.DestSlot));
  231. }
  232. else
  233. {
  234. Move move = new Move();
  235. midStation = ModuleName.LL2;
  236. move.SourceStaion = (int)source;
  237. move.SourceSlot = i;
  238. move.DestStaion = (int)midStation;
  239. move.DestSlot = 0;
  240. move.option = option;
  241. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  242. moves.Add(move);
  243. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  244. ((ModuleName)move.SourceStaion).ToString(),
  245. move.SourceSlot,
  246. ((ModuleName)move.DestStaion).ToString(),
  247. move.DestSlot));
  248. }
  249. }
  250. if ((passThrough & MoveOption.CoolingBuffer1) == MoveOption.CoolingBuffer1)
  251. {
  252. if (midStation != null)
  253. {
  254. Move move = new Move();
  255. move.SourceStaion = (int)midStation;
  256. move.SourceSlot = 0;
  257. midStation = ModuleName.CoolingBuffer1;
  258. move.DestStaion = (int)midStation;
  259. move.DestSlot = 0;
  260. move.option = option;
  261. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  262. moves.Add(move);
  263. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  264. ((ModuleName)move.SourceStaion).ToString(),
  265. move.SourceSlot,
  266. ((ModuleName)move.DestStaion).ToString(),
  267. move.DestSlot));
  268. }
  269. else
  270. {
  271. Move move = new Move();
  272. midStation = ModuleName.CoolingBuffer1;
  273. move.SourceStaion = (int)source;
  274. move.SourceSlot = i;
  275. move.DestStaion = (int)midStation;
  276. move.DestSlot = 0;
  277. move.option = option;
  278. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  279. moves.Add(move);
  280. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  281. ((ModuleName)move.SourceStaion).ToString(),
  282. move.SourceSlot,
  283. ((ModuleName)move.DestStaion).ToString(),
  284. move.DestSlot));
  285. }
  286. }
  287. if ((passThrough & MoveOption.CoolingBuffer2) == MoveOption.CoolingBuffer2)
  288. {
  289. if (midStation != null)
  290. {
  291. Move move = new Move();
  292. move.SourceStaion = (int)midStation;
  293. move.SourceSlot = 0;
  294. midStation = ModuleName.CoolingBuffer2;
  295. move.DestStaion = (int)midStation;
  296. move.DestSlot = 0;
  297. move.option = option;
  298. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  299. moves.Add(move);
  300. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  301. ((ModuleName)move.SourceStaion).ToString(),
  302. move.SourceSlot,
  303. ((ModuleName)move.DestStaion).ToString(),
  304. move.DestSlot));
  305. }
  306. else
  307. {
  308. Move move = new Move();
  309. midStation = ModuleName.CoolingBuffer2;
  310. move.SourceStaion = (int)source;
  311. move.SourceSlot = i;
  312. move.DestStaion = (int)midStation;
  313. move.DestSlot = 0;
  314. move.option = option;
  315. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  316. moves.Add(move);
  317. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  318. ((ModuleName)move.SourceStaion).ToString(),
  319. move.SourceSlot,
  320. ((ModuleName)move.DestStaion).ToString(),
  321. move.DestSlot));
  322. }
  323. }
  324. if (midStation == null || midStation == source)
  325. #endregion
  326. {
  327. Move move = new Move();
  328. move.SourceStaion = (int)source;
  329. move.SourceSlot = i;
  330. move.DestStaion = (int)source;
  331. move.DestSlot = i;
  332. move.option = option;
  333. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  334. moves.Add(move);
  335. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  336. ((ModuleName)move.SourceStaion).ToString(),
  337. move.SourceSlot,
  338. ((ModuleName)move.DestStaion).ToString(),
  339. move.DestSlot));
  340. }
  341. else
  342. {
  343. Move move = new Move();
  344. move.SourceStaion = (int)midStation;
  345. move.SourceSlot = 0;
  346. move.DestStaion = (int)source;
  347. move.DestSlot = i;
  348. move.option = option;
  349. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  350. moves.Add(move);
  351. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  352. ((ModuleName)move.SourceStaion).ToString(),
  353. move.SourceSlot,
  354. ((ModuleName)move.DestStaion).ToString(),
  355. move.DestSlot));
  356. }
  357. }
  358. }
  359. }
  360. return true;
  361. }
  362. private bool LoadBenchmarkCycleTask(ModuleName source, MoveOption passThrough, ref List<Move> moves)
  363. {
  364. for (int i = 0; i < 25; i++)
  365. {
  366. ModuleName? midStation = null;
  367. if (WaferManager.Instance.CheckHasWafer(source, i))
  368. {
  369. if ((passThrough & MoveOption.CoolingBuffer1) == MoveOption.CoolingBuffer1)
  370. {
  371. midStation = ModuleName.CoolingBuffer1;
  372. Move move = new Move();
  373. move.SourceStaion = (int)source;
  374. move.SourceSlot = i;
  375. move.DestStaion = (int)midStation;
  376. move.DestSlot = 0;
  377. move.option = (int)passThrough;
  378. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  379. moves.Add(move);
  380. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  381. ((ModuleName)move.SourceStaion).ToString(),
  382. move.SourceSlot,
  383. ((ModuleName)move.DestStaion).ToString(),
  384. move.DestSlot));
  385. }
  386. if ((passThrough & MoveOption.CoolingBuffer2) == MoveOption.CoolingBuffer2)
  387. {
  388. if (midStation != null)
  389. {
  390. Move move = new Move();
  391. move.SourceStaion = (int)midStation;
  392. move.SourceSlot = 0;
  393. midStation = ModuleName.CoolingBuffer2;
  394. move.DestStaion = (int)midStation;
  395. move.DestSlot = 0;
  396. move.option = (int)passThrough;
  397. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  398. moves.Add(move);
  399. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  400. ((ModuleName)move.SourceStaion).ToString(),
  401. move.SourceSlot,
  402. ((ModuleName)move.DestStaion).ToString(),
  403. move.DestSlot));
  404. }
  405. else
  406. {
  407. Move move = new Move();
  408. midStation = ModuleName.CoolingBuffer2;
  409. move.SourceStaion = (int)source;
  410. move.SourceSlot = i;
  411. move.DestStaion = (int)midStation;
  412. move.DestSlot = 0;
  413. move.option = (int)passThrough;
  414. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  415. moves.Add(move);
  416. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  417. ((ModuleName)move.SourceStaion).ToString(),
  418. move.SourceSlot,
  419. ((ModuleName)move.DestStaion).ToString(),
  420. move.DestSlot));
  421. }
  422. }
  423. if ((passThrough & MoveOption.Aligner1) == MoveOption.Aligner1)
  424. {
  425. midStation = ModuleName.Aligner1;
  426. Move move = new Move();
  427. move.SourceStaion = (int)source;
  428. move.SourceSlot = i;
  429. move.DestStaion = (int)midStation;
  430. move.DestSlot = 0;
  431. move.option = (int)passThrough;
  432. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  433. moves.Add(move);
  434. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  435. ((ModuleName)move.SourceStaion).ToString(),
  436. move.SourceSlot,
  437. ((ModuleName)move.DestStaion).ToString(),
  438. move.DestSlot));
  439. }
  440. if ((passThrough & MoveOption.Aligner2) == MoveOption.Aligner2)
  441. {
  442. if (midStation != null)
  443. {
  444. Move move = new Move();
  445. move.SourceStaion = (int)midStation;
  446. move.SourceSlot = 0;
  447. midStation = ModuleName.Aligner2;
  448. move.DestStaion = (int)midStation;
  449. move.DestSlot = 0;
  450. move.option = (int)passThrough;
  451. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  452. moves.Add(move);
  453. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  454. ((ModuleName)move.SourceStaion).ToString(),
  455. move.SourceSlot,
  456. ((ModuleName)move.DestStaion).ToString(),
  457. move.DestSlot));
  458. }
  459. else
  460. {
  461. Move move = new Move();
  462. midStation = ModuleName.Aligner2;
  463. move.SourceStaion = (int)source;
  464. move.SourceSlot = i;
  465. move.DestStaion = (int)midStation;
  466. move.DestSlot = 0;
  467. move.option = (int)passThrough;
  468. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  469. moves.Add(move);
  470. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  471. ((ModuleName)move.SourceStaion).ToString(),
  472. move.SourceSlot,
  473. ((ModuleName)move.DestStaion).ToString(),
  474. move.DestSlot));
  475. }
  476. }
  477. if ((passThrough & MoveOption.LoadLock1) == MoveOption.LoadLock1)
  478. {
  479. if (midStation != null)
  480. {
  481. Move move = new Move();
  482. move.SourceStaion = (int)midStation;
  483. move.SourceSlot = 0;
  484. midStation = ModuleName.LL1;
  485. move.DestStaion = (int)midStation;
  486. move.DestSlot = 0;
  487. move.option = (int)passThrough;
  488. move.DelayTimeBeforePick = SC.ContainsItem("Process.DelayBeforeWaferPutToLL") ? SC.GetValue<double>("Process.DelayBeforeWaferPutToLL") : 7.0;
  489. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  490. moves.Add(move);
  491. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  492. ((ModuleName)move.SourceStaion).ToString(),
  493. move.SourceSlot,
  494. ((ModuleName)move.DestStaion).ToString(),
  495. move.DestSlot));
  496. }
  497. else
  498. {
  499. Move move = new Move();
  500. midStation = ModuleName.LL1;
  501. move.SourceStaion = (int)source;
  502. move.SourceSlot = i;
  503. move.DestStaion = (int)midStation;
  504. move.DestSlot = 0;
  505. move.option = (int)passThrough;
  506. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  507. moves.Add(move);
  508. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  509. ((ModuleName)move.SourceStaion).ToString(),
  510. move.SourceSlot,
  511. ((ModuleName)move.DestStaion).ToString(),
  512. move.DestSlot));
  513. }
  514. }
  515. if ((passThrough & MoveOption.LoadLock2) == MoveOption.LoadLock2)
  516. {
  517. if (midStation != null)
  518. {
  519. Move move = new Move();
  520. move.SourceStaion = (int)midStation;
  521. move.SourceSlot = 0;
  522. midStation = ModuleName.LL2;
  523. move.DestStaion = (int)midStation;
  524. move.DestSlot = 0;
  525. move.option = (int)passThrough;
  526. move.DelayTimeBeforePick = SC.ContainsItem("Process.DelayBeforeWaferPutToLL") ? SC.GetValue<double>("Process.DelayBeforeWaferPutToLL") : 7.0;
  527. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  528. moves.Add(move);
  529. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  530. ((ModuleName)move.SourceStaion).ToString(),
  531. move.SourceSlot,
  532. ((ModuleName)move.DestStaion).ToString(),
  533. move.DestSlot));
  534. }
  535. else
  536. {
  537. Move move = new Move();
  538. midStation = ModuleName.LL2;
  539. move.SourceStaion = (int)source;
  540. move.SourceSlot = i;
  541. move.DestStaion = (int)midStation;
  542. move.DestSlot = 0;
  543. move.option = (int)passThrough;
  544. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  545. moves.Add(move);
  546. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  547. ((ModuleName)move.SourceStaion).ToString(),
  548. move.SourceSlot,
  549. ((ModuleName)move.DestStaion).ToString(),
  550. move.DestSlot));
  551. }
  552. }
  553. if ((passThrough & MoveOption.CoolingBuffer1) == MoveOption.CoolingBuffer1)
  554. {
  555. if (midStation != null)
  556. {
  557. Move move = new Move();
  558. move.SourceStaion = (int)midStation;
  559. move.SourceSlot = 0;
  560. midStation = ModuleName.CoolingBuffer1;
  561. move.DestStaion = (int)midStation;
  562. move.DestSlot = 0;
  563. move.option = (int)passThrough;
  564. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  565. moves.Add(move);
  566. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  567. ((ModuleName)move.SourceStaion).ToString(),
  568. move.SourceSlot,
  569. ((ModuleName)move.DestStaion).ToString(),
  570. move.DestSlot));
  571. }
  572. else
  573. {
  574. Move move = new Move();
  575. midStation = ModuleName.CoolingBuffer1;
  576. move.SourceStaion = (int)source;
  577. move.SourceSlot = i;
  578. move.DestStaion = (int)midStation;
  579. move.DestSlot = 0;
  580. move.option = (int)passThrough;
  581. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  582. moves.Add(move);
  583. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  584. ((ModuleName)move.SourceStaion).ToString(),
  585. move.SourceSlot,
  586. ((ModuleName)move.DestStaion).ToString(),
  587. move.DestSlot));
  588. }
  589. }
  590. if ((passThrough & MoveOption.CoolingBuffer2) == MoveOption.CoolingBuffer2)
  591. {
  592. if (midStation != null)
  593. {
  594. Move move = new Move();
  595. move.SourceStaion = (int)midStation;
  596. move.SourceSlot = 0;
  597. midStation = ModuleName.CoolingBuffer2;
  598. move.DestStaion = (int)midStation;
  599. move.DestSlot = 0;
  600. move.option = (int)passThrough;
  601. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  602. moves.Add(move);
  603. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  604. ((ModuleName)move.SourceStaion).ToString(),
  605. move.SourceSlot,
  606. ((ModuleName)move.DestStaion).ToString(),
  607. move.DestSlot));
  608. }
  609. else
  610. {
  611. Move move = new Move();
  612. midStation = ModuleName.CoolingBuffer2;
  613. move.SourceStaion = (int)source;
  614. move.SourceSlot = i;
  615. move.DestStaion = (int)midStation;
  616. move.DestSlot = 0;
  617. move.option = (int)passThrough;
  618. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  619. moves.Add(move);
  620. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  621. ((ModuleName)move.SourceStaion).ToString(),
  622. move.SourceSlot,
  623. ((ModuleName)move.DestStaion).ToString(),
  624. move.DestSlot));
  625. }
  626. }
  627. if ((passThrough & MoveOption.Aligner1) == MoveOption.Aligner1)
  628. {
  629. if (midStation != null)
  630. {
  631. Move move = new Move();
  632. move.SourceStaion = (int)midStation;
  633. move.SourceSlot = 0;
  634. midStation = ModuleName.Aligner1;
  635. move.DestStaion = (int)midStation;
  636. move.DestSlot = 0;
  637. move.option = (int)passThrough;
  638. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  639. moves.Add(move);
  640. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  641. ((ModuleName)move.SourceStaion).ToString(),
  642. move.SourceSlot,
  643. ((ModuleName)move.DestStaion).ToString(),
  644. move.DestSlot));
  645. }
  646. else
  647. {
  648. Move move = new Move();
  649. midStation = ModuleName.Aligner1;
  650. move.SourceStaion = (int)source;
  651. move.SourceSlot = i;
  652. move.DestStaion = (int)midStation;
  653. move.DestSlot = 0;
  654. move.option = (int)passThrough;
  655. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  656. moves.Add(move);
  657. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  658. ((ModuleName)move.SourceStaion).ToString(),
  659. move.SourceSlot,
  660. ((ModuleName)move.DestStaion).ToString(),
  661. move.DestSlot));
  662. }
  663. }
  664. if ((passThrough & MoveOption.Aligner2) == MoveOption.Aligner2)
  665. {
  666. if (midStation != null)
  667. {
  668. Move move = new Move();
  669. move.SourceStaion = (int)midStation;
  670. move.SourceSlot = 0;
  671. midStation = ModuleName.Aligner2;
  672. move.DestStaion = (int)midStation;
  673. move.DestSlot = 0;
  674. move.option = (int)passThrough;
  675. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  676. moves.Add(move);
  677. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  678. ((ModuleName)move.SourceStaion).ToString(),
  679. move.SourceSlot,
  680. ((ModuleName)move.DestStaion).ToString(),
  681. move.DestSlot));
  682. }
  683. else
  684. {
  685. Move move = new Move();
  686. midStation = ModuleName.Aligner2;
  687. move.SourceStaion = (int)source;
  688. move.SourceSlot = i;
  689. move.DestStaion = (int)midStation;
  690. move.DestSlot = 0;
  691. move.option = (int)passThrough;
  692. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  693. moves.Add(move);
  694. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  695. ((ModuleName)move.SourceStaion).ToString(),
  696. move.SourceSlot,
  697. ((ModuleName)move.DestStaion).ToString(),
  698. move.DestSlot));
  699. }
  700. }
  701. if (midStation == null || midStation == source)
  702. {
  703. Move move = new Move();
  704. move.SourceStaion = (int)source;
  705. move.SourceSlot = i;
  706. move.DestStaion = (int)source;
  707. move.DestSlot = i;
  708. move.option = (int)passThrough;
  709. move.DelayTimeBeforePick = SC.ContainsItem("Process.DelayAfterWaferPickFromLL") ? SC.GetValue<double>("Process.DelayAfterWaferPickFromLL") : 14;
  710. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  711. moves.Add(move);
  712. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  713. ((ModuleName)move.SourceStaion).ToString(),
  714. move.SourceSlot,
  715. ((ModuleName)move.DestStaion).ToString(),
  716. move.DestSlot));
  717. }
  718. else
  719. {
  720. Move move = new Move();
  721. move.SourceStaion = (int)midStation;
  722. move.SourceSlot = 0;
  723. move.DestStaion = (int)source;
  724. move.DestSlot = i;
  725. move.option = (int)passThrough;
  726. move.DelayTimeBeforePick = SC.ContainsItem("Process.DelayAfterWaferPickFromLL") ? SC.GetValue<double>("Process.DelayAfterWaferPickFromLL") : 14;
  727. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  728. moves.Add(move);
  729. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  730. ((ModuleName)move.SourceStaion).ToString(),
  731. move.SourceSlot,
  732. ((ModuleName)move.DestStaion).ToString(),
  733. move.DestSlot));
  734. }
  735. }
  736. }
  737. return true;
  738. }
  739. public bool CreateCycleTransferTask(ModuleName source, ModuleName target)
  740. {
  741. moves.Clear();
  742. LoadSameSlot(source, target, ref moves);
  743. checks = new List<Move>(moves.ToArray());
  744. return CheckMoves();
  745. }
  746. public bool CreateCycleTransferTask(ModuleName source, ModuleName target, MoveOption option)
  747. {
  748. moves.Clear();
  749. PassThroughCycle(source, target, option, ref moves);
  750. checks = new List<Move>(moves.ToArray());
  751. return CheckMoves();
  752. }
  753. private bool LoadSameSlot(ModuleName source, ModuleName dest, ref List<Move> moves)
  754. {
  755. int option = 0;
  756. if (SC.ContainsItem("Process.CycleEnableAlign"))
  757. if (SC.GetValue<bool>("Process.CycleEnableAlign"))
  758. {
  759. option |= (int)MoveOption.Align;
  760. }
  761. if (SC.ContainsItem("Process.CycleEnableLaserMarker1"))
  762. if (SC.GetValue<bool>("Process.CycleEnableLaserMarker1"))
  763. {
  764. option |= (int)MoveOption.ReadID;
  765. }
  766. if (SC.ContainsItem("Process.CycleEnableLaserMarker2"))
  767. if (SC.GetValue<bool>("Process.CycleEnableLaserMarker2"))
  768. {
  769. option |= (int)MoveOption.ReadID2;
  770. }
  771. if (SC.ContainsItem("Process.CycleEnableTurnOver"))
  772. if (SC.GetValue<bool>("Process.CycleEnableTurnOver"))
  773. {
  774. option |= (int)MoveOption.Turnover;
  775. }
  776. if (SC.ContainsItem("OcrReader.DefaultReader"))
  777. option |= (int)(SC.GetValue<int>("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2);
  778. SCConfigItem _scLP2Pitch;
  779. if (SC.ContainsItem("OcrReader.DefaultReader"))
  780. {
  781. _scLP2Pitch = SC.GetConfigItem("LoadPort.LoadPort2Pitch");
  782. }
  783. else
  784. {
  785. _scLP2Pitch = null;
  786. }
  787. if (_scLP2Pitch == null || _scLP2Pitch.IntValue == 10)
  788. {
  789. if (ModuleHelper.IsLoadPort(source) && ModuleHelper.IsLoadPort(dest))
  790. {
  791. for (int i = 0; i < 25; i++)
  792. {
  793. if ((WaferManager.Instance.CheckHasWafer(source, i)) && (WaferManager.Instance.CheckNoWafer(dest, i)))
  794. {
  795. Move move = new Move();
  796. move.SourceStaion = (int)source;
  797. move.SourceSlot = i;
  798. move.DestStaion = (int)dest;
  799. move.DestSlot = i;
  800. move.option = option;
  801. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  802. moves.Add(move);
  803. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  804. ((ModuleName)move.SourceStaion).ToString(),
  805. move.SourceSlot,
  806. ((ModuleName)move.DestStaion).ToString(),
  807. move.DestSlot));
  808. }
  809. }
  810. }
  811. else if (ModuleHelper.IsBuffer(source))
  812. {
  813. int y = 0;
  814. for (int i = 0; i < 25; i++)
  815. {
  816. if (y > 5)
  817. break;
  818. if (WaferManager.Instance.CheckHasWafer(source, y))
  819. {
  820. if (WaferManager.Instance.CheckNoWafer(dest, i))
  821. {
  822. Move move = new Move();
  823. move.SourceStaion = (int)source;
  824. move.SourceSlot = y;
  825. move.DestStaion = (int)dest;
  826. move.DestSlot = i;
  827. move.option = option;
  828. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  829. moves.Add(move);
  830. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  831. ((ModuleName)move.SourceStaion).ToString(),
  832. move.SourceSlot,
  833. ((ModuleName)move.DestStaion).ToString(),
  834. move.DestSlot));
  835. y++;
  836. }
  837. }
  838. else
  839. {
  840. y++;
  841. i--;
  842. }
  843. }
  844. }
  845. else if (ModuleHelper.IsBuffer(dest))
  846. {
  847. int y = 0;
  848. for (int i = 0; i < 25; i++)
  849. {
  850. if (y > 5)
  851. break;
  852. if (WaferManager.Instance.CheckNoWafer(dest, y))
  853. {
  854. if (WaferManager.Instance.CheckHasWafer(source, i))
  855. {
  856. Move move = new Move();
  857. move.SourceStaion = (int)source;
  858. move.SourceSlot = i;
  859. move.DestStaion = (int)dest;
  860. move.DestSlot = y;
  861. move.option = option;
  862. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  863. moves.Add(move);
  864. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  865. ((ModuleName)move.SourceStaion).ToString(),
  866. move.SourceSlot,
  867. ((ModuleName)move.DestStaion).ToString(),
  868. move.DestSlot));
  869. y++;
  870. }
  871. }
  872. else
  873. {
  874. y++;
  875. i--;
  876. }
  877. }
  878. }
  879. }
  880. else
  881. {
  882. SCConfigItem _scEnable;
  883. if (SC.ContainsItem("LoadPort.EnableSlot1OnLP2"))
  884. {
  885. _scEnable = SC.GetConfigItem("LoadPort.EnableSlot1OnLP2");
  886. }
  887. else
  888. {
  889. _scEnable = null;
  890. }
  891. if (source == ModuleName.LP2)
  892. {
  893. Move moveLast = new Move();
  894. bool isContinue = false;
  895. for (int i = 0; i < 25; i++)
  896. {
  897. if (isContinue && !WaferManager.Instance.CheckHasWafer(source, i))
  898. isContinue = false;
  899. if (!WaferManager.Instance.CheckHasWafer(source, i) || !WaferManager.Instance.CheckNoWafer(dest, i))
  900. continue;
  901. if (_scEnable == null)
  902. {
  903. if (!(moveLast.SourceStaion == (int)source && moveLast.SourceSlot == i - 1 && moves.Contains(moveLast))
  904. && (i > 0 && !WaferManager.Instance.CheckNoWafer(source, i - 1)))
  905. {
  906. isContinue = true;
  907. continue;
  908. }
  909. }
  910. else
  911. {
  912. if (!_scEnable.BoolValue && i == 0)
  913. {
  914. isContinue = true;
  915. continue;
  916. }
  917. if (!(moveLast.SourceStaion == (int)source && moveLast.SourceSlot == i - 1 && moves.Contains(moveLast))
  918. && (i > 0 && !WaferManager.Instance.CheckNoWafer(source, i - 1)))
  919. {
  920. isContinue = true;
  921. continue;
  922. }
  923. }
  924. if (isContinue)
  925. continue;
  926. Move move = new Move();
  927. move.SourceStaion = (int)source;
  928. move.SourceSlot = i;
  929. move.DestStaion = (int)dest;
  930. move.DestSlot = i;
  931. move.option = option;
  932. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  933. moves.Add(move);
  934. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  935. ((ModuleName)move.SourceStaion).ToString(),
  936. move.SourceSlot,
  937. ((ModuleName)move.DestStaion).ToString(),
  938. move.DestSlot));
  939. moveLast = move;
  940. }
  941. }
  942. else
  943. {
  944. for (int i = 24; i >= 0; i--)
  945. {
  946. if (!(WaferManager.Instance.CheckHasWafer(source, i) && WaferManager.Instance.CheckNoWafer(dest, i)) ||
  947. (_scEnable != null && !_scEnable.BoolValue && i == 0) ||
  948. (i > 0 && WaferManager.Instance.CheckHasWafer(dest, i - 1)))
  949. continue;
  950. Move move = new Move();
  951. move.SourceStaion = (int)source;
  952. move.SourceSlot = i;
  953. move.DestStaion = (int)dest;
  954. move.DestSlot = i;
  955. move.option = option;
  956. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  957. moves.Add(move);
  958. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  959. ((ModuleName)move.SourceStaion).ToString(),
  960. move.SourceSlot,
  961. ((ModuleName)move.DestStaion).ToString(),
  962. move.DestSlot));
  963. }
  964. }
  965. }
  966. return true;
  967. }
  968. private bool PassThroughCycle(ModuleName source, ModuleName dest, MoveOption passThrough, ref List<Move> moves)
  969. {
  970. int option = 0;
  971. if (SC.ContainsItem("Process.CycleEnableAlign"))
  972. if (SC.GetValue<bool>("Process.CycleEnableAlign"))
  973. {
  974. option |= (int)MoveOption.Align;
  975. }
  976. if (SC.ContainsItem("Process.CycleEnableLaserMarker1"))
  977. if (SC.GetValue<bool>("Process.CycleEnableLaserMarker1"))
  978. {
  979. option |= (int)MoveOption.ReadID;
  980. }
  981. if (SC.ContainsItem("Process.CycleEnableLaserMarker2"))
  982. if (SC.GetValue<bool>("Process.CycleEnableLaserMarker2"))
  983. {
  984. option |= (int)MoveOption.ReadID2;
  985. }
  986. if (SC.ContainsItem("OcrReader.DefaultReader"))
  987. option |= (int)(SC.GetValue<int>("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2);
  988. SCConfigItem _scLP2Pitch;
  989. if (SC.ContainsItem("OcrReader.DefaultReader"))
  990. {
  991. _scLP2Pitch = SC.GetConfigItem("LoadPort.LoadPort2Pitch");
  992. }
  993. else
  994. {
  995. _scLP2Pitch = null;
  996. }
  997. if (_scLP2Pitch == null || _scLP2Pitch.IntValue == 10)
  998. {
  999. if (ModuleHelper.IsLoadPort(source) && ModuleHelper.IsLoadPort(dest))
  1000. {
  1001. for (int i = 0; i < 25; i++)
  1002. {
  1003. if ((WaferManager.Instance.CheckHasWafer(source, i)) && (WaferManager.Instance.CheckNoWafer(dest, i)))
  1004. {
  1005. ModuleName? midStation = null;
  1006. if ((passThrough & MoveOption.LoadLock1) == MoveOption.LoadLock1)
  1007. {
  1008. midStation = ModuleName.LL1;
  1009. Move move = new Move();
  1010. move.SourceStaion = (int)source;
  1011. move.SourceSlot = i;
  1012. move.DestStaion = (int)midStation;
  1013. move.DestSlot = 0;
  1014. move.option = option;
  1015. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1016. moves.Add(move);
  1017. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1018. ((ModuleName)move.SourceStaion).ToString(),
  1019. move.SourceSlot,
  1020. ((ModuleName)move.DestStaion).ToString(),
  1021. move.DestSlot));
  1022. }
  1023. if ((passThrough & MoveOption.LoadLock2) == MoveOption.LoadLock2)
  1024. {
  1025. if (midStation != null)
  1026. {
  1027. Move move = new Move();
  1028. move.SourceStaion = (int)midStation;
  1029. move.SourceSlot = 0;
  1030. midStation = ModuleName.LL2;
  1031. move.DestStaion = (int)midStation;
  1032. move.DestSlot = 0;
  1033. move.option = option;
  1034. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1035. moves.Add(move);
  1036. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1037. ((ModuleName)move.SourceStaion).ToString(),
  1038. move.SourceSlot,
  1039. ((ModuleName)move.DestStaion).ToString(),
  1040. move.DestSlot));
  1041. }
  1042. else
  1043. {
  1044. Move move = new Move();
  1045. midStation = ModuleName.LL2;
  1046. move.SourceStaion = (int)source;
  1047. move.SourceSlot = i;
  1048. move.DestStaion = (int)midStation;
  1049. move.DestSlot = 0;
  1050. move.option = option;
  1051. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1052. moves.Add(move);
  1053. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1054. ((ModuleName)move.SourceStaion).ToString(),
  1055. move.SourceSlot,
  1056. ((ModuleName)move.DestStaion).ToString(),
  1057. move.DestSlot));
  1058. }
  1059. }
  1060. if ((passThrough & MoveOption.LoadLock3) == MoveOption.LoadLock3)
  1061. {
  1062. if (midStation != null)
  1063. {
  1064. Move move = new Move();
  1065. move.SourceStaion = (int)midStation;
  1066. move.SourceSlot = 0;
  1067. midStation = ModuleName.LL3;
  1068. move.DestStaion = (int)midStation;
  1069. move.DestSlot = 0;
  1070. move.option = option;
  1071. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1072. moves.Add(move);
  1073. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1074. ((ModuleName)move.SourceStaion).ToString(),
  1075. move.SourceSlot,
  1076. ((ModuleName)move.DestStaion).ToString(),
  1077. move.DestSlot));
  1078. }
  1079. else
  1080. {
  1081. Move move = new Move();
  1082. midStation = ModuleName.LL3;
  1083. move.SourceStaion = (int)source;
  1084. move.SourceSlot = i;
  1085. move.DestStaion = (int)midStation;
  1086. move.DestSlot = 0;
  1087. move.option = option;
  1088. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1089. moves.Add(move);
  1090. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1091. ((ModuleName)move.SourceStaion).ToString(),
  1092. move.SourceSlot,
  1093. ((ModuleName)move.DestStaion).ToString(),
  1094. move.DestSlot));
  1095. }
  1096. }
  1097. if ((passThrough & MoveOption.LoadLock4) == MoveOption.LoadLock4)
  1098. {
  1099. if (midStation != null)
  1100. {
  1101. Move move = new Move();
  1102. move.SourceStaion = (int)midStation;
  1103. move.SourceSlot = 0;
  1104. midStation = ModuleName.LL4;
  1105. move.DestStaion = (int)midStation;
  1106. move.DestSlot = 0;
  1107. move.option = option;
  1108. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1109. moves.Add(move);
  1110. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1111. ((ModuleName)move.SourceStaion).ToString(),
  1112. move.SourceSlot,
  1113. ((ModuleName)move.DestStaion).ToString(),
  1114. move.DestSlot));
  1115. }
  1116. else
  1117. {
  1118. Move move = new Move();
  1119. midStation = ModuleName.LL4;
  1120. move.SourceStaion = (int)source;
  1121. move.SourceSlot = i;
  1122. move.DestStaion = (int)midStation;
  1123. move.DestSlot = 0;
  1124. move.option = option;
  1125. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1126. moves.Add(move);
  1127. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1128. ((ModuleName)move.SourceStaion).ToString(),
  1129. move.SourceSlot,
  1130. ((ModuleName)move.DestStaion).ToString(),
  1131. move.DestSlot));
  1132. }
  1133. }
  1134. if ((passThrough & MoveOption.LoadLock5) == MoveOption.LoadLock5)
  1135. {
  1136. if (midStation != null)
  1137. {
  1138. Move move = new Move();
  1139. move.SourceStaion = (int)midStation;
  1140. move.SourceSlot = 0;
  1141. midStation = ModuleName.LL5;
  1142. move.DestStaion = (int)midStation;
  1143. move.DestSlot = 0;
  1144. move.option = option;
  1145. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1146. moves.Add(move);
  1147. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1148. ((ModuleName)move.SourceStaion).ToString(),
  1149. move.SourceSlot,
  1150. ((ModuleName)move.DestStaion).ToString(),
  1151. move.DestSlot));
  1152. }
  1153. else
  1154. {
  1155. Move move = new Move();
  1156. midStation = ModuleName.LL5;
  1157. move.SourceStaion = (int)source;
  1158. move.SourceSlot = i;
  1159. move.DestStaion = (int)midStation;
  1160. move.DestSlot = 0;
  1161. move.option = option;
  1162. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1163. moves.Add(move);
  1164. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1165. ((ModuleName)move.SourceStaion).ToString(),
  1166. move.SourceSlot,
  1167. ((ModuleName)move.DestStaion).ToString(),
  1168. move.DestSlot));
  1169. }
  1170. }
  1171. if ((passThrough & MoveOption.LoadLock6) == MoveOption.LoadLock6)
  1172. {
  1173. if (midStation != null)
  1174. {
  1175. Move move = new Move();
  1176. move.SourceStaion = (int)midStation;
  1177. move.SourceSlot = 0;
  1178. midStation = ModuleName.LL6;
  1179. move.DestStaion = (int)midStation;
  1180. move.DestSlot = 0;
  1181. move.option = option;
  1182. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1183. moves.Add(move);
  1184. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1185. ((ModuleName)move.SourceStaion).ToString(),
  1186. move.SourceSlot,
  1187. ((ModuleName)move.DestStaion).ToString(),
  1188. move.DestSlot));
  1189. }
  1190. else
  1191. {
  1192. Move move = new Move();
  1193. midStation = ModuleName.LL6;
  1194. move.SourceStaion = (int)source;
  1195. move.SourceSlot = i;
  1196. move.DestStaion = (int)midStation;
  1197. move.DestSlot = 0;
  1198. move.option = option;
  1199. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1200. moves.Add(move);
  1201. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1202. ((ModuleName)move.SourceStaion).ToString(),
  1203. move.SourceSlot,
  1204. ((ModuleName)move.DestStaion).ToString(),
  1205. move.DestSlot));
  1206. }
  1207. }
  1208. if ((passThrough & MoveOption.LoadLock7) == MoveOption.LoadLock7)
  1209. {
  1210. if (midStation != null)
  1211. {
  1212. Move move = new Move();
  1213. move.SourceStaion = (int)midStation;
  1214. move.SourceSlot = 0;
  1215. midStation = ModuleName.LL7;
  1216. move.DestStaion = (int)midStation;
  1217. move.DestSlot = 0;
  1218. move.option = option;
  1219. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1220. moves.Add(move);
  1221. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1222. ((ModuleName)move.SourceStaion).ToString(),
  1223. move.SourceSlot,
  1224. ((ModuleName)move.DestStaion).ToString(),
  1225. move.DestSlot));
  1226. }
  1227. else
  1228. {
  1229. Move move = new Move();
  1230. midStation = ModuleName.LL7;
  1231. move.SourceStaion = (int)source;
  1232. move.SourceSlot = i;
  1233. move.DestStaion = (int)midStation;
  1234. move.DestSlot = 0;
  1235. move.option = option;
  1236. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1237. moves.Add(move);
  1238. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1239. ((ModuleName)move.SourceStaion).ToString(),
  1240. move.SourceSlot,
  1241. ((ModuleName)move.DestStaion).ToString(),
  1242. move.DestSlot));
  1243. }
  1244. }
  1245. if ((passThrough & MoveOption.LoadLock8) == MoveOption.LoadLock8)
  1246. {
  1247. if (midStation != null)
  1248. {
  1249. Move move = new Move();
  1250. move.SourceStaion = (int)midStation;
  1251. move.SourceSlot = 0;
  1252. midStation = ModuleName.LL8;
  1253. move.DestStaion = (int)midStation;
  1254. move.DestSlot = 0;
  1255. move.option = option;
  1256. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1257. moves.Add(move);
  1258. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1259. ((ModuleName)move.SourceStaion).ToString(),
  1260. move.SourceSlot,
  1261. ((ModuleName)move.DestStaion).ToString(),
  1262. move.DestSlot));
  1263. }
  1264. else
  1265. {
  1266. Move move = new Move();
  1267. midStation = ModuleName.LL8;
  1268. move.SourceStaion = (int)source;
  1269. move.SourceSlot = i;
  1270. move.DestStaion = (int)midStation;
  1271. move.DestSlot = 0;
  1272. move.option = option;
  1273. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1274. moves.Add(move);
  1275. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1276. ((ModuleName)move.SourceStaion).ToString(),
  1277. move.SourceSlot,
  1278. ((ModuleName)move.DestStaion).ToString(),
  1279. move.DestSlot));
  1280. }
  1281. }
  1282. if ((passThrough & MoveOption.Buffer) == MoveOption.Buffer)
  1283. {
  1284. if (midStation != null)
  1285. {
  1286. Move move = new Move();
  1287. move.SourceStaion = (int)midStation;
  1288. move.SourceSlot = 0;
  1289. midStation = ModuleName.Buffer;
  1290. move.DestStaion = (int)midStation;
  1291. move.DestSlot = 0;
  1292. move.option = option;
  1293. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1294. moves.Add(move);
  1295. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1296. ((ModuleName)move.SourceStaion).ToString(),
  1297. move.SourceSlot,
  1298. ((ModuleName)move.DestStaion).ToString(),
  1299. move.DestSlot));
  1300. }
  1301. else
  1302. {
  1303. Move move = new Move();
  1304. midStation = ModuleName.Buffer;
  1305. move.SourceStaion = (int)source;
  1306. move.SourceSlot = i;
  1307. move.DestStaion = (int)midStation;
  1308. move.DestSlot = 0;
  1309. move.option = option;
  1310. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1311. moves.Add(move);
  1312. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1313. ((ModuleName)move.SourceStaion).ToString(),
  1314. move.SourceSlot,
  1315. ((ModuleName)move.DestStaion).ToString(),
  1316. move.DestSlot));
  1317. }
  1318. }
  1319. if ((passThrough & MoveOption.CoolingBuffer1) == MoveOption.CoolingBuffer1)
  1320. {
  1321. if (midStation != null)
  1322. {
  1323. Move move = new Move();
  1324. move.SourceStaion = (int)midStation;
  1325. move.SourceSlot = 0;
  1326. midStation = ModuleName.CoolingBuffer1;
  1327. move.DestStaion = (int)midStation;
  1328. move.DestSlot = 0;
  1329. move.option = option;
  1330. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1331. moves.Add(move);
  1332. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1333. ((ModuleName)move.SourceStaion).ToString(),
  1334. move.SourceSlot,
  1335. ((ModuleName)move.DestStaion).ToString(),
  1336. move.DestSlot));
  1337. }
  1338. else
  1339. {
  1340. Move move = new Move();
  1341. midStation = ModuleName.CoolingBuffer1;
  1342. move.SourceStaion = (int)source;
  1343. move.SourceSlot = i;
  1344. move.DestStaion = (int)midStation;
  1345. move.DestSlot = 0;
  1346. move.option = option;
  1347. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1348. moves.Add(move);
  1349. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1350. ((ModuleName)move.SourceStaion).ToString(),
  1351. move.SourceSlot,
  1352. ((ModuleName)move.DestStaion).ToString(),
  1353. move.DestSlot));
  1354. }
  1355. }
  1356. if ((passThrough & MoveOption.CoolingBuffer2) == MoveOption.CoolingBuffer2)
  1357. {
  1358. if (midStation != null)
  1359. {
  1360. Move move = new Move();
  1361. move.SourceStaion = (int)midStation;
  1362. move.SourceSlot = 0;
  1363. midStation = ModuleName.CoolingBuffer2;
  1364. move.DestStaion = (int)midStation;
  1365. move.DestSlot = 0;
  1366. move.option = option;
  1367. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1368. moves.Add(move);
  1369. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1370. ((ModuleName)move.SourceStaion).ToString(),
  1371. move.SourceSlot,
  1372. ((ModuleName)move.DestStaion).ToString(),
  1373. move.DestSlot));
  1374. }
  1375. else
  1376. {
  1377. Move move = new Move();
  1378. midStation = ModuleName.CoolingBuffer2;
  1379. move.SourceStaion = (int)source;
  1380. move.SourceSlot = i;
  1381. move.DestStaion = (int)midStation;
  1382. move.DestSlot = 0;
  1383. move.option = option;
  1384. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1385. moves.Add(move);
  1386. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1387. ((ModuleName)move.SourceStaion).ToString(),
  1388. move.SourceSlot,
  1389. ((ModuleName)move.DestStaion).ToString(),
  1390. move.DestSlot));
  1391. }
  1392. }
  1393. if ((passThrough & MoveOption.Aligner1) == MoveOption.Aligner1)
  1394. {
  1395. if (midStation != null)
  1396. {
  1397. Move move = new Move();
  1398. move.SourceStaion = (int)midStation;
  1399. move.SourceSlot = 0;
  1400. midStation = ModuleName.Aligner1;
  1401. move.DestStaion = (int)midStation;
  1402. move.DestSlot = 0;
  1403. move.option = option;
  1404. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1405. moves.Add(move);
  1406. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1407. ((ModuleName)move.SourceStaion).ToString(),
  1408. move.SourceSlot,
  1409. ((ModuleName)move.DestStaion).ToString(),
  1410. move.DestSlot));
  1411. }
  1412. else
  1413. {
  1414. Move move = new Move();
  1415. midStation = ModuleName.Aligner1;
  1416. move.SourceStaion = (int)source;
  1417. move.SourceSlot = i;
  1418. move.DestStaion = (int)midStation;
  1419. move.DestSlot = 0;
  1420. move.option = option;
  1421. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1422. moves.Add(move);
  1423. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1424. ((ModuleName)move.SourceStaion).ToString(),
  1425. move.SourceSlot,
  1426. ((ModuleName)move.DestStaion).ToString(),
  1427. move.DestSlot));
  1428. }
  1429. }
  1430. if ((passThrough & MoveOption.Aligner2) == MoveOption.Aligner2)
  1431. {
  1432. if (midStation != null)
  1433. {
  1434. Move move = new Move();
  1435. move.SourceStaion = (int)midStation;
  1436. move.SourceSlot = 0;
  1437. midStation = ModuleName.Aligner2;
  1438. move.DestStaion = (int)midStation;
  1439. move.DestSlot = 0;
  1440. move.option = option;
  1441. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1442. moves.Add(move);
  1443. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1444. ((ModuleName)move.SourceStaion).ToString(),
  1445. move.SourceSlot,
  1446. ((ModuleName)move.DestStaion).ToString(),
  1447. move.DestSlot));
  1448. }
  1449. else
  1450. {
  1451. Move move = new Move();
  1452. midStation = ModuleName.Aligner2;
  1453. move.SourceStaion = (int)source;
  1454. move.SourceSlot = i;
  1455. move.DestStaion = (int)midStation;
  1456. move.DestSlot = 0;
  1457. move.option = option;
  1458. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1459. moves.Add(move);
  1460. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1461. ((ModuleName)move.SourceStaion).ToString(),
  1462. move.SourceSlot,
  1463. ((ModuleName)move.DestStaion).ToString(),
  1464. move.DestSlot));
  1465. }
  1466. }
  1467. if (midStation == null || midStation == dest)
  1468. {
  1469. Move move = new Move();
  1470. move.SourceStaion = (int)source;
  1471. move.SourceSlot = i;
  1472. move.DestStaion = (int)dest;
  1473. move.DestSlot = i;
  1474. move.option = option;
  1475. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1476. moves.Add(move);
  1477. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1478. ((ModuleName)move.SourceStaion).ToString(),
  1479. move.SourceSlot,
  1480. ((ModuleName)move.DestStaion).ToString(),
  1481. move.DestSlot));
  1482. }
  1483. else
  1484. {
  1485. Move move = new Move();
  1486. move.SourceStaion = (int)midStation;
  1487. move.SourceSlot = 0;
  1488. move.DestStaion = (int)dest;
  1489. move.DestSlot = i;
  1490. move.option = option;
  1491. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1492. moves.Add(move);
  1493. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1494. ((ModuleName)move.SourceStaion).ToString(),
  1495. move.SourceSlot,
  1496. ((ModuleName)move.DestStaion).ToString(),
  1497. move.DestSlot));
  1498. }
  1499. }
  1500. }
  1501. }
  1502. else if (ModuleHelper.IsBuffer(source))
  1503. {
  1504. int y = 0;
  1505. for (int i = 0; i < 25; i++)
  1506. {
  1507. if (y > 5)
  1508. break;
  1509. if (WaferManager.Instance.CheckHasWafer(source, y))
  1510. {
  1511. if (WaferManager.Instance.CheckNoWafer(dest, i))
  1512. {
  1513. Move move = new Move();
  1514. move.SourceStaion = (int)source;
  1515. move.SourceSlot = y;
  1516. move.DestStaion = (int)dest;
  1517. move.DestSlot = i;
  1518. move.option = option;
  1519. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1520. moves.Add(move);
  1521. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1522. ((ModuleName)move.SourceStaion).ToString(),
  1523. move.SourceSlot,
  1524. ((ModuleName)move.DestStaion).ToString(),
  1525. move.DestSlot));
  1526. y++;
  1527. }
  1528. }
  1529. else
  1530. {
  1531. y++;
  1532. i--;
  1533. }
  1534. }
  1535. }
  1536. else if (ModuleHelper.IsBuffer(dest))
  1537. {
  1538. int y = 0;
  1539. for (int i = 0; i < 25; i++)
  1540. {
  1541. if (y > 5)
  1542. break;
  1543. if (WaferManager.Instance.CheckNoWafer(dest, y))
  1544. {
  1545. if (WaferManager.Instance.CheckHasWafer(source, i))
  1546. {
  1547. Move move = new Move();
  1548. move.SourceStaion = (int)source;
  1549. move.SourceSlot = i;
  1550. move.DestStaion = (int)dest;
  1551. move.DestSlot = y;
  1552. move.option = option;
  1553. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1554. moves.Add(move);
  1555. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1556. ((ModuleName)move.SourceStaion).ToString(),
  1557. move.SourceSlot,
  1558. ((ModuleName)move.DestStaion).ToString(),
  1559. move.DestSlot));
  1560. y++;
  1561. }
  1562. }
  1563. else
  1564. {
  1565. y++;
  1566. i--;
  1567. }
  1568. }
  1569. }
  1570. }
  1571. else
  1572. {
  1573. SCConfigItem _scEnable;
  1574. if (SC.ContainsItem("LoadPort.EnableSlot1OnLP2"))
  1575. {
  1576. _scEnable = SC.GetConfigItem("LoadPort.EnableSlot1OnLP2");
  1577. }
  1578. else
  1579. {
  1580. _scEnable = null;
  1581. }
  1582. if (source == ModuleName.LP2)
  1583. {
  1584. bool isContinue = false;
  1585. for (int i = 0; i < 25; i++)
  1586. {
  1587. if (isContinue && !WaferManager.Instance.CheckHasWafer(source, i))
  1588. isContinue = false;
  1589. if (!WaferManager.Instance.CheckHasWafer(source, i) || !WaferManager.Instance.CheckNoWafer(dest, i))
  1590. continue;
  1591. if (_scEnable == null)
  1592. {
  1593. if ((i > 0 && !WaferManager.Instance.CheckNoWafer(dest, i - 1)))
  1594. {
  1595. isContinue = true;
  1596. continue;
  1597. }
  1598. }
  1599. else
  1600. {
  1601. if (!_scEnable.BoolValue && i == 0 || (i > 0 && !WaferManager.Instance.CheckNoWafer(dest, i - 1)))
  1602. {
  1603. isContinue = true;
  1604. continue;
  1605. }
  1606. }
  1607. if (isContinue)
  1608. continue;
  1609. Move move = new Move();
  1610. move.SourceStaion = (int)source;
  1611. move.SourceSlot = i;
  1612. move.DestStaion = (int)dest;
  1613. move.DestSlot = i;
  1614. move.option = option;
  1615. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1616. moves.Add(move);
  1617. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1618. ((ModuleName)move.SourceStaion).ToString(),
  1619. move.SourceSlot,
  1620. ((ModuleName)move.DestStaion).ToString(),
  1621. move.DestSlot));
  1622. }
  1623. }
  1624. else
  1625. {
  1626. for (int i = 24; i >= 0; i--)
  1627. {
  1628. if (!(WaferManager.Instance.CheckHasWafer(source, i) && WaferManager.Instance.CheckNoWafer(dest, i)) ||
  1629. (_scEnable != null && !_scEnable.BoolValue && i == 0) ||
  1630. (i > 0 && WaferManager.Instance.CheckHasWafer(dest, i - 1)))
  1631. continue;
  1632. Move move = new Move();
  1633. move.SourceStaion = (int)source;
  1634. move.SourceSlot = i;
  1635. move.DestStaion = (int)dest;
  1636. move.DestSlot = i;
  1637. move.option = option;
  1638. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1639. moves.Add(move);
  1640. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1641. ((ModuleName)move.SourceStaion).ToString(),
  1642. move.SourceSlot,
  1643. ((ModuleName)move.DestStaion).ToString(),
  1644. move.DestSlot));
  1645. }
  1646. }
  1647. }
  1648. return true;
  1649. }
  1650. public bool CheckResult()
  1651. {
  1652. bool ret = true;
  1653. foreach (Move move in checks)
  1654. {
  1655. string waferID = WaferManager.Instance.GetWaferID((ModuleName)move.DestStaion, move.DestSlot);
  1656. if (waferID == move.WaferID)
  1657. {
  1658. LOG.Info(string.Format("Transfer Task Ok. {0}:{1} ---> {2}:{3}.",
  1659. ((ModuleName)move.SourceStaion).ToString(),
  1660. move.SourceSlot,
  1661. ((ModuleName)move.DestStaion).ToString(),
  1662. move.DestSlot));
  1663. }
  1664. else
  1665. {
  1666. LOG.Info(string.Format("Transfer Task Failed. {0}:{1} ---> {2}:{3}.",
  1667. ((ModuleName)move.SourceStaion).ToString(),
  1668. move.SourceSlot,
  1669. ((ModuleName)move.DestStaion).ToString(),
  1670. move.DestSlot));
  1671. ret = false;
  1672. }
  1673. }
  1674. return ret;
  1675. }
  1676. public bool LoadSence(string file, ref List<Move> moves)
  1677. {
  1678. try
  1679. {
  1680. string line;
  1681. moves.Clear();
  1682. using (System.IO.StreamReader sr = new System.IO.StreamReader(file))
  1683. {
  1684. while ((line = sr.ReadLine()) != null)
  1685. {
  1686. string[] words = line.Split(',');
  1687. Move move = new Move();
  1688. move.SourceStaion = int.Parse(words[0]);
  1689. move.SourceSlot = int.Parse(words[1]);
  1690. move.DestStaion = int.Parse(words[2]);
  1691. move.DestSlot = int.Parse(words[3]);
  1692. move.option = int.Parse(words[4]);
  1693. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1694. moves.Add(move);
  1695. }
  1696. }
  1697. }
  1698. catch (Exception e)
  1699. {
  1700. LOG.Warning(String.Format("读取文件失败:{0},{1}", file, e.Message));
  1701. return false;
  1702. }
  1703. return true;
  1704. }
  1705. public bool Convert(TransferInfo[] Source, ref List<Move> dest)
  1706. {
  1707. dest.Clear();
  1708. bool bDupliacte = Source.GroupBy(x => x.WaferID).Any(g => g.Count() > 1);
  1709. if (bDupliacte)
  1710. {
  1711. EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultWarning, "Check transfer task failed:duplicated source");
  1712. return false;
  1713. }
  1714. bDupliacte = Source.GroupBy(x => new { x.Station, x.Slot }).Any(g => g.Count() > 1);
  1715. if (bDupliacte)
  1716. {
  1717. EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultWarning, "Check transfer task failed:duplicated destination");
  1718. return false;
  1719. }
  1720. foreach (var item in Source)
  1721. {
  1722. WaferInfo[] wafers = WaferManager.Instance.GetWafer(item.WaferID);
  1723. if (wafers.Length == 0)
  1724. {
  1725. EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultWarning, "Check transfer task failed:wafer id not exist");
  1726. return false;
  1727. }
  1728. if (wafers.Length > 1)
  1729. {
  1730. EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultWarning, "Check transfer task failed:wafer id duplicated in the system");
  1731. return false;
  1732. }
  1733. Move move = new Move();
  1734. move.WaferID = item.WaferID;
  1735. move.SourceStaion = wafers[0].Station;
  1736. move.SourceSlot = wafers[0].Slot;
  1737. move.DestStaion = (int)item.Station;
  1738. move.DestSlot = item.Slot;
  1739. move.option = (int)item.Option;
  1740. move.Angle = item.Angle;
  1741. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1742. move.VerifyAny = item.VerifyAny;
  1743. move.VerifyLaserMaker = item.VerifyLaserMaker;
  1744. move.LaserMaker = item.LaserMaker;
  1745. move.VerifyT7Code = item.VerifyT7Code;
  1746. move.T7Code = item.T7Code;
  1747. dest.Add(move);
  1748. }
  1749. return true;
  1750. }
  1751. private bool CheckMoves()
  1752. {
  1753. foreach (Move move in moves)
  1754. {
  1755. /*
  1756. move.swap = moves.Any(g => g.SourceStaion == move.DestStaion && g.SourceSlot == move.DestSlot);
  1757. if (WaferManager.Instance.CheckHasWafer((UnitName)move.DestStaion, move.DestSlot))
  1758. move.swap = true;
  1759. if ((move.DestStaion == move.SourceStaion) && (move.DestSlot == move.SourceSlot))
  1760. move.swap = false;
  1761. */
  1762. LOG.Info(string.Format("Transfer Task. {0}:{1} ---> {2}:{3}.",
  1763. ((ModuleName)move.SourceStaion).ToString(),
  1764. move.SourceSlot,
  1765. ((ModuleName)move.DestStaion).ToString(),
  1766. move.DestSlot));
  1767. if (!TaskLoadPort.Contains((ModuleName)move.SourceStaion))
  1768. TaskLoadPort.Add((ModuleName)move.SourceStaion);
  1769. if (!TaskLoadPort.Contains((ModuleName)move.DestStaion))
  1770. TaskLoadPort.Add((ModuleName)move.DestStaion);
  1771. }
  1772. return true;
  1773. }
  1774. private int GetRandomSeed()
  1775. {
  1776. byte[] bytes = new byte[4];
  1777. System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
  1778. rng.GetBytes(bytes);
  1779. return BitConverter.ToInt32(bytes, 0);
  1780. }
  1781. private int[] RandArray(int[] arr)
  1782. {
  1783. int[] newarr = new int[arr.Length];
  1784. Random rand = new Random();
  1785. List<int> list = new List<int>();
  1786. for (int j = 0; j < arr.Length; j++)
  1787. list.Add(arr[j]);
  1788. for (int i = arr.Length; i > 0; i--)
  1789. {
  1790. int c = rand.Next(0, i);
  1791. newarr[i - 1] = list[c];
  1792. list.Remove(list[c]);
  1793. }
  1794. return newarr;
  1795. }
  1796. //private void PostMsg(params object[] objs)
  1797. //{
  1798. // Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.MoveWafer, objs);
  1799. //}
  1800. //sorted
  1801. private bool LoadSortedSence(bool bLoadportA, ref List<Move> moves)
  1802. {
  1803. ModuleName chamber = ModuleName.LP1;
  1804. if (!bLoadportA)
  1805. chamber = ModuleName.LP2;
  1806. int[] source = new int[24];
  1807. for (int i = 0; i < source.Length; i++)
  1808. {
  1809. source[i] = i;
  1810. }
  1811. int[] dest = RandArray(source);
  1812. for (int i = 0; i < source.Length; i++)
  1813. {
  1814. if (WaferManager.Instance.CheckHasWafer(chamber, source[i]))
  1815. {
  1816. Move move = new Move();
  1817. move.SourceStaion = (int)chamber;
  1818. move.SourceSlot = source[i];
  1819. move.DestStaion = (int)chamber;
  1820. move.DestSlot = dest[i];
  1821. move.option = (int)MoveOption.Align;
  1822. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1823. moves.Add(move);
  1824. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1825. ((ModuleName)move.SourceStaion).ToString(),
  1826. move.SourceSlot,
  1827. ((ModuleName)move.DestStaion).ToString(),
  1828. move.DestSlot));
  1829. }
  1830. }
  1831. return true;
  1832. }
  1833. //sorted
  1834. private bool LoadOneToMultiSence(bool bLoadportA, ref List<Move> moves)
  1835. {
  1836. int[] source = new int[24];
  1837. for (int i = 0; i < source.Length; i++)
  1838. {
  1839. source[i] = i;
  1840. }
  1841. int[] dest = RandArray(source);
  1842. for (int i = 0; i < source.Length; i++)
  1843. {
  1844. ModuleName chamber;
  1845. if (bLoadportA)
  1846. chamber = ModuleName.LP1;
  1847. else
  1848. chamber = ModuleName.LP2;
  1849. if (WaferManager.Instance.CheckHasWafer(chamber, source[i]))
  1850. {
  1851. Move move = new Move();
  1852. move.SourceStaion = (int)chamber;
  1853. move.SourceSlot = source[i];
  1854. Random random = new Random(GetRandomSeed());
  1855. Thread.Sleep(100);
  1856. if (random.Next() % 2 == 0)
  1857. {
  1858. move.DestStaion = (int)ModuleName.LP1;
  1859. }
  1860. else
  1861. {
  1862. move.DestStaion = (int)ModuleName.LP2;
  1863. }
  1864. move.DestSlot = dest[i];
  1865. move.option = (int)MoveOption.Align;
  1866. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1867. moves.Add(move);
  1868. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1869. ((ModuleName)move.SourceStaion).ToString(),
  1870. move.SourceSlot,
  1871. ((ModuleName)move.DestStaion).ToString(),
  1872. move.DestSlot));
  1873. }
  1874. }
  1875. return true;
  1876. }
  1877. //sorted
  1878. private bool LoadMultiToOneSence(bool bLoadportA, ref List<Move> moves)
  1879. {
  1880. ModuleName source = ModuleName.LP2;
  1881. ModuleName dest = ModuleName.LP1;
  1882. if (bLoadportA)
  1883. {
  1884. source = ModuleName.LP1;
  1885. dest = ModuleName.LP2;
  1886. }
  1887. int k = 0;
  1888. for (int i = 0; i < 25; i++)
  1889. {
  1890. if (WaferManager.Instance.CheckHasWafer(source, i))
  1891. {
  1892. for (int j = k; j < 25; j++)
  1893. {
  1894. if (WaferManager.Instance.CheckNoWafer(dest, j))
  1895. {
  1896. Move move = new Move();
  1897. move.SourceStaion = (int)source;
  1898. move.SourceSlot = i;
  1899. move.DestStaion = (int)dest;
  1900. move.DestSlot = j;
  1901. move.option = (int)MoveOption.Align;
  1902. move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot);
  1903. moves.Add(move);
  1904. k = j + 1;
  1905. LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}",
  1906. ((ModuleName)move.SourceStaion).ToString(),
  1907. move.SourceSlot,
  1908. ((ModuleName)move.DestStaion).ToString(),
  1909. move.DestSlot));
  1910. break;
  1911. }
  1912. }
  1913. }
  1914. }
  1915. return true;
  1916. }
  1917. }
  1918. }