LoadPort.cs 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.Device.Unit;
  5. using Aitex.Core.RT.Event;
  6. using Aitex.Core.RT.OperationCenter;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.Util;
  9. using Aitex.Sorter.Common;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.CarrierIdReaders.CarrierIDReaderBase;
  13. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDK;
  14. using System;
  15. using System.Collections.Generic;
  16. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
  17. using static Aitex.Core.RT.Device.Unit.IOE84Passive;
  18. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts
  19. {
  20. public enum IndicatorType
  21. {
  22. Load,
  23. Unload,
  24. Presence,
  25. Placement,
  26. Alarm,
  27. AccessManual,
  28. AccessAuto,
  29. Status1,
  30. Status2,
  31. Manual,
  32. Auto,
  33. Reserve,
  34. Error,
  35. Access,
  36. Busy,
  37. Complete,
  38. }
  39. public enum E84PioPosition
  40. {
  41. Floor = 0,
  42. Middle = 1,
  43. Overhead = 2
  44. }
  45. public enum E84PioSignalAtoP
  46. {
  47. VALID = 1,
  48. CS_0 = 2,
  49. CS_1 = 3,
  50. TR_REQ = 4,
  51. BUSY = 5,
  52. COMPT = 6,
  53. CONT = 7,
  54. AM_AVBL = 8
  55. }
  56. public enum E84PioSignalPtoA
  57. {
  58. L_REQ = 11,
  59. U_REQ = 12,
  60. READY = 13,
  61. HO_AVBL = 14,
  62. ES = 15,
  63. VA = 16,
  64. VS_0 = 17,
  65. VS_1 = 18
  66. }
  67. public interface IE87CallBack
  68. {
  69. void CarrierArrive();
  70. void CarrerRemove(string carrierID);
  71. void CarrierIDReadSuccess(string carrierID);
  72. void CarrierIDReadFail();
  73. void MappingComplete(string carrierID, string slotmap);
  74. void LoadportError(string errorcode);
  75. void LoadComplete();
  76. void UnloadComplete();
  77. void OnLPHomed();
  78. void OnE84HandoffStart(bool isload);
  79. void OnE84HandoffComplete(bool isload);
  80. }
  81. public interface IE84CallBack
  82. {
  83. void SetHoAutoControl(bool value);
  84. void SetHoAvailable(bool value);
  85. void SetE84SignalState(E84PassiveSignal signal, bool value);
  86. bool GetE84SignalState(E84SignalID signal);
  87. void SetFoupStatus(bool foupon);
  88. void SetReadyTransferStatus(bool ready);
  89. void SetLightCurtainHandle(LightCurtainHandleEnum handle);
  90. E84State GetCurrentE84State();
  91. void SetLoadPortCallBack(LoadPortBaseDevice lp);
  92. void Stop();
  93. void Reset();
  94. void ResetE84();
  95. void Complete();
  96. event Action<string> OnE84HandOffStart;
  97. event Action<string> OnE84HandOffComplete;
  98. event Action<E84Timeout, string> OnE84HandOffTimeout;
  99. event Action<E84SignalID, bool> OnE84ActiveSignalChange;
  100. event Action<E84SignalID, bool> OnE84PassiveSignalChange;
  101. }
  102. public abstract class LoadPort : BaseDevice, ILoadPort
  103. {
  104. public event Action<bool> ActionDone;
  105. public IndicatorState IndicatiorLoad { get; set; }
  106. public IndicatorState IndicatiorUnload { get; set; }
  107. public IndicatorState IndicatiorPresence { get; set; }
  108. public IndicatorState IndicatorAlarm { get; set; }
  109. public IndicatorState IndicatiorPlacement { get; set; }
  110. public IndicatorState IndicatiorOpAccess { get; set; }
  111. public IndicatorState IndicatiorAccessAuto { get; set; }
  112. public IndicatorState IndicatiorAccessManual { get; set; }
  113. public IndicatorState IndicatiorStatus1 { get; set; }
  114. public IndicatorState IndicatiorStatus2 { get; set; }
  115. public IndicatorState IndicatiorManualMode { get; set; }
  116. public IndicatorState IndicatiorClampUnclamp { get; set; }
  117. public IndicatorState IndicatiorDockUndock { get; set; }
  118. public static Dictionary<IndicatorType, Indicator> LoadPortIndicatorLightMap =
  119. new Dictionary<IndicatorType, Indicator>()
  120. {
  121. {IndicatorType.Load, Indicator.LOAD},
  122. {IndicatorType.Unload, Indicator.UNLOAD},
  123. {IndicatorType.AccessAuto, Indicator.ACCESSAUTO },
  124. {IndicatorType.AccessManual, Indicator.ACCESSMANUL},
  125. {IndicatorType.Alarm, Indicator.ALARM},
  126. {IndicatorType.Presence, Indicator.PRESENCE},
  127. {IndicatorType.Placement, Indicator.PLACEMENT},
  128. {IndicatorType.Status1, Indicator.RESERVE1},
  129. {IndicatorType.Status2, Indicator.RESERVE2},
  130. };
  131. public IndicatorState[] IndicatorStateFeedback { get; set; }
  132. public virtual FoupClampState ClampState { get; set; }
  133. public virtual FoupDockState DockState { get; set; }
  134. public virtual FoupDoorState DoorState { get; set; }
  135. public virtual CasstleType CasstleType { get; set; }
  136. public string SlotMap
  137. {
  138. get { return GetSlotMap(); }
  139. }
  140. //Hirata
  141. public int WaferCount { get; set; }
  142. public virtual bool IsBusy { get; set; }
  143. public virtual bool IsIdle { get; set; }
  144. public virtual bool IsMoving { get; set; }
  145. public virtual bool IsInfoPadAOn { get; set; }
  146. public virtual bool IsInfoPadBOn { get; set; }
  147. public virtual bool IsInfoPadCOn { get; set; }
  148. public virtual bool IsInfoPadDOn { get; set; }
  149. public virtual bool IsWaferProtrude { get; set; }
  150. public virtual bool IsMonitorProtrude { get; set; } = false;
  151. public virtual string InfoPadCarrierType { get; set; } = "";
  152. public virtual string InfoPadCarrierTypeInformation
  153. {
  154. get
  155. {
  156. if (_isPresent)
  157. return ("Index:" + InfoPadCarrierIndex.ToString() + "\r\n"
  158. + "Type:" + InfoPadCarrierType + "\r\n"
  159. + "Size:" + GetCurrentWaferSize().ToString());
  160. return "";
  161. }
  162. }
  163. public virtual int InfoPadCarrierIndex { get; set; } = -1;
  164. public virtual LoadportCassetteState CassetteState
  165. {
  166. get;
  167. set;
  168. }
  169. public WaferSize Size
  170. {
  171. get
  172. {
  173. IoWaferSizeDetector detector = DEVICE.GetDevice<IoWaferSizeDetector>($"{Name}WaferDetector");
  174. if (detector != null)
  175. return detector.Value;
  176. int carrierIndex = SC.ContainsItem($"CarrierInfo.{Name}CarrierIndex") ?
  177. SC.GetValue<int>($"CarrierInfo.{Name}CarrierIndex") : 0;
  178. WaferSize wsize = SC.ContainsItem($"CarrierInfo.CarrierWaferSize{carrierIndex}") ?
  179. (WaferSize)SC.GetValue<int>($"CarrierInfo.CarrierWaferSize{carrierIndex}") : WaferSize.WS12;
  180. return wsize;
  181. }
  182. }
  183. public virtual WaferSize GetCurrentWaferSize()
  184. {
  185. return Size;
  186. }
  187. public bool IsMapWaferByLoadPort { get; set; }
  188. public EnumLoadPortType PortType { get; set; }
  189. public bool Initalized { get; set; }
  190. public bool IsPresent
  191. {
  192. get { return _isPresent; }
  193. }
  194. public bool IsPlacement
  195. {
  196. get { return _isPlaced; }
  197. }
  198. public bool IsMapped
  199. {
  200. get { return _isMapped; }
  201. }
  202. public bool IsComplete { get; set; }
  203. public bool IsAccessSwPressed
  204. {
  205. get { return _isAccessSwPressed; }
  206. }
  207. public bool Error { get; set; }
  208. public string ErrorCode { get; set; }
  209. public bool MapError { get; set; }
  210. public bool ReadCarrierIDError { get; set; }
  211. public bool ExecuteError { get; set; } = false;
  212. /// <summary>
  213. /// 是否处于FOSB模式
  214. /// </summary>
  215. public bool IsFOSBMode { get; set; }
  216. public TDKY_AxisPos DockPOS { get; set; } = TDKY_AxisPos.Unknown;
  217. public TDKZ_AxisPos DoorPOS { get; set; } = TDKZ_AxisPos.Unknown;
  218. public DeviceState State
  219. {
  220. get
  221. {
  222. if (!Initalized)
  223. {
  224. return DeviceState.Unknown;
  225. }
  226. if (Error || ExecuteError || MapError || ReadCarrierIDError)
  227. {
  228. return DeviceState.Error;
  229. }
  230. if (IsBusy)
  231. return DeviceState.Busy;
  232. return DeviceState.Idle;
  233. }
  234. }
  235. public string CarrierId
  236. {
  237. get { return _carrierId; }
  238. }
  239. public string LPLotID
  240. {
  241. get { return _lplotID; }
  242. }
  243. public string RfId
  244. {
  245. get { return _rfid; }
  246. }
  247. public RD_TRIG PresentTrig
  248. {
  249. get { return _presentTrig; }
  250. }
  251. public RD_TRIG PlacedtTrig
  252. {
  253. get { return _placetTrig; }
  254. }
  255. public RD_TRIG AccessSwPressedTrig
  256. {
  257. get { return _accessSwPressedTrig; }
  258. }
  259. public RD_TRIG ClampedTrig
  260. {
  261. get { return _clampTrig; }
  262. }
  263. public RD_TRIG DockTrig
  264. {
  265. get { return _dockTrig; }
  266. }
  267. public RD_TRIG DoorTrig
  268. {
  269. get { return _doorTrig; }
  270. }
  271. protected bool _isPresent;
  272. protected bool _isPlaced;
  273. protected bool _isDocked;
  274. protected bool _isAccessSwPressed;
  275. protected string _carrierId = "";
  276. protected string _rfid;
  277. protected string _lplotID;
  278. protected bool _isMapped;
  279. private ModuleName _module;
  280. public ModuleName LPModuleName => _module;
  281. //private ModuleStateEnum _state;
  282. private readonly RD_TRIG _presentTrig = new RD_TRIG();
  283. private readonly RD_TRIG _placetTrig = new RD_TRIG();
  284. private readonly RD_TRIG _accessSwPressedTrig = new RD_TRIG();
  285. private readonly RD_TRIG _clampTrig = new RD_TRIG();
  286. private readonly RD_TRIG _dockTrig = new RD_TRIG();
  287. private readonly RD_TRIG _doorTrig = new RD_TRIG();
  288. public R_TRIG TrigWaferProtrude = new R_TRIG();
  289. private List<List<string>> _waferId = new List<List<string>>();
  290. private int _slotNumber;
  291. public string PortId
  292. {
  293. get; private set;
  294. }
  295. public string PortCategory
  296. {
  297. get
  298. {
  299. return (SC.ContainsItem($"LoadPort.LoadPort{PortId}CarrierLabel") ?
  300. SC.GetStringValue($"LoadPort.LoadPort{PortId}CarrierLabel") : "");
  301. }
  302. }
  303. ModuleName[] PortModuleNames = new[]
  304. {
  305. ModuleName.LP1,ModuleName.LP2,ModuleName.LP3,ModuleName.LP4,ModuleName.LP5,
  306. ModuleName.LP6,ModuleName.LP7,ModuleName.LP8,ModuleName.LP9,ModuleName.LP10,
  307. ModuleName.Cassette,
  308. ModuleName.CassAL, ModuleName.CassAR, ModuleName.CassBL, ModuleName.CassBR,
  309. };
  310. private string EventCarrierArrived = "CARRIER_ARRIVED";
  311. private string EventCarrierIdRead = "CARRIER_ID_READ";
  312. private string EventCarrierIdReadFailed = "CARRIER_ID_READ_FAILED";
  313. private string EventCarrierIdWrite = "CARRIER_ID_WRITE";
  314. private string EventCarrierIdWriteFailed = "CARRIER_ID_WRITE_FAILED";
  315. protected string EventSlotMapAvailable = "SLOT_MAP_AVAILABLE";
  316. private string EventCarrierRemoved = "CARRIER_REMOVED";
  317. private string EventCarrierUnloaded = "CARRIER_UNLOADED";
  318. public string EventCarrierLoaded = "CARRIER_LOADED";
  319. public string EventCarrierClamped = "CCLMP";
  320. public string EventCarrierUnClamped = "CUCLMP";
  321. private string EventLPHomed = "LP_HOMED";
  322. protected string PORT_ID = "PORT_ID";
  323. protected string CAR_ID = "CAR_ID";
  324. protected string SLOT_MAP = "SLOT_MAP";
  325. protected string PORT_CTGRY = "PORT_CTGRY";
  326. protected string RF_ID = "RF_ID";
  327. protected string PORT_CARRIER_TYPE = "PORT_CARRIER_TYPE";
  328. private string EventRfIdRead = "RF_ID_READ";
  329. private string EventRfIdReadFailed = "RF_ID_READ_FAILED";
  330. private string EventRfIdWrite = "RF_ID_WRITE";
  331. private string EventRfIdWriteFailed = "RF_ID_WRITE_FAILED";
  332. public string AlarmLoadPortError { get => _module + "Error"; }
  333. public string AlarmLoadPortMappingError { get => _module + "MappingError"; }
  334. public string AlarmCarrierIDReadError { get => _module + "CarrierIDReadFail"; }
  335. private IE87CallBack _lpcallback = null;
  336. public IE87CallBack LPCallBack
  337. {
  338. get { return _lpcallback; }
  339. set { _lpcallback = value; }
  340. }
  341. private IE84CallBack _lpE84Callback = null;
  342. public IE84CallBack LPE84Callback
  343. {
  344. get { return _lpE84Callback; }
  345. set { _lpE84Callback = value; }
  346. }
  347. private ICarrierIDReader _carrierIDReadercallback = null;
  348. public ICarrierIDReader CarrierIDReaderCallBack
  349. {
  350. get { return _carrierIDReadercallback; }
  351. set { _carrierIDReadercallback = value; }
  352. }
  353. public CIDReaderBaseDevice CurrentReader { get; }
  354. public LoadPort(int slotNumber = 25)
  355. {
  356. _slotNumber = slotNumber;
  357. }
  358. public LoadPort(string module, string name, int slotNumber = 25) : base(module, name, name, "")
  359. {
  360. _slotNumber = slotNumber;
  361. }
  362. public virtual bool IsAutoClampOnFoupOn
  363. {
  364. get
  365. {
  366. if (SC.ContainsItem($"LoadPort.LP{PortId}.AutoClampOnFoupOn"))
  367. return SC.GetValue<bool>($"LoadPort.LP{PortId}.AutoClampOnFoupOn");
  368. return false;
  369. }
  370. }
  371. public virtual LightCurtainHandleEnum CurrentLightCurtainHandle
  372. {
  373. get
  374. {
  375. if (SC.ContainsItem($"LoadPort.{LPModuleName}.LightCurtainHandle"))
  376. return (LightCurtainHandleEnum)SC.GetValue<int>($"LoadPort.{LPModuleName}.LightCurtainHandle");
  377. return LightCurtainHandleEnum.Bypass;
  378. }
  379. }
  380. public virtual bool Initialize()
  381. {
  382. for (int i = 0; i < 25; i++)
  383. {
  384. _waferId.Add(new List<string>()
  385. {
  386. i.ToString("D2"),"","",""
  387. });
  388. }
  389. if (!Enum.TryParse(Name, out ModuleName m))
  390. Enum.TryParse(Module, out m);
  391. _module = m;
  392. if ((int)_module >= 97)
  393. PortId = ((int)_module - 96).ToString();
  394. else
  395. PortId = ((int)_module).ToString();
  396. DoorState = FoupDoorState.Unknown;
  397. WaferManager.Instance.SubscribeLocation(_module, _slotNumber);
  398. CarrierManager.Instance.SubscribeLocation(_module.ToString());
  399. DATA.Subscribe(Name, "IsPresent", () => _isPresent);
  400. DATA.Subscribe(Name, "IsPlaced", () => _isPlaced);
  401. DATA.Subscribe(Name, "IsClamped", () => ClampState == FoupClampState.Close);
  402. DATA.Subscribe(Name, "IsDocked", () => DockState == FoupDockState.Docked);
  403. DATA.Subscribe(Name, "IsDoorOpen", () => DoorState == FoupDoorState.Open);
  404. DATA.Subscribe(Name, "ModuleState", () => "Idle");
  405. DATA.Subscribe(Name, "CarrierId", () => _carrierId);
  406. DATA.Subscribe(Name, "LPLotID", () => _lplotID);
  407. DATA.Subscribe(Name, "IsMapped", () => _isMapped);
  408. DATA.Subscribe($"{Name}.LoadportState", () => State);
  409. DATA.Subscribe($"{Name}.LoadportBusy", () => IsBusy);
  410. DATA.Subscribe($"{Name}.LoadportError", () => ErrorCode);
  411. DATA.Subscribe($"{Name}.CassetteState", () => CassetteState);
  412. DATA.Subscribe($"{Name}.FoupClampState", () => ClampState);
  413. DATA.Subscribe($"{Name}.FoupDockState", () => DockState);
  414. DATA.Subscribe($"{Name}.FoupDoorState", () => DoorState);
  415. DATA.Subscribe($"{Name}.SlotMap", () => SlotMap);
  416. DATA.Subscribe($"{Name}.IndicatiorLoad", () => IndicatiorLoad);
  417. DATA.Subscribe($"{Name}.IndicatiorUnload", () => IndicatiorUnload);
  418. DATA.Subscribe($"{Name}.IndicatiorPresence", () => IndicatiorPresence);
  419. DATA.Subscribe($"{Name}.IndicatiorPlacement", () => IndicatiorPlacement);
  420. DATA.Subscribe($"{Name}.IndicatiorAlarm", () => IndicatorAlarm);
  421. DATA.Subscribe($"{Name}.IndicatiorAccessAuto", () => IndicatiorAccessAuto);
  422. DATA.Subscribe($"{Name}.IndicatiorAccessManual", () => IndicatiorAccessManual);
  423. DATA.Subscribe($"{Name}.IndicatiorOpAccess", () => IndicatiorOpAccess);
  424. DATA.Subscribe($"{Name}.IndicatiorStatus1", () => IndicatiorStatus1);
  425. DATA.Subscribe($"{Name}.IndicatiorStatus2", () => IndicatiorStatus2);
  426. DATA.Subscribe($"{Name}.CasstleType", () => (int)CasstleType);
  427. DATA.Subscribe($"{Name}.InfoPadCarrierType", () => InfoPadCarrierType);
  428. DATA.Subscribe($"{Name}.InfoPadCarrierTypeInformation", () => InfoPadCarrierTypeInformation);
  429. DATA.Subscribe($"{Name}.InfoPadCarrierIndex", () => InfoPadCarrierIndex);
  430. DATA.Subscribe($"{Name}.IsError", () => State == DeviceState.Error);
  431. //if (PortStateVariableNames.Length > _lpIndex)
  432. // DATA.Subscribe(PortStateVariableNames[_lpIndex], () => (_isPlaced && _isPresent) ? "1" : "0");
  433. //if (PortSlotMapVariableNames.Length > _lpIndex)
  434. // DATA.Subscribe(PortSlotMapVariableNames[_lpIndex], () => SlotMap);
  435. //if (PortWaferIdVariableNames.Length > _lpIndex)
  436. // DATA.Subscribe(PortWaferIdVariableNames[_lpIndex], UpdatedWaferIdList);
  437. EV.Subscribe(new EventItem("Event", EventCarrierArrived, "Carrier arrived"));
  438. EV.Subscribe(new EventItem("Event", EventCarrierRemoved, "Carrier removed"));
  439. EV.Subscribe(new EventItem("Event", EventCarrierIdRead, "Carrier ID read"));
  440. EV.Subscribe(new EventItem("Event", EventCarrierIdReadFailed, "Carrier ID read failed"));
  441. EV.Subscribe(new EventItem("Event", EventCarrierIdWrite, "Carrier ID write"));
  442. EV.Subscribe(new EventItem("Event", EventCarrierIdWriteFailed, "Carrier ID write failed"));
  443. EV.Subscribe(new EventItem("Event", EventSlotMapAvailable, "Slot map available"));
  444. EV.Subscribe(new EventItem("Event", EventCarrierUnloaded, "Carrier unloaded"));
  445. EV.Subscribe(new EventItem("Event", EventCarrierLoaded, "Carrier loaded"));
  446. EV.Subscribe(new EventItem("Event", EventRfIdRead, "Carrier RFID read"));
  447. EV.Subscribe(new EventItem("Event", EventRfIdReadFailed, "Carrier RFID read failed"));
  448. EV.Subscribe(new EventItem("Event", EventRfIdWrite, "Carrier RFID write"));
  449. EV.Subscribe(new EventItem("Event", EventRfIdWriteFailed, "Carrier RFID write failed"));
  450. EV.Subscribe(new EventItem("Event", EventCarrierClamped, "Carrier was clamped."));
  451. EV.Subscribe(new EventItem("Event", EventCarrierUnClamped, "Carrier was unclamped."));
  452. EV.Subscribe(new EventItem("Event", AlarmLoadPortError, $"Load Port {Name}error", EventLevel.Alarm, EventType.EventUI_Notify));
  453. EV.Subscribe(new EventItem("Event", AlarmLoadPortMappingError, $"Load Port {Name} mapping error", EventLevel.Alarm, EventType.EventUI_Notify));
  454. EV.Subscribe(new EventItem("Event", AlarmCarrierIDReadError, $"Load Port {Name} read carrierID error", EventLevel.Alarm, EventType.EventUI_Notify));
  455. //}
  456. IsIdle = true;
  457. //_state = ModuleStateEnum.Idle;
  458. IndicatorStateFeedback = new IndicatorState[20];
  459. if (_lpE84Callback != null)
  460. {
  461. _lpE84Callback.OnE84ActiveSignalChange += _lpE84Callback_OnE84ActiveSignalChange;
  462. _lpE84Callback.OnE84PassiveSignalChange += _lpE84Callback_OnE84PassiveSignalChange;
  463. _lpE84Callback.OnE84HandOffComplete += _lpE84Callback_OnE84HandOffComplete;
  464. _lpE84Callback.OnE84HandOffStart += _lpE84Callback_OnE84HandOffStart;
  465. _lpE84Callback.OnE84HandOffTimeout += _lpE84Callback_OnE84HandOffTimeout;
  466. }
  467. RegisterOperation();
  468. return true;
  469. }
  470. private void _lpE84Callback_OnE84PassiveSignalChange(E84SignalID arg2, bool arg3)
  471. {
  472. ;
  473. }
  474. private void _lpE84Callback_OnE84HandOffTimeout(E84Timeout arg2, string arg3)
  475. {
  476. ;
  477. }
  478. private void _lpE84Callback_OnE84HandOffStart(string arg2)
  479. {
  480. OnE84HandOffStart(arg2 == "Load");
  481. }
  482. private void _lpE84Callback_OnE84HandOffComplete(string arg2)
  483. {
  484. OnE84HandOffComplete(arg2 == "Load");
  485. }
  486. private void _lpE84Callback_OnE84ActiveSignalChange(E84SignalID arg2, bool arg3)
  487. {
  488. ;
  489. }
  490. public virtual bool Connect()
  491. {
  492. return true;
  493. }
  494. public virtual bool IsAutoReadCarrierID
  495. {
  496. get
  497. {
  498. return SC.ContainsItem($"LoadPort.{_module}.EnableAutoCarrierIdRead") ?
  499. SC.GetValue<bool>($"LoadPort.{_module}.EnableAutoCarrierIdRead") : false;
  500. }
  501. }
  502. public virtual bool IsBypassCarrierIDReader
  503. {
  504. get
  505. {
  506. return SC.ContainsItem($"LoadPort.{_module}.BypassCarrierIDReader") ?
  507. SC.GetValue<bool>($"LoadPort.{_module}.BypassCarrierIDReader") : false;
  508. }
  509. }
  510. private void RegisterOperation()
  511. {
  512. OP.Subscribe($"{Name}.LoadportHome", (string cmd, object[] param) =>
  513. {
  514. if (!Home(out string reason))
  515. {
  516. EV.PostWarningLog(Module, $"{Name} can not start home, {reason}");
  517. return false;
  518. }
  519. EV.PostInfoLog(Module, $"{Name} start home");
  520. return true;
  521. });
  522. OP.Subscribe($"{Name}.LoadportReset", (string cmd, object[] param) =>
  523. {
  524. if (!ClearError(out string reason))
  525. {
  526. EV.PostWarningLog(Module, $"{Name} can not reset, {reason}");
  527. return false;
  528. }
  529. EV.PostInfoLog(Module, $"{Name} start reset");
  530. return true;
  531. });
  532. OP.Subscribe($"{Name}.LoadportStop", (string cmd, object[] param) =>
  533. {
  534. if (!Stop(out string reason))
  535. {
  536. EV.PostWarningLog(Module, $"{Name} can not stop, {reason}");
  537. return false;
  538. }
  539. EV.PostInfoLog(Module, $"{Name} stop");
  540. return true;
  541. });
  542. OP.Subscribe($"{Name}.LoadportLoad", (string cmd, object[] param) =>
  543. {
  544. if (!Load(out string reason))
  545. {
  546. EV.PostWarningLog(Module, $"{Name} can not load, {reason}");
  547. return false;
  548. }
  549. EV.PostInfoLog(Module, $"{Name} start load");
  550. return true;
  551. });
  552. OP.Subscribe($"{Name}.LoadportLoadWithoutMap", (string cmd, object[] param) =>
  553. {
  554. if (!LoadWithoutMap(out string reason))
  555. {
  556. EV.PostWarningLog(Module, $"{Name} can not load without map, {reason}");
  557. return false;
  558. }
  559. EV.PostInfoLog(Module, $"{Name} start load without map");
  560. return true;
  561. });
  562. OP.Subscribe($"{Name}.LoadportLoadWithMap", (string cmd, object[] param) =>
  563. {
  564. if (!Load(out string reason))
  565. {
  566. EV.PostWarningLog(Module, $"{Name} can not load with map, {reason}");
  567. return false;
  568. }
  569. if (!QueryWaferMap(out reason))
  570. {
  571. EV.PostWarningLog(Module, $"{Name} can not map, {reason}");
  572. return false;
  573. }
  574. EV.PostInfoLog(Module, $"{Name} start load with map");
  575. return true;
  576. });
  577. OP.Subscribe($"{Name}.LoadportUnload", (string cmd, object[] param) =>
  578. {
  579. if (!Unload(out string reason))
  580. {
  581. EV.PostWarningLog(Module, $"{Name} can not unload, {reason}");
  582. return false;
  583. }
  584. EV.PostInfoLog(Module, $"{Name} start unload");
  585. return true;
  586. });
  587. OP.Subscribe($"{Name}.LoadportClamp", (string cmd, object[] param) =>
  588. {
  589. if (!Clamp(out string reason))
  590. {
  591. EV.PostWarningLog(Module, $"{Name} can not clamp, {reason}");
  592. return false;
  593. }
  594. EV.PostInfoLog(Module, $"{Name} start clamp");
  595. return true;
  596. });
  597. OP.Subscribe($"{Name}.LoadportUnclamp", (string cmd, object[] param) =>
  598. {
  599. if (!Unclamp(out string reason))
  600. {
  601. EV.PostWarningLog(Module, $"{Name} can not unclamp, {reason}");
  602. return false;
  603. }
  604. EV.PostInfoLog(Module, $"{Name} start unclamp");
  605. return true;
  606. });
  607. OP.Subscribe($"{Name}.LoadportOpenDoor", (string cmd, object[] param) =>
  608. {
  609. if (!OpenDoor(out string reason))
  610. {
  611. EV.PostWarningLog(Module, $"{Name} can not open door, {reason}");
  612. return false;
  613. }
  614. EV.PostInfoLog(Module, $"{Name} start open door");
  615. return true;
  616. });
  617. OP.Subscribe($"{Name}.LoadportOpenDoorNoMap", (string cmd, object[] param) =>
  618. {
  619. if (!OpenDoorNoMap(out string reason))
  620. {
  621. EV.PostWarningLog(Module, $"{Name} can not open door, {reason}");
  622. return false;
  623. }
  624. EV.PostInfoLog(Module, $"{Name} start open door");
  625. return true;
  626. });
  627. OP.Subscribe($"{Name}.LoadportCloseDoor", (string cmd, object[] param) =>
  628. {
  629. if (!CloseDoor(out string reason))
  630. {
  631. EV.PostWarningLog(Module, $"{Name} can not close door, {reason}");
  632. return false;
  633. }
  634. EV.PostInfoLog(Module, $"{Name} start close door");
  635. return true;
  636. });
  637. OP.Subscribe($"{Name}.LoadportDock", (string cmd, object[] param) =>
  638. {
  639. if (!Dock(out string reason))
  640. {
  641. EV.PostWarningLog(Module, $"{Name} can not dock, {reason}");
  642. return false;
  643. }
  644. EV.PostInfoLog(Module, $"{Name} start dock");
  645. return true;
  646. });
  647. OP.Subscribe($"{Name}.LoadportUndock", (string cmd, object[] param) =>
  648. {
  649. if (!Undock(out string reason))
  650. {
  651. EV.PostWarningLog(Module, $"{Name} can not undock, {reason}");
  652. return false;
  653. }
  654. EV.PostInfoLog(Module, $"{Name} start undock");
  655. return true;
  656. });
  657. OP.Subscribe($"{Name}.LoadportQueryState", (string cmd, object[] param) =>
  658. {
  659. if (!QueryState(out string reason))
  660. {
  661. EV.PostWarningLog(Module, $"{Name} can not query state, {reason}");
  662. return false;
  663. }
  664. EV.PostInfoLog(Module, $"{Name} start query state");
  665. return true;
  666. });
  667. OP.Subscribe($"{Name}.LoadportQueryLED", (string cmd, object[] param) =>
  668. {
  669. if (!QueryIndicator(out string reason))
  670. {
  671. EV.PostWarningLog(Module, $"{Name} can not query led state, {reason}");
  672. return false;
  673. }
  674. EV.PostInfoLog(Module, $"{Name} start query led state");
  675. return true;
  676. });
  677. OP.Subscribe($"{Name}.LoadportSetLED", (string cmd, object[] param) =>
  678. {
  679. int light = (int)param[0];
  680. int state = (int)param[1];
  681. if (!SetIndicator((Indicator)light, (IndicatorState)state, out string reason))
  682. {
  683. EV.PostWarningLog(Module, $"{Name} can not set led state, {reason}");
  684. return true;
  685. }
  686. EV.PostInfoLog(Module, $"{Name} start set led state");
  687. return true;
  688. });
  689. OP.Subscribe($"{Name}.LoadportMap", (string cmd, object[] param) =>
  690. {
  691. if (!QueryWaferMap(out string reason))
  692. {
  693. EV.PostWarningLog(Module, $"{Name} can not map, {reason}");
  694. return false;
  695. }
  696. EV.PostInfoLog(Module, $"{Name} start map");
  697. return true;
  698. });
  699. OP.Subscribe($"{Name}.SetCassetteType", (string cmd, object[] param) =>
  700. {
  701. if (!SetCassetteType(param, out string reason))
  702. {
  703. EV.PostWarningLog(Module, $"{Name} can not set type, {reason}");
  704. return false;
  705. }
  706. EV.PostInfoLog(Module, $"{Name} cassette type have set to {CasstleType}");
  707. return true;
  708. });
  709. OP.Subscribe($"{Name}.LoadportForceHome", (string cmd, object[] param) =>
  710. {
  711. if (!ForceHome(out string reason))
  712. {
  713. EV.PostWarningLog(Module, $"{Name} can not start force home, {reason}");
  714. return false;
  715. }
  716. EV.PostInfoLog(Module, $"{Name} start force home");
  717. return true;
  718. });
  719. OP.Subscribe($"{Name}.LoadportFOSBMode", (string cmd, object[] param) =>
  720. {
  721. if (!FOSBMode(out string reason))
  722. {
  723. EV.PostWarningLog(Module, $"{Name} can not change to FOSB mode, {reason}");
  724. return false;
  725. }
  726. IsFOSBMode = true;
  727. EV.PostInfoLog(Module, $"{Name} changed to FOSB mode");
  728. return true;
  729. });
  730. OP.Subscribe($"{Name}.LoadportFOUPMode", (string cmd, object[] param) =>
  731. {
  732. if (!FOUPMode(out string reason))
  733. {
  734. EV.PostWarningLog(Module, $"{Name} can not change to FOSB mode, {reason}");
  735. return false;
  736. }
  737. IsFOSBMode = true;
  738. EV.PostInfoLog(Module, $"{Name} changed to FOSB mode");
  739. return true;
  740. });
  741. OP.Subscribe($"{Name}.LoadportQueryFOSBMode", (string cmd, object[] param) =>
  742. {
  743. if (!QueryFOSBMode(out string reason))
  744. {
  745. EV.PostWarningLog(Module, $"{Name} can not change to FOUP mode, {reason}");
  746. return false;
  747. }
  748. IsFOSBMode = false;
  749. EV.PostInfoLog(Module, $"{Name} changed to FOSB mode");
  750. return true;
  751. });
  752. OP.Subscribe($"{Name}.SetLoadportLotID", (string cmd, object[] param) =>
  753. {
  754. if (!SetLotID(param, out string reason))
  755. {
  756. return false;
  757. }
  758. EV.PostInfoLog(Module, $"{Name} set lotID for loadport.");
  759. return true;
  760. });
  761. }
  762. private bool SetLotID(object[] param, out string reason)
  763. {
  764. reason = "";
  765. if (param == null || param.Length == 0) return false;
  766. _lplotID = param[0].ToString();
  767. return true;
  768. }
  769. private bool SetCassetteType(object[] param, out string reason)
  770. {
  771. reason = "";
  772. if (param.Length != 1)
  773. {
  774. reason = "Invalid setting parameter.";
  775. return false;
  776. }
  777. CasstleType = (CasstleType)int.Parse(param[0].ToString());
  778. return true;
  779. }
  780. public virtual bool FALoad(out string reason)
  781. {
  782. reason = "";
  783. return true;
  784. }
  785. public virtual bool Load(out string reason)
  786. {
  787. reason = "";
  788. return true;
  789. }
  790. public virtual bool LoadWithoutMap(out string reason)
  791. {
  792. reason = "";
  793. return true;
  794. }
  795. public virtual bool QueryWaferMap(out string reason)
  796. {
  797. reason = "";
  798. return true;
  799. }
  800. public virtual bool GetMapInfo(out string reason)
  801. {
  802. reason = "";
  803. return true;
  804. }
  805. public virtual bool SetWaferMap(out string reason)
  806. {
  807. reason = "";
  808. return true;
  809. }
  810. public virtual bool QueryFOSBMode(out string reason)
  811. {
  812. reason = "";
  813. return true;
  814. }
  815. /// <summary>
  816. /// FOSB模式下的Dock指令
  817. /// </summary>
  818. /// <param name="reason"></param>
  819. /// <returns></returns>
  820. public virtual bool FOSBDock(out string reason)
  821. {
  822. reason = "";
  823. return true;
  824. }
  825. /// <summary>
  826. /// FOSB模式下的FOSBUnDock指令
  827. /// </summary>
  828. /// <param name="reason"></param>
  829. /// <returns></returns>
  830. public virtual bool FOSBUnDock(out string reason)
  831. {
  832. reason = "";
  833. return true;
  834. }
  835. /// <summary>
  836. /// FOSB模式下的开门指令
  837. /// </summary>
  838. /// <param name="reason"></param>
  839. /// <returns></returns>
  840. public virtual bool FOSBDoorOpen(out string reason)
  841. {
  842. reason = "";
  843. return true;
  844. }
  845. /// <summary>
  846. /// FOSB模式下的关门指令
  847. /// </summary>
  848. /// <param name="reason"></param>
  849. /// <returns></returns>
  850. public virtual bool FOSBDoorClose(out string reason)
  851. {
  852. reason = "";
  853. return true;
  854. }
  855. /// <summary>
  856. /// FOSB模式下的门下移指令
  857. /// </summary>
  858. /// <param name="reason"></param>
  859. /// <returns></returns>
  860. public virtual bool FOSBDoorDown(out string reason)
  861. {
  862. reason = "";
  863. return true;
  864. }
  865. /// <summary>
  866. /// FOSB模式下的门上移指令
  867. /// </summary>
  868. /// <param name="reason"></param>
  869. /// <returns></returns>
  870. public virtual bool FOSBDoorUp(out string reason)
  871. {
  872. reason = "";
  873. return true;
  874. }
  875. public virtual bool SetIndicator(IndicatorType light, IndicatorState state)
  876. {
  877. if (LoadPortIndicatorLightMap.ContainsKey(light))
  878. {
  879. SetIndicator(LoadPortIndicatorLightMap[light], state, out string _);
  880. return true;
  881. }
  882. EV.PostWarningLog(Module, $"Not supported indicator {light}");
  883. return false;
  884. }
  885. public IndicatorState GetIndicator(IndicatorType light)
  886. {
  887. if (LoadPortIndicatorLightMap.ContainsKey(light))
  888. {
  889. return IndicatorStateFeedback[(int)LoadPortIndicatorLightMap[light]];
  890. }
  891. EV.PostWarningLog(Module, $"Not supported indicator {light}");
  892. return IndicatorState.OFF;
  893. }
  894. public virtual bool SetE84Available(out string reason)
  895. {
  896. if (_lpE84Callback != null)
  897. {
  898. _lpE84Callback.SetHoAutoControl(false);
  899. _lpE84Callback.SetHoAvailable(true);
  900. }
  901. reason = "";
  902. return true;
  903. }
  904. public virtual bool SetE84Unavailable(out string reason)
  905. {
  906. if (_lpE84Callback != null)
  907. {
  908. _lpE84Callback.SetHoAutoControl(false);
  909. _lpE84Callback.SetHoAvailable(false);
  910. }
  911. reason = "";
  912. return true;
  913. }
  914. public virtual bool SetIndicator(Indicator light, IndicatorState state, out string reason)
  915. {
  916. reason = "";
  917. return true;
  918. }
  919. public virtual bool QueryIndicator(out string reason)
  920. {
  921. reason = "";
  922. return true;
  923. }
  924. public virtual bool QueryState(out string reason)
  925. {
  926. reason = "";
  927. return true;
  928. }
  929. public virtual bool Undock(out string reason)
  930. {
  931. reason = "";
  932. return true;
  933. }
  934. public virtual bool Dock(out string reason)
  935. {
  936. reason = "";
  937. return true;
  938. }
  939. public virtual bool CloseDoor(out string reason)
  940. {
  941. reason = "";
  942. return true;
  943. }
  944. public virtual bool OpenDoor(out string reason)
  945. {
  946. reason = "";
  947. return true;
  948. }
  949. public virtual bool OpenDoorNoMap(out string reason)
  950. {
  951. reason = "";
  952. return true;
  953. }
  954. public virtual bool OpenDoorAndMap(out string reason)
  955. {
  956. reason = "";
  957. return true;
  958. }
  959. public virtual bool Unclamp(out string reason)
  960. {
  961. reason = "";
  962. return true;
  963. }
  964. public virtual bool Clamp(out string reason)
  965. {
  966. reason = "";
  967. return true;
  968. }
  969. public virtual bool Unload(out string reason)
  970. {
  971. reason = "";
  972. return true;
  973. }
  974. public virtual bool Stop(out string reason)
  975. {
  976. reason = "";
  977. return true;
  978. }
  979. public virtual bool ClearError(out string reason)
  980. {
  981. reason = "";
  982. return true;
  983. }
  984. public virtual bool Init(out string reason)
  985. {
  986. reason = "";
  987. return true;
  988. }
  989. public virtual bool Home(out string reason)
  990. {
  991. reason = "";
  992. return true;
  993. }
  994. public virtual bool ForceHome(out string reason)
  995. {
  996. reason = "";
  997. return true;
  998. }
  999. public virtual bool FOSBMode(out string reason)
  1000. {
  1001. reason = "";
  1002. return true;
  1003. }
  1004. public virtual bool FOUPMode(out string reason)
  1005. {
  1006. reason = "";
  1007. return true;
  1008. }
  1009. public virtual bool ReadRfId(out string reason)
  1010. {
  1011. reason = "";
  1012. return true;
  1013. }
  1014. public virtual bool ReadRfid(int startpage, int length, out string reason)
  1015. {
  1016. reason = "";
  1017. return true;
  1018. }
  1019. public virtual bool WriteRfid(string cid, int startpage, int length, out string reason)
  1020. {
  1021. reason = "";
  1022. return true;
  1023. }
  1024. public virtual bool ChangeAccessMode(bool auto, out string reason)
  1025. {
  1026. reason = "";
  1027. return true;
  1028. }
  1029. //public virtual bool ChangeTransferState(LoadPortTransferState newState, out string reason)
  1030. //{
  1031. // reason = "";
  1032. // return true;
  1033. //}
  1034. public virtual bool SetServiceCommand(bool inService, out string reason)
  1035. {
  1036. reason = "";
  1037. return true;
  1038. }
  1039. public virtual bool GetE84HandoffActiveSignalState(E84PioPosition piopostion, E84PioSignalAtoP AtoPsignal)
  1040. {
  1041. if (_lpE84Callback == null) return false;
  1042. switch (AtoPsignal)
  1043. {
  1044. case E84PioSignalAtoP.AM_AVBL:
  1045. return _lpE84Callback.GetE84SignalState(E84SignalID.AM_AVBL);
  1046. case E84PioSignalAtoP.BUSY:
  1047. return _lpE84Callback.GetE84SignalState(E84SignalID.BUSY);
  1048. case E84PioSignalAtoP.COMPT:
  1049. return _lpE84Callback.GetE84SignalState(E84SignalID.COMPT);
  1050. case E84PioSignalAtoP.CONT:
  1051. return _lpE84Callback.GetE84SignalState(E84SignalID.CONT);
  1052. case E84PioSignalAtoP.CS_0:
  1053. return _lpE84Callback.GetE84SignalState(E84SignalID.CS_0);
  1054. case E84PioSignalAtoP.CS_1:
  1055. return _lpE84Callback.GetE84SignalState(E84SignalID.CS_1);
  1056. case E84PioSignalAtoP.TR_REQ:
  1057. return _lpE84Callback.GetE84SignalState(E84SignalID.TR_REQ);
  1058. case E84PioSignalAtoP.VALID:
  1059. return _lpE84Callback.GetE84SignalState(E84SignalID.VALID);
  1060. default:
  1061. return false;
  1062. }
  1063. }
  1064. public virtual bool GetE84HandoffPassiveSignalState(E84PioPosition piopostion, E84PioSignalPtoA PtoAsignal)
  1065. {
  1066. if (_lpE84Callback == null) return false;
  1067. switch (PtoAsignal)
  1068. {
  1069. case E84PioSignalPtoA.ES:
  1070. return _lpE84Callback.GetE84SignalState(E84SignalID.ES);
  1071. case E84PioSignalPtoA.HO_AVBL:
  1072. return _lpE84Callback.GetE84SignalState(E84SignalID.HO_AVBL);
  1073. case E84PioSignalPtoA.L_REQ:
  1074. return _lpE84Callback.GetE84SignalState(E84SignalID.L_REQ);
  1075. case E84PioSignalPtoA.READY:
  1076. return _lpE84Callback.GetE84SignalState(E84SignalID.READY);
  1077. case E84PioSignalPtoA.U_REQ:
  1078. return _lpE84Callback.GetE84SignalState(E84SignalID.U_REQ);
  1079. default:
  1080. return false;
  1081. }
  1082. }
  1083. public virtual void SetE84HandoffSignalState(E84PioPosition piopostion, E84PioSignalPtoA PtoAsignal, bool state)
  1084. {
  1085. if (_lpE84Callback == null) return;
  1086. switch (PtoAsignal)
  1087. {
  1088. case E84PioSignalPtoA.ES:
  1089. _lpE84Callback.SetE84SignalState(E84PassiveSignal.ES, state);
  1090. break;
  1091. case E84PioSignalPtoA.HO_AVBL:
  1092. _lpE84Callback.SetE84SignalState(E84PassiveSignal.HOAvbl, state);
  1093. break;
  1094. case E84PioSignalPtoA.L_REQ:
  1095. _lpE84Callback.SetE84SignalState(E84PassiveSignal.LoadReq, state);
  1096. break;
  1097. case E84PioSignalPtoA.READY:
  1098. _lpE84Callback.SetE84SignalState(E84PassiveSignal.Ready, state);
  1099. break;
  1100. case E84PioSignalPtoA.U_REQ:
  1101. _lpE84Callback.SetE84SignalState(E84PassiveSignal.UnloadReq, state);
  1102. break;
  1103. default:
  1104. break;
  1105. }
  1106. }
  1107. public virtual void Monitor()
  1108. {
  1109. _presentTrig.CLK = _isPresent;
  1110. _placetTrig.CLK = _isPlaced;
  1111. _dockTrig.CLK = _isDocked;
  1112. _clampTrig.CLK = ClampState == FoupClampState.Close;
  1113. _doorTrig.CLK = DoorState == FoupDoorState.Close;
  1114. _accessSwPressedTrig.CLK = _isAccessSwPressed;
  1115. if (_lpE84Callback != null)
  1116. {
  1117. _lpE84Callback.SetFoupStatus(_isPlaced);
  1118. _lpE84Callback.SetReadyTransferStatus((ClampState == FoupClampState.Open) &&
  1119. (DockState == FoupDockState.Undocked) && Initalized);
  1120. _lpE84Callback.SetLightCurtainHandle(CurrentLightCurtainHandle);
  1121. }
  1122. }
  1123. public virtual void Reset()
  1124. {
  1125. Error = false;
  1126. ExecuteError = false;
  1127. MapError = false;
  1128. ReadCarrierIDError = false;
  1129. if (_carrierIDReadercallback != null)
  1130. _carrierIDReadercallback.Reset();
  1131. }
  1132. public virtual void Terminate()
  1133. {
  1134. }
  1135. private List<List<string>> UpdatedWaferIdList()
  1136. {
  1137. WaferInfo[] wafers = WaferManager.Instance.GetWafers(_module);
  1138. for (int i = 0; i < wafers.Length; i++)
  1139. {
  1140. _waferId[i][1] = wafers[i].LaserMarker;
  1141. _waferId[i][2] = wafers[i].T7Code;
  1142. _waferId[i][3] = wafers[i].WaferID;
  1143. }
  1144. return _waferId;
  1145. }
  1146. public abstract bool IsEnableMapWafer();
  1147. public abstract bool IsEnableTransferWafer();
  1148. public abstract bool IsEnableTransferWafer(out string reason);
  1149. public virtual bool IsEnableLoad()
  1150. {
  1151. return _isPresent && _isPlaced;
  1152. }
  1153. private CarrierOnLPState _CarrierOnState { get; set; } = CarrierOnLPState.Unknow;
  1154. protected void ConfirmAddCarrier()
  1155. {
  1156. if (_isPresent && _isPlaced)
  1157. {
  1158. if (_CarrierOnState != CarrierOnLPState.On)
  1159. {
  1160. CarrierManager.Instance.CreateCarrier(Name);
  1161. _CarrierOnState = CarrierOnLPState.On;
  1162. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1163. dvid[PORT_ID] = PortId;
  1164. dvid["PortID"] = PortId;
  1165. dvid[PORT_CTGRY] = PortCategory;
  1166. dvid[PORT_CARRIER_TYPE] = InfoPadCarrierType;
  1167. EV.Notify(EventCarrierArrived, dvid);
  1168. if (_lpcallback != null) _lpcallback.CarrierArrive();
  1169. if (IsAutoClampOnFoupOn)
  1170. Clamp(out _);
  1171. if (IsAutoReadCarrierID)
  1172. ReadRfId(out _);
  1173. }
  1174. IsComplete = false;
  1175. }
  1176. }
  1177. protected void ConfirmRemoveCarrier()
  1178. {
  1179. if (!_isPlaced)
  1180. {
  1181. WaferManager.Instance.DeleteWafer(ModuleHelper.Converter(Name), 0, _slotNumber);
  1182. CarrierManager.Instance.DeleteCarrier(Name);
  1183. if (_CarrierOnState != CarrierOnLPState.Off)
  1184. {
  1185. _CarrierOnState = CarrierOnLPState.Off;
  1186. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1187. dvid[PORT_ID] = PortId;
  1188. dvid["PortID"] = PortId;
  1189. dvid[PORT_CTGRY] = PortCategory;
  1190. dvid[CAR_ID] = _carrierId ?? "";
  1191. dvid["CarrierID"] = _carrierId ?? "";
  1192. EV.Notify(EventCarrierRemoved, dvid);
  1193. if (_lpcallback != null) _lpcallback.CarrerRemove(_carrierId);
  1194. }
  1195. IsComplete = false;
  1196. _isMapped = false;
  1197. _carrierId = "";
  1198. }
  1199. }
  1200. public void OnSlotMapRead(string _slotMap)
  1201. {
  1202. for (int i = 0; i < _slotNumber; i++)
  1203. {
  1204. // No wafer: "0", Wafer: "1", Crossed:"2", Undefined: "?", Overlapping wafers: "W"
  1205. WaferInfo wafer = null;
  1206. switch (_slotMap[i])
  1207. {
  1208. case '0':
  1209. WaferManager.Instance.DeleteWafer(_module, i);
  1210. CarrierManager.Instance.UnregisterCarrierWafer(Name, i);
  1211. break;
  1212. case '1':
  1213. wafer = WaferManager.Instance.CreateWafer(_module, i, WaferStatus.Normal);
  1214. WaferManager.Instance.UpdateWaferSize(_module, i, GetCurrentWaferSize());
  1215. CarrierManager.Instance.RegisterCarrierWafer(Name, i, wafer);
  1216. break;
  1217. case '2':
  1218. wafer = WaferManager.Instance.CreateWafer(_module, i, WaferStatus.Crossed);
  1219. WaferManager.Instance.UpdateWaferSize(_module, i, GetCurrentWaferSize());
  1220. CarrierManager.Instance.RegisterCarrierWafer(Name, i, wafer);
  1221. //NotifyWaferError(Name, i, WaferStatus.Crossed);
  1222. break;
  1223. case 'W':
  1224. wafer = WaferManager.Instance.CreateWafer(_module, i, WaferStatus.Double);
  1225. WaferManager.Instance.UpdateWaferSize(_module, i, GetCurrentWaferSize());
  1226. CarrierManager.Instance.RegisterCarrierWafer(Name, i, wafer);
  1227. //NotifyWaferError(Name, i, WaferStatus.Double);
  1228. break;
  1229. case '?':
  1230. wafer = WaferManager.Instance.CreateWafer(_module, i, WaferStatus.Unknown);
  1231. WaferManager.Instance.UpdateWaferSize(_module, i, GetCurrentWaferSize());
  1232. CarrierManager.Instance.RegisterCarrierWafer(Name, i, wafer);
  1233. //NotifyWaferError(Name, i, WaferStatus.Unknown);
  1234. break;
  1235. }
  1236. }
  1237. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1238. dvid[SLOT_MAP] = _slotMap;
  1239. dvid[PORT_ID] = PortId;
  1240. dvid[PORT_CTGRY] = PortCategory;
  1241. dvid[CAR_ID] = CarrierId == null ? "" : CarrierId;
  1242. dvid["CarrierID"] = CarrierId ?? "";
  1243. EV.Notify(EventSlotMapAvailable, dvid);
  1244. if (_slotMap.Contains("2"))
  1245. {
  1246. MapError = true;
  1247. Error = true;
  1248. EV.Notify(AlarmLoadPortMappingError, new SerializableDictionary<string, object> {
  1249. {"AlarmText","Mapped Crossed wafer." }
  1250. });
  1251. }
  1252. if (_slotMap.Contains("W"))
  1253. {
  1254. MapError = true;
  1255. Error = true;
  1256. EV.Notify(AlarmLoadPortMappingError, new SerializableDictionary<string, object> {
  1257. {"AlarmText","Mapped Double wafer." }
  1258. });
  1259. }
  1260. if (_slotMap.Contains("?"))
  1261. {
  1262. MapError = true;
  1263. Error = true;
  1264. EV.Notify(AlarmLoadPortMappingError, new SerializableDictionary<string, object> {
  1265. {"AlarmText","Mapped Unknown wafer." }
  1266. });
  1267. }
  1268. if (_lpcallback != null) _lpcallback.MappingComplete(_carrierId, _slotMap);
  1269. _isMapped = true;
  1270. }
  1271. private string GetSlotMap()
  1272. {
  1273. WaferInfo[] wafers = WaferManager.Instance.GetWafers(ModuleHelper.Converter(Name));
  1274. string slot = "";
  1275. for (int i = 0; i < _slotNumber && i < wafers.Length; i++)
  1276. {
  1277. slot += wafers[i].IsEmpty ? "0" : "1";
  1278. }
  1279. return slot;
  1280. }
  1281. public bool IsWaferEnableTransfer()
  1282. {
  1283. WaferInfo[] wafers = WaferManager.Instance.GetWafers(ModuleHelper.Converter(Name));
  1284. foreach (WaferInfo wafer in wafers)
  1285. {
  1286. if (wafer.Status == WaferStatus.Crossed || wafer.Status == WaferStatus.Double)
  1287. {
  1288. EV.PostWarningLog(Name, $"At least one wafer is {wafer.Status.ToString()}.");
  1289. return false;
  1290. }
  1291. }
  1292. return true;
  1293. }
  1294. /// <summary>
  1295. /// 获取LP中空缺Slot
  1296. /// </summary>
  1297. /// <returns>返回一个list, 顺序为从下到上.(0-25)</returns>
  1298. public List<int> GetEmptySlot()
  1299. {
  1300. List<int> slot = new List<int>();
  1301. if (IsMapped)
  1302. {
  1303. WaferInfo[] wafers = WaferManager.Instance.GetWafers(ModuleHelper.Converter(Name));
  1304. for (int i = 0; i < _slotNumber; i++)
  1305. {
  1306. if (wafers[i].IsEmpty)
  1307. slot.Add(i);
  1308. }
  1309. return slot;
  1310. }
  1311. else
  1312. {
  1313. return null;
  1314. }
  1315. }
  1316. public virtual bool ReadCarrierID(int offset = 0, int length = 16)
  1317. {
  1318. if (_carrierIDReadercallback != null)
  1319. return _carrierIDReadercallback.ReadCarrierID(offset, length);
  1320. return false;
  1321. }
  1322. public virtual bool WriteCarrierID(string carrierID, int offset = 0, int length = 16)
  1323. {
  1324. if (_carrierIDReadercallback != null)
  1325. return _carrierIDReadercallback.WriteCarrierID(offset, length, carrierID);
  1326. return false;
  1327. }
  1328. public void OnCarrierIdRead(string carrierId)
  1329. {
  1330. if (_isPlaced && _isPresent)
  1331. {
  1332. _carrierId = carrierId;
  1333. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1334. dvid["CarrierID"] = carrierId ?? "";
  1335. dvid[CAR_ID] = carrierId ?? "";
  1336. dvid[PORT_ID] = PortId;
  1337. dvid["PortID"] = PortId;
  1338. dvid[PORT_CTGRY] = PortCategory;
  1339. dvid[PORT_CARRIER_TYPE] = InfoPadCarrierType;
  1340. EV.Notify(EventCarrierIdRead, dvid);
  1341. CarrierManager.Instance.UpdateCarrierId(Name, carrierId);
  1342. if (_lpcallback != null) _lpcallback.CarrierIDReadSuccess(_carrierId);
  1343. ReadCarrierIDError = false;
  1344. }
  1345. else
  1346. {
  1347. EV.PostWarningLog(Module, $"No FOUP found, carrier id {carrierId} not saved");
  1348. }
  1349. }
  1350. public void OnCarrierIdRead(ModuleName module, string name, string code)
  1351. {
  1352. OnCarrierIdRead(code);
  1353. }
  1354. public void ProceedSetCarrierID(string cid)
  1355. {
  1356. _carrierId = cid;
  1357. CarrierManager.Instance.UpdateCarrierId(Name, cid);
  1358. }
  1359. public void OnCarrierIdWrite(ModuleName module, string name, string id)
  1360. {
  1361. OnCarrierIdWrite(id);
  1362. }
  1363. public void OnCarrierIdWrite(string carrierId)
  1364. {
  1365. if (_isPlaced && _isPresent)
  1366. {
  1367. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1368. dvid[CAR_ID] = carrierId ?? "";
  1369. dvid["CarrierID"] = carrierId ?? "";
  1370. dvid[PORT_ID] = PortId;
  1371. dvid[PORT_CTGRY] = PortCategory;
  1372. EV.Notify(EventCarrierIdWrite, dvid);
  1373. }
  1374. else
  1375. {
  1376. EV.PostWarningLog(Module, $"No FOUP found, carrier id {carrierId} not saved");
  1377. }
  1378. }
  1379. public void OnCarrierIdReadFailed(ModuleName module, string name)
  1380. {
  1381. OnCarrierIdReadFailed();
  1382. }
  1383. public void OnCarrierIdReadFailed()
  1384. {
  1385. if (_isPlaced && _isPresent)
  1386. {
  1387. _carrierId = "";
  1388. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1389. dvid[PORT_ID] = PortId;
  1390. dvid["PortID"] = PortId;
  1391. dvid[PORT_CTGRY] = PortCategory;
  1392. EV.Notify(EventCarrierIdReadFailed, dvid);
  1393. //if (_lpcallback != null) _lpcallback.CarrierIDReadFail();
  1394. EV.Notify(AlarmCarrierIDReadError, new SerializableDictionary<string, object> {
  1395. {"AlarmText","CarrierID read fail." }
  1396. });
  1397. //ReadCarrierIDError = true;
  1398. }
  1399. else
  1400. {
  1401. EV.PostWarningLog(Module, "No FOUP found, carrier id read is not valid");
  1402. }
  1403. }
  1404. public void OnCarrierIdWriteFailed(ModuleName module, string name)
  1405. {
  1406. OnCarrierIdWriteFailed();
  1407. }
  1408. public void OnCarrierIdWriteFailed()
  1409. {
  1410. if (_isPlaced && _isPresent)
  1411. {
  1412. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1413. dvid[PORT_ID] = PortId;
  1414. dvid[PORT_CTGRY] = PortCategory;
  1415. EV.Notify(EventCarrierIdWriteFailed, dvid);
  1416. }
  1417. else
  1418. {
  1419. EV.PostWarningLog(Module, "No FOUP found, carrier id not valid");
  1420. }
  1421. }
  1422. public void OnCarrierIdRead(ModuleName module, string carrierId)
  1423. {
  1424. OnCarrierIdRead(carrierId);
  1425. }
  1426. public void OnCarrierIdReadFailed(ModuleName module)
  1427. {
  1428. OnCarrierIdReadFailed();
  1429. }
  1430. public void OnCarrierIdWrite(ModuleName module, string carrierId)
  1431. {
  1432. OnCarrierIdWrite(carrierId);
  1433. }
  1434. public void OnCarrierIdWriteFailed(ModuleName module)
  1435. {
  1436. OnCarrierIdWriteFailed();
  1437. }
  1438. public void OnRfIdRead(ModuleName module, string rfid)
  1439. {
  1440. if (_isPlaced && _isPresent)
  1441. {
  1442. _rfid = rfid;
  1443. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1444. dvid[CAR_ID] = _carrierId ?? "";
  1445. dvid["CarrierID"] = _carrierId ?? "";
  1446. dvid[PORT_ID] = PortId;
  1447. dvid[PORT_CTGRY] = PortCategory;
  1448. dvid[RF_ID] = rfid ?? "";
  1449. EV.Notify(EventRfIdRead, dvid);
  1450. CarrierManager.Instance.UpdateRfId(Name, rfid);
  1451. ReadCarrierIDError = false;
  1452. }
  1453. else
  1454. {
  1455. EV.PostWarningLog(Module, "No FOUP found, rf id read not valid");
  1456. }
  1457. }
  1458. public void OnRfIdReadFailed(ModuleName module)
  1459. {
  1460. if (_isPlaced && _isPresent)
  1461. {
  1462. _rfid = "";
  1463. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1464. dvid[CAR_ID] = _carrierId ?? "";
  1465. dvid["CarrierID"] = _carrierId ?? "";
  1466. dvid[PORT_ID] = PortId;
  1467. dvid[PORT_CTGRY] = PortCategory;
  1468. EV.Notify(EventRfIdReadFailed, dvid);
  1469. }
  1470. else
  1471. {
  1472. EV.PostWarningLog(Module, "No FOUP found, rf id read is not valid");
  1473. }
  1474. }
  1475. public void OnRfIdWrite(ModuleName module, string rfid)
  1476. {
  1477. if (_isPlaced && _isPresent)
  1478. {
  1479. _rfid = rfid;
  1480. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1481. dvid[CAR_ID] = _carrierId ?? "";
  1482. dvid["CarrierID"] = _carrierId ?? "";
  1483. dvid[PORT_ID] = PortId;
  1484. dvid[PORT_CTGRY] = PortCategory;
  1485. dvid[RF_ID] = rfid ?? "";
  1486. EV.Notify(EventRfIdWrite, dvid);
  1487. CarrierManager.Instance.UpdateRfId(Name, rfid);
  1488. }
  1489. else
  1490. {
  1491. EV.PostWarningLog(Module, "No FOUP found, rf id write not valid");
  1492. }
  1493. }
  1494. public void OnRfIdWriteFailed(ModuleName module)
  1495. {
  1496. if (_isPlaced && _isPresent)
  1497. {
  1498. _rfid = "";
  1499. SerializableDictionary<string, string> dvid = new SerializableDictionary<string, string>();
  1500. dvid[CAR_ID] = _carrierId ?? "";
  1501. dvid["CarrierID"] = _carrierId ?? "";
  1502. dvid[PORT_ID] = PortId;
  1503. dvid[PORT_CTGRY] = PortCategory;
  1504. dvid[RF_ID] = "";
  1505. //EV.PostWarningLog(Module, "Write RFID failed.");
  1506. EV.Notify(EventRfIdWriteFailed, dvid);
  1507. }
  1508. else
  1509. {
  1510. EV.PostWarningLog(Module, "No FOUP found, rf id write not valid");
  1511. }
  1512. }
  1513. public void OnLoaded()
  1514. {
  1515. var dvid = new SerializableDictionary<string, string>
  1516. {
  1517. [CAR_ID] = _carrierId ?? "",
  1518. ["CarrierID"] = _carrierId ?? "",
  1519. [PORT_ID] = PortId
  1520. };
  1521. EV.Notify(EventCarrierLoaded, dvid);
  1522. if (_lpcallback != null) _lpcallback.LoadComplete();
  1523. //}
  1524. }
  1525. public void OnUnloaded()
  1526. {
  1527. var dvid = new SerializableDictionary<string, string>();
  1528. dvid[PORT_CTGRY] = PortCategory;
  1529. dvid[PORT_ID] = PortId;
  1530. dvid[CAR_ID] = _carrierId ?? "";
  1531. dvid["CarrierID"] = _carrierId ?? "";
  1532. EV.Notify(EventCarrierUnloaded, dvid);
  1533. //}
  1534. DockState = FoupDockState.Undocked;
  1535. if (_lpcallback != null) _lpcallback.UnloadComplete();
  1536. _isMapped = false;
  1537. }
  1538. public void OnE84HandOffStart(bool isload)
  1539. {
  1540. if (_lpcallback != null) _lpcallback.OnE84HandoffStart(isload);
  1541. }
  1542. public void OnE84HandOffComplete(bool isload)
  1543. {
  1544. if (_lpcallback != null) _lpcallback.OnE84HandoffComplete(isload);
  1545. }
  1546. public void OnFosbUndock()
  1547. {
  1548. var dvid = new SerializableDictionary<string, string>();
  1549. dvid[PORT_CTGRY] = PortCategory;
  1550. dvid[PORT_ID] = PortId;
  1551. dvid[CAR_ID] = _carrierId ?? "";
  1552. dvid["CarrierID"] = _carrierId ?? "";
  1553. EV.Notify(EventCarrierUnloaded, dvid);
  1554. //}
  1555. if (_lpcallback != null) _lpcallback.UnloadComplete();
  1556. }
  1557. public void OnHomed()
  1558. {
  1559. //for (int i = 0; i < _slotNumber; i++)
  1560. //{
  1561. WaferManager.Instance.DeleteWafer(ModuleHelper.Converter(Name), 0, _slotNumber);
  1562. //}
  1563. _isMapped = false;
  1564. var dvid = new SerializableDictionary<string, object>();
  1565. dvid[PORT_CTGRY] = PortCategory;
  1566. dvid[PORT_ID] = PortId;
  1567. dvid[CAR_ID] = _carrierId ?? "";
  1568. dvid["CarrierID"] = _carrierId ?? "";
  1569. EV.Notify(EventLPHomed);
  1570. if (_lpcallback != null) _lpcallback.OnLPHomed();
  1571. }
  1572. public void OnCloseDoor()
  1573. {
  1574. WaferManager.Instance.DeleteWafer(ModuleHelper.Converter(Name), 0, _slotNumber);
  1575. _isMapped = false;
  1576. }
  1577. public void OnError(string error = "")
  1578. {
  1579. EV.Notify($"{_module}{AlarmLoadPortError}", new SerializableDictionary<string, object> {
  1580. {"AlarmText",error }
  1581. });
  1582. if (ActionDone != null)
  1583. ActionDone(false);
  1584. }
  1585. protected void SetPresent(bool isPresent)
  1586. {
  1587. _isPresent = isPresent;
  1588. if (_isPresent)
  1589. {
  1590. //ConfirmAddCarrier();
  1591. }
  1592. else
  1593. {
  1594. //ConfirmRemoveCarrier();
  1595. }
  1596. }
  1597. protected void SetPlaced(bool isPlaced)
  1598. {
  1599. _isPlaced = isPlaced;
  1600. if (_isPlaced)
  1601. {
  1602. ConfirmAddCarrier();
  1603. }
  1604. else
  1605. {
  1606. ConfirmRemoveCarrier();
  1607. }
  1608. }
  1609. public void OnActionDone(bool result)
  1610. {
  1611. if (ActionDone != null)
  1612. ActionDone(result);
  1613. }
  1614. public virtual bool FAUnload(out string reason)
  1615. {
  1616. reason = "";
  1617. return true;
  1618. }
  1619. }
  1620. }