EquipmentMonitor.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.SCCore;
  5. using Aitex.Core.Util;
  6. using EFEM.RT.Modules;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.SubstrateTrackings;
  9. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
  10. namespace EFEM.RT.Devices
  11. {
  12. public class EquipmentMonitor : BaseDevice, IDevice
  13. {
  14. private readonly RD_TRIG _trigMaintenance = new RD_TRIG();
  15. private readonly RD_TRIG _airForRobotTrig = new RD_TRIG();
  16. private readonly RD_TRIG _airForLoadPortTrig = new RD_TRIG();
  17. private readonly RD_TRIG _vacuumErrorTrig = new RD_TRIG();
  18. private readonly RD_TRIG _ffu1ErrorTrig = new RD_TRIG();
  19. private readonly RD_TRIG _ffu2ErrorTrig = new RD_TRIG();
  20. private readonly RD_TRIG _ionizorErrorTrig = new RD_TRIG();
  21. private readonly RD_TRIG _flowWarningTrig = new RD_TRIG();
  22. private readonly RD_TRIG _leakWarningTrig = new RD_TRIG();
  23. private readonly R_TRIG signalTowerTrig = new R_TRIG();
  24. private readonly RD_TRIG _cassetleChangeLP1Trig = new RD_TRIG();
  25. private readonly RD_TRIG _cassetleChangeLP2Trig = new RD_TRIG();
  26. private readonly RD_TRIG _trigIONAlarmSIGNAL = new RD_TRIG();
  27. private readonly RD_TRIG _trigCassetteDoor = new RD_TRIG();
  28. private readonly RD_TRIG _trigRobotWafer = new RD_TRIG();
  29. private readonly bool _dOLEDLight = DeviceDefineManager.Instance.GetValue<bool>("DOLEDLight") ?? false;
  30. private readonly bool _noMaintenanceSignal = DeviceDefineManager.Instance.GetValue<bool>("NoMaintenanceSignal") ?? false;
  31. private readonly bool _noNoDoorOpenSignal = DeviceDefineManager.Instance.GetValue<bool>("NoDoorOpenSignal") ?? false;
  32. private readonly bool _MaintenanceMode = DeviceDefineManager.Instance.GetValue<bool>("MaintenanceSignal") ?? false;
  33. private readonly bool _EfemDoorOpen = DeviceDefineManager.Instance.GetValue<bool>("EfemDoorOpenSignal") ?? false;
  34. private readonly RD_TRIG _trigWaterLeakNormalTOPM = new RD_TRIG();
  35. private readonly RD_TRIG _trigCDAPressureOKTOPM = new RD_TRIG();
  36. private readonly R_TRIG _trigIONCDAPressureON = new R_TRIG();
  37. private readonly R_TRIG _trigIONAlarmSIGNALON = new R_TRIG();
  38. private readonly R_TRIG _trigWaterFlowSWON = new R_TRIG();
  39. private readonly R_TRIG _trigIONCDAPressureOFF = new R_TRIG();
  40. private readonly R_TRIG _trigIONAlarmSIGNALOFF = new R_TRIG();
  41. private readonly R_TRIG _trigWaterFlowSWOFF = new R_TRIG();
  42. private uint data2;
  43. private int _fFUSettingKnob;
  44. private readonly int[] _speedTable = new[] { 0,200,300,400,500,550,600,650,700,750,800 };
  45. public int IONCDAPressureSWHandler
  46. {
  47. get
  48. {
  49. return SC.GetValue<int>("System.IONCDAPressureSWHandler");
  50. }
  51. }
  52. public int IONAlarmSIGNALHandler
  53. {
  54. get
  55. {
  56. return SC.GetValue<int>("System.IONAlarmSIGNALHandler");
  57. }
  58. }
  59. public int WaterFlowSWHandler
  60. {
  61. get
  62. {
  63. return SC.GetValue<int>("System.WaterFlowSWHandler");
  64. }
  65. }
  66. public RD_TRIG TrigMaintenance
  67. {
  68. get
  69. {
  70. return _trigMaintenance;
  71. }
  72. }
  73. public RD_TRIG AirForRobotTrig
  74. {
  75. get
  76. {
  77. return _airForRobotTrig;
  78. }
  79. }
  80. public RD_TRIG AirForLoadPortTrig
  81. {
  82. get
  83. {
  84. return _airForLoadPortTrig;
  85. }
  86. }
  87. public RD_TRIG VacuumErrorTrig
  88. {
  89. get
  90. {
  91. return _vacuumErrorTrig;
  92. }
  93. }
  94. public RD_TRIG FfuErrorTrig
  95. {
  96. get
  97. {
  98. return _ffu1ErrorTrig.R || _ffu1ErrorTrig.T ? _ffu1ErrorTrig : _ffu2ErrorTrig;
  99. }
  100. }
  101. public RD_TRIG IonizorErrorTrig
  102. {
  103. get
  104. {
  105. return _ionizorErrorTrig;
  106. }
  107. }
  108. public RD_TRIG SensorFlowWarning
  109. {
  110. get
  111. {
  112. return _flowWarningTrig;
  113. }
  114. }
  115. public RD_TRIG LeakWarningTrig
  116. {
  117. get
  118. {
  119. return _leakWarningTrig;
  120. }
  121. }
  122. public R_TRIG SignalTowerTrig
  123. {
  124. get
  125. {
  126. return signalTowerTrig;
  127. }
  128. }
  129. public enum HandlerState
  130. {
  131. ByPass,
  132. ON,
  133. OFF
  134. }
  135. public EquipmentMonitor() :
  136. base("System", "EquipmentMonitor", "EquipmentMonitor", "EquipmentMonitor")
  137. {
  138. }
  139. public bool Initialize()
  140. {
  141. //if (_dOLEDLight)
  142. //{
  143. // DeviceModel.TrigLEDLight.SetTrigger(true, out _);
  144. //}
  145. Subscriptions();
  146. return true;
  147. }
  148. private bool _StopIonizerWork;
  149. public bool StopIonizerWork
  150. {
  151. get
  152. {
  153. if(SC.ContainsItem("System.StopIonizerWorkingEnable"))
  154. return SC.GetValue<bool>("System.StopIonizerWorkingEnable");
  155. return false;
  156. }
  157. set
  158. {
  159. _StopIonizerWork = value;
  160. }
  161. }
  162. private readonly R_TRIG _trigStopIonizerAtFirst = new R_TRIG();
  163. public void Monitor()
  164. {
  165. if (!_noMaintenanceSignal && !_noNoDoorOpenSignal)
  166. {
  167. _trigMaintenance.CLK = (_MaintenanceMode ? DeviceModel.SensorMaintenanceMode.Value : !DeviceModel.SensorMaintenanceMode.Value)
  168. || (_EfemDoorOpen ? DeviceModel.SensorEFEMSideDoorClosed.Value : !DeviceModel.SensorEFEMSideDoorClosed.Value)
  169. /*|| DeviceModel.SensorTeachingPendantInUse.Value*/;
  170. }
  171. if (_flowWarningTrig.T) EV.PostMessage("System", EventEnum.DefaultAlarm, "Flow Warning");
  172. if (_leakWarningTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Leak Warning");
  173. if (_airForRobotTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Air supply for Robot pressure error");
  174. if (_airForLoadPortTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Air supply for Load Port pressure error");
  175. if (_vacuumErrorTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "Vacuum supply for system pressure error");
  176. //if (_ffu1ErrorTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "FFU1 error");
  177. //if (_ffu2ErrorTrig.R) EV.PostMessage("System", EventEnum.DefaultAlarm, "FFU1 error");
  178. if(_airForRobotTrig.R || _airForLoadPortTrig.R || _vacuumErrorTrig.R)
  179. Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.ERROR);
  180. if (_trigMaintenance.R) Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.SetMaintenanceMode);
  181. if (_trigMaintenance.T) Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.SetManualMode);
  182. if (SC.GetStringValue("System.EFEMNUM") == "005")
  183. {
  184. _trigWaterLeakNormalTOPM.CLK = DeviceModel.SensorEFEMPowerON.Value && DeviceModel.SensorWaterLeakSW.Value;
  185. if (_trigWaterLeakNormalTOPM.R)
  186. {
  187. DeviceModel.TrigWaterLeakOkToPM.SetTrigger(true, out _);
  188. }
  189. if (_trigWaterLeakNormalTOPM.T)
  190. {
  191. DeviceModel.TrigWaterLeakOkToPM.SetTrigger(false, out _);
  192. }
  193. _trigCDAPressureOKTOPM.CLK = DeviceModel.SensorEFEMPowerON.Value && DeviceModel.SensorCDAPressureSW.Value;
  194. if (_trigCDAPressureOKTOPM.R)
  195. {
  196. DeviceModel.TrigCDAPressureOkToPM.SetTrigger(true, out _);
  197. }
  198. if (_trigCDAPressureOKTOPM.T)
  199. {
  200. DeviceModel.TrigCDAPressureOkToPM.SetTrigger(false, out _);
  201. }
  202. }
  203. _fFUSettingKnob = SC.ContainsItem("System.FFUSpeedSet")
  204. ? SC.GetValue<int>("System.FFUSpeedSet")
  205. : 3;
  206. //DeviceModel.TrigRobotAndPreAlignerHold.SetTrigger(!_trigMaintenance.M, out _);
  207. //_trigRobotWafer.CLK = DeviceModel.SensorRobotFork1WaferOn.Value;
  208. _trigStopIonizerAtFirst.CLK = true;
  209. if (_trigStopIonizerAtFirst.Q)
  210. {
  211. //if (DeviceModel.TrigIonizerInterrupt!=null&& SC.ContainsItem("System.StopIonizerWorkingEnable"))
  212. //{
  213. // if (DeviceModel.TrigIonizerInterrupt.Value != SC.GetValue<bool>("System.StopIonizerWorkingEnable"))
  214. // SC.SetItemValue("System.StopIonizerWorkingEnable", DeviceModel.TrigIonizerInterrupt.Value);
  215. //}
  216. if (SC.GetValue<int>("LoadPort.LP1.CstType")==1)
  217. {
  218. if (DeviceModel.SensorCstDoorClosed.Value && !DEVICE.GetDevice<LoadPortBaseDevice>(ModuleName.LP1.ToString()).IsWaferProtrude)
  219. {
  220. DeviceModel.TrigSafetytoSMIF1.SetTrigger(true, out _);
  221. }
  222. }
  223. }
  224. if (DeviceModel.TrigIonizerInterrupt != null && !DeviceModel.TrigIonizerInterrupt.Value)
  225. {
  226. //_trigIONAlarmSIGNAL.CLK = DeviceModel.SensorIONAlarmSIGNAL == null ? false : !DeviceModel.SensorIONAlarmSIGNAL.Value;
  227. //if (_trigIONAlarmSIGNAL.R)
  228. //{
  229. // EV.PostMessage("System", EventEnum.DefaultAlarm, "IONAlarmSIGNAL occur error");
  230. //}
  231. switch (IONAlarmSIGNALHandler)
  232. {
  233. case (int)HandlerState.ON:
  234. {
  235. _trigIONAlarmSIGNALON.CLK = DeviceModel.SensorIONAlarmSIGNAL.Value;
  236. if (_trigIONAlarmSIGNALON.Q)
  237. {
  238. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONAlarmSIGNAL occur error");
  239. }
  240. }
  241. break;
  242. case (int)HandlerState.OFF:
  243. {
  244. _trigIONAlarmSIGNALON.CLK = !DeviceModel.SensorIONAlarmSIGNAL.Value;
  245. if (_trigIONAlarmSIGNALON.Q)
  246. {
  247. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONAlarmSIGNAL occur error");
  248. }
  249. }
  250. break;
  251. }
  252. }
  253. //else
  254. // _trigIONAlarmSIGNAL.RST = true;
  255. if (DeviceModel.TrigIonizerInterrupt != null && DeviceModel.TrigIonizerInterrupt.Value != StopIonizerWork)
  256. {
  257. DeviceModel.TrigIonizerInterrupt.SetTrigger(StopIonizerWork, out _);
  258. }
  259. if (Singleton<EfemEntity>.Instance.IsOnlineMode)
  260. {
  261. if(_trigMaintenance.R || _trigMaintenance.T ||
  262. _airForLoadPortTrig.R || _airForLoadPortTrig.T ||
  263. _airForRobotTrig.R || _airForRobotTrig.T ||
  264. _vacuumErrorTrig.R || _vacuumErrorTrig.T ||
  265. _ffu1ErrorTrig.R || _ffu1ErrorTrig.T || _ffu2ErrorTrig.R || _ffu2ErrorTrig.T ||
  266. _ionizorErrorTrig.R || _ionizorErrorTrig.T ||
  267. _flowWarningTrig.T || _leakWarningTrig.R ||
  268. _trigCassetteDoor.T ||
  269. _trigRobotWafer.R || _trigRobotWafer.T
  270. )
  271. {
  272. Singleton<EfemEntity>.Instance.SendSigStatEvent(ModuleName.System);
  273. }
  274. }
  275. switch (IONCDAPressureSWHandler)
  276. {
  277. case (int)HandlerState.ON:
  278. {
  279. _trigIONCDAPressureON.CLK = DeviceModel.SensorIONCDAPressureSW.Value;
  280. if (_trigIONCDAPressureON.Q)
  281. {
  282. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONCDAPressureSW occur error");
  283. }
  284. }
  285. break;
  286. case (int)HandlerState.OFF:
  287. {
  288. _trigIONCDAPressureOFF.CLK = !DeviceModel.SensorIONCDAPressureSW.Value;
  289. if (_trigIONCDAPressureOFF.Q)
  290. {
  291. EV.PostMessage("System", EventEnum.DefaultAlarm, "IONCDAPressureSW occur error");
  292. }
  293. }
  294. break;
  295. }
  296. switch (WaterFlowSWHandler)
  297. {
  298. case (int)HandlerState.ON:
  299. {
  300. _trigWaterFlowSWON.CLK = DeviceModel.SensorWaterFlowSW.Value;
  301. if (_trigWaterFlowSWON.Q)
  302. {
  303. EV.PostMessage("System", EventEnum.DefaultAlarm, "WaterFlowSW occur error");
  304. }
  305. }
  306. break;
  307. case (int)HandlerState.OFF:
  308. {
  309. _trigWaterFlowSWOFF.CLK = !DeviceModel.SensorWaterFlowSW.Value;
  310. if (_trigWaterFlowSWOFF.Q)
  311. {
  312. EV.PostMessage("System", EventEnum.DefaultAlarm, "WaterFlowSW occur error");
  313. }
  314. }
  315. break;
  316. }
  317. if (signalTowerTrig.Q)
  318. {
  319. data2 = Singleton<EfemEntity>.Instance.GetSigStatData2(ModuleName.System);
  320. signalTowerTrig.RST = true;
  321. if (Singleton<EfemEntity>.Instance.IsOnlineMode)
  322. Singleton<EfemEntity>.Instance.SendSigStatEvent(ModuleName.System);
  323. }
  324. }
  325. public void Terminate()
  326. {
  327. //if (_dOLEDLight)
  328. //{
  329. // DeviceModel.TrigLEDLight.SetTrigger(false, out _);
  330. //}
  331. }
  332. public void Reset()
  333. {
  334. _trigWaterFlowSWOFF.RST = true;
  335. _trigWaterFlowSWON.RST = true;
  336. _trigIONCDAPressureOFF.RST = true;
  337. _trigIONCDAPressureON.RST = true;
  338. _trigIONAlarmSIGNALON.RST = true;
  339. _trigIONAlarmSIGNALOFF.RST = true;
  340. }
  341. private void Subscriptions()
  342. {
  343. //DATA.Subscribe("Robot.WaferSize", () =>
  344. // {
  345. // return WaferManager.Instance.GetWaferSize(ModuleName.Robot, 0).ToString();
  346. // });
  347. }
  348. }
  349. }