using EasyModbus; using System; using System.Collections.Generic; using System.Threading; namespace SA_LTT.Module { /* * AI AO DI*7 DO*5 */ public class Crevis : ModbusClient { //ST-1228 / 8 public enum DigitalInput : int { SPARE_00, CP_BOX_OPEN, SPARE_02, SPARE_03, EMO_SW_1, EMO_SW_2, EMO_SW_3, EMO_SW_4, DOOR_LOCK_OPEN_1, DOOR_LOCK_OPEN_2, DOOR_LOCK_OPEN_3, DOOR_LOCK_OPEN_4, SERVO_MC_STATUS, VACUUM_MC_STATUS, SPARE_14, SPARE_15, CST_DETECTOR_1, CST_DETECTOR_2, WATER_LEAK_LASER, WATER_LEAK_CHILLER, SMOKE_DETECTOR_CP_BOX, SPARE_21, SPARE_22, SPARE_23, CMB_GATE_OPEN, CMB_GATE_CLOSE, WAFER_UP_CYLINDER, WAFER_DOWN_CYLINDER, LASER_SHUTTER_OPEN, LASER_SHUTTER_CLOSE, SPARE_30, SPARE_31, MAIN_CDA_PRESSURE, MAIN_VAC_PRESSURE, SPARE_34, MAIN_CDA_FLOW, CMB_VACUUM_PRESSURE, SPARE_37, SPARE_38, SPARE_39, FAN_1_RUN_CP_BOX_IN, FAN_2_RUN_CP_BOX_IN, FAN_3_RUN_CP_BOX_IN, SPARE_43, FAN_4_RUN_CP_BOX_OUT, FAN_5_RUN_CP_BOX_OUT, FAN_6_RUN_CP_BOX_OUT, SPARE_47, FAN_1_RUN_CHILLER_OUT, FAN_2_RUN_CHILLER_OUT, FAN_3_RUN_CHILLER_OUT, SPARE_51, SPARE_52, SPARE_53, SPARE_54, SPARE_55, } //ST-2318 / 8 public enum DigitalOutput : int { SPARE_00, SIGNAL_TOWER_RED, SIGNAL_TOWER_YELLOW, SIGNAL_TOWER_GREEN, BUZZER_1, BUZZER_2, BUZZER_3, BUZZER_4, FLUORESCENT_LAMP_OFF, SERVO_CONTROL_OFF, LASER_LED_BOARD_ON, SPARE_11, VACUUM_PUMP_MC_ON, DOOR_OPEN_RELEASE_1, DOOR_OPEN_RELEASE_2, SPARE_15, CMB_GATE_OPEN_VALVE, CMB_GATE_CLOSE_VALVE, N2_CHAMBER_VALVE_ON_SOL, N2_MFC_VALVE_ON_SOL, CMB_BYPASS_ON_SOL, WAFER_UP_SOL, WAFER_DOWN_SOL, LASER_SHUTTER_OPEN_SOL, AIR_BLOW_ON, SPARE_26, SPARE_27, VAC_CHUCK_ON, SPARE_28, SPARE_29, SPARE_30, SPARE_31, SPARE_32, SPARE_33, SPARE_34, SPARE_35, SPARE_36, SPARE_37, SPARE_38, SPARE_39, } //ST-3444 (Analog input : 0 ~ 10V, Resolution 14bit, 0.6mV/Bit) / 4 public enum AnalogInput : int { MFC_FLOW_OUT = 0, SPARE_01 = 10, SPARE_02 = 20, SPARE_03 = 30, } //ST-4424 (Analog output : 0 ~ 10V, Resolution 12bit, 2.44mV/Bit) / 4 public enum AnalogOutput : int { MFC_SET_POINT = 0, SPARE_01 = 10, SPARE_02 = 20, SPARE_03 = 30, } private int _digitalInputStartAddress = 0x0040; private int _digitalOutputStartAddress = 0x1040; private int _analogInputStartAddress = 0x0000; private int _analogOutputStartAddress = 0x0800; public Dictionary DigitalInputs = new Dictionary(); public Dictionary DigitalOutputs = new Dictionary(); public Dictionary AnalogInputs = new Dictionary(); public Dictionary AnalogOutputs = new Dictionary(); private Equipment _equipment; private Thread t_statusUpdate; object dataLock = new object(); public Crevis(Equipment equipment) { IPAddress = "192.168.123.1"; foreach (DigitalInput input in Enum.GetValues(typeof(DigitalInput))) { DigitalInputs.Add(input, false); } foreach (DigitalOutput output in Enum.GetValues(typeof(DigitalOutput))) { DigitalOutputs.Add(output, false); } foreach (AnalogInput inputs in Enum.GetValues(typeof(AnalogInput))) { AnalogInputs.Add(inputs, 0); } foreach (AnalogOutput output in Enum.GetValues(typeof(AnalogOutput))) { AnalogOutputs.Add(output, 0); } _equipment = equipment; t_statusUpdate = new Thread(statusUpdate); t_statusUpdate.Start(); } public void statusUpdate() { while (_equipment.IsDisposed == false) { try { Thread.Sleep(10); if (Connected) { if(ReadDigitalInputs() == false) { Disconnect(); continue; } if(ReadDigitalOutputs() == false) { Disconnect(); continue; } if (ReadAnalogInputs() == false) { Disconnect(); continue; } if (ReadAnalogOutputs() == false) { Disconnect(); continue; } } else { if (_equipment.alarmManager.OccurredAlarms.Exists(x => x.Code == AlarmCode.AL_0050_CREVIS_DISCONNECTED)) { } else { if (Connect() == false) { _equipment.alarmManager.Occur(AlarmCode.AL_0050_CREVIS_DISCONNECTED); } } } } catch (Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); } } } public new bool Connect() { try { base.Connect(); return true; } catch(Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); return false; } } public bool ReadDigitalInputs() { lock (dataLock) { try { bool[] readValue = ReadCoils(_digitalInputStartAddress, Enum.GetValues(typeof(DigitalInput)).Length); for (int i = 0; i < readValue.Length; i++) { DigitalInputs[(DigitalInput)i] = readValue[i]; } return true; } catch (Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); return false; } } } public bool ReadDigitalOutputs() { lock (dataLock) { try { bool[] readValue = ReadCoils(_digitalOutputStartAddress, Enum.GetValues(typeof(DigitalOutput)).Length); for (int i = 0; i < readValue.Length; i++) { DigitalOutputs[(DigitalOutput)i] = readValue[i]; } return true; } catch (Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); return false; } } } public bool ReadAnalogInputs() { lock (dataLock) { try { int[] serverResponse = ReadInputRegisters(_analogInputStartAddress, AnalogInputs.Keys.Count); int i = 0; foreach (AnalogInput input in Enum.GetValues(typeof(AnalogInput))) { AnalogInputs[input] = Math.Round(serverResponse[i] / 1638.0, 2); i++; } return true; } catch (Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); return false; } } } public bool ReadAnalogOutputs() { lock (dataLock) { try { int[] serverResponse = ReadInputRegisters(_analogOutputStartAddress, AnalogOutputs.Keys.Count); int i = 0; foreach (AnalogOutput output in Enum.GetValues(typeof(AnalogOutput))) { AnalogOutputs[output] = Math.Round(serverResponse[i] / 410.0, 2); i++; } return true; } catch (Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); return false; } } } public void WriteOutput(DigitalOutput digitalOutput, bool value) { lock (dataLock) { if (Connected) { WriteSingleCoil(_digitalOutputStartAddress + (int)digitalOutput, value); } } } public void WriteAnalog(AnalogOutput analogOutput, double value) { lock (dataLock) { if (Connected) { if(analogOutput == AnalogOutput.MFC_SET_POINT) { WriteSingleRegister(_analogOutputStartAddress + (int)analogOutput, Convert.ToInt32(value * 1000 / 2.44)); } } } } } }