using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.LinMot;
using CyberX8_RT.Devices.Prewet;
using MECF.Framework.Common.Alarm;
using MECF.Framework.Common.CommonData.Prewet;
using MECF.Framework.Common.Routine;
using System;
using System.Collections.Generic;
namespace CyberX8_RT.Modules.Prewet
{
public class PrewetKeepWetRoutine : RoutineBase, IRoutine
{
private const int LOTTRACK_TIME = 1000;
private enum KeepwetStep
{
Idle_KeepwetPrepare,
Idle_KeepwetPrepareWait,
Idle_KeepWetStart,
Idle_KeepWetScan,
Idle_KeepWetPause,
End
}
#region 内部变量
///
/// prewet设备
///
private PrewetDevice _prewetDevice;
///
/// linmot axis
///
private LinMotAxis _linMotAxis;
///
/// Lottrack time
///
private DateTime _lotTackTime = DateTime.Now;
///
/// LotTrack数据
///
private List _datas = new List();
///
/// LotTrack数据
///
public List PrewetLotTrackDatas { get { return _datas; } }
#endregion
///
/// 构造函数
///
///
public PrewetKeepWetRoutine(string module,LinMotAxis linMotAxis) : base(module)
{
_linMotAxis= linMotAxis;
}
///
/// 中止
///
public void Abort()
{
_linMotAxis.StopOperation("", null);
if (_prewetDevice != null)
{
_prewetDevice.PumpValveClose();
}
Runner.Stop("Manual Abort");
}
///
/// 监控
///
///
public RState Monitor()
{
LottrackRecord();
Runner.Run(KeepwetStep.Idle_KeepwetPrepare, ResetLinmot, _delay_1ms)
.WaitWithStopCondition(KeepwetStep.Idle_KeepwetPrepareWait, CheckResetLinmotEndStatus, CheckResetLinmotStopStatus)
.Run(KeepwetStep.Idle_KeepWetStart, ExecuteWetScan, _delay_1s)
.WaitWithStopCondition(KeepwetStep.Idle_KeepWetScan,CheckLinmotScanEndStatus,CheckLinmotScanStopStatus)
.Run(KeepwetStep.Idle_KeepWetPause, KeepWetComplete, _delay_1ms)
.End(KeepwetStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
/// Reset Linmot
///
///
///
private bool ResetLinmot()
{
bool result = _linMotAxis.ResetOperation("", false);
if (!result)
{
return false;
}
return true;
}
///
/// 检验Reset Linmot状态
///
///
///
private bool CheckResetLinmotEndStatus()
{
return _linMotAxis.Status == RState.End;
}
///
/// 检验Reset Linmot停止状态
///
///
private bool CheckResetLinmotStopStatus()
{
if(_linMotAxis.Status == RState.Failed || _linMotAxis.Status == RState.Timeout)
{
AddLotTrackData();
return true;
}
return false;
}
///
/// execute Keep Wet Scan
///
///
///
private bool ExecuteWetScan()
{
bool pumpValveResult = _prewetDevice.PumpValveOpen();
if (!pumpValveResult)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump valve open error");
return false;
}
//bool pumpEnableResult = _prewetDevice.PumpEnableOperation("", null);
//bool pumpEnableResult = _prewetDevice.PumpEnable();
//if (!pumpEnableResult)
//{
// LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump enable error");
// return false;
//}
bool result = _linMotAxis.StartPosition("", new object[] { 1 });
if (!result)
{
return false;
}
return true;
}
///
/// 检验Linomot扫描结束状态
///
///
private bool CheckLinmotScanEndStatus()
{
return _linMotAxis.Status == RState.End;
}
///
/// 检验Linmot Scan停止状态
///
///
private bool CheckLinmotScanStopStatus()
{
bool result=_linMotAxis.Status==RState.Failed||_linMotAxis.Status==RState.Timeout;
if(!result)
{
//Pressure
if (_prewetDevice.PrewetPumpData.PumpPressureData.IsError)
{
_linMotAxis.StopOperation("", null);
_prewetDevice.PumpValveClose();
LOG.WriteLog(eEvent.ERR_PREWET, Module, $"Pump pressure {_prewetDevice.PrewetPumpData.PumpPressureData.Value} is in error");
return true;
}
else if (_prewetDevice.PrewetPumpData.PumpPressureData.IsWarning)
{
string str = $"Pump pressure {_prewetDevice.PrewetPumpData.PumpPressureData.Value} is in warning";
if (AlarmListManager.Instance.AddWarn(Module, "Pump Pressure", str))
{
LOG.WriteLog(eEvent.WARN_PREWET, Module, str);
}
}
//Flow
if (_prewetDevice.PrewetPumpData.PumpFlowData.IsError)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, $"Pump flow {_prewetDevice.PrewetPumpData.PumpFlowData.Value} is in error");
_linMotAxis.StopOperation("", null);
_prewetDevice.PumpValveClose();
return true;
}
else if (_prewetDevice.PrewetPumpData.PumpFlowData.IsWarning)
{
string str = $"Pump flow {_prewetDevice.PrewetPumpData.PumpFlowData.Value} is in warning";
if (AlarmListManager.Instance.AddWarn(Module, "Pump Flow", str))
{
LOG.WriteLog(eEvent.WARN_PREWET, Module, str);
}
}
return false;
}
else
{
AddLotTrackData();
_prewetDevice.PumpValveClose();
return true;
}
}
///
/// Wait execute WetScan
///
///
///
private bool WaitExecuteWetScan(object param)
{
//linmot完成一次scan
if (_linMotAxis.Status == RState.End)
{
return true;
}
return false;
}
///
/// Keep wet scan完成
///
///
///
private bool KeepWetComplete()
{
bool result = _prewetDevice.PumpValveClose();
if (!result)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump valve close error");
return false;
}
result = _linMotAxis.SwitchOff();
if (!result)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, "linmot disable error");
return false;
}
return true;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_prewetDevice = DEVICE.GetDevice(Module);
_datas.Clear();
_lotTackTime = DateTime.Now;
return Runner.Start(Module, "Start Keepwet");
}
///
/// 记录Lottrack
///
private void LottrackRecord()
{
//记录Lottrack
if (DateTime.Now.Subtract(_lotTackTime).TotalMilliseconds >= LOTTRACK_TIME)
{
AddLotTrackData();
_lotTackTime = DateTime.Now;
}
}
///
/// 获取Lot Track数据
///
///
private void AddLotTrackData()
{
PrewetLotTrackData data = new PrewetLotTrackData();
data.TimeStamp = DateTime.Now;
data.StateMachine = Runner.CurrentStep.ToString();
data.Pressure = _prewetDevice.PrewetPumpData.PumpPressureData.Value;
data.Flow = _prewetDevice.PrewetPumpData.PumpFlowData.Value;
data.PumpMode = _prewetDevice.PrewetPumpData.PumpModel;
data.PressureTarget = _prewetDevice.PrewetPumpData.PressureTarget;
data.CurrentScan = _linMotAxis.ScanCount;
data.ScanOn = _linMotAxis.IsMotorOn;
data.ValveState = _prewetDevice.PrewetPumpData.PumpValve;
data.PumpSpeed = _prewetDevice.LastPumpSpeed;
data.PumpControlCurrent = _prewetDevice.PrewetPumpData.PumpCurrent;
_datas.Add(data);
}
}
}