using System; using System.Configuration; using System.Threading; using System.Threading.Tasks; using System.Windows.Media; using Aitex.Core.Backend; using Aitex.Core.RT.IOCore; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using EfemSimulator.Device.SmartReaderSimulator; namespace EfemSimulator.SimulatorIo { public class SimulatorSystem : Singleton { private PeriodicJob _thread; Random _rd = new Random(); private string VersionNo; public SimulatorSystem() { VersionNo = ConfigurationManager.AppSettings["VersionNumber"].ToString(); } public void Initialize() { _thread = new PeriodicJob(100, OnMonitor, nameof(SimulatorSystem), false); //var smi1= new SmartReaderSimulator(); //smi1.InitializeSimulator("COM6"); //var smi2 = new SmartReaderSimulator(); //smi2.InitializeSimulator("COM8"); Singleton.Instance.InitializeSimulator("COM6"); //Singleton.Instance.InitializeSimulator("COM8"); switch (VersionNo) { case "006": SetDefaultValue1(); break; default: SetDefaultValue(); break; } _thread.Start(); } /// /// 006 DefaultValue /// private void SetDefaultValue1() { IO.DI["DI_FFUAlarm"].Value = true; IO.DI["DI_CDAPressureSW"].Value = true; IO.DI["DI_VACPressureSW"].Value = true; IO.DI["DI_IONCDAPressureSW"].Value = true; IO.DI["DI_IONAlarmSignal"].Value = true; IO.DI["DI_EFEMSideDoorClosed"].Value = true; IO.DI["DI_RunMode"].Value = false; IO.DI["DI_EFEMPowerON"].Value = true; IO.DI["DI_PA/FLPDoorClosed"].Value = true; IO.DI["DI_PMASystemInterlock"].Value = true; IO.DI["DI_PMBSystemInterlock"].Value = true; IO.DI["DI_RobotEMSToEFEM"].Value = true; IO.DI["DI_RBNotExtendToLP1"].Value = true; IO.DI["DI_RBNotExtendToLP2"].Value = true; IO.DI["DI_SafeGratingSensorIN1"].Value = true; IO.DI["DI_LP1OperationStatus"].Value = true; IO.DI["DI_LP1FoupOpen"].Value = true; IO.DI["DI_LP1FoupPlacement"].Value = true; IO.DI["DI_LP1Ready"].Value = true; IO.DI["DI_LP1Presence"].Value = true; IO.DI["DI_LP2OperationStatus"].Value = true; IO.DI["DI_LP2FoupOpen"].Value = true; IO.DI["DI_LP2FoupPlacement"].Value = true; IO.DI["DI_LP2Ready"].Value = true; IO.DI["DI_LP2Presence"].Value = true; IO.DI["DI_FlipperTurnOverHorizontalSensor"].Value = true; IO.DI["DI_FlipperTurnOverMotorPosCompleted"].Value = true; IO.DI["DI_FlipperClampMotorPosCompleted"].Value = true; } private void SetDefaultValue() { IO.DI["DI_WaterLeakSW"].Value = true; IO.DI["DI_WaterFlowSW"].Value = true; IO.DI["DI_FFUalarm"].Value = true; IO.DI["DI_CDAPressureSW"].Value = true; IO.DI["DI_VACPressureSW"].Value = true; IO.DI["DI_IONCDAPressureSW"].Value = true; IO.DI["DI_IONAlarmSIGNAL"].Value = true; IO.DI["DI_EFEMSideDoorClosed"].Value = true; IO.DI["DI_MaintenanceMode"].Value = false; IO.DI["DI_EFEMPowerON"].Value = true; IO.DI["DI_PMASystemInterlock"].Value = true; // if (SC.GetStringValue("System.EFEMNUM") == "002") { IO.DI["DI_RobotEMStoEFEM"].Value = true; IO.DI["DI_RobotRemotetoEFEM(spareInterfaceIO)"].Value = false; IO.DI["DI_RBNotExtendSIMF1"].Value = true; } if (VersionNo != "005") { IO.DI["DI_EFEMCSTDoorClosed"].Value = true; IO.DI["DI_SMIF1PODOPEN"].Value = true; IO.DI["DI_SMIF1PODPRESENT"].Value = true; IO.DI["DI_SMIF1READY"].Value = true; IO.DI["DI_SMIF2PODOPEN"].Value = true; IO.DI["DI_SMIF2PODPRESENT"].Value = true; IO.DI["DI_SMIF2READY"].Value = true; IO.DI["DI_GratingSensorIN1"].Value = true; IO.DI["DI_PMBSystemInterlock"].Value = true; IO.DI["DI_RBNotExtendSIMF2"].Value = true; } else { IO.DI["DI_4InchCstPresence"].Value = true; IO.DI["DI_4InchCstProtrusion1"].Value = true; IO.DI["DI_6InchCstPresence"].Value = true; IO.DI["DI_6InchCstProtrusion1"].Value = true; IO.DI["DI_8InchCstPresence"].Value = true; IO.DI["DI_8InchCstProtrusion1"].Value = true; IO.DI["DI_CstDoorClosed"].Value = true; } //else //{ // IO.DI["DI_RobotEMStoEFEM"].Value = false; // IO.DI["DI_RobotRemotetoEFEM(spareInterfaceIO)"].Value = true; //} //IO.DI["DI_CassetteDoorOpen"].Value = true; //IO.DI["DI_DoorOpen"].Value = true; ////IO.DI["DI_RobotFork1WaferOn"].Value = true; ////IO.DI["DI_PreAlignerWaferOn"].Value = true; ////IO.DI["DI_LoadlockWaferOn"].Value = true; //IO.DI["DI_RobotReady"].Value = true; //IO.DI["DI_RobotError"].Value = true; //IO.DI["DI_TeachingPendantInUse"].Value = true; // IO.DI["DI_Loadport1OperationStatus"].Value = true; //IO.DI["DI_Loadport2OperationStatus"].Value = true; // IO.DI["DI_Loadport3OperationStatus"].Value = true; // IO.DI["DI_Loadport4OperationStatus"].Value = true; //IO.DI["DI_FFU1Error"].Value = true; //IO.DI["DI_FFU2Error"].Value = true; //IO.DI["DI_IonizorError"].Value = true; //IO.DI["DI_CoolingWater1FlowError"].Value = true; //IO.DI["DI_AirPressureErrorForRobot"].Value = true; //IO.DI["DI_VaccumError"].Value = true; //IO.DI["DI_CoolingStage1DI1"].Value = true; //IO.DI["DI_CoolingStage1DI2"].Value = false; //IO.DI["DI_CoolingStage1DI3"].Value = false; //IO.DI["DI_CoolingStage1DI4"].Value = true; //IO.DI["DI_CoolingStage1DI5"].Value = true; //IO.DI["DI_CoolingStage1DI6"].Value = false; //IO.DI["DI_CoolingStage2DI1"].Value = false; //IO.DI["DI_CoolingStage2DI2"].Value = false; //IO.DI["DI_CoolingStage2DI3"].Value = true; //IO.DI["DI_CoolingStage2DI4"].Value = true; //IO.DI["DI_CoolingStage2DI5"].Value = true; //IO.DI["DI_CoolingStage2DI6"].Value = false; } private bool OnMonitor() { try { switch (VersionNo) { case "006": MonitorFlipper(); break; default: MonitorPin(); break; } } catch (Exception e) { LOG.Write(e); } return true; } private void MonitorPin() { SetCylinder("DO_CoolingBuffer1Inch3Up", "DO_CoolingBuffer1Inch3Down", "DI_CoolingBuffer1Inch3Up", "DI_CoolingBuffer1Inch3Down"); SetCylinder("DO_CoolingBuffer1Inch4Up", "DO_CoolingBuffer1Inch4Down", "DI_CoolingBuffer1Inch4Up", "DI_CoolingBuffer1Inch4Down"); SetCylinder("DO_CoolingBuffer1PinUp", "DO_CoolingBuffer1PinDown", "DI_CoolingBuffer1PinUp", "DI_CoolingBuffer1PinDown"); if (VersionNo != "005") { SetCylinder("DO_CoolingBuffer2Inch3Up", "DO_CoolingBuffer2Inch3Down", "DI_CoolingBuffer2Inch3Up", "DI_CoolingBuffer2Inch3Down"); SetCylinder("DO_CoolingBuffer2Inch4Up", "DO_CoolingBuffer2Inch4Down", "DI_CoolingBuffer2Inch4Up", "DI_CoolingBuffer2Inch4Down"); SetCylinder("DO_CoolingBuffer2PinUp", "DO_CoolingBuffer2PinDown", "DI_CoolingBuffer2PinUp", "DI_CoolingBuffer2PinDown"); SetCylinder("DO_Buffer3Inch3Up", "DO_Buffer3Inch3Down", "DI_Buffer3Inch3Up", "DI_Buffer3Inch3Down"); SetCylinder("DO_Buffer3Inch4Up", "DO_Buffer3Inch4Down", "DI_Buffer3Inch4Up", "DI_Buffer3Inch4Down"); SetCylinder("DO_Buffer3PinUp", "DO_Buffer3PinDown", "DI_Buffer3PinUp", "DI_Buffer3PinDown"); SetCylinder("DO_Buffer4Inch3Up", "DO_Buffer4Inch3Down", "DI_Buffer4Inch3Up", "DI_Buffer4Inch3Down"); SetCylinder("DO_Buffer4Inch4Up", "DO_Buffer4Inch4Down", "DI_Buffer4Inch4Up", "DI_Buffer4Inch4Down"); SetCylinder("DO_Buffer4PinUp", "DO_Buffer4PinDown", "DI_Buffer4PinUp", "DI_Buffer4PinDown"); } } private void SetCylinder(string do1, string do2, string di1, string di2) { if (IO.DO[do1].Value != IO.DO[do2].Value) { //if (IO.DI[di1].Value != IO.DO[do1].Value && // IO.DI[di2].Value != IO.DO[do2].Value) //{ Thread.Sleep(200); IO.DI[di1].Value = IO.DO[do1].Value; IO.DI[di2].Value = IO.DO[do2].Value; //} } } private void MonitorFlipper() { //Grip(Clamp) if (IO.DO["DO_FlipperClampStepMotionStart"].Value && !IO.DO["DO_FlipperClampMotorClose/Open"].Value) { Thread.Sleep(300); IO.DI["DI_FlipperClampClosedSensor"].Value = true; IO.DI["DI_FlipperClampOpenedSensor"].Value = false; } //UnGrip(UnClamp) else if (IO.DO["DO_FlipperClampStepMotionStart"].Value && IO.DO["DO_FlipperClampMotorClose/Open"].Value) { Thread.Sleep(300); IO.DI["DI_FlipperClampClosedSensor"].Value = false; IO.DI["DI_FlipperClampOpenedSensor"].Value = true; } //Turn Over to 180° if (IO.DO["DO_FlipperTurnOverStepMotionStart"].Value && IO.DO["DO_FlipperTurnOverMotor0/180"].Value) { Thread.Sleep(300); IO.DI["DI_FlipperTurnOverHorizontalSensor"].Value = true; IO.DI["DI_FlipperTurnOverOriginSensor"].Value = false; } //Turn Over to 0° else if (IO.DO["DO_FlipperTurnOverStepMotionStart"].Value && !IO.DO["DO_FlipperTurnOverMotor0/180"].Value) { Thread.Sleep(300); IO.DI["DI_FlipperTurnOverHorizontalSensor"].Value = true; IO.DI["DI_FlipperTurnOverOriginSensor"].Value = true; } } public void Terminate() { _thread.Stop(); } } }