MoS2/App/Modules/SicModules/PMs/Routines/PMPumpRoutine.cs
SIC1016\caipeilun 621c9f2939 修改routine
2026-08-22 11:39:58 +08:00

262 lines
9.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System.Diagnostics;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Device.Devices;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using SicModules.PMs.Routines.Base;
namespace SicModules.PMs.Routines
{
public class PMPumpRoutine : PMBaseRoutine
{
private enum RoutineStep
{
RotationEnable,
HeatEnable,
VentPumpClose,
ArSupply,
SetGroupB,
SetGroupC,
SetGroupE,
SetGroupF,
SetGroupH,
SetGroupD,
SetGroupG,
SetGroupK,
SetGroupJ,
SetM1toM17,
SetM17M18,
SetPC,
SetGroupI, //V87-96
SetM18,
SetM2to40,
SetM2to40_1,
MfcAll,
SetGasOut,
SetTv,
SetTv1,
WaitTv1,
SetGasIn1, //V65,V67,V68
OpenFinal1, //V91-96
SetMfcFinal1, //M32-38
SetGasIn2,
SetGroupJOpen,
OpenFinal2,
SetMfcFinal2,
PumpDownTimeout,
SetTvMode,
SetEPV1,
SetEPV2,
SetTVEnable,
SetTVPressMode,
SetTvPositionToZero,
SetMFCMode,
SetPCMode,
SetTvOpen,
SetTvModeToPress,
SetTVto1050,
OpenGasIn1,
CloseGasIn1,
CloseFinanl1,
CloseFinanl2,
SetGroupV38,
SetV76,
SetV75,
SetGroupV25,
SetV31,
SetV32,
SetV35V36,
SetV87V97,
SetV65,
SetV103,
SetV105,
SetTVPositionMode,
SetTVPositionMax,
CloseM32M35M37,
CloseM36,
CloseM38,
TimeDelay1,
TimeDelay2,
TimeDelay3,
TimeDelay4,
TimeDelay5,
TimeDelay6,
TimeDelay7,
TimeDelay8,
TimeDelay9,
TimeDelay10,
TimeDelay11,
TimeDelay12,
TimeDelay13,
TimeDelay14, SetM18to40, SetM18to40_1,
}
private PMModule _pm1Module;
private IoThrottleValve2 _IoThrottle;
private IoInterLock _pmIoInterLock;
private int _rotationCheckSpeed = 0; //设置旋转速度为0后检查是否转速低于此数值
private int _rotationCloseTimeout; //旋转停止超时
private int _IoValueOpenCloseTimeout = 10; //开关超时时间
private int _heatTimeOut = 5; //Heat关闭等待Di反馈超时时间
private double _pmPressureMaxDiff; //蝶阀与目标压力的差值范围(认为调整到位了)
private int _throttleTimeout; //蝶阀调整到指定压力的超时时间
private double _pumpBasePressure;
private int _routineTimeOut;
private int _pumpTimeOut;
private Stopwatch _swTimer = new Stopwatch();
public PMPumpRoutine(ModuleName module, PMModule pm1) : base(module, pm1)
{
Module = module.ToString();
_pm1Module = pm1;
Name = "PumpDown";
_IoThrottle = DEVICE.GetDevice<IoThrottleValve2>($"{Module}.TV");
_pmIoInterLock = DEVICE.GetDevice<IoInterLock>($"{Module}.PMInterLock");
}
public override Result Start(params object[] objs)
{
Reset();
_rotationCloseTimeout = SC.GetValue<int>($"PM.{Module}.RotationCloseTimeout");
_pmPressureMaxDiff = SC.GetValue<double>($"PM.{Module}.ThrottlePressureMaxDiff");
_throttleTimeout = SC.GetValue<int>($"PM.{Module}.ThrottlePressureTimeout");
_pumpBasePressure = SC.GetValue<double>($"PM.{Module}.Pump.PumpBasePressure");
_routineTimeOut = SC.GetValue<int>($"PM.{Module}.Pump.RoutineTimeOut");
_pumpTimeOut = SC.GetValue<int>($"PM.{Module}.Pump.PumpTimeOut");
if (!_pmIoInterLock.SetPMPumpRoutineRunning(true, out string reason))
{
EV.PostAlarmLog(Module, $"can not Pump,{reason}");
return Result.FAIL;
}
_swTimer.Restart();
Notify("Start");
return Result.RUN;
}
public override Result Monitor()
{
try
{
CheckRoutineTimeOut();
//关闭V76,打开V75
SetIoValueByGroup((int)RoutineStep.SetV76, IoGroupName.V76, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV75, IoGroupName.V75, true, _IoValueOpenCloseTimeout);
//旋转停止,加热停止
SetHeatEnable((int)RoutineStep.HeatEnable, false, _heatTimeOut);
SetRotationValve((int)RoutineStep.RotationEnable, _rotationCheckSpeed, false, _rotationCloseTimeout);
//关闭V72,打开V25
SetIoValueByGroup((int)RoutineStep.VentPumpClose, IoGroupName.VentPump, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupV25, IoGroupName.V25, true, _IoValueOpenCloseTimeout);
//打开V31,打开V32
SetIoValueByGroup((int)RoutineStep.SetV31, IoGroupName.V31, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV32, IoGroupName.V32, true, _IoValueOpenCloseTimeout);
//打开V35,打开V36
SetIoValueByGroup((int)RoutineStep.SetV35V36, IoGroupName.V35V36, true, _IoValueOpenCloseTimeout);
//关闭B/C/E/F/H/K 阀门
SetIoValueByGroup((int)RoutineStep.SetGroupB, IoGroupName.B, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupC, IoGroupName.C, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupE, IoGroupName.E, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupF, IoGroupName.F, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupH, IoGroupName.H, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupK, IoGroupName.K, false, _IoValueOpenCloseTimeout);
//打开D/G 阀门
SetIoValueByGroup((int)RoutineStep.SetGroupD, IoGroupName.D, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupG, IoGroupName.G, true, _IoValueOpenCloseTimeout);
//6、 M1-M17 设定为 default 值,所有 PC 设定为 default 值(PC1-PC9)
SetMfcModeToNormalByGroup((int)RoutineStep.SetMFCMode, MfcGroupName.All);
SetMfcToDefaultByGroup((int)RoutineStep.SetM1toM17, MfcGroupName.M1toM17, 0);
SetPcModeToNormal((int)RoutineStep.SetPCMode, _lstPcList);
SetPcToDefault((int)RoutineStep.SetPC, _lstPcList);
//7、 M18-M40除 M30\M34\M39 3s ramp 到 default 值。。
SetMfcToDefaultByGroup((int)RoutineStep.SetM18to40, MfcGroupName.M18toM40No303439, 3);
//9、 打开 A Valves打开 J valve。
SetIoValueByGroup((int)RoutineStep.OpenGasIn1, IoGroupName.A, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupJ, IoGroupName.J, true, _IoValueOpenCloseTimeout);
//10、 打开 EPV2等待 3s, 打开 TV enable, 压力模式,伺服压力默认设定为 0mbar
SetIoValueByGroup((int)RoutineStep.SetEPV2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay5, 3);
SetThrottleEnableAndWait((int)RoutineStep.SetTVEnable, _IoThrottle, 5);
SetThrottleToPressModeAndWait((int)RoutineStep.SetTVPressMode, _IoThrottle, 5);
SetThrottleToTargetAndNoWait((int)RoutineStep.SetTv1, _IoThrottle, _pumpBasePressure);
//11、当蝶阀设定值 ramp 到 0 后,将 M18-M40除 M30\M34\M39 MFC 5s ramp 到0 关闭 V87、 V97。
SetMfcByGroup((int)RoutineStep.SetM18to40_1, MfcGroupName.M18toM40No303439, 0, 3);
SetIoValueByGroup((int)RoutineStep.SetV87V97, IoGroupName.V87V97, false, _IoValueOpenCloseTimeout);
//12、等待腔体压力到 Pump Base Pressure可配置 蝶阀改为位置模式,开度设定 100%
WaitChamberPressDownTo((int)RoutineStep.WaitTv1, _pumpBasePressure, _pumpTimeOut);
SetThrottleToPositionMode((int)RoutineStep.SetTVPositionMode, _IoThrottle, _throttleTimeout);
SetThrottleSetPosition((int)RoutineStep.SetTVPositionMax, _IoThrottle, 100, _throttleTimeout);
}
catch (RoutineBreakException)
{
return Result.RUN;
}
catch (RoutineFaildException)
{
return Result.FAIL;
}
_pmIoInterLock.SetPMPumpRoutineRunning(false, out _);
Notify($"Finished ! Elapsed time: {(int)(_swTimer.ElapsedMilliseconds / 1000)} s");
_swTimer.Stop();
return Result.DONE;
}
public override void Abort()
{
_pmIoInterLock.SetPMPumpRoutineRunning(false, out _);
PmDevice.SetRotationServo(0, 0);
base.Abort();
}
private void CheckRoutineTimeOut()
{
if (_routineTimeOut > 10)
{
if ((int)(_swTimer.ElapsedMilliseconds / 1000) > _routineTimeOut)
{
EV.PostAlarmLog(Module, $"Routine TimeOut! over {_routineTimeOut} s");
throw (new RoutineFaildException());
}
}
}
}
}