LoadLockDevice.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device.Unit;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.IOCore;
  5. using Aitex.Core.RT.SCCore;
  6. using Aitex.Core.Util;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.SubstrateTrackings;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using athosRT.Modules.EFEMs;
  15. using athosRT.tool;
  16. namespace athosRT.Devices
  17. {
  18. public class LoadLockDevice : BaseDevice, IDevice
  19. {
  20. private IoSensor _sensorDoorOpen;
  21. private IoSensor _sensorArmExtendEnable;
  22. private IoTrigger _triggerSafetytoPM;
  23. private IoTrigger _triggerRBNotExtendPM;
  24. private static DOAccessor _openAtmDoorSignal;
  25. private static DOAccessor _closeAtmDoorSignal;
  26. private static DIAccessor _openAtmDoorFeedback;
  27. private static DIAccessor _closeAtmDoorFeedback;
  28. private static DOAccessor _openVtmDoorSignal;
  29. private static DOAccessor _closeVtmDoorSignal;
  30. private static DIAccessor _openVtmDoorFeedback;
  31. private static DIAccessor _closeVtmDoorFeedback;
  32. private bool _isDoorControledByStation;
  33. private static RD_TRIG atmDoorTrig = new RD_TRIG();
  34. private static RD_TRIG vtmDoorTrig = new RD_TRIG();
  35. private static LoadLockDoorState atmDoorState = LoadLockDoorState.Unknown;
  36. private static LoadLockDoorState vtmDoorState = LoadLockDoorState.Unknown;
  37. private static bool isIdle;
  38. private static bool isSimulator = SC.GetValue<bool>("System.IsSimulatorMode");
  39. private static bool isDoorAlwaysOpen = SC.GetValue<bool>("System.IsLoadLockDoorAlwaysOpen");
  40. public bool IsDoorOpen => !this._sensorDoorOpen.Value && this._sensorArmExtendEnable.Value;
  41. public static bool IsDoorOpenedByStation => LoadLockDevice._openAtmDoorFeedback.Value && !LoadLockDevice._closeAtmDoorFeedback.Value;
  42. public static bool IsDoorClosedByStation => LoadLockDevice._closeAtmDoorFeedback.Value && !LoadLockDevice._openAtmDoorFeedback.Value;
  43. public static bool IsOuterDoorOpenedByStation => LoadLockDevice._openVtmDoorFeedback.Value && !LoadLockDevice._closeVtmDoorFeedback.Value;
  44. public static bool IsOuterDoorClosedByStation => LoadLockDevice._closeVtmDoorFeedback.Value && !LoadLockDevice._openVtmDoorFeedback.Value;
  45. public static bool IsIdle => LoadLockDevice.isIdle;
  46. public static RD_TRIG AtmDoorTrig => LoadLockDevice.atmDoorTrig;
  47. public static RD_TRIG VtmDoorTrig => LoadLockDevice.vtmDoorTrig;
  48. public static LoadLockDoorState LoadLockAtmDoorState
  49. {
  50. get
  51. {
  52. if (LoadLockDevice.isDoorAlwaysOpen)
  53. return LoadLockDoorState.Opened;
  54. if (LoadLockDevice.isSimulator)
  55. {
  56. if (LoadLockDevice._openAtmDoorSignal != null && LoadLockDevice._openAtmDoorSignal.Value && LoadLockDevice._closeAtmDoorSignal != null && !LoadLockDevice._closeAtmDoorSignal.Value)
  57. return LoadLockDoorState.Opened;
  58. return LoadLockDevice._closeAtmDoorSignal != null && LoadLockDevice._closeAtmDoorSignal.Value && LoadLockDevice._openAtmDoorSignal != null && !LoadLockDevice._openAtmDoorSignal.Value ? LoadLockDoorState.Closed : LoadLockDoorState.Unknown;
  59. }
  60. if (LoadLockDevice._openAtmDoorFeedback != null && LoadLockDevice._openAtmDoorFeedback.Value && LoadLockDevice._closeAtmDoorFeedback != null && !LoadLockDevice._closeAtmDoorFeedback.Value)
  61. return LoadLockDoorState.Opened;
  62. return LoadLockDevice._closeAtmDoorFeedback != null && LoadLockDevice._closeAtmDoorFeedback.Value && LoadLockDevice._openAtmDoorFeedback != null && !LoadLockDevice._openAtmDoorFeedback.Value ? LoadLockDoorState.Closed : LoadLockDoorState.Unknown;
  63. }
  64. }
  65. public LoadLockDevice() { }
  66. public static LoadLockDoorState LoadLockVtmDoorState
  67. {
  68. get
  69. {
  70. if (LoadLockDevice.isDoorAlwaysOpen)
  71. return LoadLockDoorState.Opened;
  72. if (LoadLockDevice.isSimulator)
  73. {
  74. if (LoadLockDevice._openVtmDoorSignal != null && LoadLockDevice._openVtmDoorSignal.Value && LoadLockDevice._closeVtmDoorSignal != null && !LoadLockDevice._closeVtmDoorSignal.Value)
  75. return LoadLockDoorState.Opened;
  76. return LoadLockDevice._closeVtmDoorSignal != null && LoadLockDevice._closeVtmDoorSignal.Value && LoadLockDevice._openVtmDoorSignal != null && !LoadLockDevice._openVtmDoorSignal.Value ? LoadLockDoorState.Closed : LoadLockDoorState.Unknown;
  77. }
  78. if (LoadLockDevice._openVtmDoorFeedback != null && LoadLockDevice._openVtmDoorFeedback.Value && LoadLockDevice._closeVtmDoorFeedback != null && !LoadLockDevice._closeVtmDoorFeedback.Value)
  79. return LoadLockDoorState.Opened;
  80. return LoadLockDevice._closeVtmDoorFeedback != null && LoadLockDevice._closeVtmDoorFeedback.Value && LoadLockDevice._openVtmDoorFeedback != null && !LoadLockDevice._openVtmDoorFeedback.Value ? LoadLockDoorState.Closed : LoadLockDoorState.Unknown;
  81. }
  82. }
  83. public LoadLockDevice(
  84. string module,
  85. string name,
  86. int slotNumber,
  87. IoSensor sensorDoorOpen,
  88. IoSensor sensorArmExtendEnable,
  89. DOAccessor openAtmDoorSignal,
  90. DOAccessor closeAtmDoorSignal,
  91. DIAccessor openAtmDoorFeedback,
  92. DIAccessor closeAtmDoorFeedback,
  93. DOAccessor openVtmDoorSignal,
  94. DOAccessor closeVtmDoorSignal,
  95. DIAccessor openVtmDoorFeedback,
  96. DIAccessor closeVtmDoorFeedback)
  97. {
  98. this.Module = module;
  99. this.Name = name;
  100. this._sensorDoorOpen = sensorDoorOpen;
  101. this._sensorArmExtendEnable = sensorArmExtendEnable;
  102. LoadLockDevice._openAtmDoorSignal = openAtmDoorSignal;
  103. LoadLockDevice._closeAtmDoorSignal = closeAtmDoorSignal;
  104. LoadLockDevice._openAtmDoorFeedback = openAtmDoorFeedback;
  105. LoadLockDevice._closeAtmDoorFeedback = closeAtmDoorFeedback;
  106. LoadLockDevice._openVtmDoorSignal = openVtmDoorSignal;
  107. LoadLockDevice._closeVtmDoorSignal = closeVtmDoorSignal;
  108. LoadLockDevice._openVtmDoorFeedback = openVtmDoorFeedback;
  109. LoadLockDevice._closeVtmDoorFeedback = closeVtmDoorFeedback;
  110. Singleton<WaferManager>.Instance.SubscribeLocation(name, slotNumber);
  111. this._isDoorControledByStation = true;
  112. }
  113. public LoadLockDevice(
  114. string module,
  115. string name,
  116. int slotNumber,
  117. IoSensor sensorDoorOpen,
  118. IoSensor sensorArmExtendEnable,
  119. IoTrigger triggerSafetytoPM,
  120. IoTrigger triggerRBNotExtendPM)
  121. {
  122. this.Module = module;
  123. this.Name = name;
  124. this._sensorDoorOpen = sensorDoorOpen;
  125. this._sensorArmExtendEnable = sensorArmExtendEnable;
  126. this._triggerRBNotExtendPM = triggerRBNotExtendPM;
  127. this._triggerSafetytoPM = triggerSafetytoPM;
  128. Singleton<WaferManager>.Instance.SubscribeLocation(name, slotNumber);
  129. this._isDoorControledByStation = false;
  130. }
  131. public bool Initialize()
  132. {
  133. LoadLockDevice.isIdle = true;
  134. DATA.Subscribe(this.Name + ".WaferSize", (Func<object>)(() => (object)Singleton<WaferManager>.Instance.GetWafer(ModuleHelper.Converter(this.Name), 0).Size.ToString()), SubscriptionAttribute.FLAG.SaveDB);
  135. return true;
  136. }
  137. public void Monitor()
  138. {
  139. LoadLockDevice.atmDoorTrig.CLK = LoadLockDevice.LoadLockAtmDoorState == LoadLockDoorState.Closed;
  140. LoadLockDevice.vtmDoorTrig.CLK = LoadLockDevice.LoadLockVtmDoorState == LoadLockDoorState.Closed;
  141. //if (!LoadLockDevice.atmDoorTrig.R && !LoadLockDevice.atmDoorTrig.T && !LoadLockDevice.vtmDoorTrig.R && !LoadLockDevice.vtmDoorTrig.T || !Singleton<DeviceDefineManager>.Instance.GetValue<bool>("LLDoorControlByStation").GetValueOrDefault() || !Singleton<EfemEntity>.Instance.IsOnlineMode)
  142. // return;
  143. //Singleton<EfemEntity>.Instance.SendSigStatEvent(ModuleName.LL1);
  144. }
  145. public void Terminate()
  146. {
  147. }
  148. public void Reset()
  149. {
  150. }
  151. public static bool OpenAtmDoor(out string reason)
  152. {
  153. LoadLockDevice.isIdle = false;
  154. reason = string.Empty;
  155. EV.PostInfoLog(GetName.GetCurrentName(), "LoadLock", "Open Atm Door");
  156. if (LoadLockDevice._openAtmDoorSignal.Value && !LoadLockDevice._closeAtmDoorSignal.Value)
  157. {
  158. reason = "Atm door opened, can't open again";
  159. LoadLockDevice.isIdle = true;
  160. return true;
  161. }
  162. string reason1;
  163. LoadLockDevice._closeAtmDoorSignal.SetValue(false, out reason1);
  164. LoadLockDevice._openAtmDoorSignal.SetValue(true, out reason1);
  165. LoadLockDevice.isIdle = true;
  166. return true;
  167. }
  168. public static bool CloseAtmDoor(out string reason)
  169. {
  170. LoadLockDevice.isIdle = false;
  171. reason = string.Empty;
  172. EV.PostInfoLog(GetName.GetCurrentName(), "LoadLock", "Close Atm Door");
  173. if (LoadLockDevice._closeAtmDoorSignal.Value && !LoadLockDevice._openAtmDoorSignal.Value)
  174. {
  175. reason = "Atm door closed, can't open again";
  176. LoadLockDevice.isIdle = true;
  177. return true;
  178. }
  179. string reason1;
  180. LoadLockDevice._openAtmDoorSignal.SetValue(false, out reason1);
  181. LoadLockDevice._closeAtmDoorSignal.SetValue(true, out reason1);
  182. LoadLockDevice.isIdle = true;
  183. return true;
  184. }
  185. public static bool OpenVtmDoor(out string reason)
  186. {
  187. LoadLockDevice.isIdle = false;
  188. reason = string.Empty;
  189. EV.PostInfoLog(GetName.GetCurrentName(), "LoadLock", "Open Vtm Door");
  190. if (LoadLockDevice._openVtmDoorSignal.Value && !LoadLockDevice._closeVtmDoorSignal.Value)
  191. {
  192. reason = "Vtm door opened, can't open again";
  193. LoadLockDevice.isIdle = true;
  194. return true;
  195. }
  196. string reason1;
  197. LoadLockDevice._closeVtmDoorSignal.SetValue(false, out reason1);
  198. LoadLockDevice._openVtmDoorSignal.SetValue(true, out reason1);
  199. LoadLockDevice.isIdle = true;
  200. return true;
  201. }
  202. public static bool CloseVtmDoor(out string reason)
  203. {
  204. LoadLockDevice.isIdle = false;
  205. reason = string.Empty;
  206. EV.PostInfoLog(GetName.GetCurrentName(), "LoadLock", "Close Vtm Door");
  207. if (LoadLockDevice._closeVtmDoorSignal.Value && !LoadLockDevice._openVtmDoorSignal.Value)
  208. {
  209. reason = "Vtm door closed, can't open again";
  210. LoadLockDevice.isIdle = true;
  211. return true;
  212. }
  213. string reason1;
  214. LoadLockDevice._openVtmDoorSignal.SetValue(false, out reason1);
  215. LoadLockDevice._closeVtmDoorSignal.SetValue(true, out reason1);
  216. LoadLockDevice.isIdle = true;
  217. return true;
  218. }
  219. public void SafeytoPm(bool value)
  220. {
  221. LoadLockDevice.isIdle = false;
  222. EV.PostInfoLog(GetName.GetCurrentName(), "LoadLock", string.Format("set SafeytoPm{0}", (object)value));
  223. this._triggerSafetytoPM.SetTrigger(value, out string _);
  224. LoadLockDevice.isIdle = true;
  225. }
  226. public void NotExtendtoPm(bool value)
  227. {
  228. LoadLockDevice.isIdle = false;
  229. EV.PostInfoLog(GetName.GetCurrentName(), "LoadLock", string.Format("set NotExtendtoPm {0}", (object)value));
  230. this._triggerSafetytoPM.SetTrigger(value, out string _);
  231. LoadLockDevice.isIdle = true;
  232. }
  233. public bool IsEnableTransferWafer(out string reason)
  234. {
  235. reason = string.Empty;
  236. if (this._isDoorControledByStation)
  237. return LoadLockDevice.LoadLockAtmDoorState == LoadLockDoorState.Opened;
  238. if (!LoadLockDevice.isDoorAlwaysOpen && this._sensorDoorOpen != null && !this._sensorDoorOpen.Value)
  239. {
  240. reason = this.Name + " is not ready for transfer";
  241. return false;
  242. }
  243. reason = "";
  244. return true;
  245. }
  246. }
  247. }