956 lines
43 KiB
C#
956 lines
43 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Diagnostics.Eventing.Reader;
|
|||
|
using Aitex.Core.RT.DataCenter;
|
|||
|
using Aitex.Core.RT.IOCore;
|
|||
|
using Aitex.Core.RT.Log;
|
|||
|
using Aitex.Core.Util;
|
|||
|
using Aitex.Core.WCF;
|
|||
|
using MECF.Framework.Common.PLC;
|
|||
|
using SicSimulator.Views;
|
|||
|
|
|||
|
namespace SicSimulator.Instances
|
|||
|
{
|
|||
|
public class SimulatorSystem : Singleton<SimulatorSystem>
|
|||
|
{
|
|||
|
private PeriodicJob _thread;
|
|||
|
|
|||
|
Random _rd = new Random();
|
|||
|
|
|||
|
public SimulatorSystem()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public void Initialize()
|
|||
|
{
|
|||
|
SetDefaultValue("PM1");
|
|||
|
SetDefaultValue("PM2");
|
|||
|
SetTMDefaultValue("TM");
|
|||
|
|
|||
|
Singleton<DataManager>.Instance.Initialize(false);
|
|||
|
|
|||
|
WcfServiceManager.Instance.Initialize(new Type[] { typeof(SimulatorAdsPlcService) });
|
|||
|
|
|||
|
_thread = new PeriodicJob(200, OnMonitor, nameof(SimulatorSystem), true);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void SetTMDefaultValue(string mod)
|
|||
|
{
|
|||
|
IO.DI["DI_DryPumpAlarm"].Value = true;
|
|||
|
IO.DI["DI_DryPumpWarning"].Value = true;
|
|||
|
IO.DI["DI_DryPumpRuning"].Value = true;
|
|||
|
IO.DI["DI_LLDoorClosed"].Value = true;
|
|||
|
IO.DI["DI_PreHeatStationDoorClosed"].Value = true;
|
|||
|
IO.DI["DI_ReactorADoorClosed"].Value = true;
|
|||
|
IO.DI["DI_TMLidClosed"].Value = true;
|
|||
|
IO.DI["DI_RobotOnBackPos"].Value = true;
|
|||
|
|
|||
|
IO.DI["DI_LLLidClosed"].Value = true;
|
|||
|
IO.DI["DI_BufferLidClosed"].Value = true;
|
|||
|
|
|||
|
|
|||
|
IO.DI["DI_TMSlowRoughOpen_FB"].Value = true;
|
|||
|
IO.DI["DI_TMFastRoughOpen_FB"].Value = true;
|
|||
|
IO.DI["DI_TMN2PurgeOpen_FB"].Value = true;
|
|||
|
IO.DI["DI_TMFastVentOpen_FB"].Value = true;
|
|||
|
IO.DI["DI_LLSlowRoughOpen_FB"].Value = true;
|
|||
|
IO.DI["DI_LLFastRoughOpen_FB"].Value = true;
|
|||
|
IO.DI["DI_LLSlowVentOpen_FB"].Value = true;
|
|||
|
IO.DI["DI_LLFastVentOpen_FB"].Value = true;
|
|||
|
|
|||
|
IO.DI["DI_DryPumpAlarm"].Value = true;
|
|||
|
IO.DI["DI_DryPumpWarning"].Value = true;
|
|||
|
|
|||
|
|
|||
|
IO.AI["AI_TMPressure"].Value = 300;
|
|||
|
IO.AI["AI_LLPressure"].Value = 0;
|
|||
|
|
|||
|
IO.DI["DI_TMUnderVac"].Value = true;
|
|||
|
}
|
|||
|
|
|||
|
private void SetDefaultValue(string mod)
|
|||
|
{
|
|||
|
|
|||
|
{
|
|||
|
IO.DI[$"{mod}.DI_DryPumpAlarm"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_DryPump1Warning"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_DryPump1Running"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_ServoReady"].Value = true;
|
|||
|
IO.AI[$"{mod}.AI_ForelinePress"].FloatValue = 1100f;
|
|||
|
IO.AI[$"{mod}.AI_ChamPress"].FloatValue = 1100f;
|
|||
|
IO.DI[$"{mod}.DI_EPV21_FB"].Value = true;
|
|||
|
}
|
|||
|
{
|
|||
|
IO.DI[$"{mod}.DI_ChamPressAboveATMSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_HeaterTempUp1680CSW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_ChamTopFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_DryPump1Running"].Value = true;
|
|||
|
}
|
|||
|
{
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_ChamLidPushButtonLocal"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamMoveBodyDown"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamMoveBodyFront"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamMoveBodyUpLatchFW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_ChamMoveBodyEndLatchBW"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_SHLidClosed"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_MiddleLidClosed"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_SHLidTighten1"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_MiddleLidTighten1"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_SHLidSwingLock"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_MiddleLidSwingLock"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_ConfinementRingDown"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_SHGasConnectorLoosen"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_SHGasConnectorTighten"].Value = true;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
IO.AO[$"{mod}.AO_ValveModeSetpoint"].FloatValue = (float)2;
|
|||
|
{
|
|||
|
IO.DI[$"{mod}.DI_ChamLidClosed"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamCabDoorClosed"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamPressAboveATMSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamAtSafeProcessPressSW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_DORPressATMSW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_HeaterTempBelow900CSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ConfinementRingUp"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_SHFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamTopFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamMiddleFlow1SW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_BottomPlateFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamBottomFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_PowerRod1FlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_PowerRod2FlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ForelineFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_InSituFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_SideWallPowerRodFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_TransformerFlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_GBH2DetectorSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_GBHCLDetectorSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_GBDoorClosed"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_PumpExhaustPressSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_PMATMSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ScrubberIntlkSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_FacilityIntlkSW"].Value = true;
|
|||
|
}
|
|||
|
#region TC
|
|||
|
|
|||
|
//IO.AI[$"{mod}.AI_L1WorkingOP"].FloatValue = 10;
|
|||
|
//IO.AI[$"{mod}.AI_L2WorkingOP"].FloatValue = 10;
|
|||
|
//IO.AI[$"{mod}.AI_L3WorkingOP"].FloatValue = 10;
|
|||
|
//IO.AI[$"{mod}.AI_L1PV"].FloatValue = 20;
|
|||
|
//IO.AI[$"{mod}.AI_L2PV"].FloatValue = 20;
|
|||
|
//IO.AI[$"{mod}.AI_L3PV"].FloatValue = 20;
|
|||
|
//IO.AI[$"{mod}.AI_L1TempHighAlarm"].FloatValue = 30;
|
|||
|
//IO.AI[$"{mod}.AI_L2TempHighAlarm"].FloatValue = 30;
|
|||
|
//IO.AI[$"{mod}.AI_L3TempHighAlarm"].FloatValue = 30;
|
|||
|
//IO.AI[$"{mod}.AI_L1TempLowAlarm"].FloatValue = 25;
|
|||
|
//IO.AI[$"{mod}.AI_L2TempLowAlarm"].FloatValue = 25;
|
|||
|
//IO.AI[$"{mod}.AI_L3TempLowAlarm"].FloatValue = 25;
|
|||
|
|
|||
|
//IO.AO[$"{mod}.AO_L1LoopMode"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L2LoopMode"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L3LoopMode"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L1TargetSP"].FloatValue = 20;
|
|||
|
//IO.AO[$"{mod}.AO_L2TargetSP"].FloatValue = 20;
|
|||
|
//IO.AO[$"{mod}.AO_L3TargetSP"].FloatValue = 20;
|
|||
|
//IO.AO[$"{mod}.AO_L1TargetOP"].FloatValue = 30;
|
|||
|
//IO.AO[$"{mod}.AO_L2TargetOP"].FloatValue = 30;
|
|||
|
//IO.AO[$"{mod}.AO_L3TargetOP"].FloatValue = 30;
|
|||
|
//IO.AO[$"{mod}.AO_L1IPCST"].FloatValue = 40;
|
|||
|
//IO.AO[$"{mod}.AO_L2IPCST"].FloatValue = 40;
|
|||
|
//IO.AO[$"{mod}.AO_L3IPCST"].FloatValue = 40;
|
|||
|
//IO.AO[$"{mod}.AO_L1IPCST"].FloatValue = 70;
|
|||
|
//IO.AO[$"{mod}.AO_L2IPCST"].FloatValue = 70;
|
|||
|
//IO.AO[$"{mod}.AO_L3IPCST"].FloatValue = 70;
|
|||
|
//IO.AO[$"{mod}.AO_TCPyroMode"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L1TempHighLimit"].FloatValue = 90;
|
|||
|
//IO.AO[$"{mod}.AO_L2TempHighLimit"].FloatValue = 90;
|
|||
|
//IO.AO[$"{mod}.AO_L3TempHighLimit"].FloatValue = 90;
|
|||
|
//IO.AO[$"{mod}.AO_L1TempLowLimit"].FloatValue = 80;
|
|||
|
//IO.AO[$"{mod}.AO_L2TempLowLimit"].FloatValue = 80;
|
|||
|
//IO.AO[$"{mod}.AO_L3TempLowLimit"].FloatValue = 80;
|
|||
|
|
|||
|
//IO.AI[$"{mod}.AI_L1WorkingOP2"].FloatValue = 10;
|
|||
|
//IO.AI[$"{mod}.AI_L2WorkingOP2"].FloatValue = 10;
|
|||
|
//IO.AI[$"{mod}.AI_L3WorkingOP2"].FloatValue = 10;
|
|||
|
//IO.AI[$"{mod}.AI_L1PV2"].FloatValue = 20;
|
|||
|
//IO.AI[$"{mod}.AI_L2PV2"].FloatValue = 20;
|
|||
|
//IO.AI[$"{mod}.AI_L3PV2"].FloatValue = 20;
|
|||
|
//IO.AI[$"{mod}.AI_L1TempHighAlarm2"].FloatValue = 30;
|
|||
|
//IO.AI[$"{mod}.AI_L2TempHighAlarm2"].FloatValue = 30;
|
|||
|
//IO.AI[$"{mod}.AI_L3TempHighAlarm2"].FloatValue = 30;
|
|||
|
//IO.AI[$"{mod}.AI_L1TempLowAlarm2"].FloatValue = 25;
|
|||
|
//IO.AI[$"{mod}.AI_L2TempLowAlarm2"].FloatValue = 25;
|
|||
|
//IO.AI[$"{mod}.AI_L3TempLowAlarm2"].FloatValue = 25;
|
|||
|
|
|||
|
//IO.AO[$"{mod}.AO_L1LoopMode2"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L2LoopMode2"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L3LoopMode2"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L1TargetSP2"].FloatValue = 20;
|
|||
|
//IO.AO[$"{mod}.AO_L2TargetSP2"].FloatValue = 20;
|
|||
|
//IO.AO[$"{mod}.AO_L3TargetSP2"].FloatValue = 20;
|
|||
|
//IO.AO[$"{mod}.AO_L1TargetOP2"].FloatValue = 30;
|
|||
|
//IO.AO[$"{mod}.AO_L2TargetOP2"].FloatValue = 30;
|
|||
|
//IO.AO[$"{mod}.AO_L3TargetOP2"].FloatValue = 30;
|
|||
|
//IO.AO[$"{mod}.AO_L1RecipeValue2"].FloatValue = 40;
|
|||
|
//IO.AO[$"{mod}.AO_L2RecipeValue2"].FloatValue = 40;
|
|||
|
//IO.AO[$"{mod}.AO_L3RecipeValue2"].FloatValue = 40;
|
|||
|
//IO.AO[$"{mod}.AO_L1IPCST2"].FloatValue = 70;
|
|||
|
//IO.AO[$"{mod}.AO_L2IPCST2"].FloatValue = 70;
|
|||
|
//IO.AO[$"{mod}.AO_L3IPCST2"].FloatValue = 70;
|
|||
|
//IO.AO[$"{mod}.AO_TCPyroMode2"].FloatValue = 1;
|
|||
|
//IO.AO[$"{mod}.AO_L1TempHighLimit2"].FloatValue = 90;
|
|||
|
//IO.AO[$"{mod}.AO_L2TempHighLimit2"].FloatValue = 90;
|
|||
|
//IO.AO[$"{mod}.AO_L3TempHighLimit2"].FloatValue = 90;
|
|||
|
//IO.AO[$"{mod}.AO_L1TempLowLimit2"].FloatValue = 80;
|
|||
|
//IO.AO[$"{mod}.AO_L2TempLowLimit2"].FloatValue = 80;
|
|||
|
//IO.AO[$"{mod}.AO_L3TempLowLimit2"].FloatValue = 80;
|
|||
|
#endregion
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_PMH2DetectorSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ProcessStopSW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_GBWaterLeakSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_MainCBStatusSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ReactorWaterLeakSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamMiddleFlow1SW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ChamMiddleFlow2SW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_PumpExhaustDPSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_TMFlow1SW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_TMFlow2SW"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_H2PressureSW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_TMN2FlowSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_TCSAlarm"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_GBExhaustDPSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_PMAExhaustDPSW"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ServoDriverFaultSW"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_PowerRackExhaustDP"].Value = true;
|
|||
|
IO.DI[$"{mod}.DI_ServoDriverFaultSW"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_GN2InletPressSW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_ArInletPressSW"].Value = false;
|
|||
|
IO.DI[$"{mod}.DI_FacilityWarningSW"].Value = true;
|
|||
|
|
|||
|
|
|||
|
IO.DO[$"{mod}.DO_UPSEnable"].Value = true;
|
|||
|
IO.DO[$"{mod}.DO_UPSLowBattery"].Value = true;
|
|||
|
|
|||
|
IO.DO[$"{mod}.DO_CleanRoutineSucceed"].Value = true;
|
|||
|
IO.DO[$"{mod}.DO_TVEnable"].Value = true;
|
|||
|
|
|||
|
IO.DI[$"{mod}.DI_EPV21_FB"].Value = true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private bool OnMonitor()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
|
|||
|
MonitorPressureTM();
|
|||
|
MonitorPressureLL1();
|
|||
|
|
|||
|
MonitorPm("PM1");
|
|||
|
MonitorPm("PM2");
|
|||
|
MonitorTM("TM");
|
|||
|
|
|||
|
MonitorValve("PM1");
|
|||
|
|
|||
|
MonitorTMValve();
|
|||
|
MonitorWaterFlow();
|
|||
|
MonitorFlowRamp("PM1");
|
|||
|
MonitorFlowRamp("PM2");
|
|||
|
|
|||
|
|
|||
|
MonitorGasConnector("PM1");
|
|||
|
MonitorLid("PM1");
|
|||
|
MonitorLidSwing("PM1");
|
|||
|
MonitorConfinementRing("PM1");
|
|||
|
|
|||
|
MonitorGasConnector("PM2");
|
|||
|
MonitorLid("PM2");
|
|||
|
MonitorLidSwing("PM2");
|
|||
|
MonitorConfinementRing("PM2");
|
|||
|
|
|||
|
MonitorChamberMoveBody("PM1");
|
|||
|
MonitorChamberMoveBodyUp("PM1");
|
|||
|
|
|||
|
MonitorHeater("PM1");
|
|||
|
|
|||
|
MonitorRotation("PM1");
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LOG.Write(e);
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
void MonitorFlowRamp(string pm)
|
|||
|
{
|
|||
|
var rampList = new List<Tuple<string, string>>
|
|||
|
{
|
|||
|
new Tuple<string, string>(
|
|||
|
"AI_M1",
|
|||
|
"AO_M1"
|
|||
|
),
|
|||
|
new Tuple<string, string>(
|
|||
|
"AI_M2",
|
|||
|
"AO_M2"
|
|||
|
),
|
|||
|
new Tuple<string, string>("AI_M3","AO_M3"),
|
|||
|
new Tuple<string, string>("AI_M4","AO_M4"),
|
|||
|
new Tuple<string, string>("AI_M5","AO_M5"),
|
|||
|
new Tuple<string, string>("AI_M6","AO_M6"),
|
|||
|
new Tuple<string, string>("AI_M7","AO_M7"),
|
|||
|
new Tuple<string, string>("AI_M8","AO_M8"),
|
|||
|
new Tuple<string, string>("AI_M9","AO_M9"),
|
|||
|
new Tuple<string, string>("AI_M10","AO_M10"),
|
|||
|
new Tuple<string, string>("AI_M11","AO_M11"),
|
|||
|
new Tuple<string, string>("AI_M12","AO_M12"),
|
|||
|
new Tuple<string, string>("AI_M13","AO_M13"),
|
|||
|
new Tuple<string, string>("AI_M14","AO_M14"),
|
|||
|
new Tuple<string, string>("AI_M15","AO_M15"),
|
|||
|
new Tuple<string, string>("AI_M16","AO_M16"),
|
|||
|
new Tuple<string, string>("AI_M19","AO_M19"),
|
|||
|
new Tuple<string, string>("AI_M20","AO_M20"),
|
|||
|
new Tuple<string, string>("AI_M22","AO_M22"),
|
|||
|
new Tuple<string, string>("AI_M23","AO_M23"),
|
|||
|
new Tuple<string, string>("AI_M25","AO_M25"),
|
|||
|
new Tuple<string, string>("AI_M26","AO_M26"),
|
|||
|
new Tuple<string, string>("AI_M27","AO_M27"),
|
|||
|
new Tuple<string, string>("AI_M28","AO_M28"),
|
|||
|
new Tuple<string, string>("AI_M29","AO_M29"),
|
|||
|
new Tuple<string, string>("AI_M40","AO_M40"),
|
|||
|
new Tuple<string, string>("AI_M31","AO_M31"),
|
|||
|
new Tuple<string, string>("AI_M32","AO_M32"),
|
|||
|
new Tuple<string, string>("AI_M33","AO_M33"),
|
|||
|
|
|||
|
new Tuple<string, string>("AI_M35","AO_M35"),
|
|||
|
new Tuple<string, string>("AI_M36","AO_M36"),
|
|||
|
new Tuple<string, string>("AI_M37","AO_M37"),
|
|||
|
new Tuple<string, string>("AI_M38","AO_M38"),
|
|||
|
new Tuple<string, string>("AI_M39","AO_M39"),
|
|||
|
|
|||
|
new Tuple<string, string>("AI_PressCtrl1","AO_PressCtrl1"),
|
|||
|
new Tuple<string, string>("AI_PressCtrl2","AO_PressCtrl2"),
|
|||
|
new Tuple<string, string>("AI_PressCtrl3","AO_PressCtrl3"),
|
|||
|
new Tuple<string, string>("AI_PressCtrl4","AO_PressCtrl4"),
|
|||
|
new Tuple<string, string>("AI_PressCtrl5","AO_PressCtrl5"),
|
|||
|
new Tuple<string, string>("AI_PressCtrl6","AO_PressCtrl6"),
|
|||
|
new Tuple<string, string>("AI_PressCtrl7","AO_PressCtrl7"),
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//new Tuple<string, string>(
|
|||
|
// "AI_Gas2Flow",
|
|||
|
// "AO_Gas2Flow"
|
|||
|
//),
|
|||
|
|
|||
|
//new Tuple<string, string>(
|
|||
|
// "AI_Gas3Flow",
|
|||
|
// "AO_Gas3Flow"
|
|||
|
//),
|
|||
|
|
|||
|
//new Tuple<string, string>(
|
|||
|
// "AI_Gas4Flow",
|
|||
|
// "AO_Gas4Flow"
|
|||
|
//),
|
|||
|
};
|
|||
|
|
|||
|
foreach (var item in rampList)
|
|||
|
{
|
|||
|
float setpoint = 0;
|
|||
|
float result = 0;
|
|||
|
float current = 0;
|
|||
|
if (IO.AI[$"{pm}.{item.Item1}"] != null)
|
|||
|
{
|
|||
|
current = IO.AI[$"{pm}.{item.Item1}"].FloatValue;
|
|||
|
setpoint = IO.AO[$"{pm}.{item.Item2}"].FloatValue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (current >= setpoint)
|
|||
|
{
|
|||
|
result = current - 50;
|
|||
|
if (result < setpoint)
|
|||
|
result = setpoint;
|
|||
|
}
|
|||
|
if (current < setpoint)
|
|||
|
{
|
|||
|
result = current + 50;
|
|||
|
if (result > setpoint)
|
|||
|
result = setpoint;
|
|||
|
}
|
|||
|
|
|||
|
result = result + (float)_rd.NextDouble();
|
|||
|
|
|||
|
IO.AI[$"{pm}.{item.Item1}"].FloatValue = result;
|
|||
|
}
|
|||
|
}
|
|||
|
public object locker = new object();
|
|||
|
private void MonitorPm(string pm)
|
|||
|
{
|
|||
|
if (IO.AO[$"{pm}.AO_PSUInnerLoopMode"].FloatValue == 1)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_PSUInnerWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_PSUInnerTargetOP"].FloatValue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_PSUInnerWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_PSUInnerTargetSP"].FloatValue / 1800 * 100;
|
|||
|
}
|
|||
|
if (IO.AO[$"{pm}.AO_PSUMiddleLoopMode"].FloatValue == 1)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_PSUMiddleWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_PSUMiddleTargetOP"].FloatValue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_PSUMiddleWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_PSUMiddleTargetSP"].FloatValue / 1800 * 100;
|
|||
|
}
|
|||
|
if (IO.AO[$"{pm}.AO_PSUOuterLoopMode"].FloatValue == 1)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_PSUOuterWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_PSUOuterTargetOP"].FloatValue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_PSUOuterWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_PSUOuterTargetSP"].FloatValue / 1800 * 100;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//SCR
|
|||
|
if (IO.AO[$"{pm}.AO_SCRUpperLoopMode"].FloatValue == 1)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_SCRUpperWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_PSUInnerTargetOP"].FloatValue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_SCRUpperWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_SCRUpperTargetSP"].FloatValue / 1800 * 100;
|
|||
|
}
|
|||
|
if (IO.AO[$"{pm}.AO_SCRMiddleLoopMode"].FloatValue == 1)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_SCRMiddleWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_SCRMiddleTargetOP"].FloatValue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_SCRMiddleWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_SCRMiddleTargetSP"].FloatValue / 1800 * 100;
|
|||
|
}
|
|||
|
if (IO.AO[$"{pm}.AO_SCRLowerLoopMode"].FloatValue == 1)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_SCRLowerWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_SCRLowerTargetOP"].FloatValue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_SCRLowerWorkingOP"].FloatValue = IO.AO[$"{pm}.AO_SCRLowerTargetSP"].FloatValue / 1800 * 100;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
IO.AI[$"{pm}.AI_Valvemode"].FloatValue = IO.AO[$"{pm}.AO_ValveModeSetpoint"].FloatValue;
|
|||
|
IO.AI[$"{pm}.AI_HeartBeat"].FloatValue = IO.AO[$"{pm}.AO_HeartBeat"].FloatValue;
|
|||
|
|
|||
|
//蝶阀开启,跟着蝶阀的设置值走
|
|||
|
if (IO.DO[$"{pm}.DO_TVEnable"].Value)
|
|||
|
{
|
|||
|
if (IO.AI[$"{pm}.AI_ActualPressure"].FloatValue > IO.AO[$"{pm}.AO_SetpointPressure"].FloatValue)
|
|||
|
{
|
|||
|
if (IO.AI[$"{pm}.AI_ActualPressure"].FloatValue - 10 < IO.AO[$"{pm}.AO_SetpointPressure"].FloatValue)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_ActualPressure"].FloatValue -= 10;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_ActualPressure"].FloatValue = IO.AO[$"{pm}.AO_SetpointPressure"].FloatValue;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (IO.AI[$"{pm}.AI_ActualPressure"].FloatValue < IO.AO[$"{pm}.AO_SetpointPressure"].FloatValue)
|
|||
|
{
|
|||
|
if (IO.AI[$"{pm}.AI_ActualPressure"].FloatValue + 10 < IO.AO[$"{pm}.AO_SetpointPressure"].FloatValue)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_ActualPressure"].FloatValue += 10;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_ActualPressure"].FloatValue = IO.AO[$"{pm}.AO_SetpointPressure"].FloatValue;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//判断是否有进气(V89到V97是否有开阀)
|
|||
|
if (IO.DI[$"{pm}.DI_InnerGasFinal_FB"].Value || IO.DI[$"{pm}.DI_MiddleGasFinal_FB"].Value || IO.DI[$"{pm}.DI_GasRingPurgeFinal_FB"].Value || IO.DI[$"{pm}.DI_HeaterUpPurgeFinal_FB"].Value
|
|||
|
|| IO.DI[$"{pm}.DI_ChamberPurgeFinal_FB"].Value || IO.DI[$"{pm}.DI_RotationUpPurgeFinal_FB"].Value || IO.DI[$"{pm}.DI_ConfinementRingFinal_FB"].Value || IO.DI[$"{pm}.DI_HeaterWFPurgeFinal_FB"].Value)
|
|||
|
{
|
|||
|
if (IO.AI[$"{pm}.AI_ActualPressure"].FloatValue < 1200)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_ActualPressure"].FloatValue += 10;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//蝶阀Ramp有Bug,设置AO值可以化解
|
|||
|
if (IO.AI[$"{pm}.AI_ActualPressure"].FloatValue >= 1100)
|
|||
|
{
|
|||
|
IO.AO[$"{pm}.AO_SetpointPressure"].FloatValue = IO.AI[$"{pm}.AI_ActualPressure"].FloatValue;
|
|||
|
}
|
|||
|
|
|||
|
IO.AI[$"{pm}.AI_ChamPress"].FloatValue = IO.AI[$"{pm}.AI_ActualPressure"].FloatValue;
|
|||
|
|
|||
|
//V27自动打开
|
|||
|
if (IO.AI[$"{pm}.AI_ChamPress"].FloatValue > 1020 && IO.DO[$"{pm}.DO_PumpBypass"].Value != true)
|
|||
|
{
|
|||
|
IO.DO[$"{pm}.DO_PumpBypass"].Value = true;
|
|||
|
}
|
|||
|
if (IO.AI[$"{pm}.AI_ChamPress"].FloatValue < 900 && IO.DO[$"{pm}.DO_PumpBypass"].Value)
|
|||
|
{
|
|||
|
IO.DO[$"{pm}.DO_PumpBypass"].Value = false;
|
|||
|
}
|
|||
|
|
|||
|
//设置PT2的压力比PT1的小20
|
|||
|
|
|||
|
IO.AI[$"{pm}.AI_ForelinePress"].FloatValue = IO.AI[$"{pm}.AI_ChamPress"].FloatValue - 20 > 0 ? IO.AI[$"{pm}.AI_ChamPress"].FloatValue - 20 : 0;
|
|||
|
|
|||
|
}
|
|||
|
private void MonitorTM(string Tm)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorPressureLL1()
|
|||
|
{
|
|||
|
bool isSlowPum = IO.DI["DI_LLSlowRoughOpen_FB"].Value;
|
|||
|
bool isFastPump = IO.DI["DI_LLFastRoughOpen_FB"].Value;
|
|||
|
bool isSlowVent = IO.DI["DI_LLSlowVentOpen_FB"].Value;
|
|||
|
|
|||
|
//200毫秒调用一次,10秒内实现从0到1020
|
|||
|
double pressure = IO.AI["AI_LLPressure"].Value;
|
|||
|
|
|||
|
if (isFastPump || isSlowPum)
|
|||
|
{
|
|||
|
if (pressure > 350)
|
|||
|
{
|
|||
|
pressure -= 10;
|
|||
|
}
|
|||
|
else if (pressure >= 250 && pressure <= 350)
|
|||
|
{
|
|||
|
pressure -= 4;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pressure -= 10;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (isSlowVent)
|
|||
|
{
|
|||
|
if (pressure > 320)
|
|||
|
{
|
|||
|
pressure += 10;
|
|||
|
}
|
|||
|
else if (pressure >= 290 && pressure <= 320)
|
|||
|
{
|
|||
|
pressure += 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pressure += 10;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (pressure < 0)
|
|||
|
pressure = 0;
|
|||
|
if (pressure > 1020)
|
|||
|
pressure = 1020;
|
|||
|
|
|||
|
if (!isFastPump && pressure < 1)
|
|||
|
pressure = 0;
|
|||
|
|
|||
|
IO.AI["AI_LLPressure"].Value = Convert.ToInt16(pressure);
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorPressureTM()
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
bool isSlowPum = IO.DI["DI_TMSlowRoughOpen_FB"].Value;
|
|||
|
bool isSlowVent = IO.DI["DI_TMN2PurgeOpen_FB"].Value;
|
|||
|
bool isDryPumpingValveOpen = IO.DI["DI_TMFastRoughOpen_FB"].Value;
|
|||
|
bool isVentValveOpen = IO.DI["DI_TMFastVentOpen_FB"].Value;
|
|||
|
|
|||
|
bool isV121 = IO.DI["DI_TMRoughBypass_FB"].Value;
|
|||
|
|
|||
|
if (IO.DI["DI_ReactorADoorOpened"].Value || IO.DI["PM1.DI_TMPressBalance_FB"].Value)
|
|||
|
{
|
|||
|
IO.AI["AI_TMPressure"].Value = Convert.ToInt16(IO.AI[$"PM1.AI_ChamPress"].FloatValue);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
bool isV85Opne = IO.DI["DI_TMTOLLVentOpen_FB"].Value;
|
|||
|
if (isV85Opne)
|
|||
|
{
|
|||
|
short tmPress = IO.AI["AI_TMPressure"].Value;
|
|||
|
short llPress = IO.AI["AI_LLPressure"].Value;
|
|||
|
short avergePress = Convert.ToInt16((tmPress + llPress) / 2);
|
|||
|
|
|||
|
IO.AI["AI_TMPressure"].Value = avergePress;
|
|||
|
IO.AI["AI_LLPressure"].Value = avergePress;
|
|||
|
}
|
|||
|
|
|||
|
//200毫秒调用一次,10秒内实现从0到1020
|
|||
|
double pressure = IO.AI["AI_TMPressure"].Value;
|
|||
|
|
|||
|
double factor = pressure / (3 * 10);
|
|||
|
|
|||
|
double pressureStep = factor < 1 ? 1 : factor;
|
|||
|
|
|||
|
if (isDryPumpingValveOpen)
|
|||
|
{
|
|||
|
pressure -= pressureStep;
|
|||
|
}
|
|||
|
else if (isSlowPum)
|
|||
|
{
|
|||
|
pressure -= 2;
|
|||
|
}
|
|||
|
|
|||
|
if (isVentValveOpen)
|
|||
|
{
|
|||
|
pressure += pressureStep;
|
|||
|
}
|
|||
|
else if (isSlowVent)
|
|||
|
{
|
|||
|
pressure += 5 * (IO.AI["AI_MFCFlowValue"].Value / 50);
|
|||
|
pressure += 2;
|
|||
|
}
|
|||
|
|
|||
|
if (isV121)
|
|||
|
{
|
|||
|
pressure -= 0.5;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (pressure < 0)
|
|||
|
pressure = 0;
|
|||
|
if (pressure > 1020)
|
|||
|
pressure = 1020;
|
|||
|
|
|||
|
if (!isDryPumpingValveOpen && !isVentValveOpen && pressure < 1)
|
|||
|
pressure = 0;
|
|||
|
|
|||
|
IO.AI["AI_TMPressure"].Value = Convert.ToInt16(pressure);
|
|||
|
|
|||
|
if (IO.AI["AI_LLPressure"].FloatValue > 960)
|
|||
|
{
|
|||
|
IO.DI["DI_LoadLockAtATM"].Value = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.DI["DI_LoadLockAtATM"].Value = false;
|
|||
|
}
|
|||
|
|
|||
|
if (IO.AI["AI_TMPressure"].FloatValue > 960)
|
|||
|
{
|
|||
|
IO.DI["DI_TMatATM"].Value = false; //此信号是反过来的
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IO.DI["DI_TMatATM"].Value = true;
|
|||
|
}
|
|||
|
}
|
|||
|
private void MonitorWaterFlow()
|
|||
|
{
|
|||
|
|
|||
|
if (IO.DO["DO_LLDoorClose"].Value != IO.DO["DO_LLDoorOpen"].Value)
|
|||
|
{
|
|||
|
IO.DI["DI_LLDoorOpened"].Value = IO.DO["DO_LLDoorOpen"].Value;
|
|||
|
IO.DI["DI_LLDoorClosed"].Value = IO.DO["DO_LLDoorClose"].Value;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (IO.DO["DO_RectorADoorClose"].Value != IO.DO["DO_RectorADoorOpen"].Value)
|
|||
|
{
|
|||
|
IO.DI["DI_ReactorADoorOpened"].Value = IO.DO["DO_RectorADoorOpen"].Value;
|
|||
|
|
|||
|
IO.DI["DI_ReactorADoorClosed"].Value = IO.DO["DO_RectorADoorClose"].Value;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
private void MonitorTMValve()
|
|||
|
{
|
|||
|
IO.DI["DI_LLSlowVentOpen_FB"].Value = IO.DO["DO_LLSlowVentOpen"].Value;
|
|||
|
IO.DI["DI_LLFastVentOpen_FB"].Value = IO.DO["DO_LLFastVentOpen"].Value;
|
|||
|
IO.DI["DI_TMFastVentOpen_FB"].Value = IO.DO["DO_TMFastVentOpen"].Value;
|
|||
|
IO.DI["DI_TMN2PurgeOpen_FB"].Value = IO.DO["DO_TMSlowVentOpen"].Value;
|
|||
|
IO.DI["DI_TMTOLLVentOpen_FB"].Value = IO.DO["DO_TMTOLLVentOpen"].Value;
|
|||
|
|
|||
|
IO.DI["DI_LLSlowRoughOpen_FB"].Value = IO.DO["DO_LLSlowRoughOpen"].Value;
|
|||
|
IO.DI["DI_LLFastRoughOpen_FB"].Value = IO.DO["DO_LLFastRoughOpen"].Value;
|
|||
|
IO.DI["DI_TMFastRoughOpen_FB"].Value = IO.DO["DO_TMFastRoughOpen"].Value;
|
|||
|
IO.DI["DI_TMSlowRoughOpen_FB"].Value = IO.DO["DO_TMSlowRoughOpen"].Value;
|
|||
|
|
|||
|
|
|||
|
IO.DI["DI_TMRoughBypass_FB"].Value = IO.DO["DO_TMRoughBypass"].Value;
|
|||
|
|
|||
|
|
|||
|
IO.DI["DI_VacRobotExtenLLEnable_FB"].Value = IO.DO["DO_VacRobotExtenLLEnable"].Value;
|
|||
|
IO.DI["DI_VacRobotExtendBufferEnable_FB"].Value = IO.DO["DO_VacRobotExtendBufferEnable"].Value;
|
|||
|
IO.DI["DI_VacRobotExtendPMAEnable_FB"].Value = IO.DO["DO_VacRobotExtendPM1Enable"].Value;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorValve(string pm)
|
|||
|
{
|
|||
|
|
|||
|
IO.DI[$"{pm}.DI_DORPressATMSW"].Value = IO.DI[$"{pm}.DI_DORRefill_FB"].Value;
|
|||
|
IO.DI[$"{pm}.DI_PSUEnable_FB"].Value = IO.DO[$"{pm}.DO_PSUEnable"].Value;
|
|||
|
|
|||
|
IO.DI[$"{pm}.DI_InnerHeaterEnable_FB"].Value = IO.DO[$"{pm}.DO_PSU1Enable"].Value;
|
|||
|
IO.DI[$"{pm}.DI_MiddleHeaterEnable_FB"].Value = IO.DO[$"{pm}.DO_PSU2Enable"].Value;
|
|||
|
IO.DI[$"{pm}.DI_OuterHeaterEnable_FB"].Value = IO.DO[$"{pm}.DO_PSU3Enable"].Value;
|
|||
|
|
|||
|
//IO.DI[$"{pm}.DI_SCR1Status"].Value = IO.DO[$"{pm}.DO_SCR1Enable"].Value;
|
|||
|
//IO.DI[$"{pm}.DI_SCR2Status"].Value = IO.DO[$"{pm}.DO_SCR2Enable"].Value;
|
|||
|
//IO.DI[$"{pm}.DI_SCR3Status"].Value = IO.DO[$"{pm}.DO_SCR3Enable"].Value;
|
|||
|
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyUpDownEnable_FB"].Value = IO.DO[$"{pm}.DO_ChamMoveBodyUpDownEnable"].Value;
|
|||
|
|
|||
|
IO.DI[$"{pm}.DI_PumpBypass_FB"].Value = IO.DO[$"{pm}.DO_PumpBypass"].Value;
|
|||
|
IO.DI[$"{pm}.DI_H2Supply_FB"].Value = IO.DO[$"{pm}.DO_H2Supply"].Value;
|
|||
|
IO.DI[$"{pm}.DI_ArSupply_FB"].Value = IO.DO[$"{pm}.DO_ArSupply"].Value;
|
|||
|
IO.DI[$"{pm}.DI_H2ArSwitch_FB"].Value = IO.DO[$"{pm}.DO_SHH2ArSwitch"].Value;
|
|||
|
IO.DI[$"{pm}.DI_H2ArSwitch_FB"].Value = IO.DO[$"{pm}.DO_SHH2ArSwitch"].Value;
|
|||
|
IO.DI[$"{pm}.DI_H2ArLine1_FB"].Value = IO.DO[$"{pm}.DO_H2ArLine1"].Value;
|
|||
|
IO.DI[$"{pm}.DI_H2ArLine2_FB"].Value = IO.DO[$"{pm}.DO_H2ArLine2"].Value;
|
|||
|
IO.DI[$"{pm}.DI_DoppingDilute_FB"].Value = IO.DO[$"{pm}.DO_HighN2Flow"].Value;
|
|||
|
IO.DI[$"{pm}.DI_DilutedN2RunVent_FB"].Value = IO.DO[$"{pm}.DO_DilutedN2RunVent"].Value;
|
|||
|
IO.DI[$"{pm}.DI_HighN2RunVent_FB"].Value = IO.DO[$"{pm}.DO_HighN2RunVent"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TMARun_FB"].Value = IO.DO[$"{pm}.DO_TMARun"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TMAVent_FB"].Value = IO.DO[$"{pm}.DO_TMAVent"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TMARelease_FB"].Value = IO.DO[$"{pm}.DO_TMARelease"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TMABypass_FB"].Value = IO.DO[$"{pm}.DO_TMABypass"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TMAVac_FB"].Value = IO.DO[$"{pm}.DO_TMAVac"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TCSRelease_FB"].Value = IO.DO[$"{pm}.DO_TCSRelease"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TCSBypass_FB"].Value = IO.DO[$"{pm}.DO_TCSBypass"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TCSVac_FB"].Value = IO.DO[$"{pm}.DO_TCSVac"].Value;
|
|||
|
IO.DI[$"{pm}.DI_HCLSwitch_FB"].Value = IO.DO[$"{pm}.DO_HCLSwitch"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SiH4Switch_FB"].Value = IO.DO[$"{pm}.DO_SiH4Switch"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TCSRunVent_FB"].Value = IO.DO[$"{pm}.DO_TCSRunVent"].Value;
|
|||
|
IO.DI[$"{pm}.DI_HCLRunVent_FB"].Value = IO.DO[$"{pm}.DO_HCLRunVent"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SiH4Run_FB"].Value = IO.DO[$"{pm}.DO_SiH4Run"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SiH4Vent_FB"].Value = IO.DO[$"{pm}.DO_SiH4Vent"].Value;
|
|||
|
IO.DI[$"{pm}.DI_C3H8Switch_FB"].Value = IO.DO[$"{pm}.DO_C3H8Switch"].Value;
|
|||
|
IO.DI[$"{pm}.DI_C3H8Run_FB"].Value = IO.DO[$"{pm}.DO_C3H8Run"].Value;
|
|||
|
IO.DI[$"{pm}.DI_C3H8Vent_FB"].Value = IO.DO[$"{pm}.DO_C3H8Vent"].Value;
|
|||
|
IO.DI[$"{pm}.DI_DoppingFinal_FB"].Value = IO.DO[$"{pm}.DO_DoppingFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SilaneFinal_FB"].Value = IO.DO[$"{pm}.DO_SilaneFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_PropaneFinal_FB"].Value = IO.DO[$"{pm}.DO_PropaneFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_GasRingH2Purge_FB"].Value = IO.DO[$"{pm}.DO_GasRingH2Purge"].Value;
|
|||
|
IO.DI[$"{pm}.DI_GasRingArPurge_FB"].Value = IO.DO[$"{pm}.DO_GasRingArPurge"].Value;
|
|||
|
IO.DI[$"{pm}.DI_ChamBodyArPurge_FB"].Value = IO.DO[$"{pm}.DO_ChamBodyArPurge"].Value;
|
|||
|
IO.DI[$"{pm}.DI_ReactorLeakCheck_FB"].Value = IO.DO[$"{pm}.DO_ReactorLeakCheck"].Value;
|
|||
|
IO.DI[$"{pm}.DI_TMPressBalance_FB"].Value = IO.DO[$"{pm}.DO_TMPressBalance"].Value;
|
|||
|
IO.DI[$"{pm}.DI_CarryGasFinal_FB"].Value = IO.DO[$"{pm}.DO_CarryGasFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_GasBoxVentPump_FB"].Value = IO.DO[$"{pm}.DO_GasBoxVentPump"].Value;
|
|||
|
IO.DI[$"{pm}.DI_MOVac_FB"].Value = IO.DO[$"{pm}.DO_MOVac"].Value;
|
|||
|
IO.DI[$"{pm}.DI_GasboxLeakCheck_FB"].Value = IO.DO[$"{pm}.DO_GasboxLeakCheck"].Value;
|
|||
|
IO.DI[$"{pm}.DI_DORVac_FB"].Value = IO.DO[$"{pm}.DO_DORVac"].Value;
|
|||
|
IO.DI[$"{pm}.DI_DORRefill_FB"].Value = IO.DO[$"{pm}.DO_DORRefill"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SHOpticPurge_FB"].Value = IO.DO[$"{pm}.DO_SHOpticPurgeFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_OutterGas_FB"].Value = IO.DO[$"{pm}.DO_OuterGasFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_InnerGasFinal_FB"].Value = IO.DO[$"{pm}.DO_InnerGasFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_MiddleGasFinal_FB"].Value = IO.DO[$"{pm}.DO_MiddleGasFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_GasRingPurgeFinal_FB"].Value = IO.DO[$"{pm}.DO_GasRingPurgeFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_HeaterUpPurgeFinal_FB"].Value = IO.DO[$"{pm}.DO_HeaterUpPurgeFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_ChamberPurgeFinal_FB"].Value = IO.DO[$"{pm}.DO_ChamberPurgeFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_RotationUpPurgeFinal_FB"].Value = IO.DO[$"{pm}.DO_RotationUpPurgeFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_ConfinementRingFinal_FB"].Value = IO.DO[$"{pm}.DO_ConfinementRingFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_HeaterWFPurgeFinal_FB"].Value = IO.DO[$"{pm}.DO_HeaterWFFinal"].Value;
|
|||
|
IO.DI[$"{pm}.DI_N2Switch_FB"].Value = IO.DO[$"{pm}.DO_N2Switch"].Value;
|
|||
|
|
|||
|
IO.DI[$"{pm}.DI_GasBoxVentBypass"].Value = IO.DO[$"{pm}.DO_GasBoxVentBypass"].Value;
|
|||
|
IO.DI[$"{pm}.DI_C3H8SwitchHTPurge"].Value = IO.DO[$"{pm}.DO_C3H8SwitchHTPurge"].Value;
|
|||
|
|
|||
|
IO.DI[$"{pm}.DI_EPV11_FB"].Value = IO.DO[$"{pm}.DO_EPV1"].Value;
|
|||
|
IO.DI[$"{pm}.DI_EPV21_FB"].Value = IO.DO[$"{pm}.DO_EPV2"].Value;
|
|||
|
|
|||
|
IO.AI[$"{pm}.AI_PressCtrl1"].Value = IO.AO[$"{pm}.AO_PressCtrl1"].Value;
|
|||
|
IO.AI[$"{pm}.AI_PressCtrl2"].Value = IO.AO[$"{pm}.AO_PressCtrl2"].Value;
|
|||
|
IO.AI[$"{pm}.AI_PressCtrl3"].Value = IO.AO[$"{pm}.AO_PressCtrl3"].Value;
|
|||
|
IO.AI[$"{pm}.AI_PressCtrl4"].Value = IO.AO[$"{pm}.AO_PressCtrl4"].Value;
|
|||
|
IO.AI[$"{pm}.AI_PressCtrl5"].Value = IO.AO[$"{pm}.AO_PressCtrl5"].Value;
|
|||
|
IO.AI[$"{pm}.AI_PressCtrl6"].Value = IO.AO[$"{pm}.AO_PressCtrl6"].Value;
|
|||
|
IO.AI[$"{pm}.AI_PressCtrl7"].Value = IO.AO[$"{pm}.AO_PressCtrl7"].Value;
|
|||
|
}
|
|||
|
|
|||
|
int timeMoveUp = 0;
|
|||
|
int timeMove = 0;
|
|||
|
int timeSection = 0;
|
|||
|
int timeRingUpDwon = 0;
|
|||
|
R_TRIG _UpTrig = new R_TRIG();
|
|||
|
|
|||
|
private void MonitorChamberMoveBodyUp(string pm)
|
|||
|
{
|
|||
|
if (IO.DO[$"{pm}.DO_ChamMoveBodyUp"].Value != IO.DO[$"{pm}.DO_ChamMoveBodyDown"].Value)
|
|||
|
{
|
|||
|
timeMoveUp++;
|
|||
|
if (timeMoveUp > 20)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyUp"].Value = IO.DO[$"{pm}.DO_ChamMoveBodyUp"].Value;
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyDown"].Value = IO.DO[$"{pm}.DO_ChamMoveBodyDown"].Value;
|
|||
|
}
|
|||
|
}
|
|||
|
if (timeMoveUp > 20)
|
|||
|
{
|
|||
|
timeMoveUp = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
R_TRIG forwardLatch_R = new R_TRIG();
|
|||
|
R_TRIG backLatchLatch_R = new R_TRIG();
|
|||
|
private void MonitorChamberMoveBody(string pm)
|
|||
|
{
|
|||
|
if (IO.DO[$"{pm}.DO_ChamMoveBodyForward"].Value != IO.DO[$"{pm}.DO_ChamMoveBodyBackward"].Value)
|
|||
|
{
|
|||
|
timeMove++;
|
|||
|
if (timeMove > 20)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyFront"].Value = IO.DO[$"{pm}.DO_ChamMoveBodyForward"].Value;
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyEnd"].Value = IO.DO[$"{pm}.DO_ChamMoveBodyBackward"].Value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
forwardLatch_R.CLK = IO.DO[$"{pm}.DO_ChamMoveBodyBrakerForward"].Value;
|
|||
|
if (forwardLatch_R.Q)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyUpLatchFW"].Value = true;
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyEndLatchBW"].Value = false;
|
|||
|
backLatchLatch_R.RST = true;
|
|||
|
}
|
|||
|
|
|||
|
backLatchLatch_R.CLK = IO.DO[$"{pm}.DO_ChamMoveBodyBrakerBackward"].Value;
|
|||
|
if (backLatchLatch_R.Q)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyEndLatchBW"].Value = true;
|
|||
|
IO.DI[$"{pm}.DI_ChamMoveBodyUpLatchFW"].Value = false;
|
|||
|
forwardLatch_R.RST = true;
|
|||
|
}
|
|||
|
|
|||
|
if (timeMove > 20)
|
|||
|
{
|
|||
|
timeMove = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorHeater(string pm)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_PSU1Status"].Value = IO.DO[$"{pm}.DO_PSU1Enable"].Value;
|
|||
|
IO.DI[$"{pm}.DI_PSU2Status"].Value = IO.DO[$"{pm}.DO_PSU2Enable"].Value;
|
|||
|
IO.DI[$"{pm}.DI_PSU3Status"].Value = IO.DO[$"{pm}.DO_PSU3Enable"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SCR1Status"].Value = IO.DO[$"{pm}.DO_SCR1Enable"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SCR2Status"].Value = IO.DO[$"{pm}.DO_SCR2Enable"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SCR3Status"].Value = IO.DO[$"{pm}.DO_SCR3Enable"].Value;
|
|||
|
|
|||
|
//IO.AI[$"{pm}.AI_PresentLoop1Temp"].FloatValue = IO.AO[$"{pm}.AO_SetpointLoop1Temp"].FloatValue;
|
|||
|
//IO.AI[$"{pm}.AI_Loop1ControlMode"].FloatValue = IO.AO[$"{pm}.AO_Loop1ControlMode"].FloatValue;
|
|||
|
//IO.AI[$"{pm}.AI_Loop1ActualPower"].FloatValue = IO.AO[$"{pm}.AO_Loop1ManualOP"].FloatValue;
|
|||
|
//IO.DI[$"{pm}.DI_InnerHeaterEnable"].Value = IO.DO[$"{pm}.DO_InnerHeaterEnable"].Value;
|
|||
|
|
|||
|
//IO.AI[$"{pm}.AI_PresentLoop2Temp"].FloatValue = IO.AO[$"{pm}.AO_SetpointLoop2Temp"].FloatValue;
|
|||
|
//IO.AI[$"{pm}.AI_Loop2ControlMode"].FloatValue = IO.AO[$"{pm}.AO_Loop2ControlMode"].FloatValue;
|
|||
|
//IO.AI[$"{pm}.AI_Loop2ActualPower"].FloatValue = IO.AO[$"{pm}.AO_Loop2ManualOP"].FloatValue;
|
|||
|
//IO.DI[$"{pm}.DI_MiddleHeaterEnable"].Value = IO.DO[$"{pm}.DO_MiddleHeaterEnable"].Value;
|
|||
|
|
|||
|
//IO.AI[$"{pm}.AI_PresentLoop3Temp"].FloatValue = IO.AO[$"{pm}.AO_SetpointLoop3Temp"].FloatValue;
|
|||
|
//IO.AI[$"{pm}.AI_Loop3ControlMode"].FloatValue = IO.AO[$"{pm}.AO_Loop3ControlMode"].FloatValue;
|
|||
|
//IO.AI[$"{pm}.AI_Loop3ActualPower"].FloatValue = IO.AO[$"{pm}.AO_Loop3ManualOP"].FloatValue;
|
|||
|
//IO.DI[$"{pm}.DI_OuterHeaterEnable"].Value = IO.DO[$"{pm}.DO_OuterHeaterEnable"].Value;
|
|||
|
}
|
|||
|
private void MonitorGasConnector(string pm)
|
|||
|
{
|
|||
|
if (IO.DO[$"{pm}.DO_SHGasConnectorLoosen"].Value != IO.DO[$"{pm}.DO_SHGasConnectorTighten"].Value)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_SHGasConnectorLoosen"].Value = IO.DO[$"{pm}.DO_SHGasConnectorLoosen"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SHGasConnectorTighten"].Value = IO.DO[$"{pm}.DO_SHGasConnectorTighten"].Value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorLid(string pm)
|
|||
|
{
|
|||
|
|
|||
|
if (IO.DO[$"{pm}.DO_SHLidLoosen"].Value != IO.DO[$"{pm}.DO_SHLidTighten"].Value)
|
|||
|
{
|
|||
|
timeMove++;
|
|||
|
if (timeMove > 20)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_SHLidLoosen1"].Value = IO.DO[$"{pm}.DO_SHLidLoosen"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SHLidTighten1"].Value = IO.DO[$"{pm}.DO_SHLidTighten"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SHLidClosed"].Value = IO.DO[$"{pm}.DO_SHLidTighten"].Value;
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
if (IO.DO[$"{pm}.DO_MiddleLidLoosen"].Value != IO.DO[$"{pm}.DO_MiddleLidTighten"].Value)
|
|||
|
{
|
|||
|
timeMove++;
|
|||
|
if (timeMove > 20)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_MiddleLidLoosen1"].Value = IO.DO[$"{pm}.DO_MiddleLidLoosen"].Value;
|
|||
|
IO.DI[$"{pm}.DI_MiddleLidTighten1"].Value = IO.DO[$"{pm}.DO_MiddleLidTighten"].Value;
|
|||
|
IO.DI[$"{pm}.DI_MiddleLidClosed"].Value = IO.DO[$"{pm}.DO_MiddleLidTighten"].Value;
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
if (timeMove > 20)
|
|||
|
{
|
|||
|
timeMove = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorLidSwing(string pm)
|
|||
|
{
|
|||
|
|
|||
|
if (IO.DO[$"{pm}.DO_SHLidSwingLock"].Value != IO.DO[$"{pm}.DO_SHLidSwingUnlock"].Value)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_SHLidSwingLock"].Value = IO.DO[$"{pm}.DO_SHLidSwingLock"].Value;
|
|||
|
IO.DI[$"{pm}.DI_SHLidSwingUnlock"].Value = IO.DO[$"{pm}.DO_SHLidSwingUnlock"].Value;
|
|||
|
}
|
|||
|
if (IO.DO[$"{pm}.DO_MiddleLidSwingLock"].Value != IO.DO[$"{pm}.DO_MiddleLidSwingUnlock"].Value)
|
|||
|
{
|
|||
|
IO.DI[$"{pm}.DI_MiddleLidSwingLock"].Value = IO.DO[$"{pm}.DO_MiddleLidSwingLock"].Value;
|
|||
|
IO.DI[$"{pm}.DI_MiddleLidSwingUnlock"].Value = IO.DO[$"{pm}.DO_MiddleLidSwingUnlock"].Value;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorConfinementRing(string pm)
|
|||
|
{
|
|||
|
//if (IO.DI[$"{pm}.DI_ConfinementRingDown"].Value != IO.DO[$"{pm}.DO_ConfinementRingDown"].Value || IO.DI[$"{pm}.DI_ConfinementRingUp"].Value != IO.DO[$"{pm}.DO_ConfinementRingUp"].Value)
|
|||
|
//{
|
|||
|
// IO.DI[$"{pm}.DI_ConfinementRingDown"].Value = IO.DO[$"{pm}.DO_ConfinementRingDown"].Value;
|
|||
|
// IO.DI[$"{pm}.DI_ConfinementRingUp"].Value = IO.DO[$"{pm}.DO_ConfinementRingUp"].Value;
|
|||
|
//}
|
|||
|
}
|
|||
|
private void MonitorPump(string pm)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorRotation(string pm)
|
|||
|
{
|
|||
|
IO.AI[$"{pm}.AI_ActualSpeed"].FloatValue = IO.AO[$"{pm}.AO_SetpointSpeed"].FloatValue;
|
|||
|
}
|
|||
|
|
|||
|
public void Terminate()
|
|||
|
{
|
|||
|
_thread.Stop();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|