SimulatorSystem.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using System;
  2. using System.Configuration;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Aitex.Core.RT.IOCore;
  6. using Aitex.Core.RT.Log;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.Util;
  9. using EfemSimulator.Device.SmartReaderSimulator;
  10. namespace EfemSimulator.SimulatorIo
  11. {
  12. public class SimulatorSystem : Singleton<SimulatorSystem>
  13. {
  14. private PeriodicJob _thread;
  15. Random _rd = new Random();
  16. private string VersionNo;
  17. public SimulatorSystem()
  18. {
  19. VersionNo = ConfigurationManager.AppSettings["VersionNumber"].ToString();
  20. }
  21. public void Initialize()
  22. {
  23. _thread = new PeriodicJob(100, OnMonitor, nameof(SimulatorSystem), true);
  24. //var smi1= new SmartReaderSimulator();
  25. //smi1.InitializeSimulator("COM6");
  26. //var smi2 = new SmartReaderSimulator();
  27. //smi2.InitializeSimulator("COM8");
  28. Singleton<SmartReaderSimulator>.Instance.InitializeSimulator("COM6");
  29. //Singleton<SmartReaderSimulator>.Instance.InitializeSimulator("COM8");
  30. switch (VersionNo)
  31. {
  32. case "006":
  33. SetDefaultValue1();
  34. break;
  35. default:
  36. SetDefaultValue();
  37. break;
  38. }
  39. }
  40. /// <summary>
  41. /// 006 DefaultValue
  42. /// </summary>
  43. private void SetDefaultValue1()
  44. {
  45. IO.DI["DI_FFUAlarm"].Value = true;
  46. IO.DI["DI_CDAPressureSW"].Value = true;
  47. IO.DI["DI_VACPressureSW"].Value = true;
  48. IO.DI["DI_IONCDAPressureSW"].Value = true;
  49. IO.DI["DI_IONAlarmSignal"].Value = true;
  50. IO.DI["DI_EFEMSideDoorClosed"].Value = true;
  51. IO.DI["DI_RunMode"].Value = false;
  52. IO.DI["DI_EFEMPowerON"].Value = true;
  53. IO.DI["DI_PA/FLPDoorClosed"].Value = true;
  54. IO.DI["DI_PMASystemInterlock"].Value = true;
  55. IO.DI["DI_PMBSystemInterlock"].Value = true;
  56. IO.DI["DI_RobotEMSToEFEM"].Value = true;
  57. IO.DI["DI_RBNotExtendToLP1"].Value = true;
  58. IO.DI["DI_RBNotExtendToLP2"].Value = true;
  59. IO.DI["DI_SafeGratingSensorIN1"].Value = true;
  60. IO.DI["DI_LP1OperationStatus"].Value = true;
  61. IO.DI["DI_LP1FoupOpen"].Value = true;
  62. IO.DI["DI_LP1FoupPlacement"].Value = true;
  63. IO.DI["DI_LP1Ready"].Value = true;
  64. IO.DI["DI_LP1Presence"].Value = true;
  65. IO.DI["DI_LP2OperationStatus"].Value = true;
  66. IO.DI["DI_LP2FoupOpen"].Value = true;
  67. IO.DI["DI_LP2FoupPlacement"].Value = true;
  68. IO.DI["DI_LP2Ready"].Value = true;
  69. IO.DI["DI_LP2Presence"].Value = true;
  70. }
  71. private void SetDefaultValue()
  72. {
  73. IO.DI["DI_WaterLeakSW"].Value = true;
  74. IO.DI["DI_WaterFlowSW"].Value = true;
  75. IO.DI["DI_FFUalarm"].Value = true;
  76. IO.DI["DI_CDAPressureSW"].Value = true;
  77. IO.DI["DI_VACPressureSW"].Value = true;
  78. IO.DI["DI_IONCDAPressureSW"].Value = true;
  79. IO.DI["DI_IONAlarmSIGNAL"].Value = true;
  80. IO.DI["DI_EFEMSideDoorClosed"].Value = true;
  81. IO.DI["DI_MaintenanceMode"].Value = false;
  82. IO.DI["DI_EFEMPowerON"].Value = true;
  83. IO.DI["DI_PMASystemInterlock"].Value = true;
  84. // if (SC.GetStringValue("System.EFEMNUM") == "002")
  85. {
  86. IO.DI["DI_RobotEMStoEFEM"].Value = true;
  87. IO.DI["DI_RobotRemotetoEFEM(spareInterfaceIO)"].Value = false;
  88. IO.DI["DI_RBNotExtendSIMF1"].Value = true;
  89. }
  90. if (VersionNo != "005")
  91. {
  92. IO.DI["DI_EFEMCSTDoorClosed"].Value = true;
  93. IO.DI["DI_SMIF1PODOPEN"].Value = true;
  94. IO.DI["DI_SMIF1PODPRESENT"].Value = true;
  95. IO.DI["DI_SMIF1READY"].Value = true;
  96. IO.DI["DI_SMIF2PODOPEN"].Value = true;
  97. IO.DI["DI_SMIF2PODPRESENT"].Value = true;
  98. IO.DI["DI_SMIF2READY"].Value = true;
  99. IO.DI["DI_GratingSensorIN1"].Value = true;
  100. IO.DI["DI_PMBSystemInterlock"].Value = true;
  101. IO.DI["DI_RBNotExtendSIMF2"].Value = true;
  102. }
  103. else
  104. {
  105. IO.DI["DI_4InchCstPresence"].Value = true;
  106. IO.DI["DI_4InchCstProtrusion1"].Value = true;
  107. IO.DI["DI_6InchCstPresence"].Value = true;
  108. IO.DI["DI_6InchCstProtrusion1"].Value = true;
  109. IO.DI["DI_8InchCstPresence"].Value = true;
  110. IO.DI["DI_8InchCstProtrusion1"].Value = true;
  111. IO.DI["DI_CstDoorClosed"].Value = true;
  112. }
  113. //else
  114. //{
  115. // IO.DI["DI_RobotEMStoEFEM"].Value = false;
  116. // IO.DI["DI_RobotRemotetoEFEM(spareInterfaceIO)"].Value = true;
  117. //}
  118. //IO.DI["DI_CassetteDoorOpen"].Value = true;
  119. //IO.DI["DI_DoorOpen"].Value = true;
  120. ////IO.DI["DI_RobotFork1WaferOn"].Value = true;
  121. ////IO.DI["DI_PreAlignerWaferOn"].Value = true;
  122. ////IO.DI["DI_LoadlockWaferOn"].Value = true;
  123. //IO.DI["DI_RobotReady"].Value = true;
  124. //IO.DI["DI_RobotError"].Value = true;
  125. //IO.DI["DI_TeachingPendantInUse"].Value = true;
  126. // IO.DI["DI_Loadport1OperationStatus"].Value = true;
  127. //IO.DI["DI_Loadport2OperationStatus"].Value = true;
  128. // IO.DI["DI_Loadport3OperationStatus"].Value = true;
  129. // IO.DI["DI_Loadport4OperationStatus"].Value = true;
  130. //IO.DI["DI_FFU1Error"].Value = true;
  131. //IO.DI["DI_FFU2Error"].Value = true;
  132. //IO.DI["DI_IonizorError"].Value = true;
  133. //IO.DI["DI_CoolingWater1FlowError"].Value = true;
  134. //IO.DI["DI_AirPressureErrorForRobot"].Value = true;
  135. //IO.DI["DI_VaccumError"].Value = true;
  136. //IO.DI["DI_CoolingStage1DI1"].Value = true;
  137. //IO.DI["DI_CoolingStage1DI2"].Value = false;
  138. //IO.DI["DI_CoolingStage1DI3"].Value = false;
  139. //IO.DI["DI_CoolingStage1DI4"].Value = true;
  140. //IO.DI["DI_CoolingStage1DI5"].Value = true;
  141. //IO.DI["DI_CoolingStage1DI6"].Value = false;
  142. //IO.DI["DI_CoolingStage2DI1"].Value = false;
  143. //IO.DI["DI_CoolingStage2DI2"].Value = false;
  144. //IO.DI["DI_CoolingStage2DI3"].Value = true;
  145. //IO.DI["DI_CoolingStage2DI4"].Value = true;
  146. //IO.DI["DI_CoolingStage2DI5"].Value = true;
  147. //IO.DI["DI_CoolingStage2DI6"].Value = false;
  148. }
  149. private bool OnMonitor()
  150. {
  151. try
  152. {
  153. switch (VersionNo)
  154. {
  155. case "006":
  156. break;
  157. default:
  158. MonitorPin();
  159. break;
  160. }
  161. }
  162. catch (Exception e)
  163. {
  164. LOG.Write(e);
  165. }
  166. return true;
  167. }
  168. private void MonitorPin()
  169. {
  170. SetCylinder("DO_CoolingBuffer1Inch3Up", "DO_CoolingBuffer1Inch3Down", "DI_CoolingBuffer1Inch3Up", "DI_CoolingBuffer1Inch3Down");
  171. SetCylinder("DO_CoolingBuffer1Inch4Up", "DO_CoolingBuffer1Inch4Down", "DI_CoolingBuffer1Inch4Up", "DI_CoolingBuffer1Inch4Down");
  172. SetCylinder("DO_CoolingBuffer1PinUp", "DO_CoolingBuffer1PinDown", "DI_CoolingBuffer1PinUp", "DI_CoolingBuffer1PinDown");
  173. if (VersionNo != "005")
  174. {
  175. SetCylinder("DO_CoolingBuffer2Inch3Up", "DO_CoolingBuffer2Inch3Down", "DI_CoolingBuffer2Inch3Up", "DI_CoolingBuffer2Inch3Down");
  176. SetCylinder("DO_CoolingBuffer2Inch4Up", "DO_CoolingBuffer2Inch4Down", "DI_CoolingBuffer2Inch4Up", "DI_CoolingBuffer2Inch4Down");
  177. SetCylinder("DO_CoolingBuffer2PinUp", "DO_CoolingBuffer2PinDown", "DI_CoolingBuffer2PinUp", "DI_CoolingBuffer2PinDown");
  178. SetCylinder("DO_Buffer3Inch3Up", "DO_Buffer3Inch3Down", "DI_Buffer3Inch3Up", "DI_Buffer3Inch3Down");
  179. SetCylinder("DO_Buffer3Inch4Up", "DO_Buffer3Inch4Down", "DI_Buffer3Inch4Up", "DI_Buffer3Inch4Down");
  180. SetCylinder("DO_Buffer3PinUp", "DO_Buffer3PinDown", "DI_Buffer3PinUp", "DI_Buffer3PinDown");
  181. SetCylinder("DO_Buffer4Inch3Up", "DO_Buffer4Inch3Down", "DI_Buffer4Inch3Up", "DI_Buffer4Inch3Down");
  182. SetCylinder("DO_Buffer4Inch4Up", "DO_Buffer4Inch4Down", "DI_Buffer4Inch4Up", "DI_Buffer4Inch4Down");
  183. SetCylinder("DO_Buffer4PinUp", "DO_Buffer4PinDown", "DI_Buffer4PinUp", "DI_Buffer4PinDown");
  184. }
  185. }
  186. private void SetCylinder(string do1, string do2, string di1, string di2)
  187. {
  188. if (IO.DO[do1].Value != IO.DO[do2].Value)
  189. {
  190. //if (IO.DI[di1].Value != IO.DO[do1].Value &&
  191. // IO.DI[di2].Value != IO.DO[do2].Value)
  192. //{
  193. Thread.Sleep(200);
  194. IO.DI[di1].Value = IO.DO[do1].Value;
  195. IO.DI[di2].Value = IO.DO[do2].Value;
  196. //}
  197. }
  198. }
  199. public void Terminate()
  200. {
  201. _thread.Stop();
  202. }
  203. }
  204. }