SimulatorSystem.cs 11 KB

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